欢迎进入UG环球官网(环球UG)!

usdt充币教程(www.6allbet.com):恶意软件剖析:行使Speakeasy仿真执行内核态Rootkits

admin2个月前53

USDT自动充值

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

0x00 概述

在2020年8月,我们公布了一篇文章,内容涉及到若何使用Speakeasy仿真框架来模拟用户模式的恶意软件,例如Shellcode。我们建议还没有读过这篇文章的读者首先阅读这篇文章。

除了用户模式仿真之外,Speakeasy还支持内核模式Windows二进制文件的仿真。当恶意软件作者使用内核模式的恶意软件时,通常会接纳装备驱动程序的形式,其最终目的是完全熏染目的系统。该恶意软件通常不与硬件交互,而是行使内核模式完全损坏系统并保持隐蔽性。

0x01 动态剖析内核恶意软件面临的挑战

理想情况下,可以使用反汇编程序之类的工具对内核模式的样本举行静态剖析。然则,二进制加壳程序和用户模式样本一样,容易混淆内核恶意软件。另外,静态剖析通常成本较高,且花费大量时间。若是我们的义务是自动剖析统一恶意软件家族的多个变种,那么可以动态剖析恶意驱动程序样本。

与用户模式样本相比,对内核模式恶意软件的动态剖析可能会涉及更多内容。为了调试内核恶意软件,需要建立适当的环境。这个历程通常会涉及到将两个自力的虚拟机设置为调试器和被调试器。然后,可以将该恶意软件作为按需的内核服务举行加载,这里可以使用WinDbg之类的工具远程调试驱动程序。

此外,还存在一些使用挂钩或其他监视手艺的沙箱型应用程序,但通常以用户模式应用程序为目的。对于内核模式代码来说,也有类似的沙箱监视事情,会需要用到对照深入的系统级挂钩,这可能会发生很大的噪音。

0x02 驱动程序仿真

对于恶意程序来说,仿真是一种有用的剖析手艺。通过这种方式,我们不需要自定义设置,而且可以大规模模拟驱动程序。此外,与沙箱环境相比,这种方式更容易实现更大的代码笼罩局限。通常,rootkit可能会通过I/O请求数据包(IRP)处置程序(或其他回调)公然恶意功效。在通俗的Windows系统上,当其他应用程序或装备向驱动程序发送输入/输出请求时,将会执行这些例程。这里包罗一些常见的义务,例如读取、写入或将装备I/O控制(IOCTL)发送给驱动程序以执行某种类型的功效。

使用仿真的方式,可以使用IRP数据包直接挪用这些入口点,以便在rootkit中标识尽可能多的功效。正如我们在第一篇Speakeasy文章中所讨论的,在发现其他入口点时会对其举行仿真。驱动程序的DriverMain入口点卖力初始化一个函数分配表,该表将被挪用以处置I/O请求。在主入口点完成后,Speakeasy将实验通过提供虚拟IRP来仿真这些函数。此外,按顺序模拟所有建立的系统线程或事情项,以尽可能笼罩更多的代码。

0x03 仿真内核模式植入工具

在这篇文章中,我们将展示Speakeasy在仿真真实内核模式植入工具(Winnti)的一个案例。只管我们之前就使用过这个示例,但在本文中照样选择了它,由于它以对照透明的方式实现了一些经典的rootkit功效。这篇文章并不是对恶意软件自己举行剖析,由于恶意软件已经过时了,相反,我们将专注于仿真时代捕获到的事宜。

我们所剖析的Winnti样本的SHA-256哈希值为c465238c9da9c5ea5994fe9faf1b5835767210132db0ce9a79cb1195851a36fb,其原始文件名为tcprelay.sys。在本文的大部门案例中,我们都将检查Speakeasy天生的仿真讲述。注重,由于内核补丁程序珍爱(PatchGuard)可以防止对要害内核数据结构举行修改,因此这个32位rootkit所接纳的许多手艺在现代64位版本的Windows上将不起作用。

首先,我们将使用Speakeasy凭据下图所示的下令行来仿真内核驱动程序。我们指示Speakeasy建立一个完整的内核转储(使用“-d”标志),以便后续可以获取内存。这里还加上了内存跟踪标志(“-m”),它将纪录恶意软件执行的所有内存读取和写入操作。这对于检测挂钩和直接内核工具操作(DKOM)等异常有辅助。

用于仿真恶意驱动程序的下令行:

