标题 简介 类型 公开时间
关联规则 关联知识 关联工具 关联文档 关联抓包
参考1(官网)
参考2
参考3
详情
[SAFE-ID: JIWO-2024-3370]   作者: ecawen 发表于: [2023-11-27]

本文共 [54] 位读者顶过

在这篇博文中,我将介绍如何利用JA3和JA3S作为识别客户机和服务器之间TLS协商的方法。这种组合的指纹可以帮助对特定客户端与其服务器之间的加密通信产生更高保真度的识别。例如:

标准客户端:

JA3 = e7d705a3286e19ea42f587b344ee6865 ( Tor Client )

JA3S = a95ca7eab4d47d051a5cd4fb7b6005dc( Tor Server Response )

Tor服务器总是以完全相同的方式响应Tor客户端,提供更高的信心,流量确实是Tor。进一步的例子:

Trickbot恶意软件:

JA3 = 6734f37431670b3ab4292b8f60f29984 ( Trickbot )

JA3S = 623de93db17d313345d7ea481e7443cf( C2 Server Response )

Emotet恶意软件:

JA3 = 4d7a28d6f2263ed61de88ca66eb011e3 ( Emotet )

JA3S = 80b3a14bccc8598a1f3bbe83e71f735f ( C2 Server Response )

在这些恶意软件示例中,命令和控制服务器总是以完全相同的方式响应恶意软件客户端;它不会偏离。因此,即使流量是加密的,人们可能不知道命令和控制服务器的ip或域名,因为它们不断变化,我们仍然可以通过指纹识别客户端和服务器之间的TLS协商,以合理的信心识别恶意通信。

JA3和JA3S已经开源,可以在这里找到:GitHub - salesforce/ja3: JA3 is a standard for creating SSL client fingerprints in an easy to produce and shareable way.

JA3的一些背景知识

我们在2017年的这篇博客文章中开源了JA3,这是一种在网络上对TLS客户端进行指纹识别的方法:

指纹识别TLS客户端的主要概念来自Lee Brotherston 2015年的研究,可以在这里找到,也可以在这里找到他的DerbyCon演讲。如果没有Lee的研究和开源,我们就不会开始JA3的工作。所以,感谢Lee和所有那些写博客和开源的人!

回顾一下;TLS及其前身SSL用于加密通信,既用于普通应用程序,以保证数据安全,也用于恶意软件,因此它可以隐藏在噪音中。为了发起一个TLS会话,客户端将在TCP三次握手之后发送一个TLS客户端Hello报文。此包及其生成方式取决于构建客户机应用程序时使用的包和方法。如果服务器接受TLS连接,将使用基于服务器端库和配置以及客户端Hello中的详细信息制定的TLS服务器Hello数据包进行响应。由于TLS协商是以透明方式传输的,因此可以使用TLS client Hello包中的详细信息来识别和识别客户机应用程序。

动图封面
这张绘制精美的网络图显示了SSL/TLS初始通信模式。

JA3方法用于收集Client Hello报文中如下字段的十进制字节值:Version、Accepted Ciphers、List of Extensions、Elliptic Curves和Elliptic Curve Formats。然后按顺序将这些值连接在一起,使用“,”分隔每个字段,使用“-”分隔每个字段中的每个值。

字段顺序如下:TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats

例子:

769, 47-53-5-10-49161-49162-49171-49172-50-56-19-4, 0-10-11, 23-24-25, 0

如果Client Hello中没有TLS扩展,则该字段为空。例如:

769,4–5–10–9–100–98–3–6–19–18–99,,,

然后对这些字符串进行MD5散列,生成易于使用和共享的32个字符指纹。这是JA3 TLS客户端指纹。

769,47–53–5–10–49161–49162–49171–49172–50–56–19–4,0–10–11,23–24–25,0 → ada70206e40642a3e4461f35503241d5

769,4–5–10–9–100–98–3–6–19–18–99,,, → de350869b8c85de67a350c8d186f11e6

我们还需要引入一些代码来解释Google的润滑脂(生成随机扩展和维持可扩展性)。Google使用这种机制来防止TLS生态系统中的可扩展性失败。JA3完全忽略这些值,以确保仍然可以用单个JA3散列来识别利用GREASE的程序。

