En el artículo de hoy vamos a programar para entender el funcionamiento de un escáner de puertos, haremos una herramienta que sea funcional para esta tarea a pesar de que yo siempre haya utilizado nmap, pero realizar esta tarea de programación nos hará comprender mejor el funcionamiento del mismo.
Lo primero será importar las librerías que vamos a utilizar, serán sys y socket, pero también importaremos datetime para marcar las horas de nuestros escaneos.
A continuación, escribiremos nuestro main y un KeyboardInterrupt para poder cerrar nuestro programa.
Definiremos la función main con dos input, el primero será para introducir la IP que queremos escanear, el segundo para introducir (desde 0) el número de puertos que queremos escanear.
Daremos una salida por pantalla de la IP elegida, así como de la hora a la que inicia nuestro escaneo, eso lo haremos desde la librería datetime que hemos importado convirtiendo en un string la función datetime.now
Con la función for recorreremos los puertos que hemos marcado en la variable del mismo nombre, en la variable s con la función socket, marcaremos en primer lugar que es para IPV4 y en segundo los puertos que debe recorrer. Socket.setdefaulttimeout nos sirve para indicar cuanto tiempo sin respuesta debe esperar el escáner, nosotros marcaremos 1 segundo y finalmente lo sacamos por la variable result.
Añadiremos en nuestra variable puerto un + 1 ya que el for al recorrer el rango se nos quedara en uno menos de los que hayamos marcado, recordemos que siempre empieza en 0 como valor.
Para acabar la salida la completaremos con un if que en un resultado binario (0 o 1) si el resultado es 0 significará que el puerto está abierto, no añadiremos un else debido a que si escaneamos los 65535 puertos el listado de puertos cerrados será excesivo.
Finalizado nuestro código tal y como lo hemos hecho tendría que verse así.
La siguiente parte en el desarrollo del código es probarlo, voy a abrir una máquina virtual con metasploitable que sé que tiene varios puertos abiertos para probarlo, así que compruebo la IP de la máquina.
Una vez encontrada la IP objetivo iniciamos nuestro programa y le proporcionamos tanto la IP como los puertos que queremos escanear.
Verificamos que funciona.