jueves, 12 de enero de 2017

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

Compartir este artículo:
Buenas a todos, en el post de hoy de nuestra cadena "Construyendo nuestro propio escáner de dispositivos conectados a Internet", vamos a añadir una serie de funcionalidades para verificar si alguna de las direcciones IP que estamos analizando es privada, para descartarla de nuestro proceso de estudio:
Para ello, en primer lugar necesitaremos importar una serie de funciones:
from struct import unpack
from socket import AF_INET, inet_pton
A continuación añadiremos una función que nos ayude a comprobar si una dirección IP es privada:
def ip_private(_ip):
    ip = unpack('!I',inet_pton(AF_INET,_ip))[0]
    l = (
        [2130706432, 4278190080],
        [3232235520, 4294901760],
        [2886729728, 4293918720],
        [167772160, 4278190080]
    )
    for addr in l:
        if (ip & addr[1]) == addr[0]:
            return True
    return False
Y finalmente, incorporaremos dicha validación en el cuerpo de nuestro main:
def main(_ip1,_ip2):
    ''' Main function, launch the main activities '''
    ''' You can download GeoIP databases from here: https://dev.maxmind.com/geoip/legacy/geolite '''
    _ip3 = _ip1
    _ip3_prev = ""
    while (_ip3_prev <> _ip2):
        if not ip_private(_ip3):
            print _ip3
            try:
                _id = hosts(_ip3)
                if _id:
                    geo('GeoIP/GeoLiteCity.dat', _ip3, _id)
                    ports(_ip3, _id)
            except:
                print 'Error on: %s' % _ip3
        _ip3_prev = _ip3
        _ip3 = ip_add(_ip3)
Sencillo, ¿verdad?

Para probarlo, podremos realizar un ejercicio tan sencillo como escanear los siguientes rangos de IP:
  • ip1 = '192.167.255.255'
  • ip2 = '192.168.2.255'
Si vemos que solo analiza la primera IP, es que está funcionando de forma adecuada.

Saludos!

No hay comentarios:

Publicar un comentario