Cómo usar Netcat y mejorar tus habilidades de redes!

Gestionar redes y supervisar el flujo de datos entre sistemas suena intimidante. Bueno, a menos que sepas cómo usar Netcat.

Netcat es una herramienta de línea de comandos que puedes utilizar para diversos fines, como exploración de puertos, transferencia de archivos y creación de un servidor web mínimo para probar actividades de conexión. Y en este tutorial, aprenderás a aprovechar Netcat mientras revisas algunos de los casos de uso más comunes.

¿Listo? Sigue leyendo y lleva tus habilidades de redes al siguiente nivel!

Requisitos previos

Este tutorial será una demostración práctica. Si deseas seguir, asegúrate de tener lo siguiente.

  • Dos máquinas Linux: Una (ubuntu1) actúa como host receptor y otra (ubuntu2) sirve como host emisor. Este tutorial utiliza Ubuntu 20.04 para ambas máquinas.

Escaneo de Puertos Abiertos

Los puertos son las puertas que permiten que el tráfico de red entre y salga de una máquina. Cuando un puerto está cerrado, ningún servicio está escuchando en ese puerto y no puede pasar ningún tráfico. Pero si el puerto está abierto, tu red está sujeta a ataques.

Si deseas verificar si un puerto específico está abierto en una máquina para cualquier vulnerabilidad de seguridad, Netcat está a la altura de la tarea. Como pentester, necesitas saber qué puertos están abiertos para llevar a cabo tu ataque. Sea cual sea la razón, escanear puertos abiertos es una necesidad común.

La sintaxis básica para escanear puertos usando Netcat es la siguiente donde:

  • host – es la dirección IP o el nombre de host de la máquina que deseas escanear.
  • startport – es el número de puerto inicial.
  • endport – es el número de puerto final.
netcat options host startport-endport

El comando netcat tiene un alias de nc, lo cual es útil para acortar los comandos. Pero este tutorial usa netcat para una documentación adecuada.

Conéctate por SSH a tu host de envío (ubuntu2) y ejecuta el siguiente comando para escanear puertos abiertos entre los puertos 1-100.

En todo este tutorial, sustituye 149.28.86.131 por la dirección IP de tu host de envío.

En la mayoría de los casos, el rango de puertos 1-100 es suficiente. La mayoría de los servicios utilizan números de puerto predeterminados que generalmente caen en este rango, como 22 para SSH, 80 para HTTP, etc.

La lista a continuación explica cada una de las banderas que controlan el comportamiento del escaneo de puertos: `

  • -z` (modo de entrada/salida cero) – Netcat no leerá ni escribirá en la conexión de red. Esta opción hace que el proceso de escaneo sea más rápido. `
  • -n` – Indica a Netcat que deshabilite la búsqueda DNS para evitar retrasos. `
  • -v` – Hace que Netcat muestre todos los procesos de escaneo de puertos en detalle. `
netcat -z -n -v 149.28.86.131 1-100

` Puedes ver abajo que la conexión al puerto `22` (SSH) tuvo éxito, pero todos los demás puertos fallaron. `

How to Use Netcat : Scanning for Open Ports

` Dado que el comando `netcat` lista todos los puertos escaneados, obtienes mucha información y algo que no necesitas. En ese caso, ejecuta el siguiente comando, enviando el comando `grep`. Este comando filtra solo los puertos abiertos con el mensaje `"succeeded!"` al final, como se muestra a continuación. `

netcat -z -n -v 149.28.86.131 1-100 2>&1 | grep succeeded

` A continuación, puedes ver que el puerto 22 está abierto para la conexión SSH como se esperaba. `

Filtering the Successful Port Connection

` Enviando Archivos de Forma Segura Entre Máquinas `

` Además del escaneo de puertos, Netcat permite transferir archivos de forma segura entre dos máquinas. Netcat utiliza el protocolo TCP para la transferencia de archivos, que es más confiable que UDP. `

` La sintaxis básica para enviar un archivo usando Netcat es la siguiente: `

netcat options host port filename

` Para enviar archivos desde tu host a otra máquina: `

` 1. Ejecuta el siguiente comando para comenzar a escuchar en el puerto 4444 en el host receptor (ubuntu1).

Este comando no tiene una salida, pero las opciones a continuación afectan cómo el comando establece el puerto de escucha:

  • -l – indica a netcat que escuche una conexión entrante en el puerto TCP especificado. El puerto puede ser cualquier número que desees, pero asegúrate de que otros servicios no estén utilizando tu puerto preferido.
  • > - indica a netcat que redireccione todos los datos entrantes a un archivo en la ruta especificada (ata_file).
netcat -l 4444 > ata_file

