SPN-less RBCD
Aprobecho el echo de que salio Hercules en HTB para hacer uno esclusivo de esto
El ataque S4U estándar (S4U2Self + S4U2Proxy) tiene un requisito clave: el principal que controlamos, y que configuramos en el atributo msDS-AllowedToActOnBehalfOfOtherIdentity, debe tener un SPN. Si no podemos añadir uno (por ejemplo, si ms-DS-MachineAccountQuota es 0) y no hemos comprometido otra cuenta que ya tenga un SPN, el ataque RBCD tradicional falla.
Sin embargo, es posible eludir este requisito abusando de otra extensión de Kerberos: User2User (U2U).
Esta técnica, detallada en el blog de offsecdeer, sustituye la necesidad de un SPN por el UPN (Universal Principal Name) del usuario, algo que todas las cuentas de usuario poseen.
El objetivo es forzar una "coincidencia" entre la clave de sesión del TGT de un usuario y su clave a largo plazo (su hash NT).
Flujo del Ataque:
Obtener TGT (con RC4): Usamos over-pass-the-hash con el hash NT de la cuenta que controlamos (ej.
spnless) para solicitar un TGT. Es fundamental que la transacción use RC4, ya que esto asegura que la clave de sesión del TGT resultante sea, en sí misma, un hash NT.getTGT.py -hashes :[HASH_NT_SPNLESS] [DOMINIO]/spnless@[IP_DC]Extraer Clave de Sesión del TGT: Analizamos el ticket .ccache resultante para extraer la clave de sesión.
describeTicket.py spnless.ccache | grep 'Ticket Session Key' Ticket Session Key: [CLAVE_SESION_TGT_COMO_HASH]Cambiar el Hash NT: Ahora, usamos una herramienta (como
changepasswd.py) para cambiar el hash NT de nuestra cuentaspnless. Establecemos su nuevo hash NT para que sea exactamente la clave de sesión del TGT que acabamos de extraer.changepasswd.py [DOMINIO]/spnless:[PASS_ANTIGUA]@[IP_DC] -newhash [CLAVE_SESION_TGT_COMO_HASH]Ejecutar S4U (con U2U): Con el TGT original (paso 1) y la contraseña "falsa" (paso 3), ejecutamos el ataque S4U, pero añadiendo el flag que fuerza el protocolo U2U.
Impacket:
KRB5CCNAME=spnless.ccache getST.py -u2u -impersonate [USUARIO_ADMIN] -spn host/[SERVIDOR_BACK_1] -k -no-pass [DOMINIO]/spnlessRubeus:
PS > .\Rubeus.exe s4u /u2u /user:spnless /rc4:[CLAVE_SESION_TGT_COMO_HASH] /impersonateuser:[USUARIO_ADMIN] /msdsspn:host/[SERVIDOR_BACK_1] /ptt
Restaurar (Opcional): Si es posible, se intenta revertir el hash NT al original, aunque las políticas de dominio pueden impedirlo.
¿Por qué funciona esto?
Un ticket TGS normal se cifra usando la clave a largo plazo (el hash NT) del servicio de destino.
Un ticket U2U (diseñado para servicios sin claves a largo plazo) se cifra usando la clave de sesión del TGT del servicio de destino.
El ataque S4U2Proxy espera recibir un ticket TGS normal. Cuando el KDC recibe nuestra solicitud S4U2Proxy (que contiene el ticket U2U), intenta descifrarla usando la clave a largo plazo (hash NT) de nuestra cuenta
spnless(que actúa como "servicio" en esta fase).Dado que en el Paso 3 cambiamos el hash NT de
spnlesspara que fuera idéntico a su clave de sesión TGT, el KDC descifra el ticket con éxito. El KDC cree que ha validado un TGS normal usando la clave a largo plazo del usuario, cuando en realidad ha validado un ticket U2U usando la clave de sesión del TGT que nosotros mismos le proporcionamos como hash.El resultado es un ticket de servicio válido para
host/[SERVIDOR_BACK_1]a nombre de[USUARIO_ADMIN].
Limitaciones:
RC4 debe estar habilitado en el dominio (suele serlo por defecto).
La cuenta queda inutilizable. Al cambiar el hash NT a la clave de sesión TGT (un valor del que no conocemos el texto claro), el propietario legítimo de la cuenta
spnlesspierde el acceso.Las políticas de edad mínima de contraseña pueden impedir revertir el hash NT al original inmediatamente, haciendo el ataque muy ruidoso y destructivo para la cuenta utilizada.
Última actualización