九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

admin 2023年3月31日13:12:18评论54 views字数 7758阅读25分51秒阅读模式

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

写在前边



1.本文原文为K A, Monnappa. 2018年发表的《Learning Malware Analysis》的章节选段,本文均为译者对相关内容的翻译及实践记录,仅供各位学术交流使用。另出于易读性考虑,对部分字句有所删改。 
2.如各位需要引用,请做原文引用,格式如下所示: 
[序号]K A, Monnappa. LearningMalware Analysis[M]. 2018.06. Published by Packt Publishing Ltd. Livery Place 35 Livery Street Birmingham B3 2PB, UK. 
3.因文章整体内容较长,完整内容将会在本公众号拆分为多篇内容分别发出。本文为该系列的第三篇。
往期内容请参见合集《Learning Malware Analysis》





3. 检测API钩子

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


在将恶意代码注入目标进程后,恶意软件可以在目标进程发出的API调用时钩住,以控制其执行路径,并将其重新定位到恶意代码。关于钩子技术的细节已经在先前的文章代码注入和钩子中介绍过了。在本节中,我们将主要关注使用内存取证来检测这种挂钩技术。


要识别进程和内核内存中的API钩子,你可以使用apihooks Volatility插件。在下面Zeus bot的例子中,一个可执行文件被注入到explorer.exe进程的内存地址0x2c70000,由malfind插件检测到:

$ python vol.py -f zeus.vmem --profile=Win7SP1x86 malfindProcess: explorer.exe Pid: 1608 Address: 0x2c70000Vad Tag: Vad Protection: PAGE_EXECUTE_READWRITE   Flags: Protection: 60x02c70000 4d 5a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 MZ.............. 0x02c70010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x02c70020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x02c70030 00 00 00 00 00 00 00 00 00 00 00 00 d8 00 00 00 ................

*左右滑动查看更多


在下面的输出中,apihooks插件在用户模式的API httpendrequestA(在wininet.dll中)中检测钩子。然后,被钩住的API被重定向到地址0x2c7ec48(钩子地址)。钩子地址在注入的可执行文件(钩子模块)的地址范围内。钩子模块的名称是未知的,因为它通常不是从磁盘加载的(而是注入的)。


具体来说,在API函数httpendrequesta的起始地址(0x753600fc),有一个跳转指令,它将httpendrequesta的执行流重定向到注入的可执行文件中的地址0x2c7ec48:

$ python vol.py -f zeus.vmem --profile=Win7SP1x86 apihooks -p 1608
Hook mode: UsermodeHook type: Inline/TrampolineProcess: 1608 (explorer.exe)Victim module: wininet.dll (0x752d0000 - 0x753c4000) Function: wininet.dll!HttpSendRequestA at 0x753600fc Hook address: 0x2c7ec48Hooking module: <unknown>Disassembly(0):0x753600fc e947eb918d0x75360101 83ec380x75360104 560x75360105 6a380x75360107 8d45c8JMP 0x2c7ec48SUB ESP, 0x38PUSH ESIPUSH 0x38LEA EAX, [EBP-0x38]

*左右滑动查看更多


九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)





4. 内核模式rootkit

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


恶意程序(如rootkit)可以加载内核驱动程序以内核模式运行代码。一旦它在内核空间中运行,它就可以访问内部操作系统代码,并可以监视系统事件,通过修改内部数据结构、钩子函数和修改调用表来逃避检测。内核模式驱动程序的扩展名通常是.sys,它驻留在%windir%system32drivers中。一个内核驱动通常是通过创建一个内核驱动服务类型的服务来加载的。


Windows实现了各种安全机制,旨在防止在内核空间中执行未经授权的代码。这使得rootkit很难安装内核驱动程序。在64位Windows上,Microsoft实现了内核模式代码签名(KMCS),它要求对内核模式驱动程序进行数字签名,以便加载到内存中。另一种安全机制是内核补丁保护(KPP),也被称为PatchGuard,它可以防止对核心系统组件、数据结构和调用表(如SSDT、IDT等)的修改。


这些安全机制对大多数rootkit是有效的,但与此同时,这迫使攻击者想出先进的技术,允许他们安装未签名的驱动程序,并绕过这些安全机制。一种方法是安装Bootkit。Bootkit会感染系统启动过程的早期阶段,甚至在操作系统完全加载之前。另一种方法是利用内核或第三方驱动程序中的漏洞来安装无签名驱动程序。在本章的其余部分,我们将假设攻击者已经成功安装了内核模式驱动程序(使用Bootkit或通过利用内核级漏洞),我们将重点讨论内核内存取证,其中包括识别恶意驱动程序。


在一个干净的windows系统上,您会发现数百个内核模块,因此找到恶意内核模块需要一些工作。在下面的部分中,我们将研究一些用于定位和提取恶意内核模块的常用技术。我们将从列出内核模块开始。





5. 清单内核模块

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


