How to Consume Our Free STIX/TAXII Threat Intelligence Feed: A SIEM Integration Guide
- Patrick Duggan
- Jan 23
- 8 min read
TL;DR
We publish free, public threat intelligence. No API key. No rate limits. No registration.
# Get threat indicators right now
curl https://analytics.dugganusa.com/api/v1/stix-feed/v2This guide shows you how to integrate our feed into the top 5 SIEMs.
What We Publish
101,000+ IOCs from production security operations, updated hourly:
Content | Description |
Malicious IPs | Botnet C2s, scanners, exploit infrastructure |
Malware families | Stealc, LummaC2, Cobalt Strike, Vidar, AsyncRAT |
MITRE ATT&CK mapping | Kill chain phases, technique IDs |
Multi-source enrichment | AbuseIPDB, VirusTotal, ThreatFox, GreyNoise |
Format: STIX 2.1 (industry standard) Protocol: REST API + TAXII 2.1 License: CC0-1.0 (public domain) Cost: Free
Endpoints
STIX 2.1 REST API
Endpoint | Description |
GET /api/v1/stix-feed/v2 | Full STIX bundle (recommended) |
GET /api/v1/stix-feed | Legacy indicators-only format |
GET /api/v1/stix-feed/info | Feed metadata |
GET /api/v1/stix-feed/v2/stats | Statistics and malware families |
Base URL: https://analytics.dugganusa.com
days=30 - Filter to last N days (default: 30)
min_confidence=80 - Minimum confidence score 0-100
country=CN - Filter by 2-letter country code
limit=100 - Maximum indicators returned
TAXII 2.1 Server
Endpoint | Description |
GET /api/v1/taxii/ | API root info |
GET /api/v1/taxii/collections/ | List collections |
GET /api/v1/taxii/collections/dugganusa-threat-intel/objects/ | Get STIX objects |
GET /api/v1/taxii/collections/dugganusa-threat-intel/manifest/ | Object manifest |
TAXII Collection ID: dugganusa-threat-intel
Quick Start Examples
Bash + jq
# Get all high-confidence IPs
curl -s "https://analytics.dugganusa.com/api/v1/stix-feed/v2?min_confidence=80" | \
jq -r '.objects[] | select(.type=="indicator") | .pattern' | \
grep -oP "\d+\.\d+\.\d+\.\d+"Python
#!/usr/bin/env python3
"""
DugganUSA STIX Feed Consumer
pip install requests stix2
"""import requests from stix2 import parse
def fetch_threats(days=30, min_confidence=70): """Fetch threat indicators from DugganUSA feed.""" url = "https://analytics.dugganusa.com/api/v1/stix-feed/v2" params = { "days": days, "min_confidence": min_confidence }
response = requests.get(url, params=params) response.raise_for_status()
bundle = parse(response.json())
indicators = [] for obj in bundle.objects: if obj.type == 'indicator': # Extract IP from STIX pattern import re ip_match = re.search(r'\d+\.\d+\.\d+\.\d+', obj.pattern) if ip_match: indicators.append({ 'ip': ip_match.group(), 'name': obj.name, 'confidence': obj.confidence, 'labels': obj.labels, 'created': str(obj.created), 'custom': getattr(obj, 'x_dugganusa_threat_intel', {}) })
return indicators
def main(): print("Fetching high-confidence threats...") threats = fetch_threats(days=7, min_confidence=80)
print(f"\nFound {len(threats)} indicators:\n") for t in threats[:10]: print(f" {t['ip']:18} | {t['confidence']:3}% | {t['name'][:50]}")
if __name__ == "__main__": main() ```
JavaScript/Node.js
/**
* DugganUSA STIX Feed Consumer
* npm install node-fetch
*/const fetch = require('node-fetch');
async function fetchThreats(options = {}) { const { days = 30, minConfidence = 70, country = null } = options;
const params = new URLSearchParams({ days: days.toString(), min_confidence: minConfidence.toString() });
if (country) params.append('country', country);
const url = https://analytics.dugganusa.com/api/v1/stix-feed/v2?${params}; const response = await fetch(url); const bundle = await response.json();
return bundle.objects .filter(obj => obj.type === 'indicator') .map(indicator => { const ipMatch = indicator.pattern.match(/\d+\.\d+\.\d+\.\d+/); return { ip: ipMatch ? ipMatch[0] : null, name: indicator.name, confidence: indicator.confidence, labels: indicator.labels, created: indicator.created, custom: indicator.x_dugganusa_threat_intel || {} }; }); }
// Usage (async () => { const threats = await fetchThreats({ days: 7, minConfidence: 80 }); console.log(Found ${threats.length} high-confidence threats); threats.slice(0, 5).forEach(t => { console.log( ${t.ip} - ${t.confidence}% - ${t.name}); }); })(); ```
SIEM Integration Guides
1. Splunk Enterprise Security
Splunk ES has native STIX/TAXII support via the Splunk Add-on for TAXII.
#### Option A: TAXII Add-on (Recommended)
Install the Add-on
Configure Data Input
Field | Value |
Name | dugganusa_threat_intel |
TAXII Server URL | https://analytics.dugganusa.com/api/v1/taxii/ |
Collection | dugganusa-threat-intel |
Poll Interval | 3600 (1 hour) |
Index | threat_intel |
Verify Data
#### Option B: HTTP Event Collector (Custom Script)
#!/usr/bin/env python3
"""
Splunk HEC STIX Ingestion
Cron: 0 * * * * /opt/scripts/splunk_stix_ingest.py
"""import requests import json from datetime import datetime
def main(): # Fetch STIX bundle response = requests.get(f"{STIX_URL}?min_confidence=70") bundle = response.json()
for obj in bundle.get('objects', []): if obj.get('type') == 'indicator': event = { "time": datetime.now().timestamp(), "sourcetype": "stix:indicator", "index": "threat_intel", "event": obj }
requests.post(SPLUNK_HEC_URL, headers=headers, json=event, verify=False)
print(f"Ingested {len(bundle.get('objects', []))} objects")
if __name__ == "__main__": main() ```
#### Splunk Correlation Searches
-- Alert on connections to known C2
index=firewall dest_ip=*
| lookup threat_intel_iocs ip AS dest_ip OUTPUT threat_name, confidence
| where isnotnull(threat_name) AND confidence >= 80
| stats count by src_ip, dest_ip, threat_name, confidence-- Enrich network events with threat intel index=network | join type=left dest_ip [ | inputlookup threat_intel_iocs | rename ip as dest_ip ] | where isnotnull(threat_type) | table _time, src_ip, dest_ip, threat_type, confidence, mitre_technique ```
2. Microsoft Sentinel
Sentinel has native Threat Intelligence connectors supporting STIX/TAXII.
#### Option A: Threat Intelligence - TAXII Connector
Enable the Connector
Add Server
Verify in Log Analytics
#### Option B: Logic App (Custom Integration)
Create a Logic App with HTTP trigger:
{
"definition": {
"triggers": {
"Recurrence": {
"type": "Recurrence",
"recurrence": {
"frequency": "Hour",
"interval": 1
}
}
},
"actions": {
"HTTP_Get_STIX": {
"type": "Http",
"inputs": {
"method": "GET",
"uri": "https://analytics.dugganusa.com/api/v1/stix-feed/v2?min_confidence=70"
}
},
"Parse_JSON": {
"type": "ParseJson",
"inputs": {
"content": "@body('HTTP_Get_STIX')",
"schema": {
"type": "object",
"properties": {
"objects": { "type": "array" }
}
}
}
},
"For_each_indicator": {
"type": "Foreach",
"foreach": "@body('Parse_JSON')?['objects']",
"actions": {
"Send_to_Sentinel": {
"type": "ApiConnection",
"inputs": {
"host": {
"connection": {
"name": "@parameters('$connections')['azuresentinel']['connectionId']"
}
},
"method": "post",
"path": "/threatintelligence/createIndicator"
}
}
}
}
}
}
}#### Sentinel Analytics Rules
-- Alert: Connection to Known Malicious IP
let MaliciousIPs = ThreatIntelligenceIndicator
| where SourceSystem contains "DugganUSA"
| where ConfidenceScore >= 80
| where NetworkIP != ""
| distinct NetworkIP;
CommonSecurityLog
| where TimeGenerated > ago(1h)
| where DestinationIP in (MaliciousIPs)
| project TimeGenerated, SourceIP, DestinationIP, DeviceAction, DeviceVendor-- Hunting: Identify Potential C2 Beaconing let C2Indicators = ThreatIntelligenceIndicator | where Tags contains "c2" or Tags contains "botnet" | distinct NetworkIP; CommonSecurityLog | where DestinationIP in (C2Indicators) | summarize ConnectionCount = count(), FirstSeen = min(TimeGenerated), LastSeen = max(TimeGenerated), BytesSent = sum(SentBytes) by SourceIP, DestinationIP | where ConnectionCount > 10 | extend BeaconScore = ConnectionCount / datetime_diff('minute', LastSeen, FirstSeen) ```
3. Elastic Security (ELK Stack)
Elastic has native Threat Intelligence integrations via Fleet.
#### Option A: Fleet Integration (Recommended)
Add Integration
Configure TAXII Input
#### Option B: Logstash Pipeline
# /etc/logstash/conf.d/stix-feed.confinput { http_poller { urls => { dugganusa => { method => get url => "https://analytics.dugganusa.com/api/v1/stix-feed/v2?min_confidence=70" } } schedule => { cron => "0 " } # Hourly codec => "json" } }
filter { split { field => "[objects]" }
if [objects][type] == "indicator" { mutate { add_field => { "[@metadata][index]" => "threat-intel" "indicator.type" => "%{[objects][type]}" "indicator.name" => "%{[objects][name]}" "indicator.confidence" => "%{[objects][confidence]}" "indicator.pattern" => "%{[objects][pattern]}" } }
grok { match => { "[objects][pattern]" => "%{IP:indicator.ip}" } }
output { if [@metadata][index] == "threat-intel" { elasticsearch { hosts => ["localhost:9200"] index => "threat-intel-%{+YYYY.MM}" document_id => "%{[objects][id]}" } } } ```
#### Elastic Detection Rules
{
"name": "Connection to DugganUSA Threat Intel IOC",
"description": "Detects network connections to IPs in DugganUSA threat feed",
"risk_score": 73,
"severity": "high",
"type": "threat_match",
"threat_index": ["threat-intel-*"],
"threat_mapping": [
{
"entries": [
{
"field": "destination.ip",
"type": "mapping",
"value": "indicator.ip"
}
]
}
],
"threat_indicator_path": "threat.indicator",
"query": "event.category:network and destination.ip:*",
"language": "kusto",
"interval": "5m",
"from": "now-6m"
}# Kibana SIEM rule (YAML format)
name: High Confidence Malicious IP Connection
description: Alert when connection detected to IP with confidence >= 80
type: threat_match
threat_index:
- threat-intel-*
threat_mapping:
- entries:
- field: destination.ip
type: mapping
value: indicator.ip
threat_filters:
- query:
match:
indicator.confidence:
gte: 80
index:
- filebeat-*
- packetbeat-*
query: 'event.category:network'4. IBM QRadar
QRadar supports threat intelligence via Reference Sets and custom log sources.
#### Option A: Pulse App (STIX/TAXII Native)
Install IBM Security App Exchange - Threat Intelligence
Configure Feed
#### Option B: Reference Set Population Script
#!/usr/bin/env python3
"""
QRadar Reference Set Updater for DugganUSA STIX Feed
Cron: 0 * * * * /opt/scripts/qradar_stix_update.py
"""import requests import re
def get_stix_ips(min_confidence=70): """Fetch IPs from STIX feed.""" response = requests.get(f"{STIX_URL}?min_confidence={min_confidence}") bundle = response.json()
ips = [] for obj in bundle.get('objects', []): if obj.get('type') == 'indicator': match = re.search(r'\d+\.\d+\.\d+\.\d+', obj.get('pattern', '')) if match: ips.append(match.group())
return list(set(ips))
def update_reference_set(ips): """Update QRadar reference set.""" headers = { "SEC": QRADAR_TOKEN, "Content-Type": "application/json" }
print(f"Updated {len(ips)} IPs in reference set")
def main(): ips = get_stix_ips(min_confidence=80) update_reference_set(ips)
if __name__ == "__main__": main() ```
#### QRadar AQL Queries
-- Find connections to malicious IPs
SELECT
sourceip,
destinationip,
CATEGORYNAME(category) as category,
SUM(eventcount) as event_count
FROM events
WHERE destinationip IN (
SELECT * FROM reference_data('DugganUSA_Malicious_IPs')
)
GROUP BY sourceip, destinationip, category
ORDER BY event_count DESC
LAST 24 HOURS-- Custom rule building block SELECT * FROM events WHERE ( sourceip IN reference_data('DugganUSA_Malicious_IPs') OR destinationip IN reference_data('DugganUSA_Malicious_IPs') ) AND NOT INCIDR(sourceip, '10.0.0.0/8') ```
5. CrowdStrike Falcon LogScale (Humio)
Falcon LogScale supports threat intel via custom parsers and scheduled queries.
#### Ingest Configuration
# Package manifest for LogScale
name: dugganusa-stix-feed
version: 1.0.0
description: DugganUSA Threat Intelligence Feed Ingestionparsers: - name: stix-indicator script: | parseJson() | case { type == "indicator" | @rawstring := pattern | @timestamp := parseTimestamp("yyyy-MM-dd'T'HH:mm:ss", field=created) | regex("(?<ip>\d+\.\d+\.\d+\.\d+)", field=pattern) | threat_name := name | threat_confidence := confidence | @type := "stix_indicator"; * | drop(); }
scheduled-searches: - name: fetch-dugganusa-feed query: | // Fetch via HTTP data source @type=stix_indicator | groupBy([ip, threat_name, threat_confidence]) schedule: "0 " timeWindow: 1h ```
#### HTTP Data Source
# Configure HTTP input in LogScale
curl -X POST "https://cloud.humio.com/api/v1/repositories/threat-intel/datasources" \
-H "Authorization: Bearer $HUMIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "dugganusa-stix",
"url": "https://analytics.dugganusa.com/api/v1/stix-feed/v2?min_confidence=70",
"parser": "stix-indicator",
"pollIntervalSeconds": 3600
}'#### LogScale Queries
// Find connections to threat intel IPs
#type=network
| join({#type=stix_indicator}, field=dest_ip, key=ip, include=[threat_name, threat_confidence])
| threat_confidence >= 80
| groupBy([src_ip, dest_ip, threat_name])
| sort(count, order=desc)// Alert on high-confidence C2 communication #type=firewall | in(dest_ip, values=["threat_intel_ips"]) | timechart(span=5m, function=count()) | alert( name="C2 Communication Detected", condition="_count > 0", throttle=15m )
// Threat intel coverage dashboard #type=stix_indicator | groupBy([threat_confidence]) | stats(count=count()) | sort(threat_confidence, order=desc) ```
TAXII Client Examples
Python (taxii2-client)
#!/usr/bin/env python3
"""
TAXII 2.1 Client for DugganUSA Feed
pip install taxii2-client stix2
"""from taxii2client.v21 import Server, Collection, as_pages from stix2 import parse
TAXII_URL = "https://analytics.dugganusa.com/api/v1/taxii/" COLLECTION_ID = "dugganusa-threat-intel"
def main(): # Connect to TAXII server server = Server(TAXII_URL)
if __name__ == "__main__": main() ```
OpenCTI Integration
# docker-compose.yml addition for OpenCTI
services:
connector-taxii:
image: opencti/connector-taxii2:latest
environment:
- OPENCTI_URL=http://opencti:8080
- OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
- CONNECTOR_ID=dugganusa-taxii
- CONNECTOR_NAME=DugganUSA-TAXII
- TAXII2_URL=https://analytics.dugganusa.com/api/v1/taxii/
- TAXII2_COLLECTION=dugganusa-threat-intel
- TAXII2_INTERVAL=3600
- TAXII2_INITIAL_HISTORY=30Best Practices
1. Polling Frequency
Use Case | Recommended Interval |
Real-time SOC | 15 minutes |
Daily enrichment | 1 hour |
Compliance/audit | 24 hours |
2. Confidence Thresholds
Action | Minimum Confidence |
Auto-block | 90+ |
Alert | 70+ |
Enrich/log | 50+ |
Research | Any |
3. Deduplication
IPv4Address SCOs: ipv4-addr--{sha256(ip)[:36]}
Same IP always gets same ID across fetches
Safe to poll frequently without duplicates
4. Error Handling
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retrysession = requests.Session() retries = Retry( total=3, backoff_factor=1, status_forcelist=[500, 502, 503, 504] ) session.mount('https://', HTTPAdapter(max_retries=retries))
response = session.get( "https://analytics.dugganusa.com/api/v1/stix-feed/v2", timeout=30 ) ```
Feed Statistics (Live)
As of January 2026:
Metric | Value |
Total IOCs | 101,598 |
Unique IPs blocked | 2,457 |
OTX Pulses published | 1,981 |
Malware families tracked | 10 |
MITRE ATT&CK patterns | 16 |
Update frequency | Hourly |
Why Free?
We believe shared intelligence improves faster than hoarded intelligence.
Zero marginal cost to share digital goods
Community feedback improves detection
Open data prevents vendor lock-in
Transparency builds trust
We're a two-person shop competing with $5,000/month enterprise offerings by being more useful, not more expensive.
Support
Email: [email protected]
Feed Status: https://status.dugganusa.com
Documentation: https://analytics.dugganusa.com/docs/stix-feed
Found a false positive? Email us with the IP - we investigate every report.
Need a custom integration? We're happy to help - no charge for reasonable requests.
License
CC0-1.0 (Public Domain)
Use it however you want. Attribution appreciated but not required:
Threat intelligence provided by DugganUSA
https://analytics.dugganusa.com/api/v1/stix-feedPublished by DugganUSA LLC - Minnesota's finest threat intel operation.
"The Cribl of Agentic AI"
Her name is Renee Nicole Good.




Comments