jueves, 17 de enero de 2013

El CSRF del router

Este post está basado en hechos reales. Sin embargo, y para no ponerle las cosas más fáciles de la
cuenta a nadie, se han modificado algunos detalles. Como alguna captura de pantalla muy retocada,
alguna URL o algunas circunstancias.

Lo demás, todo cierto.

Estaba yo de visita en casa de un amigo. Casi me iba ya, cuando vi que encendía su ordenador.
Ese es el momento que todo informático teme. Ya que estás aquí, por qué no miras esto y...

Dubitativo, le pregunté qué pasaba mientras me acercaba como quien no hace la cosa a la puerta de
salida.

Pero su respuesta me tranquilizó. Estaba arrancando la máquina para conectarse al router y activar la
red WIFI.

- ¿No sabes que tu router tiene un botón para hacer eso? - le pregunté sin poder evitarlo. Y,
mientras lo hacía, trataba de conseguir volver a tragarme las palabras para que nadie las oyera.

- Es que el botón está roto.

Claro, eso lo explicaba todo. Mientras tenía lugar este diálogo de besugos, mi amigo ya se había
identificado con su usuario y contraseña y navegaba por las páginas de configuración del router. No
pude evitarlo. Vi la URL. Y era algo similar a:

http://192.168.0.1/wifi.htm

Y la pantalla se parecía bastante a esto:




Volviendo a la URL... Protocolo http. No cifrado. Buenoooooo... Mi cabeza se puso a darle vueltas. Si el router tiene un fallo tan obvio, quizá tenga más cosas. Por ejemplo...

- Oye - le dije - quizá pueda hacerte un apaño para que haciendo clic en un icono del escritorio se
active y desactive la wifi. Así te sería mucho más cómodo.

- ¿Podrías?

- Creo que sí. ¿Nos invitas a merendar?

Si a alguien le parece que una merienda es poco por un trabajo como éste, es que no conoce cómo nos
las gastamos en mi familia.

- Vale - respondió él.

Y me hice con el teclado y el ratón.

- ¿Tienes Java instalado? - le pregunté de camino.

- ¿Ja qué?

Suficiente. Miré el panel de control y lo tenía. De modo que me descargué un programa llamado
WebScarab. En pocas palabras, un proxy que se puede utilizar para analizar el comportamiento de las
aplicaciones web, interceptar y modificar el tráfico y cosas de este tipo. Tiene la ventaja de no
precisar instalación y de poder ejecutarse en casi cualquier plataforma. Eso sí, está desarrollado en
Java. Lo puedes ver y conseguir en:

https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project

Buena gente, esta de OWASP.

Lancé WebScarab, configuré el proxy en el navegador y activé la wifi usando la interfaz web. Después
utilicé las capturas realizadas por WebScarab para ver la petición http realizada. Sí, seguía siendo
HTTP, no HTTPS. Os la copio:
-----------
POST http://192.168.0.1:80/wifi2.htm HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Referer: http://192.168.0.1/wifi.htm
Accept-Language: es
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: 192.168.0.1
Content-length: 333
Proxy-Connection: Keep-Alive
Pragma: no-cache
Authorization: Basic YWRtaW46c295ZWxtZWpvcg==

wlEnbl_1=1&wlChannel=0&wlchannelcheck=&wlNBwCap=1&wlNCtrlsb=1&wlFltMacMode=disabled&wlSsid_1=estenoes
elSSID&wlHide_1=1&wlAuthMode_1=psk2&wlWep_1=enabled&wlKeyIndex=1&wlKeyBit=0&wlKey1=&wlKey2=&wlKey3=&w
lKey4=&wlWpa_1=tkip%
2Baes&wlWpaPsk_1=estanoeslapass&wlMACAddrList=&iExpert=1&sSuccessPage=valid_wifi.htm&sErrorPage=confi
g_wifi.htm
------------------

Una petición POST realizada sobre HTTP en la que destacaban algunos de los parámetros pasados. Cosas
como:
wlSsid_1=estenoeselSSID
wlWpaPsk_1=estanoeslapass

O sea, estos datos van "en claro" sobre la red. Bien.

Y antes había otra cosa llamativa:

Authorization: Basic YWRtaW46c295ZWxtZWpvcg==

Eso de YWRtaW46c295ZWxtZWpvcg== suena a Base64. Utilizando un programa que decodifica Base64 (hay muchas páginas web online que te hacen este trabajo) tuve la cadena que representa en un segundo:



- Estooooo - pregunté - para acceder al router no utilizarás como usuario "admin" y contraseña "soyelmejor". ¿Verdad?

- Sí. ¡Vaya! ¿Cómo lo has sabido?

- No. Nada. Cosas mías. ¿La contraseña la pusiste tú?

- No. Venía de fábrica.

Típico. Si viene de fábrica... ¿por qué cambiarlo? ¿quién soy yo para cambiar lo que el fabricante,
que es quien mejor conoce su producto, puso?

