MISP: Threat Intelligence Management & Sharing
Central IOC store, feed ingester, and distribution hub — pulls from the deception layer, pushes to the detection layer, sets up Wazuh CDB consumption in Part 6.
Parts 1–4; MISP VPS in the mesh
~80 minutes
MISP ingesting feeds + honeypot data, exporting to Suricata/Zeek
MISP Overview
MISP organises threat intelligence as events (incidents or campaigns) containing attributes (IPs, hashes, URLs) and objects (structured groupings such as a file with its hashes and PE metadata). Galaxies tag events against frameworks like MITRE ATT&CK; taxonomies apply controlled-vocabulary labels.
Deployment Options
The series uses the official Docker Compose deployment — repeatable, snapshottable, and well-supported. Bare-metal INSTALL.sh is fine if you want to colocate other services; misp-airgap is for offline labs.
git clone https://github.com/MISP/misp-docker /opt/misp
cd /opt/misp
cp template.env .env
# Edit .env: BASE_URL, MYSQL_PASSWORD, ADMIN_*, OIDC if used
docker compose pull
docker compose up -dInitial Configuration
Log in as the bootstrap admin and immediately:
- • Create your real organisation under Administration → Add Organisation.
- • Create a sharing group TIP-Internal with just your org for now.
- • Define a least-privilege automation user with Sync Actions for the Wazuh and Zeek exporters.
Feed Configuration
Enable the high-signal community feeds first; everything else can wait:
- • CIRCL OSINT — curated indicators from CIRCL's analysts.
- • abuse.ch URLhaus, ThreatFox, MalwareBazaar — malware URLs, IOCs, and samples.
- • AlienVault OTX — broad community feed; needs an API key.
- • Emerging Threats compromised IPs — pairs with the Suricata ET ruleset.
# from the misp-modules container
/var/www/MISP/app/Console/cake Server fetchFeed 1 allRecommended Starter Taxonomies and Galaxies
- • tlp — every event must be tagged with a TLP colour.
- • admiralty-scale — source reliability and information credibility.
- • malware-classification — coarse family labels.
- • mitre-attack-pattern galaxy — attach ATT&CK techniques.
- • threat-actor galaxy — link events to known actors.
PyMISP Basics
pip install pymisp
python3 - <<'PY'
from pymisp import PyMISP, MISPEvent
m = PyMISP("https://misp.tip.internal", "<api-key>", False)
e = MISPEvent()
e.info = "Cowrie SSH brute-force from 1.2.3.4"
e.add_attribute("ip-src", "1.2.3.4", to_ids=True)
e.add_tag("tlp:amber")
print(m.add_event(e))
PYWebhooks Replacing Email
MISP's notification model is email-first. Disable the SMTP path and write a small webhook adapter that watches the MISP audit log and posts to the shared tip-notify wrapper from Part 1. A 50-line Python service is sufficient; keep it on the management VPS.
IOC Ingestion Pipelines
Three pipelines feed MISP from the rest of the stack:
- • Cowrie sessions — parse
cowrie.jsonand emit one MISP event per unique source IP that uploads a payload, with the file hash as an attribute. - • Beelzebub captures — emit events tagged with the LLM-specific
misp-galaxy:attack-pattern="LLM Prompt Injection". - • Suricata + Zeek alerts — emit pivot attributes (JA4 hash, TLS SNI, HTTP host) so analysts can branch from a single hit into related events.
IOC Distribution Pipelines
# Suricata rules export
curl -H "Authorization: $MISP_KEY" \
"https://misp.tip.internal/events/nids/suricata/download" \
-o /etc/suricata/rules/misp.rules
# Zeek intel framework export
curl -H "Authorization: $MISP_KEY" \
"https://misp.tip.internal/attributes/bro/download/all" \
-o /opt/zeek/intel/misp.intel
# Wazuh CDB list (for Part 6)
curl -H "Authorization: $MISP_KEY" \
"https://misp.tip.internal/attributes/text/download/ip-dst" \
-o /var/ossec/etc/lists/misp-ipSchedule each export every 15 minutes; reload Suricata rules and Zeek as covered in Part 4.
Synchronisation with External Communities
Once your local content is healthy, request access to a community such as the CIRCL Private Sector or a sector-specific ISAC, then add a Sync Server entry pointing at their MISP. Sharing groups control which of your events are pushed.
API Hardening, Rate Limits, Access Control
- • Restrict the API to the WireGuard interface; expose the UI through Caddy + Authelia only.
- • Per-user API keys; rotate quarterly.
- • Enable
Security.rest_client_enable_arbitrary_urlsonly if you really need it.
Capacity Planning
The MariaDB instance backing MISP is the first thing that hurts. Watch for: attributes table over 50M rows, correlation engine taking minutes to finish, and feed pulls timing out. Mitigations: prune low-signal feeds, raise innodb_buffer_pool_size, and split correlation into a separate scheduled job rather than on-write.
