Tutoriales

Módulo de descubrimiento de red rápido basado en navegador

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 es 80. 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 puerto 8080 destapado y google.co.uk es un hospedador foráneo con uno y otro 443 y 80 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 defecto 45000) que se supone que está cerrado. El control A continuación, se utiliza el tiempo para determinar el estado de otros puertos. Si la proporción delta/control es maduro que un valía establecido (predeterminado 0.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 (predeterminado http, consulte Listas negras de puertos para entender por qué es posible que desee configurarlo ftp)
  • La conexión del puerto timeout (defecto 1000 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 defecto 10 en Chrome y 17 en otros navegadores: el número mayor de conexiones simultáneas admitidas por los navegadores)
    • la port para escanear (predeterminado 45000)

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 defecto 6 – las conexiones máximas por dominio que permitirán los navegadores)
    • portCallback – una devolución de emplazamiento para ejecutar cuando un individuo host:port combinación ha terminado de escanear
    • controlPort – el puerto a escanear para determinar un delta de puerto cerrado de secante colchoneta (predeterminado 45000)
    • controlRatio – la similitud, en porcentaje, del delta de control para que un puerto se considere cerrado (predeterminado 0.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.

LEER  Millones ahora pueden ejecutar aplicaciones GUI de Linux en Windows 10

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba