在如今的网络安全环境中,随着加密通信的普及,如何有效识别和区分合法流量与恶意流量成为了重要课题。TLS(传输层安全协议)是保证互联网通信安全的重要技术,而 JA3 则是一种通过分析 TLS 握手参数生成独特指纹的技术,广泛应用于网络安全领域,帮助检测恶意客户端。

JA3是什么?

JA3 是一种用于识别 TLS 客户端的指纹识别方法。通过分析客户端在 TLS 握手过程中发送的多个参数,生成唯一的 JA3 哈希值。这一指纹不仅可以区分不同类型的客户端,还能在客户端 IP 地址或用户代理(User-Agent)变化时保持稳定,因此它在恶意流量检测和防御中非常有用。
JA3 指纹的生成基于以下 TLS 握手信息:
  1. SSL/TLS 版本(如 TLS 1.2 或 1.3)
  1. 客户端支持的加密套件(Cipher Suites)
  1. 客户端支持的扩展(Extensions)
  1. 支持的椭圆曲线(Elliptic Curves)
  1. 支持的椭圆曲线格式(Elliptic Curve Formats)
这些信息通过特定的格式组合成字符串,再进行 MD5 哈希计算,从而生成唯一的 JA3 指纹。

生成 JA3 指纹的步骤

  • 收集 TLS 握手信息:提取客户端在握手时发送的 TLS 版本、加密套件、扩展、椭圆曲线及其格式。
  • 格式化信息:将每个字段的数值转化为十进制格式,用逗号分隔字段,用短横线连接字段内的值。如果没有某个字段,则这些字段的值为空,连接用的逗号也需要有。
  • 组合成字符串:将信息组合成类似于以下格式的字符串:
    • 生成哈希值:将组合的字符串进行 MD5 哈希运算,生成最终的 JA3 指纹。
     

    如何手动计算 JA3 指纹

    在掌握了 JA3 指纹的生成原理后,可以通过手动抓包分析生成 JA3 指纹。
    这里使用 wireshark 抓包后,在命令行控制台执行了 curl https://baidu.com ,使用 Client Hello 包来计算 JA3 指纹。
    notion image
    收集 TLS 握手信息
    notion image
    1、TLS 版本771
    notion image
    2、加密套件4867-4866-4865-52393-52392-52394-49200-49196-49192-49188-49172-49162-159-107-57-65413-196-136-129-157-61-53-192-132-49199-49195-49191-49187-49171-49161-158-103-51-190-69-156-60-47-186-65-49169-49159-5-4-49170-49160-22-10-255
    notion image
    3、扩展43-51-0-11-10-13-16
    notion image
    4、椭圆曲线29-23-24-25
    notion image
    5、椭圆曲线格式0
     
    组合成一个字符串,如下
    网上找个在线MD5网站,获取下MD5值, 375c6162a492dfbf2795909110ce8424 就是我在命令行使用 curl 的JA3指纹了。
    notion image

    网络安全工具支持 JA3 指纹

    除了手动计算,许多网络安全工具也支持自动生成和分析 JA3 指纹。以下是几个常见的工具:
    1. Zeek(以前称为 Bro):一个强大的网络监控工具,能够捕获 TLS 流量并生成 JA3 指纹。
    1. Suricata:一款入侵检测系统(IDS),通过扩展支持 JA3 指纹匹配。
    此外,在 Wireshark 中抓取 TLS 握手包后,也可以直接查看其中的 JA3 指纹。与手动计算类似,工具会自动提取握手中的相关信息并生成指纹。
    比如上诉手动计算 JA3 指纹中,可以直接在 Client Hello 包的详情下看到对应的 JA3 指纹。
    notion image
     

    使用 ja3.py 脚本生成 JA3 指纹

    ja3.py 是一个 Python 工具,可以直接解析 PCAP 文件中的 TLS 流量并生成 JA3 指纹。
    1. 安装依赖工具: 首先确保安装了 Python 3 和 pip,然后安装必要的依赖项:
      1. 获取 ja3.py 脚本: 从 GitHub 上找到 JA3 的官方实现,并下载 ja3.py 脚本:
        1. 运行脚本: 使用该脚本对流量文件(如 pcap)进行分析并生成 JA3 指纹:
          1. 脚本会自动提取并输出 PCAP 文件中所有 TLS 握手的 JA3 指纹。
         

        为什么JA3指纹可以识别不同的客户端类型?

        TLS 握手中的参数是由客户端实现的 TLS 协议栈决定的,而不同的客户端、操作系统或应用程序使用的加密套件、TLS 扩展、优先的椭圆曲线等参数往往有所不同。这些参数在大多数情况下是不可轻易修改的或不常被篡改的。这些差异为 JA3 指纹提供了可靠的依据,来识别不同的客户端类型。
        一些影响 JA3 指纹差异的主要因素包括:
        • 操作系统:不同操作系统使用的 TLS 库不同,如 Windows 的 Schannel,Linux 的 OpenSSL,macOS 的 Secure Transport 等。
        • 浏览器:不同的浏览器(如 Chrome、Firefox、Safari)在实现 TLS 协议时支持的加密套件和扩展也有所不同。
        • 应用程序:如 curl、Python 的 requests 库等工具也有自己的 TLS 握手模式。
        因此,通过收集握手中的这些关键信息,JA3 可以有效区分不同的客户端。
         

        JA3 指纹在实际中的使用

        在实际应用中,JA3 指纹经常出现在网络安全应用中,它能够帮助安全团队识别恶意流量或未授权客户端。以下是一些常见的使用场景:
        1. 威胁情报数据库查询:生成的 JA3 指纹可以与公开的威胁情报库(如 VirusTotal、GreyNoise 等)对比,检测是否有已知恶意软件或攻击使用相同的指纹。
        1. 白名单与黑名单:通过维护 JA3 指纹的白名单和黑名单,可以快速识别合法的浏览器或拦截恶意客户端。
        1. 恶意流量检测:分析不常见的 JA3 指纹,可以帮助识别一些定制化的恶意软件流量。
        例如,各大云服务提供商可以在其 WAF 服务中利用 JA3 指纹过滤恶意流量。AWS WAF 已经支持 JA3 指纹匹配,帮助用户加强流量分析和过滤能力:https://aws.amazon.com/cn/about-aws/whats-new/2023/09/aws-waf-ja3-fingerprint-match/

        JA3S(服务端指纹)

        JA3S 是 JA3 的扩展,用于生成 服务器端 TLS 指纹。JA3 专注于识别客户端在 TLS 握手中使用的参数,而 JA3S 则记录服务器在握手中返回的信息,帮助识别和区分不同的服务器。
        JA3S 指纹的计算与 JA3 类似,只是对应数据是从 Server Hello 包中提取。
        notion image
        虽然 JA3 可以帮助识别客户端的类型(例如浏览器、脚本、自动化工具等),但 JA3S 提供了对服务器端的指纹识别,补充了 JA3 的能力。

        📎 参考资料

        ja3及其他项目:
        如何用 EasyExcel 导出含动态表头的 JSON 数据?敏感信息如何掩码?实用工具与代码示例分享
        Loading...