点击上方蓝字“小谢取证”一起玩耍
前言
内存取证技术不仅应用于实际的AJ中,还在CTF、电子数据取证竞赛中出现它的身影。本期特邀z0sen带你走进内存取证的世界--volatility内存取证工具的应用。哥们,想学习内存取证?这一篇文章就够用。
内存取证概述
内存取证是一种数字取证技术,通过分析计算机系统的内存(RAM)数据来获取证据。内存取证的重要性在于内存中包含了系统的实时状态信息,如运行中的进程、网络连接、登录会话、密钥文件和其他潜在的证据。
内存镜像采集
工具选择
-
FTK Imager:可以从 Windows 系统内存中创建镜像文件,并对文件进行哈希校验。
-
osxpmem:用于 MacOS 系统的内存镜像提取工具。
-
LiME(Linux Memory Extractor):用于 Linux 系统的内存镜像提取工具。
采集方法
-
现场采集:在现场使用工具采集内存镜像,确保系统尽可能保持原样,保持证据的完整性和真实性。可以通过 USB 设备加载采集工具。
-
远程采集:通过网络连接远程采集内存镜像。需要注意网络传输的安全性和数据完整性。
完整性验证
-
使用哈希算法(如 MD5、SHA-256)对采集到的内存镜像文件进行哈希值计算,确保在传输和分析过程中数据未被篡改,哈希计算可借助 HashCalculator 完成。
内存镜像分析
进程和线程分析
-
列出所有进程:通过工具列出当前内存中的所有进程,识别出合法和潜在的恶意进程。
-
分析线程:查看每个进程的线程,寻找异常行为或隐藏的恶意代码。
网络连接分析
-
当前连接:列出当前的网络连接,分析可疑的远程连接和未经授权的网络活动。
-
当前端口:检查系统中当前的端口,识别可能的攻击路径或正在运行的服务。
系统注册表分析
-
注册表提取:从内存中提取系统注册表,分析其中的配置信息和历史操作。
-
分析关键节点:检查关键注册表节点(如启动项、服务项)以发现潜在的恶意配置。
文件和内存映射
-
文件提取:从内存中提取运行中的文件和模块,检查其完整性和合法性。
-
内存映射:分析内存中加载的文件和内存映射,识别未注册或隐藏的模块和动态链接库(DLL)。
加密数据和密钥提取
-
内存密钥提取:尝试从内存中提取加密密钥和解密后的数据,有助于破译加密的通信和文件(如 Bitlocker)。
内存取证的关键概念
易失性数据
内存中的数据是易失性的,系统断电或重启后数据会丢失。因此,及时采集内存数据非常重要。
工具和技术
-
Volatility:一款开源的内存取证框架,支持多种操作系统内存镜像的分析。
-
FTK Imager:主要用于采集 Windows 内存镜像,并生成哈希值。
-
DumpIt:一个简单易用的工具,适用于快速采集 Windows 系统的内存镜像。
-
WinPmem:一个 Windows 物理内存镜像采集工具,使用 WDK10 进行编译,支持 Win7 - Win10。
-
osxpmem:用于 MacOS 系统的内存镜像提取工具。
-
LiME(Linux Memory Extractor):用于 Linux 系统的内存镜像提取工具。
-
Elcomsoft Forensic Disk Decryptor:即时访问被 BitLocker、FileVault2、PGP、TrueCrypt 和 VeraCrypt 等加密存储的数据。该工具从内存中捕获休眠文件和 page 文件,并从中提取加密密钥,也可以使用纯文本mm或托管密钥来解密存储在加密容器中的文件和文件夹,或者将加密卷挂载到本地磁盘,以便进行实时访问。
进程和模块分析
通过分析内存中的进程和模块,可以发现隐藏的恶意软件或异常行为。
可以识别隐藏进程(rootkits)和未注册的网络连接。
内存中的加密数据
现代操作系统和应用程序广泛使用加密技术,内存中可能存在解密密钥或解密后的数据,可以帮助破译加密文件和通信内容。
现场取证与远程取证
现场取证:直接在目标设备上采集内存镜像,适用于物理接触到目标设备的场景。
远程取证:通过网络远程采集内存镜像,需要确保网络传输过程中的数据完整性和安全性。
内存取证的注意事项
数据完整性:采集前后进行哈希值校验,确保内存镜像数据未被篡改。
尽量减少干扰:采集过程应尽量减少对系统状态的改变,避免对证据的破坏。
合法性:确保取证过程符合相关法律法规,保护隐私和数据安全。
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.pycurl https://bootstrap.pypa.io/pip/2.7/get-pip.py -o get-pip.py# 安装 pippython2 get-pip.py# 升级 pippython2 -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 "SAMDomainsAccountUsersNames"# 查看注册表vol.py -f <filename> --profile <ostype> hivelist# 提取用户名与mm hashvol.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 mm信息vol.py -f <filename> --profile <ostype> truecryptpassphrase
案例演示:
通过 imageinfo
命令得知系统版本为:Win7SP1x64
通过 pslist
查看进程列表,其结果中 PID
是当前进程号,PPID
是父进程号,如果一个进程已经结束了,那么在 Exit
列会显示进程结束的时间:
pstree
可以识别子进程和父进程,可以显示出被隐藏的病毒程序:
另有
psscan
命令与此命令目的类似
hashdump
抓取内存中的系统用户mm 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 账号明文mm、Bitlocker 解密、浏览器历史记录读取、浏览器存储的mm读取等等。
首先创建一个目录用于存放插件:
sudo mkdir -p /opt/volatility/plugins
使用插件时需指定插件存放路径,且该指令需作为第一个参数紧跟在 vol.py
命令后,参考如下:
vol.py --plugin=/opt/volatility/plugins -f [内存镜像文件路径] --profile [系统版本] [插件名]
mimikatz.py
mimikatz.py
插件可以从内存中提取明文mm,安装方法如下:
# 下载插件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# 导出 FVEKvol.py --plugin=/opt/volatility/plugins -f ~/memdump_win7.mem --profile Win7SP1x64 bitlocker --dislocker ~/dump
然后使用 Dislocker 来加载磁盘:
dislocker -k ~/dump/0xfa80348f6c10-Dislocker.fvek ~/win7disk.dd ~/dislockermount ~/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# 构建并安装 volatility3python3 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 updatedblocate 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# 查看 DLLvol -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 提供的 offsetvol -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 提供的 pidvol -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
抓取内存中的用户mm hash(LM/NTLM):
volatility3 中新增了
-r
参数指定输出样式
windows.cmdline
windows.netscan
查看网络连接情况,相当于 Windows 中查看 netstat -ano
:
敬请各位大佬关注:小谢取证
点赞、好看的你
最好看
↓↓↓
原文始发于微信公众号(小谢取证):带你走进volatility内存取证的世界
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论