Puertos abiertos: cómo podrían atacarlos y qué pueden hacer

Estamos seguros que todos vosotros en alguna ocasión habéis tenido que «abrir un puerto», o mejor dicho, hacer el «reenvío de puertos» en el router, ya que todos los equipos de la red local están detrás de la NAT. Para poder acceder desde Internet a estos dispositivos que están en la red local, tenemos que «abrir un puerto» o hacer «Port forwarding» en el router, de lo contrario, no podremos acceder desde Internet a dicho servicio (servidor SSH, servidor FTP, servidor OpenVPN etc.) Hoy en RedesZone os vamos a explicar qué significa que un puerto esté abierto, cómo podrían atacar los puertos abiertos y qué podrían hacer.

¿Qué significa que un puerto esté «abierto»?

Las comunicaciones a nivel de capa de transporte, usando los protocolos TCP y UDP principalmente, hacen uso de lo que se denomina como «socket de Internet». Este socket constituye un mecanismo por el cual dos procesos (aplicaciones, por ejemplo) pueden intercambiar datos a través de la red local o a través de Internet. Cualquier flujo de datos que haga uso de TCP o de UDP necesita como mínimo la siguiente información:

  • IP de origen
  • Puerto de origen
  • IP de destino
  • Puerto de destino

En una red local, de forma completamente automática y transparente se están continuamente abriendo y cerrando puertos por parte de los diferentes procesos para poder comunicarse con otros equipos. Para que dos procesos puedan comunicarse, es necesario que un proceso pueda «localizar» al otro para obtener servicios o proporcionarle servicios.

esquema del 3-way handshake

Cuando definimos que un «puerto esté abierto», puede ser en dos escenarios muy diferentes:

  • Un puerto abierto en un equipo local, por ejemplo, en nuestro ordenador o en un servidor local. En principio, todos los puertos deberían estar cerrados porque el firewall normalmente se configura de forma restrictiva (todo bloqueado excepto lo que está específicamente permitido).
  • Un puerto abierto en la NAT del router. Normalmente en el router no tenemos ningún puerto «abierto», o, mejor dicho, no tenemos en la sección de «Servidor Virtual» o «Port Forwarding» ningún puerto hacia ningún equipo. De forma predeterminada en cualquier router esta tabla está vacía, sin embargo, podremos dar de alta diferentes reglas para abrir puertos a diferentes equipos.

¿Cuándo necesitamos abrir puertos localmente?

Si nuestro equipo local actúa como servidor «de algo», como, por ejemplo, servidor FTP, servidor web, servidor SSH, servidor VPN, servidor de base de datos y un largo etcétera, tendremos que tener un puerto o varios puertos abiertos en el firewall para que los diferentes equipos de la red local o Internet puedan acceder a nuestros servicios, de lo contrario, no podrán acceder porque el cortafuegos bloqueará esta comunicación y no se establecerán las conexiones.

Normalmente en un entorno doméstico, si configuramos Windows 10 o un sistema operativo basado en Linux como «Red privada» o «Red doméstica», el firewall se encuentra desactivado y se permitirán todas las conexiones entrantes. Sin embargo, si lo tenemos como «Red pública» el firewall estará activado y bloqueará todas las conexiones entrantes que previamente nosotros no hayamos realizado de forma saliente, por tanto, estamos ante un firewall «restrictivo».

¿Cuándo necesitamos abrir puertos en la NAT del router?

Si tenemos un ordenador de la red local que actúa como un servidor «de algo», como en el caso anterior, y queremos que estos servicios sean accesibles desde Internet, será necesario hacer un «reenvío de puertos» o también conocido como «abrir puertos». De esta forma, si alguien abre un socket con la dirección IP pública y un correspondiente puerto externo, automáticamente ese flujo de datos será reenviado al equipo al que le «hemos abierto los puertos».

Cualquier router de forma predeterminada no tiene ninguna regla para realizar reenvío de puertos, tendremos que hacerlo nosotros de manera específica. Además, un detalle muy importante es que si tu operador tiene CG-NAT, aunque abras un puerto en el router de forma externa, no podrás hacer nada para acceder a los recursos internos de la red local.

¿Cómo se ataca un puerto?

