volatility 内存取证工具
近来碰到一些 Windows 取证问题,其中内存取证这块发现比较有趣,学习了一下 volatility,将其安装使用过程记录了下来。
准备工作
- kali 2h4g(虚拟机)
- Python2
- volatility
- Python3
- volatility3
volatility
volatility 基于 python2 编写,针对 Windows 只支持到 win7/win8
安装pip2
在安装 volatility 之前,我们需要手动安装基于 python2
的 pip
,因为 volatility 基于 python2,而 kali 中的 python2
缺少 pip
。
# 下载 get-pip.py
curl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py
# 安装 pip
python2 get-pip.py
# 升级 pip
python2 -m pip install --upgrade setuptools
安装依赖项
安装 crypto 和 construct 库:
python2 -m pip install pycryptodome construct Pillow yara-python -i https://pypi.tuna.tsinghua.edu.cn/simple
安装 distorm3:
# 使用 git 命令下载 distorm3 模块
git clone https://github.com/vext01/distorm3.git
# 进入到 distorm3 目录
cd distorm3
# 安装
python2 setup.py install
volatility安装
依赖环境安装好后,将 volatility
源码下载到 kali 开始安装:
# 下载项目到本地
git clone https://github.com/volatilityfoundation/volatility.git
# 进入到 volatility 目录
cd volatility
# 安装
python2 setup.py install
安装完成后可通过命令 vol.py
运行 volatility
:
volatility使用
基础使用:
# 查看imageinfo获取操作系统类型
vol.py -f <filename> imageinfo
# 示例:
vol.py -f ~/memdump_win7.mem imageinfo
# 指定操作系统类型进行其他操作
vol.py -f <filename> --profile <ostype>
# 查看进程
vol.py -f <filename> --profile <ostype> pslist
# 筛选特定后缀名的文件
vol.py -f <filename> --profile <ostype> filescan | grep -E "txt|xml|png|jpg|gif|zip|rar|7z|pdf|doc|docx|php|py|flag"
# 桌面
vol.py -f <filename> --profile <ostype> filescan | grep -E "Desktop"
# 导出文件
vol.py -f <filename> --profile <ostype> dumpfiles -Q <virtual address> -D <savedir>
# 获取系统用户名
vol.py -f <filename> --profile <ostype> printkey -K "SAM\Domains\Account\Users\Names"
# 查看注册表
vol.py -f <filename> --profile <ostype> hivelist
# 提取用户名与密码hash
vol.py -f <filename> --profile <ostype> hashdump
# 获取IE浏览器历史记录
vol.py -f <filename> --profile <ostype> iehistory
# 查看网络连接
vol.py -f <filename> --profile <ostype> netscan
# 将内存中的某个进程数据以 dmp 的格式保存出来
vol.py -f <filename> --profile <ostype> memdump -p <pid> -D <savedir>
# 查看命令行历史记录
vol.py -f <filename> --profile <ostype> cmdscan
# 查看进程命令行参数
vol.py -f <filename> --profile <ostype> cmdline
# 获取TrueCrypt秘钥信息
vol.py -f <filename> --profile <ostype> truecryptmaster
# 获取TrueCrypt密码信息
vol.py -f <filename> --profile <ostype> truecryptpassphrase
案例演示:
通过 imageinfo
命令得知系统版本为:Win7SP1x64
通过 pslist
查看进程列表,其结果中 PID
是当前进程号,PPID
是父进程号,如果一个进程已经结束了,那么在 Exit
列会显示进程结束的时间:
pstree
可以识别子进程和父进程,可以显示出被隐藏的病毒程序:
另有
psscan
命令与此命令目的类似
hashdump
抓取内存中的用户密码 hash(LM/NTLM):
filescan
扫描所有文件列表,文件比较多,若是比赛推荐对 flag
等关键字过滤,若是实际工作则据实际情况做筛选,这里以查看桌面文件为例:
iehistory
查看 IE 浏览器的历史记录:
netscan
查看网络连接情况,相当于 Windows 中查看 netstat -ano
:
userassist
包含 GUI 应用执行的信息,如名称、路径、关联快捷方式、执行次数、上一次执行时间等:
screenshot
查看截屏,使用 -D
参数将截屏输出到指定目录:
svcscan
查看开启的 Windows 服务,内容较多可将结果输出到文件中方便后续查看:
vol.py -f ~/memdump_win7.mem --profile Win7SP1x64 svcscan > svc.txt
volatility插件
volatility 可安装许多插件来对内存镜像进行进一步快速分析,这些插件功能各不相同,如抓取 Windows 账号明文密码、Bitlocker解密、浏览器历史记录读取、浏览器存储的密码读取等等。
首先创建一个目录用于存放插件:
sudo mkdir -p /opt/volatility/plugins
使用插件时需指定插件存放路径,且该指令需作为第一个参数紧跟在 vol.py
命令后,参考如下:
vol.py --plugin=/opt/volatility/plugins -f [内存镜像文件路径] --profile [系统版本] [插件名]
mimikatz.py
mimikatz.py
插件可以从内存中提取明文密码,安装方法如下:
# 下载插件
wget https://raw.githubusercontent.com/RealityNet/hotoloti/master/volatility/mimikatz.py
# 安装插件
cp mimikatz.py /opt/volatility/plugins/
# 赋予可执行权限
chmod +x /opt/volatility/plugins/mimikatz.py
插件使用测试如下:
bitlocker.py
bitlocker.py
插件可在内存中检索 全卷加密密钥
(FVEK)。然后,FVEK 可用于 Dislocker 来解密加密卷。该插件已在从 Windows 7 到 Windows 10 的所有 64 位 Windows 版本上进行过测试,与 Dislocker 完全兼容。(仅支持 DD 镜像)安装方法如下:
# 下载插件
wget https://raw.githubusercontent.com/breppo/Volatility-BitLocker/master/bitlocker.py
# 安装插件
cp bitlocker.py /opt/volatility/plugins/
# 赋予可执行权限
chmod +x /opt/volatility/plugins/bitlocker.py
- 使用方法
查找内存中的 FVEK:
vol.py --plugin=/opt/volatility/plugins -f ~/memdump_win7.mem --profile Win7SP1x64 bitlocker
要使用 Dislocker 测试 FVEK,可以添加参数 --dislocker
并指定 FVEK 输出路径:
# 创建用于存放 FVEK 的文件夹
mkdir ~/dump
# 导出 FVEK
vol.py --plugin=/opt/volatility/plugins -f ~/memdump_win7.mem --profile Win7SP1x64 bitlocker --dislocker ~/dump
然后使用 Dislocker 来加载磁盘:
dislocker -k ~/dump/0xfa80348f6c10-Dislocker.fvek ~/win7disk.dd ~/dislocker
mount ~/dislocker/dislocker-file /mnt/
usbstor.py
usbstor.py
用于扫描注册表,查找接入过系统的 USB 设备信息。安装方法如下:
# 下载插件
wget https://raw.githubusercontent.com/kevthehermit/volatility_plugins/main/vol2/usbstor/usbstor.py
# 安装插件
cp usbstor.py /opt/volatility/plugins/
# 赋予可执行权限
chmod +x /opt/volatility/plugins/usbstor.py
使用方法:
vol.py --plugin=/opt/volatility/plugins -f ~/memdump_win7.mem --profile Win7SP1x64 usbstor
volatility3
volatility3 基于 python3 编写,目前
volatility3安装
主程序安装:
# 下载源码
git clone https://github.com/volatilityfoundation/volatility3.git
# 安装依赖
python3 -m pip install -r requirements.txt
# 构建并安装 volatility3
python3 setup.py build
python3 setup.py install
符号表安装
使用对应 linux/mac/windows 插件之前,请先下载对应的符号表(最好下载所有的符号包):
- https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
- https://downloads.volatilityfoundation.org/volatility3/symbols/mac.zip
- https://downloads.volatilityfoundation.org/volatility3/symbols/linux.zip
下载后将其解压放入 volatility/symbols
目录下,目前主程序已经安装到系统中,所以要寻找其在系统中的安装位置:
sudo updatedb
locate volatility3/symbols
由此得到在我的系统中符号表文件夹为:/usr/local/lib/python3.11/dist-packages/volatility3-2.7.0-py3.11.egg/volatility3/symbols
解压复制完成后修改文件夹权限为普通用户权限,使得 vol3 在后续需要调用文件时不会出现权限错误:
# 修改权限
sudo chown -R kali:kali /usr/local/lib/python3.11/dist-packages/volatility3-2.7.0-py3.11.egg/volatility3/symbols
# 查看权限情况
ll /usr/local/lib/python3.11/dist-packages/volatility3-2.7.0-py3.11.egg/volatility3/symbols
volatility3使用
基础使用:
# # 查看镜像信息
vol -f xxx.mem windows.info
# 查看镜像进程
vol -f xxx.mem windows.pslist
vol -f xxx.mem windows.psscan
vol -f xxx.mem windows.pstree
# 查看指定 pid 的进程
vol -f xxx.mem windows.pslist --pid 1234
# 进程转储
vol -o ./outputdir/ -f xxx.mem windows.pslist --pid 1234 --dump
# 内存转储
vol -o ./outputdir/ -f xxx.mem windows.memmap --pid 1234 --dump
# 查看网络端口
vol -f xxx.mem windows.netscan
# 查看完整的结果,但可能包含垃圾信息和虚假信息 (谨慎使用)
vol -f xxx.mem windows.netscan --include-corrupt
# 查看句柄
vol -f xxx.mem windows.handles
vol -f xxx.mem windows.handles --pid 1234
# 查看 DLL
vol -f xxx.mem windows.dlllist
vol -f xxx.mem windows.dlllist --pid 1234
# DLL 转储
vol -o ./outputdir/ -f xxx.mem windows.dlllist --pid 1234 --dump
# 查看命令行
vol -f xxx.mem windows.cmdline
vol -f xxx.mem windows.cmdline --pid 1234
# 查看注册表信息
vol -f xxx.mem windows.registry.hivescan
vol -f xxx.mem windows.registry.hivelist
# 查看指定过滤器 (文件夹) 下的注册表信息
vol -f xxx.mem windows.registry.hivelist --filter FILTER
# 注册表信息转储
vol -o ./outputdir/ -f xxx.mem windows.hivelist --filter FILTER --dump
# 查看注册表键值对
vol -f xxx.mem windows.registry.printkey
# 查看指定过滤器 (文件夹) 下的注册表信息,但需要 hivelist 提供的 offset
vol -f xxx.mem windows.registry.printkey --offset OFFSET
# 查看指定键下的注册表值
vol -f xxx.mem windows.registry.printkey --key KEY
# 打印所有键的信息
vol -f xxx.mem windows.registry.printkey --recurse
# 查看文件信息
vol -f xxx.mem windows.filescan
# 建议通过 powershell 的 Select-String 或者 bash 的 grep 进行搜索,如:
vol -f xxx.mem windows.filescan | grep "flag"
vol -f xxx.mem windows.filescan | Select-String "flag"
# 文件转储,需要 pslist 提供的 pid
vol -o ./outputdir/ -f xxx.mem windows.dumpfiles --pid 1234
(推荐) 需要 filescan 提供的 offset (一般来说为 physaddr)
vol -o ./outputdir/ -f xxx.mem windows.dumpfiles --virtaddr 0xee1122
vol -o ./outputdir/ -f xxx.mem windows.dumpfiles --physaddr 0xee1122
# 查找恶意注入代码
vol -f xxx.mem windows.malfind
vol -f xxx.mem windows.malfind --pid 1234
# 恶意注入代码转储
vol -o ./outputdir/ -f xxx.mem windows.malfind --pid 1234 --dump
windows.hashdump
抓取内存中的用户密码 hash(LM/NTLM):
volatility3 中新增了
-r
参数指定输出样式
windows.cmdline
windows.netscan
查看网络连接情况,相当于 Windows 中查看 netstat -ano
: