Escáner de puertos TCP, lanza paquetes SYN de forma asíncrona, escaneando todo Internet en menos de 5 minutos.
Este es un escáner de puertos a escala de Internet. Puede escanear todo Internet en menos de 5 minutos, transmitiendo 10 millones de paquetes por segundo, desde una sola máquina.
Su uso (parámetros, salida) es similar a nmap, el escáner de puertos más famoso.
En caso de duda, pruebe una de esas características: se admiten funciones que respaldan el escaneo generalizado de muchas máquinas, mientras que el escaneo profundo de una sola máquina no se admite.
Internamente, utiliza transmisión asíncrona, similar a escáneres de puertos
como scanrand, unicornscan y ZMap. Es más flexible, permitiendo
rangos de puertos y direcciones arbitrarios.
NOTA: masscan utiliza su propia pila TCP/IP ad hoc. Cualquier cosa que no sean escaneos de puertos simples puede causar conflicto con la pila TCP/IP local. Esto significa que necesita usar la opción --src-ip para ejecutarse desde una dirección IP diferente, o usar --src-port para configurar qué puertos fuente usa masscan, y luego también configurar el cortafuegos interno (como o ) para aislar esos puertos del resto del sistema operativo.
pfiptablesEsta herramienta es gratuita, pero considere contribuir económicamente a su desarrollo: Dirección de cartera Bitcoin: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T
En Debian/Ubuntu, algo como lo siguiente. Realmente no tiene más dependencias que un compilador C (como gcc o clang).
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make
Esto coloca el programa en el subdirectorio masscan/bin.
Para instalarlo (en Linux) ejecute:
make install
El código fuente consta de muchos archivos pequeños, por lo que la compilación es mucho más rápida usando la compilación multifhilo. Esto requiere más de 2 GB en una Raspberry Pi (y se rompe), por lo que podría usar un número más pequeño, como -j4 en lugar de todos los hilos posibles.
make -j
Si bien Linux es la plataforma objetivo principal, el código funciona bien en muchos otros sistemas (Windows, macOS, etc.). Aquí hay información adicional de compilación:
makemakegmakecc src/*.c -o bin/masscanEn macOS, los binarios x86 parecen funcionar igual de rápido bajo emulación ARM.
El uso es similar a nmap. Para escanear un segmento de red para algunos puertos:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112
Esto:
10.x.x.x y la subred 2603:3001:2d00:da00::x<stdout> que puede redirigirse a un archivoPara ver la lista completa de opciones, use la función --echo. Esto vuelca la configuración actual y sale. Esta salida se puede usar como entrada de nuevo al programa:
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000
Masscan puede hacer más que solo 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 para obtener información simple de "banner".
Masscan admite la verificación de banner en los siguientes protocolos:
El problema con esto es que masscan contiene su propia pila TCP/IP separada del sistema en el que se ejecuta. Cuando el sistema local recibe un SYN-ACK del objetivo probado, responde con un paquete RST que mata la conexión antes de que masscan pueda obtener el banner.
La forma más fácil de evitar esto es asignarle a masscan una dirección IP separada. Esto se vería como uno de los siguientes ejemplos:
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
# masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d
La dirección que elija debe estar en la subred local y no ser utilizada por otro sistema. Masscan le advertirá que ha cometido un error, pero podría haber alterado las comunicaciones de la otra máquina durante varios minutos, así que tenga cuidado.
En algunos casos, como WiFi, esto no es posible. En esos casos, puede cortafuegos el puerto que usa masscan. Esto evita que la pila TCP/IP local vea el paquete, pero masscan aún lo ve ya que evita la pila local. Para Linux, esto se vería así:
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000
Probablemente desee elegir puertos que no entren en conflicto con los puertos que Linux podría elegir como puertos fuente. Puede ver el rango que usa Linux y reconfigurar ese rango, mirando el archivo:
/proc/sys/net/ipv4/ip_local_port_range
En la última versión de Kali Linux (agosto de 2018), ese rango es de 32768 a 60999, por lo que debe elegir puertos por debajo de 32768 o por encima de 61000.
Establecer una regla iptables solo dura hasta el próximo reinicio. Debe buscar cómo guardar la configuración según su distribución, como usar iptables-save y/o iptables-persistent.
En Mac OS X y BSD, hay pasos similares. Para conocer los rangos a evitar, use un comando como el siguiente:
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last
En FreeBSD y MacOS antiguo, use un comando ipfw:
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000
En MacOS más reciente y OpenBSD, use la utilidad de filtro de paquetes pf.
Edite el archivo /etc/pf.conf para agregar una línea como la siguiente:
block in proto tcp from any to any port 40000:40015
Luego, para habilitar el cortafuegos, ejecute el comando:
# pfctl -E
Si el cortafuegos ya está en ejecución, reinicie o recargue las reglas con el siguiente comando:
# pfctl -f /etc/pf.conf
Windows no responde con paquetes RST, por lo que ninguna de estas técnicas es necesaria. Sin embargo, masscan sigue diseñado para funcionar mejor usando su propia dirección IP, por lo que debe ejecutarse de esa manera cuando sea posible, incluso cuando no sea estrictamente necesario.
Lo mismo se necesita para otras comprobaciones, como la comprobación --heartbleed, que es solo una forma de verificación de banner.
Si bien es útil para redes internas más pequeñas, el programa está realmente diseñado pensando en todo Internet. Podría verse algo así:
# masscan 0.0.0.0/0 -p0-65535
Escanear todo Internet es malo. Por un lado, partes de Internet reaccionan mal al ser escaneadas. Por otro lado, algunos sitios rastrean los escaneos y lo agregan a una lista de bloqueo, lo que hará que lo aíslen de partes útiles de Internet. Por lo tanto, desea excluir muchos rangos. Para listas negras o excluir rangos, desea usar la siguiente sintaxis:
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt
Esto solo imprime los resultados en la línea de comandos. Probablemente desee guardarlos en un archivo. Por lo tanto, desea algo como:
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml
Esto guarda los resultados en un archivo XML, permitiéndole volcar fácilmente los resultados en una base de datos o algo similar.
Pero, esto solo va a la velocidad predeterminada de 100 paquetes/segundo, lo que tomaría una eternidad escanear Internet. Necesita acelerarlo de la siguiente manera:
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000
Esto aumenta la velocidad a 100,000 paquetes/segundo, lo que escaneará todo Internet (menos las exclusiones) en aproximadamente 10 horas por puerto (o 655,360 horas si se escanean todos los puertos).
Lo que hay que notar sobre esta línea de comandos es que todas son opciones compatibles con nmap. Además, también se establecen opciones "invisibles" compatibles con nmap: -sS -Pn -n --randomize-hosts --send-eth. Asimismo, el formato del archivo XML está inspirado en nmap. Por supuesto, hay muchas diferencias, porque la naturaleza asíncrona del programa lleva a un enfoque fundamentalmente diferente del problema.
La línea de comandos anterior es un poco engorrosa. En lugar de poner todo en la línea de comandos, se puede almacenar en un archivo. La configuración anterior se vería así:
# Mi Escaneo
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 usar este archivo de configuración, use -c:
# masscan -c myscan.conf
Esto también facilita las cosas cuando repite un escaneo.
Por defecto, masscan primero carga el archivo de configuración /etc/masscan/masscan.conf. Cualquier parámetro de configuración posterior sobrescribe lo que está en este archivo de configuración predeterminado. Ahí es donde pongo mi parámetro "excludefile" para no olvidarlo nunca. Simplemente funciona automáticamente.
Por defecto, masscan produce archivos de texto bastante grandes, pero es fácil convertirlos a cualquier otro formato. Hay cinco formatos de salida compatibles:
xml: Simplemente use el parámetro -oX <nombre_archivo>.
O use los parámetros --output-format xml y --output-filename <nombre_archivo>.
binary: Este es el formato integrado de masscan. Produce archivos mucho más pequeños para que cuando escanee Internet mi disco no se llene. Sin embargo, deben ser analizados. La opción de línea de comandos --readscan leerá archivos de escaneo binarios. Usar --readscan con la opción -oX producirá una versión XML del archivo de resultados.
grepable: Esta es una implementación de la salida -oG de Nmap que puede ser fácilmente analizada por herramientas de línea de comandos. Simplemente use el parámetro -oG <nombre_archivo>. O use los parámetros --output-format grepable y --output-filename <nombre_archivo>.
json: Esto guarda los resultados en formato JSON. Simplemente use el parámetro -oJ <nombre_archivo>. O use los parámetros --output-format json y --output-filename <nombre_archivo>.
list: Esta es una lista simple con un par de host y puerto por línea. Simplemente use el parámetro -oL <nombre_archivo>. O use los parámetros --output-format list y --output-filename <nombre_archivo>. El formato es:
<port state> <protocol> <port number> <IP address> <POSIX timestamp>
open tcp 80 XXX.XXX.XXX.XXX 1390380064
Donde sea razonable, se ha hecho todo lo posible para que el programa sea familiar para los usuarios de nmap, aunque sea fundamentalmente diferente. Masscan está ajustado para el escaneo de amplio rango de muchas máquinas, mientras que nmap está diseñado para el escaneo intensivo de una sola máquina o un rango pequeño.
Dos diferencias importantes son:
-p <puertos>nmap puede usar (como 10.0.0-255.0-255).Puede pensar en masscan como si tuviera las siguientes configuraciones permanentemente habilitadas:
-sS: esto solo hace escaneo SYN (actualmente, cambiará en el futuro)-Pn: no hace ping a los hosts primero, lo cual es fundamental para la operación asíncrona-n: no se realiza resolución DNS--randomize-hosts: escaneo completamente aleatorizado, siempre, no puede cambiarlo--send-eth: envía usando libpcap crudoSi desea una lista de configuraciones adicionales compatibles con nmap, use el siguiente comando:
# masscan --nmap
Este programa expulsa paquetes muy rápido. En Windows, o desde máquinas virtuales, puede hacer 300,000 paquetes/segundo. En Linux (sin virtualización) hará 1.6 millones de paquetes por segundo. Eso es lo suficientemente rápido como para fundir la mayoría de las redes.
Tenga en cuenta que solo fundirá su propia red. Aleatoriza las direcciones IP de destino para que no debería abrumar a ninguna red distante.
Por defecto, la tasa está configurada en 100 paquetes/segundo. Para aumentar la tasa a un millón use algo como --rate 1000000.
Al escanear Internet IPv4, escaneará muchas subredes, por lo que aunque haya una alta tasa de paquetes salientes, cada subred de destino recibirá una pequeña tasa de paquetes entrantes.
Sin embargo, con el escaneo IPv6, tenderá a centrarse en una sola subred de destino con miles de millones de direcciones. Por lo tanto, su comportamiento predeterminado abrumará la red de destino. Las redes a menudo colapsan bajo la carga que masscan puede generar.
Esta sección describe los principales problemas de diseño del programa.
El archivo main.c contiene la función main(), como era de esperar. También contiene las funciones transmit_thread() y receive_thread(). Estas funciones se han aplanado deliberadamente y están muy comentadas para que pueda leer el diseño del programa simplemente recorriendo línea por línea cada una de ellas.
Este es un diseño asíncrono. En otras palabras, es para nmap lo que el servidor web nginx es para Apache. Tiene hilos de transmisión y recepción separados que son en gran medida independientes entre sí. Es el mismo tipo de diseño que se encuentra en scanrand, unicornscan y ZMap.
Debido a que es asíncrono, se ejecuta tan rápido como lo permite la transmisión de paquetes subyacente.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, se 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 optimizados para la transmisión de paquetes, y obtienen solo unos 300.000 paquetes por segundo, mientras que Linux puede hacer 1.500.000 paquetes/segundo. Eso probablemente sea más rápido de lo que quieres de todas formas.
Se ofrece una recompensa por vulnerabilidades; consulte el archivo VULNINFO.md para más información.
Este proyecto utiliza funciones seguras como safe_strcpy() en lugar de funciones inseguras
como strcpy().
Este proyecto tiene pruebas de regresión unitarias automatizadas (make regress).
Se ha dedicado mucho esfuerzo a hacer que la entrada/salida se parezca a nmap, con la que
todos los que hacen escaneos de puertos están (o deberían estar) familiarizados.
Masscan admite IPv6, pero no hay un modo especial; ambos son compatibles
al mismo tiempo. (No existe la opción -6, siempre está disponible).
En cualquier ejemplo de uso de masscan, simplemente ponga una dirección IPv6 donde vea una dirección IPv4. Puede incluir direcciones IPv4 e IPv6 simultáneamente en el mismo escaneo. La salida incluye la dirección adecuada en la misma ubicación, sin ninguna marca especial.
Solo recuerde que el espacio de direcciones IPv6 es realmente grande. Probablemente no quiera escanear rangos grandes, excepto quizás las primeras 64k direcciones de una subred que se asignaron mediante DHCPv6.
En cambio, probablemente querrá escanear listas grandes de direcciones almacenadas
en un archivo (--include-file filename.txt) que obtuvo de otras fuentes.
Como en cualquier otro lugar, este archivo puede contener listas de direcciones IPv4 e IPv6.
El archivo de prueba que uso contiene 8 millones de direcciones. Los archivos de ese tamaño necesitan un par
de segundos adicionales para ser leídos al inicio (masscan ordena las direcciones y elimina
duplicados antes de escanear).
Recuerde que masscan contiene su propia pila de red. Por lo tanto, la máquina local desde la que ejecuta masscan no necesita tener IPv6 habilitado, aunque la red local necesita poder enrutar paquetes IPv6.
Para superar los 2 millones de paquetes/segundo, necesita un adaptador Ethernet Intel de 10 Gbps y un controlador especial conocido como "PF_RING ZC" de ntop. Masscan no necesita ser recompilado para usar PF_RING. Para usar PF_RING, necesita compilar los siguientes componentes:
libpfring.so (instalado en /usr/lib/libpfring.so)pf_ring.ko (su controlador de kernel)ixgbe.ko (su versión del controlador Ethernet Intel de 10 Gbps)No necesita compilar su versión de libpcap.so.
Cuando Masscan detecta que un adaptador se llama algo como zc:enp1s0 en lugar
de algo como enp1s0, cambiará automáticamente al modo PF_RING ZC.
Se puede encontrar una discusión más detallada en PoC||GTFO 0x15.
El proyecto contiene una prueba unitaria integrada:
$ make test
bin/masscan --selftest
selftest: success!
Esto prueba muchas partes complicadas del código. Debería hacer esto después de compilar.
Para probar el rendimiento, ejecute algo como lo siguiente a una dirección desechable, para evitar sobrecargar su enrutador local:
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11
El --router-mac falso mantiene los paquetes en los segmentos de red local para que
no salgan a Internet.
También puede probar en modo "offline", que es la velocidad a la que se ejecuta el programa sin la sobrecarga de transmisión:
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline
Este segundo punto de referencia muestra aproximadamente la velocidad a la que se ejecutaría el programa si estuviera usando PF_RING, que tiene una sobrecarga casi nula.
Por cierto, el algoritmo de aleatorización hace un uso intensivo de la "aritmética de enteros",
una operación crónicamente lenta en las CPU. Las CPU modernas han duplicado la velocidad
a la que realizan este cálculo, haciendo que masscan sea mucho más rápido.
Esta herramienta fue creada por Robert Graham: email: [email protected] twitter: @ErrataRob
Derechos de autor (c) 2013 Robert David Graham
Este programa es software libre: puede redistribuirlo y/o modificarlo bajo los términos de la GNU Affero General Public License tal como fue publicada por la Free Software Foundation, versión 3 de la Licencia.
Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA GARANTÍA; sin siquiera la garantía implícita de COMERCIABILIDAD o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte la GNU Affero General Public License para más detalles.
Debería haber recibido una copia de la GNU Affero General Public License junto con este programa. Si no es así, consulte https://www.gnu.org/licenses/.