Cómo utilizar Netcat para establecer y probar conexiones TCP y UDP

Introducción
Linux es conocido por tener una gran cantidad de utilidades de línea de comandos útiles y maduras disponibles de fábrica en la mayoría de las distribuciones. A menudo, los administradores de sistemas pueden realizar gran parte de su trabajo utilizando las herramientas integradas sin tener que instalar software adicional.
En esta guía, analizaremos cómo utilizar la utilidad netcat . Este versátil comando puede ayudarle a supervisar, probar y enviar datos a través de conexiones de red.
Netcat debería estar disponible en casi cualquier distribución moderna de Linux. Ubuntu se entrega con la variante BSD de netcat, que es la que utilizaremos en esta guía. Es posible que otras versiones funcionen de forma diferente o proporcionen otras opciones.
Sintaxis general
De forma predeterminada, netcat funciona iniciando una conexión TCP a un host remoto.
La sintaxis más básica es:
- netcat [options] host port
Esto intentará iniciar una conexión TCP con el host definido en el número de puerto especificado. Funciona de manera similar al antiguo telnet
comando de Linux. Tenga en cuenta que su conexión no está encriptada en absoluto.
Si desea enviar un paquete UDP en lugar de iniciar una conexión TCP, puede utilizar la -u
opción:
- netcat -u host port
Puede especificar un rango de puertos colocando un guión entre el primero y el último:
- netcat host startport-endport
Generalmente esto se utiliza con algunas banderas adicionales.
En la mayoría de los sistemas, podemos utilizar tanto netcat
o nc
como indistintamente. Son alias para el mismo comando.
Cómo utilizar Netcat para escanear puertos
Uno de los usos más comunes de netcat es como escáner de puertos.
Aunque netcat probablemente no sea la herramienta más sofisticada para el trabajo (nmap es una mejor opción en la mayoría de los casos), puede realizar escaneos de puertos simples para identificar fácilmente los puertos abiertos.
Hacemos esto especificando un rango de puertos para escanear, como hicimos anteriormente, junto con la -z
opción de realizar un escaneo en lugar de intentar iniciar una conexión.
Por ejemplo, podemos escanear todos los puertos hasta el 1000 emitiendo este comando:
- netcat -z -v domain.com 1-1000
Junto con la -z
opción, también hemos especificado la -v
opción de indicarle a netcat que proporcione información más detallada.
El resultado se verá así:
Outputnc: connect to domain.com port 1 (tcp) failed: Connection refusednc: connect to domain.com port 2 (tcp) failed: Connection refusednc: connect to domain.com port 3 (tcp) failed: Connection refusednc: connect to domain.com port 4 (tcp) failed: Connection refusednc: connect to domain.com port 5 (tcp) failed: Connection refusednc: connect to domain.com port 6 (tcp) failed: Connection refusednc: connect to domain.com port 7 (tcp) failed: Connection refused. . .Connection to domain.com 22 port [tcp/ssh] succeeded!. . .
Como puede ver, esto proporciona mucha información y le indicará para cada puerto si un escaneo fue exitoso o no.
Si realmente estás utilizando un nombre de dominio, este es el formulario que deberás utilizar.
Sin embargo, el escaneo será mucho más rápido si conoce la dirección IP que necesita. Luego, puede usar la -n
bandera para especificar que no necesita resolver la dirección IP mediante DNS:
- netcat -z -n -v 198.51.100.0 1-1000
Los mensajes devueltos se envían a la salida estándar de error (consulte nuestro artículo sobre redirección de E/S para obtener más información). Podemos enviar los mensajes de error estándar a la salida estándar, lo que nos permitirá filtrar los resultados más fácilmente.
Redireccionaremos el error estándar a la salida estándar utilizando la 21
sintaxis bash. Luego filtraremos los resultados con grep
:
- netcat -z -n -v 198.51.100.0 1-1000 21 | grep succeeded
OutputConnection to 198.51.100.0 22 port [tcp/*] succeeded!
Aquí, podemos ver que el único puerto abierto en el rango de 1 a 1000 en la computadora remota es el puerto 22, el puerto SSH tradicional.
Cómo comunicarse a través de Netcat
Netcat no se limita a enviar paquetes TCP y UDP. También puede escuchar en un puerto conexiones y paquetes. Esto nos da la oportunidad de conectar dos instancias de netcat en una relación cliente-servidor.
La distinción entre el equipo servidor y el equipo cliente solo es relevante durante la configuración inicial. Una vez establecida la conexión, la comunicación es exactamente la misma en ambas direcciones.
En una máquina, puedes indicarle a netcat que escuche un puerto específico para las conexiones. Podemos hacerlo proporcionando el -l
parámetro y eligiendo un puerto:
- netcat -l 4444
Esto le indicará a netcat que escuche conexiones TCP en el puerto 4444. Como usuario normal (no root ), no podrá abrir ningún puerto por debajo de 1000, como medida de seguridad.
En un segundo servidor, podemos conectarnos a la primera máquina en el número de puerto que elegimos. Lo hacemos de la misma manera que establecimos conexiones anteriormente:
- netcat domain.com 4444
Parecerá que no ha ocurrido nada, pero ahora puedes enviar mensajes en ambos lados de la conexión y se verán en ambos extremos.
Escribe un mensaje y pulsa ENTER
. Aparecerá tanto en la pantalla local como en la remota. Esto también funciona en sentido inverso.
Cuando haya terminado de pasar mensajes, puede presionar CTRL-D
para cerrar la conexión TCP.
Cómo enviar archivos a través de Netcat
A partir del ejemplo anterior, podemos realizar tareas más útiles.
Como estamos estableciendo una conexión TCP normal, podemos transmitir prácticamente cualquier tipo de información a través de esa conexión. No se limita a los mensajes de chat que escribe un usuario. Podemos utilizar este conocimiento para convertir a netcat en un programa de transferencia de archivos.
Una vez más, debemos elegir un extremo de la conexión para escuchar las conexiones. Sin embargo, en lugar de imprimir la información en la pantalla, como hicimos en el último ejemplo, colocaremos toda la información directamente en un archivo:
- netcat -l 4444 received_file
En este comando se redirige toda la salida
netcat
al nombre de archivo especificado.
En la segunda computadora, cree un archivo de texto simple escribiendo:
- echo "Hello, this is a file" original_file
Ahora podemos utilizar este archivo como entrada para la conexión netcat que estableceremos con el ordenador que escucha. El archivo se transmitirá tal y como si lo hubiéramos escrito de forma interactiva:
- netcat domain.com 4444 original_file
Podemos ver en la computadora que estaba esperando una conexión, que ahora tenemos un nuevo archivo llamado received_file
con el contenido del archivo que escribimos en la otra computadora:
- cat received_file
OutputHello, this is a file
Como podéis ver, al canalizar cosas, podemos aprovechar fácilmente esta conexión para transferir todo tipo de cosas.
Por ejemplo, podemos transferir el contenido de un directorio entero creando un archivo tar sin nombre sobre la marcha, transfiriéndolo al sistema remoto y descomprimiéndolo en el directorio remoto.
En el extremo receptor, podemos anticipar la llegada de un archivo que deberá descomprimirse y extraerse escribiendo:
- netcat -l 4444 | tar xzvf -
El guión final (-) significa que tar funcionará en la entrada estándar, que se transmite desde netcat a través de la red cuando se establece una conexión.
En el lado con el contenido del directorio que queremos transferir, podemos empaquetarlo en un tarball y luego enviarlo al equipo remoto a través de netcat:
- tar -czf - * | netcat domain.com 4444
Esta vez, el guión en el comando tar significa comprimir y comprimir el contenido del directorio actual (como se especifica con el comodín *) y escribir el resultado en la salida estándar.
Esto luego se escribe directamente en la conexión TCP, que luego se recibe en el otro extremo y se descomprime en el directorio actual de la computadora remota.
Este es solo un ejemplo de transferencia de datos más complejos de una computadora a otra. Otra idea común es usar el dd
comando para crear una imagen de un disco en un lado y transferirlo a una computadora remota. Sin embargo, no abordaremos este tema aquí.
Cómo utilizar Netcat como un servidor web sencillo
Hemos estado configurando netcat para que escuche conexiones con el fin de comunicarse y transferir archivos. Podemos utilizar este mismo concepto para operar netcat como un servidor web muy simple. Esto puede resultar útil para probar las páginas que estás creando.
Primero, vamos a crear un archivo HTML simple en un servidor:
- nano index.html
Aquí tienes un código HTML simple que puedes utilizar en tu archivo:
índice.html
html head titleTest Page/title /head body h1Level 1 header/h1 h2Subheading/h2 pNormal text here/p /body/html
Guarde y cierre el archivo.
Sin privilegios de root, no puede servir este archivo en el puerto web predeterminado, el puerto 80. Podemos elegir el puerto 8888 como usuario normal.
Si solo desea servir esta página una vez para verificar cómo se representa, puede ejecutar el siguiente comando:
- printf 'HTTP/1.1 200 OKnn%s' "$(cat index.html)" | netcat -l 8888
Ahora, en tu navegador, podrás acceder al contenido visitando:
http://server_IP:8888
Esto servirá la página y luego se cerrará la conexión de netcat. Si intentas actualizar la página, desaparecerá:
Podemos hacer que netcat sirva la página indefinidamente envolviendo el último comando en un bucle infinito, de esta manera:
- while true; do printf 'HTTP/1.1 200 OKnn%s' "$(cat index.html)" | netcat -l 8888; done
Esto le permitirá seguir recibiendo conexiones después de que se cierre la primera conexión.
Podemos detener el bucle escribiendo CTRL-C
en el servidor.
Esto te permite ver cómo se muestra una página en un navegador, pero no ofrece muchas más funciones. Nunca deberías utilizar esto para ofrecer sitios web reales. No hay seguridad y elementos simples como los enlaces ni siquiera funcionan correctamente.
Conclusión
Ahora debería tener una idea bastante clara de para qué se puede utilizar netcat. Es una herramienta versátil que puede resultar útil para diagnosticar problemas y verificar que la funcionalidad básica funciona correctamente con conexiones TCP/UDP.
Con netcat, es posible comunicarse entre diferentes computadoras de manera muy sencilla para lograr interacciones rápidas. Netcat intenta hacer que las interacciones de red entre computadoras sean transparentes al eliminar la complejidad de la formación de conexiones.
Deja una respuesta