tls指纹模拟

    渗透测试 lz520520 2年前 (2022-10-27) 1354次浏览

    tls指纹

    介绍

    https等协议通过tls加密传输,大家可能觉得数据被全加密了应该可以保证无恶意流量特征,流量侧通信不会被发现,但在加密前,会有一个tls协商过程,client和server协商交互才会生成最后加密用的密钥,而这个协商过程就可以切切实实进行指纹提取。这就是tls指纹。

    JA3是一种创建SSL/TLS客户端指纹的方法,它易于在任何平台上生成,并且可以轻松共享以获取威胁情报。JA3 由三位 Salesforce 成员(John Althouse、Jeff Atkinson 和 Josh Atkins)开发,是一种用于根据 ClientHello 数据包生成 SSL 指纹以识别建立加密连接的客户端的技术。相同的客户端工具所产生的JA3指纹总是一致的。 JA3 指纹从一开始就是为了证明客户端应用程序是否存在恶意。

    我们在使用burpsuite等工具时,经常会遇到网站无法打开,去掉代理又变正常的情况,很可能是网站的WAF使用了JA3指纹识别到了代理工具。常见的如cloudfare waf就使用了该指纹技术。

    go默认ja3指纹89be98bbd4f065fe510fca4893cf8d9b

    chromeja3指纹cd08e31494f9531f560d64c695473da9

    分析

    ja3

    tls指纹生成过程

    JA3方法用于收集Client Hello数据包中以下字段的十进制字节值:版本、可接受的密码、扩展列表、椭圆曲线密码和椭圆曲线密码格式。然后,它将这些值串联在一起,使用“,”来分隔各个字段,同时,使用“-”来分隔各个字段中的各个值。

    例子

    然后使用MD5 hash生成指纹

    具体分析

    这里以go开发的frp为例

    Client Hello数据包如下,ja3就是由以下圈出来的部分生成的

    tls指纹模拟

    SSLVersion

    这里显示是 TLS1.2,对应实际值是0x0303

    tls指纹模拟

    转换成十进制为

    Cipher-Suites

    如下加密算法套件有19个,根据ja3规则,每个之间用"-"连接

    tls指纹模拟

    转换成果如下

    SSLExtension

    这个扩展列表是由所有扩展类型值组成,如下扩展类型值有8个

    tls指纹模拟

    生成结果为

    EllipticCurve

    椭圆曲线密码

    即扩展type值为10对应的数据,这里写的是supported_group

    tls指纹模拟

    生成结果为

    EllipticCurvePointFormat

    椭圆曲线格式

    即扩展type只为11对应的数据,这里数据值为0

    tls指纹模拟

    生成结果为

    最后将上面所有部分用","拼接组成最终需要hash的字符串

    进行hash计算如下

    tls指纹模拟

    通过ja3工具解析数据包结果,可以看到和我们计算结果一致

    tls指纹模拟

    ja3s

    JA3S方法会收集Server Hello数据包中以下各个字段的十进制字节值:版本、可接受的加密算法和扩展列表。然后,它将这些值串联在一起,使用“,”来分隔各个字段,并通过“-”来分隔每个字段中的各个值。

    PS: 因为Server Hello会因为Client Hello不同和不同,所以只能做一个参考。

    计算

    FRP的Server Hello数据包如下,计算需要的三部分如下

    tls指纹模拟

    SSLVersion

    版本

    tls指纹模拟

    生成结果

    Cipher

    可接受的加密算法,只有一个

    tls指纹模拟

    生成结果

    SSLExtension

    扩展列表,扩展列表只有两个

    tls指纹模拟

    根据类性值,生成结果

    将上述拼接起来

    tls指纹模拟

    但ja3s工具生成,加密套件这块额外添加了参数实际算法名称

    如下,但实际表示意义也是唯一的

    tls指纹模拟

    tls指纹模拟

    绕过

    文章

    https://mp.weixin.qq.com/s/og2IKo8lcydh8PROUPD7jQ

    https://segmentfault.com/a/1190000041699815

    https://github.com/refraction-networking/utls

    这个库是基于crypto/tls进行开发的,可以模拟绝大部分情况下的ja3指纹。

    和官方库差不多的用法,如下在封装时除了conn连接和config配置以外,需要传入ClientHelloID,这个ID是有一些内置的指纹可以直接调用,或者也可以自定义。

    这是官方库

    tls指纹模拟

    u_common.go,如下有非常全的现成指纹信息可以用。

    tls指纹模拟

    这些ID最终对应到这个函数utlsIdToSpec

    tls指纹模拟

    后续可参考这边编写实现自己的。

    tls指纹模拟

    并且该库还支持解析数据包中的client hello信息,来自动化构建一个自定义参数,实现模拟各种ja3指纹

    浏览器访问,然后抓包找到client hello包,选中tls层的数据,然后复制成hex stream即可。

    tls指纹模拟

    将tls的hex数据粘贴到以下位置,通过fingerprinter.FingerprintClientHello即可解析生成一个自定义spec,封装到tlsConn里直接使用。

    要注意的是ClientHelloID还设置成HelloCustom即自定义

    可以看到完全一致(wireshark好像3.6以上就支持ja3的指纹生成了)

    PS: 要注意一点,SNI也会参与计算,如果ServerName为空会不插入Extension里,导致ja3指纹计算结果不一样

    tls指纹模拟

    这个库还有些其他玩法,可以自行参考文档或者他的example.go

    存在小bug,如果自动握手,可能会出现握手失败的问题,建议手动握手


    Security , 版权所有丨如未注明 , 均为原创丨
    转载请注明原文链接:tls指纹模拟
    喜欢 (21)