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

时间:2020-09-03 11:19:18

标签: python tcp wireshark scapy pcap

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

1 个答案:

答案 0 :(得分: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

我表示为 most ,因为无法知道任何给定TCP数据包中可能存在哪些TCP选项(如果有的话),因此很难逐一列出每个选项并始终保证输出将是有意义的。我认为您可以在这里做的最好的事情就是只打印构成所有TCP选项的字节,这就是我在这里所做的。

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

  1. 删除TCP有效负载。为此,我建议将捕获文件(例如file.pcapng)加载到由Jasper Bongertz编写和维护的名为Tracewrangler的免费工具中。要删除TCP有效负载,请将捕获文件加载到工具中并运行“->匿名化文件” 任务,并确保选中表示“在层后截断数据包: 4(TCP / UDP)”。。运行此任务后,您将有一个名为file_anon.pcapng的新捕获文件,该文件与原始文件相同,只是不存在任何TCP有效负载字节。

  2. 为进一步隔离TCP头字节,也需要删除帧和IP头字节,但是不幸的是Tracewrangler不支持此功能。 如果所有帧和IP数据包头的大小都相同(例如,以太网帧为14字节,而没有IP选项的IP为20字节),则可以使用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数据包的大小都是固定的,但是还不支持。[p?]

顺便说一句,并不是必须这样做,但是如果您想让Wireshark正确了解file_anon_chopped.pcapng文件中的TCP头字节,则需要编辑Wireshark的DLT首选项,以便Wireshark知道如何解释那些字节。基本上,您必须告诉Wireshark user0封装的含义。为此,打开Wireshark并导航到“编辑->首选项->协议-> DLT_USER->封装表->编辑” ,然后为“用户0(DLT = 147)添加一个条目“,将其解码为tcp。

也许还有其他方法可以实现您的目标,但是我对Scapy之类的工具并不熟悉,无法使用该工具为您提供解决方案。