tcpdump抓包及tshark解包方法介紹


tshark是wireshark的命令行工具,通過shell命令抓取、解析報文。tcpdump是Linux系統下的抓包工具。wireshark和tcpdump都共同使用 libpcap作為其底層抓包的庫,tshark也可以抓取報文。

有時候需要在linux系統或者ARM開發板中進行抓包,使用tcpdump抓包更加方便,在這種場景下,一般使用tcpdump進行抓包,然后在Windows中使用wireshark來分析生成的包文件,在自動化分析或者自動化測試中,可以使用tshark來進行包解析。本文介紹使用tcpdump抓取報文后使用tshark進行報文解析。

安裝

wireshark下載安裝
wireshark官網:https://www.wireshark.org/download.html

# linux
yum -y install wireshark
yum -y install tcpdump

幫助信息

$ tcpdump -h

查看可用端口:

$ tcpdump -D
1.ens33
2.ens37
3.veth2424bf4
4.any (Pseudo-device that captures on all interfaces)
5.lo [Loopback]

tcpdump

tcpdump官方文檔:https://www.tcpdump.org/index.html#documentation

常用參數

  • -i interface :指定抓包接口,tcpdump -i eth1
  • -c count:抓取包個數,tcpdump -c 5 -i eth0 僅抓取5個包
  • -w file:保存
  • -A:ASCII碼形式打印報文
  • -XX:HEX 和 ASCII形式顯示報文

抓包

抓取eth1網卡數據包,數據寫入文件/tmp/packet.pcap

tcpdump -i eth1 -w /tmp/packet.pcap  >/dev/null 2>&1 &

其中

  • >/dev/null:將標准輸出(控制台輸出)重定向到/dev/null中,/dev/null代表 linux 的空設備文件。表示不輸出內容
  • 2>&1:重定向綁定,錯誤輸出(2)和標准輸出(1)輸出到同一個地方
  • >/dev/null 2>&1的作用就是丟棄標准輸出和錯誤輸出,不會輸出任何信息到控制台。

也可以只抓取特定協議的報文,比如過濾tcp報文:

tcpdump -i eth1 tcp

抓取指定端口的報文

tcpdump -i eth1 port 22

抓取指定源IP的報文

tcpdump -i src 192.168.0.1

抓取指定目的IP的報文

tcpdump -i dst 192.168.0.1

停止抓包

如果沒有限制 tcpdump 抓包的數量(-c 參數),tcpdump 會持續抓包。可以通過 Ctrl+C 來停止抓包,或者殺掉tcpdump進程:

killall -9 tcpdump

殺掉tcpdump進程后會停止抓包。

讀取報文

$ tcpdump -r packet.pcap
reading from file packet.pcap, link-type EN10MB (Ethernet)
20:47:07.732570 IP 192.168.2.103.53074 > 69.173.159.48.https: Flags [F.], seq 2534329882, ack 3470120544, win 1027, length 0
20:47:08.789990 IP 192.168.2.103.50544 > tm-in-f188.1e100.net.https: Flags [.], seq 708023523:708023524, ack 4093529409, win 1027, length 1
20:47:09.037350 IP tm-in-f188.1e100.net.https > 192.168.2.103.50544: Flags [.], ack 1, win 265, options [nop,nop,sack 1 {0:1}], length 0
20:47:09.195077 IP 192.168.2.103.50920 > 118.178.135.232.https: Flags [P.], seq 1760992480:1760992516, ack 2403978898, win 1023, length 36
20:47:09.222742 IP 118.178.135.232.https > 192.168.2.103.50920: Flags [P.], seq 1:62, ack 36, win 1024, length 61

tshark

抓包完成后對數據包進行解析,下面介紹使用tshark解析數據包。

tshark工具介紹

tshark參考文檔:https://www.wireshark.org/docs/man-pages/tshark.html

如果要在windows命令行窗口使用tshark需要將Wireshark安裝路徑 C:\Program Files\Wireshark 添加到環境變量。

