Pivotando con Golden Tickets en Linux

Ya sabéis que el protocolo Kerberos es el mecanismo preferido para la autenticación en un entorno Windows basado en dominio (DA). Sin entrar en detalle, Kerberos utiliza los tickets conocidos como TGT (Ticket-Granting Ticket) que entrega el KDC (Key Distribution Center) para autenticar usuarios y conceder acceso a cualquier recurso de la red.

Por otro lado, la cuenta KRBTGT se utiliza para cifrar y firmar todos los tickets Kerberos dentro de un dominio y los KDC (normalmente controladores de dominio) utilizan la contraseña de la cuenta para descifrar los tickets Kerberos para su validación. Esta contraseña de cuenta nunca cambia y el nombre de cuenta es el mismo en todos los dominios, por lo que es un objetivo bien conocido para los atacantes.

Si un atacante obtiene el hash de esa cuenta KRBTGT, podrá generar los conocidos Golden Tickets, y entonces podrá impersonar a cualquier usuario y establecer cualquier acceso autenticado persistente y encubierto en el dominio de Windows.

Mimikatz, que desde la versión 2.0 implementa esta técnica, permite crear estos tickets de forma offline con una validez por defecto de 10 años, que pueden ser reusados mediante pass-the-ticket y serán válidos incluso aunque el usuario impersonado cambie la contraseña. La única manera de invalidarlos sería resetear la contraseña utilizada para generar el TGT.

A finales del año pasado, en el blog de Artem Kondratenko, veíamos un pequeño pero útil tutorial para pivotar mediante estos Golden tickets en Linux. El ataque, por lo general, funciona de la siguiente manera:

- El atacante obtiene privilegios de administrador en el dominio
- El atacante extrae el hash ntlm de un usuario de dominio "krbtgt" y obtiene el SID del dominio de destino
- El atacante compone un ticket de kerberos
- Este ticket se utiliza para autenticar en el dominio con privilegios de administrador de dominio

Aquí está un walkthough detallado en cómo utilizar los Golden tickets en Kali Linux.

Empecemos por obtener el hash ntlm de la cuenta KRBTGT. En el ejemplo se utiliza una versión ofuscada de Mimikatz que extrae el hash sin alertar al AV (https://github.com/artkond/bat-armor/blob/master/examples/krbtgt.bat):


Quitando el último número correspondiente al SID (502) obtenemos el SID del dominio S-1-5-21-3251500307-1840725093-2229733580. Ahora para generar el ticket se usa la utilidad ticketer.py de Impacket (https://github.com/CoreSecurity/impacket/blob/master/examples/ticketer.py):


Casi listo. Solo necesitamos exportar la variable del sistema para que psexec.py pueda usar el ticket. Al ejecutar psexec.py es necesario especificar el parámetro -k para la autenticación kerberos:


Lo mismo ocurre con otras herramientas de Impacket como wmiexec.py (que genera menos "ruido" que psexec.py, ya que no carga ningún archivo binario y no inicia ningún servicio) o atexec.py (utiliza las tareas programadas para ejecutar su código):


Ya lo tenemos, pero ¿qué pasa si necesitamos subir algunos archivos? Lo más probable es que queramos utilizar smbclient para esta tarea. Usar kerberos con smbclient es un poco más complicado. Primero tenemos que agregar el realm de kerberos al archivo de configuración localizado en /etc/krb5.conf. En caso de que no tengamos krb5.conf, tendremos que instalar el paquete krb5-user desde el repo de la distro correspondiente.

[realms]
    PENTESTO.LOC = {
        kdc = tcp/dc01:88
    }
Es preferible usar TCP ya que permitirá tunelizar las solicitudes al servidor kerberos sobre proxy socks si queremos pivotar. El realm ha de estar en mayúsculas.


Pivotando

El uso de tickets kerberos sobre túnel socks requiere también un poco más de trabajo. Lo más probable es que no tengamos acceso directo a los servidores de nombres del directorio activo, por lo que debemos editar el archivo /etc/hosts y agregar el servidor de destino, el controlador de dominio (que también es servidor kerberos) y el FQDN del dominio. Esto es necesario porque kerberos sólo funciona con nombres de host y fallará si se especifica la dirección IP.

$ cat /etc/hosts
...
10.0.0.89  pentesto.loc
10.0.0.89  dc01
...
En el ejemplo, el servidor de destino es el controlador de dominio. Hay que editar proxychains, agregar el proxy socks y comentar la directiva proxy_dns:

$ cat proxychains.conf
...
#Proxy DNS requests - no leak for DNS data
#proxy_dns 
...
[ProxyList]
# add proxy here ...
# meanwile
# defaults set to "tor"
socks4  172.16.46.157 3128
En caso de que hayamos configurado /etc/hosts y /etc/krb5.conf correctamente no deberíamos tener problemas para ejecutar smbclient o psexec.py sobre un proxy socks:



Por último recordar que el nombre de dominio y el nombre de usuario que se proporcionan a psexec.py deben ser exactamente los mismos que se pusieron al crear el ticket con ticketer.py.

"I never thought my life could be...anything but catastrophe...but suddenly I begin to see a bit of good luck for me...'cause I've got a golden ticket...I've a golden twinkle in my eye".
-Grandpa Joe

FuentePivoting kerberos golden tickets in Linux

Comentarios

  1. Si el tutorial en sí ya es canela fina el bat-armor ese para evadir la restricción de ejecución de scripts en PowerShell es una perla.

    ResponderEliminar

Publicar un comentario