Consultas Personalizadas en BloodHound para Active Directory
Consultas Personalizadas en BloodHound para Active Directory
Nota importada desde Inbox durante consolidacion bulk.
Resumen
Guía exhaustiva de consultas Cypher personalizadas para BloodHound Community Edition, enfocada en pentesting de Active Directory. Cubre cinco categorías principales de consultas: objetos inactivos, membresías de grupos entre dominios, derechos de administrador local, usuarios protegidos y rutas a Tier Zero no etiquetado. Incluye un escenario de ataque completo donde se explotan privilegios de administrador local entre computadoras, falta de firma SMB y shadow credentials para comprometer la Certificate Authority. Todos los ejemplos están validados en un entorno de laboratorio basado en GOAD.
Comandos/Queries
Filtros de Actividad (Reutilizables)
Objetos inactivos (sin login en últimos 90 días):
u.lastlogon < (datetime().epochseconds - (90 * 86400)) AND
u.lastlogontimestamp < (datetime().epochseconds - (90 * 86400))
Objetos activos (login en últimos 30 días):
(c.lastlogon > (datetime().epochseconds - (30 * 86400)) OR
c.lastlogontimestamp > (datetime().epochseconds - (30 * 86400)))
Nota: Ambos atributos
lastlogonylastlogontimestampdeben usarse para obtener un timestamp preciso. Representan dos momentos diferentes: el último login en el DC consultado y el último login en otro DC (vía replicación).
Usuarios Inactivos (sin login en 90 días)
MATCH (u:User)
WHERE u.lastlogon < (datetime().epochseconds - (90 * 86400)) AND
u.lastlogontimestamp < (datetime().epochseconds - (90 * 86400)) AND
u.samaccountname <> 'krbtgt' AND
u.enabled = true
RETURN u
Computadoras Activas con OS No Soportado (login en 30 días)
MATCH (c:Computer)
WHERE c.operatingsystem =~ '(?i).*(2000|2003|2008|2012|xp|vista|7|8|me).*' AND
(c.lastlogon > (datetime().epochseconds - (30 * 86400)) OR
c.lastlogontimestamp > (datetime().epochseconds - (30 * 86400))) AND
c.enabled = true
RETURN c
Membresías de Grupos entre Dominios (Básica)
MATCH p=((u1:Group)-[r:MemberOf]->(u2:Group))
WHERE toLower(u1.domain) <> toLower(u2.domain)
RETURN p
Membresías de Grupos entre Dominios (Con domainsid, Mejorada)
MATCH p=((n)-[r:MemberOf*1..]->(m:Group))
WHERE n.domainsid <> m.domainsid
return p
Usa
domainsiden lugar dedomain namepara detectar membresías cruzadas incluso cuando no se han recopilado datos de ciertos dominios.
Derechos de Admin Local entre Computadoras
MATCH p=(m:Computer)-[:AdminTo]->(n:Computer)
RETURN p
Algunas soluciones como SCCM requieren esto. El site server tiene privilegios de admin local en los site systems (ref. Misconfiguration-Manager: ELEVATE-1).
Usuarios Tier Zero No Protegidos
MATCH (u1:User)-[:MemberOf*0..]->(g1:Group)
WHERE g1.objectid ENDS WITH '-525'
WITH COLLECT(u1) AS exclude1
MATCH (u:User)
WHERE u.system_tags = 'admin_tier_0' AND
NOT u IN exclude1
RETURN u
Sesiones Activas de Usuarios Tier Zero No Protegidos
MATCH (u1:User)-[:MemberOf*0..]->(g1:Group)
WHERE g1.objectid ENDS WITH '-525'
WITH COLLECT(u1) AS exclude1
MATCH (u:User)
WHERE u.system_tags = 'admin_tier_0' AND
NOT u IN exclude1
WITH COLLECT(u) AS targets
MATCH p=(n:User)<-[:HasSession]-(c:Computer)
WHERE n IN targets
RETURN p
Ruta Más Corta a CA desde Objetos No Tier Zero
MATCH p=shortestPath((n)-[:Owns|GenericAll|GenericWrite|WriteOwner|WriteDacl|
MemberOf|ForceChangePassword|AllExtendedRights|AddMember|Contains|GPLink|
AllowedToDelegate|AllowedToAct|AdminTo|CanPSRemote|CanRDP|ExecuteDCOM|
HasSIDHistory|AddSelf|DCSync|ReadLAPSPassword|ReadGMSAPassword|DumpSMSAPassword|
SQLAdmin|AddAllowedToAct|WriteSPN|AddKeyCredentialLink|SyncLAPSPassword|
WriteAccountRestrictions*1..]->(ca:EnterpriseCA))
WHERE (n.system_tags <> 'admin_tier_0' or n.system_tags IS NULL) and
n.objectid <> 'S-1-5-32' and
not n:OU and
not n:Container and
n <> ca
RETURN p
Ruta desde Objetos Comprometidos (owned) a CA
MATCH p=shortestPath((n {system_tags:'owned'})-[:Owns|GenericAll|GenericWrite|WriteOwner|WriteDacl|
MemberOf|ForceChangePassword|AllExtendedRights|AddMember|Contains|GPLink|
AllowedToDelegate|AllowedToAct|AdminTo|CanPSRemote|CanRDP|ExecuteDCOM|
HasSIDHistory|AddSelf|DCSync|ReadLAPSPassword|ReadGMSAPassword|DumpSMSAPassword|
SQLAdmin|AddAllowedToAct|WriteSPN|AddKeyCredentialLink|SyncLAPSPassword|
WriteAccountRestrictions*1..]->(ca:EnterpriseCA))
WHERE (n.system_tags <> 'admin_tier_0' or n.system_tags IS NULL) and
not n:OU and
not n:Container and
n <> ca
RETURN p
Ejemplos
Escenario de Ataque: Admin Local entre Computadoras
Contexto: Computer meereen (xx.xx.xx.62) tiene AdminTo sobre braavos (xx.xx.xx.64). Atacante en xx.xx.xx.65.
Requisito: SMB signing deshabilitado en braavos.
Pasos:
- Coerción de autenticación usando printerbug desde meereen
- Relay con ntlmrelayx hacia braavos para leer la base SAM
- Uso del hash de admin local para acceder al sistema y dumpear LSASS
- Obtención de hashes de usuarios de dominio para continuar el path a DA
Escenario de Ataque: Shadow Credentials a CA
Contexto: Usuario comprometido lord.varys@sevenkingdoms.local → miembro de grupo → miembro de grupo en otro dominio → privilegios altos sobre braavos (CA).
Pasos:
- Agregar shadow credentials al computer object braavos usando pywhisker
- Solicitar TGT y hash del computer account al DC
- Usar S4U2self para ganar privilegios de admin local
- Backup de la CA para obtener la clave privada
- Forjar certificados arbitrarios (incluyendo domain admin)
Tips
- Ejecutar SharpHound antes y después de obtener DA para tener dos perspectivas: vista de usuario normal y vista white-box con privilegios
- Filtros de objetos activos/inactivos pueden combinarse con cualquier query Cypher existente
- Para dominios grandes, agregar
LIMITa la consulta de rutas a Tier Zero - Para listas exportables, usar la API de BloodHound o neo4j directamente
- Las consultas de membresía cross-domain con
domainsidfuncionan incluso sin haber recopilado datos de todos los dominios - El grupo de usuarios protegidos (objectid termina en '-525') deshabilita autenticación NTLM y limita validez de tickets Kerberos
Referencias
- Fuente original: Custom BloodHound Queries for Active Directory - 8com Blog
- Autor: Robin Meier (8com), 28.01.2025
- Lab environment: GOAD - Orange Cyberdefense
- Herramientas referenciadas: