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

Introducción

Índice
  1. Introducción
  • Sintaxis general
  • Cómo utilizar Netcat para escanear puertos
  • Cómo comunicarse a través de Netcat
  • Cómo enviar archivos a través de Netcat
  • Cómo utilizar Netcat como un servidor web sencillo
  • Conclusió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:

    1. 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 telnetcomando 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 -uopción:

    1. netcat -u host port

    Puede especificar un rango de puertos colocando un guión entre el primero y el último:

    1. netcat host startport-endport

    Generalmente esto se utiliza con algunas banderas adicionales.

    En la mayoría de los sistemas, podemos utilizar tanto netcato nccomo 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 -zopció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:

    1. netcat -z -v domain.com 1-1000

    Junto con la -zopción, también hemos especificado la -vopció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 -nbandera para especificar que no necesita resolver la dirección IP mediante DNS:

    1. 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 21sintaxis bash. Luego filtraremos los resultados con grep:

    1. 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 -lparámetro y eligiendo un puerto:

    1. 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:

    1. 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-Dpara 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:

    1. netcat -l 4444 received_file

    En este comando se redirige toda la salida netcatal nombre de archivo especificado.

    En la segunda computadora, cree un archivo de texto simple escribiendo:

    1. 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:

    1. 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_filecon el contenido del archivo que escribimos en la otra computadora:

    1. 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:

    1. 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:

    1. 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 ddcomando 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:

    1. 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:

    1. 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:

    1. 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-Cen 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.

    SUSCRÍBETE A NUESTRO BOLETÍN 
    No te pierdas de nuestro contenido ni de ninguna de nuestras guías para que puedas avanzar en los juegos que más te gustan.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

    Subir

    Este sitio web utiliza cookies para mejorar tu experiencia mientras navegas por él. Este sitio web utiliza cookies para mejorar tu experiencia de usuario. Al continuar navegando, aceptas su uso. Mas informacion