-
Notifications
You must be signed in to change notification settings - Fork 2
BloodHound Integration
Weylon Solis edited this page Mar 18, 2026
·
1 revision
ForceHound outputs OpenGraph v1 JSON that BloodHound Community Edition can ingest directly.
# Collect and upload in one step
forcehound --collector api \
--instance-url https://myorg.my.salesforce.com \
--username admin@myorg.com --password 'P@ss' --security-token ABC \
--upload --bh-token-id UUID --bh-token-key BASE64KEY \
-o output.json
# Or upload a previously collected file
forcehound --setup --bh-token-id UUID --bh-token-key BASE64KEY
# Then use BloodHound CE's File Ingest UI to upload output.jsonForceHound uses Salesforce-specific node kinds (SF_User, SF_Profile, etc.) that aren't built into BloodHound. Register them first:
forcehound --setup --bh-url http://localhost:8080 \
--bh-token-id UUID --bh-token-key BASE64KEYThis sets custom icons and colors in the BH UI. Only needs to be done once per BH instance.
forcehound ... --upload --clear-db --wait 60 \
--bh-token-id UUID --bh-token-key BASE64KEYThe --wait flag controls how long to wait after sending the clear request (BH clears asynchronously). Default is 60 seconds — increase if you see canceled ingestion jobs.
After ingestion, query the graph in BloodHound's Cypher console:
MATCH p=(u:SF_User)-[:HasProfile|HasPermissionSet*1..2]->(ps)-[:ModifyAllData]->(org:SF_Organization)
RETURN pMATCH p=(u:SF_User)-[:HasProfile|HasPermissionSet*1..2]->(ps)-[:CanRead|CanCreate|CanEdit|CanDelete]->(o:SF_Object {name: "ACCOUNT"})
RETURN pMATCH p=(ps)-[:CanAccessApp]->(ca:SF_ConnectedApp)
RETURN pMATCH p=(r1:SF_Role)-[:ReportsTo*1..5]->(r2:SF_Role)
RETURN pMATCH (o:SF_Object)
WHERE o.InternalSharingModel = "Private"
WITH o
MATCH p=(ps)-[:CanRead]->(o)
RETURN o.name, count(ps) AS readers
ORDER BY readers DESC-
Auth: HMAC-SHA256 signature (
bhesignaturescheme), not Bearer tokens -
Cypher endpoint:
POST /api/v2/graphs/cypherwith{"query": "...", "include_properties": true} - 404 = empty result: Non-mutation queries that match zero results return 404, not an empty 200
-
Uppercase properties: BH uppercases all string property values during ingestion — query with
"ACCOUNT"not"Account" -
Ingestion is async: Upload starts a background job. Poll
GET /api/v2/file-uploaduntil status = 2 (Complete) - Large graphs: 3500+ nodes / 145k+ edges can take 60-90 seconds to ingest