La denominada navaja suiza Netcat es una clásica herramienta de red, que en su más básica definición permite establecer una conexión entre dos hosts y admite el transporte de datos haciendo uso ya sea de TCP o UDP en una red IP. Existen varias implementaciones de Netcat, la primera de ellas liberada por Hobbit a mediados de los años 90 para sistemas UNIX. La segunda implementación es del Proyecto GNU que como es habitual, reescribe todas las herramientas clásicas de UNIX bajo licencia GPL (Esta es una de las razones de ser del Proyecto GNU, recuerda: GNU is Not UNIX). La tercera gran implementación proviene del proyecto Nmap que ellos mismos definen como “una reimplementación mejorada de Netcat”.

En este caso, vamos a utilizar la primera implementación realizada por Hobbit que viene instalada por defecto en Debian GNU/Linux mediante el paquete netcat-traditional. También existe un paquete llamado netcat-openbsd el cual cuenta con soporte para IPv6 escrito por Eric Jackson. Si prefieren usar la implementación del Proyecto GNU la deben descargar, compilar e instalar manualmente. La versión del proyecto Nmap 1 2 se instala al momento de instalar Nmap y el ejecutable sería ncat.

Uso

Evidentemente la herramienta utiliza la arquitectura Cliente/Servidor, en este caso mi equipo será el servidor y cuenta con la IP 192.168.1.114 y el cliente para las pruebas será otra máquina también con Debian GNU/Linux en Virtualbox con dirección IP 192.168.1.116:

Servidor: Se debe colocar la opción -l para indicar que va estar escuchando por una conexión, y le indicamos el puerto 35444 (o cualquier otro) con la opción -p:

nc -l -p 35444

Cliente: Indicamos a qué host nos queremos conectar seguido del puerto:

nc 192.168.1.114 35444

Después de realizar esto los equipos ya pueden transmitir información, en este punto estaría funcionando como un rudimentario chat tomando información del stdin en un extremo de la conexión y mostrándola en el stdout del otro extremo y viceversa. Para cerrar el socket se presiona ctl+c en cualquier extremo de la conexión.

Transfiriendo archivos

Como ya sabemos que Netcat toma información desde el teclado(stdin) y lo muestra en la pantalla(stdout) del otro extremo, podemos hacer uso de los operadores de redirección de BASH “<” y “>” para hacer transferencia de archivos de la siguiente manera:

Servidor: Igual que la anterior, simplemente usamos el operador “<” para que no se use el teclado y en su defecto se use un archivo:

nc -l -p 35444 < archivo.txt

Cliente: Le agregamos el operador “>” para que no se imprima en pantalla, seguido del nombre del archivo, que obviamente puede o no ser el mismo nombre:

nc -w 2 192.168.1.114 35444 > copiaArchivo.txt

Cuando el cliente se conecte iniciará la transferencia del archivo, ¿Cómo sabemos cuándo termina la transferencia? Para eso usamos la opción -w 2, que en este caso quiere decir que termine la conexión después que esta esté inactiva por 2 segundos, sino usamos dicha opción, la conexión permanecerá abierta hasta que se presione ctl+c en algún extremo.

Escaneo de puertos

También podemos realizar un escaneo de puertos básico:

nc -v -n -w 2 192.168.1.114 80
  • -v Es para que muestre el resultado del escaneo.
  • -n Para que no realice resoluciones DNS, en este caso resoluciones inversas.
  • -w 2 El tiempo en segundos que debe esperar Netcat para que se obtenga una respuesta por parte del objetivo en cada puerto.
(UNKNOWN) [192.168.1.114] 80 (http) open

Este escaneo en particular es equivalente a la opción -sT de Nmap en la cual se realiza una conexión TCP completa.

HTTP

Los usos que se le pueden dar a Netcat son muy variados teniendo como límite nuestra propia imaginación, en este caso vamos a interactuar con un servidor web apache para realizar una petición usando el método GET, la petición estará en un archivo get.txt con el siguiente contenido:

GET / HTTP/1.1
host: 192.168.1.114

Este será el contenido de capa de aplicación que al llegar al servidor apache la procesará como si de un navegador se tratara. Importante que las dos últimas líneas están en blanco en el archivo para asegurar una petición HTTP válida, la primera línea en blanco es para indicar que no hay headers y la segunda indica que el body es vació. Lanzamos Netcat con la dirección del servidor web, puerto 80 y obtenemos la información del archivo get.txt para ser enviada:

nc 192.168.1.114 80 < get.txt
HTTP/1.1 200 OK
Date: Sat, 15 Jun 2013 02:02:48 GMT
Server: Apache/2.2.22 (Debian)
Last-Modified: Sat, 15 Jun 2013 01:55:04 GMT
Accept-Ranges: bytes
Content-Length: 177
Vary: Accept-Encoding
Content-Type: text/html
X-Pad: avoid browser bug

<html><body><h1>It works!</h1>
<p>This is the default web page for this server.</p>
<p>The web server software is running but no content has been added, yet.</p>
</body></html>

De esta manera logramos comunicarnos con el servidor web luego de realizar una petición válida del protocolo HTTP.

Conclusiones

  • El uso que le demos a Netcat es nuestra imaginación y los escenarios son muchos. Con el protocolo HTTP pudimos interactuar de manera manual porque conocemos el protocolo, pero hubiera podido ser algún otro si conocemos su comportamiento.
  • La transferencia de archivos puede ser usada en un escenario en el cual estemos detrás de un Firewall que tenga bloqueado el puerto 21 usado generalmente para la transferencia de archivos.
  • Otra opción de Netcat es la posibilidad de ejecutar programas con la opción -e una vez establecida la conexión, uno de los usos más comunes en este caso es obtener una shell remota ya sea en ambientes Windows o GNU/Linux:
nc -l -p 35444 -e cmd.exe
nc -l -p 35444 -e /bin/bash

Con Netcat no se establecen comunicaciones cifradas, para lograrlo es necesario utilizar Cryptocat.