###################################################################### Luigi Auriemma Applicazione: Emule (http://emule-project.net) Versione: 0.27b e versioni precedenti Piattaforma: Windows Bug: Il programma prova a leggere la zona di memoria 0x00000000 se un attacker invia una messaggio di chat senza nickname Date: 25 Mar 2003 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ###################################################################### 1) Introduzione 2) Bug 3) Il Codice 4) Fix 5) Filosofia ###################################################################### =============== 1) Introduzione =============== Emule e' un eccellente programma di condivisione file OpenSource che utilizza il protocollo p2p di Edonkey; esso e' piu' di un semplice clone ed e' davvero molto diffuso tanto da rientrare nella topten dei downloads di Sourceforge. E' inoltre ricco di funzioni e gira su Windows, ma esiste un porting (Lmule) che gira anche su Linux. ###################################################################### ====== 2) Bug ====== Molto velocemente, il protocollo Edonkey e' composto da un header che viene inviato appena instaurata la connessione con il client, che contiene informazioni sull'utente quali nickname, hash string, versione e porta del client e molte altre informazioni. Io definisco questo header come "identification data". Dopo aver inviato questo header un utente puo' inviare un messaggio di chat all'host remoto semplicemente inviando i dati del messaggio (dati che possono anche essere inviati appiccicati allo stesso identification data). Il problema in Emule compare quando l'attacker che vuole inviare un messaggio non include il nickname nei dati. Nell'header di Edonkey c'e' un "tag" (0x01000102) che e' usato per specificare il nickname dell'utente, quindi un attacker deve solo non inviare questo tag ed il relativo nickname. Emule 0.27b crashera' all'EIP 0x00444200 che e' la funzione che prende il nickname precedentemente immagazzinato in memoria ma, se l'attacker non ha incluso il suo nickname nell'identification data, questa funzione fallira' in quanto cerchera' di leggere una zona di memoria (0x00000000 in quanto non esiste l'indirizzo della stringa nickname in memoria) che non puo' essere raggiunta dall'applicazione e cio' causa il crash. Infatti il programma provera' ad eseguire la seguente operazione: "mov cl, [eax]" ma EAX e' NULL, quindi NON E' POSSIBILE leggere da quella zona di memoria. ###################################################################### ============ 3) Il Codice ============ Il tool per testare il problema e' lo stesso del mio DoS per Edonkey/ Overnet rilasciato qualche giorno fa'. Ho scritto questo tool appositamente per poter exploitare entrambi i bugs di Edonkey ed Emule; esso puo' essere compilato sia su Win che su Unix: http://aluigi.org/poc/eddos.zip (Utilizzare: eddos -n 2 hostname se la seconda connessione va' in timeout o viene rifiutata, vuol dire che l'host remoto e' crashato) Se non si vuole usare il mio tool, bastera' semplicemente collegarsi ad un client Emule alla porta 4662 (porta di default) ed inviare i seguenti bytes (naturalmente bisogna ricordarsi di convertire questa stringa C in bytes 8-): "\xE3\x24\x00\x00\x00\x01\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\xE3\x03\x00\x00\x00\x4E\x00\x00" ###################################################################### ====== 4) Fix ====== La versione 0.27c risolve il problema. ######################################################################