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

admin 2022年4月9日02:14:39评论33 views字数 5678阅读18分55秒阅读模式

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

这是本系列文章中的下篇,我们将继续与读者一道,深入分析数据擦除型的恶意软件HermeticWiper。

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

禁用影子副本

删除影子副本是勒索软件的一个常见行为。它应该是为了破坏系统备份,并使恢复工作陷入瘫痪。就本例来说,我们可以看到该样本禁用了影子副本服务。

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

影子副本被禁用

深入分析恶意软件HermeticWiper(下) 数据碎片化

在我们的分析过程中,我们注意到恶意软件会将磁盘上的文件碎片化(与碎片整理相反)。

在运行碎片化例程之前,它会更改与资源管理器相关的一些设置:

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

更改注册表,使发现NTFS操作更加困难

这可能是为了隐藏关于文件状态的信息,使得它们更加难以被发现:

下面的函数显示了碎片化例程的执行过程:

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

用于实现数据碎片化的包装器函数

其中,标准windows目录被排除在外:

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

将被跳过的文件夹列表

这样做既可以节省时间(不破坏标准文件),又可以避免影响系统稳定性。

文件碎片化过程如下所示:

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

碎片详细信息(1)

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

碎片详细信息(2)

数据碎片化算法的实现,是通过将不同的IOCTL_CODES(FSCTL)用作FSCTL_GET_RETRIEVAL_POINTERS和FSCTL_GET_MOVE_FILES来实现的。该代码看起来与碎片整理代码非常相似。但就这里来说,修改的目的是为了实现碎片化,即将文件块分割为碎片,并将其移动到磁盘中的空闲簇中。

深入分析恶意软件HermeticWiper(下) 数据收集

在这些准备工作完成之后,该恶意软件就会进入执行的第二个阶段:数据收集。在各种勒索软件案例中,我们经常会看到这种情况:在加密之前,恶意软件会遍历目录,并列出要攻击的文件清单。该恶意软件的情况与此类似,但更有趣的是,因为该软件在进行目录遍历的时候,使用的不是windows API,而是NTFS文件系统,来读取各种结构体并手动解析它们。为此,该恶意软件需要通过标准的Windows设备来发送IOCTL(新安装的驱动程序尚未使用)。

数据存储

上述解析过程的结果被存储在我们设法重建的自定义结构体中,其定义如下所示:

struct elemStr

{

 elemStr *fLink;

 elemStr *bLink;

 chunkStr *chunkPtr;

 DWORD diskNumber;

 BYTE *randomBufToWrite;

 DWORD sizeBuffer;

};


struct chunkStr

{

 chunkStr *fLink;

 chunkStr *bLink;

 LARGE_INTEGER offset;

 QWORD chunk_size;

};

就像您看到的那样,它们都是链表。

第一个elemStr定义了将被覆盖的元素。之后,代码会检索其大小,并生成专用于覆盖它的随机缓冲区:

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

生成的随机数据

在这里,“chunk”表示要覆盖的物理地址的连续块。

因此,一般来说,恶意软件将在后面的两个步骤中用到这些结构体。第一步是收集所有数据。第二步是使用前面创建的结构体来擦除数据。

深入分析恶意软件HermeticWiper(下) 收集相关元素

正如之前所看到的,这些结构体将被发送给执行数据破坏的函数。以下是以后需要销毁的元素。

恶意软件自身的可执行文件和植入的驱动程序

我们已经看到,攻击者对清理自己的踪迹很感兴趣。为了达到这个目的,他们会从磁盘上删除自己的可执行文件,即使二进制文件本身一直在运行并在内存中。正如HermeticWiper在文件系统中执行的任何其他任务一样,删除自己的二进制文件的方式与其他恶意软件略有不同。攻击者首先设法找到二进制文件在原始文件中的偏移量,最后,他们将覆盖这个特定的偏移量。

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

HermeticWiper文件将被销毁,同时被销毁的还有其他元素

被植入的文件(压缩和未压缩的驱动程序)将被添加到同一结构体中,该动作是在在安装之后完成的。

引导扇区

攻击者的目的之一,就是使设备无法加载操作系统。接下来的第一步,就是枚举所有物理设备以及分区。为此,他们使用循环语句来尝试打开harddisk[num]的句柄,其中num将从0迭代到100:

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

这个循环语句展示了攻击者是如何从HardDisk0迭代到HardDisk100的

然后,所有这些信息都被存储到一个elemStr结构体中,该结构体包含作为磁盘号的数据。在本例中,chunkElement将描述引导扇区的原始地址。在这里,需要特别关注一下C:System Volume Information。另外,攻击者将在boot_sections结构体中添加以下文件夹内容:

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

对parse_NTFS_AND_execute_callback函数的调用

