如何在巨大的数据包捕获文件中找到没有最终 ack/fin 序列的 tcp 流

如何在巨大的数据包捕获文件中找到没有最终 ack/fin 序列的 tcp 流

我有一个巨大的 pcap 文件,其中包含大量单独的 tcp 流。但其中有一些无效流没有最终的 fin/ack 序列。有没有办法使用 wireshark 找到这些流?还有其他工具可以让我以这种方式搜索 pcaps 吗?

任何帮助,将不胜感激。

答案1

以下命令打印每个不完整的半连接。

tcpdump -r pcap-file 'tcp[tcpflags] & (tcp-syn|tcp-fin) > 0' | 
sed -r 's/^.*IP (.*) > (.*):.*$/\1 \2/'|sort|uniq -u

该方法假设每个插座对在整个跟踪过程中仅使用一次。

解释

对于之间的连接

IP_A:PORT_A <--> IP_B:PORT_B

tcpdump 包含一半

IP_A:PORT_A > IP_B:PORT_B, and
IP_B:PORT_B > IP_A:PORT_A

对于每半部分,转储必须包含两个带有 SYN 或 FIN 标志的段。因此,该命令的作用是:

  1. 收集带有 SYN 或 FIN 标志的段

    tcpdump -r pcap-file 'tcp[tcpflags] & (tcp-syn|tcp-fin) > 0

  2. 按半连接聚合结果,不管实际标志是什么(SYN 或 FIN)

    2.1. 按半连接排序

    sed -r 's/^.*IP (.*) > (.*):.*$/\1 \2/'|sort

    2.2. 统计每个半连接所涉及的段数,并筛选出所有正确涉及两个段的半连接

    uniq -u

答案2

这是使用 的另一种方法tshark。 这个想法与@artistoex 的答案相同 - 不同之处在于它不会自己查看每个半连接,并且输出是 TCP 流号(来自 Wireshark/tshark),当您想要在 Wireshark 中打开该流并继续在那里进行后期处理时,这可能更容易使用。

tshark -r pcap_file.pcap -R "tcp.flags & 0x03" -Tfields -etcp.stream | 
sort -n | uniq -c | awk -F ' ' '{ if ($1<4) print $1," ", $2 }'

显示过滤器与另一个答案中的捕获过滤器功能相同,它利用了 SYN 和 FIN 位是 TCP 标志字段中两个最低有效位这一事实,因此如果同时设置了这两个位,则为0b11或。如果设置了任一标志,则将该字段与进行0x3AND运算将产生非零值。tcp.flags0x3

tshark在此处输出每个数据包的 TCP 流编号。我们对它们进行排序并计算唯一编号。最后一步仅打印此流的数据包数量小于 4 的行(每个半方向 1 个 SYN 和 1 个 FIN)。

然后你可以使用以下方式打开 Wireshark

wireshark -r pcap-file -R "tcp.stream eq 1234"

其中 1234 来自前一个命令。

漂亮吗?我想不漂亮。快吗?不……

相关内容