原文地址:https://www.varonis.com/blog/how-to-use-volatility
翻译作者:梦幻的彼岸
更新日期:2022年4月14日 How to Use Volatility for Memory Forensics and Analysis
[color=var(--link-color,#0075ff)]Neil Fox
|8 min 阅读 |最后更新日期:2022年4月12日
如果你在事件响应部门工作,你就会明白尽快从受损设备中提取可靠的取证证据是多么重要。这通常以日志或硬盘映像的形式出现。 这两者都可能带来挑战,而且非常耗时,如果你从设备中提取日志,那么你可能会看到数百万行日志,需要花时间理解内容,将其摄入到一个平台中,使分析更容易,或者使用Linux命令行手动查询数据。 由于磁盘的大小,硬盘映像的捕获和传输可能很耗时,这是在任何分析发生之前。由于这些原因,这就是为什么我对一个事件的第一个问题总是 "我们能捕获内存吗?"。 原因是,设备的内存,或称RAM,将比硬盘的大小小,可以很容易地捕获。一旦你有了捕获的RAM,你就可以使用我最喜欢的事件响应工具之一( [color=var(--link-color,#0075ff)]Volatility)进行快速分析输出 本文将介绍什么是Volatility,如何安装Volatility,最重要的是如何使用Volatility。 在开始之前需要了解的内容由于Volatility的规模,这不是一个关于该工具功能的全面清单,相反,它将作为对该工具的介绍,给你一个强大的知识基础,并以此为基础。 在开始使用像Volatility这样的工具之前,有一些关键的话题你需要了解:
- 如何以可靠的方式捕获RAM
- 如何从一个物理设备上捕获RAM
- 如何从虚拟机中捕获RAM
幸运的是,我已经在一份有用的指南中介绍了这一点,可以在 这里找到. 如果你对上述主题已经很熟悉了,那么让我们开始学习Volatility吧! 如何安装Volatility在我们开始之前,你需要知道有不止一个版本的Volatility可用,最新的版本是Volatility 3,当我在这篇文章中提到Volatility时,我指的是Volatility 3。 在Volatility 3之前,当使用该工具分析RAM转储时,你必须指定RAM转储的机器的操作系统,以便Volatility能够工作。这通常是很耗时的,取决于设备的架构和是否安装了某个服务包。
在Volatility 3中,它将自动为你计算出操作系统,这意味着你可以直接开始分析你捕获的RAM。 要下载最新版本的Volatility,请使用以下命令:
现在已经创建了一个名为 "volatility3 "的文件夹,导航到这个位置,一些文件将被列出。 安装所需的依赖项,使Volatility的运行没有任何问题。
pip3 install -r requirements.txt 现在Volatility应该被成功安装,为了检查工具是否正确安装,使用下面的语法来启动帮助文件: python3 vol.py -h 现在您已经准备好开始使用Volatility了! 识别恶意进程当我从一个可能潜在危害的设备接收到一个RAM转储时,我想做的第一件事是查看当RAM转储被捕获时,设备上正在运行哪些进程。 我在之前的文章中提到过这一点,但我一直坚持的一句话是“恶意软件可以隐藏,但必须运行”。查看设备的运行进程始终是尝试和识别设备上可能运行的任何恶意软件的好方法。
pslist在Volatility中,有几个命令可以用来分析正在运行的进程,我使用的第一个命令是 "pslist"。 python3 vol.py -f <filename> windows.pslist 上述命令将产生以下输出: 在上图中,我们可以看到使用pslist的输出,当运行这些命令时,可能会产生大量的数据,所以可能值得使用下面的语法来标记输出或将其转储到一个文本文件中,这可以对Volatility中的任何命令进行操作。 python3 vol.py -f <filename> windows.pslist | less python3 vol.py -f <filename> windows.pslist > output.txt 下面是你开始使用该工具时需要了解的'pslist'的关键标题: - PID - 进程ID编号
- PPID - 父进程 ID编号
- ImageFileName - 正在运行的进程的名称
- Offset - 十六进制值,表示进程在内存中运行的位置
- CreateTime - 进程启动时间
- ExitTime - 进程结束时间
使用这个功能,我喜欢看一下进程名称,看看是否有什么东西让我眼前一亮。如果有任何东西引起你的注意,那么只需用google搜索一下这个名字,你应该能够迅速了解它是看起来合法的东西还是需要进一步注意。 pstree一旦我看了一下进程名称,我就想了解什么进程产生了另一个进程。这使得它更容易发现可疑的进程活动,因为你可以看到什么进程启动了 "cmd.exe "或 "powerhell.exe",例如,看看这是否看起来像合法活动。 我喜欢使用 "pstree "的另一个原因是,攻击者往往会以合法的Windows进程命名其恶意软件的运行进程,如 "svchost.exe"。这使得恶意软件可以隐藏在众目睽睽之下,因为它在众多的其他Windows进程中并不显眼。
使用 "pstree "是发现这些伪装成合法Windows进程的恶意进程的一个好方法。Windows进程总是从磁盘上的设定位置运行,其父进程往往是一个设定进程。例如,"taskhostw "总是从"%systemroot%\system32\taskhostw.exe "运行,其父进程总是 "svchost.exe"。因此,如果你发现 "taskhostw "从其他地方运行,或者它的父进程不一样,那么你肯定要仔细检查一下。 python3 vol.py -f <filename> windows.pstree 下图显示了“pstree”的输出,请注意,“PID”列的输出略有变化。 “PID”列的顺序现在按进程及其关联的子进程排序。然而,为了让用户更清楚地看到,每个子进程在其PID之前都被分配了一个“*”,每个后续的子进程都会收到一个附加的“*”前缀。 下图显示“系统”进程产生了“SMS”。exe”,这催生了另一个SMS。exe”,它产生了winlogon。exe’等等。
这对于事件响应者来说非常好,因为它可以更容易地查看盒子上发生了什么进程活动,并识别任何可能是恶意的进程活动。 识别恶意的网络连接当捕获RAM转储时,捕获时的任何网络连接也将被存储在捕获的内存中。这对事件响应者来说是非常好的,因为任何恶意的网络连接都可以被识别出来,如源端口、目标IP、目标端口以及与网络活动有关的进程。 netscan要查看与正在分析的RAM转储相关的网络连接,使用以下命令: python3 vol.py -f <filename> windows.netscan 运行该命令将显示以下信息: netscan的输出是由10个栏目组成的: - Offset - 在内存中的位置
- Proto - 进程所使用的网络协议
- LocalAddr - 网络连接的原始地址
- LocalPort - 网络连接的原始端口
- ForeignAddr - 网络连接的目的地地址
- ForeignPort - 网络连接的目的地端口
- State - 网络连接的状态,即建立、关闭或监听
- PID - 相关进程的进程ID
- Owner - 与进程相关的账户
- Created - 网络连接启动的时间
下面的图片显示了由一个名为 "smsfwder.exe "的进程产生的一些网络连接。 Volatility已经识别出三个连接到通过端口443和8080通信的三个不同IP地址。
作为公司 事件响应计划的一部分,这些IOC现在可以用来搜索其他可能受到危害、需要与网络其他部分隔离的设备。
识别注入的代码恶意软件通常被打包,以便混淆恶意软件作者编写的代码,坏人花时间编写了一些恶意代码,并不希望有人快速查看恶意软件并在短时间内确定它的作用以及如何阻止它。 打包的恶意软件本质上是用一层代码 "包装 "起来的,这层额外的代码隐藏了恶意软件作者编写的代码,这种混淆技术被称为恶意软件 "包装"。
正因为如此,当一个恶意软件被包装好后,它需要解开自己的包装,它在内存中进行,这对Volatility来说是非常好的,因为这正是该工具被设计用来分析的东西
如果这是一个新的概念,那么我建议阅读我以前发表的这篇文章,这篇文章是关于 解包恶意软件的。你需要知道的关键细节是,为了解压自己,恶意软件将创建一个子进程,并将解压后的可执行文件/未解压的恶意软件注入这个新进程中。
malfind 使用Volatility寻找注入的代码是通过使用'malfind'功能完成的。这将显示一个Volatility怀疑可能包含注入代码的进程的列表,基于十六进制显示的头信息,权限和一些提取的 汇编代码,仅仅因为一个进程被列在输出中,并不意味着这个进程是100%的恶意软件。 malfind "的输出显示如下。
你需要了解的关键点是PID、进程名称、保护和红色显示的区域。 PID和进程名称是不言自明的,"保护 "与输出 "PAGE_EXECUTE_READWRITE "有关。这意味着该进程有执行、读取和写入的权限,这对恶意软件来说是很常见的,因为它需要能够执行自己或它下载/投放的其他可执行文件,它需要读取它所入侵的设备上的文件,并且需要能够将文件写入磁盘。因此,任何捕捉到的具有这些权限的进程都将显示在'malfind'输出中。
作为一个介绍,开始使用'malfind'的最简单方法是关注进程名称和我用红色强调的区域。 这显示了包含在进程中的数据的开始,以十六进制表示,旁边是ASCII的相同数值。如果你读过我以前的文章,我曾使用x64dbg和 PeStudio等工具来显示Windows可执行文件的头,这是一种用于恶意软件的常见文件类型。 Windows可执行文件的头在十六进制中总是以 "4D 5A "开始,在ASCII中表示为 "MZ"。下面是我在 HxD中打开的一个恶意软件,它是一个十六进制编辑器,通过使用这个工具,我可以显示包含这些信息的文件头。
作为一个事件响应者,当使用 "malfind "时,如果你在一个进程中看到这些值,那么你很可能已经确定了一个恶意软件,它已经注入了另一个进程。 procdump使用本文所涉及的命令应该使你处于一个良好的位置,开始识别设备内存中运行的潜在恶意软件。使用 "netscan",我能够识别一个名为 "smsfwder.exe "的进程,它正在与已知的C2基础设施进行一些恶意的网络连接。作为我使用Volatility调查的一部分,我可以使用一个叫做'procdump'的功能提取这个进程进行进一步的分析。 python3 vol.py -f <filename> -o <location to dump process> windows.dumpfiles –pid <PID> 这将提取可执行文件和所有相关的DLLs。在下面的图片中,我已经将该进程解压缩到一个名为 "procdump "的文件夹。 这很有用,因为你可以通过执行一些简单的检查,如对转储进程运行'strings'命令,看是否能识别任何额外的IOC,如IP地址、文件名、持久化位置等,尝试从转储进程中提取额外信息。 最后的思考这篇文章应该给你一个坚实的基础,让你清楚地了解Volatility是一个多么有用的事件响应工具。然而,它不是高招,请记住,你只是在分析捕获RAM转储时在内存中运行的东西。这使得它成为分流和开始调查一个可能被攻击的主机的好方法,但是如果在捕获RAM转储的时候,恶意软件没有运行,那么你就不会看到任何恶意活动,任何网络连接也是如此。 |