Español | English
rss facebook linkedin Twitter

Tutorial: Footprinting pasivo con ELK y open data


Hoy en día utilizar Shodan, Bing, Google Hacking para encontrar información indexada con propósitos de investigación o auditoria en las diferentes plataformas es una práctica habitual.

Desde hace algún tiempo, tras la aparición de herramientas como ZMap, masscan u otras, han ido surgiendo iniciativas en las que más o menos regularmente se escanean IPv4 en su totalidad y publican los resultados para poder ser utilizados en tareas de investigación, al igual que existen iniciativas que almacenan páginas web en su totalidad (crawlers), y otras de diversa índole.

¿Es posible crearnos nuestro propia plataforma de búsqueda utilizando exclusivamente datos públicos emulando parcialmente las funcionalidades mencionadas (shodan, google hacking, etc..) en un solo 'front-end' ? Sí, es posible y a continuación os queremos mostrar una prueba de concepto:

Para empezar necesitamos fuentes de información pública y a poder ser gratuita con información útil para luego poder trabajar con ella. Entre otras fuentes, podemos empezar con:
Opcionalmente podríamos ampliar las fuentes de información con:
Para hacer una prueba inicial no utilizaremos el 100% de la información disponible (Terabytes de información pública), y en caso de querer generar una plataforma seria, se requieren recursos de almacenamiento, procesamiento y accesibilidad específicos y no es el objetivo principal de este Post, por lo que vamos a acotar la cantidad de información que vamos a utilizar para poder confirmar la viabilidad y usabilidad. Ampliar la cantidad de información requiere un estudio de infraestructura más específico (probablemente en la nube).

  • De ripe.net vamos a indexar ripe.db.inetnum.gz para intentar simular (parcialmente) la funcionalidad de búsquedas de texto en la base de datos RIPE (https://apps.db.ripe.net/search/full-text.html).
  • De scans.io nos vamos a centrar en el escaneo del puerto 80 para IPv4 y dado que contiene más de 67 millones de direcciones IP, vamos a acotarlo a los primeros 5 millones de ellos.
  • De commoncrawl.org vamos a utilizar solo unos 100.000 documentos (de sus más de 1.81 billones de páginas). Será suficiente para realizar búsquedas sencillas y comprobar qué tipo de resultados se podrían obtener.
  • De MaxMind.com vamos a utilizar GeoLiteCity en su formato binario, para poder relacionar direcciones IP con su geo localización aproximada.
Bien, ahora que tenemos una pequeña base de información para trabajar, utilizaremos la pila ELK en sus funciones más básicas para indexar y trabajar con la información obtenida. Pero antes veamos a grandes rasgos cuales son los componentes de la pila ELK.



La pila ELK (https://www.elastic.co/products) se compone principalmente de tres componentes (de código abierto):
  • Elasticsearch: Es una base de datos "Schema-less", con significativas capacidades de búsquedas de texto y escalable donde residirá la información.
  • Logstash: Es un recolector de información, que se caracteriza por disponer de múltiples plugins de entrada y salida. Con logstash podremos homogeneizar múltiples formatos de entrada diferentes en un único formato de salida ( o varios) y a su vez aplicar modificaciones intermedias para obtener un resultado final personalizado. Evidentemente, entre otros, dispone de un plugin de elasticsearch tanto para gestionar entrada como salida de datos.
  •  Kibana: Es una herramienta para análisis de información y creación de paneles de control, trabajando contra la información almacenada en elasticsearch.


Ahora tenemos una visión básica de la pila ELK, ahora empecemos a trabajar con ella.

Con logstash vamos a indexar los diferentes formatos en elasticsearch (para RIPE puede interesarnos realizar un tratamiento previo y convertirlo a formato JSON).
Elasticsearch lo utilizaremos para indexar la información y distribuirla por índices según tipo.

Y finalmente Kibana será el 'front-end' que utilizaremos para realizar consultas DSL de forma sencilla y opcionalmente crear el grupo de gráficos que deseemos.

Empecemos con logstash. Como comentamos anteriormente puede ser interesante convertir los datos de RIPE a JSON para no tener que crear un plugin específico para logstash. Esto se puede hacer fácilmente con un mini script tal que:


    Conversión a JSON de datos RIPE (Python)

Y una vez convertido, utilizaremos el plugin de entrada 'file' y el plugin de salida 'elasticsearch' de logstash para indexar la información en elasticsearch.

Configuración logstash para indexación de datos de RIPE en elasticsearch

Los datos de HTTP (scans.io) ya vienen dados en un formato JSON, por lo que sólo hemos de personalizar un poco más el filtro para indexar la información.


Filtro en configuración logstash para indexación de datos de scans.io (HTTP)

Adicionalmente en el plugin de salida 'elasticsearch' le indicaremos que utilice nuestra plantilla personalizada, para que no entienda el campo 'ip' como string y sí como dirección IP y así poder realizar búsquedas por IP's o rangos de estas.

Las directivas a incluir en el bloque elasticsearch { ... } serían:
template => "F:/elasticsearch-template.json"
template_overwrite => true
En la plantilla original de elasticsearch solo hemos de añadir la línea siguiente en el bloque "properties" : { ... }:
"ip": { "type": "ip"},

Perfecto, ya tenemos las configuraciones de logstash y toca indexar .
$ /path/to/elkstack/elasticsearch/bin/elasticsearch
$ /path/to/elkstack/logstash/bin/logstash -f ConfiguracionRipe.cfg
$ /path/to/elkstack/logstash/bin/logstash -f ConfiguracionHTTP.cfg

Una vez tengamos los datos indexados (puede requerir una cantidad de tiempo considerable), resta ejecutar kibana para poder acceder a la información:
$ /path/to/elkstack/kibana/bin/kibana

Veamos con imágenes algunos casos de uso (sin objetivo concreto) para ver las posibilidades de la información indexada.

Utilizando los datos de RIPE, podemos simular parcialmente su funcionalidad de búsquedas de texto.

    Búsqueda de rangos con cierta relación a un patrón establecido y no pertenecientes a España.


Con los datos del escaneo del puerto 80 (IPv4) podemos intentar localizar diferentes servidores de aplicaciones (esta búsqueda se podría realizar igualmente con los datos proporcionados por commoncrawl.org).

    Localización de servidores de aplicaciones JBoss en los datos proporcionados por scans.io

Al igual que es posible acotar los resultados anteriores en rangos de direcciones IP dadas.

    Localización de servidores de aplicaciones JBoss en un rango determinado

Y por qué no, también es posible intentar localizar potenciales problemas de seguridad.

    Localización de errores de sintaxis SQL en datos proporcionados por commoncrawl.org

A partir de aquí, para una aproximación más seria, tendríamos que indexar todos los datos posibles (toda la información del año 2015 aportada en scans.io, el 100% del crawling publicado en Common Crawl, y añadir información WHOIS de todos los TLD posibles e incorporar fuentes de datos propios) y opcionalmente crear un front-end más personalizado que provea por ejemplo la posibilidad de generar informes con los datos obtenidos de búsquedas cruzadas con las múltiples fuentes de información (angularjs+bootstrap, PHP, .NET, nodejs, rails, django serían opciones válidas, aunque hay opciones para todos los gustos).

Para terminar, siempre hemos de ser conscientes del contexto en que estamos trabajando. Es imprescindible echar un ojo a los problemas de seguridad de las tecnologías que vamos a utilizar, ya que de inicio, podríamos considerarlo inaceptable para nuestros propósitos según su estado de seguridad.
  
https://www.elastic.co/community/security

S21sec
Eugenio Delfa

2 comentarios:

Anónimo dijo...

Grande Eugenio!!! saludos desde mexico! Apoco!

Anónimo dijo...

Grande Eugenio!! Saludos desde mexico! Apoco!!


(+34 902 222 521)


24 horas / 7 días a la semana



© Copyright S21sec 2013 - Todos los derechos reservados


login