Portando Netcat em Node.js. Utilitário CLI.
Para incorporá-lo em seu aplicativo Node.js, use o pacote netcat. Deve ser usado como uma ferramenta independente, mas não é totalmente igual à implementação original do netcat.
Linux | Mac OS | Windows |
---|---|---|
$ npm install -g nc
$ nc -l -p port [- options] [hostname] [port]
Opções disponíveis:
-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
Abrindo uma conexão bruta com a porta 2389
.
Lado do servidor | Lado do cliente |
---|---|
nc -l 2389 > test | cat testfile | nc localhost 2389 |
$ nc -w 10 localhost 2389
A conexão acima seria encerrada após 10 segundos.
$ nc -kl 2389
Desta forma o servidor permanece ativo mesmo que o cliente seja desconectado.
Uma coisa muito mais interessante de fazer é colocar um shell rápido em uma máquina remota usando a opção -l
ou listen
e a opção -e
ou execute
. Quando uma conexão é feita, o Netcat executa o programa de sua escolha e conecta o stdin
e stdout
do programa à conexão de rede.
$ nc -l -p 23 -e /bin/sh
Vamos criar um arquivo de solicitação HTTP get.txt
que contém a seguinte linha e depois uma linha em branco:
GET / HTTP/1.0
Para usar o Netcat para recuperar a página inicial de um site, use:
$ nc -v www.website.com 80 < get.txt
Você verá o Netcat fazer uma conexão com a porta 80, enviar o texto contido no arquivo get.txt
e, em seguida, gerar a resposta do servidor web para stdout
.
Em um cenário normal, se o cliente nc for desconectado, ele não tentará novamente a conexão. Com o parâmetro --retry <secs>
ou -R <secs>
, ele tentará novamente a conexão após alguns segundos.
$ nc -R 5 localhost 2389
Se você possui o docker, vamos tentar listar as imagens de nossos contêineres conectando-se ao arquivo de soquete unix do docker:
$ echo -e " GET /images/json HTTP/1.0rn " | nc -U /var/run/docker.sock
PS. para este exemplo, são necessárias permissões 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
Se você usar a opção -o
, poderá despejar todo o tráfego hexadecimal.
$ nc 127.0.0.1 4445 -o /tmp/log.txt
Por padrão, todos os soquetes criados pelo utilitário nc são protocolos TCP, mas este utilitário também funciona com o protocolo UDP. Para habilitar o protocolo UDP, o sinalizador -u é usado.
Lado do servidor | Lado do cliente |
---|---|
nc -u -l -p 2389 | nc -u localhost 2389 |
$ echo 'message' | nc -w 1 -u 192.168.1.111 514
Canalize via UDP (-u) com tempo de espera (-w) de 1 segundo para 192.168.1.111
na porta 514
.
A depuração corresponde ao modo detalhado. Você pode habilitá-lo com o parâmetro -v
ou o env var DEBUG=nc
. Este módulo usa a implementação de nó do netcat nos bastidores, para depurar ambos usam: DEBUG=netcat:*,nc
.
Rocco Musolino (@roccomuso)