Una de las más frases que más habremos oído o leído a lo largo de la historia en diversas fuentes, es esa de “La información es poder”, atribuida a Sir Francis Bacon, filósofo inglés del Siglo XVI. Si ya por aquel entonces, nuestros antepasados eran conscientes del valor que la información supone desde el punto de vista del dominio, imaginemos lo que tendrían que decir si pudiesen contemplar el escenario actual en el que nos movemos, donde precisamente lo que abunda es la ingente cantidad de información que los usuarios subimos libremente a la red.
Figura 1: WhatsApp Intelligence - WhatsApp como fuente OSINT |
Los que nos movemos en el mundo de la seguridad, estamos familiarizados con el concepto de fuentes OSINT (Open Source Intelligence), término acuñado para hacer referencia al conocimiento recopilado a partir de fuentes de acceso público. Entre la cantidad de fuentes abiertas disponibles que existen a día de hoy en la actualidad, podemos destacar los medios de comunicación, redes sociales, blogs, foros, papers académicos, wikis, bibliotecas online, así como un sinfín de orígenes de información accesibles en Internet que nos permiten extraer conocimiento valioso sobre organizaciones, entidades o individuos concretos. 
Figura 2: Proceso OSINT |
Este conocimiento se puede utilizar para diferentes fines, desde conocer la reputación online de una organización o realizar estudios sociológicos, hasta planificar una APT o lanzar ataques de Spear Phishing desde el punto de vista de los cibercriminales. Herramientas que se suelen utilizar para recopilar, analizar y procesar fuentes OSINT existen muchas, desde el tradicional Hacking con Buscadores, el uso de buscadores especializados tipo Shodan para buscar servidores o NameCHK y similares para localizar nombres de usuarios, herramientas de recolección de metadatos como FOCA, API’s de servicios como Facebook, Twitter, o Youtube, servicios para extraer información de dominios, así como las famosas Cree.py u OsintStalker, y cómo no, Palantir o Maltego, por destacar algunas. Si deseas conocer más información acerca de todo esto, es recomendable leer este post sobre fuentes OSINT que publicamos hace unos meses desde el blog de INCIBE.
Reflexionando un poco acerca de esto, y a colación del trabajo que publiqué hace casi un año acerca de Whatsapp Discover, se me ocurrió que sería interesante pensar en utilizar la información que los usuarios vuelcan a diario en sus perfiles de Whatsapp como fuente OSINT, por aquello de que estamos hablando del sistema de mensajería móvil líder en la actualidad.
Todo aquel que utilice Whatsapp, sabe que gran parte de sus contactos modifican a menudo su foto de perfil, o la información de su estado, así como no ocultan la hora en línea. De hecho, conozco a gente que a menudo invierte un rato en cotillear las fotos de perfil de sus amigos para ver si las han cambiado, o leer esas citas célebres que incluyen en sus estados. Por no hablar de los que monitorizan constantemente también la última hora en línea de sus contactos para tenerlos controlados con herramientas tipo WhatsSpy Public.
Utilizar Whatsapi para generar conocimiento
La idea era realizar un pequeño script que dada una serie de números de teléfono de usuarios que se le pasan como fuente de entrada, se conectase a los servidores de Whatsapp de manera periódica para almacenar la foto de perfil, el estado y la última hora en línea de dichos usuarios en una estructura de directorios, así como también en base de datos, de cara a evaluar si a partir de explotar esta información era posible extraer conocimiento y generar inteligencia.
Para acometer esto, existen varias alternativas. A día de hoy, existen dos API’s disponibles para poder conectarse a Whatsapp: WhatsAPI en PHP y Yowsup en Python. En mi caso, decidí usar WhatsAPI-Official, que está en la actualidad mantenida por mgp25, quien ha recogido el legado de la famosa WhatsAPI original que en su día mantenía shirioko. Hay que tener en cuenta que estas API’s no tienen ningún tipo de soporte oficial por parte de Whatsapp (es más, en su día Whatsapp coaccionó a los creadores de WhatsAPI y consiguió cerrar el repositorio durante unos meses), sino que son mantenidas por la comunidad y están continuamente actualizándose para poder mantener su funcionalidad a medida que los desarrolladores de Whatsapp van introduciendo cambios en su protocolo de comunicación. 
Figura 3: WhatsApp-Official actualiza hace doras |
Obteniendo credenciales de Whatsapp
El primer paso antes de comenzar a programar, es disponer de una cuenta legítima de Whatsapp, así como las credenciales de acceso a la misma, que se transmiten utilizando SSL desde los servidores de Whatsapp al instalar la aplicación por primera vez en nuestro dispositivo. El año pasado cuando me dispuse a hacer esto en su día para Whatsapp Discover, utilicé el proxy Burp instalando el certificado PortSwigger en el móvil para poder inspeccionar el tráfico SSL con los servidores de Whatsapp, pero a día de hoy esto ya no es posible, pues en la actualidad la aplicación hace uso de Certificate Pinning.
Figura 4: Script registerTool.php que viene con Whatsapi para registrar un nuevo usuario de Whatsapp |
No obstante, existen alternativas para obtener estas credenciales, así como también es posible volver a registrar un número para obtener nuevas credenciales utilizando el script registerTool.php que viene con WhatsAPI, teniendo en cuenta que esto invalidará la cuenta que tengamos en nuestro dispositivo. Por ello, es mejor utilizar un número diferente que el que tengamos habitualmente como usuarios para trastear con WhatsAPI, ya que si usamos nuestra cuenta desde el móvil y también desde el script, en determinados momentos perderemos conectividad desde alguna de las ubicaciones.
Es por ello que decidí adquirir una tarjeta SIM con un nuevo número, insertarla en mi antiguo iPhone 4S, e instalar Whatsapp. Una vez que la cuenta está correctamente registrada, es posible obtener la información necesaria accediendo a la base de datos sqlite “Cache.db”, que se encuentra en la ruta “Library/Caches/net.whatsapp.Whatsapp” dentro de la carpeta de la aplicación en el dispositivo. Dicha base de datos, contiene las siguientes tablas:
cfurl_cache_blob_data
cfurl_cache_receiver_data
cfurl_cache_response
cfurl_cache_schema_version
sqlite_sequence
Figura 5: Base de datos "Cache.db" en la carpeta Whatsapp de un iPhone 4S |
La tabla cfurl_cache_response contiene la información de las peticiones que la aplicación hace a los servidores de Whatsapp, y la tabla cfurl_cache_receiver_data almacena la información que se obtiene en la respuesta. La información que se necesita para poder utilizar WhatsAPI, está compuesta principalmente por 3 campos: username, identity y password. El nombre de usuario viene dado por nuestro número de teléfono con el prefijo incluido. Los otros dos valores se obtienen al registrar la aplicación y pueden obtenerse de estas dos tablas.
Figura 6: Extrayendo las credenciales de Whatsapp de la base de datos Sqlite |
Programando script con Whatsapi
Una vez que se dispone de los valores necesarios, sólo queda definir lo que se quiere hacer, y ponerse a programar. Para ello, es posible consultar la información que viene en la wiki de WhatsAPI, donde se documenta detalladamente el proceso para conectarse a los servidores de Whatsapp utilizando las credenciales obtenidas, así como las diferentes funciones disponibles o el sistema de eventos que se han de definir para procesar la información que se recibe.
El script, que decidí llamar, “whatsapp_intelligence.php”, toma un fichero como fuente de entrada que contiene la información de los contactos a monitorizar (número de teléfono, dispositivo, versión de la aplicación), que en mi caso proviene de la salida de Whatsapp Discover, pues para realizar este estudio he utilizado los números de usuarios que he ido recopilando en diferentes redes WiFi públicas donde he utilizado esta herramienta, además de diferentes países en los que he estado este último año. Evidentemente cualquiera puede utilizarlo para analizar la información de los contactos de su agenda, o determinados objetivos que le sean de interés, que ya sabemos el interés que existe por espiar WhatsApp.
En este caso particular, me ha parecido interesante recopilar información de personas desconocidas para ver qué se puede obtener de ellas, que además no me han facilitado su número de motu propio, sino a raíz de una mala praxis en materia de seguridad. Así pues, lo que pretende Whatsapp Intelligence es extender la funcionalidad de Whatsapp Discover para intentar extraer conocimiento de manera automatizada.
Figura 7: Fragmento de código del script "WhatsApp_intelligence.php" |
El funcionamiento del script es bastante sencillo. Se configura la ruta donde se creará la estructura de directorios que almacenará para cada número de teléfono de un usuario, las diferentes fotos de perfil que se vayan recolectando, así como un log de su última hora en línea cada vez que se ejecute, y otro con la información del estado. Por otro lado se facilitan a su vez las credenciales de conexión a una base de datos MySQL donde también se almacenará toda esta información (salvo las fotos de perfil) en tres tablas (info, lastseen y status) de cara a poder explotarla mediante consultas.
Posteriormente se define el comportamiento para los eventos que se van a utilizar (onGetProfilePicture, onGetRequestLastSeen y onGetStatus), se recorre el fichero de entrada con la información de usuarios para generar un array de “targets” y mediante un bucle se va solicitando toda esta información a los servidores de Whatsapp para posteriormente ir volcándola tanto en los directorios como en la base de datos.
Figura 8: Creando la estructura de directorios de un servidor Apache |
Para poder visualizar esta información de manera cómoda, creé esta estructura de directorios dentro de un servidor Apache con Directory Listing activado (poco seguro pero no expuesto a Internet) . En dicha estructura para cada número de móvil que corresponde a un usuario de Whatsapp, se crea un directorio donde se almacenan las fotos de perfil que se van obteniendo, siempre y cuando sean diferentes, así como el registro de la última hora en línea y el estado en respectivos ficheros de log, para tener el registro de todas las ejecuciones del script. 
Figura 9: Fotos de perfil, logs de lastseen y estados para un usuario concreto |
En la base de datos, no se almacenan los estados repetidos, pero sí que se registra toda la información que se tiene acerca de la última hora en línea de un usuario, pues además de tener el dato absoluto (que podría ser igual en varios registros), permite calcular la diferencia de días, horas, minutos y segundos respecto de la hora que solicitó de cara a establecer patrones de dependencia o adicción de un usuario a Whatsapp.
Una vez creado el sistema descrito en la primera parte de este artículo, la siguiente fase consistía en capturar información de manera periódica que pudiera alimentar el sistema creado. Estos datos pueden permitir después, analizar en detalle la información obtenida. El objetivo es fácil de entender, si de una organización alguien es capaz de recoger todos los números de teléfono de todos los empleados y hacer una base de datos con toda la información que vierten en WhatsApp, tendríamos una base de datos OSINT que puede resultar muy útil en un esquema de APT.
Figura 10: WhatsApp Intelligence como fuente OSINT en un APT (estados y fotos) |
De cara a alimentar el sistema con información constante que permitiera obtener conocimiento, el siguiente paso fue programar la ejecución periódica del script mediante un cron. Dependiendo del objetivo que se tuviese en cada caso, se podría optar por ejecutarlo con mayor o menor frecuencia, pero para este estudio decidí evaluar qué resultado obtenía registrando diariamente la información una única vez, todos los días a la 14:00 de la tarde.
Fotografías y estados para conocer la vida de una persona
Mi objetivo era contar por primera vez este trabajo en la 2ª edición de Hackron, nuestro congreso de ciberseguridad en Canarias, los días 13 y 14 de Febrero de este año (aquí puedes ver el vídeo resumen de la conferencia), por lo que desde el momento en que tuve todo listo y empecé a registrar datos, el 19 de Enero, hasta el día de la ponencia transcurrieron 26 días, casi un mes. 
En este período Whatsaspp Intelligence estuvo registrando diariamente la información de 54 usuarios de Whatsapp “cazados” con Whatsapp Discover, entre los que además de haber usuarios españoles, los había procedentes de otros países diferentes como México, Turquía o Estados Unidos. En lo que a imágenes de perfil se refiere, el comportamiento de los usuarios varía. Los hay como el Maligno o yo que siempre tenemos la misma foto de perfil, los hay que durante este período la modificaron 3 o 4 veces, y los hay que llegaron a tener hasta 9 imágenes distintas en estos 26 días, lo que da una media de 1 imagen de perfil nueva cada 3 días.
Figura 11: Vídeo de bug en Whatsapp web que permite capturar la foto de un contacto
El analizar constantemente el estado, la foto y los horarios de conexión de una persona, puede generar mucha información. A día de hoy, debido a los bugs explotados recientemente con la versión de Whatsapp Web es posible siempre obtener la fotografía, tal y como se explica en el vídeo de de la Figura 11 .
Con el asunto del estado hay un tema muy curioso. Mientras que un usuario puede elegir si le deja ver el estado a todo el mundo o solo a sus contactos, si la respuesta que se obtiene es un estado en blanco, entonces eso implica obligatoriamente que ha seleccionado la opción de "solo a mis contactos" y eso implica que no estamos entre ellos, ya que ningún usuario puede configurar un mensaje de estado vacío en Whatsapp.
Explotando la información para generar conocimiento
Si analizamos las imágenes en conjunto, sin discriminar por usuario, podemos apreciar algunas tendencias comunes a bote pronto. En primer lugar, no pueden faltar las famosas frases de autoayuda, que a veces los usuarios utilizan como fuente de motivación o para lanzar mensajes “cifrados” a sus allegados.
Figura 12: Citas célebres en fotos de perfil de usuarios con WhatsApp |
Hay citas célebres de todo tipo, sin duda alguna una de las mejores es esa de “A los hombres de mentira les queda grande una mujer de verdad”. Si no tuviésemos más información de ese usuario, al menos ya podríamos saber que es una mujer, y que probablemente esté desilusionada con respecto a su vida sentimental o que está celebrando el día de la mujer trabajadora.
Por otro lado, a pesar de que esto se aconseje por activa y por pasiva en las recomendaciones que damos siempre acerca de seguridad y privacidad en redes sociales, sorprende ver también fotos de menores, no en cuentas de usuario de los propios menores (lo cual es inevitable) sino en la de sus padres, como en este ejemplo que se puede observar.
Figura 13: Fotos de menos de un usuario de Whatsapp |
Si analizamos el resto de la información que tenemos de este usuario podemos averiguar muchísimos datos importantes sobre su vida. Así, podemos saber el nombre de la empresa en la que trabaja (la primera palabra que está ofuscada en la imagen a continuación), a qué se dedica, y también los nombres de sus hijos, los menores que aparecen en las fotos que hemos visto anteriormente echando un vistazo a la información de sus diferentes estados:
Figura 14: Estados que revelan información profesional y nombres de menores |
Otros usuarios muestran en sus fotos de perfil información lugares o ubicaciones geográficas así como fotos de sus mascotas o vehículos, como podemos ver en esta imagen.
Figura 15: Imágenes de perfil que revelan lugares, mascotas o aficiones |
Sin duda, analizar la información de las fotos de perfil manera global permite obtener conclusiones generales acerca de las costumbres de los usuarios, pero lo realmente interesante es analizar de manera individualizada para cada usuario la información que nos proporciona a través de la conjunción de sus fotos de perfil junto con sus estados, sobretodo para aquellos que modifican estos valores de su perfil con asiduidad.
Figura 16: Usuario con múltiples fotos que incluye su nombre en una de ellas |
En la imagen que vemos sobre estas líneas, podemos ver uno de estos usuarios que entre la multitud de fotos de perfil que ha ido subiendo a lo largo de estos días, nos deja su nombre en la primera de ellas.
Figura 17: Usuario revelando sus sentimientos a base de alternar estados |
Si vemos luego la información que vuelca en sus estado del perfil, podemos ver cómo alterna diferentes estados de ánimo. Frases como “I'm in love” o “Ya sé que es amor lo que siento hoy”, se suceden con otras tales como “Pues que todos coman tierra”, “voy a colgar”, o “Ahorita no me hablen”. Esta última, de hecho está sincronizada en tiempo y fecha con la siguiente imagen de perfil.
Figura 18: Imagen de perfil que coincide con estado "Ahorita no me hablen" |
Por si no quedase del todo claro, este usuario ha querido mostrar por doble vía al mundo o a esa persona que le tiene el alma en vilo que en este momento no está para fiestas. Si es que ya se sabe que esto del amor y las relaciones es como una montaña rusa de emociones, así que sólo nos queda desearle suerte a nuestro amigo.
Hay muchísimos más ejemplos, de usuarios que revelan información sensible acerca de su vida privada, que no he querido incluir en este artículo por motivos evidentes. Usuarios que mencionan en sus estados nombres de personas importantes en su vida, usuarios menores cuya sucesión de fotos de perfil podría dar para un álbum fotográfico completo, así como otros que revelan a través de sus fotos ubicaciones de sus domicilios, aficiones o costumbres. Es muchísima la información valiosa que se puede extraer analizando las fotos de perfil y los estados de cada usuario.
Si sumamos la información que un empleado vierte en su WhatsApp con fotos y mensajes de estados, al final podemos analizar el estado de ánimo de una empresa en un posible esquema de APT analizando las emociones que tiene su personal. Pero no solo eso, antes de un posible ataque o de una intrusión física por medio de técnicas de ingeniería social se podría saber cómo se encuentran hoy los guardias de seguridad y las personas de la recepción. ¿Cuántas veces has ido a una recepción de una empresa o la garita de seguridad y has visto a los empleados que allí trabajan enviando mensajes con el Whtasapp?
Figura 19: Preparar el ataque a una empresa con el WhatsApp de sus empleados |
Realizando consultas sobre la base de datos que hubiéramos construido de una empresa, podrían buscarse usuarios que transmitan sentimientos como el amor, algo que se repite como ya hemos visto en algunos ejemplos, la tristeza, la pena, el cansancio, el desencanto con su trabajo, con los jefes o directamente con la empresa donde están. ¿No sería fácil elegir el turno de seguridad adecuado para hacer la intrusión basándonos solo en el estado de ánimo de las personas que en él trabajan?
Figura 20: usuarios que expresan amor en sus estados |
Respecto a las posibilidades para explotar la información de la última hora en línea para cada usuario, además de mantener un registro constante y periódico de sus conexiones, me pareció interesante analizar también el nivel de dependencia que los usuarios tienen de Whatsapp. Para esto existen muchas aproximaciones.
Una de ellas, bastante simple es realizar una consulta que obtenga los números de teléfono para aquellos usuarios, que de todas las veces que la herramienta haya registrado esta información, nunca hayan dejado de estar en línea más de 2 horas - este umbral es evidentemente adaptable - respecto de la hora que se hace la consulta, dejando un margen de error de X días para no perder usuarios que un determinado día puedan dejar de conectarse por circunstancias excepcionales.
SELECT number,count(*) FROM `lastseen` where days = 0 and hours < '02:00:00' group by number having count(*) > (SELECT floor(count(*)/count(distinct number))-5 from lastseen)
Figura 21: Usuarios que tiene excesiva dependencia de WhatsApp |
Realizando esa consulta, se obtienen por ejemplo una serie de números de teléfono, entre los que se encuentra el mío que también incluí entre la lista de targets. Si observamos el detalle de todas las veces que yo mismo he estado en línea, vemos que en todas las ocasiones me he conectado alguna vez en las dos horas anteriores a la hora de la ejecución de Whatsapp Intelligence salvo un día que transcurrieron casi 3 horas, que casualmente coincidió con un día que estaba viajando en avión. Por ejemplos como este es interesante considerar ajustar los parámetros de la consulta y el margen de error en función del objetivo que se persiga en cada caso.
Opciones de privacidad en WhatsApp
Es necesario aclarar que para para aquellos usuarios que hagan uso de las funcionalidades que Whatsapp pone a su disposición para bloquear el acceso a la foto de perfil solo para contactos conocidos, así como restringir la visualización del estado o la última hora en línea, algo se puede saltar. Es posible averiguar la última hora en línea comprobando constantemente si un usuario está en línea hasta que aparezca con el evento onGetPresence, como también hacen las herramientas Whatsapp Tracker o WhatSpy-Public, aunque si se abusa de este método se corre el peligro de que nuestra cuenta sea baneada.
Figura 22: Opciones de privacidad de WhatsApp |
Para acceder a la fotografía, como ya se contó en la parte anterior, se puede utilizar el bug de las fotos en la versión de WhatsApp Web. Por último, con el estado no hay mucho que hacer. Si se obtiene un estado nulo, es que el número que usamos no está entre sus contactos, así que habría que buscar otra estrategia.
Posibles casos de ataque potenciales
Como se puede ver por todos los ejemplos que he ido exponiendo a lo largo de este artículo, a día de hoy con un sencillo script que haga uso de API's como Whatsapi o Yowsup, alguien que quiera obtener información sensible de una empresa podría utilizar Whatsapp como fuente OSINT con tan sólo disponer de nuestro número de teléfono. Este número, que a pesar de que es un dato privado, es posible de obtener con herramientas como Whatsapp Discover en las redes WiFi de las cafeterías cercanas a la empresa o en los lugares habituales de los empleados. Ya explicaba el Maligno hace tiempo que para hacer un buen pentesting a una empresa antes había que hacer un Wardriving por la zona, en este caso para obtener de las redes WiFi los números de WhatsApp a meter en tu monitor de WhatsApp Intelligence.
También es muy fácil obtener números de teléfono de usuarios de Whatsapp en la red, haciendo un poco de hacking con buscadores, pues a día de hoy son muchos los usuarios que ofrecen Whatsapp como vía de contacto en portales de anuncios, alquileres, o similares, y no digamos ya si al final acaban en los programas de contactos.
Figura 23: Usuarios que facilitan su número de Whatsapp en milanuncios |
Por otro lado, existe todo un horizonte de posibilidades para continuar explotando de manera automatizada la información que se obtiene con Whatsapp Intelligence. Desde intentar correlar las fotos de perfil de los usuarios con posibles perfiles en redes sociales buscando estas imágenes con la API de Google, hasta procesar la información de los emoticonos Emoji que los usuarios incluyen en sus estados, que se corresponden con caracteres Unicode.
Figura 24: Demo de WhatsApp Discover en Mundo Hacker
Todo esto sin olvidar que además de lo que hemos visto en este artículo, analizando el resto del tráfico presente en una captura de paquetes donde se haya obtenido el número de un usuario con Whatsapp Discover también se puede obtener más información interesante, como este ejemplo que enseñé en la demo que hice en Mundo Hacker donde se puede ver el caso de un usuario que en una red WiFi pública de un hotel, que además de chatear por Whatsapp estaba consultando perfiles de Tinder (la famosa aplicación móvil para ligar), teniendo la posibilidad de obtener tanto su foto de perfil de Whatsapp e identificarlo, así como las fotos de los perfiles de Tinder que estaba visualizando.
Figura 25: Herramienta de Eleven Paths para monitorizar Telegram |
El volumen de información que se puede sacar de WhatsApp es grande, ya que se puede monitorizar hasta cuando un empleado llega tarde al trabajo o está viviendo en otra franja horaria - está de viaje -, pero si completamos esta base de datos con otros servicios como Telegram que también permite monitorizar los mismos datos, u otras redes sociales como Twitter, al final se tiene mucha información de una empresa por lo que sus empleados emiten por ellas.
Autor: Deepak Daswani
Sitio web: http://deepakdaswani.es
Twitter: @dipudaswani
Fuente: http://www.elladodelmal.com/
No hay comentarios:
Publicar un comentario