####################################################################### Luigi Auriemma Applicazione: Winamp Web Interface http://www.flippet.org/wawi/ Versioni: <= 7.5.13 Piattaforme: Windows (Winamp plugin) Bugs: A] buffer-overflow in FindBasicAuth B] browsing directory traversal C] buffer-overflow in the browse, download and load functions D] file extension check bypassing in file downloading E] lucky path name Exploitation: remoto, solo il bug A non richiede privilegi Data: 10 Dec 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Winamp Web Interface (Wawi) e' un plugin open source per Winamp (http://www.winamp.com) che permette l'amministrazione remota del programma tramite qualsiasi browser web. ####################################################################### ======= 2) Bugs ======= ----------------------------------- A] buffer-overflow in FindBasicAuth ----------------------------------- FindBasicAuth() e' la funzione situata in security.cpp che gestisce il campo Authorization della richiesta HTTP del client. In poche parole cio' che fa' questa funzione e' copiare sequenzialmente le stringhe auth mode e la username:password codificata in base64 nel buffer temp di soli 100 bytes e poi decodifica tale stringa usando il buffer userpass anch'esso di 100 bytes. L'operazione di copia viene svolta dalla funzione GetAString() che limita le stringhe a 255 caratteri. Dai miei test non sembra possibile eseguire codice tramite questa vulnerabilita'. Questa e' l'unica vulnerabilita' che non ha bisogno di particolari privilegi o configurazioni per essere sfruttata. ------------------------------- B] browsing directory traversal ------------------------------- La funzione Browse() situata in browse.cpp viene utilizzata per mostrare i files disponibili in una sotto cartella della root directory. La funzione (come tutte le altre nel programma) controlla il percorso fornito dal client usando la funzione GoodPath() che verifica se ci sono rischi causati da sequenze di punti e backslash (come \..\). Qui il problema e' che mentre i caratteri slash vengono correttamente convertiti in backslash prima di chiamare questa funzione lo stesso non avviene per gli slash esadecimali %2f permettendo ad un attacker di navigare all'interno di qualsiasi cartella (i files sono limitati dalle estensioni usate nella configurazione) nel disco dove e' situata la root directory. Come gia' detto e' possibile solo la navigazione tra le cartelle, non il download dei file. L'attacker necessita del permesso "Browse" per sfruttare questo bug. ------------------------------------------------------------- C] buffer-overflow in the browse, download and load functions ------------------------------------------------------------- Le funzioni Browse(), CControl::Download() e CControl::Load() sono vulnerabili ad alcuni buffer-overflow causati dalla creazione di una stringa contenente la root directory piu' il percorso ricevuto dal client usando un buffer di MAX_PATH bytes (260, la stessa grandezza del buffer usato per la stringa del client). L'attacker necessita dei dovuti privilegi in base alla funzione da sfruttare. ----------------------------------------------------- D] file extension check bypassing in file downloading ----------------------------------------------------- Wawi ha anche un controllo per permettere il download di alcuni tipi di file dagli utenti con il permesso "Download". Nella sezione "Music Collections" della configurazione di Wawi si trovano due switch per permettere la visione od il download dei file supportati da Winamp e tutti gli altri. CControl::Download() chiama la funzione IsWinampFile() per controllare se il file richiesto e' supportato da Winamp e dopodiche' permette il download se la relativa opzione e' selezionata. Un punto dopo il nome del file richiesto permette ad un attacker con il privilegio "Download" di scaricare qualsiasi file con qualsiasi estensione situato nella root directory. Nota: questo non e' proprio un bug di Wawi ma lo riporto qui in quanto e' forse uno dei rari casi in cui puo' essere sfruttato in modo malevolo. ------------------ E] lucky path name ------------------ Tutte le funzioni che gestiscono i files (come la navigazione tra le cartelle, il caricamento nella playlist, lo scaricamento e cosi' via) richiedono un backslash prima del path o del nome file, come http://localhost/browse?path=\ Se esiste un'altra cartella o file che inizia con lo stesso nome della root directory e' possibile usare quella anziche' quest'ultima. Per esempio se la root directory e' c:\folder e l'attacker usa http://localhost/browse?path=2 lui potra vedere i files nella cartella c:\folder2 se esiste, o puo' anche scaricare il file c:\folder2.mp3 sempre se questo esiste. Sono necessari i dovuti privilegi (e la dovuta fortuna!) per sfruttare questo bug. ####################################################################### =========== 3) The Code =========== A] http://localhost/browse dopodiche' bisogna inserire una username piu' lunga di 100 caratteri B] http://localhost/browse?path=%2f..%2f..%2f C] http://localhost/dl?file=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa D] http://localhost/dl?file=\file.txt. ####################################################################### ====== 4) Fix ====== Il programma non e' piu' supportato. #######################################################################