通過tcpdump分析TCP報文(1)

第一部分,先熟悉一下tcpdump的基本使用對一個普通的TCP數據報文進行分析


tcpdump的基本使用

常用參數:
參考:https://blog.51cto.com/nickfox/2089655
-i 指定監聽的網絡接口
-nn IP和端口均以數字形式顯示
-c 在收到指定的數量的分組後,tcpdump停止,如果沒有這個參數,tcpdump會持續不斷的監聽直到用戶輸入 [ctrl]-c 爲止
-e 輸出數據鏈路層的頭部信息(顯示MAC地址相關信息)。
-t 在輸出的每一行不打印時間戳
-q 只輸出較少的協議信息(僅輸出協議名稱,如TCP;而不輸出封包標記信息,如F、P等標記)

-w FILE直接將分組寫入文件中,而不是到stdout
-r FILE從後面接的文件將數據包數據讀出來。那個「文件」是已經存在的文件,並且這個「文件」是由 -w 所製作出來的
-s 設置tcpdump的數據包抓取長度爲len,如果不設置默認將會是65535字節。對於要抓取的數據包較大時,長度設置不夠可能會產生包截斷,若出現包截斷,輸出行中會出現"[|proto]“的標誌(proto實際會顯示爲協議名)。但是抓取len越長,包的處理時間越長,並且會減少tcpdump可緩存的數據包的數量,從而會導致數據包的丟失,所以在能抓取我們想要的包的前提下,抓取長度越小越好(-s 0 使用默認長度65535)。
-D 列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們都可以用於”-i"後
-L 列出網絡接口的已知數據鏈路。
-F 從文件中讀取抓包的過濾表達式。若使用該選項,則命令行中給定的其他表達式都將失效。

-A 數據包的內容以 ASCII 顯示,通常用來捉取WWW的網頁數據包資料
-X 數據包內容以十六進制 (hex)和ASCII顯示,對於監聽數據包內容很有用
-XX 比-X輸出更詳細


我這裏使用的抓包設備是樹莓派,先用上述的-D/-L參數,查看下當前環境的基本信息。

  1. sudo tcpdump -D:
    在這裏插入圖片描述
    我的設備當前使用的是wifi連接,所以第一個是wlan0,如果抓包的時候沒有使用 -i 指定接口,默認抓第一個接口的包。
  2. sudo tcpdump -L:
    在這裏插入圖片描述
    鏈路類型,Ethernet,所以二層頭是下面這樣
    在這裏插入圖片描述

測試環境
再用我windows下寫過的一個socket實例和樹莓派建立一次tcp連接試一下抓包。
socket實例是這篇文章裏寫過的,可以直接拿來使用:https://blog.csdn.net/qq_25453065/article/details/79827715
linux 請求socket連接,可以通過操作文件描述符實現,它要指向linux的特殊文件:/dev/tcp/hostname/port。

下面操作一下:
windows 這一端
直接打開實例,隨便輸入一個1024以上的端口號,點擊Listen按鈕,下面狀態信息編程偵聽狀態即可。這臺設備局域網ip是192.168.2.101
在這裏插入圖片描述
樹莓派這一端
創建文件描述符7,模式是輸入和輸出,所以是<>。因爲windows的ip是192.168.2.101,同時偵聽的是2345端口,所以命令寫成下面這個樣子:
exec 7<> /dev/tcp/192.168.2.101/2345
之後對這個連接的寫入和讀取操作,都可以通過描述符7來實現。
之後用 cat <&7 命令讀取了信息,因爲windows那一端,我寫的是只要有客戶端上線,就會自動由服務器向所有在線的客戶端廣播上線信息,所以會收到這條消息。
在這裏插入圖片描述
在這裏插入圖片描述
上線即廣播消息的對應實現代碼:
在這裏插入圖片描述


對一個普通的TCP數據報文進行分析

確認連接沒有問題,用tcpdump抓一個簡單的報文來分析一下。
由於我這裏樹莓派是在windows上用VNC連接的,所以兩臺設備之間的報文往來會很多,所以,我們不能基於hostname抓包,直接基於port抓包比較好。所以第一步是查出來建立連接所使用的端口,這個是隨機分的,不能預先知道。
第一步,查端口的方法,也比較簡單,因爲建立tcp連接的會先進行三次握手,這裏進行握手的時候,報文攜帶的SYN標記就是一個很好的過濾條件,最後查出樹莓派這端用來發起連接請求的端口號是56412。
在這裏插入圖片描述
第二步,基於端口號56412抓包。使用了-e和-XX兩個參數,爲了儘可能詳細的分析報文,還使用了-S,是爲了ack顯示實際值,而不是相對值。敲完命令,在windows端發送一個消息,Server:hello!。此時就可以在樹莓派上抓到兩個包,一個是來自server的消息,一個是從本端發出的應答消息。
在這裏插入圖片描述
在這裏插入圖片描述
我們先分析第一個報文,也就是來自server的消息報文。


1.先看二層頭部:
二層頭,由這三部分組成,與幀格式對應。
在這裏插入圖片描述
也就是說目的mac是b8-27-eb-e6-1c-6b,源mac是a0-c5-89-55-f0-14,Type是0800。
目的mac對應的是樹莓派的網卡地址,源mac是電腦的網卡地址。type根據不同的值,代表之後緊接着的頭部是不同的協議,0800代表的是後面是IPV4報文

在這裏插入圖片描述
Type對應的含義:
在這裏插入圖片描述
對於遵守TCP/IP協議的設備來說,收到這樣一個報文,先解析目的mac是不是自己的,如果不是,則直接丟棄,如果是,則剝掉二層頭,暴露出三層頭,然後上送對應的三層協議棧處理。


2.再看三層頭部:
三層頭,這裏一共是20字節。
在這裏插入圖片描述
對應IP頭格式來看,
Version:0x4,IHL:0x5,
所以這是一個IPV4報文,同時IP頭長度是5個UINT32,也就是20字節。

Total Length:0x37 = 55(DEC)
55字節是從IP頭開始之後的報文總長度,IP頭佔了20,也就是說後面的TCP頭+data一共35字節。

Identification + Flags + Fragment Offset:0x728c4000
這一行是分片時纔會起作用的字段,這裏報文長度太短,達不到MTU,暫不分析。

Time to Live: 0x80,Protocol:0x06,Header CheckSum:0x0262
TTL是0x80,也就是256,這個值只有在經過一個路由器時,才減一。我的兩個設備在同一個局域網下,相當於二層互通,所以根本用不上路由器轉發,這個值就是初始值,沒有減一過。
Protocol是6代表下一層協議是TCP。
校驗和,爲了檢驗糾錯使用,暫不分析。

Source Address:0xc0a80265,Destination Address:0xc0a8021d
源IP和目的IP,轉爲點分十進制表示:即爲192.168.2.101 和 192.168.2.29
在這裏插入圖片描述
protocl字段對應的含義:
在這裏插入圖片描述


3.再來是四層頭
這裏的tcp頭部也是20字節,沒有擴展字段
在這裏插入圖片描述
Source Port:0x0929,Destination Port:0xdc5c
源端口號0x929 = 2345(DEC),目的端口號0xdc5c = 56412(DEC),對應我們建立TCP連接所使用的端口號。

Sequence Number:0xbf05ba26,Acknowledgment Number:0xda14ece3
seqNumber是報文的發送方發送的報文序列號,每發送一個就加一。
AckNumber是報文的發送方請求應答方發送的報文序列號。

Dataoffset:0x5,Reserved(6 Bits): 000000,Flag(6Bits):0x18 = 011000,Window:0x0100
dataoffset表示tcp頭部長度是5個UINT32,也就是20字節,跟IP頭部的IHL類似。
Reserved必須填0,保留字段,暫時沒用,可能後續會有擴展的用途吧
Flag有6個bit,下一篇文章再詳述。
Window相當於就是接收方的當前緩衝區大小,指明瞭能夠一次接收多少字節的報文。

Checksum:0x4fde,Urgent Pointer:0x0000
checksum是與ip頭中的header checksum功能類似,校驗用
Urgent Pointer配合URG標記置一纔會有用處。
在這裏插入圖片描述


4.最後是data
在這裏插入圖片描述
直接用utf-8編碼方式來解析對應data
0x5365727665723a2068656c6c6f210a
在這裏插入圖片描述
可以直接解析出具體的內容。所以說在網絡中明文傳輸,很危險的。。


這篇總結藉助tcpdump比較詳細的分析了一個普通的數據報文他的組成以及各個字段的含義。下一篇用tcpdump抓一下tcp的握手和揮手報文,總結分析其中的過程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章