当前位置: 首页 > 科技观察

实例讲解基于Volatility的内存分析技术Part2

时间:2023-03-20 22:48:54 科技观察

欢迎阅读基于Volatility的内存分析系列文章。为顺利阅读本系列文章,读者应具备Windows内部运行机制的基本知识。确切地说,读者需要了解Windows中内存运行机制的基础知识,我们将对此进行详细介绍。除此之外,无论你有什么不懂的,都不影响你对本文的理解!阅读清单:内核模式用户模式虚拟内存Windows进程一些背景知识:内存取证(有时称为内存分析)是对计算机内存转储中易失性数据的分析。信息安全专业人员可以使用内存取证来调查和识别不会在硬盘数据上留下任何痕迹的攻击或恶意行为。通过内存取证,安全人员可以了解运行时的各种系统活动,例如打开的网络连接或最近执行的命令和进程。程序在计算机上运行之前,首先需要加载到内存中,这使得内存取证非常重要——这意味着所有创建、检查或删除的程序或数据都将保存在RAM中。这包括图像、所有网络浏览活动、加密密钥、网络连接或注入的代码片段。在许多情况下,某些证据只能在RAM中找到,例如崩溃期间存在的开放网络连接。由于攻击者可以开发仅驻留在内存中而不登陆硬盘的恶意软件,因此标准计算机取证方法几乎看不到它。这使得内存取证工具变得更加重要。Volatility是一种高级内存取证框架。它为调查人员提供了许多自动化工具,可用于使用其高级内存分析技术来揭示主机上的恶意活动。需要指出的是,该框架是用python实现的,是开源的。该框架的下载地址为https://github.com/volatilityfoundation/volatility,相关文档地址为https://github.com/volatilityfoundation/volatility/wiki/Command-Reference-Mal。在本系列文章中,我们将以Coreflood木马为例,介绍相关的内存取证方法。Coreflood是由一群俄罗斯黑客创建并于2010年发布的特洛伊木马和僵尸网络。FBI已确定“大约17个州或地方政府机构,包括1个警察局;3个机场;2个国防承包商;5个银行或金融机构;大约30所学院或大学;以及大约20家医院或医疗公司。”;以及数百家公司”[1]被列入受感染系统列表。截至2011年5月,已感染全球超过230万台电脑;到目前为止,它仍然是一个巨大的威胁。——Wikipedia本示例软件可通过以下地址下载(.vmem文件):https://github.com/mgoffin/malwarecookbook/blob/master/16/6/coreflood.vmem.zip本系列文章目标是借助波动率和相应的内存取证方法了解此恶意软件的行为。我将尝试发掘Coreflood上可用的所有取证工具,以了解此恶意软件背后的动机是什么。我希望能从这次取证分析中学到新东西,并教给你一些新东西!为了开始我的调查,我想弄清楚主机上正在运行哪些进程。为此,我们只需要使用pslist命令查看是否有明显可疑的进程在运行。Windows使用_EPROCESS结构的循环双向链表来跟踪所有活动进程;并且,这个列表驻留在内核中。Volatility利用了这个事实:首先,它寻找PsActiveProcessHead指针,因为它指向内核的_EPROCESS结构列表的起始位置;之后,Volatility遍历此列表以找出所有正在运行的进程。主机上运行的所有进程:volatility-fcoreflood.exepslist命令输出我们可以看到一切似乎都很正常,但有几件事引起了我们的注意。目前,IE正在运行,同时cmd正在运行,似乎正确的做法是检查出站连接,因为恶意软件可能会伪装成InternetExplorer浏览器来隐藏其与C&C的通信流量。此外,我们还可以查看cmd在那里做了什么,后面会讲到。最简单的事情之一就是查看出站连接。如果IE出站连接看起来不可疑,我们需要在别处寻找恶意活动的迹象。接下来,我们将使用connscan命令来检查先前终止的和当前活动的连接:“要使用池标记扫描功能查找_TCPT_OBJECT结构,请使用connscan命令。这样做的好处是我们不仅可以从活动的连接您还可以从之前终止的连接中搜索证据。”-摘自Volatility的官方文档实际上,这种工作方式是先扫描物理内存找到4字节的签名0x54455054(“TCPT”),然后解析出接下来的28字节作为一个完整的_TCPT_OBJECT结构.Volatility-fcoreflood.vmemconnscan命令输出从上面的输出来看,主机似乎在正常通信,所有通信都是由pid2044进程(IEXPLORE.EXE)创建的。我查了一下这些IP的地理位置,都是注册在一些大公司的名下,比如微软,AT&T等公司。当然,关于这些IP的数据可能已经改变,因为当前检查的vmem文件有些过时;此外,这些IP地址数据可能已被黑客操纵以欺骗调查人员。为确保确实没有恶意通信,我们应该检查入站连接是否安全。为此,我们可以使用sockscan命令,该命令将扫描内存以查找_ADDRESS_OBJECT结构。通过在内存中扫描这个内存结构,我们可以深入了解以前打开的套接字和当前打开的套接字。volatility-fcoreflood.vmemsockscan命令的输出正如我们所见,进程pid2044(即IEXPLORE.EXE)中有一些非常奇怪的入站连接。这看起来非常可疑,所以是时候拿出我们的内存取证工具Volatility,并检查此进程是否存在恶意软件。之所以说Volatility是内存取证神器,是因为它提供了很多强大的恶意软件分析工具。我们经常使用的第一个分析工具是malfind命令。此命令可用于查找进程内存中的注入代码。它通过查找分配的内存段(通过查看VAD树数据结构)并检查它们以查找未映射到磁盘上任何文件的可执行代码的线索来实现这一点。“VAD节点还引用了一些其他的内核结构,可能对调查人员非常有用……所以如果这个内存区域被用在一个映射文件(比如一个加载的DLL)中,对应的_FILE_OBJECT结构,并提取名称文件。这可以为调查人员提供另一种方法来列出进程加载的模块,然后可以将其与其他方法找到的模块进行比较,以找到库注入和隐藏模块的证据。”——ScienceDirect用于检查的方法一段内存是否包含注入代码是检查VAD页面权限,如EXECUTE权限等,如果一段内存有执行权限,并且没有映射到磁盘上的任何可执行文件,则很可能存在注入代码。volatility-fcoreflood.vmemmalfind命令的输出,这里似乎存在误报正如我们在上图中所见,该命令的输出似乎并没有带来太多实际价值。这可能是由于F表示恶意软件没有将任何显式PE(可移植可执行文件)代码加载到内存中,而只是注入了一些shellcode,或者图像的标头被分页了。此外,还有另一种可能性——恶意软件通过在注入的DLL的ImageBase上调用VirtualFree,从内存中清除PE标头以避免检测。当然,也可能是由于某种原因这部分内存被换页或无法访问。无论如何,我们无法确定这里是否存在恶意活动,因为我们还没有找到确凿的证据。我们可以使用的下一个命令是apihooks。“它可用于查找IAT、EAT、内联式挂钩和几种特殊类型的挂钩。对于内联挂钩,它可以检测直接和间接位置的CALL和JMP指令……以及对内核中未知代码页的调用记忆。”–官方Volatility文档要了解这里发生了什么,我们需要快速回顾一下IAT和EAT。第一次加载可执行文件时,Windows加载程序将负责读取文件的PE结构并加载可执行文件的imageintomemory.其中一个步骤是加载应用程序使用的所有dll并将它们映射到进程地址空间.此外,可执行文件将指出每个dll中需要的所有功能。然而,由于函数地址不是静态的,我们必须开发一种机制来允许修改这些变量,这样所有编译后的代码都不必在运行时修改。这是通过导入地址表(IAT)实现的;而IAT其实就是windowsloader在加载dll时填入的函数指针表。EAT的工作方式与IAT基本相同,只是代码库使用它来导出函数到image可执行文件,让程序从中导入函数地址到IAT(我就不说了)有关详细信息的更多信息)。恶意软件可以操纵这两个内存结构,使可执行文件调用除预期函数之外的其他函数。我在IEXPLORE.EXE上使用apihooks参数的原因是因为我已经怀疑它可能已根据sockscan输出被篡改。我们将使用apihooks参数并将输出保存在文本文件中Incredible!InternetExplorer已被钩住十几次以调用相同的函数。上图取自保存apihooks命令输出的文本文件。事实上,这只是十几种不同的函数挂钩中的一种;他们都调用相同的地址0x7ff82a6e。在此示例中,我们可以看到恶意软件“挂钩”了WINHTTP.dll中的LoadLibrary。LoadLibrary可用于将库模块加载到进程的地址空间并返回一个句柄,该句柄可与GetProcAddress一起使用以获得DLL函数的地址。所以,LoadLibrary是一个非常明显的hook对象,因为我们知道很多PE会使用其他的dll,在这些库中导入相关的函数。我们需要弄清楚恶意软件试图在这里实现什么。为了做到这一点,我们需要深入了解恶意软件试图执行的代码。因此,我们将使用Volatility的volshell工具。Volshell是一个非常强大的工具,可以用来浏览内存中的内容。我们可以跳转到内存的各个部分,之后我们不仅可以查看其中的内容,还可以对其中的内容进行反汇编或读取。输入volshell命令并遵循该过程。输入volshell命令后,我用cc(上面的高亮文字(从上到下)给我们展示了被hook的地址,而在它下面,还高亮了恶意软件要我们跳转到的代码去的地址。如上图所示,为了弄清楚这个恶意软件的意图,我们需要对相关地址进行反汇编。为此,我将这个地址作为参数复制到volshell命令dis中(我们最后得到的输出就是恶意注入的代码,我们会在后面的文章中介绍这段恶意代码的作用。不耐烦的读者,也可以试试)在这篇文章中,我们向读者介绍如何使用volatility来发现主机上运行的进程中潜在的恶意代码。为此,我们首先介绍一些基本操作,例如确保没有可疑的东西,这样,我们可以立即检测到与异常IP地址相关的可疑进程或流量。最后,我们检查恶意软件样本是否通过波动性将代码注入无辜进程来实现隐身,并发现了一些有趣的代码。在下一篇文章中,我们将深入研究这些代码以看看这个恶意软件试图达到什么目的。祝您阅读愉快,下篇文章见。本文翻译自:https://medium.com/bugbountywriteup/memory-analysis-for-beginners-with-volatility-coreflood-trojan-part-1-89981433eeb6转载请注明出处。