Skip to main content
Applies to BloodHound Enterprise only This document provides technical design details and API reference information for the BloodHound Enterprise integration with Cortex XSOAR. For configuration instructions, see Configure the integration.

Integration type

The SpecterOps BloodHound Enterprise integration is a vulnerability management integration that enables automated retrieval of attack path findings from BloodHound Enterprise into Cortex XSOAR. This streamlines incident creation and investigation for Active Directory and Microsoft Azure environments.

Use cases

  • Automatically fetch new attack paths from BloodHound Enterprise
  • Create incidents in XSOAR for each detected attack path
  • Filter incidents by domain and finding type
  • Track attack paths with granular timestamp-based deduplication
  • Retrieve detailed information about Active Directory and Azure assets
  • Enrich incident data with asset details including object IDs, names, and properties
  • Support for both directory types (User, Computer, Group, Container, Domain, GPO, etc.) and Azure types (AZApp, AZGroup, AZUser, AZRole, AZTenant, AZServicePrincipal, etc.)
  • Check if attack paths exist between two principals in the environment
  • Search for objects by name to retrieve their object IDs
  • Analyze relationships between principals and assets
  • Support for multiple Active Directory domains
  • Filter by specific domains or finding types
  • Track attack paths per domain and finding type combination

Authentication

The integration uses HMAC-based signature authentication with the following process:
  1. Generate HMAC signature using SHA-256 with the token key
  2. Include token ID, request date, and signature in request headers
  3. Format: Authorization: bhesignature {token_id}
  4. Include RequestDate header in ISO format
  5. Include Signature header as base64-encoded HMAC digest

Configuration parameters

ParameterDisplay NameTypeRequiredDescription
urlServer URLStringYesThe BloodHound Enterprise server URL (e.g., bhe.example.com or https://bhe.example.com)
token_idToken IDStringYesThe API token ID for authentication
token_keyToken KeyPasswordYesThe API token key for HMAC signature authentication
finding_domainSelected EnvironmentsStringNoComma-separated list of domain names to monitor, or “all” for all domains. Default: “all”
finding_categorySelected Finding TypesStringNoComma-separated list of finding types to monitor, or “all” for all types. Default: “all”
incidentFetchIntervalIncident Fetch Interval (minutes)NumberNoThe interval in minutes between incident fetches. Default: 10 minutes
isFetchFetch incidentsBooleanNoEnable automatic incident fetching. Default: false
proxy_urlCustom Proxy URLStringNoCustom proxy server URL (optional)
proxy_usernameProxy UsernameStringNoUsername for proxy authentication (if required)
proxy_passwordProxy PasswordPasswordNoPassword for proxy authentication (if required)
insecureTrust any certificate (not secure)BooleanNoSkip SSL certificate verification. Default: false
proxyUse system proxy settingsBooleanNoUse system proxy settings. Default: false

Commands and outputs

test-module

Tests the connection to the BloodHound Enterprise API. Arguments: None Context outputs: None Human-readable output:
  • Success: “ok”
  • Failure: Error message indicating the specific failure reason (Unauthorized, Bad Request, Forbidden, Server Error, DNS resolution error, etc.)

bhe-get-object-id

Retrieves object IDs for one or more objects by their names. Arguments:
ArgumentTypeDescriptionRequired
object_namesStringComma-separated list of object names to search forYes
Context outputs:
PathTypeDescription
SpecterOpsBHE.Object.NameStringThe object name that was searched
SpecterOpsBHE.Object.StatusStringStatus of the search (“success” or “error”)
SpecterOpsBHE.Object.MessageStringStatus message
SpecterOpsBHE.Object.DataArrayArray of matching objects with id, name, and type
Human-readable output: Object ID Search Results
Object NameStatusObject IDType
[email protected]successS-1-5-21-…User
COMPUTER01successS-1-5-21-…Computer

bhe-fetch-asset-info

Retrieves detailed information about one or more assets by their object IDs. Arguments:
ArgumentTypeDescriptionRequired
object_idsStringComma-separated list of object IDs to fetch information forYes
Context outputs:
PathTypeDescription
SpecterOpsBHE.Asset.ObjectIdStringThe object ID
SpecterOpsBHE.Asset.NameStringAsset name
SpecterOpsBHE.Asset.TypeStringAsset type (User, Computer, AZUser, AZApp, etc.)
SpecterOpsBHE.Asset.StatusStringStatus of the fetch operation
SpecterOpsBHE.Asset.DataObjectComplete asset data including properties and related entity counts
Human-readable output: Asset Information
Object IDNameTypeStatus
S-1-5-21-…[email protected]Usersuccess
For Azure objects, the response includes additional related entity counts such as group membership counts, role assignments, inbound/outbound control counts, and abusable app role assignments (for service principals).

bhe-does-path-exist

Checks if an attack path exists between two principals in the BloodHound Enterprise graph. Arguments:
ArgumentTypeDescriptionRequired
FromPrincipalStringObject ID of the source principalYes
ToPrincipalStringObject ID of the target principalYes
Context outputs:
PathTypeDescription
SpecterOpsBHE.Path.ExistsBooleanWhether a path exists between the principals
SpecterOpsBHE.Path.FromPrincipalStringSource principal object ID
SpecterOpsBHE.Path.ToPrincipalStringTarget principal object ID
SpecterOpsBHE.Path.StatusStringStatus of the path check operation
Human-readable output: Path Existence Check
From PrincipalTo PrincipalPath ExistsStatus
S-1-5-21-…S-1-5-21-…truesuccess

fetch-incidents

Fetches attack path findings from BloodHound Enterprise and creates incidents in XSOAR (automatically executed when isFetch is enabled). Arguments: None Context outputs:
PathTypeDescription
SpecterOpsBHE.Incident.NameStringIncident name (format: {INSTANCE} - {DOMAIN} - {PATH_TITLE})
SpecterOpsBHE.Incident.TypeStringIncident type: “SpecterOpsBHE Attack Path”
SpecterOpsBHE.Incident.SeverityNumberSeverity level (1=Low, 2=Medium, 3=High, 4=Critical)
SpecterOpsBHE.Incident.AttackIdStringUnique attack path ID
SpecterOpsBHE.Incident.DomainStringDomain name where the attack path was detected
SpecterOpsBHE.Incident.PathTitleStringHuman-readable title of the attack path
SpecterOpsBHE.Incident.FindingTypeStringFinding type identifier
SpecterOpsBHE.Incident.ImpactPercentageNumberImpact percentage (0-100)
SpecterOpsBHE.Incident.ImpactCountNumberNumber of impacted principals
SpecterOpsBHE.Incident.ExposurePercentageNumberExposure percentage (0-100)
SpecterOpsBHE.Incident.ExposureCountNumberNumber of exposed principals
SpecterOpsBHE.Incident.ImpactedPrincipalStringObject ID of the impacted principal
SpecterOpsBHE.Incident.ImpactedPrincipalNameStringName of the impacted principal
SpecterOpsBHE.Incident.ImpactedPrincipalKindStringType of the impacted principal
SpecterOpsBHE.Incident.ImpactedPrincipalObjectIdStringObject ID of the impacted principal
SpecterOpsBHE.Incident.NonTierZeroPrincipalStringObject ID of the non-tier-zero principal (if applicable)
SpecterOpsBHE.Incident.NonTierZeroPrincipalNameStringName of the non-tier-zero principal (if applicable)
SpecterOpsBHE.Incident.ObjectIdsStringComma-separated list of object IDs involved
SpecterOpsBHE.Incident.ObjectNamesStringComma-separated list of object names involved
SpecterOpsBHE.Incident.ShortDescriptionStringShort description of the attack path
SpecterOpsBHE.Incident.ShortRemediationStringShort remediation guidance
SpecterOpsBHE.Incident.LongRemediationStringDetailed remediation guidance
SpecterOpsBHE.Incident.CreatedAtStringTimestamp when the attack path was created
SpecterOpsBHE.Incident.UpdatedAtStringTimestamp when the attack path was last updated
SpecterOpsBHE.Incident.AcceptedBooleanWhether the attack path has been accepted
SpecterOpsBHE.Incident.AcceptedUntilStringDate until which the attack path is accepted (if applicable)
Fetch logic:
  1. Lock Mechanism: Uses integration context to prevent concurrent fetch operations
  2. Domain Filtering: Fetches available domains and filters by finding_domain parameter
  3. Finding Type Collection: Collects available finding types for each domain
  4. Finding Type Filtering: Filters finding types by finding_category parameter
  5. Path Metadata Fetching: Retrieves titles, descriptions, and remediation guidance for each finding type
  6. Incremental Fetching: Uses timestamp-based filtering to only fetch new attack paths since last run
  7. Granular Tracking: Tracks timestamps per {domain_name}:{finding_type} combination for precise deduplication
  8. Pagination: Handles pagination for large result sets (up to 1000 results per page)
  9. Incident Creation: Creates one incident per attack path with all relevant metadata

API endpoints

The integration uses the following BloodHound Enterprise API v2 endpoints:
EndpointPathDescription
available_domain/api/v2/available-domainsGet list of available domains
search/api/v2/search?q={query}Search for objects by name
dictionary_types/api/v2/{obj_type}s/{object_id}Get directory object details

Supported object types

Active Directory types

  • User
  • Computer
  • Group
  • Container
  • Domain
  • GPO (Group Policy Object)
  • Aiaca
  • Rootca
  • Enterpriseca
  • Ntauthstore
  • Certtemplate
  • OU (Organizational Unit)

Azure types

  • AZApp (Azure Application)
  • AZGroup (Azure Group)
  • AZUser (Azure User)
  • AZRole (Azure Role)
  • AZTenant (Azure Tenant)
  • AZServicePrincipal (Azure Service Principal)
  • AZAutomationAccount (Azure Automation Account)

Error handling

The integration implements comprehensive error handling with specific exception types:
Exception TypeHTTP StatusDescription
BloodHoundBadRequestException400Invalid request parameters
BloodHoundUnauthorizedException401Authentication failure
BloodHoundForbiddenException403Insufficient permissions
BloodHoundNotFoundException404Resource not found
BloodHoundRateLimitException429Rate limit exceeded
BloodHoundServerErrorException500+Server errors

Retry logic

  • Automatic retry for rate limit (429) and server errors (500, 502, 503, 504)
  • Maximum of 3 retry attempts
  • Immediate retry without exponential backoff

Memory limitation handling

  • Gracefully handles memory limitation errors for large queries (especially for AZTenant)
  • Returns appropriate error messages when memory limits are encountered
  • Sets related entity counts to 0 when memory limitations occur