JA4+ 指纹识别全系详解
一、JA4+ 概述
JA4+ 是 JA3/JA3s 的升级替代方案,由 Salesforce 团队于 2023 年 9 月首次发布。与早期仅针对 TLS 流量的指纹识别不同,JA4+ 已发展为支持多种协议的指纹识别方法集合,这也是其名称中带有"+"的原因。
1.1 JA4+ 分支及支持协议
| 分支名称 | 支持协议 | 描述 |
|---|---|---|
| JA4 | TLS Client | 客户端 TLS 指纹 |
| JA4S | TLS Server Response | 服务端 TLS 响应指纹 |
| JA4H | HTTP Client | HTTP 客户端指纹 |
| JA4L | Light Distance/Location | 距离/位置测量 |
| JA4X | X509 TLS Certificate | TLS 证书指纹 |
| JA4SSH | SSH Traffic | SSH 流量指纹 |
| JA4T | TCP Client/Server | TCP 客户端/服务端指纹 |
| JA4TS | TCP Server Response | TCP 服务端响应指纹 |
| JA4TScan | Active TCP Server | 主动 TCP 服务端指纹扫描 |
二、Wireshark 配置 JA4+
- 版本要求:Wireshark 4.2.0 或更高版本
- 安装步骤:
- 从 GitHub 下载 ja4.dll
- 将文件放入
\Wireshark\plugins\版本\epan目录
- 配置方法:
- 打开 Wireshark
- 进入【编辑】→【首选项】→【外观】→【列】
- 点击"+"添加新列,类型选择"Custom"
- 参考官方配置表设置具体参数
注意:最新版 Wireshark 已原生支持 JA4 指纹,若只需基本功能可不安装插件。插件版本可能存在无法正确获取版本号的问题,导致 JA4_a 计算结果不同。
三、JA4+ 与 JA3/JA3s 的主要区别
3.1 拓展化
从单一的 TLS 层流量分析扩展到:
- TCP
- HTTP
- SSH
- TLS 证书
- 物理位置分析
3.2 模块化
采用 a_b_c 结构:
- 各部分代表指纹的不同组成部分
- 可单独使用某部分进行搜索(如 JA4_a 或 JA4_ab)
- 增强对抗 GREASE 等随机化机制的能力
3.3 可读化
指纹中包含人类可读信息,便于快速判断基础特征。
四、JA4 详解(TLS 客户端指纹)
4.1 结构说明
示例指纹:t13d1516h2_8daaf6152771_02713d6af862
分为三部分:
- JA4_a:
t13d1516h2 - JA4_b:
8daaf6152771 - JA4_c:
02713d6af862
4.2 JA4_a 计算
格式:[协议][TLS版本][SNI类型][密码套件数量][ALPN值]
-
协议:
t:TCPq:QUIC
-
TLS版本:
十六进制 版本 编码 0x0304 TLS 1.3 "13" 0x0303 TLS 1.2 "12" 0x0302 TLS 1.1 "11" 0x0301 TLS 1.0 "10" 0x0300 SSL 3.0 "s3" 0x0200 SSL 2.0 "s2" 0x0100 SSL 1.0 "s1" Unknown 未知 "00" 注意:实际读取的是数据包中的最高版本(supported_version 扩展)
-
SNI类型:
d:域名(存在 SNI 扩展)i:IP(无 SNI 扩展)
-
密码套件数量:
- 两位数字表示(如 6→06)
- 最大值显示为 99
- 忽略 GREASE 值
-
ALPN值:
- 取第一个值(如 h2)
- 无此项则用"00"
- 常见值:
- h2:HTTP/2
- h1:HTTP/1.1
4.3 JA4_b 计算
基于密码套件值:
- 忽略 GREASE 值
- 按从小到大排序
- 用","连接
- SHA256 哈希后取前12位
示例:
原始:1301,1302,1303,c02b,c02f,c02c,c030,cca9,cca8,c013,c014,009c,009d,002f,0035
排序后:002f,0035,009c,009d,1301,1302,1303,c013,c014,c02b,c02c,c02f,c030,cca8,cca9
SHA256:8daaf6152771e33e12d734f9bc6478ed341f16cde27aee3aa36f2402f2c53b44
结果:8daaf6152771
4.4 JA4_c 计算
基于扩展类型:
- 忽略 GREASE、SNI(0000)、ALPN(0010)
- 按十六进制值排序
- 添加签名算法(保持原始顺序)
- 用"_"连接两部分
- SHA256 哈希后取前12位
示例:
扩展类型原始:001b,0000,0033,0010,4469,0017,002d,000d,0005,0023,0012,002b,ff01,000b,000a,0015
处理后:0005,000a,000b,000d,0012,0015,0017,001b,0023,002b,002d,0033,4469,ff01
签名算法:0403,0804,0401,0503,0805,0501,0806,0601
合并:0005,000a,000b,000d,0012,0015,0017,001b,0023,002b,002d,0033,4469,ff01_0403,0804,0401,0503,0805,0501,0806,0601
SHA256:e5627efa2ab19723084c1033a96c694a45826ab5a460d2d3fd5ffcfe97161c95
结果:e5627efa2ab1
五、JA4S(TLS 服务端指纹)
5.1 结构说明
同样分为 JA4s_a、JA4s_b、JA4s_c 三部分
5.2 JA4s_a
与 JA4_a 类似,但:
- 不包含 SNI 信息
- 不计算密码套件数量(服务端只选择一个)
5.3 JA4s_b
服务端选择的密码套件(去掉 0x)
5.4 JA4s_c
基于扩展类型:
- 忽略 ALPN(0010)
- 用","连接
- SHA256 哈希后取前12位
示例:
扩展类型:ff01,000b
SHA256:344b4dce5a5224d9ab24d970214dd88f8bdc9f8af56e3262f798e9cc25385256
结果:344b4dce5a52
六、JA4H(HTTP 指纹)
6.1 使用条件
- TLS 解密后
- 或 TLS 加密不存在时
6.2 结构说明
示例:ge20cr13enus_974ebe531c03_b66fa821d02c_e97928733c74
分为四部分:
- JA4H_a:
ge20cr13enus - JA4H_b:
974ebe531c03 - JA4H_c:
b66fa821d02c - JA4H_d:
e97928733c74
6.3 JA4H_a 计算
格式:[方法][版本][Cookie][Referer][头数量][语言]
- 方法:取前两个字母(如 GET→ge,POST→po)
- 版本:
- HTTP/2.0→20
- HTTP/1.1→11
- Cookie:
- 存在→c
- 不存在→n
- Referer:
- 存在→r
- 不存在→n
- 头数量:忽略 Cookie 和 Referer
- 语言:Accept-Language 前四位(无则为0000)
6.4 JA4H_b
基于响应头:
- 按出现顺序排序
- 忽略 Cookie 和 Referer
- SHA256 哈希后取前12位
6.5 JA4H_c
基于 Cookie 字段:
- 按 HTTP 报文顺序排列
- SHA256 哈希后取前12位
- 无 Cookie 则用12个0
6.6 JA4H_d
"用户指纹":
- 包含网站 Cookie 字段和用户唯一 Cookie 值
- 不包含敏感信息
- 同样 SHA256 哈希后取前12位
- 无 Cookie 则用12个0
七、JA4L(距离/位置测量)
7.1 测量模式
- JA4L-C:客户端测量
- JA4L-S:服务端测量
7.2 结构说明
格式:[延迟]_[TTL]
- 延迟:单位微秒(μs)
- TTL:Time To Live
7.3 TCP 流量计算
基于三次握手:
- JA4L-C = {(C-B)/2}_Client TTL
- JA4L-S = {(B-A)/2}_Server TTL
7.4 UDP(QUIC)流量计算
- JA4L-C = {(D-C)/2}_Client TTL
- JA4L-S = {(B-A)/2}_Server TTL
7.5 距离测量公式
D = jc/p
参数:
- D:距离
- j:JA4L_a(延迟)
- c:光速常量(0.128英里/μs 或 0.206公里/μs)
- p:延迟传播系数
- 恶劣地形:2
- 良好地形:1.5
TTL 计算:
跃点计数 = 初始 TTL - 观察到的 TTL(JA4L_b)
初始 TLL 参考:
| JA4L_b | 初始 TTL |
|---|---|
| <64 | 64 |
| 65-128 | 128 |
| >128 | 155 |
示例:
JA4L-S = 2449_104
跃点计数 = 128 - 104 = 24
延迟传播系数 ≈ 1.8
距离 = 2449×0.206/1.8 ≈ 257.385 公里
八、JA4X(TLS 证书指纹)
8.1 结构说明
分为三部分:
- JA4X_a:基于 Issuer RDNs
- JA4X_b:基于 Subject RDNs
- JA4X_c:基于 X.509 V3 扩展
8.2 JA4X_a 计算
- 使用 Issuer RDNs 字段名(不包含具体值)
- 保持原始排序
- SHA256 哈希后取前12位
8.3 JA4X_b 计算
- 使用 Subject RDNs 字段名
- 保持原始排序
- SHA256 哈希后取前12位
8.4 JA4X_c 计算
- 使用 X.509 V3 扩展
- 保持原始顺序
- SHA256 哈希后取前12位
九、JA4SSH(SSH 流量指纹)
9.1 计算频率
默认每200个数据包计算一次
9.2 结构说明
分为三部分:
- JA4SSH_a:负载长度众数
- JA4SSH_b:数据包计数
- JA4SSH_c:ACK 消息计数
9.3 JA4SSH_a 计算
格式:c[客户端长度]s[服务端长度]
- 计算客户端和服务端的 TCP Payload 长度众数
- 使用 Wireshark 过滤:
tcp.len
示例:
使用 chacha20-poly1305 加密时:
- 客户端键入字符:填充为36字节
- 服务端响应:36字节
指纹部分:c36s36
SCP 文件传输时:
c112s1460_c0s179_c21s0(服务端达到最大1460)
9.4 JA4SSH_b 计算
客户端和服务端各自发送的 SSH 数据包计数(默认总和为200)
9.5 JA4SSH_c 计算
客户端和服务端各自发送的 ACK 消息计数
十、应用场景
-
安全检测:
- 识别恶意服务器
- 检测中间人攻击
- 发现异常网络行为
-
流量分析:
- 应用识别
- 客户端识别
- 协议分析
-
网络测绘:
- 物理位置测量
- 网络拓扑分析
-
威胁狩猎:
- 结合多维度指纹检测高级威胁
- 识别隐蔽通道
十一、参考文献
-
JA3 相关:
-
JARM 相关:
-
JA4+ 相关: