在位于本地networking和路由器之间的设备上(所有stream量都经过),我需要从Hello Server Certificate数据包中读取公共名称。
所以我想弄清楚如何使用tcpdump获得适当的filter。
我从这篇文章中find了帮助: http : //www.wains.be/pub/networking/tcpdump_advanced_filters.txt
它解释了如何在IP和TCP字段上使用高级filter。
我尝试这种filter:
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字段,但我不能匹配在SSL字段(所以在TCP数据字段?)的字段id-at-commonName= 。
为了确保我捕获了一个完全相同的filter(没有grep)pcap文件,当我用Wireshark打开它,我可以得到每个证书的通用名称。
我必须使用tcpdumpfilter,因为我需要“即时”获取数据。
有人可以告诉我为什么不能通过tcpdump看到这些数据?
如果您只想获取SSL握手Hello数据包以查看包含的SNI,则以下filter似乎适用于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)在数据的第一个字节字段
和0x01 =客户端Hello(1)在数据的第6个字节字段
Wireshark显示的是id-at-commonName标签,wire格式不包含文本,但是包含原始字节。 id-at-commonName name的名字是03字节 。 之后,有一个长度为9字节( localhost )的UTF8String(12 = 0x0c)。

如果您尝试匹配来自TCPstream的主机名,请记住以下几点:
id-ce-subjectAltName (2.5.29.17)中find其他名称, 最后,请注意,SSL消息可能会被分割为多个TCP段,这使得直接分析变得更加困难。 也许这是一个选项捕获写入固定数量的数据包文件启用旋转,手动parsing与tshark后,最后删除捕获?