
Модульная платформа для обнаружения и анализа открытых каталогов в интернете. Сканирует URL-адреса, извлекает содержимое, применяет сканирование YARA/ClamAV и выводит результаты в MISP, SQLite или консоль для анализа угроз.
SubCrawl — это фреймворк, разработанный Патриком Шлепфером, Джошем Штрошайном и Алексом Холландом из команды Threat Research компании HP Inc. SubCrawl предназначен для поиска, сканирования и анализа открытых директорий. Фреймворк модульный и состоит из четырёх компонентов: модулей ввода, модулей обработки, модулей вывода и основного движка сканирования. Основными входными значениями являются URL-адреса, которые фреймворк разбирает и добавляет в систему очередей перед сканированием. Разбор URL-адресов — важный первый шаг: он берёт переданный URL и генерирует дополнительные URL-адреса для сканирования, последовательно удаляя поддиректории, пока таковых не останется. Этот процесс обеспечивает более полную попытку сканирования веб-сервера и может привести к обнаружению дополнительного контента. Важно отметить, что SubCrawl не использует метод перебора для обнаружения URL-адресов. Весь сканируемый контент поступает из входных URL-адресов, процесса разбора URL и обнаружения во время сканирования. Когда обнаруживается открытая директория, движок сканирования извлекает из неё ссылки для оценки. Движок определяет, является ли ссылка другой директорией или файлом. Директории добавляются в очередь сканирования, а файлы подвергаются дополнительному анализу модулями обработки. Результаты генерируются и сохраняются для каждого сканированного URL, например, SHA256 и нечёткие хеши содержимого, информация о том, была ли найдена открытая директория, или совпадения с правилами YARA. Наконец, данные результатов обрабатываются одним или несколькими модулями вывода, которых на данный момент три. Первый обеспечивает интеграцию с MISP, второй просто выводит данные в консоль, а третий сохраняет данные в базу SQLite. Поскольку фреймворк модульный, легко не только настроить нужные модули ввода, обработки и вывода, но и разработать новые модули.
Рисунок 1 — Архитектура SubCrawl
SubCrawl поддерживает два различных режима работы. Во-первых, SubCrawl можно запустить в режиме однократного выполнения. В этом режиме пользователь предоставляет URL-адреса для сканирования в файле, где каждое входное значение отделяется разрывом строки. Второй режим — сервисный. В этом режиме SubCrawl работает в фоновом режиме и полагается на модули ввода для предоставления URL-адресов для сканирования. На рисунке 1 показан обзор архитектуры SubCrawl. Компоненты, используемые в обоих режимах работы, окрашены в синий цвет, компоненты режима однократного выполнения — в жёлтый, а компоненты сервисного режима — в зелёный.
В зависимости от выбранного режима выполнения необходимо выполнить и другие предварительные условия.
SubCrawl написан на Python3. Кроме того, перед запуском SubCrawl требуется несколько пакетов. Для установки всех необходимых пакетов можно использовать следующую команду. Выполните её из каталога crawler:
$ sudo apt install build-essential
$ pip3 install -r requirements.txt
Если SubCrawl запускается в сервисном режиме, это можно сделать с помощью Docker. Поэтому требуется установка Docker и Docker Compose. Подходящие инструкции по установке можно найти на сайте Docker.com.
SubCrawl имеет встроенную справку через аргумент -h/--help или при простом выполнении скрипта без аргументов.
******** ** ****** **
**////// /** **////** /**
/** ** **/** ** // ****** ****** *** ** /**
/*********/** /**/****** /** //**//* //////** //** * /** /**
////////**/** /**/**///**/** /** / ******* /** ***/** /**
/**/** /**/** /**//** ** /** **////** /****/**** /**
******** //******/****** //****** /*** //******** ***/ ///** ***
//////// ////// ///// ////// /// //////// /// /// ///
~~ Harvesting the Open Web ~~
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
Этот режим подходит, если вы хотите быстро просканировать небольшое количество доменов. Для этого URL-адреса для сканирования необходимо сохранить в файле, который затем служит входными данными для сканера. Ниже приведён пример выполнения в режиме однократного выполнения: обратите внимание на использование аргумента -f с путём к файлу.
python3 subcrawl.py -f urls.txt -p YARAProcessing,PayloadProcessing -s ConsoleStorage
С помощью сервисного режима можно сканировать большее количество доменов и сохранять результаты. В зависимости от выбранного модуля хранения данные можно затем более подробно анализировать и оценивать. Чтобы сделать запуск сервисного режима как можно более простым для пользователя, мы встроили все функциональные возможности в образ Docker. В сервисном режиме домены для сканирования получаются через модули ввода. По умолчанию новые вредоносные URL-адреса и фишинговые URL-адреса загружаются с URLhaus и PhishTank и ставятся в очередь на сканирование. Нужные модули обработки и хранения можно указать непосредственно в config.yml. По умолчанию активированы следующие модули обработки, использующие хранилище SQLite:
В дополнение к модулю хранения SQLite был разработан простой веб-интерфейс, позволяющий просматривать и управлять сканированными доменами и URL-адресами.

