Nmap Scripting Engine (NSE)

L'Nmap Scripting Engine (NSE) è una delle feature più potenti e flessibili di Nmap. Permette agli utenti di scrivere (e condividere) semplici script (utilizzando il linguaggio di programmazione Lua) per automatizzare un gran varietà di networking task. Questi script vengono eseguito in parallelo con la velocità e l'efficienza che ci si aspetta da Nmap. Gli utenti possono fare affidamento sui crescenti e diversi set di script distribuiti da Nmap, oppure scriverli loro stessi in base alle proprie necessità.

I task che abbiamo preso in considerazione quando abbiamo creato il sistema includono il network discovery, version detection più sofisticate, il vulnerability detection. NSE può anche essere usato per la vulnerability exploitation.

Per riflettere i differenti usi e semplificare la scelta di quale utilizzare, ogni script contiene un campo associato con una o più categorie. Attualmente le categorie definite sono auth, broadcast, default, discovery, dos, exploit, external, fuzzer, intrusive, malware, safe, version e vuln. Queste sono tutte descritte nella sezione «Script Categories».

Gli script non vengono eseguiti in una sandbox e quindi possono, accidentalmente o maliziosamente, danneggiare il sistema su cui vengono eseguiti o invadere la propria privacy. Non eseguire mai script di terze parti se non si ha la fiducia degli autori o non si ha preventivamente controllato personalmente gli script.

L'Nmap Scripting Engine è descritto nel dettaglio in Chapter 9, Nmap Scripting Engine e viene controllato dalle seguenti opzioni:

-sC

Esegue uno script scan utilizzando il set di script di default. È l'equivalente di --script=default. Alcuni degli script in questa categoria vengono considerati intrusivi e potrebbero non essere eseguiti su di un obiettivo di rete senza permessi.

--script <filename>|<category>|<directory>|<expression>[,...]

Esegue uno script scan utilizzando una lista, separata da virgole, di file, categorie di script e directory. Ogni elemento nella lista può anche essere un'espressione booleana che descrive un più complesso set di script. Gli elementi vengono interpretati prima come un'espressione, poi come una categoria e infine come il nome di file o di una directory.

