Digamos que queremos acceder al Servidor de Aplicaciones(AS) desde la máquina cliente perteneciente al AD.
Nuestro Cliente envia una solicitud o marca de tiempo al KDC/DC (Centro de distribucion de claves) cuya marca de tiempo está encriptada y firmada con el hash ntlm de la contraseña del usuario. Esto es para afirmar que la solicitud en realidad proviene del usuario del que dice ser, por lo que, la marca de tiempo(timestap) se envía al kdc o al dc y se cifra con el hash ntlm de la contraseña del usuario.
El DC al final del paso 1, el controlador de dominio lo recibe y descifra el timestap encriptado, ¿cómo puede descifrarlo el controlador de dominio? Porque el controlador de dominio tiene acceso a todos los hashes en el dominio, el dc descifra la marca de tiempo encriptada, asegura que esta solicitud proviene realmente del usuario que dice ser, y luego responde con un TGT.
Ahora el TGT, que es un boleto se envía al cliente, este boleto está encriptado y firmado con el hash ntlm de una cuenta especial del controlador del dominio llamada krbtgt. Esta cuenta en particular se usa específicamente para este propósito, al final del paso 2, el cliente recibe el TGT y envía el TGT de regreso al DC porque el cliente no puede recoger el TGT dado que está encriptado con el hash NTLM o rc4 de la contraseña krbtgt que el cliente no tiene, solo el dc o los DC tendrán eso.
Paso 3, el cliente envia el TGT de vuelta ya que está encriptado y solicita un TGS para un servicio, un TGS es un boleto que otorga acceso a un servicio, para que el cliente devuelva o la máquina del cliente devuelva el tgt y solicite el tgs para el servidor de aplicaciones.
Al final del paso 3, el KDC recibe el TGT y lo descifra porque el KDC tiene el hash ntlm de la cuenta krbtgt para que descifre el tgt. Esta es la única validación que se realiza si el kdc puede descifrar el tgt, esta es la única validacion que se realiza si el kdc puede descifrar el tgt asume que todo lo que está escrito dentro del TGT es válido.
Una vez se descifra el TGT, el DC responde con el TGS, tenga en cuenta que el DC no tiene otra función que completar el certificado de acceso privilegiado. El DC no tiene otra función en la autorizacion aparte de poner el grupo de usuario en la parte posterior y la respuesta.
El paso 4 responde a los TGS, ahora puede ver que ninguna información importante cruza el cable sin cifrar. En el mismo caso para este paso, el TGS se envía de vuelta al cliente de DC que está encriptado usando el servicio de destino para que el cliente no pueda descifrarlo, solo el servidor de aplicaciones lo descifrará
En el fin del paso el cliente o el usuario se conecta al servidor de aplicaciones y presenta los TGS que recibio del DC al servicio, ahora, debido a que le TGS está cifrado con la cuenta de servicio de la aplicacion, puede descifrar los TGS. Este descifra los TGS y luego decide sobre los privilegios del usuario si el usuario puede acceder al servicio o no, y en caso afirmativo qué privilegios se pueden usar.
Puede que haya una solicitud de validacion adicional de paquete opcional(PAC) que no esté habilitado de forma predeterminada; de lo contrario, existe el riesgo de atacar el DC con estas solicitudes.
En el paso 3 cuando la máquina presentó un TGT encriptado al KDC ¿cuál fue la única validacion? La única validacion fue si el DC puede descifrar el TGT, eso significa que si podemos falsificar un TGT al comienzo del paso 3 y presentarle al DC, el DC considerará válido todo lo que escriba dentro y es por eso que podemos crear un boleto dorado para cuentas deshabilitadas o eliminadas porque la validación de la cuenta se lleva a cabo solo cuando la vida útil del tgt es más de 20 minutos
¿Qué es un boleto dorado?
Es un TGT válido, firmado y encriptado por el hash krbtgt, una vez mas, porque la validacion de la cuenta no la realiza el kdc hasta que TGT tiene más de 20 min, podemos usar incluso cuentas eliminadas o revocadas. Ahora, ese hash en particular se puede usar para suplantar a cualquier usuario con cualquier privilegio porque podemos escribir cualquier TGT aqui, la unica validacion es que, si el TGT se puede descifrar con el hash de la cuenta krbtgt.
Lo siguiente se ejecuta en una PS con privilegios de administrador.
Se deshabilita el Windows Defender:
Se carga el Mimikatz:
Y se ejecuta el siguiente comando para obtener una sesión de powershell con los privilegios de administrador de dominio:
Se genera un nuevo proceso con privilegios de dominio:
Ahora se quiere ejecutar Mimikatz en el Domain Controller para ello se crea una sesión y se carga la secuencia de comandos:
Obs: En este caso no se hace uso del parámetro -Computername dcorp-dc
Y ahora se cuenta con el hash NTLM del usuario krtgt:
Bypass AMSI
Antes se cargo la secuencia de comandos en la memoria del proceso de progreso de wsm en la CC pero AMSI aún lo detectaría. Por ello el uso del bypass:
Una vez se obtiene el hash de la cuenta KRBTGT se puede usar el siguiente comando para crear un boleto dorado:
Obs: La diferencia entre /ptt y /ticket es que el primero inyecta el ticket en el proceso actual de Powershell y el segundo necesita guardar el ticket en el escritorio. Una buena razón para usar /ptt es que las herramientas avanzadas de amenazas busca esos TGT's que se crearon y por lo que si lo purgamos una vez haya terminado nuestro trabajo, cualquier herramienta que busque la duración de nuestra vida útil de nuestro propio TGT(si se encuentra dentro) la política no nos detectará bien y además es más fácil exfiltrarlo.
Vamos a ejecutar este comando desde una consola powershell que no sea administrador
Esto nos dice que sería el Administrator que se suplantaría.
Y vemos que se tiene un TGT con derechos de administrador de dominio, lo que significa que podemos acceder a cualquier servicio en el dominio.
Debido a que tenemos un TGT como Administrator, podemos solicitar un TGS para el servicio cifs
que es un sistema de archivos en el DC.
Y también se puede extraer el Hash NTLM de la cuenta krbtgt.
Solución
Tenemos privilegios de administrador de dominio (volcar los hashes NTLM de svcadmin de dcorp-mgmt). Usemos el siguiente comando para volcar todos los hashes del controlador de dominio. Recuerde que los siguientes comandos deben ser ejecutados desde una sesión de PowerShell con privilegios de DA en su máquina 172.16.100.X
Crea una sesión remota e ingresa a dcorp-dc
:
Realiza bypass al AMSI en la máquina dcorp-dc
:
Ejecuta el script ubicado en .\Invoke-Mimikatz.ps1
en la sesión $sess(dcorp-dc)
y luego ingresa:
Ahora, en cualquier máquina, aunque no forme parte del dominio pero pueda alcanzar dcorp-dc a través de la red, podemos utilizar la información del comando anterior para crear un Golden Ticket.
Tenga en cuenta que la cuenta krbtgt puede ser modificada y el hash que obtenga en el laboratorio podría ser diferente al de este manual:
Obtiene el sistema de un ordenador remoto. El parámetro ComputerName especifica la dirección IP de un ordenador remoto. Por defecto, la cuenta de usuario actual debe ser miembro del grupo Administradores en el ordenador remoto