硬核 | TLS指纹在Bot对抗中的应用实践
2024-3-8 19:16:57 Author: www.freebuf.com(查看原文) 阅读量:14 收藏

引言

在现今的数字化世界中,网络安全已经成为每个人,每个组织甚至国家的重要议题。其中,"Bot流量"或者说机器人网络流量,已经成为网络世界中不可忽视的一种威胁。Bot流量主要是由自动化的脚本或程序生成的网络流量,其广泛用于各种恶意活动,如DDoS攻击、垃圾邮件发送、网络钓鱼、虚假广告点击等。这些恶意行为不仅对个人用户的隐私和财产安全构成威胁,也对企业和组织的网络安全,甚至是国家的网络基础设施安全产生重大影响。因此,对Bot流量的研究和防御,已经成为网络安全领域的一项重大议题。本文的目标是阐述如何利用TLS指纹技术检测和识别Bot流量,从而为网络安全提供更有效的保障。

TLS 指纹简介

TLS,全称为传输层安全协议(Transport Layer Security),是网络通信中常用的一种保证数据安全传输的协议。TLS在数据在发送和接收过程中通过使用加密技术防止数据被截取或篡改,以保护信息的完整性和私密性。

TLS 用于加密互联网上的绝大多数流量,从网页浏览、注册登录、支付交易、流媒体播放,到现如今炙手可热的物联网。它的安全性也颇受恶意攻击者青睐,通过TLS来隐藏恶意软件的通信流量。

在 TLS 连接开始时,客户端会发送一个 TLS Client Hello 数据包,该数据包由客户端应用程序生成,通知服务器它支持哪些密码以及其首选的通信方法,并且以明文传输。TLS 客户端 Hello 数据包对于每个应用程序或其底层 TLS 库都是唯一的,根据这个数据包计算得到的一串哈希值,即为TLS指纹。

图1 TLS握手过程

当前TLS指纹的主要应用方向是Salesforce开源的JA3JA4,其中JA4是JA3的升级版,增加更多检测维度和场景,因此本文主要研究基于JA4的TLS指纹在Bot对抗中的应用与实践

1、JA3 & JA3S

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 生态系统中的可扩展性失败。

图2 Client Hello消息

生成JA3 后,我们使用相同的方法对服务器端进行指纹识别(即 TLS Server Hello 消息)。JA3S 方法是收集Server Hello 数据包中以下字段的字节的十进制值:TLS版本、密码套件和扩展列表。然后将这些值按顺序连接在一起,使用“,”分隔每个字段,使用“-”分隔每个字段中的每个值。

示例:771,49200,65281-0-11-35-16-23

JA3S: d154fcfa5bb4f0748e1dd1992c681104

图3 Server Hello消息

2、JA4+

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

图4 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

JA4指纹在Bot对抗中的应用

1、检测原理

不同的客户端(浏览器、计算机软件、程序)所支持的协议版本、加密套件、扩展、加密算法不同。并且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指纹会保持稳定。

2、应用方式

在Bot对抗场景下,应用JA4指纹进行客户端识别,需要结合其他信息进行组合判断:客户端的IP信息、客户端的操作系统信息、客户端的设备名称、版本号等。

在Bot对抗场景中,JA4指纹主要有两种应用方式:指纹唯一性检测、指纹一致性检测。

1)    唯一性检测

对于某些客户端程序设计的特殊性,使得这些客户端具备独一无二的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

表1 常见客户端JA4指纹

2)    一致性检测

指纹一致性检测原理是对客户端声明的设备信息(操作系统、浏览器类型、版本号)与其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一致性检测

3、JA4指纹库

在Bot对抗场景下,无论是通过JA4唯一性还是一致性特征进行检测,其逻辑背后都是依靠庞大的JA4指纹库作为数据支撑,JA3指纹亦是如此。因此如何构建一个完整的指纹库,成为JA4是否能成功识别Bot流量的关键之一。

由于官方 JA4+ 指纹数据库、相关应用程序和推荐的检测逻辑正在构建中,暂无相关指纹库可用,因此网宿安全演武实验室针对Bot对抗特殊场景,收集该场景下常见的客户端指纹,并实现相应检测算法。

总结

本文分析表明TLS指纹是一种极其有效的工具,通过对TLS客户端client hello包中的不同字段进行深入分析,我们可以生成独特的JA4指纹并利用这些指纹来识别特定的恶意Bot流量。

虽然TLS指纹可以有效地检测Bot流量,但也存在一定局限性,随着攻击者的策略不断升级和改变,TLS指纹会继续被篡改或伪造。因此,我们需要不断地更新和改进检测机制,保持攻防对抗中的领先性。

在Bot对抗场景下TLS指纹提供了一种强大的识别机制,但它并不能替代其他安全措施。它应该被视为Bot安全措施的一部分,与威胁情报、浏览器指纹等一起使用,以提供全面的保护。


文章来源: https://www.freebuf.com/articles/web/393136.html
如有侵权请联系:admin#unsafe.sh