在位于我的本地网络和路由器之间的设备上(所有流量都通过),我需要从 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-commonName
是03
以字节为单位紧接着的是长度为 9 个字节的 UTF8String (12 = 0x0c)(localhost
)。
如果您尝试匹配 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