首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深入分析Gootkit木马的反分析能力

Gootkit恶意软件自2014年曝光之后,已经持续活跃5年。它利用Node.JS库执行一系列恶意任务,并且通过不断更新代码库多次升级和迭代,运用加密、混淆、反调试等手法对软件进行保护,增加其逆向过程中的复杂度,并且检测其运行环境,如果碰到可疑环境,沙箱检测则立即停止运行。凭借以上优势,其恶意代码也是在各大杀软平台查杀率最低的恶意软件之一,一度成为现今最活跃和复杂的木马之一。不过就目前而言,他的流行范围并不是很广,具有明显的定向攻击的特性。比如,从2019年3月末开始,就有研究人员发现许多针对意大利政府敏感单位的持续性钓鱼邮件攻击,并且在4月初达到高峰。经过研究人员的分析和取证,发现这些邮件包含了经过精心构造的诱饵内容,通过诱骗用户点击附件中的文档或程序进行激活,下载对应的后门程序。我们对相关的恶意代码进行分析后,发现其恶意代码种类多样,不仅包含exe可执行程序,还有vbs和js等脚本类语言编写的后门程序。在这些恶意代码中,研究人员发现了一直活跃在相关地区的Gootkit木马软件。其主要功能为窃取用户信息,下载文件,注入指定进程,实现可持续控制的后门。

这篇文章,我们将介绍Gootkit在攻击的第一阶段中所使用的反分析能力,其中包含解压缩阶段和恶意下载程序(用于设置受感染的系统),以及其他多种反分析机制。

解压缩阶段的反分析机制

样本MD5:0b50ae28e1c6945d23f59dd2e17b5632

对于这个样本,解压缩程序非常简单,因为它执行自注入。简单地说,解压缩人只需执行以下操作即可:分配内存区域 - >解密shellcode并复制到分配的区域 - >执行shellcode,解密第一阶段Gootkit可执行文件 - >覆盖未封装的解密可执行文件- >更改解密的可执行文件的保护并对它实施转移。

因此,为了对它进行解压缩,在VirtualAlloc和VirtualProtect上放置断点,并查看在分配的内存区域中出现的可执行标头。

在IDA中打开样本后,你会立即注意到CreateThread API的使用,这在整个二进制文件中被过度使用,据推测,这可能是一种反动态分析方法。由于多个线程同时运行,因此调试程序变得非常困难。但是,可以通过每次只关注一个线程来避免这种情况。由于样本使用的混淆力度过大,静态分析方法并不是一种很好的选择。虽然明文中有相当多的字符串,但几乎所有使用的重要字符串都是在运行时使用简单但有效的XOR算法解密的。不仅字符串被加密,它们也被存储为堆栈字符串,使得提取重要数据变得更加复杂。

如上所述,加密算法其实相当简单,实际上就是2个不同的字符串在起作用。第一个字符串(通常更短)负责循环,使用第二个字符串的字节对每个字节进行异或处理。下面是Python中此算法的一个示例:

可以看出,上面的示例将返回字符串kernel32.dll。

在Gootkit开始执行其恶意例程之前,它首先检查传递给它的参数,就是这些参数决定了攻击发生的路径。Gootkit接受的可能参数是:

--reinstall

--service

-test

--vwxyz

如果没有给出参数,Gootkit将执行一个设置例程,然后使用--vwxyz参数开始执行。--test参数只是导致进程退出,而--reinstall参数将使用我们将在下一篇文章中介绍的持久性方法重新安装Gootkit。最后,--service参数将只设置一个额外的环境变量,特别是变量名称USERNAME_REQUIRED,其值设置为TRUE。在这篇文章中,我们将主要关注恶意软件的安装阶段,以了解Gootkit在使用--vwxyz参数执行之前所采取的步骤。

反分析功能的介绍

