Networking

從 pcap 文件中提取 TCP 應用程序數據

  • January 28, 2022

給定一個.pcap(或類似的)文件,我想選擇一個 TCP 連接並將兩個應用程序數據流(一個來自另一個對等方,一個兩個來自另一個對等方)轉儲到磁碟上的兩個單獨文件中。

假設我有一個.pcap文件,除其他外,我知道它包含 HTTP/1.1 明文連接的完整 TCP 流(從 SYN 到最終 FIN+ACK/RST)。我想要兩個包含內容的結果文件。IE。一個文件有

GET / HTTP/1.1\r\n
host: foobar.com\r\n
\r\n

另一個文件有

HTTP/1.1 200 ok\r\n
content-length: ...\r\n
... \r\n
\r\n
<html>...</html>

我希望這正是在使用者空間中看到/發送的應用程序數據流量(來自read// recv/...)writesend/`我想要做的是轉儲一些流量並使用它來測試我的解析器是否有某個網路協議。解析器應該只能讀取其中一個文件並嘗試解析數據流。


這樣的命令行工具怎麼看?我不確定這是否超級有用,但我認為如果我還提供了一個可以執行此操作的虛構工具的使用範例,它可能會讓我在尋找什麼更清楚。讓我們稱之為虛構的工具(這就是我要找的)tcp-stream-extract。我想用類似的東西來稱呼它

### imaginary usage example of the tool that I'd like to find :)

# dump from 12345 to 23456
tcp-stream-extract \
   -i my-captured-packets.pcap
   -s 127.0.0.1:12345        \ # source address 127.0.0.1:12345
   -d 127.0.0.1:23456        \ # destination address 127.0.0.1:23456
   -t '2021-01-28 09:12:00Z' \ # the TCP conn was alive at that time
   -w from-port-12345-to-port-23456

# dump from 23456 to 12345
tcp-stream-extract \
   -i my-captured-packets.pcap
   -s 127.0.0.1:23456        \ # source address 127.0.0.1:12345
   -d 127.0.0.1:12345        \ # destination address 127.0.0.1:23456
   -t '2021-01-28 09:12:00Z' \ # the TCP conn was at that time
   -w from-port-23456-to-port-12345

如果您必須手動執行此操作,則需要刪除封裝協議的標頭。但是,它們有一些微妙之處,可能並非微不足道:

  • 乙太網 (L2):乙太網報頭(14 個字節)可能包含也可能不包含 802.1q 標籤(在 Ethertype 前面,添加 4 個字節;0x0800=IPv4、0x86dd=IPv6、0x8100=802.1q 標籤),乙太網有效負載可能包含也可能不包含後跟 FCS(4 個字節)。
  • IP (L3):一個基本的 IPv4 報頭是 20 字節,IPv6 使用 40 字節。每個都有選項或擴展 - 檢查 IPv4 的IHL欄位(5 = 無選項),或 IPv6 的Next Header欄位(6表示 TCP,無擴展)。任何數據包都可以跨多個 L2 幀進行分段(IPv4:MF已設置或Fragment Offset >0;IPv6 使用擴展標頭 44)。每個第一個片段都包含 L4 標頭,後面的片段不包含。
  • TCP (L4):基本的 TCP 段頭是 20 字節,但它也可能包含選項(數據偏移量>5)。TCP 採用無序傳遞的段(按序列號),因此您可能需要緩衝相當一部分數據。段也可能重複到達。

tcpflow正如@AlexD 所建議的那樣,我建議使用適當的工具,例如 。

引用自:https://serverfault.com/questions/1091449