2

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

4

1 回答 1

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 标头的原始字节,那么我认为这有点棘手,尽管不一定是不可能的。至少在某些情况下应该有效的一种方法涉及一些步骤和工具:

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

  2. 为了进一步隔离 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 并导航到“Edit -> Preferences -> Protocols -> DLT_USER -> Encapsulations Table -> Edit”,然后为“User 0 (DLT=147)”添加一个条目以解码为 tcp。

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

于 2020-09-03T16:44:49.323 回答