jueves, 8 de diciembre de 2016

Construyendo nuestro propio escáner de dispositivos conectados a Internet. Parte 2

Compartir este artículo:
Buenas a todos, en el post de hoy continuaremos construyendo nuestro escáner de dispositivos conectados a Internet.  Hoy, vamos a comenzar el código del analizador, el cual implementaremos con Python por practicidad, potencia y por la cantidad de información existente en Internet, lo cual os ayudará de cara a ampliar sus capacidades en el futuro, reutilizando módulos que ya se encuentren programados.

El desarrollo lo haré con Visual Studio Code, y el módulo PythonVSCode (https://github.com/DonJayamanne/pythonVSCode), que nos facilitará enormemente la revisión del código y la implementación:


Bien, una vez que tengáis vuestro IDE preferido para desarrollar, vamos a crearnos una carpeta para el proyecto, el cual hemos denominado (temporalmente y hasta que lo bauticemos), FluScan. A su vez, dentro crearemos un archivo al que nombraremos como FluScan.py y una subcarpeta, a la que llamaremos GeoIP. En esta carpeta almacenaremos las bases de datos de geolocalización que comentamos en el pasado post. Estas bases de datos las podremos obtener de numerosas fuentes. Sin duda, las mejores son de pago, pero como nuestro objetivo es meramente académico, me he decantado por unas bases de datos "Lite", que podremos descargarnos gratuitamente desde el siguiente sitio web:



Una vez descargadas, deberemos descomprimirlas en la carpeta que hemos creado antes. Ahora solo nos faltará llamarlas desde nuestro código.

Para poder interactuar con estas bases de datos, utilizaremos el módulo de Python, pygeoip:


Este módulo podréis instalarlo con pip:


Si habéis seguido todos los pasos, tendréis el siguiente esquema de archivos:


Y dentro de GeoIP:

¡Perfecto! Con todo ello, hoy veremos un sencillo ejemplo para geolocalizar una dirección IP. Para ello os comparto a continuación el siguiente código python:

import pygeoip

def geo(_file,_ip):
    geoDb = pygeoip.GeoIP(_file)
    print geoDb.record_by_addr(_ip)

def main(_ip):
    ''' You can download GeoIP databases from here: https://dev.maxmind.com/geoip/legacy/geolite '''
    geo('GeoIP/GeoLiteCity.dat', _ip)

if __name__ == "__main__":
    print 'FluScan, an IPv4 scanner. Created by http://www.flu-project.com\n'
    main('8.8.8.8')

El cual tras su ejecución nos dará el siguiente resultado:

administrator@administrator-MacBookPro:~/FluScan$ python FluScan.py
FluScan, an IPv4 scanner. Created by http://www.flu-project.com

{'city': u'Mountain View', 'region_code': u'CA', 'area_code': 650, 'time_zone': 'America/Los_Angeles', 'dma_code': 807, 'metro_code':
'San Francisco, CA', 'country_code3': 'USA', 'latitude': 37.385999999999996, 'postal_code': u'94035', 'longitude': -122.0838, 'country
_code': 'US', 'country_name': 'United States', 'continent': 'NA'}


Pygeoip nos da una gran potencia para jugar con los datos referentes al geoposicionamiento, y nos será de gran utilidad para dotar de nuevas funcionalidades a nuestro escáner, pero eso será para un próximo artículo.

Saludos!

lunes, 5 de diciembre de 2016

Construyendo nuestro propio escáner de dispositivos conectados a Internet. Parte 1

Compartir este artículo:
Buenas a todos, en el post de hoy me gustaría iniciar una cadena de artículos sobre escaneo de dispositivos conectados a Internet, con la idea de que podáis introduciros en el campo del footprint y el fingerprint de activos (al más puro estilo Shodan) y construiros vuestras propias bases de datos de información.

En Internet existen varias aproximaciones de empresas y particulares que han intentado resolver el complejo problema de obtener un listado lo más actualizado posible, con todos los activos conectados a Internet (webcams, impresoras, ftps, servidores web, scadas, etc. etc.), y uno de ellos, Shodan.io, es el que parece haber logrado los mejores resultados, ya que actualmente es el buscador más utilizado para estas tareas. Por ello, lo primero que haremos hoy será aprender de los mejores, y estudiar que tipo de información obtienen, y cómo podríamos obtenerla nosotros.

Tened en cuenta varias cosas antes de meternos en harina. Hay infinidad de formas de obtener la información que vamos a ver en este post, pero nos interesará la más óptima. ¿Por qué? La respuesta es sencilla, ¿os habéis planteado los millones de IPv4 e IPv6 existentes en Internet y el tiempo que tardaríamos en analizarlas todas? ¿Y que cuando acabásemos, es altamente probable que muchos hosts ya no existan, y habrá que volver a escanear? ¿Sí? ¡Me alegro! Es el primer paso para reconocer que no es una labor trivial, y por ello son pocos los servicios existentes en la actualidad.

Por otro lado, tenemos el gran problema del almacenamiento. ¿Dónde almacenaríamos todos estos TB de información? Es por ello que en esta cadena de posts solo veremos una base, con fines académicos, para que podáis aprender a caminar solos, y escanear una parcelita controlada de Internet, que podáis almacenar de forma sencilla en cualquier disco duro que tengáis por casa.

El primero de los grandes proyectos que os quería presentar, es el de dos buenos amigos, Rafa y Fran, Mr looquer. Un buscador de servicios para IPv6, que a mí personalmente me encanta:




Os dejo su cuenta de Twitter para que podáis seguirlos:


Sin embargo, en esta cadena de posts vamos a dejar IPv6 a un lado, ya que cómo recordaréis los que nos seguís habitualmente, estamos dedicando una cadena exclusiva a IPv6 y a sus ataques. Y por ello, vamos a estudiar otro gran proyecto del que os hemos hablado en infinitas ocasiones, Shodan.io, el cual no hará falta introducir.

Si buscamos en shodan por ejemplo, "webcam", encontramos 3.400 resultados:



Haciendo clic en uno de ellos al azar, veremos numerosos datos de cada uno de los activos escaneados, los cuales procedemos a listar a continuación:

  • Country: el primer dato que nos encontramos es el país dónde se encuentra ubicado el dispositivo. Este es un dato que podremos obtener de forma sencilla consultando en un tercero (existen muchos servicios gratuitos con un API, que dada una IP devuelven el detalle sobre su ubicación). Sin embargo hay que tener en cuenta que cómo realicemos muchos escaneos seguidos, acabaremos baneados. Y a menos que utilicemos proxys que automáticamente vayamos balanceando... puede que no sea una buena aproximación. Otra opción será descargarnos una bbdd de direcciones IP, e irla actualizando cada poco tiempo.Si utilizásemos Python como lenguaje para programar nuestro escáner, Pygeoip podría ser un módulo muy útil para ello: https://pypi.python.org/pypi/pygeoip 


  • Organization e ISP: este dato lo podremos obtener de numerosas maneras, las cuales iremos viendo próximamente.
  • Last Update: última fecha a la que el escáner accedió a la dirección IP. Fácil de obtener desde nuestro código.
  • Hostnames: este dato lo podremos obtener de forma simple con nslookup (https://es.wikipedia.org/wiki/Nslookup), disponible en todos los sistemas operativos. A continuación os comparto el resultado para una IP de Facebook:

  • Ports: los puertos abiertos del host escaneado. Hay infinidad de escáneres que podremos utilizar. Pero ¡ojo!. En algunos países un escaneo de puertos es considerado cómo un ataque, por lo que es recomendable limitar los puertos a escanear, y realizar el proceso de la manera más liviana y menos molesta.
  • Services: la verdadera "chicha" de todo el proyecto, el detalle de los servicios que se encuentran escuchando tras los puertos abiertos, y que prestan servicio a los diferentes usuarios de Internet para los que se han publicado.
Si no tenéis tiempo (o ganas) de programar todo esto, y queréis obtener resultados rápidos, siempre podéis hacer uso directo del API de Shodan, que por 499 $ mensuales nos proporciona acceso total al servicio:





Pero... cómo aquí estamos para aprender :), en los próximos posts comenzaremos a trastear con código para sentar las bases de nuestro futuro escáner.

Saludos!
Related Posts Plugin for WordPress, Blogger...