Study/Dev/Library

Netmap.Js | 빠른 브라우저 기반 네트워크 검색 모듈

AC 2021. 8. 2. 01:43

빠른 브라우저 기반 네트워크 검색 모듈

설명

netmap.js 브라우저 기반 호스트 검색 및 포트 검색 기능을 제공하여 웹사이트 방문자의 네트워크를 매핑할 수 있습니다.

을 사용하여 상당히 빠릅니다. es6-promise-pool 2 브라우저가 허용하는 최대 동시 연결 수를 효율적으로 실행합니다.

동기 부여

작업 중인 아이디어를 위해 브라우저 기반 포트 스캐너가 필요했습니다. 기존 모듈을 가져오거나 BeEF 와 같은 다른 프로젝트에서 복사하여 붙여넣는 간단한 문제라고 생각했습니다. 1.

바로 사용할 수 있는 적절한 모듈이 없었고 BeEF npm의 port_scanner모듈은 (작성 당시) 부정확하고 느리며 Chromium에서 작동하지 않습니다.

netmap.js 따라서 모든 최신 브라우저에서 작동하는 다소 최적화된 "핑" 스위퍼 및 TCP 스캐너입니다.

빠른 시작

설치

npm install --save netmap.js

라이브 호스트 찾기

가정 환경에서 가능한 후보 목록에서 시작하여 웹사이트 방문자 게이트웨이의 IP 주소를 알아보겠습니다.

import NetMap from 'netmap.js'const netmap = new NetMap()const hosts = ['192.168.0.1', '192.168.0.254', '192.168.1.1', '192.168.1.254']netmap.pingSweep(hosts).then(results => { console.log(results)}) { "hosts": [ { "host": "192.168.0.1", "delta": 1003, "live": false }, { "host": "192.168.0.254", "delta": 1001, "live": false }, { "host": "192.168.1.1", "delta": 18, "live": true }, { "host": "192.168.1.254", "delta": 1002, "live": false } ], "meta": {}}

호스트 192.168.1.1가 살아 있는 것 같습니다.

TCP 포트 스캔

몇 개의 호스트에서 열려 있는 TCP 포트를 찾아 보겠습니다.

import NetMap from 'netmap.js'const netmap = new NetMap()const hosts = ['192.168.1.1', '192.168.99.100', 'google.co.uk']const ports = [80, 443, 8000, 8080, 27017]netmap.tcpScan(hosts, ports).then(results => { console.log(results)}) { "hosts": [ { "host": "192.168.1.1", "control": "22", "ports": [ { "port": 443, "delta": 15, "open": false }, { "port": 8000, "delta": 19, "open": false }, { "port": 8080, "delta": 21, "open": false }, { "port": 27017, "delta": 26, "open": false }, { "port": 80, "delta": 95, "open": true } ] }, { "host": "192.168.99.100", "control": "1001", "ports": [ { "port": 8080, "delta": 40, "open": true }, { "port": 80, "delta": 1001, "open": false }, { "port": 443, "delta": 1000, "open": false }, { "port": 8000, "delta": 1004, "open": false }, { "port": 27017, "delta": 1000, "open": false } ] }, { "host": "google.co.uk", "control": "1001", "ports": [ { "port": 443, "delta": 67, "open": true },< br/> { "port": 80, "delta": 159, "open": true }, { "port": 8000, "delta": 1001, "open": false }, { "port": 8080, "delta": 1002, "open": false }, { "port": 27017, "delta": 1000, "open": false } ] } ], "meta": {}}

처음에는 결과가 모순적으로 보일 수 있습니다.

192.168.1.1로컬 네트워크 세그먼트에 포함된 Linux 시스템(라우터)이고 열려 있는 유일한 포트는 80입니다. 80다른 닫힌 포트  비해 브라우저에서 오류가 발생하는 데 약 5배 더 오래 걸렸다는 것을 알 수 있습니다 .

192.168.99.100호스트 전용 VM 포트 함께 8080열고 google.co.uk모두 외부 호스트입니다 443및 80개방. 이러한 경우 브라우저는 열린 포트에서 비교적 빠르게 오류를 발생시켰지만 닫힌 포트는 단순히 시간 초과되었습니다. 이론 이 경우 더 아래 부분은 설명합니다.

