# Snort

SNORT è un applicativo open source con funzioni di tipo IDS distribuito con la licenza GPL.

## Intrusion Detection Systems Snort

L'IDS viene installato collegando una o più sonde configurate per analizzare ogni pacchetto che circola nella rete, garantendo un ottimo punto di osservazione su tutti i movimenti nella nostra rete:
* analizza i pacchetti che transitano in rete, confrontandoli con un database di firme di attacchi;
* impara a riconoscere nuovi attacchi, introducendo nuove firme riconosciute come attacchi;
* verifica i protocolli utilizzati dai pacchetti, in modo da riconoscere eventuali anomalie nel traffico;
* rileva l'attività dei port scan, "esplorazione" che precede generalmente un attacco;
* segnala tutte le possibili minacce identificate da queste attività di controllo.

## Requisiti hardware

Per implementare Snort in una rete e realizzare un buon sistema di intrusion detection è opportuno disporre di 2 macchine, ciascuna dotata di due schede di rete e un hub. La prima macchina funzionerà da sensore, l’altra verrà utilizzata per archiviare i log e per permettere il monitoraggio delle statistiche da remoto.
Più grande sarà la rete da monitorare, migliori dovranno essere le caratteristiche tecniche delle macchine usate. Bisognerà infatti disporre di una quantità sufficiente di memoria RAM, di un adeguato spazio per archiviare i log e di una CPU sufficientemente rapida per processare tutti i pacchetti in tempo reale.
Per poter quantificare le risorse necessarie è opportuno valutare:
* la dimensione della rete in cui sarà posto il sensore NIDS;
* la quantità di traffico normalmente vista dalla rete;
* dove e per quanto tempo saranno archiviati i log;
* quante regole saranno abilitate;
* quale forma di output sarà utilizzata;
* in che modo saranno generati gli allarmi.
Concretamente, per monitorare una rete domestica è consigliabile disporre di un processore da almeno 2Ghz per l’analisi dei pacchetti e 5Gb di spazio libero da dedicare all’archiviazione dei log.

## Architettura di Snort

Snort ha un’architettura molto complessa composta da diversi componenti:
* il packet decoder che intercetta e decodifica i pacchetti in arrivo;
* i preprocessori che analizzano i pacchetti individuando quelli potenzialmente dannosi;
* il detection engine che controlla il pattern matching dei pacchetti con le regole;
* i componenti di alerting e logging che generano gli allarmi e archiviano i log.
Di seguito vengono analizzati i diversi componenti che fanno parte dell’architettura di Snort.

### Il Packet Decoder

Il packet decoder è il componente responsabile dell’analisi dei pacchetti. Esso ne determina il protocollo e la struttura, generando allarmi qualora vengano identificati pacchetti malformati. Si configura modificando il file di configurazione /etc/snort.conf come segue:
Terminata l’analisi, i pacchetti vengono inviati ai preprocessori.

### I preprocessori

