Intel exchange formats STIX 2.1 bundles, MISP events, ATT&CK Navigator layers, TAXII 2.1 pushes — TLP-aware.

Why hand-rolled?

digger's exchange exporters are pure-Python, zero-dependency (other than requests for TAXII push). The exports are not large enough to justify pulling in stix2 or pymisp, and the hand-rolled paths let us guarantee that TLP markings, MITRE ATT&CK references, and digger-specific metadata are always preserved without fighting an upstream schema.

Source: digger/exchange/.

STIX 2.1 bundle

digger export stix --case-dir ./case-1 --tlp TLP:AMBER --out ./case.stix.json

Produces a JSON bundle containing:

STIX typeRole
identityOne identity SDO for digger itself
marking-definitionTLP marking referenced by every object
incidentOne incident SDO summarizing the case
indicatorOne per IOC extracted from medium+ findings — pattern in STIX 2.1 dialect
attack-patternOne per MITRE ATT&CK technique referenced
relationshipindicator indicates incident; incident uses attack-pattern

Compatible with OpenCTI, MISP (via stix2misp), Anomali, and any TAXII 2.1 receiver. IOC kinds mapped to STIX patterns:

sha256
[file:hashes.'SHA-256' = '…']
md5
[file:hashes.'MD5' = '…']
ipv4
[ipv4-addr:value = '…']
domain
[domain-name:value = '…']
url
[url:value = '…']
path
[file:name MATCHES '…']

MISP event

digger export misp --case-dir ./case-1 --tlp TLP:AMBER --out ./case.misp.json

One MISP event with attributes derived from IOCs and tags including the TLP marking and a MITRE ATT&CK galaxy tag per technique. Import via the MISP web UI's Events > List Events > Add Event from JSON or programmatically with PyMISP.

distribution
Defaults to 0 (your org only). Override before import via MISP.
threat_level_id
1 = high, 2 = medium (default), 3 = low, 4 = undefined.
analysis
0 initial, 1 ongoing (default), 2 complete.

MITRE ATT&CK Navigator layer

digger export attack-navigator --case-dir ./case-1 --out ./case.attack-navigator.json

Drop the resulting JSON into the ATT&CK Navigator via Open Existing Layer → Upload from Local. You get a tinted matrix showing every technique digger observed on this host, colored by severity (info → critical) on a green→yellow→red gradient.

TAXII 2.1 push

digger export taxii --case-dir ./case-1 \
       --base-url https://taxii.example.com \
       --api-root api1 \
       --collection 91a7e2-…-bundle \
       --token "$DIGGER_TAXII_TOKEN" \
       --tlp TLP:AMBER

Pushes the STIX 2.1 bundle to the named collection. Auth is HTTP Basic (--username + --password) or Bearer (--token). Server URL components follow the TAXII 2.1 spec exactly (discoveryapi-rootscollectionsobjects/).

TLP sharing filter

Each finding carries its own TLP (defaulting to the case-wide marking). Exporters propagate that marking into every produced object. Use a sharing TLP one or more steps stricter to filter:

digger export stix --case-dir ./case-1 --tlp TLP:GREEN
# only findings marked CLEAR or GREEN are included
# everything else is filtered out per FIRST.org TLP 2.0 semantics

Sigma rule loader

Sigma is a separate flow — input, not output — but it lives in digger/exchange/sigma.py. See Sigma rules.