浅谈hook007的自启动手法

0x1前言

hook007是国产远控木马的代表性产物,已经在远控市场上活跃了好几个年头。该款远控木马的攻击目标为游戏玩家,木马持有者以交易游戏装备为理由私信玩家,并利用QQ等即时通信软件联系玩家,发送伪装装备截图来诱导玩家点击,之后玩家计算机会出现鼠标被强制移动,黑屏等情况,等一切恢复正常后玩家的游戏装备已经被转移到木马持有者账号中。因此在游戏界该款木马也被称做“强制交易马”。

hook007是基于gh0st远控框架开发而成,在不断的版本更替中,其远控框架基本保持不变,随着版本变化的是其开机自启动方式以及上线ip解析方式,其中自启动方式是变化最为频繁的。为了躲避杀软的检测,hook007修改自启动方式的频率极高,并且由主流的自启动方式慢慢向偏门的自启动方式发展。而对于一款远控木马而言,在系统长期驻留是其必须保证的一项重要功能,特别是对于此类“强制交易马”,如何在受害者发现异常并关闭计算机之后还能达到持续控制强制交易的效果是木马作者最为看重的一点。本文将介绍近几个月hook007木马自启动的方式及原理。

 

0x2 自启动方式介绍

  1. 基于dll劫持的自启动方式

dll劫持一直是Windows平台上应用程序普遍遇到的一个问题。由于Windows的动态链接机制,计算机中的应用程序会按照一定的路径顺序检索并加载动态链接库文件,而恶意软件可以往该顺序中的某个节点加入自己的恶意dll以达到劫持的效果。

对于一些系统应用程序,其加载的dll文件一般存放于一些较为敏感的文件夹,这将使dll劫持的行为变得非常敏感,而且非常容易被杀软察觉。如果可以在dll加载路径链之外进行dll劫持,将有极大可能躲避杀软的检测,hook007就是利用了这一点。它通过创建系统中不存在的dll来进行dll劫持,系统中虽然不存在该dll,但存在加载该dll的可执行文件,因此这种在dll加载路径链之外进行dll劫持的方法相当巧妙。完成这一任务的主角就是msdtc.exe。

msdtc.exe是微软分布式传输协调程序,以Windows服务的形式存在。该服务在启动过程中会调用一个系统中不存在的dll文件oci.dll。而木马可以生成一个oci.dll文件供msdtc.exe加载,而该dll文件也会随着服务的启动而启动。

1

图1 将木马文件复制为oci.dll

        接着只需要将msdtc服务设置为自动启动即可。

2

图2 使用WMI命令行设置msdtc服务为自动启动

        使用dll劫持完成自启动的方法虽然使用方便,但弊端也很明显,一是常规dll劫持难免会设计敏感目录,二是对于非常规dll劫持难以找到可利用的点。样本中利用系统服务加载不存在的dll的方法无非是借助于系统服务进行版本更替时在动态链接库加载方面更新的疏忽,或者是系统服务在加载动态链接库之前没有进行合理的判断。因此单纯利用dll劫持来完成自启动的方法并不多见,更多的是协同dll劫持和注册表项来完成工作,下面将要介绍的就是利用注册表修改和dll劫持的自启动方法。

2.基于注册表修改和dll劫持的自启动方式

如上所述,单纯的dll劫持由于需要替换特定目录下的特定dll,较容易被检测。而一些非常规的dll劫持可利用的点又相当少。因此,hook007远控木马绕开了这样一种劫持方式,通过联动注册表和dll文件路径来进行劫持。

Spooler服务是windows的打印机服务,在服务启动时,会检索注册表键HKLMSYSTEMCurrentControlSetControlPrintEnvironmentsWindows x64(Windows NT x86)下Directory的键值,而该键值对应的是一个文件夹名称,文件夹位于C:WindowsSystem32spoolprtprocs下。Spooler服务检索该注册表之后会查找该文件夹路径下的winprint.dll(x64下,x86下为TPWinPrn.dll)。hook007远控木马利用这一点修改了注册表键值使其指向另一文件夹,然后在C:WindowsSystem32spoolprtprocs路径下新建该文件夹,并将木马以dll的形式存放到文件夹中,重命名为winprint.dll。

3

图3 木马修改相应注册表项

4

图4 木马设置相应键值

5

