Crear un escáner de puertos en Python

Manav Narula 8 octubre 2023
Crear un escáner de puertos en Python

Este tutorial demostrará cómo crear un escáner de puertos en Python.

Crear un escáner de puertos en Python

Primero, aprendamos los conceptos básicos de un puerto. Un puerto es un punto final en una red a través del cual se comunica cierta información entre un servidor y un cliente.

Un escáner de puertos es una aplicación simple que nos permite determinar qué puertos están abiertos para la comunicación en un host determinado.

Usando un escáner de puertos, podemos determinar qué puertos están abiertos para la conexión y conocer los servicios en ejecución de los puertos. Este tipo de herramienta ayuda a probar las medidas de seguridad contra posibles ataques de penetración.

La información se intercambia a través de Internet, generalmente utilizando los protocolos TCP y UDP. Los puertos varían en estos protocolos de 0 a 65535 y se dividen en tres rangos.

Los puertos del sistema varían de 0 a 1023, los puertos de usuario de 1024 a 49151 y cada puerto por encima de este es un puerto dinámico.

Con un escáner de puertos, verificaremos individualmente cada puerto para la conexión y si la conexión es exitosa. Analicemos cómo lograr esto en Python.

  • Importaremos el módulo socket.
  • Crearemos un objeto socket e intentaremos conectarnos a puertos para un servidor host determinado.
  • Emplearemos un bucle for para iterar sobre el rango de puertos e intentar una conexión para cada puerto individualmente.
  • Crearemos una función para probar la conexión y utilizaremos un bloque intentar y excepto para devolver True y False en función del éxito de la conexión.
  • En el bloque try, intentaremos crear una conexión utilizando la función socket.connect(). Si la conexión es exitosa, el bloque devolverá True.
  • Si la conexión no tiene éxito, se generará una excepción, atrapada en el bloque “excepto”, y se devolverá “False”.

Esto se implementa en el siguiente código.

import socket

t = "https://www.hackthissite.org/"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)


def check_port(port):
    try:
        c = s.connect((t, port))
        return True
    except:
        return False


for a in range(200):
    if check_port(a):
        print("Port", a)

El código anterior verificará los primeros 200 puertos para ver si hay algún puerto abierto para la conexión. Tenga en cuenta que solo debemos buscar hosts que nos permitan hacerlo.

Podemos modificar nuestro simple escáner de puertos y agregar algunas características interesantes. Podemos usar la función socket.settimeout() para establecer el tiempo de espera proporcionando el tiempo en la función.

La conexión se cancela si tarda más tiempo que el establecido por esta función.

Otra forma de mejorar el rendimiento del escáner de puertos en Python es utilizar el concepto de subprocesos múltiples. El módulo threads en Python se puede usar para crear y administrar hilos que pueden dar más concurrencia a la aplicación y mejorar el tiempo de ejecución.

Manav Narula avatar Manav Narula avatar

Manav is a IT Professional who has a lot of experience as a core developer in many live projects. He is an avid learner who enjoys learning new things and sharing his findings whenever possible.

LinkedIn