
# PrintNightmare (CVE-2021-1675/34527) के लिए शैक्षिक प्रूफ-ऑफ-कॉन्सेप्ट सिम्युलेटेड गैर-कार्यात्मक पेलोड, हमले के प्रवाह विश्लेषण, MITRE मैपिंग, पहचान मार्गदर्शन और निवारण चरणों के साथ शैक्षिक प्रूफ-ऑफ-कॉन्सेप्ट।
प्रकार: प्रूफ ऑफ कॉन्सेप्ट — सिम्युलेटेड (गैर-कार्यात्मक) CVE: CVE-2021-1675 + CVE-2021-34527 CVSS: 7.8 (LPE) / 8.8 (RCE) उपनाम: PrintNightmare पैच किया गया: जून/जुलाई 2021 — KB5004945 CISA KEV में जोड़ा गया: जुलाई 2021
⚠️ इस PoC का पेलोड स्पष्ट रूप से काल्पनिक और गैर-दुर्भावनापूर्ण है — केवल 4 बाइट्स का DCE/RPC हेडर और उसके बाद ASCII में फ़ंक्शन का नाम। यह कोड निष्पादित नहीं करता, ड्राइवर इंस्टॉल नहीं करता, विशेषाधिकार नहीं बढ़ाता। केवल सीखने और डिटेक्शन विकसित करने के उद्देश्य से उपयोग।
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2021-1675, जिसे PrintNightmare के नाम से जाना जाता है, Windows Print Spooler सेवा में एक गंभीर Remote Code Execution और Local Privilege Escalation भेद्यता है। यह दोष हमलावरों को RpcAddPrinterDriverEx() फ़ंक्शन का शोषण करके SYSTEM विशेषाधिकारों के साथ मनमाना कोड निष्पादित करने की अनुमति देता है, जिसका उपयोग एक्सेस कंट्रोल सत्यापन के बिना प्रिंटर ड्राइवरों की दूरस्थ स्थापना के लिए किया जाता है।
मूल रूप से LPE (CVSS 7.8) के रूप में वर्गीकृत और जून 2021 के Patch Tuesday में पैच की गई, Microsoft ने 21 जून को भेद्यता को RCE (CVSS 8.8) के रूप में पुनर्वर्गीकृत किया। भ्रम से बचने के लिए, RCE वेक्टर को एक नया पहचानकर्ता, CVE-2021-34527 प्राप्त हुआ — दोनों को आमतौर पर PrintNightmare कहा जाता है।
$ cat ./timeline.txtJun 08, 2021 Microsoft Patch Tuesday में प्रारंभिक पैच जारी करता है — CVE-2021-1675 (LPE, CVSS 7.8)
Jun 21, 2021 Microsoft RCE (CVSS 8.8) के रूप में पुनर्वर्गीकृत करता है
Jun 29, 2021 शोधकर्ता गलती से PoC प्रकाशित करते हैं — इसे पहले से पैच की गई भेद्यता मानते हुए
Jul 01, 2021 RCE वेक्टर के लिए CVE-2021-34527 निर्धारित — मूल LPE से अलग
Jul 02, 2021 Microsoft आपातकालीन आउट-ऑफ-बैंड पैच जारी करता है: KB5004945
Jul 2021 CISA इसे Known Exploited Vulnerabilities Catalog में जोड़ता है
रैंसमवेयर समूहों (Vice Society, Magniber, आदि) द्वारा सक्रिय शोषण
$ cat ./architecture.txt┌──────────────────────────────────────────────────────────────────────────┐
│ PRINTNIGHTMARE — ATTACK FLOW │
│ │
│ हमलावर (प्रमाणित उपयोगकर्ता) WINDOWS PRINT SPOOLER │
│ (spoolsv.exe) │
│ 1. किसी भी मान्य डोमेन खाते से ┌────────────────────────────┐ │
│ प्रमाणित करें │ SYSTEM के रूप में चलता है │ │
│ │ │ सभी Windows पर डिफ़ॉल्ट │ │
│ 2. नामित पाइप \pipe\spoolss के │ रूप से सक्रिय, DCs सहित │ │
│ माध्यम से RPC से कनेक्ट करें └──────────────┬─────────────┘ │
│ │ │ │
│ 3. RpcAddPrinterDriverEx() कॉल करें │ │
│ दुर्भावनापूर्ण DLL के पथ के साथ ──────────────────►│ │
│ (UNC: \\attacker\share\evil.dll) │ │
│ ┌────────────▼────────────┐ │
│ │ Print Spooler ड्राइवर │ │
│ │ (DLL) को SYSTEM के रूप │ │
│ │ में बिना स्रोत या │ │
│ │ अखंडता सत्यापित किए │ │
│ │ लोड करता है │ │
│ └────────────┬────────────┘ │
│ │ │
│ ◄── SYSTEM के रूप में RCE / LPE ─────────────────────┘ │
│ नया व्यवस्थापक उपयोगकर्ता, रिवर्स शेल, │
│ रैंसमवेयर परिनियोजन, आदि। │
│ │
│ ───────────────────────────────────────────────────────────────────── │
│ यह PoC: केवल TCP कनेक्ट + 25 बाइट्स → कोई वास्तविक RPC नहीं → कोई शोषण नहीं │
└──────────────────────────────────────────────────────────────────────────┘
$ cat ./design_decisions.mdfake_rpc_payload = b"\x05\x00\x0b\x03RpcAddPrinterDriverEx"
इस पेलोड में 25 बाइट्स हैं और यह एक साथ दो अवधारणाओं को प्रदर्शित करता है:
बाइट्स 0-3: वैध DCE/RPC हेडर
| बाइट | मान | अर्थ |
|---|---|---|
\x05 | 5 | DCE/RPC प्रोटोकॉल संस्करण (संस्करण 5 — Windows मानक) |
\x00 | 0 | माइनर संस्करण 0 |
\x0b | 11 | PDU प्रकार: BIND — RPC नेगोशिएशन का पहला चरण |
\x03 | 3 | फ़्लैग: `PFC_FIRST_FRAG(0x01) |
बाइट्स 4-24: ASCII में फ़ंक्शन का नाम
RpcAddPrinterDriverEx — भेद्य फ़ंक्शन का नाम, सादे पाठ में।
यह पेलोड वास्तविक शोषण के रूप में काम क्यों नहीं करता?
एक वैध RPC BIND को 4-बाइट हेडर के बाद आवश्यकता होगी:
- max_xmit_frag (2 बाइट्स)
- max_recv_frag (2 बाइट्स)
- assoc_group_id (4 बाइट्स)
- num_ctx_items (1 बाइट)
- context_elem[] → MS-RPRN का इंटरफ़ेस UUID:
{12345678-1234-ABCD-EF00-0123456789AB}
- transfer_syntaxes → NDR UUID
इस संरचना के बिना, Windows पैकेट को तुरंत अस्वीकार कर देता है। पेलोड प्रभावी रूप से केवल एक कनेक्टिविटी अभिकथन है — "क्या मैं इस काल्पनिक पेलोड के साथ पोर्ट 445 तक पहुँच सकता हूँ?"।
sock.connect((target_ip, 445))
445 क्यों और 135 (RPC Endpoint Mapper) क्यों नहीं?
PrintNightmare परिवहन के रूप में SMB नामित पाइप \pipe\spoolss का उपयोग करता है — सीधे RPC का नहीं। वास्तविक प्रवाह है:
1. TCP कनेक्ट → पोर्ट 445 (SMB)
2. SMB negotiate + session setup (NTLM/Kerberos प्रमाणीकरण)
3. Tree connect → IPC$
4. नामित पाइप खोलें → \pipe\spoolss
5. DCE/RPC BIND → MS-RPRN इंटरफ़ेस
6. NDR मार्शलिंग के साथ RpcAddPrinterDriverEx() कॉल
PoC केवल चरण 1 — प्रारंभिक TCP कनेक्शन — का अनुकरण करता है, बिना चरण 2-6 को लागू किए।
sock.settimeout(5): 5 सेकंड का टाइमआउट PoC को उन होस्टों पर अटकने से रोकता है जो प्रतिक्रिया नहीं देते। पोर्ट उपलब्धता के त्वरित स्कैनिंग के लिए उपयोगी।
| पहलू | CVE-2021-1675 | CVE-2021-34527 |
|---|---|---|
| वेक्टर | स्थानीय (LPE) | दूरस्थ (RCE) |
| CVSS | 7.8 | 8.8 |
| प्रमाणीकरण | स्थानीय खाता | प्रमाणित डोमेन खाता |
| पैच | जून 2021 (Patch Tuesday) | जुलाई 2021 (आउट-ऑफ-बैंड KB5004945) |
| भेद्य फ़ंक्शन | RpcAddPrinterDriverEx | RpcAddPrinterDriverEx |
| परिदृश्य | स्थानीय उन्नयन | SMB नामित पाइप के माध्यम से दूरस्थ RCE |
दोनों में मूल कारण समान है: RpcAddPrinterDriverEx() फ़ंक्शन ड्राइवर फ़ाइलों के स्रोत को सत्यापित करने में विफल रहता है, ड्राइवर स्थापना के लिए उचित विशेषाधिकार प्रतिबंध लागू नहीं करता है, और लोड की जा रही DLL की प्रामाणिकता या अखंडता की जाँच नहीं करता है।
$ cat ./mitre_mapping.ymltactic: Initial Access / Lateral Movement
- T1210 # Exploitation of Remote Services
# दूरस्थ होस्ट के लिए \pipe\spoolss के माध्यम से RPC कॉल
# मान्य डोमेन क्रेडेंशियल की आवश्यकता है
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# Print Spooler के माध्यम से सामान्य उपयोगकर्ता → SYSTEM
# CVE-2021-1675 (LPE): स्थानीय प्रक्रिया SYSTEM तक उन्नत होती है
tactic: Execution
- T1569.002 # System Services: Service Execution
# spoolsv.exe द्वारा SYSTEM के रूप में दुर्भावनापूर्ण DLL लोड की गई
# Windows सेवा के माध्यम से कोड निष्पादन के बराबर