tcpdump抓包二進制tcp協議詳細分析

一、tcpdump -i eth0 port 11751 and src host 192.168.1.34 -x -s0網絡

 

[plain]  view plain  copy
 
  1. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode  
  2. listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes  
  3. 14:15:42.714678 IP 192.168.1.34.39497 > 192.168.1.21.intrepid-ssl: P 3445320732:3445320750(18) ack 3456192260 win 46 <nop,nop,timestamp 1322201171 1322174386>  
  4.         0x0000:  4500 0046 8c5e 4000 4006 2acc c0a8 0122  
  5.         0x0010:  c0a8 0115 9a49 2de7 cd5b 6c1c ce01 4f04  
  6.         0x0020:  8018 002e bb7b 0000 0101 080a 4ecf 3053  
  7.         0x0030:  4ece c7b2 0e00 0000 030f de0d 9402 0000  
  8.         0x0040:  0000 0000 0000  


二、抓包的顯示如上圖,這個二進制顯示了所有封包的內容,頭部是MAC,即數據鏈路層的數據,這個打印的時候-x選項不顯示了。tcp

2)第二部分是IP包,格式以下:大數據

 

IP包頭字段說明 
版本:4位,指定IP協議的版本號。 
首部長度(IHL):4位,IP協議首部的長度,指明IPv4協議首部長度的字節數包含多少個32位。因爲IPv4的首部可能包含可變數量的可選項,因此這個字段能夠用來肯定IPv4數據報中數據部分的偏移位置。IPv4首部的最小長度是20個字節,所以IHL這個字段的最小值用十進制表示就是5 (5x4 = 20字節)。就是說,它表示的是首部的總字節數是4字節的倍數。 
服務類型:定義IP協議包的處理方法,它包含以下子字段 
過程字段:3位,設置了數據包的重要性,取值越大數據越重要,取值範圍爲:0(正常)~ 7(網絡控制)  延遲字段:1位,取值:0(正常)、1(期特低的延遲)  流量字段:1位,取值:0(正常)、1(期特高的流量)  可靠性字段:1位,取值:0(正常)、1(期特高的可靠性)  成本字段:1位,取值:0(正常)、1(期特最小成本)  未使用:1位  長度:IP包的總長 
認證:標識字段惟一地標識主機發送的每一份數據報。一般每發送一份報文它的值就會加1 標誌:是一個3位的控制字段,包含: 
保留位:1位  
不分段位:1位,取值:0(容許數據報分段)、1(數據報不能分段)  
更多段位:1位,取值:0(數據包後面沒有包,該包爲最後的包)、1(數據包後面有更多的包)spa

段偏移量:當數據分組時,它和更多段位(MF, More fragments)進行鏈接,幫助目的主機將分段的包組合。 
TTL:表示數據包在網絡上生存多久,每經過一個路由器該值減一,爲0時將被路由器丟棄。 
協議:8位,這個字段定義了IP數據報的數據部分使用的協議類型。經常使用的協議以下表:.net


校驗和:16位,是IPv4數據報包頭的校驗和。 
源IP地址: 
目的IP地址:code

3)第三部分是具體傳輸的協議,這裏是tcp協議,格式以下:blog

顯示TCP首部的數據格式。若是不計任選字段,它一般是20個字節。ip

三、根據協議二進制字段過濾ssl

1) tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net x.x.x.x'路由

打印TCP會話中的的開始和結束數據包, 而且數據包的源或目的不是本地網絡上的主機.(nt: x.x.x.x, 實際使用時要真正替換成本地網絡的名字))

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

打印全部源或目的端口是80, 網絡層協議爲IPv4, 而且含有數據,而不是SYN,FIN以及ACK-only等不含數據的數據包.(ipv6的版本的表達式可作練習)
(nt: 可理解爲, 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). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整個ip數據包的長度減去ip頭的長度,再減去
tcp頭的長度不爲0, 這就意味着, ip數據包中確實是有數據.對於ipv6版本只需考慮ipv6頭中的'Payload Length' 與 'tcp頭的長度'的差值, 而且其中表達方式'ip[]'需換成'ip6[]'.)

3) tcpdump 'gateway snup and ip[2:2] > 576'
打印長度超過576字節, 而且網關地址是snup的IP數據包

4) tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
打印全部IP層廣播或多播的數據包, 但不是物理以太網層的廣播或多播數據報

5)tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
打印除'echo request'或者'echo reply'類型之外的ICMP數據包( 好比,須要打印全部非ping 程序產生的數據包時可用到此表達式 .
(nt: 'echo reuqest' 與 'echo reply' 這兩種類型的ICMP數據包一般由ping程序產生))

四、根據數據部分過濾

 

[plain]  view plain  copy
 
  1. [root@IM-SJ01-Server21 ~]# tcpdump -i eth0 port 11751 and tcp[32] == 0xe -x -s0  
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode  
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes  
  4. 14:15:42.714678 IP 192.168.1.34.39497 > 192.168.1.21.intrepid-ssl: P 3445320732:3445320750(18) ack 3456192260 win 46 <nop,nop,timestamp 1322201171 1322174386>  
  5.         0x0000:  4500 0046 8c5e 4000 4006 2acc c0a8 0122  
  6.         0x0010:  c0a8 0115 9a49 2de7 cd5b 6c1c ce01 4f04  
  7.         0x0020:  8018 002e bb7b 0000 0101 080a 4ecf 3053  
  8.         0x0030:  4ece c7b2 0e00 0000 030f de0d 9402 0000  
  9.         0x0040:  0000 0000 0000  

 

1)計算數據的起始位置

ip首部的長度爲((ip[0]&0xf)<<2))即ip[0]=0x45,即長度爲20,因此IP頭部到第二行的0115結束,後面就是具體傳送協議的數據了,這裏是tcp數據。

tcp首部的長度 ((tcp[12]&0xf0)>>2)),其中tcp[12]=0x80,計算長度爲20,因此tcp頭部的長度是20,從8018開始數20字節到c7b2結束。

因此tcp數據開始的地方是tcp[12+tcp首部長度]=tcp[20],即從0e00開始。

2)根據數據過濾,好比數據第一個字節tcp[32]==0xe,這樣添加過濾條件過濾便可。

 

 

其中ip[2:2] 是從2字節(16bit)位開始,通過2字節(16bit),也就是ip頭部的16-32位。

tcp依次類推

相關文章
相關標籤/搜索