####################################################################### Luigi Auriemma Applicazione: Sistema di verifica delle cd-key di Gamespy http://www.gamespy.net Giochi: La quantita' di giochi che utilizza questo sistema e' davvero enorme ed una piccola lista (mantenuta da me) e' disponibile qui: http://aluigi.org/papers/gshlist.txt Una lista ufficiale di giochi che utilizzano il materiale di Gamespy (quindi non solo le cd-keys) e' invece reperibile qui: http://www.gamespy.net/partners/ Versioni: il bug verra' corretto sul master server, nel momento in cui scrivo il bug c'e' ancora Bug: i giocatori possono utilizzare la stessa cd-key online nello stesso momento Exploitation: remoto Data: 04 May 2005 Autore: Luigi Auriemma e-mail: aluigi@autistici.org web: aluigi.org ####################################################################### 1) Introduzione 2) Bug 3) Un esempio di vita reale 4) The Code 5) Fix ####################################################################### =============== 1) Introduction =============== Il sistema di verifica delle cd-key di Gamespy e' un toolkit utilizzato da un numero ENORME di giochi multiplayer ed e' necessario per la verifica delle cd-key utilizzate dai giocatori quando entrano in un server online. Alcuni dei giochi piu' famosi e giocati che utilizzano tale toolkit sono Halo, Battlefield 1942 e Vietnam, Men of Valor, Painkiller, Star Wars Battlefront, Star Wars Republic Commando, Tribes: Vengeance e molti altri tra quelli elencati qui: http://www.gamespy.net/partners/ ####################################################################### ====== 2) Bug ====== Il problema e' molto semplice: due o piu' giocatori possono utilizzare la stessa cd-key valida nello stesso momento su servers differenti. Naturalmente questa situazione e' negata di default per le giuste ragioni che chiunque conosce (giocare online con giochi piratati per prima). Cio' e' possibile in quanto esiste un comando specifico (\disc\) usato dai servers di gioco per liberare la cd-key degli utenti che lasciano il match da loro ospitato. Infatti quando un giocatore entra in un server la sua cd-key diventa "in uso" e nessuno puo' usare la stessa cd-key online nello stesso momento. I comandi \disc\ ed \uoff\ piu' "nessuna risposta" sono il meccanismo utilizzato per liberare una cd-key che e' in uso ed il server di gioco e' l'unico (anche ad averne diritto) a poterlo usare. Il comando \disc\ e' trasmesso in un pacchetto UDP (come qualsiasi altro comando) e contiene i seguenti parametri: \pid\ = il Gamespy PID, un numero che identifica qualsiasi gioco multiplayer \cd\ = l'hash MD5 della cd-key dell'utente \ip\ = l'indirizzo IP del client La sezione seguente contiene diversi dettagli ed un possibile scenario per sfruttare questo bug. ####################################################################### =========================== 3) Un esempio di vita reale =========================== Due amici hanno appena comprato il gioco Halo in un negozio di videogiochi del loro paese, finalmente possono massacrare tutti quei piccoli Covanants sull'anello di Halo. Ognuno ha pagato meta' del prezzo completo (non sono di certo ricchi ma fortunatamente sono amici e rispettano il lavoro compiuto dagli sviluppatori), e vanno di corsa alle loro case per giocare online con questo gioco utilizzando la stessa cd-key valida. Il primo ragazzo (X) entra in un server senza problemi mentre il secondo (Y) riceve il messaggio di errore "Cd-key in use" in qualsiasi server lui voglia entrare. Sfortunatamente Y non era a conoscenza di questo meccanismo. Ma X sa' che Halo usa il sistema di verifica delle cd-key di Gamespy e sa' anche che tale meccanismo e' afflito da alcuni difetti di implementazione e quindi decide di risolvere definitivamente il problema dell'amico. X crea un tool che invia automaticamente un pacchetto \disc\ spoofato al master server usando l'indirizzo IP e porta mittenti del server in cui lui entra. Lui puo' fare tutto cio' abbastanza facilmente perche' sa' il PID del gioco (793 per Halo) e naturalmente conosce sia la sua cd-key (o direttamente l'hash MD5) ed il suo indirizzo IP pubblico utilizzati dal server per autorizzarlo. Quindi appena X entra in un server, invia un comando \disc\ spoofato e la sua cd-key non e' piu' in uso. Ora anche Y puo' giocare su Internet nello stesso momento in cui X e' online e su qualsiasi server. Il loro unico limite e' che non possono giocare sullo stesso server perche' quest'ultimo espelle i giocatori con la stessa cd-key senza il bisogno di contattare il master server di Gamespy. Il problema e' che se due amici possono fare tutto cio', lo stesso lo possono fare 10, 100 o 1000 persone e questa non e' proprio una bella cosa. Qualcuno puo' dire che questo e' gia' possibile attraverso l'uso di server modificati ma quasi tutti quelli su Internet sono server regolari ed accettano solo i giocatori con le cd-key valide. ####################################################################### =========== 4) The Code =========== Nota: questo bug verra' corretto direttamente sul master server di Gamespy quindi anche se nel momento in cui sto' scrivendo questo paper e' possibile verificare il bug, probabilmente non sara' piu' sfruttabile nei prossimi giorni. In breve, se i tuoi tests falliscono e' perche' il bug e' stato gia' corretto. Il proof-of-concept e' disponibile qui: http://aluigi.org/poc/gskeydisc.zip un semplicissimo UDP spoofer che gira su Linux e necessita dei seguenti parametri: - server il nome host o l'IP del server di gioco - port la porta del server - pid il PID del gioco http://aluigi.org/papers/gspids.txt - cd-key la cd-key in uso od il suo hash MD5 - client_ip l'IP del client a cui appartiene la cd-key Primo esempio pratico di utilizzo --------------------------------- Lancia un server dedicato del tuo gioco preferito e partecipa al match con il tuo client (naturalmente il gioco deve utilizzare il toolkit di verifica delle cd-key di Gamespy). Verifica che la tua cd-key sia in uso con il tool seguente o manualmente provando a connettere un altro client ad un server differente: http://aluigi.org/papers/gskeycheck.zip Ora lancia il mio proof-of-concept gskeydisc specificando l'IP pubblico e la porta del tuo server, il PID del gioco, la tua cd-key e l'IP utilizzato dal tuo server per identificare il client (solitamente 127.0.0.1, e' lo stesso IP che hai inserito per selezionare il server dedicato in locale). Ora rilancia gskeycheck: la cd-key non dovrebbe essere piu' in uso. Secondo esempio pratico di utilizzo ----------------------------------- Lancia il mio proof-of-concept riguardante il "Cd-key in use" usando una richiesta di autorizzazione precedentemente catturata con GsHsniff: http://aluigi.org/papers/gshsniff.zip http://aluigi.org/poc/gskeyinuse.zip Se conosci la cd-key originale lancia gskeycheck per essere sicuro che essa sia davvero in uso, altrimenti e' sufficiente lanciare un'altra istanza di gskeyinuse usando una porta locale differente. Lancia gskeydisc specificando tutti i parametri necessari visualizzati da gskeyinuse. Rilancia gskeycheck o gskeyinuse per verificare che la cd-key non sia piu' in uso. ####################################################################### ====== 5) Fix ====== Gamespy e' stata contattata e stanno lavorando ad una soluzione. FYI, naturalmente Gamespy e' a conoscenza di questo problema da molti anni in quanto e' saltato fuori durante lo sviluppo del sistema di verifica delle cd-key, ma questa e' un'altra storia... Il fix sara' implementato direttamente sul master server probabilmente attraverso l'invio di un comando \ison\ quando viene ricevuto un \disc\. Ad ogni modo e' possibile che il fix sia gia' implementato nel momento stesso in cui si stia leggendo questo paper. UPDATE 01 Sep 2005: No fix has been implemented yet #######################################################################