Snort: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 250:
* -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.
 
<nowiki>
# Esempio
alert udp any 19 <> any 7
</nowiki>
 
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:
<nowiki>
# Esempio
(msg:"DOS UDP echo+chargen bomb";
reference:cve,CAN-1999-0635; reference:cve,CVE-1999-0103;
classtype:attempted-dos; sid:271; rev:3;)
</nowiki>
 
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 paccheti 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:
 
<nowiki>
alert ip any any -> any any
(msg:"Same Source and Destination IP Address"; sameip;)
</nowiki>
 
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 è:
 
<nowiki>
reference:<fonte> <valore>;
</nowiki>
 
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:
 
<nowiki>
alert tcp $EXTERNAL any -> $INTERNAL 79 (msg:"Finger";)
</nowiki>
 
L’opzione ‘logto’ permette di archiviare i pacchetti relativi alla regola. La sintassi di questa opzione è
 
<nowiki>
logto: "PATH/FILE.estensione";
</nowiki>
 
Snort fornisce, inoltre, la possibilità di definire delle variabili da usare nelle regole. Ogni variabile deve avere una struttura di questo tipo:
 
<nowiki>
Var <nome variabile> <valore variabile>
</nowiki>
 
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:
 
<nowiki>
# Indirizzi IP o range di indirizzi IP della rete interna
var HOME_NET [10.1.1.0/24,192.168.1.0/16]
# Indirizzi IP o range di indirizzi IP della rete esterna
# che in questo caso assume tutti i valori diversi
# dalla rete interna
var EXTERNAL_NET !$HOME_NET
# Indirizzo IP di un eventuale Server DNS
# Anche per i server è possibile specificare più
# di un indirizzo IP nel caso ci siano più server
# dello stesso tipo
var DNS_SERVERS 192.168.1.101
# Indirizzo IP di un eventuale Server SMTP
var SMTP_SERVERS 192.168.1.102
# Indirizzo IP di un eventuale Server Web
var HTTP_SERVERS 192.168.1.103
# Indirizzo IP di un eventuale Server SQL
var SQL_SERVERS 192.168.1.104
# Indirizzo IP di un eventuale Server Telnet
var TELNET_SERVERS 192.168.1.105
# Indirizzo IP di un eventuale Server SNMP
var SNMP_SERVERS 192.168.1.106
# Il valore di default per tutti i server è
var NOME_SERVER $HOME_NET
# che permette di trattare tutti gli host della rete interna
# come server
# Valore numerico della Porta Http su quale il
# server web è in ascolto
var HTTP_PORTS 80
# Valore Numerico della Porta di un eventuale Server Oracle
var ORACLE_PORTS 1521
# Indirizzi IP dei Server Aim
var AIM_SERVERS [64.12.24.0/23,64.12.28.0/23,64.12.161.0/24,
64.12.163.0/24,64.12.200.0/24,205.188.3.0/24,205.188.5.0/24,
205.188.7.0/24,205.188.9.0/24,205.188.153.0/24,
205.188.179.0/24,205.188.248.0/24]
# Percorso dei file contenenti le regole
var RULE_PATH /boot/etc/rules
</nowiki>
 
Le regole sono, infine, raggruppate per categorie in alcuni file che saranno inclusi nel file di configurazione snort.conf.
 
<nowiki>
include $RULE_PATH/local.rules
include $RULE_PATH/bad-traffic.rules
include $RULE_PATH/exploit.rules
include $RULE_PATH/scan.rules
include $RULE_PATH/finger.rules
include $RULE_PATH/ftp.rules
include $RULE_PATH/telnet.rules
include $RULE_PATH/rpc.rules
include $RULE_PATH/rservices.rules
include $RULE_PATH/dos.rules
include $RULE_PATH/ddos.rules
include $RULE_PATH/dns.rules
include $RULE_PATH/tftp.rules
include $RULE_PATH/web-cgi.rules
include $RULE_PATH/web-coldfusion.rules
include $RULE_PATH/web-iis.rules
include $RULE_PATH/web-frontpage.rules
include $RULE_PATH/web-misc.rules
include $RULE_PATH/web-client.rules
include $RULE_PATH/web-php.rules
include $RULE_PATH/sql.rules
include $RULE_PATH/x11.rules
include $RULE_PATH/icmp.rules
include $RULE_PATH/netbios.rules
include $RULE_PATH/misc.rules
include $RULE_PATH/attack-responses.rules
include $RULE_PATH/oracle.rules
include $RULE_PATH/mysql.rules
include $RULE_PATH/snmp.rules
include $RULE_PATH/smtp.rules
include $RULE_PATH/imap.rules
include $RULE_PATH/pop2.rules
include $RULE_PATH/pop3.rules
include $RULE_PATH/nntp.rules
include $RULE_PATH/other-ids.rules
include $RULE_PATH/web-attacks.rules
include $RULE_PATH/backdoor.rules
include $RULE_PATH/shellcode.rules
include $RULE_PATH/policy.rules
include $RULE_PATH/porn.rules
include $RULE_PATH/info.rules
include $RULE_PATH/icmp-info.rules
include $RULE_PATH/virus.rules
include $RULE_PATH/chat.rules
include $RULE_PATH/multimedia.rules
include $RULE_PATH/p2p.rules
include $RULE_PATH/experimental.rules
</nowiki>
 
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:
 
<nowiki>
# include $RULE_PATH/web-cgi.rules
# include $RULE_PATH/web-coldfusion.rules
# include $RULE_PATH/web-iis.rules
# include $RULE_PATH/web-frontpage.rules
# include $RULE_PATH/web-misc.rules
# include $RULE_PATH/web-client.rules
# include $RULE_PATH/web-php.rules
</nowiki>
 
Terminata questa panoramica sulla configurazione delle regole di Snort, si esamineranno nel prossimo l’analisi dei log generati dalle regole.
 
 
== Bibliografia ==