🎯 Objectif de la semaine
Maîtriser la Threat Intelligence opérationnelle via la plateforme MISP (Malware Information Sharing Platform). Apprendre à collecter, enrichir et exploiter des indicateurs de compromission (IOC) pour transformer des alertes SIEM isolées en connaissances actionnables sur les menaces actuelles.
Pourquoi c'est stratégique : La Threat Intelligence réduit le temps moyen de détection (MTTD) de 90%. Savoir qu'une IP est déjà connue comme malveillante transforme une investigation de plusieurs heures en réponse immédiate.
📚 Sujet – Théorie (1 heure)
Threat Intelligence : Voir Plus Loin Que l'Horizon
La Threat Intelligence n'est pas simplement une liste de mauvaises IPs – c'est une discipline stratégique qui transforme des données brutes en connaissances actionnables sur les adversaires, leurs motivations, leurs capacités et leurs opportunités.
Stratégique
Long terme
Trends, actors, motivations
Opérationnelle
Moyen terme
TTPs, campagnes
Tactique
Court terme
IOC, signatures
Technique
Immédiat
Hashes, IPs, URLs
MISP : Le Cerveau Collectif de la Communauté Sécurité
🌐 Frontend
- Interface Web : PHP CakePHP
- API REST : Intégration outils
- UI/UX : Événements, galeries
- Dashboard : Vue d'ensemble
🔄 Backend
- Workers : Python (pymisp)
- Redis : Cache & queues
- STIX/TAXII : Formats standard
- Enrichissement : Plugins externes
🗄️ Base de données
- MySQL/MariaDB : Données structurées
- Événements : Conteneurs d'IOC
- Attributs : IOC individuels
- Galaxies : Contexte MITRE
STIX/TAXII : Le Langage Universel de la TI
📚 Standards d'Échange
- STIX (Structured Threat Information eXpression) : Format pour décrire les informations sur les cybermenaces
- TAXII (Trusted Automated eXchange of Indicator Information) : Protocole pour échanger des données STIX
- MITRE ATT&CK : Matrice de tactiques, techniques et procédures
- OpenIOC : Format FireEye (plus ancien)
MISP supporte nativement STIX 2.x et TAXII 2.x, ce qui en fait un hub d'échange interopérable.
Types d'Indicateurs de Compromission (IOC)
🔍 Observables
- IPs : C2, scanners, exploit hosts
- Domaines : DGA, phishing, C2
- URLs : Exploit kits, malware drops
- Hashes : MD5, SHA1, SHA256 (malware)
- Emails : Phishing, spearphishing
🎯 TTPs (Tactics, Techniques, Procedures)
- MITRE IDs : T1059, T1566, etc.
- Patterns : Comportements adverses
- Tools : Cobalt Strike, Metasploit
- YARA : Signatures malware
- Sigma : Règles détection
Le Cycle de Vie d'un IOC dans MISP
⚠️ Qualité des IOC : Garbage In, Garbage Out
- Fraîcheur : Un IOC de 6 mois est probablement inutile
- Confidence : Score de confiance (0-100)
- False Positives : IPs partagées (CDN, Cloud)
- Expiration : TTL (Time To Live) des IOC
- Context : Sans contexte, un IOC est dangereux
Intégration avec le SOC (Security Operations Center)
🔄 Flux d'Intégration Typique
- Collecte : Feeds → MISP (automatique)
- Enrichissement : Virustotal, Shodan, etc.
- Corrélation : MITRE ATT&CK, galaxies
- Export : Vers SIEM (Wazuh), firewall, EDR
- Feedback : IOC internes → partage externe
🔬 Mission pratique – Laboratoire (2 heures)
Architecture du Lab MISP
https://localhost
MySQL + Redis] -->|API REST| W[Wazuh Manager
Alertes enrichies] M -->|STIX/TAXII| F[Feeds externes
CIRCL, AlienVault] M -->|IOC Export| S[Suricata IDS
Règles dynamiques] subgraph "🎯 Sources de données" OTX[AlienVault OTX] CIRCL[CIRCL OSINT] CUSTOM[IOC personnels] end OTX --> M CIRCL --> M CUSTOM --> M style M fill:#0a0e17,stroke:#9d4edd,stroke-width:3px style W fill:#0a0e17,stroke:#00d4ff,stroke-width:2px
⚠️ Prérequis et Considérations
🔒 Ressources système : MISP nécessite minimum 4 Go RAM et 2 vCPU. Ajustez vos ressources VM en conséquence.
Étapes Détaillées d'Installation et Configuration
Étape 1 : Installation Dockerisée de MISP
# Création du répertoire de travail
mkdir -p ~/mon_lab/misp-docker && cd ~/mon_lab/misp-docker
# Téléchargement docker-compose officiel
curl -sSL https://raw.githubusercontent.com/MISP/docker-misp/master/docker-compose.yml -o docker-compose.yml
# Configuration adaptée pour lab (réduction mémoire)
cat > docker-compose.override.yml << 'EOF'
version: '3'
services:
misp:
environment:
- MYSQL_PASSWORD=StrongPassword123!
- REDIS_PASSWORD=RedisPass123!
- MISP_ADMIN_EMAIL=admin@pctamalou.local
- MISP_ADMIN_PASSPHRASE=ChangeThisNow123!
ports:
- "443:443"
- "80:80"
mem_limit: 2g
cpus: '1.0'
db:
mem_limit: 1g
cpus: '0.5'
EOF
# Démarrage des containers
sudo docker-compose up -d
# Surveillance du démarrage
sudo docker-compose logs -f misp
# Attendre 3-5 minutes pour l'initialisation complète
echo "MISP est en cours de démarrage... Vérifiez dans 5 minutes avec:"
echo "sudo docker-compose ps"
💡 Accès initial : Naviguez vers https://localhost (acceptez le certificat auto-signé). Identifiants par défaut : admin@admin.test / admin
Étape 2 : Configuration de Base et Sécurisation
# Récupération de l'API key pour automatisation
sudo docker-compose exec misp bash -c 'echo "Votre clé API: " && cat /var/www/MISP/app/Config/api.key'
🔧 Actions de sécurisation obligatoires :
- Changer le mot de passe admin
- Mettre à jour l'email admin
- Configurer HTTPS valide (Let's Encrypt en prod)
- Restreindre l'accès réseau (firewall)
- Sauvegarder la clé API en sécurité
Étape 3 : Configuration des Feeds TI
📡 Feeds publics gratuits recommandés :
- CIRCL OSINT : https://www.circl.lu/doc/misp/feed-osint/
- AlienVault OTX : Nécessite compte gratuit
- MalwareBazaar : https://bazaar.abuse.ch/
- Abuse.ch : URLhaus, SSL Blacklist
# Ajout d'un feed via l'API (exemple CIRCL OSINT)
API_KEY="votre-clé-api"
MISP_URL="https://localhost"
curl -k -X POST \
-H "Authorization: $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"Feed": {
"name": "CIRCL OSINT Feed",
"provider": "CIRCL",
"url": "https://www.circl.lu/doc/misp/feed-osint/",
"source_format": "misp",
"fixed_event": false,
"enabled": true,
"caching_enabled": true,
"pull_rules": true,
"headers": "",
"input_source": "network",
"delete_local_file": false
}
}' \
"$MISP_URL/feeds/add"
# Synchronisation manuelle d'un feed
FEED_ID=1 # Remplacer par l'ID de votre feed
curl -k -X POST \
-H "Authorization: $API_KEY" \
"$MISP_URL/feeds/fetchFromFeed/$FEED_ID"
Étape 4 : Création d'un Événement Manuel
🎯 Création d'Événement : Campagne APT Simulée
Créez un événement complet avec :
- Titre : "APT29 (Cozy Bear) - Campaign Midnight"
- Description : Simulation d'une campagne de spearphishing
- Attributs :
- IP: 185.220.100.240 (Tor exit node exemple)
- Domain: malicious-pctamalou[.]com
- Hash: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 (sha256 vide)
- Filename: invoice_pctamalou.exe
- Tags : APT29, spearphishing, T1566.001
- Galaxy : MITRE ATT&CK Enterprise
# Création d'événement via API
curl -k -X POST \
-H "Authorization: $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"Event": {
"info": "APT29 Simulation - Campaign Midnight",
"analysis": "2", # Completed
"threat_level_id": "3", # High
"distribution": "1", # Community only
"date": "'$(date +%Y-%m-%d)'"
}
}' \
"$MISP_URL/events"
# Notez l'ID d'événement retourné
EVENT_ID=123 # Remplacer par l'ID retourné
# Ajout d'attributs
curl -k -X POST \
-H "Authorization: $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"request": {
"category": "Network activity",
"type": "ip-dst",
"value": "185.220.100.240",
"comment": "Tor exit node - APT29 C2",
"to_ids": true
}
}' \
"$MISP_URL/attributes/add/$EVENT_ID"
# Ajout de tags MITRE ATT&CK
curl -k -X POST \
-H "Authorization: $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"Tag": {
"name": "misp-galaxy:mitre-attack-pattern=\"Phishing - T1566\""
}
}' \
"$MISP_URL/events/addTag/$EVENT_ID"
Étape 5 : Intégration avec Wazuh SIEM
⚙️ Deux méthodes d'intégration :
- Module MISP Wazuh : Intégration native (recommandé)
- Script custom : Synchronisation périodique
# Méthode 1 : Module intégré Wazuh (si disponible)
# Dans Wazuh Manager (Kali)
cd /var/ossec/wodles
sudo git clone https://github.com/wazuh/wazuh-misp.git misp
cd misp
# Configuration
sudo cp misp.conf.example misp.conf
sudo nano misp.conf
# Contenu de configuration :
"""
[misp]
enabled = yes
interval = 300
server = https://localhost
api_key = VOTRE_CLE_API_MISP
tags = malware,phishing,apt
max_age = 86400
"""
# Ajout à la configuration Wazuh
echo '
no
300
yes
' | sudo tee -a /var/ossec/etc/ossec.conf
# Redémarrage Wazuh
sudo systemctl restart wazuh-manager
# Méthode 2 : Script de synchronisation manuel
#!/bin/bash
# misp_to_wazuh.sh - Synchronise les IOC de MISP vers Wazuh
MISP_URL="https://localhost"
API_KEY="votre-cle-api"
WAZUH_RULES="/var/ossec/etc/rules/local_rules.xml"
# Récupération des IOC récents (24h)
IOC_JSON=$(curl -s -k -X POST \
-H "Authorization: $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"returnFormat": "json",
"type": ["ip-src", "ip-dst", "domain", "url"],
"tags": ["to_ids"],
"last": "24h"
}' \
"$MISP_URL/events/restSearch")
# Génération de règles Wazuh
echo '' > /tmp/misp_rules.xml
echo "$IOC_JSON" | jq -r '.response[].Event.Attribute[] |
select(.type == "ip-src" or .type == "ip-dst") |
" \n \n 1002 \n " + .value +
" \n MISP IOC: " + (.comment // .value) +
" \n \n "' >> /tmp/misp_rules.xml
# Fusion avec règles existantes
sudo mv "$WAZUH_RULES" "${WAZUH_RULES}.backup"
sudo cat "${WAZUH_RULES}.backup" /tmp/misp_rules.xml > "$WAZUH_RULES"
sudo systemctl restart wazuh-manager
Étape 6 : Test et Validation
# Test d'un IOC connu (IP Tor)
ping -c 1 185.220.100.240
# Vérification des logs Wazuh
sudo tail -f /var/ossec/logs/alerts/alerts.json | grep -i misp
# Recherche dans MISP
curl -k -X POST \
-H "Authorization: $API_KEY" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{
"returnFormat": "json",
"value": "185.220.100.240"
}' \
"$MISP_URL/events/restSearch" | jq '.'
Exercice Avancé : Pipeline d'Enrichissement Automatique
🎯 Défi d'Automatisation
Créez un pipeline Python qui :
- Récupère les nouveaux IOC de MISP (API)
- Les enrichit avec Virustotal/Shodan (si clés API)
- Ajoute des scores de confiance
- Exporte vers Suricata (format rules)
- Notifie via Slack/Email les IOC critiques
#!/usr/bin/env python3
# enrich_ioc_pipeline.py
from pymisp import ExpandedPyMISP
import requests
import json
class MISPEnrichmentPipeline:
def __init__(self, misp_url, misp_key):
self.misp = ExpandedPyMISP(misp_url, misp_key)
def fetch_new_iocs(self, hours=24):
"""Récupère les IOC des dernières 24h"""
search_result = self.misp.search(
controller='attributes',
type_attribute=['ip-src', 'ip-dst', 'domain'],
last='24h'
)
return search_result
def enrich_with_virustotal(self, ioc):
"""Enrichit un IOC avec Virustotal"""
# Implémentation à compléter
pass
def generate_suricata_rules(self, iocs):
"""Génère des règles Suricata"""
rules = []
for ioc in iocs:
if ioc['type'] in ['ip-src', 'ip-dst']:
rule = f"drop ip {ioc['value']} any -> any any (msg:\"MISP IOC: {ioc['value']}\"; sid:1000000; rev:1;)"
rules.append(rule)
return rules
def run(self):
"""Exécute le pipeline complet"""
iocs = self.fetch_new_iocs()
enriched_iocs = []
for ioc in iocs:
enriched = self.enrich_with_virustotal(ioc)
enriched_iocs.append(enriched)
suricata_rules = self.generate_suricata_rules(enriched_iocs)
with open('/etc/suricata/rules/misp.rules', 'w') as f:
f.write('\n'.join(suricata_rules))
print(f"[+] {len(suricata_rules)} règles générées")
if __name__ == "__main__":
pipeline = MISPEnrichmentPipeline(
misp_url="https://localhost",
misp_key="VOTRE_CLE_API"
)
pipeline.run()
📋 Objectif de la semaine – Checklist de validation
✅ Compétences techniques acquises
- Instance MISP Docker fonctionnelle
- Feed TI configuré et synchronisé
- Événement MISP complet avec IOC
- Intégration Wazuh-MISP opérationnelle
- Recherche et corrélation d'IOC
🧠 Changement mental accompli
- Vision des alertes dans leur contexte mondial
- Compréhension du cycle de vie des IOC
- Habitude d'enrichir avant d'investiguer
- Conscience de la valeur du partage communautaire
💪 Pour aller plus loin :
Explorez les "Galaxies" MISP (MITRE ATT&CK, malpedia), configurez l'enrichissement automatique avec des services externes, et participez à une communauté de partage MISP.
📚 Ressources pour Approfondir
Communautés et Ressources :
- MISP Project : Documentation officielle complète
- CIRCL MISP : Instance publique de recherche
- ATT&CK Navigator : Visualisation des matrices
- OpenCTI : Alternative/threat intelligence platform
⚠️ Considérations Opérationnelles
- False positives : Vérifiez les IOC avant blocage
- Performance : Trop d'IOC ralentit les systèmes
- Licensing : Respectez les licences des feeds
- Partage : Ne partagez pas d'IOC internes sensibles
🔮 Frère d'armes,
Tu viens d'allumer un phare dans le brouillard numérique.
La Threat Intelligence n'est pas une liste de choses à bloquer – c'est une cartographie du territoire ennemi. Chaque IOC est un point sur cette carte. Chaque événement MISP est un rapport de reconnaissance. Chaque tag MITRE ATT&CK est une tactique identifiée.
Cette semaine, tu as vu la différence entre réagir et anticiper. Entre investiguer une alerte isolée et comprendre qu'elle fait partie d'une campagne globale. Entre bloquer une IP et savoir pourquoi elle est dangereuse, qui l'utilise, et ce qu'elle cherche.
Mais voici la vérité la plus importante : l'intelligence des menaces, c'est l'intelligence collective. MISP n'est pas qu'un outil – c'est une communauté. Chaque fois que tu partages un IOC, tu renforces les défenses de tous. Chaque fois que tu importes un feed, tu bénéficies du travail des autres.
Tu n'es plus un défenseur isolé dans ton SOC. Tu es devenu un capteur dans un réseau mondial de vigilance. Tu vois non seulement ce qui arrive à ton réseau, mais aussi ce qui arrive aux autres. Tu anticipes les vagues avant qu'elles ne t'atteignent.
Dans la semaine 31, nous irons plus loin dans l'automatisation de la réponse. Nous apprendrons à orchestrer la réaction, à créer des playbooks qui transforment la détection en action, à fermer les brèches avant qu'elles ne s'élargissent.
Mais pour l'instant, nourris ton MISP. Importe des feeds, crée des événements, enrichis tes alertes. Un jour, un IOC que tu auras ajouté sauvera ton réseau d'une attaque que tu n'auras même pas vue venir.
Un Gardien qui maîtrise la Threat Intelligence ne combat jamais dans l'ignorance.
— Platon-Y