Saltar al contenido

Probar puertos abiertos en Linux desde el terminal

Probar puertos abiertos en Linux desde el terminal

Algunos de los que me seguís usuarios ávidos tecnológicamente, otros sois administradores de sistemas o trabajáis en el campo de la ciberseguridad. Doy por hecho que muchos conocéis al menos un método para descubrir puertos abiertos en sistemas Linux o UNIX, pero hoy vamos a incidir más en el tema.

Personalmente siempre me gusta conocer varios caminos para llegar a un mismo punto. Así, si uno de esos caminos se nos cierra por cualquier motivo, tendremos armas para cumplir nuestra misión

Es decir, que si habitualmente utilizas el clásico telnet <IP> <puerto> para verificar la conectividad con un puerto remoto y de repente te encuentras que telnet no está instalado y no puedes instalarlo, habrá una utilidad que te dé la información. Vamos allá.

Probar puertos remotos y locales en equipos UNIX o Linux

Este artículo quiero que ofrezca una respuesta lo más completa posible, así que he tenido en cuenta los dos escenarios: puertos locales y puertos remotos.

Sin embargo he hecho más énfasis en pruebas de puertos remotos, primero porque suele ser la necesidad a cubrir, y segundo porque las mismas utilidades que nos permiten verificar puertos remotos nos permitirán hacer peticiones a puertos locales, redirigiendo la consulta a localhost o 127.0.0.1.

Comprobar puertos locales en Linux

La consulta de puertos locales en cualquier sistema operativo nos puede servir para auditar la seguridad (ver con qué equipos se comunica nuestro servidor en tiempo real) o para diagnosticar el funcionamiento del software que hace uso de interfaces de red, entre otros.

SS

Tal y como se indica en la man page de SS, se trata de una herramienta de análisis estadístico de sockets (un socket es la unión de una dirección IP con un puerto concreto, que forman un todo). Funciona de forma similar a netstat, aunque puede mostrar más información y es más fácil de usar la sintaxis.

Veamos algunos ejemplos de utilización.

ss -l

La opción -l significa «Listening»,  sirve para buscar puertos que están escuchando conexiones.

Una forma eficiente de usar este comando sería la siguiente:

ss -anp | grep <IP/puerto>

Donde:

  • -a es todos
  • -n muestra el número de puerto
  • -p muestra el proceso asociado

Finalmente se la hace un grep para filtrar mejor la salida y descartar información irrelevante.

Netstat

Sirve para visualizar conexiones de red activas, tablas de enrutamiento, estadísticas de interfaces de red y otros datos. Favorita para muchos aún hoy en día, lo cierto es que está deprecada en favor de la anteriror (ss). En cualquier caso, la encontraremos en muchos sistemas por defecto y es fiable.

Sintaxis

netstat -anp | grep <nº puerto>

Donde:

  • -a es todos
  • -n muestra el número de puerto
  • -p muestra el proceso asociado

Otra combinación de opciones muy popular es:

netstat -tulpn | less

Las opciones p y n son las ya descritas

  • -u muestra protocolo udp
  • -t muestra protocolo tcp
  • -l muestra puertos o sockets escuchando (listening)

Comprobar puertos remotos en Linux

Verificar puertos en un servidor o equipo de red remoto sirve para lo mismo que hacerlo en puertos locales, además de ayudarnos a hacer un primer análisis del funcionamiento de la red o software que hace uso de la misma.

Telnet

El clásico telnet de toda la vida nos permitirá hacer peticiones a puertos remotos tanto en sistemas Windows como Linux, es agnóstico a plataformas. Eso sí, en ambas deberemos instalarlo y para ello contar con privilegios de administrador.

NOTA: Telnet no es una buena herramienta para integrar en scripts. SI tu objetivo es ese, te recomiendo revisar otras como Netcat o Nmap.

Telnet nos permite además leer las cabeceras de los servicios a los que conecta. Por ejemplo si atacamos hacia un puerto 22 es probable que veamos la cabecera que describe ese servicio algo como «OpenSSH 2.0»

La sintaxis es la que sigue:

telnet <host> <puerto>

O bien:

start telnet <host> <puerto>

Esta última opción en sistemas Windows permite que la conexión se abra en ventana nueva y de esta forma no perdemos el terminal.

Nmap

Nmap o Network Mapper es una herramienta open source válida para auditoría de redes y también auditoría de seguridad, pudiendo lanzar incluso scripts contra servicios vulnerables. La información que puede ofrecer es inmensa y valiosa, por lo que sigue siendo sin duda the way to go siempre que esté disponible.

Para el caso que nos ocupa, podemos usar alguna de estas variantes:

Escanear uno/varios puertos.

Separaremos con un guión el primero y el último:

nmap -p 80-995 192.168.1.43

Escanear todos los puertos de un host

nmap -p- 192.168.1.43

Más comandos y pautas para utilizar Nmap.

Netcat

Nc o Netcat se utiliza para una gran variedad de objetivos relacionados con redes y sus diferentes protocolos. Puede hacer cosas desde abrir conexiones TCP/UDP, enviar paquetes, escuchar en puertos de nuestra elección, realizar un escaneo de puertos…

Permite escribir la salida a un fichero local, con lo que perfectamente vale para traspasar ficheros y de hecho se utiliza en ciencia forense informática para exfiltrar archivos de sistemas cuando es preciso un análisis en vivo (con el sistema funcionando) sin provocar modificaciones que invaliden la investigación.

Escaneo de un puerto con Netcat

nc -zv 127.0.0.1 80

Analizar varios puertos con Netcat

nc -zv 127.0.0.1 22 80 443

Analizar un rango de puertos con Netcat

nc -zv 127.0.0.1 20-30
nc -w2 127.0.0.1 22 </dev/null

Nota: el valor w hace referencia al «wait» time, valor que quizá nos interese controlar si vamos a examinar muchos puertos o si queremos incluir el comando en un script.

Nping

Otra herramienta open source que nos permite generar paquetes de red, analizar respuestas y tiempos de respuesta. Nos permite generar paquetes para varios protocolos, tanto para hacer ping como para generar paquetes en raw.

Sintaxis

sudo nping  --tcp -p <puerto> <host>
sudo nping  --udp -p <puerto> <host>

Ejemplo:

sudo nping -tcp -p 443 protegermipc.net

Socket TCP (bash)

Uno de mis preferidos por cuanto, haciendo uso del terminal de Linux, podemos aprovecharnos de una utilidad ya incluida en todos los sistemas Linux/*NIX para crear sockets específicos, tal y como dice la man page:

If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a TCP connection to the corresponding socket.

La sintaxis es la que sigue:

/dev/tcp/127.0.0.1/6

Sin embargo, para entender mejor la salida crearemos una pequeña expresión regular con los significados de cada resultado. Además, añadiremos delante de la ruta un símbolo < o ( para que, al no poder escribir en la ruta /tcp/ y dar error, este error no se escriba en pantalla, aunque también podemos emplear la tradicional salida filtrada a /dev/null.

timeout 1 bash -c ‘</dev/tcp/127.0.0.1/22 && echo Puerto abierto || echo Puerto cerrado’ || echo Timeout de conexión

El timeout lo utilizamos para que el comando no exceda el tiempo indicado en segundos.

Resultado:

Probar puertos remotos en Linux con Socket TCP_protegermipc

Socket UDP (bash)

De modo sismilar a lo anterior, podemos intentar abrir un socket remoto (socket = IP + puerto) mediante el protocolo UDP.

Ejemplo:

timeout 1 bash -c '</dev/udp/127.0.0.1/6 && echo Puerto abierto || echo Puerto cerrado' || echo Timeout de conexión

Resultado:

Probar puerto remoto con socket UDP y bash en Linux

Curl

El clásico curl del que mucha gente no suele acordarse, otra herramienta con solera en el mundo Linux y que vale para bastantes cosas. Su descripción nos dice que es:

Una herramienta para intercamabiar datos hacia/desde un servidor, utilizando alguno de los métodos soportados (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP o FILE). Está diseñado para funcionar con interacción de usuario.

Al ser orientada a protocolo, normalmente lo especificaremos, por ejemplo:

curl http://127.0.0.1:80

Eso nos mostrará el estado del puerto 22 en nuestro equipo. En caso de no especificar el protocolo, partiendo del predefinido http la herramienta intentará adivinarlo.

Otro ejemplo:

curl ldap://127.0.0.1:389

Conclusiones

Hasta aquí llegamos por hoy. Hemos repasado diferentes herramientas que funcionan perfectamente en sistemas basados en Linux o UNIX y que sirven para comprobar puertos en el equipo local, comprobar el estado de puertos en equipos remotos e incluso, algunas, para fase de reconocimiento en hacking ético e incluso extracción forense de información en un sistema vivo.

Espero que os haya gustado 🙂


Fuentes

  • Manpages
  • superuser.com
  • Experiencia propia

Alejandro Ver todo

Trabajo como consultor de ciberseguridad y me gusta lo que hago. Aficionado a la informática / tecnología en general, me gusta compartir con la gente lo poco que sé. También soy aficionado al deporte y los videojuegos.

2 comentarios sobre “Probar puertos abiertos en Linux desde el terminal Deja un comentario

Deja tu comentario (puedes hacerlo de forma anónima)

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.