####################################################################### Luigi Auriemma Applicazione: Half-Life (http://half-life.sierra.com) Versione: 1.1.1.0 e versioni precedenti (naturalmente anche tutti i MODs basati su tale gioco sono vulnerabili) Piattaforme: Windows Bug: Alcune funzioni del client non controllano la lunghezza delle stringhe inviate dal server e quindi vengono sovrascritte delle zone di memoria necessarie alla corretta esecuzione del programma Date: 29 Jul 2003 Author: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) Il Codice 4) Fix ####################################################################### =============== 1) Introduzione =============== Half-Life e' stato rilasciato nel 1998 e anche dopo tutti questi anni e' considerato a tutti gli effetti uno dei FPS piu' popolari. Ma piu' che il gioco in se', la vera fortuna e' stata data dalla comunita' di utenti che ha contribuito al suo successo con i suoi MODs per questo gioco e sicuramente il piu' famoso e giocato on-line e' CounterStrike. E' stato sviluppato da Valve (http://www.valvesoftware.com) e pubblicato da Sierra (http://www.sierra.com). ####################################################################### ====== 2) Bug ====== Il bug che ho trovato e' un buffer-overflow che interessa SOLO i clients di Half-Life che vogliono connettersi ad un server/attacker. L'unica limitazione riscontrata in tale buffer-overflow e' l'impossibilita' di usare alcuni caratteri nello shellcode e cio' puo' limitare l'esecuzione di codice remoto. Il problema e' causato da una lunga stringa di caratteri inserita come parametro o valore nei dati inviati dal server al client quando quest'ultimo richiede informazioni. Con parametro e valore intendo: \name\Test | | | valore parametro Per raggiungere l'indirizzo di ritorno della funzione, il parametro dovra' essere grande almeno 516 bytes mentre il valore almeno 268. Nella versione 1.1.1.0 del gioco, la funzione che non effettua il controllo della lunghezza del buffer del parametro inizia all'indirizzo 0x0041b410 ed il loop che copia i bytes e': :0041B454 84C9 test cl, cl :0041B456 0F8488000000 je 0041B4E4 :0041B45C 880A mov byte ptr [edx], cl :0041B45E 8A4E01 mov cl, byte ptr [esi+01] :0041B461 42 inc edx :0041B462 46 inc esi :0041B463 80F95C cmp cl, 5C :0041B466 75EC jne 0041B454 L'indirizzo di ritorno e' immagazzinato in memoria all'offset 0x0467a634 La stessa cosa accade per il buffer-overflow nel valore: :0041B47E 84D2 test dl, dl :0041B480 740C je 0041B48E :0041B482 8811 mov byte ptr [ecx], dl :0041B484 8A5601 mov dl, byte ptr [esi+01] :0041B487 41 inc ecx :0041B488 46 inc esi :0041B489 80FA5C cmp dl, 5C :0041B48C 75F0 jne 0041B47E ####################################################################### ============ 3) Il Codice ============ L'exploit e' un finto server di Half-Life che invia al client delle risposte usando una stringa troppo grande come parametro o valore (si puo' scegliere quale delle 2 situazioni si vuole testare). L'exploit non include nessun codice dimostrativo da eseguire remotamente ma solo una stringa di 'a' e 4 bytes ("EIP.") che andranno a sovrascrivere l'indirizzo di ritorno della funzione. Bisogna usare un debugger per vedere l'eccezione causata dal buffer overflow e l'EIP sovrascritto. Il codice puo' essere compilato sia su Windows che su *nix: http://aluigi.org/poc/hlbof-client.zip ####################################################################### ====== 4) Fix ====== Valve e' stata contattata oltre 3 mesi fa' (a partire dal 14 Aprile 2003) e mi informo' che stavano lavorando per rilasciare una patch. Da allora ho contattato Valve diverse volte... ma fino ad ora non si e' ancora vista una patch. #######################################################################