如前所述,Gootkit包含大量反分析功能,可以避开沙箱检测,防止在虚拟机中执行,并降低分析速度。有趣的是,如果设置了特定的环境变量,则会跳过负责这些功能的函数。在运行时设置的变量名为crackmeololo,给它的值是navigator。在检查值时,Gootkit将使用CRC-32/JAMCRC哈希来检查有效性,而不是将其与字符串进行比较。如果CRC哈希不匹配,则系统检查开始。

Gootkit执行的第一项检查是文件名检查,简单地说,就是在二进制文件中有一个硬编码的CRC哈希文件名列表,它们与当前文件名的哈希值进行比较。如果找到匹配项,Gootkit将创建一个批处理文件,删除原始可执行文件,然后该进程将退出。Gootkit搜索的文件名列表如下所示:

SAMPLE.EXE

MALWARE.EXE

BOT.EXE

SANDBOX.EXE

TEST.EXE

KLAVME.EXE

MYAPP.EXE

TESTAPP.EXE

下一次检查会立即在文件名检查后执行,此时Gootkit将创建另一个线程,它将使用OutputDebugStringA输出字符串“MP3 file corrupted”,然后再次检查环境变量crackmeololo。深入到代码中,研究人员发现如果在主机中有名为“crackmeololo”的环境变量,则该值将设置为“1”,否则设置为“0”。如果CRC哈希匹配,它将继续解密板载配置;如果没有,,它将对环境执行更深入的检查。

首先,它首先打开注册表项Hardware\DESCRIPTION\SystemDESCRIPTION\System\CentralProcessor\0,然后查询ProcessorNameString,将值与Xeon进行比较。Xeon处理器主要用于服务器,而不是笔记本电脑或台式机。这是恶意软件在沙箱中运行的一个很好的指标,因此如果检测到它,Gootkit将进入无限的睡眠循环周期。

如果未检测到Xeon,将继续执行,然而,下一次检查更加密集。与文件名检查类似,Gootkit还包含用于检测沙箱或VM的MAC地址标识符的硬编码列表。加载RPCRT4.DLL后,它将调用UuidCreateSequential,然后使用MAC地址创建GUID。如果任何一个值匹配,它将再次进入无限的睡眠循环周期。以下就是硬编码的MAC地址列表以及相应的供应商:

接下来,Gootkit将调用GetModuleHandleA以尝试获取dbghelp.dll和sbiedll.dll的句柄,以尝试检测当前的调试器或沙箱Sandboxie。如果成功返回句柄,将会出现无限的睡眠周期。接着,Gootkit将通过调用GetUserNameA来检索当前用户名,并与CurrentUser和Sandbox进行比较。然后将检索计算机名称,并与SANDBOX和7SILVIA进行比较。你可能已经猜到,如果其中任何一个匹配,样本同样将进入无限的睡眠周期。

接着,Gootkit将查询HARDWARE\DESCRIPTION\System\SystemBiosVersion并将查询值与AMI, BOCHS, VBOX, QEMU, SMCI, INTEL – 6040000, FTNT-1和 SONI进行比较。你可能已经猜到,如果其中任何一个匹配,样本同样将进入无限的睡眠周期。

接着,Gootkit将执行另一个注册表查询,这次使用HARDWARE\Description\System\VideoBiosVersion,将值与VirtualBox进行比较。最后,Gootkit将查询SOFTWARE\Microsoft\Windows\CurrentVersion\SystemBiosVersion或HARDWARE\DESCRIPTION\System\SystemBiosVersion,以获取与Joe Sandbox和CWSandbox对应的3个值:

如果所有检查都通过了,则Gootkit将通过设置持久性并从C2服务器检索有效载荷,继续执行攻击。不过在执行攻击之前,Gootkit将使用我们之前看到的相同CRC哈希再次检查其文件名。

在下一篇文章中,我们将研究Gootkit使用的持久性攻击方法,并查看--reinstall路径,以及用于检索最终阶段的通信例程的示例。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190901A0D14V00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券