jaalso/memory-forensics

GitHub: jaalso/memory-forensics

基于 Volatility 的 Windows 内存取证实验项目,通过 Cridex 与 Zeus 两个真实恶意软件样本演示从进程分析到注入证明的完整 DFIR 调查流程。

Stars: 0 | Forks: 0

# 🧠 内存取证实验 使用 Volatility 2 和标准 DFIR 方法论,针对公开的真实恶意软件样本进行实战内存取证调查:识别 → 基线分析 → 转向行为分析 → 证明注入 → 提取并验证 → 发现持久化。 两个案例均采用相同的核心工作流程,但复杂度逐步提升 —— 以 Cridex 作为入门级基线,以 Zeus 作为高级多阶段调查。 ## 📁 案例 | # | 案例 | 恶意软件 | 目标 OS | 关键技术 | 状态 | |---|---|---|---|---|---| | 01 | [Cridex 银行木马](#01--cridex-banking-trojan) | Cridex / Bugat | Windows XP SP3 | 进程注入 · C2 检测 | ✅ 已完成 | | 02 | [Zeus / Zbot 银行木马](#02--zeus--zbot-banking-trojan) | Zeus / Zbot | Windows XP SP2 | malfind · vaddump · 持久化注册表 | ✅ 已完成 | ## 🔬 Volatility 工作流参考 每次调查都遵循此标准漏斗模型: ``` info / imageinfo → confirm profile + capture timestamp pslist → OS-linked process list (what Windows reports) pstree → parent-child tree (spot wrong parents) psscan → raw memory scan (catches hidden/exited processes) connscan / netscan → network connections (find C2 behaviour) malfind → RWX + MZ header = injected executable cmdline → what arguments a process was launched with dlllist → which DLLs a process loaded (spot anomalous ones) ``` **Vol2 与 Vol3 对比:** - Volatility 2 (`/opt/volatility`) — 旧版目标系统(WinXP NT 5.1)必需。`netscan` 在 NT 5.1 上会失效;请改用 `connscan`。 - Volatility 3 (`/opt/vol3-venv`) — Win10/Win11 目标系统必需。 **malfind 注入特征 —— 必须同时满足以下三个条件:** | 条件 | 含义 | |---|---| | `PAGE_EXECUTE_READWRITE` (RWX) | 内存可执行 + 可写 —— 这对合法代码而言很不寻常 | | `PrivateMemory: 1` | 不由磁盘上的文件提供支持 —— 是注入的,而非加载的 | | `4d 5a` (MZ header) | 以 PE/可执行文件头开始 —— 这是代码,而不是数据 | ### 01 · Cridex 银行木马 **工具:** Volatility 2.6.1 · Kali Linux **样本:** `cridex.vmem` — 512 MB · 公开样本 (Malware Analyst's Cookbook) **配置文件:** WinXPSP3x86 (Windows XP SP3, 32位) **主机:** 172.16.112.128 **完成日期:** 2026年6月 — 自主导向实验 (SCI CSS 模块 8 准备) **执行摘要:** 发现一个 Windows XP SP3 内存镜像感染了 Cridex 银行木马。 释放器 `reader_sl.exe` 伪装成 Adobe SpeedLauncher 进程,并将恶意代码注入到 `explorer.exe` 中。通过 `connscan` 识别出两个 C2 连接。感染通过 `malfind`(两个进程中均存在 RWX + MZ 头)以及 `WS2_32.dll`(网络套接字库) 在一个毫无理由进行网络调用的进程中的异常出现得到了证实。 **调查阶段:** **阶段 1 — 识别镜像** ``` volatility -f cridex.vmem imageinfo # Profile: WinXPSP3x86 # Capture: 2012-07-22 (UTC) ``` **阶段 2 — 建立进程基线** ``` volatility -f cridex.vmem --profile=WinXPSP3x86 pslist volatility -f cridex.vmem --profile=WinXPSP3x86 pstree volatility -f cridex.vmem --profile=WinXPSP3x86 psscan ``` 发现:`reader_sl.exe` (PID 1640) 出现在 `explorer.exe` 下 —— 伪装得 看起来像是一个合法的 Adobe 辅助进程。其名称和父进程具有足够的合理性, 足以通过表面检查。 **阶段 3 — 转向网络行为分析** ``` # Vol3 netscan 在 NT 5.1 (WinXP) 上失败 —— 必须使用 Vol2 connscan volatility -f cridex.vmem --profile=WinXPSP3x86 connscan ``` 发现:识别出两个 C2 连接: | PID | 进程 | 远程 IP | 端口 | |---|---|---|---| | 1484 | explorer.exe | 41.168.5.140 | 8080 | | 1484 | explorer.exe | 125.19.103.198 | 8080 | `explorer.exe` 没有任何合法理由向 8080 端口发起外部连接。 这就是行为转向点 —— 感染可通过它的所作所为被证明,而不是靠它的外观。 **阶段 4 — 证明代码注入 (malfind)** ``` volatility -f cridex.vmem --profile=WinXPSP3x86 malfind -p 1484 volatility -f cridex.vmem --profile=WinXPSP3x86 malfind -p 1640 ``` 发现:`explorer.exe` (1484) 和 `reader_sl.exe` (1640) 均显示出 `PAGE_EXECUTE_READWRITE` + `PrivateMemory: 1` + `MZ` 头 —— 这就是由三部分 组成的注入特征。代码已被写入这两个进程的内存中。 **阶段 5 — DLL 分析** ``` volatility -f cridex.vmem --profile=WinXPSP3x86 dlllist -p 1640 volatility -f cridex.vmem --profile=WinXPSP3x86 cmdline -p 1640 ``` 发现:`reader_sl.exe` 加载了 `WS2_32.dll` —— Windows 套接字库。 一个 Adobe SpeedLauncher 辅助进程没有任何合法理由开启网络套接字。 这就是证实 `reader_sl.exe` 是释放器的 dlllist 迹象。 **调查结果摘要:** | # | 发现 | 证据 | 插件 | |---|---|---|---| | 1 | C2 通信 | explorer.exe → 41.168.5.140:8080 + 125.19.103.198:8080 | connscan | | 2 | 代码注入 — explorer.exe | PID 1484 中的 RWX + MZ 头 | malfind | | 3 | 代码注入 — reader_sl.exe | PID 1640 中的 RWX + MZ 头 | malfind | | 4 | 异常 DLL | 非网络进程加载了 WS2_32.dll | dlllist | | 5 | 已识别释放器 | reader_sl.exe — 伪造的 Adobe SpeedLauncher | cmdline + dlllist | **IOC:** ``` C2 IP: 41.168.5.140:8080 C2 IP: 125.19.103.198:8080 File: reader_sl.exe (dropper — disguised as Adobe SpeedLauncher) MITRE: T1055 — Process Injection MITRE: T1071.001 — Application Layer Protocol: Web Protocols (C2 over HTTP) ``` **核心经验:** Vol3 `netscan` 在 WinXP 上会静默失败(不支持 NT 5.1)。旧版目标系统必须使用 Vol2 `connscan`。这就是为什么 Mat 的课程要求同时安装 Vol2 和 Vol3 的原因 —— 合适的工具取决于目标 OS,而不是个人偏好。 ### 02 · Zeus / Zbot 银行木马 **工具:** Volatility 2.6.1 · Kali Linux · VirusTotal **样本:** `zeus.vmem` — 128 MB · 公开样本 (Malware Analyst's Cookbook) **配置文件:** WinXPSP2x86 (Windows XP SP2, 32位, 1处理器) **主机:** BILLY-DB5B96DD3 · 用户: Administrator **捕获日期:** 2010-08-15 19:17:56 UTC **恶意软件家族:** Zeus / Zbot (窃取银行凭证的木马) **完成日期:** 2026年6月 — 自主导向实验 (SCI CSS 模块 8) **执行摘要:** 发现一个 128 MB 的 Windows XP SP2 内存镜像感染了 Zeus/Zbot 银行木马。每个进程的名称、路径和父进程看起来都完全合法 — 标准的进程树分析毫无发现。通过转向行为分析揭开了该感染: `svchost.exe` (PID 856) 正在与外部的 C2 服务器通信。 `malfind` 证明了恶意代码已被注入到该合法进程中。顺着持久化痕迹 (`sdra64.exe`) 找到了第二个被注入的进程,`winlogon.exe` (PID 632)。 该注入区域被 VirusTotal 上 71 个杀毒引擎中的 63 个确认为 Zeus/Zbot。 **关键取证原则:** **调查阶段:** **阶段 1 — 识别镜像** ``` volatility -f zeus.vmem imageinfo # Profile: WinXPSP2x86 # Capture: 2010-08-15 19:17:56 UTC # 单处理器 —— 决定了必须使用 Vol2 + connscan(而非 netscan) ``` **阶段 2 — 建立进程基线 (刻意布置的死胡同)** ``` volatility -f zeus.vmem --profile=WinXPSP2x86 pslist volatility -f zeus.vmem --profile=WinXPSP2x86 pstree volatility -f zeus.vmem --profile=WinXPSP2x86 psscan ``` 发现:进程列表看起来完全合法 —— 没有拼写错误的名字,父进程正确, svchost 数量合理。**这就是经验教训**:Zeus 会注入到合法的 进程中,因此靠血缘分析是找不到它的。 注意:`VMip.exe` (PID 1944) 仅出现在 `psscan` 中,而没有出现在 `pslist` 或 `pstree` 中 —— 这是一个 DKOM (Direct Kernel Object Manipulation,直接内核对象操作) 指标。进程在原始内存扫描中可见,但在 OS 链表中缺失 = 正在隐藏或存活时间极短。 **阶段 3 — 转向网络行为分析** ``` volatility -f zeus.vmem --profile=WinXPSP2x86 connscan volatility -f zeus.vmem --profile=WinXPSP2x86 connections ``` 发现:`connscan` 显示 PID 856 正连接到 `193.104.41.75:80`。 这个进程有理由与互联网进行通信吗? **阶段 4 — 识别所属进程** ``` volatility -f zeus.vmem --profile=WinXPSP2x86 psscan | grep 856 volatility -f zeus.vmem --profile=WinXPSP2x86 cmdline -p 856 volatility -f zeus.vmem --profile=WinXPSP2x86 dlllist -p 856 ``` 发现:PID 856 = `svchost.exe` —— 路径正确,父进程正确 (`services.exe`)。`cmdline` 和 `dlllist` 没有显示出任何可疑之处。然而, `svchost` 托管的是内部 Windows 服务,**没有任何合法理由**发起 向外的 Web 连接。合法进程 + 恶意行为 = 注入代码。 **阶段 5 — 证明代码注入 (malfind)** ``` volatility -f zeus.vmem --profile=WinXPSP2x86 malfind -p 856 ``` 发现: - 区域 `0xb70000`: `PAGE_EXECUTE_READWRITE` + `PrivateMemory: 1` + `4d 5a` (MZ) = **注入的 PE** - 区域 `0xcb0000`: 小型 JMP 存根 = API 钩子 (并非完整的 PE) **阶段 6 — 提取并验证** ``` mkdir -p dump volatility -f zeus.vmem --profile=WinXPSP2x86 procdump -p 856 --dump-dir=./dump volatility -f zeus.vmem --profile=WinXPSP2x86 malfind -p 856 --dump-dir=./dump volatility -f zeus.vmem --profile=WinXPSP2x86 vaddump -p 856 --base=0xb70000 --dump-dir=./dump sha256sum ./dump/* ``` **关键区别 — procdump 与 vaddump:** | 转储 (Dump) | 内容 | VirusTotal | |---|---|---| | `procdump` (executable.856.exe) | 合法的 svchost 外壳 (ImageBase 0x01000000) | 0/71 — 干净 | | `vaddump` (0xb70000 区域) | **注入的 Zeus PE** | **63/71 — Zeus/Zbot** | `procdump` 重建进程的主镜像 —— 对于 PID 856,那就是真正的、 干净的 `svchost`。恶意软件存在于一个**独立的注入区域**中 —— 只有 `vaddump` / `malfind --dump-dir` 能将其提取出来。 **阶段 7 — 持久化** ``` volatility -f zeus.vmem --profile=WinXPSP2x86 \ printkey -K "Microsoft\Windows NT\CurrentVersion\Winlogon" ``` 发现:`Userinit` 的值通常只读取为 `userinit.exe`。在这里: ``` Userinit: C:\WINDOWS\system32\userinit.exe,C:\WINDOWS\system32\sdra64.exe, ``` Zeus 追加了 `sdra64.exe` —— 它自己释放的文件。Windows 会在每次登录时启动它。 同一个键还揭示了:主机 = `BILLY-DB5B96DD3`,用户 = `Administrator`。 **阶段 8 — 转向第二个被注入的进程** ``` volatility -f zeus.vmem --profile=WinXPSP2x86 filescan | grep -i sdra64 volatility -f zeus.vmem --profile=WinXPSP2x86 handles | grep -i sdra64 volatility -f zeus.vmem --profile=WinXPSP2x86 psscan | grep 632 volatility -f zeus.vmem --profile=WinXPSP2x86 malfind -p 632 ``` 发现:`handles` 显示 PID 632 保持着 `sdra64.exe` 打开。PID 632 = `winlogon.exe`。`malfind -p 632` 显示区域 `0xae0000` 具有完全相同的 特征 —— `PAGE_EXECUTE_READWRITE` + `4d 5a` + 私有内存。第二个注入 进程已确认 —— 纯粹是通过追踪证据链发现的。 **调查结果摘要:** | # | 发现 | 证据 | 插件 | |---|---|---|---| | 1 | C2 通信 | svchost.exe (856) → 193.104.41.75:80 | connscan | | 2 | 代码注入 #1 | PID 856 中 @ 0xb70000 处的 RWX + MZ 头 | malfind | | 3 | 恶意软件身份 | 注入区域:63/71 — Zeus/Zbot (密码窃取器) | vaddump + VirusTotal | | 4 | 持久化 | Userinit = userinit.exe,sdra64.exe (每次登录运行) | printkey | | 5 | 代码注入 #2 | winlogon (632) 中 @ 0xae0000 处的 RWX + MZ 头 | filescan→handles→malfind | | 6 | 隐藏 / 短暂存在的进程 | VMip.exe (1944) — 仅 psscan 可见,不在 pslist 中 | psscan 对比 pslist | | 7 | 主机 / 用户 | BILLY-DB5B96DD3 / Administrator | printkey | **IOC:** ``` C2 IP: 193.104.41.75:80 File: C:\WINDOWS\system32\sdra64.exe (dropped payload + persistence) Registry: HKLM\...\Winlogon\Userinit += sdra64.exe SHA256: 8e3be5dc65aa35d68fd2aba1d3d9bf0f40d5118fe22eb2e6c97c8463bd1f1ba1 (injected region 0xb70000 — 63/71 VT detections) Family: Zeus / Zbot (Trojan-Spy / PSW — password stealer) MITRE: T1055 — Process Injection MITRE: T1547.001 — Boot/Logon Autostart: Registry Run Keys / Userinit MITRE: T1071.001 — C2 over HTTP ``` 📄 **[下载完整调查报告 (PDF)]([./04-zeus/Zeus_Memory_Forensics_Report_protected.pdf](https://github.com/jaalso/memory-forensics/blob/main/Zeus_Memory_Forensics_Report_protected.pdf))** ## 🧰 使用的工具 | 类别 | 工具 | |---|---| | 内存取证 | Volatility 2.6.1 · Volatility 3 | | 威胁情报 | VirusTotal (仅哈希查询) | | 样本 | 公开恶意软件镜像 — Malware Analyst's Cookbook | | 平台 | Kali Linux · VirtualBox (隔离的分析虚拟机) | ## ⚖️ 法律与道德声明 分析的所有内存镜像均为来自 Malware Analyst's Cookbook 的**公开研究样本**,仅供教育性取证练习使用。 - 未执行任何活跃的恶意软件 - 提取的储文件保留在隔离的分析虚拟机内,从未转移到主机之外 - 仅进行哈希值的 VirusTotal 查询 —— 未上传任何样本(证据处理规范,revDSG 第 8 条) - 所有工作均符合瑞士法律和道德研究标准 - 作为 Swiss Cyber Institute CSS EFA 项目的一部分完成 —— 模块 8 内存取证
标签:DAST, SecList, 内存取证, 恶意软件分析, 数字取证, 自动化脚本, 逆向工具