Netcat: la navaja suiza para linux

Hace algún tiempo descubrí una herramienta llamada netcat. En muchos lugares la bautizan como la navaja suiza ya que este comando puede servir para mil y una tareas. En un principio la subestimé, pero poco después se ha convertido en una de mis aliadas favoritas.
El funcionamiento de netcat es muy sencillo, abre un socket TCP y envía a través de él lo que recibe por la entrada estándar (modo servidor) o viceversa, es decir, copia en la salida estándar lo que recibe por red (modo cliente).
¿Quieres ver alguno de los usos que le doy?
[mediumheader]Conexión simple[/mediumheader]
Al más puro estilo de un telnet, netcat te permite conectarte a un puerto ofrecido por cualquier daemon del sistema.
Para iniciar una conexión hacia algún puerto en algún sistema, se utiliza seguido de una dirección IP y un puerto al cual conectarse. En el siguiente ejemplo realizo una conexión hacia el puerto 25 (SMTP) de 127.0.0.1:
[code style=»2″]$ nc 127.0.0.1 25[/code]
Si hay un servidor de correo funcionado, lo anterior puede devolver una salida similar a la siguiente, donde requerirá escribir quit para cerrar la conexión:
[code style=»2″]220 localhost.localdomain ESMTP ; Wed, 30 Oct 2013 10:24:52 +0200
quit
221 2.0.0 localhost.localdomain closing connection[/code]
[mediumheader]Revisión de puertos[/mediumheader]
Para revisar los puertos abiertos, podemos usar la opción , [badge style=»1″]-z[/badge] para solicitar se trate de escuchar por puertos abiertos y un puerto o rango de puertos. En el siguiente ejemplo vamos a revisar cuáles puertos TCP (modo predeterminado) están abiertos dentro del rango que va del puerto 21 al puerto 25.
[code style=»2″]$ nc -vz 127.0.0.1 21-25[/code]
Lo anterior puede devolver una salida similar a la siguiente, si se encontrasen abiertos los puertos 21, 22 y 25.
[code style=»2″]Connection to 127.0.0.1 21 port [tcp/ftp] succeeded!
Connection to 127.0.0.1 22 port [tcp/ssh] succeeded!
Connection to 127.0.0.1 25 port [tcp/smtp] succeeded![/code]
De manera opcional, se pueden revisar si están abiertos los puertos UDP abiertos añadiendo la opción [badge style=»1″]-u[/badge]. En el siguiente ejemplo revisamos cuáles puertos UDP se encuentran abiertos entre el rango comprendido entre los puertos 21 al 80.
[code style=»2″]$ nc -zu 127.0.0.1 21-80
Connection to 127.0.0.1 53 port [udp/domain] succeeded!
Connection to 127.0.0.1 67 port [udp/bootps] succeeded!
Connection to 127.0.0.1 68 port [udp/bootpc] succeeded![/code]
[mediumheader]Transferencia de datos[/mediumheader]
Imagina que necesitas transferir un fichero, un directorio o una partición entera de un servidor a otro. No puedes usar ni FTP, ni SMB, ni NFS… ¿Que haces?
Los siguientes ejemplos envían un fichero, un directorio y hasta partición entera a través de la red. netcat se inicia en modo servidor ([badge style=»1″]-l[/badge]), escuchando en el puerto 12345 ([badge style=»1″]-p 12345[/badge]) y con un timeout de 10 segundos, por si no recibe nada en la entrada estándar ([badge style=»1″]-q 10[/badge]):
Un archivo:
[code style=»2″]$ cat file.txt | nc -q 10 -l -p 12345[/code]
Un directorio:
[code style=»2″]$ tar c directory | nc -q 10 -l -p 12345[/code]
Una partición entera:
[code style=»2″]$ dd if=/dev/sda1 | gzip -9 | nc -q 10 -l -p 12345[/code]
En el receptor deberás usar netcat para conectarse con el emisor. Usamos también un timeout ([badge style=»1″]-w 10[/badge])
Un archivo:
[code style=»2″]$ nc -w 10 remotehost 12345 > file.txt[/code]
Un directorio:
[code style=»2″]$ nc -w 10 remotehost 12345 | tar -xvf -[/code]
Una partición entera:
[code style=»2″]$ nc -w 10 remotehost 12345 | gunzip | dd of=/dev/sda3[/code]
[mediumheader]¿Algo más?[/mediumheader]
[warning]En todos los ejemplos los datos viajan en claro por la red, por tanto hay que tenerlo en cuenta según sea el entorno y los datos que usemos[/warning]
A partir de aquí podemos ir combinando posibilidades: comprimir los datos, guardar particiones en ficheros, hacer copias de seguridad…. da rienda a tu imaginación, juega con él y dime que uso has encontrado tú.