Perfino un amministratore di sistema principiante avrà probabilmente già sentito parlare e avrà già usato un port scanner. Sicuramente avrà anche sentito parlare di Nmap, un port scanner molto usato e conosciuto, creato dal Progetto Nmap. Nmap sta per “Mapper di rete” (Networkmapper) e oltre ad essere super rapido, sofisticato ed efficiente, ha molte funzioni.
Tra le sue molte funzionalità è in grado di rilevare il sistema operativo di un server remoto, testare la sicurezza sia di server locali che remoti e creare un inventario dei server e dei servizi attivi in una rete.
Può essere che hai già usato Nmap per fare un semplice port scan nel passato ma è molto improbabile che tu abbia realizzato che Nmap è uno strumento molto potente per testare la sicurezza. Questo è dovuto in parte ai sofisticati script aggiuntivi incorporati. Prima di dare un occhiata a questi script aggiuntivi è meglio fare una breve ripetizione sulle funzionalità di base di Nmap. In questo modo apprenderai che Nmap può essere usato per attività White Hat avanzate.
Le basi del port scanning con Nmap
Anche le funzioni di base (port scanning) di Nmap includono opzioni avanzate come l’IP Spoofing (usando l’opzione -S). Una magnifica selezione di funzionalità è disponibile.
Cosa ne dite di “chiedere” a Nmap di eseguire un semplice port scan su un server? Vediamo ora di effettuare una scansione di base con Nmap su uno specifico indirizzo IP. In questo esempio viene usata l’opzione “-PN” in modo da escludere un ping test.
# nmap -PN 123.123.123.123
Il risultato sarà qualcosa del genere:
Starting Nmap 5.51 ( http://nmap.org ) at 2016-11-16 11:16 GMT Nmap scan report for www.chrisbinnie.tld (123.123.123.123) Host is up (0.00051s latency). Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
Come si può osservare dal risultato della scansione, il Nmap ha testato 999 porte – quelle di default – senza controllare le altre porte rilevando una porta aperta, la 22, SSHD.
Come si può vedere dall’esempio sottostante Nmap è in grado di scansionare intere reti.
# nmap -PN 123.123.123.0/24
Aggiungendo l’opzione “-n” si possono disabilitare i “DNS lookups” in modo da aumentare la velocità e da evitare di venire scoperti da un DNS server.
Se si è interessati a TCP allora ci si può connettere a porte TCP usando Nmap come segue:
# nmap -sT www.chrisbinnie.tld
Se si ha di bisogno di connettersi a porte UDP usare l’opzione “-sU” invece che “-sT”.
Come detto in precedenza, ci sono moltissime opzioni ma al momento, prima di passare al meglio, ecco alcune altre opzioni che ritengo siano molto utili.
Per esempio, se si sta effettuando un “port/ip scan” nella propria rete locale ma si vogliono escludere alcuni host, si può fare uso dell’opzione “exclude file” (escludere file) in questo modo:
# nmap 10.10.10.0/24 --excludefile /home/chrisbinnie/exclusions.txt
Se i server da escludere durante lo scan sono pochi opterei per la seguente sintassi:
# nmap 10.10.10.0/24 --exclude 10.10.10.1,10.10.10.10,10.10.10.100
Per controllare solo specifiche porte usare la “U” per UDP e la T per TCP come segue:
# nmap -p U:53,T:0-1024,8080 10.10.10.111
E infine, se si vuole controllare quali server sono raggiungibili nella propria rete locale, il comando che fa per noi è il seguente (usa “discovery” o un ping scan, l’opzione “-sP”):
# nmap -sP 10.10.10.0/24
Come risultato si potrebbe ottenere un output simile a questo:
Nmap scan report for mail.chrisbinnie.tld (10.10.10.10) Host is up (0.028s latency). Nmap scan report for smtp.chrisbinnie.tld (10.10.10.11) Host is up (0.029s latency).
L’output di questo comando sarà un host per riga.
Lo Scripting Engine di Nmap (NSE)
Nmap offre una serie di funzioni estremamente sofisticate. Queste funzionalità aggiuntive vengono chiamate NSE (Nmap Scripting Engine). Ora daremo un occhiata ad alcuni soggetti trattati nella documentazione di Nmap indicando quando usare quale funzionalità aggiuntiva.
Lo straordinario NSE fu creato tenendo in mente qualche funzione base. Queste funzioni includono network discovery usando il port scan, un metodo avanzato per rilevare i servizi in uso usando una varietà di “signatures” predefinite, testare le vulnerabilità – e “exploitarle” – e infine un metodo per rilevare delle backdoor.
Il punto forte di NSE è la sua versatilità e estende questa qualità offrendo in aggiunta, come si può capire dal nome, la possibilità di creare nuovi script che possono venire scritti da chiunque usando la lingua di programmazione “Lua”. Per usare NSE dalla linea di comando eseguire Nmap con l’opzione “–script” o in alternativa l’opzione “-sC”.
Quelli che seguono sono due esempi di port scanning effettuarti con Nmap. Il primo senza usare NSE e il secondo esempio facendone uso. Questi esempi sono utili perché danno la possibilità di potere osservare la differenza tra i due risultati. Nell’esempio sottostante si può notare il risultato del primo comando senza usare NSE. I comandi vengono eseguiti in questo esempio da un utente normale, non root.
$ nmap -p0-1024 -T4 localhost Starting Nmap 5.51 ( http://nmap.org ) at 2016-11-16 11:16 GMT Nmap scan report for localhost (127.0.0.1) Host is up (0.00049s latency). Not shown: 1021 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http 111/tcp open rpcbind Nmap done: 1 IP address (1 host up) scanned in 0.11 seconds
Nel prossimo esempio invece, si può notare che NSE viene usato cosa che aggiunge diverse informazioni aggiuntive al risultato.
$ nmap -sC -p0-1024 -T4 localhost Starting Nmap 5.51 ( http://nmap.org ) at 2016-11-16 11:16 GMT Nmap scan report for localhost (127.0.0.1) Host is up (0.00054s latency). Not shown: 1021 closed ports PORT STATE SERVICE 22/tcp open ssh | ssh-hostkey: 1024 d7:46:46:2d:fc:ad:9e:c7:25:d3:a1:96:45:4f:59:d9 (DSA) |_2048 80:f2:29:c0:ee:a1:80:99:2e:7f:26:c3:b1:2d:c4:37 (RSA) 25/tcp open smtp 80/tcp open http | http-methods: Potentially risky methods: TRACE |_See http://nmap.org/nsedoc/scripts/http-methods.html |_http-title: Site doesn't have a title (text/html; charset=UTF-8). 111/tcp open rpcbind Nmap done: 1 IP address (1 host up) scanned in 0.16 seconds
Come si può notare dall’output, nel secondo comando che usa NSE si possono trovare informazioni in più. Con NSE vengono mostrate anche delle URLs utili per fare ricerche riguardo al risultato ottenuto, vengono mostrati più dettagli (come per esempio la SSH host key) e anche commenti riguardo al fatto che Nmap crede che il codice HTML non sia valido.
I Timing Templates di Nmap
Nel precedente esempio abbiamo richiesto informazioni riguardo le porte 0-1024 (le porte privilegiate, raw, o porte superuser in sistemi Unix o Unix-like) usando l’opzione “-p0-1024”. L’opzione “-T4” non è una sorta di timeout in cui si aspettano 4 secondi, è un metodo in cui si usano dei “time templates” di NSE. Più è alto il numero e più Nmap scansiona in modo veloce, i valori variano da 0 a 5. I valori del “timing template” sono molto importanti e fanno anche una differenza per quanto riguarda il proprio “benessere emotivo”. Questi valori da 0 a 5 stanno per: paranoico (paranoid), subdolo (sneaky), corretto (polite), normale (normal), aggressivo (aggressive) e malsano (insane). Le parole – in inglese – possono venire anche usate come opzione al posto dei numeri se per qualcuno è più comodo e facile da ricordare.
Per via del fatto che con Nmap NSE si hanno a disposizione moltissime funzionalità aggiuntive, i programmatori si sono resi conto che gli utenti si sarebbero potuti “perdere” in tutta quella complessità e così hanno creato dei templates molto utili. La ragione principale per la quale i templates sono così importanti da usare con Nmap, è che se si usa NSE per analizzare molti host alla volta o una grande rete, il processo di scansione può metterci molto tempo per finire. È anche possibile di trovare pochissime informazioni (per via di firewalls configurati come si deve) investendo molto tempo.
Quali differenze esistono nei vari templates ci si può chiedere? Entrambi, il template paranoid e il template sneaky, offrono un certo livello di sicurezza per quanto riguarda l’evitare di venire scoperti da un “intrusion detection system” (IDS).
Il template polite rallenta il port scanner in modo da limitare la banda usata ad entrambi le parti della connessione come anche le risorse del server preso di mira. L’opzione “-T3” non apporta nessun cambiamento per via del fatto che viene usata di default. Il template aggressive che abbiamo usato nel precedente esempio usando l’opzione “-T4” velocizza il processo di scan e testa una rete con molta banda in modo più rigoroso. L’ultimo template, insane, assume che si è contenti del fatto di metterci meno tempo a scapito dell’accuratezza. Per usare questo template bisogna avere una connessione veloce e stabile.
Le categorie di script di Nmap NSE
Nonostante l’utilizzo di un mezzo altamente sofisticato, NSE è stato progettato in modo tale che persino un utente novizio è in grado di capire come usarlo con relativa facilità. È quindi possibile iniziare ad usare NSE in modo rapido e senza il bisogno di avere studiato la cosa in anticipo.
È utile sapere in che modo NSE fa riferimento ai diversi script che utilizza. Quando si esegue uno script tramite NSE viene eseguita una scansione delle porte prima o durante la sua esecuzione al fine di verificarne lo stato della disponibilità di rete di un server remoto. Esistono anche altre somiglianze tra i molti script NSE come per esempio i DNS lookup e i traceroute.
Categoria | Descrizione |
---|---|
auth | Questi script analizzano i metodi di autenticazione e cercano possibili modi per bypassarli – per esempio X11-access, ftp-anon e oracle-enum-users. La categoria brute serve per testare le password con un attacco brute force. |
Broadcast | Se si ha bisogno di inviare pacchetti via broadcast nella rete locale, usare questi script. |
brute | Per testare la sicurezza delle password di un server remoto con attacchi di tipo brute force usare questa collezione di script. Ce ne sono tanti per i diversi protocolli. |
Default | Gli script default vengono eseguiti usando l’opzione “-sC” o “-A”. Per usare altri script non default usare l’opzione “–script=”. |
Discovery | Per controllare chi e cosa è connesso a una rete usare questi script. Si tratta di esaminare per esempio registri pubblici (public registries), dispositivi con SNMP attivato e “directory services”. |
Dos | Se si vuole testare se si è vulnerabili ad attacchi di tipo DOS o (fare attenzione) eseguire script che sono in grado di far “crashare” servizi, questi script fanno al caso giusto. |
Exploit | Questi script servono per testare degli exploits. |
External | Fare attenzione ad eseguire questi script visto che le proprie azioni verranno notate da terze parti. Questo perché questi script eseguono dei WHOIS Lookup cosa visibile al servizio WHOIS. |
fuzzer | Questi script testano i bug e le falle nella sicurezza dei programmi. Ci mettono molto di più rispetto ad altre tecniche per trovare informazioni interessanti o rendere un server non raggiungibile. |
Intrusive | Questi script sono molto rischiosi da usare. Alcuni dei rischi includono crash, saturazione di banda e venire scoperti dall’amministratore del server preso di mira. |
Malware | I malware conosciuti lasciano tracce nel sistema come delle backdoor e altri segni. Questi script controllano porte aperte e servizi sospetti per determinare se si è infetti. |
Safe | Questi script non offendono l’amministratore del sistema preso di mira. Nonostante questo non si dovrebbe contare completamente sul fatto che non causino problemi. |
Version | Questi script sono un estensione della funzione di NSE che serve per rilevare la versione in uso. Per usare questi script usare l’opzione “-sV”. |
Vuln | Se vengono trovate delle vulnerabilità si riceve un avvertimento. |
Trovare falle nella sicurezza con Nmap
Ora che abbiamo dato un occhiata alle categorie di script NSE di Nmap iniziamo con l’effettuare un penetration test utilizzando il sapere appena acquisito e il vasto numero di script che vengono forniti con Nmap.
Effettuare un test delle vulnerabilità sul server locale come segue:
# nmap --script vuln localhost Starting Nmap 5.51 ( http://nmap.org ) at 2016-11-16 11:16 GMT Nmap scan report for localhost (127.0.0.1) Host is up (0.00090s latency). Not shown: 996 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 80/tcp open http | http-enum: |_ /icons/: Potentially interesting folder w/ directory listing 111/tcp open rpcbind Nmap done: 1 IP address (1 host up) scanned in 1.18 seconds
Il risultato ha immediatamente attirato la mia attenzione quando ho visto “Potentially interesting folder” per il servizio RPC. Chiaro, è probabile che l’accesso alla cartella /icons/ è permesso solo da locale ma dare comunque un occhiata (e anche urgentemente). Si potrebbe bloccare la porta TCP 111 con un firewall o disabilitare il servizio per rimediare al problema a meno che non si configuri RPC in modo da limitarne l’accesso.
Se NSE identifica una vulnerabilità conosciuta mostra nell’output informazioni come una patch ID per un server Windows o qualche URL utile in modo da potere fare ricerche a riguardo. Questo ci può in alcuni casi fare risparmiare del tempo visto che non si devono cercare gli exploits online. Ci sono buone probabilità che se NSE trova qualcosa non si tratta di un falso allarme visto che differenti test sono stati effettuati per arrivare a tale conclusione, e al contrario di certi altri programmi, bisognerebbe prendere gli avvertimenti sul serio e effettuare dei controlli.
La categoria NSE discovery di Nmap
Considera di utilizzare il seguente commando per ottenere maggiori informazioni su un host.
# nmap --script discovery localhost Starting Nmap 5.51 ( http://nmap.org ) at 2016-11-16 11:16 GMT Nmap scan report for localhost (127.0.0.1) Host is up (0.00070s latency). Not shown: 996 closed ports PORT STATE SERVICE 22/tcp open ssh |_banner: SSH-2.0-OpenSSH_5.3 | ssh-hostkey: 1024 d7:46:46:2d:fc:ad:9e:c7:25:d3:a1:96:45:4f:59:d9 (DSA) |_2048 80:f2:29:c0:ee:a1:80:99:2e:7f:26:c3:b1:2d:c4:37 (RSA) 25/tcp open smtp |_banner: 220 mail.chrisbinnie.tld ESMTP Postfix | smtp-enum-users: | root | admin |_ Method RCPT returned a unhandled status code. |_smtp-open-relay: Server is an open relay (16/16 tests) 80/tcp open http | http-headers: | Date: Mon, 16 Nov 2015 11:37:52 GMT | Server: Apache/2.2.15 (Red Hat) | Last-Modified: Mon, 15 Jun 2015 13:57:09 GMT | ETag: "4bc-61-5188ed5743e6a" | Accept-Ranges: bytes | Content-Length: 97 | Connection: close | Content-Type: text/html; charset=UTF-8 | |_ (Request type: HEAD) |_http-title: Site doesn't have a title (text/html; charset=UTF-8). |_http-date: Mon, 16 Nov 2015 11:37:52 GMT; 0s from local time. | http-vhosts: |_393 names had status 200 | http-enum: |_ /icons/: Potentially interesting folder w/ directory listing 111/tcp open rpcbind | rpcinfo: | 100000 2,3,4 111/tcp rpcbind |_ 100000 2,3,4 111/udp rpcbind Nmap done: 1 IP address (1 host up) scanned in 11.51 seconds
Come si può vedere dall’output del comando, usando discovery vengono mostrate diverse informazioni come gli HTTP headers, i banner SMTP, rcpinfo e altro. Anche se l’errore SMTP “Server is an open relay (16/16 tests)” è molto probabilmente un falso positivo (false positive), vale comunque la pena di controllare per esserne sicuri.
Con tutte queste funzionalità questa modalità è estremamente utile e rappresenta la parte chiave di NSE. Dopo tutto si può “exploitare” servizi senza essere a conoscenza della loro esistenza. Osservando i risultati generati da NSE è facile constatare che quando si tratta di scoprire servizi e server le informazioni ottenute sono molto utili. NSE non ti bombarda di dettagli, ti fornisce comunque abbastanza informazioni per essere estremamente utile.
L’impatto negativo che si può avere usando le categorie di script è che la performance viene ridotta se si usano tutti gli script di una categoria.
Nmap NSE – Espressioni regolari
Con NSE si possono usare le espressioni regolari (regular expressions). Per esempio ho menzionato i 15 script HTTP, per utilizzarli tutti assieme eseguire il seguente comando:
# nmap --script "http-*"
Si possono usare anche le decisioni booleane come segue:
# nmap --script "default or safe"
Nella documentazione si possono trovare anche esempi più complessi:
# nmap --script "(default or safe or intrusive) and not http-*"
In questo esempio vengono usate le categorie default, safe o intrusive ma non quelle che hanno a che fare con i web server.
Zenmap – Nmap con interfaccia grafica
Ci sono circostanze, specialmente se si ha a che fare con molti “target” (obbiettivi) in differenti reti, in cui si ha bisogno di aiuto per quanto riguarda l’analizzare i risultati. Immagina di essere in grado di aggiungere i risultati delle varie scansioni in una banca dati in modo da poterle analizzare e comparare tra di loro.
A questo scopo si può usare Zenmap (https://nmap.org/zenmap/). La versione ufficiale GUI dello scanner Nmap, il ben progettato Zenmap, è free e appropriato per utenti di ogni livello. Zenmap ha un generatore di comandi per assistere l’utente nel creare comandi complessi e ha anche l’abilità di poter fare ricerche riguardo alle scansioni effettuate in passato usando un database. È anche possibile crearsi un profilo per i comandi più comuni in modo da non doverli inserire ogni volta.
Questo programma con una molto utile interfaccia grafica e disponibile per Linux, BSD, Mac OS, e Windows.
Per utenti che eseguono delle scansioni frequentemente e qualunque novizio, Zenmap è il tool perfetto.