Laboratoire Snort 3 IDS → IPS sur Kali. Règles de détection personnalisées + application iptables contre la reconnaissance ICMP, les scans SYN Nmap, la force brute FTP avec Hydra, et la backdoor vsftpd 2.3.4 (CVE-2011-2523).
Un déploiement complet de Snort 3 à la fois en tant que système de détection d’intrusion (monitoring passif) et système de prévention d’intrusion (blocage actif via iptables), validé contre quatre vecteurs d’attaque au sein d’un réseau virtuel de trois machines sur Kali Linux.
Le laboratoire démontre la distinction opérationnelle entre détection et prévention en exécutant deux fois une même chaîne d’attaque à quatre vecteurs — d’abord contre un IDS qui journalise mais ne peut pas bloquer, puis contre une couche IDS + IPS basée sur iptables qui bloque les attaques de manière sélective tout en préservant le trafic légitime.
| Composant | Détails |
|---|---|
| Analyseur / Routeur | Kali Linux — 3 adaptateurs : eth0 WAN (192.168.10.143, NAT), eth1 LAN1 (10.10.10.1, host-only), eth2 LAN2 (192.168.50.1, host-only) |
| Attaquant | Kali Linux — eth0 sur VMnet9 (10.10.10.10) — passerelle par défaut 10.10.10.1 |
| Cible | Metasploitable 2 — eth0 sur VMnet10 (192.168.50.10) — passerelle par défaut 192.168.50.1 |
| Version de Snort | Snort++ 3.12.1.0-0kali1 (installé sur l’Analyseur) |
| Outils d’attaque | Nmap 7.99, Hydra v9.6, Metasploit Framework (msfconsole) |
| Virtualisation | VMware — VMnet9 = 10.10.10.0/24, VMnet10 = 192.168.50.0/24 (tous deux host-only) |
Tout le trafic entre l’Attaquant et Metasploitable est obligé de passer par l’Analyseur, ce qui en fait le point de contrôle naturel à la fois pour la surveillance et l’application des règles.
┌─────────────────────────┐
│ Analyseur / Routeur │
│ Kali + Snort 3 │
│ │
Attaquant Kali ──VMnet9──┤ eth1: 10.10.10.1 │
10.10.10.10 │ │
│ eth0: 192.168.10.143 ───┼──> WAN (NAT)
│ │
Metasploitable 2 ─VMnet10┤ eth2: 192.168.50.1 │
192.168.50.10 │ │
└─────────────────────────┘
Remplacez ce schéma ASCII par
screenshots/01-network-topology.pngune fois que vous avez l’image en place :Topologie
Le laboratoire se déroule en deux étapes avec une chaîne d’attaque identique à quatre vecteurs à chaque fois :
ping pour la découverte d’hôtesnmap -sS pour l’énumération des ports (1000 ports)Étape 1 (IDS) exécute Snort en mode passif sur l’Analyseur avec cinq règles personnalisées — observer les alertes en temps réel, confirmer que l’exploitation se déroule malgré tout.
Étape 2 (IPS) associe Snort à une couche d’application iptables utilisant des règles de blocage chirurgicales — confirmer que les attaques sont bloquées tandis que le ping ICMP et la connexion FTP légitime restent fonctionnels.
MASQUERADE + FORWARD pour que l’Analyseur route entre les sous-réseaux et vers le WAN — voir scripts/router_config.sh.scripts/ping_check.sh avant d’installer Snort.Snort est installé via le gestionnaire de paquets Kali (sudo apt install snort -y) et configuré dans /etc/snort/snort.conf :
HOME_NET = "10.10.10.0/24,192.168.50.0/24"
EXTERNAL_NET = "any"
ips = {
enable_builtin_rules = true,
include = "/etc/snort/rules/local.rules",
variables = default_variables
}
alert_fast = { file = true, packet = false }
HOME_NET couvre les deux sous-réseaux internes afin que Snort considère tout le trafic inter-sous-réseaux sur l’Analyseur comme digne d’inspection. alert_fast produit des alertes compactes sur une ligne (la journalisation paquet par paquet générerait un volume excessif).
Validation de la configuration :
sudo snort -T -c /etc/snort/snort.conf
# Résultat : 652 règles chargées (5 personnalisées textuelles + 647 intégrées), 0 avertissements
Cinq règles dans /etc/snort/rules/local.rules (fichier complet dans scripts/local.rules) :
| SID | Nom | Déclencheur |
|---|---|---|
| 1000001 | Ping ICMP détecté | Tout trafic ICMP dans les deux sens — détecte les pings de reconnaissance |
| 1000002 | Tentative de connexion FTP | Toute connexion TCP vers le port 21 — détecte le trafic légitime et la force brute |
| 1000003 | Possible scan SYN Nmap | Paquets TCP avec uniquement le flag SYN (flags:S) — signature d’un scan half-open |
| 1000004 | Tentative de backdoor VSFTPD 2.3.4 | content:":)" sur le port FTP 21 — la chaîne exacte du déclencheur CVE-2011-2523 |
| 1000005 | Possible shellcode Metasploit | `content:" |
Snort s’exécute en mode passif sur les deux interfaces internes :
sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 \
-A alert_fast -l /var/log/snort/
# Surveiller les alertes dans un second terminal :
sudo tail -f /var/log/snort/alert_fast.txt
Le message de démarrage confirme pcap DAQ configured to passive — Snort voit chaque paquet mais ne peut ni les supprimer ni les modifier.
Après avoir exécuté scripts/attack_simulator.sh depuis l’Attaquant :
| Attaque | Détection | Résultat |
|---|---|---|
| Reconnaissance ICMP | ✅ SID 1000001 — alertes bidirectionnelles | Ping terminé |
| Scan SYN Nmap | ✅ SID 1000003 — milliers d’alertes en <1 seconde | 23 ports ouverts énumérés |
| Force brute FTP Hydra | ✅ SID 1000002 — alertes répétées de connexion FTP | Identifiants msfadmin:msfadmin découverts |
| Backdoor vsftpd 2.3.4 | ✅ SID 1000004 — correspondance de contenu :) déclenchée | Shell root Meterpreter obtenu |
L’IDS a tout détecté et n’a rien arrêté. C’est la leçon centrale de l’étape 1 : un IDS fonctionnel sans application des règles est un système d’alarme, pas une serrure. Au moment où un analyste SOC lit les alertes, l’attaquant est déjà root.
Observation secondaire : les règles intégrées de Snort (116:408, 116:414) se déclenchent sur le trafic DHCP broadcast — pas malveillant, mais dans un déploiement en production, elles nécessiteraient des règles de suppression pour garder le journal d’alertes exploitable.
La couche IPS est déployée avec scripts/ips_setup.sh, qui :
-D) pour une journalisation continue| Règle | Ce qu’elle fait |
|---|---|
ACCEPT icmp | Autorise explicitement tout ICMP — préserve les vérifications de connectivité |
DROP tcp dpt:21 STRING ":)" | Supprime les paquets contenant le déclencheur de backdoor vsftpd 2.3.4 sur le port 21 |
ACCEPT tcp --syn -m limit --limit 10/s --limit-burst 20 | Autorise les poignées de main TCP normales dans la limite de débit |
DROP tcp --syn (après limite) | Supprime les inondations SYN dépassant 10/s — neutralise les scans SYN Nmap |
DROP tcp dpt:21 -m connlimit --connlimit-above 5 --connlimit-mask 32 | Bloque > 5 connexions FTP simultanées par source — neutralise le parallélisme d’Hydra |
ACCEPT eth1→eth0, ACCEPT eth2→eth0 | Routage normal du trafic sortant |
ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED | Stateful — préserve les sessions établies |
Le même script d’attaque a été relancé depuis l’Attaquant :
| Attaque | Résultat étape 2 |
|---|---|
| Reconnaissance ICMP | ✅ Autorisé (intentionnel) |
| Scan SYN Nmap | ❌ Bloqué — 1000 ports TCP filtrés (aucune réponse), scan a pris 21,71 s au lieu de <1 s |
| Force brute FTP Hydra | ❌ Bloqué — tous les enfants ont été désactivés en raison de trop d’erreurs de connexion — 0 mot de passe valide trouvé |
| Backdoor vsftpd | ❌ Bloqué — Rex::ConnectionTimeout — Exploit terminé, mais aucune session créée |
Deux vérifications manuelles ont confirmé l’application sélective :
ping -c 4 192.168.50.10 → 4 paquets transmis, 4 reçus, 0% de perteftp 192.168.50.10 avec msfadmin:msfadmin → 220 (vsFTPd 2.3.4) … 230 Login successfulPreuve quantitative à partir des compteurs de paquets iptables pendant l’exécution : 2051 paquets acceptés, 12 paquets supprimés par la règle connlimit FTP, 808 paquets ICMP acceptés — application sélective en chiffres.
Même en mode IPS, Snort a continué à déclencher les alertes SID 1000002 / 1000003 sur les paquets qui atteignaient son point d’inspection passif avant que iptables ne supprime les suivants — ce qui signifie qu’iptables assure l’application des règles tandis que Snort fournit la journalisation d’audit, fonctionnant de concert.
| Attaque / Trafic | Étape 1 (IDS uniquement) | Étape 2 (IDS + iptables IPS) |
|---|---|---|
| Ping ICMP | Détecté ✅ | Autorisé ✅ (intentionnel) |
| Scan SYN Nmap | Détecté — 23 ports ouverts trouvés | Bloqué — 1000 filtrés |
| Force brute FTP Hydra | Détecté — msfadmin:msfadmin découvert | Bloqué — 0 mots de passe trouvés |
| Exploit vsftpd 2.3.4 | Détecté — Shell root Meterpreter | Bloqué — délai d’attente de connexion |
| Connexion FTP légitime | n/a | Préservée (230 Login successful) |
Oui — chacun des SID 1000001–1000004 s’est déclenché correctement pendant la simulation d’attaque :
:) a capturé exactement la séquence d’octets de l’exploit.Mais détection ≠ prévention. L’exploit vsftpd a ouvert un shell root Meterpreter alors que toutes les alertes se déclenchaient. Un analyste SOC surveillant l’IDS en temps réel aurait vu la compromission — mais avec l’attaquant déjà root en quelques secondes, l’alerte seule ne suffit pas. C’est le cœur opérationnel de la raison d’être de l’IPS.
La mise en œuvre a atteint une atténuation complète des attaques sans impact observable sur le trafic légitime. L’efficacité provient d’une conception chirurgicale des règles — chaque règle iptables cible une signature comportementale, pas un protocole large :
connlimit par source bloque le parallélisme des outils de force brute sans casser les sessions FTP uniques.STRING supprime la charge utile exacte de l’exploit sans filtrer le trafic de connexion FTP légitime.Une limitation reconnue : ICMP est entièrement autorisé, ce qui signifie qu’un attaquant peut toujours confirmer que Metasploitable est en vie via ping. Dans un environnement à plus haute sécurité, cela serait limité en débit ou restreint à des sources de confiance. Dans ce laboratoire, ICMP est le principal mécanisme de vérification de connectivité, il reste donc ouvert.
Ce laboratoire utilise une machine Snort dédiée. Comparé à l’exécution de Snort comme plugin à l’intérieur d’un pare-feu comme pfSense ou OPNsense :
Avantages de l’approche dédiée :
Compromis :
Snort dédié est le bon choix pour les environnements d’entreprise ayant besoin de performances, de positionnement et de personnalisation. L’approche plugin pfSense/OPNsense est plus adaptée aux environnements de petite entreprise ou de laboratoire à domicile où la facilité d’utilisation est prioritaire.
L’étape 2 est techniquement Snort passif + application iptables, et non Snort exécuté en mode inline véritable — Snort lui-même journalise (pcap DAQ configured to passive), et iptables effectue la suppression basée sur les limites de débit, les correspondances de chaînes et les comptages de connexions.
Il s’agit d’un modèle de déploiement légitime et courant (c’est ainsi que fonctionnent de nombreuses piles IDS/IPS Linux réelles). Une suite naturelle consisterait à migrer l’étape 2 vers une configuration inline véritable en utilisant snort --daq nfq (ou afpacket en mode inline) avec les actions de règle reject / drop de Snort, de sorte que Snort lui-même effectue la suppression sur la base de la correspondance complète des signatures plutôt que de déléguer à iptables.
snort-ids-ips-lab/
├── README.md ← ce fichier
├── report/
│ ├── Snort-IDS-IPS-Report.pdf ← rapport de laboratoire complet
│ └── Snort-IDS-IPS-Report.docx ← source modifiable
├── scripts/
│ ├── router_config.sh ← forwarding IP + routage iptables
│ ├── ping_check.sh ← vérification de connectivité
│ ├── attack_simulator.sh ← chaîne d’attaque à 4 vecteurs
│ ├── ips_setup.sh ← règles iptables IPS + démon Snort
│ └── local.rules ← 5 règles Snort personnalisées (SID 1000001-1000005)
├── screenshots/ ← figures du rapport
├── .gitignore
└── LICENSE
⚠️ Utilisation en laboratoire uniquement. Ces scripts exécutent de véritables exploits et outils de force brute contre une cible volontairement vulnérable. Ne les exécutez pas contre un système dont vous n’êtes pas propriétaire et pour lequel vous n’avez pas d’autorisation écrite explicite de test.
scripts/router_config.sh, puis scripts/ping_check.sh pour confirmer la connectivité complète.sudo apt update && sudo apt install snort -y
scripts/local.rules dans /etc/snort/rules/local.rules et définir HOME_NET = "10.10.10.0/24,192.168.50.0/24" dans /etc/snort/snort.conf.sudo snort -T -c /etc/snort/snort.conf — attendre 652 règles chargées, 0 avertissements.sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 -A alert_fast -l /var/log/snort/
# Dans un autre terminal :
sudo tail -f /var/log/snort/alert_fast.txt
sudo ./scripts/attack_simulator.sh — observer les alertes se déclencher et le shell Meterpreter.sudo ./scripts/ips_setup.sh, puis relancer la chaîne d’attaque sur l’Attaquant. Confirmer les blocages, puis tester manuellement :
ping -c 4 192.168.50.10 # doit réussir
ftp 192.168.50.10 # msfadmin / msfadmin — doit réussir
Toutes les activités documentées dans ce dépôt ont été menées exclusivement dans un environnement de laboratoire virtuel VMware autonome à des fins d’apprentissage académique supervisé. Aucun système externe, de production ou réel n’a été ciblé, scanné ou affecté de quelque manière que ce soit. Metasploitable 2 est une machine virtuelle intentionnellement vulnérable conçue spécifiquement pour la formation en sécurité.
Ce matériel ne doit pas être utilisé pour reproduire ces activités contre un système réel sans autorisation écrite explicite du propriétaire du système. Les scans de ports, attaques par force brute ou exploitation de services réseau non autorisés sont illégaux dans la plupart des juridictions.
MIT — voir LICENSE. Le rapport de laboratoire lui-même est fourni à titre de référence éducative.