• Non ci sono risultati.

Script per la generazione automatica di regole per l’ac-

6.2 Elaborazione di regole per casi specifici

6.2.7 Script per la generazione automatica di regole per l’ac-

La possibilit`a di generalizzazione delle regole appena viste `e abbastanza bas- sa, proprio perch´e `e fortemente collegata alla gestione del cookie da parte dell’applicazione e scrivere uno script generalmente valido non risulterebbe semplice.

E’ possibile invece cercare di ricostruire i collegamenti tra le pagine dell’appli- cazione, per capire, ad ogni chiamata di file, se viene da una pagina secondo un normale percorso di navigazione tra le risorse del sito oppure no. Alcuni script o pagine dovranno essere controllati, altri, che consentono un accesso anonimo, non avranno bisogno di particolari controlli.

Se penso per`o di poter costruire una struttura dati che contenga tutti i vincoli tra i file e gli script dell’applicazione, posso anche pensare di generare automaticamente le regole di controllo.

Lo script in perl che genera automaticamente queste regole si basa sulla possibilit`a di costruire una struttura di hash di questo tipo:

%lista_link = ("saveprofile?action=new" =>[’newaccount.gtl’], "saveprofile?action=update" => [’editprofile.gtl’], "editprofile.gtl" => [’login?uid=’,’manage.gtl’,’’], "upload.gtl" => [’editprofile.gtl’,’’,’snippets.gtl’, ’newsnippet.gtl’,’upload.gtl’, ’manage.gtl’], "upload2" => [’upload.gtl’], "newsnippet2" => [’newsnippet.gtl’], "lib.js" => [’logout’,’’,’login’,’newaccount.gtl’,’manage.gtl’, ’editprofile.gtl’,’newsnippet.gtl’,’snippets.gtl’], );

Qui ogni elemento dell’hash ha come chiave il nome del file che viene richia- mato e come valore un array di file da cui pu`o essere richiamato. Cos`ı ad esempio il file “upload.gtl”, che fornisce ad un utente il form per l’insermento di un file, pu`o essere richiamato solo da “editprofile.gtl”, da “” (che indica la home page di Gruyere), da “snippets.gtl”, “newsnippet.gtl”,“upload.gtl” e “manage.gtl”.

L’elenco qui fornito non `e esaustivo, per quanto riguarda i file di Gruyere, serve pi`u che altro per dare un esempio di un procedimento che pu`o essere

generalizzato.

Usando lo stesso principio, si pu`o pensare di riuscire ad analizzare tutti i file e gli script dell’applicazione web, o almeno quelli pi`u critici.

Il programma in perl che permette la generazione di queste regole, partendo dall’hash sopra descritto si chiama generatore-regole-struttura.pl. Qui l’hash che memorizza i collegamenti tra le pagine `e inserito come variabile nel file. Resta aperto l’interrogativo se sia possibile (e conveniente) partire da una pagina, seguire tutti i link (relativi al sito corrente) al suo interno e generare la struttura ricorsivamente (senza inciampare nel problema dei loop).

Il programma `e riportato in appendice. Le regole generate si trovano nel file tesi-controllo-richieste.rules e sono le seguenti:

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg: "chiamata non consentita al file upload2";

content: "upload2"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ upload.gtl/iR"; sid: 1;)

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg: "chiamata non consentita al file saveprofile?action=update"; content: "saveprofile?action=update"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ editprofile.gtl/iR"; sid: 2;)

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg: "chiamata non consentita al file editprofile.gtl"; content: "editprofile.gtl"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/login?uid=/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/manage.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}/iR"; sid: 3;) alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg: "chiamata non consentita al file newsnippet2"; content: "newsnippet2"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/newsnippet.gtl/iR"; sid: 4;)

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg: "chiamata non consentita al file upload.gtl";

content: "upload.gtl"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ editprofile.gtl/iR";

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ snippets.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ newsnippet.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ upload.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ manage.gtl/iR"; sid: 5;)

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg: "chiamata non consentita al file lib.js";

content: "lib.js"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ logout/iR";

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ login/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ newaccount.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ manage.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ editprofile.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ newsnippet.gtl/iR"; pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ snippets.gtl/iR"; sid: 6;)

alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS

(msg: "chiamata non consentita al file saveprofile?action=new"; content: "saveprofile?action=new"; http_uri;

pcre: !"/Referer: http:\/\/192.168.2.50:8008\/(\d){19}\/ newaccount.gtl/iR";

Per Gruyere devo utilizzare “pcre” e le espressioni regolari per fare il match dell’indirizzo, a causa della presenza nell’url del codice generato casualmente all’avvio del server. Per un sito comune, con indirizzo non variabile le regole sarebbero pi`u semplici.

Ho fatto qualche test su queste regole, prima navigando normalmente tra le pagine di Gruyere, compiendo operazioni lecite in un uso proprio dell’appli- cazione e non ho potuto registrare messaggi di errore.

Poi ho cercato di richiamare direttamente dall’url il file “newsnippet2” (per la memorizzazione di un nuovo snippet utente, con contenuto dello snippet nell’url, visto che i dati sono passati con il metodo GET).

Viene restituito il messaggio “chiamata non consentita al file newsnippet2”, generato dalla regola 4.

Se cerco di realizzare un attacco per l’acquisizione di maggiori privilegi digitando direttamente:

http://192.168.2.50:8008/12345678/

saveprofile?action=update&is_admin=True

ottengo un messaggio di errore dalla regola 2: “chiamata non consentita al file saveprofile?action=update”.

Capitolo 7

Uso di Snort per trovare i bug

di un’applicazione web

Un’altra idea collegata alle caratteristiche di Snort `e quella di provare ad utilizzare l’IDS per testare un’applicazione web e scoprirne eventuali vulene- rabilit`a.

Cerco quindi di utilizzare Snort per trovare i bug di un’applicazione web. L’idea parte dalla considerazione che le regole precedentemente descritte rile- vano tutti i tentativi di attacco, senza valutare se questi attacchi sono andati a buon fine oppure no. Infatti per una buona parte dei casi considerati `e pro- babile che il server gestisca appropriatamente un input errato come `e probaile che non accetti frammenti di codice contenenti attributi che diano la possibi- lit`a di eseguire codice javascript, oppure che dia errore se un utente che non ha i necessari privilegi cerca di eseguire uno script di amministrazione.

Per questo motivo ho cercato di analizzare, accanto agli attacchi diretti al server, anche la risposta che ne deriva, per vedere se posso distinguere tra il caso in cui l’input pericoloso viene rilevato e gestito correttamente dal server (con la restituzione di un errore) e quello in cui l’attacco va a buon fine.

7.1

Richiamare regole specifiche su un tenta-

tivo di attacco

Per questo scopo penso di utilizzare una caratteristica di Snort che permette ad una regola di attivarne un’altra pi`u specifica, quando si registra un parti- colare evento sulla rete.