evnchn-agentic/agentic-dfir
GitHub: evnchn-agentic/agentic-dfir
该项目演示了一个 AI agent 在无标准答案的前提下,自主完成包含磁盘和内存分析的完整 DFIR 案件调查并自我评分,验证了 AI 驱动自动化数字取证的可行性。
Stars: 0 | Forks: 0
# 代理式 DFIR —— 被盗的四川辣酱,盲解实战
**一个 AI agent 端到端处理了一起完整的应急响应案件——两台死机的 Windows 机器,12.8 GB 的磁盘和内存——全程未曾查看答案,随后根据官方解答和三位审核者给自己的作业打分。问题在于:整个过程是通过一部 iPhone 驱动的,因为操作员参加一个计算机取证工作坊时竟然没有带电脑。**

*(这是一块“抛砖引玉”的砖——快速发布的初稿,旨在吸引进一步的完善。取证部分已经过验证;文字仍属草稿质量。粗糙的边缘已在[底部](#-brick-edges-where-the-jade-comes-in)指出。)*
## 这是什么
两个产出物,均为本次运行的真实输出,都位于 [`renders/`](renders/):
| | 内容 | 打开方式 |
|---|---|---|
| **盲解** | agent 仅根据磁盘 + RAM 得出的结论,此时它还未看到官方答案。作为证据冻结为只读。 | [`renders/01-blind-solve-FROZEN.html`](renders/01-blind-solve-FROZEN.html) |
| **核对** | 相同的答案重新对照官方标准 + 2 个子 agent + Codex 进行了复核。🟢 正确 · 🟣 错误 · 🔵 产生分歧后确认正确。 | [`renders/02-verified-corrected.html`](renders/02-verified-corrected.html) |
两者都是自包含的深色主题 HTML 仪表板([富渲染](https://github.com/evnchn-agentic/rich-render))——下载并在任何浏览器中打开即可,无需服务器。
**核心重点:** 该 agent 重构了整个攻击过程——初始 RDP、恶意软件、C2、凭证窃取、横向移动、数据窃取、掩盖行径——并且*在每一个关键支撑事实上都是正确的*,通常甚至比标准答案更精确。它也犯了恰好三个诚实的错误,这是故事中最有趣的部分。
```
194.61.24.102 (attacker) 203.78.103.109:443 (C2)
│ RDP brute-force (Hydra) ▲
▼ │ meterpreter beacon
┌─────────────────────┐ coreupdater.exe ┌───────────┴──────────┐
│ CITADEL-DC01 (.10) │ ── injects ──────▶ │ spoolsv.exe (PID … ) │
│ Server 2012 R2 · DC │ └──────────────────────┘
│ domain C137.local │ ░ dumps NTDS · reads the secrets · timestomps a decoy
└─────────┬───────────┘
│ RDP from the DC, as Domain Admin (stolen creds)
▼
┌──────────────────────────┐
│ DESKTOP-SDN1RPT (.115) │ same coreupdater.exe, same C2, same persistence
│ Windows 10 Enterprise │ loot.zip staged, exfiltrated, deleted
└──────────────────────────┘
```
## 探索之旅
### 第 0 幕 —— 一个取证工作坊,却没有电脑
真实的起因是这样的,以免不明显:操作员正坐在一个 **BSidesHK 蓝队 DFIR 工作坊**里——那种扔给你 12.8 GB 磁盘和内存镜像并说*开始干活*的工作坊——但他出现时**没有带笔记本电脑**。手头唯一的机器是一部 **iPhone**。
因此,会议一开始不是进行取证,而是寻找替代方案:*“为我搭建一个 Web 服务器来上传大约 10 GB 的数据。”* 把证据弄到一台真正的计算机能访问到的地方。经过三个澄清问题后,操作员转变了思路——这 10 GB 数据**就是**案件本身,替代方案随之消融在实际任务中:*“尝试用 agent 自动解决它。绝对不要偷看答案!”*
上传服务器根本没有搭建。从那时起,每个取证命令都通过 SSH 在一个 homelab 节点上运行——而其中所有的人工操作部分都是在**手机屏幕上通过 [Claude Code](https://claude.com/claude-code) 远程控制完成的。** 一场计算机取证考试,室内却没有计算机。

*你实际拿到的是:纸上的 26 个问题。没有整洁的产出文件包,没有标准答案——而且那天早上,没有笔记本电脑。*
所以范围如下:域 **C137**(没错,就是《瑞克和莫蒂》)上的两台主机——一台 Server 2012 R2 **域控制器** 和一台 Windows 10 **企业版**工作站——均以磁盘镜像 (`.E01`) 和原始内存转储形式提供。约 12.8 GB。没有 PCAP,没有预先提取的产出物。工作坊的核心主旨是:*从你实际得到的东西出发,而不是依赖打包好的现成材料。*
### 第 1 幕 —— 获取字节(agent 对抗 403 错误)
证据托管在 dfirmadness.com 上,该网站**对所有自动化客户端返回 403 锁定**——curl、位于美国的抓取请求,甚至无头浏览器全被拒之门外。操作员使用的是信号不佳的 3G 网络,无法上传。
突破口来自经验性测试:这不是 Cloudflare 的 JS 拦截,而是普通的 **Apache 盗链保护**。携带浏览器 `User-Agent` **以及** `Referer: https://dfirmadness.com/the-stolen-szechuan-sauce/` 标头的请求畅通无阻地获得了 `HTTP 200` 响应。该 agent 通过 `curl` 将全部 12.8 GB 数据直接拉取到 homelab 节点(`.180`,剩余 167 GB),根据公布的哈希值对每个 zip 进行了 MD5 校验,并且完全不需要浏览器来执行大文件传输。
### 第 2 幕 —— 基于 SSH 的取证实验室(没有 FTK,没有 EnCase,没有许可证)
没有 GUI,没有工作站,没有授权工具——在 SSH 会话中只有 `apt install` 和 `pip install`。该 agent 在节点上搭建了一套纯开源技术栈:用于磁盘的 `ewf-tools` + `sleuthkit`,用于内存的 **volatility3**,用于注册表的 `regipy`,用于凭证的 `impacket`,以及用于日志的 `python-evtx`。(它通过惨痛的教训认识到 `evtx_dump` CLI 存在打包损坏的问题——报错 `No module named 'scripts'`——于是切换为直接调用 `Evtx` 库。)
### 第 3 幕 —— 内存揭露了磁盘隐藏的真相
在 DC 的 RAM 上运行 `volatility3` 几分钟内就揭开了案件真相:
- **`netscan`** → 发现一个连接到非 RFC1918 地址的套接字:`10.42.85.10:62613 → 203.78.103.109:443 ESTABLISHED`,由一个名为 **`coreupdater.exe`** 的进程拥有。在 19,000 行套接字扫描记录中唯一的外部 IP。
- **`malfind`** → `spoolsv.exe` 携带带有 `MZ` 标头的 `PAGE_EXECUTE_READWRITE` 内存区域,其中一个以 `4D 5A 41 52 55 48 89 E5` 开头——即 `MZARUH…`,这是 **Meterpreter x64 反射型加载器存根**。coreupdater 已经迁移到了打印后台处理程序中。
- **`pstree`** → coreupdater 在 **Session 2**(一个 RDP 会话)中运行了 15 秒后退出;一个从 `E:\` 运行的 `FTK Imager.exe` 是*响应者*自己的获取工具,在行动中被抓了个正着。

*约 19,000 行套接字扫描中唯一的一个非本地 IP——即 C2——以及 `spoolsv.exe` 内部的 `MZARUH` 反射型加载器存根。这是在手机上通过 SSH 获得的真实输出。*
### 第 4 幕 —— 磁盘、注册表与会撒谎的时钟
挂载 `.E01` 后,注册表交出了其余的真相:
- **双重持久化:** 一个 `coreupdater` **服务**(自动启动,LocalSystem)*以及*一个 `Run` 键,该键从 `HKLM\Software\9sEoCawv` 启动了一个隐藏的 PowerShell base64+gzip+`IEX` stager。
- **时钟陷阱**(工作坊的标志性陷阱):`TimeZoneInformation` 显示为 **太平洋时区 (UTC−7)**,但该组织位于科罗拉多州 (**UTC−6**)。agent 标记了这一点……但随后极其关键地,*处理不足*——在核对环节中会详细说明。
### 第 5 幕 —— 字节中蕴含的人文故事
这个案件有*情节*,并且产出物将其娓娓道来:
- `C:\FileShare\Secret\Szechuan Sauce.txt` —— 真正的配方(酱油、枫糖浆、玉米淀粉……“来自 gimmesomeoven.com”)。被攻击者打开过;`Recent\*.lnk` 快捷方式的时间戳准确说明了打开时间。
- 从回收站中恢复的一个**已删除**文件:原文件 `SECRET_beth.txt` = *"Earth beth is the real beth."(地球贝丝是真的贝丝)*——攻击者将其**删除并替换**为一个诱饵文件 `Beth_Secret.txt`,内容为 *"Space Beth is the real Beth."(太空贝丝是真的贝丝)*
- 而且这个诱饵文件被进行了**时间戳篡改 (timestomped)**:它的 `$STANDARD_INFORMATION` 创建时间被倒拨了约 4 小时,并将毫秒部分清零,而 `$FILE_NAME` 保留了真实时间。通过比较 `$SI` 和 `$FN` 抓住了破绽——这是教科书般的特征。
- 域凭证存储 (`ntds.dit`) 使用 `secretsdump` 转储;九个 NT 哈希中的六个通过纯 Python 的 MD4 循环在 rockyou 字典中被破解。(《瑞克和莫蒂》风格的密码选择留给打开渲染文件的你作为奖励。)
### 第 6 幕 —— 在“大停电”中幸存的日志
DC 的安全日志在 **01:23 UTC** 重启后立刻陷入**瘫痪**——而整个攻击都发生在那*之后*。没有 4625 暴力破解风暴,没有登录事件。死路一条?
不:**TerminalServices-LocalSessionManager** 操作日志幸存了下来,事件 21 携带了源 IP。初始访问是来自 **`194.61.24.102`** 的外部 RDP 以 `Administrator` 账户登录。而横向移动是源自 **`10.42.85.10` ——即 DC 本身**——进入*桌面*的 RDP 会话,攻击者利用窃取的域管理员凭证进行主机间的跳转。在第二台机器上发现了相同的 `coreupdater.exe`,相同的 C2,相同的持久化机制。
### 第 7 幕 —— “时间到了,时间到。” 核对环节。
随后操作员指示:*“OK 时间到。将其作为证据冻结,永不修改。然后通过获取建议答案,并让子 agent 和 Codex 进行检查来核对答案。”*
于是,盲解的渲染结果被冻结为只读状态,获取了官方标准答案(现在可以公平对比了),并将这项工作推上了审判席——由两个独立的子 agent 和 **Codex**(一个不同的模型谱系,用于捕捉第二个 Claude 可能会共犯的错误)进行审查。结论是:
**在每一个关键支撑事实上都是正确的**——攻击向量、恶意软件家族、C2 IP、攻击者 IP、注入链、持久化、网络拓扑、横向移动机制、凭证窃取、恢复的机密文件、被篡改时间戳的文件,以及**它破解的 5 个域密码与标准答案完全一致**(9 个哈希中的 6 个被 rockyou 破解)——通常*比标准答案本身更精确*(标准答案甚至有一个拼写错误:写成了 `coreupdate.exe`,而实际上应为 `coreupdater.exe`)。
同时还有三个诚实的失误,就像 dmr39 保留其 27 个死胡同一样被留在了报告中:
1. **系统性的 +1 小时时钟偏移。** agent 发现了 UTC−7 的配置错误,但随后*依然将主机时间视为真实基准*。它报告的每一个绝对时间戳都比 PCAP 认定的事实快了一个小时。发现了陷阱却依然踩了进去。
2. **遗漏了一对外泄归档文件。** agent 在*活动*文件系统中搜索了 `secret.zip` / `loot.zip`,未发现任何内容,便得出结论“没有数据外泄”。但它们被创建、外泄,然后**删除**了——因此它们绝不可能出现在活动的文件树中。(事后,agent 证明了修复方案:**USN 日志** `$Extend\$UsnJrnl:$J` 中仍然保留着一条 `Secret.zip` 记录,旁边还有 Windows GUI 产生的临时文件 `~RF*.TMP`。这个产出物一直是可以获取到的;只是 agent 从未解析过该日志。)
3. **过度自信的“Empire”标签。** 一个 base64+gzip+`IEX` 的 Run 键*看起来像* PowerShell Empire,但这种结构同样被 msfvenom、Cobalt Strike 和通用加载器所共有。Codex 认为其归因置信度只有约 35%。诚实的答案应该是“驻留于注册表的 PowerShell stager,框架无法归因。”

*对照官方标准 + 两个子 agent + Codex自己的作业打分。*
修正内容位于 [`renders/02-verified-corrected.html`](renders/02-verified-corrected.html) 中,通过颜色编码,确保 🟣 *我错了* 不会与 🔵 *我与标准答案不同但被证明是正确的*(发生过四次——太平洋/UTC−7 时区、`coreupdater.exe` 的拼写、标准答案遗漏的一个桌面用户,以及标准答案从未列出过的本地管理员密码)撞色。
## 计分板
| | |
|---|---|
| 回答的问题(13 个核心 + 8 个附加 + 5 个额外) | **26 / 26** |
| 正确的关键支撑事实 | **全部** |
| 与标准答案一致的域密码 | **5 / 5**(9 个哈希中破解了 6 个) |
| agent 的证据胜过标准答案的地方 | **4**(青色条目) |
| 系统性错误 | **1**(+1 小时的时钟偏移) |
| 实质性遗漏 | **1**(外泄归档文件) |
| 过度归因 | **1**(“Empire”标签) |
| 冻结前参考的实战指南 | **0** |
## 实际的难点在哪里
- **这些失误是方法上的失败,而不是知识盲区**,每一个都有一行字防范对策:*每一个“无/未找到”的声明都需要第二种方法进行验证 · 仅在具备字节级特征签名并经过谱系检查时,才命名具体的恶意软件框架 · 将记录在案的时钟缺陷作为更正进行传播,而不仅仅是脚注。*
- **没有标准答案情况下的验证才是真正的核心技能。** 该 agent 仅在*事后*才针对已发布的解答运行了其对抗性检查。真实的案件没有标准答案——因此长久的教训在于,在宣布完成*之前*,先运行完整性批评(还有哪些产出物类别我没有触及?USN、预读取文件、shellbags 等)。
- **整个过程可以通过手机重现**,通过 SSH 连接到节点——不需要取证工作站,不需要 GUI,不需要授权工具。
## 重现步骤
证据是公开的(Referer 窃取技巧见第 1 幕)。工具链为 `apt install sleuthkit ewf-tools` + `pip install volatility3 regipy impacket python-evtx`。这两个渲染结果是最终交付物。更完整的命令记录在下面的 TODO 列表中——目前这只是一块砖。
## 🧱 砖块的边缘(璞玉所在之处)
根据“抛砖引玉”的原则,诚实指出:
- **尚无独立的第二条工具链交叉核对。** 使用不同的取证工具链对相同的证据进行运行,可以免费证实(或挑战)每一个发现。
- **图片都是真实的——除了主图,坦白说它是合成的。** C2 终端和核对仪表板是*实际*输出的截图;问卷是当天的真实照片。主图是一个**设计的横幅**,使用了代码库自己的配色——它不是照片,没有任何伪造为真实场景的内容(GenAI 额度已耗尽,伪造工作坊照片将背叛一个以诚实为核心立场的代码库)。仍然缺失的内容:一场手机实操直播会话的 asciinema/GIF。
- **未包含命令记录。** 叙述中提到了这些命令;但尚未展示出来。一个包含实际 `vol3` / `istat` / `secretsdump` 调用和输出的 `transcript/` 将允许读者跟着操作。
- **+1 小时的对账过程值得用一张图表展示。** 这是最微妙的环节,目前仅在文字中进行描述。
- **文字属于第一版草稿。** 语气、节奏和各幕的分割均为草稿级别;dmr39 标准设定得很高。
## 鸣谢与授权
- **案例 001、证据以及问题集**版权归 **DFIR Madness** ([James Smith](https://dfirmadness.com)) 所有;工作坊的问题集由 **Albert Hui & Josiah Wu** 编写。DFIR Madness 发布此案例是出于教育目的,并允许教师和学生在注明网站及其作者出处的情况下使用这些材料——本代码库即为这种使用情况,并已注明出处。**此处不重新分发原始证据文件**——仅包含此分析和 agent 自身的分析产出物。证据中的配方来自 gimmesomeoven.com(根据案件设定)。
- **本分析报告和分析产出物**(叙述文本、两个富渲染仪表板、设计的横幅)均采用 **[CC BY 4.0](LICENSE)** 许可。
*调查由 AI agent (Claude Code) 通过 SSH 在 homelab 节点上完成。该 agent 进行了盲解,随后为自己打分——并把错误保留在了报告中。*
Agent 能够处理像 `issen` 这种专用工具被设计来做的事情——只不过 agent 从未被像这样*教导*过。所以,把这个 agent 想象成一个 **`UNIVERSAL.exe`**,让你的梦想尽情驰骋吧。
标签:AlienVault OTX, IP 地址批量处理, PE 加载器, SNMP, 人工智能代理, 反取证, 后端开发, 子域名变形, 安全评估, 库, 应急响应, 数字取证, 自动化脚本, 逆向工具