《电子技术应用》
您所在的位置:首页 > 通信与网络 > 业界动态 > 分析攻击Exchange服务器的幕后组织

分析攻击Exchange服务器的幕后组织

2021-11-23
来源:嘶吼专业版
关键词: 服务器

  对Exchange服务器的攻击活动之所以引人注目,是因为它使用了一个以前不为人知的Windows内核模式rootkit(我们称之为Demodex),以及一个复杂的多阶段恶意软件框架,旨在提供对被攻击服务器的远程控制。该攻击还涉及一个名为Cheat Engine的开源项目的内核模式组件,以绕过 Windows 驱动程序签名强制机制。早在2020年7月针对Exchange 服务器的攻击就开始了。

  技术分析

  大多数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是微软最初称为mpcmrun .exe的合法命令行实用程序。然后,侧加载DLL解码并加载一个名为license.rtf的附加可执行文件。不幸的是,我们无法检索这个可执行文件,但是我们看到加载它的连续操作包括通过wdichost.exe创建和执行GhostEmperor脚本。

  攻击从PowerShell滴管开始发起,它会创建几个注册表项,并将加密数据分配给它们。脚本本身是以打包形式传播的,因此它的完整执行依赖于一个命令行参数,该参数被用作解密其大量逻辑和数据的密钥。没有这个密钥,这个阶段之后的流量是不可能恢复的。

  初始阶段由加密的PowerShell代码组成,这些代码在运行时根据攻击者提供的AES密钥解密

  下一阶段由前者作为服务执行,目的是作为下一阶段的先前阶段。它用于从先前写入的注册表项中读取加密的数据,并对其进行解密,以启动内存植入的执行。我们确定了该组件的两种变体,一种是用 C++ 开发的,另一种是用 .NET 开发的。后者最早在2021年3月就出现了,它使用受感染计算机的GUID来获得解密密钥,可以在特定的系统上执行。另一方面,c++变体依赖硬编码的AES 256加密密钥。

  第三个阶段是核心植入,它被上述加载程序部署后在内存中运行,并被注入到新创建的svchost.exe进程的地址空间中。它的主要目标是为与C2服务器的流量通道提供便利,在此基础上,基于嵌入在其配置中的可扩展C2配置文件,恶意流量将被伪装成与良性服务的流量。需要注意的是,最初在 Cobalt Strike 框架中提供的 Malleable C2 功能的实现是根据 Cobalt Strike 代码的逆向工程进行自定义和重写的。

  最后一个阶段是由上述植入程序注入 winlogon.exe 进程的有效载荷,用于向攻击者提供远程控制功能。此类功能包括启动远程控制台或桌面会话,后者支持在目标计算机上执行发送的鼠标点击和击键,以及检索反映这些操作输出的定期屏幕截图。此阶段还允许攻击者加载任意 .NET 程序集或执行 PowerShell 命令,以及完全控制受害者的文件系统以搜索、检索或推送文件。

  除了最后阶段有效载荷之外,核心组件还能够在系统上部署Windows内核模式驱动程序。该驱动程序的目的是作为一个rootkit,隐藏恶意软件的工件,如文件,注册表键和网络流量,从而获得隐蔽性和避免被安全产品和取证调查人员检测到的能力。接下来的章节会详细介绍这个驱动程序是如何部署的(即它是如何绕过Windows缓解的,假设它不是数字签名的),以及它为用户模式恶意植入提供了哪些特殊功能。

  在64位Windows操作系统上,由于Microsoft引入的驱动程序签名强制机制,通常不可能以文档化的方式加载未签名的驱动程序。由于这个原因,攻击者利用有符号驱动程序中的漏洞,允许在内核空间中执行无符号代码。到目前为止,许多攻击者所采取的一种典型的方法,主要是在旧版本的Windows中,是通过切换nt!g_CiEnabled标志,在通过易受攻击的签名驱动程序获得写入和执行原语之后驻留在CI.DLL内核模块中。在关闭代码完整性机制之后,可以加载一个未签名的驱动程序。

  这个rootkit的开发人员所使用的方法允许加载一个未签名的驱动程序,而无需修改代码完整性图像和处理潜在的崩溃。它滥用了名为dbk64.sys 的合法开源签名驱动程序的功能,该驱动程序随 Cheat Engine 一起提供,Cheat Engine 是一个应用程序,旨在绕过视频游戏保护并将作弊功能引入其中。该驱动程序通过设计提供了在内核空间中编写和执行代码的能力,从而允许它在内核模式下运行任意代码。

  在将带有随机生成文件名的 dbk64.sys 驱动程序放到磁盘并加载它之后,恶意软件会向驱动程序发出记录的 IOCTL。

  值得一提的是,该恶意软件的服务在加载 dbk64.sys 驱动程序期间使用了名为 kernelmoduleuloader.exe(MD5:96F5312281777E9CC912D5B2D09E6132)的作弊引擎实用程序。该驱动程序与实用程序和 .sig 文件一起被释放,后者被用作通过传送与其二进制文件关联的数字签名来验证调用 dbk64.sys 的组件的手段。

  由于恶意软件不是Cheat Engine的组件,它以一个新进程的形式运行kernelmoduleunload .exe,并向它注入一个小型shellcode,该 shellcode 仅使用 CreateFileW API 打开 dbk64.sys 设备的句柄。

  Rootkit 加载介绍

  将加载的rootkit命名为Demodex,其目的是隐藏该恶意软件服务的多个工件。这是通过rootkit的驱动程序暴露的一组 IOCTL实现的,这些 IOCTL 依次由服务的用户模式代码调用,每个IOCTL都隐藏了一个特定的恶意工件。要访问rootkit的功能,恶意软件应该获得相应的设备对象的句柄。

  有趣的是,传递给 CmRegisterCallback 的指针不包含处理上述逻辑的函数的直接地址,而是包含 pci.sys 驱动程序映像的可执行部分末尾的地址,该地址最初用零填充对齐内存中的部分。在将回调指针传递给 CmRegisterCallback 之前,会在 pci.sys 驱动程序中寻找这样的部分,并修补其中的相应字节,以便调用对处理上述逻辑的实际回调的调用,如下所述。这允许所有拦截的注册表操作看起来好像它们是由源自合法 pci.sys 驱动程序的代码处理的。

  用于修复内存中 pci.sys 映像中的部分的代码,以便使用跳转到注册表检查回调的短 shellcode 存根编写它

  值得一提的是,Demodex rootkit在设计上支持Windows 10,根据我们在Windows 10构建上的测试,它确实似乎可以工作。这在多个位置的驱动程序代码中很明显,其中根据底层操作系统的版本采用不同的代码流程。在此类检查中,可以观察到某些流程对应于 Windows 10 的最新版本,如下面的代码片段所述。

  网络基础设施

  对于C2通信,攻击者注册的域名似乎是随机生成的,可能不会引起对恶意流量的任何关注。

  用于下载一些恶意样本或内存植入程序的 C2 通信的其他 IP 地址如下:

  反混淆分析方法

  已经发现的GhostEmperor活动样本中使用的恶意软件组件的开发者已经做出了一些对取证分析过程有影响的应对策略。首先,由于 Demodex 的加载方式,它的驱动程序没有正确地与其他系统模块一起以文档化的方式加载到 WinDbg 中。也就是说,仍然可以通过引用其名称 (\driver\dump_audio_codec0) 来找到 rootkit 的驱动程序对象,从而也可以列出其关联的设备对象:

  WinDBG中列出的驱动程序对象名称

  类似地,当尝试使用 Volatility3 widows.driverscan 模块列出系统模块时,输出中不存在Demodex驱动程序。然而,框架确实表明在扫描内核内存空间寻找驱动程序的过程中检测到异常:

  使用 windows.driverscan Volatility3 模块列出Demodex驱动程序时出现异常

  此外,恶意软件开发者有意选择从恶意软件的第三阶段和 rootkit 驱动程序的内存加载图像中删除所有 PE 标头。这是通过引入带有清零标头的图像开始(如第三阶段的情况)并依靠自定义加载器来准备执行或通过在加载后替换图像的标头来完成0x00 值,就像 rootkit 的驱动程序一样。从取证的角度来看,这会阻碍通过搜索标头文件来识别加载到内存中的 PE 图像的过程。

  如上所述,开发人员在 pci.sys 合法驱动程序中实现了一个跳转操作,以屏蔽为注册表相关操作调用的回调源。因此,试图追踪此类回调的分析师可能会错过一些回调,因为它们似乎是良性回调。

  值得注意的是,在字符串混淆的情况下,每个存根都是唯一构建的,并使用不同大小的参数结构,其中实际参数数据占用的字段是随机选择的。堆栈字符串初始化的顺序也是随机的,每个存根函数只被使用一次,作为单个内联API函数调用的替换。换句话说,在代码中不同位置使用的相同API函数对于每个位置都有不同的存根,并具有不同的参数结构。这证明开发者使用了一个指定的混淆SDK,其中API调用混淆是另一个特性。

  除此之外,开发人员还引入了更多标准的混淆方法,这些方法通常会减慢代码的静态分析速度,并且在多个恶意软件组件中都表现得很明显。这方面的一个示例是字符串混淆模式,其中每个字符串都使用一组预定义的算术和逻辑运算进行解码,以便为每个字符串选择不同的操作数(例如,移位偏移)。这表明在编译期间对每个字符串进行了混淆,并且开发者已经建立了一种 SDK 形式,有助于在构建期间对每个样本进行唯一的混淆。

  最后,可以看到一些变体以混淆和非混淆的形式同时出现。例如,我们以两种形式查看c++版本的第二阶段加载器——一种完全没有混淆,另一种严重混淆(MD5: 18BE25AB5592329858965BEDFCC105AF)。在下图中,我们可以看到两个变体中的相同函数:一个是编译器生成的原始代码流,没有经过混淆,而另一个的控制流程混淆到不可能跟踪操作顺序的程度。

  Post-exploitation工具集

  一旦攻击者通过上述感染链获得对受感染系统的访问权限,他们就会混合使用合法和开源攻击工具集来获取用户凭据并转向网络中的其他系统。这包括 Sysinternals 套件中用于控制进程的常用实用程序(例如 PsExec、PsList 和 ProcDump),以及其他工具,如 WinRAR、CertUtil 和 BITSAdmin。对于开源工具,攻击者使用了mimkat_ssp、Get-PassHashes.ps1、Token.exe、Ladon等工具,内部网络侦察和流量通常由NBTscan和Powercat执行。Sysinternals 之前为Winternals公司提供的免费工具,Winternals原本是一间主力产品为系统复原与资料保护的公司,为了解决工程师平常在工作上遇到的各种问题,便开发出许多小工具。




电子技术图片.png

本站内容除特别声明的原创文章之外,转载内容只为传递更多信息,并不代表本网站赞同其观点。转载的所有的文章、图片、音/视频文件等资料的版权归版权所有权人所有。本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如涉及作品内容、版权和其它问题,请及时通过电子邮件或电话通知我们,以便迅速采取适当措施,避免给双方造成不必要的经济损失。联系电话:010-82306118;邮箱:aet@chinaaet.com。