关键要点
- StormBamboo 成功入侵了一家互联网服务提供商 (ISP),以毒害目标组织的 DNS 响应。
- 不安全的软件更新机制旨在在运行 macOS 和 Windows 的受害者机器上秘密安装恶意软件。
- StormBamboo 部署的恶意软件包括 MACMA 恶意软件的新变种。
- 对 MACMA 最新版本的分析表明,MACMA 和 GIMMICK 恶意软件家族呈现融合发展。
- 后利用活动包括部署恶意浏览器扩展 RELOADEXT 来窃取受害者的邮件数据。
2023 年年中,Volexity 发现并应对了多起系统感染与 StormBamboo(又名 Evasive Panda,之前被Volexity 追踪为“StormCloud ”)相关的恶意软件的事件。在这些事件中,发现多个恶意软件家族被部署到受害组织网络中的 macOS 和 Windows 系统中。
该恶意软件的感染媒介最初很难确定,但后来证明是互联网服务提供商 (ISP) 级别的 DNS 投毒攻击的结果。Volexity 确定 StormBamboo 正在更改与自动软件更新机制相关的特定域的 DNS 查询响应。StormBamboo 似乎针对使用不安全更新机制(例如 HTTP)且未正确验证安装程序数字签名的软件。因此,当这些应用程序检索更新时,它们不会安装预期的更新,而是安装恶意软件,包括但不限于MACMA和 POCOSTICK(又名MGBot)。攻击者使用的整体工作流程与 Volexity 调查的先前事件类似,该事件归因于威胁行为者 DriftingBamboo,可能与 StormBamboo 有关。
2023 年 4 月,ESET 发布了一篇博客文章,介绍了 Volexity 自 2018 年以来一直跟踪的恶意软件家族 POCOSTICK。ESET 没有直接证据,但提出最有可能的感染源是中间人 (AiTM)。Volexity 现在可以在真实案例中证实这种情况,并证明攻击者能够控制目标 ISP 的 DNS 基础设施,从而修改受害组织网络中的 DNS 响应。
这篇博文解释了感染媒介,并给出了 StormBamboo 滥用自动更新的示例。请注意,这只是一个例子;威胁行为者修改了一系列应用程序的安装工作流程,这些应用程序的更新机制容易受到此类攻击。
概述
在 Volexity 调查的一次事件中,发现 StormBamboo 通过 HTTP 自动更新机制毒害 DNS 请求以部署恶意软件,并毒害用作第二阶段命令和控制 (C2) 服务器的合法主机名的响应。
DNS 记录被毒化,以解析为 IP 地址为 的位于香港的攻击者控制的服务器103.96.130[.]107
。最初,Volexity 怀疑最初的受害组织的防火墙可能已被破坏。然而,进一步调查显示,DNS 毒化不是在目标基础设施内进行的,而是在 ISP 级别的上游进行的。Volexity 通知了 ISP 并与其合作,后者调查了在其网络上提供流量路由服务的各种关键设备。随着 ISP 重新启动并使网络的各个组件脱机,DNS 毒化立即停止。在此期间,无法精确定位被破坏的特定设备,但基础设施的各个组件都已更新或脱机,活动停止了。
这并不是 Volexity 第一次遇到攻击者利用 DNS 中毒来促进对目标网络的初始访问。在2023 年 5 月的网络会议上,Volexity 介绍了一个名为 CATCHDNS 的恶意软件家族的详细信息,这是 DriftingBamboo 使用的 DNS 中毒恶意软件,部署到网络设备(在该实例中为 Sophos XG 防火墙)。Volexity 无法确认 StormBamboo 在 ISP 的路由器上使用了什么机制来修改 DNS 响应;但是,CATCHDNS 是 ISP 环境中实现此目标的精心设计的工具。CATCHDNS 的分析可以在附录中找到。
DNS 中毒:现在滥用不安全的自动更新机制!
在之前分析的 CATCHDNS 用来修改 DNS 响应的案例中,攻击的最终目标是修改用户浏览的页面内容。这会导致页面上弹出 JavaScript 警告,要求用户“更新浏览器”,从而从攻击者的服务器下载恶意文件。在最近的这个案例中,攻击者传播恶意软件的方法更加复杂,滥用受害者环境中软件中存在的不安全自动更新机制,因此不需要用户交互。
滥用自动更新的逻辑对于所有应用程序都是一样的:合法应用程序执行 HTTP 请求以检索包含最新应用程序版本和安装程序链接的文本文件(格式各不相同)。由于攻击者可以控制任何给定 DNS 名称的 DNS 响应,因此他们会滥用此设计,将 HTTP 请求重定向到他们控制的托管伪造文本文件和恶意安装程序的 C2 服务器。AiTM 工作流程如下所示。
Volexity 观察到 StormBamboo 针对多家软件供应商,这些供应商使用不安全的更新工作流程,在推送恶意软件的步骤中使用不同程度的复杂程度。例如,5KPlayer使用一种工作流程,每次启动应用程序时,二进制文件都会自动检查是否有新版本的“YoutubeDL”可用。下图显示了升级的 HTTP 请求Youtube.config
。
下图为升级内容Youtube.config
。
如果有新版本可用,则从指定的 URL 下载并由合法应用程序执行。StormBamboo 使用 DNS 投毒来托管修改后的配置文件,表明有新更新可用。这导致 YoutubeDL 软件从 StormBamboo 的服务器下载升级包。
正如人们所料,YoutubeDL 软件包已被植入后门,其方法是YouTubeDL.py
在升级过程中使用的文件中插入恶意代码。下图显示了从第 164 行开始插入的恶意代码。
其目的是下载下一阶段,即包含 MACMA(macOS)或 POCOSTICK(Windows)的 PNG 文件,具体取决于操作系统。
MACMA 于 2021 年由 Google TAG 首次公开记录。在此后的三年中,MACMA 发生了变化,增加了更多功能以方便操作员,并对其部分架构进行了彻底改造。例如,网络协议已完全改变。原始版本使用数据分发服务器 (DDS),该服务器在一系列以字符串“CDDS”为前缀的自定义类中实现。现在,MACMA 似乎使用kNET协议 UDP 进行网络通信。在 Volexity 的分析过程中,Volexity 注意到最新的 MACMA 版本与Volexity 之前描述的GIMMICK 恶意软件家族之间存在显着的代码相似性。
后续活动
在一个案例中,在成功入侵受害者的 macOS 设备后,Volexity 发现 StormBamboo 向受害者的设备部署了 Google Chrome 扩展程序。Volexity 使用名称 RELOADEXT 跟踪此恶意扩展程序。该扩展程序是使用ee28b3137d65d74c0234eea35fa536af
攻击者开发的自定义二进制文件 () 安装的。安装程序支持以下参数:
范围 | 描述 |
---|---|
-p / --plugin | 插件路径(必须是 ZIP 压缩包) |
-f / --force | 关闭 Chrome 并安装插件 |
Secure Preferences`通过修改文件以包含新扩展,即可部署浏览器扩展。安装程序还会正确修复新修改的 中的`protections.macs`和值。这些值旨在防止篡改用户的浏览器设置,但它们[可以被伪造](https://www.microsoft.com/en-us/security/blog/2020/12/10/widespread-malware-campaign-seeks-to-silently-inject-ads-into-search-results-affects-multiple-browsers/)。如果它们不包含预期的值,Chrome 将覆盖该文件。`protections.super_mac``SecurePreferences``SecurePreferences
传递给此工具的插件存储在以下位置:
$HOME/Library/Application Support/Google/Chrome/Default/Default/CustomPlug1n/Reload/
配置完成后就可以在用户的SecurePreferences
文件中看到,如下所示。
6abf9a7926415dc00bcb482456cc9467
最后,安装程序运行以下 AppleScript 命令来激活插件( ):
osascript -e tell application “Google Chrome” to activate
该扩展程序将自己描述为以与 Internet Explorer兼容模式加载页面的扩展程序:
该扩展程序使用的主要 JavaScript 逻辑使用Obfuscator.io进行混淆。该扩展程序的目的是将浏览器 cookie 泄露到攻击者控制的 Google Drive 帐户中。攻击者的 Google Drive client_id
、client_secret
和refresh_token
都包含在该扩展程序中。它们使用密钥为 的 AES 进行加密,超出了 Obfuscator.io 提供的默认加密范围chrome extension
。
发送到 Google Drive 的泄露数据也使用 AES 加密,使用密钥opizmxn!@309asdf
,并在泄露之前使用 base64 编码。
结论
StormBamboo 是一名技术高超、攻击性极强的威胁实施者,他通过入侵第三方(在本例中为 ISP)来攻击目标。该威胁实施者在各种活动中使用的各种恶意软件表明,他们投入了大量精力,不仅积极支持 macOS 和 Windows 的有效负载,还支持网络设备。
本博文中描述的事件证实了 ESET 对 POCOSTICK 恶意软件感染媒介的假设。攻击者可以拦截 DNS 请求并用恶意 IP 地址对其进行毒害,然后使用此技术滥用使用 HTTP 而非 HTTPS 的自动更新机制。此方法类似于 Volexity 之前观察到的 DriftingBamboo 在Sophos 防火墙遭到零日攻击后使用的攻击媒介。
为了检测此次特定攻击中使用的恶意软件,Volexity 建议采取以下措施:
- [使用此处](https://github.com/volexity/threat-intel/blob/main/2024/2024-08-02 StormBamboo/rules.yar)提供的规则来检测相关活动。
- [阻止此处](https://github.com/volexity/threat-intel/blob/main/2024/2024-08-02 StormBamboo/iocs.csv)提供的 IOC 。
附录
CATCHDNS 分析
CATCHDNS 是一种 32 位 ELF 恶意软件,针对 Linux 系统,它是在 Volexity 调查的一起案件中发现的,Volexity 将其归咎于 StormBamboo。CatchDNS 旨在部署在大多数网络流量经过的系统上。在 Volexity 调查的特定案例中,该恶意软件是在外围防火墙设备上发现的。但是,CATCHDNS 可以部署在任何支持使用的 Linux 设备上libpcap
。
经过初步分析,Volexity 发现该恶意软件已被完全剥离,并且库函数是静态链接的,因此进一步分析更加困难。CATCHDNS 将其配置作为加密档案存储在自身中。恶意软件解密档案并在运行时将其以名称 放在磁盘上[binary_name].tty
。然后,此档案在内存中解压缩,并删除磁盘上的副本。在分析的示例中,配置文件位于名为 的文件中dns.ini
。配置遵循INI 文件格式,该格式由包含键值对的各个部分组成。
CATCHDNS 配置可以包含以下部分:
部分 | 描述 |
---|---|
[收听_设备][发送设备] | 监听设备和发送设备部分下有一个“dev”键,其值指的是恶意软件拦截数据包和发送虚假数据包的接口。 |
[DNS域名] | 此部分包含“dns”键,其值代表要劫持其 DNS 的域。 |
[服务器IP] | 此部分包含“ip”键,其值是恶意软件成功劫持后被劫持域将解析到的 IP 地址。 |
[IP限制] | 此部分包含一个名为“ip”的键。定义此键后,恶意软件只会劫持来自此 IP 地址的请求。此选项仅适用于 HTTP 请求。 |
[HTTP配置] | 此部分很有趣,因为它是唯一包含多个键的部分。它定义了恶意软件拦截 HTTP 请求时使用的各种值。 |
数据包拦截
数据包拦截是 CATCHDNS 的一个关键组件。为了拦截数据包,它使用了libpcap
Linux 上用于数据包监控的通用库。恶意软件拦截数据包的设备/接口在配置中指定。它使用pcap_open_live
库函数打开设备以捕获数据包。它在设备上安装 BPF 过滤器,过滤程序pcap_compile
通过传递过滤字符串使用该函数 进行编译“(udp and dst port 53 ) or (tcp and dst port 80 or 8080)”
。该过滤器仅捕获端口 53 上的 UDP 数据包和端口 80 或 8080 上的 TCP 数据包。要实际安装此过滤器,它使用调用pcap_setfilter
。
一切设置完成后,CATCHDNS 会pcap_loop
使用处理程序函数作为参数进行调用。对于通过过滤器的每个数据包,都会使用数据包数据作为参数调用处理程序函数。此处理程序函数负责处理每个经过过滤的数据包,如下所示。
数据包处理函数检查以太网和 IPv4 报头,以确定它是 UDP 还是 TCP 数据包。根据数据包的 IPv4 协议,将调用process_udp_packet
或。process_tcp_packet
DNS劫持
分析完该process_udp_packet
函数后,很明显该函数专门处理 DNS 数据包。在处理网络数据包时,最好在 IDA 中创建数据包结构并在分析时应用它们。这样可以轻松理解整个逻辑。DNS 数据包由以太网报头、IP 报头和 UDP 报头组成,然后是 DNS 报头和 DNS 数据。利用这些知识,将这些结构应用于处理函数,以揭示解析 DNS 报头的函数并执行基本的健全性检查,如下所示。
每个 DNS 数据包都包含出现在数据包中 DNS 标头后面的查询。查询包含有关客户端请求 DNS 信息的域的信息。恶意软件解析 DNS 查询并检索发出 DNS 请求的域名。获得域名后,将其与恶意软件配置中存在的 DNS 域进行比较。如果匹配,则劫持 DNS 请求,恶意软件会构建一个假的 DNS 响应数据包。然后,它将数据包发送回客户端,使用攻击者控制的 (C2) IP 地址而不是合法 IP 地址进行响应。以下函数用于构建假 DNS 数据包并将其发送到客户端:
HTTP 拦截和模拟响应
该process_tcp_packet
函数用于拦截 HTTP 请求。攻击者可以使用各种配置选项调整拦截。恶意软件可以拦截 GET 和 POST 请求。如前所述,还可以使用 将 HTTP 拦截限制为给定的 IP 地址IPLimit
。HTTP 拦截的工作原理与 DNS 拦截类似。如果请求满足指定的条件,恶意软件将构建 HTTP 模拟响应并将其发送回客户端。可以通过恶意软件配置来配置响应,攻击者可以配置硬编码页面以响应特定请求。
要成功响应虚假 HTTP 响应,必须满足配置中指定的所有条件。可以在中指定以下键HTTPConfig
:
url
host
ua
(用户代理)content-type
otherhead_%s
sendlimit
configfile
可以使用键指定要解析和检查的其他标头otherhead_%s
,其中%s
表示标头名称。sendlimit
键定义恶意软件将响应满足配置的请求的次数。一旦超过此限制,恶意软件将不再修改对与模式匹配的请求的响应。configfile
如果满足所有条件,键包含要提供的网页的路径。
配置示例
Volexity 能够在入侵期间遇到的 CATCHDNS 样本从磁盘中删除之前对其进行拦截,从而提取所有配置。下图显示了提取配置的一个示例。
上述配置会拦截设备上的所有 DNS (53) 和 HTTP (80 和 8080) 数据包Port1
。它会劫持www.msftconnecttest[.]com
域并响应122.10.90[.]20
该域的 IP 地址。在 中HttpConfig
,“主机”键不存在,这意味着如果满足其他条件,恶意软件会拦截对任何主机的 HTTP 请求。这只是观察到的几种配置之一;据观察,攻击者使用恶意软件提供的各种选项来实现各种目标。