####################################################################### Luigi Auriemma Applicazione: MultiTheftAuto http://www.multitheftauto.com Versioni: <= 0.5 patch 1 Piattaforme: Windows, Linux, FreeBSD e OpenBSD Bugs: A] chiunque puo' modificare il motd B] Windows server crash Exploitation: remoto, contro server Data: 25 Sep 2005 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== MultiTheftAuto (MTA) e' un mod e server closed-source per i giochi Grand Theft Auto III (http://www.rockstargames.com/grandtheftauto3/) e Grand Theft Auto: Vice City (http://www.rockstargames.com/vicecity/pc/) con lo scopo di aggiungere la modalita' multigiocatore. ####################################################################### ====== 2) Bug ====== Entrambi i seguenti bugs sono direttamente correlati ma sono stati divisi in quanto gli effetti cambiano tra le versioni disponibili per le differenti piattaforme supportate: ----------------------------------- A] chiunque puo' modificare il motd ----------------------------------- Il server MTA ha la funzione di amministrazione remota abilitata di default. Il problema e' l'esistenza di un comando non documentato (numero 40) che permette la modificazione o la cancellazione del contenuto del file motd.txt utilizzato per il messaggio del giorno. Questo e' l'unico comando che non controlla se il client e' un admin quindi chiunque senza permessi vi ha accesso. ----------------------- B] Windows server crash ----------------------- Il comando 40 e' anche la causa di un altro problema situato nella stessa funzione che sembra essere incompleta o sperimentale come si puo' capire dal seguente codice "ricavato": // apri file in scrittura da zero "w" length = *(u_int *)(src - (src % 4096)); for(i = j = 0; i < length; i++) { if(src[i] == '\n') dst[j++] = '\r'; dst[j++] = src[i]; if(j < 1024) continue; if(!WriteFile(...)) break; j = 0; } // chiudi file length e' -1 quindi la funzione inizia un loop quasi infinito che termina solo quando il buffer punta ad una zona di memoria non allocata. Il risultato e' il crash immediato del server MTA. Sembra che solo il server per Windows sia affetto da tale crash perche' in Linux la funzione e' sostituita da una "ugualmente incorretta" istruzione che non produce eccezioni: fd = fopen("motd.txt", "w"); fwrite(data + 4, 1, data, fd); // data e' proprio il buffer fclose(fd); ####################################################################### =========== 3) The Code =========== http://aluigi.org/poc/mtaboom.zip ####################################################################### ====== 4) Fix ====== Gli sviluppatori hanno detto che MTA non e' piu' supportato. #######################################################################