tcpdump網絡抓包工具使用

tcpdump介紹

tcpdump 是一個運行在命令行下的抓包工具。它允許用戶攔截和顯示發送或收到過網絡連接到該計算機的TCP/IP和其他數據包。tcpdump 適用於大多數的類Unix系統操作系統(如linux,BSD等)。

類Unix系統的 tcpdump 需要使用libpcap這個捕捉數據的庫就像 windows下的WinPcap。在學習tcpdump前最好對基本網絡的網絡知識有一定的認識。

tcpdump命令格式及常用參數

Tcpdump的大概形式如下:

例:tcpdump –i eth0 ’port 1111‘ -X -c 3

-X告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。

 

tcpdump採用命令行方式,它的命令格式爲:

  tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]

          [ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ]

                                       [ -T 類型 ] [ -w 文件名 ] [表達式 ]

 tcpdump的選項介紹

    -a    # 將網絡地址和廣播地址轉變成名字;

   -d    # 將匹配信息包的代碼以人們能夠理解的彙編格式給出;

   -dd   # 將匹配信息包的代碼以c語言程序段的格式給出;

   -ddd   # 將匹配信息包的代碼以十進制的形式給出;

   -e    # 在輸出行打印出數據鏈路層的頭部信息,包括源mac和目的mac,以及網絡層的協議;

   -f    # 將外部的Internet地址以數字的形式打印出來;

   -l    # 使標準輸出變爲緩衝行形式;

   -n    # 指定將每個監聽到數據包中的域名轉換成IP地址後顯示,不把網絡地址轉換成名字;

     -nn:   # 指定將每個監聽到的數據包中的域名轉換成IP、端口從應用名稱轉換成端口號後顯示

   -t    # 在輸出的每一行不打印時間戳;

   -v    # 輸出一個稍微詳細的信息,例如在ip包中可以包括ttl和服務類型的信息;

   -vv   # 輸出詳細的報文信息;

   -c    # 在收到指定的包的數目後,tcpdump就會停止;

   -F    # 從指定的文件中讀取表達式,忽略其它的表達式;

   -i    # 指定監聽的網絡接口;

     -p:    # 將網卡設置爲非混雜模式,不能與host或broadcast一起使用

   -r    # 從指定的文件中讀取包(這些包一般通過-w選項產生);

   -w    # 直接將包寫入文件中,並不分析和打印出來;

     -s snaplen        # snaplen表示從一個包中截取的字節數。0表示包不截斷,抓完整的數據包。默認的話 tcpdump 只顯示部分數據包,默認68字節。

   -T    # 將監聽到的包直接解釋爲指定的類型的報文,常見的類型有rpc (遠程過程調用)和snmp(簡單網絡管理協議;)

     -X      # 告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。

1、抓取回環網口的包:tcpdump -i lo

2、防止包截斷:tcpdump -s0

3、以數字顯示主機及端口:tcpdump -n

實例1:

如鍵入命令: tcpdump –i eth0 ‘port 1111’ -X -c 3

-i :是interface的含義,是指我們有義務告訴tcpdump希望他去監聽哪一個網卡,

-X :告訴tcpdump命令,需要把協議頭和包內容都原原本本的顯示出來(tcpdump會以16進制和ASCII的形式顯示),這在進行協議分析時是絕對的利器。

port 1111:我們只關心源端口或目的端口是1111的數據包.

-c :是Count的含義,這設置了我們希望tcpdump幫我們抓幾個包。

其中還有另外一個比較重要的參數– l  使得輸出變爲行緩衝

-l選項的作用:就是將tcpdump的輸出變爲“行緩衝”方式,這樣可以確保tcpdump遇到的內容一旦是換行符即將緩衝的內容輸出到標準輸出,以便於利用管道

或重定向方式來進行後續處理。

Linux/UNIX的標準I/O提供了全緩衝、行緩衝和無緩衝三種緩衝方式。

標準錯誤是不帶緩衝的,終端設備常爲行緩衝,而其他情況默認都是全緩衝的。

 實例2:

例如我們只想提取包的每一行的第一個域(時間域),這種情況下我們就需要-l將默認的全緩衝變爲行緩衝了。

tcpdump -i eth0 port 1111 -l | awk '{print $1}'

 

參數–w  -r

