2 - Pass The Ticket (PTT)

Pass The Ticket es una técnica que consiste en reutilizar un ticket Kerberos válido (TGT o TGS) para suplantar a un usuario ya autenticado, sin necesidad de conocer su contraseña ni su hash.

Para que el ataque funcione, no sólo se necesita el ticket, sino también la clave de sesión asociada a él. Sin esta clave, el ticket no puede ser utilizado correctamente porque no es posible generar los campos de autenticación requeridos en los mensajes KRB_AP_REQ.

El ticket y la clave de sesión pueden obtenerse de varias formas:

  • Realizando un ataque de tipo Man-In-The-Middle (MitM), aunque esto raramente permite recuperar la clave de sesión.

  • Extrayendo los tickets y claves de sesión directamente desde la memoria del proceso LSASS, utilizando herramientas como Mimikatz (sekurlsa::tickets o kerberos::ptt). Este proceso, responsable de la gestión de credenciales y autenticaciones, almacena en memoria tickets TGT (Ticket Granting Ticket) y TGS (Ticket Granting Service), así como otros elementos sensibles. Herramientas como Mimikatz permiten extraer estos tickets en formato .kirbi, que pueden ser inyectados posteriormente en otra sesión para suplantar la identidad de un usuario dentro del dominio, sin necesidad de conocer su contraseña.

Es más eficaz reutilizar un TGT en lugar de un TGS, ya que el TGT puede usarse para solicitar múltiples TGS hacia distintos servicios. En cambio, un TGS sólo sirve para un único servicio.

También se debe tener en cuenta que los tickets tienen una validez limitada, normalmente 10 horas por defecto, tras lo cual expiran y dejan de ser utilizables.

Ejemplo de extracción de ticket TGT implementando mimikatz

En este caso se comprometió un equipo del DC y se cargó el ejecutable de mimikatz, luego se habilitaron los privilegios de depuración para acceder a la memoria del proceso LSASS, desde donde se van a extraer y exportar los tickets Kerberos activos, en este caso el TGT de la cuenta del administrador del DC. El comando para depurar es privilege::debug

controller\administrator@CONTROLLER-1 C:\Users\Administrator\Downloads>mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #19041 May 19 2020 00:48:59              
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)                               
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )  
 ## \ / ##       > http://blog.gentilkiwi.com/mimikatz                    
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com ) 
  '#####'        > http://pingcastle.com / http://mysmartlogon.com   ***/ 

mimikatz # privilege::debug 
Privilege '20' OK                 

Luego, con el comando sekurlsa::tickets /export, vamos a extraer y exportar todos los tickets Kerberos almacenados en memoria (LSASS) del sistema operativo, en este caso solo voy a mostrar el ticket del administrador que es el que vamos a usar para hacer el Pass the Ticket

📌Desglosando el Output

Identificación de la sesión

  • Authentication Id: Identificador único de inicio de sesión dentro del sistema.

  • Session: Indica que es una sesión remota ("NetworkCleartext").

  • User Name / Domain: Usuario que inició sesión (Administrator) y su dominio (CONTROLLER).

  • SID: Security Identifier del usuario. El RID -500 indica que es la cuenta Administrador por defecto del dominio.

  • Logon Time: Fecha y hora de inicio de sesión.

Información del ticket Kerberos

Este es el TGT, ticket emitido por el KDC que permite solicitar TGS para acceder a servicios.

  • Start: Hora de emisión del TGT.

  • End: Fecha de expiración del ticket (≈10 horas, por defecto).

  • MaxRenew: Tiempo máximo durante el cual se puede renovar el ticket (por ejemplo, para sesiones largas sin volver a autenticarse).

Detalle del TGT

  • Service Name / Target Name: El TGT está emitido por el servicio krbtgt del dominio CONTROLLER.LOCAL.

  • Client Name: El usuario autenticado es Administrator.

Este campo indica los flags del ticket:

  • initial: Es el ticket inicial obtenido por autenticación directa.

  • pre_authent: Requiere pre-autenticación.

  • renewable: Se puede renovar antes de expirar.

  • forwardable: Se puede reenviar a otros servicios.

  • name_canonicalize: El nombre fue convertido a su forma canónica.

Criptografía del ticket

  • Algoritmo: AES-256 con HMAC.

  • Clave de sesión: Se utiliza para cifrar la comunicación entre el cliente y los servicios.

  • Ticket: Cifrado con la clave del KDC (krbtgt), no visible aquí.

  • KVNO (Key Version Number): Versión de la clave usada para firmar el ticket (muy útil para constatar la validez de Golden Tickets).

Exportación del ticket

El ticket fue guardado en disco con el nombre:

Este archivo .kirbi puede ser reutilizado posteriormente con:

  • kerberos::ptt en Mimikatz

  • Rubeus ptt

  • Herramientas de Impacket (psexec.py, wmiexec.py, etc.)

Ahora podemos usar el módulo kerberos::ptt para hacer el Pass the Ticket. Este módulo se encarga de inyectar el ticket Kerberos (.kirbi) directamente en la memoria del proceso LSASS, permitiendo que el sistema lo utilice como si hubiese sido obtenido legítimamente por el usuario.

Este es el archivo de ticket exportado previamente con sekurlsa::tickets /export. Contiene un TGT válido del usuario Administrator para el dominio CONTROLLER.LOCAL

[0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi

Ahora con el comando klist desde el cmd podemos ver los tickets Kerberos activos en la sesión actual del usuario. En este caso, está mostrando un Ticket Granting Ticket (TGT) del usuario Administrator. Vamos a desglosarlo parte por parte:

  • klist → Muestra todos los tickets Kerberos almacenados en caché en la sesión del usuario actual.

  • No requiere parámetros adicionales, pero refleja:

    • Current LogonId → Identificador de sesión de inicio del sistema operativo asociado al ticket.

    • Client → Usuario autenticado al que pertenece el ticket.

    • Server → Servicio Kerberos que emitió el ticket (por ejemplo, krbtgt).

    • KerbTicket Encryption Type → Algoritmo de cifrado usado para el ticket.

    • Ticket Flags → Propiedades del ticket (por ejemplo, renovable, reenviable, autenticación previa).

    • Start Time → Momento en que el ticket comenzó a ser válido.

    • End Time → Expiración del ticket.

    • Renew Time → Límite hasta el cual puede renovarse el ticket.

    • Cache Flags → Estado del ticket dentro de la caché local.

    • Kdc Called → Nombre del KDC que emitió el ticket, puede estar vacío si fue inyectado manualmente.

    A continuación se ilustra un ejemplo donde se combina una fase de Pass The Key (fase 1 y 2), otra fase de Pass The Ticket (fase 3) y una fase de Golden Ticket (fase 4)

Last updated