netmap.js
proporciona capacidades de exploración de puertos y detección de host basadas en navegador para permitirle mapear las redes de los visitantes del sitio web.
Es proporcionado rápido, haciendo uso de es6-promise-pool
para ejecutar de forma capaz el número mayor de conexiones simultáneas que permitirán los navegadores.
Motivación
Necesitaba un escáner de puertos basado en navegador para una idea en la que estaba trabajando. Pensé que sería una simple cuestión de importar un módulo existente o copiar y pegar desde otro esquema como BeEF.
Resulta que no había una relación aseado relación para usar. npm
módulo y el port_scanner
El módulo en BeEF es (en el momento de escribir este artículo) impreciso, sosegado y no funciona en Chromium.
netmap.js
Por lo tanto, hay un barredor de «ping» poco optimizado y un escáner TCP que funciona en todos los navegadores modernos.
Inicio rápido
Instalar en pc
npm install –save netmap.js
Encuentra anfitriones en vivo
Averigüemos la dirección IP de la puerta de enlace de un visitante del sitio web, comenzando con una relación de posibles candidatos en un entorno doméstico:
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": {} }
Huésped 192.168.1.1
parece estar vivo.
Escanear puertos TCP
- Intentemos encontrar algunos puertos TCP abiertos en algunos hosts:
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 }, { "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": {} }
- Al principio, los resultados pueden parecer contradictorios.
192.168.1.1
es una máquina Linux integrada (un enrutador) en el segmento de la red tópico, y el único puerto destapado es80
. Podemos ver que el navegador tardó unas 5 veces más en salir del error.80
en comparación con los otros puertos cerrados.
192.168.99.100
es una máquina imaginario de solo host con puerto8080
destapado ygoogle.co.uk
es un hospedador foráneo con uno y otro443
y80
destapado. En estos casos, el navegador arrojó un error relativamente rápido en los puertos abiertos, mientras que los puertos cerrados simplemente agotaron el tiempo de prórroga. La sección Teoría más debajo explica cuándo sucede esto.
- Para determinar si los puertos deben etiquetarse como abiertos o cerrados,
netmap.js
escaneará un puerto de «control» (por defecto45000
) que se supone que está cerrado. Elcontrol
A continuación, se utiliza el tiempo para determinar el estado de otros puertos. Si la proporcióndelta/control
es maduro que un valía establecido (predeterminado0.8
), se supone que el puerto está cerrado (tl; dr: una diferencia de más del 20% del tiempo de control significa que el puerto está destapado).
Limitaciones
Listas negras de puertos
Los navegadores mantienen una relación negra de puertos a los que se negarán a conectarse (como FTP, SSH o SMTP). Si intenta escanear esos puertos con netmap.js
utilizando el protocolo predeterminado (http
) obtendrá un tiempo de prórroga muy breve. Un tiempo de prórroga breve suele ser una señal de que el puerto está cerrado, pero en el caso de los puertos en la relación negra, no significa ausencia.
Puede consultar las listas negras de estas fuentes:
Ayer de Firefox 61 (y tal vez otros navegadores), es posible sortear esta valla utilizando el ftp
protocolo en emplazamiento de http
para establecer conexiones. Puede especificar el protocol
en el objeto de opciones al crear una instancia NetMap
. Cuando usas ftp
debe esperar que los puertos abiertos se agoten y que los puertos cerrados presenten errores con relativa ligereza. ftp
el escaneo todavía está sujeto a las limitaciones de TCP RST
paquetes discutidos en este documento.
Solicitudes de sub-recursos de protocolos «heredados» como ftp
han estado bloqueados durante un tiempo en Chromium.
Barredura de «ping»
La funcionalidad de barredura de «ping» proporcionada por netmap.js
hace un buen trabajo para encontrar rápidamente hosts basados en nix en vivo * en un segmento de red tópico (otras computadoras, teléfonos, enrutadores, impresoras, etc.)
Sin incautación, adecuado a la implementación, esto no funcionará cuando TCP RST
los paquetes no se devuelven. Típicamente:
- Máquinas Windows
- Algunos hosts externos
- Algunas configuraciones de red, como máquinas virtuales en puente / solo de host
La razón detrás de esto se explica en la sección Teoría a continuación.
Esta valla no afecta las capacidades de escaneo de TCP y aún es posible determinar si los hosts anteriores están activos tratando de encontrar un puerto destapado en ellos.
Desatiendo común de precisión
En común, he antagónico que este módulo es más preciso y más rápido que los otros bits de código que encontré en la web. Dicho esto, toda la idea de mapear redes desde un navegador será inquietante por naturaleza. Su experiencia puede ser diferente.
Uso
NetMap
Constructor
El NetMap
El constructor toma un objeto de opciones que le permite configurar:
- El
protocol
utilizado para escanear (predeterminadohttp
, consulte Listas negras de puertos para entender por qué es posible que desee configurarloftp
) - La conexión del puerto
timeout
(defecto1000
milisegundos)
import NetMap from 'netmap.js' const netmap = new NetMap({ protocol: 'http', timeout: 3000 })
pingSweep()
El pingSweep()
El método determina si una determinada matriz de hosts está activa. Para ello, verifica si se agota el tiempo de prórroga de la conexión a un puerto, en cuyo caso un host se considera fuera de secante (consulte Barredura de “ping” para conocer las limitaciones y Caso habitual para ver la teoría).
El método toma los siguientes parámetros:
hosts
matriz de hosts para escanear (direcciones IP o nombres de host)options
objeto con:maxConnections
– el número mayor de conexiones simultáneas (por defecto10
en Chrome y17
en otros navegadores: el número mayor de conexiones simultáneas admitidas por los navegadores)- la
port
para escanear (predeterminado45000
)
Devuelve una promesa.
netmap.pingSweep(['192.168.1.1'], { maxConnections: 5, port: 80 }).then(results => { console.log(results) })
tcpScan()
El tcpScan()
El método realizará un escaneo de puertos contra un rango de objetivos. Lea el caso habitual para comprender cómo lo hace.
El método toma los siguientes parámetros:
hosts
matriz de hosts para escanear (direcciones IP o nombres de host)ports
relación de puertos para escanear (números enteros entre 1-65535, evitar puertos en las listas negras)options
objeto con:maxConnections
– el número mayor de conexiones simultáneas (por defecto6
– las conexiones máximas por dominio que permitirán los navegadores)portCallback
– una devolución de emplazamiento para ejecutar cuando un individuohost:port
combinación ha terminado de escanearcontrolPort
– el puerto a escanear para determinar un delta de puerto cerrado de secante colchoneta (predeterminado45000
)controlRatio
– la similitud, en porcentaje, del delta de control para que un puerto se considere cerrado (predeterminado0.8
, ver ejemplo)
Devuelve una promesa.
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) })
Consulte el ejemplo para interpretar la salida.
Teoría
Esta sección cubre brevemente la teoría detrás de las técnicas de descubrimiento del módulo.
Idea común
Este módulo utiliza Image
objetos para intentar solicitar capital de origen cruzado (la serie de http://{host}:{port}
URL bajo prueba). El tiempo que tarda el navegador en producir un error (el delta
), o la desidia de error a posteriori de un cierto valía de tiempo de prórroga, proporciona información sobre el estado del host y el puerto que se está revisando.
Estuche habitual
Un hospedador en vivo por lo común objetar relativamente rápido con un TCP RST
paquete al intentar conectarse a un puerto cerrado.
Si el puerto está destapado, e incluso si no está ejecutando un servidor HTTP, el navegador tardará un poco más en producir un error adecuado a la sobrecarga de establecer una conexión TCP completa y luego darse cuenta de que no puede obtener una imagen del URL.
Un hospedador fuera de secante, lógicamente, no responderá con un RST
ni permitir que se establezca una conexión TCP completa. Los navegadores seguirán intentando establecer la conexión durante un tiempo antiguamente de que se agote el tiempo de prórroga (~ 90 segundos). netmap.js
expirará a posteriori de esperar 1000 milisegundos por defecto.
En extracto:
- Los puertos cerrados en hosts en vivo tendrán un muy corto
delta
- Los puertos abiertos en hosts en vivo tendrán un
delta
- Los hosts sin conexión o las direcciones IP no utilizadas expirarán
El caso habitual es ilustrado por el hospedador. 192.168.1.1
en el ejemplo de escaneo de puertos TCP.
Sin TCP RST
Caso
Algunos anfitriones (como google.co.uk
o hosts de Windows) y algunas configuraciones de red (como las redes de solo host de VirtualBox) no devolverán TCP RST
paquetes al ganar a un puerto cerrado.
En estos casos, los puertos cerrados generalmente expirarán, mientras que los puertos abiertos generarán rápidamente un error.
La implementación de la pingSweep()
Luego, el método no es fiable cuando RST
los paquetes no se devuelven.
En extracto, cuando TCP RST
los paquetes no se devuelven por cualquier motivo:
- Los puertos cerrados en los hosts en vivo se agotarán
- Los puertos abiertos en hosts en vivo tendrán un corto
delta
pingSweep()
no se puede distinguir entre un tiempo de prórroga de puerto cerrado y un tiempo de prórroga de host «muerto»
El caso distinto es ilustrado por los anfitriones. 192.168.99.100
y google.co.uk
en el ejemplo de escaneo de puertos TCP.
Ignorando WebSockets y AJAX
Está proporcionadamente documentado que todavía debería poder mapear redes con WebSockets y AJAX.
Lo intenté (y todavía modifiqué BeEF para probar su port_scanner
módulo con WebSockets y AJAX solamente); Encontré que uno y otro métodos producen resultados completamente poco confiables.
Por valía, avíseme si me desidia poco al respecto.