포트에 열림 또는 닫힘으로 태그를 지정해야 하는지 결정하기 위해 netmap.js은(는 45000) 닫힌 것으로 간주 되는 "제어" 포트(기본값 )를 스캔합니다 . control시간은 다른 포트의 상태를 결정하는 데 사용됩니다. 비율 delta/control이 설정 값(기본값 0.8) 보다 크면 포트가 닫힌 것으로 간주됩니다(tl;dr: 제어 시간과 20% 이상 차이는 포트가 열려 있음을 의미).

제한 사항

포트 블랙리스트

브라우저는 연결을 거부할 포트(예: FTP, SSH 또는 SMTP)의 블랙리스트를 유지 관리합니다. netmap.js기본 프로토콜( http)을 사용하여 해당 포트를 스캔하려고 하면 매우 짧은 시간 초과가 발생합니다. 짧은 시간 초과는 일반적으로 포트가 닫혔다는 표시이지만 블랙리스트에 있는 포트의 경우 아무 의미가 없습니다.

다음 출처에서 블랙리스트를 확인할 수 있습니다.

전에 파이어 폭스 (61) (그리고 아마도 다른 브라우저), 그것은 사용하여이 제한을 해결하기 위해 가능 ftp프로토콜을 대신 http연결을 설정 할 수 있습니다. protocol인스턴스화할 때 옵션 개체에서 지정할 수 있습니다 NetMap. 사용할 때 ftp열린 포트는 시간 초과되고 닫힌 포트는 비교적 빠르게 오류가 발생할 것으로 예상해야 합니다. ftp스캐닝은 또한 RST이 문서에서 논의된 TCP 패킷 에 대한 제한 사항의 적용을 받습니다 .

"레거시" 프로토콜과 같은 하위 리소스 요청은 ftpChromium에서 잠시 차단되었습니다.

"핑" 스윕

에서 제공하는 "ping" 스윕 기능 netmap.js은 로컬 네트워크 세그먼트(다른 컴퓨터, 전화, 라우터, 프린터 등)에서 라이브 *nix 기반 호스트를 빠르게 찾는 데 매우 유용합니다.

그러나 구현으로 인해 TCP RST패킷이 반환 되지 않으면 작동 하지 않습니다. 일반적으로:

  • 윈도우 머신
  • 일부 외부 호스트
  • 브리지/호스트 전용 VM과 같은 일부 네트워크 설정

그 이유는 아래 이론 섹션에 설명되어 있습니다.

이 제한은 TCP 스캐닝 기능에 영향을 미치지 않으며 위의 호스트에서 열린 포트를 찾으려고 시도하여 위의 호스트가 활성 상태인지 확인할 수 있습니다.

일반적인 정확도 부족

전반적으로 이 모듈이 웹에 있는 다른 코드보다 더 정확하고 빠릅니다. 즉, 브라우저에서 네트워크를 매핑하는 전체 아이디어는 본질적으로 안절부절할 것입니다. 귀하의 마일리지가 다를 수 있습니다.

용법

NetMap 건설자

NetMap생성자는 구성 할 수있는 옵션 오브젝트를 :

  • protocol스캔에 사용 (기본값 http참조 포트 블랙리스트를 당신이 그것에을 설정할 수있는 이유에 대해 ftp)
  • 포트 연결 timeout(기본 1000밀리초)

import NetMap from 'netmap.js'const netmap = new NetMap({ protocol: 'http', timeout: 3000})

pingSweep()

 pingSweep()메서드는 지정된 호스트 배열이 활성 상태인지 확인합니다. 포트에 대한 연결 시간이 초과되었는지 확인하여 이를 수행합니다. 이 경우 호스트는 오프라인으로 간주됩니다( 제한 사항에 대해서는 "Ping" 스윕 , 이론에 대해서는 표준 사례 참조 ).

이 메서드는 다음 매개변수를 사용합니다.

  • hosts 스캔할 호스트 배열(IP 주소 또는 호스트 이름)
  • options 개체:
    • maxConnections– 최대 동시 연결 수(기본적 10으로 Chrome 및 17기타 브라우저에서 – 브라우저에서 지원하는 최대 동시 연결 수)
    • (가) port검사 (기본값 45000)

그것은 약속을 반환합니다.

netmap.pingSweep(['192.168.1.1'], { maxConnections: 5, port: 80}).then(results => { console.log(results)})

tcpScan()

 tcpScan()방법은 대상 범위에 대해 포트 스캔을 수행합니다. 표준 사례  읽고 이것이 어떻게 수행되는지 이해하십시오.

