• #Aplicaciones
  • #Bases de datos
  • #Dispositivos
  • #Hardware
  • #Inversión
  • #Marketing
  • #Programacion
  • #Sistemas
  • Comando nc: Qué es y cómo se usa

    TutorialesFreebsdLinuxmacOSSistemasUnix

    En esta guía vamos a ver qué es el comando nc, conocido como Netcat, y qué puedes hacer con él. Este comando es propio de sistema Unix, por lo que funcionará tanto en la línea de comandos de Linux como en la de macOS.

    Esta guía es muy sencilla, pero requiere unos conocimientos mínimos de la línea de comandos. Si crees que no los tienes, puedes consultar alguna de esta guías:

    Dicho esto, vamos a explicar en qué consiste este comando.

    Qué es el comando nc

    El comando nc es un comando de sistemas Unix que se usa para llevar a cabo diversas tareas de red. Funciona en sistemas nix como Linux, BSD o macOS. Aunque el comando se usa abreviadamente como nc, su nombre completo es Netcat.

    La sintaxis básica del comando Netcat es nc [opciones] HOST PUERTO.

    Mediante el comando nc puedes conectarte a los puertos TCP/UDP de un host. De este modo podrás conectarte otros servidores usando diferentes protocolos de red. Además, también es posible crear servidores que se mantengan a la escucha de peticiones entrantes. Los puertos se abrirán por defecto mediante el protocolo TCP, aunque también se acepta el protocolo UDP.

    Opciones del comando nc

    El comando nc acepta, entre otras, las siguientes opciones básicas:

    • -l: Sirve para que Netcat abra un puerto y se mantenga ala escucha. Se aceptará una única conexión de un único cliente antes de cerrarse.
    • -k: Se usa junto con la opción -l con el objetivo de que el puerto ser mantenga abierto tras recibir una conexión, a la espera de más conexiones.
    • -u: Permite abrir puertos con el protocolo UDP en vez de abrirlos mediante el protocolo TCP.
    • -p: Esta opción permite especificar el puerto al que conectarse.
    • -v: Se usa para mostrar información acerca de la conexión.
    • -t:  Respuestas compatibles con sesiones de Telnet.

    Además, también podrás establecer retrasos entre los tiempos de envío y recepción de mensajes mediante estas opciones:

    • -q segundos: Tras leer los datos de entrada, se esperarán los segundos especificados antes de enviar una respuesta.
    • -i segundos: Se agregará un retraso según los segundos especificados tanto para el envío como para la recepción de líneas de texto.

    A continuación vamos a ver algunos ejemplos de uso de este comando.

    Cómo usar el comando nc

    Puedes usar el comando nc para diversas tareas, como escanear puertos, conectarte a un servidor o crearlo. Vamos a ver algunas de ellas.

    Conexión a un servidor

    El uso básico de este comando sigue la sintaxis nc HOST PUERTO, permitiendo  especificar tanto la IP o el dominio al que conectarte como el puerto. Por ejemplo, vamos a conectarnos a nuestro propio servidor local:

    nc localhost 8000

    Una vez te hayas conectado al servidor, podrás enviar y recibir mensajes, mostrándose en la terminal la respuesta del servidor. De este modo, podrás trabajar a nivel de aplicación usando los protocolos HTTP, FTP, SMTP y muchos más.

    En el siguiente ejemplo vamos a conectarnos a un servidor externo y a enviarle instrucciones. Por ejemplo, podrás usar este comando:

    nc neoguiascom 80

    Lugo puedes usar esta instrucción para obtener una respuesta al verbo GET:

    GET HTTP/1.1

    Dado que neoguias.com usa cloudflare como servidor DNS, se enviará la respuesta desde este servicio:

    HTTP/1.1 400 Bad Request
    Server: cloudflare
    Date: Wed, 18 Nov 2020 06:11:49 GMT
    Content-Type: text/html
    Content-Length: 155
    Connection: close
    CF-RAY: -
    
    <html>
    <head><title>400 Bad Request</title></head>
    <body>
    <center><h1>400 Bad Request</h1></center>
    <hr><center>cloudflare</center>
    </body>
    </html>

    Lo que vamos a hacer hacer ahora es obtener la documentación del comando Netcat y mostrarla por pantalla usando el comando nc:

    printf "GET /nc.1 HTTP/1.1\r\nHost: man.openbsd.org\r\n\r\n" | nc man.openbsd.org 80

    Con esto se debería mostrar en la terminal tanto el código HTML de la página del manual como las cabeceras HTTP correspondientes. De todos modos, el comando nc no es el ideal para realizar estas tareas. El comando curl es mucho más adecuado.

    También te puedes conectar mediante UDP usando el flag -u:

    nc -u host.tld 8000

    También puedes enviar las instrucciones en un archivo mediante el comando nc HOST PUERTO < ARCHIVO:

    nc neoguias.com 8000 < instrucciones.txt

    Información de un servidor

    Mediante el comando nc puedes obtener información acerca del software que usa un servidor. para ello debemos enviar una instrucción EXIT. En el siguiente ejemplo la enviamos al puerto 22, que es el puerto que SSH usa por defecto:

    echo "EXIT" | nc 10.10.8.8 22

    Verás que la salida del comando es similar a la siguiente:

    SSH-2.0-OpenSSH_7.6p1 Ubuntu-10

    Creación de un servidor

    Para crear un servidor con el comando nc, usa el comando nc -l PUERTO. Por ejemplo, vamos a crear un servidor en el puerto 8000:

    nc -l 8000

    Ahora abre otra ventana de terminal y usa este comando para conectarte al servidor:

    nc localhost 8000

    Ahora puedes enviar mensajes al servidor. Verás que Netcat imprime todos los mensajes recibidos por pantalla cuando los escribas y pulses ENTER. Pulsa CTRL+C para cerrar la conexión.

    También puedes decirle al servidor que envíe un archivo de vuelta usando el comando nc -l PUERTO < ARCHIVO:

    nc -l 8000 < mi-archivo.html

    De este modo, cualquier cliente que se conecte al puerto especificado recibirá el archivo de vuelta, imprimiéndose en su pantalla.

    Escaneo de puertos

    Puedes usar el comando Netcat para inspeccionar la red. Por ejemplo, puedes escanear los puertos que están abiertos en un servidor, proporcionando un rango de puertos.

    En el siguiente ejemplo escaneamos el rango de puertos 1-1000 de nuestro servidor local, usando el flag -z para decirle a Netcat que solamente escanee los puertos abiertos, sin enviar datos. El flag -v permite que se muestre información por pantalla:

    nc -v -z localhost 1-10000

    En este otro ejemplo escaneamos el rango de puertos 20-80 de la IP 10.10.8.8:

    nc -z -v 10.10.8.8 20-80

    Verás que la salida del comando es similar a esta:

    nc: connect to 10.10.8.8 port 20 (tcp) failed: Connection refused
    nc: connect to 10.10.8.8 port 21 (tcp) failed: Connection refused
    Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
    nc: connect to 10.10.8.8 port 23 (tcp) failed: Connection refused
    ...
    nc: connect to 10.10.8.8 port 79 (tcp) failed: Connection refused
    Connection to 10.10.8.8 80 port [tcp/http] succeeded!

    Si quieres, puedes usar el comando grep para filtrar la salida del comando y mostrar solamente los puertos abiertos:

    nc -z -v 10.10.8.8 20-80 2>&1 | grep succeeded

    De este modo solamente verás aquellos puertos a los que ha sido posible conectarse:

    Connection to 10.10.8.8 22 port [tcp/ssh] succeeded!
    Connection to 10.10.8.8 80 port [tcp/http] succeeded!

    También puedes escanear puertos UDP usando el flag -u:

    nc -z -v -u 10.10.8.8 20-80

    Transferencia de archivos

    Para simular una transferencia de archivos, puedes guardar el contenido que se reciba en otro archivo usando el comando nc HOST PUERTO > ARCHIVO:

    nc localhost 8000 > copia-archivo.html

    El servidor finalizará nada más terminar la transferencia. Además, puedes usar un pequeño script de Bash para mantener el servidor activo en un puerto

    También podemos crear un servidor que descomprima los archivos recibidos usando el comando tar, pudiendo así enviar directorios enteros:

    nc -l 8000 | tar xzvf -

    Ahora, desde otra ventana de terminal, nos conectamos al servidor y enviamos un directorio que comprimiremos mediante el comando tar:

    tar czvf - /un/directorio | nc receiving.host.com 5555

    En el siguiente ejemplo se implementa un pequeño servidor web en el puerto 80:

    while true; do nc -l 80  < mi-archivo.html; done

    Más información

    Si quieres, puedes consultar el manual de Netcat aquí.

    Y esto ha sido todo.


    Avatar de Edu Lazaro

    Edu Lázaro: Ingeniero técnico en informática, actualmente trabajo como desarrollador web y programador de videojuegos.

    👋 Hola! Soy Edu, me encanta crear cosas y he redactado esta guía. Si te ha resultado útil, el mayor favor que me podrías hacer es el de compatirla en Twitter 😊

    Si quieres conocer mis proyectos, sígueme en Twitter.

    Deja una respuesta

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