KDU

Kernel Driver Utility
Requisitos del sistema
- x64 Windows 7/8/8.1/10/11;
- Se requieren privilegios administrativos.
Propósito y características
El propósito de esta herramienta es proporcionar una forma sencilla de explorar el kernel/componentes de Windows sin requerir una configuración extensa o un depurador local.
Incluye:
- Secuestro de procesos protegidos mediante PPL arbitrario o handles de proceso arbitrarios, ambos a través de la modificación del objeto EPROCESS;
- Anulador de la aplicación de firmas de controladores (similar a DSEFix);
- Cargador de controladores para eludir la aplicación de firmas de controladores (similar a TDL/Stryker);
- Soporte para diversos controladores vulnerables utilizados como "proveedores" de funcionalidad.
Uso
KDU -list
KDU -listcsv
KDU -diag
KDU -prv ProviderID
KDU -ps ProcessID
KDU -pse Commandline
KDU -psw Commandline
KDU -pho ProcessID
KDU -dmp ProcessID
KDU -dse value
KDU -map filename
- -list - lista los proveedores disponibles actualmente;
- -listcsv [file] - lista los proveedores disponibles en formato CSV, opcionalmente escribe a un archivo;
- -diag - ejecuta diagnósticos del sistema para solución de problemas;
- -prv - opcional, selecciona el proveedor de controlador vulnerable;
- -ps - modifica el objeto de proceso del ProcessID dado, degradando cualquier protección;
- -pse - lanza el programa como ProtectedProcessLight-AntiMalware (PPL);
- -psw - lanza el programa como ProtectedProcessLight-WinTcb (PPL);
- -pho - abre un proceso arbitrario con acceso completo
- -pht - también abre todos los hilos de este proceso con acceso completo
- -phc - línea de comandos (proceso hijo) para heredar el flag, por defecto powershell
- -phe - también inicia el proceso hijo como ppl
- -dmp - vuelca la memoria virtual del proceso dado;
- -dse - escribe un valor definido por el usuario en los flags de estado DSE del sistema;
- -map - mapea el controlador al kernel y ejecuta su punto de entrada; este comando tiene dependencias listadas a continuación;
- -scv version - opcional, selecciona la versión de shellcode, por defecto 1;
- -drvn name - nombre del objeto del controlador (solo válido para la versión 3 del shellcode);
- -drvr name - opcional, nombre de la clave de registro del controlador (solo válido para la versión 3 del shellcode).
Ejemplo:
- kdu -ps 1234
- kdu -map c:\driverless\mysuperhack.sys
- kdu -dmp 666
- kdu -prv 1 -ps 1234
- kdu -prv 1 -map c:\driverless\mysuperhack.sys
- kdu -prv 6 -scv 3 -drvn DrvObj -map c:\install\e3600bm.sys
- kdu -prv 6 -scv 3 -drvn edrv -drvr e3600bl -map c:\install\e3600bl.sys
- kdu -dse 0
- kdu -dse 6
- kdu -pse "C:\Windows\System32\notepad.exe C:\TEMP\words.txt"
- kdu -psw "C:\Windows\System32\cmd.exe"
- kdu -pho 1234 -pht -phe 3
- kdu -listcsv "c:\kdu\out.csv"
Ejecutado en Windows 11 24H2*
Ejecutado en Windows 10 20H2*
Compilado y ejecutado en Windows 8.1*
Ejecutado en Windows 7 SP1 completamente parcheado (versión precompilada)*
Ejecutado en Windows 10 19H2 (versión precompilada, SecureBoot habilitado)*
La mayoría de las capturas de pantalla son de la versión 1.0X.
Limitaciones del comando -map
Debido a la forma inusual de carga que no involucra el cargador estándar del kernel, sino que utiliza la sobrescritura de módulos ya cargados con shellcode, existen algunas limitaciones:
- Los controladores cargados DEBEN ESTAR diseñados especialmente para ejecutarse como "driverless";
Eso significa que no puedes usar parámetros especificados en tu DriverEntry ya que no serán válidos. Eso también significa que no puedes cargar cualquier controlador sino solo aquellos diseñados especialmente, o necesitas alterar las rutinas del shellcode.
- Sin soporte SEH para los controladores objetivo;
No hay código SEH en x64. En su lugar, tienes una tabla de regiones try/except/finally descrita por un puntero en la cabecera PE. Si hay una excepción, puede resultar en un BSOD.
- Sin descarga de controladores;
El código mapeado no puede descargarse a sí mismo; sin embargo, puedes liberar todos los recursos asignados por tu código mapeado.
DRIVER_OBJECT->DriverUnload debe establecerse en NULL.
- Solo se resuelve la importación de ntoskrnl, todo lo demás depende de ti;
Si tu proyecto necesita otra dependencia de módulo, debes reescribir esta parte del cargador.
- Varias primitivas de Windows están prohibidas por PatchGuard para su uso por código dinámico.
Debido a la forma inusual de carga, el controlador mapeado no estará dentro de PsLoadedModulesList. Eso significa que cualquier callback registrado por dicho código tendrá su manejador ubicado en memoria fuera de esta lista. PatchGuard puede detectar esto y provocar un fallo del sistema.
En general, si quieres saber qué no deberías hacer en el kernel, mira https://github.com/hfiref0x/KDU/tree/master/Source/Examples/BadRkDemo que contiene algunos ejemplos de cosas prohibidas.
Nota sobre rastros del kernel
Esta herramienta no cambia (y no cambiará en el futuro) las estructuras internas de Windows MmUnloadedDrivers y/o PiDDBCacheTable. Eso es porque:
- KDU no está diseñado para eludir software de seguridad de terceros o diversos programas dudosos (por ejemplo, anti-cheats);
- Estos datos pueden ser un objetivo para la protección PatchGuard en la próxima actualización mayor de Windows 10.
Lo usas bajo tu propio riesgo. Algunos AV perezosos pueden marcar esta herramienta como hacktool/malware.
Proveedores soportados
Lista completa incluyendo todos los metadatos disponibles aquí:
Más proveedores pueden ser añadidos en el futuro.
Cómo funciona
Utiliza controladores conocidos como vulnerables (o wormhole por diseño) de software legítimo para acceder a memoria arbitraria del kernel con primitivas de lectura/escritura.
Dependiendo del comando, KDU funcionará como TDL/DSEFix o modificará objetos de proceso en modo kernel (EPROCESS).
Cuando está en modo -map, KDU para la mayoría de los proveedores disponibles usará por defecto un controlador firmado de terceros de SysInternals Process Explorer y lo secuestrará colocando un pequeño shellcode cargador dentro de su rutina IRP_MJ_DEVICE_CONTROL.
Versiones de shellcode