Total Pageviews

Friday 8 March 2013

tcpdump抓包分析详解


tcpdump 是一个工作于终端环境下的数据包捕获工具,可以方便的获取到指定的主机,指定的端口, 批定的协议书之间传输的数据,方便管理员分析网络环境以及解决网络中出现的各种问题。 语法简单, 功能强大 ,支持将结查保存到文件中。


說實在的,對於 tcpdump 這個軟體來說,你甚至可以說這個軟體其實就是個駭客軟體, 因為他不但可以分析封包的流向,連封包的內容也可以進行『監聽』, 如果你使用的傳輸資料是明碼的話,不得了,在 router 上面就可能被人家監聽走了! 很可怕吶!所以,我們也要來瞭解一下這個軟體啊!(註:這個 tcpdump 必須使用 root 的身份執行)

[root@linux~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數][-Ae][-qX] [-r 檔案] [所欲擷取的資料內容]
參數:
-nn:直接以 IP 及 port number 顯示,而非主機名與服務名稱
-i :後面接要『監聽』的網路介面,例如 eth0, lo, ppp0 等等的介面;
-w :如果你要將監聽所得的封包資料儲存下來,用這個參數就對了!後面接檔名
-c :監聽的封包數,如果沒有這個參數, tcpdump 會持續不斷的監聽,直到使用者輸入 [ctrl]-c 為止。
-A :封包的內容以 ASCII 顯示,通常用來捉取 WWW 的網頁封包資料。
-e :使用資料連接層 (OSI 第二層) 的 MAC 封包資料來顯示;
-q :僅列出較為簡短的封包資訊,每一行的內容比較精簡
-X :可以列出十六進位 (hex) 以及 ASCII 的封包內容,對於監聽封包內容很有用
-r :從後面接的檔案將封包資料讀出來。那個『檔案』是已經存在的檔案,並且這個『檔案』是由
-w 所製作出來的。 所欲擷取的資料內容:我們可以專門針對某些通訊協定或者是 IP 來源進行封包擷取, 那就可以簡化輸出的結果,並取得最有用的資訊。常見的表示方法有: 'host foo', 'host 127.0.0.1' :針對單部主機來進行封包擷取'net 192.168' :針對某個網域來進行封包的擷取;'src host 127.0.0.1' 'dst net 192.168':同時加上來源(src)或目標(dst)限制 'tcp port 21':還可以針對通訊協定偵測,如 tcp, udp, arp, ether 等還可以利用 and 與 or 來進行封包資料的整合顯示呢!




範例一:以 IP 與 port number 捉下 eth0 這個網路卡上的封包,持續 3 秒

[root@linux ~]# tcpdump -i eth0 -nn

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648

<==按下 [ctrl]-c 之後結束 6680 packets captured             

<==捉下來的封包數量 14250 packets received by filter  

<==由過濾所得的總封包數量 7512 packets dropped by kernel    

<==被核心所丟棄的封包

如果你是第一次看 tcpdump 的 man page 時,肯定一個頭兩個大,因為 tcpdump 幾乎都是分析封包的表頭資料,使用者如果沒有簡易的網路封包基礎,要看懂粉難吶! 所以,至少您得要回到網路基礎裡面去將 TCP 封包的表頭資料理解理解才好啊! ^_^!至於那個範例一所產生的輸出範例中,我們可以約略區分為數個欄位, 我們以範例一當中那個特殊字體行來說明一下:

    01:33:40.41:這個是此封包被擷取的時間,『時:分:秒』的單位;
    IP:透過的通訊協定是 IP ;
    192.168.1.100.22 > :傳送端是 192.168.1.100 這個 IP,而傳送的 port number 為 22,您必須要瞭解的是,那個大於 (>) 的符號指的是封包的傳輸方向喔!
    192.168.1.11.1190:接收端的 IP 是 192.168.1.11, 且該主機開啟 port 1190 來接收;
    P 116:232(116):這個封包帶有 PUSH 的資料傳輸標誌, 且傳輸的資料為整體資料的 116~232 byte,所以這個封包帶有 116 bytes 的資料量;
    ack 1 win 9648:ACK與 Window size 的相關資料。

最簡單的說法,就是該封包是由 192.168.1.100 傳到 192.168.1.11,透過的 port 是由 22 到 1190 , 且帶有 116 bytes 的資料量,使用的是 PUSH 的旗標,而不是 SYN 之類的主動連線標誌。 呵呵!不容易看的懂吧!所以說,上頭才講請務必到 TCP 表頭資料的部分去瞧一瞧的啊!



