从 pcap 文件中提取 TCP 应用程序数据

从 pcap 文件中提取 TCP 应用程序数据

给定一个.pcap(或类似的)文件,我想选择一个 TCP 连接并转储两个应用程序数据流(一个另一个同辈和一个另一个对等体)分成磁盘上的两个单独的文件。

假设我有一个.pcap文件,除其他信息外,我知道其中包含 HTTP/1.1 纯文本连接的完整 TCP 流(从 SYN 到最终的 FIN+ACK/RST)。我希望得到两个包含内容的结果文件。即一个文件包含

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/ write/ send/recv`/...)。我想要用它转储一些流量,并用它来测试我的解析器是否适用于某种网络协议。解析器应该能够读取其中一个文件并尝试解析数据流。


这样的命令行工具看起来怎么样?我不确定这是否非常有用,但我认为如果我还给出一个可以做到这一点的假想工具的使用示例,可​​能会更清楚地说明我正在寻找什么。让我们调用这个假想工具(这就是我正在寻找的)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

答案1

如果必须手动执行此操作,则需要删除封装协议的标头。但是,这其中有一些微妙之处,可能并不简单:

  • 以太网 (L2):以太网报头(14 字节)可能包含或不包含 802.1q 标签(在 Ethertype 前面,添加 4 个字节;0x0800=IPv4、0x86dd=IPv6、0x8100=802.1q 标签),并且以太网有效负载可能跟在或不跟在 FCS(4 字节)后面。
  • IP(L3):基本 IPv4 报头为 20 字节,IPv6 使用 40 字节。每个都有选项或扩展 - 请查看国际人道法IPv4 字段(5 = 无选项),或下一个标题IPv6 字段(6表示 TCP,无扩展名)。任何数据包都可能被分割成多个 L2 帧(IPv4:MF已设置或片段偏移>0;IPv6 使用扩展报头 44)。每个第一个片段都包含 L4 报头,而后续片段则不包含。
  • TCP(L4):基本 TCP 段头为 20 字节,但也可能包含选项(数据偏移量>5). TCP 采用无序传送的数据包(通过序列号),因此您可能需要缓冲相当一部分数据。数据段还可能重复到达。

tcpflow我建议使用像@AlexD 建议的适当的工具。

相关内容