随后,Speakeasy将最先仿真恶意软件的DriverEntry函数。驱动程序的入口点卖力设置被动回调例程,该例程将为用户模式I/O请求以及用于装备添加、移除和卸载的回调提供服务。我们可以查看恶意软件DriverEntry函数的仿真讲述(在JSON讲述中以“epry_point”的“ep_type”标识),解释该恶意软件找到了Windows内核的基址。该恶意软件通过使用ZwQuerySystemInformation API来找到所有内核模块的基址,然后查找一个名为“ntoskrnl.exe”的工具来实现此目的。随后,恶意软件会手动找到PsCreateSystemThread API的地址。然后,它用于启动系统线程以执行其现实功效。下图展示了从恶意软件入口点挪用的API。

tcprelay.sys入口点中的要害功效:


0x04 隐藏驱动程序工具

该恶意软件会在执行其主系统线程之前实验隐藏自身。恶意软件首先在自己的DRIVER_OBJECT结构中查找“DriverSection”字段。该字段包罗一个带有所有已加载内核模块的链表,恶意软件实验将自身作废链接,从而在列出已加载驱动程序的API中隐藏。在下图Speakeasy讲述中的“mem_access”字段中,我们可以看到在其前后划分对DriverSection条目举行了两次内存写入,这会将其自身从链表中删除。

示意tcprelay.sys恶意软件的内存写入事宜,实验将自身作废链接以实现隐藏:


如之前的Speakeasy文章所述,当在运行时建立线程或其他动态入口点时,框架会追随它们举行仿真。在这种情况下,恶意软件会建立一个系统线程,而Speakeasy会自动对其举行仿真。

我们转到新建立的线程(由“system_thread”的“ep_type”标识),可以看到恶意软件最先了真正的功效。该恶意软件首先遍历主机上所有正在运行的历程,然后查找名为services.exe的服务控制器历程。最主要的是,通过对JSON设置文件举行设置,可以纪录仿真样本的历程列表。有关这些设置选项的更多信息,可以参见我们GitHub堆栈上的Speakeasy README。这个可设置历程列表的示例如下图所示。

提供给Speakeasy的历程列表设置字段:


0x05 转到用户模式

一旦恶意软件找到了services.exe历程,它将附加到历程上下文,并最先检查用户模式内存,以便找到导出的用户模式函数的地址。恶意软件会这样做,以便可以将编码的、驻留在内存的DLL注入到services.exe历程中。下图展示了rootkit用于解决其用户模式导出的API。

tcprelay.sys rootkit用于解决其用户模式植入工具导出问题的日志API:


在解决了导出函数之后,rootkit准备注入用户模式DLL组件。接下来,恶意软件手动将内存中的DLL复制到services.exe历程地址空间中。这些内存写入事宜被捕获到,如下图所示。

,

usdt支付接口

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

将用户模式植入复制到services.exe时捕获到的内存写入事宜:


Rootkit用于执行用户模式代码的常用手艺依赖于一种名为“异步历程挪用”(Asynchronous Procedure Calls,APC)的Windows功效。APC是在提供的线程的上下文中异步执行的函数。使用APC,内核模式应用程序可以将代码以行列方式在线程的用户模式上下文中运行。恶意软件通常会希望注入用户模式,由于这样一来,就可以更容易地接见Windows内的许多常用功效(例如网络通信)。此外,若是在用户模式下运行,在代码Bug排查历程中被发现的概率较小。

为了让APC凭据行列顺序以用户模式启动,恶意软件必须将线程定位为Alertable的状态。当线程将执行交给内核线程调剂程序并通知内核可以分配APC时,通常就被称为是“可忠告的”(线程守候状态)。恶意软件会在services.exe历程中搜索线程,一旦检测到可忠告的线程,它将为DLL分配内存以记性呢注入,然后将APC凭据行列顺序执行。

Speakeasy模拟这个历程中涉及到的所有内核结构,特别是为Windows系统上的每个线程分配的执行线程工具(ETHREAD)结构。恶意软件可能会实验遍历这种不透明的结构,以识别何时设置了线程的忠告标志(APC的有用候选工具)。下图展示了Winnti恶意软件在services.exe历程中手动剖析ETHREAD结构以确认其处于可忠告状态时纪录的内存读取事宜。在撰写本文时,默认情况下,仿真器中的所有线程都将自己示意为可忠告的状态。