再來,一個網路狀態很忙的主機上面,你想要取得某部主機對你連線的封包資料而已時, 使用 tcpdump 配合管線命令與正規表示法也可以,不過,畢竟不好捉取! 我們可以透過 tcpdump 的表示法功能,就能夠輕易的將所需要的資料獨立的取出來。 在上面的範例一當中,我們僅針對 eth0 做監聽,所以整個 eth0 介面上面的資料都會被顯示到螢幕上, 不好分析啊!那麼我們可以簡化嗎?例如只取出 port 21 的連線封包,可以這樣做:

[root@linux ~]# tcpdump -i eth0 -nn port 21

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 1 win 65535 01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240: P 1:21(20) ack 1 win 5840 01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 21 win 65515 01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21: P 1:17(16) ack 21 win 65515 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840 01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840

瞧!這樣就僅提出 port 21 的資訊而已,且仔細看的話,你會發現封包的傳遞都是雙向的, client 端發出『要求』而 server 端則予以『回應』,所以,當然是有去有回啊! 而我們也就可以經過這個封包的流向來瞭解到封包運作的過程。 舉例來說:

    我們先在一個終端機視窗輸入『 tcpdump -i lo -nn 』 的監聽,
    再另開一個終端機視窗來對本機 (127.0.0.1) 登入『ssh localhost』

那麼輸出的結果會是如何?

[root@linux ~]# tcpdump -i lo -nn  1

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode  2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes  3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0)     win 32767   4 11:02:54.253831 IP

127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0) ack 933696133 win 32767   5 11:02:54.253871 IP 1

27.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192   6 11:02:54.272124 IP

127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192 7 11:02:54.272375 IP

127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 

上表顯示的頭兩行是 tcpdump 的基本說明,然後:

    第 3 行顯示的是『來自 client 端,帶有 SYN 主動連線的封包』,
    第 4 行顯示的是『來自 server 端,除了回應 client 端之外(ACK),還帶有 SYN 主動連線的標誌;
    第 5 行則顯示 client 端回應 server 確定連線建立 (ACK)
    第 6 行以後則開始進入資料傳輸的步驟。

從第 3-5 行的流程來看,熟不熟悉啊?沒錯!那就是 三向交握 的基礎流程啦!夠有趣吧! 不過 tcpdump 之所以被稱為駭客軟體之一可不止上頭介紹的功能吶! 上面介紹的功能可以用來作為我們主機的封包連線與傳輸的流程分析, 這將有助於我們瞭解到封包的運作,同時瞭解到主機的防火牆設定規則是否有需要修訂的地方。



更神奇的使用要來啦!如果我們使用 tcpdump 在 router 上面監聽『明碼』的傳輸資料時, 例如 FTP 傳輸協定,你覺得會發生什麼問題呢? 我們先在主機端下達『 tcpdump -i lo port 21 -nn -X 』然後再以 ftp 登入本機,並輸入帳號與密碼, 結果你就可以發現如下的狀況:

[root@linux ~]# tcpdump -i lo -nn -X 'port 21'     0x0000:  4500 0048 2a28 4000 4006 1286 7f00 0001  E..H*(@.@.......     0x0010:  7f00 0001 0015 80ab 8355 2149 835c d825  .........U!I./.%     0x0020:  8018 2000 fe3c 0000 0101 080a 0e2e 0b67  .....<.........g     0x0030:  0e2e 0b61 3232 3020 2876 7346 5450 6420  ...a220.(vsFTPd.     0x0040:  322e 302e 3129 0d0a                      2.0.1)..      0x0000:  4510 0041 d34b 4000 4006 6959 7f00 0001  E..A.K@.@.iY....     0x0010:  7f00 0001 80ab 0015 835c d825 8355 215d  ........./.%.U!]     0x0020:  8018 2000 fe35 0000 0101 080a 0e2e 1b37  .....5.........7     0x0030:  0e2e 0b67 5553 4552 2064 6d74 7361 690d  ...gUSER.dmtsai.     0x0040:  0a                                       .      0x0000:  4510 004a d34f 4000 4006 694c 7f00 0001  E..J.O@.@.iL....     0x0010:  7f00 0001 80ab 0015 835c d832 8355 217f  ........./.2.U!.     0x0020:  8018 2000 fe3e 0000 0101 080a 0e2e 3227  .....>........2'     0x0030:  0e2e 1b38 5041 5353 206d 7970 6173 7377  ...8PASS.mypassw     0x0040:  6f72 6469 7379 6f75 0d0a                 ordisyou..

