Skip to content

Usar netcat para escuchar datos de un puerto remoto

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.

Ejemplo de uso combinado de Netcat y Telnet

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.

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.

Deja un comentario