要列出内核模块,可以使用modules插件。这个插件依赖于行走双向链表的元数据结构(KLDR_DATA_TABLE_ENTRY)指出PsLoadedModuleList(这种技术类似于行走_EPROCESS双向链表的结构)。


清单内核模块可能并不总是帮助你识别恶意内核驱动程序的数以百计的加载内核模块,但是它可以用于发现一个可疑的指标如一个内核驱动程序有一个奇怪的名字,或从非标准内核模块加载路径或临时路径。内核模块的模块插件列表的顺序加载,这意味着如果一个rootkit司机最近安装了,你很可能会发现模块的列表,提供模块不是隐藏和系统内存映像收购之前没有重启。


在下面的例子中,一个被Laqma rootkit感染的内存映像中,模块列表显示了Laqma的恶意驱动程序lanmandrv.sys,位于列表的最后,从C:WindowsSystem32目录运行,而大多数其他内核驱动程序是从SystemRootSystem32drivers加载的。


从清单中,我们还可以看到等核心操作系统组件NT内核模块(ntkrnlpa.exe或ntoskrnl.exe)和硬件抽象层(hal.dll)加载第一,紧随其后的是引导驱动(比如kdcom.dll)在引导时自动启动,然后跟着其他驱动:

$ python vol.py -f laqma.vmem --profile=Win7SP1x86 modulesVolatility Foundation Volatility Framework 2.6Offset(V) Name Base Size File---------- ------------ ---------- -------- ------------------------------ --- 0x84f41c98 ntoskrnl.exe 0x8283d000 0x410000SystemRootsystem32ntkrnlpa.exe0x84f41c20 hal.dll      0x82806000 0x37000SystemRootsystem32halmacpi.dll0x84f41ba0 kdcom.dll    0x80bc5000 0x8000[REMOVED]0x86e36388 srv2.sys 0xa46e1000 0x4f000 SystemRootSystem32DRIVERSsrv2.sys 0x86ed6d68 srv.sys 0xa4730000 0x51000 SystemRootSystem32DRIVERSsrv.sys 0x86fe8f90 spsys.sys 0xa4781000 0x6a000 SystemRootsystem32driversspsys.sys 0x861ca0d0 lanmandrv.sys 0xa47eb000 0x2000 ??C:WindowsSystem32lanmandrv.sysSystemRootsystem32kdcom.dll

*左右滑动查看更多


九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


由于浏览双链接列表容易受到DKOM攻击(可参照使用内存取证查找恶意软件),通过解除链接可以从列表中隐藏内核驱动程序。为了克服这个问题,我们可以使用另一个名为modscan的插件。modscan插件依赖于池标签扫描方法(可参照使用内存取证来捕获恶意软件)。换句话说,它扫描物理地址空间,寻找与内核模块相关的池标记(MmLd)。通过池标签扫描,可以检测到未链接的模块和之前加载的模块。modscan插件以它们在物理地址空间中被找到的顺序显示内核模块,而不是基于它们被加载的顺序。


下面以Necurs rootkit为例,modscan插件显示的恶意内核驱动程序(2683608180e436a1.sys)的名称完全由十六进制字符组成:

$ python vol.py -f necurs.vmem --profile=Win7SP1x86 modscan Volatility Foundation Volatility Framework 2.6Offset(P)          Name                 Base       Size   File------------------ -------------------- ---------- ------ --------   0x0000000010145130 Beep.SYS   SystemRootSystem32DriversBeep.SYS   0x000000001061bad0 secdrv.SYS   SystemRootSystem32Driverssecdrv.SYS   0x00000000108b9120 rdprefmp.sys   SystemRootsystem32driversrdprefmp.sys   0x00000000108b9b10 USBPORT.SYS          0x9711e000 0x4b000   SystemRootsystem32DRIVERSUSBPORT.SYS   0x0000000010b3b4a0 rdbss.sys            0x96ef6000 0x41000   SystemRootsystem32DRIVERSrdbss.sys[REMOVED]0x000000001e089170 2683608180e436a1.sys 0x851ab000 0xd000 SystemRootSystem32Drivers2683608180e436a1.sys 0x000000001e0da478 usbccgp.sys 0x9700b000 0x17000 SystemRootsystem32DRIVERSusbccgp.sys

*左右滑动查看更多

当运行模块插件针对感染Necurs rootkit的内存映像时,它不会显示恶意驱动程序(2683608180e436a1.sys):

$ python vol.py -f necurs.vmem --profile=Win7SP1x86 modules | grep 2683608180e436a1

*左右滑动查看更多


由于modscan使用池标记扫描方法,它可以检测未加载的模块(假设内存没有被覆盖),因此恶意驱动程序2683608180e436a1是有可能的。Sys被迅速加载和卸载,或者被隐藏起来。要确认驱动程序是被卸载还是被隐藏,可以使用unloaddmodules插件,它会显示被卸载的模块列表以及每个模块被卸载的时间。


