##########################################################################

Applicazione: Unreal Tournament (Win version, Linux and Mac not tested)
Versione:     Tutte le versioni sono vulnerabili, compresa la 436
Bug:          I servers di UnrealTournament inviano enormi quantita' di
              pacchetti ad ogni host che ne invia a loro solo 1. L'invio
	      di pacchetti dura 2 minuti e 30 secondi
Rischio:      I servers di UT possono essere utilizzati come flooders,
              con il conseguente rischio di un DDoS
Autore:       Auriemma Luigi (e-mail: bugtest at sitoverde.com)

##########################################################################

Sections:
1) Introduzione
2) Bug
3) Il codice
4) Fix
5) Filosofia

###

1) Introduzione

Innanzitutto voglio dire che questo bug e' stato segnalato alla Epic
(utbugs436@epicgames.com) oltre un mese e mezzo fa' (inoltre ho inviato
una richiesta di informazioni riguardo la risoluzione di questo bug
qualche settimana fa'), ma l'unica risposta che ho ricevuto e' stato 
l'auto-reply da parte del loro server!
Poi qualche giorno fa' ho deciso di contattare anche il supporto di
Lokigames (support@lokigames.com), che ha curato il porting su Linux, ma
anche da loro niente risposte (fenris.lokigames.com che funge da bug
tracker per la Lokigames e' irraggiungibile).
L'unica cosa che viene da pensare e' che non sono molto interessati ad UT
perche' tra qualche settimana dovrebbe essere fuori UnrealTournament 2003
(la data di rilascio e' Luglio se e' tutto ok).

- Importante:
Qualche giorno fa' ho trovato, con non poca difficolta', una discussione
sulla sezione "Vuln-dev" di SecurityFocus aperta da Jeff Calvert e
risalente ad oltre 2 anni fa' (28 Maggio 2000), in cui veniva mostrata
appunto la possibilita' di effettuare dei DoS tramite i server di UT, ma 
sfortunatamente la discussione sembra essere terminata dopo qualche mail.
Io penso che sia davvero incredibile che un problema cosi' importante e
pericoloso (per me un DDoS realizzabile cosi' facilmente e' un rischio
reale...) che e' conosciuto dal 2000 esista ancora.
Comunque c'e' e questo advisory vuole cercare di spiegarlo.

--

2) Bug

L'UDP e' un protocollo connection-less percio' e' "normale" che sia
insicuro, ma UT non effettua nessun controllo sui pacchetti che riceve!

Comunque il bug e' tanto semplice quanto pericoloso, ed il seguente e' un
semplice esempio.

Pero' prima vorrei riportare la lista delle porte di ascolto di default
di UT, trovate sull'homepage del gioco http://unreal.epicgames.com:
* UDP 7775 and 7776 are used only for LAN games. You don't need
  to route them through a firewall.
* UDP 7777 is for gameplay (...la porta che ci interessa...).
* UDP 7778 is for server querying.
* UDP 7779+ are allocated dynamically for each helper UdpLink
  objects, including UdpServerUplink objects.
* UDP 27900 is for server querying, if you enable the master server
  uplink. Some master servers use other ports,  like 27500.

Ora l'esempio; abbiamo i seguenti 3 host:
A - l'attaccante
B - il server UT
C - la vittima

- L'host A invia 1 pacchetto UDP vuoto con l'IP mittente dell'host C alla
  porta 7777 (la porta di default di UT) dell'host B.
  
- L'host B inizia ad inviare circa 10 pacchetti al secondo della
  grandezza di 46 bytes all'host C e tutto questo per 2 minuti e 30
  secondi (il timeout di default di UT).
  
- L'host C ricervera' tutti i pacchetti e naturalmente rispondera' con un
  messaggio di ICMP port unreacheable che comunque sara' ignorato
  dall'host B.
  
- Dopo i 2 min e 30 sec l'host A puo' riprendere l'attacco.