-w 直接將包寫入文件中(即原始包,如果使用 重定向 > 則只是保存顯示的結果,而不是原始文件),即所謂的“流量保存”---就是把抓到的網絡包能存儲到磁盤上,

保存下來,爲後續使用。參數-r 達到“流量回放”---就是把歷史上的某一時間段的流量,重新模擬回放出來,用於流量分析。

 

通過-w選項將流量都存儲在cp.pcap(二進制格式)文件中了.可以通過 –r 讀取raw packets文件 cp.pcap. 

如:sudo tcpdump i- eth0 'port 1111' -c 3 -r cp.pcap 即可進行流量回放。

問:流量回放又有啥子用?

tcpdump的輸出結果介紹

 鍵入命令:sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111' 所截獲包內容如下:

   -n    不把網絡地址轉換成名字;

 

#  sudo tcpdump -i eth0 -e -nn -X -c 2 'port1111' 

 

第一行:“tcpdump: verbose output suppressed, use -v or -vv for fullprotocol decode”

提示使用選項-v和-vv,可以看到更全的輸出內容。

第二行:“listening on eth0, link-type EN10MB (Ethernet), capture size 65535bytes”

我們監聽的是通過eth0這個NIC設備的網絡包,且它的鏈路層是基於以太網的,要抓的包大小限制是65535字節。包大小限制值可以通過-s選項來設置。

第三行:”12:40:33.569037 00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4, ethertypeIPv4 (0x0800),”

12:40:33.569037 分別對應着這個包被抓到的“時”、“分”、“秒”、“微妙”。

00:19:e0:b5:10:94 > 00:1a:a0:31:39:d4 表示MAC地址00:19:e0:b5:10:94發送到MAC地址爲00:1a:a0:31:39:d4的主機,ethertype IPv4 (0x0800)表示

Ethernet幀的協議類型爲ipv4(即代碼爲0x0800)。

第四行:”length 66: 210.45.123.249.27236 > 172.16.0.11.1111: Flags [S],seq 1624463808,

length 66表示以太幀長度爲66。 210.45.123.249.27236表示這個包的源IP爲210.45.123.249,源端口爲27236,’>’表示數據包的傳輸方向, 172.16.0.11.1111,

表示這個數據包的目的端ip爲172.16.0.11,目標端口爲1111,1111端口是我的一個web服務器監聽端口。Flags是[S],表明是syn建立連接包(即三次握手的第一次

握手),seq1624463808 序號爲1624463808,這個其實就是TCP三次握手的第一次握手:client(210.45.123.249)發送syn請求建立連接包。

第五行:” win 8192, options [mss 1460,nop,wscale 2,nop,nop,sackOK], length 0”

win 8192 表示窗口大小爲8192字節。options[mss 1460,nop,wscale 2,nop,nop,sackOK]爲tcp首部可選字段mss 1460表示mss是發送端(客戶端)通告的最大

報文段長度,發送端將不接收超過這個長度的TCP報文段(這個值和MTU有一定關係)。nop是一個空操作選項, wscale指出發送端使用的窗口擴大因子爲2, sackOK

表示發送端支持並同意使用SACK選。

下面幾行分別是IP,TCP首部 ,這裏不再敷述。

 

tcpdump過濾語句介紹

可以給tcpdump傳送“過濾表達式”來起到網絡包過濾的作用,而且可以支持傳入單個或多個過濾表達式。

可以通過命令 man pcap-filter 來參考過濾表達式的幫助文檔。

過濾表達式大體可以分成三種過濾條件,“類型”、“方向”和“協議”,這三種條件的搭配組合就構成了我們的過濾表達式。

關於類型的關鍵字,主要包括host,net,port, 例如 host 210.45.114.211,指定主機 210.45.114.211,net 210.11.0.0 指明210.11.0.0是一個網絡地址,port 21 指明端口號是21。如果沒有指定類型,缺省的類型是host.

關於傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,

這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.45.114.211 ,指明ip包中源地址是210.45.114.211, dst net 210.11.0.0 指明目的網絡地址是210.11.0.0  。如果沒有指明方向關鍵字,則缺省是srcor dst關鍵字。

關於協議的關鍵字,主要包括 ether,ip,ip6,arp,rarp,tcp,udp等類型。這幾個的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的信息包。

如我們只想抓tcp的包命令爲: sudo tcpdump -i eth0  -nn -c1 'tcp'

