如何从 pcap 文件中提取所有数据包的 TCP 标头?

Posted

技术标签:

【中文标题】如何从 pcap 文件中提取所有数据包的 TCP 标头?【英文标题】:How can I extract TCP header for all the packets from a pcap file? 【发布时间】:2020-12-22 15:03:38 【问题描述】:

我在 Wireshark 中有一个 pcap 文件,我希望提取单个数据包的 TCP 标头。这可以在wireshark中使用吗?如果不是,我可以使用什么 scapy 命令?

【问题讨论】:

【参考方案1】:

我不知道您正在寻找哪种格式的 TCP 标头 - 每个单独的 TCP 标头字段或组成 TCP 标头的原始字节,但这里有一些使用各种工具的想法:

如果您想要 TCP 标头字段,您可以使用tshark 获取大部分。例如:

tshark -r file.pcap -T fields -e tcp.srcport -e tcp.dstport -e tcp.seq_raw -e tcp.ack_raw -e tcp.hdr_len -e tcp.flags -e tcp.window_size_value -e tcp.checksum -e tcp.urgent_pointer -e tcp.options

我指出大多数,因为没有办法知道哪些 TCP 选项(如果有)可能存在于任何给定的 TCP 数据包中,因此很难单独列出每个选项并始终保证输出将是有意义的。我认为您可以在这里做的最好的事情就是打印包含所有 TCP 选项的字节,这就是我在这里所做的。

如果您想要包含 TCP 标头的原始字节,那么我认为这有点棘手,尽管不一定是不可能的。一种应该工作的方法,至少在某些情况下,涉及一些步骤和工具:

    删除 TCP 负载。为此,我建议将捕获文件(例如 file.pcapng)加载到由 Jasper Bongertz 编写和维护的免费工具 Tracewrangler 中。要删除 TCP 有效负载,请将捕获文件加载到工具中并运行 "-> Anonymize Files" 任务,确保选中指示框,“Truncate Packets after layer: Layer 4 (TCP/UDP)”。运行此任务后,您将拥有一个名为 file_anon.pcapng 的新捕获文件,除了不存在任何 TCP 有效负载字节之外,它将与原始文件相同。

    为了进一步隔离 TCP 标头字节,还需要删除帧和 IP 标头字节,但遗憾的是 Tracewrangler 不支持这一点。 如果所有帧和 IP 数据包头大小相同(例如,14 字节的以太网帧和 20 字节的 IP 头,没有 IP 选项),那么您可以使用editcap 截断第一个数据包的 34 字节用于隔离 TCP 标头字节。例如:

    editcap -T user0 -C 34 file_anon.pcapng file_anon_chopped.pcapng

这里我还将封装类型从以太网(假设它是以太网)更改为用户定义的类型,因为以太网帧字节已被删除。现在要读取隔离的 TCP 标头字节,您可以简单地运行:

tshark -r file_anon_chopped.pcapng -x

这可能会或可能不会产生您感兴趣的输出,因此您只需对其进行测试,看看它是否满足您的需求。当然,如果 IP 标头不是全部相同的固定 20 字节大小,这将不起作用。另一个可能的 Tracewrangler 增强功能可能是删除所有 IP 标头选项,以保证所有 IP 数据包的固定大小,但这也不支持 [尚未?]。

顺便说一句,这并不是绝对必要的,但是如果您希望 Wireshark 正确理解 file_anon_chopped.pcapng 文件中的 TCP 标头字节,那么您需要编辑 Wireshark 的 DLT 首选项,以便 Wireshark 知道如何解释这些字节。基本上,您必须告诉 Wireshark user0 封装的含义。为此,请打开 Wireshark 并导航到 “编辑 -> 首选项 -> 协议 -> DLT_USER -> 封装表 -> 编辑”,然后为“用户 0 (DLT=147) " 被解码为 tcp。

可能还有其他方法可以实现您的目标,但我对 Scapy 等工具不够熟悉,无法使用该工具为您提供解决方案。

【讨论】:

以上是关于如何从 pcap 文件中提取所有数据包的 TCP 标头?的主要内容,如果未能解决你的问题,请参考以下文章

从 PCAP 文件中提取时间并保存为 CSV 文件

使用 libpcap,有没有办法从离线 pcap 文件中确定捕获的数据包的文件偏移量?

pcap中tcp包的'flags'属性值在python中由dpkt读取时表示什么?

Python-对Pcap文件进行处理,获取指定TCP流

从PCAP文件中提取时间并另存为CSV文件

如何根据 TCP 流有效地拆分 pcap 文件?