近来碰到一些 Windows 取证问题,其中内存取证这块发现比较有趣,学习了一下 volatility,将其安装使用过程记录了下来。

准备工作

volatility

volatility 基于 python2 编写,针对 Windows 只支持到 win7/win8

安装pip2

在安装 volatility 之前,我们需要手动安装基于 python2pip,因为 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 插件之前,请先下载对应的符号表(最好下载所有的符号包):

下载后将其解压放入 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

文章作者: z0sen
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 z0sen's Blog
默认分类 DFIR 蓝队
喜欢就支持一下吧