Privacidad en Kik Messenger
Hace unos días escribí un artículo sobre la seguridad en WhatsApp y en Twitter me preguntaban si había revisado kik. La verdad, cuando empecé a usar mi teléfono actual no había WhatsApp para esa plataforma por lo que usé kik un tiempo, pero ya que tengo que comunicarme principalmente con equipos BlackBerry, donde kik estaba vetado (y está, si entiendo correctamente) me enfoqué más en WhatsApp.
Pero hay algunas cosas interesantes de Kik. Si bien resulta obvio que Kik utiliza el protocolo XMPP sin bluffs (usar el puerto 443 para una conexión sin cifrar, como WhatsApp) y que, de lo que vi, tanto la autenticación como los mensajes están codificados, los profile pics sí que van por texto plano, y aunque a primera vista pareciera que es un paso más complicado de explotar (robar esas pics, para el propósito que se te ocurra) que en el caso de los MMS de WhatsApp, todo son ilusiones.
Kik utiliza Amazon para almacenar las profile pics. Así, profilepics.cf.kik.com (y sin el cf también) sirve contenidos desde Cloudfront, y el cliente en el teléfono hace requests sobre HTTP en claro del tipo:
GET /Ae2hXKz2BVt8H0DDISLSezIVWcM/thumb.jpg?ts=1326761235015 HTTP/1.1 Accept: */* Referer: [URI que se forma probablemente con el UUID del teléfono] Accept-Encoding: identity User-Agent: NativeHost Host: profilepics.cf.kik.com Connection: Keep-Alive
Un ejemplo:
![]()
En realidad no necesitas todos esos headers, ni el argumento de timestamp que pasa por GET (probablemente usado para optimizar el caché en la infraestructura de Amazon) ni el Referer, que podría eventualmente ser considerado como información que te identifica individualmente, basta con wget o tu browser (aunque tu browser también puede que delate más de lo que quieras) para stockearte de profile pics. Por supuesto, si usas Wireshark, puedes exportar directamente los bytes desde tu captura, si también estás viendo las respuestas y no solo los requests.
¿Pasa lo mismo con las imágenes que mandas a tus contactos? No. Aquí mi sospecha: si bien veo que el teléfono contacta a platform.kik.com cuando mando una imagen, es probable que la POSTee ahí y luego pase el link cifrado como un mensaje XMPP normal. Cuando recibo una imagen, hay una consulta DNS para resolver kikplatform.s3.amazonaws.com y luego, viene tráfico HTTPS.
Intenté, en vano, hacer SSL MITM para poder ver la URI a la que accede, pero pareciera que Kik no es vulnerable, al menos con mi certificado de prueba. ssldump muestra esto, consistentemente:
67 6 0.0170 (0.0000) C>S ChangeCipherSpec 67 7 0.0170 (0.0000) C>S Handshake 67 8 0.0193 (0.0022) S>C ChangeCipherSpec 67 9 0.0193 (0.0000) S>C Handshake 67 0.0272 (0.0079) C>S TCP FIN 67 0.0275 (0.0003) S>C TCP FIN
Lo interesante es que mientras persiste el ataque, la foto que venía dentro del mensaje no descarga y solo se muestra el thumbnail, que seguramente se pasó por Base64 en un mensaje XMPP, igual que WhatsApp.
A pesar de que, en mi opinión personal, Kik tiene un concepto mucho más completo que WhatsApp, incluyendo una API para integrar aplicaciones y que tiene algunos aspectos de privacidad a mejorar aunque parece tener trade-offs más justos que WhatsApp, igual recomendaría no usarlo en redes Wi-Fi públicas o, al menos, hostiles.
Hacking WhatsApp for fun and profit
A estas alturas ya debes haber escuchado que WhatsApp es inseguro. El popular sistema de mensajería entre plataformas transmite números de teléfonos y mensajes en texto plano a través de, aparentemente, una versión codificada de XMPP sobre el puerto TCP 443.
Lo que seguramente no te han contado es de que te sirve eso, y por qué debería importarte. En primer lugar, sirve para que hackers de todo el mundo le hagan ingeniería reversa al protocolo de WhatsApp, existiendo proyectos que dicen tener la API completa y estar trabajando en una aplicación de escritorio, una Web, un plugin para Chrome... situación que, asumo, será un poco conflictiva.
En la práctica, significa que cuando utilizas WhatsApp conectado a una red que no está bajo tu control, por ejemplo una red Wi-Fi en un café o en un restaurant, o en tu centro educativo, estás exponiendo todas tus conversaciones, contactos y multimedia que compartes por WhatsApp a cualquier persona que tenga los motivos para querer esa información.
Solo se necesita lanzar un ataque de ARP spoofing (con arpspoof de dsniff, ettercap et al.) para que el atacante pueda hacer que todo el tráfico de tu smartphone pase por su equipo, donde puede estar capturando paquetes con wireshark, tcpdump y otros. Ya existe un sniffer para WhatsApp, pero a alguien se le ocurrió la genial idea de subirlo a Megaupload, que ahora está cerrado. En todo caso no se necesita sniffer, como explico ahora.
Tu WhatsApp se contacta con la matriz a través de la dirección bin-short.whatsapp.net que básicamente se sirve por DNS round robin a 12 direcciones IPv4, 10 en Texas y 2 en California. Tu equipo enviará un mensaje saludando, informando la versión del cliente, el sistema operativo del teléfono, las capacidades de cifrado con las que cuenta, tu número de teléfono, tu nombre, y algunas cosas más.
Pro Tip: puedes trollear bloqueando la resolución de DNS de esa dirección en tu red
Las imágenes se pasan en Base64 (el thumbnail) junto con una URI que, esta sí, cifra sobre HTTPS. Hay una granja de servidores (mmsXXX, 18 servidores según mis cálculos) que utilizan una estructura de directorios (p.ej., /d3/22/15/8/7) para almacenar multimedia y luego un hash MD5 como nombre de archivo.
Descubrir como arman esta URI es interesante, pero innecesario, porque igual pasan la URL por texto plano y no implementan control de acceso para servir el contenido. Un ejemplo aquí (note la URL)
Como nota curiosa, parecen usar lighttpd sobre FreeBSD para esta granja, específicamente una versión que podría ser susceptible a un ataque de DoS aunque personalmente no creo que lo sea, además de poder mitigar el riesgo con otros 17 servidores. Pero siempre es divertido averiguarlo.
Las otras posibles derivaciones de esto, como por ejemplo, que se hagan pasar por ti para enviar mensajes en la red, están un poco inmaduras aun. Al usar un challenge SASL MD5, debe haber una clave (tú no le pusiste una clave a tu cuenta de WA), que aunque según algunos es simplemente "password", al parecer se calcula usando valores UUID que están en el teléfono, y un algoritmo propio del cliente, para identificarse por XMPP. En s.whatsapp.net tienes un CNAME a im101 (intenté buscar más, sin éxito) que aunque no responde por XMPP es el nombre del realm. Enjoy. Y no uses WhatsApp en redes Wi-Fi públicas, por ahora.