JA3在TLS 1.3上工作吗?是的。

这里我们有两个不同浏览器的TLS 1.3客户端Hello数据包,每个浏览器对其密码和扩展的排序不同,并且包括(或排除)不同的密码和扩展。因此,JA3在每个客户机上仍然是唯一的。

JA3S

创建JA3之后,我们开始使用相同的方法对TLS握手的服务器端(TLS server Hello消息)进行指纹识别。JA3S方法收集Server Hello包中以下字段的十进制字节值:Version、Accepted Cipher和List of Extensions。然后按顺序将这些值连接在一起,使用“,”分隔每个字段,使用“-”分隔每个字段中的每个值。

字段顺序如下: TLSVersion,Cipher,Extensions

例如:769,47,65281–0–11–35–5–16

如果服务器Hello中没有TLS扩展,则该字段为空。

例子: 769,47,

然后对这些字符串进行MD5散列,生成易于使用和共享的32个字符指纹。这是JA3S指纹。

769,47,65281–0–11–35–5–16 → 4835b19f14997673071435cb321f5445

我们使用MD5散列是因为可以分别向Client Hello或Server Hello添加多少密码或扩展名是没有限制的,我们的经验法则是,如果指纹不能适合tweet,那么它就太长了。我们还使用MD5,这样JA3方法可以更容易地集成到现有技术中。请记住,JA3是一种设计用于在任何硬件上的任何应用程序中工作的方法。我承认,模糊散列会更好,但我们希望使用一种可以整合到当前部署的技术中的方法,而大多数技术还没有模糊散列支持,而即使是最老的Netscreen防火墙也可以大量生产md5。此外,考虑到有限的数据集,这里不需要考虑哈希冲突。我知道MD5可能是安全社区中争论的焦点,所以我希望这有助于解释我们使用它背后的原因。

我们的代码允许记录整个字符串以及用于添加分析的哈希值。如果可能的话,我强烈建议您记录JA3和JA3S的整个指纹字符串以及散列值。添加的分析功能可以派上用场。但是,如果您的组织缺少日志空间,那么只需记录散列就可以了。

为什么JA3S有效?

我们发现,同一服务器将根据客户端Hello消息及其内容,以不同的方式表述其服务器Hello消息。因此,不可能像我们对客户机和JA3那样,仅仅根据Hello消息对服务器进行指纹识别。正因为如此,一些人认为这里没有价值。但我们还是坚持了下来,因为Salesforce有源源不断的咖啡因供应。一段时间后,我们发现,虽然服务器对不同客户端的响应不同,但它们对同一个客户端的响应总是相同的。

动图封面

在这个网络图中,我们可以看到客户端正在发送一个全a的TLS客户端Hello包。因此,服务器用A响应,并且总是用A响应A。

动图封面

这里,另一个客户发送了所有B。与以前相同的服务器现在用B响应,并且总是用B响应B。不同的客户端,不同的响应,但对于每个客户端总是相同的。

现实世界的例子:

在这个日志输出中,左边是JA3,右边是JA3S

在这个例子中,我使用同一个客户端与同一个服务器联系了4次。然后我使用不同的客户端再次联系了它4次。服务器响应的方式对于相同的客户机总是相同的,尽管对于不同的客户机是不同的。

安全用途

如果威胁行为者自定义构建了他们自己的恶意软件可执行文件,那么JA3指纹很可能是该可执行文件所独有的。例如,以下是渗透测试人员为某项目开发的定制恶意软件的客户端Hello:

您可以看到,只有一个强大的可接受密码套件是异常的,并且由此产生的JA3在我们的环境中是唯一的,因此无论目的地如何,都很容易检测到。

其他渗透测试工具,如PupyRAT,将指定它们的密码和顺序,如下所示:

这会在客户端Hello中产生不寻常且唯一的密码,从而生成唯一的JA3:

然后,我们可以以JA3为中心,增强它们的捕猎或响应行动。

