
Laboratorio Snort 3 IDS → IPS su Kali. Regole di rilevamento personalizzate + applicazione di iptables contro ricognizione ICMP, scansioni SYN di Nmap, forza bruta FTP su Hydra e backdoor vsftpd 2.3.4 (CVE-2011-2523).
Un deployment a ciclo completo di Snort 3 sia come Intrusion Detection System (monitoraggio passivo) che come Intrusion Prevention System (blocco attivo tramite iptables), validato contro quattro vettori di attacco su una rete virtuale a tre macchine su Kali Linux.
Il laboratorio dimostra la distinzione operativa tra rilevamento e prevenzione eseguendo due volte una catena di attacco a quattro vettori identica — prima contro un IDS che registra ma non può bloccare, poi contro un IDS + livello IPS iptables che elimina gli attacchi selettivamente preservando il traffico legittimo.
| Componente | Dettagli |
|---|---|
| Analizzatore / Router | Kali Linux — 3 adattatori: eth0 WAN (192.168.10.143, NAT), eth1 LAN1 (10.10.10.1, solo host), eth2 LAN2 (192.168.50.1, solo host) |
| Attaccante | Kali Linux — eth0 su VMnet9 (10.10.10.10) — gateway predefinito 10.10.10.1 |
| Bersaglio | Metasploitable 2 — eth0 su VMnet10 (192.168.50.10) — gateway predefinito 192.168.50.1 |
| Versione di Snort | Snort++ 3.12.1.0-0kali1 (installato su Analizzatore) |
| Strumenti d'attacco | Nmap 7.99, Hydra v9.6, Metasploit Framework (msfconsole) |
| Virtualizzazione | VMware — VMnet9 = 10.10.10.0/24, VMnet10 = 192.168.50.0/24 (entrambi solo host) |
Tutto il traffico tra l'Attaccante e Metasploitable viene forzato attraverso l'Analizzatore, rendendolo il punto di strozzatura naturale sia per il monitoraggio che per l'applicazione.
┌─────────────────────────┐
│ Analyzer / Router │
│ Kali + Snort 3 │
│ │
Attacker 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 │ │
└─────────────────────────┘
Sostituisci questo schizzo ASCII con
screenshots/01-network-topology.pnguna volta che la figura è al suo posto:Topologia
Il laboratorio si svolge in due fasi con una catena di attacco a quattro vettori identica in ciascuna:
ping per la scoperta dell'hostnmap -sS per l'enumerazione delle porte (1000 porte)Stage 1 (IDS) esegue Snort passivamente sull'Analizzatore con cinque regole personalizzate — osserva gli alert in tempo reale, conferma che lo sfruttamento procede comunque.
Stage 2 (IPS) abbina Snort a un livello di enforcement iptables utilizzando regole di drop chirurgiche — conferma che gli attacchi vengono bloccati mentre il ping ICMP e il login FTP legittimo rimangono funzionali.
MASQUERADE + FORWARD in modo che l'Analizzatore instradi tra le sottoreti e verso il WAN — vedi scripts/router_config.sh.scripts/ping_check.sh prima di installare Snort.Snort viene installato tramite il gestore pacchetti di Kali (sudo apt install snort -y) e configurato in /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 copre entrambe le sottoreti interne in modo che Snort consideri tutto il traffico tra sottoreti sull'Analizzatore degno di ispezione. alert_fast produce alert compatti su una riga (la registrazione per pacchetto genererebbe un volume eccessivo).
Convalida della configurazione:
sudo snort -T -c /etc/snort/snort.conf
# Risultato: 652 regole caricate (5 personalizzate testo + 647 built-in), 0 avvisi
Cinque regole in /etc/snort/rules/local.rules (file completo in scripts/local.rules):
| SID | Nome | Attivazione |
|---|---|---|
| 1000001 | Rilevato Ping ICMP | Qualsiasi traffico ICMP in entrambe le direzioni — intercetta ping di ricognizione |
| 1000002 | Tentativo di Connessione FTP | Qualsiasi connessione TCP alla porta 21 — intercetta traffico legittimo e di forza bruta |
| 1000003 | Possibile Scansione SYN di Nmap | Pacchetti TCP con solo il flag SYN impostato (flags:S) — la firma di una scansione half-open |
| 1000004 | Tentativo Backdoor VSFTPD 2.3.4 | content:":)" sulla porta FTP 21 — la stringa di attivazione esatta di CVE-2011-2523 |
| 1000005 | Possibile Shellcode Metasploit | `content:" |
Snort viene eseguito in modalità passiva su entrambe le interfacce interne:
sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 \
-A alert_fast -l /var/log/snort/
# Osserva gli alert in un secondo terminale:
sudo tail -f /var/log/snort/alert_fast.txt
L'output di avvio conferma pcap DAQ configured to passive — Snort vede ogni pacchetto ma non può eliminare o modificare nessuno di essi.
Dopo aver eseguito scripts/attack_simulator.sh dall'Attaccante:
| Attacco | Rilevamento | Esito |
|---|---|---|
| Riconoscimento ICMP | ✅ SID 1000001 — alert bidirezionali | Ping completato |
| Scansione SYN Nmap | ✅ SID 1000003 — migliaia di alert in <1 secondo | 23 porte aperte enumerate |
| Forza bruta FTP Hydra | ✅ SID 1000002 — ripetuti alert di connessione FTP | Credenziali msfadmin:msfadmin scoperte |
| Backdoor vsftpd 2.3.4 | ✅ SID 1000004 — corrispondenza contenuto :) attivata | Ottenuta shell Root Meterpreter |
L'IDS ha rilevato tutto e non ha fermato nulla. Questa è la lezione centrale dello Stage 1: un IDS funzionante senza enforcement è un sistema di allarme, non una serratura. Quando un analista umano legge gli alert, l'attaccante è già root.
Un'osservazione secondaria: le regole built-in di Snort (116:408, 116:414) si attivano sul traffico broadcast DHCP — non malizioso, ma in un deployment di produzione avrebbero bisogno di regole di soppressione per mantenere il log degli alert utilizzabile.
Il livello IPS viene distribuito con scripts/ips_setup.sh, che:
-D) per la registrazione continua| Regola | Cosa fa |
|---|---|
ACCEPT icmp | Consente esplicitamente tutto ICMP — preserva i controlli di connettività |
DROP tcp dpt:21 STRING ":)" | Elimina i pacchetti contenenti il trigger della backdoor vsftpd 2.3.4 sulla porta 21 |
ACCEPT tcp --syn -m limit --limit 10/s --limit-burst 20 | Consente gli handshake TCP normali entro il limite di velocità |
DROP tcp --syn (dopo il limite) | Elimina gli SYN flood che superano 10/s — sconfigge le scansioni SYN di Nmap |
DROP tcp dpt:21 -m connlimit --connlimit-above 5 --connlimit-mask 32 | Blocca > 5 connessioni FTP concorrenti per sorgente — sconfigge il parallelismo di Hydra |
ACCEPT eth1→eth0, ACCEPT eth2→eth0 | Routing di uscita normale |
ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED | Stateful — preserva le sessioni stabilite |
Lo stesso script di attacco è stato rieseguito dall'Attaccante:
| Attacco | Esito Stage 2 |
|---|---|
| Riconoscimento ICMP | ✅ Consentito (intenzionale) |
| Scansione SYN Nmap | ❌ Bloccato — 1000 porte tcp filtrate (nessuna risposta), scansione ha richiesto 21.71 s invece di <1 s |
| Forza bruta FTP Hydra | ❌ Bloccato — tutti i figli sono stati disabilitati a causa di troppi errori di connessione — 0 password valida trovata |
| Backdoor vsftpd | ❌ Bloccato — Rex::ConnectionTimeout — Exploit completato, ma nessuna sessione creata |
Due controlli manuali hanno confermato l'enforcement selettivo:
ping -c 4 192.168.50.10 → 4 pacchetti trasmessi, 4 ricevuti, 0% perditaftp 192.168.50.10 con msfadmin:msfadmin → 220 (vsFTPd 2.3.4) … 230 Login riuscitoProva quantitativa dai contatori pacchetti iptables durante l'esecuzione: 2051 pacchetti accettati, 12 pacchetti eliminati dalla regola connlimit FTP, 808 pacchetti ICMP accettati — enforcement selettivo in numeri.
Anche in modalità IPS, Snort ha continuato a generare alert SID 1000002 / 1000003 sui pacchetti che hanno raggiunto il suo punto di ispezione passiva prima che iptables eliminasse quelli successivi — ciò significa che iptables fornisce l'enforcement mentre Snort fornisce la registrazione di audit, operando in tandem.
| Attacco / Traffico | Stage 1 (solo IDS) | Stage 2 (IDS + iptables IPS) |
|---|---|---|
| Ping ICMP | Rilevato ✅ | Consentito ✅ (intenzionale) |
| Scansione SYN Nmap | Rilevato — 23 porte aperte trovate | Bloccato — 1000 filtrate |
| Forza bruta FTP Hydra | Rilevato — msfadmin:msfadmin scoperto | Bloccato — 0 password trovate |
| Exploit vsftpd 2.3.4 | Rilevato — Shell Root Meterpreter | Bloccato — timeout connessione |
| Login FTP legittimo | n/a | Preservato (230 Login riuscito) |
Sì — ciascuno dei SID 1000001–1000004 si è attivato correttamente durante la simulazione dell'attacco:
:) ha catturato la sequenza di byte esatta dell'exploit.Ma rilevamento ≠ prevenzione. L'exploit vsftpd ha aperto una shell Meterpreter root mentre ogni alert si attivava. Un analista SOC che osserva l'IDS in tempo reale avrebbe visto il compromesso — ma con l'attaccante già root in pochi secondi, la sola segnalazione non basta. Questo è il nucleo operativo del perché esiste l'IPS.
L'implementazione ha ottenuto una mitigazione completa degli attacchi con zero impatto osservabile sul traffico legittimo. L'efficacia deriva dalla progettazione chirurgica delle regole — ogni regola iptables mira a una firma comportamentale, non a un protocollo generico:
connlimit per sorgente blocca il parallelismo degli strumenti di forza bruta senza rompere l'FTP a sessione singola.STRING elimina il payload esatto dell'exploit senza filtrare il traffico di login FTP legittimo.Una limitazione riconosciuta: ICMP è completamente consentito, il che significa che un attaccante può ancora confermare che Metasploitable è vivo tramite ping. In un ambiente a più alta sicurezza questo sarebbe limitato in velocità o ristretto a fonti fidate. In questo laboratorio, ICMP è il meccanismo primario di verifica della connettività, quindi rimane aperto.
Questo laboratorio utilizza una macchina Snort dedicata. Rispetto all'esecuzione di Snort come plugin all'interno di un appliance firewall come pfSense o OPNsense:
Vantaggi dell'approccio dedicato:
Compromessi:
Snort dedicato è la scelta corretta per ambienti aziendali che necessitano di prestazioni, posizionamento e personalizzazione. L'approccio plugin pfSense/OPNsense è più sensato per ambienti di piccole imprese o home lab che danno priorità alla facilità d'uso.
Lo Stage 2 è tecnicamente Snort passivo + enforcement iptables, non Snort in esecuzione in vera modalità inline — Snort stesso registra (pcap DAQ configured to passive), e iptables esegue l'eliminazione basata su limiti di velocità, corrispondenze di stringhe e conteggi di connessione.
Questo è un pattern di deployment legittimo e comune (è così che molti stack IDS/IPS basati su Linux nel mondo reale operano). Un seguito naturale sarebbe migrare lo Stage 2 a una vera configurazione inline usando snort --daq nfq (o afpacket in modalità inline) con le azioni di regola reject / drop di Snort, così che Snort stesso esegua l'eliminazione basata sulla corrispondenza completa delle firme piuttosto che delegare a iptables.
snort-ids-ips-lab/
├── README.md ← questo file
├── report/
│ ├── Snort-IDS-IPS-Report.pdf ← rapporto di laboratorio completo
│ └── Snort-IDS-IPS-Report.docx ← sorgente modificabile
├── scripts/
│ ├── router_config.sh ← IP forwarding + iptables routing
│ ├── ping_check.sh ← verifica connettività
│ ├── attack_simulator.sh ← catena d'attacco a 4 vettori
│ ├── ips_setup.sh ← regole iptables IPS + demone Snort
│ └── local.rules ← 5 regole Snort personalizzate (SID 1000001-1000005)
├── screenshots/ ← figure del rapporto
├── .gitignore
└── LICENSE
⚠️ Solo uso laboratorio. Questi script eseguono exploit reali e strumenti di forza bruta contro un target deliberatamente vulnerabile. Non eseguirli contro alcun sistema di cui non possiedi e non hai esplicita autorizzazione scritta per testare.
scripts/router_config.sh, poi scripts/ping_check.sh per confermare la connettività completa.sudo apt update && sudo apt install snort -y
scripts/local.rules in /etc/snort/rules/local.rules e imposta HOME_NET = "10.10.10.0/24,192.168.50.0/24" in /etc/snort/snort.conf.sudo snort -T -c /etc/snort/snort.conf — aspettati 652 regole caricate, 0 avvisi.sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 -A alert_fast -l /var/log/snort/
# In un altro terminale:
sudo tail -f /var/log/snort/alert_fast.txt
sudo ./scripts/attack_simulator.sh — osserva gli alert attivarsi e la shell Meterpreter.sudo ./scripts/ips_setup.sh, poi riesegui la catena d'attacco sull'Attaccante. Conferma i blocchi, poi testa manualmente:
ping -c 4 192.168.50.10 # dovrebbe riuscire
ftp 192.168.50.10 # msfadmin / msfadmin — dovrebbe riuscire
Tutte le attività documentate in questo repository sono state condotte esclusivamente all'interno di un ambiente di laboratorio virtuale VMware autonomo per scopi di apprendimento accademico supervisionato. Nessun sistema esterno, di produzione o reale è stato preso di mira, scansionato o influenzato in alcun modo. Metasploitable 2 è una macchina virtuale intenzionalmente vulnerabile progettata specificamente per la formazione sulla sicurezza.
Questo materiale non deve essere utilizzato per replicare queste attività contro alcun sistema reale senza esplicita autorizzazione scritta del proprietario del sistema. La scansione di porte non autorizzata, gli attacchi alle credenziali o lo sfruttamento di servizi di rete sono illegali nella maggior parte delle giurisdizioni.
MIT — vedi LICENSE. Il rapporto di laboratorio stesso è fornito come riferimento educativo.