Однако, если этого интерфейса недостаточно для последующей оценки данных, можно альтернативно или дополнительно активировать модуль хранения MISP. Соответствующие настройки необходимо выполнить в config.yml в разделе MISP.
Следующих двух команд достаточно, чтобы клонировать GIT-репозиторий, создать контейнер Docker и сразу его запустить. После этого веб-интерфейс будет доступен по адресу https://localhost:8000/. Обратите внимание: после запуска контейнеров модули ввода начнут добавлять URL-адреса в очередь обработки, а движок начнёт сканирование хостов.
git clone https://github.com/hpthreatresearch/subcrawl.git
docker-compose up --build
Модули ввода используются только в сервисном режиме. Если SubCrawl запущен в режиме однократного выполнения, необходимо предоставить файл с URL-адресами для сканирования. Реализованы следующие два модуля ввода.
URLhaus — это известный веб-сервис для отслеживания вредоносных URL-адресов. Веб-сервис также предоставляет экспорт с новыми обнаруженными URL-адресами. Эти вредоносные URL-адреса отлично подходят для нашего сканера, поскольку мы в основном хотим анализировать вредоносные домены. Извлекаются недавно отправленные URL-адреса, и результаты поиска не уточняются через API-запрос (например, с помощью тегов или других доступных параметров). HTTP-запрос, выполняемый в этом модуле ввода к API URLHaus, можно модифицировать для дальнейшего уточнения получаемых результатов.
PhishTank — это веб-сайт, собирающий фишинговые URL-адреса. Пользователи могут отправлять новые найденные фишинговые страницы. С помощью этого веб-сервиса через API можно создать и загрузить экспорт с активными фишинговыми URL-адресами. Так что это также идеальный источник для нашего сканера.
SubCrawl поставляется с несколькими модулями обработки. Все модули обработки следуют схожему поведению при передаче результатов обратно основному движку. Если найдены совпадения, результаты возвращаются основному движку и позже передаются модулям хранения. Ниже приведён список модулей обработки.
Модуль обработки SDHash используется для вычисления хеша схожести HTTP-ответа. Минимальный размер содержимого для успешного вычисления хеша должен составлять 512 байт. Это, вероятно, самый сложный для установки модуль обработки, так как он требует Protobuf и, в зависимости от целевого хоста, может потребовать перекомпиляции. Поэтому по умолчанию этот модуль обработки отключён. Готовую скомпилированную версию можно найти в каталоге crawler/processing/minisdhash/, для которой требуются protobuf-2.5.0 и python3.6. Эти бинарные файлы были скомпилированы на Ubuntu 18.04.5 LTS x64. Следуйте инструкциям по установке:
# Установка 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
# Установка Python3.6
> apt-get install python3.6-dev
> sudo ldconfig
# Установка SDHash
> git clone https://github.com/sdhash/sdhash.git
> cd sdhash
> make
> make install
> ldconfig
JARM — это инструмент для снятия отпечатков TLS-соединений, разработанный Salesforce. Модуль обработки JARM выполняет сканирование домена и возвращает хеш JARM вместе с доменом основному движку. В зависимости от конфигурации веб-сервера TLS-рукопожатие имеет различные свойства. Вычисляя хеш атрибутов этого рукопожатия, эти различия можно использовать для отслеживания конфигураций веб-серверов.
Модуль обработки TLSH похож на модуль SDHash и используется для вычисления хеша схожести. Преимущество TLSH в том, что установка гораздо проще, а минимальный размер входных данных меньше — 50 байт. Поскольку большинство страниц входа в веб-оболочки довольно малы и были в центре нашего исследования, мы включили этот модуль обработки по умолчанию.
Модуль обработки YARA используется для сканирования содержимого HTTP-ответа с помощью правил YARA. Чтобы вызвать этот модуль обработки, укажите значение YARAProcessing в качестве аргумента модуля обработки. Например, следующая команда загрузит модуль обработки YARA и выведет результат в консоль через модуль хранения ConsoleStorage.
python3 subcrawl.py -p YARAProcessing -s ConsoleStorage
В настоящее время модуль обработки YARA используется для идентификации страниц входа в веб-оболочки и другого интересующего контента. Правила YARA, включённые в этот проект:
Пример вывода:

Чтобы добавить дополнительные правила YARA, вы можете добавить файлы .YAR в папку yara-rules, а затем включить файл правил, добавив оператор include в файл combined-rules.yar.
Модуль обработки ClamAV используется для сканирования содержимого HTTP-ответа с помощью ClamAV во время сканирования. Если найдено совпадение, оно передаётся различным модулям вывода. Чтобы вызвать этот модуль обработки, укажите значение ClamAVProcessing в качестве аргумента модуля обработки. Например, следующая команда загрузит модуль обработки ClamAV и выведет результат в консоль через модуль хранения ConsoleStorage.
python3 subcrawl.py -p ClamAVProcessing -s ConsoleStorage
Пример вывода:

Чтобы использовать этот модуль, необходимо установить ClamAV. В терминале установите ClamAV с помощью менеджера пакетов APT:
$ sudo apt-get install clamav-daemon clamav-freshclam clamav-unofficial-sigs
После установки служба обновления ClamAV должна уже работать. Однако, если вы хотите выполнить обновление вручную с помощью freshclam, убедитесь, что служба остановлена:
sudo systemctl stop clamav-freshclam.service
А затем запустите freshclam вручную:
$ sudo freshclam
Наконец, проверьте статус службы ClamAV:
$ sudo systemctl status clamav-daemon.service
Если служба не запущена, вы можете запустить её с помощью systemctl:
$ sudo systemctl start clamav-daemon.service
Модуль обработки Payload используется для идентификации содержимого HTTP-ответа с помощью библиотеки libmagic. Кроме того, SubCrawl можно настроить на сохранение интересующего контента, такого как PE-файлы или архивы. Чтобы вызвать этот модуль обработки, укажите значение PayloadProcessing в качестве аргумента модуля обработки. Например, следующая команда загрузит модуль обработки Payload и выведет результат в консоль:
python3 subcrawl.py -p PayloadProcessing -s ConsoleStorage
Для этого модуля не требуется дополнительных зависимостей.
Пример вывода:

Модули хранения вызываются движком SubCrawl после того, как все URL-адреса из очереди отсканированы. Они были разработаны с двумя целями: во-первых, получить результаты сканирования сразу после завершения очереди сканирования, а во-вторых, обеспечить долгосрочное хранение и анализ. Поэтому мы реализовали не только модуль ConsoleStorage, но и интеграцию с MISP, а также модуль хранения SQLite.
Для быстрого анализа результатов непосредственно после сканирования URL-адресов хорошо отформатированный вывод выводится в консоль. Этот вывод лучше всего подходит для использования SubCrawl в режиме однократного выполнения. Хотя такой подход хорошо работал для сканирования отдельных доменов или получения быстрых результатов, он неудобен для долгосрочных исследований и анализа.

