
Marco modular para el descubrimiento y análisis de directorios abiertos en la web. Rastrea URLs, extrae contenido, aplica escaneo con YARA/ClamAV y envía los resultados a MISP, SQLite o la consola para inteligencia de amenazas.
SubCrawl es un framework desarrollado por Patrick Schläpfer, Josh Stroschein y Alex Holland del equipo de Threat Research de HP Inc. SubCrawl está diseñado para encontrar, escanear y analizar directorios abiertos. El framework es modular, compuesto por cuatro componentes: módulos de entrada, módulos de procesamiento, módulos de salida y el motor de rastreo principal. Las URL son los valores de entrada primarios, que el framework analiza y añade a un sistema de colas antes de rastrearlas. El análisis de las URL es un primer paso importante, ya que toma una URL enviada y genera URLs adicionales para rastrear eliminando subdirectorios, uno a la vez, hasta que no quede ninguno. Este proceso garantiza un intento de escaneo más completo de un servidor web y puede llevar al descubrimiento de contenido adicional. Cabe destacar que SubCrawl no utiliza un método de fuerza bruta para descubrir URLs. Todo el contenido escaneado proviene de las URLs de entrada, el proceso de análisis de la URL y el descubrimiento durante el rastreo. Cuando se descubre un directorio abierto, el motor de rastreo extrae enlaces del directorio para su evaluación. El motor de rastreo determina si el enlace es otro directorio o un archivo. Los directorios se añaden a la cola de rastreo, mientras que los archivos son sometidos a un análisis adicional por los módulos de procesamiento. Se generan y almacenan resultados para cada URL escaneada, como los hashes SHA256 y difusos del contenido, si se encontró un directorio abierto, o coincidencias con reglas YARA. Finalmente, los datos de resultado se procesan según uno o más módulos de salida, de los cuales actualmente hay tres. El primero proporciona integración con MISP, el segundo simplemente imprime los datos en la consola, y el tercero almacena los datos en una base de datos SQLite. Dado que el framework es modular, no solo es fácil configurar qué módulos de entrada, procesamiento y salida se desean, sino también desarrollar nuevos módulos de manera sencilla.
Figura 1 - Arquitectura de SubCrawl
SubCrawl admite dos modos de operación diferentes. Primero, SubCrawl puede iniciarse en modo de ejecución única. En este modo, el usuario proporciona las URLs a escanear en un archivo donde cada valor de entrada está separado por un salto de línea. El segundo modo de operación es el modo servicio. En este modo, SubCrawl se ejecuta en segundo plano y depende de los módulos de entrada para suministrar las URLs a escanear. La Figura 1 muestra una visión general de la arquitectura de SubCrawl. Los componentes que se utilizan en ambos modos de operación son azules, los componentes del modo de ejecución única son amarillos y los del modo servicio son verdes.
Según el modo de ejecución elegido, deben cumplirse otras condiciones previas.
SubCrawl está escrito en Python3. Además, hay varios paquetes necesarios antes de ejecutar SubCrawl. El siguiente comando puede usarse para instalar todos los paquetes requeridos antes de ejecutar SubCrawl. Desde el directorio crawler, ejecute el siguiente comando:
$ sudo apt install build-essential
$ pip3 install -r requirements.txt
Si SubCrawl se inicia en modo servicio, esto se puede hacer mediante Docker. Por esta razón, se requiere la instalación de Docker y Docker Compose. Se pueden encontrar buenas instrucciones de instalación directamente en el sitio web de Docker.com.
SubCrawl tiene ayuda incorporada a través del argumento -h/--help o simplemente ejecutando el script sin ningún argumento.
******** ** ****** **
**////// /** **////** /**
/** ** **/** ** // ****** ****** *** ** /**
/*********/** /**/****** /** //**//* //////** //** * /** /**
////////**/** /**/**///**/** /** / ******* /** ***/** /**
/**/** /**/** /**//** ** /** **////** /****/**** /**
******** //******/****** //****** /*** //******** ***/ ///** ***
//////// ////// ///// ////// /// //////// /// /// ///
~~ Cosechando la Web Abierta ~~
usage: subcrawl.py [-h] [-f FILE_PATH] [-k] [-p PROCESSING_MODULES] [-s STORAGE_MODULES]
optional arguments:
-h, --help show this help message and exit
-f FILE_PATH, --file FILE_PATH
Path of input URL file
-k, --kafka Use Kafka Queue as input
-p PROCESSING_MODULES, --processing PROCESSING_MODULES
Processing modules to be executed comma separated.
-s STORAGE_MODULES, --storage STORAGE_MODULES
Storage modules to be executed comma separated.
Available processing modules:
- ClamAVProcessing
- JARMProcessing
- PayloadProcessing
- TLSHProcessing
- YARAProcessing
Available storage modules:
- ConsoleStorage
- MISPStorage
- SqliteStorage
Este modo es adecuado si desea escanear rápidamente una cantidad manejable de dominios. Para ello, las URLs a escanear deben guardarse en un archivo, que luego sirve como entrada para el rastreador. A continuación se muestra un ejemplo de ejecución en modo de ejecución única, notar que el argumento -f se usa con una ruta a un archivo.
python3 subcrawl.py -f urls.txt -p YARAProcessing,PayloadProcessing -s ConsoleStorage
Con el modo servicio, se puede escanear una mayor cantidad de dominios y guardar los resultados. Según el módulo de almacenamiento seleccionado, los datos pueden analizarse y evaluarse con más detalle. Para que la ejecución del modo servicio sea lo más fácil posible para el usuario, incorporamos todas las funcionalidades en una imagen Docker. En modo servicio, los dominios a escanear se obtienen a través de módulos de entrada. De forma predeterminada, se descargan nuevas URL de malware y phishing desde URLhaus y PhishTank y se ponen en cola para su escaneo. Los módulos de procesamiento y almacenamiento deseados se pueden ingresar directamente en config.yml. Por defecto, los siguientes módulos de procesamiento están activados, utilizando el almacenamiento SQLite:
Además del módulo de almacenamiento SQLite, se desarrolló una interfaz web simple que permite ver y gestionar los dominios y URLs escaneados.

