Portar Netcat en Node.js. Utilidad CLI.
Para incrustarlo en su aplicación Node.js, utilice el paquete netcat. Está pensado para usarse como una herramienta independiente, pero no es completamente igual a la implementación original de netcat.
linux | sistema operativo mac | ventanas |
---|---|---|
$ npm install -g nc
$ nc -l -p port [- options] [hostname] [port]
Opciones disponibles:
-c shell commands as `-e’; use /bin/sh to exec [dangerous!!]
-e filename program to exec after connect [dangerous!!]
-b allow broadcasts
-h this cruft
-i secs delay interval for lines sent, ports scanned
-k set keepalive option on socket
-l listen mode, for inbound connects
-n numeric-only IP addresses, no DNS
-o file hex dump of traffic
-p port local port number
-r randomize local and remote ports
-s addr local source address
-u UDP mode
-U Listen or connect to a UNIX domain socket
-v verbose
-w secs timeout for connects and final net reads (client-side)
-z zero-I/O mode [used for scanning]
$ nc -l -p 2389
$ nc localhost 2389
Abriendo una conexión sin formato al puerto 2389
.
Lado del servidor | Lado del cliente |
---|---|
nc -l 2389 > test | cat testfile | nc localhost 2389 |
$ nc -w 10 localhost 2389
La conexión anterior finalizará después de 10 segundos.
$ nc -kl 2389
De esta manera, el servidor permanece activo incluso si el cliente se desconecta.
Una cosa mucho más interesante es ejecutar un shell rápido en una máquina remota usando la opción -l
o listen
y la opción -e
o execute
. Cuando se realiza una conexión, Netcat ejecuta el programa de su elección y conecta la stdin
y stdout
del programa a la conexión de red.
$ nc -l -p 23 -e /bin/sh
Creemos un archivo de solicitud HTTP get.txt
que contenga la siguiente línea y luego una línea en blanco:
GET / HTTP/1.0
Para utilizar Netcat para recuperar la página de inicio de un sitio web, utilice:
$ nc -v www.website.com 80 < get.txt
Verá que Netcat se conecta al puerto 80, envía el texto contenido en el archivo get.txt
y luego envía la respuesta del servidor web a stdout
.
En un escenario normal, si el cliente nc se desconecta, no volverá a intentar la conexión. Con el parámetro --retry <secs>
o -R <secs>
, reintentará la conexión después de tot segundos.
$ nc -R 5 localhost 2389
Si tiene Docker, intentemos enumerar las imágenes de nuestros contenedores que se conectan al archivo de socket Unix de Docker:
$ echo -e " GET /images/json HTTP/1.0rn " | nc -U /var/run/docker.sock
PD. para este ejemplo se requieren permisos de root: sudo su
.
$ mkfifo /tmp/fifo
$ nc -l -k -p 8080 < /tmp/fifo | nc website.com 80 > /tmp/fifo
$ nc -z 192.168.1.100 1-255
Si usa la opción -o
puede volcar todo el tráfico hexadecimal.
$ nc 127.0.0.1 4445 -o /tmp/log.txt
De forma predeterminada, todos los sockets que crea la utilidad nc son protocolos TCP, pero esta utilidad también funciona con el protocolo UDP. Para habilitar el protocolo UDP se utiliza el indicador -u.
Lado del servidor | Lado del cliente |
---|---|
nc -u -l -p 2389 | nc -u localhost 2389 |
$ echo 'message' | nc -w 1 -u 192.168.1.111 514
Canalice a través de UDP (-u) con un tiempo de espera (-w) de 1 segundo a 192.168.1.111
en el puerto 514
.
La depuración coincide con el modo detallado. Puede habilitarlo con el parámetro -v
o la var env DEBUG=nc
. Este módulo utiliza la implementación de nodo de netcat internamente; para depurar ambos use: DEBUG=netcat:*,nc
.
Rocco Musolino (@roccomuso)