Skip to main content
implementing-security-information-sharing-with-stix2 Create, validate, and share STIX 2.1 threat intelligence objects (indicators, malware, campaigns, relationships, bundles) using the stix2 Python library, and publish them over TAXII 2.1. Use when building or exchanging structured threat intelligence, modeling relationships between threat objects, or publishing/consuming a TAXII 2.1 feed.
インストールへ移動 Skills Marketplace コミュニティが作成したAIスキルを発見・探索
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/mukul975/Anthropic-Cybersecurity-Skills --skill implementing-security-information-sharing-with-stix2コマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
Zipをダウンロード ダウンロード中... このリポジトリの他の Skills abusing-dpapi-for-credential-access Extract and decrypt Windows DPAPI-protected secrets (Credential Manager, browser logins/cookies, Wi-Fi credentials, KeePass keys) online or offline using SharpDPAPI, SharpChrome, Mimikatz, or Impacket's dpapi.py, including domain-wide decryption via the DPAPI backup key. Use during authorized red-team credential-access engagements after gaining a foothold or when triaging DPAPI blobs pulled from a host.
abusing-shadow-credentials-for-privesc Take over Active Directory accounts by writing attacker-controlled public keys to msDS-KeyCredentialLink (Shadow Credentials) with pyWhisker, Whisker, or Certipy, then authenticate via PKINIT to recover the target's NT hash without a password reset. Use when BloodHound shows GenericWrite/GenericAll/AddKeyCredentialLink over a target, as a stealthier alternative to ForceChangePassword, during authorized red-team engagements.
acquiring-disk-image-with-dd-and-dcfldd Create forensically sound bit-for-bit disk images with dd or dcfldd on a Linux forensic workstation, preserving evidence integrity through hash verification (MD5/SHA) during acquisition. Use when imaging a suspect drive, USB device, or memory card for investigation, preserving volatile disk evidence during incident response, or producing a verified copy for legal or law-enforcement proceedings before any destructive analysis.
name implementing-security-information-sharing-with-stix2 description Create, validate, and share STIX 2.1 threat intelligence objects (indicators, malware, campaigns, relationships, bundles) using the stix2 Python library, and publish them over TAXII 2.1. Use when building or exchanging structured threat intelligence, modeling relationships between threat objects, or publishing/consuming a TAXII 2.1 feed.
domain cybersecurity subdomain threat-intelligence tags ["stix","taxii","threat-sharing","intelligence-exchange"] version 1.0 author mahipal license Apache-2.0 d3fend_techniques ["File Metadata Consistency Validation","Application Protocol Command Analysis","Identifier Analysis","Content Format Conversion","Message Analysis"] nist_csf ["ID.RA-01","ID.RA-05","DE.CM-01","DE.AE-02"] mitre_attack ["T1591","T1592","T1593","T1589","T1027"]
Implementing Security Information Sharing with STIX 2.1
Build and share structured threat intelligence using STIX 2.1 objects
with the stix2 Python library and TAXII 2.1 transport protocol.
When to Use
Building a threat intelligence platform that exchanges IOCs with partner organizations
Automating ingestion and export of indicators from MISP, OpenCTI, or other TIP platforms
Creating machine-readable intelligence reports for ISAC/ISAO sharing communities
Publishing threat data to a TAXII 2.1 server for downstream consumption by SIEMs and SOARs
Converting unstructured threat reports into standardized STIX 2.1 bundles
Enriching detection rules with context by linking indicators to malware, campaigns, and threat actors
Do not use for sharing simple IP blocklists or CSV-based IOC feeds that do not require relationship context; plain-text feeds with simpler formats like CSV or OpenIOC may be more efficient in those cases.
Prerequisites
Python 3.8+ with stix2 library (pip install stix2)
taxii2-client for consuming TAXII feeds (pip install taxii2-client)
A TAXII 2.1 server endpoint for publishing (e.g., OpenTAXII, Medallion, or MISP TAXII service)
Familiarity with STIX 2.1 SDO types: Indicator, Malware, Threat Actor, Campaign, Attack Pattern, Identity
Familiarity with STIX 2.1 SRO types: Relationship, Sighting
Optional: OpenCTI or MISP instance for end-to-end integration testing
Workflow
Step 1: Install Dependencies
pip install stix2 taxii2-client requests
Step 2: Create STIX 2.1 Domain Objects (SDOs)
Create core intelligence objects that describe threats, actors, and campaigns:
from stix2 import (
Indicator, Malware, ThreatActor, Campaign,
AttackPattern, Identity, Relationship, Bundle,
ExternalReference
)
from datetime import datetime
producer = Identity(
name="ACME Threat Intel Team" ,
identity_class="organization" ,
sectors=["technology" ],
contact_information="threatintel@acme.example.com"
)
emotet_malware = Malware(
name= ,
description=
,
malware_types=[ , ],
is_family= ,
created_by_ref=producer.
)
spearphishing_pattern = AttackPattern(
name= ,
description= ,
external_references=[
ExternalReference(
source_name= ,
external_id= ,
url=
)
],
created_by_ref=producer.
)
threat_actor = ThreatActor(
name= ,
description= ,
threat_actor_types=[ ],
aliases=[ , ],
primary_motivation= ,
created_by_ref=producer.
)
campaign = Campaign(
name= ,
description=
,
first_seen= ,
created_by_ref=producer.
)
( )
( )
( )
"Emotet"
"Banking trojan turned modular botnet loader. "
"Distributed via malspam with macro-enabled Office documents."
"trojan"
"bot"
True
id
"Spearphishing Attachment"
"Adversaries send spearphishing emails with a malicious attachment."
"mitre-attack"
"T1566.001"
"https://attack.mitre.org/techniques/T1566/001/"
id
"Mummy Spider"
"Cybercriminal group operating the Emotet botnet infrastructure."
"crime-syndicate"
"TA542"
"Gold Crestwood"
"personal-gain"
id
"Emotet Q1 2026 Resurgence"
"Renewed Emotet distribution campaign using thread-hijacked "
"reply-chain emails with OneNote lure attachments."
"2026-01-15T00:00:00Z"
id
print
f"Created malware SDO: {emotet_malware.id } "
print
f"Created threat actor SDO: {threat_actor.id } "
print
f"Created campaign SDO: {campaign.id } "
Step 3: Create STIX Indicators with Patterns Define detection patterns using the STIX Patterning Language:
hash_indicator = Indicator(
name="Emotet dropper hash" ,
description="SHA-256 hash of Emotet first-stage dropper observed in Jan 2026 campaign." ,
indicator_types=["malicious-activity" ],
pattern_type="stix" ,
pattern="[file:hashes.'SHA-256' = 'a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2c3d4e5f6a1b2']" ,
valid_from="2026-01-15T00:00:00Z" ,
created_by_ref=producer.id
)
c2_indicator = Indicator(
name="Emotet C2 domain" ,
description="Command and control domain observed in Emotet tier-1 botnet infrastructure." ,
indicator_types=["malicious-activity" ],
pattern_type="stix" ,
pattern="[domain-name:value = 'malicious-c2.example.com']" ,
valid_from="2026-01-20T00:00:00Z" ,
created_by_ref=producer.id
)
process_indicator = Indicator(
name="Emotet PowerShell download cradle" ,
description="PowerShell execution pattern used by Emotet to download next-stage payload." ,
indicator_types=["malicious-activity" ],
pattern_type="stix" ,
pattern=(
"[process:command_line MATCHES 'powershell.*-enc.*' "
"AND process:parent_ref.name = 'winword.exe']"
),
valid_from="2026-01-15T00:00:00Z" ,
created_by_ref=producer.id
)
email_indicator = Indicator(
name="Emotet phishing subject line pattern" ,
description="Subject line pattern seen in thread-hijacked Emotet phishing emails." ,
indicator_types=["malicious-activity" ],
pattern_type="stix" ,
pattern="[email-message:subject MATCHES '^RE:.*Invoice.*[0-9]{6}']" ,
valid_from="2026-01-15T00:00:00Z" ,
created_by_ref=producer.id
)
print (f"Created {4 } indicator objects" )
Step 4: Build Relationships Between Objects Link SDOs together using Relationship objects to express how threats are connected:
rel_malware_attack = Relationship(
relationship_type="uses" ,
source_ref=emotet_malware.id ,
target_ref=spearphishing_pattern.id ,
description="Emotet is distributed via spearphishing attachments." ,
created_by_ref=producer.id
)
rel_actor_malware = Relationship(
relationship_type="uses" ,
source_ref=threat_actor.id ,
target_ref=emotet_malware.id ,
description="Mummy Spider operates the Emotet malware infrastructure." ,
created_by_ref=producer.id
)
rel_indicator_malware = Relationship(
relationship_type="indicates" ,
source_ref=hash_indicator.id ,
target_ref=emotet_malware.id ,
description="File hash indicator for Emotet dropper binary." ,
created_by_ref=producer.id
)
rel_campaign_malware = Relationship(
relationship_type="uses" ,
source_ref=campaign.id ,
target_ref=emotet_malware.id ,
created_by_ref=producer.id
)
rel_actor_campaign = Relationship(
relationship_type="attributed-to" ,
source_ref=campaign.id ,
target_ref=threat_actor.id ,
created_by_ref=producer.id
)
print (f"Created {5 } relationship objects linking threat intelligence" )
Step 5: Assemble and Serialize a STIX Bundle Package all objects into a bundle for sharing:
import json
bundle = Bundle(
objects=[
producer,
emotet_malware,
spearphishing_pattern,
threat_actor,
campaign,
hash_indicator,
c2_indicator,
process_indicator,
email_indicator,
rel_malware_attack,
rel_actor_malware,
rel_indicator_malware,
rel_campaign_malware,
rel_actor_campaign,
]
)
bundle_json = bundle.serialize(pretty=True )
with open ("emotet_campaign_bundle.json" , "w" ) as f:
f.write(bundle_json)
print (f"Bundle {bundle.id } contains {len (bundle.objects)} objects" )
print (f"Written to emotet_campaign_bundle.json" )
from stix2 import parse
parsed = parse(bundle_json, allow_custom=False )
print (f"Bundle validation passed: {len (parsed.objects)} objects parsed successfully" )
Step 6: Consume Intelligence from a TAXII 2.1 Server Retrieve published threat intelligence from a TAXII feed:
from taxii2client.v21 import Server, Collection, as_pages
import json
taxii_server = Server(
"https://taxii.example.com/taxii2/" ,
user="readonly" ,
password="readonly_password"
)
api_root = taxii_server.api_roots[0 ]
print (f"API Root: {api_root.title} " )
for collection in api_root.collections:
print (f" Collection: {collection.title} (ID: {collection.id } )" )
target_collection = Collection(
f"https://taxii.example.com/taxii2/collections/{api_root.collections[0 ].id } /" ,
user="readonly" ,
password="readonly_password"
)
response = target_collection.get_objects(
added_after="2026-01-01T00:00:00Z" ,
type =["indicator" , "malware" ]
)
stix_data = json.loads(response.text)
print (f"Retrieved {len (stix_data.get('objects' , []))} objects from TAXII server" )
for obj in stix_data.get("objects" , []):
if obj["type" ] == "indicator" :
print (f" Indicator: {obj['name' ]} | Pattern: {obj['pattern' ][:60 ]} ..." )
elif obj["type" ] == "malware" :
print (f" Malware: {obj['name' ]} | Family: {obj.get('is_family' , False )} " )
Step 7: Publish Intelligence to a TAXII 2.1 Server Push your STIX bundle to a writable TAXII collection:
import requests
import json
TAXII_URL = "https://taxii.example.com/taxii2/collections/COLLECTION_ID/objects/"
TAXII_USER = "publisher"
TAXII_PASS = "publisher_password"
headers = {
"Content-Type" : "application/taxii+json;version=2.1" ,
"Accept" : "application/taxii+json;version=2.1"
}
with open ("emotet_campaign_bundle.json" , "r" ) as f:
bundle_data = f.read()
response = requests.post(
TAXII_URL,
headers=headers,
auth=(TAXII_USER, TAXII_PASS),
data=bundle_data,
timeout=30
)
if response.status_code in (200 , 201 , 202 ):
status = response.json()
print (f"Published successfully. Status ID: {status.get('id' )} " )
print (f" Total count: {status.get('total_count' )} " )
print (f" Success count: {status.get('success_count' )} " )
print (f" Failure count: {status.get('failure_count' )} " )
else :
print (f"Publishing failed: {response.status_code} - {response.text} " )
Step 8: Validate and Lint STIX Objects Ensure objects comply with the STIX 2.1 specification:
from stix2 import parse, exceptions
import json
def validate_stix_bundle (bundle_path ):
"""Validate all objects in a STIX bundle against the 2.1 spec."""
with open (bundle_path, "r" ) as f:
raw = json.load(f)
errors = []
valid_count = 0
for obj in raw.get("objects" , []):
try :
parsed = parse(json.dumps(obj), allow_custom=False )
valid_count += 1
except (exceptions.InvalidValueError, exceptions.MissingPropertiesError) as e:
errors.append({
"object_id" : obj.get("id" , "unknown" ),
"object_type" : obj.get("type" , "unknown" ),
"error" : str (e)
})
print (f"Validation results: {valid_count} valid, {len (errors)} errors" )
for err in errors:
print (f" ERROR in {err['object_type' ]} ({err['object_id' ]} ): {err['error' ]} " )
return len (errors) == 0
validate_stix_bundle("emotet_campaign_bundle.json" )
Verification
Confirm all STIX objects serialize to valid JSON and include required properties (type, id, created, modified)
Verify relationship source_ref and target_ref point to existing object IDs within the bundle
Validate indicator patterns parse correctly using the STIX patterning grammar
Test TAXII publishing returns a success status with success_count matching the number of objects sent
Re-retrieve published objects from the TAXII server and confirm they round-trip without data loss
Check that consuming systems (SIEM, SOAR, TIP) can ingest the bundle and create corresponding detection rules or enrichment data
Run stix2-validator CLI tool against exported bundles: stix2_validator emotet_campaign_bundle.json