06 octubre 2010

Tuenti y las redes locales inseguras - 1/2

En este artículo voy a explicar cómo nos podríamos hacer con el control de la cuenta de Tuenti de un usuario que se encuentre en nuestra misma red local, siempre y cuando ésta permita la realización de un ataque ‘man in the middle’ (de ahora en adelante MITM).

Debido a que el artículo completo era excesivamente largo (lo vi antes de publicarse e invitaba a no leerlo) he decidido realizar dos entregas del mismo y, de esta forma, evitarme el hacer un resumen pues me daba la sensación de que todo lo que eliminaba era algo interesante que se quedaba en el tintero (y poca gente acude al PDF completo, como sucedió con el artículo de la gestión de contraseñas en la UPM).

En esta primera entrega hablaré un poco del TuentiChat (el nombre me lo he inventado pero así nos entendemos), de su estructura y algunos comentarios para realizar una aplicación que monitorice el tráfico y nos muestre las conversaciones de una forma más amigable. Además comentaré la forma de obtener el SID y CSFR de la cuenta para tomar el control de la misma.

En la segunda entrega se explicarán un par de acciones que podemos realizar sobre la cuenta de la víctima y cómo podríamos robar una sesión e incluso los credenciales del usuario de una forma totalmente transparente (o al menos de una forma que sería más efectiva a nivel de sospechas que una suplantación de certificado, sabiendo que la mayoría lo aceptarían sin contemplaciones).

Al artículo acompañará el código de la aplicación (escrita en Java para aprovechar que sea multiplataforma) que utilicé para todas las pruebas y las demostraciones de las charlas. Este código lo publicaré al final de esta entrega pues no están implementados los ataques de la segunda parte (los hice manualmente aunque si están incluidas las clases que habría que utilizar).

¡Comencemos!
Disclaimer:

No me hago responsable del mal uso que pueda darse a esta información o al código de la aplicación que la complementa.

En ningún momento la intención del artículo es la de incitar a que se produzcan ataques sobre las cuentas de los usuarios de Tuenti (siendo exportable a cualquier otro servicio), más bien su finalidad es la de concienciar, pues si no cuidamos dónde y cómo nos conectamos, la privacidad de nuestros datos (y en muchas ocasiones los de otras personas) puede verse comprometida.


1. Introducción

Todos sabemos lo nada recomendable que es el navegar por una red que no conocemos, pues no podemos saber si el administrador (u otro usuario) está monitorizando nuestro tráfico.

Puesto que muchas veces nos veremos en la situación de utilizar una, es más que recomendable cifrar el tráfico a través de una VPN de confianza.

Aprovecho para recomendar la serie de artículos que escribió Chema Alonso en su blog, El lado del mal, sobre la seguridad de las VPN y qué soluciones son las más recomendadas.

Visto esto y orientándolo a Tuenti, por ser una red social con gran presencia nacional, vamos a preguntarnos: ¿qué podemos hacer con ella y una red local insegura? Pues muchas cosas interesantes, a la par que muchas medidas de seguridad han de ser implementadas.

A lo largo de cada apartado aprovecharé para comentar las medidas que Tuenti ha decido tomar al respecto tras haber sido avisados (podremos estar de acuerdo o no con los motivos pero siempre es interesante saberlos).

Preparando una de las charlas sobre el artículo, desde Tuenti se puso mucho interés en que contara algunas de las implicaciones legales que conlleva el realizar el ataque. Por este motivo, aquí tenéis un breve comentario sobre lo que me comunicó su departamento legal:

Debido a que obtendremos control total sobre la cuenta de Tuenti de la víctima y realizaremos peticiones en su nombre, estaremos cometiendo un delito de Suplantación de Identidad, penado con entre seis meses y tres años de cárcel. Además, para realizar esto habremos monitorizado su tráfico por lo que estaremos cometiendo un delito de Interceptación de comunicaciones penado con entre uno y cuatro años de cárcel.

2. El escenario

Los requisitos necesarios para poder llevar a cabo el ataque consisten en encontrarnos en la misma red local que la víctima y el haber realizado un ataque MITM para poder monitorizar/manipular el tráfico.

No voy a explicar cómo realizar el ataque MITM ni cómo monitorizar el tráfico pues creo que es ampliamente conocido por todos y hay mucha documentación al respecto, aun así decir que utilicé Ettercap (MITM) y TShark (monitorización).

