
# 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 हेडर
बाइट्स 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 को उन होस्टों पर अटकने से रोकता है जो प्रतिक्रिया नहीं देते। पोर्ट उपलब्धता के त्वरित स्कैनिंग के लिए उपयोगी।
दोनों में मूल कारण समान है: 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 सेवा के माध्यम से कोड निष्पादन के बराबर
- T1055 # Process Injection
# spoolsv.exe (SYSTEM) प्रक्रिया के संदर्भ में DLL इंजेक्ट की गई
tactic: Persistence
- T1547.012 # Boot or Logon Autostart: Print Processors
# पंजीकृत ड्राइवर रीबूट के बीच बना रहता है
# संग्रहीत: HKLM\SYSTEM\CurrentControlSet\Control\Print\
tactic: Defense Evasion
- T1036.005 # Masquerading: Match Legitimate Name or Location
# वैध ड्राइवर के रूप में नामित दुर्भावनापूर्ण DLL (जैसे: Canon_XP.dll)
$ cat ./detection_opportunities.md# इवेंट ID 808 — Print Spooler संदिग्ध DLL लोड करने में विफल
# स्रोत: Microsoft-Windows-PrintService/Admin
स्थिति:
EventID: 808
Log: Microsoft-Windows-PrintService/Admin
Level: Error
Description CONTAINS: "failed to load a plug-in module"
वास्तविक साक्ष्य (जंगल में देखा गया):
"The print spooler failed to load a plug-in module
C:\Windows\system32\spool\DRIVERS\x64\3\svch0st.dll"
# svchost.dll का टाइपोस्क्वाटिंग → दुर्भावनापूर्ण DLL
# इवेंट ID 316 — RpcAddPrinterDriverEx के माध्यम से ड्राइवर स्थापित
# स्रोत: Microsoft-Windows-PrintService/Admin
स्थिति:
EventID: 316
Log: Microsoft-Windows-PrintService/Admin
Message CONTAINS: "RpcAddPrinterDriverEx"
OR
Message CONTAINS: "\\\\*\\*" # UNC पथ → दूरस्थ DLL
# Print Spooler का संदिग्ध चाइल्ड प्रोसेस
EventID: 1 (Process Creation)
स्थिति:
ParentImage: C:\Windows\System32\spoolsv.exe
Image: cmd.exe या powershell.exe या wscript.exe या mshta.exe
गंभीरता: CRITICAL — spoolsv को शेल स्पॉन नहीं करना चाहिए
# गैर-मानक पथ से लोड की गई DLL
EventID: 7 (Image Loaded)
स्थिति:
Image: C:\Windows\System32\spoolsv.exe
ImageLoaded NOT STARTS WITH:
- C:\Windows\System32\spool\DRIVERS\
- C:\Windows\System32\
- C:\Windows\SysWOW64\
गंभीरता: HIGH
नेटवर्क स्तर पर डिटेक्शन के लिए, SMB नामित पाइप की निगरानी करें: \pipe\spoolss की उपस्थिति RpcEnumPrinterDrivers या RpcAddPrinterDriverEx संचालन के साथ मिलकर PrintNightmare शोषण के प्रत्यक्ष संकेतक हैं।
# अवधारणात्मक Zeek / Suricata नियम:
alert smb any any -> $SERVERS 445 (
msg:"PrintNightmare RpcAddPrinterDriverEx via SMB";
content:"|5c 70 69 70 65 5c 73 70 6f 6f 6c 73 73|"; # \pipe\spoolss
content:"RpcAddPrinterDriverEx";
sid:2021001675;
)
$ cat ./remediation.mdविकल्प 1 — Print Spooler अक्षम करें (यदि प्रिंटिंग आवश्यक नहीं है)
PowerShell:
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
विकल्प 2 — Group Policy के माध्यम से दूरस्थ प्रिंटिंग अवरुद्ध करें
Computer Configuration → Administrative Templates → Printers
→ "Allow Print Spooler to accept client connections": DISABLED
यह केवल दूरस्थ वेक्टर को अक्षम करता है, स्थानीय प्रिंटिंग बनाए रखता है
विकल्प 3 — पैच लागू करें (उपरोक्त विकल्पों से स्वतंत्र रूप से अनिवार्य)
KB5004945 → जुलाई 2021 आउट-ऑफ-बैंड पैच
+ बाद के संचयी पैच
पोस्ट-पैच सत्यापन — रजिस्ट्री अभी भी भेद्य छोड़ सकती है:
REG QUERY "HKLM\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint"
यदि NoWarningNoElevationOnInstall=1 या UpdatePromptSettings=0 → अभी भी भेद्य
सुधार: दोनों मानों को 0 पर सेट करें या कुंजियाँ हटाएँ
विशेष प्राथमिकता: Domain Controllers
DCs डिफ़ॉल्ट रूप से Print Spooler चलाते हैं
PrintNightmare के माध्यम से DC से समझौता = AD डोमेन का पूर्ण समझौता
$ cat ./usage.sh# निर्भरता स्थापित करें (socket stdlib है)
python --version # Python 3.x, कोई pip आवश्यक नहीं
# स्क्रिप्ट में लक्ष्य IP संपादित करें (केवल अधिकृत लैब में)
# simulate_printnightmare_attack("192.168.1.xxx")
python poc_cve_2021_1675.py
# पोर्ट 445 सुलभ होने पर अपेक्षित आउटपुट:
[+] Payload sent to 192.168.1.117
# पोर्ट बंद/फ़िल्टर होने पर अपेक्षित आउटपुट:
[-] Error connecting: [Errno 111] Connection refused
# या
[-] Error connecting: timed out
यह आउटपुट क्या दर्शाता है: केवल यह कि पोर्ट 445 सुलभ है। यह भेद्यता की पुष्टि नहीं करता — इसके लिए वास्तविक RPC BIND + पैच संस्करण की जाँच आवश्यक होगी।
$ cat ./poc_vs_real_exploit.mdसिम्युलेटेड PoC और वास्तविक शोषण के बीच स्पष्ट तुलना।
$ cat ./lessons_learned.txt[+] DCs पर डिफ़ॉल्ट रूप से सक्रिय Print Spooler सबसे गंभीर परिदृश्य है — DC पर SYSTEM = गेम ओवर
[+] RPC परिवहन के रूप में SMB नामित पाइप परिधि-केंद्रित सुरक्षा में कम आंका गया वेक्टर है
[+] DCE/RPC जटिल प्रोटोकॉल है — बाइंड/कॉल संरचना समझना सिग्नेचर बनाने में मदद करता है
[+] प्रकाशित CVE ≠ लागू पैच — पैच के हफ्तों बाद भी अधिकांश वातावरण भेद्य थे
[+] PointAndPrint रजिस्ट्री कुंजियाँ पैच के बाद भी भेद्यता को पुनः प्रस्तुत कर सकती हैं — महत्वपूर्ण पोस्ट-पैच नियंत्रण
[-] यह PoC केवल TCP कनेक्टिविटी सत्यापित करता है — यह सत्यापित नहीं करता कि सिस्टम वास्तव में पैच किया गया है
[-] SMB के बिना शुद्ध सॉकेट प्रमाणीकरण पर बातचीत नहीं कर सकता — दृष्टिकोण की मौलिक सीमा
[-] settimeout(5) धीमे नेटवर्क पर गलत नकारात्मक उत्पन्न कर सकता है — पैरामीट्रिज़ेबल टाइमआउट पर विचार करें
[→] सुधार: वास्तविक RPC के लिए impacket का उपयोग करें, OS संस्करण फ़िंगरप्रिंट के लिए SMB बैनर जाँचें,
दूरस्थ रजिस्ट्री क्वेरी के माध्यम से लागू KB का परीक्षण करें
CVE Research · PrintNightmare · Patched July 2021 · CISA KEV · Simulated payload only
| बाइट | मान | अर्थ |
|---|
\x05 | 5 | DCE/RPC प्रोटोकॉल संस्करण (संस्करण 5 — Windows मानक) |
\x00 | 0 | माइनर संस्करण 0 |
\x0b | 11 | PDU प्रकार: BIND — RPC नेगोशिएशन का पहला चरण |
\x03 | 3 | फ़्लैग: `PFC_FIRST_FRAG(0x01) |
| पहलू | CVE-2021-1675 | CVE-2021-34527 |
|---|
| वेक्टर | स्थानीय (LPE) | दूरस्थ (RCE) |
| CVSS | 7.8 | 8.8 |
| प्रमाणीकरण | स्थानीय खाता | प्रमाणित डोमेन खाता |
| पैच | जून 2021 (Patch Tuesday) | जुलाई 2021 (आउट-ऑफ-बैंड KB5004945) |
| भेद्य फ़ंक्शन | RpcAddPrinterDriverEx | RpcAddPrinterDriverEx |
| परिदृश्य | स्थानीय उन्नयन | SMB नामित पाइप के माध्यम से दूरस्थ RCE |
| घटक | यह PoC | वास्तविक शोषण |
|---|
| कनेक्शन | TCP सॉकेट पोर्ट 445 | SMB सत्र + Tree connect IPC$ |
| प्रमाणीकरण | कोई नहीं | NTLM या Kerberos (डोमेन खाता) |
| नामित पाइप | लागू नहीं | \pipe\spoolss |
| RPC BIND | नकली (4 बाइट्स + ASCII) | MS-RPRN UUID के साथ DCE/RPC BIND |
| कॉल किया गया फ़ंक्शन | कॉल नहीं किया गया | NDR के माध्यम से RpcAddPrinterDriverEx() |
| DLL पथ | भेजा नहीं गया | UNC: \\attacker\share\evil.dll |
| परिणाम | कंसोल पर प्रिंट | SYSTEM के रूप में RCE / LPE |
| डिटेक्शन | लगभग शून्य | EventID 808, 316, Sysmon 1/7 |