Sin embargo, si esta interfaz no es suficiente para la evaluación posterior de los datos, se puede activar el módulo de almacenamiento MISP de forma alternativa o adicional. La configuración correspondiente debe realizarse en config.yml en la sección MISP.
Los siguientes dos comandos son suficientes para clonar el repositorio GIT, crear el contenedor Docker e iniciarlo directamente. Luego, la interfaz web se puede alcanzar en la dirección https://localhost:8000/. Tenga en cuenta que una vez que los contenedores se hayan iniciado, los módulos de entrada comenzarán a agregar URLs a la cola de procesamiento y el motor comenzará a rastrear hosts.
git clone https://github.com/hpthreatresearch/subcrawl.git
docker-compose up --build
Los módulos de entrada solo se utilizan en modo servicio. Si SubCrawl se inicia usando el modo de ejecución única, se debe proporcionar un archivo que contenga las URLs a escanear. Se han implementado los siguientes dos módulos de entrada.
URLhaus es un servicio web prominente que rastrea URLs maliciosas. El servicio web también proporciona exportaciones que contienen nuevas URLs detectadas. Estas URLs de malware sirven como entrada perfecta para nuestro rastreador, ya que principalmente queremos analizar dominios maliciosos. Se recuperan las URLs enviadas recientemente y los resultados de búsqueda no se refinan a través de la solicitud API (es decir, mediante etiquetas u otros parámetros disponibles). La solicitud HTTP realizada en este módulo de entrada a la API de URLHaus se puede modificar para refinar aún más los resultados obtenidos.
PhishTank es un sitio web que recopila URLs de phishing. Los usuarios tienen la posibilidad de enviar nuevas páginas de phishing encontradas. Se puede generar y descargar una exportación con URLs de phishing activas desde este servicio web a través de la API. Así que esta también es una colección ideal para nuestro rastreador.
SubCrawl incluye varios módulos de procesamiento. Los módulos de procesamiento siguen un comportamiento similar en cuanto a cómo proporcionan resultados al motor central. Si se encuentran coincidencias, los resultados se devuelven al motor central y posteriormente se proporcionan a los módulos de almacenamiento. A continuación se muestra una lista de módulos de procesamiento.
El módulo de procesamiento SDHash se utiliza para calcular un hash de similitud de la respuesta HTTP. El tamaño mínimo del contenido debe ser de 512 bytes para poder calcular exitosamente un hash. Este es probablemente el módulo de procesamiento más complicado de instalar, ya que requiere Protobuf y dependiendo del host de destino debe ser recompilado. Por lo tanto, este módulo de procesamiento está desactivado por defecto. Una versión ya compilada se puede encontrar en crawler/processing/minisdhash/ que requiere protobuf-2.5.0 y python3.6. Esos binarios fueron compilados en un Ubuntu 18.04.5 LTS x64. Siguiendo las instrucciones de instalación:
# Instalación de Protobuf
> apt-get update
> apt-get -y install libssl-dev libevent-pthreads-2.1-6 libomp-dev g++
> apt-get -y install autoconf automake libtool curl make g++ unzip
> wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.zip
> unzip protobuf-2.5.0.zip
> cd protobuf-2.5.0
> ./configure
> make
> sudo make install
# Instalación de Python3.6
> apt-get install python3.6-dev
> sudo ldconfig
# Instalación de SDHash
> git clone https://github.com/sdhash/sdhash.git
> cd sdhash
> make
> make install
> ldconfig
JARM es una herramienta que genera huellas digitales de conexiones TLS desarrollada por Salesforce. El módulo de procesamiento JARM realiza un escaneo del dominio y devuelve un hash JARM con el dominio al motor central. Dependiendo de la configuración de un servidor web, el handshake TLS tiene diferentes propiedades. Al calcular un hash de los atributos de este handshake, estas diferencias se pueden utilizar para rastrear configuraciones de servidores web.
El módulo de procesamiento TLSH es similar al módulo de procesamiento SDHash, utilizado para calcular un hash de similitud. La ventaja de TLSH es que la instalación es mucho más simple y el mínimo de entrada es más pequeño, de 50 bytes. Como la mayoría de los inicios de sesión de webshell son bastante pequeños y fueron el foco de nuestra investigación, activamos este módulo de procesamiento por defecto.
El módulo de procesamiento YARA se utiliza para escanear el contenido de la respuesta HTTP con reglas YARA. Para invocar este módulo de procesamiento, proporcione el valor YARAProcessing como argumento del módulo de procesamiento. Por ejemplo, el siguiente comando cargará el módulo de procesamiento YARA y producirá salida en la consola a través del módulo de almacenamiento ConsoleStorage.
python3 subcrawl.py -p YARAProcessing -s ConsoleStorage
Actualmente, el módulo de procesamiento YARA se utiliza para identificar inicios de sesión de webshell y otro contenido interesante. Las reglas YARA incluidas con este proyecto:
Salida de muestra:

