欢迎各位阅读基于Volatility的内存分析系列文章。为了顺利阅读本系列文章,读者最好具备Windows内部运行机制方面的基础知识。准确来说,读者需要了解内存在Windows中运行机制方面的基础知识,为此,我们将给出详尽的介绍。除此之外,不管你有什么不懂的知识,都不会影响您理解本文的内容!
阅读清单:
- 内核模式
- 用户模式
- 虚拟内存
- Windows进程
一点背景知识:
内存取证(有时称为内存分析)是指对计算机内存转储中易失性数据进行的一种分析。信息安全专业人员可以通过内存取证,来调查和识别那些不会在硬盘驱动器数据中留下痕迹的攻击或恶意行为。
通过内存取证,安全人员可以了解运行时的各种系统活动,例如开放的网络连接或最近执行的命令和进程等。
程序在计算机上运行之前,首先需要被加载到内存中,这使得内存取证变得非常重要——这意味着所有被创建、检查或删除的程序或数据都将被保存到RAM中。这其中包括图像、所有Web浏览活动、加密密钥、网络连接或注入的代码片段。在许多情况下,某些证据只能在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多万台计算机;到目前为止,它仍然是一个巨大的威胁。——维基百科
对于该样本软件,可以通过下面的地址进行下载(.vmem文件):
https://github.com/mgoffin/malwarecookbook/blob/master/16/6/coreflood.vmem.zip
这个文章系列的目标是借助于volatility来了解这个恶意软件的行为,以及相应的内存取证方法。我将尝试发掘所有关于Coreflood的取证工具,以了解这个恶意软件背后的动机到底是什么。我希望能从这次取证分析中学到一些新的东西,并教给大家一些新的东西!
为了开始调查,我想先搞清楚主机上运行的进程。为此,我们只需借助于pslist命令,就能查看是否有明显可疑的进程在运行。
Windows使用一个循环的双链接列表_EPROCESS结构体来跟踪所有的活动进程;并且,这个列表位于内核中。而Volatility就是利用了这个事实:首先,它会寻找PsActiveProcessHead指针,因为该指针指向内核的_EPROCESS结构体列表的起始位置;之后,Volatility会遍历这个列表,从而找出正在运行的所有进程。
主机上正在运行的所有进程:volatility -f coreflood.exe pslist命令的输出结果
我们可以看到,似乎一切都很正常,不过有几件事引起了我们的注意。当前,IE浏览器在运行,同时cmd也在运行,看来正确的做法是检查出站连接,因为恶意软件可能伪装成Internet Explorer浏览器,以隐藏自己与C&C的通信流量。
此外,我们也可以检查一下cmd在那边做什么,这一点将在后面讨论。
一个最简单的操作就是查看出站连接。如果IE出站连接没有找到可疑之处,我们就需要从其他地方寻找恶意活动的踪迹。
下面,我们将使用connscan命令来检查之前终止的和当前活动的连接:
“要想使用池标签扫描功能查找_TCPT_OBJECT结构体,请使用connscan命令。这样做的好处是,我们不仅可以从活动的连接中查找证据,还可以从之前被终止的连接中搜索证据。”——摘自Volatility的官方文档
实际上,这种工作方式就是先通过扫描物理内存,找到4个字节的签名0x54455054(“TCPT”),然后,解析出接下来的28个字节,并将其作为完整的_TCPT_OBJECT结构体。
volatility -f coreflood.vmem connscan命令的输出结果
从上面的输出结果来看,主机好像正在进行正常的通信,所有的通信都是由pid 2044进程(IEXPLORE.EXE)创建的。我查了一下这些IP的地理位置,它们都是注册在一些大公司的名下,比如微软、AT&T等公司。当然,关于这些IP的数据可能已经改变了,因为当前考察的vmem文件已经有些陈旧了;此外,这些也可能是黑客为了欺骗调查人员而对这些IP地址数据做了手脚。
为了确保的确没有恶意通信,我们应该检查入站连接是否安全。为此,我们可以使用sockscan命令,该命令将扫描内存中的_ADDRESS_OBJECT结构体。通过扫描内存中的这个内存结构,我们可以深入了解以前打开的套接字和当前打开的套接字。
volatility -f coreflood.vmem sockscan命令的输出结果
正如我们所看到的,进程pid 2044(即IEXPLORE.EXE)中有一些非常奇怪的入站连接。这看起来非常可疑,所以,是时候拿出我们的内存取证神器Volatility,检查一下该进程中是否隐藏着恶意软件了。
我们之所以说Volatility是一个内存取证神器,是因为它提供了许多功能强大的恶意软件分析工具。
我们经常用到的第一个分析工具就是malfind命令。这个命令可用于寻找进程内存中的注入代码。它是通过寻找已分配内存的段(通过查看VAD树数据结构),并检查它们是否有未映射到磁盘上任何文件的可执行代码的线索来实现这一点的。
“VAD节点还引用了一些其他的内核结构体,这些结构体可能对调查人员非常有用……因此,如果该内存区被用于已映射的文件(如加载的DLL),则可以引用相应的_FILE_OBJECT结构体,并提取文件的名称。这可以为调查人员提供一种替代的方法来列出进程加载的模块,然后可以与其他方法找到的模块进行比较,从而找到库注入和隐藏模块的相关证据。”——Science Direct
用于检查一段内存是否包含注入代码的方法是检查VAD的页面权限,例如EXECUTE权限等。如果内存中的某一段具有执行权限,并且它没有映射到磁盘上的任何可执行文件的话,就说明这里很可能存在注入的代码。
volatility -f coreflood.vmem malfind命令的输出结果,这里似乎存在误报
正如我们在上图中看到的,该命令的输出结果好像并没有带来太多真正有价值的信息。
这可能是该恶意软件没有加载任何显式PE(可移植可执行文件)代码到内存中,而只是注入了一些shellcode所致,又或者映像的头部被分页了所致。此外,还有一种可能——恶意软件通过调用注入的DLL的ImageBase上的VirtualFree,从内存中清除PE的头部,以避免检测到。当然,也可能是由于某些原因,这部分内存被分页或无法访问。无论如何,我们还不能确定这里存在恶意活动,因为我们没有找到确切的证据。
接下来我们可以使用的命令是apihooks。
“它可以用来查找IAT、EAT、Inline式hook,以及几种特殊类型的hook。对于Inline hook,它可以检测直接和间接位置的CALL和JMP指令……以及对内核内存中未知代码页的调用。”——Volatility官方文档
为了理解这里到底发生了什么,我们需要快速回顾一下IAT和EAT。
当可执行文件第一次被加载时,Windows加载器将负责读取文件的PE结构,并将可执行文件的映像加载到内存中。其中一步,就是加载应用程序使用的所有dll,并将它们映射到进程地址空间。
此外,可执行文件还会指出在每个dll中需要的所有函数。不过,由于函数地址不是静态的,所以,我们必须开发一种机制,以允许修改这些变量,这样就不必在运行时修改所有已编译的代码了。
这一点是通过导入地址表(IAT)实现的;而IAT,实际上就是由windows加载器在加载dll时所填写的函数指针表。
EAT的工作方式和IAT基本一致,只不过它是供代码库用于将函数导出到映像可执行文件中的,以便供程序从其中将函数地址导入到IAT中(具体细节我就不多说了)。
恶意软件可以通过操纵这两个内存结构体,使得可执行文件调用其他函数,而非原本要调用的函数。
我之所以要在IEXPLORE.EXE上使用apihooks参数,是因为根据sockscan的输出结果,我已经怀疑它可能被篡改了。
我们将使用apihooks参数并将输出结果保存在一个文本文件中
难以置信! Internet Explorer已经被钩取了十几次以调用同一个函数。
上图内容摘自保存apihooks命令输出结果的文本文件。实际上,这只是十几个不同函数的hook中的一个而已;它们都调用同一个地址0x7ff82a6e。
我们可以看到,在这个例子中,恶意软件在WINHTTP.dll中“挂钩”了LoadLibrary。
LoadLibrary可用于将库模块加载到进程的地址空间中,并返回一个句柄,该句柄可用于GetProcAddress以获取DLL函数的地址。因此,LoadLibrary是一个非常显而易见的钩取对象,因为我们知道很多PE都会使用其他dll,并导入这些库中的相关函数。
我们需要搞清楚恶意软件在这里试图达到什么目的。为了做到这一点,我们需要尝试深入到恶意软件试图执行的那段代码中。因此,我们要使用Volatility的volshell工具。Volshell是一个非常强大的工具,可以用来浏览内存的内容。我们可以跳转到内存的各个部分,之后,我们不仅可以查看其中的内容,还可以反汇编或读取其中的内容。
输入volshell命令,然后按照流程操作即可。
在输入volshell命令后,我使用cc(
上面高亮显示的文字(从上到下)向我们展示了被钩住的地址,在它的下面,还高亮显示了恶意软件希望我们的代码要跳转到的地址。
如上图所示,为了弄清楚该恶意软件的意图,我们需要反汇编相关的地址。为此,我将这个地址作为参数复制到volshell命令dis(
我们最终得到的输出结果,就是恶意注入的代码。
关于这个恶意代码的作用,我们将在后面的文章中加以介绍。心急的读者,也可以自己动手尝试一下。
在本文中,我们为读者介绍了如何使用volatility在主机运行的进程中查找潜在的恶意代码。为此,我们首先介绍了一些基本的操作,比如确保没有任何可疑的东西,这样,一旦出现可疑的进程或不常见的IP地址相关的流量,我们就能立即察觉。最后,我们通过volatility考察了恶意软件样本是否通过向无辜的进程注入代码来实现隐身,并发现了一些有趣的代码。在下一篇文章中,我们将深入研究这些代码,看看这个恶意软件到底想达到什么目的。
祝阅读愉快,我们下篇见。
本文翻
转载请注明:IT运维空间 » 安全防护 » 实例讲解基于Volatility的内存分析技术Part 1
发表评论