Netcat: Herramienta avanzada de red en GNU Linux

En el artículo de hoy vamos a tratar la herramienta Netcat, también conocida como Ncat y nc, para el diagnóstico de redes. Este programa es una utilidad repleta de características que lee y escribe datos a través de la red, desde la consola de comandos.

Trabajar con redes en GNU Linux con Netcat

Originalmente Ncat fue escrito para el proyecto Nmap. Con esta herramienta podemos proporcionar instantáneamente conectividad de red a otras aplicaciones y usuarios.

Ncat no solo funciona los protocolos de red IPv4 y IPv6, ya que proporciona un número casi ilimitado de usos potenciales.

Entre la gran cantidad de características de Ncat está la capacidad de encadenar a los Ncats, redirección de puertos TCP, UDP y SCTP a otros sitios, Soporte SSL, y conexiones proxy a través de SOCKS4 o proxies HTTP (con autenticación proxy opcional también)

La mejora forma de decir es hacer, así que aquí van algunos ejemplos.

Instalación en GNU Linux

En muchas distribuciones, como por ejemplo Debian, la herramienta ya viene preinstalada. En el caso de RHEL o Centos la debemos instalar, como sigue:

  1. [root@servcentos ~]# yum -y install nmap-ncat

Ejemplos de uso de Ncat en GNU Linux

1. Obtener ayuda de Netcat

Para obtener ayuda de Netcat, podemos consultar su página de man, o bien utilizar el parámetro «-h«, de esta manera:

  1. [root@servcentos ~]# nc -h
  2. usage: nc [-46DdhklnrStUuvzC] [-i interval] [-p source_port]
  3.           [-s source_ip_address] [-T ToS] [-w timeout] [-X proxy_version]
  4.           [-x proxy_address[:port]] [hostname] [port[s]]
  5.         Command Summary:
  6.                 -4              Use IPv4
  7.                 -6              Use IPv6
  8.                 -D              Enable the debug socket option
  9.                 -d              Detach from stdin
  10.                 -h              This help text
  11.   .....

2. Servidor TCP

Podemos utilizar Netcat para que cumpla con el rol de un servidor TCP, por un puerto específico. Hay que tener en cuenta que solo los superusuarios o los usuarios con privilegios asignados, puedes utilizar los puertos entre el 1 y el 1024.

En el ejemplo vamos a utilizar el puerto 35

  1. [root@servcentos ~]# nc -4 -l -p 35

Una vez hecho esto, no podemos conectar desde otro cliente a este servidor y enviar una serie de información.

¿Qué parámetros hemos utilizado?
  • «-4» En mi caso, he tenido que especificar que quiero utilizar IPv4, ya que me mostraba el error al conectarme desde un cliente «close: Bad file descriptor»
  • «-l» Le indicamos que debe escuchar una conexión entrante, en vez de iniciar una conexión a un host remoto.
  • «-p» Indicamos el puerto por el cual queremos escuchar.

También podemos utilizar NetCat para conectar a un puerto específico de un servidor.

  1. [root@servcentos ~]# nc servdebian 22
  2. SSH-2.0-OpenSSH_7.4

En el ejemplo nos hemos conectado a un servido remoto, por el puerto 22, que es utilizado por el servicio OpenSSH. Dicho servicio nos contesta mostrando su versión.

3. Envío de ficheros con Netcat

Otra característica útil del netcat es la transferencia de archivos. Como hemos visto en ejemplos anteriores, Netcat puede transferir texto fácilmente con una arquitectura de servidor-cliente. No hay límite sobre la transferencia de datos. Estos datos también pueden ser ficheros de imagen, vídeo o sonido.

Hay que tener en cuenta que el tiempo de transferencia cambiará según el tamaño de los datos. Para realizar la transferencia necesitamos configurar un servidor que sea el destino.

En el ejemplo redirigiremos los datos entrantes a un nombre de archivo myfichero.txt

  1. root@servcentos ~]# nc -4 -l -p 22450 > mifichero.txt

