Introduction

Volatility 是一款免费的内存取证工具,由 Volatility Foundation 开发和维护,通常由蓝队中的恶意软件和 SOC 分析师使用,或作为其检测和监控解决方案的一部分。Volatility 用 Python 编写,由 Python 插件和模块组成,旨在以即插即用的方式分析内存转储。

Volatility 适用于 Windows、Linux 和 Mac OS,完全用 Python 编写。

Volatility logo

Volatility Overview

来自 Volatility Foundation Wiki,“Volatility 是世界上使用最广泛的从易失性存储器 (RAM) 样本中提取数字工件的框架。提取技术完全独立于被调查的系统,但提供了对系统运行时状态的可见性。该框架旨在向人们介绍从易失性存储器样本中提取数字工件的技术和复杂性,并为进一步研究这一令人兴奋的研究领域提供平台。”

Volatility 由多个插件共同构建,用于从内存转储中获取信息。要开始分析转储,您首先需要识别图像类型;有多种识别此信息的方法,我们将在后面的任务中进一步介绍。一旦您对图像类型和其他插件进行了分类,您就可以开始使用各种 Volatility 插件来分析转储,这将在本房间的后面进行深入介绍。

由于 Volatility 完全独立于被调查的系统,因此可以完全分段,但可以全面了解系统的运行时状态。

在撰写本文时,Volatility 有两个主要存储库;一个基于 Python 2 构建,另一个基于 Python 3 构建。对于此房间,我们建议使用基于 Python 3 构建的 Volatility3 版本。https://github.com/volatilityfoundation/volatility3

注意:阅读有关 Volatility 的博客文章和文章时,您可能会看到提到或使用 volatility2 语法,volatility3 中的所有语法都已更改,并且在此房间中,我们将使用 Volatility 插件语法的最新版本。

Installing Volatility

由于 Volatility 完全用 Python 编写,因此安装步骤和要求非常简单,并且适用于 Windows、Linux 和 Mac。如果您已经尝试在 Windows 和 Mac 上使用 Python,建议从 Linux 开始;但是,所有操作系统的工作方式都相同。

如果您使用的是 TryHackMe 的 AttackBox,Volatility 已存在于盒子中,您可以跳过这些步骤并继续。

下载时,您可以选择使用预打包的可执行文件(.whl 文件),它将以相同的方式工作并且不需要任何依赖项(仅限 Windows),或者您可以决定直接从 Python 运行它。

要获取预打包的可执行文件,只需从其发布页面下载包含该应用程序的 zip 文件即可。 https://github.com/volatilityfoundation/volatility3/releases/tag/v1.0.1

要从源代码开始运行项目,您需要先下载以下依赖项:Python 3.5.3 或更高版本Pefile 2017.8.1 或更高版本https://pypi.org/project/pefile/

您还可以下载这些可选依赖项(推荐用于此房间):yara-python 3.8.0 或更高版本 https://github.com/VirusTotal/yara-pythoncapstone 3.0.0 或更高版本 https://www.capstone-engine.org/download.html。

对依赖项进行排序后,您可以从 GitHub 克隆存储库。

使用的命令:git clone https://github.com/volatilityfoundation/volatility3.git

您现在已经安装了 Volatility!

要测试您的安装,请使用帮助参数运行vol.py文件。

使用的命令:python3 vol.py -h

需要注意的是,对于任何 Linux 或 Mac 内存文件,您都需要从 Volatility GitHub 下载符号文件。https://github.com/volatilityfoundation/volatility3#symbol-tables

Memory Extraction

提取内存转储可以通过多种方式执行,具体取决于调查要求。下面列出了一些可用于从裸机中提取内存的技术和工具。

  • FTK Imager
  • Redline
  • DumpIt.exe
  • win32dd.exe / win64dd.exe
  • Memoryze
  • FastDump

在裸机主机上使用提取工具时,通常需要相当长的时间;如果时间紧迫,请在调查期间考虑到这一点。

上面提到的大多数用于内存提取的工具都会输出 .raw 文件,但有一些例外,例如 Redline 可以使用自己的代理和会话结构。

对于虚拟机,可以通过从主机驱动器收集虚拟内存文件轻松收集内存文件。此文件可能会根据所使用的虚拟机管理程序而变化;下面列出了您可能遇到的一些虚拟机管理程序虚拟内存文件。

  • VMWare - .vmem
  • Hyper-V - .bin
  • Parallels - .mem
  • VirtualBox - .sav 文件 *这只是部分内存文件

尝试从裸机和虚拟机中提取或移动内存时请务必小心。

