
# Pädagogischer Proof-of-Concept für PrintNightmare (CVE-2021-1675/34527) mit simuliertem, nicht funktionsfähigem Payload, Angriffsablauf-Analyse, MITRE-Zuordnung, Erkennungsanleitung und Behebungsmaßnahmen.
Typ: Proof of Concept — Simuliert (nicht funktionsfähig) CVE: CVE-2021-1675 + CVE-2021-34527 CVSS: 7.8 (LPE) / 8.8 (RCE) Alias: PrintNightmare Gepatcht: Juni/Juli 2021 — KB5004945 Zur CISA KEV hinzugefügt: Juli 2021
⚠️ Das Payload dieses PoC ist ausdrücklich fiktiv und nicht bösartig — nur 4 Bytes DCE/RPC-Header, gefolgt vom Funktionsnamen in ASCII. Es führt keinen Code aus, installiert keinen Treiber, erhöht keine Privilegien. Ausschließlich für Lernzwecke und die Entwicklung von Erkennungsregeln.
Developed by: HKK$ cat ./vulnerability_summary.txtCVE-2021-1675, bekannt als PrintNightmare, ist eine kritische Schwachstelle für Remote Code Execution und Local Privilege Escalation im Windows Print Spooler-Dienst. Der Fehler ermöglicht es Angreifern, beliebigen Code mit SYSTEM-Rechten auszuführen, indem die Funktion RpcAddPrinterDriverEx() ausgenutzt wird, die für die Remote-Installation von Druckertreibern ohne angemessene Zugriffskontrollvalidierung verwendet wird.
Ursprünglich als LPE (CVSS 7.8) eingestuft und im Patch Tuesday vom Juni 2021 gepatcht, stufte Microsoft die Schwachstelle am 21. Juni als RCE (CVSS 8.8) neu ein. Um Verwirrung zu vermeiden, erhielt der RCE-Vektor eine neue Kennung, CVE-2021-34527 — beide werden allgemein als PrintNightmare bezeichnet.
$ cat ./timeline.txtJun 08, 2021 Microsoft veröffentlicht ersten Patch im Patch Tuesday — CVE-2021-1675 (LPE, CVSS 7.8)
Jun 21, 2021 Microsoft stuft als RCE neu ein (CVSS 8.8)
Jun 29, 2021 Forscher veröffentlichen versehentlich PoC — in der Annahme, es sei dieselbe bereits gepatchte Schwachstelle
Jul 01, 2021 CVE-2021-34527 für den RCE-Vektor vergeben — getrennt von der ursprünglichen LPE
Jul 02, 2021 Microsoft veröffentlicht Notfall-Patch außerhalb der Reihe: KB5004945
Jul 2021 CISA nimmt in den Known Exploited Vulnerabilities Catalog auf
Aktive Ausnutzung durch Ransomware-Gruppen (Vice Society, Magniber, etc.)
$ cat ./architecture.txt┌──────────────────────────────────────────────────────────────────────────┐
│ PRINTNIGHTMARE — ANGRIFFSABLAUF │
│ │
│ ANGREIFER (authentifizierter Benutzer) WINDOWS PRINT SPOOLER │
│ (spoolsv.exe) │
│ 1. Authentifizierung mit beliebigem ┌────────────────────────────┐ │
│ gültigem Domänenkonto │ Läuft als SYSTEM │ │
│ │ │ Standardmäßig aktiv auf │ │
│ 2. Verbindung über RPC zum │ allen Windows, inkl. DCs │ │
│ Named Pipe \pipe\spoolss └──────────────┬─────────────┘ │
│ │ │ │
│ 3. Aufruf von RpcAddPrinterDriverEx() │ │
│ mit Pfad zu bösartiger DLL ─────────────────────────►│ │
│ (UNC: \\attacker\share\evil.dll) │ │
│ ┌────────────▼────────────┐ │
│ │ Print Spooler lädt den │ │
│ │ Treiber (DLL) als │ │
│ │ SYSTEM, ohne Herkunft │ │
│ │ oder Integrität zu │ │
│ │ prüfen │ │
│ └────────────┬────────────┘ │
│ │ │
│ ◄── RCE / LPE als SYSTEM ────────────────────────────┘ │
│ Neuer Admin-Benutzer, Reverse Shell, │
│ Ransomware-Bereitstellung, etc. │
│ │
│ ───────────────────────────────────────────────────────────────────── │
│ DIESER POC: nur TCP-Connect + 25 Bytes → kein echtes RPC → kein Exploit│
└──────────────────────────────────────────────────────────────────────────┘
$ cat ./design_decisions.mdfake_rpc_payload = b"\x05\x00\x0b\x03RpcAddPrinterDriverEx"
Dieses Payload hat 25 Bytes und demonstriert zwei Konzepte gleichzeitig:
Bytes 0-3: Legitimer DCE/RPC-Header
Bytes 4-24: Funktionsname in ASCII
RpcAddPrinterDriverEx — der Name der verwundbaren Funktion, im Klartext.
Warum funktioniert dieses Payload nicht als echter Exploit?
Ein legitimes RPC-BIND würde nach dem 4-Byte-Header Folgendes erfordern:
- max_xmit_frag (2 Bytes)
- max_recv_frag (2 Bytes)
- assoc_group_id (4 Bytes)
- num_ctx_items (1 Byte)
- context_elem[] → Interface-UUID von MS-RPRN:
{12345678-1234-ABCD-EF00-0123456789AB}
- transfer_syntaxes → NDR-UUID
Ohne diese Struktur weist Windows das Paket sofort zurück. Das Payload ist effektiv nur eine Konnektivitätsprüfung — „Kann ich Port 445 mit diesem fiktiven Payload erreichen?".
sock.connect((target_ip, 445))
Warum 445 und nicht 135 (RPC Endpoint Mapper)?
PrintNightmare verwendet die SMB-Named-Pipe \pipe\spoolss als Transport — nicht direktes RPC. Der tatsächliche Ablauf ist:
1. TCP-Connect → Port 445 (SMB)
2. SMB-Negotiation + Session-Setup (NTLM/Kerberos-Authentifizierung)
3. Tree-Connect → IPC$
4. Named-Pipe-Öffnung → \pipe\spoolss
5. DCE/RPC-BIND → Schnittstelle MS-RPRN
6. RpcAddPrinterDriverEx()-Aufruf mit NDR-Marshaling
Der PoC simuliert nur Schritt 1 — die anfängliche TCP-Verbindung — ohne die Schritte 2-6 zu implementieren.
sock.settimeout(5): Ein Timeout von 5 Sekunden verhindert, dass der PoC bei Hosts hängen bleibt, die nicht antworten. Nützlich für schnelles Scannen der Portverfügbarkeit.
Die Ursache ist in beiden Fällen dieselbe: Die Funktion RpcAddPrinterDriverEx() versäumt es, die Herkunft der Treiberdateien zu validieren, erzwingt keine angemessenen Privilegienbeschränkungen für die Treiberinstallation und prüft nicht die Authentizität oder Integrität der geladenen DLLs.
$ cat ./mitre_mapping.ymltactic: Initial Access / Lateral Movement
- T1210 # Exploitation of Remote Services
# RPC-Aufruf über \pipe\spoolss an entfernten Host
# Erfordert gültige Domänenanmeldedaten
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# normaler Benutzer → SYSTEM über Print Spooler
# CVE-2021-1675 (LPE): lokaler Prozess erhöht auf SYSTEM
tactic: Execution
- T1569.002 # System Services: Service Execution
# Bösartige DLL, geladen von spoolsv.exe als SYSTEM
# Entspricht Codeausführung über Windows-Dienst
- T1055 # Process Injection
# DLL injiziert in den Kontext des spoolsv.exe-Prozesses (SYSTEM)
tactic: Persistence
- T1547.012 # Boot or Logon Autostart: Print Processors
# Registrierter Treiber bleibt über Neustarts hinweg bestehen
# Gespeichert in: HKLM\SYSTEM\CurrentControlSet\Control\Print\
tactic: Defense Evasion
- T1036.005 # Masquerading: Match Legitimate Name or Location
# Bösartige DLL benannt wie legitimer Treiber (z. B. Canon_XP.dll)
$ cat ./detection_opportunities.md# Ereignis-ID 808 — Print Spooler konnte verdächtige DLL nicht laden
# Quelle: Microsoft-Windows-PrintService/Admin
Bedingung:
EventID: 808
Log: Microsoft-Windows-PrintService/Admin
Level: Error
Description ENTHÄLT: "failed to load a plug-in module"
Echte Beweise (in-the-wild beobachtet):
"The print spooler failed to load a plug-in module
C:\Windows\system32\spool\DRIVERS\x64\3\svch0st.dll"
# Typosquatting von svchost.dll → bösartige DLL
# Ereignis-ID 316 — Treiber installiert über RpcAddPrinterDriverEx
# Quelle: Microsoft-Windows-PrintService/Admin
Bedingung:
EventID: 316
Log: Microsoft-Windows-PrintService/Admin
Message ENTHÄLT: "RpcAddPrinterDriverEx"
ODER
Message ENTHÄLT: "\\\\*\\*" # UNC-Pfad → entfernte DLL
# Verdächtiger untergeordneter Prozess des Print Spooler
EventID: 1 (Process Creation)
Bedingung:
ParentImage: C:\Windows\System32\spoolsv.exe
Image: cmd.exe ODER powershell.exe ODER wscript.exe ODER mshta.exe
Schweregrad: KRITISCH — spoolsv sollte keine Shells erzeugen
# DLL aus nicht standardmäßigem Pfad geladen
EventID: 7 (Image Loaded)
Bedingung:
Image: C:\Windows\System32\spoolsv.exe
ImageLoaded BEGINNT NICHT MIT:
- C:\Windows\System32\spool\DRIVERS\
- C:\Windows\System32\
- C:\Windows\SysWOW64\
Schweregrad: HOCH
Für die Erkennung auf Netzwerkebene sollten SMB-Named-Pipes überwacht werden: Das Vorhandensein von \pipe\spoolss in Kombination mit den Operationen RpcEnumPrinterDrivers oder RpcAddPrinterDriverEx sind direkte Indikatoren für die Ausnutzung von PrintNightmare.
# Konzeptionelle Zeek-/Suricata-Regel:
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.mdOPTION 1 — Print Spooler deaktivieren (falls Drucken nicht benötigt wird)
PowerShell:
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
OPTION 2 — Remotedruck über Gruppenrichtlinie blockieren
Computerkonfiguration → Administrative Vorlagen → Drucker
→ "Allow Print Spooler to accept client connections": DEAKTIVIERT
Dies deaktiviert nur den Remote-Vektor und behält lokales Drucken bei
OPTION 3 — Patches anwenden (obligatorisch unabhängig von den obigen Optionen)
KB5004945 → Notfall-Patch Juli 2021
+ Nachfolgende kumulative Patches
ÜBERPRÜFUNG NACH DEM PATCH — Registry kann weiterhin verwundbar lassen:
REG QUERY "HKLM\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint"
Wenn NoWarningNoElevationOnInstall=1 ODER UpdatePromptSettings=0 → NOCH VERWUNDBAR
Behebung: Beide Werte auf 0 setzen oder die Schlüssel entfernen
BESONDERE PRIORITÄT: Domain Controller
DCs führen Print Spooler standardmäßig aus
Kompromittierung eines DC über PrintNightmare = vollständige Kompromittierung der AD-Domäne
$ cat ./usage.sh# Abhängigkeit installieren (socket ist stdlib)
python --version # Python 3.x, kein pip erforderlich
# Ziel-IP im Skript bearbeiten (nur in autorisiertem Labor)
# simulate_printnightmare_attack("192.168.1.xxx")
python poc_cve_2021_1675.py
# Erwartete Ausgabe, wenn Port 445 erreichbar ist:
[+] Payload gesendet an 192.168.1.117
# Erwartete Ausgabe, wenn Port geschlossen/gefiltert ist:
[-] Verbindungsfehler: [Errno 111] Connection refused
# oder
[-] Verbindungsfehler: timed out
Was diese Ausgabe bedeutet: Nur dass Port 445 erreichbar ist. Bestätigt keine Schwachstelle — dafür wäre ein echtes RPC-BIND + Überprüfung der Patch-Version erforderlich.
$ cat ./poc_vs_real_exploit.mdExpliziter Vergleich zwischen dem simulierten PoC und einem echten Exploit.
$ cat ./lessons_learned.txt[+] Print Spooler standardmäßig aktiv auf DCs ist das kritischste Szenario — SYSTEM auf DC = Game Over
[+] SMB-Named-Pipes als RPC-Transport sind ein unterschätzter Vektor in perimeter-fokussierten Verteidigungen
[+] DCE/RPC ist ein komplexes Protokoll — das Verständnis der Bind-/Call-Struktur hilft beim Erstellen von Signaturen
[+] Veröffentlichte CVE ≠ angewendeter Patch — Wochen nach dem Patch waren die meisten Umgebungen noch verwundbar
[+] PointAndPrint-Registry-Schlüssel können die Schwachstelle selbst nach dem Patch wieder einführen — kritische Kontrolle nach dem Patch
[-] Dieser PoC prüft nur TCP-Konnektivität — validiert nicht, ob das System tatsächlich gepatcht ist
[-] Reiner Socket ohne SMB kann keine Authentifizierung aushandeln — grundlegende Einschränkung des Ansatzes
[-] settimeout(5) kann in langsamen Netzwerken falsch-negative Ergebnisse erzeugen — parametrisierbaren Timeout in Betracht ziehen
[→] Verbesserungen: impacket für echtes RPC verwenden, SMB-Banner für OS-Versions-Fingerprinting prüfen,
angewendetes KB über Remote-Registry-Abfrage testen
CVE-Forschung · PrintNightmare · Gepatcht Juli 2021 · CISA KEV · Nur simuliertes Payload
| Byte | Wert | Bedeutung |
|---|
\x05 | 5 | Version des DCE/RPC-Protokolls (Version 5 — Windows-Standard) |
\x00 | 0 | Minor-Version 0 |
\x0b | 11 | PDU-Typ: BIND — erster Schritt der RPC-Aushandlung |
\x03 | 3 | Flags: `PFC_FIRST_FRAG(0x01) |
| Aspekt | CVE-2021-1675 | CVE-2021-34527 |
|---|
| Vektor | Lokal (LPE) | Remote (RCE) |
| CVSS | 7.8 | 8.8 |
| Authentifizierung | Lokales Konto | Authentifiziertes Domänenkonto |
| Patch | Juni 2021 (Patch Tuesday) | Juli 2021 (außer der Reihe KB5004945) |
| Verwundbare Funktion | RpcAddPrinterDriverEx | RpcAddPrinterDriverEx |
| Szenario | Lokale Eskalation | Remote-RCE über SMB-Named-Pipe |
| Komponente | Dieser PoC | Echter Exploit |
|---|
| Verbindung | TCP-Socket Port 445 | SMB-Session + Tree-Connect IPC$ |
| Authentifizierung | Keine | NTLM oder Kerberos (Domänenkonto) |
| Named Pipe | Nicht implementiert | \pipe\spoolss |
| RPC-BIND | Gefälscht (4 Bytes + ASCII) | DCE/RPC-BIND mit MS-RPRN-UUID |
| Aufgerufene Funktion | Nicht aufgerufen | RpcAddPrinterDriverEx() über NDR |
| DLL-Pfad | Nicht gesendet | UNC: \\attacker\share\evil.dll |
| Ergebnis | Ausgabe auf Konsole | RCE als SYSTEM / LPE |
| Erkennung | Nahezu null | EventID 808, 316, Sysmon 1/7 |