TLS指纹在Bot对抗中的应用实践
日期:2024年04月15日 阅:77
在现今的数字化世界中,网络安全已经成为每个人,每个组织甚至国家的重要议题。其中,”Bot流量”或者说机器人网络流量,已经成为网络世界中不可忽视的一种威胁。Bot流量主要是由自动化的脚本或程序生成的网络流量,其广泛用于各种恶意活动,如DDoS攻击、垃圾邮件发送、网络钓鱼、虚假广告点击等。这些恶意行为不仅对个人用户的隐私和财产安全构成威胁,也对企业和组织的网络安全,甚至是国家的网络基础设施安全产生重大影响。因此,对Bot流量的研究和防御,已经成为网络安全领域的一项重大议题。本文的目标是阐述如何利用TLS指纹技术检测和识别Bot流量,从而为网络安全提供更有效的保障。
TLS,全称为传输层安全协议(Transport Layer Security),是网络通信中常用的一种保证数据安全传输的协议。TLS在数据在发送和接收过程中通过使用加密技术防止数据被截取或篡改,以保护信息的完整性和私密性。
TLS 用于加密互联网上的绝大多数流量,从网页浏览、注册登录、支付交易、流媒体播放,到现如今炙手可热的物联网。它的安全性也颇受恶意攻击者青睐,通过TLS来隐藏恶意软件的通信流量。
在 TLS 连接开始时,客户端会发送一个 TLS Client Hello 数据包,该数据包由客户端应用程序生成,通知服务器它支持哪些密码以及其首选的通信方法,并且以明文传输。TLS 客户端 Hello 数据包对于每个应用程序或其底层 TLS 库都是唯一的,根据这个数据包计算得到的一串哈希值,即为TLS指纹。
当前TLS指纹的主要应用方向是Salesforce开源的JA3和JA4,其中JA4是JA3的升级版,增加更多检测维度和场景,因此本文主要研究基于JA4的TLS指纹在Bot对抗中的应用与实践。
JA3 方法用于收集客户端 Client Hello 数据包中以下字段的字节十进制值:TLS版本、密码套件、扩展列表、椭圆曲线和椭圆曲线格式。然后,它将这些值按出现顺序连接在一起,使用“,”分隔每个字段,使用“-”分隔每个字段中的每个值。
示例:
771,4865-4866-4867-49195-49196-52393-49199-49200-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-51-45-43-21,29-23-24,0
对上述字段进行32位md5加密处理,得到JA3指纹:
JA3: f79b6bad2ad0641e1921aef10262856b
在计算JA3指纹的过程中,需要忽略TLS扩展中包含GREASE字段的值,因为该字段是Google 使用此机制来防止 TLS 生态系统中的可扩展性失败。
生成JA3 后,我们使用相同的方法对服务器端进行指纹识别(即 TLS Server Hello 消息)。JA3S 方法是收集Server Hello 数据包中以下字段的字节的十进制值:TLS版本、密码套件和扩展列表。然后将这些值按顺序连接在一起,使用“,”分隔每个字段,使用“-”分隔每个字段中的每个值。
示例:771,49200,65281-0-11-35-16-23
JA3S: d154fcfa5bb4f0748e1dd1992c681104
JA4+ 提供了一套易于使用和共享的模块化网络指纹,取代2017年起的JA3 TLS指纹标准。JA4检测方法增加了可读性,有助于更有效地进行威胁搜寻和分析。所有JA4+指纹都具有a_b_c格式,用于分隔构成指纹的不同部分。这允许仅利用ab或ac或c进行搜索和检测。如果只想分析传入应用程序的 cookie,只需要查看JA4H_c。这种新的局部性保留格式有助于进行更深入、更丰富的分析,同时保持简单、易于使用并允许扩展。
JA4+指纹包括以下几个维度信息:
(1)JA4 — TLS 客户端
(2)JA4S — TLS 服务器响应
(3)JA4H — HTTP 客户端
(4)JA4L — 光距离/位置
(5)JA4X — X509 TLS 证书
(6)JA4SSH — SSH 流量
本文将主要介绍JA4的应用,其他维度特征详细介绍请查看JA4开源地址:https://github.com/FoxIO-LLC/ja4。
JA4由JA4_a、JA4_b、JA4_c组成。:
JA4_r= JA4_a(t13d1516h2)_JA4_b(排序后的加密套件)_JA4_c(排序后的扩展_原始加密算法)
JA4_a: t13d1516h2,包含了客户端的TLS版本、SNI、加密套件数量、扩展数量以及ALPN,ALPN表示 TLS 协商完成后应用程序想要进行通信的协议,这里的“00”表示缺少ALPN。请注意,ALPN“h2”的存在并不表示浏览器,因为许多物联网设备通过HTTP/2进行通信。然而,缺少 ALPN 可能表明客户端不是 Web 浏览器。无论流量是通过TCP还是QUIC,JA4都会对客户端进行指纹识别。QUIC是新的 HTTP/3 标准使用的协议,它将TLS1.3封装到UDP数据包中。
JA4_b:对排序后的加密套件进行SHA256,并截取前12个字符;
例如:
002f,0035,009c,009d,1301,1302,1303,c013,c014,c02b,c02c,c02f,c030,cca8,cca9 = 8daaf6152771
JA4_c:对排序后的扩展_原始加密算法SHA256,并截取前12个字符;
例如:
0005,000a,000b,000d,0012,0015,0017,001b,0023,002b,002d,0033,4469,ff01_0403,0804,0401,0503,0805,0501,0806,0601 = e5627efa2ab1
不同的客户端(浏览器、计算机软件、程序)所支持的协议版本、加密套件、扩展、加密算法不同。并且TLS握手期间Client Hello以明文传输,这意味着我们可以在TLS握手过程中计算JA4指纹来识别客户端的真实属性。
FireFox(JA4 Client Hello) ≠ Chrome(JA4 Client Hello)
Chrome 120(JA4 Client Hello)≠ Chrome 80(JA4 Client Hello)
Chrome IOS(JA4 Client Hello) ≠ Chrome Android(JA4 Client Hello)
Heritrix(JA4 Client Hello) ≠ Chrome(JA4 Client Hello)
客户端没有被恶意篡改时,JA4指纹会保持稳定。
在Bot对抗场景下,应用JA4指纹进行客户端识别,需要结合其他信息进行组合判断:客户端的IP信息、客户端的操作系统信息、客户端的设备名称、版本号等。
在Bot对抗场景中,JA4指纹主要有两种应用方式:指纹唯一性检测、指纹一致性检测。
对于某些客户端程序设计的特殊性,使得这些客户端具备独一无二的JA4指纹,并且这些客户端的指纹变化周期较长,通过唯一性检测可有效识别此类异常客户端。
Application | JA4+ Fingerprints |
Chrome | JA4=t13d1517h2_8daaf6152771_b1ff8ab2d16f (initial) |
JA4=t13d1517h2_8daaf6152771_b0da82dd1658 (reconnect) | |
FireFox | JA4=t13d1715h2_5b57614c22b0_7121afd63204(initial) |
JA4=t13d1715h2_5b57614c22b0_7121afd63204 (reconnect) | |
Safari | JA4=t13d2014h2_a09f3c656075_14788d8d241b |
heritrix | JA4=t13d491100_bd868743f55c_fa269c3d986d |
undetected_chromedriver | JA4=t13d1516h2_8daaf6152771_02713d6af862 |
IcedID Malware | JA4=t13d201100_2b729b4bf6f3_9e7b989ebec8 |
sqlmap | JA4= t13i311000_e8f1e7e78f70_d41ae481755e |
AppScan | JA4= t12i3006h2_a0f71150605f_1da50ec048a3 |
指纹一致性检测原理是对客户端声明的设备信息(操作系统、浏览器类型、版本号)与其JA4指纹进行对比,检测是否与指纹对应的真实设备信息一致。
客户端声明设备信息 | 客户端JA4指纹 | 一致性 |
“brower”: “Chrome”, “brower_version”: “89.8.7866”, “os”: “Windows”, “os_version”: “7”, | t12d290400_11b08e233c4b_017f05e53f6d | 异常 |
“brower”: “Chrome”, “brower_version”: “93.0.4622”, “os”: “Windows”, “os_version”: “10” | t13d431000_c7886603b240_5ac7197df9d2 | 异常 |
“brower”: “Python Requests”, “brower_version”: “2.31” | t13d1516h2_8daaf6152771_02713d6af862 | 异常 |
“brower”: “Chrome”, “brower_version”: “93.0.4577”, “os”: “Windows”, “os_version”: “10”, | t13d1516h2_8daaf6152771_e5627efa2ab1 | 正常 |
“brower”: “Firefox”, “brower_version”: “116.0”, “os”: “Ubuntu”, | t13d321200_1b30506679d3_58ed7828516f | 异常 |
“brower”: “Edge”, “brower_version”: “14.14393”, “os”: “Windows”, “os_version”: “10” | t12d040400_a6a9ac001284_255c81f47ac1 | 异常 |
“brower”: “Safari”, “brower_version”: “15.6”, “os”: “Mac OS X”, “os_version”: “10.15.7” | t13d2014h2_a09f3c656075_f62623592221 | 正常 |
表2 JA4一致性检测
在Bot对抗场景下,无论是通过JA4唯一性还是一致性特征进行检测,其逻辑背后都是依靠庞大的JA4指纹库作为数据支撑,JA3指纹亦是如此。因此如何构建一个完整的指纹库,成为JA4是否能成功识别Bot流量的关键之一。由于官方 JA4+ 指纹数据库、相关应用程序和推荐的检测逻辑正在构建中,暂无相关指纹库可用,因此网宿安全演武实验室针对Bot对抗特殊场景,收集该场景下常见的客户端指纹,并实现相应检测算法。
本文分析表明TLS指纹是一种极其有效的工具,通过对TLS客户端client hello包中的不同字段进行深入分析,我们可以生成独特的JA4指纹并利用这些指纹来识别特定的恶意Bot流量。
虽然TLS指纹可以有效地检测Bot流量,但也存在一定局限性,随着攻击者的策略不断升级和改变,TLS指纹会继续被篡改或伪造。因此,我们需要不断地更新和改进检测机制,保持攻防对抗中的领先性。
在Bot对抗场景下TLS指纹提供了一种强大的识别机制,但它并不能替代其他安全措施。它应该被视为Bot安全措施的一部分,与威胁情报、浏览器指纹等一起使用,以提供全面的保护。
基于全球广泛分布的边缘节点,依托10余年安全运营和海量攻防数据,「网宿安全」构建从边缘到云的智能安全防护体系,提供DDoS防护、Web应用防护、爬虫管理、远程访问安全接入、安全SD-WAN、主机安全等全方位的安全产品及服务,覆盖云安全、企业安全和安全服务等领域,助力企业构筑基于零信任和安全访问服务边缘(SASE)模型的全新安全架构,护航网络安全,为数字时代保驾护航。 网宿科技(300017)成立于2000年,2009年于创业板首批上市,是全球领先的边缘计算及安全服务商,业务遍及全球70多个国家和地区。公司始终致力于提升用户的数字化体验,满足用户随时随地、安全、可靠的数据处理及交互需求。