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:
Sencillo, ¿verdad?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)
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