Nota: articolo di proprietà e apparso per la prima volta su OpenSkills.info – http://www.openskills.info
Introduzione
L’esponenziale crescita dell’ICT (Information Communication Technology) ed il pervasivo aumento di reti per l’interconnessione tra sistemi informativi, impongono un’ostinata attenzione a quelli che sono gli aspetti legati alla sicurezza informatica.
Non ci si deve meravigliare, infatti, se il numero di personal computer compromessi ha subito un forte rialzo in questi ultimi anni.
In un recente articolo abbiamo esaminato come “blindare” un PC montante il sistema operativo GNU/Linux tramite una security patch denominata grsecurity.
E’ giunto il momento di analizzare in prima persona le vulnerabilità a cui il nostro computer è esposto: battezziamo così il vulnerability scanning.
Per vulnerability scanning intendiamo esclusivamente l’analisi lecita della nostra rete (e/o comunque di una rete cui abbiamo la piena autorizzazione da parte dell’amministratore): ciò viene comunemente definito forensic analysis.
Non è intenzione dell’autore, pertanto, offrire i mezzi e le conoscenze per sferrare attacchi informatici illeciti; a tal proposito ricordo che l’accesso abusivo a sistemi informatici è un reato punito dal codice penale.
Gli strumenti messi a disposizione dalla comunità del software libero per analizzare (e quindi contrastare) le possibili vulnerabilità di un sistema sono molteplici: dal performante port scanner nmap all’avanzato e potente sistema per la verifica della presenza di eventuali vulnerabilità nessus, passando per l’egregio hardening system bastille. In questo tutorial analizzeremo i primi due, rimandando ad un prossimo articolo lo studio del terzo.
Nmap
Nmap è probabilmente il più evoluto portscanner della storia; è presente in quasi tutte le major-distro linux ed esiste un port anche per ambiente win32 ed Os X.
Nel caso in cui la nostra distro non lo abbia installato di default, colleghiamoci al sito http://www.insecure.org/nmap/nmap_download.html e scarichiamolo.
Scaricato il tarball, estraiamolo con tar -zxvf namp.xxx.x.tar.gz e compiliamolo eseguendo: ./configure && make && make install.
L’utilizzo di nmap non è eccessivamente laborioso; esso infatti prevede, nella sintassi di base, i seguenti argomenti:
nmap [tipi di scan] [eventuali opzioni] <host>
Eviterò di elencare tutte le opzioni di nmap (cosa, a mio avviso, inutile); cercherò, invece, di stimolare il lettore attraverso esempi pratici che dimostrino come lavora effettivamente nmap.
Mettiamo il caso che voglia analizzare la mia rete personale dall’interno:
# nmap -sT -PI 192.168.0.0/24
-sT analizzerà le porte (i servizi) attraverso connessioni “piene” mentre -PI si occuperà di sondare le eventuali macchine attive all’interno della rete tramite l’invio di pacchetti icmp echo.
Analizziamo l’output di nmap:
Starting nmap 3.50 ( http://www.insecure.org/nmap/ ) at 2005-02-25 15:03 UTC
E’ il banner d’avvio (che vedremo ad ogni scansione effettuata).
Host 192.168.0.0 seems to be a subnet broadcast address (returned 4 extra pings). Skipping host.
Indica che all’interno della rete 192.168.0.0 ci sono quattro host da analizzare. Fatto ciò nmap si mette a lavoro permettendoci di capire quali host e quali servizi sono attivi nella nostra rete:
Interesting ports on 192.168.0.5: (The 1657 ports scanned but not shown below are in state: filtered) PORT STATE SERVICE 80/tcp open http 1900/tcp open UpnP Interesting ports on 192.168.0.10: ...[output]... Interesting ports on 192.168.0.101: ...[output]... Interesting ports on 192.168.0.102: ...[output]... Interesting ports on joerg.mozakoLabs (192.168.0.103): PORT STATE SERVICE ...[output]...
Lo scenario ora è più chiaro: nella rete ci sono 4 macchine attive ed un presumibile router.
La prima cosa che salta all’occhio è la suddivizione che nmap applica allo scanning: PORT, STATE e SERVICE rispettivamente: porta, stato e servizio.
Sotto la voce PORT troviamo un valore numerico che indica il numero della porta rilevata su host X.
STATE mostra lo stato della porta, che può essere di tre tipi: OPEN (porta aperta e liberamente accessibile), CLOSED (porta chiusa, inaccessibile), FILTERED (porta aperta ma filtrata da firewall).
SERVICE, infine, ci dice il nome vero e proprio del servizio abbinato a Y porta. Naturalmente nmap non si limita ad un’analisi così superficiale; poniamo il caso che adesso io voglia carpire qualche informazione in più dalla mia rete, ad esempio il demone associato a servizio K e, perchè no, la marca e/o il nome del sistema operativo montato sull’host X:
# nmap -sT -sV -O -I -v 192.168.0.102 Host 192.168.0.102 appears to be up ... good. # l'host è attivo: buon segno
Tramite l’opzione -v (verbose) possiamo scorgere in anteprima le informazioni che successivamente verranno passate alle opzioni da noi fornite:
Initiating Connect() Scan against 192.168.0.102 at 15:40 Adding open port 22/tcp Adding open port 6000/tcp Adding open port 80/tcp ...[output]...
Ecco che entra in gioco l’opzione -sV che rende noti i demoni abbinati ad i servizi su host X:
Interesting ports on 192.168.0.102: (The 1656 ports scanned but not shown below are in state: closed) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 3.9p1 (protocol 1.99) 80/tcp open http Apache httpd 1.3.33 ((Unix) PHP/4.3.10) 6000/tcp open X11 -O mostra il fingerprint dell'host X (svela, praticamente, quale sistema monta l'host): Device type: general purpose Running: Linux 2.4.X|2.5.X OS details: Linux Kernel 2.4.0 - 2.5.20 Uptime 4.834 days (since Sun Feb 20 19:39:39 2005) # tanto di uptime :)
Prestiamo particolare attenzione alle ultime informazioni fornite dall’opzione -O, grazie alle quali introdurremo il fattore zombie:
TCP Sequence Prediction: Class=random positive increments Difficulty=3450157 (Good luck!) IPID Sequence Generation: All zeros
Internet si basa sull’unione di due protocolli fondamentali ovvero il TCP e IP. Quando host A si collega ad host B, invierà un pacchetto TCP contenente un flag SYN attivo all’interno del quale vi sarà presente un numero K compreso tra 0 e 2^32-1.
Tale numero viene chiamato Identification Sequence Number (da ora ISN). Host B, ricevuto il pacchetto TCP da host A, risponderà a sua volta con un altro pacchetto contenente flag SYN e ACK con ISN J proprio e ISN K+1 (ovvero l’ISN di host A aumentato di 1).
Al ricevimento del pacchetto SYN+ACK, host A provvederà all’invio di un terzo pacchetto contenente esclusivamente flag ACK con i due numeri (K e J) aumentati di 1.
Dopo questi tre banali passaggi la connessione TCP/IP è stabilita; a questo punto vi domanderete cosa mai potrà aver a che fare il funzionamento del protocollo TCP/IP con l’ultima “apparizione” dell’ argv -O di nmap.
La risposta è semplice: Kevin Mitnick (famoso hacker americano) dimostrò che i numeri ISN potevano essere facilmente prevedibili per il fatto che venivano generati in sequenza fissa… vediamo come.
Prendiamo in considerazione host A (Attaccante), host B (Zombie) ed host C (Target).
Prima di tutto inviamo un pacchetto SYN+ACK dall’host attaccante (A) all’host zombie (B): per quanto abbiamo detto prima ciò non dovrebbe essere consentito in quanto la comunicazione TCP viene inizializzata col il solo flag SYN, ciò nonostante host B risponde alla richiesta con un pacchetto contenente il flag RST che a sua volta include il numero, esemplificativo, ISN 1000.
Fatto questo siamo a conoscenza dell’ISN di B e sappiamo anche che lo stesso verrà incrementato linearmente: inviamo da A un pacchetto “alterato” a C contenente l’ip di B facendo ricadere qualsivoglia responsabilità al medesimo: abbiamo in questa circostanza introdotto il concetto di spoofing.
Nel caso in cui la porta H di C è aperta questi inviarà un pacchetto a B (impersonificazione di A) contenente un pacchetto SYN+ACK ma, non avendo B legittimo richiesto alcunchè, questi chiuderà la connessione con un RST, incrementando logicamente l’ISN di 1: 1001.
Dopo aver fatto questo l’attaccante invierà un pacchetto SYN+ACK a B che, come in precendenza, chiuderà la comunicazione con un RST ed incrementerà l’ISN di 2: 1002 facendo denotare lo stato open della porta H.
Se invece la porta H di C è chiusa questi invierà un pacchetto a B (impersonificazione di A) con flag RST e, pertanto, l’ISN di B non cambierà.
Quando A invierà un nuovo pacchetto SYN+ACK a B ed in rispostà troverà un RST, constaterà che l’ISN sarà aumentato solo di 1 facendo notare lo stato closed di H.
Nmap è ingrado di fare tutto ciò ed è proprio qui che entra in gioco l’opzione -I dello stesso (dove I sta, guarda caso, per idle scan).
Tramite il TCP Sequence Prediction, nmap segnala il “grado di difficoltà” al fine di “intrappolare” un host zombie.
Nel mio caso il livello di difficoltà è molto alto: 3450157, tant’è vero che nmap stampa a video un non-rassicurante Good luck segno che la macchina non è per niente disposta a farci “da tramite” :).
Nel caso in cui trovassimo un host con difficoltà bassa (Worthy challenge) possiamo sfruttarlo nel seguente modo:
nmap -sI <host zombie>:<porta aperta> -P0 -v <target>
Da bravi sysadmins tutto questo non basta, dobbiamo sapere che uno scanning effettuato con opzione -sT è facilmente rintracciabile da un amministratore attento e pertanto un malintenzionato furbo non lo userebbe mai.
Introduciamo in questo modo il concetto di SYN SCAN o meglio “scanning del mezzo hand-shake”.
E’ un’opzione abbastanza avanzata che permette di restare ben al coperto e di non far troppo chiasso nel sistema “vittima”.
Avviene tramite l’invio di un pacchetto TCP contenente flag SYN attivo: qualora la porta H dovesse risultare aperta il sistema “vittima” risponderà con un pacchetto TCP con i flag SYN+ACK al quale, a sua volta, nmap risponderà stoppando la connessione con un pacchetto TCP con flag RST attivo.
Nel caso in cui, invece, la porta H dovesse risultare chiusa, a Nmap arriverà un pacchetto TCP con flag RST attivo che chiuderà la connessione.
Questa tecnica è impossibile da tracciare sui file di log ma un buon IDS (snort) riesce sicuramente a rintracciarla.
# nmap -sS -v 192.168.0.103 # esempio di syn-scan [banner] Host joerg.mozakoLabs (192.168.0.103) appears to be up ... good. Initiating SYN Stealth Scan against joerg.mozakoLabs (192.168.0.103) at 16:57 ...[output]...
Se invece abbiamo il sentore che la nostra rete stia sotto scanning ma i nostri sistemi di logging o IDS non rilevano niente, allora può darsi che l’attaccante stia usando un FIN SCAN:
# nmap -sF -v 192.168.0.103 [banner] Host joerg.mozakoLabs (192.168.0.103) appears to be up ... good. Initiating FIN Scan against joerg.mozakoLabs (192.168.0.103) at 16:59 The FIN Scan took 3 seconds to scan 1659 ports. ...[output]...
Suddetta tecnica sfrutta l’invio di pacchetti TCP “anomali” contenenti flag FIN attivi.
Le specifiche RFC per lo standard TCP dicono che, nel caso un servizio (porta) si presenti chiuso, l’host vittima dovrà rispondere all’host attaccante con un pacchetto TCP contenente flag RST .
Di conseguenza se la porta è aperta nmap non riceverà alcuna risposta, se è chiusa, invece, riceverà un pacchetto RST che interromperà la connessione, geniale no? :)
Esistono tuttavia sistemi che non seguono lo standard RFC e rispondono in entrambi i casi con flag RST; essi sono: MS Windows, Cisco, HP-UX, IRIX e diversi altri.
Presentiamo ora un’altra opzione: l’export dello scanning in XML. Molte persone (soprattutto in ambito professionale) possono avere l’esigenza di creare dei report ordinati degli scanning fatti.
Nmap ci viene incontro con l’opzione -oX, ecco come funziona:
# nmap <opzioni> 192.168.0.103 -oX /percorso/scan.xml
Scanning avanzato e reporting in XML, che vogliamo di più ? :)
Nessus
Nessus è uno dei più completi ed efficienti strumenti per l’analisi di rete; grazie alla sua struttura modulare è altamente configurabile e performante.
Funziona attraverso plug-ins, aggiornati via web, contenenti le informazioni necessarie a scoprire le vulnerabilità presenti nella nostra rete.
Il suo funzionamento è caratterizzato da due distinte applicazioni: un server ed un client.
Il server è quello che si occupa dell’analisi vera e propria dell’host; il client, invece, è una GUI che permette di selezionare tutte le opzioni che vogliamo sfruttare per portare a termine una scansione.
Nessus è un tool che in determinati casi può essere molto violento, causando l’irraggiungibilità di un servizio o, addirittura, di un’intera macchina (Denial of Service); pertanto l’autore raccomanda di effettuare test solo su macchine cui abbiamo il totale consenso da parte dell’amministratore di rete.
Puntiamo il nostro browser al sito-web http://www.nessus.org/download/ e scarichiamo l’ultimo nessus-installer.
I prerequisiti per intstallare Nessus sono: GTK (in particolare il package gtk-devel che contiene per il programma gtk-config) per il client su Xwindows, NMAP per le operazioni di scanning, OPENSSL per crittare le comunicazioni fra client e server (opzionale, ma raccomandato).
Eseguiamo lo script d’installazione ed eseguiamolo o, alternativamente, sfruttiamo lynx per fare una comodissima installazione online:
# lynx -source | sh
Installato Nessus dobbiamo creare un utente abilitato al login:
# nessus-adduser
Saranno richiesti: login, password, tipo di autenticazione (scegliere crittata) e regole sugli IP che possono essere scannati dall’utente (da lasciare vuoto).
Il file di configurazione di Nessus si trova in /usr/local/etc/nessus/nessus.conf: non è necessaria alcuna modifica per l’installazione di default.
Come abbiamo detto prima Nessus utilizza dei plug-ins per individuare le vulnerabilità, pertanto dovremo aggiornare gli stessi in questo modo:
- nessus-update-plugins -v
Fatto ciò creiamo il certificato SSL client -> server:
# nessus-mkcert
Arrivati a questo punto, avviamo il server nessusd che binderà la porta 1241:
# nessusd -D All plugins loaded
Avviamo ora la GUI:
$ nessus
La GUI, dopo aver effettuato il login, si presenta come in figura 2 e permette di accedere a tutte le opzioni che Nessus mette a disposizione.
Nel caso in cui l’host da analizzare sia una macchina montante GNU/Linux, dovremo procedere impostando le regole “ad-hoc” per un sistema Unix-Like.
In plugin selection (all’interno del menu Plugins) selezioniamo:
Default Unix Accounts General Gain a shell remotely Misc. Gain root remotely Service detection Backdoors Settings
Queste diciamo sono le opzioni “minimum” da selezionare quando l’host da analizzare è di tipo Unix-Like.
Un’analisi precedentemente effettuata con nmap permette di estendere il campo d’azione di nessus.
Poniamo il caso che tramite lo scanning di nmap si rilevino servizi come ftp, http o si rintracci un firewall; all’elenco di plugins selezionabili potremmo aggiungere:
CGI abuses CGI abuses: XSS FTP Firewalls
Di fatto, la selezione delle opzioni in Nessus è altamente personalizzabile; essa consente di effettuare scansioni mirate ed estremamente precise.
E’ cura dell’utente selezionare quali siano i plugins da impostare e quali non.
Nel menu Prefs possiamo impostare una miriade di opzioni destinate prevalentemente al tipo di scanning (porte/servizi) da fare.
Sono tante le opzioni configurabili in questo menu: descriverle tutte andrebbe al di fuori dell’obiettivo di questo tutorial.
In TCP scanning technique troviamo la raffigurazione grafica delle opzioni che nmap mette a disposizione: selezioniamo SYN scan.
Nel menu Scan options lasciamo default in Port range e, nel menu scorrevole in basso, selezioniamo Nmap (NASL wrapper).
Siamo arrivati alla fine: nel menu Target selection, in Target(s), scriviamo l’ip del PC da analizzare, clicchiamo Start the scan ed aspettiamo che Nessus faccia il suo lavoro.
Completata l’analisi, Nessus ci mostrerà una schermata divisa in diverse sezioni: all’interno della prima selezioniamo, tramite il menu a tendina, “Host” e clicchiamo sull’host scannato.
Nel riquadro sottostante al primo apparirà la subnet; cliccando potremo vedere i servizi attivi trovati all’interno del terzo box. Selezionando un servizio all’interno di quest’ultimo box appariranno lateralmente (nel box Severity) i due possibili “gradi d’ informazione” che Nessus mette a disposizione: Security Warning e Security Note.
Cliccando su questi si potrà scorgere la spiegazione dettagliata della possibile vulnerabilità.
Questo sistema per alcuni può essere scomodo, è per questo che Nessus mette a disposizione l’export in formato XML, HTML, Latex, ASCII ed, addirittura, HTML con statistiche e grafi !
Tramite il bottone Save report… salviamo il file in formato “HTML with Pies and Graphs” e godiamoci il report con tanto di grafi statistiche dettagliate.
ConclusioniAbbiamo visto come l’utilizzo combinato di Nmap e Nessus possa fornire importanti informazioni circa lo “stato di salute” della nostra rete. La comunità open-source offre tanti tool che permettono di analizzare e quantizzare le vulnerabilità presenti nella nostra rete (ettercap, ethereal, tcpdump e molti altri).
Bisogna fare attenzione, inoltre, a non commetere l’errore in cui cadono molte persone, ossia quello di considerare sicura la propria rete solo perchè un nmap o un nessus ha dato esito positivo: questo è un male in quanto dà all’amministratore un finto senso di sicurezza rendendo difficile riparare/intercettare un possibile attacco da parte di un malintenzionato.