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

admin 2024年11月27日13:06:22评论15 views字数 7680阅读25分36秒阅读模式

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

写在前边

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》

在先前一章的内容中,我们研究了不同的Volatility插件,它们有助于从内存映像中提取有价值的信息。在本章中,我们将继续内存取证之旅,我们将看到更多的插件,这些插件将会帮助我们从被高级恶意软件感染的内存映像中提取取证痕迹,这些恶意软件使用了隐身和隐藏技术。后续的内容中,我们将重点介绍使用内存取证来检测代码注入技术,并会继续讨论先前在“代码注入和钩子中已经涉及到的一些概念

1. 检测代码注入

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

回想一下先前的系列文章“代码注入和钩子”,代码注入是一种将恶意代码(如EXE、DLL或shellcode)注入合法进程内存并在合法进程的上下文中执行恶意代码的技术。为了向远程进程注入代码,恶意程序通常会分配一个具有读、写和执行权限的内存(PAGE_EXECUTE_READWRITE),然后将代码注入到远程进程分配的内存中。要检测注入远程进程的代码,可以根据内存保护和内存内容查找可疑的内存范围。

一个引人注目的问题是,什么是可疑的内存范围以及如何获得有关进程内存范围的信息?如果我们回想一下前面介绍过的使用ldrmodules检测隐藏DLL部分内容,Windows在内核空间中维护一个名为虚拟地址描述符(VADs)的二叉树结构,每个VAD节点描述进程内存中一个几乎连续的内存区域。如果进程内存区域包含一个内存映射文件(如可执行文件、DLL等),那么其中一个VAD节点存储有关其基址、文件路径和内存保护的信息。

下面的描述不是VAD的准确表示,但它将有助于我们理解这个概念。在下面的截图中,内核空间中的一个VAD节点描述了关于进程可执行文件(explorer.exe)加载位置、它的完整路径和内存保护的信息。类似地,其他VAD节点将描述进程内存范围,包括那些包含映射的可执行映像(如DLL)的进程。这意味着VAD可以用来确定每个相邻进程内存范围的内存保护,它还可以给出包含内存映射镜像文件(如可执行文件或DLL)的内存区域的信息:

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

1.1 通过采用信息

要从内存映像中获取VAD信息,可以使用vadinfo Volatility插件。下面以vadinfo为例,使用进程ID (pid 2180)显示explorer.exe进程的内存区域。

在下面的输出中,内核内存中地址为0x8724d718的第一个VAD节点描述了进程内存中的内存范围0x00db0000-0x0102ffff及其内存保护PAGE_EXECUTE_WRITECOPY。

由于第一个节点描述的是一个包含内存映射的可执行映像(explorer.exe)的内存范围,因此它还提供了磁盘上的完整路径。第二个节点0x8723fb50描述了0x004b0000-0x004effff的内存范围,它不包含任何内存映射文件。类似地,地址0x8723fb78的第三个节点显示进程内存范围的信息0x77690,000-0x777cbfff,其中包含ntdll.dll及其内存保护:

$ python vol.py -f win7.vmem --profile=Win7SP1x86 vadinfo -p 2180   Volatility Foundation Volatility Framework 2.6VAD node @ 0x8724d718 Start 0x00db0000 End 0x0102ffff Tag Vadm Flags: CommitCharge: 4, Protection: 7, VadType: 2Protection: PAGE_EXECUTE_WRITECOPYVad Type: VadImageMap   ControlArea @87240008 Segment 82135000   NumberOfSectionReferences: 1 NumberOfPfnReferences: 215   NumberOfMappedViews: 1 NumberOfUserReferences: 2   Control Flags: Accessed: 1, File: 1, Image: 1FileObject @8723f8c0, Name: DeviceHarddiskVolume1Windowsexplorer.exe First prototype PTE: 82135030 Last contiguous PTE: fffffffcFlags2: Inherit: 1, LongVad: 1VAD node @ 0x8723fb50 Start 0x004b0000 End 0x004effff Tag VadS Flags: CommitCharge: 43, PrivateMemory: 1, Protection: 4 Protection: PAGE_READWRITEVad Type: VadNoneVAD node @ 0x8723fb78 Start 0x77690000 End 0x777cbfff Tag Vad Flags: CommitCharge: 9, Protection: 7, VadType: 2 Protection: PAGE_EXECUTE_WRITECOPYVad Type: VadImageMapControlArea @8634b790 Segment 899fc008 NumberOfSectionReferences: 2 NumberOfPfnReferences: 223 NumberOfMappedViews: 40 NumberOfUserReferences: 42Control Flags: Accessed: 1, File: 1, Image: 1FileObject @8634bc38, Name: DeviceHarddiskVolume1WindowsSystem32ntdll.dllFirst prototype PTE: 899fc038 Last contiguous PTE: fffffffc Flags2: Inherit: 1[REMOVED]

