攻击链
Operation ForumTroll攻击链
在所有已知案例中,感染发生在受害者点击鱼叉钓鱼邮件中的链接后,该链接将他们重定向到恶意网站。该网站验证受害者并执行漏洞利用。
当我们首次发现并开始分析此活动时,恶意网站不再包含负责执行感染的代码;它只是将访问者重定向到官方的Primakov Readings网站。
因此,我们只能使用在第一批感染期间发现的事件工件。幸运的是,卡巴斯基技术检测到了攻击的几乎所有主要阶段,使我们能够重建和分析Operation ForumTroll攻击链。
钓鱼邮件
此活动中使用的恶意电子邮件示例(从俄语翻译)
攻击者发送的恶意电子邮件伪装成Primakov Readings科学和专家论坛组织者的邀请函。这些电子邮件包含用于跟踪感染的个性化链接。电子邮件看起来真实,没有语言错误,并以对此类活动邀请函预期的风格编写。精通俄语并熟悉当地特点是ForumTroll APT组织的显著特征,我们在其其他活动中也观察到了这些特征。然而,在其他一些案例中的错误表明攻击者不是俄语母语者。
验证器
验证器是一个相对较小的脚本,由浏览器执行。它验证受害者并安全地下载和执行攻击的下一阶段。
验证器执行的第一个操作是使用WebGPU API计算从服务器接收的随机数据的SHA-256。然后验证得到的哈希值。这是使用Marco Ciaramella的sha256-gpu项目的开源代码完成的。此检查的主要目的可能是验证网站是由具有真实Web浏览器的真实用户访问,而不是可能跟踪链接、模拟脚本并下载漏洞利用的邮件服务器。此检查的另一个可能原因是漏洞利用触发了WebGPU API中的漏洞或依赖它进行利用。
验证器将感染标识符、WebGPU API检查的结果和新生成的公钥发送到C2服务器,以使用椭圆曲线Diffie-Hellman(ECDH)算法进行密钥交换。如果检查通过,服务器响应一个AES-GCM密钥。该密钥用于解密下一阶段,该阶段隐藏在对bootstrap.bundle.min.js和.woff2字体文件的请求中。根据事件时间线和感染逻辑,此下一阶段应该是Google Chrome的远程代码执行(RCE)漏洞利用,但在攻击期间未获取。
沙箱逃逸漏洞利用
卡巴斯基捕获和报告的野外0日漏洞列表
多年来,我们发现并报告了数十个在攻击中积极使用的零日漏洞利用。然而,CVE-2025-2783是我们遇到的最有趣的沙箱逃逸漏洞利用之一。这个漏洞利用真正让我们困惑,因为它允许攻击者绕过Google Chrome的沙箱保护,而无需执行任何明显恶意或禁止的操作。这是由于Windows操作系统中一个晦涩的怪癖导致的强大逻辑漏洞。
为了保护免受错误和崩溃的影响,并启用沙箱化,Chrome使用多进程架构。主进程(称为浏览器进程)处理用户界面并管理和监督其他进程。沙箱化的渲染器进程处理Web内容,并对系统资源的访问有限。Chrome使用Mojo和底层ipcz库(引入以替代传统IPC机制)在浏览器和渲染器进程之间进行进程间通信。
我们发现的漏洞利用附带了自己的Mojo和ipcz库,这些库是从官方来源静态编译的。这使得攻击者能够与浏览器进程中的IPC代理通信,而无需手动制作和解析ipcz消息。然而,这给我们带来了问题,因为要分析漏洞利用,我们必须识别它使用的所有Chrome库函数。这涉及大量工作,但完成后,我们知道了漏洞利用执行的所有操作。
简而言之,漏洞利用执行以下操作:
- 使用模式搜索从dll解析必要函数和代码小工具的地址。
- 挂钩v8_inspector::V8Console::Debug函数。这允许攻击者逃逸沙箱并通过JavaScript调用执行所需的payload。
- 当攻击者从其脚本调用console.debug(0x42, shellcode)时,开始执行沙箱逃逸。
- 挂钩ipcz::NodeLink::OnAcceptRelayedMessage函数。
- 创建并发送类型为RelayMessage的ipcz消息。此消息类型用于在两个没有必要权限的进程(例如渲染器进程)之间传递Windows操作系统句柄。漏洞利用检索GetCurrentThread API函数返回的句柄,并使用此ipcz消息将其传递给自身。代理使用DuplicateHandle API函数在进程之间传输句柄。
- 使用ipcz::NodeLink::OnAcceptRelayedMessage函数挂钩接收转发的消息,但现在它包含浏览器进程中线程的句柄,而不是之前由GetCurrentThread API函数返回的句柄!
- 使用此句柄通过挂起线程、使用SetThreadContext设置寄存器值并恢复线程来在目标进程中执行一系列代码小工具。这导致在浏览器进程中执行shellcode并随后安装恶意软件加载器。
那么,出了什么问题,这怎么可能呢?答案可以在GetCurrentThread和GetCurrentProcess API函数的描述中找到。当调用这些函数时,它们不返回实际句柄;而是返回伪句柄,特殊常量,由内核解释为当前线程或进程的句柄。对于当前进程,此常量为-1(也等于INVALID_HANDLE_VALUE,这带来了自己的一套怪癖),当前线程的常量为-2。Chrome的IPC代码已经检查了等于-1的句柄,但没有检查-2或其他未记录的伪句柄。这个疏忽导致了漏洞。因此,当代理在处理RelayMessage时将从渲染器接收的-2伪句柄传递给DuplicateHandle API函数时,它将-2转换为自身线程的真实句柄并将其传递给渲染器。
补丁发布后不久,很明显Chrome不是唯一受此问题影响的浏览器。Firefox开发人员迅速在其IPC代码中识别出类似模式,并在CVE-2025-2857下发布了更新。
当伪句柄首次引入时,它们简化了开发并帮助挤出额外性能——这在旧PC上至关重要。几十年后,这种过时的优化回来困扰我们。
我们能看到更多这样的错误吗?绝对可以。事实上,这代表了一整类值得寻找的漏洞——类似问题可能仍然潜伏在其他应用程序和Windows系统服务中。
要了解发现CVE-2025-2783后Google Chrome中引入的强化措施,我们建议查看Alex Gough在Kawaiicon上的即将举行的演讲“响应ITW Chrome沙箱逃逸(两次!)”。
持久化加载器
持久性通过组件对象模型(COM)劫持技术实现。此方法利用系统对COM对象的搜索顺序。在Windows中,每个COM类都有一个注册表项,将CLSID(128位GUID)与其DLL或EXE文件的位置关联。这些条目存储在系统注册表配置单元HKEY_LOCAL_MACHINE(HKLM)中,但可以被用户注册表配置单元HKEY_CURRENT_USER(HKCU)中的条目覆盖。这使得攻击者能够覆盖CLSID条目并在系统尝试定位并运行正确的COM组件时运行恶意软件。
COM劫持简而言之
攻击者使用此技术覆盖twinapi.dll的CLSID {AA509086-5Ca9-4C25-8F95-589D3C07B48A},并导致系统进程和Web浏览器加载恶意DLL。
此恶意DLL是一个加载器,解密并执行主要恶意软件。负责加载恶意软件的payload使用类似于Metasploit框架中发现的简单二进制编码器进行编码。它还使用OLLVM进行混淆。由于被劫持的COM对象可以加载到许多进程中,payload检查当前进程的名称,并且仅当由某些进程(例如rdpclip.exe)执行时才加载恶意软件。主要恶意软件使用修改后的ChaCha20算法解密。加载器还具有使用BIOS UUID重新加密恶意软件以将其绑定到受感染机器的功能。解密的数据包含主要恶意软件和由Donut生成的启动它的shellcode。
LeetAgent
LeetAgent是Operation ForumTroll活动中使用的间谍软件。我们将其命名为LeetAgent,因为其所有命令都以Leet语编写。您可能不相信,但这在APT恶意软件中很少见。恶意软件连接到其配置中指定的一个C2服务器,并使用HTTPS接收和执行由唯一数值标识的命令:
- 0xC033A4D(COMMAND)– 使用cmd.exe运行命令
- 0xECEC(EXEC)– 执行进程
- 0x6E17A585(GETTASKS)– 获取代理当前正在执行的任务列表
- 0x6177(KILL)– 停止任务
- 0xF17E09(FILE \x09)– 写入文件
- 0xF17ED0(FILE \xD0)– 读取文件
- 0x1213C7(INJECT)– 注入shellcode
- 0xC04F(CONF)– 设置通信参数
- 0xD1E(DIE)– 退出
- 0xCD(CD)– 更改当前目录
- 0x108(JOB)– 设置键盘记录器或文件窃取器的参数
除了执行从C2接收的命令外,它还在后台运行键盘记录和文件窃取任务。默认情况下,文件窃取任务搜索具有以下扩展名的文档:*.doc, *.xls, *.ppt, *.rtf, *.pdf, *.docx, *.xlsx, *.pptx。
配置数据使用TLV(标签-长度-值)方案编码,并使用简单的单字节XOR密码加密。数据包含与C2通信的设置,包括许多用于流量混淆的设置。
在大多数观察到的情况下,攻击者使用Fastly.net云基础设施托管其C2。攻击者经常使用它下载和运行其他工具,如7z、Rclone、SharpChrome等,以及额外的恶意软件(更多内容见下文)。
流量混淆设置的数量可能表明LeetAgent是一种商业工具,尽管我们只看到ForumTroll APT使用它。
发现Dante
我们认为,归因未知恶意软件是安全研究中最具挑战性的方面。为什么?因为它不仅仅是分析单个攻击中使用的恶意软件或漏洞利用;它还涉及查找和分析过去可能与当前调查相关的攻击中使用的所有恶意软件和漏洞利用。这涉及使用妥协指标(IOC)和战术、技术和程序(TTP)搜索和调查类似攻击,以及识别基础设施、代码等方面的重叠。简而言之,它涉及查找和拼凑每一个证据碎片,直到攻击者的图像开始出现。
我们将LeetAgent的首次使用追溯到2022年,并发现了更多ForumTroll APT对俄罗斯和白俄罗斯组织和个人的攻击。在许多情况下,感染始于包含恶意附件的钓鱼电子邮件,附件具有以下名称:
- Baltic_Vector_2023.iso(从俄语翻译)
- DRIVE.GOOGLE.COM(可执行文件)
- Invitation_Russia-Belarus_strong_partnership_2024.lnk(从俄语翻译)
- 提及个人和公司的各种其他文件名
此外,我们发现了另一个类似攻击的集群,该集群使用更复杂的间谍软件而不是LeetAgent。我们还能将这种间谍软件的首次使用追溯到2022年。在此集群中,感染始于包含恶意附件的钓鱼电子邮件,附件具有以下名称:
- SCAN_XXXX_
.pdf.lnk _winscan_to_pdf.pdf.lnk - Rostelecom.pdf.lnk(从俄语翻译)
- 各种其他
此活动背后的攻击者使用类似的文件系统路径和与LeetAgent集群相同的持久性方法。这使我们怀疑这两个集群可能相关,当我们在攻击中发现这种更复杂的间谍软件由LeetAgent启动时,我们确认了直接链接。
LeetAgent与名为Dante的商业间谍软件之间的连接
在分析了这种先前未知的复杂间谍软件后,我们能够将其识别为意大利公司Memento Labs开发的商业间谍软件Dante。
大西洋理事会的Cyber Statecraft Initiative最近发布了一份有趣的报告,题为“神话野兽及在哪里找到它们:映射全球间谍软件市场及其对国家安全和人权的威胁”。我们认为将商业间谍软件比作神话野兽是一个恰当的类比。虽然行业中的每个人都知道间谍软件供应商存在,但他们的“产品”很少被发现或识别。同时,开发商业间谍软件的公司列表非常庞大。一些最著名的是NSO Group、Intellexa、Paragon Solutions、Saito Tech(前Candiru)、Vilicius Holding(前FinFisher)、Quadream、Memento Labs(前Hacking Team)、negg Group和RCS Labs。有些总是成为头条新闻,有些我们之前报告过,有些几乎完全从视野中消失。后一类中的一家公司是Memento Labs,前身为Hacking Team。
Hacking Team(也风格化为HackingTeam)是最古老和最著名的间谍软件供应商之一。Hacking Team成立于2003年,以其远程控制系统(RCS)间谍软件而闻名,被全球政府客户使用,并围绕它发生了许多争议。2015年,在遭到黑客攻击后,超过400 GB的内部数据在线泄露,公司的轨迹发生了巨大变化。2019年,公司被InTheCyber Group收购并更名为Memento Labs。“我们想改变一切,”Memento Labs所有者2019年告诉Motherboard。“我们从头开始。”四年后,在针对执法和政府情报机构的ISS World MEA 2023会议上,Memento Labs揭示了其新监视工具的名称——DANTE。直到现在,对此恶意软件的功能知之甚少,并且其在攻击中的使用尚未被发现。
ISS World MEA 2023会议议程摘录(错字由会议网站引入)
检测和归因商业间谍软件的问题在于供应商通常不会在其漏洞利用和恶意软件中包含其版权信息或产品名称。然而,在Dante间谍软件的情况下,一旦我们摆脱VMProtect的混淆并在代码中找到恶意软件名称,归因就很简单了。
Dante间谍软件名称在代码中
当然,我们的归因不仅仅基于代码中找到的字符串“Dante”,但它是一个重要的线索,指引我们走向正确的方向。经过一些额外分析后,我们找到了恶意软件“2.0”版本的引用,这与上述会议演讲的标题匹配。然后我们搜索并识别了Hacking Team远程控制系统(RCS)间谍软件的最新样本。Memento Labs不断改进其代码库,直到2022年被Dante取代。然而,即使引入了新的恶意软件,并非一切都是从头开始构建的;后来的RCS样本与Dante共享相当多的相似之处。所有这些发现使我们对归因非常有信心。
作者为什么将其命名为Dante?这可能是对传统的致敬,因为RCS间谍软件也被称为“Da Vinci”。但它也可能指代Dante的诗歌《神曲》,暗示恶意软件分析师在检测和分析间谍软件时必须通过的许多“地狱圈”,因为它具有众多的反分析技术。
首先,间谍软件使用VMProtect打包。它混淆控制流,隐藏导入的函数,并添加反调试检查。除此之外,几乎每个字符串都被加密。
VMProtect反调试技术
为了保护免受动态分析,Dante使用以下反挂钩技术:当代码需要执行API函数时,其地址使用哈希解析,其主体被解析以提取系统调用号,然后创建并使用新的系统调用存根。
Dante反挂钩技术(简化)
除了VMProtect的反调试技术外,Dante使用一些常见方法检测调试器。具体来说,它使用NtGetContextThread检查调试寄存器(Dr0–Dr7),检查KUSER_SHARED_DATA结构中的KdDebuggerEnabled字段,并使用NtQueryInformationProcess通过查询ProcessDebugFlags、ProcessDebugPort、ProcessDebugObjectHandle和ProcessTlsInformation类来检测调试。
为了保护自己不被发现,Dante采用一种有趣的方法检查环境以确定是否安全继续工作。它查询Windows事件日志中可能指示使用恶意软件分析工具或虚拟机(作为客户机或主机)的事件。
Dante在事件日志中搜索的字符串
它还执行几个反沙箱检查。它搜索“不良”库,测量sleep()函数和cpuid指令的执行时间,并检查文件系统。
这些反分析技术可能有点烦人,但没有一个真正有效或能阻止专业恶意软件分析师。我们几乎每天都要处理这些技术。
执行所有检查后,Dante执行以下操作:解密配置和协调器,在协调器中找到字符串“DANTEMARKER”,用配置覆盖它,然后加载协调器。
配置使用简单的XOR密码从恶意软件的数据部分解密。协调器从资源部分解密并伪装成字体文件。如果文件系统上有更新的版本可用,Dante也可以从文件系统加载并解密协调器。
协调器显示商业产品的代码质量,但并不是特别有趣。它负责通过HTTPs协议与C2通信,处理模块和配置,自我保护,和自我删除。
模块可以从文件系统保存和加载,或从内存加载。感染标识符(GUID)以Base64编码。结果字符串的部分用于派生包含模块的文件夹路径和存储在注册表中的附加设置路径。
Dante路径派生示例
包含模块的文件夹包括一个二进制文件,该文件存储所有下载模块的信息,包括它们的版本和文件名。此元数据文件使用简单的XOR密码加密,而模块使用AES-256-CBC加密,使用模块文件的前0x10字节作为IV和绑定到机器的密钥。密钥等于包含CPU标识符和Windows产品ID的缓冲区的SHA-256哈希。
为了保护自己,协调器使用许多相同的反分析技术,以及针对特定进程名称和驱动程序的额外检查。
如果Dante在配置中指定的天数内未收到命令,它会删除自己及其所有活动痕迹。
在撰写本报告时,我们无法分析其他模块,因为我们的用户中目前没有活跃的Dante感染。但是,如果它们可用,我们很乐意分析它们。既然有关此间谍软件的信息已公开且其开发人员已被识别,我们希望不久之后就能发现和检查其他模块。为了支持这项工作,我们分享了一种可用于识别活跃Dante间谍软件感染的方法(参见妥协指标部分)。
尽管我们没有看到ForumTroll APT组织在Operation ForumTroll活动中使用Dante,但我们观察到其在其他与此组织相关的攻击中的使用。值得注意的是,我们发现了此攻击与其他涉及Dante的攻击之间的一些微小相似之处,例如类似的文件系统路径、相同的持久性机制、隐藏在字体文件中的数据以及其他微小细节。最重要的是,我们发现了漏洞利用、加载器和Dante共享的类似代码。总之,这些发现使我们得出结论,Operation ForumTroll活动也是使用与Dante间谍软件相同的工具集进行的。
结论
这次,我们不止一个,而是三个结论。
- DuplicateHandle是一个危险的API函数。如果进程是特权进程且用户可以提供其句柄,代码应在提供伪句柄时返回错误。
- 归因是恶意软件分析和威胁情报中最具挑战性的部分,但当所有拼图碎片完美契合时,也是最 rewarding 的。如果您小时候曾梦想成为像Sherlock Holmes、Miss Marple、Columbo或Scooby-Doo和Mystery Inc.团伙那样的侦探解决谜团,那么威胁情报可能适合您!
- 早在2019年,Hacking Team的新所有者在采访中表示他们想改变一切并从头开始。花了一些时间,但到2022年,Hacking Team的几乎所有内容都重做了。现在Dante已被发现,也许是时候重新开始了。
此研究的完整细节,以及关于ForumTroll APT和Dante的未来更新,可通过我们的威胁情报门户提供给APT报告服务的客户。
联系:intelreports@kaspersky.com
妥协指标
卡巴斯基检测
- Exploit.Win32.Generic
- Exploit.Win64.Agent
- Trojan.Win64.Agent
- Trojan.Win64.Convagent.gen
- HEUR:Trojan.Script.Generic
- PDM:Exploit.Win32.Generic
- PDM:Trojan.Win32.Generic
- UDS:DangerousObject.Multi.Generic
Kaspersky NEXT EDR Expert中的TTP检测规则
-
suspicious_drop_dll_via_chrome 此规则检测Chrome进程内的DLL加载,通过Outlook启动。此行为与通过操纵Windows伪句柄和IPC利用浏览器沙箱绕过漏洞一致。
-
possible_com_hijacking_by_memento_labs_via_registry 此规则检测通过COM对象劫持技术的系统持久化尝试,该技术利用Windows COM组件解析过程的特性。此功能允许恶意行为者在用户特定注册表分支中创建自定义CLSID条目,从而覆盖合法系统组件。当系统尝试实例化相应的COM对象时,恶意payload而不是原始代码执行。
-
cve_exploit_detected 此通用规则设计用于检测恶意行为者利用各种漏洞的尝试。其逻辑基于分析反映典型利用行为的一组广泛特征模式。
模块文件夹
包含模块的文件夹位于%LocalAppData%中,并命名为八字节Base64字符串。它包含没有扩展名的文件,其文件名也是八字节长的Base64字符串。其中一个文件与文件夹同名。此信息可用于识别活跃感染。
加载器
- 7d3a30dbf4fd3edaf4dde35ccb5cf926
- 3650c1ac97bd5674e1e3bfa9b26008644edacfed
- 2e39800df1cafbebfa22b437744d80f1b38111b471fa3eb42f2214a5ac7e1f13
LeetAgent
- 33bb0678af6011481845d7ce9643cedc
- 8390e2ebdd0db5d1a950b2c9984a5f429805d48c
- 388a8af43039f5f16a0673a6e342fa6ae2402e63ba7569d20d9ba4894dc0ba59
Dante
- 35869e8760928407d2789c7f115b7f83
- c25275228c6da54cf578fa72c9f49697e5309694
- 07d272b607f082305ce7b1987bfa17dc967ab45c8cd89699bcdced34ea94e126