除了這三種類型的關鍵字之外,其他重要的關鍵字如下:

gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算是'or' ,'||';

可以利用這些關鍵字進行組合,從而組合爲比較強大的過濾條件。下面舉例說明

(1)只想查目標機器端口是21或80的網絡包,其他端口的我不關注:

  sudo tcpdump -i eth0 -c 10 'dst port 21 or dst port 80'

(2) 想要截獲主機172.16.0.11 和主機210.45.123.249或 210.45.123.248的通信,使用命令(注意括號的使用):

  sudo tcpdump -i eth0 -c 3 'host 172.16.0.11 and (210.45.123.249 or210.45.123.248)'

(3)想獲取使用ftp端口和ftp數據端口的網絡包

   sudo tcpdump 'port ftp or ftp-data'

   這裏 ftp、ftp-data到底對應哪個端口? linux系統下 /etc/services這個文件裏面,就存儲着所有知名服務和傳輸層端口的對應關係。如果你直接把/etc/services裏

   的ftp對應的端口值從21改爲了3333,那麼tcpdump就會去抓端口含有3333的網絡包了。

(4) 如果想要獲取主機172.16.0.11除了和主機210.45.123.249之外所有主機通信的ip包,使用命令:

 sudo tcpdump ip ‘host 172.16.0.11 and ! 210.45.123.249’

(5) 抓172.16.0.11的80端口和110和25以外的其他端口的包

sudo tcpdump -i eth0 ‘host 172.16.0.11 and! port 80 and ! port 25 and ! port 110’

 

tcpdump高級用法:

下面介紹一些tcpdump中過濾語句比較高級的用法

想獲取172.16.10.11和google.com之間建立TCP三次握手中帶有SYN標記位的網絡包.

命令爲:sudo tcpdump -i eth0 'host 172.16.0.11 andhost google.com and tcp[tcpflags]&tcp-syn!=0' -c 3 -nn

 

上面的命令是不是看着有點暈的感覺。      是的。

下面詳細介相關知識。

其實我們理解這種語法:  proto [ expr : size] ,就不難理解上面的語句了。

下面詳細介紹proto [ expr : size]

Proto即protocol的縮寫,它表示這裏要指定的是某種協議名稱,如ip,tcp,udp等。總之可以指定的協議有十多種,如鏈路層協議 ether,fddi,tr,wlan,ppp,slip,link,

網絡層協議ip,ip6,arp,rarp,icmp傳輸層協議tcp,udp等。

expr用來指定數據報字節單位的偏移量,該偏移量相對於指定的協議層,默認的起始位置是0;而size表示從偏移量的位置開始提取多少個字節,可以設置爲

1、2、4,默認爲1字節。如果只設置了expr,而沒有設置size,則默認提取1個字節。比如ip[2:2],就表示提取出第3、4個字節;而ip[0]則表示提取ip協議頭的

第一個字節。在我們提取了特定內容之後,我們就需要設置我們的過濾條件了,我們可用的“比較操作符”包括:>,<,>=,<=,=,!=,總共有6個。

舉例:想截取每個TCP會話的起始和結束報文(SYN 和 FIN 報文), 而且會話方中有一個遠程主機.

sudo tcpdump 'tcp[13] & 3 != 0 and not(src and dst net 172.16.0.0)' -nn

如果熟悉tcp首部報文格式可以比較容易理解這句話,因爲tcp便宜13字節的位置爲2位保留位和6位標誌位(URG,ACK,PSH,RST,SYN,FIN), 所以與3相與就可以得出

SYN,FIN其中是否一個置位1. 

從上面可以看到在寫過濾表達式時,需要我們對協議格式比較理解才能把表達式寫對。這個比較有難度的..。爲了讓tcpdump工具更人性化一些,有一些常用的偏移量,

可以通過一些名稱來代替,比如icmptype表示ICMP協議的類型域、icmpcode表示ICMP的code域,tcpflags 則表示TCP協議的標誌字段域。

更進一步的,對於ICMP的類型域,可以用這些名稱具體指代:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect,icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob,icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq,icmp-maskreply。

而對於TCP協議的標誌字段域,則可以細分爲tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg。

對於tcpdump 只能通過經常操作來熟練這些語句了。也可以把網絡包用tcpdump截獲保存到指定文件,然後用wireshark等可視化軟件分析網絡包。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章