Output

Qualunque tool di sicurezza è utile quanto l'output che esso stesso genera. Test e algoritmi complessi sono di scarsa importanza se non presentati in modo comprensibile e ben organizzato. Dato il grande numero di modi in cui Nmap viene usato dagli utenti e da altro software, un singolo formato non potrebbe soddisfare tutti. Per questo motivo Nmap offre molti formati, inclusa la modalità interattiva per la lettura diretta degli utenti, e il formato XML per rendere l'output facilmente interpretabile dal software.

Inoltre per offrire differenti formati di output, Nmap fornisce opzioni per il controllo della verbosità dell'output, come anche dei messaggi di debugging. I tipi di output possono essere mandati allo standard output o a files, ai quali Nmap può accodare o sovrascrivere il contenuto. I files di output possono anche essere usati per ripristinare scansioni precedentemente annullate.

Nmap rende l'output disponibile in cinque formati differenti. Il formato predefinito è chiamato interactive output, e viene mandato allo standard output (stdout). Poi si ha il normal output, simile all'interactive ad eccezione del fatto che mostra meno informazioni di runtime e warnings, dal momento che si suppone che dovrà essere analizzato dopo il completamento della scansione, piuttosto che interattivamente.

L'XML output è uno dei tipi di output più importanti, dal momento che può essere convertito in HTML, interpretato con facilità dai programmi (come ad esempio le interfacce grafiche di Nmap) o importato in un database.

I rimanenti due tipi di output sono il semplice grepable output, che include la maggior parte delle informazioni su un obiettivo in una linea singola, e lo sCRiPt KiDDi3 0utPUt per gli utenti che si considerano |<-r4d.

Mentre l'output interattivo è quello predefinito e non ha opzioni da linea di comando associate, gli altri quattro formati usano una sintassi comune. Ricevono un argomento, il nome del file nel quale i risultati dovranno essere scritti. Possono essere specificati formati multipli, ma ogni formato può essere specificato solo una volta. Per esempio si potrebbe voler salvare il normal output per le proprie revisioni e nel mentre salvare l'XML per l'analisi programmatica. Ciò si potrebbe realizzare con le opzioni -oX myscan.xml -oN myscan.nmap. Questo capitolo usa per brevità dei nomi semplici come myscan.xml, ma sono generalmente consigliati nomi più descrittivi. I nomi scelti sono un problema di preferenza personale, anche se è solito usarne di lunghi che incorporano la data della scansione e un paio di parole che descrivano la scansione, messi in una directory chiamata come l'azienda che si sta scansionando.

Mentre queste opzioni salvano i risultati su files, Nmap mostra anche l'output interattivo in standard output come sempre. Per esempio, il comando nmap -oX myscan.xml target stampa XML dentro myscan.xml e scrive in standard output gli stessi risultati interattivi che avrebbe stampato se -oX non fosse stata specificata. Si può cambiare questo comportamento passando un trattino ("-") come argomento di un tipo di formato. Questo fa si che Nmap disattivi l'output interattivo e stampi il risultato nel formato che specificato nello stream dello standard output. Così il comando nmap -oX - target manderà in stdout soltanto l'output XML. Gli errori gravi possono comunque essere mostrati sullo stream di standard error (stderr).

A differenza di alcuni argomenti di Nmap, lo spazio tra l'opzione di log (ad esempio -oX) e il nome del file o il trattino, è obbligatorio. Se si omettono le opzioni e si danno argomenti come -oG- o -oXscan.xml, una feature di retro-compatibilità causerà la creazione di file di output in normal format chiamati rispettivamente G- e Xscan.xml.

Tutti questi argomenti supportano le conversioni di tipo strftime nel nome del file. %H, %M, %S, %m, %d, %y e %Y sono gli stessi parametri che si trovano in strftime. %T è l'equivalente di %H%M%S, %R è l'equivalente di %H%M e %D è l'equivalente di %m%d%y. Un % seguito da qualsiasi altro carattere da precedenza a quel carattere (%% mostra il simbolo percentuale). Quindi -oX 'scan-%T-%D.xml' lavorerà su di un file XML con un nome del tipo scan-144840-121307.xml.

Nmap offre inoltre l'opzione di controllo della verbosità e la possibilità di accodare ai file invece di sovrascriverli. Tutte queste opzioni sono descritte di seguito.

I Formati di Output di Nmap
-oN <filespec> (normal output)

Richiede che il normal output venga rediretto al file specificato. Come sopra, quest'output diverge leggermente da interactive output.