根据Microsoft的说法,“Mount Manager维护每个NTFS卷上的Mount Manager远程数据库,其中Mount Manager记录了为该卷定义的任何挂载点。数据库文件驻留在“NTFS卷上的目录系统卷信息”(详见“Windows Internals, 6th edition”)中。所以,这个技术也是为了提高破坏能力而创造的。最后,利用EasyUS驱动程序,所有这些收集到的偏移量都将像恶意二进制文件一样被覆盖掉。

保留扇区与MFT

和以前一样,恶意软件将再次对物理驱动器ID进行暴力破解,以找到有效的驱动器ID。然后,它会使用IOCTL_DISK_GET_DRIVE_LAYOUT_EX检索有关驱动器上所有主分区的信息,并从相应分区读取第一个扇区。接着,通过ioctl_disk_get_drive_geometry_ex来获取读取磁盘的第一个扇区所需的其他信息。

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

检索每个磁盘的相关信息

一旦读取了分区的第一个扇区,该软件就会在该扇区上调用恶意软件传递的回调函数。

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

之后,它会根据文件系统的类型进行相应的处理:如果是FAT类型,那么它会擦除所有保留扇区,而FAT文件系统中的引导记录扇区是保留扇区的一部分;如果是NTFS类型,该恶意软件就会清除磁盘上存在的MFT和MFTMirror(备份MFT),其目的是使数据恢复更加困难。

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

用于处理FAT文件系统的例程

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

用于处理NTFS文件系统的例程

NTFS卷上的每个文件都是由名为主文件表(MFT)的特殊文件中的记录来表示的。在MFT被破坏的情况下,则可以通过读取MFT镜像来恢复原始MFT,其第一记录与MFT的第一记录相同。MFT表为文件系统提供了相应的索引,并提供了文件驻留位置等信息。如果没有MFT,系统将无法知道有哪些文件夹和文件,以及修改日期等信息。

Bitmap和日志文件

为了阻止数据被恢复,恶意软件还经常会覆盖所有逻辑驱动器上的Bitmap和日志文件。就本例来说,逻辑驱动器是通过GetLogicalDriveStringsW进行检索的。另外,这些结构体在进行数据恢复和取证调查时也很重要。实际上,$bitmap保存了空闲簇和已用簇的相关信息,而$logfile则保存了文件系统中发生的事务日志。

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

此外,用户文件也会受到数据破坏的影响。我们发现该恶意软件还会覆盖C:/Documents and settings文件夹中的所有内容。在现代Windows系统中,该文件夹将指向C:/Users。这个文件夹存放的是用户的数据文件夹(例如,我的文档或桌面)。在这个过程中,有些文件会被跳过,比如APPDATA下的文件,但一般来说,这些文件夹下的所有文件都会被覆盖。

收集需要擦除的簇

数据收集的最后一步,就是获取清除磁盘上所有已占用的簇所需的信息。为了获取这些信息,恶意软件使用了FSCTL_GET_VOLUME_BITMAP IOCTL来获取磁盘上所有已占用和空闲簇的相关信息。该恶意软件会遍历所有的逻辑磁盘,并使用FSCTL_GET_VOLUME_BITMAP检索bitmap,而bitmap中的每一位表示一个簇,值1表示该簇已被占用,0表示该簇处于空闲状态。对于通过IOCTL检索到的bitmap,该恶意软件将对其进行逐位遍历,然后,将所有已经占用的簇添加到前文描述的擦除结构体中。这里要注意的一点是,该恶意软件汇集了所有相邻的簇,而这些相邻的簇是由单个chunk结构表示的——这一点与之前的表示方法不同,那时用一个chunk结构表示单个簇。

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

最后,所有已占用的簇将被收集到一个elemStr类型的结构体中,以便销毁。

深入分析恶意软件HermeticWiper(下) 这一切是如何进行的?

到目前为止,我们已经知道一些NTFS属性(如属性、索引等)是用来收集数据的,之后这些数据将被销毁。接下来,我们将展示一个例子,说明攻击者是如何实现这一功能的,并展示其复杂程度。

为此,我们将以负责收集Windows日志文件的代码为例进行介绍:

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

负责收集Windows日志文件的代码

在调用上述代码之后,会填充一些数据结构,其中包含有关物理磁盘属性和文件夹名称本身的数据。我们对NTFS文件系统的第一次引用是在检索HANDLE的过程中发现的。这个文件夹是作为NTFS流打开的:

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

用于默认目录流的HANDLE

其中,第一个调用将解析$INDEX_ROOT属性,其功能与第二个调用相对类似,也更简单,在第二个调用中使用了$INDEX_ALLOCATION属性。关于这些NTFS属性的其他信息可以在这里找到。我们将假设元素列表足够长,比如$INDEX_ALLOCATION,我们将深入考察这个调用:

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

相关的回调函数

为了更好地理解整个过程,我们需要记住发送的参数。其中,前面的两个参数(nFileIndexLow和nFileIndexHigh)用于调用函数FSCTL_GET_NTFS_FILE_RECORD,它将检索到一条NTFS记录。在进行一些检查之后(例如,检查magic值),我们将调用一个名为 callback_when_attribute_is_found的函数。注意,发送给这个函数的第一个参数将是之前发送的值$INDEX_ALLOCATION(0x20)。

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

调用callback_when_attribute_is_found函数

这个函数将遍历作为记录一部分的所有NTFS属性。为此,代码必须找到第一个属性的偏移量。这个偏移量的长度只有2个字,因为这个偏移是相对于结构体而言的。NTFS记录头部的布局如下所示:

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

NTFS记录头部的布局

一个NTFS文件记录的结构如下所示:

记录头部

属性

属性

属性

NTFS记录的布局

如果我们还记得$INDEX_ALLOCATION(0x20),事情就很容易理解了。这些属性将以一个特定的TypeCode开始,就像$INDEX_ALLOCATION那样。因此,如果其中一个属性与所需的选定类型相匹配,第一个回调函数将被触发。

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

用于匹配属性和回调函数的代码

如果没有匹配的TypeCode,但发现了$ATTRIBUTE_LIST,则将意味着存在更多的属性,但这些属性不适合$MFT表。在这种罕见的情况下,该恶意软件将继续处理这些额外的属性,并将递归地调用第一个函数。

让我们看看这个回调函数会做些什么。记住,这个回调函数,在我们的案例中是indexAllocation_Callback_CollectAllfiles。第一步,是恢复这个属性所指向的流。由于$INDEX_ALLOCATION是一个用于目录的属性,所以这个流可以是一个索引数组(块索引):

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

使用原始磁盘偏移量恢复的块索引数组

由于这是一个索引数组,这些索引将指向某个东西。正如你所想象的,这个东西就是NTFS记录。在原始磁盘中,这些类型的索引看起来如下所示:

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

在原始磁盘镜像文件中发现的索引块的例子

由于索引指向记录,因此,所有这些记录将被递归地发送到初始函数。但是这一次的回调函数将是不同的,类型码也是不同的:

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

调用$DATA回调函数

所以这一次,每条发送的记录都会有不同的表现:将寻找$DATA属性,而不是$INDEX_ALLOCATION($DATA包含文件数据)。另外,执行的回调函数将是不同的(现在命名为dataExecuting)。通过使用第一次调用中发送的磁盘属性,结合从索引中收集的信息,这个回调函数将定位文件在磁盘中的确切位置。最后,这些文件就像我们在本报告中总结的所有文件一样,被作为成员加入到elemStr*结构体中。如上所述,该结构体中包含的偏移量处的内容,将在最后的步骤中被恶意软件所覆盖。

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

调用函数,将文件的偏移量添加到elemStr类型的结构体中,以便以后销毁数据

深入分析恶意软件HermeticWiper(下) 覆盖数据

最后,在收集完所有数据后,恶意软件就开始执行覆盖操作。为此,它会将elemStr结构体传递给该函数,以处理链表上的所有元素:

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

to_overwrite_collected_sections函数

执行覆盖操作的函数首先通过前面安装的驱动程序来获得对扇区的写访问权。然后,它会打开设备,通过偏移量遍历收集的所有chunk,并使用WriteFile来填充先前准备好的随机数据。

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

数据销毁的代码

下面的示例显示了我们实验中的一个日志片段,当我们在恶意软件执行期间转储特定结构体的内容时:首先收集数据,然后使用填充了随机值的结构体来清除磁盘上的扇区:

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

深入分析恶意软件HermeticWiper(下) 小结

如你所见,通过利用合法且无漏洞的签名代码,攻击者就能够绕过许多Windows安全机制。这会带来非常严重的问题,因为出于安全考虑,用户应用程序不应该在内核空间拥有这种程度的控制权限。

另外,我们想说明的是,这种情况下的数据恢复是非常困难的。攻击者首先将文件碎片化,并将其散布到磁盘各处,最后,用随机数据覆盖所有这些碎片。即使没有最后一步(不分青红皂白地向磁盘填充垃圾数据),只是进行碎片化并擦除所需结构体(如$MFT)的话,要想恢复如初也几乎是不可能的。

需要注意的是,该恶意软件为了隐藏自身的踪迹,还会设法破坏$LogFile和Windows事件等相关文件。

参考及来源:https://blog.malwarebytes.com/threat-intelligence/2022/03/hermeticwiper-a-detailed-analysis-of-the-destructive-malware-that-targeted-ukraine/

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

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

原文始发于微信公众号(嘶吼专业版):深入分析恶意软件HermeticWiper(下)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年4月9日02:14:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   深入分析恶意软件HermeticWiper(下)http://cn-sec.com/archives/889637.html

发表评论

匿名网友 填写信息