
रूट रजिस्ट्रेशन पर एक गुम फ़ंक्शन कॉल ही MCP इंटरफ़ेस को एक अनऑथेंटिकेटेड RCE गेटवे में बदलने के लिए पर्याप्त था।
nginx-ui MCP प्रमाणीकरण बायपास के लिए गैर-विनाशकारी पहचान उपकरण, जिसे सार्वजनिक रूप से MCPwn के नाम से जाना जाता है। किसी भी nginx-ui इंस्टेंस का दो HTTP-अनुरोधों वाला बिना प्रमाणीकरण के अधिग्रहण करें, जो कमजोर संस्करण चला रहा हो।
| फ़ील्ड | मान |
|---|---|
| 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 |
nginx-ui एक Model Context Protocol (MCP) इंटरफ़ेस उजागर करता है जो एक प्रमाणित ऑपरेटर को JSON-RPC के माध्यम से nginx कॉन्फ़िगरेशन संपादन, पुनरारंभ कमांड और बैकअप संचालन जैसे विनाशकारी उपकरण चलाने की अनुमति देता है।
/mcp एंडपॉइंट AuthRequired() मिडलवेयर द्वारा सुरक्षित है, जबकि
इसका युग्मित /mcp_message एंडपॉइंट, जो वास्तव में टूल
आह्वान प्राप्त करता है, मिडलवेयर के बिना तैनात किया गया था। कोई भी क्लाइंट जो
नेटवर्क पर UI तक पहुँच सकता है:
/mcp पर एक Server Sent Events (SSE) स्ट्रीम खोलें और बिना कोई
क्रेडेंशियल प्रस्तुत किए एक नया sessionID प्राप्त करें।/mcp_message पर POST करके उस sessionID का उपयोग किसी भी पंजीकृत 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 टूल | nginx सर्वर पर प्रभाव |
|---|---|
edit_config | मनमाने सर्वर ब्लॉक फिर से लिखें, हमलावर upstream डालें |
reload_nginx | बिना मैन्युअल कार्रवाई के हमलावर कॉन्फ़िगरेशन लागू करें |
stop_nginx | सेवा से इनकार |
read_file | माउंटेड पथों से TLS निजी कुंजियाँ, क्रेडेंशियल बाहर निकालें |
create_cert | हमलावर नियंत्रण में TLS प्रमाणपत्र फिर से जारी करें |
list_backups / download | node_secret और हैश सहित पूरा nginx-ui बैकअप खींचें |
यह रिपॉजिटरी जानबूझकर किसी भी विनाशकारी कार्रवाई से बचती है। यह
डिटेक्टर केवल रीड-ओनली MCP विधियों (tools/list) का उपयोग करता है। तर्क:
> चरण 1 nginx-ui की पहचान करें
> GET / (HTML शीर्षक, JS बंडल)
> GET /api/settings (nginx-ui कुंजियों का संदर्भ देने वाला JSON)
> हेडर / बॉडी रेगेक्स के माध्यम से संस्करण निकालें
> चरण 2 /mcp पर SSE स्ट्रीम खोलें
> "endpoint" इवेंट से पहला sessionID पार्स करें
> चरण 3 POST /mcp_message?sessionID=<id>
> Body: {"jsonrpc":"2.0","method":"tools/list","params":{}}
> कोई Authorization हेडर नहीं
> चरण 4 कमजोर यदि स्थिति 200 और बॉडी में टूल मैनिफेस्ट है
> सुधारित यदि स्थिति 401 / 403 / 404
> अन्यथा अनिर्णायक
tools/list JSON-RPC विधि रीड-ओनली है। यह सूचीबद्ध करती है कि
MCP सर्वर किन टूलों के बारे में जानता है लेकिन उनमें से किसी को भी आह्वान नहीं करता। स्क्रिप्ट
किसी अन्य विधि को POST करने से इनकार करती है और विनाशकारी
टूलों के लिए पेलोड कभी नहीं बनाती।
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
# jq में पाइपिंग के लिए उपयुक्त JSON (NDJSON) आउटपुट
python3 detect_nginx_ui_mcpwn.py --target 10.0.0.5:9000 --json | jq .
कमांड लाइन संदर्भ:
| फ़्लैग | उद्देश्य |
|---|---|
--target | एकल URL या host[:port] |
--targets | न्यूलाइन से अलग किया गया लक्ष्य फ़ाइल |
--timeout | HTTP टाइमआउट, डिफ़ॉल्ट 10 सेकंड |
--workers | बल्क स्कैन के लिए समवर्ती वर्कर, डिफ़ॉल्ट 10 |
--verify-tls | TLS प्रमाणपत्र सत्यापन लागू करें (डिफ़ॉल्ट रूप से बंद) |
--json | NDJSON उत्सर्जित करें, प्रति लक्ष्य एक रिकॉर्ड |
--no-banner | ASCII बैनर दबाएँ |
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