
El motor de fingerprinting distribuido y modular
Scannerl es un motor modular de fingerprinting distribuido implementado por Kudelski Security. Scannerl puede generar huellas digitales de miles de objetivos en un solo host, pero también puede distribuirse fácilmente a través de múltiples hosts. Scannerl es al fingerprinting lo que zmap es al escaneo de puertos.
Scannerl funciona en Debian/Ubuntu/Arch (pero probablemente funcione en otras distribuciones también). Utiliza una arquitectura maestro/esclavo donde el nodo maestro distribuye el trabajo (host(s) a identificar) a sus esclavos (locales o remotos). Toda la implementación es transparente para el usuario.
Cuando se utilizan herramientas convencionales de fingerprinting para análisis a gran escala, los investigadores de seguridad a menudo se topan con dos limitaciones: primero, estas herramientas suelen estar diseñadas para escanear relativamente pocos hosts a la vez y no son adecuadas para grandes rangos de direcciones IP. Segundo, si se escanea un gran rango de direcciones IP protegidas por dispositivos IPS, la probabilidad de ser incluido en una lista negra es mayor, lo que podría llevar a un conjunto de información incompleto. Scannerl está diseñado para sortear estas limitaciones, no solo proporcionando la capacidad de identificar múltiples hosts simultáneamente, sino también distribuyendo la carga entre un número arbitrario de hosts. Scannerl también hace que la distribución de estas tareas sea completamente transparente, lo que hace que la configuración y el mantenimiento de proyectos de fingerprinting a gran escala sean triviales; esto permite centrarse en los análisis en lugar de la tarea hercúlea de gestionar y distribuir procesos de fingerprinting manualmente. Además del factor de velocidad, scannerl ha sido diseñado para permitir configurar fácilmente análisis de fingerprinting específicos en unas pocas líneas de código. No solo es fácil configurar un clúster de fingerprinting, sino que se puede ajustar añadiendo escaneos finamente ajustados a sus campañas de fingerprinting.
Es la herramienta más rápida para realizar campañas de fingerprinting a gran escala.
Para más información:
Tabla de contenidos
Consulte la wiki para más información.
Consulte las diferentes opciones de instalación en la página de instalación de la wiki
Para instalar desde el código fuente, primero instale Erlang (al menos v.18) eligiendo el paquete correcto para su plataforma: Descargas de Erlang
Instale los paquetes requeridos:
# en debian
$ sudo apt install erlang erlang-src rebar
# en arch
$ sudo pacman -S erlang-nox rebar
Luego compile scannerl:
$ git clone https://github.com/kudelskisecurity/scannerl.git
$ cd scannerl
$ ./build.sh
Obtenga el uso ejecutando
$ ./scannerl -h
Scannerl está disponible en AUR para usuarios de arch linux
Los DEBs (Ubuntu, Debian) están disponibles en los lanzamientos.
Los RPMs (Opensuse, Centos, Redhat) están disponibles en https://build.opensuse.org/package/show/home:chapeaurouge/scannerl.
Se necesitan dos tipos de nodos para realizar un escaneo distribuido:
El nodo maestro necesita tener scannerl instalado y compilado, mientras que el nodo(s) esclavo(s) solo necesita tener Erlang instalado. Toda la configuración es transparente y se realiza automáticamente por el nodo maestro.
Requisitos para un escaneo distribuido:
$ ./scannerl -h
____ ____ _ _ _ _ _ _____ ____ _
/ ___| / ___| / \ | \ | | \ | | ____| _ \| |
\___ \| | / _ \ | \| | \| | _| | |_) | |
___) | |___ / ___ \| |\ | |\ | |___| _ <| |___
|____/ \____/_/ \_\_| \_|_| \_|_____|_| \_\_____|
USO
scannerl MODULO OBJETIVOS [NODOS] [OPCIONES]
MODULO:
-m <mod> --module <mod>
mod: el módulo de fingerprinting a utilizar.
los argumentos se separan con dos puntos.
OBJETIVOS:
-f <objetivo> --target <objetivo>
objetivo: una lista de objetivos separados por coma.
-F <ruta> --target-file <ruta>
ruta: la ruta del archivo que contiene un objetivo por línea.
-d <dominio> --domain <dominio>
dominio: una lista de dominios separados por coma.
-D <ruta> --domain-file <ruta>
ruta: la ruta del archivo que contiene un dominio por línea.
NODOS:
-s <nodo> --slave <nodo>
nodo: una lista de nodos (nombres de host, no IPs) separados por coma.
-S <ruta> --slave-file <ruta>
ruta: la ruta del archivo que contiene un nodo por línea.
un nodo también se puede proporcionar con un multiplicador (<nodo>*<nb>).
OPCIONES:
-o <mod> --output <mod> lista separada por comas de módulo(s) de salida a utilizar.
-p <puerto> --port <puerto> el puerto a identificar.
-t <seg> --timeout <seg> tiempo de espera del proceso de fingerprinting.
-T <seg> --stimeout <seg> tiempo de espera de conexión del esclavo (por defecto: 10).
-j <nb> --max-pkt <nb> máximo de paquetes a recibir (int o "infinity").
-r <nb> --retry <nb> contador de reintentos (por defecto: 0).
-c <cidr> --prefix <cidr> subdividir rango con prefijo > cidr (por defecto: 24).
-M <puerto> --message <puerto> puerto para escuchar mensajes (por defecto: 57005).
-P <nb> --process <nb> máximo de procesos simultáneos por nodo (por defecto: 28232).
-Q <nb> --queue <nb> máximo de resultados no procesados en cola (por defecto: infinity).
-C <ruta> --config <ruta> leer argumentos desde un archivo, uno por línea.
-O <modo> --outmode <modo> 0: en el Maestro, 1: en el esclavo, >1: en el broker (por defecto: 0).
-v <val> --verbose <val> ser verboso (0 <= int <= 255).
-K <opt> --socket <opt> opción de socket separada por coma (clave[:valor]).
-l --list-modules listar módulos fp/salida disponibles.
-V --list-debug listar opciones de depuración disponibles.
-A --print-args Mostrar el registro de argumentos.
-X --priv-ports usar solo puerto de origen entre 1 y 1024.
-N --nosafe continuar incluso si algunos esclavos fallan al iniciar.
-w --www DNS intentará con www.<dominio>.
-b --progress mostrar progreso.
-x --dryrun ejecución en seco.
Consulte la wiki para más información.
Scannerl puede usarse en el host local sin ningún otro host. Sin embargo, seguirá creando un nodo esclavo en el mismo host desde el que se ejecuta. Por lo tanto, también se deben cumplir los requisitos descritos en Configuración distribuida.
Una forma rápida de hacer esto es asegurarse de que su host pueda resolverse a sí mismo con
grep -q "127.0.1.1\s*`hostname`" /etc/hosts || echo "127.0.1.1 `hostname`" | sudo tee -a /etc/hosts
y crear una clave SSH (si aún no está presente) y añadirla a authorized_keys (necesita
un servidor SSH en ejecución):
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
El siguiente ejemplo ejecuta una captura de banner HTTP en google.com desde localhost
./scannerl -m httpbg -d google.com
Para realizar un escaneo distribuido, es necesario preconfigurar los hosts que serán utilizados por scannerl para distribuir el trabajo. Consulte Configuración distribuida para más información.
Scannerl espera una lista de esclavos a utilizar (proporcionada mediante los parámetros -s o -S).
./scannerl -m httpbg -d google.com -s host1,host2,host3
Scannerl listará los módulos disponibles (módulos de salida así como módulos de fingerprinting) con el parámetro -l:
$ ./scannerl -l
Módulos de fingerprinting disponibles
================================
bacnet UDP/47808: Identificación Bacnet
chargen UDP/19: Identificación de factor de amplificación Chargen
fox TCP/1911: Identificación FOX
httpbg TCP/80: Identificación de cabecera HTTP Server
- Arg1: [true|false] seguir redirección [Por defecto:false]
httpsbg SSL/443: Identificación de cabecera HTTPS Server
https_certif SSL/443: Capturador de certificado HTTPS
imap_certif TCP/143: Capturador de certificado IMAP STARTTLS
modbus TCP/502: Identificación Modbus
mqtt TCP/1883: Identificación MQTT
mqtts TCP/8883: Identificación MQTT sobre SSL
mysql_greeting TCP/3306: Identificación de versión de Mysql
pop3_certif TCP/110: Capturador de certificado POP3 STARTTLS
smtp_certif TCP/25: Capturador de certificado SMTP STARTTLS
ssh_host_key TCP/22: Capturador de clave de host SSH
Módulos de salida disponibles
========================
csv salida a csv
- Arg1: [true|false] guardar todo [Por defecto:true]
csvfile salida a archivo csv
- Arg1: [true|false] guardar todo [Por defecto:false]
- Arg2: Ruta del archivo
file salida a archivo
- Arg1: Ruta del archivo
file_ip salida a stdout (solo ip)
- Arg1: Ruta del archivo
file_mini salida a archivo (solo ip y resultado)
- Arg1: Ruta del archivo
file_resultonly salida a archivo (solo resultado)
- Arg1: Ruta del archivo
stdout salida a stdout
stdout_ip salida a stdout (solo IP)
stdout_mini salida a stdout (solo ip y resultado)
Se pueden proporcionar argumentos a los módulos con dos puntos. Por ejemplo, para el módulo de salida file:
./scannerl -m httpbg -d google.com -o file:/tmp/result
El resultado devuelto por scannerl a los módulos de salida tiene la siguiente forma:
{módulo, objetivo, puerto, resultado}
Donde
módulo: el módulo utilizado (átomo de Erlang)objetivo: IP o nombre de host (cadena o dirección IPv4)puerto: el puerto (entero)resultado: ver más abajoLa parte resultado tiene la forma:
{{estado, tipo}, Valor}
Donde {estado, tipo} es una de las siguientes tuplas:
{ok, resultado}: el fingerprinting del objetivo tuvo éxito{error, up}: el fingerprinting no tuvo éxito pero el objetivo respondió{error, desconocido}: el fingerprinting fallóValor es el valor devuelto - puede ser un átomo o una lista de elementos.
Scannerl ha sido diseñado e implementado teniendo en cuenta la modularidad. Es fácil añadir nuevos módulos:
Para crear nuevos módulos, simplemente siga el comportamiento (fp_module.erl para módulos de fingerprinting y out_behavior.erl para módulos de salida) e implemente sus módulos.
Los nuevos módulos pueden añadirse ya sea en tiempo de compilación o dinámicamente como un archivo externo.
Consulte la página de la wiki para más información.
Siéntase libre de abrir un issue o un PR.
Copyright(c) 2017 Nagravision SA.
Este programa es software libre: puede redistribuirlo y/o modificarlo bajo los términos de la Licencia Pública General de GNU versión 3 publicada por la Free Software Foundation.
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 Licencia Pública General de GNU para más detalles.
Debería haber recibido una copia de la Licencia Pública General de GNU junto con este programa. Si no es así, consulte http://www.gnu.org/licenses/.