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

2022-08-27 00:12:12 字數 4281 閱讀 1893

1、tcpdump -i eth0 port 11751 and src host 192.168.1.34 -x -s0

[plain]view plain

copy

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode  

listening on eth0, link-type en10mb (ethernet), capture size 65535 bytes  

14:15:42.714678 ip 192.168.1.34.39497 > 192.168.1.21.intrepid-ssl: p 3445320732:3445320750(18) ack 3456192260 win 46 

0x0000:  4500 0046 8c5e 4000 4006 2acc c0a8 0122  

0x0010:  c0a8 0115 9a49 2de7 cd5b 6c1c ce01 4f04  

0x0020:  8018 002e bb7b 0000 0101 080a 4ecf 3053  

0x0030:  4ece c7b2 0e00 0000 030f de0d 9402 0000  

0x0040:  0000 0000 0000  

2、抓包的顯示如上圖,這個二進位制顯示了全部封包的內容,頭部是mac,即資料鏈路層的資料,這個列印的時候-x選項不顯示了。

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(資料報後面有更多的包)

段偏移量:當資料分組時,它和更多段位(mf, more fragments)進行連線,幫助目的主機將分段的包組合。 

ttl:表示資料報在網路上生存多久,每通過乙個路由器該值減一,為0時將被路由器丟棄。 

協議:8位,這個字段定義了ip資料報的資料部分使用的協議型別。常用的協議如下表:

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

顯示tcp首部的資料格式。如果不計任選字段,它通常是20個位元組。

3、根據協議二進位製欄位過濾

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) <

即 ((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程式產生))

4、根據資料部分過濾

[plain]view plain

copy

[root@im-sj01-server21 ~]# tcpdump -i eth0 port 11751 and tcp[32] == 0xe -x -s0  

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode  

listening on eth0, link-type en10mb (ethernet), capture size 65535 bytes  

14:15:42.714678 ip 192.168.1.34.39497 > 192.168.1.21.intrepid-ssl: p 3445320732:3445320750(18) ack 3456192260 win 46 

0x0000:  4500 0046 8c5e 4000 4006 2acc c0a8 0122  

0x0010:  c0a8 0115 9a49 2de7 cd5b 6c1c ce01 4f04  

0x0020:  8018 002e bb7b 0000 0101 080a 4ecf 3053  

0x0030:  4ece c7b2 0e00 0000 030f de0d 9402 0000  

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依次類推

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

Linux rpm (二進位製包)

linux 軟體包管理大致可分為二進位製包 原始碼包,使用的工具也各不相同。linux 常見軟體包分為兩種,分別是源 包 source code 二進位製包 binary code 源 包是沒有經過編譯的包,需要經過 gcc c 編譯器環境編譯或解壓才能執行,二進位製包無需編譯,可以直接安裝使用。通...

RPM二進位製包

linux 軟體包管理大致可分為二進位製包 原始碼包,使用的工具也各不相同。linux 常見軟體包分為兩種,分別是源 包 source code 二進位製包 binary code 源 包是沒有經過編譯的包,需要經過 gcc c 編譯器環境編譯或解壓才能執行,二進位製包無需編譯,可以直接安裝使用。通...