HTTPS 客户端的被动指纹识别

信息安全 tls 网页浏览器 监控 指纹识别 操作系统指纹
2021-08-23 01:07:29

是否可以仅根据网络窃听者可见的数据被动地对 HTTPS 客户端进行指纹识别?

换句话说,考虑一个可以看到所有数据包的网络监控盒(但不知道任何私钥,只是被动地监控流量)。仅基于网络跟踪中可见的内容,能否推断出正在使用的客户端版本的合理猜测?例如,我们能猜出客户端使用的是什么浏览器和什么版本吗?

当然 TLS 会加密数据和有效负载,但有一些值是明文发送的:客户端建议的密码套件集、客户端的日期/时间(的前 4 个字节client_random)、支持的压缩方法列表客户端,以及客户端支持的 TLS 扩展列表,当然还有每个列表中值的顺序。这里是否有足够的变化来推断用户正在使用哪个浏览器并区分大多数主要浏览器?是否足以区分浏览器版本?

我正在考虑类似于 p0f 的东西(它执行被动操作系统指纹识别),但在这里我们正在查看 HTTPS 连接的未加密部分(而不是 TCP 标头),这里的目标是推断使用的浏览器/HTTPS 客户端由客户端主机(而不是推断客户端使用的操作系统)。

3个回答

Lee Brotherston 在 2015 年的 DerbyCon 上发表了关于通过 TLS 指纹识别进行隐形攻击和更智能防御的演讲 -幻灯片-视频

他还发布了与演讲相关的代码——https: //github.com/LeeBrotherston/tls-fingerprinting/tree/master/fingerprintls

以下摘自他的网站——http://blog.squarelemon.com/tls-fingerprinting/

传输层安全性 (TLS) 以加密形式为从合法金融交易到私人对话和恶意软件回拨的各种网络连接提供安全性。窃听者无法分析此加密流量可以保护其用户,无论他们是合法的还是恶意的。那些使用 TLS 的人假设虽然窃听者可以很容易地观察到他们的会话、其源和目标 IP 地址的存在,但内容本身是安全且不可读的,而无需访问连接的一端或两端的加密密钥材料。从表面上看,这是正确的,除非有任何配置缺陷或可利用的漏洞。然而,使用 TLS 指纹识别,很容易快速被动地确定正在使用哪个客户端,然后从攻击者和防御者的角度应用此信息。

[...]

指纹TLS

FingerprintTLS 旨在快速识别已知 TLS 连接并识别未知 TLS 连接。通过实时网络嗅探或读取 PCAP 文件获取输入。已识别连接的输出(当前)采用人类可读的形式,而未知指纹的输出采用用于指纹定义的 JSON 格式。

生成的指纹可以通过 Fingerprintout 导出为 C 结构并编译回 FingerprintTLS 以便在将来的实例中进行检测。

Lee 在 SecTor CA 的一次演讲中演示了通过 TLS 签名对客户端进行指纹识别是多么容易 - http://www.slideshare.net/LeeBrotherston/tls-fingerprinting-sectorca-edition - 请务必查看幻灯片 66 和 69-70。

fingerprintls -i en0 -s

他还在这里展示了如何导入新的签名——https: //gist.github.com/LeeBrotherston/1a0ae1aedd968af1fce3

另一个演示展示了如何利用来自其他工具和框架(例如 Wireshark、tcpdump 和/或 libpcap)的伯克利包过滤器 (BPF) -- https://gist.github.com/LeeBrotherston/92cc2637f33468485b8f

最后,Lee 分析了 Android 设备上 Pokemon Go 视频游戏中的一个示例 pcap—— https://gist.github.com/LeeBrotherston/5cca4b372277d7c6a049b26f87544351

当然,此处其他一些答案所描述的旧方法可能仍然相关,但我建议您查看上面的工作。有关 SSLLabs 所做工作的更多信息,请查看——https: //github.com/ssllabs/sslhaf——这是一个用于被动 SSL 客户端指纹识别的 Apache 模块

是的,您可以对 SSL 流量进行一些指纹识别。尽管您可能会发现很难对客户端进行指纹识别,因为它们中的大多数将使用诸如 openssl 之类的常见库之一。因此,您可能能够识别这些库的不同版本,而不是 curl、firefox 和 wget。

是的。可以通过这种方式对客户端进行指纹识别。甚至有一些现有的工具可以实现这一点。

但是,它似乎不是很准确。它可能能够识别主要的浏览器类型(例如,Firefox、Chrome、Safari),但不太可能准确识别版本号,并且以这种方式获得的任何指纹都有很大的不确定性。似乎通常会有多个客户端可以与观察到的 SSL 跟踪一致,并且您通常只能通过这种方式获得少量熵。

p0f 工具支持使用指纹数据库根据跟踪推断 TLS 客户端。您可以在 SSL Labs 的 github 页面上找到有关其工作原理的描述。

以下论文还讨论了以这种方式对 TLS 客户端进行指纹识别的实验:

Martin Husák, Milan Čermák, Tomáš Jirsı́k, Pavel Čeleda。 使用被动 SSL/TLS 指纹识别的 HTTPS 流量分析和客户端识别URASIP 信息安全杂志,2016 年