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 pktap
,pktap
是Mac OS X版本的tcpdump才有的介面,就是指抓取所有Interface的封包,包含lookpback以及tunnel。
(我)常用選項
-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就好了呦。