back to top

Nmap: cos’è e come funziona il port scanning

Oggigiorno ognuno di noi gestisce, consciamente o meno, una rete di computer. Sia che si tratti della piccola LAN domestica formata da uno o due computer, sia che si parli di vaste LAN aziendali, è fondamentale prendere coscienza di cosa significhi esporre una macchina in Rete.

Quasi sempre questo obbliga, come primo passo, a prendere confidenza con la suite di protocolli TCP/IP e, secondariamente, a verificare operativamente la propria rete mediante una scansione. Approcciando questa seconda fase difficilmente non udiremo parlare di Nmap.

Cos’è NMAP?

NmapNetwork mapper – è uno dei più noti ed usati security scanner al mondo; la prima versione, sviluppata da Gordon – Fyodor – Lyon, fu pubblicata il 1 Settembre 1997 su Phrack.org, il notissimo magazine dell’underground hacker. Rilasciato sotto licenza GPL per tutte le maggiori piattaforme, nel tempo ha subito svariate riscritture evolvendosi sino a rappresentare un vero riferimento nel campo della sicurezza IT.

Nmap effettua il discovery di hosts e servizi, presenti su una rete informatica, inviando pacchetti TCP/UDP manipolati in modo opportuno: tale capacità permette non solo, come vedremo, un mero riconoscimento delle porte aperte sui vari hosts ma abilita ad una serie di funzionalità quali il riconoscimento dell’O.S. del sistema target, il nome e la versione dei suoi servizi attivi, la presenza di meccanismi di sicurezza interposti (quali IDS e firewall).

Prima di continuare è opportuno ricordare che scansionare host senza previa autorizzazione del proprietario, a prescindere dallo scopo "didattico" dell’attività, è generalmente un comportamento mal visto dagli amministratori di rete e, a seconda della legislazione in vigore nei vari stati, operazione passibile di reato.

A chi è rivolta quest’articolo

Sebbene si tratti di un articolo rivolto a neofiti del network scanning, la comprensione di questo articolo richiede una discreta conoscenza della suite di protocolli TCP/IP: concetti quali IP, pacchetto o porta TCP/UDP saranno dati per assodati; qualora non lo fossero si consiglia di leggere prima qualche guida di base.

Per le medesime motivazioni, questo testo non ha ha la pretesa di coprire interamente un software complesso quale Nmap in tutte le sue sfacettature ma di illustrarne le principali funzionalità lasciando ai più volenterosi ulteriori approfondimenti.

Ottenere Nmap

Come brevemente accennato, sebbene nasca come software per GNU/Linux, oggigiorno Nmap è disponibile per tutte le maggiori piattaforme incluso Microsoft Windows (in tutte le sue incarnazioni), Mac OSX, BSD, Solaris e molte altre; qualunque sia il sistema, sottolineiamo fin d’ora che la maggior parte delle funzionalità di Nmap richiedono privilegi amministrativi.

Ottenere una copia di Nmap è molto semplice; oltre che attraverso il sito ufficiale, praticamente ogni distribuzione GNU/Linux ne include una copia nei suoi repository. Come in ogni realtà GPL, gli utenti più smaliziati potranno inoltre compilare e/o modificare il codice sorgente del software, ottimizzandolo per le prorie necessità.

In questo articolo prenderemo come riferimento la versione 5.21, pre-compilata per Debian GNU/Linux a 64-bit; salvo diversamente indicato, resta inteso che ogni raccomandazione è indipendente da questo particolare setup. Per semplificarne l’uso si raccomanda, se non avenisse in automatico, di aggiugere la directory contenente l’eseguibile di Nmap alla variabile di sistema $PATH (o equivalente).

Il primo scan

Sospendiamo momentaneamente la teoria e rilassiamo le meningi approcciando un pò la pratica. Il primo scan, che esamineremo in dettaglio, ha un target tradizionalmente standard: scanme.nmap.org. Lungi da tradire questo rito iniziatorio, apriamo una console o un prompt dei comandi ed eseguiamo:

nmap -T5 -v -A -sS -oA first_scan scanme.nmap.org

Prima di esaminare i vari parametri, commentiamone l’output qui sintetizzato:

Starting Nmap 5.21 ( http://nmap.org ) at ...
NSE: Loaded 36 scripts for scanning.
Initiating Ping Scan at ...
Scanning scanme.nmap.org (64.13.134.52) [4 ports]
Completed Ping Scan at ... 
Initiating Parallel DNS resolution of 1 host. at ...
Completed Parallel DNS resolution of 1 host. at ...
Initiating SYN Stealth Scan at ... 
Scanning scanme.nmap.org (64.13.134.52) [1000 ports]
Discovered open port 53/tcp on 64.13.134.52
Discovered open port 80/tcp on 64.13.134.52
Discovered open port 22/tcp on 64.13.134.52
Completed SYN Stealth Scan at ...
Initiating Service scan at ...
Scanning 3 services on scanme.nmap.org (64.13.134.52)
Completed Service scan at ...
Initiating OS detection ...
...
Nmap scan report for scanme.nmap.org (64.13.134.52)
Host is up (0.15s latency).
Not shown: 994 filtered ports
PORT      STATE  SERVICE VERSION
22/tcp    open   ssh     OpenSSH 4.3 (protocol 2.0)
| ssh-hostkey: 1024 ... (DSA)
|_2048 ... (RSA)
25/tcp    closed smtp
53/tcp    open   domain
70/tcp    closed gopher
80/tcp    open   http    Apache httpd 2.2.3 ((CentOS))
|_html-title: Go ahead and ScanMe!
31337/tcp closed Elite

Device type: WAP|general purpose|media device|...
Running (JUST GUESSING) : ..., Linux 2.6.X (91%), ...
Network Distance: 19 hops

TRACEROUTE (using port 25/tcp)
...

Osserviamo come una singola esecuzione si componga di più scansioni.

  • Il ping scan permette a Nmap di determinare, con un certo grado di precisione, se l’host è attivo; nonostante il nome, questa prima scansione non ha molto in comune con il comando ping normalmente utilizzato per verificare la connettività di rete: di default, Nmap interpreta un ping scan come una successione di un echo request ICMP, un pacchetto TCP SYN alla porta 443, un TCP ACK alla porta 80 e un timestamp request ICMP.
  • Un lookup DNS.
  • Il port scanning vero e proprio, in questo caso un SYN stealth scan che discuteremo più in dettaglio nella prossima sezione.
  • Ulteriori scansioni per determinare versione dei servizi in ascolto sulla macchina, il suo sistema operativo e il traceroute.

In questo esempio notiamo che sono state riconosciute tre porte aperte e tre chiuse, è stato identificato il sistema operativo come un GNU/Linux CentOS e per i servizi attivi sono state recuperate una serie di informazioni quali nome dell’applicativo e versione.

I parametri utilizzati influenzano drammaticamente le performance e i risultati ottenibili da Nmap; tra quelle utilizzate riconosciamo -A per abilitare il riconoscimento del sistema operativo, dei servizi e il traceroute (effetto componibile anche tramite la combinazione -O -sV –traceroute), -T(0-5) per specificare la velocità di scansione, -oA per loggare i risultati nei tre formati principali supportati e, infine, -v per aumentare il dettaglio dell’output su console.

A questo punto è probabile che, nel caos di informazioni fornite, si sia persa un minimo la visione globale e ci si stia ponendo alcune domande: su quali e quante porte, e per quali protocolli è stata effettuata la scansione? Come può un programma identificare il mio sistema operativo o la versione dei mie applicativi? In ultima analisi, quale utilizzo faccio di questi dati?

Tutte domande legittime alle quali tenteremo di dare risposta; Nmap, se non diversamente specificato, effettua una scansione su 1000 porte tra quelle più usate dai vari applicativi: web server (80, 443, 8080, 8443), mail server (25, 110, 143), ftp server (21) sono solo alcuni degli esempi a cui siamo maggiormente abituati. Ovviamente nulla vieta a qualcuno di impostare il proprio web server sulla porta 21 piuttosto che sulla porta 5920. Nmap interpreta le risposte (o la mancata risposta) da parte dell’host target, stabilendo se una porta sia aperta, chiusa o filtrata, cioè se l’host non risponde nè positivamente nè negativamente alla richiesta.

Nonostante sia uno standard è fondamentale capire che ogni produttore ha implementato la suite TCP/IP inserendogli alcune peculiarità. Sono proprio queste piccole differenze note che permettono a Nmap, utilizzando i dati ricevuti dall’host target, di identificarne il probabile sistema operativo: il riconoscimento è eseguito tramite pattern noti ed è pertanto un risultato puramente statistico e il cui valore non è certificabile; ciononostante l’ampio database interno di Nmap garantisce, almeno verso i sistemi più diffusi, un’accuratezza sufficientemente elevata. Diverso discorso riguarda il riconoscimento dei servizi in ascolto sulle porte attive: in questo caso Nmap si limita ad utilizzare il cosidetto banner dell’applicazione, quell’insieme di informazioni rivelate ad un tentativo di accesso; ad esempio, un web server Apache tipicamente mostrerà non solo il suo nome ma anche la sua versione, le estensioni attive e il sistema operativo ospitante.

Infine soffermiamoci sull’ultima domanda, quale utilità abbiano le informazioni ricavate. Qualunque adetto al settore riconosce l’importanza che questo prima fase di raccolta d’informazioni, detta information gathering, ricopre. Tanto più precise e vaste sono le nostre conoscenze su un host tanto più semplice sarà scoprire una qualche maniera per comprometterlo: ad esempio, potremmo trovare un host con un ftp server e ricavarne che la versione non è aggiornata; una rapida consultazione su siti specializzati potrebbe poi indicarci che quella particolare versione è affetta da una o più vulnerabilità che permettono di accedere in modo non autorizzato all’host: l’informazione è potere non è solo una frase per suggerire ai bambini di prendere la scuola seriamente!

Tecniche di port scanning

Il protocollo TCP, così come definito nell’originale RFC 793, non lascia molte possibilità di interpretazione sul comportamento da tenere in presenza di pacchetti malformati o inaspettati. Ciononostante ogni vendor, spesso ogni implementazione, specifica comportamenti differenti in risposta a trasmissioni che non rispettino lo standard. Questa consapevolezza ha spinto gli sviluppatori di Nmap a includere diverse tipologie di port scanning che abilitino gli utenti a sfruttare di volta in volta le lacune delle varie implementazioni; in questa sezione ne presenteremo i principali.

SYN stealth scan (-sS)

Il TCP SYN scan è il più noto metodo di scansione presente in Nmap, tanto da essere stato eletto a scan di default. Se riprendiamo l’output della nostra prima scansione noteremo che è stato posto esplicitamente: rilanciando il programma senza tale parametro non noteremo comunque differenze. Il SYN scan è volutamente incongruente con le specifiche dello standard TCP; vista la sua importanza rivediamo rapidamente come il protocollo TCP negozia una connessione (schematizzato nell’immagine qui di seguito).

Schematica rappresentazione della negoziazione di una connessione TCP

Una connessione TCP inizia tramite l’invio di un pacchetto di SYN a cui l’host contattato risponde mediante un SYN/ACK, se accetta la connessione, o con un pacchetto RST (reset) se la rifiuta. Nel primo caso, l’host che ha iniziato la connessione trasmette un ulteriore ACK. Questo strategia per instaurare la connessione, detta three-way handshake è stata appositamente studiata per garantire che, in reti senza garanzia di consegna quali Internet, entrambi gli host abbiano modo di comprendere se la connessione è instaurata o meno. Tuttavia, in questo tipo di scanning, Nmap invia il solo pacchetto di SYN iniziale, lasciando l’host target in uno stato "inconsistente": molti sistemi non tracciano questo tipo di attività anomala sebbene un buon firewall o un IDS degno di questo nome non si lascieranno sfuggire l’anomalia. In ogni caso ciò è sufficiente a determinare lo stato della porta: se si riceve un SYN o un SYN/ACK la porta è considerata aperta mentre un RST è indicativo di una porta chiusa; se dopo alcune ritrasmissioni non si è ricevuta alcuna risposta la porta è considerata filtrata.

Connect() scan (-sT)

Il connect() scan è di allarmante semplicità in quanto si limita ad aprire normali connessioni TCP sulle porte dell’host target; rispetto al SYN scan è più lento e facilmente genererà logs nella macchina target. Il solo motivo per cui ha senso utilizzarlo è qualora non si posseggano privilegi amministrativi sulla macchina dal quale eseguiamo Nmap: mentre una connect(), essendo una system-call usata a livello applicativo è disponibile per qualunque utente, il controllo del flusso TCP così come lo abbiamo presentato poc’anzi richiede interventi a livello kernel.

UDP scan (nmap -sU)

Ai più passa inosservato ma molti dei servizi che utilizziamo quotidianamente utilizzano il protocollo UDP e non il TCP: DNS, DHCP e SNMP, ad esempio, sono tra quelli con cui sicuramente ci scontriamo, coscienti o meno, tutti i giorni. Nmap permette di scansione anche queste porte, sebbene per motivi tecnologici le performance siano nettamente minori: si ricorda, infatti, che UDP è un protocollo connection-less senza riscontro di avvenuta e corretta comunicazione; questo provoca ripetute ritrasmissioni al fine di accertarsi, stasticamente, che i pacchetti siano giunti a destinazione e l’eventuale risposta sia stata inviata.

NULL, FIN e Xmas scan (nmap -sN, -sF, -sX)

Questi tipi di scansione manipolano i campi dell’header TCP, sfruttando alcune particolari poco noti del protocollo per differenziare le porte aperte da quelle chiuse. Citando l’RFC "if the destination port state is CLOSED … an incoming segment not containing a RST causes a RST to be sent in response". Pertanto un’implementazione rispettosa dello standard risponderà con un RST a pacchetti SYN, RST e ACK se la porta è chiusa e non risponderà se la porta è aperta; riportando alla mente come il TCP differenzi i pacchetti utilizzando un set di bits nell’header, Nmap forgia pacchetti TCP che utilizzino una combinazione dei tre bits rimanenti (FIN, PSH e URG) dando origine ai suddetti scan: il Null scan pone tutti i bit a zero, il FIN scan utilizza unicamente il bit di FIN mentre il Xmas scan li setta tutti a uno "illuminando il pacchetto come un albero di Natale", per citare Fyodor.

TCP Maimon scan (nmap -sM)

Il Maimon scan deve il nome al suo ideatore, Uriel Maimon, che lo presentò sul numero 49 di Phrack nel Novembre 1996. Questa tipo di scanning è uguale ad un NULL, FIN, o Xmas scans ma utilizza un pacchetto di FIN/ACK. Secondo le specifiche, un target deve rispondere con un pacchetto RST sia che la porta sia aperta sia che sia chiusa. Ciononostante, come già ricordato, non tutti i sistemi rispettano il contenuto del RFC.

Idle scan (nmap -sI <zombie host>[:<probeport>])

Questo tipo di scansione rasenta la perfezione e, se correttamente implementata, permette di verificare la presenza di porte aperte/chiuse senza esporre il proprio indirizzo IP. Utilizzando particolari caratteristiche di alcune implementazioni del protocollo IP (un predicibile fragmentation ID), è possibile dedurre lo stato di una porta interrogando una terza macchina, detta host zombie. Per ogni porta, Nmap invia tre pacchetti: il primo è è diretto alla macchina zombie allo scopo di determinare l’IP ID corrente; a seguire, è forgiato un pacchetto avente come IP sorgente l’indirizzo della macchina zombie ed è inviato al target. Se la porta non è filtrata (aperta o chiusa), il target risponderà allo zombie che tipicamente replicherà con un RST, modificando in tal modo il proprio IP ID; se questa modifica è predicibile, ad esempio se l’ID è incrementato tipo un contatore, una successiva interrogazione allo zombie permetterà di determinare se la porta è aperta/chiusa o filtrata.

Oltre alle tipologie presentate, Nmap offre diverse altre alternative per scansionare un host. Sebbene talune volte possano risultare più efficaci, quelle descritte sono da preferire in quanto tipicamente più performanti, efficaci e discreti.

Zenmap: un’interfaccia grafica per Nmap

Una delle critiche che spesso accompagnano gli strumenti di sicurezza è la mancanza di interfacce grafiche user-friendly; se sino a qualche tempo fa Nmap non era estraneo a questo problema, con l’uscita di Zenmap possiamo finalmente considerarlo superato. Zenmap è l’interfaccia grafica ufficiale di Nmap e, al pari dell’illustre collega, è un software multi-piattaforma e open-source. La sua progettazione si è concentrata nello sviluppare uno strumento che da un lato facilitasse l’uso di Nmap ai novizi, senza per questo impedirne un uso avanzato ad utenti più esperti. Il risultato, visionabile in figura, è un’interfaccia pulita e di immediato utilizzo.

Zenmap: la nuova interfaccia grafica di Nmap

Ovviamente nessuna interfaccia può sostituire le centinaia di opzioni di cui Nmap dispone. Ciononostante, normalmente Zenmap permette di ottenere buoni risultati con il valore aggiunto di presentarli in modo efficace ed intuitivo.

Aspetti avanzati: NSE

Introdotto relativamente di recente, il Nmap Script Engine è un versatile motore di scripting per estendere le capacità di Nmap senza forzare gli sviluppatori ad approcciare un compito impegnativo quale la modifica dei sorgenti C del programma.

NSE è un motore per script in linguaggio LUA e permette agli utenti di automatizzare una serie di procedure e test verso gli host target. Seppure inconsapevolmente, abbiamo già adoperato questa funzionalità; se ritorniamo alla nostra prima scansione e ne esaminiamo la seconda riga noteremo la seguente frase:

NSE: Loaded 36 scripts for scanning.

Avendo specificato l’opzione -A, la nostra scansione ha abilitato una serie di scripts di uso comune per recuperare alcune informazioni aggiuntive quali le chiavi SSH remote e il titolo della pagina root del web server, "Go ahead and ScanMe!".

NSE è attivabile esplicitamente mediante l’opzione

--script="<categories>"

sostituendo a categories una lista separata da virgole di nomi identificativi le categorie in cui Nmap riunisce gli scripts:

  • auth, riunisce gli script che tentano di determinare le credenziali di accesso ai servizi dell’host target;
  • default, un set di script di generica utilità, attivati automaticamente con -A;
  • discovery, include gli scripts che tentano attivamente di raccogliere ulteriori informazioni sui servizi attivi;
  • dos, racchiude gli scripts che possono causare dei denial-of-service;
  • exploit, include gli scripts che tentano di sfruttare eventuali vulnerabilità;
  • intrusive, comprende gli scripts potenzialmente intrusivi e nocivi al sistema, potenzialmente capaci di mandare in crash il sistema;
  • version, riunisce gli scripts per identificare le versioni dei vari servizi ed automaticamente inclusi con l’opzione -sV o -A;
  • safe, un set di scripts testati e il cui uso non dovrebbe causare problemi o impensierire gli amministratori di sistema del target;
  • malware, include gli scripts che tentano di determinare se l’host target è infetto da qualche tipo di malware noto;
  • vuln, racchiude gli scripts che tentano di determinare se l’host target è affetto da qualche vulnerabilità nota;
  • fuzzer, riunisce gli script che inviano al target dati casuali (fuzzy) nel tentativo di identificare qualche bug non noto;
  • external, comprende gli scripts realizzati dall’utente.

Conclusioni

Concludendo, Nmap è un potente strumento per ricavare informazioni da una rete informatica, identificandone i potenziali problemi. Il suo utilizzo, sebbene inizialmente ostico, permette un’analisi estremamente approfondita di ciò che un host esponene alle altre macchine. Tramite l’interfaccia grafica Zenmap possiamo approcciare lo strumento con maggior facilità rispetto al passato, sebbene niente possa sopperire la consapevolezza data da una continuata esperienza sul campo.

Riferimenti e Approfondimenti

Pubblicitร 

Leggi anche...

Autenticazione a due fattori (2FA): cos’è e come funziona

L'autenticazione a due fattori (in inglese Two Factor Authentication...

Authcode: cos’è e come funziona

Con il termine Authcode (o Auth-code) si fa riferimento...

HTTP Security Headers: aumentare la sicurezza del sito con .htaccess

Esistono diverse tecniche per innalzare il livello di sicurezza...

Criptare (e decriptare) file su Linux con OpenSSL

OpenSSL è un'implementazione rilasciata sotto licenza Open Source dei...

Cos’è una Botnet?

Con il termine botnet si fa riferimento ad una...

DDoS: cos’è, come funziona e come difendersi

Un DDoS (acronimo di Distribuited Denial of Service) รจ...
Pubblicitร