Plugins Overview

自从转换为 Python 3 以来,Volatility 的插件结构发生了相当大的变化。在以前的 Volatility 版本中,您需要识别与操作系统和主机版本完全相同的特定操作系统配置文件,这可能很难找到或与可能提供误报的插件一起使用。在 Volatility3 中,配置文件已被废弃,Volatility 将自动识别内存文件的主机和版本。

插件的命名结构也发生了变化。在以前的 Volatility 版本中,命名约定只是插件的名称,并且适用于所有操作系统和配置文件。现在有了 Volatility3,您需要在指定要使用的插件之前指定操作系统,例如 windows.infolinux.info。这是因为不再有配置文件来区分插件的各种操作系统,因为每个操作系统的内存结构和操作都截然不同。请参阅下面的操作系统插件语法选项。

  • .windows
  • .linux
  • .mac

Volatility 和第三方插件都提供了几个插件;我们将只介绍 Volatility 提供的一小部分插件。

要熟悉可用的插件,请使用帮助菜单。由于 Volatility3 目前正在积极开发中,因此与 Python 2 相比,插件列表仍然很短;但是,当前列表仍允许您根据需要进行所有分析。

Identifying Image Info and Profiles

默认情况下,Volatility 附带从 Windows XP 到 Windows 10 的所有现有 Windows 配置文件。

如果您不知道提取内存转储的机器的确切版本和版本,则很难确定图像配置文件。在某些情况下,您可能会获得一个没有其他上下文的内存文件,您需要自己弄清楚从那里去哪里。在这种情况下,Volatility 会为您提供支持,并附带 imageinfo 插件。此插件将获取提供的内存转储并为其分配最佳操作系统配置文件列表。操作系统配置文件已在 Volatility3 中被弃用,因此如果使用 Volatility2,我们只需要担心识别配置文件;这使得分析内存转储变得容易得多。

注意:imageinfo 并不总是正确的,并且根据提供的转储可能会有不同的结果;请谨慎使用并从提供的列表中测试多个配置文件。

如果我们仍想从内存转储中获取有关主机正在运行的信息,我们可以使用以下三个插件 windows.info linux.info mac.info。此插件将从内存转储中提供有关主机的信息。

语法:python3 vol.py -f <file> windows.info

Listing Processes and Connections

Volatility 中有五个不同的插件,它们允许您转储进程和网络连接,每个插件使用的技术各不相同。在此任务中,我们将讨论每个插件及其在对手使用的规避技术方面的优缺点。

列出进程的最基本方法是使用 pslist;此插件将从双向链接列表中获取进程列表,该列表跟踪内存中的进程,相当于任务管理器中的进程列表。此插件的输出将包括所有当前进程和已终止进程及其退出时间。

语法:python3 vol.py -f <file> windows.pslist

某些恶意软件(通常是 rootkit)会试图隐藏其进程,从而取消自身与列表的链接。通过取消自身与列表的链接,您在使用 pslist 时将不再看到它们的进程。为了对抗这种规避技术,我们可以使用 psscan;这种列出进程的技术将通过查找与 _EPROCESS 匹配的数据结构来定位进程。虽然这种技术可以帮助规避对策,但也可能导致误报。

语法:python3 vol.py -f <file> windows.psscan

第三个进程插件 pstree 不提供任何其他特殊技术来帮助识别规避,如前两个插件;但是,此插件将根据其父进程 ID 列出所有进程,使用与 pslist 相同的方法。这对于分析师了解进程的完整情况以及提取时可能发生的情况很有用。

语法:python3 vol.py -f <file> windows.pstree

现在我们知道如何识别进程,我们还需要一种方法来识别主机上提取时存在的网络连接。netstat 将尝试识别具有网络连接的所有内存结构。

语法:python3 vol.py -f <file> windows.netstat

在 volatility3 的当前状态下,此命令可能非常不稳定,尤其是在旧 Windows 版本中。为了解决这个问题,您可以使用其他工具(如 bulk_extractor)从内存文件中提取 PCAP 文件。在某些情况下,这在您无法仅从 Volatility 识别的网络连接中是首选。https://tools.kali.org/forensics/bulk-extractor

我们将介绍的最后一个插件是 dlllist。此插件将列出提取时与进程相关的所有 DLL。一旦您进行了进一步的分析并且可以将输出过滤到特定的 DLL(这可能是您认为系统中存在的特定类型恶意软件的指标),这将特别有用。

语法:python3 vol.py -f <file> windows.dlllist

Volatility Hunting and Detection Capabilities

