mercoledì, Novembre 27, 2024

Security Audit: l’analisi di rete

Giovanni Federico
Giovanni Federicohttp://www.giovannifederico.net
Studente di Ingegneria Informatica presso l'Università di Napoli "Federico II". Attualmente impegnato come IT Security Manager presso la web agency NG Soft S.r.l. di Napoli. Da Novembre 2009 esercita inoltre la libera professione di consulenza informatica. Supporter tecnico-commerciale italiano ufficiale per il sistema operativo OpenBSD e CISCO CCNA.

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:

  1. 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.

Articoli correlati

Noleggia una Tesla per il tuo evento ICT!

Categorie