Solo el usuario root puede enlazarse a puertos inferiores a 1000, así que debes seleccionar un puerto mayor que 1000 como usuario no root. Si intentas usar un número de puerto menor que 1000 como usuario no root, recibirás el siguiente error.

Getting “Permission denied” Error When Using Port Lower Than 1000

2. En el host de envío (ubuntu2), ejecuta el siguiente comando echo, que no tiene una salida pero crea un archivo llamado ata_file con Hello from ATA como contenido.

echo "Hello from ATA" > ata_file

3. Ahora, ejecuta el siguiente comando netcat para enviar ata_file al host receptor (ubuntu1). Asegúrate de usar el mismo número de puerto en el host receptor (4444) que en el host de envío.

Este comando no tiene una salida, pero la opción < indica a netcat que tome la entrada del archivo especificado.

netcat 149.28.86.131 4444 < ata_file

4. Por último, cambia al host receptor (ubuntu1) y ejecuta el siguiente comando cat para verificar el contenido del ata_file.

cat ata_file

Puedes ver el mensaje Hello from ATA a continuación, lo que indica que la transferencia funcionó.

Verifying the Transfer Worked

Enviar Directorios a Otro Host

Hasta ahora, has enviado con éxito un solo archivo de un host a otro. ¿Pero qué pasa si deseas enviar un directorio completo con todos sus subdirectorios y archivos en su lugar? ¡Netcat también puede enviar directorios!

Supongamos que tienes un directorio de respaldo llamado apache_backup en el host de envío (ubuntu2). Primero debes comprimir el directorio, luego enviarlo y extraerlo en el host receptor (ubuntu1).

1. En el host receptor (ubuntu1), ejecuta el siguiente comando para crear un nuevo directorio llamado apache_backup y entrar en ese directorio (cd).

mkdir apache_backup && cd apache_backup
Creating the apache_backup Directory

2. A continuación, ejecuta el siguiente comando para comenzar a escuchar en el puerto 4444 y extraer los archivos comprimidos que el host de envío (ubuntu2) envía al host receptor (ubuntu1).

Este comando no muestra una salida, pero las banderas tar xf – toman la entrada de Netcat (entrada estándar) y extraen todos los archivos en el directorio actual.

netcat -l 4444 | tar xf -

3. En el host de envío (ubuntu2), ejecuta los siguientes comandos para crear un directorio (apache_backup), algunos archivos de texto y enviarlos al host receptor (ubuntu1).

Estos comandos no muestran una salida, pero verificarás si la transferencia funcionó en el siguiente paso.

# Crea un directorio apache_backup y algunos archivos de texto dentro
mkdir apache_backup && cd apache_backup && touch ata{1..5}.txt
# Comprime el directorio de trabajo y lo envía al host receptor
tar cf - . | netcat 149.28.86.131 4444

4. Finalmente, cambia al host receptor (ubuntu1), presiona Ctrl+C para dejar de escuchar en el puerto 4444 y ejecuta el comando ls para listar los archivos dentro del directorio apache_backup.

ls

Como puedes ver a continuación, los archivos del directorio apache_backup se transfieren correctamente al directorio apache_backup en el host receptor.

Verifying Transferred Files on the Receiving Host

Enviando un Disco o Partición Completa a Otro Host

Enviando toda su unidad o partición a otro host puede parecer ambicioso, pero esta tarea es factible, aparte de enviar archivos y directorios. Esto es especialmente útil si necesita hacer una copia de seguridad de toda su unidad antes de tomar medidas drásticas, como mover o eliminar toneladas de archivos.

1. Ejecute el comando en el host receptor (ubuntu1) para comenzar a escuchar en el puerto 4444. Este comando no tiene una salida, pero descomprime todos los datos entrantes (bzip2 -d |dd) en /dev/sdb.

/dev/sdb es su segundo disco duro en la máquina. Pero en este caso, /dev/sdb es un disco duro vacío conectado a esta máquina para este tutorial.

netcat -l 4444 | bzip2 -d | dd of=/dev/sdb

2. En el host emisor (ubuntu2), ejecute el siguiente comando fdisk para encontrar todos los discos y particiones en su máquina.

 fdisk -l

Como puede ver a continuación, /dev/vda1/ es la partición raíz para el host emisor en este tutorial. Su salida puede ser diferente según la configuración de su máquina.

Finding All Disks and Partitions

3. Ejecute el siguiente comando en el host emisor (ubuntu2), que no tiene una salida, pero envía la partición /dev/vda1 al host receptor (ubuntu1) a través del puerto 4444.

Comprimir y enviar la partición al host receptor lleva un tiempo, dependiendo del tamaño de la partición.

bzip2 -c /dev/vda1 | netcat 149.28.86.131 4444

4. Una vez que se complete el proceso, cambie al host receptor (ubuntu1) y verá la salida a continuación.

