Service Name Substitution

QUIEROOOOOOOO UN PUTO PATOOOOOOOOOOOOOOOO

La sustitución del nombre de servicio es una técnica avanzada que permite a un adversario "cambiar" un ticket de servicio de un servicio por otro. Y todo se debe a un fallo de diseño fundamental en la estructura del ticket de Kerberos.


Tanto las respuestas del KDC (AS-REP y TGS-REP) comparten una estructura de datos llamada KDC-REP. Dentro de esta, el ticket[5] es el ticket de servicio real.

Si miramos dentro de la estructura del Ticket, vemos que tiene una parte cifrada (enc-part) y una parte no cifrada. La parte cifrada contiene datos sensibles como la clave de sesión.

Sin embargo, el SPN (el campo sname[2]) se encuentra en la parte no cifrada del ticket.

Esto significa que si un adversario obtiene un ticket de servicio para, por ejemplo, HTTP/PC1, puede simplemente sobrescribir este campo en el ticket con otro SPN, como CIFS/PC1.

Por qué el ticket sigue siendo válido? Porque el campo sname no se incluye en el cálculo de la suma de comprobación (checksum) del ticket.

La Única Limitación:

Esto solo funciona si el SPN sustituido se ejecuta con la misma cuenta que el servicio original. No se puede cambiar HTTP/PC1 por CIFS/PC2 (máquinas diferentes), pero casi siempre se puede cambiar HTTP/PC1 por CIFS/PC1, ya que ambos servicios suelen ejecutarse como SYSTEM (la cuenta de máquina PC1$).

Como ambos servicios se ejecutan con la misma cuenta, la parte cifrada del ticket (que se cifra con la clave de esa cuenta) puede ser descifrada por el servicio sustituido sin ningún problema.


El Escenario de Abuso: Eludiendo la Delegación "Inútil"

Aquí es donde esta técnica se vuelve poderosa. Imaginemos que hemos comprometido lon-ws-1 y, tras enumerarlo, encontramos que tiene delegación restringida a un Controlador de Dominio. ¡Genial!

Pero espera... mira de cerca:

sAMAccountName: LON-WS-1$
msDS-AllowedToDelegateTo: time/lon-dc-1.contoso.com, time/lon-dc-1

La delegación solo está permitida al servicio TIME (time/lon-dc-1). Este servicio es inútil para el movimiento lateral; no podemos usarlo para obtener un shell o listar archivos. Nuestro objetivo real son servicios como CIFS (para acceso al sistema de archivos) o HOST/HTTP (para WinRM).

Aquí es donde aplicamos la sustitución de nombre de servicio.

  1. Usamos S4U para solicitar legítimamente un ticket para time/lon-dc-1 (lo cual está permitido).

  2. Interceptamos ese ticket antes de usarlo.

  3. Sobrescribimos el SPN time/lon-dc-1 con cifs/lon-dc-1.

  4. Usamos el ticket modificado para acceder a CIFS en el DC.

Y lo mejor es que Rubeus automatiza todo esto con el parámetro /altservice.


El Ataque con Rubeus

Asumiendo que hemos comprometido lon-ws-1 (y tenemos su TGT) y que la transición de protocolo está habilitada, el comando es:

Bash

Analicemos los parámetros clave:

  • /user:lon-ws-1$: El principal que controlamos y que está configurado para la delegación.

  • /msdsspn:time/lon-dc-1: El servicio "inútil" al que se nos permite delegar.

  • /altservice:cifs: Esta es la magia. Le dice a Rubeus que sustituya el SPN del ticket final por cifs.

  • /ticket:...: El TGT de lon-ws-1$.

  • /impersonateuser:Administrator: El usuario que queremos suplantar.

Consejo: El parámetro /altservice admite una lista separada por comas, por ejemplo: /altservice:cifs,host,http. Esto generará tres tickets, uno para cada servicio.

Rubeus se encarga de todo el proceso:

Bash

Como puedes ver, Rubeus solicitó el ticket para time/lon-dc-1 pero luego nos dio un ticket para cifs/lon-dc-1.


"Game Over": Usando el Ticket Falsificado

Ahora solo tenemos que usar este ticket de CIFS recién creado para acceder al Controlador de Dominio como Administrador.

Bash

Y así es como convertimos una delegación restringida "inútil" en un compromiso total del Controlador de Dominio.

Última actualización