Ahora podemos enviar el archivo desde el cliente. Leeremos el archivo mifichero.txt en el lado del cliente, redirigiendo al archivo Netcat como se muestra a continuación.

  1. root@servdebian ~]#nc servcentos 22450 < mifichero.txt

4. Un servidor Web simple con Netcat

Netcat puede ser utilizado como un servidor web simple. En realidad, los servidores web son muy simples si no hay requisitos de configuración especiales. Sobre todo si se trata de información estática y no dinámica. Los servidores web envían páginas html a través del protocolo HTTP o HTTPS. Netcat también puede enviar código html con redirección.

Para la ocasión he creado un fichero index.html, nada pretencioso, al que consultaremos vía web, una vez utilicemos Netcat desde la consola de comandos, por el puerto que nosotros deesemos.

Para ello he creado un fichero «index.html.sh» con este contenido:

  1. #!/bin/bash
  2.  
  3. echo "************DATOS DEL SERVIDOR**************"
  4. echo ""
  5. echo "Hola colegas!"
  6. echo ""
  7.  
  8. echo "Kernel"
  9. uname -r

Ahora ejecutaremos la siguiente orden desde la línea de comandos:

  1. while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; sh index.html.sh; } | nc -4 -l 8901; done

De esta manera, cada vez que se produzca una consulta desde una navegador dado, por el puerto indicado, le enviaremos una respuesta 200, que dicho navegador sepa interpretar.

En la consola veremos el resultado:

  1. [root@servcentos ~]# while true; do { echo -e 'HTTP/1.1 200 OK\r\n'; sh index.html.sh; } | nc -4 -l 8901; done
  2. GET / HTTP/1.1
  3. Host: servcentos:8901
  4. Connection: keep-alive
  5. Cache-Control: max-age=0
  6. Upgrade-Insecure-Requests: 1
  7. User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36
  8. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
  9. Accept-Encoding: gzip, deflate
  10. Accept-Language: es,en-US;q=0.9,en;q=0.8,da;q=0.7,ca;q=0.6

Y desde el navegador web del cliente:

5. Prevenir la búsqueda de DNS con dnslookup

La búsqueda de DNS se puede desactivar con el parámetro «-n«, si así lo deseamos. Por lo que así no consulta DNS en ninguna dirección, nombre de host o puerto especificado.

6. Escaneo de puertos

Puede ser útil saber qué puertos están abiertos y ejecutando servicios en una máquina objetivo. El parámetro «-z» se puede usar para indicar a Netcat que informe sobre puertos abiertos, en lugar de iniciar una conexión. Por lo general, es útil activar la salida detallada a stderr usando esta opción junto con el parámetro «-v«.

Veamos un ejemplo:

  1. nc -zv servcentos 80

Con el siguiente resultado:

  1. Ncat: Version 7.50 ( https://nmap.org/ncat )
  2. Ncat: Connected to 192.168.0.20:80.
  3. Ncat: 0 bytes sent, 0 bytes received in 0.02 seconds.

Podemos escanear puertos dentro de un rango, por ejemplo entre el 1 y el 1024, de esta manera:

  1. nc -zv servcentos 1-1024

Mostrando la siguiente información:

  1. (UNKNOWN) [servcentos] 80 (http) open
  2. (UNKNOWN) [servcentos] 22 (ssh) open

7. Conclusiones

Hemos visto sólo un ápice de todo lo que podemos hacer con Netcat. Creo que ha quedado claro todo el potencial de esta herramienta, muy utilizada en las auditorías de seguridad, a la par que NMAP.

Yo no soy un experto en estos menesteres, así que me he servido de bastante documentación que he encontrado por la red. Que en el siguiente apartado paso a relatar.

Fuentes consultadas

Potfut.com – Netcat (nc) Command Tutorial With Examples
Computerhope.com – Linux nc command
Stackoverflow.com – Ncat “bad file descriptor” error upon client connection
Stackoverflow-com – Minimal web server using netcat