上面的輸出結果已經被簡化過了,你必須要自行在你的輸出結果當中搜尋相關的字串才行。 從上面輸出結果的特殊字體中,我們可以發現『該 FTP 軟體使用的是 vsftpd ,並且使用者輸入 dmtsai 這個帳號名稱,且密碼是 mypasswordisyou』 嘿嘿!你說可不可怕啊!如果使用的是明碼的方式來傳輸你的網路資料? 所以我們才常常在講啊,網路是很不安全低!



另外你得瞭解,為了讓網路介面可以讓 tcpdump 監聽,所以執行 tcpdump 時網路介面會啟動在 『錯亂模式 (promiscuous)』,所以你會在 /var/log/messages 裡面看到很多的警告訊息, 通知你說你的網路卡被設定成為錯亂模式!別擔心,那是正常的。 至於更多的應用,請參考 man tcpdump 囉!



例題:如何使用 tcpdump 監聽 (1)來自 eth0 介面卡且 (2)通訊協定為 port 22 ,(3)目標來源為 192.168.1.100 的封包資料?

答:
tcpdump -i eth0 -nn 'port 22 and src host 192.168.1.100'


如何查看tcpdump生成的内容。

1)使用tcpdump  -w  tcpdump`date +%F`.log 命令可以将结果进行保存,但内容十分杂乱,需要将这些信息转化成ASCII码方式。


2) tcpdump  -v  -xx  -r  tcpdump`date +%F`.log >tcpdump`date +%F`.ascii


3)使用 vi或emace 查看内容。 找到你需要结果。


ethereal 除了 tcpdump 這個軟體之外,其實你還可以使用 ethereal 這個好用的網路流量分析軟體吶! ethereal 分為文字介面與圖形介面,文字介面的用法與 tcpdump 相當的類似,不過他的指令名稱為 tethereal 就是了。因為用法差不多,所以建議您直接使用 man tethereal 查閱吧! 在 CentOS 上原本就有 ethereal 了,所以請拿出光碟來安裝即可喔! 需要安裝 ethereal 與 ethereal-gnome 才行吶!

啟動的方法很簡單,你必須要在 X Window 底下,先開啟一個終端機,然後直接輸入 ethereal 後, 就會出現如下的畫面了:

ethereal 使用範例圖
圖五、ethereal 使用範例圖

簡單的作法,你可以點選如上圖顯示的那個按鈕,會出現挑選監聽的介面視窗,如下所示:

ethereal 使用範例圖
圖六、ethereal 使用範例圖

你應該選擇要監聽的介面,在這裡因為是測試用的,所以鳥哥使用的是 lo 這個內部介面, 你當然應該要選擇你自己的網路介面才是。然後按下 start 後,就會出現開始偵測的畫面了:

ethereal 使用範例圖
圖七、ethereal 使用範例圖

在這個畫面當中你可以看到很多類型的封包協定,在等你處理完畢後,就可以按下『stop』結束監聽, 而開始進入如下的封包分析畫面。

ethereal 使用範例圖
圖八、ethereal 使用範例圖

封 包分析畫面共分為三大區塊,如上圖所示,第一區塊主要顯示的是封包的標頭資料, 內容就有點類似 tcpdump 的顯示結果,第二區塊則是詳細的表頭資料, 包括訊框的內容、通訊協定的內容以及 socket pair 等等資訊。 第三區塊則是 16 進位與 ASCII 碼的顯示結果。透過這個 ethereal 您就可以一口氣得到所需要的所有封包內容啦! 而且還是圖形介面的,很方便吧!透過在第一區塊選擇不同的封包,就能夠查閱每個封包的資料內容囉!

nc, netcat
這個 nc 可以用來作為某些服務的檢測,因為他可以連接到某個 port 來進行溝通, 此外,還可以自行啟動一個 port 來傾聽其他用戶的連線吶!非常的不錯用! 如果在編譯的時候給予『GAPING_SECURITY_HOLE』參數的話,嘿嘿! 這個軟體還可以用來取得用戶端的 bash 哩!可怕吧!我們的 CentOS 比較人性化,並沒有給予上面的參數,所以我們不能夠用來作為駭客軟體~ 但是用來取代 telnet 也是個很棒的功能了!(有的系統將執行檔改名為 netcat 啦!)

