Panorama#

El reconocimiento de Active Directory (AD) no busca vulnerabilidades: busca relaciones. A diferencia de un escaneo de red clásico, que enumera puertos y versiones para encontrar un servicio explotable, el recon de un dominio reconstruye el grafo de identidad — quién es administrador de qué, quién tiene sesión iniciada dónde, qué dominio confía en qué otro — porque en AD el camino hacia el control total casi nunca es un exploit de software, sino una cadena de permisos legítimos mal configurados. Una sola cuenta de usuario sin privilegios, con la relación correcta a su favor, puede llegar a Domain Admin en un salto, sin desbordar ningún búfer ni disparar ninguna alerta de antivirus. Mapear esas relaciones es, por lo tanto, la fase que define todas las rutas posteriores: la enumeración no explota nada, pero decide qué se va a explotar.

Ese cambio de mentalidad —de “encontrar el bug” a “encontrar la arista”— es lo que hace del recon de AD una disciplina propia. El dominio se modela como un grafo dirigido donde cada nodo es un objeto (usuario, equipo, grupo, GPO, unidad organizativa) y cada arista es un permiso que puede abusarse (MemberOf, AdminTo, GenericAll, HasSession, CanRDP). Una arista peligrosa aislada es un hallazgo; el grafo entero es la historia del ataque. Este capítulo cubre las tres herramientas con las que se levanta ese grafo, la técnica de user hunting que lo convierte en una ruta hacia el administrador, y el catálogo de primitivas de abuso que el recon deja identificadas para las fases siguientes —el abuso de Kerberos de 4.2 · Kerberos, el credential dumping de 4.5 · Credential dumping y el abuso de delegación y ACLs de 4.6 y 4.7. El recon externo previo —descubrir la superficie del dominio desde Internet, antes de tener siquiera una cuenta— vive en 2.5 · Recon ofensivo.

flowchart TD
  A["Cuenta de dominio\n(sin privilegios)"] --> B["Colección del grafo"]
  B -->|"SharpHound / bloodhound-python"| C["BloodHound\n(Neo4j)"]
  B -->|"Get-Net* / Get-Domain*"| D["PowerView\n(potente, ruidoso)"]
  B -->|"Get-AD* (API firmadas)"| E["AD Module\n(sigiloso)"]
  C --> F["Análisis del grafo:\naristas a Tier Zero"]
  D --> F
  E --> F
  F --> G["User hunting:\ndónde tiene sesión un DA"]
  F --> H["Catálogo de aristas abusables"]
  H -->|"SPN + RC4"| I["Kerberoasting (ver 4.2)"]
  H -->|"GetChanges + GetChangesAll"| J["DCSync (ver 4.5)"]
  H -->|"GenericAll / WriteDacl"| K["Abuso de ACL (ver 4.7)"]
  H -->|"Constrained / RBCD"| L["Delegación (ver 4.6)"]
  G --> M["Robo de token → DA"]

El grafo: BloodHound y sus colectores#

BloodHound es la herramienta que materializó el modelo de grafo y redefinió el recon de AD. Ingiere los datos crudos del dominio en una base Neo4j y los presenta como un grafo navegable donde la consulta central —"¿cuál es el camino más corto desde esta cuenta que controlo hasta Domain Admins?"— se resuelve con un clic. El grafo se alimenta de un colector que barre el directorio; cuál se use depende del entorno: SharpHound para AD local (el caso clásico), AzureHound para Entra ID (el antiguo Azure AD), y RustHound como alternativa a SharpHound, más rápida y a veces menos detectable. Desde Linux, sin tocar una máquina Windows, bloodhound-python cumple el mismo rol contra el controlador de dominio por LDAP.

# Recolección remota desde Linux (bloodhound-python) bloodhound-python -u usuario -p 'contraseña' -d corp.local -dc dc1.corp.local -c All -ns <IP-DC> # BloodHound Community Edition — levantar el grafo (Docker) docker run -p7474:7474 -p7687:7687 -e NEO4J_AUTH=neo4j/bloodhound neo4j

El colector produce un conjunto de archivos JSON (comprimidos en un .zip) que se importan al grafo. El valor del recon no está en la recolección en sí, sino en las consultas que se corren sobre el resultado: además de las incluidas, la comunidad mantiene colecciones de custom queries (de @hausec, CompassSecurity, Exegol, Certipy) que se cargan reemplazando customqueries.json en ~/.config/bloodhound/ (Linux) o %AppData%\Roaming\BloodHound\ (Windows). Esas consultas encapsulan patrones de abuso conocidos —“cuentas kerberoastables con ruta a Tier Zero”, “equipos con delegación sin restringir”— y convierten el grafo en un catálogo priorizado de rutas de ataque.

La gravedad de un hallazgo se mide en saltos hasta Tier Zero: cuántas aristas hay que recorrer desde la cuenta controlada hasta un objeto que controla la identidad del dominio. Una arista GenericAll directa sobre el grupo Domain Admins es un salto; una ruta que pasa por una GPO mal permisada puede ser cuatro o cinco. La priorización del ataque es, punto por punto, la priorización de la remediación: mismas aristas críticas.

Enumeración manual: PowerView y el AD Module#

BloodHound da el panorama; la enumeración manual da el detalle y el control fino. PowerView es el catálogo de cmdlets de PowerShell (Get-Net*, Get-Domain*) que enumera cada clase de objeto del dominio sin depender del módulo oficial de Microsoft. Un barrido típico recorre, en orden de generalidad decreciente, el dominio y su política, los controladores, los usuarios, los equipos, los grupos, los shares, las GPO, las OU, las ACL y los trusts — sin explotar nada, pero definiendo toda la superficie posterior.

# Dominio, SID y política Kerberos Get-NetDomain ; Get-DomainSID (Get-DomainPolicy)."kerberos policy" # Secretos en descripciones (un clásico: contraseñas en el campo Description) Find-UserField -SearchField Description -SearchTerm "pass" # Sesiones activas y shares accesibles con la cuenta actual Get-NetSession -ComputerName <equipo> Find-DomainShare -CheckShareAccess # ACE interesantes y trusts Invoke-ACLScanner -ResolveGUIDs Get-NetDomainTrust ; Get-NetForestTrust

El AD Module oficial de Microsoft (Get-AD*) cubre buena parte del mismo terreno, pero con una diferencia que es táctica antes que funcional: usa API firmadas por Microsoft y se camufla mejor con la actividad administrativa legítima, mientras que PowerView a veces dispara consultas LDAP con una firma más reconocible. La elección de herramienta es también una decisión de evasión: cuando el sigilo importa más que la exhaustividad, Get-ADUser -Filter * -Properties *, Get-ADComputer, Get-ADTrust y sus pares son la opción preferible. Para ubicar los controladores de dominio sin depender de ninguna de las dos, bastan utilidades nativas: nltest /dclist:<dominio>, nslookup -type=srv _ldap._tcp.dc._msdcs.<dominio> o la variable de entorno $Env:LOGONSERVER.

User hunting: del grafo a la ruta hacia Domain Admin#

El recon culmina en una pregunta operativa concreta: ¿en qué máquina hay un Domain Admin con sesión iniciada y, a la vez, tengo yo derechos de administrador local? Esa intersección es el user hunting, y es la ruta canónica desde una cuenta común hasta el control del dominio. Si en una máquina donde soy administrador local un DA tiene una sesión activa, su token de acceso reside en memoria y puede robarse e impersonarse — sin craquear ninguna contraseña. PowerView resuelve las dos mitades de la pregunta: primero las máquinas donde tengo acceso, después dónde está el objetivo.

# Máquinas donde la cuenta actual es admin local Find-LocalAdminAccess -Verbose # Máquinas donde un usuario objetivo (p. ej. un DA) tiene sesión Invoke-UserHunter -CheckAccess # marca dónde además tengo acceso Invoke-UserHunter -Stealth # menos consultas, menos ruido

El robo del token y la impersonación posterior son ya movimiento lateral, y se detallan en 4.8 · Movimiento lateral. Lo que importa aquí es que el user hunting transforma el grafo estático en una ruta accionable: no “quién es admin de qué” en abstracto, sino “en esta máquina concreta, ahora mismo, hay un token de DA esperando”.

El catálogo de aristas: qué deja identificado el recon#

