Hace algunas semanas el investigador ruso Michael Zhmaylo (aka MzHmO) publicaba en su perfil de LinkedIn el siguiente anuncio:
Esto llamó prontamente la atención de muchos curiosos y entusiastas que tratan habitualmente con Kerberos en entornos de Active Directory de infraestructura de Microsoft. Y es que estos automatismos por lo pronto suponen una alternativa a populares y robustas herramientas como Rubeus y Mimikatz, cuando estamos planeando desplegar ataques de Pass The Ticket (PTT). Recordemos que en un entorno medianamente vigilado y protegido, que cuente con soluciones de seguridad en marcha, alertarán y neutralizarán (de cierta forma), los intentos de utilización de estas populares herramienta que hemos citado anteriormente. Todo esto optimizado y desarrollado en scripting para PowerShell. Desde el GitHub del investigador se pueden obtener 2 scripts que realizan las labores de volcado e inyección (respectivamente) de los tickets de Kerberos del objetivo.
A continuación la revisión de estos automatismos:
Volcado
Vayamos primero con el script llamado dumper.ps1, este automatismos permite enumerar los tickets de Kerberos asociados al usuario en cuestión, que en caso de ser ejecutado mediante un usuario sin privilegios (usuario de dominio, por ejemplo), devolvería únicamente los tickets de Kerberos de la sesión del propio usuario, veamos a continuación una muestra:
Para conceptualizar y evidenciar el escenario se muestra las propiedades del usuario de dominio.
Nótese que la consola de PowerShell iniciada tiene una integridad media y que los privilegios de este usuario son los mínimos.
Al ejecutar este script de PowerShell, de lo primero que identificaremos es que la «Impersonation» no está presente.
.\dumper.ps1
A través de esta acción solo fue posible obtener los tickets de Kerberos asociados a la cuenta de usuario de dominio (cshah, en este caso).
Mientras que si ejecutamos el script mediante un usuario con privilegios en el sistema (administrador de dominio, en este caso), conseguiremos enumerar todos los tickets de Kerberos de cada sesión levantada en el sistema y de forma automática obteniendo máximos privilegios del sistema (eso lo veremos y evidenciaremos más adelante).
Ahora la muestra de las propiedades de usuario privilegiado (en este caso llamado pcosta) y la integridad alta de la consola de PowerShell:
Observemos que en este caso el usuario si tiene el privilegio «SeImpersonatePrivilege» habilitado:
Ejecutamos una vez más el script dumper.ps1:
.\dumper.ps1
Como se observa y supone, los tickets de Kerberos hallados adquieren mayor relevancia dado su implicación.
Desde aquí también es posible obtener otros tickets de Kerberos de la sesiones iniciadas en el sistema, a continuación las muestras:
Inyección
Por el otro lado de la moneda tenemos el script denominado injector.ps1, que básicamente nos permitirá y como su propio nombre indica, inyectar el valor del ticket de Kerberos que hayamos previamente obtenido o ‘robado’. Veamos a continuación como proceder con la acción desde el usuario con privilegios mínimos (cshah).
Como se evidencia en la captura anterior, los tickets de Kerberos asociados a esta cuenta de dominio, tan solo son los pertenecientes al usuario cshah, que ha iniciado sesión en el sistema.
Este usuario si pretende tomar alguna acción privilegiada, como la de listar el disco local C: del DC (Controlador de Dominio/Domain Controller), será inmediatamente rechazado/imposibilitado mediante el siguiente mensaje:
Recordemos el valor del ticket de Kerberos en formato Base64 (que es el ofrecido por el automatismo), obtenido del usuario privilegiado pcosta:
Para poder inyectarlo a la cuenta del usuario con privilegios mínimos cshah ejecutaremos el siguiente modelo de comando:
.\injector.ps1 2 "<ticket_en_base64>"
En donde entre comilla irá toda la cadena que representa el ticket de Kerberos en Base64. La opción 2 será indicativo del formato del ticket de Kerberos insertado.
Al producirse la inyección del ticket de Kerberos del usuario privilegiado con éxito, podremos ver el siguiente cambio para el usuario de dominio cshah:
Que si volvemos a comprobar realizar una acción privilegiada como la que anteriormente queríamos ejecutar con este usuario de dominio (en este caso listar un directorio del DC), ahora si nos es factible y posible:
Bonus track
Pero yendo un poco más allá y como «Bonus Track«, pensemos en las posibilidades que podremos asumir con este ticket ‘robado‘, incluso desde nuestro sistema de ataque favorito (tu disto Linux de preferencia), podríamos preparar este ticket de Kerberos para ser empleado por poderosas herramienta como CrackMapExec o las utilidades de Impacket. Veamos como conseguirlo:
Lo primero, debemos asumir y ser consciente que hasta ahora solo hemos visto representado el ticket de Kerberos en formato Base64, que si por curiosidad queremos «leerlo», no nos será posible dado que esto se trata de un formato binario y tan solo podremos asimilar parte de su contenido:
Dicho esto y para dejar listo este ticket de Kerberos, lo pasaremos a un formato «intermedio», que este caso será un tipo de fichero kirbi, también conocido por ser el formato empleado por la herramienta Mimikatz, sin ir más lejos. Esto lo haremos para posteriormente y a través de la utilidad de Impacket llamado ticketConverter.py transformarlo finalmente a un fichero ccache, como se observa a continuación:
base64 -d ticket.tgt > ticket.kirbi ticketConverter.py ticket.kirbi ticket.ccache
Por tanto los ficheros resultantes serán finalmente:
Este último fichero generado (.ccache), lo añadiremos en la variable del sistema KRB5CCNAME:
export KRB5CCNAME=ticket.ccache
De forma que pueda ser invocado y empleado por nuestras ansiadas «navajas suizas«, de la siguiente manera:
crackmapexec smb srv-dc -k
CrackMapExec incluso nos informará del nivel de privilegios del usuario al que pertenece el ticket de Kerberos, mediante el famoso indicador en amarillo «(Pwn3d!)«.
Por el lado de las utilidades de Impacket, en este caso si empleamos el popular secretsdump obtendremos todos los hashes de los usuarios del DC:
impacket-secretsdump -k -no-pass pcosta@srv-dc
Si empleamos la versión de smbclient del propio Impacket llegaremos al contenido de DC:
impacket-smbclient -k -no-pass pcosta@srv-dc
Y finalmente si pretendemos obtener una consola interactiva con acceso al DC podríamos emplear la poderosa utilidad psexec:
impacket-psexec -k -no-pass pcosta@srv-dc
Como habéis visto, las posibilidades para nuestros ejercicios de Red Team se nos enriquecen gracias a estos automatismos que su investigador hizo a bien compartirnos, estaremos atentos a sus próximos pasos, estoy convencido que tendremos otras novedades interesantes. Hasta entonces!
Referencias
- https://github.com/MzHmO/PowershellKerberos
- https://xakep.ru/2023/05/25/cpp-kerberos/
- https://www.linkedin.com/posts/mzhmo_hi-friends-you-can-now-dump-kerberos-tickets-activity-7087136960804212737-u5m3
- https://tw1sm.github.io/2021-02-01-kerberos-conversion/
- https://book.hacktricks.xyz/windows-hardening/active-directory-methodology/pass-the-ticket