Skip to main content
  1. Scripts/
  2. Python/

Escaner de red ICMP

·444 words·3 mins· ·
Escaner Reconocimiento ICMP Red
Fouen
Author
Fouen
Soy un joven informatico interesado en la ciberseguridad
Table of Contents
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 comando ping -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 salida 0 (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).