但是,如果客户端应用程序使用通用库或操作系统套接字(如Python或Windows套接字)进行通信怎么办?JA3在环境中很常见,因此对检测不太有用。这就是JA3S可以帮助识别恶意通信的地方。

例如,Metasploit的Meterpreter和Cobalt Strike的Beacon都使用Windows套接字来启动TLS通信。对于Windows 10,即JA3=72a589da586844d7f0818ce684948eea(前往IP时)和JA3=a0e9f5d64349fb13191bc781f81f42e1(前往域时)。Windows上的其他合法应用程序使用相同的套接字,使得识别恶意通信变得困难。但是,与internet上的普通服务器响应此套接字的方式相比,Kali Linux上的C2服务器响应此客户机应用程序的方式是独特的。因此,如果我们将JA3 + JA3S结合起来,那么无论目标IP、域或证书详细信息如何,我们都能够识别这种恶意通信。搜索(在撰写本文时)可能如下所示:

Metasploit Win10 to Kali:[出自:jiwo.org]
(JA3=72a589da586844d7f0818ce684948eea OR

JA3=a0e9f5d64349fb13191bc781f81f42e1) AND

JA3S=70999de61602be74d4b25185843bd18e

Cobalt Strike Win10 to Kali:
(JA3=72a589da586844d7f0818ce684948eea OR

JA3=a0e9f5d64349fb13191bc781f81f42e1) AND

JA3S=b742b407517bac9536a77a7b0fee28e9

与所有事情一样,存在误报的风险。您可以将JA3看作是User-Agent字符串的TLS等效物。仅仅因为一个软件或恶意软件有一个特定的字符串并不意味着它对该软件来说总是唯一的。其他软件也可以使用相同的字符串。但是,没有理由不使用字符串来增强分析和检测。与其他网络元数据一样,JA3是用于丰富数据的额外信息。如果您正在寻找特定的内容,JA3S与JA3结合使用可以显著降低误报的水平。

渗透测试示例

在另一个例子中,我们有渗透测试人员使用Python版本的Empire作为他们选择的恶意软件。本例中的JA3将是Python的JA3,在任何开发人员环境中都不是唯一的。

如果我们要在整个环境中搜索这个JA3,结果看起来像这样:

但是,渗透测试员的C2服务器以一种独特的方式响应Python客户机。因此,当我们搜索Python的JA3和C2服务器响应方式的JA3S时,结果看起来更像这样:

我忘记截屏了,所以你只需要相信我,这就是Splunk的样子。

得到的输出是发送到C2服务器的恶意软件信标。正如您所看到的,JA3和JA3S的组合实际上创建了客户机和服务器之间加密协商的指纹。

在清除渗透测试人员之后,他们将C2映像移动到另一个IP和域名。然而,恶意软件和服务器仍然是相同的应用程序,因此指纹仍然是相同的。先前的检测立即起作用了。最后,渗透测试人员在一个完全不同的服务提供商中购买了空间,购买了一个看起来合法的新证书,购买了一个新域名,并将他们的C2映像移到了那里。立刻就发现了。

因为检测是基于基础设施和技术,而不是目标ip、域名或证书,所以我们不再需要依赖容易更改的传统ioc。这将把探测移动到David Bianco的痛苦金字塔的顶端,并增加对手的交战成本。

结论

JA3和JA3S是TLS指纹识别方法。JA3标记客户机应用程序通过TLS进行通信的方式,而JA3S标记服务器响应。结合起来,它们实际上创建了客户机和服务器之间加密协商的指纹。虽然对于基于tls的检测或到客户机应用程序的保证映射并不总是灵丹妙药,但它们作为分析的支点总是有价值的。

我们设计这些方法是为了使它们可以很容易地应用于现有的技术。生成的指纹易于使用和共享。BSD 3-Clause许可使其易于实现。我们只是想让它变得简单。在这样做的过程中,我们希望它成为您的防御武器库的有价值的补充,并激励其他人以我们的研究为基础,推动行业向前发展。

Zeek/Bro和Python版本的JA3和JA3S可以在github.com/salesforce/j上获得,以及其他实现了这些方法的工具的链接。

参考文献:

https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/

评论

暂无
发表评论
 返回顶部 
热度(54)
 关注微信