jueves, 31 de enero de 2013

Cómo no se deben hacer las cosas (1): Barato lo llevo, oigaaa

Cuando uno se pone a mirar, a veces ve cosas llamativas. Algunas de ellas son tan típicas, tan... paradigmáticas, que creo que podrían servir de ejemplo para todo el mundo. Y hace unos días me encontré con una de ellas.

No sé cómo, pero me encontré intentando ver si el MIT (Massachusetts Institute of Technology) vendía software barato. Quizá parezca que soy raro, pero mis razones tenía. Así que fui a Google y puse:

 site:mit.edu "cheap autocad"



 Me salieron unos cuantos resultados. Así que, por probar, hice clic en el primero de ellos y...



 Como se puede ver en la imagen, no terminé en el MIT. En su lugar, fui redirigido a una página muuuuuuy rarita. ¿Que cómo? Pues, analizando la respuesta del servidor, me encontré con las siguientes cabeceras HTTP:



Status=Moved Temporarily - 302
Date=Tue, 29 Jan 2013 16:02:09 GMT
Server=Apache
P3P=CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Content-Encoding=gzip
Vary=Accept-Encoding
Location=http://uzsrodghwira.jet-software.net/browse/search/?q=autocad+architecture
Scripts-IP=18.181.0.46
Keep-Alive=timeout=15, max=1000
Connection=Keep-Alive
Transfer-Encoding=chunked
Content-Type=text/html


Bueno, una redirección HTTP 302, "Movido Temporalmente" a un sitio extraño. OK, ese servidor hacía cosas bastante extravagantes. Pero había más.

Por lo visto hasta ahora, a esa web del MIT le han calzado uno del 48. Alguien se les había colado y les había metido cosas feas. Pero supongamos que yo me doy cuenta y aviso al administrador del sitio. Supongamos que le envío un correo y le digo que la dirección http://ceer.mit.edu/?sc=7222 lleva a una tienda posiblemente ilegal de software.

Y supongamos que quien recibe mi mensaje prueba y pone en la barra de direcciones de su navegador la URL que le doy. Entonces, le aparacerá esto:





¡Ahora resulta que esa URL lleva a la página principal del sitio! El administrador posiblemente pensará "¡qué poca gracia tenía esta broma!" o "¡la gente ya no sabe ni lo que visita!" y se olvidará del tema.

En esta ocasión, las cabeceras HTTP de la respuesta indican que también ha existido redirección, pero no a otra web:


Status=Moved Temporarily - 302
Date=Tue, 29 Jan 2013 16:06:20 GMT
Server=Apache
P3P=CP="NOI ADM DEV PSAi COM NAV OUR OTRo STP IND DEM"
Content-Encoding=gzip
Vary=Accept-Encoding
Set-Cookie=8519503dbe949327cf1a7a153cc6f9ec=d0d26ddbbc41fd742852af53c3852a28; path=/
Location=/
Scripts-IP=18.181.0.46
Keep-Alive=timeout=15, max=1000
Connection=Keep-Alive
Transfer-Encoding=chunked
Content-Type=text/html


Simpático ¿verdad? El tipo maluto tenía su truco. Su "regalo" mira las cabeceras HTTP de las peticiones y, en particular, la del "Referer". Cuando uno sigue un enlace, el sitio web de destino recibe en esta cabecera la URL del documento desde el que surgió la petición. Y el script malicioso, sabiendo esto, unicamente redirige al visitante a su "tienda" cuando aquel viene desde Google, o quizá también desde algunos otros buscadores.

Pero había más. Porque en la primera imagen se puede ver cómo percibe Google el documento de la URL que nos trae de cabeza. Y no se parece ni a la tienda ni a la página de inicio del sitio. Google ve otra cosa diferente. Quizá tenga que ver con la cabecera HTTP "User-Agent", que identifica al navegador con el que se realizan las peticiones. Muchas veces, así ocurre.

Google tiene un programilla llamado "GoogleBot" con el que va rastreando páginas web. Y tiene su propio "User-Agent". Podemos saber cuál es consultando la versión en cache de Google de algunas páginas de esas de "mira qué User-Agent tienes". Probando con una de ellas:


¡Ahí está! Ahora, cogiendo el Firefox con la extensión "Tamper Data" podemos volver a pedir nuestra página camaleónica y cambiar el valor del User-Agent para utilizar el de GoogleBot.


... Y ¡Bingo! La tercera versión de la página:


Así, que esta gente le da a cada uno lo que busca. En este caso, a Google, un galimatías de palabras pero que tienen varias veces eso de "cheap" y algunos nombres de programas

 ¡Con tal de hacer caja!

Por supuesto, quise notificar todo esto al webmaster del sitio. Pero...
(continuará)








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...

miércoles, 16 de enero de 2013

Una batalla por la privacidad... ¿ganada?

Leo hoy en Microsiervos un artículo cuyo título es más que revelador: "El precio de la estupidez: Instagram pierde a muchos de sus usuarios más activos".

La historia es ya conocida: Instagram dijo que iba a modificar sus términos de servicio y, entre otras cosas, de ellos parecía deducirse que Instagram se reservaba el derecho de cobrar a compañías a cambio de dejarles utilizar nuestras fotos, por ejemplo, para anuncios.

La respuesta de los usuarios obligó a Instagram a, en un primer momento, señalar que se trataba de un malentendido y, posteriormente, introducir modificaciones en los nuevos términos de servicio que, a todo esto, entrarán en vigor el 16 de enero de 2.013 (o entraron si, como es más que probable, lees esto después de esa fecha).

¿Una batalla ganada por los defensores de la privacidad y los derechos de los usuarios? Quizá, pero yo soy pesimista.

Hoy también me encuentro con otro títular: "España: líder europeo en adicción a Internet". Aunque sea en una enfermedad como ésta, en algo teníamos que ser líderes en estos difíciles tiempos que corren. Pero no es sólo la adicción que alcanza a un 1,5 % de nuestros jóvenes: es que casi un 28 % reconocen que han descuidado otras cosas por andar más conectado a Intenet de la cuenta.

Demasiada dependencia. Estamos demasiado "colgados" de smartphones, correos, redes sociales y demás. Y detrás de ellos están compañías que, creemos, nos ofrecen servicios de forma gratuita. Pero si cuando uno va al mercado a por carne, le cobran por ella, a alguien le debería extrañar tanto "gratis total". O pensar que, en el mercado, a quien no le suelen cobrar es al cerdo o a la vaca. Que todo eso que nos ofrecen es un señuelo para conseguir lo que para ellos es su materia prima, no su clientela.

Y lo peor es que muchas veces aceptamos sin siquiera echarles un vistazo las condiciones que nos imponen. Esta vez salió a la luz y hubo revuelo, pero seguro que más adelante habrá, aquí o en otro sitio, un movimiento similar al de Instagram. Y que alguna vez terminará colando.

Enre la dependencia de estos servicios y las nuevas tendencias con hardware cada vez más cerrado y con stores de software más exclusivas, al final uno no puede sino darle la razón al gran Bruce Schneier y afirmar que estamos llegando a un estado de "Seguridad Feudal", con señores que tienen todos los derechos.

Y con vasallos.