Rails Insights

Construyendo un Escáner de Puertos en Ruby

En el mundo de la ciberseguridad y la administración de redes, un escáner de puertos es una herramienta esencial. Permite a los administradores de sistemas y a los profesionales de la seguridad identificar los puertos abiertos en un dispositivo, lo que puede ayudar a detectar vulnerabilidades. En este artículo, te guiaré a través del proceso de construcción de un escáner de puertos simple utilizando Ruby, un lenguaje de programación conocido por su simplicidad y elegancia.

¿Qué es un Escáner de Puertos?

Un escáner de puertos es una herramienta que se utiliza para enviar solicitudes a puertos específicos en un dispositivo y determinar si esos puertos están abiertos, cerrados o filtrados. Esto se puede hacer mediante el envío de paquetes TCP o UDP y analizando las respuestas. Los escáneres de puertos son utilizados comúnmente por administradores de red para asegurar que sus sistemas estén protegidos y por hackers éticos para identificar vulnerabilidades en sistemas.

Requisitos Previos

Antes de comenzar a construir nuestro escáner de puertos, asegúrate de tener lo siguiente:

  • Ruby instalado en tu sistema. Puedes descargarlo desde ruby-lang.org.
  • Conocimientos básicos de Ruby y programación en general.
  • Acceso a la terminal o línea de comandos.

Configurando el Entorno

Para comenzar, abre tu terminal y crea un nuevo directorio para tu proyecto:

mkdir escaner_puertos
cd escaner_puertos

Luego, crea un archivo Ruby donde escribirás tu código:

touch escaner.rb

Escribiendo el Código del Escáner de Puertos

A continuación, vamos a escribir el código para nuestro escáner de puertos. Abre el archivo escaner.rb en tu editor de texto favorito y comienza a escribir el siguiente código:

require 'socket'

def escanear_puertos(ip, puertos)
  puertos.each do |puerto|
    begin
      socket = Socket.new(:INET, :STREAM)
      socket.connect(Socket.sockaddr_in(puerto, ip))
      puts "Puerto #{puerto} está abierto."
    rescue Errno::ECONNREFUSED
      puts "Puerto #{puerto} está cerrado."
    rescue Errno::ETIMEDOUT
      puts "Puerto #{puerto} está filtrado."
    ensure
      socket.close if socket
    end
  end
end

ip = ARGV[0] || '127.0.0.1'
puertos = (1..1024).to_a

escanear_puertos(ip, puertos)

Explicación del Código

Vamos a desglosar el código para entender cómo funciona:

  • require 'socket': Esta línea importa la biblioteca de sockets de Ruby, que nos permite crear conexiones de red.
  • def escanear_puertos(ip, puertos): Aquí definimos una función que toma una dirección IP y un array de puertos como argumentos.
  • puertos.each do |puerto|: Iteramos sobre cada puerto en el array de puertos.
  • socket = Socket.new(:INET, :STREAM): Creamos un nuevo socket utilizando el protocolo IPv4 y TCP.
  • socket.connect(Socket.sockaddr_in(puerto, ip)): Intentamos conectar el socket al puerto especificado en la dirección IP dada.
  • puts "Puerto #{puerto} está abierto.": Si la conexión es exitosa, imprimimos que el puerto está abierto.
  • rescue Errno::ECONNREFUSED: Capturamos la excepción si la conexión es rechazada, indicando que el puerto está cerrado.
  • rescue Errno::ETIMEDOUT: Capturamos la excepción si la conexión se agota, indicando que el puerto está filtrado.
  • ensure: Aseguramos que el socket se cierre después de cada intento, independientemente de si la conexión fue exitosa o no.

Ejecutando el Escáner de Puertos

Una vez que hayas escrito el código, es hora de ejecutarlo. En la terminal, navega al directorio donde guardaste escaner.rb y ejecuta el siguiente comando:

ruby escaner.rb [IP]

Reemplaza [IP] con la dirección IP que deseas escanear. Si no proporcionas una dirección IP, el escáner utilizará 127.0.0.1 (localhost) por defecto.

Ejemplo de Uso

Si deseas escanear tu propia máquina, simplemente ejecuta:

ruby escaner.rb 127.0.0.1

El escáner comenzará a verificar los puertos del 1 al 1024 y te mostrará cuáles están abiertos, cerrados o filtrados.

Mejorando el Escáner de Puertos

El escáner que hemos construido es bastante básico, pero hay muchas maneras de mejorarlo. Aquí hay algunas ideas:

  • Escaneo de puertos en paralelo: Utiliza hilos para escanear múltiples puertos al mismo tiempo, lo que puede acelerar el proceso.
  • Interfaz de usuario: Crea una interfaz gráfica para que sea más fácil de usar.
  • Opciones de configuración: Permite al usuario especificar un rango de puertos o elegir entre escaneo TCP y UDP.
  • Registro de resultados: Guarda los resultados del escaneo en un archivo para su posterior análisis.

Consideraciones Legales y Éticas

Es importante recordar que el escaneo de puertos puede ser considerado una actividad intrusiva. Asegúrate de tener permiso para escanear cualquier dispositivo que no sea de tu propiedad. El escaneo no autorizado puede ser ilegal y puede tener consecuencias graves.

Conclusión

En este artículo, hemos aprendido cómo construir un escáner de puertos simple en Ruby. Esta herramienta puede ser útil para administradores de sistemas y profesionales de la seguridad para identificar puertos abiertos y potenciales vulnerabilidades. Con un poco de creatividad, puedes expandir y mejorar este escáner para adaptarlo a tus necesidades específicas. ¡Feliz programación!

Published: August 12, 2024

© 2024 RailsInsights. All rights reserved.