## https://sploitus.com/exploit?id=CC78C616-7BC3-560F-9BEE-3AF0DD842444
# 🖨️ CVE-2021-1675 — PrintNightmare Windows Print Spooler RCE/LPE
> **Type:** Proof of Concept — Simulated (Non-Functional)
> **CVE:** [CVE-2021-1675](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-1675) + [CVE-2021-34527](https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-34527)
> **CVSS:** 7.8 (LPE) / 8.8 (RCE)
> **Alias:** PrintNightmare
> **Patched:** Junho/Julho 2021 — KB5004945
> **Adicionado ao CISA KEV:** Julho 2021
>
> ⚠️ *O payload deste PoC é explicitamente fictício e não-malicioso — apenas 4 bytes de cabeçalho DCE/RPC seguidos do nome da função em ASCII. Não executa código, não instala driver, não eleva privilégios. Uso exclusivo para fins de aprendizado e desenvolvimento de detecções.*
## `Developed by: HKK`
---
## `$ cat ./vulnerability_summary.txt`
CVE-2021-1675, conhecido como **PrintNightmare**, é uma vulnerabilidade crítica de Remote Code Execution e Local Privilege Escalation no serviço Windows Print Spooler. A falha permite que atacantes executem código arbitrário com privilégios **SYSTEM** explorando a função `RpcAddPrinterDriverEx()`, usada para instalação remota de drivers de impressora sem validação adequada de controle de acesso.
Originalmente classificada como LPE (CVSS 7.8) e patchada no Patch Tuesday de junho de 2021, a Microsoft reclassificou a vulnerabilidade como RCE (CVSS 8.8) em 21 de junho. Para evitar confusão, o vetor RCE recebeu um novo identificador, CVE-2021-34527 — ambos são comumente chamados de PrintNightmare.
---
## `$ cat ./timeline.txt`
```
Jun 08, 2021 Microsoft publica patch inicial no Patch Tuesday — CVE-2021-1675 (LPE, CVSS 7.8)
Jun 21, 2021 Microsoft reclassifica como RCE (CVSS 8.8)
Jun 29, 2021 Pesquisadores publicam PoC acidentalmente — acreditando ser a mesma vuln já patchada
Jul 01, 2021 CVE-2021-34527 atribuído para o vetor RCE — distinto do LPE original
Jul 02, 2021 Microsoft lança patch emergencial out-of-band: KB5004945
Jul 2021 CISA adiciona ao Known Exploited Vulnerabilities Catalog
Exploração ativa por grupos de ransomware (Vice Society, Magniber, etc.)
```
---
## `$ cat ./architecture.txt`
### Por que o Print Spooler é um vetor tão valioso?
```
┌──────────────────────────────────────────────────────────────────────────┐
│ PRINTNIGHTMARE — ATTACK FLOW │
│ │
│ ATACANTE (usuário autenticado) WINDOWS PRINT SPOOLER │
│ (spoolsv.exe) │
│ 1. Autenticar com qualquer ┌────────────────────────────┐ │
│ conta de domínio válida │ Roda como SYSTEM │ │
│ │ │ Ativo por padrão em todos │ │
│ 2. Conectar via RPC ao │ os Windows, incluindo DCs │ │
│ named pipe \pipe\spoolss └──────────────┬─────────────┘ │
│ │ │ │
│ 3. Chamar RpcAddPrinterDriverEx() │ │
│ com path para DLL maliciosa ──────────────────────►│ │
│ (UNC: \\attacker\share\evil.dll) │ │
│ ┌────────────▼────────────┐ │
│ │ Print Spooler carrega │ │
│ │ o driver (DLL) como │ │
│ │ SYSTEM sem verificar │ │
│ │ origem ou integridade │ │
│ └────────────┬────────────┘ │
│ │ │
│ ◄── RCE / LPE como SYSTEM ───────────────────────────┘ │
│ New admin user, reverse shell, │
│ ransomware deployment, etc. │
│ │
│ ───────────────────────────────────────────────────────────────────── │
│ ESTE POC: apenas TCP connect + 25 bytes → sem RPC real → sem exploit │
└──────────────────────────────────────────────────────────────────────────┘
```
---
## `$ cat ./design_decisions.md`
### 1. Análise do Payload Fictício
```python
fake_rpc_payload = b"\x05\x00\x0b\x03RpcAddPrinterDriverEx"
```
Este payload tem **25 bytes** e demonstra dois conceitos simultaneamente:
**Bytes 0-3: Cabeçalho DCE/RPC legítimo**
| Byte | Valor | Significado |
|------|-------|-------------|
| `\x05` | 5 | Versão do protocolo DCE/RPC (versão 5 — padrão Windows) |
| `\x00` | 0 | Minor version 0 |
| `\x0b` | 11 | PDU Type: **BIND** — primeiro passo da negociação RPC |
| `\x03` | 3 | Flags: `PFC_FIRST_FRAG(0x01) | PFC_LAST_FRAG(0x02)` |
**Bytes 4-24: Nome da função em ASCII**
`RpcAddPrinterDriverEx` — o nome da função vulnerável, em texto plano.
**Por que esse payload não funciona como exploit real?**
Um BIND RPC legítimo exigiria, após o header de 4 bytes:
```
- max_xmit_frag (2 bytes)
- max_recv_frag (2 bytes)
- assoc_group_id (4 bytes)
- num_ctx_items (1 byte)
- context_elem[] → Interface UUID do MS-RPRN:
{12345678-1234-ABCD-EF00-0123456789AB}
- transfer_syntaxes → NDR UUID
```
Sem essa estrutura, o Windows rejeita o pacote imediatamente. O payload é, efetivamente, apenas uma asserção de conectividade — "consigo alcançar a porta 445 com esse payload fictício?".
---
### 2. Porta 445 — SMB como transporte RPC
```python
sock.connect((target_ip, 445))
```
**Por que 445 e não 135 (RPC Endpoint Mapper)?**
O PrintNightmare usa o **SMB named pipe** `\pipe\spoolss` como transporte — não o RPC direto. O fluxo real é:
```
1. TCP connect → porta 445 (SMB)
2. SMB negotiate + session setup (autenticação NTLM/Kerberos)
3. Tree connect → IPC$
4. Named pipe open → \pipe\spoolss
5. DCE/RPC BIND → interface MS-RPRN
6. RpcAddPrinterDriverEx() call com NDR marshaling
```
O PoC simula apenas o passo 1 — a conexão TCP inicial — sem implementar os passos 2-6.
**`sock.settimeout(5)`:** timeout de 5 segundos previne que o PoC fique bloqueado em hosts que não respondem. Útil para scanning rápido de disponibilidade da porta.
---
### 3. CVE-2021-1675 vs CVE-2021-34527 — A Distinção
| Aspecto | CVE-2021-1675 | CVE-2021-34527 |
|---------|--------------|----------------|
| Vetor | Local (LPE) | Remoto (RCE) |
| CVSS | 7.8 | 8.8 |
| Autenticação | Conta local | Conta de domínio autenticada |
| Patch | Junho 2021 (Patch Tuesday) | Julho 2021 (out-of-band KB5004945) |
| Função vulnerável | `RpcAddPrinterDriverEx` | `RpcAddPrinterDriverEx` |
| Cenário | Escalação local | RCE remoto via SMB named pipe |
A causa raiz em ambos é a mesma: a função `RpcAddPrinterDriverEx()` falha em validar a origem dos arquivos de driver, não impõe restrições de privilégio adequadas para instalação de drivers, e não verifica a autenticidade ou integridade das DLLs sendo carregadas.
---
## `$ cat ./mitre_mapping.yml`
```yaml
tactic: Initial Access / Lateral Movement
- T1210 # Exploitation of Remote Services
# RPC call via \pipe\spoolss para host remoto
# Requer credencial de domínio válida
tactic: Privilege Escalation
- T1068 # Exploitation for Privilege Escalation
# usuário comum → SYSTEM via Print Spooler
# CVE-2021-1675 (LPE): processo local eleva para SYSTEM
tactic: Execution
- T1569.002 # System Services: Service Execution
# DLL maliciosa carregada pelo spoolsv.exe como SYSTEM
# Equivalente a execução de código via serviço do Windows
- T1055 # Process Injection
# DLL injetada no contexto do processo spoolsv.exe (SYSTEM)
tactic: Persistence
- T1547.012 # Boot or Logon Autostart: Print Processors
# Driver registrado persiste entre reinicializações
# Armazenado em: HKLM\SYSTEM\CurrentControlSet\Control\Print\
tactic: Defense Evasion
- T1036.005 # Masquerading: Match Legitimate Name or Location
# DLL maliciosa nomeada como driver legítimo (ex: Canon_XP.dll)
```
---
## `$ cat ./detection_opportunities.md`
### Windows Event Log
```yaml
# Event ID 808 — Print Spooler falhou ao carregar DLL suspeita
# Fonte: Microsoft-Windows-PrintService/Admin
Condição:
EventID: 808
Log: Microsoft-Windows-PrintService/Admin
Level: Error
Description CONTAINS: "failed to load a plug-in module"
Evidência real (observed in-the-wild):
"The print spooler failed to load a plug-in module
C:\Windows\system32\spool\DRIVERS\x64\3\svch0st.dll"
# Typosquatting de svchost.dll → DLL maliciosa
```
```yaml
# Event ID 316 — Driver instalado via RpcAddPrinterDriverEx
# Fonte: Microsoft-Windows-PrintService/Admin
Condição:
EventID: 316
Log: Microsoft-Windows-PrintService/Admin
Message CONTAINS: "RpcAddPrinterDriverEx"
OR
Message CONTAINS: "\\\\*\\*" # UNC path → DLL remota
```
### Sysmon / EDR
```yaml
# Processo filho suspeito do Print Spooler
EventID: 1 (Process Creation)
Condição:
ParentImage: C:\Windows\System32\spoolsv.exe
Image: cmd.exe OU powershell.exe OU wscript.exe OU mshta.exe
Severidade: CRÍTICA — spoolsv não deve spawnar shells
```
```yaml
# DLL carregada de path não-padrão
EventID: 7 (Image Loaded)
Condição:
Image: C:\Windows\System32\spoolsv.exe
ImageLoaded NOT STARTS WITH:
- C:\Windows\System32\spool\DRIVERS\
- C:\Windows\System32\
- C:\Windows\SysWOW64\
Severidade: ALTA
```
### Network — IDS/IPS
Para detecção em nível de rede, monitorar named pipes SMB: presença de `\pipe\spoolss` combinada com as operações `RpcEnumPrinterDrivers` ou `RpcAddPrinterDriverEx` são indicadores diretos de exploração do PrintNightmare.
```
# Regra Zeek / Suricata conceitual:
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`
```
OPÇÃO 1 — Desabilitar Print Spooler (se impressão não for necessária)
PowerShell:
Stop-Service -Name Spooler -Force
Set-Service -Name Spooler -StartupType Disabled
OPÇÃO 2 — Bloquear impressão remota via Group Policy
Computer Configuration → Administrative Templates → Printers
→ "Allow Print Spooler to accept client connections": DISABLED
Isso desabilita apenas o vetor remoto, mantendo impressão local
OPÇÃO 3 — Aplicar patches (obrigatório independente das opções acima)
KB5004945 → patch out-of-band Julho 2021
+ Patches cumulativos subsequentes
VERIFICAÇÃO PÓS-PATCH — Registry ainda pode deixar vulnerável:
REG QUERY "HKLM\Software\Policies\Microsoft\Windows NT\Printers\PointAndPrint"
Se NoWarningNoElevationOnInstall=1 OU UpdatePromptSettings=0 → AINDA VULNERÁVEL
Corrigir: definir ambos os valores para 0 ou remover as chaves
PRIORIDADE ESPECIAL: Domain Controllers
DCs rodam Print Spooler por padrão
Comprometer um DC via PrintNightmare = comprometimento completo do domínio AD
```
---
## `$ cat ./usage.sh`
```bash
# Instalar dependência (socket é stdlib)
python --version # Python 3.x, sem pip necessário
# Editar o IP alvo no script (somente em lab autorizado)
# simulate_printnightmare_attack("192.168.1.xxx")
python poc_cve_2021_1675.py
```
```
# Output esperado se porta 445 acessível:
[+] Payload enviado para 192.168.1.117
# Output esperado se porta fechada/filtrada:
[-] Erro ao conectar: [Errno 111] Connection refused
# ou
[-] Erro ao conectar: timed out
```
> **O que esse output indica:** apenas que a porta 445 está acessível. Não confirma vulnerabilidade — para isso, seria necessário um RPC BIND real + verificação da versão do patch.
---
## `$ cat ./poc_vs_real_exploit.md`
> Comparação explícita entre o PoC simulado e um exploit real.
| Componente | Este PoC | Exploit Real |
|------------|---------|-------------|
| Conexão | TCP socket porta 445 | SMB session + Tree connect IPC$ |
| Autenticação | Nenhuma | NTLM ou Kerberos (conta de domínio) |
| Named pipe | Não implementado | `\pipe\spoolss` |
| RPC BIND | Falso (4 bytes + ASCII) | DCE/RPC BIND com UUID MS-RPRN |
| Função chamada | Não chamada | `RpcAddPrinterDriverEx()` via NDR |
| DLL path | Não enviado | UNC: `\\attacker\share\evil.dll` |
| Resultado | Print em console | RCE como SYSTEM / LPE |
| Detecção | Quase nula | EventID 808, 316, Sysmon 1/7 |
---
## `$ cat ./lessons_learned.txt`
```
[+] Print Spooler ativo em DCs por padrão é o cenário mais crítico — SYSTEM em DC = game over
[+] SMB named pipes como transporte RPC são um vetor subestimado em defesas perimeter-focused
[+] DCE/RPC é protocolo complexo — entender a estrutura de bind/call ajuda a criar assinaturas
[+] CVE publicada ≠ patch aplicado — semanas após o patch, a maioria dos ambientes ainda era vulnerável
[+] PointAndPrint registry keys podem reintroduzir a vuln mesmo após o patch — controle pós-patch crítico
[-] Este PoC apenas verifica conectividade TCP — não valida se o sistema está patchado de fato
[-] Socket puro sem SMB não consegue negociar autenticação — limitação fundamental da abordagem
[-] settimeout(5) pode gerar falso negativo em redes lentas — considerar timeout parametrizável
[→] Melhorias: usar impacket para RPC real, verificar banner SMB para fingerprint de versão do OS,
testar KB aplicado via registry query remota
```
---
CVE Research · PrintNightmare · Patched July 2021 · CISA KEV · Simulated payload only