나는 네트워크 보안 컨설턴트이며, 지난 몇 년간 내 노트북에서 윈도우 NT/2000과 리눅스를 함께 사용해 왔다. 이유는 문제를 해결하고 정보를 얻을 때 사용하는 대부분의 툴은 유닉스 시스템에서만 작동하기 때문이었다. 그러나 지금은 상황이 바뀌었다. 내 노트북에는 여전히 리눅스가 설치되어 있지만, 예전처럼 많이 사용하지 않는다. 지금부터 내가 사용하는 Win32 기반 툴과 이러한 툴을 어디에서 다운받을 수 있는지 소개할 것이다. 여기에서 언급된 모든 소프트웨어는 무료이며 오픈 소스이다.
WinPcap(Packet Capture Architecture for Windows: 윈도우용 패킷 캡쳐 아키텍쳐)
유명한 유닉스 네트워크 툴은 대부분 libpcap라고 부르는 프로그래밍 라이브러리에 기반하는데, Libpcap은 BPF 혹은 버클리 패킷 필터(Berkeley Packet Filter)로 알려져 있는 유닉스 커널 함수에 의존한다. 최근에는 Win32 플랫폼에서도 이러한 기능을 사용할 수 있게 되었다.
WinPcap이란 libpcap(packat capture library: 네트워크 패킷을 저장하고 보내는데 널리 쓰이는 네트워크 프로그래밍 API)의 Win32 포트이다.
WinPcap 은 크게 두가지 요소로 구성되어 있다.
- 대부분의 유닉스 커널에서 제공하는 BPF 기능에 기반한 커널 수준 패킷 필터 드라이브
- 윈도우용 고수준 프로그래밍 라이브러리, libpcap
패킷 캡쳐 드라이버는 유닉스 커널의 BPF와 유사하게, 윈도우 9x, 윈도우 NT, 그리고 윈도우 2000에 로(raw) 네트워크 패킷을 캡쳐하고 보내는 기능을 추가하는 장치 드라이버이다.
Packet.dll은 WinPcap의 컴포넌트로, BPF 드라이버 함수로 바로 접근할 수 있는 API를 제공한다. WinPcap은 또한 libpcap과 호환 가능한 일련의 함수를 엑스포트(export)하며, 이에 따라 네트워크 하드웨어 및 운영 체제와 독립적으로 패킷을 캡쳐하는 고수준 함수를 제공한다.
libpcap API가 Win32에서 사용할 수 있다는 것은 수많은 유닉스 네트워크 유틸리티가 윈도우에 이식되었다는 뜻이다. 여기에 소개된 모든 툴은 WinPcap을 사용한다.
WinDump
WinDump는 tcpdump를 Win32로 포팅한 것으로, 인기 있는 유닉스용 네트워크 툴이다. WinDump는 가장 유명한 유닉스용 스니퍼/네트웍 유틸리티 중 하나인 tcpdump와 완전히 호환 가능하다. tcpdump와 마찬가지로 WinDump는 정규표현식에 맞는 패킷 헤더를 출력한다. 나는 거의 모든 것에 WinDump를 사용한다. WinDump로 애플리케이션의 응답 시간(response time)을 측정하며, 네트워크 문제가 발생했을 때 에러의 정확한 위치를 지정한다. 내가 마이크로소프트 워드를 사용하는 만큼 자주 사용하는 유일한 소프트웨어일 것이다.
WinDump는 네트워크 인터페이스를 정해져 있지 않은 모드(promiscuous mode)로 만든다.(드러나는 모든 패킷을 잡는다). 비교환 이더넷(non-switched Ethernet)과 같은 공유 액세스 네트워크에서 트래픽이 다른 호스트 사이에서 이동하는 것을 볼 때 유용하다.
WinDump 예제 1: 두 호스트 사이에 있는 모든 UDP(인터넷을 위한 전송층 프로토콜) 트래픽을 출력하라.
C:\> windump host bamse and host cartman and udp
windump: listening on\Device\Packet_
{8422BFF6-2771-4842-8B11-327ED5524F23}
22:17:04.946666 cartman.norberg.org.2830 >
bamse.norberg.org.53: 1+ (39)
22:17:04.947233 bamse.norberg.org.53 >
cartman.norberg.org.2830: 1* 1/0/0 (70)
22:17:04.980131 cartman.norberg.org.2831 >
bamse.norberg.org.53: 2+ (35)
22:17:04.980494 bamse.norberg.org.53 >
cartman.norberg.org.2831: 2* 1/0/0 (51)
22:17:05.029427 cartman.norberg.org.2832 >
bamse.norberg.org.53: 217+ (39)
22:17:05.029794 bamse.norberg.org.53 >
cartman.norberg.org.2832: 217* 1/0/0 (70)
22:17:26.080344 cartman.norberg.org.137 >
bamse.norberg.org.137: udp 62
22:17:26.080418 bamse.norberg.org.137 >
cartman.norberg.org.137: udp 62
22:17:26.080468 cartman.norberg.org.138 >
bamse.norberg.org.138: udp 174
22:17:26.080676 bamse.norberg.org.138 >
cartman.norberg.org.138: udp 180
22:17:26.080868 bamse.norberg.org.138 >
cartman.norberg.org.138: udp 180
22:17:30.764228 cartman.norberg.org.2833 >
bamse.norberg.org.88:
22:17:30.769905 bamse.norberg.org.88 >
cartman.norberg.org.2833:
|
WinDump 예제 2: ICMP 에코 요청(ICMP 타입 8)과 에코 응답 메시지(ICMP 타입 0)만 출력하라.
WinDump는 또한 데이터그램 헤더에 있는 필드와 마찬가지로 섬세한 속성에 기반한 패킷들과 일치하도록 설정할 수 있다.
C:\> windump -v -n "icmp[0]=8 or icmp[0]=0"
windump: listening on\Device\Packet_
{8422BFF6-2771-4842-8B11-327ED5524F23}
19:29:45.432743 10.0.0.150 > 10.0.0.1:
icmp: echo request (ttl 128, id 4749)
19:29:45.433131 10.0.0.1 > 10.0.0.150:
icmp: echo reply (ttl 128, id 42083)
19:29:46.436796 10.0.0.150 > 10.0.0.1:
icmp: echo request (ttl 128, id 4750)
19:29:46.437087 10.0.0.1 > 10.0.0.150:
icmp: echo reply (ttl 128, id 42084)
|
사용된 플래그:
-v 상세설명
(이경우에 TTL(time-to-live) 값과 ICMP 식별자 필드를 출력한다).
-n ID 주소를 네임주소로 변환하지 마라.
|
정규표현식 구문:
icmp[0] Offset 0 in the ICMP header (the ICMP type field)
|
플래그와 정규표현식 구문에 대해 자세히 알고 싶으면
tcpdump 매뉴얼 페이지를 참조하라.
Nmap
Nmap는 시스템 관리자가 대규모 네트워크를 스캔해서 어떤 호스트가 가동되어 있고 그러한 호스트가 어떤 서비스를 제공하고 있는지 정할 수 있도록 고안된 툴이다. Nmap는 네트워크를 스캔하는 훌륭한 툴이며, 여러 방면에 이용할 수 있다.
Nmap 예제 1: 특정 네트워크에서 호스트와 서비스를 찾아라. Nmap로 네트워크에서 액티브 호스트를 스캔하고, 호스트에 상관없이 액티브 서비스를 선택적으로 스캔할 수 있다. 이러한 특성은 시스템 관리자가 인증 절차를 거치지 않은 클라이언트나
백 오리피스(Back Orifice),
넷버스(Netbus)와 같은 백도어 네트워크를 스캔하려고 할 때, 유용하게 쓰인다.
넷버스(tcp/12345)와 백 오리피스 2k(tcp/54320) 트로이목마(trojans) 네트워크(이 예제에서는 192.168.6.0/29)를 스캔하고 싶다면, 다음의 명령어를 사용하라:
C:\> nmapnt -sS -p 12345,54320 192.168.6.0/29
Starting nmapNT V. 2.53 by ryan@eEye.com
eEye Digital Security ( http://www.eEye.com )
based on nmap by fyodor@insecure.org
( www.insecure.org/nmap/ )
All 2 scanned ports on beretta.foo.com
(192.168.6.1) are: closed
All 2 scanned ports on obelix.foo.com
(192.168.6.2) are: closed
All 2 scanned ports on legolas.foo.com
(192.168.6.5) are: closed
All 2 scanned ports on swekim.foo.com
(192.168.6.6) are: closed
All 2 scanned ports on swegun.foo.com
(192.168.6.7) are: closed
Nmap run completed -- 8 IP addresses
(5 hosts up) scanned in 3 seconds
|
사용된 플래그:
-sS TCP stealth SYN 스캔
-p 스캔할 포트
|
Nmap 예제 2: Nmap 운영 체제 fingerprinting. 만약 괜찮은 호스트를 발견하면, 이 호스트가 어떤 운영 체제로 움직이는지 Nmap로 추측할 수 있다. 이는 호스트의 IP-스택 fingerprint를 이용하면 된다. 실제로 TCP/IP 데이터그램을 보는 것만으로도 어떤 시스템인지 결정할 수 있다. 시스템의 TCP 순번이 늘어가는 방식이 바로 이러한 fingerprint의 일부이다.
Nmap의 -O 플래그를 사용해서 원격 호스트를 fingerprint해라. 이것은 어디까지나 정확한 수치가 될 수는 없다는 것을 명심해야 한다:
C:\> nmapnt -O -p 130-140 10.0.0.1
Starting nmapNT V. 2.53 by ryan@eEye.com
eEye Digital Security ( http://www.eEye.com )
based on nmap by fyodor@insecure.org
( www.insecure.org/nmap/ )
Interesting ports on bamse.norberg.org
(10.0.0.1):
(The 9 ports scanned but not shown
below are in state: closed)
Port State Service
135/tcp open unknown
139/tcp open unknown
TCP Sequence Prediction:
Class=random positive increments
Difficulty=14168 (Worthy challenge)
Remote operating system guess:
Windows 2000 RC1 through final release
Nmap run completed -- 1 IP address
(1 host up) scanned in 10 seconds
C:\>nmapnt -O -p 1-100 foo.norberg.org
Starting nmapNT V. 2.53 by ryan@eEye.com
eEye Digital Security ( http://www.eEye.com )
based on nmap by fyodor@insecure.org
( www.insecure.org/nmap/ )
Interesting ports on foo.norberg.org
(192.168.5.1):
(The 95 ports scanned but not shown
below are in state: closed)
Port State Service
21/tcp open ftp
22/tcp open ssh
23/tcp open telnet
25/tcp open smtp
53/tcp open domain
TCP Sequence Prediction:
Class=64K rule
Difficulty=1 (Trivial joke)
Remote operating system guess:
HP-UX 10.20 E 9000/777
or A 712/60 with tcp_random_seq = 0
Nmap run completed -- 1 IP address (1 host up)
scanned in 17 seconds
|
Ngrep
Grep은 GNU 유틸리티로 특정한 패턴과 일치하는 라인에 대해 하나 이상의 입력 파일을 찾아 준다. Grep은 디폴트로 일치하는 라인을 출력한다. 네트워크 grep(Ngrep)은 grep과 같은 기능을 하지만, 텍스트 파일과 입력 파일 대신에 네트워크 데이터를 사용한다. ngrep은 텍스트 접속시 발생하는 문제를 해결해 준다. 비교환 이더넷과 같은 공유 액세스 네트워크에서 다른 호스트 사이에서 이동하는 것을 볼 때 유용하다.
Ngrep 예제 1: FTP 로그인 정보를 출력하라. 다음에 오는 예는 FTP 명령 채널에 있는 USER와 PASS 명령어를 찾는 것을 보여 준다.
C:\> ngrep -wq "USER|PASS" tcp port 21
T 10.0.0.150:1682 -> 192.168.6.26:21 [AP]
USER anonymous..
T 10.0.0.150:1682 -> 192.168.6.26:21 [AP]
PASS leech@nowhere.org..
T 10.0.0.152:1044 -> 192.168.6.122:21 [AP]
USER stnor..
T 10.0.0.152:1044 -> 192.168.6.122:21 [AP]
PASS fooqaz1..
|
사용된 플래그:
-w 단어 정규표현 (표현식은 단어(word)와 일치해야함)
-q 조용한 모드
|
Ngrep 예제 2: 경량 디렉토리 접속 프로토콜(LDAP)의 문제를 해결하라. 다음에 오는 Ngrep는 LDAP 접속으로부터 모든 데이터를 보여 준다(port tcp/389):
Ngrep Example 2 code
위에 나오는 데이터는 윈도우 2000 도메인 제어기에서 나온 응답이다. 이 정보는 액티브 디렉토리 데이터베이스에서 사용자를 위해 대화 상자를 나타나게 했을 때(Start→Search→For People dialog box를 사용해서), 네트워크로 텍스트가 전송된 것이다.
Dsniff
Dsniff는 패스워드 스니핑 유틸리티로, FTP, Telnet, POP, Napster, HTTP, pcAnywhere, SMB 등 엄청난 양의 애플리케이션을 처리할 수 있다. 분명히 나쁜 의도를 가진 사람이 이 툴을 이용해 무선으로 패스워드를 생성할 수도 있지만, Dsniff는 또한 네트워크의 전반적인 보안에 접근하는데 사용할 수도 있다. 관리자에게 네트워크 세그먼트를 운영할 수 있는 허가를 구하면, 그 즉시 새로운 보안 정책이 승인될 것이다. 비교환 이더넷과 같은 공유 액세스 네트워크에서 다른 호스트 사이에서 이동하는 것을 볼 때 유용하다.
Dsniff 예제: 다음에 오는 Dsniff 세션은 사용자가 유닉스 시스템에서 루트(최상위 유저) 패스워드를 입력할 때 텔넷 세션을 캡쳐한다. 또한 FTP에 대해 하나의 사용자이름/패스워드와 HTTP에 대해 다른 사용자이름/패스워드를 캡쳐한다.
c:\> dsniff -n
-----------------
09/27/00 00:09:06 10.0.0.150 ->
192.168.6.26 (telnet)
stnor
secret1
ls
su
r00tpw
exit
exit
-----------------
09/27/00 00:11:04 10.0.0.150 ->
192.168.6.122 (ftp)
USER anonymous
PASS leech@nowhere.org
-----------------
09/27/00 00:17:41 10.0.0.150 ->
10.0.0.55 (http)
GET /personal/ HTTP/1.1
Host: foo.norberg.org
Authorization: Basic c3RlZmFuX25vcmJlcmc6c3lnMWdoMTE=
[stefan_norberg:secret123]
|
사용된 플래그:
네트워크에서 텍스트로 된 사용자이름과 패스워드를 사용하는 것은 좋은 생각이 아니다. 그다지 안전하지 못한 것이다. 말할 필요도 없이, 많은 조직은 네트워크에 IPsec와 같은 암호화 기술을 사용해야 된다는 것을 인정한다.
스테판 노버그는 스웨덴 스톡홀름에서 프리랜서로 일하는 네트워크 보안 컨설턴트이다. 그는 대규모 보안벽에서 사용가치가 높은 유닉스 클러스터까지 아주 많은 것을 만들었다. 그는 Cisco IOS, HP-UX, Linux, 그리고 Windows NT/2000 과 같은 블록을 사용하여 인터넷 보안벽을 고안하여 실제 만들기도 했다.