内存镜像获取
内存是易失证据,按照证据易失性顺序(RFC 3227),应急响应时应先采集内存、再处置磁盘。采集动作本身会改变目标内存(加载驱动、产生进程),这是不可避免的,操作时做好记录即可。
Windows
| 工具 | 特点 | 用法 |
|---|---|---|
| FTK Imager | GUI,商业但免费 | File → Capture Memory,选择输出路径 |
| DumpIt(Comae/Magnet) | 单文件绿色程序,拷进 U 盘双击即用 | 运行后按 y 确认,在当前目录生成 raw 镜像 |
| winpmem | 命令行,开源,可远程批量采集 | winpmem.exe -o mem.raw |
Linux
- LiME:以内核模块方式加载,需针对目标内核版本提前编译好模块:
sudo insmod lime.ko "path=/tmp/mem.lime format=lime" - AVML:微软开源的采集工具,静态编译免内核模块,直接
sudo ./avml /tmp/mem.lime,目标系统无法编译模块时优先选它
虚拟机
VMware 虚拟机挂起(Suspend)后目录下的 .vmem 文件就是完整的内存镜像,可直接交给 Volatility 分析,是练习和应急演练最方便的样本来源。
Volatility 基础
Volatility 2 与 3 的差异
| Volatility 2 | Volatility 3 | |
|---|---|---|
| 系统识别 | 需先用 imageinfo 判断,再手动指定 --profile=Win7SP1x64 |
自动识别符号表,无需 profile |
| 插件命名 | 平铺:pslist、malfind |
按 OS 分命名空间:windows.pslist、linux.pslist |
| 运行环境 | Python 2 | Python 3,符号表联网自动下载(也可离线配置 volatility3-symbols) |
1 | # Volatility 2 的基本用法:先判断系统版本 |
两版本在实战中都常见,下文插件均给出两种写法。
进程分析
进程排查是内存取证的核心,先看有哪些进程,再找其中不像好人的。
常用插件
| Volatility 2 | Volatility 3 | 作用 |
|---|---|---|
| pslist | windows.pslist | 按 EPROCESS 双向链表列出活动进程 |
| pstree | windows.pstree | 树形展示进程父子关系 |
| psscan | windows.psscan | 按 pool tag 扫描,能找到已退出或被断链隐藏的进程 |
| psxview | (未移植) | 交叉比对 7 种进程视图,专找 rootkit 隐藏的进程 |
| dlllist | windows.dlllist | 列出进程加载的 DLL |
| getsids | windows.getsids | 查看进程所属用户 SID |
排查思路
- pslist 与 psscan 对比:pscan 里有、pslist 里没有的进程,要么已退出,要么被 rootkit 用 DKOM 手法断链隐藏,重点怀疑
- 可疑进程特征
- 仿冒系统进程名:
svch0st.exe、scvhost.exe、expl0rer.exe - 路径异常:正常的
svchost.exe只应在C:\Windows\System32下 - 父进程异常:
svchost.exe的父进程应是services.exe,smss.exe应由 System 启动;父进程是个陌生程序的要注意 - 系统进程却发起外网连接
- 仿冒系统进程名:
代码注入检测
malfind
扫描进程 VAD 中权限为 PAGE_EXECUTE_READWRITE 的可疑内存页——可写又可执行的内存是进程镂空(Process Hollowing)、反射 DLL 注入的典型落脚点,命中处往往能看到 MZ 头。
1 | # Vol2 |
ldrmodules
交叉比对 PEB 的三个模块链表(InLoadOrder、InMemoryOrder、InInitializationOrder)与 VAD 视图:被 unlink 隐藏的 DLL 会从链表中消失,但在 VAD 中依然存在,表现为对应列显示 False。
1 | python2 vol.py -f mem.raw --profile=Win7SP1x64 ldrmodules -p 1234 |
网络连接分析
| Volatility 2 | Volatility 3 | 作用 |
|---|---|---|
| netscan(Vista 及以上) | windows.netscan / windows.netstat | 扫描 TCP/UDP 端点、连接状态与对应 PID |
| connections / connscan(XP) | — | XP 时代的连接扫描插件 |
排查思路:
- 找状态为 ESTABLISHED 的可疑外联,把 IP/域名丢 VirusTotal、微步在线查信誉,判断是否 C2
- 按连接对应的 PID 回查进程,结合 malfind 看是否被注入
- 留意非常见的监听端口(非业务端口上的 LISTENING)
文件与样本提取
1 | # 定位内存中的文件对象 |
提取出的样本先算哈希(sha256sum),再送 VirusTotal、微步云沙箱分析,避免在分析机上直接运行。另外 handles -p 1234 -t File(Vol3 为 windows.handles --pid 1234)可以查看进程打开的文件、注册表、互斥体句柄,辅助判断行为。
注册表与持久化排查
1 | # 查看内存中的注册表 hive |
重点排查的键位:
Run/RunOnce:经典自启动项Image File Execution Options:映像劫持Winlogon的Shell、Userinit值
服务类持久化用 svcscan 排查:
1 | python2 vol.py -f mem.raw --profile=Win7SP1x64 svcscan | grep -i -B5 -A10 "可疑服务名" |
其他实用插件
| 插件 | 作用 |
|---|---|
| cmdscan / consoles(仅 Vol2) | 提取攻击者执行过的命令及屏幕回显 |
| windows.cmdline(Vol3) | 查看各进程启动命令行 |
| hashdump | 从 SAM/SYSTEM hive 导出本地账户 NTLM 哈希 |
| mimikatz(Vol2 第三方插件) | 在内存中搜索明文密码 |
| timeliner | 按时间线汇总进程、模块等事件,还原攻击顺序 |
| mutantscan / mutant | 扫描互斥体,部分恶意软件家族有固定的互斥体命名 |
| windows.envars(Vol3) | 查看进程环境变量 |
实战排查流程
拿到一份内存镜像后,推荐的排查顺序:
imageinfo/windows.info确认镜像的系统版本pslist+psscan过一遍进程,按名字、路径、父子关系筛出可疑对象netscan查看可疑外联与监听端口,按 PID 回查进程malfind+ldrmodules检测代码注入与隐藏模块printkey+svcscan排查自启动项、服务持久化procdump/dumpfiles提取可疑样本,算哈希送沙箱hashdump评估凭据泄露范围,决定是否需要全局改密
内存取证的优势在于能看到磁盘上没有的东西:注入的代码、解密的配置、活动的连接。它和《应急响应学习笔记》中的主机排查手段互补,实战中两者结合才能完整还原攻击链。