在调查最近针对Exchange服务器的攻击增加时,我们注意到在几个不同的被攻击网络中出现了重复的活动集群。这个集群的突出之处在于它使用了一个以前不为人知的Windows内核模式rootkit(我们称之为Demodex),以及一个复杂的多阶段恶意软件框架,旨在提供对被攻击服务器的远程控制。前者用于向调查人员和安全解决方案隐藏用户模式恶意软件的方案,同时展示了一个有趣的未记录加载方案,该方案涉及名为 Cheat Engine 的开源项目的内核模式组件,以绕过 Windows 驱动程序签名强制机制。
我们能够看到早在2020年7月就开始使用所讨论的工具集。此外,我们可以看到,攻击者主要针对位于东南亚的目标,以及埃及、阿富汗和埃塞俄比亚的政府和电信。
鉴于其长期的运行模式、受害者特点、先进的工具集以及与已知攻击者者的关系,我们决定将底层集群命名为 GhostEmperor。对这项活动的调查使我们相信,潜在的攻击者技术娴熟,技艺精湛,这可以通过使用广泛的不寻常和复杂的反取证和反分析技术明显看出。
感染过程
我们发现了多个攻击媒介,这些攻击媒介触发了导致在内存中执行恶意软件的感染链。我们注意到,大多数GhostEmperor感染是部署在面向公共的服务器上,因为许多恶意构件是由Apache服务器进程“httpd.exe”、IIS Windows服务器进程“w3wp.exe”或Oracle服务器进程“oc4j.jar”安装的。这意味着攻击者可能滥用了运行在这些系统上的web应用程序的漏洞,从而允许他们删除和执行自己的文件。
值得一提的是,其中一个 GhostEmperor 感染影响了 Exchange 服务器,发生在 2021 年 3 月 4 日。这距离微软发布 ProxyLogon 漏洞补丁仅两天,攻击者可能利用了这一漏洞,以允许他们在易受攻击的 Exchange 服务器上实现远程代码执行。
尽管 GhostEmperor 的感染通常始于 BAT 文件,但在某些情况下,已知的感染链之前有一个较早的阶段:由 wdichost.exe 侧加载的恶意 DLL,wdichost.exe 是 Microsoft 最初称为 MpCmdRun.exe 的合法命令行实用程序。然后,侧加载的 DLL 继续解码并加载名为 license.rtf 的附加可执行文件。不幸的是,我们没有设法检索这个可执行文件,但我们看到加载它的连续操作包括 wdichost.exe 创建和执行 GhostEmperor 脚本。
由侧加载 DLL 启动的 GhostEmperor 感染链示例
最后,一些Demodex部署是使用合法工具(如WMI或PsExec)从网络中的另一个系统远程执行的,这表明攻击者事先已经感染了受害者的部分网络。
感染链介绍
感染过程可以分为几个阶段,依次运行以激活内存中的植入程序并允许它在运行时部署额外的有效载荷。本节会简要介绍这些阶段,包括对最终有效载荷的描述。
感染流程始于 PowerShell 滴管。此组件的目的是通过将其安装为服务来暂存链中的后续元素。在此之前,它会创建几个注册表项,将加密数据分配给这些注册表项,其中一个对应于将在后期部署的有效负载。值得注意的是,脚本本身以打包形式交付,因此其完整执行取决于命令行参数,该参数用作解密其大部分逻辑和数据的项。没有这个key,这个阶段之后的流量是不可能恢复的。
初始阶段由加密的 PowerShell 代码组成,该代码在运行时根据攻击者提供的 AES 项进行解密
下一个阶段是由前者作为服务执行的,目的是作为下一个阶段的另一个前兆。它用于从先前写入的注册表项读取加密数据并解密它,以启动内存植入的执行。我们确定了这个组件的两个变体,一个是用c++开发的,另一个是用 .NET 开发的。后者早在 2021 年 3 月就出现在野外,它使用受感染机器的 GUID 来派生解密项,因此被定制为在该特定系统上执行。另一方面,C++ 变体依赖于硬编码的 AES 256 加密项。
第三阶段是核心植入,由上述加载程序部署后在内存中运行,并注入到新创建的 svchost.exe 进程的地址空间中。它的主要目标是促进与 C2 服务器的通信通道,从而基于嵌入其配置中的 Malleable C2 配置文件,恶意流量伪装成与良性服务通信的伪装。需要注意的是,最初在 Cobalt Strike 框架中提供的 Malleable C2 功能的实现是根据 Cobalt Strike 代码的逆向工程自定义和重写的。
另一个用于隐藏恶意流量的有趣技术是恶意软件使用虚假文件格式标头来封装传递给 C&C 服务器的数据。为此,内存植入程序会合成一个 RIFF、JPEG 或 PNG 格式之一的虚假媒体文件,并将任何以加密形式传送到服务器的数据作为其主体。因此,传输的数据包以图像或音频文件的形式出现,并与网络中的其他合法流量混合在一起。
使用虚假文件格式标头来封装传递给 C&C 服务器的数据
最后一个阶段是由上述植入程序注入 winlogon.exe 进程的有效载荷,用于向攻击者提供远程控制功能。此类功能包括启动远程控制台或桌面会话,后者支持在目标设备上执行发送的鼠标点击和击键,以及检索反映这些操作输出的定期屏幕截图。此阶段还允许攻击者加载任意 .NET 程序集或执行 PowerShell 命令,以及完全控制受害者的文件系统以搜索、检索或推送文件。
除了最后阶段的有效载荷之外,核心组件还能够在系统上部署 Windows 内核模式驱动程序。这个驱动程序的目的是作为隐藏恶意软件的rootkit,如文件,注册表项和网络流量,从而获得隐身和能力,以避免被安全产品和安全人员检测到。接下来的章节详细介绍了这个驱动程序是如何部署的(即它是如何绕过Windows缓解的,假设它不是数字签名的),以及它为用户模式恶意植入提供了哪些特殊功能。
GhostEmperor 感染链
Rootkit 加载分析
在现代 64 位 Windows 操作系统上,由于微软引入的驱动程序签名强制机制,通常无法以文档化的方式加载未签名的驱动程序。因此,攻击者滥用签名驱动程序中的漏洞,允许在内核空间执行未签名代码。迄今为止,许多参与者采用的一种典型方法是通过切换nt!g_CiEnabled标志,在通过脆弱的签名驱动程序获得写和执行原语后驻留在CI.DLL内核模块中。在关闭代码完整性机制后,可以加载未签名驱动程序。
这种方法受到了微软引入的内核补丁保护(又名PatchGuard)的限制,此机制保护Windows内核内存空间中特定数据结构的修改,包括 nt!g_CiEnabled 标志。由于这个原因,修改这个标志现在可以导致调用一个蓝屏。这可以通过快速设置标志值来解决,加载一个无符号驱动并在PatchGuard识别出变化之前将其切换回以前的状态,尽管这仍然会引入一个可能导致系统崩溃的竞争条件。
这个rootkit的开发人员使用的方法允许加载一个未签名的驱动程序,而不需要修改代码完整性映像和处理潜在的崩溃。它滥用了合法的开源驱动程序dbk64的特性。这个系统是和Cheat Engine一起发布的,Cheat Engine是一个用来绕过视频游戏保护并引入作弊手段的应用程序。这个驱动程序通过设计提供了在内核空间中编写和执行代码的能力,从而允许它在内核模式下运行任意代码。
将带有随机生成文件名的 dbk64.sys 驱动程序存入到磁盘并加载它后,恶意软件会向驱动程序发出文档化的 IOCTL,允许 shellcode 通过以下操作序列在内核空间中运行:
首先,通过发出 IOCTL_CE_ALLOCATEMEM_NONPAGED 在内核空间非分页池中分配内存缓冲区。
然后将使用直接 I/O 方法在用户模式恶意软件进程和内核地址空间之间共享成功分配的内存缓冲区,从而将内核模式缓冲区的地址映射到用户空间中的不同地址。这是通过在物理内存中锁定缓冲区的页面来实现的,这样它们就不能被调出(这是可能的,因为它们是在非分页池中分配的),然后创建缓冲区的 MDL 并调用 MmMapLockedPagesSpecifyCache API 函数制作。所有这些都在 IOCTL_CE_MAP_MEMORY 的处理程序中实现。
此时,恶意软件可以通过先前 IOCTL 提供的指针访问用户模式下的缓冲区并写入该缓冲区。写入的数据将依次反映在内核空间的同一个缓冲区中,这用于将 shellcode 写入缓冲区。
写入完成后,通过发出IOCTL_CE_UNMAP_MEMORY从用户空间取消映射缓冲区。
编写的 shellcode 现在仅驻留在内核空间中,可以通过发出 IOCTL_CE_EXECUTE_CODE 来运行。
shellcode 的目的是将 dbk64.sys IOCTL 调度程序替换为另一个允许加载未签名驱动程序的替代程序。替代调度程序也被实现为与位置无关的代码,并与 shellcode 捆绑在一起。为了替换原来的调度程序,shellcode 在内存中映射新调度程序的代码,并修补指向 dbk64.sys 驱动程序对象中的 IRP_MJ_DEVICE_CONTROL 例程的指针。此时,IRP_MJ_DEVICE_CONTROL 指针被设置为新调度程序的地址,任何发给驱动程序的 IOCTL 都将通过它。
IRP_MJ_DEVICE_CONROL 挂钩
替代调度程序提供与原始调度程序相同的核心功能,但增加了一些功能,使其能够将新驱动程序加载到内核空间。实现这一目标的功能是通过一组连续调用的 IOCTL 处理程序暴露出来的,最终导致恶意软件内核模式 rootkit 的加载。下面是这些 IOCTL 的表格和描述,按照恶意软件负责部署 rootkit 的用户模式逻辑调用它们的顺序排列。
本文翻译自:https://securelist.com/ghostemperor-from-proxylogon-to-kernel-mode/104407/如若转载,请注明原文地址