tcprelay.sys恶意软件确认线程是否处于可忠告状态时纪录的事宜:


接下来,恶意软件可以使用此线程工具执行所需的任何用户模式代码。其中未纪录的函数KeInitializeApc和KeInsertQueueApc将划分初始化并执行用户模式APC。下图显示了恶意软件用于将用户模式模块注入到services.exe历程的API集。该恶意软件执行一个Shellcode stub作为APC的目的,然后将为注入的DLL执行一个加载程序。所有这些都可以从内存转储中恢复,并在后续举行剖析。

tcprelay.sys rootkit用于通过APC注入到用户模式的日志API:


0x06 网络挂钩

在注入到用户模式后,内核组件将实验安装网络混淆挂钩(推测是用于隐藏用户模式植入工具)。Speakeasy跟踪并符号仿真空间中的所有内存。在内核模式仿真的上下文中,这包罗所有内核工具(例如驱动程序、装备工具以及内核模块自己)。我们观察到恶意软件将其用户模式植入后,立刻最先实验挂钩内核组件。凭据静态剖析的效果,我们确认它用于网络隐藏。

仿真讲述的内存接见部门显示,该恶意软件修改了netio.sys驱动程序,特别是在名为NsiEnumerateObjectsAllParametersEx的导出函数中的代码。当系统上的用户运行“netstat”下令时,最终会挪用这个函数,与此同时恶意软件可能会对这个函数举行挂钩,以隐藏受熏染系统上已毗邻的网络端口。这个内联挂钩使用了下图所示的事宜标识。

恶意软件设置的内联函数挂钩,用于隐藏网络毗邻:


此外,恶意软件还会挂钩TCPIP驱动程序工具,以实现其他的网络隐藏功效。详细而言,该恶意软件将TCPIP驱动程序的IRP_MJ_DEVICE_CONTROL处置程序挂钩。查询流动毗邻时,用户模式代码可能会将IOCTL代码发送给这个函数。通过查找对要害内核工具的内存写入,可以使用Speakeasy轻松识别这种挂钩,如下图所示。

用于挂钩TCPIP网络驱动程序的内存写入事宜系统服务调剂表挂钩:


0x07 系统服务分配表挂钩

最后,rootkit将实验使用系统服务分配表(SSDT)修补这种近乎古老的手艺来隐藏自身。Speakeasy分配了伪造的SSDT,以便恶意软件可以与其举行交互。SSDT是一个函数表,可以将内核功效公然给用户模式代码。下图中的事宜解释,SSDT结构在运行时已经被修改。

Speakeasy检测到的SSDT挂钩:


若是我们在IDA Pro中查看恶意软件,就可以确认该恶意软件已经修改了ZwQueryDirectoryFile和ZwEnumerateKeyAPI的SSDT条目,以用于隐藏自身,不会在文件系统剖析和注册表剖析历程中被发现。

IDA Pro中显示的用于文件隐藏的SSDT修改后函数:


在设置完这些挂钩后,系统线程将会推出。驱动程序中的其他入口点(例如IRP处置程序和DriverUnload例程)不是太值得剖析,其中包罗的基本都是示例驱动程序代码。

0x08 获取注入的用户模式植入工具

现在,我们已经知道了驱动程序在系统上隐藏自身的方式,就可以用Speakeasy建立的内存转储来获取前面所说的注入的DLL。打开我们在仿真时建立的ZIP文件,可以找到上稳重引用过的内存标签。我们迅速确认了该内存块具有有用的PE标头,而且能够成功地将其加载到IDA Pro中,如下图所示。

从Speakeasy内存转储中恢复的注入用户模式DLL:


0x09 总结

在这篇文章中,我们探索了若何使用Speakeasy有用地从内核模式二进制文件中自动识别rootkit流动。Speakeasy可以用于快速分类内核二进制文件,解决了通常情况下难以举行动态剖析的问题。若是想领会更多信息或查看源代码,迎接接见我们的GitHub堆栈( https://github.com/fireeye/speakeasy )。

本文翻译自:https://www.fireeye.com/blog/threat-research/2021/01/emulation-of-kernel-mode-rootkits-with-speakeasy.html
上一篇 下一篇

猜你喜欢

网友评论

  • 2021-03-31 00:01:41

    本场竞赛,诺埃尔获得12分11篮板2封盖。别错过这个了

随机文章
热门文章
热评文章
热门标签