Realmente no se puede «atacar» un puerto, lo que se ataca es el servicio que hay detrás de ese «puerto» que está escuchando para aceptar las conexiones entrantes. Por ejemplo, si tenemos abierto el puerto 5555 y aquí está configurado un servidor FTP, lo que se hará es atacar al servicio de FTP, pero no al puerto. El puerto no deja de ser una «puerta» de entrada a la información, lo que verdaderamente se ataca son a los servicios detrás de estos puertos.

Comúnmente se utiliza el término atacar un puerto, cuando realmente se debería decir «hacer un escaneo de puertos» para comprobar qué puertos hay abiertos en un determinado equipo, para posteriormente atacar a los servicios que hay detrás de este servicio en concreto. Para hacer un escaneo de puertos hay muchos métodos, pero, sin lugar a dudas, el mejor que podemos utilizar es realizar un escaneo con Nmap, el programa por excelencia de descubrimiento de hosts y escaneo de puertos, además, también permitiría su explotación a través de NSE que es un añadido a Nmap con la posibilidad de crackear diferentes servicios y explotar vulnerabilidades conocidas.

Nmap es un programa muy fácil de utilizar, basta con instalarlo en cualquier sistema operativo basado en Linux para empezar con su funcionamiento, está en los repositorios oficiales de cada distribución, por tanto, basta con ejecutar el siguiente comando:

sudo apt install nmap

Una vez instalado, tendremos que ejecutar el comando específico para ver si un puerto está abierto, filtrado o cerrado:

nmap -p PUERTO IP

También podríamos escanear un rango de puertos de la siguiente forma:

nmap -p PUERTOINICIAL-PUERTOFINAL IP

Por ejemplo, si tenemos un servidor web con HTTP y HTTPS funcionando, es completamente normal que tengamos los puertos 80 y 443 abiertos, como este:

Comprobar puertos abiertos, filtrados o cerrados con Nmap es sencillo, no obstante, os recomendaríamos leer la completa wiki de Nmap donde tenemos manuales detallados paso a paso de los diferentes tipos de escaneo de puertos que tenemos disponibles.

¿Qué puede hacer un ciberdelincuente con un puerto que está abierto?

Cuando tenemos un puerto abierto, se pueden dar varias casuísticas entorno a qué puede hacer o no un ciberdelincuente. Si tenemos un puerto abierto, pero no hay ningún servicio detrás escuchando, no podrá hacer absolutamente nada, sin embargo, podría «guardarse» el número de puerto abierto por si en un futuro sí ponemos un servicio a escuchar.

Si tenemos un puerto abierto y sí hay un servicio por detrás escuchando, podría realizar muchas acciones:

  • Hacer uso de forma legítima para comprobar su funcionamiento
  • Si el servicio necesita autenticación, podría realizar un ataque por fuerza bruta o diccionario para acceder al servicio.
  • Realizar un ataque de denegación de servicio para que el servicio deje de funcionar correctamente y deje de prestar servicio.
  • Explotar una vulnerabilidad de seguridad en el servicio, ya sea para acceder ilegítimamente a los recursos del servicio, para entrar al sistema, e incluso para realizar una escalada de privilegios y tomar el control total del servidor.

Tal y como podéis ver, con un puerto abierto y un servicio corriendo detrás, un ciberdelincuente podrá realizar muchas acciones maliciosas, por tanto, es muy importante proteger los servicios que hay detrás de este puerto, para protegerlos, es recomendable realizar las siguientes acciones:

  • Configurar correctamente el firewall para permitir acceso solamente a quien realmente lo necesite, por ejemplo, puedes filtrar por países.
  • Para mitigar los ataques DoS, puedes configurar en el firewall reglas para denegar demasiadas conexiones simultáneas con la misma IP de origen.
  • Puedes instalar un programa como fail2ban para detectar múltiples intentos de inicio de sesión, para posteriormente decirle al firewall que bloquee la IP de origen.
  • Realizar hardening al servicio que hay escuchando, ya sea un servidor SSH, FTP o servidor web, siempre hay configuraciones avanzadas en estos servicios para protegerlos aún más.
  • Realizar un hardening al sistema operativo que está alojando el servicio, definiendo políticas robustas de autenticación, actualización del sistema, e incluso usar sistemas avanzados como SELinux entre otros.

Hay muchas medidas de seguridad que podemos aplicar a un sistema y servicio para estar más seguros, pero debes tener en cuenta que la seguridad al 100% no existe, por tanto, debes estar preparado para un incidente y poder recuperar el sistema.