*左右滑动查看更多

要使用Windbg内核调试器获取进程的VAD信息,首先需要使用.process命令和_EPROCESS结构的地址将上下文切换到所需的进程。切换上下文后,使用!vad扩展命令显示进程的内存区域。

1.2 使用VAD检测注入代码

需要注意的重要一点是,当一个可执行映像(如EXE或DLL)通常加载到内存中时,该内存区域会被操作系统赋予一个PAGE_EXECUTE_WRITECOPY(WCX)的内存保护。一个应用程序通常不允许使用像VirtualAllocEx这样的API调用来分配带有PAGE_EXECUTE_WRITECOPY保护的内存。换句话说,如果攻击者想要注入一个PE文件(如EXE或DLL)或shell代码,那么内存需要分配一个PAGE_EXECUTE_READWRITE(RWX)保护。

通常,很少有内存范围具有PAGE_EXECUTE_READWRITE的内存保护。具有PAGE_EXECUTE_READWRITE保护的内存范围并不总是恶意的,因为程序可以为合法目的使用该保护分配内存。为了检测代码注入,我们可以查找包含PAGE_EXECUTE_READWRITE内存保护的内存范围,并检查和验证其内容,以确认是否存在恶意。

为了帮助您理解这一点,让我们以一个被SpyEye感染的内存映像为例。此恶意软件将代码注入到合法的explorer.exe进程(pid 1608)。vadinfo插件在explorer.exe进程中显示了两个内存范围,它们对PAGE_EXECUTE_READWRITE有可疑的内存保护:

$ python vol.py -f spyeye.vmem --profile=Win7SP1x86 vadinfo -p 1608 [REMOVED]VAD node @ 0x86fd9ca8 Start 0x03120000 End 0x03124fff Tag VadS Flags: CommitCharge: 5, MemCommit: 1, PrivateMemory: 1, Protection: 6 Protection: PAGE_EXECUTE_READWRITE   Vad Type: VadNoneVAD node @ 0x86fd0d00 Start 0x03110000 End 0x03110fff Tag VadS Flags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 6 Protection: PAGE_EXECUTE_READWRITEVad Type: VadNone

*左右滑动查看更多

仅从内存保护来看,很难断定前面的内存区域是否包含任何恶意代码。为了确定是否存在恶意代码,我们可以转储这些内存区域的内容。要显示内存区域的内容,可以使用volshell插件。

下面的命令在explorer.exe进程(pid 1608)的上下文中调用volshell(一个交互式Python shell)db命令转储给定内存地址的内容。要获取帮助信息并显示所支持的volshell命令,只需在volshell中输入hh()。使用db命令转储内存地址0x03120000(上面vadinfo输出的第一个条目)的内容可以看到PE文件的存在。PAGE_EXECUTE_READWRITE的内存保护和PE文件的存在清楚地表明,可执行文件通常没有加载,而是被注入到explorer.exe进程的地址空间中:

$ python vol.py -f spyeye.vmem --profile=Win7SP1x86 volshell -p 1608 Volatility Foundation Volatility Framework 2.6Current context: explorer.exe @ 0x86eb4780, pid=1608, ppid=1572 DTB=0x1eb1a340   Python 2.7.13 (default, Jan 19 2017, 14:48:08)>>> db(0x03120000)0x03120000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 MZ.............. 0x03120010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ........@....... 0x03120020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x03120030 00 00 00 00 00 00 00 00 00 00 00 00 d8 00 00 00 ................ 0x03120040 0e 1f ba 0e 00 b4 09 cd 21 b8 01 4c cd 21 54 68 ........!..L.!Th 0x03120050 69 73 20 70 72 6f 67 72 61 6d 20 63 61 6e 6e 6f is.program.canno 0x03120060 74 20 62 65 20 72 75 6e 20 69 6e 20 44 4f 53 20 t.be.run.in.DOS. 0x03120070 6d 6f 64 65 2e 0d 0d 0a 24 00 00 00 00 00 00 00 mode....$.......

*左右滑动查看更多

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

有时,显示内存区域的内容可能不足以识别恶意代码。当shell代码被注入时尤其如此,在这种情况下,您需要反汇编内容。例如,如果您使用db命令转储地址0x03110000(上面vadinfo输出的第二个条目)的内容,您将看到以下十六进制转储。从输出来看,很难判断这是否是恶意代码:

>>> db(0x03110000)0x03110000 64 a1 18 00 00 00 c3 55 8b ec 83 ec 54 83 65 fc d......U....T.e. 0x03110010 00 64 a1 30 00 00 00 8b 40 0c 8b 40 1c 8b 40 08 .d.0....@..@..@. 0x03110020 68 34 05 74 78 50 e8 83 00 00 00 59 59 89 45 f0 h4.txP.....YY.E. 0x03110030 85 c0 74 75 8d 45 ac 89 45 f4 8b 55 f4 c7 02 6b ..tu.E..E..U...k 0x03110040 00 65 00 83 c2 04 c7 02 72 00 6e 00 83 c2 04 c7 .e......r.n.....

