####################################################################### Luigi Auriemma Applicazione: Skulltag http://www.skulltag.com Versioni: <= 0.96f Piattaforme: Windows Bug: format string Exploitation: remoto, contro server Data: 23 Apr 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Skulltag e' un motore di Doom molto conosciuto e supportato che e' basato sul codice di Zdoom ed e' incentrato sul gioco online. Sfortunatamente viene rilasciato come closed source nonostante utilizzi codice open. ####################################################################### ====== 2) Bug ====== Il server e' vulnerabile ad una vulnerabilita' di tipo format string sfruttabile quando un client passa una stringa contenente una versione errata. Quelle che seguono sono le istruzioni vulnerabili nell'eseguibile 0.96f: * Reference To: MSVCRT.sprintf, Ord:02B2h | :004DCCC3 8B3D30415900 mov edi, dword ptr [00594130] :004DCCC9 8D4C2424 lea ecx, dword ptr [esp+24] :004DCCCD 50 push eax ; client's version :004DCCCE 51 push ecx ; buffer :004DCCCF FFD7 call edi ; sprintf() tradotto in: sprintf(buffer, version_sent_by_the_client); Il bug avviene "al di fuori" del server quindi non ci sono limitazioni come banning e password per l'attacker. L'unico ostacolo (se cosi' si vuol chiamare) esiste quando il server e' pieno perche' non puo' essere attaccato durante questo (raro) stato. Una nota riguardo la possibile esecuzione di codice, le successive istruzioni usano la funzione strupr che converte quasi tutti i caratteri della stringa in maiuscolo. ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/skulltagfs.zip ####################################################################### ====== 4) Fix ====== Lo sviluppatore e' stato contattato ed ha corretto il bug solo nella sua versione privata in sviluppo che verra' rilasciata probabilmente quest'estate. Quindi non ci sono patch disponibili. Fortunatamente il bug e' abbastanza semplice da correggere per cui ho creato una patch non ufficiale che aggiunge l'argomento "%s" a sprintf. Questa soluzione e' sufficiente in quanto non e' possibile effettuare l'overflow del buffer (quindi non c'e' bisogno di snprintf o "%.*s"): http://aluigi.org/patches/skulltagfs-fix.zip #######################################################################