Así que también van "en claro" por la red el usuario y la contraseña de acceso a la configuración del
router. Sin más protección que una codificación en Base64, decodificable de forma instantánea. Bueno
es saberlo.

Y, lo mejor. No se veía ningún tipo de protección anti-CSRF (Cross Site Request Forgery). Eso del
CSRF es algo a lo que no se le presta la debida atención. Supón que estás logado en una red social,
pero hace rato que dejaste de navegar por ella. Visitas ahora una página web que te han recomendado,
pero que es más malvada que el Sauron ese. Y la página tiene una imagen cuya URL es la que visitarías
para hacer un "qué chula es esta página" en tu red social.

El resultado sería que, sin saberlo tú, a efectos de la red social, has hecho el "qué chula es esta
página".

Armado con todo esto, escribí un par de scripts en Visual Basic Script. Uno para encender la Wifi:
------
params="wlEnbl_1=1&wlChannel=0&wlchannelcheck=&wlNBwCap=1&wlNCtrlsb=1&wlFltMacMode=disabled&wlSsid_1=
estenoeselssid&wlHide_1=1&wlAuthMode_1=psk2&wlWep_1=enabled&wlKeyIndex=1&wlKeyBit=0&wlKey1=&wlKey2=&w
lKey3=&wlKey4=&wlWpa_1=tkip%
2Baes&wlWpaPsk_1=estanoeslapass&iExpert=1&sSuccessPage=valid_wifi.htm&sErrorPage=config_wifi.htm"

Set http = CreateObject("Microsoft.XmlHttp")
http.open "POST", "http://192.168.0.1/wifi2.htm", FALSE
http.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
http.setRequestHeader "Content-length", len(params)
http.setRequestHeader "Referer","http://192.168.0.1/wifi.htm"
http.setRequestHeader "Authorization","Basic YWRtaW46c295ZWxtZWpvcg=="
http.setRequestHeader "Connection", "close"
http.send params
------
... y otro para apagarla:
------
params="wlEnbl_1=0&wlChannel=0&wlchannelcheck=&wlNBwCap=1&wlNCtrlsb=1&wlFltMacMode=disabled&wlSsid_1=
estenoeselssid&wlHide_1=1&wlAuthMode_1=psk2&wlWep_1=enabled&wlKeyIndex=1&wlKeyBit=0&wlKey1=&wlKey2=&w
lKey3=&wlKey4=&wlWpa_1=tkip%
2Baes&wlWpaPsk_1=estanoeslapass&iExpert=1&sSuccessPage=valid_wifi.htm&sErrorPage=config_wifi.htm"

Set http = CreateObject("Microsoft.XmlHttp")
http.open "POST", "http://192.168.0.1/wifi2.htm", FALSE
http.setRequestHeader "Content-type", "application/x-www-form-urlencoded"
http.setRequestHeader "Content-length", len(params)
http.setRequestHeader "Referer","http://192.168.0.1/wifi.htm"
http.setRequestHeader "Authorization","Basic YWRtaW46c295ZWxtZWpvcg=="
http.setRequestHeader "Connection", "close"
http.send params
------
Por temas de espacio y ajustes de texto, la primera línea aparece cortada en varias. Iría desde "params=" hasta la línea en blanco.

Los guardé en una carpeta poco visible y creé los accesos directos en el escritorio.

Mi amigo, más contento que unas Pascuas. Y, nosotros, tras la merienda, satisfechos.

Antes de irme, me apunté la marca y el modelo de router y otros datos de la etiqueta. Quiero echar un
vistazo a ver si esto del CSRF está ya solucionado por el fabricante y hay alguna actualización del
firmware que lo arregle. En caso contrario, pues habrá que decírselo y ver qué hacen. Ya os cuento.

Y, mientras tanto, sigo dándole vueltas. Ponte en el papel de un delincuente "moderno". El código
Visual Basic Script anterior puede embeberse en una página e Internet Explorer lo reconocería y lo
ejecuaría. Y pasarlo a JavaScript, que es universalmente reconocido, es tarea trivial. De ese modo funcionaría también con Safari, Firefox, Chrome,...

Ahora consigues que la gente visite tu página web que incluye este script. O alguna que hayas vulnerado y le hayas calzado el script. O alguna vulnerable a Cross Site Scripting. O...

El resultado es que quienes tengan un router como el de mi amigo (que es bastante común) y no haya
cambiado la contraseña que traía de fábrica (lo que también es bastante común) estarán, sin saberlo,
reconfigurando la wifi de su router. Apagándola, encendiéndola, cambiando su SSID o su contraseña,
etc.

Pero no sólo la wifi. ¿Y si le cambiáramos los DNS? Podríamos redirigir a la gente a donde
quisiéramos. Que cuando ponga www.google.com, www.gmail.com o www.facebook.com le damos la IP de una de nuestras webs. Quizá una parecida a la original pero que nos guarde en algún sitio las cuentas de usuario y las contraseñas. Ya sabes. Por eso de las "copias de seguridad".

Por ideas...

No hay comentarios:

Publicar un comentario