Resource-Based Constrained Delegation
Ejemplo práctico
Dado los siguientes elementos el modelo Resource-Based Constrained Delegation funcionaria de la siguiente manera
Elemento : Nombre : Tipo
-------------------:----------------------------------:------------------------------
Usuario : johndoe@DOMAIN.LOCAL : Cuenta de usuario
Servidor frontend : mail01.domain.local : Cuenta de equipo/servicio (MAIL01$)
Servicio frontend : HTTP/mail01.domain.local : SPN registrado en MAIL01$
Servidor destino : sql01.domain.local : Cuenta de equipo/servicio (SQL01$)
Servicio destino : MSSQLSvc/sql01.domain.local : SPN registrado en SQL01$
¿Qué es Resource-Based Constrained Delegation (RBCD)?
RBCD es una forma moderna de delegación que invierte el control:
En lugar de definir en el servidor origen (MAIL01$
) hacia dónde puede delegar como vimos en Constrained Delegation, se configura en el servidor destino (SQL01$
) quiénes tienen permitido actuar en nombre de otros usuarios.
Esto se configura mediante el atributo:
msDS-AllowedToActOnBehalfOfOtherIdentity
en la cuenta del servicio destino (SQL01$
).
Esto permite delegación incluso entre dominios diferentes, y es útil en escenarios de mayor control o automatización.
Flujo de autenticación paso a paso (RBCD)
1. AS_REQ
/ AS_REP
– johndoe obtiene su TGT
AS_REQ
/ AS_REP
– johndoe obtiene su TGTjohndoe → KDC: Solicita TGT
(krbtgt/DOMAIN.LOCAL)
KDC → johndoe: Devuelve TGT
Este paso es igual al de cualquier autenticación en Kerberos.

2. TGS_REQ
/ TGS_REP
– johndoe pide TGS para HTTP/mail01
TGS_REQ
/ TGS_REP
– johndoe pide TGS para HTTP/mail01johndoe → KDC: TGS_REQ
para HTTP/mail01.domain.local
KDC → johndoe: TGS
entregado (TGS)
johndoe se conecta al servicio web en mail01
.

3. Suplantación con S4U2Self
MAIL01$
ahora quiere actuar como johndoe, así que:
MAIL01$
→ KDC: Solicita TGS
para sí mismo en nombre de johndoe (S4U2Self)
KDC → MAIL01$
: Devuelve TGS
S4U2Self
Este ticket sólo sirve dentro de MAIL01$
y representa la identidad de johndoe.

4. Suplantación con S4U2Proxy hacia sql01
MAIL01$
quiere actuar como johndoe hacia el servicio MSSQL:
MAIL01$
→ KDC: Solicita TGS
para MSSQLSvc/sql01.domain.local
actuando como johndoe usando el ticket S4U2Self como prueba
Aquí ocurre la diferencia clave con Constrained Delegation:
El KDC ya no consulta el atributo
msDS-AllowedToDelegateTo
enMAIL01$
.En cambio, consulta en la cuenta del servicio destino (
SQL01$
) siMAIL01$
aparece en el atributomsDS-AllowedToActOnBehalfOfOtherIdentity
.
Si la cuenta SQL01$
confía en MAIL01$
, el KDC devuelve el TGS final para delegación.

5. MAIL01$
se conecta a sql01
como johndoe
MAIL01$
se conecta a sql01
como johndoeMAIL01$
→ sql01
: Usa TGS
final (AP_REQ
) actuando como johndoe
sql01
→ Permite el acceso como si johndoe lo hubiese hecho directamente
Requisitos y configuración
En la cuenta SQL01$
(servicio destino)
SQL01$
(servicio destino)Debe tener configurado el atributo:
msDS-AllowedToActOnBehalfOfOtherIdentity
Este atributo se puede modificar con PowerShell:
$SQL = Get-ADComputer sql01
$Mail = Get-ADComputer mail01
Set-ADComputer $SQL -PrincipalsAllowedToDelegateToAccount $Mail
Esto autoriza a MAIL01$
a delegar hacia SQL01$
en nombre de otros usuarios.
Ejemplos comunes de abuso de RBCD por un pentester
1. Escalación lateral a otro servidor mediante RBCD
Situación:
El pentester compromete una máquina (ej:
web01
).Tiene permisos para crear un nuevo equipo en AD (
AddComputer
).Hay un servidor como
sql01
que permite delegación desde equipos específicos.
Qué puede hacer:
Crear una cuenta de máquina falsa (ej:
attacker$
).Agregarse como delegado en
msDS-AllowedToActOnBehalfOfOtherIdentity
desql01$
.Suplantar a un usuario (ej: un admin que se conectó a
web01
) y acceder asql01
como él.
Resultado: Acceso como otro usuario (posiblemente admin) a otro servicio sin necesidad de su contraseña ni hash.
2. Persistencia pos-explotación sin privilegios evidentes
Situación:
El atacante tiene control sobre un equipo (
web01$
) o cuenta con permisos de escritura sobre una cuenta de máquina.
Qué puede hacer:
Configura en una máquina controlada (
sql01$
) el atributomsDS-AllowedToActOnBehalfOfOtherIdentity
para delegar a un equipo suyo (evilbox$
).Así puede suplantar usuarios legítimos en cualquier momento sin necesidad de comprometer sus credenciales directamente.
Resultado: Puede establecer un backdoor Kerberos-based que no aparece en los lugares típicos donde se monitorea privilegios.
3. Abuso de permisos mal delegados (WriteProperty)
Situación:
El pentester identifica que una cuenta de usuario o servicio tiene permisos de escritura sobre una cuenta de máquina, por ejemplo:
UserX tiene permiso WriteProperty sobre SQL01$
Qué puede hacer:
Modifica directamente el atributo
msDS-AllowedToActOnBehalfOfOtherIdentity
para permitir delegación desde una máquina que controle.
Resultado: Gana control sobre servicios críticos al actuar como cualquier usuario (incluso Domain Admins) si logran suplantarlos.
4. Ataque combinado con Kerberoasting o DCSync
Situación:
El pentester se posiciona en una máquina vulnerable.
Un usuario privilegiado (Domain Admin) se conecta a ella.
Qué puede hacer:
Usa RBCD para suplantar a ese usuario y obtener un TGS para
krbtgt
oldap/dc01
, simulando su identidad.Con eso puede:
Hacer DCSync (
ldap/dc01
)Realizar Kerberoasting con privilegios altos
Esencialmente comprometer el dominio entero
5. Ataque cross-domain con trust
Situación:
Hay dos dominios con trust:
DOMAINA
↔DOMAINB
.El atacante tiene control sobre un equipo en
DOMAINB
.
Qué puede hacer:
Usa RBCD configurado en
DOMAINA
para delegar desde su equipo (enDOMAINB
) hacia un recurso del otro dominio.
Resultado: Acceso cross-domain, muy útil en entornos corporativos grandes o forest trust.
Last updated