查看幫助信息:

$ tshark -h

列出可用網卡接口:

$ tshark -D
1. \Device\NPF_{4B48290B-6C8B-4A93-A942-A7E565B02F09} (Npcap Loopback Adapter)
2. \Device\NPF_{D8F1F103-9733-422C-A521-77C678EEAFFC} (WLAN)
3. \Device\NPF_{AB52B03B-45ED-43C9-B88F-C7499A78AED0} (kc)
4. \Device\NPF_{64EA0097-AE33-49AD-9F42-959017C397FA} (WAN)
5. \Device\NPF_{257F23D0-E615-4656-AB32-5338DB62843C} (以太網 2)
6. \Device\NPF_{B5376652-68BB-45DA-A822-086E401773BB} (本地連接* 10)

功能類似於Linux中的netstat -iifconfig -aip link命令查看網卡接口信息。Linux系統和windows系統tshark使用方法一樣

tshark命令抓包

常用參數:

  • -i | --interface <capture interface> :指定抓包接口
  • -f <capture filter>:抓包過濾,BPF(Berkeley Packet Filter)過濾規則,tcpdump和scapy(filter參數)都使用這個過濾規則,參考Python Scapy 報文構造和解析
  • -w <outfile>:將數據包寫入文件
  • -O <protocols>:打印數據包詳細信息
  • -V:打印數據包詳細視圖
  • -P:寫入文件過程中,打印數據包簡略信息
  • -c <capture packet count>:設置抓取最大的包個數
  • -a|--autostop <autostop condition>:duration:5—5秒后停止抓包;files:2—寫了2個文件后停止;filesize:100—包大小達到100KB后停止,

tshark抓包示例:

$ tshark -i "WLAN" -f "tcp port 80" -w "test.pcap"
$ tshark -i "WLAN" -f "tcp port 80" -w "test.pcap" -P -a duration:10
Capturing on 'WLAN'
15   0.000000 08:ed:ed:3e:9e:f3 -> Broadcast    ARP 60 Who has 192.168.1.1?  Tell 192.168.1.244
  0.001051 fe80::4983:bddb:14e0:f9c4 -> ff02::1:2    DHCPv6 157 Solicit XID: 0xd2726a CID: 00010001272da3902c534a01104e
  0.065122 TendaTec_21:73:e1 -> Broadcast    ARP 60 Who has 192.168.1.1?  Tell 192.168.1.126
省略......
$ capinfos test.pcap
File name:           test.pcap
File type:           Wireshark - pcapng
File encapsulation:  Ethernet
Packet size limit:   file hdr: (not set)
Number of packets:   155
File size:           29 kB
Data size:           23 kB
Capture duration:    9 seconds
Start time:          Sun Apr 25 16:44:23 2021
End time:            Sun Apr 25 16:44:33 2021
Data byte rate:      2595 bytes/s
Data bit rate:       20 kbps
Average packet size: 153.96 bytes
Average packet rate: 16 packets/sec
SHA1:                2b4a555a362301156ff26a7f295b4d609dd97a33
RIPEMD160:           e34a63f4bcfe805d220f73dea78a8f4b63074a80
MD5:                 cc560fd267886a596ed72397a73625e3
Strict time order:   True

tshark解析數據包

常用參數:

  • -r:指定需要解析的數據包
  • -T:指定數據包解析輸出格式,支持格式見解碼所有數據,這里介紹 -T fields,一般與-e 選項連用。
  • -e:指定過濾的字段
  • -E:可用於指定分隔符: separator=,:默認分隔符為縮進(\t)
  • -Y:過濾指定報文
tshark [ -r <infile> ]  -T fields [ -e <field> ] -E <field print option> -Y <displaY filter>
tshark -r packet.pcap -T fields -e 解析的字段 -E separator=,

需要解析的字段可以通過Wireshark查看:
選擇要過濾的內容 -> 右鍵 -> Apply as Filter -> Selected