I preprocessori, sono dei plug-in di Snort che analizzano il comportamento dei pacchetti. Ogni preprocessore ha la funzione di identificare una diversa tipologia di attacco. Qualora il comportamento dei pacchetti dovesse risultare dannoso, essi vengono inviati al detection engine che provvederà a verificarne il pattern matching con le regole. I preprocessori possono essere attivati, disattivati e configurati attraverso il file /etc/snort.conf.
Per capirne meglio il funzionamento, esaminiamo i preprocessori HTTPInspect e sfportscan e le loro principali opzioni di configurazione.
Il preprocessore HTTPInspect, si occupa di decodificare il traffico HTTP e di identificare attacchi a livello applicativo che sfruttano eventuali vulnerabilità del protocollo HTTP. La configurazione di questo preprocessore è divisa in due parti, una globale e una per i server.
La configurazione globale è identificata dalla stringa:
I parametri che possono essere configurati sono:
* iis_unicode_map [filename (located in the config dir)] [codemap (integer)]
che deve essere sempre specificato in quanto contiene la global IIS unicode map.
* detect_anomalous_servers
che genera un allarme se viene rilevato traffico HTTP su porte non standard; è opportuno non attivare questa opzione se è prevista una configurazione server di default.
La sezione dedicata ai server ha due modalità di configurazione: default e IP. La stringa che identifica la configurazione di default è:
mentre quella IP, che identifica la configurazione di indirizzi IP individuali, è:
Le opzioni specificabili sono:
* profile [all/apache/iis]
che permette di selezionare dei profili predefiniti in base al tipo di server HTTP utilizzato, scegliendo tra ‘all’, ‘apache’ e ‘iis’. Questa opzione può essere combinata ad opzioni come ‘ports’, ‘iis_unicode_map’, ‘flow_depth’, ‘no_alerts’, ‘inspect_uri_only’ e ‘oversize_dir_length’ che vanno specificate dopo il profilo in questo modo:
* ports { [port] [port] . . . }
che indica su quale porta è attivo il servizio HTTP. Il traffico cifrato SSL non potrà essere decodificato.
* flow_depth [integer]
che specifica quanti byte del payload di risposta del server ispezionare. Questa opzione incrementa notevolmente le prestazioni dell’IDS perché permette di ignorare una buona parte del traffico HTTP. Il valore può essere impostato da -1 a 1460. -1 permette di ignorare l’intero traffico di risposta, mentre 0 permette di ispezionare integralmente i payload dei pacchetti.
* ascii [yes/no]
che permette di decodificare un URL che contiene sequenze di caratteri ASCII.
* utf_8 [yes/no]
che permette di decodificare un URL che contiene sequenze di caratteri UTF-8.
* iis_unicode [yes/no]
che permette di usare la mappa di default, se non è specificata una IIS Unicode Map.
* multi_slash [yes/no]
che permette di generare un allarme ogni volta che viene incontrata una stringa contenente più caratteri ‘/’ consecutivi. (Es. “pippo/////////pluto”)
* iis_backslash [yes/no]
che permette di generare un allarme ogni volta che viene incontrata una stringa contenente un carattere ‘\’. (Es. “pippo\pluto”)
* no_alerts
che permette di non ricevere allarmi generati da questo preprocessore. Se questa opzione viene selezionata, le rispettive regole HTTP non hanno alcun effetto.
* oversize_dir_length [non-zero positive integer]
che specifica la lunghezza massima di un URL. Generalmente la lunghezza media è di 300 caratteri.
* inspect_uri_only
che migliora notevolmente le prestazioni in quanto permette di esaminare solo la porzione di payload contenente l’URL.
Un esempio di configurazione del preprocessore HTTPInspect è:
Dal precedente codice si deduce che il file contenente la mappa Unicode è unicode.map, l’indirizzo IP del server HTTP è 1.1.1.1 il quale è attivo sulle porte 80,3128 e 8080. Non sarà ispezionato il payload dei pacchetti di risposta del server, ma saranno decodificati gli URL contenenti caratteri ASCII che potranno avere una lunghezza massima di 300 caratteri.
Il preprocessore sfportscan invece, si occupa di identificare la prima fase di un attacco, dove l’attaccante cerca di acquisire informazioni sui protocolli e sui servizi supportati da una vittima. Questo preprocessore, permette di identificare qualsiasi tipo di Portscan.
A tal proposito, è necessario che sia abilitato il preprocessore flow con il quale il preprocessore sfportscan interagisce, mediante la seguente stringa:
I parametri che possono essere configurati per il preprocessore sfportscan sono:
* proto { <proto> }
che può essere configurato con una delle seguenti opzioni: ‘tcp’, ‘udp’, ‘icmp’, ‘ip’ oppure ‘all’ se si intende esaminare tutti i protocolli.
* scan_type { <scan_type> }
che può essere configurato con le opzioni: ‘portscan’, ‘portsweep’, ‘decoy_portscan’, ‘distributed_portscan’ oppure ‘all’ se si intende monitorare tutti i tipi di scan.
* sense_level { <level> }
che accetta i parametri: ‘low’, ‘medium’ o ‘high’ in base al grado di sensibilità che si vuole assegnare al sensore.
* ignore_scanners { <ip_list> }
che definisce gli indirizzi IP che possono eseguire scansioni e pertanto da ignorare.
* ignore_scanned { <ip_list> }
che definisce gli indirizzi IP che possono ricevere scansioni e pertanto da ignorare.
* logfile { <file> }
che definisce su quale file salvare l’output delle scansioni.
Un esempio di configurazione è:
Dal precedente codice si deduce che saranno esaminati i pacchetti appartenenti a tutti i protocolli, saranno monitorati tutti i tipi di scansioni, il file contenente i log dei Portscan sarà /var/log/snort/portscan, e il sensore avrà una sensibilità alta.

### Il Detection Engine

Il Detection Engine è il componente che riceve i pacchetti dai preprocessori e si occupa di confrontarli con le regole di intrusion detection. Nel caso in cui dovesse esserci una corrispondenza tra un pacchetto e più regole diverse, la prima regola che trova una corrispondenza con il contenuto di un pacchetto genera un allarme o, in alternativa, Snort offre anche la possibilità di generare un allarme per ciascun evento. Per ridurre il numero di falsi positivi può essere configurato il file threshold.conf. Siccome ogni evento è associato ad un gen_id e un sig_id, conoscendo questi due valori, è possibile disabilitare completamente gli allarmi in questo modo:
Per garantire l’effettiva disattivazione delle regole, è opportuno accertarsi che il file threshold.conf sia incluso nel file snort.conf mediante la stringa
È anche possibile fare in modo che in un certo intervallo di tempo venga generato al massimo un allarme.

### I Componenti di Alerting e Logging

Quando viene trovata una corrispondenza tra un pacchetto e una regola, entrano in gioco i componenti di alerting e logging, il primo usato per generare gli allarmi, il secondo per archiviare i pacchetti che hanno causato la generazione dell’allarme. È possibile archiviare i log in un database MySQL, PosgreSQL, Oracle o ODBC, oppure inviarli ad un server Syslog, o salvarli in formato compatibile con Tcpdump. Queste opzioni sono configurabili nel file snort.conf in questo modo:
In base alla riga di codice a cui viene tolto il commento si stabilisce il tipo di output. Nel caso in cui si intenda archiviare i dati in un server SysLog, va specificato se tale server sia Unix o Windows. Per archiviare i dati in un file compatibile con Tcpdump, è sufficiente configurare il nome da dare a tale file. Nel caso si intenda archiviare i dati in un database, dovrà essere inserito il nome del database, l’username e la password.

## Modalità di Funzionamento

Snort ha diverse opzioni di funzionamento che possono essere adottate a seconda del contesto in cui viene installato.
* -A alert-mode : Permette di specificare la modalità di generazione degli allarmi che può essere di tipo full, fast, none e unsock. L’opzione full è impostata di default e permette di avere informazioni complete sull’attacco, fast invece permette di rendere più rapido il sistema generando allarmi in un formato più semplice che contiene solo il timestamp, il messaggio di allarme e gli indirizzi IP sorgente e di destinazione. La modalità none permette di non generare allarmi, mentre unsock è un’opzione sperimentale che invia le informazioni ad un altro processo attraverso un socket UNIX.
* -b : Effettua il logging dei pacchetti in formato binario.
* -c config-file : Utilizza le regole trascritte nel file di configurazione
specificato.
* -D : Avvia snort in modalità daemon.
* -h home-net : Imposta la rete domestica nel formato 192.168.1.0/16.
* -i interface : Imposta l’interfaccia di rete sul quale effettuare lo sniffing.
* -k logging-mode : Imposta la modalità di logging. Quella di default è pcap ma può essere anche cambiata in ascii o none, che permette di non effettuare il logging dei pacchetti.
* -l log-dir : Imposta il percorso del file nel quale saranno archiviati i log.
* -N : Disabilita il logging dei pacchetti ma continua a generare allarmi.
* -s : Invia messaggi di allarme ad un server Syslog.
* -v : Visualizza l’header dei pacchetti.
* -V : Visualizza la versione di Snort.

## Regole di Intrusion Detection

Una regola è un set di istruzioni strutturato in modo tale da permettere di verificare il pattern matching con l’header dei pacchetti, oppure con stringhe contenute nel payload dei pacchetti. Una buona regola deve essere specifica e chiara in modo tale da ridurre falsi negativi e falsi positivi, e deve contenere una descrizione accurata dell’attacco fornendo referenze per eventuali approfondimenti esterni. Una regola è composta da un header (l’intestazione della regola) e un body (il corpo della regola).

### Header

L’header è la parte principale della regola e comprende: l’azione da intraprendere (alert, log, pass, ...), il protocollo utilizzato, l’indirizzo IP e la porta sorgente, l’indirizzo IP e la porta di destinazione. Una volta trovata una corrispondenza tra una regola e il contenuto di un pacchetto, è possibile scegliere tra diverse opzioni ciascuna identificata da una particolare keyword:
* ALERT ha la semplice funzione di generare un allarme;
* LOG archivia l’evento senza generare l’allarme;
* PASS ignora il pacchetto;
* ACTIVATE genera un allarme e poi attiva una regola DYNAMIC;
* DYNAMIC viene attivata da una regola ACTIVATE e poi agisce come la keyword LOG.
Nel precente esempio viene generato un allarme, qualora venga riconosciuto un pacchetto UDP proveniente dalla porta 19 di un qualsiasi indirizzo IP sorgente, verso la porta 7 di un qualsiasi indirizzo IP di destinazione. I parametri aggiuntivi, come il testo del messaggio da scrivere nei log, saranno configurati nel body.

### Body

Il body completa la definizione della regola e comprende una serie di opzioni che vengono racchiuse tra parentesi:
Nel precedente esempio, il messaggio scritto nei log sarà ‘DOS UDP echo + chargen bomb ’, la tipologia d’attacco è ‘attempted-dos ’ che indica il tentativo di effettuare un attacco DoS, l’identificatore della regola che ha generato l’allarme è 271 e tale regola è stata revisionata 3 volte. Vengono inoltre dati alcuni riferimenti da cui reperire informazioni aggiuntive sull’attacco: cve,CAN-1999-0635 e cve,CVE-1999-0103. Il body è inoltre configurabile con una serie di opzioni come ad esempio ‘flow’, ‘TTL’ o ‘sid’ che saranno analizzate di seguito. L’opzione ‘flow’, permette di definire la direzione dello stream di pacchetti da controllare e può assumere i seguenti valori:
* to_server: per i pacchetti inviati al server;
* from_server: per i pacchetti inviati dal server;
* to client: per i pacchetti inviati al client;
* from_client: per i pacchetti inviati dal client;
* established: per i pacchetti di una sessione TCP in stato established.
L’opzione ‘sameip’ permette di analizzare se la sorgente e la destinazione dei pacchetti coincidono; la regola assume la seguente forma:
Il Time To Live ‘TTL’ viene utilizzato per identificare le query via tool come Traceroute, Tracert o Netroute e supporta i simboli ‘>’,‘<’ e ‘=’, mentre l’opzione ‘seq’, permette di selezionare i pacchetti con numero di sequenza statico. La verifica dei flag TCP è invece attivata tramite l’opzione ‘flags’ che può assumere diversi valori:
* A: per verificare se è attivo solo il flag ACK;
* F: per verificare se è attivo solo il flag FIN;
* P: per verificare se è attivo solo il flag PSH;
* R: per verificare se è attivo solo il flag RST;
* S: per verificare se è attivo solo il flag SYN;
* U: per verificare se è attivo solo il flag URG;
* +: usato per identificare se sono attivi altri flag oltre quello specificato
(Es. A+ identificherà i pacchetti con attivi i flag AF,AP,AR,AS,AU);
* *: usato per verificare se sono attivi i flag specificati (Es. *AS, identi-
ficherà solo i pacchetti con attivi i flag AS);
* !: usato per verificare se sono attivi i flag diversi da quello specificato
(Es. !S identificherà i pacchetti con attivi uno o più flag tra i seguenti: A,F,P,R,U).
Inoltre, se da un lato l’opzione ‘ack’, permette di selezionare i pacchetti con numero di acknowledgement statico, l’opzione ‘itype’ esamina invece il valore del campo itype dei pacchetti ICMP, al fine di identificare i pacchetti con valori non validi. Lo Snort ID ‘sid’ identifica univocamente le regole di Intrusion Detetion. I valori tra 1 e 1.000.000 sono riservati alle regole rilasciate da www.snort.org, mentre quelli maggiori di 1.000.000 possono essere usati dagli utenti per creare le proprie regole. In questo ambito l’opzione ‘rev’ rilascia informazioni circa il numero di revisioni avuto da una regola, l’identificatore di sicurezza ‘priority’ assegna una priorità ad ogni regola e l’opzione ‘classtype’ permette di raggruppare le regole in base ad una categoria di attacco.
L’opzione ‘reference’, inoltre, permette di associare a ciascuna regola una referenza esterna dove reperire maggiori informazioni sulla vulnerabilità sfruttata. La sintassi di riferimento per questa opzione è:
Continuando l’analisi delle opzioni configurabili all’interno del body di una regola di intrusion detection, troviamo l’opzione ‘msg’ che permette di associare alla regola un messaggio che informerà sul tipo di attacco potenzialmente riscontrato. Questa opzione si utilizza nel seguente modo:
L’opzione ‘logto’ permette di archiviare i pacchetti relativi alla regola. La sintassi di questa opzione è
Snort fornisce, inoltre, la possibilità di definire delle variabili da usare nelle regole. Ogni variabile deve avere una struttura di questo tipo:
Ogni variabile definita all’interno di regole o nei file di configurazione, può essere richiamata anteponendo al suo nome il simbolo ‘$’.
Nel file snort.conf è opportuno definire le variabili principali al fine di alleggerire il carico della CPU nel modo seguente:
Le regole sono, infine, raggruppate per categorie in alcuni file che saranno inclusi nel file di configurazione snort.conf.
Ad una tipologia di server, è usualmente associata una tipologia di regole: ad esempio il server DNS è associato al file dns.rules o il server POP3 al file pop3.rules. In questo modo, specificando per esempio l’indirizzo IP di un server DNS, tutte le regole presenti nel file dns.rules saranno verificate solo sui pacchetti in ingresso e uscita dal server DNS e non su tutto il restante traffico di rete che non sarebbe comunque vulnerabile ai tipi di attacchi controllati dalle regole. È anche possibile disabilitare una categoria di regole commentando la stringa corrispondente al file include. Per esempio se non è configurato un server web, sarà possibile aggiungere il simbolo ‘#’ davanti alle seguenti stringhe di inclusione:
Terminata questa panoramica sulla configurazione delle regole di Snort, si esamineranno nel prossimo l’analisi dei log generati dalle regole.

## Analisi dei Log

Quando si verifica un incidente, l’analisi delle intrusioni permette di avere maggiori informazioni sia su come si è sviluppato l’attacco, che sull’entità in termini di pericolosità dello stesso. Il primo passo che permette di raccogliere maggiori informazioni è l’analisi degli eventi. Snort produce dei log di questo formato:
Analizzando i campi del log registrato si evince che:
* 1:469:1 è composto da tre numeri, di cui il primo indica quale componente di Snort ha generato l’allarme, il secondo indica il SID della firma e l’ultimo il numero di revisioni della firma stessa.
* ICMP PING NMAP è il nome dell’attacco.
* Classification: Attempted Information Leak indica il tipo di attacco.
* Priority: 2 indica il grado di priorità dell’allarme che è direttamente proporzionale alla potenziale pericolosità dell’attacco (scala da 1 a 3); gli allarmi in cui il valore del campo Priority è 1 sono i più critici.
* 10/15-06:01:46.050056 è la data e l’ora dell’attacco effettuato il 15 ottobre 2006 alle 06:01.
* 192.168.0.4 -> 192.168.0.3 indica gli indirizzi IP sorgente (192.168.0.4) e di destinazione (192.168.0.3).
* Le restanti informazioni riguardano le specifiche tecniche del protocollo utilizzato.
Terminata l’analisi di Snort, nel prossimo capitolo si esaminerà la sua implementazione pratica all’interno di una rete.

## Collegamenti esterni

* (EN) Sito Ufficiale
* (EN) Guide all'uso di Snort
* (EN) Snort Virtual Machine
* (IT) (EN) Snortattack Snort guide, tips and tricks, SUG Snort User Group Italiano ufficiale