共计 4560 个字符,预计需要花费 12 分钟才能阅读完成。
这期内容当中丸趣 TV 小编将会给大家带来有关基于 Volatility 的内存分析技术 Part 1 如何理解,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
内存取证 (有时称为内存分析) 是指对计算机内存转储中易失性数据进行的一种分析。信息安全专业人员可以通过内存取证,来调查和识别那些不会在硬盘驱动器数据中留下痕迹的攻击或恶意行为。
通过内存取证,安全人员可以了解运行时的各种系统活动,例如开放的网络连接或最近执行的命令和进程等。
程序在计算机上运行之前,首先需要被加载到内存中,这使得内存取证变得非常重要 mdash; mdash; 这意味着所有被创建、检查或删除的程序或数据都将被保存到 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 多万台计算机; 到目前为止,它仍然是一个巨大的威胁。mdash; mdash; 维基百科
对于该样本软件,可以通过下面的地址进行下载(.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 命令。这样做的好处是,我们不仅可以从活动的连接中查找证据,还可以从之前被终止的连接中搜索证据。”mdash; mdash; 摘自 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 节点还引用了一些其他的内核结构体,这些结构体可能对调查人员非常有用 hellip; hellip; 因此,如果该内存区被用于已映射的文件(如加载的 DLL),则可以引用相应的_FILE_OBJECT 结构体,并提取文件的名称。这可以为调查人员提供一种替代的方法来列出进程加载的模块,然后可以与其他方法找到的模块进行比较,从而找到库注入和隐藏模块的相关证据。”mdash; mdash;Science Direct
用于检查一段内存是否包含注入代码的方法是检查 VAD 的页面权限,例如 EXECUTE 权限等。如果内存中的某一段具有执行权限,并且它没有映射到磁盘上的任何可执行文件的话,就说明这里很可能存在注入的代码。
volatility -f coreflood.vmem malfind 命令的输出结果,这里似乎存在误报
正如我们在上图中看到的,该命令的输出结果好像并没有带来太多真正有价值的信息。
这可能是该恶意软件没有加载任何显式 PE(可移植可执行文件)代码到内存中,而只是注入了一些 shellcode 所致,又或者映像的头部被分页了所致。此外,还有一种可能 mdash; mdash; 恶意软件通过调用注入的 DLL 的 ImageBase 上的 VirtualFree,从内存中清除 PE 的头部,以避免检测到。当然,也可能是由于某些原因,这部分内存被分页或无法访问。无论如何,我们还不能确定这里存在恶意活动,因为我们没有找到确切的证据。
接下来我们可以使用的命令是 apihooks。
“它可以用来查找 IAT、EAT、Inline 式 hook,以及几种特殊类型的 hook。对于 Inline hook,它可以检测直接和间接位置的 CALL 和 JMP 指令 hellip; hellip; 以及对内核内存中未知代码页的调用。”mdash; mdash;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(
我们最终得到的输出结果,就是恶意注入的代码。
关于这个恶意代码的作用,我们将在后面的文章中加以介绍。心急的读者,也可以自己动手尝试一下。
上述就是丸趣 TV 小编为大家分享的基于 Volatility 的内存分析技术 Part 1 如何理解了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。