用于 TLS 客户端 hello 和 TCP SYN 的 Scapy BPF 过滤器

问题描述

我正在尝试为 scapy 的 sniff() 编写一个 BPF 过滤器来捕获属于 TLSClientHello 数据包或 TCP SYN 数据包的数据包。这是我所拥有的:

sniff(filter="tcp dst port 443 and ((tcp[((tcp[12] & 0xf0) >> 2)] = 0x16) or (tcp[13] & 0x02 = 1))",prn=process_packet,iface=iface,store=False)

不过,嗅探只是在 TLSClientHello 上进行。出于某种原因,SYN 数据包无法通过。 BPF 有什么问题?

解决方法

应该捕获 TCP SYN 的过滤器部分的逻辑 and 将返回 2,而不是 1。所以:

(tcp[13] & 0x02 = 1)

应该是:

(tcp[13] & 0x02 = 2)

或者(至少使用 tcpdump,我还没有尝试使用 Scapy):

(tcp[tcpflags] & tcp-syn != 0)