
Abusa de los tickets Kerberos para evadir el UAC de Windows y obtener privilegios SYSTEM inyectando un MachineID falso en los tickets de servicio, aprovechando el truco tgtdeleg y el acceso al SCM.
Este POC está inspirado en James Forshaw (@tiraniddo) compartido en BlackHat USA 2022 titulado “Taking Kerberos To The Next Level ” tema, compartió una demostración de abuso de tickets Kerberos para lograr una omisión de UAC. Al agregar una KERB-AD-RESTRICTION-ENTRY al ticket de servicio, pero completando un MachineID falso, podemos omitir fácilmente UAC y obtener privilegios SYSTEM accediendo al SCM para crear un servicio del sistema. James Forshaw explicó la lógica detrás de esto en una entrada de blog llamada "Bypassing UAC in the most Complex Way Possible!", lo cual me interesó mucho. Aunque no proporcionó el código completo del exploit, construí un POC basado en Rubeus. Como un conjunto de herramientas en C# para interacción bruta con Kerberos y abuso de tickets, Rubeus proporciona una interfaz fácil que nos permite iniciar solicitudes Kerberos y manipular tickets Kerberos fácilmente.
Puedes ver artículos relacionados sobre KRBUACBypass en mi blog "Revisiting a UAC Bypass By Abusing Kerberos Tickets", incluyendo el principio de fondo y cómo está implementado. Como se dice en el artículo, este artículo fue inspirado por la charla de @tiraniddo "Taking Kerberos To The Next Level" (no lo habría hecho sin su compartir) y simplemente lo implementé como una herramienta antes de graduarme de la universidad.
No podemos generar manualmente un TGT ya que no tenemos ni tenemos acceso a las credenciales del usuario actual. Sin embargo, Benjamin Delpy (@gentilkiwi) en su Kekeo agregó un truco (tgtdeleg) que permite abusar de la delegación sin restricciones para obtener un TGT local con una clave de sesión.
Tgtdeleg abusa de la API GSS-API de Kerberos para obtener TGTs disponibles para el usuario actual sin obtener privilegios elevados en el host. Este método utiliza la función AcquireCredentialsHandle para obtener el manejador de credenciales de seguridad Kerberos para el usuario actual, y llama a la función InitializeSecurityContext para HOST/DC.domain.com usando el flag ISC_REQ_DELEGATE y el SPN objetivo para preparar el contexto de pseudo-delegación para enviar al controlador de dominio. Esto provoca que el KRB_AP-REQ en la salida de GSS-API incluya el KRB_CRED en el Authenticator Checksum. Luego, la clave de sesión del ticket de servicio se extrae del caché Kerberos local y se usa para descifrar el KRB_CRED en el Authenticator para obtener un TGT utilizable. El conjunto de herramientas Rubeus también incorpora esta técnica. Para más detalles, consulte “Rubeus – Now With More Kekeo”.
Con este TGT, podemos generar nuestro propio ticket de servicio, y el proceso de operación factible es el siguiente:
KERB-AD-RESTRICTION-ENTRY, pero completa un MachineID falso.Una vez que tengas un ticket de servicio, puedes usar la autenticación Kerberos para acceder a Named Pipes o TCP del Service Control Manager (SCM) a través del SPN HOST/HOSTNAME o RPC/HOSTNAME. Ten en cuenta que la API Win32 del SCM siempre usa autenticación Negotiate. James Forshaw creó un POC simple: SCMUACBypass.cpp, a través de dos APIs HOOK AcquireCredentialsHandle y InitializeSecurityContextW, el nombre del paquete de autenticación llamado por SCM (pszPack age ) a Kerberos para permitir que el SCM use Kerberos al autenticarse localmente.
Para más detalles lee:
Ahora echemos un vistazo al efecto en ejecución, como se muestra en la figura a continuación. Primero solicita un ticket para el servicio HOST del servidor actual a través de la función asktgs, y luego crea un servicio del sistema a través de krbscm para obtener el privilegio SYSTEM.
KRBUACBypass.exe asktgs
KRBUACBypass.exe krbscm
