Volatility
文章作者 r0fus0d & Lorna Dane
免责声明
本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关.
简介
Volatility 是一个用于事件响应和恶意软件分析的开源内存取证框架。它是用 Python 编写的,支持 Microsoft Windows,macOS 和 Linux,volatility 框架是一个完全开放的工具集合,在 GNU 通用许可证下用 Python 实现,用于从易失性存储器(RAM)样本中提取数字镜像。提取技术完全独立于被取证的系统而执行,但可以查看到系统运行时的状态信息。该框架旨在向人们介绍从内存样本中提取的数字镜像相关的技术,并为进一步研究该领域提供一个平台,它可以分析 .raw、.vmem、.img 后缀的文件。
支持原始数据转储(Raw Dump)、崩溃转储(Crash Dump)、休眠文件及各种其它格式,甚至可以支持多个格式之间的转换。
官网
项目地址
volatilityfoundation/volatility3 - Volatility 3.0 development
相关文章
视频教程
Profile 资源
KDPryor/LinuxVolProfiles - Volatility Linux Profiles
volatilityfoundation/profiles - Volatility profiles for Linux and Mac OS X
安装及维护
利用 f8x 进行安装
Ubuntu 下安装
kali 下安装
centos 下安装
windows 下安装
直接访问官网下载二进制文件 https://www.volatilityfoundation.org/releases
使用
基本用法
Volatility 支持的插件列表
Linux 内存取证插件参数
获取镜像信息
首先获取镜像的摘要信息,一般这是进行镜像分析的第一步
这其中比较有用的信息就是 Suggested Profile(s) ,这个是工具识别的系统版本,存在多个的原因是这是根据一些特征识别的,所以可能有误报,就把各种结果按照可能性排列出来了,一般直接选择第一个,如果加载插件报错的话,可以尝试后面的。
这里根据给出的结果选择第一个,然后使用 pslist 插件,看一下系统中运行的进程。
进程
按照 EPROCESS 列表列出所有正在运行的进程
如图中 lsass.exe、winlogon.exe ,在 windows 本地登录时,用户的密码存储在 %SystemRoot%\system32\config\SAM 这个文件里。当用户输入密码进行本地认证的过程中,所有的操作都是在本地进行的。他其实就是将用户输入的密码转换为 NTLM Hash,然后与 SAM 中的 NTLM Hash 进行比较。当用户注销、重启、锁屏后,操作系统会让 winlogon 显示登录界面,也就是输入框。当 winlogon.exe 接收输入后,将密码交给 lsass 进程,这个进程中会存一份明文密码,将明文密码加密成 NTLM Hash,对 SAM 数据库比较认证。
notepad.exe 是指正在运行一个记事本程序,而 mspaint.exe 是指是微软画图程序, cmd.exe 指正在运行命令行程序
显示隐藏/终止的进程
以 dot 图的形式导出
把进程以树的形式显示
查看 DLL 文件
当我们发现可疑进程后,可通过此命令进行深度查看
转储出可寻址的内存数据
在上面的进程中可以看到,存在一个 mspaint.exe 的进程,它是微软的画图软件,对于这样的情况,可以使用工具还原内存中的图片, 来当时查看的图片或者当时状态的图片,使用的工具是 gimp,可以在 linux 上安装使用。
这里首先将 mspaint.exe 的进程内存 dump 出来,使用 memdump 插件,在之前列举进程的截图中,进程名字后面一行就是该进程的 PID。
将获取到的 2276.dmp 文件改名为 2276.data,然后在 gime 中点击显示全部文件,选择 2276.data 打开
首先选择一个固定的宽度,这里选择 1000,然后调节高度把屏幕铺满,然后再大幅度拖动 Image 下的 Offset 的滑块,当看到图片类似下图时停止,可以看到隐隐约约有一张图,但是有点重叠,这时,点击上下箭头缓慢调节 Width,其中 Heigth 在调节中作用是不大的,主要是 Width 和 Offset 的调节决定是否能看到图片
微调位移为图像的左右方向平移,大幅调节位移则是图像的上下方向平移。而宽度不变时,始终显示的都是同一幅图像。
在调节时,不仅仅只能看到画图程序的图片,如下图,就调出了另一个状态的一个系统图片
获取运行过的命令
在上面查看进程时,可以看到存在一个 cmd 进程,那么可以使用 cmdscan 插件来查看运行过的命令,
可以看到执行了 whoami、ifconfig、ipconfig 这三个命令
查看进程命令行参数
信息
获取记事本数据
查看当前桌面截图
可以使用 screenshot 查看查看当前桌面的伪截图,其中会显示桌面上窗口的框,不会显示其中的内容
获取系统中的用户以及密码
dump 明文
注册表 dump 明文
查看剪切版中的信息
扫一下 ie 浏览记录
文件
查看系统中的文件
通过 filescan 命令,可以扫描当前状态下的一些文件,例如桌面的文件,或者特定类型的文件,这些都是结合 grep 命令来实现的
查看桌面的文件
dump 扫描到的文件
在上一步中,发现了桌面的一个 flag.txt,那么可以使用 dumpfiles 命令来将文件 dump 出来
dump 出的文件默认是 dat 后缀的,可以使用 linux 下的 file 命令来查看获取的文件类型,或者是根据之前扫描文件获取到的文件名来修改后缀
转储内存中的进程里 exe 文件
网络
查看系统开放端口以及连接情况
注册表信息
打印注册表项及其子项和对应的值
列出注册表配置文件中的注册表信息
打印内存中指定的注册表信息
扩展
扩展插件
aim4r/VolDiff - 利用 Volatility 框架来识别 Windows 7 内存中恶意软件威胁的 Python 脚本
JamesHabben/evolve - Web 界面版的 Volatility
kevthehermit/VolUtility - Web 界面版的 Volatility
andreafortuna/autotimeliner - 自动从 memory dump 中提取取证时间线
官方仓库
volatilityfoundation/community - Volatility plugins developed and maintained by the community
volatilityfoundation/community3 - Volatility3 plugins developed and maintained by the community
mimikatz
https://github.com/RealityNet/hotoloti/blob/master/volatility/mimikatz.py
Linux Profile
Volatility 对 Linux 进行分析需要指定系统的 Profile
开源的 profile 在线搜索列表
https://isf-server.techanarchy.net/
使用第三方 Profile
在 https://github.com/KDPryor/LinuxVolProfiles 处直接下载已经做好的 profile 文件(zip 文件)然后复制到目录后解压缩即可。
制作 Profile
Volatility 自带一些 windows 系统的 profile,Linux 系统的 Profile 需要自己制作,制作的方法如下:实际是将 module.dwarf 和 system.map 打包成一个 zip 文件,接着将 zip 文件移动到 volatility/plugins/overlays/linux/ 目录中。
这里以 centos7 为例,先安装 dwarfdump(必须安装,创建 module.dwarf 文件的依赖)
在 volatility 目录中的 tool/Linux 运行 make 命令来创建 module.dwarf 文件
打包,将 centos7.zip 移至分析机的 volatility/plugins/overlays/linux/ 目录中
在分析机上将 centos7.zip 至 volatility/plugins/overlays/linux/ 目录中
实战 linux 分析
住:这里 LiME 导出的无法成功解析,不知道原因
直接复制 centos7 的内存文件,放到分析机上,查看进程树列表
显示网络接口详细情况
查看某具体进程的情况
volatility3
Volatility3 是对 Volatility2 的重写,它基于 Python3 编写,对 Windows 10 的内存取证很友好,且速度比 Volatility2 快很多。对于用户而言,新功能的重点包括:大幅提升性能,消除了对 --profile 的依赖,以便框架确定需要哪个符号表(配置文件)来匹配内存示例中的操作系统版本,在 64 位系统(例如 Window 的 wow64)上正确评估 32 位代码,自动评估内存中的代码,以避免对分析人员进行尽可能多的手动逆向工程。对于开发人员:更加轻松地集成到用户的第三方接口和库中,广泛的 API 文档,插件可以直接调用其他插件的能力,插件版本控,直接集成自定义符号表和数据结构。
利用 f8x 进行安装
安装
符号表集
常用插件
使用
volatility3 运行时需要下载 PDB 符号表,国内机器需要挂代理
信息
layerwriter
windows.info
windows.pslist
windows.hashdump
windows.filescan
Symbol Tables
所有文件都以 JSON 数据的形式存储,它们可以是. json 的纯 JSON 文件,也可以是. json.gz 或. json.xz 的压缩文件。Volatility 会在使用时自动解压它们。使用时也会将它们的内容(压缩后)缓存起来,位于用户主目录下的. cache/volatility3 中,以及其他有用的数据。缓存目录目前无法更改。
符号表 JSON 文件默认位于 volatility/symbols 下,在操作系统目录下(目前是 windows、mac 或 linux 中的一种)。符号目录是可以在框架内配置的,通常可以在用户界面上设置。
这些文件也可以被压缩成 ZIP 文件,Volatility 将处理 ZIP 文件以定位符号文件。ZIP 文件必须以相应的操作系统命名(如 linux.zip、mac.zip 或 windows.zip)。在 ZIP 文件中,目录结构应与未压缩的操作系统目录一致。
Windows 符号表
对于 Windows 系统,Volatility 接受由 GUID 和所需 PDB 文件的 Age 组成的字符串。然后,它在 Windows 子目录下的已配置符号目录下搜索所有文件。与文件名模式 /-.json(或任何压缩变体)匹配的任何文件都会被使用。如果找不到这样的符号表,则将从 Microsoft 的 Symbol Server 下载关联的 PDB 文件,并将其转换为适当的 JSON 格式,并将其保存在正确的位置。
Windows 符号表可以从适当的 PDB 文件手动构建。用于执行此操作的主要工具内置于 Volatility 3 中,称为 pdbconv.py。
Mac / Linux 符号表
对于 Mac / Linux 系统,两者都使用相同的识别机制。JSON 文件位于符号目录下的 linux 或 mac 目录下。生成的文件包含一个标识字符串(操作系统横幅),Volatility 的 automagic 可以检测到该字符串。易失性会缓存字符串和它们来自的符号表之间的映射,这意味着精确的文件名无关紧要,并且可以在操作系统目录下的任何必要层次结构下进行组织。
可以使用称为 dwarf2json 的工具从 DWARF 文件生成 Linux 和 Mac 符号表。当前,带有调试符号的内核是恢复大多数 Volatility 插件所需的所有信息的唯一合适方法。找到具有调试符号 / 适当的 DWARF 文件的内核之后,dwarf2json 会将其转换为适当的 JSON 文件。
相关工具
MacOS Processing
Linux Processing
安装 vmlinux
这里我以 ubuntu18.04 为例,系统默认有 vmlinuz,但 vmlinux 与 vmlinuz 不同,需要手动安装 vmlinux
在 centos 中是
以 ubuntu18.04 为例
即使输出与 banner 匹配, 实际运行依旧失败, 此 issues https://github.com/volatilityfoundation/volatility3/issues/413 具有同样问题, 等待软件后续更新解决把
以 CentOS7 为例
所使用的工具:
f8x
Lime
Vmware Workstation
volatility3
配置 centos7 系统并导出内存文件
在 centos 虚机中安装 lime 工具
https://github.com/504ensicsLabs/LiME
安装步骤比较简单,但是有几个坑点。
make 的时候可能会出现出现一点问题。
这个原因就是系统自身的内核版本和 kernel-devel 安装的内核不匹配,我这台安装的内核为 3.10.0-1160.15.2.el7.x86_64,但是使用 uname -r 查到的内核版本为 3.10.0-957.el7.x86_64,所以使用 yum upgrade 升级内核并重启即可解决。
重新编译会生成一个名字和内核版本相同的. ko 文件。
接下来使用 lime 工具导出内存文件.
“./” 后面输入刚刚生成的 .ko 文件
可以看到文件大小非常接近于8G。
制作 centos 符号表文件
制作 centos 的符号表文件需要用到一个使用 GO 语言编写的程序
https://github.com/volatilityfoundation/dwarf2json
根据项目说明,可以采用四种方式来生成符号表(json文件)。
这里我们就选用第一种。然而,使用第一种的话需要 vmlinux 文件,而这 centos 中原本是没有的,所以需要安装。
在安装完成之后可以查找 vmlinux 文件
然后使用 dwarf2json 工具即可导出符号表文件。
kali 分析机 vol3 安装以及使用
打开 kail,使用 f8x 一键安装 volatility3。
https://github.com/ffffffff0x/f8x
安装完毕后,在 /pentest/volatility3 可以找到它。
在 /pentest/volatility3/volatility3/symbols 中创建名为 “linux” 的文件夹,并把符号表放在里面。
把之前导出的 centos.lime 的内存文件也放入 kali 中。
使用 volatility 分析
可以看到我在 centos 中所输入的历史命令
linux.check_idt.Check_idt
linux.check_syscall.Check_syscall
linux.elfs.Elfs
linux.lsmod.Lsmod
linux.lsof.Lsof
linux.malfind.Malfind
linux.proc.Maps
linux.pslist.PsList
linux.pstree.PsTree
linux.tty_check.tty_check