Operate BloodHound Community Edition v9.2.2 via Decepticon's bhce_* tools — health check, Cypher passthrough, SharpHound ZIP ingest. Replaces the in-house ingest + ESC* post-process pipeline per ADR-0005.
60
72%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Critical
Do not install without reviewing
Fix and improve this skill with Tessl
tessl review fix ./packages/decepticon/decepticon/skills/standard/ad/bloodhound-bhce/SKILL.mdbhce_* ToolsDecepticon ships a sidecar BloodHound Community Edition v9.2.2 stack
(see docs/adr/0005-bloodhound-via-bhce-rest-client.md). Three
@tool wrappers expose it to the agent:
| tool | what it does |
|---|---|
bhce_status | Confirm BHCE is healthy and our HMAC token authenticates. Always call this first when an AD task starts. |
bhce_cypher | Run any Cypher query against BHCE's graph. Mutations are off by default. |
bhce_ingest_zip | Push a SharpHound .zip into BHCE — 3-step file-upload flow + polling until BHCE finishes parse + ESC* analysis. |
Use these instead of the legacy bh_ingest_zip / dcsync_check /
delegation_audit / gpo_audit / adcs_audit family — those are
the in-house port and are being retired per ADR-0005.
BHCE's PostProcessedRelationships Go pipeline emits every edge a
red-team operator expects: ADCSESC1-13, GoldenCert, DCSync,
TrustedForNTAuth, IssuedSignedBy, CoerceAndRelayNTLMTo*,
HasSIDHistory, HasTrustKeys, SyncLAPSPassword, … The list is in
graphschema/ad/ad.go::PostProcessedRelationships() in the BHCE
source. We deliberately do not re-implement these in our
codebase; the agent leans on BHCE's analyzer instead.
The Decepticon KGStore still owns web, cloud, and smart-contract findings, and stays canonical for cross-domain chain planning. BHCE is the AD layer.
Health check — bhce_status(). Verify version.data.server_version matches the deployed v9.2.2 and self.data.principal_name is non-empty. If the diagnostic mentions BHCE_URL / BHCE_TOKEN_*, the sidecar is offline or the token has been revoked — stop and report.
Ingest — for every SharpHound collection drop:
bhce_ingest_zip(path="/abs/path/to/20260605_lab.zip")Expected result envelope: {job_id, terminal_status, last_payload, elapsed_seconds}. terminal_status must be one of
Complete, PartiallyComplete, Failed, Cancelled. Anything else
(an error field, missing terminal_status) means BHCE never closed
the job — surface the error to the operator rather than continuing
with stale data.
Walk the graph with bhce_cypher. Some battle-tested starting
queries (BHCE node labels — User, Computer, Group, Domain,
GPO, OU, CertTemplate, EnterpriseCA, RootCA, AIACA,
NTAuthStore, IssuancePolicy):
All Domain Admins (sanity check that ingest landed):
MATCH (g:Group)
WHERE g.objectid ENDS WITH '-512'
MATCH (n)-[:MemberOf*1..]->(g)
RETURN n.name, labels(n)Shortest path from a foothold to a Tier-Zero asset:
MATCH p = shortestPath(
(n {objectid: $foothold_sid})-[*1..15]->(t {system_tags: 'admin_tier_0'})
)
RETURN pADCS escalation paths (BHCE post-processes ESC* edges, so the agent never has to derive them):
MATCH p = (u {objectid: $foothold_sid})
-[:MemberOf|ADCSESC1|ADCSESC3|ADCSESC4|ADCSESC6a|ADCSESC6b|
ADCSESC9a|ADCSESC9b|ADCSESC10a|ADCSESC10b|ADCSESC13|
Enroll|AutoEnroll|GenericAll*1..10]->
(t:Domain)
RETURN p LIMIT 10GoldenCert opportunities (CA + NTAuthStore + Domain triangle):
MATCH (ca:EnterpriseCA)-[:TrustedForNTAuth]->(:NTAuthStore)
MATCH (ca)-[:GoldenCert]->(d:Domain)
RETURN ca.name, d.nameDCSync candidates:
MATCH (n)-[:DCSync]->(d:Domain)
RETURN n.name, labels(n), d.nameCross-domain plays — when an AD path terminates and the chain needs to cross into the Decepticon KGStore (web exploitation, cloud pivots, smart-contract findings), hand the BHCE finding off to the chain planner. Do not try to write web/cloud nodes into BHCE; BHCE is AD-only.
bhce_status returns a BHCE_URL diagnostic — the sidecar
isn't running (docker compose up -d bhce-neo4j bhce) or the
agent's environment is missing BHCE_TOKEN_ID / BHCE_TOKEN_KEY.bhce_cypher returns 401 signature digest mismatch — clock
skew. BHCE enforces ±1 hour (cmd/api/src/api/auth.go:276-296).
Check the container time before opening a wider investigation.bhce_ingest_zip reports terminal_status: Failed — the ZIP
is corrupt or BHCE rejected an unknown JSON schema version
(meta.version). Look in last_payload for the BHCE-side reason.terminal_status (the tool already
polls until terminal) rather than re-running cypher in a busy loop.github.com/SpecterOps/BloodHound (current
release v9.2.2, 2026-06-01). This is the single source of truth
for every edge, post-process algorithm, and Cypher passthrough
guard. When the upstream changes the schema, the agent's queries
here have to follow.packages/go/openapi/src/openapi.yaml in the BHCE repo, also
reachable at runtime via GET /api/v2/spec on the sidecar.docs/adr/0005-bloodhound-via-bhce-rest-client.md — why
the agent talks to a sidecar BHCE instead of using the in-house
port that PRs #560..#578 built.5e34a6d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.