在下面的输出中,无恶意驱动2683608180e436a1.Sys告诉我们这个驱动程序没有被卸载,它是隐藏的。可以看到另一个恶意驱动程序2b9fb.Sys,以前是快速加载和卸载的(没有出现在modules和modscan清单中,如下面的输出所示)。unloaddmodules插件可以在检测rootkit试图快速加载和卸载驱动的过程中被证明是有用的,这样它就不会出现在模块列表中:

$ python vol.py -f necurs.vmem --profile=Win7SP1x86 unloadedmodules Volatility Foundation Volatility Framework 2.6Name StartAddress EndAddress Time----------------- ------------ ---------- ------------------- dump_dumpfve.sys 0x00880bb000 0x880cc000 2016-05-11 12:15:08 dump_LSI_SAS.sys 0x00880a3000 0x880bb000 2016-05-11 12:15:08 dump_storport.sys 0x0088099000 0x880a3000 2016-05-11 12:15:08 parport.sys 0x0094151000 0x94169000 2016-05-11 12:15:09 2b9fb.sys 0x00a47eb000 0xa47fe000 2018-05-21 10:57:52

*左右滑动查看更多


九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


$ python vol.py -f necurs.vmem --profile=Win7SP1x86 modules | grep -i 2b9fb.sys$ python vol.py -f necurs.vmem --profile=Win7SP1x86 modscan | grep -i 2b9fb.sys

*左右滑动查看更多




5.1 使用驱动程序列出内核模块



列出内核模块的另一种方法是使用driverscan插件,如下面的输出所示。driverscan插件从名为DRIVER_OBJECT的结构中获取与内核模块相关的信息。具体来说,driverscan插件使用池标记扫描来查找物理地址空间中的驱动程序对象。


第一列Offset(P)指定了发现DRIVER_OBJECT结构的物理地址,第二列Start包含模块的基址,Driver Name列显示了Driver的名称。例如,驱动程序的名称driverBeep与Beep.Sys,最后一项显示恶意驱动程序,Driver2683608180e436a1,与Necurs rootkit关联。driverscan插件是列出内核模块的另一种方式,当rootkit试图隐藏模块和modscan插件时,它会很有用:

$ python vol.py -f necurs.vmem --profile=Win7SP1x86 driverscanVolatility Foundation Volatility Framework 2.6Offset(P) Start Size Service Key Name Driver Name ------------------ -------- ------- ----------- ------ ----------- 0x00000000108b9030 0x88148000 0x8000 RDPENCDD RDPENCDD DriverRDPENCDD 0x00000000108b9478 0x97023000 0xb7000 DXGKrnl DXGKrnl DriverDXGKrnl 0x00000000108b9870 0x88150000 0x8000 RDPREFMP RDPREFMP DriverRDPREFMP 0x0000000010b3b1d0 0x96ef6000 0x41000 rdbss rdbss FileSystemrdbss 0x0000000011781188 0x88171000 0x17000 tdx tdx Drivertdx 0x0000000011ff6a00 0x881ed000 0xd000 kbdclass kbdclass Driverkbdclass 0x0000000011ff6ba0 0x880f2000 0x7000 Beep Beep DriverBeep [REMOVED]   0x000000001e155668 0x851ab000 0xd000 2683608180e436a1 26836...36a1   Driver2683608180e436a1

*左右滑动查看更多


九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


要列出使用内核调试器(Windbg)的内核模块,请如下所示使用lm k命令。对于详细输出,可以使用lm kv命令:

kd> lm kstart end module name80bb4000 80bbc000 kdcom (deferred)82a03000 82a3a000 hal (deferred)82a3a000 82e56000 nt (pdb symbols)8b200000 8b20e000 WDFLDR (deferred)8b20e000 8b22a800 vmhgfs (deferred)8b22b000 8b2b0000 mcupdate_GenuineIntel (deferred) 8b2b0000 8b2c1000 PSHED (deferred)8b2c1000 8b2c9000 BOOTVID (deferred)8b2c9000 8b30b000 CLFS (deferred)[REMOVED]

*左右滑动查看更多


识别出恶意内核模块后,可以使用moddump插件将其从内存转储到磁盘。要将模块转储到磁盘,我们需要指定模块的基本地址,可以从modules、modscan或driverscan插件获得该基本地址。以将Necurs rootkit的恶意驱动通过其基址转储到磁盘为例,如下所示:

$ python vol.py -f necurs.vmem --profile=Win7SP1x86 moddump -b 0x851ab000 - D dump/Volatility Foundation Volatility Framework 2.6Module Base Module Name Result   -----------  --------------    ------   0x0851ab000    UNKNOWN         OK: driver.851ab000.sys

*左右滑动查看更多


(未完待续)



往期回顾


九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)


关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

原文始发于微信公众号(安恒信息安全服务):九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年3月31日13:12:18
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-青队(处置)| 使用内存取证检测高级恶意软件(三)https://cn-sec.com/archives/1641937.html

发表评论

匿名网友 填写信息