Share
## https://sploitus.com/exploit?id=80E15B48-9525-5CE1-8DB6-0FC4C91F9811
# Agent Autonome de Red Teaming Guidé par LLM et MITRE ATT&CK

**Projet Fil Rouge — PĂ©rimĂštre 2 : Red Teaming & LLM**  
**TĂ©lĂ©com Paris — MSCYBER2 BE4**

---

## Démarrage rapide

### Prérequis

| Outil | Version minimale | RĂŽle |
|-------|-----------------|------|
| [Docker Desktop](https://www.docker.com/products/docker-desktop/) | 24+ | Orchestration des conteneurs |
| [Ollama](https://ollama.com/) | 0.3+ | Serveur LLM local (tourne sur l'hĂŽte) |
| Python | 3.12+ | Uniquement si lancement sans Docker |

> **Note :** Ollama doit tourner sur la machine hĂŽte, pas dans Docker. Les conteneurs le joignent via `host.docker.internal:11434`.

---

### 1. Installer le modĂšle LLM

```bash
ollama pull qwen2.5-coder:7b
```

Vérifier qu'Ollama répond :

```bash
curl http://localhost:11434/api/tags
```

---

### 2. Configurer l'environnement

```bash
cp .env.example .env
```

Variables clés dans `.env` :

```env
LLM_PROVIDER=ollama
LLM_MODEL=qwen2.5-coder:7b
OLLAMA_BASE_URL=http://host.docker.internal:11434

MSF_RPC_HOST=c2-server
MSF_RPC_PORT=55553
MSF_RPC_USER=msf
MSF_RPC_PASS=password

TARGET_IP=172.20.0.4
TARGET_PORT=80

VULN_INTEL_ENABLED=1     # extraction CVE live (NVD/EPSS/CIRCL/OSV)
MAX_HOSTS=64             # cap sécurité pour les scans CIDR
```

Pour passer en provider cloud (optionnel — hypothĂšse d'Ă©valuation) :
```env
LLM_PROVIDER=mistral
LLM_MODEL=mistral-large-latest
MISTRAL_API_KEY=sk-...
```

---

### 3. Lancer la stack complĂšte

```bash
docker compose up -d c2-server target-dvwa target-metasploitable target-juiceshop target-snmp dashboard
```

Attendre ~30 secondes que les services démarrent, puis ouvrir le dashboard :

```
http://localhost:8501
```

---

### 4. Choisir sa cible

Le projet embarque **quatre cibles** ; l'agent adapte automatiquement l'outil d'exploitation selon le service découvert :

| Cible | IP interne | Port | Type | Exploitation |
|-------|-----------|------|------|--------------|
| **DVWA** | `172.20.0.4` | 80 (→ 8080 hîte) | Application web PHP | Scripts Python (SQLi, XSS, command injection, CSRF, upload
) |
| **Metasploitable2** | `172.20.0.5` | — | Services rĂ©seau | **Metasploit** (vsftpd backdoor, Samba, VNC
 → shells root) |
| **Juice Shop** | `172.20.0.6` | 3000 | Application web moderne (OWASP) | Scripts Python (injection, authz, XSS DOM
) |
| **SNMP** | `172.20.0.7` | 161/udp | Équipement rĂ©seau simulĂ© | Metasploit `auxiliary/scanner/snmp/snmp_login` |

> Le LLM dĂ©cide lui-mĂȘme MSF vs Python selon les services dĂ©couverts par nmap.

Il est aussi possible de scanner une **plage CIDR** — l'agent dĂ©couvre automatiquement les hĂŽtes actifs :

```bash
docker compose run --rm agent-ia python -m agent.main --target 172.20.0.0/24
```

---

### 5. Utiliser le dashboard

Le dashboard Streamlit (`http://localhost:8501`) offre les panneaux suivants :

| Panneau | Description |
|---------|-------------|
| **SantĂ© des services** | État Ollama / Metasploit / cible en temps rĂ©el |
| **Ping** | Bouton de vérification de liveness avant tout scan |
| **Profil de scan** | `quick` (~30 s) · `standard` (~2-3 min) · `full` · `stealth` · `udp` |
| **Arbre ATT&CK** | Graphe interactif des nƓuds, statut en direct |
| **Scan détaillé** | OS détecté, type d'équipement, ports/services/versions/CPE |
| **Scénarios d'attaque** | Table priorisée par faisabilité (EPSS + CVSS + exploit public + outil), kill-chains par tactique MITRE |
| **Commandes exécutées** | Commandes nmap, nuclei, MSF et scripts lancés pendant le run |
| **Résultats / AccÚs obtenus** | Tableau classifié : élévation de privilÚges · accÚs shell · identifiants · succÚs/échec |
| **Métriques tokens** | Consommation prompt + completion, appels LLM, débit tok/s |
| **Rapport** | Téléchargement `.md` et `.pdf` en fin de run |

**Flux d'utilisation :**
1. Vérifier l'état des services dans la barre latérale
2. Entrer l'IP cible et choisir le profil de scan
3. Cliquer **Ping** pour valider la liveness
4. Lancer le pipeline
5. Suivre l'arbre ATT&CK et les logs en temps réel
6. Télécharger le rapport une fois terminé

---

### 6. Lancer l'agent en ligne de commande

```bash
# Vérifier si une cible est joignable
docker compose run --rm agent-ia python -m agent.main --target 172.20.0.4 --ping

# DVWA (web) — profil standard
docker compose run --rm agent-ia python -m agent.main --target 172.20.0.4 --port 80 --profile standard

# Metasploitable2 (rĂ©seau) — exploitation Metasploit
docker compose run --rm agent-ia python -m agent.main --target 172.20.0.5 --profile quick

# Juice Shop (OWASP web app)
docker compose run --rm agent-ia python -m agent.main --target 172.20.0.6 --port 3000 --profile standard

# Plage CIDR — dĂ©couverte automatique + scan de chaque hĂŽte vivant
docker compose run --rm agent-ia python -m agent.main --target 172.20.0.0/24 --profile quick
```

**Options CLI :**

| Option | Description | Défaut |
|--------|-------------|--------|
| `--target` | IP, plage CIDR ou liste d'IPs | `$TARGET_IP` |
| `--port` | Port cible | `$TARGET_PORT` |
| `--profile` | `quick` · `standard` · `full` · `stealth` · `udp` | `standard` |
| `--ping` | VĂ©rifier la liveness puis quitter | — |

**Codes de sortie :**
- `0` — taux de complĂ©tion ≄ 70 %
- `1` — taux de complĂ©tion < 70 %
- `2` — erreur critique (service inaccessible, etc.)

---

### Commandes utiles

```bash
# Voir les logs en temps réel
docker compose logs -f dashboard
docker compose logs -f agent-ia

# Reconstruire aprĂšs modification du code
docker compose build dashboard
docker compose up -d dashboard

# ArrĂȘter tous les services
docker compose down

# Réinitialiser complÚtement (supprime les volumes)
docker compose down -v

# Vider le cache intel CVE (force une re-interrogation NVD/EPSS)
rm -rf logs/intel_cache/
```

---

### Dépannage rapide

| SymptĂŽme | Cause probable | Solution |
|----------|---------------|----------|
| Ollama rouge dans le dashboard | Ollama non démarré sur l'hÎte | `ollama serve` |
| DVWA rouge | Conteneur pas encore prĂȘt | Attendre 30 s puis rafraĂźchir |
| Metasploit rouge | `c2-server` non démarré | `docker compose up -d c2-server` |
| Pipeline bloquĂ© sur un nƓud MSF | MSFRPC saturĂ© (nombreux runs) | `docker compose restart c2-server` |
| Scan nmap qui timeout | Profil trop lourd / timeout court | Utiliser `quick`, ou augmenter `SCAN_TIMEOUT` |
| Dashboard inaccessible | Port 8501 occupé | `docker compose down` puis relancer |
| CVE enrichissement vide | NVD rate limit (quota 5 req/30s) | Attendre 30 s ou désactiver avec `VULN_INTEL_ENABLED=0` |
| Ping échoue sur une cible | HÎte éteint ou filtré | Vérifier que le conteneur cible est `Up` via `docker compose ps` |

---

## Architecture

```
[Scan actif]
  Nmap + Nuclei → ScanResult
        │
        ├──â–ș Liveness check (nmap -sn)   ← discovery.py
        ├──â–ș Classification device_type  ← classify.py
        └──â–ș Enrichissement CVE live     ← vuln_feed.py (NVD + EPSS + CIRCL + OSV)
        │
        ▌
[ScĂ©narios priorisĂ©s]                    ← scenarios.py
  Score faisabilitĂ© = EPSS×0.40 + CVSS×0.15 + exploit_pub×0.20 + vecteur×0.10 + outil×0.15
  Kill-chains par tactique ATT&CK
        │
        ▌
[Moteur ATT&CK]  ← couche de contrĂŽle dĂ©terministe
  ScanResult → AttackTree (EPSS-aware, prioritĂ© boostĂ©e si EPSS ≄ 0.5)
        │
        ▌
[LLM local (Ollama/qwen2.5-coder:7b)]  ← dĂ©cision contrainte + historique ReAct
  SĂ©lection outil (MSF vs Python) → gĂ©nĂ©ration payload
  Validateur : node_id ∈ valid_ids  (reject si hors arbre)
        │
        ▌
[Exécution contrÎlée]
  Metasploit MSFRPC  |  Script Python sandboxé (subprocess + timeout)
        │
   Ă©chec ──â–ș [Reflexion] ──â–ș correction (max 3)
        │
   Ă©chec ──â–ș [Template dĂ©terministe] ──â–ș fallback DVWA/MSF catalogue
        │
        ▌
[Rapport ATT&CK]  ← reporter.py + pdf.py
  Markdown + PDF : scénarios, kill-chains, accÚs obtenus, métriques tokens
```

---

## Infrastructure Docker

| Service | Image | IP | Port hĂŽte | RĂŽle |
|---------|-------|----|-----------|------|
| `agent-ia` | python:3.12-slim (Dockerfile.agent) | dynamique | — | Orchestrateur LLM + pipeline (CLI) |
| `dashboard` | python:3.12-slim (Dockerfile.dashboard) | dynamique | **8501** | Interface Streamlit de monitoring |
| `c2-server` | metasploit-framework | 172.20.0.3 | 55553 | Metasploit + MSFRPC |
| `target-dvwa` | vulnerables/web-dvwa | 172.20.0.4 | **8080** | Cible web (DVWA, Apache + PHP + MySQL) |
| `target-metasploitable` | tleemcjr/metasploitable2 | 172.20.0.5 | — | Cible rĂ©seau (services exploitables MSF) |
| `target-juiceshop` | bkimminich/juice-shop | 172.20.0.6 | **3000** | Cible web moderne (OWASP Juice Shop) |
| `target-snmp` | polinux/snmpd:alpine | 172.20.0.7 | 161/udp | Équipement rĂ©seau simulĂ© (SNMP) |

RĂ©seau interne isolĂ© `pentest-net` (172.20.0.0/16) — aucune connexion externe depuis les cibles.

---

## Stratégie LLM : local-first, cloud-ready

| Phase | Environnement | ModĂšle | Justification |
|-------|--------------|--------|---------------|
| **Développement & évaluation** | Ollama local | `qwen2.5-coder:7b` | Reproductible, gratuit, validé pour ATT&CK (SANS 2025) |
| **HypothĂšse cloud** | Cloud API | Mistral / OpenAI / Claude | Via abstraction LiteLLM — mĂȘme code, changer `LLM_PROVIDER` dans `.env` |

---

## Contribution technique et scientifique

| Propriété | Justification scientifique |
|-----------|---------------------------|
| Raisonnement contraint par ATT&CK + validateur d'action | OpenReview x4sdXZ7Jdu — +300% taux de succĂšs vs. non guidĂ© |
| Ingestion Nmap + Nuclei + classificateur de device | Gap documenté dans la littérature |
| Renseignement CVE live (NVD + EPSS + CIRCL + OSV) | PentestAgent — enrichissement dynamique des vulnĂ©rabilitĂ©s |
| Score de faisabilité EPSS-aware | Priorisation probabiliste de l'exploitabilité réelle |
| Scénarios priorisés + kill-chains ATT&CK | Planification tactique lisible et exportable |
| Scan multi-hÎtes / CIDR avec classification | Couverture d'infrastructure réaliste |
| Auto-correction bornée (Reflexion) | Shinn et al., NeurIPS 2023 |
| 3 couches d'exĂ©cution (LLM → Reflexion → fallback) | RĂ©silience face aux faiblesses du petit modĂšle local |
| Rapport explicable par tactique (Markdown + PDF) | Absence documentée dans la littérature |

---

## Documentation

| Document | Contenu |
|----------|---------|
| [Documentation technique](docs/technical_documentation.md) | Fonctionnement A-à-Z, modules, flux de données, décisions de conception |
| [Architecture](docs/architecture.md) | Modules, pipeline, garde-fous agentiques, variables d'env |
| [État de l'art](docs/etat_de_lart.md) | 4 blocs, rĂ©fĂ©rences, lacunes identifiĂ©es |
| [Roadmap](docs/roadmap.md) | Milestones avec critÚres de validation et protocole expérimental |

---

## Limites explicites du projet

- **Scope** : environnements de laboratoire isolés uniquement (Docker, Metasploitable2, DVWA, Juice Shop, SNMP simulé)
- **ModĂšle Ă©valuĂ©** : Ollama `qwen2.5-coder:7b` local — le passage cloud (Mistral, OpenAI
) est une hypothĂšse non Ă©valuĂ©e
- **Intel CVE** : nécessite un accÚs internet depuis la machine hÎte ; en mode hors-ligne, le cache disque (24h) est utilisé en dégradation gracieuse
- **MĂ©triques de rĂ©fĂ©rence** : les chiffres 71-78% de complĂ©tion et -55,9% d'appels LLM sont ceux du papier de rĂ©fĂ©rence (OpenReview x4sdXZ7Jdu) — les mesures propres au projet seront produites lors de la phase d'Ă©valuation

---

## Références clés

- **[PRINCIPAL]** *Guided Reasoning for LLM-Driven Penetration Testing Agents* — OpenReview x4sdXZ7Jdu
- *PentestAgent: Incorporating LLM Agents to Automated Penetration Testing* — arXiv:2411.05185
- *Can LLMs Hack Enterprise Networks?* — arXiv:2502.04227
- *Reflexion: Language Agents with Verbal Reinforcement Learning* — Shinn et al., NeurIPS 2023
- *MITRE ATT&CK Framework* — https://attack.mitre.org/
- *NVD 2.0 API* — https://nvd.nist.gov/developers/vulnerabilities
- *EPSS (Exploit Prediction Scoring System)* — https://www.first.org/epss/