深入分析恶意软件HermeticWiper(上) - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

深入分析恶意软件HermeticWiper(上)

fanyeee 技术 2022-04-03 11:50:00
收藏

导语:在本文中,我们将为读者深入分析数据擦除型恶意软件HermeticWiper。

上个月的时候,人们新发现了一个数据擦除型恶意软件,它被命名为“HermeticWiper”,因为其数字证书是盗取自一家名为Hermetica Digital Ltd的公司。这个擦除器的显著特点是能够绕过Windows的安全功能,并获得对磁盘上许多低级数据结构的写入权限。此外,攻击者还想把磁盘上的文件分割成碎片并覆盖它们,使其无法恢复。

在我们分析这个数据擦除器的时候,其他的研究报告也陆续发布,详细说明了这个攻击活动中使用的其他组件,包括一个蠕虫和典型的勒索软件,幸好该软件的实现质量不高,很容易进行解密。

在本文中,我们将针对目前已经获取的恶意样本,对其进行深入的考察分析。

行为分析

首先,我们看到的是一个32位Windows可执行文件,其图标类似于一个礼物。实际上,这并不是攻击者的冷笑话,而只是Visual Studio GUI项目的一个标准图标。

1.png

HermeticWiper使用的图标

这款恶意软件必须以管理员身份运行才能工作,而且没有提供任何UAC绕过技术。稍后我们会发现,这个样本的名称也会(稍微)影响其功能;如果名称以“c ”开头(或以“C”开头,因为它被自动转换为小写),那么,系统在执行后将重新启动。

一旦运行,该样本就会在后台悄悄地“工作”。如果不借助其他工具的话,我们很难发现任何可疑的东西。

只有当我们使用像Process Explorer这样的工具观察这个样本时,我们才能注意到一些不寻常的行为——它会调用各种IOCTL,并且都与检索磁盘的细节有关。

1.png

通过ProcessMonitor观察HermeticWiper时,发现其执行的动作

……其中包括FSCTL_GET_RETRIEVAL_POINTERSFSCTL_MOVE_FILE,这些貌似都与文件的碎片整理有关。请注意,在文件系统中,文件有时并不是保存在一个连续的块中(就像我们在高级别的文件中看到的那样),而是分布在磁盘的各个扇区中的多个块中。碎片整理与合并这些块有关,而碎片化则与分割这些块有关。

1.png

然而,进一步的研究表明,这里的效果与碎片整理相反。事实上,由于恶意软件的缘故,数据变得更加碎片化。

在恶意软件执行前后,有关数据碎片的磁盘状态如下图所示:

1.png

执行前的磁盘状态

1.png

执行后的磁盘状态

这样做可能是为了提高损坏程度:文件碎片越多,从原始磁盘映像中分割出来并进行取证重建的难度就就越大。

随着恶意软件的执行,在某些时候,我们可能会发现一些应用程序将无法正常工作。这是因为某些文件(包括系统DLL)已被随机数据所覆盖。

示例:由于系统DLL被破坏,导致应用程序无法运行:

1.png

HermeticWiper导致的软件故障

如果我们现在查看磁盘的原始映像(比如使用HxD),我们就会发现某些扇区已经被随机数据覆盖了:

1.png

通过HxD检查被HermeticWiper覆盖的扇区

毫无疑问,重启后,我们的Windows操作系统将无法正常工作:

1.png

重新启动受损系统后,用户看到的出错消息

那么,这个恶意软件在背后到底搞了什么鬼呢?让我们仔细看看……

使用的组件

初始样本:1bc44eef75779e3ca1eefb8ff5a64807dbc942b1e4a2672d77b9f6928d292591——在其资源中包含多个PE文件:

1.png

恶意软件的资源部分

为资源选择的名称(DRV_X64、DRV_X86、DRV_XP_X86、DRV_XP_X64)表明:它们是同一驱动程序,并且为不同的Windows系统提供了相应的版本:适用于32位或64位系统的版本,或适用于Windows XP的旧版本。同时,它们都采用了压缩形式。通过Linux系统的file命令检查转储文件,我们可以看到以下输出:

file DRV_XP_X86

DRV_XP_X86: MS Compress archive data, SZDD variant, original size: 13896 bytes

为了弄清楚它们是如何加载的,我们需要研究一下携带它们的样本。

幸运的是,该样本并没有进行混淆处理,所以,我们可以轻松找到负责查找适当版本的驱动程序的代码片段:

1.png

HermeticWiper中选择加载哪个驱动程序的代码片段

然后,让我们通过LZMA算法对缓冲区进行解压缩处理:

1.png

负责用LZMA算法解压缩驱动程序并进行安装的代码片段