이 메서드는 다음 매개변수를 사용합니다.

  • hosts 스캔할 호스트 배열(IP 주소 또는 호스트 이름)
  • ports스캔할 포트 목록(1-65535 사이의 정수, 블랙리스트 에 있는 포트는 피하십시오 )
  • options 개체:
    • maxConnections– 최대 동시 연결 수(기본값 6– 도메인 브라우저당 최대 연결 수)
    • portCallback– 개별 host:port조합이 스캔을 완료 했을 때 실행할 콜백
    • controlPort– 기준선 폐쇄 포트 델타를 결정하기 위해 스캔할 포트(기본값 45000)
    • controlRatio– 닫힌 것으로 간주될 포트에 대한 제어 델타로부터의 유사도(%)(기본값 0.8,  참조 )

그것은 약속을 반환합니다.

netmap.tcpScan(['192.168.1.1'], [80, 27017], { maxConnections: 5, portCallback: result => { console.log(result) }, controlPort: 45000, controlRatio: 0.8}).then(results => { console.log(results)})

예를 확인하십시오 2 출력을 해석합니다.

이론

이 섹션에서는 모듈의 검색 기술에 대한 이론을 간략하게 다룹니다.

일반적인 생각

이 모듈은 Image교차 출처 리소스( http://{host}:{port}테스트 중인 일련의 URL) 를 요청하기 위해 개체를 사용 합니다 . 브라우저에서 오류를 발생시키는 데 걸리는 시간( delta) 또는 특정 시간 초과 값 후 오류가 없으면 검토 중인 호스트 및 포트의 상태에 대한 통찰력을 제공합니다.

표준 케이스

라이브 호스트는 일반적으로RST 닫힌 포트에 연결을 시도할 때 TCP 패킷 으로 비교적 빠르게 응답 합니다.

포트가 열려 있고 HTTP 서버를 실행하지 않는 경우에도 브라우저는 전체 TCP 연결을 설정한 다음 제공된 서버에서 이미지를 가져올 수 없다는 것을 깨닫는 오버헤드로 인해 오류를 발생시키는 데 시간이 조금 더 걸립니다. URL.

오프라인 호스트는 자연스럽게 응답 RST하지 않으며 전체 TCP 연결이 설정되도록 허용하지도 않습니다. 브라우저는 시간 초과(~90초) 전에 잠시 동안 연결을 설정하려고 시도합니다. netmap.js기본적으로 1000밀리초를 기다린 후 시간 초과됩니다.

요약하자면:

  • 라이브 호스트의 닫힌 포트는 매우 짧습니다. delta
  • 라이브 호스트의 열린 포트는 약간 더 길어집니다. delta
  • 오프라인 호스트 또는 사용하지 않는 IP 주소는 시간 초과됩니다.

표준 사례는 TCP 포트 스캔192.168.1.1 에서 호스트  의해 설명됩니다. 2 예.

TCP RST케이스 없음

일부 호스트(예: google.co.uk또는 Windows 호스트) 및 일부 네트워크 설정(예: VirtualBox 호스트 전용 네트워크)은 RST닫힌 포트에 도달할 때 TCP 패킷을 반환하지 않습니다 .

이러한 경우 닫힌 포트는 일반적으로 시간 초과되는 반면 열린 포트는 빠르게 오류를 발생시킵니다.

pingSweep()따라서  방법 의 구현은 RST패킷이 반환되지 않을 때 신뢰할 수 없습니다.

요약하면 RST어떤 이유로든 TCP 패킷이 반환되지 않는 경우 :

  • 라이브 호스트의 닫힌 포트가 시간 초과됩니다.
  • 라이브 호스트의 열린 포트에는 짧은 시간이 있습니다. delta
  • pingSweep() 닫힌 포트 시간 초과와 "죽은" 호스트 시간 초과를 구분할 수 없음

특별한 경우는 호스트에 의해 예시 192.168.99.100와 google.co.uk에서 TCP 포트 스캔 2 예.

WebSocket 및 AJAX 무시

WebSocket 및 AJAX를 사용하여 네트워크를 매핑할 수도 있어야 한다는 것은 잘 문서화되어 있습니다.

나는 그것을 시도했다(또한 port_scannerWebSocket과 AJAX만 있는 모듈을 사용 하도록 BeEF를 조정했다 ). 완전히 신뢰할 수 없는 결과를 생성하는 두 가지 방법을 모두 찾았습니다.

이와 관련하여 제가 놓치고 있는 부분이 있으면 알려주세요.

LIST