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.
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. `
` Puedes ver abajo que la conexión al puerto `22` (SSH) tuvo éxito, pero todos los demás puertos fallaron. `

` 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. `
` A continuación, puedes ver que el puerto 22 está abierto para la conexión SSH como se esperaba. `

` 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: `
` 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 anetcat
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).
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.

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.
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.
4. Por último, cambia al host receptor (ubuntu1) y ejecuta el siguiente comando cat para verificar el contenido del ata_file.
Puedes ver el mensaje Hello from ATA a continuación, lo que indica que la transferencia funcionó.

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).

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.
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.
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.
Como puedes ver a continuación, los archivos del directorio apache_backup se transfieren correctamente al directorio apache_backup en el host receptor.

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.
2. En el host emisor (ubuntu2), ejecute el siguiente comando fdisk para encontrar todos los discos y particiones en su máquina.
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.

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

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.
Como puedes ver a continuación, todos los archivos y directorios de /dev/vda1 se transfieren correctamente a /dev/sdb.

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.

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á.
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.
4. Ahora, ejecute el comando chmod a continuación, que no tiene una salida pero hace que el archivo httpresponse.sh sea ejecutable (+x).
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.
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.

6. Ahora, abre otra terminal y ejecuta el siguiente comando para probar tu servidor web Netcat (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.

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!

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?