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 con Mimikatz

Last updated