Sono presenti due feature speciali dedicate agli utenti esperti. La prima consiste nell'aggiungere come prefisso al nome degli script e alle espressioni il carattere + per forzarne l'esecuzione anche quando non verrebbe fatta (ad esempio quando il relativo servizio non è stato trovato sulla porta dell'host). L'altra feature è l'argomento all che può essere utilizzato per specificare tutti gli script nel database di Nmap. Usare con cautela questa funzionalità dato che NSE contiene script pericolosi come exploit, "brute force authentication crackers" e attacchi "denial of service".

I percorsi dei file e delle directory possono essere sia relativi che assoluti. I percorsi assoluti sono diretti, mentre quelli relativi vengono ricercati nelle cartelle scripts presenti in ogni seguente locazione:

--datadir
$NMAPDIR
~/.nmap (non usato in Windows)
<HOME>\AppData\Roaming\nmap (usato solo in Windows)
la directory contenente l'eseguibile di Nmap
la directory contenente l'eseguibile di Nmap, seguita da ../share/nmap
NMAPDATADIR
La directory corrente

Quando viene specificata una directory, Nmap carica ogni file in quella directory che ha come estensione .nse. Tutti gli altri file verranno ignorati e la directory non verrà scansionata in modo ricorsivo. Quando viene specificato un file, bisogna omettere l'estensione .nse, verrà aggiunta automaticamente se necessario.

Gli script Nmap sono archiviati di default in una subdirectory scripts della directory principale di Nmap (vedi Chapter 14, Understanding and Customizing Nmap Data Files). Per migliorare l'efficienza, gli script vengono indicizzati nel database scripts/script.db, che elenca le categorie cui ogni script appartiene.

Quando si usa il nome dagli script come riferimento dal file script.db, si può utilizzare come nella shell il carattere speciale «*».

nmap --script "http-*"

Carica tutti gli script il cui nome inizia con http-, come http-auth e http-open-proxy. L'argomento di --script è stato messo tra apici per proteggere il carattere speciale dall'interpretazione della shell.

Selezioni più complesse di script possono essere eseguite utilizzando gli operatori and, or e not costruendo così espressioni booleane. Gli operatori hanno la stessa precedenza che hanno in Lua: not è il più alto, seguito dal and e quindi or. Si può modificare la precedenza utilizzando le parentesi. Dato che le espressioni contengono caratteri di spazio, è necessario racchiuderle tra apici (quote).

nmap --script "not intrusive"

Carica tutti gli script tranne quelli nella categoria intrusive.

nmap --script "default or safe"

Questa funzionalità è l'equivalente di --script "default,safe". Carica tutti gli script che sono nelle categorie default, safe o in entrambe.

nmap --script "default and safe"

Carica gli script che sono in entrambe le categorie default e safe.

nmap --script "(default or safe or intrusive) and not http-*"

Carica gli script che sono nelle categorie default, safe o intrusive tranne quelli il cui nome inizia con http-.

--script-args <n1>=<v1>,<n2>={<n3>=<v3>},<n4>={<v4>,<v5>}

Permette di fornire argomenti agli script NSE. Gli argomenti sono una lista, separati da virgola, di coppie name=value. I nomi e i valori possono essere stringhe senza spazi o i caratteri "{", "}", "=" e ",". Per includere uno di questi caratteri in una stringa, si deve racchiudere la stringa tra apici singoli o doppi. Il carattere "\" (backslash) in una stringa tra apici, annulla la funzionalità dell'apice. Il backslash viene interpretato in questo modo solo in questo caso particolare, negli altri casi viene considerato "letteralmente". I valori possono anche essere elenchi racchiusi tra parentesi graffe ("{}"), così come in Lua. Un elenco può contenere valori, nella forma di semplici stringhe, oppure altre coppie di nomi-valori; sono consentiti anche gli elenchi annidati. Alcuni script definiscono i loro argomenti con il nome dello script, ad esempio xmpp-info.server_name. Si può utilizzare questa identificazione per agire solo sullo script specificato, oppure utilizzare la versione non identificativa (server_name in questo caso) per agire su tutti gli script che utilizzano questo argomento. Uno script controllerà prima gli argomenti a lui identificati (il nome degli argomenti è specificato nella documentazione dello script) prima di accettare un argomento non qualificato. Un esempio complesso è --script-args 'user=foo,pass=",{}=bar",whois={whodb=nofollow+ripe},xmpp-info.server_name=localhost'. L'NSE Documentation Portal all'indirizzo https://nmap.org/nsedoc/ elenca gli argomenti che ogni script accetta.

--script-args-file <filename>

Permette di passare gli argomenti agli script NSE tramite un file. Ogni argomento sulla riga di comando sostituisce quelli nel file. Il percorso del file può essere assoluto o relativo e, in quest'ultimo caso, farà riferimento al solito percorso di ricerca di Nmap (NMAPDIR, ecc.). Gli argomenti possono essere separati da virgola o da un carattere di a-capo, ma devono seguire le stesse regole di --script-args, senza però particolari apici dato che non vengono elaborati dalla shell.

--script-help <filename>|<category>|<directory>|<expression>|all[,...]

Mostra l'help degli scripts. Per ogni script specificato, Nmap restituisce il nome, le categorie cui appartiene e la sua descrizione. La sintassi è la stessa dell'opzione --script; quindi per esempio se si volesse l'help dello script ftp-anon, si dovrà eseguire il comando nmap --script-help ftp-anon. Oltre all'help per gli script individuali, si potrà anche ottenere l'anteprima di cosa lo script eseguirà secondo una specifica, ad esempio nmap --script-help default.

--script-trace

Quest'opzione è come l'opzione --packet-trace, solo un livello ISO più in alto. Se viene specificata quest'opzione, tutte le comunicazioni in entrata ed in uscita eseguite da uno script vengono mostrate. Queste informazioni includono il protocollo di comunicazione, la sorgente, l'obiettivo e i dati trasmessi. Se più del 5% di tutti i dati trasmessi non sono stampabili a video, allora l'output sarà in esadecimale. Indicando l'opzione --packet-trace anche lo script tracing verrà abilitato.

--script-updatedb

Quest'opzione aggiorna il database degli script che si trova nel file scripts/script.db, il quale viene utilizzato da Nmap per determinare gli script e le categorie di default. È necessario aggiornare il database solo se vengono aggiunti o rimossi script NSE dalla directory di default o se sono state cambiate le categorie di qualche script. Quest'opzione viene generalmente utilizzata da sola: nmap --script-updatedb.