Para agregar reglas YARA adicionales, puede agregar archivos .YAR a la carpeta yara-rules, y luego incluir el archivo de reglas agregando una declaración include en combined-rules.yar.
El módulo de procesamiento ClamAV se utiliza para escanear el contenido de la respuesta HTTP durante el escaneo con ClamAV. Si se encuentra una coincidencia, se proporciona a los diversos módulos de salida. Para invocar este módulo de procesamiento, proporcione el valor ClamAVProcessing como argumento del módulo de procesamiento. Por ejemplo, el siguiente comando cargará el módulo de procesamiento ClamAV y producirá salida en la consola a través del módulo de almacenamiento ConsoleStorage.
python3 subcrawl.py -p ClamAVProcessing -s ConsoleStorage
Salida de muestra:

Para utilizar este módulo, ClamAV debe estar instalado. Desde una terminal, instale ClamAV usando el administrador de paquetes APT:
$ sudo apt-get install clamav-daemon clamav-freshclam clamav-unofficial-sigs
Una vez instalado, el servicio de actualización de ClamAV ya debería estar en ejecución. Sin embargo, si desea actualizar manualmente usando freshclam, asegúrese de que el servicio esté detenido:
sudo systemctl stop clamav-freshclam.service
Y luego ejecute freshclam manualmente:
$ sudo freshclam
Finalmente, verifique el estado del servicio ClamAV:
$ sudo systemctl status clamav-daemon.service
Si el servicio no se está ejecutando, puede usar systemctl para iniciarlo:
$ sudo systemctl start clamav-daemon.service
El módulo de procesamiento Payload se utiliza para identificar el contenido de la respuesta HTTP utilizando la biblioteca libmagic. Además, SubCrawl se puede configurar para guardar contenido de interés, como archivos PE o archivos comprimidos. Para invocar este módulo de procesamiento, proporcione el valor PayloadProcessing como argumento del módulo de procesamiento. Por ejemplo, el siguiente comando cargará el módulo de procesamiento Payload y producirá salida en la consola:
python3 subcrawl.py -p PayloadProcessing -s ConsoleStorage
No hay dependencias adicionales para este módulo.
Salida de muestra:

Los módulos de almacenamiento son llamados por el motor de SubCrawl después de que todas las URLs de la cola han sido escaneadas. Fueron diseñados con dos objetivos: primero, obtener los resultados del escaneo inmediatamente después de finalizar la cola de escaneo y segundo, permitir el almacenamiento y análisis a largo plazo. Por lo tanto, no solo implementamos un módulo ConsoleStorage, sino también una integración para MISP y un módulo de almacenamiento SQLite.
Para analizar rápidamente los resultados directamente después de escanear URLs, se imprime una salida bien formateada en la consola. Esta salida es más adecuada cuando SubCrawl se usa en modo de ejecución única. Si bien este enfoque funcionó bien para escanear dominios individuales o generar resultados rápidos, es engorroso para la investigación y análisis a largo plazo.

También está disponible la integración con un clúster Elastic. Cada URL junto con sus datos se indexarán como un evento, esto incluirá la salida de otros módulos como Yara. También se ha agregado un panel de control predeterminado para ayudar a comenzar a usar este módulo. Serán necesarias actualizaciones en la sección elasticsearch, que incluirán:
Para usar este módulo de salida, proporcione el valor ElasticStorage con el argumento -s.
Dado que la instalación y configuración de MISP puede llevar mucho tiempo, implementamos otro módulo que almacena los datos en una base de datos SQLite. Para presentar los datos al usuario de la manera más simple y clara posible, también desarrollamos una interfaz gráfica web simple. Usando esta aplicación web, los dominios y URLs escaneados se pueden ver y buscar con todos sus atributos. Dado que esta es solo una versión temprana, aún no se han implementado características complejas de comparación.

MISP es una plataforma de inteligencia de amenazas de código abierto con un modelo de datos flexible y API para almacenar y analizar datos de amenazas. SubCrawl almacena los datos rastreados en eventos MISP, publicando un evento por dominio y agregando cualquier directorio abierto identificado como atributos. MISP también permite a los usuarios definir etiquetas para eventos y atributos. Esto es útil para la comparación de eventos y análisis de enlaces. Dado que este era uno de nuestros objetivos de investigación principales, enriquecemos los datos de URLHaus al exportar la salida de SubCrawl a MISP. URLHaus anota sus datos usando etiquetas que pueden usarse para identificar una familia de malware o actor de amenaza asociado con una URL. Para cada URL de directorio abierto, el módulo consulta los datos de URLHaus almacenados localmente y agrega etiquetas de URLHaus al evento MISP si coinciden. Para evitar tener una colección de atributos no relacionados para cada evento MISP, creamos un nuevo objeto MISP para URLs escaneadas, llamado opendir-url. Esto asegura que los atributos relacionados se mantengan juntos, facilitando la obtención de una visión general de los datos.

Se proporcionan plantillas para módulos de procesamiento y almacenamiento como parte del framework.
Los módulos de procesamiento se pueden encontrar en crawler->processing y un archivo de módulo de ejemplo example_processing.py se encuentra en este directorio. La plantilla proporciona la herencia e importaciones necesarias para garantizar la ejecución por parte del framework. La función init proporciona la inicialización del módulo y recibe una instancia del registrador (logger) y la configuración global. El registrador se utiliza para proporcionar información de registro desde los módulos de procesamiento, así como en todo el framework.
La función process se implementa para procesar cada respuesta HTTP. Con este fin, recibe la URL y el contenido de la respuesta en bruto. Aquí es donde se implementa el trabajo del módulo. Esta función debe devolver un diccionario con los siguientes campos:
Se debe definir un nombre de clase único y se utiliza para definir este módulo al incluirlo a través del argumento -p o como módulo de procesamiento predeterminado en el archivo de configuración.
Finalmente, añada una declaración de importación en __init__.py, usando su nombre de clase:
from .<REEMPLAZAR>_processing import <REEMPLAZAR>Processing
Los módulos de almacenamiento se pueden encontrar en crawler->storage y un archivo de módulo de ejemplo example_storage.py se encuentra en este directorio. De manera similar a los módulos de procesamiento, la función init proporciona la inicialización del módulo y recibe una instancia del registrador y la configuración global. La función store_results recibe datos estructurados del motor en intervalos definidos por el tamaño del lote en el archivo de configuración.
Se debe definir un nombre de clase único y se utiliza para cargar el módulo al incluirlo a través del argumento -s o como módulo de procesamiento predeterminado en el archivo de configuración.
2021:
SubCrawl está licenciado bajo la licencia MIT.