在位于我的本地网络和路由器之间的设备上,(所有流量都通过)我需要从 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 个字节字段
标签id-at-commonName
由Wireshark显示,有线格式不包含文本,而是原始字节。名称id-at-commonName
以03
字节为单位。接下来是一个长度为 9 个字节的 UTF8String (12 = 0x0c) ( localhost
)。
如果您尝试匹配 TCP 流中的主机名,请记住以下几点:
id-ce-subjectAltName
(2.5.29.17)中找到其他名称最后,请注意,SSL 消息可能会拆分为多个 TCP 段,这使得直接分析变得更加困难。也许可以选择捕获以将固定数量的数据包写入启用旋转的文件,然后使用 tshark 手动解析,最后删除捕获?
归档时间: |
|
查看次数: |
21664 次 |
最近记录: |