Este es el escáner de puertos de Internet más rápido. Se puede escanear todo el Internet en menos de 6 minutos, con una transmisión de 10 millones de paquetes por segundo.
Se obtienen resultados similares a nmap, el más famoso escáner de puertos. Internamente, funciona más como scanrand, unicornscany ZMap, mediante la transmisión asíncrona. La principal diferencia es que es más rápido que los otros escáneres. Además, es más flexible, lo que permite arbitraria rangos de direcciones y rangos de puertos.
NOTA: masscan utiliza una pila TCP personalizado / IP . Cualquier cosa que no sea escaneos de puertos simples causará conflicto con la pila TCP / IP local. Esto significa que necesita para utilizar la -S opción de utilizar una dirección IP independiente, o configurar su sistema operativo para cortafuegos los puertos que masscan usos.
En Debian / Ubuntu, que es algo como esto:
$ sudo apt-get install git gcc make libpcap-dev
$ git clone https://github.com/robertdavidgraham/masscan
$ cd masscan
$ make
Esto pone el programa en el masscan/binsubdirectorio. Vas a tener que copiar manualmente a algo así como /usr/local/binsi desea instalarlo en otro lugar del sistema.
La fuente se compone de una gran cantidad de archivos pequeños, por lo que la construcción va mucho más rápido mediante el uso de la acumulación de múltiples subprocesos:
$ make -j
Mientras que Linux es la plataforma de destino principal, el código funciona bien en muchos otros sistemas. Aquí hay alguna información adicional de construcción:
Ventanas w / Visual Studio: utilizar el proyecto VS10
Ventanas w / MingGW: sólo tiene que escribir make
Ventanas w / cygwin: no funcionará
Mac OS X / w XCode: utilizar el proyecto XCode4
Mac OS X / w cmdline: sólo tiene que escribir make
FreeBSD: Tipo gmake
Otros: No sé, no importa
PF_RING
Para ir más allá de 2 millones de paquetes / segundo, se necesita un adaptador de 10-Gbps Ethernet Intel y un controlador especial conocido como «ADN PF_RING» de http://www.ntop.org/products/pf_ring/ . Masscan no necesita ser reconstruido con el fin de utilizar PF_RING. Para utilizar PF_RING, que necesita para construir los siguientes componentes:
libpfring.so (Instalado en /usr/lib/libpfring.so)
pf_ring.ko (El controlador del núcleo)
ixgbe.ko (La versión del controlador de Ethernet de 10 Gbps de Intel)
No es necesario para construir su versión de libpcap.so.
Cuando Masscan detecta que un adaptador se llamará algo así como dna0lugar de algo así eth0, que va a cambiar automáticamente al modo PF_RING.
Pruebas de regresión
El proyecto contiene una autocomprobación integrada:
$ make regress
bin/masscan –regress
selftest: success!
Esto pone a prueba una gran cantidad de bits del código difíciles. Usted debe hacer esto después de la construcción.
Pruebas de rendimiento
Para probar el rendimiento, ejecute algo como lo siguiente:
$ bin/masscan 0.0.0.0/4 -p80 –rate 100000000 –router-mac 66-55-44-33-22-11
La falsa –router-macmantiene los paquetes en los segmentos de la red local para que no saldrán a Internet.
También puede probar en modo «fuera de línea», que es lo rápido que el programa se ejecuta sin la sobrecarga de transmisión:
$ bin/masscan 0.0.0.0/4 -p80 –rate 100000000 –offline
Este segundo punto de referencia muestra más o menos rapidez con que el programa se ejecute si estaban usando PF_RING, que tiene cerca de cero por encima.
Uso
El uso es similar al nmap. Para explorar un segmento de red para algunos puertos:
# masscan -p80,8000-8100 10.0.0.0/8
Esta voluntad:
explorar la subred 10.xxx, los 16 millones de direcciones
Análisis de puertos 80 y el rango de 8000 a 8100, o 102 direcciones en total
a la salida de impresión <stdout>que se puede redirigir a un archivo
Para ver la lista completa de opciones, utilice la –echofunción. Esto vuelca la configuración y las salidas de corriente. Esta salida se puede utilizar como entrada de nuevo en el programa:
# masscan -p80,8000-8100 10.0.0.0/8 –echo > xxx.conf
# masscan -c xxx.conf –rate 1000
la comprobación de la bandera
Masscan puede hacer algo más que detectar si los puertos están abiertos. También puede completar la conexión TCP y la interacción con la aplicación en ese puerto con el fin de apoderarse de información simple «bandera».
El problema con esto es que masscan contiene su propia pila TCP / IP separado del sistema se ejecuta en. Cuando el sistema local recibe un SYN-ACK desde el objetivo sondeado, responde con un paquete RST que mata la conexión antes de masscan puede agarrar la bandera.
La forma más sencilla de evitar esto es para asignar una dirección IP masscan separada. Esto sería similar a la siguiente:
# masscan 10.0.0.0/8 -p80 –banners –source-ip 192.168.1.200
La dirección que elija tiene que estar en la subred local y no de otra manera ser utilizado por otro sistema.
En algunos casos, tales como Wi-Fi, esto no es posible. En esos casos, puede firewall el puerto que masscan usos. Esto evita que la pila TCP / IP local de ver el paquete, pero masscan todavía lo ve, ya que no pasa por la pila local. Para Linux, esto se vería así:
# iptables -A INPUT -p tcp –dport 60000 -j DROP
# masscan 10.0.0.0/8 -p80 –banners –source-port 60000
En Mac OS X y BSD, que podría tener este aspecto:
# sudo ipfw add 1 deny tcp from any to any 60000 in
# masscan 10.0.0.0/8 -p80 –banners –source-port 60000
Ventanas no responde con paquetes RST, por lo que ninguna de estas técnicas son necesarias. Sin embargo, todavía es masscan desigend funcionar mejor utilizando su propia dirección IP, por lo que debe funcionar de esa manera cuando sea posible, incluso cuando no es estrictamente necesario.
Se necesita lo mismo para otros controles, como el –heartbleedcheque, que es sólo una forma de verificación de bandera.
Cómo analizar la totalidad de Internet
Si bien es útil para las redes internas de menor magnitud, el programa está diseñado realmente con la totalidad de Internet en mente. Podría ser algo como esto:
# masscan 0.0.0.0/0 -p0-65535
Escanear la totalidad de Internet es malo. Por un lado, partes de Internet reaccionan mal a ser explorada. Por otro lado, algunos sitios de las exploraciones de pistas y que se suman a una lista de prohibición, que le conseguirá un cortafuegos de partes útiles de Internet. Por lo tanto, desea excluir una gran cantidad de rangos. A la lista negra o excluir rangos, desea utilizar la siguiente sintaxis:
# masscan 0.0.0.0/0 -p0-65535 –excludefile exclude.txt
Esto sólo imprime los resultados a la línea de comandos. Probablemente quiere que guardan en un archivo en su lugar. Por lo tanto, usted quiere algo como:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
Esto guarda los resultados en un archivo XML, lo que le permite volcar fácilmente los resultados en una base de datos o algo así.
Sin embargo, esto sólo va a la velocidad por defecto de 100 paquetes / segundo, que se llevará siempre a explorar Internet. Es necesario para acelerarlo como tan:
# masscan 0.0.0.0/0 -p0-65535 –max-rate 100000
Esto aumenta la velocidad a 100.000 paquetes / segundo, lo que va a escanear toda la Internet (menos excluye) en aproximadamente 10 horas por puerto (o 655,360 horas si el escaneo de todos los puertos).
Lo que hay que notar acerca de esta línea de comandos es que éstas son todas nmap las opciones compatibles. Además, las opciones de «invisibles» compatibles con nmap , también se ajustan para usted: -sS -Pn -n –randomize-hosts –send-eth. Del mismo modo, el formato del archivo XML se inspira en nmap. Hay, por supuesto, muchas diferencias, porque el asíncrona naturaleza del programa conduce a un enfoque fundamentalmente diferente al problema.
La anterior línea de comandos es un poco engorroso. En lugar de poner todo en la línea de comandos, se puede almacenar en un archivo en su lugar. Los ajustes anteriores se vería así:
# My Scan
rate = 100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt
Para utilizar este archivo de configuración, utilice el -c:
# masscan -c myscan.conf
Esto también hace las cosas más fáciles cuando se repita una exploración.
Por defecto, masscan carga por primera vez el archivo de configuración /etc/masscan/masscan.conf. Cualquier parámetro de configuración posteriores prevalecen sobre lo que está en este archivo de configuración por defecto. Ahí es donde pongo mi parámetro «excludefile», por lo que no me olvides nunca. Simplemente funciona automáticamente.
salida de conseguir
El son cinco formatos principales para la salida.
xml: La opción por defecto también prodces archivos bastante grandes, pero es fácil importar en nada. Sólo tiene que utilizar el parámetro -oX <filename>. O bien, utilizar los parámetros –output-format xmly –output-filename <filename>.
binario: Este es el formato de orden interna masscan. Esto produce archivos mucho más pequeños, por lo que al realizar una búsqueda en Internet mi disco no se llena. Tienen que ser analizada, sin embargo. La opción de línea de comandos –readscanleerá los archivos de escaneo binarios. El uso de –readscanla -oXopción producirá una versión XML del archivo de resultados.
grepable: Esta es una implementación de la salida de Nmap -og y se puede analizar fácilmente mediante herramientas de línea de comandos. Sólo tiene que utilizar el parámetro -oG <filename>. O bien, utilizar los parámetros –output-format grepabley –output-filename <filename>.
JSON: Esto guarda los resultados en un formato JSON. Sólo tiene que utilizar el parámetro -oJ <filename>. O bien, utilizar los parámetros –output-format jsony –output-filename <filename>.
lista: Esta es una lista simple con un par host y el puerto por línea. Sólo tiene que utilizar el parámetro -oL <filename>. O bien, utilizar los parámetros –output-format listy –output-filename <filename>. El formato es:
<port state> <protocol> <port number> <IP address> <POSIX timestamp>
open tcp 80 XXX.XXX.XXX.XXX 1390380064
Comparación con Nmap
Cuando sea razonable, todos los esfuerzos se ha tomado para que el programa sea familiar para los nmapusuarios, aunque es fundamentalmente diferente. Dos diferencias importantes son:
no hay puertos por defecto para escanear, debe especificar -p <ports>
hosts de destino son direcciones IP o intervalos simples, no nombres DNS, ni los rangos de subred enrrollado nmappueden utilizar (como 10.0.0-255.0-255).
Se puede pensar en masscancomo tener la siguiente configuración permanentemente habilitado:
-sS: Esto hace el sondeo SYN única (en la actualidad, va a cambiar en el futuro)
-Pn: No ping a los hosts en primer lugar, que es fundamental para el funcionamiento asíncrono
-n: No pasa la resolución de DNS
–randomize-hosts: Escanear completamente al azar
–send-eth: Envía usando prima libpcap
Si desea una lista de otros nmapajustes compatibles, utilice el siguiente comando:
# masscan –nmap
De transmisión de tasa (IMPORTANTE !!)
Este programa arroja paquetes muy rápido. En Windows, o de máquinas virtuales, que puede hacer 300.000 paquetes / segundo. En Linux (sin virtualización) que va a hacer 1,6 millones de paquetes por segundo. Eso es lo suficientemente rápido como para derretir la mayoría de las redes.
Tenga en cuenta que sólo se derretirá su propia red. Se cambia aleatoriamente las direcciones IP de destino para que no debe abrumar a cualquier red distante.
Por defecto, la tasa se ajusta a 100 paquetes / segundo. Para aumentar la velocidad de un millón de uso algo así como –rate 1000000.
Diseño
En esta sección se describen los principales problemas de diseño del programa.
Disposición código
El archivo main.ccontiene la main()función, como era de esperar. También contiene el transmit_thread()y receive_thread()funciones. Estas funciones se han aplanado deliberada y muy comentado de manera que se puede leer el diseño del programa, simplemente mediante la intensificación línea por línea a través de cada uno de éstos.
Asincrónico
Se trata de una asíncrona diseño. En otras palabras, es a nmaplo que el nginxservidor web es Apache. Dispone de transmisión y de recepción separadas hilos que son en gran medida independientes unos de otros. Es el mismo tipo de diseño que se encuentran en scanrand, unicornscany ZMap.
Debido a que es asíncrona, se ejecuta más rápido que la transmisión de paquetes permite subyacente.
La aleatorización
Una diferencia clave entre Masscan y otros escáneres es la forma en que cambia aleatoriamente objetivos.
El principio fundamental es tener una sola variable de índice que comienza en cero y se incrementa en uno para cada sonda. En el código C, esto se expresa como:
for (i = 0; i < range; i++) {
scan(i);
}
Tenemos que traducir el índice en una dirección IP. Digamos que desea escanear todas las direcciones IP «privadas». Eso sería la tabla de rangos como:
192.168.0.0/16
10.0.0.0/8
172.16.0.0/20
En este ejemplo, los primeros índices de 64k se anexan a 192.168.xx para formar la dirección de destino. Entonces, el siguiente 16 millones se anexan a 10.xxx El resto de índices en la gama se aplican a 172.16.xx
En este ejemplo, sólo tenemos tres gamas. Al escanear la totalidad de Internet, que tenemos en la práctica más de 100 rangos. Eso es porque tienes a la lista negra o excluir una gran cantidad de sub-intervalos. Este chuletas hasta el rango deseado en cientos de rangos más pequeños.
Esto lleva a una de las partes más lentas del código. Nos transmitir 10 millones de paquetes por segundo, y tienen que convertir una variable de índice para una dirección IP para cada sonda. Resolvemos esto haciendo una «búsqueda binaria» en una pequeña cantidad de memoria. A este ritmo de paquetes, la eficiencia de caché comienzan a dominar sobre la eficiencia del algoritmo. Hay una gran cantidad de técnicas más eficientes en la teoría, pero todos ellos requieren tanta memoria como para ser más lenta en la práctica.
Llamamos a la función que traduce de un índice en una dirección IP de la pick()función. En uso, se ve como:
for (i = 0; i < range; i++) {
ip = pick(addresses, i);
scan(ip);
}
Masscan apoya no sólo los rangos de direcciones IP, sino también los rangos de puertos. Esto significa que necesitamos para elegir la variable de índice tanto una dirección IP y un puerto. Esto es bastante sencillo:
range = ip_count * port_count;
for (i = 0; i < range; i++) {
ip = pick(addresses, i / port_count);
port = pick(ports, i % port_count);
scan(ip, port);
}
Esto nos lleva a otra parte más costosa del código. Las instrucciones de división / módulo son alrededor de 90 ciclos de reloj, o 30 nanosegundos, en CPUs x86. Cuando se transmite a una velocidad de 10 millones de paquetes / segundo, sólo tenemos 100 nanosegundos por paquete. No veo ninguna manera de optimizar este mejor. Afortunadamente, sin embargo, dos de estas operaciones se pueden ejecutar al mismo tiempo, por lo que haciendo dos de ellos como se muestra arriba no es más caro que hacerlo uno.
En realidad, hay algunas optimizaciones fáciles para los problemas de rendimiento anteriores, pero todos ellos se basan en i++el hecho de que la variable de índice aumenta de uno en uno a través de la exploración. En realidad, tenemos que esta variable aleatoria. Tenemos que cambiar aleatoriamente el orden de direcciones IP que escaneamos o vamos a la onda expansiva a los diablos de redes de destino que no están construidos para este nivel de velocidad. Tenemos que difundir nuestro tráfico de manera uniforme sobre el objetivo.
La forma en que RANDOMIZE es simplemente mediante la encriptación de la variable de índice. Por definición, el cifrado es aleatoria, y crea una asignación 1-a-1 entre la variable de índice original y la salida. Esto significa que mientras nos vamos linealmente a través de la gama, las direcciones IP de salida son completamente al azar. En el código, esto se parece a:
range = ip_count * port_count;
for (i = 0; i < range; i++) {
x = encrypt(i);
ip = pick(addresses, x / port_count);
port = pick(ports, x % port_count);
scan(ip, port);
}
Esto también tiene un costo importante. Dado que el rango es de un tamaño impredecible en lugar de un agradable incluso potencia de 2, no podemos usar técnicas binarias baratas como AND (Y) y XOR (^). En su lugar, tenemos que utilizar costosas operaciones como módulo (%). En mis puntos de referencia actuales, que está tomando 40 nanosegundos para cifrar la variable.
Esta arquitectura permite un montón de características interesantes. Por ejemplo, es compatible con «fragmentos». Puede configurar 5 máquinas cada uno haciendo una quinta parte de la exploración, o range / shard_count. Fragmentos pueden ser múltiples máquinas, o simplemente varios adaptadores de red en la misma máquina, o incluso (si lo desea) varias direcciones IP de origen en el mismo adaptador de red.
O bien, puede utilizar una ‘semilla’ o ‘clave’ para la función de cifrado, de forma que se obtiene un orden diferente cada vez que se escanea, al igual que x = encrypt(seed, i).
También podemos hacer una pausa en la exploración saliendo fuera del programa, y simplemente recordando el valor actual de i, y reiniciarlo después. Yo hago mucho durante el desarrollo. Veo algo va mal con mi exploración de Internet, por lo que golpeó a detener la búsqueda, a continuación, reiniciarlo después de haber corregido el error.
Otra característica es retransmite / reintentos. Los paquetes se caen a veces en Internet, por lo que puede enviar dos paquetes de back-to-back. Sin embargo, algo que cae por un paquete puede caer inmediatamente siguiente paquete. Por lo tanto, desea enviar la copia de alrededor de 1 segundo de diferencia. Esto es simple. Ya tenemos una variable ‘tasa’, que es el número de la tasa de paquetes por segundo que estamos transmitiendo a, por lo que la función de retransmisión es simplemente usar i + rate como índice. Uno de estos días voy a hacer un estudio de la Internet, y diferenciar «back-to-back», «1 segundos», «10 segundos», y «1 minuto» retransmite esta manera con el fin de ver si hay es ninguna diferencia en lo que se cae.
Escalabilidad C10
La técnica asíncrona se conoce como una solución para el «problema C10K». Masscan está diseñado para el siguiente nivel de escalabilidad, el «problema C10M».
La solución C10M es evitar el kernel. Hay tres núcleo primario pasa por alto en Masscan:
controlador de red personalizado
pila TCP en modo de usuario
sincronización de modo de usuario
Masscan puede utilizar el controlador de ADN PF_RING. Este controlador DMA paquetes directamente desde la memoria en modo de usuario al controlador de red con la participación kernel cero. Eso permite que el software, incluso con una CPU lenta, para transmitir paquetes a la velocidad máxima del hardware permite. Si pones 8 tarjetas de red de 10 Gbps en una computadora, esto significa que podría transmitir a 100 millones de paquetes / segundo.
Masscan tiene su propia pila TCP incorporado para agarrar las banderas de las conexiones TCP. Esto significa que puede soportar fácilmente a 10 millones de conexiones TCP simultáneas, asumiendo por supuesto que el equipo tiene suficiente memoria.
Masscan no tiene «mutex». mutex modernos (aka. futexes) son en su mayoría en modo usuario, pero tienen dos problemas. El primer problema es que causan cache-líneas a rebotar rápidamente hacia atrás y hacia adelante entre las CPU. La segunda es que cuando hay contención, que van a hacer una llamada al sistema en el núcleo, que mata el rendimiento. Mutexes en la vía rápida de un programa limita seriamente la escalabilidad. En su lugar, Masscan utiliza «anillos» para sincronizar cosas, tales como cuando la pila TCP en modo de usuario en el hilo recibir necesita transmitir un paquete, sin interferir con el hilo de transmisión.
Portabilidad
El código funciona bien en Linux, Windows y Mac OS X. Todas las partes importantes están en C estándar (C90). Por lo tanto, compila en Visual Studio con el compilador de Microsoft, el compilador Clang / LLVM en Mac OS X, y GCC en Linux.
Windows y Mac no están sintonizados para la transmisión de paquetes, y obtener sólo alrededor de 300.000 paquetes por segundo, mientras que Linux puede hacer 1.500.000 paquetes / segundo. Eso es probablemente más rápido de lo que quiere de todos modos.
código segura
Una recompensa se ofrece en busca de vulnerabilidades, consulte el archivo VULNINFO.md para más información.
Este proyecto utiliza las funciones de seguridad como el strcpy_s()lugar de funciones no seguras gusta strcpy().
Este proyecto ha automatizado pruebas de regresión unidad ( make regress).
Compatibilidad
Una gran cantidad de esfuerzo ha ido a hacer la mirada de entrada / salida como nmap, que todo aquel que hace análisis de puertos es (o debería ser) familiarizado.