Shodan IP dump desde bash

Shodan es un motor de búsquedas que nos permite escudriñar la red como si buscáramos, por definirlo de alguna manera, en una base de datos de todo internet creada por nmap (salvando las diferencias).

Hace unos meses shodan tenía una promoción de aniversario que reducía el precio normal de la cuenta de 49$ a 19$ durante tiempo limitado, por lo que decidí que era el mejor momento para comprar ese servicio que tantas veces me había propuesto.  Lo primero que hice fue pasarme horas probando dorks en la web para conocer los filtros y la forma de presentar los datos de shodan.  Una vez que me sentí cómodo con el entorno y vi que me estaba gustando (enganchando, más bien) quería probar y obtener los resultados de las búsquedas en consola.  En este punto instalé el ‘cliente oficial’ de shodan, escrito en python y que se puede clonar o descargar desde: https://github.com/achillean/shodan-python (más info aquí).  En ese momento mi intención para usar shodan desde consola era, dada una consulta, poder recibir todas las IP’s que coincidieran con los datos de esa consulta.

Como seguía con la novedad, estuve haciendo consultas y pruebas sin parar, hasta que en un punto me saltó un ‘warning’ en la aplicación de consola que decía, a grosso modo, que había superado el límite de consultas, que esperará al mes que viene.  Esto no me sentó nada bien, estaba con mi juguete nuevo, por el que había pagado y no sabía (no me había informado) que tenía un límite!  No me planteé devolver el producto, me gustaba demasiado, pero tampoco quería quedarme “a medias” con la experiencia de uso y como la forma de pensar de los que nos “dedicamos” a esto, es “diferente” (los que estáis leyendo esto sabéis a que me refiero) decidí crear mi propio cliente de shodan desde consola.

Como he dicho antes, mi objetivo al utilizar shodan desde consola era conseguir un ‘dumpeo’ de IP’s dada una consulta, no quería nombres DNS ni ubicaciones ni nada de eso, solo IP’s.  Lo primero que hice fue utilizar la API de shodan desde un script en bash, pero claro, la limitación seguía ahí.  Tras 100 consultas, ya no obtenía más datos; no me servía.  Entonces recordé que cuando empezó todo, con las ‘querys’ en la web, había hecho muchas más búsquedas que desde consola y en ningún momento se había parado el chorreo de resultados.  Aquí estaba la clave, tenía que hacer consultas web, pero desde el terminal.

El primer paso era loguearse en la web desde consola, ya que sin login, muchos filtros no funcionarían, por lo que pegando un vistazo al código de la página de login (https://account.shodan.io/login) podemos ver como se envían las credenciales:

shodan_web_source

Ahora tenía en mente curl y wget para las consultas web y pese a que reconozco que curl es muchísimo más potente, me decanté por wget ya que lo conozco más y me siento cómodo trabajando con él.  Lo primero será loguearnos con nuestro user/pass y guardar la cookie válida obtenida del proceso.  Esto lo podemos hacer con wget de la siguiente manera:

En un primer momento este proceso me dio ciertos problemas (supongo que debido al uso del cloudflare por parte de shodan) hasta llegar al código anterior que me ha funcionado perfectamente.  En la definición del User Agent se puede poner cualquiera que corresponda a un UA real, yo en aquel momento estaba usando Chromium, por lo que es el UA de Chromium.  Terminado este proceso, tenemos una cookie válida almacenada en ‘/tmp/save.txt’ que podemos utilizar como auntenticación en las sucesivas consultas.  Veamos como hacer una consulta con wget, utilizando la cookie guardada anteriormente:

Ahora tendremos un documento llamado ‘result_shodan_download’ en ‘/tmp’ con un contenido similar a este (fragmento):

Este fragmento es el resultado de una búsqueda real con el dork: ‘country:es port:80 title:IIS7’ a fecha: 02/06/2015

Para obtener la información que queremos tendremos que ‘parsear’ este archivo para extraer únicamente las IP’s:

Ahora, si juntamos todo lo anterior en un script, tendremos algo como esto:

Lo podeis clonar desde github:

No es bonito, ni está muy bien programado (lo iré reorganizando a medida que saque tiempo) y para descargar muchos resultados, como va página por página, es más lento que “compilar en una Rasberry-pi™”, pero me sigue dando horas de juego después de gastar las 100 querys que me permite la API oficial:

shipdump.sh descargando 190 IP’s resultantes del dork: ‘country:es port:445 public’ en unos 40 segundos.

Tweet about this on TwitterShare on FacebookShare on Google+Email this to someone

También te podría gustar...

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *