deepwzh的技术笔记
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • Golang
  • Python
  • Cpp
杂项
前端开发
  • 计算机网络
  • 操作系统
  • 数据库
云原生
Devops
AIGC
关于作者
  • 计算机网络
  • Oauth2
  • 网络工具
  • 学习资料
  • RFC 标准
  • 计算机网络
  • Arp
  • 序列化技术
  • DNS

    • DNS
    • Zone 文件
  • HTTP

    • HTTP
    • OpenAPI
  • Https

    • Https
    • SSL/TLS
    • TLS 指纹
    • Client Hello
  • TCP

    • TCP
    • TCP 选项
    • TCP syn flood 攻击
    • 相关内核参数
    • RST 的集中情况
    • TCP Keepalive
  • 首页

    • 首页
    • test
  • 代理

    • 代理
    • 反向代理

TLS 指纹

计算 ja3

字段:

  • ClientHello 的版本
  • 可接受的加密算法
  • 扩展列表中的每一个 type 值
  • 支持的椭圆曲线
  • 支持的椭圆曲线格式

然后,用 , 来分隔各个字段、用使用 - 来分隔各个字段中的各个值(十进制哦),将这些值串联在一起之后,计算 MD5,就是一个 ja3 了。注意,如果没有某个字段,则这些字段的值为空(连接用的逗号别忘了)。

计算 ja3s

ja3s 与 ja3 类似,提取 Server Hello 数据包中的:Server Hello 版本、可接受的加密算法 和 扩展列表中的每一个 type 值。然后同样用 , 来分隔各个字段、用使用 - 来分隔各个字段中的各个值(十进制哦),将这些值串联在一起之后,计算 MD5,就是一个 ja3s 了

攻防

ja3(s) 的误报率如何?

说实话,一般只有高度定制化的恶意软件会自己去实现 TLS,也是在这种情况下,ja3 指纹很可能对该恶意软件来说是唯一的。但是现在研发一般都会用第三方的库,不管是诸如 Python 的官方模块还是 win 下的组件,如果是这种情况,那么 ja3 会重复,误报率很高。这其实就是为什么要用 ja3s。

John Althouse 也举了个例子,翻译如下:

“...例如,MetaSploit 的 Meterpreter 和 CobaltStrike 的 Beacon 都使用 Windows 套接字来启动 TLS 通信。在 Windows 10 上,JA3=72a589da586844d7f0818ce684948eea(指定 IP 地址),JA3=a0e9f5d64349fb13191bc781f81f42e1(指定域名)。由于 Windows 上的其他普普通通的应用程序也使用相同的套接字,因此,我们很难识别其中的恶意通信。但是,Kali Linux 上的 C2 服务器对该客户端应用程序的响应方式与 Internet 上的普通服务器对该套接字的响应方式相比来说是独一无二的。因此,如果结合 ja3+ja3s,就能够识别这种恶意通信,而不用考虑目的地 IP、域名或证书等细节信息...”

总而言之,ja3 不是非常准确,所以要用 ja3s;ja3+ja3s 依旧不会非常准确,但是可以丰富我们检测威胁的维度,增加了攻击者的攻击成本,事实上现在很多 nids 都集成了 ja3(s) 的提取与匹配。

伪造 ja3 的库

  • ja3transport,golang 的库,这个的原理也是劫持 ClientHello 篡改,我认为不太靠谱。
  • curl-impersonate,魔改的 curl,支持修改 ciphers 以及 curves。至于 extensions,我简单看了下作者的文章,他是通过使用与浏览器相同的 SSL 组件来模拟浏览器的 extensions,例如 Chrome 用的是 BoringSSL,FireFox 用的是 NSS,这个办法很聪明,在大多数场景下这个已经可以满足绕过的需要了,不过它就没办法模拟任意的 ja3 了。基于这个代码,还有一个 Python 版本的 curl_cffi
  • CycleTLS,有 golang 和 nodejs 的库,这个看代码是自己实现了 TLS 握手,实在是令人佩服。为了兼容 HTTP2 以及各种复杂的 TLS 参数,这个库目前还在艰难地维护当中, 不过只要不是特殊情况应该还是可以使用的。

参考资料

JA3(S),简单而有效的 TLS 指纹 - Tr0y's Blog

逆向之 Ja3 指纹学习 - 始識 - 博客园 (cnblogs.com)

JA 指纹识全系讲解(上) - 先知社区 (aliyun.com)

Prev
SSL/TLS
Next
Client Hello