请阅读最初的 JARM 博客文章 了解更多信息。
JARM 是一个主动的传输层安全(TLS)服务器指纹识别工具。
JARM 指纹可用于:
JARM 支持已被或正在被添加到:
SecurityTrails
Shodan
BinaryEdge
RiskIQ
Palo Alto Networks
Censys
360
python3 jarm.py [-h] [-i INPUT] [-p PORT] [-v] [-V] [-o OUTPUT] [-j] [-P PROXY] [domain/IP]
示例:
% python3 jarm.py www.salesforce.com
Domain: www.salesforce.com
Resolved IP: 23.50.225.123
JARM: 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5
若使用 Python 2,你需要安装 ipaddress 模块:
pip install -r requirements.txt
./jarm.sh <list> <output_file>
示例:
% ./jarm.sh alexa500.txt jarm_alexa_500.csv
在学习 JARM 的工作原理之前,理解 TLS 的工作原理很重要。TLS 及其前身 SSL 用于对常见应用程序(如互联网浏览器)的通信进行加密,以保护数据安全,同时也被恶意软件用来隐藏于噪声之中。要发起 TLS 会话,客户端在 TCP 三次握手后会发送一个 TLS Client Hello 消息。该数据包及其生成方式取决于构建客户端应用程序时使用的包和方法。服务器如果接受 TLS 连接,则会响应一个 TLS Server Hello 数据包。
TLS 服务器根据收到的 TLS Client Hello 数据包中的细节来构建其 Server Hello 数据包。对于给定的 Client Hello,Server Hello 的构建方式可能因应用程序或服务器的构建方式而异,包括:
所有这些因素都会导致每个 TLS 服务器以独特的方式响应。这些因素的组合使得不同组织部署的服务器不太可能具有相同的响应。
JARM 通过主动向目标 TLS 服务器发送 10 个 TLS Client Hello 数据包,并捕获 TLS Server Hello 响应中的特定属性来工作。然后将聚合的 TLS 服务器响应以特定方式哈希处理,生成 JARM 指纹。
这不是我们第一次处理 TLS 指纹识别。2017 年,我们开发了 JA3/S,一种被动 TLS 客户端/服务器指纹识别方法,现在大多数网络安全工具中都能找到。但 JA3/S 是被动的,通过监听网络流量来识别客户端和服务器;而 JARM 是一种主动的服务器指纹识别扫描器。你可以在这里了解 TLS 协商和 JA3/S 被动指纹识别的更多信息: here。
JARM 中的 10 个 TLS Client Hello 数据包经过特殊设计,以提取 TLS 服务器的独特响应。JARM 发送不同的 TLS 版本、密码套件和扩展,并以不同顺序排列,以收集独特响应。服务器是否支持 TLS 1.3?它会使用 1.2 密码套件协商 TLS 1.3 吗?如果我们按从弱到强的顺序排列密码套件,它会选择哪一个?这些就是 JARM 向服务器提出的异常问题类型,以引出最独特的响应。然后将这 10 个响应哈希处理,生成 JARM 指纹。
JARM 指纹哈希是一种混合模糊哈希,它结合了可逆和不可逆哈希算法,生成一个 62 字符的指纹。前 30 个字符由服务器为每个发送的 Client Hello 选择的密码套件和 TLS 版本组成。"000" 表示服务器拒绝与该 Client Hello 协商。其余 32 个字符是服务器发送的累积扩展的截断 SHA256 哈希,忽略 x509 证书数据。比较 JARM 指纹时,如果前 30 个字符相同但后 32 个不同,这意味着服务器具有非常相似的配置,接受相同的版本和密码套件,但扩展不同,因此并非完全相同。
收到每个 TLS Server Hello 消息后,JARM 通过 FIN 优雅地关闭连接,以免保持套接字打开。
需要注意的是,JARM 是一个高性能的指纹函数,不应被视为或混淆为安全的加密函数。我们将 JARM 指纹设计为既适合机器处理也适合人工阅读。这意味着它足够小,可以肉眼查看、分享和发布推文,同时留有足够的空间用于上下文细节。
恶意软件命令与控制(C2)和恶意服务器由其创建者像其他服务器一样配置,然后部署到整个服务器群中。因此,它们往往会产生独特的 JARM 指纹。以下是常见恶意软件和攻击工具的示例,以及它们与 Alexa 前 100 万网站的 JARM 重叠情况(截至 2020 年 10 月):
由于与 Alexa 前 100 万网站的几乎无重叠,组织内的主机访问具有这些 JARM 指纹的服务器应该是小概率事件。
John Althouse - 原始想法、概念和项目负责人
Andrew Smart - 概念和测试
RJ Nunnally - 编程和测试
Mike Brady - 编程和测试
由 Caleb Yu 为实际使用重写为 Python 版本。
| 域名 | JARM |
|---|
| salesforce.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| force.com | 2ad2ad0002ad2ad00042d42d00000069d641f34fe76acdc05c40262f8815e5 |
| google.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| youtube.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| gmail.com | 27d40d40d29d40d1dc42d43d00041d4689ee210389f4f6b4b5b1b93f92252d |
| facebook.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| instagram.com | 27d27d27d29d27d1dc41d43d00041d741011a7be03d7498e0df05581db08a9 |
| oculus.com | 29d29d20d29d29d21c41d43d00041d741011a7be03d7498e0df05581db08a9 |
| 恶意服务器 C2 | JARM 指纹 | 与 Alexa 前 100 万重叠数 |
|---|
| Trickbot | 22b22b09b22b22b22b22b22b22b22b352842cd5d6b0278445702035e06875c | 0 |
| AsyncRAT | 1dd40d40d00040d1dc1dd40d1dd40d3df2d6a0c2caaa0dc59908f0d3602943 | 0 |
| Metasploit | 07d14d16d21d21d00042d43d000000aa99ce74e2c6d013c745aa52b5cc042d | 0 |
| Cobalt Strike | 07d14d16d21d21d07c42d41d00041d24a458a375eef0c576d23a7bab9a9fb1 | 0 |
| Merlin C2 | 29d21b20d29d29d21c41d21b21b41d494e0df9532e75299f15ba73156cee38 | 303 |