Nimbus Manticore对欧洲部署新型恶意软件
关键发现
Check Point Research正在追踪伊朗威胁组织Nimbus Manticore的长期攻击活动,该组织与UNC1549、Smoke Sandstorm和"Iranian Dream Job"行动存在重叠。持续进行的攻击活动针对符合伊朗革命卫队战略优先级的国防制造、电信和航空领域。
Nimbus Manticore近期活动显示其对西欧的关注度提升,特别是丹麦、瑞典和葡萄牙。该威胁组织冒充本地和全球航空航天、国防制造和电信组织。
攻击者使用来自所谓HR招聘人员的定制鱼叉式网络钓鱼,将受害者引导至虚假招聘门户。每个目标都会收到独特的URL和凭据,实现对每个受害者的跟踪和受控访问。这种方法展示了强大的操作安全性和可信的借口制造。
攻击者使用先前未记录的低级API建立多阶段DLL侧加载链。这导致合法进程从不同位置侧加载恶意DLL,并覆盖正常的DLL搜索顺序。
Nimbus Manticore工具集包括MiniJunk后门和MiniBrowse窃密器。这些工具持续演进以保持隐蔽,利用有效数字签名、膨胀二进制文件大小,并使用多阶段侧加载和重度编译器级混淆,使样本对于常规高级静态分析变得"不可逆"。
总体而言,该活动反映了一个成熟、资源充足的攻击者,在交付、基础设施和有效载荷层优先考虑隐蔽性、弹性和操作安全性,这种方法与国家级攻击手法一致。
简介
自2025年初以来,Check Point Research(CPR)一直在追踪Nimbus Manticore的活动浪潮。被称为UNC1549或Smoke Sandstorm的Nimbus Manticore是一个成熟的伊朗关联APT组织,主要针对中东和欧洲的航空航天和国防组织。其部分操作先前也被描述为Iranian DreamJob活动。
Nimbus Manticore活动的特点是高度针对性的网络钓鱼活动,导致部署定制植入程序,包括Minibike。Minibike(也称为SlugResin)自2022年6月由Mandiant首次报告以来,自创建以来稳步发展。多年的样本分析显示其进展,包括添加混淆技术以逃避检测和静态分析、模块化架构以及引入冗余命令与控制(C2)服务器。
最新的Minibike变种表明攻击者能力显著提升,包括使用新颖(且先前未记录)的技术,通过修改进程执行参数从备用路径加载DLL。该变种具有新的TTP,如大小膨胀、垃圾代码、混淆和代码签名以降低检测率。
在本文中,我们重点介绍Minibike演变为名为MiniJunk的新变种。我们还研究了Nimbus Manticore保护伞内的一个独特集群,该集群针对不同部门并采用独特的域名命名约定,同时继续使用类似的鱼叉式网络钓鱼技术并共享恶意软件资源。
在我们完成本出版物时,PRODAFT发布了一份关于Subtle Snail的全面报告,这是一个与伊朗有联系的间谍组织。在本出版物中,我们在名为"独立活动集群"的章节中讨论了Subtle Snail。虽然该集群采用的战术、技术和程序(TTP)与在Nimbus Manticore操作中观察到的广泛一致,但其独特的恶意软件功能、命令与控制(C2)基础设施和 targeting偏好使其与众不同。
恶意软件交付网站
攻击从网络钓鱼链接开始,将受害者引导至虚假的招聘相关登录页面:
图1 – 成功登录后用于传递恶意存档文件的网站
攻击者用于诱骗求职者的基础设施基于React模板,根据冒充的品牌(如波音、空客、莱茵金属和flydubai)而变化。
域名命名约定通常以"career"为主题,并在Cloudflare后面注册,很可能是为了保密真实服务器IP。
这些登录面板的凭据与登录页面链接一起预先共享给受害者。输入凭据并点击登录按钮后,将向/login-user API发送POST请求。如果凭据不正确,则返回401 Unauthorized响应。否则,用户将下载带有恶意软件的恶意存档文件。
感染链
受害者下载的恶意存档文件通常伪装成合法的招聘流程相关软件。在以下示例中,名为Survey.zip的ZIP存档启动了一个复杂的感染链。执行链利用了我们称之为多阶段侧加载的独特技术:
图2 – 感染链
感染链包括以下阶段:
- 用户执行:受害者从存档中运行Setup.exe。这是一个合法的Windows可执行文件,从同一存档侧加载userenv.dll。
- 恶意软件设置:Setup.exe启动另一个良性二进制文件,即名为SenseSampleUploader.exe的Windows Defender组件。该可执行文件随后从存档目录侧加载恶意软件加载程序xmllite.dll。
- 持久化:加载程序将Setup.exe以其原始名称MigAutoPlay.exe及其侧加载的恶意userenv.dll复制到恶意软件工作目录%AppData%\Local\Microsoft\MigAutoPlay\。它创建一个计划任务来运行该可执行文件。
图3 – 从虚假招聘网站下载的恶意ZIP存档内容
恶意软件设置阶段的Userenv.dll
一旦初始Setup可执行文件运行,它从同一文件夹侧加载userenv.dll。DLL首先检查正在执行的PE模块的名称以确定感染链的当前阶段。这样,如果DLL不是从MigAutoPlay.exe运行(意味着后门的设置尚未发生),它将以特殊方式加载Loader DLL,利用未记录的低级API劫持DLL加载路径。
userenv.dll使用低级ntdll API调用来执行位于C:\Program Files\Windows Defender Advanced Threat Protection\SenseSampleUploader.exe的Windows Defender二进制文件。由于使用xmllite.dll的相对路径,Windows Defender可执行文件容易受到DLL劫持。此漏洞被滥用以侧加载xmllite.dll。然而,作为独特的多阶段侧加载攻击链的一部分,攻击者设法从恶意存档的同一文件夹侧加载它。
通常,合法的Windows Defender可执行文件不会从Windows DLL搜索顺序路径之外的文件夹加载随机DLL。那么,这里发生了什么?
当使用低级NT API调用创建进程时,必须调用RtlCreateProcessParameters来构建进程参数结构RTL_USER_PROCESS_PARAMETERS,然后将其交给RtlCreateUserProcess。此结构中的关键字段是DllPath参数,它定义了进程加载程序用于定位和解析导入模块的搜索路径。如果设置,它指定了如果在应用程序目录中找不到DLL,加载程序应搜索DLL的位置。
恶意软件通过使用GetModuleHandle获取Setup.exe的路径,然后将其作为DllPath参数提供来滥用此未记录的功能。由于setup.exe和xmllite.dll在恶意存档中彼此相邻,当在SenseSampleUploader.exe旁边找不到dll时,它将从存档目录加载:
图4 – Windows Defender SenseSampleUploader.exe组件搜索xmllite.dll,导致其从存档文件夹加载
一旦xmllite.dll被加载,其操作非常简单。它在路径AppData\Local\Microsoft\MigAutoPlay\下创建一个工作文件夹。它将后门userenv.dll复制到其中,还将合法可执行文件作为MigAutoPlay.exe放置在那里,然后添加一个自动运行注册表键以执行良性可执行文件。
图5 – userenv.dll的侧加载
持久化完成后,恶意软件通过MigAutoPlay.exe启动,该程序侧加载userenv.dll并向受害者显示一个关于网络问题阻止诱饵程序运行的虚假错误弹出窗口。
图6 – 恶意软件设置过程结束时的虚假错误
后门:MiniJunk
在过去一年中,攻击者对后门进行了许多更改,该后门最初由Mandiant记录为"Minibike"。我们选择将此样本跟踪为"MiniJunk"。
userenv.dll后门核心逻辑从DLLMain函数开始。后门首先解析许多其功能所需的导入,但奇怪的是,当它想要使用已解析的函数时,它会再次解析它。这种行为不寻常,但可能在开发周期中用于识别API解析问题。然后后门从受感染系统收集两个标识符:计算机名称和带有用户名的域名。
尽管样本采用了大量混淆(下一节将详细讨论),但它不加密网络数据。相反,它对其进行编码。我们过去看到过类似样本,它们对网络数据使用简单加密,例如与几个字节的XOR。然而,在这种情况下,它使用简单的编码算法:数据在宽字符串中收集,然后转换为字节,并将字节反转。最后,整个字符串被反转。
当主逻辑开始时,后门检查运行的可执行文件是否称为MigAutoPlay.exe(意味着后门从其永久工作目录设置后运行),并将ExitProcess函数挂钩到一个睡眠函数,可能防止致命退出或允许其他线程在程序崩溃时运行:
图7 – ExitProcess函数挂钩
初始化后,后门启动一个处理网络和剩余逻辑的主线程。在此部分分析样本非常棘手:逻辑通过利用各种状态的函数严重分支,例如,大量用于网络请求的类,以及结合库函数的混淆。然而,所有这一切最终掩盖了简单的后门功能。
命令与控制
后门变种通常利用多个命令与控制(C2)服务器轮换以实现冗余。有几个(三到五个之间)硬编码的C2服务器,因此如果一个C2宕机,将使用列表中的下一个。后门使用Windows API的常规HTTPS请求。当C2响应时,会创建一个线程来解析C2请求。C2使用编码字符串响应,类似于初始网络数据。响应结构由由##分隔的字符串组成。它由后门解析并拆分为字符串向量。大多数C2命令需要3个值:
- 命令设置
- 命令ID
- 命令参数
例如,“读取文件"命令如下所示:
##[块大小]##[读取文件命令id]##[文件路径]
解析命令后,在这种情况下,后门根据作为参数提供的块大小,通过几个网络请求从指定路径发送文件。后门支持以下命令:
命令ID | 描述 | 参数 |
---|---|---|
0 | 收集计算机名称、带有用户名的域名 | 无 |
1 | 获取计算机名称 | 无 |
2 | 读取文件并发送回 | 文件路径/块 |
3 | 创建文件 | 文件路径,C2上的文件URL |
4 | 列出硬盘驱动器/列出文件夹中的文件 | 列出所有硬盘驱动器的字符串或列出目录路径中所有文件的目录路径 |
5 | 删除文件 | 文件路径 |
6 | 创建进程并使用命名管道进行输出 | 进程路径 |
7 | 加载DLL | DLL路径 |
8 / 9 | 无操作/占位符 | 无 |
10 | 移动/重命名文件 | 文件目标,文件目的地 |
11 | 未实现 | 无 |
从功能可以看出,这些对于后门来说相当标准。样本中真正的复杂性来自它们的混淆,这使得样本更难分析。
MiniBrowse – 窃密器组件
MiniBrowse是Nimbus Manticore使用的轻量级窃密器。我们观察到两个变种,一个用于窃取Chrome凭据,另一个针对Edge。两个版本都是DLL,设计用于注入浏览器以窃取存储的密码。
执行后,MiniBrowse首先从系统收集两个标识符,用户名和域名,然后连接到C2服务器上的预定义端点,以JSON有效负载发送数据。
图8 – MiniBrowse发送受害者数据
我们识别出独特的网络通信行为,因为C2需要用除200之外的任何HTTP响应进行响应。如果这样,后门继续执行,查找与Edge登录数据相关的几个文件。
然后使用简单的POST请求将这些文件中的每一个外泄到C2:
图9 – MiniBrowse外泄从Edge浏览器窃取的数据
发送这些文件的另一种方法是通过连接并将JSON发送到命名管道。我们识别出多个支持此功能的MiniBrowse版本。
混淆
我们研究的MiniJunk和MiniBrowse样本表现出重度编译器级代码混淆,可能通过自定义LLVM传递实现。我们必须处理几种混淆技术以促进分析,包括垃圾代码插入、控制流混淆、不透明谓词、混淆函数调用和加密字符串。攻击者投入大量精力开发这些LLVM传递并继续改进它们;每个样本"代"都显示出对前一代的改进,通常在活动之间引入。攻击者似乎针对大量受害者,这些混淆帮助恶意软件保持未被检测,同时减慢研究人员确定样本行为的速度。与大多数混淆一样,没有单一工具处理所有情况:现成工具通常失败,除非方案匹配通用框架,如OLLVM – 这里情况并非如此。这强调了攻击者愿意投资于其工具集,反之,通过暴露新技术使研究人员受益。我们投入大量精力使样本足够"可逆"以进行分析。
函数调用混淆
后门包含编译器级混淆。因此,几乎所有的函数调用都被混淆。关于调用什么函数的决定基于几个算术运算,然后存储在RAX寄存器中。以下是DLL主要函数的示例:
图10 – 带有混淆函数调用的DLL主要函数
混淆控制流
不仅函数调用被混淆,而且函数内部还有混淆的分支。
在下一个示例中,有一条JMP RAX指令,但它不是单个JMP。根据代码运行时满足的各种条件,JMP可以导致两个不同的地方,就像条件JMP一样,但被掩盖为单个JMP。
图11 – 混淆分支
字符串加密
每个字符串都使用自己的密钥单独加密。加密字节存储在内存中,密钥放在每个字符串的末尾。每个字符串都有自己的解密函数,增加了另一层复杂性。最重要的是,每个解密例程都重载了不透明谓词:
图12 – 字符串加密
我们使用LLM简化上述函数。最终加密算法只是string[i] ^ key[i % key_length]
。一旦我们确定了这一点,我们就能够自动化并解密所有字符串。
垃圾代码
样本包含一些未使用的垃圾代码:
图13 – 带有垃圾代码的函数
独特的模式帮助我们推断,一个指令"块"可以被分类为垃圾代码,在代码中高度重复。然后我们可以在反编译视图中排除它,并继续静态分析:
图14 – 没有垃圾代码的相同函数
MiniJunk的演变
在过去一年中,MiniJunk经历了许多变化并采用了各种技术。在本节中,我们描述最重要的变化。
签名
5月,Nimbus Manticore开始使用SSL.com服务对其代码进行签名。这导致检测率急剧下降,许多样本在多个恶意软件引擎中仍无法检测。
根据签名日期和我们对此证书签名样本的分析,我们确定它们是由威胁参与者生成的,冒充欧洲现有的IT组织。
命令与控制
6月,攻击者重新架构C2以结合Cloudflare和Azure App Service。这提高了弹性,因此即使提供商或域被暂停,执行也可以继续。
文件大小和检测
大型恶意软件文件通常具有较低的端点检测,因为许多防病毒引擎强制执行时间、大小和资源限制,这些限制会截断对超大输入的深度解包、仿真和启发式层。Nimbus Manticore通过用惰性垃圾代码块膨胀二进制文件来利用这一点。特征提取和ML模型经常将分析限制在文件的第一部分,因此填充将判别字节模式推过这些限制,而某些引擎只是跳过或降级扫描大文件以避免误报和性能影响。混淆、大小和代码签名的结合导致端点检测率较低。如您所见,一些最大的样本在VirusTotal上保持零检测:
图15 – VirusTotal上零检测的MiniJunk
独立活动集群
除了我们在本博客前面描述的涉及MiniJunk后门的操作外,我们还观察到一个独立但密切相关的活动集群。该集群首先由PRODAFT报告,采用的TTP与上述记录的大体一致,但以更小的有效载荷和缺乏复杂混淆为区别。
鱼叉式网络钓鱼邮件
Check Point Harmony Email & Collaboration平台识别并阻止了针对以色列电信提供商的鱼叉式网络钓鱼攻击。
如过去入侵中记录,攻击者使用LinkedIn等专业社交媒体,冒充HR专家,然后要求目标转移到另一个平台,如电子邮件。
从Outlook帐户发送的带有职位申请邀请的恶意电子邮件:
图16 – Nimbus Manticore发送的恶意电子邮件
如先前在其他Nimbus Manticore活动中观察到的,链接导致基于React的虚假招聘登录页面:
图17 – 登录后传递恶意软件的虚假页面
有效载荷
此操作中使用的恶意软件通过DLL劫持dxgi.dll传递:
图18 – 恶意软件文件夹内容
恶意软件字符串通过使用简单单字节XOR与0x55进行混淆。
执行开始于解密5个预定义的C&C服务器:
|
|
图19 – C2域加密
尽管感染链步骤和基础设施重叠,但dxgi和MiniJunk实现了不同的命令集。同时,dxgi不展示规避或混淆技术。所有这些表明可能是由多个参与者进行的并行活动。
命令ID | 行为(高级) |
---|---|
0 | 无操作 |
1 | 获取计算机名称 |
2 | 获取用户名 |
3 | 列出目录中的文件和文件夹 |
4 | 删除文件 |
5 | 移动/重命名文件 |
6 | 枚举硬盘驱动器 |
7 | 上传文件 |
8 | 获取运行进程列表 |
9 | 终止进程 |
10 | 执行bat/exe/cmd命令/加载dll |
11 | 创建进程并使用命名管道进行输出 |
12 | 加载DLL |
与MiniJunk的比较
dxgi.dll和MiniJunk样本在多个细节上重叠:它们以非常相似的方式挂钩退出进程,并且它们都收集用户名和桌面名称(但新样本还收集适配器信息)。
在C2通信方面,关键相似之处在于两个领域:从C2服务器解析网络响应,以及C2命令集。
从C2到MiniJunk的响应使用各种分隔符用于数据,例如###或—。dxgi.dll后门包括通过使用FNV哈希其中一个参数并将结果与生成的值进行比较来验证请求。总体而言,这些后门之间的C2通信并不相同,但仍然非常相似。
两个版本中的C2命令彼此非常相似,具有非常相似的逻辑和函数本身内操作顺序相同。虽然命令ID不同,但底层代码库似乎是相同的。
关于显著差异,对于网络通信,dxgi.dll添加了一层加密。此外,后门利用WinHTTP API,但与使用类和分支网络请求的MiniJunk不同,此后门在单个函数内处理所有网络逻辑。最后,后门开发人员似乎没有费心更改用户代理,而是保持原样WinHTTP示例:
图20 – 使用WinHTTP API和示例用户代理的网络通信
上述发现表明dxgi.dll与MiniJunk版本共享公共代码库。两个活动集群都可能访问代码库,并可以根据需要修改代码,添加编译器传递,并稍微改变逻辑。同时,编程范式保持相似。由于MiniJunk混淆、HTTP请求方法的不同布局(类与非类)以及其他变化,这一点起初很难注意到。但一旦解决了混淆,很明显它们共享相同的代码库。
基础设施
MiniJunk活动使用azurewebsites[.]net的长连接健康主题子域。值得注意的是,此活动中的域名命名约定不同:独特域模式是[a-z]-[a-z]+-[a-z]+-[0-9]{3}.azurewebsites.net,结合了由连字符分隔符连接的多个单词。
在搜索这些域名命名约定时,我们观察到一组独特的用于针对欧洲的域,具有以下恶意域序列:
- telespazio-careers[.]com – 诱饵网站
- update-health-service[.]azurewebsites[.]net – 首次观察到的Azure应用服务域(由PRODAFT提及)
我们能够捕获以下域块,我们认为每个样本都是唯一的:
|
|
基于azurewebsites的C2基础设施为攻击者提供了灵活性和冗余;如果一个C2宕机,他们可以轻松设置新的。
受害者分析
虽然Nimbus Manticore始终针对中东,特别是以色列和阿联酋,但最近的活动显示对西欧的兴趣增加。我们发现了恶意软件交付网站与目标部门之间的相关性。例如,电信公司的虚假招聘门户将针对该部门的员工和组织。我们的发现指向几个关键部门的类似目标:电信(特别是卫星提供商)、国防承包商、航空航天和航空公司。这些部门与IRGC的战略情报收集工作一致。
图21 – 目标组织的地理分布
6月Minibike样本的部署表明"一切照旧”,发生在以色列和伊朗之间十二天冲突的背景下。已识别的样本表明以色列是当时的主要焦点。
结论
在我们的研究中,我们揭示了被称为Nimbus Manticore的伊朗威胁参与者的难以捉摸的操作。在过去一年中,该威胁参与者采用了一套新技术,使他们能够保持低调并继续操作,即使在以色列-伊朗十二天冲突期间也是如此。
Nimbus Manticore还扩大了对欧洲目标的兴趣,特别是在电信、国防、航空航天、卫星和航空公司部门。我们分析了Minibike植入程序的演变,该程序已纳入多层混淆,并越来越依赖合法的云服务以保持隐蔽和难以检测。
入侵指标(IOCs)
哈希值:
|
|
域名:
|
|
类似活动集群:
|
|