cerca
Simulazione esame - 1 dicembre 2008
modifica cronologia stampa login logout

Wiki

UniCrema


Materie per semestre

Materie per anno

Materie per laurea


Help

Uni.SNRsimesame1 History

Hide minor edits - Show changes to output

Changed line 152 from:
---
to:
----
Changed lines 127-152 from:
----
to:
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.

---
Changed line 112 from:
to:
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.
Added lines 114-126:
!!!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
@]
Added lines 72-113:
!!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
@]


Added lines 1-73:
(:title Simulazione esame - 1 dicembre 2008:)
%titolo%''':: 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.

----
[[Torna alla pagina di SNR -> SicurezzaNelleReti]]