A pesar de esto, a lo largo del artículo se recomendará el no depender de aplicaciones externas (no nos aportan ninguna funcionalidad extra) sino que será más interesante el programar e implementar éstas por nuestra cuenta (en el caso del sniffer bastaría con uno simple que dumpee el tráfico o que trabaje ‘al vuelo’ y con respecto al ataque MITM podremos tener un mayor control de los paquetes antes de redireccionarlos a la víctima).

3. El TuentiChat


Aprovechando que el tráfico del TuentiChat no está cifrado, podremos monitorizar las conversaciones de la víctima e incluso, más orientado con lo que se verá en la segunda entrega, podremos modificar las mismas (lo que envía y lo que recibe).

El TuentiChat utiliza el protocolo abierto XMPP, el cual está basado en XML. Por lo tanto, a la hora de monitorizar el tráfico sería aconsejable utilizar un filtro para el protocolo HTTP/XML.

Un ejemplo del contenido del paquete de un mensaje sería:

<body rid='RID' sid=’SID’ xmlns='http://jabber.org/protocol/httpbind' key=’KEY’>
  <message xmlns="jabber:client" to="IDUSUARIO@xmppX.tuenti.com/tuenti">
      <body>MENSAJE</body>
  </message>
</body>

¿Es posible seguir una conversación?

De forma manual no, pues la cantidad de paquetes que no tienen que ver con la conversación (que no contienen mensajes) nos desbordaría. Además nos encontraríamos con un problema a la hora de seguir multiconversaciones pues el ID del usuario no nos es fácil de recordar por lo que será difícil diferenciar qué mensaje corresponde a qué conversación. Por lo tanto, para poder seguir el TuentiChat de la víctima será necesario realizar una aplicación con un FrontEnd “amigable”.

No voy a detallar el cómo programar la aplicación, pero si voy a hacer algunos comentarios al respecto.

En primer lugar, es necesario realizar un filtrado del tráfico de la víctima pues, si obligamos al programa a trabajar con toda la captura, hará que en muchas ocasiones el TuentiChat no sea fluido, pues estará procesando otro tráfico innecesariamente (por ejemplo, si el usuario está viendo un vídeo en YouTube). Con respecto al TuentiChat, tendremos que procesar únicamente el tráfico proveniente del rango de IPs 95.131.x.x.

A la hora de procesar los paquetes y dividir los mensajes por conversaciones, tendremos que centrarnos en 4 datos importantes, siendo éstos el RID (para evitar paquetes duplicados), el emisor (etiqueta from), el receptor (etiqueta to) y el mensaje (entre las etiquetas body de segundo nivel).

En el caso de que sea la víctima la que inicie la conversación y el otro usuario no le responda, no sabremos el ID de la víctima pues no manda la etiqueta from (la asigna a posteriori el servidor), por lo que tendremos que tener cuidado de procesar esos mensajes correctamente.

En mi caso opté por generar un buffer temporal a la espera de poder ponerle nombre a la víctima. Otra opción sería realizar una petición al perfil del usuario nada más obtener el SID, obtenerlo de ahí y olvidarnos de este problema (el SID aparece siempre).

Después de haber visto todo esto es interesante preguntarse ¿es seguro utilizar el TuentiChat?

Mi respuesta es que no siempre que nos encontramos en una red insegura y no nos hayamos encargado nosotros mismos de cifrar el tráfico. A pesar de esto, aún me sorprende lo poco que le importa a la gente su privacidad.

¿Tuenti va a tomar alguna medida al respecto?

Tras reportarlo me comentaron que, a medio plazo, se dará la opción al usuario para que elija que sus sesiones de chat se cifren (con sus ventajas e inconvenientes).

Cuando les pregunté por qué el SSL no había sido implantado desde el principio me contestaron que, debido a los microcortes que sufren por culpa de su ISP (de unos 30s), si implantaban el SSL los servidores no iban a aguantar el pico de reconexiones si éstas estaban cifradas y que una reconexión escalar no era solución porque a los usuarios no les gustaría tener que esperar para seguir utilizando el servicio.

Ya hemos visto como podemos monitorizar conversaciones ajenas del TuentiChat de una forma preocupantemente sencilla, ahora bien, ¿qué más podemos hacer?

Algunas capturas de la aplicación:



4. Obteniendo el SID y el CSFR

