Usar netcat para escuchar datos de un puerto remoto

Quien más quien menos ya conoce la herramienta telnet, presente en sistemas operativos Windows y Linux desde antes del diluvio, pero que aún se utiliza para detectar si un puerto está abierto en un sistema remoto. Peor aún, hay empresas que aún lo utilizan para conectar a sus sistemas…
Sin embargo telnet es una herramienta muy limitada y que, por ejemplo, no permite escuchar el tráfico que pasa por un puerto, así que para esos menesteres podemos utilizar la herramienta Netcat (nc, para los amigos).
Este artículo trata de forma genérica sobre nc y su sintaxis, que es esencialmente parecida -aunque como comprobarás pronto, no idéntica- entre diferentes sistemas y versiones de Linux.
Usos principales de Netcat
Poldemos usar la herramienta Netcat para lo siguiente, entre otras cosas.
- Abrir conexiones TCP o UDP
- Escuchar en puertos TCP o UDP
- Escanear puertos en protocolos IPv4 e IPv6
Y otros propósitos…
Instalar netcat
Sigue estas indicaciones para instalar netcat en Linux. Hya otros sistemas como Fedora que también tienen soporte, es bastante universal.
Debian/Ubuntu
sudo apt-get install netcat
CentOS/Redhat
yum install nc
En Windows, puedes probar esta versión de netcat para Windows. No puedo decirte si funciona mejor o peor porque no la he probado.
Escanear puertos remotos abiertos con el comando nc
Con nc podemos revisar rápidamente si uno o varios puertos están abiertos de la siguiente forma. En el siguiente ejemplo preguntamos por el puerto 53 para el host 10.0.0.1.
dietpi@DietPi:~$ netcat -zv 10.0.0.1 53 10.0.0.1: inverse host lookup failed: Unknown host (UNKNOWN) [10.0.0.1] 53 (domain) open
Sintaxis básica
- z: busca si el puerto está abierto/ocupado, sin enviar datos
- v: modo «verbose» para más información de salida.
- u (opcional): la utilizaremos si queremos escanear puertos UDP
Como vemos, el puerto se muestra como abierto (open).
El mensaje inverse host lookup failed de netcat, significa que la utilidad ha intentado resolver el nombre de host asociado a la IP suministrada, pero no ha podido al no haber un registro DNS tipo A en el servidor al que pregunta.
Podemos especificar más de un chequeo en una misma linea con && (aunque si falla el primer comando, se interrumpe la ejecución del segundo) y utilizar tanto IP como nombre de host.
dietpi@DietPi:~$ netcat -zv 192.168.1.1 53 && nc -zv firewalla.lan 22 broadcom.router.lan [192.168.1.1] 53 (domain) open firewalla.lan [192.168.1.11] 22 (ssh) open
O mejor aún, podemos especificar rangos. Para escanear un rango de puertos con ncat, ejecutaremos el comando con un rango separado por guión (-):
dietpi@DietPi:~$ nc -v -w 5 -z 10.0.0.57 1-1024
DietPi [10.0.0.57] 445 (microsoft-ds) open
DietPi [10.0.0.57] 139 (netbios-ssn) open
DietPi [10.0.0.57] 80 (http) open
DietPi [10.0.0.57] 53 (domain) open
DietPi [10.0.0.57] 22 (ssh) open
Si recibimos un mensaje como Connection refused, significa que el puerto está cerrado y se ha rechazado la conexión.
Con el modificador -w podemos definir el wait time o tiempo que intentará escuchar por donde se le indica, en caso de no suministrar este valor y, dependiendo del comando lanzado, podría quedarse esperando indefinidamente (a tener en cuenta para scripting).
dietpi@DietPi:~$ sudo nc -lv 10.0.0.57 53 -w 1 listening on [any] 34621 … no connection : Connection timed out
Si quieres más información al respecto, recuerda revisar mi artículo sobre escaneo de puertos abiertos en Linux.
Transferir archivos con Netcat
Un uso común de Netcat, sobre todo cuando se quiere exfiltrar información de un equipo a otro, es la de transferencia remota de archivos. Podemos usarlo para enviar archivos de gran tamaño, incluso particiones o discos completos.

Un ejemplo sencillo es transferir un archivo entre equipos con Netcat. Para ello, creamos un archivo nuevo.
touch fichero.txt
Preparamos el equipo que escucha para recibir los datos, escribiendo el puerto (por ejemplo, 9000) y donde se enviará la salida (fichero.txt).
nc -l -p 9000 > fichero.txt
En el equipo cliente que envía, simplemente haremos esto.
nc <IP del receptor> puerto < nombre-archivo
Ejemplo:
nc 10.0.0.91 -p 9000 < fichero.txt
No se recibirá confirmación del envío, así que lo comprobaremos en otra shell (o cancelaremos el comando actual) y listaremos el directorio donde nos encontramos al lanzar el fichero.
Si recibimos un error como este, (?) : Connection refused, quiere decir que el «pipe» o conexión se ha roto, que el equipo que debe recibir no está preparado.
Conclusiones
Has podido comprobar la versatilidad de Netcat, una herramienta que permite hacer diagnósticos de red y transferir información rápidamente y que, además, es amiga del scripting.
Otros usos incluirían la opción de utilizarlo como medio de chat en sistemas Linux (muy sencillo, desde luego) porque al establecer un pipe de escucha (netcat -l), el envío y recepción de datos es bidireccional.
O cosas más exóticas, como por ejemplo lanzar aplicaciones de Windows remotamente desde un sistema Linux o como servidor web sencillo, aunque no los he tratado por salirse de los usos que había planteado para el artículo.
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.