图5 利用bitsadmin的transfer参数进行文件的复制

        完成这些工作之后,只需要将Spooler服务设为自动启动即可。

6

图6 获得Spooler服务句柄

7

图7 将Spooler服务设为自动启动

        由于木马将Spooler服务设为自动启动,因此开机后Spooler服务也将自动运行,而该服务会调用相应文件夹下的winprint.dll,同时该dll也遭到劫持,因此木马也就跟随Spooler服务启动。

利用注册表修改和dll劫持来达到自启动的方法相比较单纯的dll劫持而言可利用的点较多,而且灵活性也较强,但还是存在一些问题。以样本中的方法为例,虽然不需要直接劫持系统中的dll,但需要新建一个文件夹来存放木马dll以用于劫持,而在该文件夹的路径设置上也有许多的限制。如果可以在任意路径下达到劫持的效果将是最为方便且最为容易躲过检测的。下面将介绍的就是只利用注册表键值的劫持来达到任意路径下文件劫持的方法。

3.基于注册表劫持的自启动方式

前面提到的结合注册表修改和dll劫持的自启动方式虽然方便且高效,但存在文件目录敏感等问题,如果能够实现任意路径下都能劫持的效果,就可以躲避杀软对于一些敏感目录的检测。要做到这一点,就只能放弃dll劫持,而将目标锁定在注册表键值上,寻找一个可以设置任意路径并被读取的键值作为被利用的点。当然,hook007作者也找到了两个可以被利用的点。

第一个可利用的点来自于RemoteAccess服务。RemoteAccess服务在启动时会读取注册表键HKLMSoftwareMicrosoftRasAdminDll下的DLLPath的值,并加载DLLPath的值所表示的路径下的dll。因此木马可以将DLLPath的值设为木马dll的路径以达到劫持效果。如果将RemoteAccess服务设为自动启动,那么该dll也将随着RemoteAccess服务开机自启。

8

图8 创建相应注册表键

9

图9 设置相应键值

        将DllPath的键值设为木马dll的路径后,同样需要设置RemoteAccess服务为自启动,这样木马dll就会随着RemoteAccess服务的启动而启动。

10

图10 使用WMI命令行设置RemoteAccess服务自启动

        利用注册表劫持来完成自启动的方法相比较前两种方法更加灵活方便,木马程序不需要触碰敏感目录即可达到dll劫持的效果。

不过样本中使用的方法还是有一些缺陷,主要在于RemoteAccess服务会检测AdminDll的导出表,只有AdminDll的导出表中有MprAdminAcceptNewLink,MprAdmininitializaDll,MprAdminLinkHangupNotification,MprAdminTerminateDll四个导出函数的情况下RemoteAccess服务才能启动成功。因此为了让木马dll自启动更加稳定,就必须伪造这四个导出函数,不过这也会带来另一个问题。由于木马执行远程执行功能是需要一定时间的,而RemoteAccess服务启动成功后可能会调用这些函数中的一个或多个,当然调用伪造的导出函数必定会失败触发异常导致程序腿处,这就会影响木马的持续存在。因此需要一个能够较为稳定存在的dll。

第二个可利用的点就是利用了这样一个较为稳定的dll,它劫持一个常见的注册表键HKLMSYSTEMCurrentControlSetServices,这是一个存放系统服务相关信息的注册表键。样本中的木马劫持了系统服务eventlog,也就是事件查看器,通过修改注册表键HKLMSYSTEMCurrentControlSetServiceseventlog下ServiceDll的值来进行dll劫持。

原值对应的是%SystemRoot%System32wevtsvc.dll,木马作者将其改为木马dll的路径,每次事件查看器启动时就会加载该dll。

11

图11 打开对应注册表键

12

图12 将ServiceDll的值设为木马dll的路径

        同样,设置该服务为auto-start即可达到自启动效果。

13

图13 利用WMI命令行设置服务为auto-start

        这个点的利用相对于另一个注册表劫持的方法而言灵活了不少,也没有导出函数的限制,但存在注册表路径敏感的问题。由于可利用的点并不多,这相对来说算是一种比较可行的方法。

 

0x3总结

 hook007木马持续不断改进自启动方式,其目的在于持续地同杀毒软件进行对抗。不过面对木马不断更新换代的技术手段,杀毒软件也在与其持续进行对抗。但无论如何,只有四个字可以概之,那就是“邪不胜正”