Para poder realizar peticiones al servidor como si fuéramos la víctima y, por consiguiente, tener acceso total a su cuenta, tenemos que obtener dos datos, el SessionID (de ahora en adelante SID) y el CSFR (código utilizado para evitar peticiones desde enlaces externos a la página de Tuenti).

¿Cómo podemos obtener el SID?

Al haber realizado el ataque MITM todo el tráfico de la víctima pasa a través de nosotros, por lo tanto tenemos acceso a las cabeceras de las peticiones y, al encontrarse el SID en una cookie que se envía en cada una de ellas, podemos obtenerlo fácilmente en cualquier comunicación entre la víctima y los servidores de Tuenti.

Una vez que hemos obtenido el SID ya podríamos, por ejemplo, saber el nombre de cualquier usuario. Simplemente habría que hacer una petición a su perfil y obtenerlo del HTML que nos devuelve el servidor, y de ésta forma ya podríamos olvidarnos del ID. La petición se realizaría a la siguiente url:

http://www.tuenti.com/?m=profile&amp;user_id=ID

¿Cómo obtenemos el CSFR?

El CSFR lo podemos obtener fácilmente, una vez conseguido el SID, realizando una petición a cualquier página de Tuenti (perfil propio, de amigos, etc) y parseando el HTML recibido como respuesta, pues éste no está contenido en una cookie como en el caso del SID. El código HTML en el que se encuentra es:

var SiteConfig = { (…) CSFR: 'CSFR' (…) }

Antes el CSFR era único (por usuario) e invariante (no cambiaba en cada sesión como el SID), pero tras reportarlo, Tuenti ha decidido que varíe cada sesión. Aun así, a nosotros no nos afecta.

¡Hasta aquí todo! Ya para terminar con esta primera entrega...

A continuación se enlaza el código fuente de la aplicación utilizada. En esta versión están implementadas la monitorización de conversaciones, acceso/edición de la información personal de la víctima y algunas acciones como guardar el contenido de la conversación o cerrar la sesión. Faltaría por añadir el robo de sesión y el acceso a los credenciales. Ambos se pueden hacer con el Ettercap o de forma personalizada haciendo uso de la clase MITM.

Lo ideal sería tomar esta aplicación como punto de partida y modificar su código, pues está programado como forma de ir automatizando las pruebas pero sin tener una visión global, por lo que la parte principal del programa es la monitorización de conversaciones (que debería ser una opción dentro de la aplicación) y no el apartado de acciones sobre la cuenta de la víctima (lo que en realidad engloba todo). Esto imposibilita manejar la cuenta de la víctima si ésta no tiene una conversación en el TuentiChat (a pesar de que hayamos obtenido el SID, que es lo verdaderamente importante).

Nombre: aplicacion_src.7z
CRC-32: a323e8ad
MD5: f1f936e1f26a059add4e888a14748bec
SHA-1: 89afaf9342a3282989222001e1409a9344bdfb77

Artículo cortesía de: Luis Delgado J.

18 comments :

asdsdadasdsadasdas dijo...

El articulo está interesante, pero no se si he comprendido bien el tema principal.... ¿Es que el chat de tuenti es inseguro por no ir cifrado?, es mucho mas critica la cuenta en si (que también puede ser robada mediante la cookie que va sin https) que el sistema de chat. Es como si temieras más que alguien leyera tu diario (tuentichat) que alguien entrara en tu casa (tuentichuenta)

Jandro dijo...

Lo de que no este cifrado el trafico en el tuentichat es algo ya normal en cualquier chat como por ejemplo el msn, ya se hizo un articulo sobre eso. Algun dia a ver si podemos hacer algo con lo del facebook que al final caducó el ID pero hay que seguir investigando ;).

vierito5 dijo...

Buen artículo! Estaremos atentos a la segunda parte.

Mi teoría sobre el SSL: aunque sea cierto eso es una excusa. Eres Tuenti y tu ISP te provoca microcortes constantemente, ¿no te cambias de provedor? Simplemente no han usado SSL desde el principio porque es más barato, tanto en recursos hardware, como a nivel de desarrollo, como por sus complicaciones para algunas "features" entre usuarios.

Luis dijo...

@TheSur
En la proxima entrega viene lo interesante, se explicará como, aprovechandonos de que no se cifra el tráfico, podemos robar sesiones, credenciales, etc.

@Vierito5
Totalmente de acuerdo, por eso digo que una cosa es lo que digan y otra lo que opinemos al respecto (en la próxima entrega se comenta la razón por la que no implementan SSL)

Espero que alguien optimice/amplie el programa y lo publique ;)

Pepe dijo...

A mí lo que más me preocupaba era lo del CSFR fijo... Buena noticia que lo hayan cambiado!

E igual que conseguimos el CSFR podemos sacar el 'pass' del chat, con que podríamos usar un cliente convencional de jabber para suplantar la cuenta (aunque tiene sus limitaciones).

Buen post, espero la segunda parte! =P

Luis dijo...

@cGVwZQ
Efectivamente, yo solo comento el tema monitorizar pero podriamos hacer muchas más cosas interesantes (sin nisiquiera utilizar clientes externos) :)

Anónimo dijo...

Hola,
Estoy intentando compilar tu codigo, pero de momento no lo conseguí, no he rodado mucho en el java... LLegué hasta esta línea de comando

javac ..\lib Main.java

pero me da errores "Not Found Symbol" referidos a otros objetos residentes en los demas .java según parece.

¿Alguna ayuda?

Luis dijo...

@Anonimo
¿Estas teniendo en cuenta las librerías? Asegurate de tener jpcap, sqlitejdbc, httpclient, etc. (incluso en el classpath por si acaso).
Te recomiendo que, antes de usarlo, mires el código, veas como funcione y detectes qué está fallando exactamente.

Anónimo dijo...

Si, perdona, escribí mal el comando.
El que estaba utilizando era este

javac -classpath ..\lib Main.java

compilando obviamente desde el directorio src.

Anónimo dijo...

Hola podrianos decirnos como compilar el programa o podrías ponerlo ya compilado. Gracias

Luis dijo...

@Anonimo:
No voy a liberar una versión compilada (pues en el archivo está todo lo necesario para hacer funcionar la aplicación), y tampoco entiendo a que te refieres con que explique como se compila... (es como cualquier otra aplicación escrita en Java, siempre puedes abrir el proyecto en un IDE y compilarlo desde ahí).

El programa que está publicado ha dejado de funcionar (el tema de las peticiones, la monitorización del chat no se ha visto afectada).
En la segunda entrega (que ya está terminada) se publicará una versión nueva (ha sufrido muchas modificaciones) totalmente funcional.

alejandro dijo...

Buenas el documento de la aplicación que adjuntas , te lo han eliminado.
Me gustaría echarle un vistazo ya que lo que planteas es bastante interesante, tanto para tuenti , otras redes sociales, o cualquier tipo de seguimiento hasta un IRC por ejemplo.
Resubela por favor.
Gracias

Luis dijo...

@alejandro:
En la segunda entrega tienes el enlace funcional de la aplicación (retiré esta porque dejó de funcionar)
http://www.securitybydefault.com/2010/11/tuenti-y-las-redes-locales-inseguras-22.html

Anónimo dijo...

perdona y de este modo se podria hacer una conversacion falsa entre la victima y un amigo suyo del tuenti...y capturar la pantalla?....me expliko a un amigo mio le ha pasado eso...para joderle un tio a exo una conversacion y una captura diciendo cosas de una xavala...ES POSIBLE ESO??

dyvap dijo...

hola no se si esto lo seguira leyendo alguien pero tengo el mismo problema que el usario que puso esto:


Hola,
Estoy intentando compilar tu codigo, pero de momento no lo conseguí, no he rodado mucho en el java... LLegué hasta esta línea de comando

javac ..\lib Main.java

pero me da errores "Not Found Symbol" referidos a otros objetos residentes en los demas .java según parece.

¿Alguna ayuda?

igual que el estoy usando el comando
javac -cp ..\lib main.java y me da el "not found symbol"


en las variables de entorno añadi en classpath la ruta de la carpeta lib pero nada no consigo que funcione alguien sabe que puedo hacer?

Luis Delgado dijo...

Hola,

Lo más fácil es que importes el código a un proyecto en el IDE con el que estés más familiarizado (Eclipse, Netbeans, etc) y lo compiles desde ahí.

Aun así, comentarte que el código era una prueba de concepto y, como tal, seguramente ahora no funcione out-of-the-box y tengas que modificarlo para adaptarlo a la nueva estructura de Tuenti.

Un saludo,
Luis.

dyvap dijo...

ya lo intente con netbeans y no consigo que funcione me da un monton de errores igual es que lo estoy haciendo mal podrias decirme como es? es que estoy empezando con java

Luis Delgado dijo...

Escribeme a contacto@ldelgado.es