-oX <filespec> (XML output)

Richiede che l'output XML sia rediretto al file specificato. Nmap contiene un document type definition (DTD) che permette agli interpreti XML di validare l'output XML di Nmap. Sebbene serva principalmente per l'uso programmatico, può essere d'aiuto anche agli utenti. Il DTD definisce gli elementi convenzionali del formato, e spesso enumera gli attributi e i valori che possono assumere. L'ultima versione è sempre disponibile al link https://svn.nmap.org/nmap/docs/nmap.dtd.

XML offre un formato stabile e facilmente interpretato dal software. Gli interpreti XML liberi (free) sono disponibili per la maggior parte dei linguaggi di programmazione, compresi C/C++, Perl, Python e Java. Qualcuno ha anche scritto dei bindings per gran parte di questi linguaggi per trattare in maniera specifica l'output e l'esecuzione di Nmap. Ne sono esempio: Nmap::Scanner e Nmap::Parser nel Perl CPAN. In quasi tutti i casi il formato preferito per interpretare i risultati di Nmap è stato XML.

L'output XML fa riferimento ad uno stylesheet XSL che può essere usato per formattare il risultato in HTML. La maniera più facile di usarlo è semplicemente aprire il file XML in un web browser, come Firefox o IE. Di norma questa procedura dovrebbe funzionare solo sulla macchina su cui si esegue Nmap (o su una configurata in maniera simile) dato che il percorso a nmap.xsl è quello scritto nel codice di Nmap. Si vedano le opzioni --webxml o --stylesheet per creare un file XML portabile che renderizza come HTML in ogni macchina connessa al web.

-oS <filespec> (ScRipT KIdd|3 oUTpuT)

Lo script kiddie output è come l'interactive output, ad eccezione del post-processing che meglio adatta l'output ai l33t HaXXorZ che prima guardavano dall'alto in basso Nmap per la sua troppo corretta ortografia e per l'uso proprio delle maiuscole. Per le persone poco inclini allo humor, si noti che questa opzione prende in giro gli script kiddies, quindi non si critichi per un presunto "averli aiutati".

-oG <filespec> (grepable output)

Questo formato di output viene descritto per ultimo perché il suo uso è deprecato. L'output XML è di gran lunga più potente ed in pratica ugualmente utile per gli utenti esperti. XML è uno standard per le dozzine di eccellenti parsers che sono disponibili, mentre il grepable output è un semplice hack. XML è estensibile al supporto di nuove features di Nmap man mano che queste vengono rilasciate, mentre spesso vengono omesse queste nuove feature per il formato grepable per mancanza di spazio dove aggiungerle.

Ad ogni modo, il grepable output è ancora discretamente usato. È un formato semplice che lista ogni host su una riga e può essere facilmente cercato e interpretato dai tool standard di UNIX, come grep, awk, cut, sed, diff e Perl. Viene utilizzato per test semplici da riga di comando: trovare tutti gli host che hanno la porta SSH aperta o che montano Solaris, è questione di un semplice grep per identificare gli host e un pipe verso awk o cut per visualizzare i campi desiderati.