[root@linux ~]# nc [IP|host] [port]
[root@linux ~]# nc -l -p [port]
參數:
-l :作為監聽之用,亦即開啟一個 port 來監聽用戶的連線;
-p :開啟的這個 port number

範例一:連接本地端的 port 25 查閱相關訊息
[root@linux ~]# nc localhost 25
localhost.localdomain [127.0.0.1] 25 (smtp) open
220 pc.dm.tsai ESMTP Postfix
ehlo localhost
250-pc.dm.tsai
250-PIPELINING
250-SIZE 40000000
250-ETRN
quit
221 Bye

這個最簡單的功能與 telnet 幾乎一樣吧!可以去檢查某個服務啦!不過,更神奇的在後面, 我們可以建立兩個連線來傳訊喔!舉個例子來說,我們先在 client 端的地方啟動一個 port 來進行傾聽:

範例二:啟動一個 port 來監聽使用者的連線要求
[root@linux ~]# nc -l -p 20000
# 啟動一個 port 20000  在主機上,如果此時使用 netstat -tlnp
# 就可以看到系統上多出來一個 port 20000 在傾聽使用者的連線喔!

然後在主機端的地方,也利用 nc 來連線到用戶端,並且輸入一些指令看看喔!

[root@linux ~]# nc localhost 20000
   <==這裡可以開始輸入字串了!

此時,在主機端我們可以打入一些字,你會發現在 client 端會同時出現你輸入的字眼吶! 如果你同時給予一些額外的參數,例如利用標準輸入與輸出 (stdout, stdin) 的話, 那麼就可以透過這個連線來作很多事情了! 當然 nc 的功能不只如此,你還可以發現很多的用途喔! 請自行到您主機內的 /usr/share/doc/nc-1.10/scripts 目錄下看看這些 script ,有幫助的吶.
---------------------------------------------

Tcpdump的使用

tcpdump采用命令行方式,它的命令格式为:
  tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
          [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
          [ -T 类型 ] [ -w 文件名 ] [表达式 ]

  1. tcpdump的选项介绍
   -a    将网络地址和广播地址转变成名字;
   -d    将匹配信息包的代码以人们能够理解的汇编格式给出;
   -dd    将匹配信息包的代码以c语言程序段的格式给出;
   -ddd    将匹配信息包的代码以十进制的形式给出;
   -e    在输出行打印出数据链路层的头部信息;
   -f    将外部的Internet地址以数字的形式打印出来;
   -l    使标准输出变为缓冲行形式;
   -n    不把网络地址转换成名字;
   -t    在输出的每一行不打印时间戳;
   -v    输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
   -vv    输出详细的报文信息;
   -c    在收到指定的包的数目后,tcpdump就会停止;
   -F    从指定的文件中读取表达式,忽略其它的表达式;
   -i    指定监听的网络接口;
   -r    从指定的文件中读取包(这些包一般通过-w选项产生);
   -w    直接将包写入文件中,并不分析和打印出来;
   -T    将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程
调用)和snmp(简单       网络管理协议;)

  2. tcpdump的表达式介绍
   表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表
达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会
被截获。
   在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,
net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明
202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是
host.
   第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.
48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则
缺省是src or dst关键字。
   第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在
FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e
ther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
监听所有协议的信息包。
   除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';
   这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
说明。
   (1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
    #tcpdump host 210.27.48.1
   (2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令
:(在命令行中适用   括号时,一定要
    #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
   (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
,使用命令:
    #tcpdump ip host 210.27.48.1 and ! 210.27.48.2
   (4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
    #tcpdump tcp port 23 host 210.27.48.1

  3. tcpdump 的输出结果介绍
   下面我们介绍几种典型的tcpdump命令的输出信息
   (1) 数据链路层头信息
   使用命令#tcpdump --e host ice
   ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
   H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条
命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.
telne
t 0:0(0) ack 22535 win 8760 (DF)
  分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该
数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它
表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的
目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.
telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535
表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.

  (2) ARP包的TCPDUMP输出信息
   使用命令#tcpdump arp
   得到的输出结果是:
  22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
  22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af
:1a)
  分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是
ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:5
8:af:1a是主机ICE的MAC地址。

  (3) TCP包的输出信息
   用TCPDUMP捕获的TCP包的一般输出信息是:
  src > dst: flags data-seqno ack window urgent options
  src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F
IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
Options是选项.

  (4) UDP包的输出信息
   用TCPDUMP捕获的UDP包的一般输出信息是:
  route.port1 > ice.port2: udp lenth
  UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
ICE的port2端口,类型是UDP, 包的长度是lenth.