tcpdump

tcpdump是一個可以抓取封包的指令,可以將封包儲存起來用Wireshark打開,Mac OS X預設已經安裝了,大多數系統預設都有安裝,這邊就講幾個常用的選項啦。

Mac OS X目前版本

~ % tcpdump --version
tcpdump version 4.7.3 -- Apple version 66
libpcap version 1.5.3 - Apple version 54

iPhone目前版本

TuTu-iPhone:~ root# tcpdump --version
tcpdump version 3.9.8
libpcap version 1.5.3 - Apple version 47


直接下tcpdump就會自動開始抓取封包了,Ctrl+C退出

~ % sudo tcpdump       
tcpdump: data link type PKTAP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on pktap, link-type PKTAP (Packet Tap), capture size 262144 bytes
14:56:10.990377 IP 192.168.1.100.17500 > broadcasthost.17500: UDP, length 155
14:56:10.990675 IP 192.168.1.100.17500 > 192.168.1.255.17500: UDP, length 155
14:56:10.990821 IP 172.20.10.4.17500 > 172.20.10.15.17500: UDP, length 155
^C
3 packets captured
9 packets received by filter
0 packets dropped by kernel

這邊稍微看一下訊息,第三行listening on pktappktap是Mac OS X版本的tcpdump才有的介面,就是指抓取所有Interface的封包,包含lookpback以及tunnel。

pktap詳細

(我)常用選項

-i interface #指定Interface
-s capture size #抓取封包大小,在iPhone要指定-s 0才可以抓取完整封包
-w write to file #將封包儲存至檔案
-r read from file #從檔案讀取封包
-A print in ASCII #將封包以ASCII方式顯示
-l set monitor mode #設定為monitor mode
-p don't set promiscuous mode #預設為混雜模式,該選項就是設定不要混雜模式
-d #將過濾器以類似組合語言方式顯示
-dd #將過濾器以C語言陣列表示法顯示(16進位)
-ddd #將過濾器以10進位顯示
expression #過濾器表達式,同Wireshark篇的Capture Filter


現在如果要抓取arp封包指令下:

~ % sudo tcpdump -i en0 arp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:04:45.519012 ARP, Request who-has 192.168.1.1 tell 192.168.1.100, length 28
15:04:45.520777 ARP, Reply 192.168.1.1 is-at f8:1a:67:53:f5:dc (oui Unknown), length 28


抓取有包含TCP SYN欄位的封包並且以ASCII方式顯示,這邊要注意的是,因為會用到&符號,在shell裡這有特別的意思,所以必須用單引號將過濾器表達式包起來。

~ % sudo tcpdump -i en0 -A 'tcp[tcpflags] & tcp-syn != 0'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on en0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:06:53.091703 IP 192.168.1.100.50480 > moodle.mcu.edu.tw.http: Flags [S], seq 1197749901, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 86779076 ecr 0,sackOK,eol], length 0
E..@..@[email protected]`S..0.PGd6.........<&.............


-d的選項是用來產生過濾器核心所用的參數,因為產生這些參數需要使用JIT(Just-in-time compiler),一般寫程式用不到這複雜的方式。可以利用tcpdump來產生,之後寫程式需要(當然也可以用libpcap產生啦)。

~ % tcpdump -i en0 arp -d
(000) ldh      [12]
(001) jeq      #0x806           jt 2    jf 3
(002) ret      #262144
(003) ret      #0
~ % tcpdump -i en0 arp -dd
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 1, 0x00000806 },
{ 0x6, 0, 0, 0x00040000 },
{ 0x6, 0, 0, 0x00000000 },
~ % tcpdump -i en0 arp -ddd
4
40 0 0 12
21 0 1 2054
6 0 0 262144
6 0 0 0

這邊要注意的是,一定要用-i來指定Interface,因為不是所有的Intetface支援所有的過濾器。

其他選項有需要時就看man page就好了呦。

results matching ""

    No results matching ""