
PoC d'exploit Windows CLFS LPE pour la recherche en sécurité
🚨 PoC D'EXPLOIT — UNIQUEMENT À DES FINS DE RECHERCHE EN SÉCURITÉ, D'ANALYSE DE VULNÉRABILITÉS ET DE DÉFENSE
🚨 PoC D'EXPLOIT — RECHERCHE EN SÉCURITÉ, ANALYSE DE VULNÉRABILITÉS ET USAGE DÉFENSIF UNIQUEMENT
CVE-2025-60709 est une vulnérabilité d'élévation de privilèges locale (LPE) dans le pilote CLFS.sys (Common Log File System) de Windows. Elle permet à un attaquant disposant d'une exécution de code locale d'élever ses privilèges d'un utilisateur standard à NT AUTHORITY\SYSTEM via un dépassement de tampon (buffer overflow) dans le parsing des conteneurs CLFS, obtenant ainsi une primitive d'écriture arbitraire dans la mémoire du noyau.
Ce dépôt contient deux implémentations :
| Champ | Détail |
|---|---|
| Identifiant CVE | CVE-2025-60709 |
| Type | Élévation de privilèges locale (LPE) |
| Composant | CLFS.sys (pilote Common Log File System) |
| Système cible | Windows 11 24H2 (build 26100.3485+) |
| Architecture | x64 uniquement |
| Vecteur | Dépassement de tampon dans le parsing des conteneurs CLFS |
| Impact | Élévation vers NT AUTHORITY\SYSTEM |
| Prérequis | Exécution de code locale (utilisateur standard) |
CVE-2025-60709/
├── CVE-2025-60709.c (5.3 KB, 157 líneas) — Exploit C original
├── CVE-2025-60709.go (9.2 KB, 285 líneas) — Port Go (demo educativa)
└── README.txt (4.2 KB, 132 líneas) — Documentación original
┌─────────────────────────────────────────────────────────────┐
│ CVE-2025-60709 LPE │
└─────────────────────────────────────────────────────────────┘
[1] EVASIÓN DE DEFENSAS
├─ KillETW() → Parchea EtwEventWrite en ntdll con RET (0xC3)
└─ KillAMSI() → Parchea AmsiScanBuffer en amsi.dll con RET (0xC3)
[2] HEAP GROOMING (preparación de memoria)
└─ GroomLookaside()
├─ Crea 4096 archivos: C:\Windows\Temp\groom_00000.blf
├─ Llama CreateLogFile() + AddLogContainer() por cada uno
└─ Agota lookaside lists → garantiza layout de heap predecible
[3] PRIMITIVA DE ESCRITURA ARBITRARIA — ClfsArbWrite(Address, Value)
├─ Construye buffer CLFS malformado (0x102010 bytes)
│ ├─ Firma válida CLFS en +0x00: 0x0201
│ ├─ Sector size shift en +0x14: 2
│ ├─ First client region en +0x28: 0x100
│ ├─ cbRecord OVERSIZED en +0x100: 0xFF00 (64 KB > datos reales)
│ ├─ Marcador shadow zone en +0x9A8: 0x13371337
│ └─ CClfsContainerContext falso en offset (0xFF00 + 0x100):
│ ├─ pContainer = TargetAddress - 0x10
│ └─ cbContainer = Value (dato a escribir)
├─ Calcula checksum CLFS correcto (driver lo valida)
├─ Escribe contenedor malformado → C:\Windows\Temp\evil.blf
├─ Crea log apuntando a evil.blf
├─ Llama ClfsReadRestartArea() → dispara parsing kernel
└─ Driver desborda buffer → escribe Value en Address ✓
[4] ROBO DE TOKEN SYSTEM
├─ Lee EPROCESS del proceso SYSTEM via PsInitialSystemProcess
└─ Extrae token en EPROCESS + EPROCESS_TOKEN (offset 0x4c0)
[5] ESCALACIÓN DE PRIVILEGIOS
└─ ClfsArbWrite(CurrentEprocess + 0x4c0, SystemToken)
└─ Sobreescribe token del proceso actual con token SYSTEM ✓
[6] EJECUCIÓN DE PAYLOAD C2
├─ VirtualAlloc(PAGE_EXECUTE_READWRITE)
├─ Copia shellcode beacon de 1789 bytes
├─ CreateThread() → ejecución como NT AUTHORITY\SYSTEM
└─ Beacon C2: IPv6 + DoH → fallback Gmail drafts
└─ sRDI + sleep obfuscation + ETW/AMSI ya parcheados
[7] PERSISTENCIA
└─ Sleep(INFINITE) → proceso mantiene token SYSTEM
| Champ | Offset | Description |
|---|---|---|
EPROCESS_TOKEN | 0x4C0 | Jeton de sécurité du processus |
EPROCESS_PID | 0x440 | Identifiant du processus (PID) |
EPROCESS_LINKS | 0x448 | Liste chaînée des processus actifs |
EPROCESS_NAME | 0x5A8 | Nom du processus (ImageFileName) |
⚠️ Ces offsets varient selon les builds de Windows. Ils nécessitent une mise à jour pour d'autres versions.
Contenedor CLFS legítimo:
[Header 0x100 bytes][Record: cbRecord bytes de datos reales]
Contenedor malformado (evil.blf):
[Header válido][cbRecord=0xFF00 → kernel lee 65,280 bytes]
↓
Kernel overflow → llega a CClfsContainerContext falso
↓
pContainer = TargetKernelAddress - 0x10
cbContainer = ValueToWrite
↓
Driver usa estructura falsa → escribe ValueToWrite en TargetKernelAddress
CVE-2025-60709.c| Fonction | Rôle |
|---|---|
GetKernelBase() | ZwQuerySystemInformation(SystemModuleInformation) → base de ntoskrnl.exe |
KillETW() | VirtualProtect + surécriture d'EtwEventWrite dans ntdll.dll par 0xC3 (RET) |
KillAMSI() | Charge amsi.dll + surécriture d'AmsiScanBuffer par 0xC3 (RET) |
GroomLookaside() | Crée 4096 journaux CLFS pour épuiser les lookaside lists → tas déterministe |
ClfsArbWrite() | Cœur de l'exploit — primitive d'écriture arbitraire en mémoire noyau |
main() | Orchestre l'attaque : ETW→AMSI→groom→vol de jeton→arb write→beacon |
| Aspect | Version C | Version Go |
|---|---|---|
| Type | Exploit fonctionnel (selon la documentation) | Démo pédagogique uniquement |
| API | Accès direct (ntdll, clfsw32, advapi32) | Wrappers syscall.NewLazyDLL() |
| Checksum CLFS | Algorithme complet | Placeholder simplifié |
| Adresses noyau | Réelles | Placeholder codé en dur (0x123456) |
| Payload C2 | Shellcode de 1789 octets | Octets NOP (0x90) de test |
| Résultat attendu | Élévation vers SYSTEM | Message "Arb write failed (yeah)" |
Version C (nécessite Visual Studio Build Tools + Windows SDK) :
cl /O1 /MT /link ntdll.lib advapi32.lib clfsw32.lib CVE-2025-60709.c
Version Go (nécessite Go 1.19+ sur Windows x64) :
go build -ldflags="-s -w" -o CVE-2025-60709.exe CVE-2025-60709.go