tcpdump 服务器 Hello 证书过滤器

tcpdump 服务器 Hello 证书过滤器

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

因此我试图弄清楚如何使用 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='

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

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

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

有人能解释一下为什么我看不到这些数据tcpdump吗?

答案1

如果您只是想获取 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)

其中 0x16 = 数据第一个字节字段处的握手(22)

并且数据的第 6 个字节字段处为 0x01 = Client Hello (1)

答案2

标签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 手动解析,最后删除捕获?

答案3

谢谢@Nathan Chan,由于声誉不够,我无法发表评论,请添加参数“-nnXSs0 -ttt”以使其可读。

tcpdump -i any -s 1500 '(tcp[((tcp[12:1] & 0xf0) >> 2)+5:1] = 0x01) and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)' -nnXSs0 -ttt

相关内容