
# 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
| 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) |
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.
| 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 |
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