tcpdump 服务器 Hello 证书过滤器

Kur*_*wan 5 ssl tcpdump

在位于我的本地网络和路由器之间的设备上,(所有流量都通过)我需要从 Hello Server Certificate 数据包中读取通用名称。

所以我试图弄清楚如何使用 tcpdump 获得正确的过滤器。

我从这篇论文中找到了帮助:http : //www.wains.be/pub/networking/tcpdump_advanced_filters.txt
它解释了如何在 IP 和 TCP 字段上使用高级过滤器。

我试过这种过滤器:

$ tcpdump -i any \
  'tcp and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \
   -A -s 0 -v | grep 'Host\|id-at-commonName='
Run Code Online (Sandbox Code Playgroud)

正如论文中所解释的,“我们正在匹配任何包含数据的数据包。”

它适用于Host许多其他数据的字段,但我无法匹配id-at-commonName=SSL 字段中的字段(所以在 TCP 数据字段中?)。

为了确保我使用完全相同的过滤器(没有 grep)捕获了一个 pcap 文件,当我用 Wireshark 打开它时,我可以获得每个证书通用名称。我必须使用tcpdump过滤器,因为我需要“即时”获取数据。

有人可以解释为什么我看不到这些数据tcpdump吗?

小智 6

如果您只想获取 SSL Handshake Hello 数据包以查看包含的 SNI,以下过滤器似乎对 TLS1.0 和 TLS1.2 都有效:

tcpdump -i any -s 1500 (tcp[((tcp[12:1] & 0xf0) >> 2)+5:1] = 0x01) and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)
Run Code Online (Sandbox Code Playgroud)

其中 0x16 = Handshake (22) 在数据的第一个字节字段

0x01 = Client Hello (1) 在数据的第 6 个字节字段

  • 我不得不调整语句`tcpdump -i any -s 1500 '(tcp[((tcp[12:1] &amp; 0xf0) &gt;&gt; 2)+5:1] = 0x01) and (tcp[((tcp[12 :1] &amp; 0xf0) &gt;&gt; 2):1] = 0x16)'` (3认同)

Lek*_*eyn 3

标签id-at-commonName由Wireshark显示,有线格式不包含文本,而是原始字节。名称id-at-commonName03字节为单位。接下来是一个长度为 9 个字节的 UTF8String (12 = 0x0c) ( localhost)。

Wireshark 截图

如果您尝试匹配 TCP 流中的主机名,请记住以下几点:

  • 证书可能对多个科目有效,您可以在id-ce-subjectAltName(2.5.29.17)中找到其他名称
  • 您尝试连接的真实主机可能会通过服务器名称指示 (SNI) 扩展在 ClientHello 握手消息中公布。
  • 多条消息可以组合在一条记录中。

最后,请注意,SSL 消息可能会拆分为多个 TCP 段,这使得直接分析变得更加困难。也许可以选择捕获以将固定数量的数据包写入启用旋转的文件,然后使用 tshark 手动解析,最后删除捕获?