CVE-2025-33053、Stealth Falcon和Horus:中东网络间谍活动的传奇
关键发现
Check Point Research(CPR)发现了APT组织Stealth Falcon进行的新攻击活动。该攻击使用了一个.url文件,利用零日漏洞(CVE-2025-33053)从攻击者控制的WebDAV服务器执行恶意软件。
CVE-2025-33053允许通过操纵工作目录实现远程代码执行。在CPR负责任地披露后,微软于2025年6月10日发布了补丁,作为其6月补丁星期二更新的一部分。
Stealth Falcon的活动主要集中在中东和非洲地区,在土耳其、卡塔尔、埃及和也门观察到政府及国防部门的高价值目标。
Stealth Falcon继续使用鱼叉式钓鱼邮件作为感染方法,通常包含利用WebDAV和LOLBins部署恶意软件的链接或附件。
Stealth Falcon部署基于开源红队框架Mythic的自定义植入物,这些植入物要么源自现有代理,要么是我们称为Horus Agent的私有变体。这种定制不仅引入了反分析和反检测措施,还在最终交付更高级有效载荷之前验证目标系统。
此外,该威胁组织还使用了多个先前未披露的自定义有效载荷和模块,包括键盘记录器、被动后门和DC凭据转储器。
引言
2025年3月,Check Point Research发现了一起针对土耳其一家国防公司的未遂网络攻击。威胁行为者使用了一种先前未披露的技术,通过操纵合法内置Windows工具的工作目录,执行托管在他们控制的WebDAV服务器上的文件。经过负责任地披露,微软将该漏洞分配为CVE-2025-33053,并于2025年6月10日发布了补丁,作为其6月补丁星期二更新的一部分。基于战术、技术和程序(TTP)、基础设施、代码重叠和目标配置文件,我们将此活动归因于Stealth Falcon威胁组织。
Stealth Falcon(也称为FruityArmor)是一个高级持续性威胁(APT)组织,以进行网络间谍活动而闻名,至少自2012年以来一直活跃。多年来,观察到Stealth Falcon获取零日漏洞利用并使用复杂的自定义有效载荷,在其网络间谍活动中针对中东地区的实体。
在本报告中,我们分析了Stealth Falcon近年来使用的感染链,包括基于WebDAV的CVE-2025-33053利用,以交付Horus Agent,这是一个为Mythic C2(命令与控制)开源框架构建的自定义植入物。Horus Agent以埃及天空之神Horus命名,通常被描绘为鹰头人,代表了该组织先前使用的定制Apollo植入物的演进。我们还重点介绍了该威胁组织高级间谍工具集中几个先前未披露的自定义后利用工具和模块的功能。
感染链:CVE-2025-33053和.url文件
一个名为TLM.005_TELESKOPIK_MAST_HASAR_BILDIRIM_RAPORU.pdf.url(土耳其语翻译:TLM.005望远镜桅杆损坏报告.pdf.url)的文件由与一家主要土耳其国防公司相关的来源提交到VirusTotal。基于名称模式和Stealth Falcon攻击的先前历史,此.url文件很可能作为钓鱼邮件中的存档附件发送。文件内容:
|
|
此互联网快捷方式文件中的URL参数指向iediagcmd.exe,这是一个合法的Internet Explorer诊断实用程序。
通常,运行时,此实用程序会生成其他进程以收集诊断数据,例如:
|
|
使用标准的.NET Process.Start()方法:
图1 – 合法的iediagcmd.exe生成辅助进程。LaunchProcess函数在底层使用标准的.NET Process.Start()方法。
根据搜索顺序,Process.Start()函数首先在调用应用程序的当前文件夹中搜索要运行的可执行文件。由于工作文件夹被.url更改为攻击者控制的WebDAV服务器路径WorkingDirectory=\summerartcamp[.]net@ssl@443/DavWWWRoot\OSYxaOjr,iediagcmd工具将运行攻击者放置在\summerartcamp[.]net@ssl@443/DavWWWRoot\OSYxaOjr\route.exe的route.exe可执行文件,而不是system32文件夹中的合法文件。
我们在报告中稍后分析的恶意软件中的一些工件表明,威胁行为者还以类似方式滥用另一个合法可执行文件CustomShellHost.exe,导致其从其工作文件夹生成explorer.exe。
类似的通过.url文件和DLL劫持从远程服务器加载DLL的技术之前已被讨论过,但直到现在我们才观察到其与可执行文件一起使用。向微软报告后,该问题被分配为CVE-2025-33053。
执行.url文件后,会触发以下多阶段感染链:
图2 – 感染链。
Route.exe – Horus加载器
从攻击者WebDAV服务器执行的恶意文件route.exe充当多阶段加载器。它用C++编写,并使用Code Virtualizer,这是一个代码保护系统,将代码转换为自定义虚拟机(VM)指令,这使得逆向工程师难以分析或修改。它是Themida保护器的较轻版本,Stealth Falcon先前大量使用,但缺少Themida的额外混淆、反调试、防篡改和反挂钩功能。加载器已签名,但使用过时的签名,没有TSA时间戳,可能是为了防止某些安全产品对使用Code Virtualizer或Themida的未签名样本进行自动检测。
图3 – Horus加载器的数字证书。
Horus加载器高度可定制,默认值格式为’XXXXXX’,控制其每个功能:
- 清理先前阶段的工件
- 实施规避
- 投放并执行诱饵文档
- 加载最终有效载荷
清理
加载器的代码包括终止其执行早期阶段的进程的选项。在我们分析的样本中未使用任何这些。然而,此taskkill选项使我们能够推断加载器还打算如何执行:
图4 – 默认字符串(KILKIL)可以在编译时由操作员修改,以终止特定早期阶段的进程。例如,将KILKIL更改为IEGIEG将允许他们杀死iediagcmd.exe。
我们假设在此样本中未使用它,因为加载器有另一个清理选项,该选项使用两个动态创建的目标进程来终止。
图5 – 使用动态创建常量终止指定进程的代码。
此代码似乎有一个错误:不是终止先前阶段的进程,而是将两个全局常量错误地设置为“i”和“e”。结果,加载器总是尝试终止不存在的进程:
|
|
规避
Horus加载器手动映射kernel32.dll和ntdll.dll以用于反分析/反调试目的。
它还扫描运行中的进程以查找安全解决方案。如果检测到防病毒进程,则使用基于枚举的值设置全局变量,代表安装的供应商。检查针对来自17个不同供应商的109个进程名称列表执行。
图6 – 枚举进程以搜索安全解决方案的代码部分。
根据预定义标志,它可以然后决定是否基于安装的安全供应商立即停止执行:
图7 – 基于安全供应商决定停止执行的代码。
诱饵文档解密和执行
有五种不同的执行诱饵的方法,但在针对土耳其公司使用的样本代码中,仅实现了一种:
图8 – 诱饵执行条件。
在这种情况下,诱饵或诱惑是一个存储在.udata部分中的PDF文件。加载器在内存中解密整个.udata部分,然后将解密的PDF文件写入文件%temp%\TLM.005_TELESKOPIK_MAST_HASAR_BILDIRIM_RAPORU.pdf,并使用cmd.exe打开它:
图9 – 诱惑PDF文档。
有效载荷执行
当受害者查看诱惑文档时,加载器继续在后台执行恶意感染链。
主有效载荷存储在.xdata部分中。加载器解密它,但而不是预期的shellcode或PE文件,显示的是一个大列表的IPv6地址:
图10 – Horus加载器内有效载荷的IPfuscation。
然后使用数千次对函数RtlIpv6StringToAddressA的调用将这些IPv6地址转换为有效载荷,该函数将IPv6地址转换为字节。这是一种称为“IPfuscation”的已知技术。接下来,加载器创建一个挂起进程:“C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe”。它将有效载荷分配并写入进程,然后切换主线程的执行上下文。所有这一切都在虚拟机内发生,但Tiny Tracer在我们的分析中非常有用:
|
|
将shellcode注入目标进程后,继续通过自制的基于块的密码解密另一个blob。解密块的密钥和其他属性存储在shellcode中:原始区域、大小、密钥、校验和等。解密后,我们可以看到带有部分PE文件的blob:
图11 – 压缩的有效载荷DLL。
解密的blob需要预加载某些DLL,例如shell32.dll。shellcode解压缩有效载荷DLL,手动将其映射到内存中,并执行其_1导出。
Horus Agent:自定义Mythic植入物
最终有效载荷是为Mythic构建的自定义代理,Mythic是一个开源红队C2框架。用C++编写的植入物与已知的基于C的Mythic代理没有显著重叠,除了与Mythic C2通信相关的通用逻辑。这就是为什么,类似于其他以希腊神命名的Mythic植入物,我们将此自定义植入物命名为Horus,以埃及鹰头人之神命名。
代码混淆和反分析技术
虽然加载器确保实施一些措施来保护有效载荷,但威胁行为者在后门本身内部放置了额外的预防措施。
Horus Agent使用似乎是自定义的OLLVM,同时使用字符串加密和控制流平坦化。字符串使用简单的移位密码编码,从每个字符中减去39,但自动化字符串解密可能非常具有挑战性,因为加密字符串可以驻留在堆栈上或通过指向数据部分的指针引用:
图12 – 从加载的Windows模块检索和解密混淆字符串的代码。
此例程也进入控制流平坦化,使反编译输出看起来相当混乱和无用。
图13 – 结合控制流平坦化的字符串解密。
由于大多数字符串存储在.rdata部分中,我们可以直接从那里解密它们,并在执行期间跳过分析解密例程。这些解密例程通常在函数开头运行,后跟实际的函数逻辑,因此我们可以简单地从.rdata解密字符串,然后继续函数的核心功能。
图14 – 解密的字符串。
Horus Agent还实现了API哈希,类似于其他行为者的有效载荷。Horus首先为所需函数创建一个结构,为每个分配一个哈希值,然后一次性解析它们。后门使用多个导入解析结构进行各种操作,包括解密、网络、COM、令牌操作等。每个结构仅在使用时解析。
图15 – API哈希。
在开始任何恶意活动之前执行的第一个函数实际上什么都不做。它包含对各种Windows DLL函数的调用,如GDI32、Winspool、User32等,但这些函数在运行时从未实际执行。
图16 – 植入物的未使用导入。
这可能是为了混淆静态分析引擎,因为包含看起来无害且常见的Windows API导入使DLL更类似于合法的Windows组件。相同的技术在先前的Stealth Falcon后门中观察到。
图17 – 某些API的条件执行,在正常情况下从不运行。
配置和C2通信
所有C2配置字段都存储在植入物中,并使用RC4解密。每个字段使用共享的RC4密钥单独解密,该密钥基于其索引进行修改。有效载荷中存在的另一个选项是通过解密JSON然后加载它来加载配置。
可能,自定义C2服务器配置基于httpx Mythic配置文件,该配置文件支持多个域、带有HMAC的AES加密以及Horus代理中包含的其他功能。配置可以大致由以下结构表示:
|
|
UUID是一个硬编码参数,在构建代理时生成。如果设置了create_mutex标志,后门会创建一个与配置中UUID相同样本名称的互斥体。
Mythic代理通常有3种类型的消息发送到C2服务器:
- 代理向C2服务器检入 – 在我们的案例中,使用GET端点和查询参数(/PjH1BHszPooXyiHS3s?jNNsw=),数据在查询值中发送。
- 代理轮询其任务 – 使用GET端点和查询参数,数据在查询值中发送
- 代理发送响应 – 使用POST端点,数据在正文中发送。
自定义代理不更改协议。安装后,代理需要在服务器上注册(检入)。它收集受感染机器的初始信息,如用户名、操作系统、域等。所有数据收集到一个JSON中,如下所示:
|
|
发送的数据使用带有HMAC的AES加密以确保完整性。如何选择此加密可能源于威胁行为者使用的C2配置文件。首先,生成一个随机IV,并使用配置中的密钥和生成的IV加密明文。接下来,计算IV和加密JSON的HMAC-SHA256校验和以确保数据完整性。最后,UUID被预置到数据中。数据包可以结构如下:
|
|
整个数据包经过base64编码,并在查询字符串中发送到C2服务器。C2服务器应响应类似的base64编码和加密的网络数据包。这是解密后的JSON的样子:
|
|
从这一刻起,服务器和代理之间的所有通信都在数据包开头使用新接收的机器人ID。
C2命令
检入成功后,后门进入一个无限循环,检索C2命令(在Mythic C2协议语言中为get_tasking操作)。Horus Agent支持这些命令:
| C2命令 | 参数 | 是否自定义 | 描述 |
|---|---|---|---|
| jobs | 无 | 否 | 发送所有运行作业的文本可视化。 |
| survey | 无 | 是 | 收集有关系统的更多信息。 |
| config | 睡眠/抖动/通信超时,新值 | 是 | 更新配置值。 |
| exit | 无 | 否 | 退出程序。 |
| ls | 路径 | 否 | 列出目录下的文件/文件夹。 |
| shinject | 分块进程名称,shellcode,隐身模式 | 是 | 将shellcode注入同一进程或不同进程。 |
| jobkill | 作业ID | 否 | 强制终止作业。 |
| upload | 从C2上传到客户端的文件数据,保存文件的路径 | 否 | 从C2服务器下载文件。 |
Survey:自定义枚举函数
survey命令是一个自定义系统枚举函数,收集有关以下数据:
- 服务:使用WMI查询SELECT * FROM Win32_Service WHERE State=‘Running’与ROOT\CIMV2命名空间收集有关运行服务的信息,并保存字段DisplayName和ServiceName。
- 电池:使用函数GetSystemPowerStatus,然后解析返回的SYSTEM_POWER_STATUS结构。示例输出如下所示:
|
|
- 用户:检索%USERPROFILE%路径并提取用户名。
- 进程:使用Windows API收集进程ID、架构、名称、运行用户、路径和父进程ID。
- 网络配置:使用FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = ‘True’查询ROOT\CIMV