针对 nginx-ui MCP 认证绕过漏洞(公开名称为 MCPwn)的非破坏性检测工具。通过两次 HTTP 请求即可在未认证的情况下完全接管任何运行受影响版本的 nginx-ui 实例。
nginx-ui 暴露了一个模型上下文协议(MCP)接口,允许经过认证的操作员通过 JSON-RPC 驱动破坏性工具,例如 nginx 配置编辑、重启命令和备份操作。
/mcp 端点由 AuthRequired() 中间件保护,而其配对的 /mcp_message 端点(实际接收工具调用的端点)在部署时没有该中间件。任何能够通过网络访问该 UI 的客户端都可以:
/mcp 打开一个服务器发送事件(SSE)流,并在不提供任何凭据的情况下获取一个新的 sessionID。sessionID 通过向 /mcp_message 发送 POST 请求来调用任何已注册的 MCP 工具,仍然无需认证。攻击者获得对 nginx 进程的完全控制:编辑服务器块以重定向流量、通过路径读取提取 TLS 私钥、重新加载或停止 nginx,以及植入持久性后门。
// 存在漏洞(2.3.4 之前)
r.GET("/mcp", AuthRequired(), mcpHandler)
r.POST("/mcp_message", mcpMessageHandler) // 缺少中间件
// 在 2.3.4 中修复
r.GET("/mcp", AuthRequired(), mcpHandler)
r.POST("/mcp_message", AuthRequired(), mcpMessageHandler)
路由注册中缺少一个函数调用就足以将 MCP 接口变成未认证的 RCE 网关。
攻击者 nginx-ui (<2.3.4)
| 1) GET /mcp (无需认证) |
| --------------------------------------> |
| 2) event: endpoint data: /mcp_message?sessionID=XYZ
| <-------------------------------------- |
| 3) POST /mcp_message?sessionID=XYZ |
| body: JSON-RPC call_tool "nginx_reload" 或
| "edit_config {...}" |
| --------------------------------------> |
| 4) 200 OK; 工具以完全权限执行
| <-------------------------------------- |
本仓库有意避免任何破坏性操作。检测器仅使用只读的 MCP 方法(tools/list)。逻辑如下:
> 步骤 1 通过以下方式识别 nginx-ui:
> GET / (HTML 标题, JS 包)
> GET /api/settings (引用 nginx-ui 键的 JSON)
> 通过 header / body 正则表达式提取版本
> 步骤 2 向 /mcp 打开 SSE 流
> 从 "endpoint" 事件中解析第一个 sessionID
> 步骤 3 POST /mcp_message?sessionID=<id>
> Body: {"jsonrpc":"2.0","method":"tools/list","params":{}}
> 无 Authorization header
> 步骤 4 如果状态码为 200 且 body 包含工具清单,则存在漏洞
> 如果状态码为 401 / 403 / 404,则已修复
> 其他情况则无法确定
tools/list JSON-RPC 方法是只读的。它枚举 MCP 服务器已知的工具,但不会调用其中任何一个。该脚本拒绝 POST 任何其他方法,并且永远不会为破坏性工具构造 payload。
git clone https://github.com/your-org/CVE-2026-33032-detector.git
cd CVE-2026-33032-detector
python3 --version # 3.9 或更高版本
# 无需第三方包。
对于 Nmap NSE 组件,将 nginx-ui-mcpwn.nse 复制到本地脚本目录并刷新脚本数据库:
cp nginx-ui-mcpwn.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
# 单个目标
python3 detect_nginx_ui_mcpwn.py --target https://nginx-ui.internal
# 从文件批量扫描
python3 detect_nginx_ui_mcpwn.py --targets targets.txt --workers 20
# JSON (NDJSON) 输出,适合通过管道传递给 jq
python3 detect_nginx_ui_mcpwn.py --target 10.0.0.5:9000 --json | jq .
命令行参数参考:
nmap -p 80,443,9000 --script nginx-ui-mcpwn 10.0.0.0/24
nmap -p 443 --script nginx-ui-mcpwn --script-args "nginx-ui-mcpwn.timeout=8" host.example.com
_ _ _ _ _ ___ __ __ ____ ____
| \ | | __ _(_)_ __ __ __ | | | ||_ _| | \/ |/ ___| _ \__ ___ __
| \| |/ _` | | '_ \\ \/ /_____| | | | | | | |\/| | | | |_) \ \ /\ / / '_ \
| |\ | (_| | | | | |> <|_____| |__| | | | | | | | |___| __/ \ V V /| | | |
|_| \_|\__, |_|_| |_/_/\_\ |_____|_||___| |_| |_|\____|_| \_/\_/ |_| |_|
|___/
CVE-2026-33032 nginx-ui MCPwn 检测器 > 非破坏性
[!] 存在漏洞 https://nginx-ui.internal version=2.3.2 evidence=status=200; body_preview={"jsonrpc":"2.0","id":"...","result":{"tools":[{"name":"edit_config",...
[+] 已修复 https://nginx-ui-patched:9000 version=2.3.4 evidence=status=401; body_preview={"error":"unauthorized"}
[.] 非 nginx-ui https://example.com evidence=fingerprint negative
摘要: 1/3 个目标被标记为存在漏洞
{"target":"https://nginx-ui.internal","reachable":true,"is_nginx_ui":true,"mcp_endpoint_present":true,"session_id_obtained":true,"mcp_message_unauthenticated":true,"vulnerable":true,"nginx_ui_version":"2.3.2","evidence":"status=200; body_preview=...","error":null}
PORT STATE SERVICE
9000/tcp open http
| nginx-ui-mcpwn:
| status: VULNERABLE
| version: 2.3.2
| session_id: abc123
|_ evidence: tools/list accepted without credentials
CVE-2026-27944(未认证的 /api/backup 下载漏洞,会在 X-Backup-Security header 中泄露 AES 密钥)可以与 MCPwn 无缝联动:备份归档会暴露 node_secret,即使在 33032 的修复落地之后,在运维人员轮换该密钥之前,该密钥仍可用于向 /mcp 进行认证。
针对 27944 的配套检测器位于本研究项目的同级目录中。
node_secret、管理员密码哈希以及任何 nginx-ui 进程可访问的 TLS 私钥。/mcp_message 路由可达之前强制执行认证。发布此工具是为了帮助防御者在他们被授权测试的环境中识别未修补的实例。请勿将其用于您不拥有或未经明确许可评估的系统。作者对滥用行为不承担任何责任。
根据 MIT 许可证发布。各脚本文件头中提供了逐文件的声明。
| 字段 | 值 |
|---|
| CVE ID | CVE-2026-33032 |
| 别名 | MCPwn |
| CVSS 3.1 | 9.8 / 严重 (AV:N / AC:L / PR:N / UI:N / S:U / C:H/I:H/A:H) |
| CWE | CWE-306 关键功能缺少身份验证 |
| 受影响产品 | nginx-ui (github.com/0xjacky/nginx-ui) |
| 受影响版本 | 2.3.4 之前的所有版本 |
| 修复版本 | 2.3.4 |
| 利用状态 | 已在野外被积极利用 (Picus Security, Recorded Future) |
| Shodan 暴露情况 | 约 2,689 个面向互联网的实例 |
| 发布日期 | 2026-04-15 |
| MCP 工具 | 对 nginx 服务器的影响 |
|---|
edit_config | 重写任意服务器块,插入攻击者控制的 upstream |
reload_nginx | 无需人工操作即可应用攻击者配置 |
stop_nginx | 拒绝服务 |
read_file | 从挂载路径窃取 TLS 私钥、凭据 |
create_cert | 在攻击者控制下重新签发 TLS 证书 |
list_backups / download | 拉取整个 nginx-ui 备份,包括 node_secret 和哈希 |
| 参数 | 用途 |
|---|
--target | 单个 URL 或 host[:port] |
--targets | 换行分隔的目标文件 |
--timeout | HTTP 超时时间,默认 10 秒 |
--workers | 批量扫描的并发工作线程数,默认 10 |
--verify-tls | 强制 TLS 证书验证(默认关闭) |
--json | 输出 NDJSON,每个目标一条记录 |
--no-banner | 隐藏 ASCII 横幅 |