lunes, marzo 09, 2015

Whatsapp Intelligence: Whatsapp como fuente OSINT [1 de 3]

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

Fuentes OSINT y Whatsapp

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.

Autor: Deepak Daswani
Sitio web: http://deepakdaswani.es
Twitter: @dipudaswani

****************************************************************************************
- Whatsapp Intelligence: Whatsapp como fuente OSINT [1 de 3]
- Whatsapp Intelligence: Whatsapp como fuente OSINT [2 de 3]
- Whatsapp Intelligence: Whatsapp como fuente OSINT [3 de 3]
****************************************************************************************

3 comentarios:

  1. Hay un curioso problema con los acentos en el artículo.

    Más allá de eso, muy interesante!

    ResponderEliminar
  2. No entiendo nada jaja pero debe ser muy bueno

    ResponderEliminar
  3. Espero que las demás partes que faltan sean tan instructivas como esta.
    Atentamente un lector.

    ResponderEliminar