####################################################################### Luigi Auriemma Applicazione: Savant webserver (http://savant.sourceforge.net) Versione: 3.1 e versioni precedenti Bug: Buffer overflow in cgitest.exe, crash causato da un valore negativo in Content-Length e problema dei caratteri "particolari" rischio e' da considerarsi tra medio ed alto) Date: 13 Sep 2002 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) Il Codice 4) Fix ####################################################################### =============== 1) Introduzione =============== Savant e' un webserver OpenSource che gira su Win32. E' un server davvero molto interessante ma e' afflitto da alcune vulnerabilita' molte delle quali risalenti a vecchie versioni. Una di queste, per esempio, e' un directory traversal bug che e' stato trovato nella versione 2.1 e che e' tuttora esistente nella 3.1 (oltre un anno fa'!). Sfortunatamente ho contattato l'autore due volte dal 23 Agosto ma non ho ancora ricevuto una risposta. ####################################################################### ====== 2) Bug ====== A] Cgitest.exe overflow ----------------------- Il programma cgitest.exe, che viene inserito di default nella directory cgi-bin, e' afflitto da un buffer-overflow. Il limite di caratteri accettabili e' di 128 quindi se noi inviamo solo 136 bytes potremo sovrascrivere i registri EBP ed EIP e crashare il server. Non penso sia possibile scrivere un buon shellcode in questo caso in quanto i bytes che finiscono nello stack sono davvero pochi, comunque un'interessante e semplice cosa e' puntare il registro EIP a KERNEL32.DLL->ReadFile, cosicche' il server crashera' totalmente e l'amministratore vedra' un piacevole blue screen (testato su Win9x). Durante il blue screen la porta 80 rimarra' aperta ma il server non rispondera' alle richiested dei clients. B] Content-Length crash ----------------------- Un simpatico DoS e' il valore negativo in Content-Length. Il valore che Savant aspetta dall'utente e' un intero e quando l'attacker invia un numero negativo il server crashera'. Comunque finche' il messaggio di errore di Windows non sara' chiuso dall'amministratore il server continuera' a girare senza problemi. C] Authorization bypassing -------------------------- Uhmm il solito problema nelle Win32 API e' ancora il nostro migliore amico e stavolta ci fornisce l'accesso a tutte le cartelle degli utenti del server Savant. Quindi aggiungendo i caratteri ' ' (%20) e '.' (%2e) alla fine del nome del file richiesto guadagneremo pieno accesso alla directory protetta da password. L'altra buona notizia e' che' il limite imponibile riguardante la classe di rete autorizzata ad accedere alla cartella puo' essere scavalcato senza problemi con questo metodo (quindi se l'amministratore ha settato un accesso alla sola classe D, l'attacker con qualsiasi IP di provenienza ha pieno accesso senza rispettare questo limite). Nota: se vogliamo utilizzare il carattere spazio (' '), dobbiamo aggiungere anche il carattere '/' dopo di esso. ####################################################################### ============ 3) Il Codice ============ A] Cgitest.exe overflow ----------------------- Controlla la mia pagina web per un piccolo esempio che cause un blue screen ed il crash del server (crash di tutto il server e non solo della singola connessione). Ho semplicemente usato l'EIP 00409430 (che punta a KERNEL32.DLL->ReadFile ma si puo' anche utilizzare KERNEL32.DLL->WriteFile) per avere un DoS efficace che causa il blue screen e il crash del server. Utilizzo: nc 80 -v -v -n < savant-cgitest.txt http://aluigi.org/poc/savant-cgitest.txt B] Content-Length crash ----------------------- GET / HTTP/1.0 Content-Length: -1 C] Authorization bypassing -------------------------- http://host/cartella_protetta. "GET /cartella_protetta / HTTP/1.0" <-- da usare con telnet http://host/cartella_protetta%2e http://host/cartella_protetta%20 ####################################################################### ====== 4) Fix ====== Nessun fix disponibile. Guarda il sito web di Savant per possibili patch: http://savant.sourceforge.net #######################################################################