| name | performing-memory-forensics-with-volatility3 |
| description | 使用 Volatility 3 分析易失性内存转储,以提取运行中的进程、网络连接、加载的模块以及恶意活动的证据。 |
| domain | cybersecurity |
| subdomain | digital-forensics |
| tags | ["forensics","memory-forensics","volatility","ram-analysis","malware-detection","incident-response"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
使用 Volatility 3 执行内存取证
适用场景
- 分析来自被入侵或可疑系统的 RAM 转储时
- 事件响应期间识别运行中的恶意软件、注入代码或 rootkit 时
- 需要从内存中提取凭据、加密密钥或网络连接时
- 检测进程空洞化(process hollowing)、DLL 注入或隐藏进程时
- 单纯的磁盘取证不足以解决问题且易失性数据至关重要时
前置条件
- 已安装 Python 3.7+
- 已安装 Volatility 3 框架(
pip install volatility3)
- 原始格式、ELF 或崩溃转储格式的内存转储
- 目标操作系统版本的适当符号表(ISF 文件)
- 充足的磁盘空间用于分析输出(内存转储大小的 2-3 倍)
- 可选:YARA 规则用于内存中的恶意软件扫描
工作流程
步骤 1:获取内存转储并安装 Volatility 3
pip install volatility3
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
pip install -e .
wget https://downloads.volatilityfoundation.org/volatility3/symbols/windows.zip
unzip windows.zip -d /opt/volatility3/volatility3/symbols/
wget https://downloads.volatilityfoundation.org/volatility3/symbols/linux.zip
wget https://downloads.volatilityfoundation.org/volatility3/symbols/mac.zip
sudo insmod lime-$(uname -r).ko "path=/cases/memory/linux_mem.lime format=lime"
file /cases/case-2024-001/memory/memory.raw
ls -lh /cases/case-2024-001/memory/memory.raw
步骤 2:识别操作系统 Profile
vol -f /cases/case-2024-001/memory/memory.raw banners
vol -f /cases/case-2024-001/memory/memory.raw windows.info
vol -f /cases/case-2024-001/memory/linux_mem.lime linux.info
步骤 3:枚举进程并检测异常
vol -f /cases/case-2024-001/memory/memory.raw windows.pslist | tee /cases/case-2024-001/analysis/pslist.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.pstree | tee /cases/case-2024-001/analysis/pstree.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.psscan | tee /cases/case-2024-001/analysis/psscan.txt
diff <(vol -f memory.raw windows.pslist | awk '{print $1}' | sort) \
<(vol -f memory.raw windows.psscan | awk '{print $1}' | sort)
vol -f /cases/case-2024-001/memory/memory.raw windows.dlllist --pid 4532
vol -f /cases/case-2024-001/memory/memory.raw windows.malfind | tee /cases/case-2024-001/analysis/malfind.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.memmap --pid 4532 --dump \
-o /cases/case-2024-001/analysis/dumps/
步骤 4:分析网络连接和注册表
vol -f /cases/case-2024-001/memory/memory.raw windows.netscan | tee /cases/case-2024-001/analysis/netscan.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.netscan | grep ESTABLISHED
vol -f /cases/case-2024-001/memory/memory.raw windows.netscan | grep LISTENING
vol -f /cases/case-2024-001/memory/memory.raw windows.netstat | tee /cases/case-2024-001/analysis/netstat.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.registry.hivelist
vol -f /cases/case-2024-001/memory/memory.raw windows.registry.printkey \
--key "Software\Microsoft\Windows\CurrentVersion\Run"
vol -f /cases/case-2024-001/memory/memory.raw windows.svcscan | tee /cases/case-2024-001/analysis/services.txt
步骤 5:提取凭据和敏感数据
vol -f /cases/case-2024-001/memory/memory.raw windows.hashdump | tee /cases/case-2024-001/analysis/hashes.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.lsadump
vol -f /cases/case-2024-001/memory/memory.raw windows.cachedump
vol -f /cases/case-2024-001/memory/memory.raw windows.strings --pid 4532 \
| grep -iE '(password|credential|token|api.key)'
vol -f /cases/case-2024-001/memory/memory.raw windows.cmdline | tee /cases/case-2024-001/analysis/cmdline.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.envars --pid 4532
步骤 6:使用 YARA 规则扫描恶意软件
vol -f /cases/case-2024-001/memory/memory.raw yarascan \
--yara-file /opt/yara-rules/malware_index.yar | tee /cases/case-2024-001/analysis/yara_hits.txt
vol -f /cases/case-2024-001/memory/memory.raw yarascan \
--yara-file /opt/yara-rules/apt_rules.yar --pid 4532
vol -f /cases/case-2024-001/memory/memory.raw windows.modules | tee /cases/case-2024-001/analysis/modules.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.modscan | tee /cases/case-2024-001/analysis/modscan.txt
vol -f /cases/case-2024-001/memory/memory.raw windows.ssdt | grep -v "ntoskrnl\|win32k"
vol -f /cases/case-2024-001/memory/memory.raw windows.dumpfiles --pid 4532 \
-o /cases/case-2024-001/analysis/extracted/
步骤 7:将调查结果汇编为报告
echo "=== 内存取证报告 ===" > /cases/case-2024-001/analysis/memory_report.txt
echo "镜像:memory.raw" >> /cases/case-2024-001/analysis/memory_report.txt
echo "操作系统:Windows 10 Build 19041" >> /cases/case-2024-001/analysis/memory_report.txt
echo "" >> /cases/case-2024-001/analysis/memory_report.txt
echo "--- 可疑进程 ---" >> /cases/case-2024-001/analysis/memory_report.txt
cat /cases/case-2024-001/analysis/malfind.txt >> /cases/case-2024-001/analysis/memory_report.txt
echo "--- 网络连接 ---" >> /cases/case-2024-001/analysis/memory_report.txt
cat /cases/case-2024-001/analysis/netscan.txt >> /cases/case-2024-001/analysis/memory_report.txt
echo "--- YARA 匹配 ---" >> /cases/case-2024-001/analysis/memory_report.txt
cat /cases/case-2024-001/analysis/yara_hits.txt >> /cases/case-2024-001/analysis/memory_report.txt
sha256sum /cases/case-2024-001/memory/memory.raw >> /cases/case-2024-001/analysis/memory_report.txt
关键概念
| 概念 | 描述 |
|---|
| 易失性数据(Volatile data) | 仅存在于 RAM 中、断电后丢失的信息 |
| 进程空洞化(Process hollowing) | 恶意软件将合法进程内存替换为恶意代码的技术 |
| DLL 注入(DLL injection) | 向运行中的进程地址空间加载未授权 DLL |
| EPROCESS | 表示进程的 Windows 内核结构;进程列表的基础 |
| 池扫描(Pool scanning) | 在内存中搜索内核对象签名以查找隐藏制品 |
| VAD(虚拟地址描述符) | 跟踪进程虚拟内存区域的内存管理结构 |
| ISF(中间符号格式) | 用于操作系统特定结构定义的 Volatility 3 符号表格式 |
| Malfind | 通过检查 VAD 权限和内容检测注入代码的插件 |
工具与系统
| 工具 | 用途 |
|---|
| Volatility 3 | 主要的开源内存取证框架 |
| LiME | 用于获取 Linux RAM 转储的 Linux Memory Extractor |
| WinPmem | Windows 物理内存获取驱动程序 |
| DumpIt | Comae 一键式 Windows 内存转储工具 |
| YARA | 用于恶意软件签名扫描的模式匹配引擎 |
| Rekall | 替代内存取证框架(Google) |
| MemProcFS | 用于内存分析的内存进程文件系统 |
| strings | 从二进制内存转储中提取可打印字符串 |
常见场景
场景 1:活跃恶意软件调查
使用 DumpIt 获取内存,运行 pslist/pstree 识别可疑进程,使用 malfind 检测 svchost.exe 中的注入代码,转储注入的内存段,使用 YARA 规则识别 Cobalt Strike beacon,从 netscan 中提取 C2 IP,与网络日志关联。
场景 2:数据泄露后的凭据盗取
运行 hashdump 和 lsadump 提取缓存凭据,在 cmdline 输出中识别 mimikatz 执行,检查文件系统制品中的 lsass.exe 内存转储,与网络连接中的横向移动证据关联。
场景 3:Rootkit 检测
比较 pslist(使用 EPROCESS 链表)与 psscan(池扫描)以查找未链接进程,检查 modules 与 modscan 是否存在隐藏内核驱动,检查 SSDT 是否有重定向系统调用的钩子,转储可疑模块进行静态分析。
场景 4:勒索软件事件恢复
在系统关机前从勒索软件进程内存中提取加密密钥,使用 YARA 识别勒索软件变种,通过命令行制品找到初始执行点,通过网络连接绘制横向移动路线。
输出格式
内存取证分析:
镜像: memory.raw(16 GB)
识别操作系统: Windows 10 x64 Build 19041
捕获时间: 2024-01-18 14:32:15 UTC
进程分析:
进程总数: 87
隐藏进程: 2(PID:4532, 6128)
注入进程: 3(malfind 检测到)
可疑: svchost.exe(PID 4532)- 0x7FFE0000 处有注入代码
网络连接:
总数: 45
已建立: 12
可疑: 3(C2 连接至 185.xx.xx.xx:443)
发现的凭据:
NTLM 哈希: 4 个账户
缓存凭据: 2 个域账户
YARA 匹配:
CobaltStrike_Beacon:PID 4532(3 次命中)
Mimikatz_Memory: PID 6128(1 次命中)
提取的制品: 15 个文件已转储至 /analysis/extracted/