JA 指纹识全系讲解(上)
字数 1553 2025-08-06 08:35:32

JA 指纹识别全系详解

前言

JA 指纹是一种对传输层(SSL/TLS)进行指纹识别的方法,由John Althouse、Jeff Atkinson 和Josh Atkins 三位安全研究员在2017年6月首次发布。JA系列指纹可以被看作是一种IOC(入侵指标),广泛应用于安全检测领域。

JA 指纹概述

基本概念

JA 指纹系列包括四个主要分支:

  • JA3:对TLS客户端进行被动识别
  • JA3s:对TLS服务端进行被动识别(JA3的服务端版)
  • JAM:对TLS服务端进行主动识别(JA3和JA3s的融合)
  • JA4+:一个指纹合集,包括JA4、JA4S、JA4H、JA4L、JA4X、JA4SSH

应用场景

  1. 识别特殊流量(C2、V2ray等)
  2. 安全产品检测(WAF、威胁情报平台等)
  3. 资产拓线和威胁狩猎
  4. Burp Suite等工具的反制检测

JA3 详解

计算原理

JA3指纹基于SSL/TLS握手过程中的Client Hello报文计算,使用以下五项参数:

  1. TLS Version
  2. Cipher Suite
  3. Extension
  4. EllipticCurves(Supported_Groups)
  5. Elliptic Curve Point Formats(ec_point_formats)

计算方法

  1. 将各项参数的数值转为十进制
  2. 相同项的参数使用"-"串联
  3. 不同项使用","分隔
  4. 对拼接后的字符串计算MD5哈希

示例:

771,4866-4865-4867-49196-49195-52393-49200-52392-49199-159-52394-163-158-162-49188-49192-49187-49191-107-106-103-64-49198-49202-49197-49201-49190-49194-49189-49193-49162-49172-49161-49171-57-56-51-50-49157-49167-49156-49166-157-156-61-60-53-47-49160-49170-22-19-49155-49165-10-255,0-5-10-11-17-23-13-43-45-50-51,29-23-24-25-30-256-257-258-259-260,0

MD5: dc86f13deee08e265833d3d9c6ae5694

GREASE机制的影响与优化

Google在Chrome中引入了GREASE(Generate Random Extensions And Sustain Extensibility)机制,导致JA3指纹随机变化。解决方案是去掉Extension项的检测(留空),仅使用剩余四项作为算子。

JA3s 详解

计算原理

JA3s基于Server Hello报文计算,使用以下三项参数:

  1. TLS Version
  2. Cipher Suite
  3. Extension

计算方法与JA3相同。

示例:

771,49199,0-11-65281-35-23

MD5: 2ab44dd8c27bdce434a961463587356a

JARM 详解

特点

  1. 主动探测:主动向服务端发送Client Hello报文
  2. 双向计算:同时结合Client Hello和Server Hello报文

获取方法

使用官方提供的Python脚本:

python jarm.py -i targets.txt -v

计算原理

JARM指纹是62位的模糊哈希:

  • 前30位:基于Server Hello选择的Cipher Suites和TLS Version
  • 后32位:基于Extensions的SHA256哈希

计算过程

  1. 定义10种不同的TLS握手配置(数组)
  2. 构建并发送特征不同的数据包
  3. 接收并处理Server Hello响应
  4. 计算模糊哈希:
    • cipher_bytes函数处理Cipher Suites
    • version_byte函数处理TLS Version
    • SHA256处理Extensions

应用与局限

应用场景

  • C2服务器的主动探测和识别
  • 资产拓线和威胁狩猎

局限性

  • 不与特定C2唯一对应
  • 会随版本或基础库变化而变化
  • 需结合其他指标进行研判

实践建议

  1. 指纹收集:使用Wireshark抓包分析JA3/JA3s
  2. 主动探测:使用JARM脚本扫描目标
  3. 威胁狩猎:结合FOFA等平台进行资产拓线
  4. 检测优化:针对GREASE机制调整检测策略

总结

JA指纹系列提供了从不同维度识别TLS流量的方法,丰富了安全检测的IOC指标。虽然每种方法都有其局限性,但合理组合使用可以显著提升对恶意流量的检测能力,特别是在传统IP/域名检测失效的场景下。

JA 指纹识别全系详解 前言 JA 指纹是一种对传输层(SSL/TLS)进行指纹识别的方法,由John Althouse、Jeff Atkinson 和Josh Atkins 三位安全研究员在2017年6月首次发布。JA系列指纹可以被看作是一种IOC(入侵指标),广泛应用于安全检测领域。 JA 指纹概述 基本概念 JA 指纹系列包括四个主要分支: JA3:对TLS客户端进行被动识别 JA3s:对TLS服务端进行被动识别(JA3的服务端版) JAM:对TLS服务端进行主动识别(JA3和JA3s的融合) JA4+:一个指纹合集,包括JA4、JA4S、JA4H、JA4L、JA4X、JA4SSH 应用场景 识别特殊流量(C2、V2ray等) 安全产品检测(WAF、威胁情报平台等) 资产拓线和威胁狩猎 Burp Suite等工具的反制检测 JA3 详解 计算原理 JA3指纹基于SSL/TLS握手过程中的Client Hello报文计算,使用以下五项参数: TLS Version Cipher Suite Extension EllipticCurves(Supported_ Groups) Elliptic Curve Point Formats(ec_ point_ formats) 计算方法 将各项参数的数值转为十进制 相同项的参数使用"-"串联 不同项使用","分隔 对拼接后的字符串计算MD5哈希 示例: MD5: dc86f13deee08e265833d3d9c6ae5694 GREASE机制的影响与优化 Google在Chrome中引入了GREASE(Generate Random Extensions And Sustain Extensibility)机制,导致JA3指纹随机变化。解决方案是去掉Extension项的检测(留空),仅使用剩余四项作为算子。 JA3s 详解 计算原理 JA3s基于Server Hello报文计算,使用以下三项参数: TLS Version Cipher Suite Extension 计算方法与JA3相同。 示例: MD5: 2ab44dd8c27bdce434a961463587356a JARM 详解 特点 主动探测 :主动向服务端发送Client Hello报文 双向计算 :同时结合Client Hello和Server Hello报文 获取方法 使用官方提供的Python脚本: 计算原理 JARM指纹是62位的模糊哈希: 前30位:基于Server Hello选择的Cipher Suites和TLS Version 后32位:基于Extensions的SHA256哈希 计算过程 定义10种不同的TLS握手配置(数组) 构建并发送特征不同的数据包 接收并处理Server Hello响应 计算模糊哈希: cipher_ bytes函数处理Cipher Suites version_ byte函数处理TLS Version SHA256处理Extensions 应用与局限 应用场景 : C2服务器的主动探测和识别 资产拓线和威胁狩猎 局限性 : 不与特定C2唯一对应 会随版本或基础库变化而变化 需结合其他指标进行研判 实践建议 指纹收集 :使用Wireshark抓包分析JA3/JA3s 主动探测 :使用JARM脚本扫描目标 威胁狩猎 :结合FOFA等平台进行资产拓线 检测优化 :针对GREASE机制调整检测策略 总结 JA指纹系列提供了从不同维度识别TLS流量的方法,丰富了安全检测的IOC指标。虽然每种方法都有其局限性,但合理组合使用可以显著提升对恶意流量的检测能力,特别是在传统IP/域名检测失效的场景下。