####################################################################### Luigi Auriemma Applicazione: Goahead webserver http://www.goahead.com/webserver/webserver.htm Versioni: <= 2.1.8 Piattaforme: multiplatform Bug: aggiramento della gestione delle directories speciali con l'effetto di scaricare i files cgi-bin ed altro Exploitation: remoto via browser Data: 19 Jan 2004 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Goahead webserver e' un server OpenSource embedded che puo' essere compilato su svariati sistemi (CE, Ecos, GNU/Linux, Lynx, MacOS, NW, QNX4, VXWORKS, Win32 ed altri). Esso e' supportato da molte compagnie che lo usano per i loro progetti ed e' anche usato come "base" per altri webservers, inoltre e' stato sviluppato con lo scopo di occupare poche risorse e di girare su sistemi embedded. ####################################################################### ====== 2) Bug ====== Goahead webserver ha un problema interno che gli permette di accettare anche richieste HTTP che non iniziano con lo slash o che contengono backslashes (sia \ che %5c) dopo o allo stesso posto dello slash iniziale. Quindi vediamo che una richiesta esatta come "GET /file HTTP/1.0" e' accettata ma e' accettata anche una richiesta come "GET file HTTP/1.0" o "GET \file HTTP/1.0", "GET /\\%5cfile HTTP/1.0" e cosi' via. Questo bug porta all'aggiramento della gestione delle directories "speciali" (come cgi-bin) ed al loro uso come directories normali. Infatti il server usa una funzione chiamata websUrlHandlerDefine() che permette all'amministratore di specificare come gestire ogni directory che vuole. Per esempio di default abbiamo websUrlHandlerDefine(T("/goform"), NULL, 0, websFormHandler, 0); usato per eseguire le funzioni "built-in" scritte dallo stesso admin o websUrlHandlerDefine(T("/cgi-bin"), NULL, 0, websCgiHandler, 0); usato proprio per gestire la directory cgi-bin. Quindi se un attacker usa una richiesta HTTP come una di quelle viste precedentemente potra' aggirare la gestione decisa dall'admin per una specifica directory (function websUrlHandlerRequest()). L'effetto piu' comune ed utile di questo bug e' il download e la visione di qualsiasi file nella directory cgi-bin. ####################################################################### =========== 3) The Code =========== Alcuni esempi per leggere i files nella directory cgi-bin: http://server/\cgi-bin/cgitest.c http://server/\\\cgi-bin/cgitest.c http://server/%5ccgi-bin/cgitest.c "GET cgi-bin/cgitest.c HTTP/1.0" "GET \cgi-bin/cgitest.c HTTP/1.0" "GET %5ccgi-bin/cgitest.c HTTP/1.0" ####################################################################### ====== 4) Fix ====== Nessun fix ufficiale. Una semplice patch puo' essere l'aggiunta delle 3 linee di codice seguenti all'incirca alla linea 265 del file handler.c nella funzione "int websUrlHandlerRequest(webs_t wp)": if((wp->path[0] != '/') || strchr(wp->path, '\\')) { websError(wp, 400, T("Bad request")); return(0); } #######################################################################