:: Simulazione esame - 1 dicembre 2008 ::
Esercizio 1
Punto 1
Usare tcpdump per salvare su di un file il traffico generato eseguendo i seguenti comandi:
- nmap per fare SYN scan sulla macchina del docente, per il range di porte [40,80]
Soluzione
Per fare un SYN scan con nmap, si usa la seguente sintassi:
nmap -sS -p 40:80 192.168.10.3
dove:
- -sS : dico a nmap di fare la scansione SYN
- -p 40:80 : il range di porte su cui fare la scansione va da 40 a 80
nmap mi risponde dicendomi quali sono le porte aperte.
Tutta sta roba però devo dumparla tramite tcpdump. Per salvare il traffico di rete su di un file, occorre passare la switch -w nomefile a tcpdump. La sequenza di operazioni è quindi la seguente:
- avvio il logging su file di tcpdump
- eseguo la scansione con nmap come spiegato sopra
- termino il logging di tcpdump
Il logging lo eseguo così:
tcpdump -n -i eth0 -w nomefiledilog
dove
- -n = dico a tcpdump di NON risolvere i nomi di host: è praticamente obbligatorio perché altrimenti ci mette una vita
- -i eth0 = gli dico di intercettare il solo traffico passante su eth0
- -w nomefiledilog = gli dico di salvare tutto quanto sul file nomefiledilog
Punto 2
Dal log salvato al punto 1, usando i filtri di tcpdump, ricavare la lista delle porte nello stato di LISTEN, utilizzando contemporaneamente le seguenti condizioni sui pacchetti:
- devono essere generati dalla macchina destinatario (quella del docente)
- condizione appropriata sui flag TCP
- la porta sorgente va specificata tramite un filtro sul contenuto binario del file
Soluzione
Innanzitutto, per far leggere a tcpdump un file di log da lui stesso generato precedentemente, si usa la switch -r nomefiledilog.
Per trovare solo i pacchetti provenienti dalla macchina del docente si usa l'espressione di controllo src host 192.168.10.3. La riga di comando sarà quindi:
tcpdump -n -r nomefiledilog src host 192.168.10.3
Per trovare solo i pacchetti relative alle porte aperte, devo filtrarli mettendo come condizione che mi arrivino con entrambi i flag SYN e ACK ad 1. Infatti, il SYN scan manda pacchetti TCP contenenti il flag SYN, e se riceve un pacchetto con SYN e ACK a 1 da quella porta, vuol dire che la porta è aperta. Con tcpdump, tutto ciò si esprime tramite condizioni a basso livello.
Nell'header TCP, il byte che ha a che fare con i flag è il 13° (vedere le slide del corso se non ci credete). Il flag SYN è il bit che vale 2, il flag ACK è il bit che vale 16. Per controllare che entrambi siano settati, il 13° byte deve quindi essere a 16+2 = 18. In tcpdumpese si scrive così: tcp[13]=18 e la riga di comando diventa:
tcpdump -n -r nomefiledilog src host 192.168.10.3 and tcp[13]=18
Per controllare le porte, tcpdump offre il simpatico comando portrange x-y, ma nel testo dell'esercizio si parla esplicitamente di filtro sul contenuto binario.
Orbene: nell'header TCP i byte che si occupano della porta sorgente sono i primi due. Per dire a tcpdump di controllare questi due byte, si usa la sintassi tcp[init:offset]. Nel nostro caso init = 0, e offset = 2 (i primi 2 byte). Il controllo sulle porte è semplice: tcp[0:2] >= 40 && tcp[0:2] <= 80. Da notare che sto usando il && invece dell'and, come sopra.
La riga di tcpdump diventa quindi
tcpdump -n -r nomefiledilog 'src host 192.168.10.3 and tcp[13]=18
&& tcp[0:2] >= 40 && tcp[0:2] <=80'
Notate anche che ho messo tutta l'espressione tra apici ', per evitare che la shell facesse casini.
Esercizio 2
Configurare iptables in modalità stateful, nel modo più stringente possibile, per fare ste cose:
- autorizzare l'ingresso di pacchetti udp dalla macchina del docente, porta 514, a macchina locale, sempre porta 514. Non è prevista risposta.
- autorizzare query DNS al PC del docente
- autorizzare connessioni FTP attive in uscita verso qualunque destinatario
- autorizzare qualsiasi pacchetto ICMP in ingresso, tranne echo-request
- testare ogni singolo punto
Autorizzare udp sulla porta 514
Qui ho dei pacchetti provenienti dalla porta 514 della macchina del docente, che arrivano alla porta 514 locale. Non è prevista risposta, quindi devo solamente prevedere il caso in cui essi arrivino.
iptables -A INPUT -i $INET_IFACE -p udp -s $PC_DOCENTE --sport 514
--dport 514 -j ACCEPT
Per controllare il tutto, vado su un'altra macchina e lancio il seguente comando di nemesis:
nemesis udp -x 514 -y 514 -S 192.168.10.3 -D 192.168.20.3
dove:
- -x 514 = porta sorgente 514
- -y 514 = porta destinazione 514
- -S 192.168.10.3 = macchina sorgente = 192.168.10.3 (quella del docente)
- -D 192.168.20.3 = macchina destinazione (quella su cui lavoro)
nemesis genera il pacchetto. La riga di iptables ovviamente va loggata, così che in /var/log/messages vedremo il log relativo a questi pacchetti in arrivo.
Per inciso: essendo la porta 514 chiusa, dal nostro computer partirà anche un ICMP che informerà il mittente che quella porta, appunto, è chiusa.
Autorizzare query DNS al pc del docente
Le query DNS generano traffico sulla porta UDP 53.
iptables -A OUTPUT -o $INET_IFACE -p udp -d $PC_DOCENTE --dport 53 -j ACCEPT
iptables -A INPUT -i $INET_IFACE -p udp -s $PC_DOCENTE --sport 53 -j ACCEPT
Per testare il tutto, nel file legenda.txt presente sul server del professore è contenuto il sample del comando host: genera una query, e se ottengo udienza allora tutto funziona.
FTP attivo in uscita verso qualunque destinatario
Piccolo riassunto sull'FTP attivo: si tratta di una connessione TCP, ma duplice:
- la connessione comandi è eseguita sulla porta 21 del server
- la connessione dati è eseguita dalla porta 20 del server ad una porta alta locale
Devo quindi autorizzare connessioni in entrambi i sensi
iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --sport 20 -m state --state NEW, ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
Lo si può testare ftp-ando il server del professore, e provando a gettare il file esame.txt nella cartella pub.
Autorizzare qualunque ICMP in ingresso, tranne echo-request
Per scrivere questa regola, uso la flag --icmp-type di iptables, in questo modo:
iptables -A INPUT -i $INET_IFACE -p icmp --icmp-type ! echo-request -j ACCEPT
Da notare che il flag --icmp-type ! echo-request dice a iptables che se il tipo è diverso da echo-request, allora accetto il pacchetto.
Per testare il tutto, si va su di un'altra macchina e si generano pacchetti icmp con nemesis. La sintassi è questa:
nemesis icmp -S 192.168.20.2 -D 192.168.20.3 -i 1
nemesis icmp -S 192.168.20.2 -D 192.168.20.3 -i 8
dove:
- -S 192.168.20.2 = ip sorgente (ne posso mettere uno qualsiasi, l'esercizio non specifica filtri sulla provenienza)
- -D 192.168.20.3 = la destinazione è la mia macchina
- -i 1 = è il tipo di pacchetto: l'echo-request è il tipo 8. Ogni altro tipo deve essere accetto, quindi anche il tipo 1
Se poi specifico il tipo 8, deve essere droppato. Se metto delle regole di log, vedrò tutto quanto per benino.
Torna alla pagina di SNR