天天看點

tcpdump抓取TCP辨別位

tcpdump抓取TCP辨別位

按每8位組算,TCP的标志位位于第13個8位組中,如下,第一行一共32位是0 - 3個8位組,第二行是4-7八位組,第三行是8-11八位組,data offset +reserved的前四個是第12個8位組,reserved中的後2位+6個标志位是第13個八位組。

以下TCP報頭

tcpdump抓取TCP辨別位

是以第13個八位組結構為

- - + + + + + +

前面2個是保留的,都為0,後面的6個根據不同情況有不同值,例如syn 包 則為

00 0 0 0 0 1 0

這是二進制轉化為十進制就是2

是以 tcpdump -ni eth0 tcp[13]==2 就表示syn包。

同理,syn+ack包為

00 0 1 0 0 1 0

化為十進制就是18,是以tcpdump -ni eth0 tcp[13]==18 表示syn+ack包。

如果想同時抓syn和syn+ack包,則進行tcp[13]位值與掩碼進行與運算:

tcp[13] & 2 == 2

此外,還可以利用 tcp[tcpflags]=tcp-syn 這種格式來寫,後面的值可以為tcp-fin, tcp-syn, tcp-rst, tcppush, tcp-ack, tcp-urg任意一種。

示例

1、列印TCP會話中的的開始和結束資料包,并且資料包的源或目的不是本地網絡上的主機。

tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

localnet, 實際使用時要真正替換成本地網絡的名字

2、列印所有源或目的端口是80,網絡層協定為IPv4,并且含有資料,而不是SYN,FIN以及ACK-only等不含資料的資料包。

tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

ip[2:2]表示整個ip資料包的長度; (ip[0]&0xf)<<2)表示ip資料包標頭的長度(ip[0]&0xf代表包中的IHL域,而此域的機關為32bit,要換算成位元組數需要乘以4,即左移2);(tcp[12]&0xf0)>>4 表示tcp頭的長度,此域的機關也是32bit,換算成比特數為 ((tcp[12]&0xf0) >> 4)<<2,即 (tcp[12]&0xf0)>>2)

原文

[1]http://hi.baidu.com/nanjidegou/item/7d144cc0f3499252ac00efe7

[2]http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

[3]http://blog.chinaunix.net/uid-7934175-id-3379372.html

繼續閱讀