*左右滑动查看更多

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

如果我们怀疑内存区域包含shell代码,可以使用dis命令。在volshell中,在给定地址反汇编代码。从下面代码中显示的反汇编输出中,可以看出shell代码已经注入到这个内存区域,因为它包含有效的CPU指令。为了验证内存区域是否包含任何恶意代码,我们需要进一步分析它,以确定上下文。这是因为注入的代码看起来也类似于合法代码:

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

1.3 转储进程内存区域

在确定进程内存中注入的代码(PE文件或shellcode)之后,我们可能希望将其转储到磁盘以进行进一步分析(用于提取字符串、执行YARA扫描或进行反汇编)。要转储由VAD节点描述的内存区域,可以使用vaddump插件。例如,如果希望转储地址为0x03110000的包含shell代码的内存区域,可以提供-b(——base)选项,后跟基址,如下所示。如果我们没有指定-b(——base)选项,插件会将所有内存区域转储到单独的文件中:

$ python vol.py -f spyeye.vmem --profile=Win7SP1x86 vaddump -p 1608 -b 0x03110000 -D dump/Volatility Foundation Volatility Framework 2.6Pid Process Start End Result   ---- -----------  ---------- ---------- ---------------------------   1608 explorer.exe 0x03110000 0x03110fff   dump/explorer.exe.1deb4780.0x03110000-0x03110fff.dmp

*左右滑动查看更多

一些恶意软件程序使用隐形技术来绕过检测。例如,恶意程序可能会注入PE文件,并在PE文件加载到内存后清除PE头。在这种情况下,如果我们正在查看十六进制转储,它不会给你任何PE文件存在的指示;可能需要一定程度的手工分析来验证代码。在一篇题为“用Volatility恢复CoreFlood 二进制文件”的博客文章中提到了这样一个恶意软件样本的例子。

http://mnin.blogspot/2008/11/recovering-coreflood-binaries-with.html

*左右滑动查看更多

1.4 使用malfind检测注入的代码

到目前为止,我们已经了解了如何使用vadinfo手动识别可疑的内存区域,还了解了如何使用vaddump转储一个内存区域。还有另一个名为malfind的Volatility插件,它根据内存内容和前面介绍的VAD特征自动识别可疑内存区域。

在下面的示例中,当针对感染了SpyEye的内存映像运行malfind时,它会自动识别可疑的内存区域(包含PE文件和shellcode)。除此之外,它还显示十六进制转储和从基地址开始的反汇编。如果不指定-p(——pid)选项,malfind将识别系统上运行的所有进程的可疑内存范围:

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

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

$ python vol.py -f spyeye.vmem --profile=Win7SP1x86 malfind -p 1608 Volatility Foundation Volatility Framework 2.6Process: explorer.exe Pid: 1608 Address: 0x3120000Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITEFlags: CommitCharge: 5, MemCommit: 1, PrivateMemory: 1, Protection: 60x03120000 4d 5a 90 00 03 00 00 00 04 00 00 00 ff ff 00 00 MZ.............. 0x03120010 b8 00 00 00 00 00 00 00 40 00 00 00 00 00 00 00 ........@....... 0x03120020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0x03120030 00 00 00 00 00 00 00 00 00 00 00 00 d8 00 00 00 ................0x03120000 4d0x03120001 5a0x03120002 900x03120003 0003  ADD [EBX], AL0x03120005 0000  ADD [EAX], ALProcess: explorer.exe Pid: 1608 Address: 0x3110000 Vad Tag: VadS Protection: PAGE_EXECUTE_READWRITEDEC EBPPOP EDXNOPFlags: CommitCharge: 1, MemCommit: 1, PrivateMemory: 1, Protection: 60x03110000 64 a1 18 00 00 00 c3 55 8b ec 83 ec 54 83 65 fc d......U....T.e.0x03110010 00 64 a1 30 00 00 00 8b 40 0c 8b 40 1c 8b 40 08 .d.0....@..@..@.0x03110020 68 34 05 74 78 50 e8 83 00 00 00 59 59 89 45 f0 h4.txP.....YY.E.0x03110030 85 c0 74 75 8d 45 ac 89 45 f4 8b 55 f4 c7 02 6b ..tu.E..E..U...k0x03110000 64a118000000  MOV EAX, [FS:0x18]0x03110006 c30x03110007 550x03110008 8bec0x0311000a 83ec540x0311000d 8365fc000x03110011 64a130000000  MOV EAX, [FS:0x30]

*左右滑动查看更多

(未完待续)

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

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年11月27日13:06:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-青队(处置)| 使用内存取证检测高级恶意软件(一)https://cn-sec.com/archives/1632422.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息