实际上,当前流行的解压缩工具(比如7Zip)都支持这种压缩格式。我们也可以根据恶意软件代码制作自己的解压缩工具(详见:https://gist.github.com/hasherezade/2c7837874f7adf0f73192f4d861d83c6)。

结果,我们从EaseUS Partition Master中得到了4种版本的合法驱动程序——这一点与ESET(https://twitter.com/ESETresearch/status/1496581912940396551?s=20&t=wAz5sfT7pTIN-F0aqFaXTg)所报告的完全相符。

    2c7732da3dcfc82f60f063f2ec9fa09f9d38d5cfbe80c850ded44de43bdb666d

    23ef301ddba39bb00f0819d2061c9c14d17dc30f780a945920a51bc3ba0198a4

    8c614cf476f871274aa06153224e8f7354bf5e23e6853358591bf35a381fb75b

    96b77284744f8761c4f2558388e0aee2140618b484ff53fa8b222b340d2a9c84

从PE头部中的时间戳来看,这个驱动程序是很久以前构建的。据我们推测,这些驱动程序很可能是被攻击者从原始的合法软件包中窃取的。并且,它们中的每一个都带有一个调试目录,其中包括一个PDB路径,例如:

 1.png

驱动程序概述

HermeticWiper使用的驱动程序来自EaseUS套件,而EaseUS则是一个合法的软件,为用户提供了多种磁盘管理功能,如分区和大小调整。如前所述,该工具是合法的,因此,在攻击发生时,无法通过VirusTotal检测到该样本:

1.png

VirusTotal没有检测出该样本

查看驱动程序内部代码,我们发现它只是提供了许多典型的驱动功能:创建所需的设备,并建立一些分派例程,如下图所示:

1.png

DriverEntry例程

这个驱动程序的内部结构非常简单。为了从用户模式访问驱动程序,我们需要使用CreateFile API函数,并安装驱动程序的设备名(\\.\epmntdrv)以及分区ID。具体示例如下所示:

 

1.png

用户模式组件,生成用于打开设备句柄的字符串

注意,这个字符串对于理解驱动程序的功能非常重要。如您所见,驱动程序的代码会把发送的字符串从用户模式转换为整数,并将该整数用作helper函数“savereferenceharddisk”的输入。由于可以从映像中提取,所以,这个helper函数将在FsContext属性中保存对物理磁盘(\device\harddisk[num]\partition0)的引用:

1.png

IRP_MJ_CREATE函数

1.png

helper函数

这种行为也可以进行实时测试。我们可以看到,在将这个值转换为整数类型之前,代码是如何删除前导反斜杠的:

1.png

通过内核模式实时调试会话考察参数处理过程

此外,IRP_MJ_CREATE函数会在FsContext2属性中保存硬盘的设备对象指针,该指针将通过helper函数getDeviceObject返回。函数getDeviceObject中的DeviceObject指针,用于查找IRP_MJ_CREATE函数保存在FsContext2属性中的硬盘的设备对象指针(该指针是通过helper函数getDeviceObject返回的)。而 getDeviceObject中的DeviceObject指针,则用于通过IoGetLowerDeviceObject函数遍历最底层的设备对象来查找disk.sys关联的设备对象。为了确认底层设备对象就是我们正在寻找的对象,我们检查对象的ServiceKeyName是否为"Disk":因为disk.sys对象的ServiceKeyName正是“Disk”。这些对象将在稍后的读写操作中用到。这意味着,当从用户模式向驱动程序请求不同的操作时,实际操作将在机器物理磁盘上进行。

1.png

关于getDiskDeviceObject函数

接下来的图片显示了驱动程序如何建立传入的请求并将其转发到下级设备:

1.png

EaseUS驱动处理IOCTL请求的例子

1.png

EaseUS驱动处理读操作的例子

1.png

EaseUS驱动处理IOCTL写操作的例子

通过使用从用户模式执行的CreateFile操作所保存的FsContext2字段,可以将这个驱动程序看作是一个代理驱动程序,其中IRP由底层设备处理。简而言之,这个合法的驱动程序可以让攻击者绕过一些windows的安全机制,而这些机制能够阻止他们在用户模式下执行某些操作,如禁止对磁盘的某些扇区进行写操作等。

数据擦除器的具体实现

这个恶意软件旨在最大限度地破坏系统。它不仅会覆盖MBR,而且更进一步:遍历文件系统的相关结构体并加以破坏,甚至直接破坏单个文件。

我们知道,这个可执行文件将以某种方式滥用这些驱动程序来实现数据破坏功能。然而,问题来了,它到底是如何实现的呢?

值得注意的是,Windows(自Vista以来)引入了一些安全措施,使得攻击者只能在用户模式(在标准Windows驱动程序的帮助下)下对磁盘开头部分的扇区执行写操作。如果我们想对其他扇区进行写操作,即覆盖MFT(主文件表),我们需要一些自定义的变通方法(详情请参阅https://community.osr.com/discussion/101522/vista-rtm-writing-to-raw-disk-sectors)。

对于Petya(以及NotPetya,使用了相同的组件)来说,其解决方案是由另一个“内核”实现的,该内核(而不是Windows系统)在机器重新启动时引导,并完成相应的覆盖任务。对于HermeticWiper来说,其作者使用了一种更简单的方法:他们使用了另一个驱动程序,该驱动程序能够完成这样的覆盖操作。

首先,该恶意软件会解析NTFS结构体,并将有关它们的信息存储在内部结构体中。为了实现读取,它使用了标准系统设备。在收集到所需的数据之后,附加的驱动程序(EaseUS)就开始发挥作用:它被用作对收集的扇区进行写操作的代理。

攻击可分为以下几个阶段:

准备工作,包括:

  安装附加驱动程序(EaseUS)

  禁用可能有助于恢复或检测攻击行为的系统功能

数据收集:遍历NTFS结构体,收集将要覆盖的扇区和文件。此外,为进一步的覆盖活动而生成适当大小的随机数据。

垃圾处理(在此阶段使用EaseUS驱动程序):利用上一步生成的随机数据覆盖收集的扇区

最后,系统将自动重启。

执行流程

现在,让我们来分析恶意软件样本,看看这些阶段是如何实现的。

准备工作

首先,该样本会解析命令行参数。实际上,这些参数对执行的影响很小——可能只是改变样本在特定阶段的执行之间休眠的时间。

然后,该样本会设置执行相关操作所需的特权。在恶意软件的主函数中设置了两个特权:SeShutdownPrivilege(允许重新启动系统)和SeBackupPrivilege(允许操纵系统备份):

1.png

调整所需特权

有趣的转折来了:定义SeShutDownPrivilege的字符串是在堆栈上组成的,而中间的一块却不见了。

1.png

不完整的SeShutdownPrivilege字符串

然后,在根据当前可执行文件名称的第一个字符计算的位置填充这个缺失的块wnPr。因此,只有在样本的名称是以“C”开头的情况下,字符串才会被补上(并且权限设置正确)。

1.png

SeShutdownPrivilege在后面的步骤中补全

关于恶意软件为何要这么大费周章的原因尚不明确,也许只是为了混淆这个特定的可疑字符串。因为恶意软件作者使用名称检查作为反沙箱技术也很常见(因为沙箱可能会给样本指定一些可预测的名称:如果检测到这样的名称,则样本可能会退出,这样沙箱就无法跟踪其行为)。然而,该行为对样本的影响非常小——它只影响重新启动功能,而不是恶意软件的主要任务。

驱动程序的安装

之后,该恶意软件就会进行驱动程序的安装。

1.png

安装驱动程序

安装过程分为以下几个步骤:

首先,对系统进行指纹识别,以便选择最合适的驱动程序版本。具体来说,它会根据Windows的版本和位数(32或64位),来选择资源。

1.png

可加载的驱动程序

在安装驱动程序之前,崩溃转储机制会被禁用。

1.png

HermeticWiper将禁用崩溃转储机制

如果整个系统发生崩溃,可能是由于驱动程序中的错误/不稳定所致,并且通常会进行崩溃转储:保存有关系统的完整状态,以及到底发生了什么方面的信息,以帮助调试。在安装前禁用崩溃转储功能,表明恶意软件的作者对所用驱动程序并不是很有信心,或者认为执行的操作有导致系统崩溃的风险。所以,他们希望即使发生了崩溃,也要设法让管理员很难找到崩溃的原因。

然后,他们检查驱动程序是否已经安装。这一步是通过向驱动程序发送IOCTL来实现的:该IOCTL用于检索驱动器几何形状方面信息。如果该操作失败,这意味着相关驱动程序根本就不存在,他们可以继续安装。

1.png

EaseUS设备对象引用

安装该驱动程序时,首先会根据硬编码的字符集为驱动程序生成一个含有4个字符的伪随机名称。该函数还需确保没有文件与刚才生成的名称重名。

1.png

生成驱动程序名称

然后,植入文件的压缩版本。最后,从中解压缩出相应驱动程序。

1.png

EaseUS驱动程序

解压后的驱动程序,将以系统服务的形式进行安装:

1.png

安装EasyUs驱动程序的代码

此时,新植入的文件也被添加到将进一步传递给擦除函数的结构体中,以便可以在低级别中覆盖文件。这方面的更多信息,请参见“数据收集”部分。

安装函数(即create_driver_svc)首先启用另一个权限:SeLoadDriverPrivilege(允许加载驱动程序所必需的权限):

1.png

SeLoadDriverPrivilege

然后,驱动被添加为系统服务,并启动:

1.png

创建驱动程序服务的相关代码

这将触发DriverEntry函数的执行,从此刻开始,驱动程序就驻留在内存中了。

安装成功后,与服务相关的注册表键值以及被植入的文件将被删除,以使新驱动程序更难被发现。

1.png

删除植入的文件

我们必须注意,删除的文件并不影响驱动程序的功能,因为它们已经加载到了内存中(直到下一次重启),并可继续使用。

小结

在本文中,我们为读者深入分析了数据擦除型的恶意软件HermeticWiper。由于篇幅过长,我们分为上下两篇进行发布。更多精彩内容,敬请期待!

(未完待续)

本文翻译自:https://blog.malwarebytes.com/threat-intelligence/2022/03/hermeticwiper-a-detailed-analysis-of-the-destructive-malware-that-targeted-ukraine/如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论