Insomma, con questo bug un attaccante puo' floodare (in anonimita' e con
uno spreco di banda irrisorio) altri host.
Ogni pacchetto che il server UT invia ha una grandezza di 46 bytes (ed il
pacchetto che noi gli inviamo e' di almeno 28 bytes), percio' IN TEORIA
se io invio 156 pacchetti ad un server UT con l'indirizzo sorgente di un
utente che sta utilizzando un modem a 56K e la porta sorgente differente
per ogni pacchetto (una buona scelta e' quella di utilizzare porte random
o sequenziali), la banda di quest'ultimo verra' saturata da circa 7200
bytes per 2 minuti e 30 secondi.
Il numero di pacchetti inviati dal server sembra essere sempre la stessa
pur cambiando l'opzione "Network Speed" nei settaggi di UT.

Naturalmente questo attacco ha 2 effetti.
Il primo e' un DoS contro la vittima e poi un DoS contro lo stesso server
UT che deve inviare una gran quantita' di pacchetti consumando banda e
CPU.
Penso che questo attacco e' abbastanza simile allo smurf, ma
UnrealTournament e' veramente un gran gioco con tantissimi giocatori e
server al mondo, percio' non c'e' assolutamente nessun problema a trovare
i server da utilizzare per l'attacco.
Per questo motivo penso che questo bug e' davvero pericoloso e puo'
essere utilizzato per lanciare DDoS.
Inoltre spero che lo stesso errore non sia presente in UT 2003, ma spero
anche che proprio questo problema venga risolto il prima possibile.

Tutti i test sono stati effettuati sulla mia LAN utilizzando la versione
Win del gioco (v436). Molto probabilmente anche le altre versioni per
Mac e Linux hanno lo stesso bug.
E naturalmente ho effettuate anche delle reali prove su Internet dove il
risultato e' stato lo stesso.

--

3) Il codice

In attachment c'e' un codice proof-of-concept dell'attacco, e' chiamato
utflood.c e va' compilato su Linux.
Con piccolissime modifiche puo' essere portato anche su Win (ad esempio
utilizzando Winject reperibile all'indirizzo http://www.badlink.net).
Gli altri files sono un semplice programma per vedere le informazioni
riguardanti il server UT (utinfol.c per Linux ed utinfow.* per Win).
Inoltre sara' presente questo advisory e la sua versione "internazionale"
(in inglese).

--

4) Fix

Nessuna patch ufficiale.
L'unico modo abbastanza utile per fixare in parte il bug e' quello di
settare la porta del server di UT, presente nel file unrealtournament.ini
vicino all'opzione "Port=", con una diversa dalla 7777 di default.
Ma non solo questo!!!
Dalla console dopo aver digitato il comando "preferences" dobbiamo
togliere il supporto ai Master Server:
- alla voce "Networking / Master Server Uplink", settare "DoUplink" come
Falso
oppure
- alla voce "Networking / Server Beacon", settare "DoBeacon" come falso

I master server sono dei server che contengono tutte le informazioni
inerenti i giochi in multiplayer del mondo, ed i + grandi sono:
unreal.epicgames.com e master0.gamespy.com.
Comunque non posso continuare in quanto questo e' un advisory di
sicurezza non un paper su come usare tutto cio' per i DDoS...

Questo e' il mio fix, altri suggerimenti?

--

5) Filosofia

Ok, postare un advisory senza che ci siano patch o modi per fixare il bug
non e' una cosa molto bella, ma penso che questo sia l'unico modo per far
conoscere il problema alla comunita'.
Inoltre il team di UT non mi ha risposto e spero che questo advisory
possa attirare la loro attenzione.
Io sono davvero fiducioso riguardo la full disclosure perche' con essa
"chiunque" puo' conoscere il reale effetto di un attacco, il reale
pericolo di un bug, qualcuno puo' anche imparare un po' di programmazione
(io alcune cose del C le ho imparate dai codici sorgenti di alcuni
exploits) ed essa e' utile per tutti coloro che sono fiduciosi in questo
tipo di disclosure proprio come me.
Nessun segreto!

--

Qualsiasi tipo di feedback e' benvenuto!
In particolare mi interesserebbe soprattutto qualche commento riguardo
l'idea di includere la versione italiana degli advisory postati in 
inglese.

Byez