例1:過濾具有源IP和目的IP字段的所有報文

tshark -r packet.pcap -T fields -e ip.src -e ip.dst 

例2:過濾源地址為fe80::ca3a:35ff:fe09:efa1的報文,並讀取UDP源端口號和IPv6目的地址。

$ tshark -r packet.pcap -T fields  -E separator=, -Y ipv6.src==fe80::ca3a:35ff:fe09:efa1 -e udp.srcport -e ipv6.dst
,ff02::2
,ff02::2
,ff02::16
546,ff02::1:2
546,ff02::1:2
546,ff02::1:2
546,ff02::1:2
$ 

注意-Y參數中,多個條件用||&&and或者or連接,如果使用多個-Y參數,只有最后一個生效,下面過濾源地址為fe80::ca3a:35ff:fe09:efa1的DHCPv6 Solicit報文:

$ tshark -r packet.pcap -T fields  -E separator=, -Y dhcpv6.msgtype==1 -Y ipv6.src==fe80::ca3a:35ff:fe09:efa1 -e udp.srcport -e ipv6.dst
,ff02::2
,ff02::2
,ff02::16
546,ff02::1:2
546,ff02::1:2
546,ff02::1:2
546,ff02::1:2
$ tshark -r packet1.pcap -T fields  -E separator=, -Y "dhcpv6.msgtype==1 and ipv6.src==fe80::ca3a:35ff:fe09:efa1" -e udp.srcport -e ipv6.dst
546,ff02::1:2
546,ff02::1:2
546,ff02::1:2
546,ff02::1:2

過濾完成后進行進一步的分析
比如可以使用grep命令進一步提取滿足條件的報文
過濾源地址或者目的地址為192.168.5.38的報文

# linux
tshark -r packet.pcap -T fields -e ip.src -e ip.dst | grep 192.168.5.38 
# windows
tshark -r packet.pcap -T fields -e ip.src -e ip.dst | findstr 192.168.5.38 

也可以使用python、Java等高級語言進行進一步的分析,Python示例如下:

result = os.popen("tshark -r packet.pcap -T fields -e ip.src -e ip.dst“)
ret = result.read() # 
for i, value in enumerate(ret.split("\n")):
      處理value值
      pass

解碼所有數據

某些字段可能無法使用tshark過濾,這種情況下,可以先將pcap文件解碼,tshark支持如下文件格式:

ek|fields|json|jsonraw|pdml|ps|psml|tabs|text

解碼成xml和text格式文件:

tshark -r packet.pcap -V -T pdml > packet.xml
tshark -r packet.pcap -V -T text > packet.txt
  • -V:輸出數據包詳細信息
  • -T pdml:指定數據包解碼輸出格式為xml格式

xml文檔可以使用python的ElementTree工具解析:

try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

問題:windows tshark命令無效

系統:windows10
tshark已加入環境變量中
輸入tshark,顯示:

C:\Users\DELL>tshark
The NPF driver isn't running.  You may have trouble capturing or
listing interfaces.
Capturing on '鏈湴榪炴帴* 9'

WIreshark安裝需要安裝WinPcap,查看電腦已經安裝了WinPcap。

接下來以管理員身份運行命令行串口,輸入net start npf 啟動NPF,出現如下報錯信息:

C:\WINDOWS\system32>net start npf
服務名無效。

請鍵入 NET HELPMSG 2185 以獲得更多的幫助。

卸載WinPcap10,下載安裝winpcap4.1.3:https://www.winpcap.org/install/default.htm

重新輸入net start npf 啟動NPF:

C:\WINDOWS\system32>net start npf
請求的服務已經啟動。

請鍵入 NET HELPMSG 2182 以獲得更多的幫助。

啟動成功!
tshark命令也可以正常使用了

--THE END--

文章標題:tcpdump抓包及tshark命令解包方法介紹
本文作者:hiyo
本文鏈接:https://www.cnblogs.com/hiyong/p/14288239.html
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM