如何通过 Tcpdump 捕获 ack 或 syn 数据包?

lar*_*rry 62 tcp tcpdump

我想使用过滤规则只捕获 ack 或 syn 数据包。我该怎么做呢?

Zor*_*che 94

用于 tcpdump的pcap 过滤器语法在wireshark 捕获过滤器上的工作方式应该完全相同。

使用 tcpdump 我会使用这样的过滤器。

tcpdump "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"
Run Code Online (Sandbox Code Playgroud)

查看tcpdump 手册页,并密切关注 tcpflags。

请务必查看 Wireshark Wiki 中有关捕获和显示过滤器的部分。不幸的是,这两种类型的过滤器使用完全不同的语法,并且对同一事物使用不同的名称。

如果您想要一个显示过滤器而不是捕获过滤器,您可能需要构建一个结合 tcp.flags.ack 和 tcp.flags.syn 的表达式。不过,我对捕获过滤器更为熟悉,因此您必须自己解决。

  • 这是一个很好的答案,有很好的参考,但请注意,此语法将捕获设置了 SYN 或 ACK 标志的任何数据包,即使还设置了其他标志。这可能是也可能不是 OP 的意图。如果只需要 TCP SYN 或 ACK 数据包,请参阅下面我的回答以获得更严格的过滤器。干杯。 (4认同)

JJC*_*JJC 20

虽然@Zoredache 的回答很好而且很完整,但请注意,该语法将产生任何设置了 TCP SYN 或 TCP ACK 标志的数据包,包括严格来说不仅仅是简单的“TCP SYN”或“TCP ACK”数据包的数据包,因为它们设置了其他标志。这可能是也可能不是您(或未来的读者)的意图。例如,该语法还将捕获 TCP SYN-ACK 数据包、TCP FIN-ACK 等。如果您想要TCP SYN 或 TCP ACK 数据包(即设置这些标志之一),则正确的捕获过滤器语法是:

'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'
Run Code Online (Sandbox Code Playgroud)

等效地:

'tcp[13] == 2 or tcp[13] == 16'
Run Code Online (Sandbox Code Playgroud)

干杯!


小智 13

tcpdump 'tcp[13] = 3'
Run Code Online (Sandbox Code Playgroud)

http://danielmiessler.com/study/tcpdump/

先进的

您还可以根据数据包的特定部分进行过滤,以及将多个条件组合成组。例如,前者在仅查找SYNs 或RSTs时很有用,后者用于更高级的流量隔离。

联合行动小组

[提示:TCP 标志的字谜:不熟练的攻击者纠缠真正的安全人员]

你的备忘录:...

显示所有紧急 ( URG) 数据包...

tcpdump 'tcp[13] & 32 != 0'
Run Code Online (Sandbox Code Playgroud)

显示所有 ACKNOWLEDGE ( ACK) 数据包...

tcpdump 'tcp[13] & 16 != 0'
Run Code Online (Sandbox Code Playgroud)

显示所有 PUSH ( PSH) 数据包...

tcpdump 'tcp[13] & 8 != 0'
Run Code Online (Sandbox Code Playgroud)

显示所有 RESET ( RST) 数据包...

tcpdump 'tcp[13] & 4 != 0'
Run Code Online (Sandbox Code Playgroud)

显示所有 SYNCHRONIZE ( SYN) 数据包...

tcpdump 'tcp[13] & 2 != 0'
Run Code Online (Sandbox Code Playgroud)

显示所有 FINISH ( FIN) 数据包...

tcpdump 'tcp[13] & 1 != 0'
Run Code Online (Sandbox Code Playgroud)

显示所有 SYNCHRONIZE/ACKNOWLEDGE ( SYNACK) 数据包...

tcpdump 'tcp[13] = 18'
Run Code Online (Sandbox Code Playgroud)

[注:只有PSHRSTSYN,和FIN标志显示在tcpdump的的标志字段输出。URGs 和ACKs 显示,但它们显示在输出中的其他地方而不是标志字段中]

  • [SE] 不允许抄袭。请编辑此帖子,以表明您已从链接站点复制了内容。谢谢你。 (2认同)

小智 9

我制作了一个脚本来查看顶级“同步器”。为此,我只考虑初始的 syn 数据包(三个数据包握手的第一个数据包)。即syn = 1, ack = 0

while :; do
  date; 
  tcpdump -i eth1 -n -c 100 \
  'tcp[tcpflags] & (tcp-syn) != 0' and 
  'tcp[tcpflags] & (tcp-ack) == 0' 2> /dev/null \
  | awk '{ print $3}' \
  | sort | uniq -c | sort | tail -5;
  echo;
  sleep 1
done
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的例子。您可以通过将 "'tcp[tcpflags] & (tcp-syn) != 0' 和 'tcp[tcpflags] & (tcp-ack) == 0'" 替换为 'tcp[tcpflags] 来进一步简化您的 tcpdump 捕获过滤器] == tcp-syn'。这将自动排除设置了 ACK 的数据包。干杯! (5认同)