Также доступна интеграция с кластером Elastic. Каждый URL-адрес вместе с его данными будет индексирован как событие, что будет включать вывод от других модулей, таких как Yara. Для начала работы с этим модулем добавлена стандартная панель мониторинга. Необходимо будет внести обновления в раздел elasticsearch, включая:
Чтобы использовать этот модуль вывода, укажите значение ElasticStorage с аргументом -s.
Поскольку установка и настройка MISP может занимать много времени, мы реализовали ещё один модуль, который сохраняет данные в базе данных SQLite. Чтобы максимально просто и наглядно представить данные пользователю, мы также разработали простой веб-интерфейс. С помощью этого веб-приложения можно просматривать и искать сканированные домены и URL-адреса со всеми их атрибутами. Поскольку это только ранняя версия, сложных функций сравнения пока не реализовано.

MISP — это платформа для анализа угроз с открытым исходным кодом, имеющая гибкую модель данных и API для хранения и анализа данных об угрозах. SubCrawl сохраняет сканированные данные в событиях MISP, публикуя одно событие на домен и добавляя любые идентифицированные открытые директории в качестве атрибутов. MISP также позволяет пользователям определять теги для событий и атрибутов. Это полезно для сравнения событий и анализа связей. Поскольку это была одна из наших основных исследовательских целей, мы обогатили данные из URLHaus при экспорте вывода SubCrawl в MISP. URLHaus аннотирует свои данные с помощью тегов, которые можно использовать для идентификации семейства вредоносных программ или субъекта угрозы, связанного с URL-адресом. Для каждого URL-адреса открытой директории модуль запрашивает локально хранящиеся данные URLHaus и добавляет теги URLHaus в событие MISP, если они совпадают. Чтобы избежать набора несвязанных атрибутов для каждого события MISP, мы создали новый объект MISP для сканированных URL-адресов под названием opendir-url. Это гарантирует, что связанные атрибуты будут сгруппированы вместе, что упрощает получение общего обзора данных.

Шаблоны для модулей обработки и хранения предоставляются в составе фреймворка.
Модули обработки находятся в каталоге crawler->processing, а образец файла модуля example_processing.py находится в этом каталоге. Шаблон предоставляет необходимое наследование и импорт для обеспечения выполнения фреймворком. Функция init обеспечивает инициализацию модуля и получает экземпляр логгера и глобальную конфигурацию. Логгер используется для предоставления информации журналирования от модулей обработки, а также во всём фреймворке.
Функция process реализуется для обработки каждого HTTP-ответа. Для этого она получает URL-адрес и необработанное содержимое ответа. Именно здесь реализуется работа модуля. Эта функция должна возвращать словарь со следующими полями:
Необходимо определить уникальное имя класса, которое используется для указания этого модуля при его включении через аргумент -p или в качестве модуля обработки по умолчанию в файле конфигурации.
Наконец, добавьте оператор импорта в __init__.py, используя ваше имя класса:
from .<REPLACE>_processing import <REPLACE>Processing
Модули хранения находятся в каталоге crawler->storage, а образец файла модуля example_storage.py находится в этом каталоге. Как и в модулях обработки, функция init обеспечивает инициализацию модуля и получает экземпляр логгера и глобальную конфигурацию. Функция store_results получает структурированные данные от движка с интервалами, определёнными размером пакета в файле конфигурации.
Необходимо определить уникальное имя класса, которое используется для загрузки модуля при его включении через аргумент -s или в качестве модуля обработки по умолчанию в файле конфигурации.
2021:
SubCrawl распространяется под лицензией MIT.