Volatility 提供了大量插件,可用于帮助您在系统内存中寻找恶意软件或其他异常时提高搜索和检测能力。

建议您在阅读本节之前,对对手如何使用规避技术和各种恶意软件技术以及如何搜索和检测它们有一个基本的了解。

我们将要讨论的第一个插件是“malfind”,它是在寻找代码注入时最有用的插件之一。此插件将尝试识别注入的进程及其 PID,以及偏移地址和受感染区域的十六进制、ASCII 和反汇编视图。该插件通过扫描堆并识别具有可执行位设置“RWE 或 RX”和/或磁盘上没有内存映射文件(无文件恶意软件)的进程来工作。

根据“malfind”识别的内容,注入区域将发生变化。MZ 标头是 Windows 可执行文件的指示器。注入的区域也可以指向需要进一步分析的 shellcode。

语法:python3 vol.py -f <file> windows.malfind

Volatility 还提供了将内存文件与 YARA 规则进行比较的功能。yarascan 将根据规则集搜索字符串、模式和复合规则。您可以使用 YARA 文件作为参数,也可以在命令行中列出规则。

语法:python3 vol.py -f <file> windows.yarascan

还有其他插件可以被视为 Volatility 搜寻和检测功能的一部分;但是,我们将在下一个任务中介绍它们。

Advanced Memory Forensics

当您开始谈论系统对象以及恶意软件如何直接与系统交互时,高级内存取证可能会变得令人困惑,特别是如果您之前没有使用过某些技术(例如挂钩和驱动程序操纵)的情况下。在与高级对手打交道时,您可能会遇到恶意软件,大多数时候是 rootkit,它们会采用非常恶劣的规避措施,这将需要您作为分析师深入研究驱动程序、互斥锁和挂钩函数。许多模块可以帮助我们在此过程中进一步发现隐藏在内存中的恶意软件。

我们将要寻找的第一个规避技术是挂钩;对手使用了五种挂钩方法,概述如下:

  • SSDT 挂钩
  • IRP 挂钩
  • IAT 挂钩
  • EAT 挂钩
  • 内联挂钩

我们将只关注寻找 SSDT 挂钩,因为这是处理恶意软件规避时最常用的技术之一,也是与基本波动性插件一起使用的最容易的插件。

ssdt 插件将搜索挂钩并输出其结果。合法应用程序可以使用挂钩,因此,作为分析师,您需要确定哪些是恶意的。SSDT 挂钩的简要概述:SSDT 代表 系统服务描述符表;Windows 内核使用此表查找系统功能。攻击者可以挂钩到此表并修改指针以指向 rootkit 控制的位置。

ssdt 将转储数百个表条目;然后,您必须进一步分析输出或与基线进行比较。建议在调查初始入侵并将其作为主要调查的一部分后使用此插件。

语法:python3 vol.py -f <file> windows.ssdt

攻击者还将使用恶意驱动程序文件作为逃避的一部分。Volatility 提供了两个插件来列出驱动程序。

modules 插件将转储已加载的内核模块列表;这在识别活动恶意软件时很有用。但是,如果恶意文件处于空闲等待或隐藏状态,此插件可能会错过它。

最好在进一步调查并找到潜在指标作为搜索和过滤的输入后使用此插件。

语法:python3 vol.py -f <file> windows.modules

driverscan 插件将在提取时扫描系统中存在的驱动程序。此插件可以帮助识别内核中 modules 插件可能遗漏或隐藏的驱动程序文件。

与上一个插件一样,再次建议在继续使用此插件之前进行事先调查。还建议在 driverscan 之前查看 modules 插件。

语法:python3 vol.py -f <file> windows.driverscan

在大多数情况下,driverscan 不会出现任何输出;但是,如果您没有使用 modules 插件找到任何内容,尝试使用此插件会很有用。

下面还列出了其他插件,它们在尝试寻找内存中的高级恶意软件时会有所帮助。

  • modscan
  • driverirp
  • callbacks
  • idt
  • apihooks
  • moddump
  • handles

注意:其中一些仅存在于 Volatility2 上或属于第三方插件的一部分。为了充分利用 Volatility,您可能需要转向一些第三方或自定义插件。

Conclusion

我们仅介绍了非常薄弱的一层内存取证知识,在分析 Windows、Mac 和 Linux 架构时,可以进行更深入的研究。如果您想深入了解内存取证知识,我建议您阅读:《内存取证艺术》。

下面还有许多 wiki 和各种社区资源,可用于了解有关 Volatility 技术的更多信息。