La mayoría de las rutas a Domain Admin no son exploits sino misconfiguraciones de ACL — pequeños permisos excesivos que se encadenan. Por eso el grafo importa más que cualquier CVE. El recon deja identificadas las aristas abusables, cada una de las cuales es el punto de entrada a una técnica desarrollada en otro capítulo. El catálogo de primitivas que BloodHound resalta sobre un dominio real se agrupa en cuatro familias:

  • Primitivas de Kerberos. Cuentas con un SPN registrado son kerberoastables (se les puede pedir un Service Ticket y craquearlo offline); cuentas con la pre-autenticación deshabilitada son vulnerables a AS-REP Roasting. El grafo las marca directamente; su abuso está en 4.2 · Kerberos.
  • Derechos de replicación. Una cuenta común que posea a la vez GetChanges y GetChangesAll sobre el objeto de dominio puede ejecutar un DCSync y volcar todos los hashes del directorio, incluido el de krbtgt, sin ser controlador de dominio. La combinación exacta de esos dos derechos es la firma del hallazgo; la técnica está en 4.5 · Credential dumping.
  • Abuso de ACL. GenericAll, WriteDacl, WriteOwner, AddSelf y ForceChangePassword son rutas distintas hacia el mismo fin —el control del objeto— y por eso son intercambiables: sobre un grupo, cualquiera de ellas habilita agregarse (AddMember); sobre un equipo, AllExtendedRights incluye leer su contraseña LAPS de administrador local. Casos límite: escribir en msDS-KeyCredentialLink de un objetivo son Shadow Credentials (autenticación por PKINIT y extracción del hash), y GenericAll sobre AdminSDHolder es un backdoor auto-reparable, porque el proceso SDProp propaga su DACL a todas las cuentas protegidas cada 60 minutos. Todo esto se abusa en 4.7 · ACLs y persistencia.
  • Delegación. Los tres tipos —constrained (impersonar a un servicio si el principal es craqueable), unconstrained (un host no-DC que cachea el TGT de todo el que se autentica es un objetivo de primer orden) y RBCD (el objetivo guarda quién puede delegar en msDS-AllowedToActOnBehalfOfOtherIdentity, de modo que una entrada pre-sembrada ahí es un backdoor listo)— convierten un compromiso lateral en impersonación del administrador. Se desarrollan en 4.6 · Delegación y trusts.

El objetivo final del análisis del grafo es caracterizar el Tier Zero: el conjunto de objetos que controlan la identidad del dominio (los Domain Admins, los controladores de dominio, krbtgt, AdminSDHolder). Todo lo demás es un medio para alcanzarlo; comprometer cualquier objeto de Tier Zero es comprometer el dominio entero.

Defensa y detección#

El recon de AD es, de todo el ciclo de ataque, una de las fases más difíciles de detectar en tiempo real, porque en su mayor parte consiste en consultas LDAP legítimas que cualquier cuenta autenticada tiene derecho a hacer. La defensa combina, por eso, dos planos: la detección de la anomalía en runtime y —más determinante— la corrección de postura del grafo.

  • Volumen de consultas LDAP por cuenta. La firma de SharpHound o de un barrido de PowerView es un único principal que consulta masivamente usuarios, grupos, ACL y trusts en poco tiempo. Un usuario común no enumera todo el directorio; monitorear el volumen de consultas LDAP por cuenta y, en particular, las lecturas en bloque del atributo servicePrincipalName (el precursor del Kerberoasting) es la base de la detección.
  • Auditoría de acceso a objetos del directorio (Event ID 4662). Con la auditoría fina activada, las lecturas de derechos de replicación y el acceso a objetos sensibles quedan registrados; un 4662 sobre el objeto de dominio desde una cuenta que no es un DC es especialmente sospechoso (precede al DCSync).
  • Honey objects. Sembrar una cuenta señuelo con un SPN atractivo y sin uso legítimo, y alertar sobre cualquier Service Ticket pedido para ella (Event ID 4769 hacia ese SPN), convierte el Kerberoasting en una alarma de alta fidelidad: nadie legítimo pide nunca ese ticket.
  • Defensa de postura: correr BloodHound uno mismo. Como casi todas las primitivas del catálogo son abusos de permisos legítimos que dejan poca o ninguna telemetría en el momento del abuso, la defensa más eficaz es preventiva: ejecutar BloodHound desde el lado defensor, identificar las aristas críticas a Tier Zero y eliminarlas — quitar GetChanges/GetChangesAll de toda cuenta que no sea DC, revocar GenericAll sobre AdminSDHolder y sobre Domain Admins, corregir los permisos sobre GPO enlazadas al dominio. La misma arista que rankea el ataque rankea la remediación.

El endurecimiento estructural completa la postura: aplicar el principio de mínimo privilegio sobre las ACL, fijar MachineAccountQuota = 0 para que un usuario común no pueda crear cuentas de máquina, y tratar todo controlador de dominio como Tier 0. El mapeo defensivo consolidado de toda la superficie de Active Directory, con las reglas SIEM y los playbooks de respuesta, se desarrolla en 4.9 · Defensa de AD.

Referencias#