Es un escaner de red muy sencillo
Código #
import argparse
import subprocess
import threading
def get_arguments():
parser = argparse.ArgumentParser(description="Escaner de red ICMP")
parser.add_argument("-i", "--ip", required=True, dest="target", help="Host a escanear")
args = parser.parse_args()
return args.target
def ping(ip):
try:
ping = subprocess.run(["ping", "-c", "1", ip], timeout=0.3, stdout=subprocess.DEVNULL)
if ping.returncode == 0:
print("\n> La IP %s esta activa" % (ip))
else:
pass
except subprocess.TimeoutExpired:
pass
def scan(host_target):
threads = []
for client in range(1, 255):
ip=f"{host_target}.{client}"
thread = threading.Thread(target=ping, args=(ip,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
def parse_target(target_str):
target_splitted = target_str.split(".")
if len(target_splitted) == 4:
host_splitted = target_splitted[:3]
host_target = ".".join(host_splitted)
scan(host_target)
else:
print("< La IP no es válida")
def main():
target_str = get_arguments()
target = parse_target(target_str)
if __name__ == '__main__':
main()
Cómo funciona? #
1. Definir la función main
#
Esta función coordina el flujo principal del programa.
- Llama a
get_arguments
para obtener la IP objetivo desde la línea de comandos. - Llama a
parse_target
con la IP objetivo.
2. Definir la función parse_target
#
Esta función valida y prepara el objetivo de escaneo.
- Divide la IP de entrada en segmentos usando
split(".")
. - Verifica si la IP tiene 4 segmentos.
- Si es válida, toma los primeros 3 segmentos para formar la subred (
host_target
). - Llama a
scan
para esa subred. - Si la IP no es válida, imprime un mensaje de error.
3. Definir la función scan
#
Esta función escanea un rango de IPs en una subred dada utilizando hilos.
- Inicializa una lista
threads
para almacenar los hilos. - Itera sobre un rango de direcciones IP (1 a 254) y crea una IP completa concatenando
host_target
con el número de cliente. - Para cada IP, crea un hilo que ejecuta la función
ping
. - Inicia el hilo y lo añade a la lista de hilos.
- Una vez creados todos los hilos, el programa espera a que todos terminen llamando a
join
en cada hilo.
4. Definir la función ping
#
Esta función realiza un ping a una dirección IP específica.
- Usa
subprocess.run
para ejecutar el comandoping -c 1 <ip>
, donde-c 1
indica enviar solo un paquete ICMP. - Se establece un tiempo de espera (
timeout
) de 0.3 segundos. - Si el comando
ping
devuelve un código de salida0
(indica éxito), se imprime que la IP está activa. - Si ocurre una excepción de tiempo de espera (
subprocess.TimeoutExpired
), se ignora.
5. Definir la función get_arguments
#
Esta función configura y parsea los argumentos de la línea de comandos.
- Se crea un
ArgumentParser
que proporciona una descripción del programa. - Se agrega un argumento obligatorio
--ip
(o-i
) que especifica el host a escanear. - Se parsean los argumentos y se devuelve el valor del argumento
target
(la IP proporcionada por el usuario).