Python para el Pentest. OSINT: Twitter (1)

El termino OSINT se refiere a “Open Source Intelligence” —Inteligencia de fuentes abiertas— y es cada vez más usado en las comunidades de inteligencia. Éste es favorecido principalmente por el auge de las redes sociales, una Internet cada vez mas repleta de información y nuestro escaso criterio a la hora de publicar contenido, —como en el ejemplo del tweet de las detenciones a presuntos miembros de ETA—. El concepto de fuentes abiertas se refiere a inteligencia (cuando hablamos de inteligencia nos referimos a información útil extraída de datos en crudo) que puede ser obtenida de medios públicos y de libre acceso.

Una vez que el lector tiene claro el concepto, tal vez no llegue a vislumbrar el impacto que puede tener, así que vamos a realizar un pequeño PoC que trate de recoger datos de una de las fuentes que más afluente de información tiene: Twitter, y a plasmar en una gráfica los resultados para tener una mejor visión de lo que hemos recogido.

Para esto —siguiendo con la serie— usaré Python, con los siguientes paquetes (en cursiva los que vienen por defecto y que no habrá que instalar):

tweepy
NLTK
json

Es recomendable que usemos para instalar los nuevos paquetes un virtualenv como ya explicamos en el artículo anterior de la serie. Veamos algunos conceptos y herramientas que serán de interés a lo largo del post y nos facilitarán la vida a la hora de obtener grandes cantidades de datos y procesarlos.

El primero de ellos es la API de Twitter. Para acceder a ésta actualmente tenemos tres métodos: el acceso a la API RESTfull, por streaming y el Firehose.

Con la API Firehose tendremos acceso a toda la información de twitter en tiempo real y sin restricciones. El acceso a esta API es de pago y con un precio muy elevado. Algunas empresas tienen acceso al Firehose y revenden el acceso a el en pequeñas porciones. Algunas de estas empresas son @gnip que fue comprada este año por twitter y @DataSift.

Para los que no nos podemos permitir el acceso a esta API nos queda el acceso a la RESTfull y la de streaming. La primera nos permite el acceso a la gestión de nuestra cuenta y recuperación de información pasada, está limitada a un determinado número de llamadas y el contador se resetea cada 15 minutos. La segunda opción se asemeja al Firehose exceptuando que solo podremos escuchar aplicando una serie de filtros y tan solo en el 1% de todo el caudal de datos. Aún a pesar de estas limitaciones, con un poco de ingenio y astucia se pueden hacer herramientas muy potentes sin tener que pagar por un pedacito de Firehose.

Dejemos eso ahí y pasemos ahora al NLTK: Natural Language Tool Kit. Éste, como su nombre indica, es un paquete o más bien una serie de herramientas que nos permitirán usar técnicas de procesamiento de lenguaje natural de una manera sencilla.

Para configurarlo —aunque no sea estrictamente necesario, nos servirá para jugar con este fantástico paquete— debemos abrir una consola y entrar en el REPL de python escribiendo simplemente python en la terminal. Cuando se abra el intérprete debemos importar el paquete e iniciar el asistente de descarga de utilidades.

import nltk
nltk.download()

Una vez que tenemos el prompt Downloader> pulsamos d y en el prompt Identifier> escribimos book. Cuando termine de descargarse repetimos el proceso con el package all-corpora y con esto ya dispondremos de literatura para jugar.

Siguiendo con los preliminares, siempre imprescindibles, veamos ahora qué es JSON y como manipularlo con Python. JSON, acrónimo de JavaScript Object Notation, es un lenguaje que sirve para expresar estructuras de datos con mucha eficiencia y simpleza. La API de Twitter nos devolverá toda la información estructurada en JSON.

Para manipular estructuras JSON, python nos provee del paquete json que nuevamente lo tendremos disponible en nuestro script mediante un import import json. Para evitar importar todo el paquete, es recomendable importar tan solo los módulos que necesitemos, como:

from json import loads
from json import dumps

Así a la hora de cargar un string que represente una estructura JSON e imprimir el resultado solo tendremos que hacer lo siguiente:

dataStr = "{'foo': 'bar'}"
dataDict = loads(dataStr)
print('{0}'.format(dumps(dataDict, indent=3)))

En la siguiente parte de esta serie, crearemos una aplicación nueva en Twitter, y continuaremos trabajando para poder obtener y gestionar datos de Twitter. Manténganse a la espera.