El error de no espacio en el dispositivo es esperado ya que probablemente /dev/vda1 sea más grande que /dev/sdb. ¡Pero captas la idea! Puedes usar Netcat para enviar todo tu disco duro o partición a otra máquina.

Viewing the Sending Disk/Partition Process

Finalmente, ejecuta los comandos en el host receptor (ubuntu1) para montar la partición /dev/vda1 y listar todos los archivos en la partición.

# Monta la partición /dev/vda1
mount /dev/vda1 /media 
# Lista todos los archivos en la partición
ls media

Como puedes ver a continuación, todos los archivos y directorios de /dev/vda1 se transfieren correctamente a /dev/sdb.

Verifying Data Integrity of the File Transfer

Creando un servidor web mínimo

Configurar un servidor web completo como Apache o NGINX solo para diagnosticar un problema del servidor web puede ser un dolor de cabeza. En su lugar, crea un servidor web mínimo con Netcat para identificar rápidamente problemas del servidor web.

Para crear un servidor web mínimo:

1. Cambia al host recibido y ejecuta los siguientes comandos para crear un directorio raíz (nc-webserver-docroot) para el servidor web y un script de shell (httpresponse.sh) que genera la respuesta HTTP.

mkdir -pv /root/nc-webserver-docroot/
Creating a Webserver Root Directory

2. A continuación, crea un archivo index.html en el directorio /root/nc-webserver-docroot/ con tu editor preferido y completa el archivo con el código a continuación. Este archivo HTML contiene el contenido que el servidor web de Netcat servirá.

<!doctype html>

<html lang="en">

<head>
	<title>NETCAT Testing network connectivity </title>
</head>

<body>
	<h1>NETCAT Test</h1>
	<p>Connection Successful! Your networking skills are awesome!</p>
</body>

</html>

3. Crea un archivo de script de shell llamado httpresponse.sh en el directorio /root/nc-webserver-docroot/ y completa el código a continuación.

Este script de shell devuelve el contenido del archivo /root/nc-webserver-docroot/index.html como respuesta HTTP a cualquier cliente que envíe una solicitud a su servidor web Netcat.

#!/bin/bash
printf 'HTTP/1.1 200 OK\n\n%s' "$(cat /root/nc-webserver-docroot/index.html)"

4. Ahora, ejecute el comando chmod a continuación, que no tiene una salida pero hace que el archivo httpresponse.sh sea ejecutable (+x).

chmod +x /root/nc-webserver-docroot/httpresponse.sh

5. Ejecute el siguiente comando ncat para iniciar el servidor web Netcat en el puerto 7777.

Asegúrese de reemplazar el puerto 7777 con el número de puerto de su elección, que no esté siendo utilizado por ningún otro servicio en su sistema.

Las siguientes opciones afectan el comportamiento de inicio del servidor web Netcat:

  • -l – indica a Ncat que escuche una conexión entrante.
  • -v – habilita el modo detallado para mostrar todas las solicitudes HTTP entrantes en su terminal.
  • -c - especifica la ruta del script httpresponse.sh que genera las respuestas HTTP.
  • -keep-open – mantiene abierto el oyente de Ncat incluso después de que se cierre la primera conexión. Esta opción es útil si prueba su servidor web con varios clientes.
ncat -lv 7777 -c /root/nc-webserver-docroot/httpresponse.sh --keep-open

Verá la siguiente salida una vez que el servidor web Netcat se ejecute y escuche en el puerto 7777 en todas las interfaces de red disponibles.

Starting the Ncat Server

6. Ahora, abre otra terminal y ejecuta el siguiente comando para probar tu servidor web Netcat (http://localhost:7777).

curl -vvv http://localhost:7777

El resultado a continuación muestra que el servidor web Netcat está funcionando como se esperaba y puede devolver el contenido del archivo /root/nc-webserver-docroot/index.html como respuesta HTTP.

Testing your Ncat server

7. Por último, vuelve a la terminal donde se está ejecutando el servidor web Netcat. Verás que el servidor web Netcat ha recibido y procesado la solicitud HTTP del cliente curl.

¡Felicidades! ¡Has creado con éxito un servidor web Netcat mínimo para probar tu conectividad de red!

Verifying the HTTP Request from the curl Client

Conclusión

En este tutorial, has aprendido a utilizar Netcat para mejorar tus habilidades de red y depuración. Has escaneado puertos abiertos, transferido archivos y creado un servidor web mínimo. Y en este punto, ¡ahora puedes resolver muchos problemas de red del mundo real con esta potente utilidad de red!

Con este nuevo conocimiento, ¿por qué no mejorar aún más tus habilidades de red y convertirte en un usuario avanzado en Ciberseguridad?

Source:
https://adamtheautomator.com/how-to-use-netcat/