每隔一段时间,就会出现一种优秀的蓝队工具,为追踪攻击者带来便利。这项艰巨的任务通常包括主动寻找和检测恶意服务器或快速响应目标网络威胁的能力。随着恶意攻击和数据窃密事件的急剧增加,发现恶意软件与 C&C 服务器的需求也在快速增长。
近日,Salesforce Engineering 的安全研究人员发布了一个名为 JARM 的开源工具,该工具依靠 TLS 协议的相关机制来实现跟踪检测恶意服务器这一目标。本文会简要介绍 JARM 以及为什么 JARM 会带来如此大的帮助。
TLS 与 JARM
响应中确认一组可用的算法后,服务器将发送自己的 ServerHello 消息。随后,服务器和客户端继续通过数字证书验证彼此的真实性,然后双方计算出用于会话的密钥。
ClientHello 消息中提供的 TLS 参数包含几个与客户端应用程序直接相关的标识。这些包括操作系统内部版本、程序包、库,甚至进程归属。这种细粒度信息对于构建具有高准确性的指纹特别有用,可以利用它来识别同一应用程序。同样的,TLS 服务器根据 ClientHello 消息以及它自己的标识子集来构造 ServerHello 数据包,例如:
操作系统名称和版本 服务器端库 其他自定义配置
客户端和服务器的 Hello 数据包的伴生关系决定了服务器对应响应特定应用程序的方式,这为指纹识别提供了绝佳的机会。
什么是 JARM?
如前所述,JARM 是 TLS 服务器指纹识别工具,最近由 Salesforce 公开发布。该工具与他们此前发布的 JA3 指纹对 TLS 客户端进行分析的方法具有一些相似之处。区别在于,JA3 指纹是基于流量的被动指纹方式,收集来自客户端和服务器的指纹。
JARM 会将 10 个自己构造的 TLS ClientHello 数据包发送到目标 TLS 服务器,来发现唯一响应,以此创建 JARM 指纹。这些构造的 ClientHello 数据包不一定遵循任何协议标准或约定,并且可能看起来很奇怪,例如重新排列支持的加密方式列表以欺骗服务器选择较弱的加密方式,或者使用不同的 TLS 版本请求同一服务器测试。
收集到信息后,JARM 指纹会使用模糊哈希,利用连续的 30 个字符和 32 个字符的长字符串,最终拼接生成 62 个字符的哈希指纹。第一个字符串包含诸如 TLS 版本和每个 ClientHello 数据包所选择的加密套件等。第二个字符串是服务器端 TLS 扩展信息截断 SHA256 哈希值。因此,利用预编译的 JARM 指纹列表可以快速识别服务器,其中包括:
服务器是否共享相同的 TLS 配置 单个服务器是否与特定组织有关(如 Google) 识别默认应用程序或基础架构
通过 JARM 指纹,我们找到了一个检测威胁基础架构的有力工具。流行的攻击框架(Cobalt Strike)和类似的 C&C 基础架构实际上难以防御,而 JARM 可以帮助验证服务器上部署的底层 Java 版本是与特定 C&C 应用程序有关还是与更普遍的通用技术相关。
如何使用 JARM?
JARM 能够对服务器部署的软件堆栈进行指纹识别,而且对所有启用 TLS 服务的主机都是可用的。
从 443 端口的角度来看,可以发现该指纹存在很多误报。但其中仍然存在很多极有价值的数据,比如主机名为 redteam.server 或者 cobaltstrike,这都是十分可疑的对象。此外,也有一些网站如 o365outlook.com 和 adobefax.ml 也十分可疑。
安装 JARM
Salesforce 在 GitHub 的开源仓库提供了 jarm.py 和 jarm.sh 两种方式利用 JARM。
git clone https://github.com/salesforce/jarm.git
得到相关代码后,使用 Python 版本的 JARM 必须要提供想要计算 JARM 指纹的目标 TLS 服务器的 IP 地址或域名。与此同时,提供了一些可选参数:
[-h] :: shows the help menu [-i INPUT] :: accepts a list of IP addresses or domains to scan, or specific ports with comma separation (e.g., 8.8.4.4,853) [-o] :: outputs or appends results to a CSV file [-p PORT] :: accepts a custom port to scan (defaults to 443) [-v] :: displays the JARM results before being hashed (verbose mode) [-V] :: prints out the tool's version number
测试与结果
使用 Python 版本的 JARM 扫描 Google.com 进行测试,结果如下:
程序打印出了 JARM 指纹和十次扫描的信息。接着使用 -p 指定端口进行扫描:
bash jarm.sh alexa500.txt results.csv
生成的文件如下所示,为了展示省略了单独的握手内容,只有域名、对应解析的 IP 地址和 JARM 指纹。
总结
JARM 提供了对恶意服务器甚至是受欢迎的攻击框架的检测能力,为 TLS 的关联提供了独特的视角。但是,不要将 JARM 作为恶意性证据,需要使用适当的元数据和其他证据来补充分析。
原文相关链接地址
SecurityTrails https://securitytrails.com/blog/jarm-fingerprinting-tool
GitHub https://github.com/salesforce/jarm
还没有评论,来说两句吧...