####################################################################### Luigi Auriemma Applicazione: Ultr@VNC http://www.ultravnc.com http://ultravnc.sourceforge.net Versioni: <= 1.0.1 (e CVS corrente) (tabbed_viewer 1.29 e' sempre lo stesso VNC viewer 1.0.1 quindi e' vulnerabile anch'esso) Piattaforme: Windows Bugs: A] client Log::ReallyPrint buffer-overflow B] server VNCLog::ReallyPrint limited buffer-overflow Exploitation: A] remote, contro client B] remote, contro server Data: 04 Apr 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bugs 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Ultr@VNC e' un client e server open source per il protocollo VNC. E' disponibile per Windows ed e' molto facile sia da usare che da configurare. ####################################################################### ======= 2) Bugs ======= ------------------------------------------ A] client Log::ReallyPrint buffer-overflow ------------------------------------------ Durante il processo di login un client VNC puo' ricevere tre tipi di risposte dal server: connessione fallita, nessuna autenticazione ed autenticazione richiesta. Il primo tipo di risposta (rfbConnFailed) e' seguito da una stringa di testo contenente la ragione della disconnessione. Prima di visualizzare questo messaggio Ultr@VNC logga tutto quanto in un file di log usando la funzione vnclog.Print che adotta un buffer di 1024 bytes (LINE_BUFFER_SIZE) per immagazzinare il testo. Il risultato e' che un server VNC malevolo potrebbe essere capare di eseguire codice malevolo contro un client Ultr@VNC che cerca di connettersi ad esso. Da vncviewer/Log.cpp: void Log::ReallyPrint(LPTSTR format, va_list ap) { TCHAR line[LINE_BUFFER_SIZE]; _vstprintf(line, format, ap); if (m_todebug) OutputDebugString(line); if (m_toconsole) { DWORD byteswritten; WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), line, _tcslen(line)*sizeof(TCHAR), &byteswritten, NULL); }; if (m_tofile && (hlogfile != NULL)) { DWORD byteswritten; WriteFile(hlogfile, line, _tcslen(line)*sizeof(TCHAR), &byteswritten, NULL); } } ----------------------------------------------------- B] server VNCLog::ReallyPrint limited buffer-overflow ----------------------------------------------------- La funzione di logging usata dal server di Ultr@VNC e' vulnerabile ad un buffer-overflow limitato causato da due chiamate a strcat che aggiungono un messaggio di errore di Windows al buffer di output, cio' significa che l'attacker non ha alcun controllo per eseguire codice tramite questo bug. L'unico modo che ho trovato per sfruttare questa falla (soprattutto senza bisogno di autenticazione) e' attraverso l'invio di una richiesta HTTP con un URI di circa 1024 bytes al webserver interno che viene usato per permettere ai clients di scaricare il Java viewer. Il servizio gira sulla porta 5800 ed e' abilitatao di default. Ad ogni modo c'e' un dettaglio molto importante riguardo lo sfruttamento di questo bug. Il server non e' vulnerabile se l'admin non ha mai toccato il flag "Log debug infos to the WinVNC.log file" nella configurazione, ma quando questa opzione verra' abilitata il suo server sara' vulnerabile per sempre nonostante venga ridisabilitata. Da winvnc/winvnc/vnclog.cpp: void VNCLog::ReallyPrint(const char* format, va_list ap) { time_t current = time(0); if (current != m_lastLogTime) { m_lastLogTime = current; ReallyPrintLine(ctime(&m_lastLogTime)); } // - Write the log message, safely, limiting the output buffer size TCHAR line[LINE_BUFFER_SIZE]; TCHAR szErrorMsg[LINE_BUFFER_SIZE]; DWORD dwErrorCode = GetLastError(); SetLastError(0); FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwErrorCode, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),(char *)&szErrorMsg, LINE_BUFFER_SIZE, NULL); _vsnprintf(line, LINE_BUFFER_SIZE, format, ap); strcat(line," --"); strcat(line,szErrorMsg); ReallyPrintLine(line); } ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/uvncbof.zip ####################################################################### ====== 4) Fix ====== Una patch sara' rilasciata nelle prossime settimane. #######################################################################