JA3 TLS 指纹识别技术详解

JA3 TLS 指纹识别技术详解

📚 前置知识

本配方涉及以下核心技术,建议先阅读相关章节:

  • 网络抓包技术 - 使用 Wireshark 捕获 TLS 握手
  • TLS/SSL 协议基础 - 理解 Client Hello 消息结构

JA3 是一种创建 SSL/TLS 客户端指纹的方法,旨在轻松识别网络上的客户端应用程序。当客户端与服务器建立加密连接时,它首先会发送一个 Client Hello 包。这个包的格式和内容在很大程度上取决于用于创建连接的客户端应用程序(例如浏览器、恶意软件、移动 App)中的库和方法。JA3 通过收集 Client Hello 包中特定字段的值,并将它们组合成一个易于共享和比较的 MD5 哈希值,从而为客户端生成一个独特的"指纹"。


工作原理

JA3 指纹的核心思想是:客户端的 Client Hello 包暴露了其身份

一个 Client Hello 包包含了客户端希望如何与服务器进行通信的各种细节。JA3 方法精确地选择了以下 5 个字段,并按照特定顺序将它们串联起来:

  1. SSL/TLS Version (版本号): 客户端支持的最高 TLS 版本。
  2. Accepted Ciphers (加密套件): 客户端愿意接受的加密套件列表,按其偏好顺序排列。
  3. List of Extensions (扩展列表): Client Hello 中包含的所有扩展,按其出现顺序排列。
  4. Elliptic Curves (椭圆曲线): 客户端支持的椭圆曲线列表。
  5. Elliptic Curve Point Formats (椭圆曲线点格式): 支持的点格式列表。

这些字段的组合对于特定的客户端应用程序(及其版本)来说通常是独一无二的。例如,Chrome 浏览器、Firefox 浏览器、Tor 浏览器和一个 Golang 编写的僵尸网络程序,它们生成的 Client Hello 在这些字段上会有明显的差异。


指纹生成过程

生成 JA3 指纹的步骤如下:

  1. 收集字段值: 从一个 TCP 会话的 Client Hello 包中,提取上述 5 个字段的十进制值。
  2. 格式化和拼接:
    • 每个字段内的值用 - 分隔。
    • 5 个主要字段之间用 , 分隔。
    • 例如,一个 JA3 字符串看起来像这样:771,4865-4866-4867-49195-49199-...,23-65281-10-11-35-16-0-13-18,29-23-24,0
  3. 计算 MD5 哈希: 对上述拼接好的字符串计算 MD5 哈希值。
  4. 最终指纹: 得到的 32 位十六进制字符串就是该客户端的 JA3 指纹。
    • 例如,上述字符串的 MD5 哈希可能是:e7d705a3286e19ea42f587b344ee6865

这个最终的 MD5 哈希就是可用于识别、共享和查询的 JA3 指纹。


JA3S - 服务器端指纹

与 JA3 对应,JA3S 是对服务器响应的指纹。它基于服务器在 Server Hello 包中选择的参数。JA3S 收集以下字段:

  1. SSL/TLS Version
  2. Selected Cipher
  3. List of Extensions

将这些值拼接并进行 MD5 哈希,就得到了 JA3S 指纹。

为什么 JA3S 很重要?

将 JA3 和 JA3S 结合起来,可以提供对加密连接的更强洞察力。例如,一个恶意软件 (JA3) 可能会尝试连接多个不同的 C2 服务器 (不同的 JA3S)。反之,一个 C2 服务器 (JA3S) 可能会接受来自不同类型恶意软件 (不同的 JA3) 的连接。这种组合分析可以更精确地描绘出威胁活动的全貌。


应用场景

  • 恶意软件家族识别: 许多恶意软件家族(如 Trickbot, Emotet)使用特定的 SSL/TLS 库,导致它们具有独特且一致的 JA3 指纹。安全分析师可以创建规则来检测或阻止已知的恶意 JA3 哈希。
  • 僵尸网络检测: 僵尸网络中的客户端通常是相同的程序,因此它们的 JA3 指纹也是相同的。这使得大规模识别受感染主机成为可能。
  • 威胁情报共享: JA3 指纹是一个优秀的技术性"失陷指标"(IOC)。安全社区可以共享已知的恶意 JA3 列表,就像共享恶意 IP 地址或域名一样。
  • 识别非标准应用: 可以用于识别组织内部网络中不合规或非标准的应用程序。

局限性

尽管 JA3 非常有用,但它也有一些明显的缺点:

  • 指纹冲突: 不同的应用程序可能偶然会使用相同的加密库和配置,从而产生相同的 JA3 指纹。
  • 容易被规避 (Spoofing): 只要攻击者有能力修改其客户端的 SSL/TLS 库,他们就可以刻意模仿一个常见、合法的应用程序(如 Chrome 浏览器)的 Client Hello 包,从而生成一个"合法"的 JA3 指纹来逃避检测。这种技术被称为"JA3 欺骗"。
  • 指纹随版本变化: 当一个合法应用(如 Chrome)更新时,它的 TLS 实现可能会改变,导致其 JA3 指纹也发生变化。这意味着维护一个准确的指纹数据库需要持续的努力。
  • 信息有限: 一个 MD5 哈希本身不包含任何信息。你无法从两个不同的哈希值看出它们对应的客户端有多相似。例如,Chrome 90 和 Chrome 91 的 JA3 哈希可能完全不同,即使它们的 Client Hello 包只有微小的差异。

如何检测 JA3

要实现 JA3 检测,你需要能够监控网络流量并解析 TLS 握手的工具。常见的实现方式包括:

  • 网络安全监控 (NSM) 工具: Zeek (原名 Bro) 是原生支持 JA3 和 JA3S 指纹生成的黄金标准。
  • Suricata: 从 4.1 版本开始,Suricata 也内置了 JA3 指纹功能。
  • Wireshark: 可以通过特定的插件或手动的 tshark 脚本来提取和计算 JA3。

相关内容

如果这篇文章对你有帮助,请我喝杯咖啡吧~
+5 支付宝支付宝
+5 微信微信