
Exploit PoC de LPE para CLFS do Windows para pesquisa de segurança
🚨 EXPLOIT PoC — APENAS PARA PESQUISA DE SEGURANÇA, ANÁLISE DE VULNERABILIDADES E FINS DEFENSIVOS
🚨 EXPLOIT PoC — SOLO PARA INVESTIGACIÓN DE SEGURIDAD, ANÁLISIS DE VULNERABILIDADES Y FINES DEFENSIVOS
CVE-2025-60709 é uma vulnerabilidade de escalação de privilégios locais (LPE) no driver CLFS.sys (Common Log File System) do Windows. Permite que um atacante com execução de código local escale de usuário padrão para NT AUTHORITY\SYSTEM através de um buffer overflow na análise de contêineres CLFS, obtendo uma primitiva de escrita arbitrária na memória do kernel.
Este repositório contém duas implementações:
| Campo | Detalhe |
|---|---|
| CVE ID | CVE-2025-60709 |
| Tipo | Local Privilege Escalation (LPE) |
| Componente | CLFS.sys (driver Common Log File System) |
| Sistema alvo | Windows 11 24H2 (build 26100.3485+) |
| Arquitetura | x64 apenas |
| Vetor | Buffer overflow na análise de contêiner CLFS |
| Impacto | Escalação para NT AUTHORITY\SYSTEM |
| Pré-requisitos | Execução local de código (usuário padrão) |
CVE-2025-60709/
├── CVE-2025-60709.c (5.3 KB, 157 linhas) — Exploit C original
├── CVE-2025-60709.go (9.2 KB, 285 linhas) — Port Go (demo educativa)
└── README.txt (4.2 KB, 132 linhas) — Documentação original
┌─────────────────────────────────────────────────────────────┐
│ CVE-2025-60709 LPE │
└─────────────────────────────────────────────────────────────┘
[1] EVASÃO DE DEFESAS
├─ KillETW() → Aplica patch no EtwEventWrite na ntdll com RET (0xC3)
└─ KillAMSI() → Aplica patch no AmsiScanBuffer na amsi.dll com RET (0xC3)
[2] HEAP GROOMING (preparação de memória)
└─ GroomLookaside()
├─ Cria 4096 arquivos: C:\Windows\Temp\groom_00000.blf
├─ Chama CreateLogFile() + AddLogContainer() para cada um
└─ Esgota lookaside lists → garante layout de heap previsível
[3] PRIMITIVA DE ESCRITA ARBITRÁRIA — ClfsArbWrite(Address, Value)
├─ Constrói buffer CLFS malformado (0x102010 bytes)
│ ├─ Assinatura CLFS válida em +0x00: 0x0201
│ ├─ Sector size shift em +0x14: 2
│ ├─ First client region em +0x28: 0x100
│ ├─ cbRecord SUPERDIMENSIONADO em +0x100: 0xFF00 (64 KB > dados reais)
│ ├─ Marcador shadow zone em +0x9A8: 0x13371337
│ └─ CClfsContainerContext falso no offset (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (dado a escrever)
├─ Calcula checksum CLFS correto (driver valida)
├─ Escreve contêiner malformado → C:\Windows\Temp\evil.blf
├─ Cria log apontando para evil.blf
├─ Chama ClfsReadRestartArea() → dispara análise no kernel
└─ Driver estoura buffer → escreve Value em Address ✓
[4] ROUBO DE TOKEN SYSTEM
├─ Lê EPROCESS do processo SYSTEM via PsInitialSystemProcess
└─ Extrai token em EPROCESS + EPROCESS_TOKEN (offset 0x4c0)
[5] ESCALAÇÃO DE PRIVILÉGIOS
└─ ClfsArbWrite(CurrentEprocess + 0x4c0, SystemToken)
└─ Sobrescreve token do processo atual com token SYSTEM ✓
[6] EXECUÇÃO DE PAYLOAD C2
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Copia shellcode beacon de 1789 bytes
├─ CreateThread() → execução como NT AUTHORITY\SYSTEM
└─ Beacon C2: IPv6 + DoH → fallback Gmail drafts
└─ sRDI + sleep obfuscation + ETW/AMSI já corrigidos
[7] PERSISTÊNCIA
└─ Sleep(INFINITE) → processo mantém token SYSTEM
| Campo | Offset | Descrição |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Token de segurança do processo |
EPROCESS_PID | 0x440 | ID do processo (PID) |
EPROCESS_LINKS | 0x448 | Lista encadeada de processos ativos |
EPROCESS_NAME | 0x5A8 | Nome do processo (ImageFileName) |
⚠️ Esses offsets variam entre builds do Windows. Requerem atualização para outras versões.
Contêiner CLFS legítimo:
[Header 0x100 bytes][Record: cbRecord bytes de dados reais]
Contêiner malformado (evil.blf):
[Header válido][cbRecord=0xFF00 → kernel lê 65.280 bytes]
↓
Kernel overflow → alcança CClfsContainerContext falso
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Driver usa estrutura falsa → escreve ValueToWrite em TargetKernelAddress
CVE-2025-60709.c| Função | Propósito |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → base do ntoskrnl.exe |
KillETW() | VirtualProtect + sobrescreve EtwEventWrite na ntdll.dll com 0xC3 (RET) |
KillAMSI() | Carrega amsi.dll + sobrescreve AmsiScanBuffer com 0xC3 (RET) |
GroomLookaside() | Cria 4096 logs CLFS para esgotar lookaside lists → heap determinístico |
ClfsArbWrite() | Núcleo do exploit — primitiva de escrita arbitrária no kernel |
main() | Orquestra ataque: ETW→AMSI→groom→roubo de token→arb write→beacon |
| Aspecto | Versão C | Versão Go |
|---|---|---|
| Tipo | Exploit funcional (conforme documentação) | Demo educativa apenas |
| APIs | Acesso direto (ntdll, clfsw32, advapi32) | Wrappers syscall.NewLazyDLL() |
| Checksum CLFS | Algoritmo completo | Placeholder simplificado |
| Endereços do kernel | Reais | Placeholder fixo (0x123456) |
| Payload C2 | Shellcode de 1789 bytes | Bytes NOP (0x90) de teste |
| Resultado esperado | Escalação para SYSTEM | Mensagem "Arb write failed (yeah)" |
Versão C (requer Visual Studio Build Tools + Windows SDK):
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Versão Go (requer Go 1.19+ no Windows x64):
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go