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)