最近在研究某些魔法客户端的识别,发现TLS指纹是其重要特征之一,遂整理一篇。

1、TLS指纹历史

image.png

2017年之前,TLS指纹主要依赖客户端或服务器的握手报文特征,如Cipher Suites顺序、扩展顺序等,手工分析和匹配,没有像JA3/JA3S这样的标准化哈希指纹方法。

2017年,John Althouse在Salesforce工作期间提出JA3/JA3S指纹,定义标准化TLS指纹格式并迅速在工业界普及。

2019年,Sergey Frolov等人[1]提出了uTLS,用于对抗TLS指纹校验。

2022年,Chrome在107版本中加入随机TLS扩展顺序的特性,对抗JA3指纹。

2023年,John Althouse在FoxIO工作期间提出JA4+系列指纹,旨在扩充协议广度和解决JA3指纹在TLS扩展随机化方面的局限性。解决了Chrome指纹随机化问题。

2、JA3指纹

JA3指纹由如下5部分组成:

<TLSVersion>,<CipherSuites>,<Extensions>,<SupportedGroups>,<ECPointFormats>
  1. TLSVersion:ClientHello包中TLS的版本字段,不是TLS层中的版本字段
  2. CipherSuites:客户端支持的密码套件列表
  3. Extensions:客户端支持的扩展类型列表,只取Type字段
  4. SupportedGroups:客户端支持的椭圆曲线或有限域参数组列表,旧称EllipticCurves
  5. ECPointFormats:客户端支持的椭圆曲线公钥点的编码格式

GREASE(Generate Random Extensions And Sustain Extensibility)是TLS协议的一种机制,客户端通过在ClientHello等消息中插入随机保留值,保证协议未来可扩展、互操作性强且升级平滑。GREASE本身没有实际意义,它只是测试对未知值的容错能力,因此在实际握手中不会影响协商的最终结果。在计算JA3指纹时,需要忽略此字段。

JA3的不同部分用,连接,相同部分的列表元素用-连接,且都用10进制表示,最后进行md5哈希运算。

下面给出一个实例:

image.png

该包的JA3原始字符串为:

771,
49195-49199-49196-49200-52393-52392-49161-49171-49162-49172-49170-4865-4866-4867,
0-5-10-11-13-65281-23-16-18-43-51,
29-23-24-25,
0

JA3指纹为:

fd75aaca18604d62f2bc8b02b345140f

3、JA3S指纹

JA3指纹用于刻画TLS中的ClientHello包,而JA3S则用于刻画TLS中的ServerHello包。JA3S包含如下3个字段

<TLSVersion>,<CipherSuites>,<Extensions>
  1. TLSVersion:服务端支持的TLS版本,可能与客户端不同
  2. CipherSuites:服务端选择的加密套件,仅一个
  3. Extensions:服务端选择的扩展列表

下面给出与上述JA3同一个流的JA3S实例:

image.png

该包的JA3S原始字符串为:

771,4865,43-51

JA3S指纹为:

f4febc55ea12b31ae17cfb7e614afda8

4、JA4指纹

由上述可见,JA3指纹的抗扰动能力很弱,随便打乱一下密码套件或扩展的顺序就足以使指纹大变,所以便有了JA4指纹。

JA4指纹是JA4+指纹系列中的一员,JA4+指纹如下:

image.png

John Althouse在他的X上进行了详细的介绍,这里挑选JA4和JA4S进行介绍。

image.png

由上图可见,JA4指纹模块化了,其由JA4_aJA4_bJA4_c三部分组成。JA4同JA3指纹一样,同样忽略GREASE字段。

  1. JA4_a:由概览信息构成,长度固定。注意这里的TLS版本是客户端支持的最高TLS版本,有时会出现在Supported Version扩展中,JA3则不会判断扩展中的TLS版本
  2. JA4_b:由从小到大的加密套件组成,用,分割,最后做SHA256哈希运算,并取前12位。与JA3不同的是这里使用16进制表示
  3. JA4_c:由除去SNI扩展名(0000)和ALPN扩展名(0010)的扩展列表和Signature Algorithms扩展中的字段列表组成,同样是16进制,但是并没有从小到大排序,而是按照原本顺序。随后将二者用_拼接

下面是一个JA4的原始字符串,该包与上述JA3对应:

t13d1411h2_
1301,1302,1303,c009,c00a,c012,c013,c014,c02b,c02c,c02f,c030,cca8,cca9_
0005,000a,000b,000d,0012,0017,002b,0033,ff01_
0804,0403,0807,0805,0806,0401,0501,0601,0503,0603,0201,0203

JA4指纹为:

t13d1411h2_cbb2034c60b8_e7c285222651

5、JA4S指纹

JA4S同样由JA4S_aJA4S_bJA4S_c三部分组成。

image.png

  1. JA4S_a:JA4S_a和JA4_a相比,去掉了SNI Extensions和Ciper Suite的个数
  2. JA4S_b:服务端选择的加密套件,16进制表示
  3. JA4S_c:服务端选择的扩展列表,去除SNI和APLN扩展,用,分割,16进制表示,最后取SHA256哈希前12位

下面举出与上述JA4对应的JA4S原始字符串:

t130200_
1301_
002b,0033

JA4指纹为:

t130200_1301_a56c5b993250

References

[1] Frolov S, Wustrow E. The use of TLS in Censorship Circumvention[C]//NDSS. 2019.

标签: TLS

添加新评论