Nmap
1- Introduzione
Nmap (Network security Scanner) scritto da Fyodor nel 1997 è un
portscanner progettato per sistemi
Unix/Linux e permettere agli amministratori di sistema (e ai curiosi ...) di
operare scanning al fine di determinare quali host
sono attivi e quali servizi offrono.
Utilizza diverse tecniche di scanning quali : UDP,
TCP connect(), TCP SYN (half open), ftp proxy (bounce attack), Reverse-ident,
ICMP (ping sweep), FIN, ACK sweep, Xmas Tree,
SYN sweep e Null scan. il sito di riferimento è: http://www.insecure.org/nmap/.
Il risultato
di eseguire Nmap è di solito una lista di porte attive su una determinata
macchina e restituisce a video un elenco di quelle attive, il che rende
semplice capire quali siano i punti vulnerabili del sistema, le porte aperte
sulla rete.
Nmap dà sempre il nome del servizio delle prime 1024
porte, numero, stato e protocollo. Lo stato è sia 'open' (aperto) che
'filtered' (filtrato) che 'unfiltered' (non filtrato). 'Open' significa che la
macchina sottoposta a scanning
accetterà connessioni su quella porta. 'Filtered' significa che un
firewall, un filtro o un altro ostacolo di rete copre la porta e previene Nmap
dal determinare se la porta è aperta. 'Unfiltered' significa che la porta è
conoscita da Nmap come chiusa e nessun firewall o filtro sembra interferire con
i tentativi di Nmap di stabilirlo. Le porte 'unfiltered' sono casi comuni e
vengono mostrate solo se la maggior parte delle porte sottoposte a
scannino sono in stato di filtering.
Dipendentemente dalle opzioni usate, Nmap può inoltre
rilevare il Sistema Operativo (OS) in uso tramite una tecnica chiamata TCP/IP
Stack FingerPrinting.
2- Caratteristiche
Nmap è un portscanner realizzato riunendo le funzionalità di
diversi portscanner preesistenti e migliorandole. Le principali caratteristiche
di Nmap sono:
1)
il calcolo dinamico dell’intervallo tra
l’invio di due pacchetti successivi, evitando così di doverlo calcolare
manualmente con un ping della macchina. Inoltre
l’adattamento dinamico dell’intervallo permette di gestire la ritrasmissione
dei pacchetti
2)
ritrasmissione: alcuni portscanner si
limitano ad inviare pacchetti e ad attendere le risposte. Questo può generare
false risposte negative o positive, nel caso di perdita dei pacchetti.
Questo aspetto è particolarmente importante per le scansioni UDP e FIN, che
cercano le porte che non rispondono
3)
scansione parallela delle porte: alcuni
portscanner interrogano le porte in modo lineare, una alla volta. Questo
approccio non è valido sulle connessioni di rete geografiche. Nmap usa l’input-output
non bloccante e la scansione parallela. Il numero di scansioni parallele è
configurabile
4)
specificazione flessibile delle porte:
non è sempre necessario interrogare tutte le 65535 porte. Nmap permette di
specificare un numero di porte e degli intervalli arbitrari, oppure tutte le
porte registrate nel file /etc/services
5)
specificazione flessibile dell’host: Nmap permette di interrogare più host
specificando il nome o una netmask
6)
rilevazione degli host inattivi: Nmap
evita di effetture la scansione degli host non collegati, testando la presenza
delle macchine con un ping.
3 – Come usare Nmap
Vediamo ora come usare Nmap al fine di testare la nostra rete.
Nmap è uno strumento fruibile sia da un amministratore di
rete che da un cracker, in entrambi i casi è ovviamente necessario conoscere l'indirizzo
ip della macchina obiettivo.
Una volta individuato, il primo passo da compiere consiste
nel rilevare quali servizi siano attivi nella rete presa di mira, in modo da riconoscerne la tipologia
La prima tecnica che analizzo è la classica
"connect", la più banale delle tecniche di scanning. Questa
operazione può essere effettuata manualmente utilizzando telnet o netcat, sia
da Windows, sia da Linux o da qualsiasi altra piattaforma fornita di stack tcp. Questa tecnica non fa altro che tentare
di stabilire una connessione con una porta tcp: molto banalmente, se
l'operazione riesce significa che la porta è aperta !
Con Nmap basta digitare questo comando per ottenere uno
scanning-connect :
dove -p
serve per specificare la porta (o il range di porte)
che vogliamo testare (in questo casto 1080)
e l'ip dell'host da
sondare. Ho eseguito in questo esempio la stessa operazione ma considerando due
diversi ip dell'host da sondare il primo 193.205.161.186 che è risultato essere
attivo ed il secondo 193.205.161.167 che al contrario è risultato down. Una
connessione tcp viene avviata al termine di una
negoziazione denominata"three-way-handshake";
L’
handshake consiste in un'operazione in tre fasi:
1) il client invia un pacchetto tcp con il solo flag SYN attivo;
2) il server risponde. La risposta può essere di due tipi:
porta aperta oppure porta chiusa. Se la porta è chiusa il server risponde con
un pacchetto con i flag ACK RST; altrimenti il server invia un pacchetto tcp
con i flag SYN
e ACK.
3) il client, che invia a sua volta un
pacchetto ACK al server .
la
negoziazione è terminata: può iniziare la trasmissione di dati.
Il metodo che abbiamo appena visto ha un problema fondamentale:
è facilmente rilevabile. Basta un programma stupidissimo scritto in Visual
Basic per intercettare un tentativo di connessione e rilevare l'ip dell'host remoto.
Ovviamente questa tecnica di scanning è applicabile se i router o firewall
della rete presa di mira permettono il passaggio di messaggi icmp .In caso contrario c'è una seconda possibilità
che prevedere come presupposto il fatto che le macchine presenti dietro al
firewall possano erogare un servizio interno.
3.1 -
Scansione diretta delle porte
Diventa una
delle prime tecniche per stabilire se vi siano dei sistemi funzionanti dietro
un firewall, dato che difficilmente questi ultimi si prendono l'onere di
bloccare pacchetti destinati alle porte dedicate a servizi di uso comune, come smtp(25), imap(143),
pop(110), etc.
Grazie a
Nmap siamo in grado di capire attraverso il cosiddetto tcp ping scan se un
sistema è attivo, anche se questo si trova dietro un firewall.
3.2
- Ping Scanning
Viene utilizzato per sapere quali host
in una rete sono online e realizzato
con l’uso della opzione –sP spedendo richieste ICMP echo a ciascun IP
nella rete specificata.Gli host che rispondono sono attivi.
Sfortunatamente molti siti come http://www.microsoft.com bloccano i pacchetti di richiesta di echo.
Quindi Nmap usa il ping TCP con l’ulteriore opzione -PT in modo che invece che mandare pacchetti ICMP echo request ed
aspettare per la risposta, spediamo pacchetti TCP ACK
alla porta di default 80 il cui
servizio è l’HTTP, visto che non è quasi mai filtrata attraverso il network bersaglio
(o verso una singola macchina) e poi aspettiamo per la risposta che torni
indietro.
Gli host che sono attivi
dovrebbero rispondere con un RST.
Abbiamo
determinato quali sistemi sono attivi dietro un firewall in grado di bloccare
dei pacchetti icp.
Avremo potuto usare anche l’opzione -P0
la quale non cerca di pingare gli host del tutto prima di sottoporli a
scanning. Questo permette di effettuare lo scanning di reti che non permettono
le richieste ICMP echo (o le risposte)
attraverso i loro firewall. Il sito della
Microsoft è un esempio di questo tipo di rete e noi possiamo quindi usare -P0
o-PT80 quando facciamo portscan a http://www.microsoft.com.
L’opzione
-PI usa un vero pacchetto di ping (ICMP
echo request). Se trova host che sono attivi
cerca anche nella vostra rete per indirizzi di broadcast
diretti alla subnet. Questi sono IP raggiungibili dall'esterno e traducono i
pacchetti IP in arrivo ad una subnet di
computers.
3.3 - User non root
Per gli user non root, usiamo -sT Tcp connect() scan: questo è il più semplice
modo di TCP scanning. La chiamata di sistema connect() fornito dal vostro Sistema
Operativo è usata per aprire una connessione a tutte le porte interessanti
nella macchina. Se la porta è in ascolto, connect() avrà successo, altrimenti
la porta non è raggiungibile.
Un gran vantaggio di questa tecnica è che non ha bisogno di
nessun privilegio speciale. Ogni utente su gran parte dei box Unix è libero di
usare questa chiamata.
Di solito (per gli user non-root), Nmap usa entrambi i
metodi ICMP e ACK
in parallelo.
Un ulteriore tecnica che usa pacchetti SYN (richiesta di connessione) invece di pacchetti ACK per gli utenti root è realizzata con l’opzione -PS.
Gli host
che sono attivi risponderanno con un RST (o raramente con un SYN/ACK).
Si
può notare che Nmap da lo stesso tipo di output per ogni diverso tipo di scanning
che usiamo,questo ci da la conferma ulteriore che li supporta comunque tutti.
3.4 - Come realizzare il portscanning
Dopo aver
recuperato le informazioni di base, diamo il via alla seconda operazione,
ovvero al port scanning.
Prendiamo
ad esempio un'ipotetica macchina 193.205.161.167, nascosta dietro a un firewall e controlliamo i servizi attivi:
Abbiamo appena eseguito una scansione tcp syn della
macchina, usando l'opzione –sS (SYN,
half-open) , il che da luogo a connessioni non complete ovvero
connessioni che interrompono il "three-way-handshake" a meta'
(half-open). ma in grado di rilevare il servizio attivo su una
determinata porta. Così facendo l'host remoto
non si accorgerà del nostro tentativo di collegamento o comunque non registrerà
il nostro ip. Con l’ulteriore opzione -P0 si evita di pingare l'host target.
Se avessimo usato l'opzione -l saremmo riusciti a sapere, quando
possibile il proprietario del processo ma solamente utilizzando una scansione
tcp tramite l'opzione -sT.
L’utilità di conoscere il
proprietario del processo sta nel fatto che se venissimo a sapere che il
proprietario del processo che gestisce il web server è l'utente root, potremmo
tentare di manomettere il server web stesso in modo da ottenere la shell utilizzata dall'utente proprietario, ovvero
la shell di root.
Anche il SYN scan che abbiamo appena visto può
essere rilevato, e il nostro ip reale può essere
così svelato. Non c' è molto di più da fare per nascondere l'ip sorgente reale,
ma si può ricorrere a uno stratagemma: effettuare lo scanning da più indirizzi
ip contemporaneamente, utilizzando pacchetti "decoy"
(pacchetti-esca).
Nmap permette di
specificare uno o più indirizzi "falsi" come ip sorgente: oltre a
quello reale (necessario per ottenere i risultati dello scanning!), verranno
inviati pacchetti "devoy" con l'ip sorgente opportunamente ritoccato.
Il seguente comando
lancia uno scanning half-open contro 192.168.0.2, sonda la porta 1080; inoltre
invia altri pacchetti SYN dall'indirizzo
1.2.3.4:
nmap -p 1080 192.168.0.2 -sS -D1.2.3.4
qui c'e' il solito
ping...
Source IP: 192.168.0.1
Target IP: 192.168.0.2
ICMP Length: 0 ChkSum: BE68 Code: Echo Message
ecco il ping proveniente
dall'ip falso !
Source IP: 1.2.3.4 Target
IP: 192.168.0.2
ICMP Length: 0 ChkSum: BE68 Code: Echo Message
Source IP: 192.168.0.2
Target IP: 192.168.0.1
ICMP Length: 0 ChkSum: C668 Code: Echo Reply
La sequenza e' uguale al
SYN scan (E' un SYN scan !), in piu' c'e' il
pacchetto decoy:
Source IP: 192.168.0.1
Target IP: 192.168.0.2
TCP Length: 0 Source Port: 33754 Target Port: 1080 Seq:
95EDA54C Ack: 00000000
Flags: S Window:
4096 TCP ChkSum: 23362 UrgPtr: 0
Source IP: 1.2.3.4
Target IP: 192.168.0.2
TCP Length: 0 Source Port: 33754 Target Port: 1080 Seq:
95EDA54C Ack: 00000000
Flags: S Window:
4096 TCP ChkSum: 6118 UrgPtr: 0
Source IP: 192.168.0.2
Target IP: 192.168.0.1
TCP Length: 0 Source Port: 1080 Target Port: 33754 Seq:
0018D246 Ack: 95EDA54D
Flags: SA Window:
8576 TCP ChkSum: 24470 UrgPtr: 0
Source IP: 192.168.0.1
Target IP: 192.168.0.2
TCP Length: 0 Source Port: 33754 Target Port: 1080 Seq:
95EDA54D Ack: 00000000
Flags: R Window:
0 TCP ChkSum: 27455 UrgPtr: 0
3.5 - Tecnica del
Fingerprinting dello stack
Questo
tecnica viene utilizzata da Nmap per avere informazioni relative al tipo di
sistema operativo di cui dispone il nostro bersaglio. Probabilmente anche un
indicazione sul Kernel utilizzato.
Secondo Nmap si tratta di Linux con
un possibile Kernel 2.2.
4 - Conclusioni
Avrei preferito la possibilità di poter lavorare su una shell grafica ed Nmap ,uno dei più celebri
programmi di portscanning, non la fornisce infatti per eseguire una o più
operazioni bisogna inserirle come linee di comando. Esso da la possibilità di
testare la presenza di uno o più host attivi
sulla rete non necessariamente testandoli tutti ma semplicemente quelli di cui
siamo interessati. Inoltre individuate le porte aperte non ha bisogno di
effettuare lo scanning su tutte prima di attaccare ma bensì può scegliere una
porta specifica come bersaglio per un eventuale attacco.Questo comporta
all’amministratore di sistema o a chiunque usi questo programma di rendere più
veloce la computazione delle operazioni che esegue.
Il codice di Nmap è scritto in C un linguaggio comunque evoluto ed
anche facilmente modificabile.
Esistono
diverse versioni di Nmap, per Linux/Unix, Windows NT, ottimo sniffer per Windows 95/98. Non si può inoltre
escludere la possibilità che Nmap sia portabile ovvero ci sia una sola versione
che giri sotto un qualunque sistema operativo.