Il grepable output contiene commenti (le righe che iniziano con il cancelletto (#)) e righe target. Una riga target include una combinazione di 6 campi etichettati, separati da tabulazioni e terminati da un due punti (:). I campi sono Host, Ports, Protocols, Ignored State, OS, Seq Index, IP ID e Status.

Il più importante tra questi campi è generalmente il campo Ports, che da dettagli su ogni porta interessante. È una lista di "port entries" separate da una virgola. Ogni "port entry" rappresenta una porta interessante e prende la forma di sette sotto-campi separati da uno slash (/). Questi sotto-campi sono: Port number, State, Protocol, Owner, Service, SunRPC info e Version info.

Così come nell'output XML, questa pagina di manuale non permette di documentare l'intero formato. È disponibile una descrizione più dettagliata del formato grepable output nella sezione «Grepable Output (-oG)».

-oA <basename> (Output to all formats)

In caso di bisogno, si potrebbe specificare -oA <basename> per salvare i risultati dello scan nei formati normal, XML e grepable in una sola volta. Questi vengono salvati rispettivamente nei file <basename>.nmap, <basename>.xml e <basename>.gnmap. Come la maggior parte dei programmi, si può aggiungere un prefisso ai nomi dei file, come ad esempio un percorso ad una directory, ~/nmaplogs/foocorp/ su UNIX o c:\hacking\sco su Windows.

Verbosità e opzioni di debugging
-v (Increase verbosity level), -v<level> (Set verbosity level)

Aumenta il livello di verbosità, facendo in modo che Nmap stampi più informazioni riguardo lo scan in esecuzione. Le porte aperte sono mostrate man mano che Nmap le trova e il tempo rimanente stimato viene mostrato se Nmap ritiene che lo scan possa durare più di qualche minuto. Si può mettere l'opzione due o più volte per aumentare ulteriormente il livello di verbosità.

La maggior parte dei cambiamenti riguarda l'interactive output, e alcune cose anche il normal e lo script kiddie output. Gli altri tipi di output sono fatti per essere processati dalle macchine, quindi Nmap può dare un grosso livello di dettaglio di default, senza il problema di poter affaticare un utente umano. In ogni caso ci sono delle leggere differenze negli altri modi dove la dimensione dell'output può essere sostanzialmente ridotta omettendo alcuni dettagli. Per esempio solo in modalità verbosa viene stampata una linea di commento nel grepable output che fornisce una lista di tutte le porte scansionate, questo perché potrebbe essere abbastanza lunga.

-d (Increase debugging level), -d<level> (Set debugging level)

Quando anche il verbose mode non fornisce dati a sufficienza, è disponibile la modalità debugging, che sommergerà l'utente di informazioni! Così come succede per l'opzione verbosity (-v), il debugging viene attivato da un'opzione di riga di comando (-d) e il livello di debug può essere aumentato ripetendo l'opzione diverse volte, ad esempio -dd, o si può settare il debug level dando come argomento di -d un numero. Ad esempio, -d9 setta il livello a nove. Questo è il livello più alto e produrrà migliaia di linee a meno che non si stia facendo uno scan molto semplice con pochi target e poche porte.

L'output di debugging è utile quando si sospetta un bug in Nmap, oppure se si rimane confusi su cosa stia facendo Nmap e perché. Siccome questa feature è stata pensata principalmente per gli sviluppatori, le linee di debug non sono granché autoesplicative. Si potrebbe incontrare qualcosa tipo: Timeout vals: srtt: -1 rttvar: -1 to: 1000000 delta 14987 ==> srtt: 14987 rttvar: 14987 to: 100000. Se non si capisce una linea, quello che si può fare è ignorarla, guardarla nel codice sorgente, o richiedere aiuto alla lista di sviluppo (nmap-dev). Alcune linee si spiegano bene da sé, ma i messaggi divengono sempre più oscuri man mano che il livello di debugging sale.

--reason (Host and port state reasons)

Mostra il motivo per cui ad ogni singola porta è stato assegnato quello stato e la ragione per cui ogni host è attivo o meno. Quest'opzione mostra il tipo di pacchetto che ha determinato lo stato di una porta o di un host. Per esempio, un pacchetto RST da una porta chiusa o un echo reply da un host attivo. L'informazione che Nmap restituisce dipende dal tipo di scansione o di ping. Il SYN scan e il SYN ping (-sS e -PS) sono molto dettagliati, mentre il TCP connect scan (-sT) è limitato all'implementazione della chiamata di sistema connect. Questa feature è automaticamente abilitata dall'opzione di debug (-d) e i suoi risultati vengono salvati in file log in formato XML anche se quest'opzione non viene specificata.

--stats-every <time> (Print periodic timing stats)

Periodicamente stampa un messaggio di timing status ogni intervallo di <time>. Il tempo è una specifica del tipo descritto nella sezione «Timing and Performance» di questo manuale; quindi per esempio, si utilizzerà --stats-every 10s per avere un aggiornamento dello stato ogni 10 secondi. Gli aggiornamenti vengono stampati sull'interactive output (a schermo) e sull'XML output.

--packet-trace (Trace packets and data sent and received)

Fa in modo che Nmap stampi un riassunto di ogni pacchetto mandato o ricevuto. Viene usata spesso per il debugging, ma è anche un modo valido per gli utenti novizi per capire esattamente cosa sta facendo Nmap dietro le quinte. Per evitare che stampi migliaia di linee, si dovrebbe specificare una lista limitata di porte da controllare, come -p20-30. Se importa soltanto vedere come procede il version detection si può usare --version-trace. Se invece si è solo interessati allo script tracing, indicare --script-trace. Con --packet-trace, si avranno tutti quelli sopra.

--open (Show only open (or possibly open) ports)

Può succedere di essere interessati solamente alle porte cui ci si può connettere al momento (le open) e non si vuole mischiare i risultati con quelle closed, closed o closed|filtered. Si potrebbe personalizzare l'output dopo la scansione utilizzando tool come grep, awk e Perl, ma è stata aggiunta quest'opzione a causa di richieste travolgenti. Indicare --open per vedere solamente gli host con almeno una porta open, open|filtered o unfiltered, e vedere solamente le porte con questi stati. Questi tre stati vengono trattati normalmente, il che significa che open|filtered e unfiltered potrebbero essere raggruppate se ce ne dovessero essere troppe.

--iflist (List interfaces and routes)

Stampa la lista delle interfacce e degli instradamenti di sistema rilevati da Nmap. Questo è utile per risolvere i problemi di routing o cattive caratterizzazioni delle interfacce (ad esempio quando Nmap scambia una connessione PPP per ethernet).

Altre opzioni di output
--append-output (Append to rather than clobber output files)

Quando si specifica un nome di file mediante un parametro di output come -oX o -oN, questo file viene sovrascritto di default. Se si preferisce mantenere il contenuto del file e aggiungerci i nuovi risultati, si deve usare l'opzione --append-output. Tutti i file di output specificati in quell'istanza di Nmap verranno usati in append mode anziché essere sovrascritti. Quest'opzione non è di grande aiuto (e non funziona molto bene) nel caso di output in formato XML (-oX), poiché il parsing del file risultante non sarà corretto fino a quando non si controllerà il file manualmente.

--resume <filename> (Resume aborted scan)

Alcune esecuzioni di Nmap possono richiedere molto tempo - dell'ordine di giorni. Tali scansioni non arrivano sempre alla fine; alcune restrizioni possono impedire a Nmap di funzionare durante le ore del giorno, la rete può diventare irraggiungibile, la macchina sulla quale Nmap sta girando può subire un riavvio pianificato o improvviso o Nmap stesso può andare in crash. L'amministratore che sta usando Nmap può interromperlo per qualsiasi ragione, premendo ctrl-C. Ricominciare l'intera scansione dall'inizio può diventare fastidioso. Fortunatamente se sono rimasti i log in formato "normal" (-oN) o "grepable" (-oG), l'utente può richiedere a Nmap di ricominciare la scansione dall'host sul quale stava lavorando quando l'esecuzione è stata interrotta. Semplicemente basta specificare l'opzione --resume e passargli il file di output in formato normal/grepable come argomento. Non è permesso nessun altro argomento, poiché Nmap farà il parsing del file di output per usare le stesse opzioni specificate in precedenza. È quindi sufficiente invocare Nmap come nmap --resume <logfilename>. Nmap aggiungerà i nuovi risultati ai file specificati nell'esecuzione precedente. La ripresa di un'esecuzione non supporta il formato di output XML poiché sarebbe troppo difficile combinare le due esecuzioni in un unico file XML valido.

--stylesheet <path or URL> (Set XSL stylesheet to transform XML output)

Nmap viene fornito con un foglio di stile XSL chiamato nmap.xsl per vedere o tradurre l'output XML in HTML. L'output XML include una direttiva xml-stylesheet che punta al file nmap.xml dove è stato installato Nmap la prima volta. Processare il file XML con un XSLT processor come xsltproc per produrre un file HTML. Aprire direttamente l'output XML in un browser non funziona più tanto bene in quanto i browser recenti limitano le location da cui può essere caricato un foglio di stile. Se si volesse usare un foglio di stile diverso, va specificato mediante l'opzione --stylesheet. Il file va indicato con il percorso completo o l'URL. Un esempio di invocazione con quest'opzione è --stylesheet https://nmap.org/svn/docs/nmap.xsl. Questo indica ad un XSLT processor di caricare l'ultima versione del foglio di stile da Nmap.Org. L'opzione --webxml fa la stessa cosa ma richiede meno digitazioni e meno cose da ricordare. Caricando l'XSL da Nmap.Org rende più semplice visualizzare i risultati su una macchina che non ha Nmap (e quindi il file nmap.xsl) installato. Quindi l'URL è spesso una scelta migliore, ma di default viene usato il file dal filesystem locale per ragioni di privacy.

--webxml (Load stylesheet from Nmap.Org)

Quest'opzione è semplicemente una comodità per l'opzione --stylesheet https://nmap.org/svn/docs/nmap.xsl.

--no-stylesheet (Omit XSL stylesheet declaration from XML)

Quest'opzione va specificata quando non si vuole che Nmap associ un qualsiasi foglio di stile XSL al proprio output XML. La direttiva xml-stylesheet viene omessa.