JARM 指纹比对
JARM 是一种主动 TLS 指纹技术:工具向目标地址发起若干组特制握手,把服务端的响应特征组合成一个 62 字符的指纹串。它与基于客户端握手(如 JA3)的方法方向相反——JARM 描述服务端,因此适合对可疑的对外服务做批量比对,判断它们是否来自同一套服务端实现或同一批基础设施。指纹只能说明实现相近,不能单独证明同一团伙;且经过 CDN 或反向代理的地址,反映的是边缘节点而非源站。
基本信息
| 适用平台 | Linux / Windows 命令行环境(Python 实现),需能主动访问目标端口 |
|---|---|
| 使用方式 | python3 jarm.py -p 443 <目标地址>,输出指纹串 |
| 结果解释 | 相同指纹说明服务端 TLS 实现特征一致,可能同源 |
| 辅助手段 | 部分网络空间测绘与情报平台支持按 JARM 指纹检索相同特征的服务 |
| 限制 | CDN、反向代理与自定义握手逻辑会让指纹指向中间设备 |
典型使用场景
- 批量比对待查服务与已知恶意服务,发现同源基础设施
- 从一批可疑域名中按指纹聚类,减少逐个手工分析的工作量
- 验证某个新发现的服务是否与此前样本使用同一套服务端框架
- 跟踪同一框架的多个实例,扩展受影响资产清单
- 为报告中的同源判断提供可复核的技术依据
计算与比对
计算与比对
# 对单个目标计算 JARM 指纹
python3 jarm.py -p 443 203.0.113.10
# 批量计算多个目标,便于按指纹归组
python3 jarm.py -p 443 203.0.113.10 203.0.113.11 203.0.113.12 > jarm-all.txt
# 按指纹列排序,相同指纹会排列在一起
sort -k2 jarm-all.txt | head -30
# 与已知样本指纹清单比对(两侧均需先做格式规范化)
grep -F -f known-jarm.txt jarm-all.txt结果读法
| 输出项 | 含义 | 判读要点 |
|---|---|---|
| 目标与端口 | 被探测的地址 | 同一地址不同端口可能给出不同指纹 |
| 指纹串 | 服务端 TLS 响应特征组合 | 相同即实现特征一致,不代表同一组织 |
| 空值或异常串 | 目标不可达或非 TLS 服务 | 先确认端口与实际服务类型 |
| 批量结果分布 | 同类指纹的出现次数 | 聚集出现的未知指纹值得进一步调查 |
部分服务端会返回默认或固定指纹,扫描器与蜜罐也可能产生相同结果;命中与不命中都要结合证书、域名、时间与流量证据一起判断。
JARM 是主动探测:对第三方系统执行探测可能涉及授权与合规问题,必须确认你在授权范围内操作,并记录探测时间与目标清单。