← Accueil

PCTAMALOU

Semaine 30 : L'Intelligence des Menaces – Threat Intelligence avec MISP

Par Platon-Y – pctamalou.fr & e-of-h.fr

🎯 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.

flowchart TD S[🌐 Sources TI] -->|Feeds STIX/TAXII| M[🔄 MISP Platform] T[🎯 Threat Actors] -->|Campagnes APT| M I[🕵️‍♂️ Incident Response] -->|IOC Locaux| M M -->|Enrichissement| E[📊 Événements enrichis] E -->|Corrélation| C[🔗 Contexte MITRE ATT&CK] E -->|Export| W[⚡ Wazuh SIEM] E -->|Sharing| P[🤝 Communauté MISP] W -->|Alertes enrichies| A[🚨 Alertes contextuelles] A -->|Automatisation| B[🛡️ Blocage Firewall/IDS] A -->|Investigation| R[📋 Réponse rapide] subgraph "🎯 Cycle de vie IOC" COL[Collecte] ENR[Enrichissement] COR[Corrélation] ACT[Action] SHA[Partage] end M --> COL COL --> ENR ENR --> COR COR --> ACT ACT --> SHA SHA --> M style M fill:#0a0e17,stroke:#9d4edd,stroke-width:3px style W fill:#0a0e17,stroke:#00d4ff,stroke-width:2px style A fill:#0a0e17,stroke:#ef4444,stroke-width:2px

📚 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

Pour les décideurs
🎯

Opérationnelle

Moyen terme
TTPs, campagnes

Pour les SOC/CTI
⚡

Tactique

Court terme
IOC, signatures

Pour les équipes tech
🔍

Technique

Immédiat
Hashes, IPs, URLs

Pour les outils

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

  1. Fraîcheur : Un IOC de 6 mois est probablement inutile
  2. Confidence : Score de confiance (0-100)
  3. False Positives : IPs partagées (CDN, Cloud)
  4. Expiration : TTL (Time To Live) des IOC
  5. Context : Sans contexte, un IOC est dangereux

Intégration avec le SOC (Security Operations Center)

🔄 Flux d'Intégration Typique

  1. Collecte : Feeds → MISP (automatique)
  2. Enrichissement : Virustotal, Shodan, etc.
  3. Corrélation : MITRE ATT&CK, galaxies
  4. Export : Vers SIEM (Wazuh), firewall, EDR
  5. Feedback : IOC internes → partage externe

🔬 Mission pratique – Laboratoire (2 heures)

Architecture du Lab MISP

flowchart LR M[MISP Docker
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 :

  1. Changer le mot de passe admin
  2. Mettre à jour l'email admin
  3. Configurer HTTPS valide (Let's Encrypt en prod)
  4. Restreindre l'accès réseau (firewall)
  5. 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 :

  1. Titre : "APT29 (Cozy Bear) - Campaign Midnight"
  2. Description : Simulation d'une campagne de spearphishing
  3. Attributs :
    • IP: 185.220.100.240 (Tor exit node exemple)
    • Domain: malicious-pctamalou[.]com
    • Hash: e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 (sha256 vide)
    • Filename: invoice_pctamalou.exe
  4. Tags : APT29, spearphishing, T1566.001
  5. 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 :

  1. Module MISP Wazuh : Intégration native (recommandé)
  2. 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 :

  1. Récupère les nouveaux IOC de MISP (API)
  2. Les enrichit avec Virustotal/Shodan (si clés API)
  3. Ajoute des scores de confiance
  4. Exporte vers Suricata (format rules)
  5. 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