我有一个巨大的 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 标志的段。因此,该命令的作用是:
收集带有 SYN 或 FIN 标志的段
tcpdump -r pcap-file 'tcp[tcpflags] & (tcp-syn|tcp-fin) > 0
按半连接聚合结果,不管实际标志是什么(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
或。如果设置了任一标志,则将该字段与进行0x3
AND运算将产生非零值。tcp.flags
0x3
tshark
在此处输出每个数据包的 TCP 流编号。我们对它们进行排序并计算唯一编号。最后一步仅打印此流的数据包数量小于 4 的行(每个半方向 1 个 SYN 和 1 个 FIN)。
然后你可以使用以下方式打开 Wireshark
wireshark -r pcap-file -R "tcp.stream eq 1234"
其中 1234 来自前一个命令。
漂亮吗?我想不漂亮。快吗?不……