[ tcpdump 패킷캡처프로그램 ] tcpdump란? tcpdump 버전확인 tcpdump 플래그 (flags) tcpdump 사용법 tcpdump의사용예제 telnet을활용해 root와 passwd 암호알아내기 [01] tcpdump란? tcpdump는 Lawrence Berkley Nation Lab의 Network Rearch Gruop에서만든것으로네트워크의패킷을출력해주는프로그램이다. 주어진조건식을만족하는네트워크인터페이스를거치는패킷들의헤더들을출력해주는프로그램이다. 주로쓰임은지정된상대방호스트로부터들어오는패킷을체크하는데있다. 시스템이나네트워크를운영하다보면보안상의목적으로또는트러블슈팅 (Trouble Shooting) 을위해다양한툴을이용하여, 패킷을캡처하거나모니터링하여야할경우가많다. 이러한프로그램중 tcpdump에대해서알아보자! tcpdump는리눅스등유닉스계열에서제공되는가장대표적인패킷캡처프로그램으로표준이라할만큼매우대중적으로사용되는유용한도구이다. tcpdump는대부분시스템에기본적으로설치되어있지만개별적으로설치하려면 http://www.tcpdump.org에서소스를다운로드후설치하거나 http://rpmfind.net 에서 tcpdump로검색하여설치해도된다. 단, 이때별도의패킷캡처라이브러리인 libpcap을먼저설치하여야된다. 대부분 tcpdump 라는용어때문에 tcp만 dump할수있는것이아닐까생각하지만그렇지않으며 udp,icmp등프로토콜에관계없이캡처가가능하다. tcpdump 에서제공하는옵션은 man tcpdump 를확인해보기바란다. [02] tcpdump 버젼확인 # rpm -qa tcpdump tcpdump-3.9.4-14.el5
# tcpdump -h tcpdump version 3.9.4 libpcap version 0.9.4 Usage: tcpdump [-aaddefllnnopqrstuuvxx] [-c count] [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -Z user ] [ expression ] [03] tcpdump 플래그 (flags) TCP 플래그 SYN ACK FIN RESET PUSH UGENT TCPDUMP 플래그 S ack F R P URG 플래그의의미 SYN패킷, 접속요청을할때보내는패킷을말한다. TCP접속시에가장먼저보내는패킷이다. ACK패킷, 상대방으로부터패킷을받은뒤에알려주는패킷을말한다. 다른플래그와같이출력되는경우도있다. 접속종료를위한플래그로이패킷을보내는곳이재접속하고있는곳과접속을끊고자할때사용한다. 이패킷을보내는곳이현재접속하고있는곳과즉시연결을끊고자할때사용한다. 데이터를즉시목적지로보내라는의미이다. 텔넷과같이상호작용이중요한프로그램의경우빠른응답이중요한다. 이때사용하는플래그이다. 긴급한데이터는다른데이터에비해우선순위가높아야한다. 예를들어 ftp로자료를받고있는도중 [CTRL]+[C] 를받으면즉시자료받기를중단해야하는것처럼이때사용하는플래그이다. Placeholder. 패킷이 SYN, FINISH, RESET, PUSH등의플래그가없는경우이플래그가세팅된다. 이플래그는 ACK플래그와함께사용되는경우도있다.
[04] tcpdump man page [root@localhost ~]# man tcpdump NAME tcpdump - dump traffic on a network SYNOPSIS tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] [ -i interface ] [ -m module ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -Z user ] [ expression ] [ 옵션 ] -c Number : 제시된수의패킷을받은후종료한다 -e : 각각의패킷에 link-level 을표시해준다. (manual) 이옵션을사용하면 mac-address 와 ethertype을표시하여준다. -i device : capture할 interface를지정한다. 지정하지않으면제일낮은번호를가진인터페이스를기본으로지정한다. -n : 주소를번역하지않는다. 이옵션을사용하면 DNS lookup 을표시하지않는다. -q : 프로토콜의정보를축약한다. -v : 조금더많은정보를출력한다. -vv : 많은정보를출력한다. [ 조건식 ] 조건식에는하나또는그이상의 qualifier의조합으로이루어진 primitive 가사용된다. [ 참고 ] 리눅스나유닉스에서 man 으로파일을저장하고나면화면상에보이는텍스트문서가깨지기마련이다. 그걸해결하려면아래와같이하기바란다. [root@localhost ~]# man tcpdump > tcpdump.txt [root@localhost ~]# man tcpdump col -b > tcpdump.txt
[05] tcpdump의사용예제 # tcpdump -i eth0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 별도의옵션을주지않으면 tcpdump는기본적으로 eth0 인터페이스의트래픽을모니터링한다. 따라서 eth0이아닌별도의인터페이스를통과하는트래픽을모니터링하려면 -i eth1 과같은옵션을주어야한다. # tcpdump port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 12:10:24.675412 IP 192.168.10.1.telelpathstart > 192.168.10.134.http: S 2479966721:2479966721(0) win 65535 <mss 1460,nop,nop,sackOK> 12:10:24.683691 IP 192.168.10.134.http > 192.168.10.1.telelpathstart: S 2803445367:2803445367(0) ack 2479966722 win 5840 <mss 1460,nop,nop,sackOK> 12:10:24.683978 IP 192.168.10.1.telelpathstart > 192.168.10.134.http:. ack 1 win 65535 특정포트에대한트래픽 ( 소스또는목적지에관계없이 ) 을모니터링하고자할때사용할수있다. 만약소스또는목적지포트로한정하여모니터링하려면 "tcpdump dst port 80" 또는 "tcpdump src port 80" 과같이사용하면되나흔히소스목적지에관계없이사용이가능한 port를많이사용한다. # tcpdump host 168.126.63.1 특정 ip에대한트래픽 ( 소스목적지관계없이 ) 을모니터링하고자할때사용할수있다. 마찬가지로만약소스나목적지 IP에대한정보만을보고자한다면 "tcpdump dst host 211.47.66.50" 또는 "tcpdump src host 211.47.66.50" 과같이사용하면되나흔히소스목적지에관계없이사용이가능한 host를많이사용한다. # tcpdump port 80 -X 80 번에대한트래픽을 hex 와 ascii 로함께보여준다. 주로패킷의헤더정보뿐만아니라상세한 내용을보고자할때사용한다. # tcpdump host 211.47.66.50 and port 80 소스나목적지 IP에 IP가 211.47.66.50이고, 소스나목적지포트가 80 즉 http인트래픽을모니터링하고자할때사용한다. 여러가지의패킷필터가있을경우위와같이 and 또는 or를사용할수있다. # tcpdump -i eth1 port 80 eth1 을통해소스나목적지포트가 80 번인트래픽을모니터링하고자할때사용한다. # tcpdump port 80 and not host 1.1.1.1 소스나목적지포트가 80 번인트래픽중에서소스나목적지 ip 가 1.1.1.1 이아닌트래픽을 모니터링하고자할때사용할수있다.
# tcpdump -i eth1 arp eth1 인터페이스를통과하는 arp 패킷을보여준다. # tcpdump -i eth1 -e tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 00:47:17.888295 00:08:9f:02:32:8c (oui Unknown) > 00:13:8f:bd:a1:ac (oui Unknown), ethertype IPv4 (0x0800), length 60: 211.234.239.196.avt-profile-1 > 192.168.0.2.4332:. ack 1527942503 win 10720 00:47:21.904405 00:13:8f:bd:a1:ac (oui Unknown) > 00:08:9f:02:32:8c (oui Unknown), ethertype IPv4 (0x0800), length 60: 192.168.0.2.4332 > 211.234.239.196.avt-profile-1:. ack 1 win 64514 eth1 인터페이스를통과하는패킷에대해 mac 정보도함께보여준다. # tcpdump -i eth1 net 10.64.4.0 mask 255.255.255.0 eth1 인터페이스를통과하는패킷중소스나목적지 ip 대역이 10.64.4.0/24 대역에속하는 패킷을보여준다. # tcpdump -n dump 하는패킷에대해 ip 나포트번호등에대한역질의 (reverse lookup) 를하지않는다. [ 실습 ] telnet이보안에취약하다는것을많이들었을것이다. 이를우리는직접실습을통해서눈으로확인해보자! 준비물 (01) Linux OS 2대가필요하다! (Server:tcpdump 실행 / Client: telnet 접속시도 ) (02) telnet 셋팅되어있어야한다. 작업순서 (01) 2대의서버각각터미널을연다. (02) 1대 (server) 측에서는 tcpdump로살펴본다. (03) 다른 1대 (client) 측에서는 telnet 으로접속해본다. (04) 패킷캡처 (05) 분석 < 서버측 > [root@server ~]# mkdir /tcpdump [root@server ~]# cd /tcpdump/ [root@server tcpdump]# ls [root@server tcpdump]# tcpdump -i eth1 port 23 -l -vvv -X > doom.txt < 서버측 > 에서실행하자마자 < 클라이언트측 > 에서접속을하고 [CTRL+c] 눌러서종료를한다.
< 클라이언트측 > [root@client ~]# telnet 172.16.8.XXX < 서버측에서의패킷캡처결과 > tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes 71 packets captured 142 packets received by filter 0 packets dropped by kernel [root@server tcpdump]# ls -al 합계 52 drwxr-xr-x 2 root root 4096 3월 27 01:26. drwxr-xr-x 28 root root 4096 3월 27 01:21.. -rw-r--r-- 1 root root 37087 3월 27 01:26 doom.txt doom.txt 파일이생성되었을것이다. 이를분석해서 root 계정의암호를알아보자. 먼저파일을열고 login 으로검색을하고, root 계정명을찾은다음에 Password 로검색을하고, 암호를찾으면된다. [root@server tcpdump]# vi doom.txt 0x0030: 0050 e4b4 6c6f 6769 6e3a 20.P..login:. 0x0030: 0054 76d8 72.Tv.r... 중간생략.. 아래암호를알아보자...... 0x0030: 0050 eaf1 5061 7373 776f 7264 3a20.P..Password:. 0x0030: 0054 7d18 69.T}.i 0x0030: 0054 7ff1 74.T..t 0x0030: 0054 8083 62.T..b 0x0030: 0054 8167 61.T.ga 0x0030: 0054 8237 6e.T.7n 0x0030: 0054 8302 6b.T..k ==>> 암호는 itbank 이다! 위그림은 < 클라이언트측 > 에서 < 서버측 > 으로 telnet 접속한것인데 < 서버측 > 에서 tcpdump를걸어놨으니까, 위의이미지내용은모두 < 서버측 > 에기록이남는다.
[ 참고 ] 준비한이미지파일 : tcpdump_telnet_ 계정과암호추출.jpg [ 참고 ] http://blog.naver.com/machoon/40003720775 http://bban2.tistory.com http://cafe.naver.com/linuxlog krintiz@naver.com