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:
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:
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
Categories
deweloper View All
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.
Sí señor, una entrada muy útil. No conocía el comando SS. Contigo siempre siendo ciudad nuevas.
Salu2
Gracias. Por cierto te traicionó el corrector al final 😄