内存取证

内存镜像获取

内存是易失证据,按照证据易失性顺序(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
插件命名 平铺:pslistmalfind 按 OS 分命名空间:windows.pslistlinux.pslist
运行环境 Python 2 Python 3,符号表联网自动下载(也可离线配置 volatility3-symbols)
1
2
3
4
5
6
7
8
# Volatility 2 的基本用法:先判断系统版本
python2 vol.py -f mem.raw imageinfo
# 之后每条命令都要带上 profile
python2 vol.py -f mem.raw --profile=Win7SP1x64 pslist

# Volatility 3:直接调用对应系统的插件
python3 vol.py -f mem.raw windows.info
python3 vol.py -f mem.raw windows.pslist

两版本在实战中都常见,下文插件均给出两种写法。

进程分析

进程排查是内存取证的核心,先看有哪些进程,再找其中不像好人的。

常用插件

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.exescvhost.exeexpl0rer.exe
    • 路径异常:正常的 svchost.exe 只应在 C:\Windows\System32
    • 父进程异常:svchost.exe 的父进程应是 services.exesmss.exe 应由 System 启动;父进程是个陌生程序的要注意
    • 系统进程却发起外网连接

代码注入检测

malfind

扫描进程 VAD 中权限为 PAGE_EXECUTE_READWRITE 的可疑内存页——可写又可执行的内存是进程镂空(Process Hollowing)、反射 DLL 注入的典型落脚点,命中处往往能看到 MZ 头。

1
2
3
4
# Vol2
python2 vol.py -f mem.raw --profile=Win7SP1x64 malfind -p 1234 -D output/
# Vol3
python3 vol.py -f mem.raw -o output/ windows.malfind --pid 1234 --dump

ldrmodules

交叉比对 PEB 的三个模块链表(InLoadOrder、InMemoryOrder、InInitializationOrder)与 VAD 视图:被 unlink 隐藏的 DLL 会从链表中消失,但在 VAD 中依然存在,表现为对应列显示 False。

1
2
python2 vol.py -f mem.raw --profile=Win7SP1x64 ldrmodules -p 1234
python3 vol.py -f mem.raw windows.ldrmodules --pid 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 定位内存中的文件对象
python2 vol.py -f mem.raw --profile=Win7SP1x64 filescan | grep -i "evil.exe"
python3 vol.py -f mem.raw windows.filescan | grep -i "evil.exe"

# 按文件对象偏移提取落地文件(Vol2 用 -Q 接物理偏移)
python2 vol.py -f mem.raw --profile=Win7SP1x64 dumpfiles -Q 0x000000007e123456 -D output/
python3 vol.py -f mem.raw -o output/ windows.dumpfiles --physaddr 0x7e123456

# 按 PID 导出进程可执行文件
python2 vol.py -f mem.raw --profile=Win7SP1x64 procdump -p 1234 -D output/
python3 vol.py -f mem.raw -o output/ windows.pslist --pid 1234 --dump

# 按 PID 导出进程全部内存
python2 vol.py -f mem.raw --profile=Win7SP1x64 memdump -p 1234 -D output/
python3 vol.py -f mem.raw -o output/ windows.memmap --pid 1234 --dump

提取出的样本先算哈希(sha256sum),再送 VirusTotal、微步云沙箱分析,避免在分析机上直接运行。另外 handles -p 1234 -t File(Vol3 为 windows.handles --pid 1234)可以查看进程打开的文件、注册表、互斥体句柄,辅助判断行为。

注册表与持久化排查

1
2
3
4
5
6
7
# 查看内存中的注册表 hive
python2 vol.py -f mem.raw --profile=Win7SP1x64 hivelist
python3 vol.py -f mem.raw windows.registry.hivelist

# 查询指定键(重点:自启动项)
python2 vol.py -f mem.raw --profile=Win7SP1x64 printkey -K "Software\Microsoft\Windows\CurrentVersion\Run"
python3 vol.py -f mem.raw windows.registry.printkey --key "Software\Microsoft\Windows\CurrentVersion\Run"

重点排查的键位:

  • Run / RunOnce:经典自启动项
  • Image File Execution Options:映像劫持
  • WinlogonShellUserinit

服务类持久化用 svcscan 排查:

1
2
python2 vol.py -f mem.raw --profile=Win7SP1x64 svcscan | grep -i -B5 -A10 "可疑服务名"
python3 vol.py -f mem.raw windows.svcscan

其他实用插件

插件 作用
cmdscan / consoles(仅 Vol2) 提取攻击者执行过的命令及屏幕回显
windows.cmdline(Vol3) 查看各进程启动命令行
hashdump 从 SAM/SYSTEM hive 导出本地账户 NTLM 哈希
mimikatz(Vol2 第三方插件) 在内存中搜索明文密码
timeliner 按时间线汇总进程、模块等事件,还原攻击顺序
mutantscan / mutant 扫描互斥体,部分恶意软件家族有固定的互斥体命名
windows.envars(Vol3) 查看进程环境变量

实战排查流程

拿到一份内存镜像后,推荐的排查顺序:

  1. imageinfo / windows.info 确认镜像的系统版本
  2. pslist + psscan 过一遍进程,按名字、路径、父子关系筛出可疑对象
  3. netscan 查看可疑外联与监听端口,按 PID 回查进程
  4. malfind + ldrmodules 检测代码注入与隐藏模块
  5. printkey + svcscan 排查自启动项、服务持久化
  6. procdump / dumpfiles 提取可疑样本,算哈希送沙箱
  7. hashdump 评估凭据泄露范围,决定是否需要全局改密

内存取证的优势在于能看到磁盘上没有的东西:注入的代码、解密的配置、活动的连接。它和《应急响应学习笔记》中的主机排查手段互补,实战中两者结合才能完整还原攻击链。