
Crawlector — это фреймворк для охоты за угрозами, предназначенный для сканирования веб-сайтов на наличие вредоносных объектов.
Crawlector (название Crawlector образовано от сочетания Crawler & Detector) — это фреймворк для охоты за угрозами, предназначенный для сканирования веб-сайтов на наличие вредоносных объектов.
Примечание-1: Фреймворк был впервые представлен на конференции No Hat в Бергамо, Италия, 22 октября 2022 года (Слайды, Запись на YouTube). Также он был представлен во второй раз на конференции AVAR в Сингапуре 2 декабря 2022 года.
Примечание-2: Сопутствующий инструмент EKFiddle2Yara (инструмент, который принимает правила EKFiddle и преобразует их в правила Yara), упомянутый в докладе, также был выпущен на обеих конференциях.
Примечание-3: Версия 2.0 (Photoid Build:180923), знаковый выпуск, была выпущена 18 сентября 2023 года.
Примечание-4: Версия 2.1 (Universe-647 Build:031023) была выпущена 3 октября 2023 года. Основное дополнение — функция уведомлений Slack Alert.
Примечание-5: Версия 2.2 (Hallstatt Build:051123) была выпущена 5 ноября 2023 года. Основное дополнение — функция удаленного управления через Slack.
Примечание-6: Версия 2.3 (Munich Build:241123) была выпущена 24 ноября 2023 года. Основное дополнение — функция DNS-серверов имен.
Примечание-6: Версия 2.3.1 {Nero Build:131225} была выпущена 13 декабря 2025 года. Это исправительный выпуск.
Это для проверки вредоносных URL на каждой сканируемой странице. Фреймворк может либо запрашивать список вредоносных URL с сервера URLHaus (конфигурация: url_list_web), либо из файла на диске (конфигурация: url_list_file), и если указан последний, он имеет приоритет над первым.
Работает следующим образом: содержимое каждой страницы сравнивается со всеми записями URL в url_list_web или url_list_file, проверяя все вхождения. Кроме того, при совпадении, если опция конфигурации check_url_api установлена в true, Crawlector отправит POST-запрос к URL API, заданному в опции url_api, которая возвращает JSON-объект с дополнительной информацией о совпавшем URL. Такая информация включает urlh_status (например, online, offline, unknown), urlh_threat (например, malware_download), urlh_tags (например, elf, Mozi) и urlh_reference (например, https://urlhaus.abuse.ch/url/1116455/). Эта информация будет включена в файл журнала cl_mlog_<текущая_дата><текущее_время><(pm|am)>.csv (см. ниже), только если check_url_api установлен в true. В противном случае файл журнала будет включать столбцы urlh_url (список совпавших вредоносных URL) и urlh_hit (количество вхождений для каждого совпавшего вредоносного URL), при условии, что check_url установлен в true.
Функция URLHaus может быть полностью отключена, установив опцию конфигурации check_url в false.
Важно отметить, что эта функция может замедлить сканирование, учитывая огромное количество вредоносных URL (~ 130 миллионов записей на момент написания), которые необходимо проверить, и время, необходимое для получения дополнительной информации от сервера URLHaus (если опция check_url_api установлена в true).
Вы должны ознакомиться с файлом конфигурации cl_config.ini перед запуском любой сессии. Все разделы и параметры задокументированы в самом файле конфигурации.
Функция офлайн-сканирования Yara является автономной опцией, то есть, если она включена, Crawlector будет выполнять только эту функцию, независимо от других включенных функций. То же самое верно и для функции сканирования цифровых сертификатов доменов/сайтов. В любом случае рекомендуется отключить все неиспользуемые функции в файле конфигурации.
log_to_file или log_to_cons), если правило Yara ссылается только на атрибуты модуля (например, PE, ELF, Hash и т.д.), то Crawlector отобразит только имя правила при совпадении, исключая данные о смещении и длине.Примечание: для любой опции, принимающей путь, всегда указывайте абсолютный путь.
Чтобы посетить/отсканировать веб-сайт, список URL должен быть сохранен в текстовых файлах в каталоге "cl_sites".
Crawlector принимает три типа URL:
[a-zA-Z0-9_-]{1,128} = <url><id>[depth:<0|1>-><\d+>,total:<\d+>,sleep:<\d+>] = <url>
Например,
mfmokbel[depth:1->3,total:10,sleep:0] = https://www.mfmokbel.com
что эквивалентно:
mfmokbel[d:1->3,t:10,s:0] = https://www.mfmokbel.com
где <id> := [a-zA-Z0-9_-]{1,128}
depth, total и sleep также могут быть заменены сокращенными версиями d, t и s соответственно.
40 (10 + (10*3)) URL.Примечание 1: URL типа 3 может быть превращен в URL типа 1, установив параметр конфигурации live_crawler в false в файле конфигурации, в разделе spider.
Примечание 2: Пустые строки и строки, начинающиеся с ";", "#" или "//", игнорируются.
Функциональность паука дает Crawlector возможность находить дополнительные ссылки на целевой странице. Паук поддерживает следующие возможности:
Типа 3 для работы функциональности паукаexclude_url. Например, *.zip|*.exe|*.rar|*.zip|*.7z|*.pdf|.*bat|*.dbinclude_url. Например, */checkout/*|*/products/*exclude_httpsadd_ext_links. Эта функция учитывает опции конфигурации exclude_url и include_url.ext_links_only. Эта функция учитывает опции конфигурации exclude_url и .В релизе 2.0 ID имеют явно назначенные типы путем добавления одного из следующих типов к самому ID:
Наличие у каждого ID своего типа упрощает просмотр и фильтрацию результатов. Кроме того, это используется внутренне по разным причинам.
site_ranking в файле конфигурации предоставляет некоторые опции для изменения способа чтения CSV файлаsite предоставляет возможность расширения заданного сайта путем попытки найти все доступные домены верхнего уровня (TLD) и/или поддомены для того же домена. Если найдены, новые TLD/поддомены будут проверены как любые другие доменыrapid_api_key в файле конфигурацииfind_tlds, в дополнение к результатам TLD от API Omnisint Labs, фреймворк пытается найти другие активные/зарегистрированные домены, проходя по каждой записи TLD в tlds_file или tlds_urltlds_url, он должен указывать на URL, который содержит TLD, каждый на новой строке (строки, начинающиеся с символов ';', '#' или '//', игнорируются)tlds_file содержит имя файла со списком TLD (аналогично tlds_url; присутствует только TLD, без '.', например, "com", "org")tlds_file, он имеет приоритет над Функция перенаправления URL в предыдущих версиях была сломана. Этот релиз предоставляет полную переработку функции перенаправления с высокой степенью параметризации для управления её работой. В версии 2.0 перенаправление имеет выделенный раздел в файле конфигурации с именем [redirect]. Вся функциональность перенаправления может быть включена/отключена через опцию follow_redir в разделе [default].
Функция перенаправления проверяет коды состояния HTTP-ответа: 301, 302, 303, 307 и 308. В случае совпадения Crawlector анализирует заголовок Location для URL перенаправления, учитывая как абсолютные, так и относительные URL. Функциональность перенаправления в Crawlector разработана для производительности и гибкости. Раздел [redirect] предоставляет следующий список опций:
Опция depth принимает одно из значений: last или all. Она контролирует, какие найденные URL перенаправления посещать, в зависимости от того, включена ли опция visit. all предназначена для посещения всех найденных URL перенаправления. last предназначена для посещения последнего URL перенаправления. Посещение этих URL происходит в той же/текущей сессии. Имейте в виду, что независимо от значения depth, Crawlector записывает список всех найденных перенаправлений на URL вместе с общим количеством в абсолютной форме. Они будут записаны в CSV файл cl_mlog в столбцы redirect_urls и redirect_total.
Опция max_redirect устанавливает верхний предел общего количества обнаруженных перенаправлений URL.
Опция skip_similar лучше всего объясняется на следующем примере:
Предположим, исходный URL, переданный Crawlector для сканирования, — "https://www.mfa.gov.law", и один из найденных redirect_urls — "https://mfa.gov.law/". Как вы можете заметить, единственное отличие — косая черта в конце URL. Эти два URL одинаковы, и сервер ответит одной и той же страницей. Если опция visit установлена в true, Crawlector просканирует оба URL, тем самым тратя ресурсы и выполняя одну и ту же задачу дважды. Это может быть не проблемой для 1 или 2 URL, но если у вас тысячи URL для сканирования и опция visit включена, то вероятность того, что более половины из них будут иметь такой обнаруженный URL, очень высока, и в этом случае это становится насущной проблемой. Таким образом, установка опции skip_similar в true поможет решить эту проблему, пропуская посещение похожих URL. В дополнение к сценарию с косой чертой, опция skip_similar также учитывает следующие два сценария: если URL перенаправления отличается только одним или обоими префиксами "https://" и "www.".
Одним из основных дополнений в версии 2.0 является возможность извлекать различные типы объектов со страницы, сохранять их на диск, сканировать с помощью Yara и URLHaus и сохранять результаты в CSV файл. Для включения этой функции установите опцию extract_obj в true в разделе [page].Реализация функции глубокого извлечения объектов работает путем создания MHT-архива веб-страницы, включая внешние скрипты, изображения и CSS-файлы. Все встроенные файлы будут извлечены в путь, указанный в опции obj_dir (путь: obj_dir/objects/), где каждый файл будет просканирован. Данная реализация не является функционалом headless-браузера. DOE отличается и не включает загрузку страницы для получения всех динамически запрашиваемых URL. Поэтому у нее есть свои ограничения.
Все извлеченные объекты будут иметь часть своих метаданных, записанных в CSV-файл. О чем следует помнить при чтении CSV-файла: идентификатор домена с извлеченным объектом имеет уникальный формат: <domain_id>_<type>_p_obj_<counter> (например, _mfa_gov_cef40bc5-ba6a-41_t1_p_obj_0_). А url будет иметь следующий формат: <url>__<object_filename> (например, https://www.mfa.gov.law\_\_bilmur.min.js).
Если опция delete_obj установлена в true, то все извлеченные объекты, не обнаруженные Yara, удаляются с диска. Если опция log_all_objs установлена в true, то все метаданные извлеченных объектов записываются в тот же CSV-файл cl_mlog. Если опция check_urlhaus в разделе [page] установлена в true, то каждый извлеченный объект будет проверен через URLHaus. Обратите внимание, что параметры этой опции наследуются из раздела [urlhaus].
Примечание: если сканируемый домен перенаправляет на другой домен, то последний URL перенаправления должен быть передан DOE для работы. Более того, домен должен начинаться с "HTTP(S)://", чтобы DOE работал.
Иногда может потребоваться запускать сеансы Crawlector, которые могут длиться несколько дней, например, при сканировании топ-1 миллиона сайтов Alexa, и в таком сценарии нужен способ удаленного мониторинга работы фреймворка и его прогресса. Поэтому в релизе 2.1 я добавил функцию Slack-уведомлений, чтобы обеспечить механизм мониторинга выполнения Crawlector в реальном времени, отправляя предупреждения Yara, события std::exit(), а также предупреждения и ошибки процесса в выбранный Slack-канал. В дополнение к этому, Crawlector устанавливает обработчик консоли для попытки мониторинга определенных типов событий, включая ctrl_c, ctrl_close, ctrl_break, ctrl_logoff и ctrl_shutdown. Важно помнить, что Crawlector не изменяет поведение обработчика по умолчанию; он лишь сообщает в Slack-канал о получении любого из перечисленных событий. В будущем это может быть расширено для других типов событий.
Эта функция использует Slack REST API, а для аутентификации на сервере использует OAuth 2.0. Для её использования потребуется токен Slack API и канал с соответствующими правами. Эта функция только отправляет сообщения в Slack-канал и не принимает и не обрабатывает входящие сообщения.
Раздел [slack_alert] предоставляет следующий список опций:
Чтобы отключить или включить эту функцию, просто установите опцию alert в true или false. Кроме того, необходимо указать api_token и имя channel.
Примечание-1: На этапе инициализации Crawlector проверяет, действителен ли предоставленный токен аутентификации и задан ли канал. В случае неудачи эта функция автоматически отключается.
Все предупреждения, отправляемые в Slack-канал, публикуются под именем пользователя Crawlector v<номер_версии>, например, Crawlector v2.1. У пользователя иконка паутины. Кроме того, все предупреждения объединяются в треды, то есть все последующие предупреждения после первого стартового сообщения публикуются как ответы. Это было дизайнерским решением и помогает, если вы одновременно запускаете несколько сеансов, все сообщающих в один канал. Некоторые предупреждения используют язык разметки markdown для форматирования.
Когда процесс успешно завершается и готовится к выходу, он публикует следующее сообщение:
Crawlector завершил работу и корректно выключается
Примечание-2: Ограничение Slack на отправку сообщений через API — одно сообщение в секунду с возможностью коротких всплесков. Crawlector не ставит сообщения в очередь для обработки большего количества сообщений в секунду. В будущем это может измениться при необходимости; однако опция sleep позволяет процессу засыпать на указанное время после каждого успешно отправленного сообщения.
С выходом версии 2.2 (кодовое имя Hallstatt) я представляю возможность удаленного управления Crawlector с помощью специально разработанных контрольных команд. Причина внедрения этой функциональности — мониторинг и управление определенными аспектами сеансов, которые должны работать часами или днями. Например, вы можете захотеть включить/выключить функцию Slack-уведомлений, завершить Crawlector или загрузить файл конфигурации и другое.
Эта функция использует Slack REST API, а для аутентификации на сервере использует OAuth 2.0. Для её использования потребуется токен Slack API и канал с соответствующими правами. Токен API тот же, что используется в разделе [slack_alert], опция api_token.
Раздел [slack_alert] предоставляет следующий дополнительный список опций для функции удаленного управления:
Чтобы отключить или включить эту функцию, просто установите опцию control в true или false. Поле ctrl_channel должно содержать идентификатор канала, а не его имя. Вы можете получить его, щелкнув правой кнопкой мыши по имени канала -> Просмотреть детали канала -> Прокрутить вниз до конца окна, и вы увидите поле Channel ID: <channel_id>.
Опция ctrl_sleep определяет частоту обращения к каналу управления, указанному в опции ctrl_channel, для получения команд управления. Вы также можете обновить эту опцию с помощью команды управления cl_update_delay <time_in_ms>.
Список поддерживаемых команд управления следующий:
Примечание-1: На этапе инициализации Crawlector проверяет, действителен ли предоставленный токен аутентификации и задан ли канал. В случае неудачи эта функция автоматически отключается.
Если эта функция включена и после успешной проверки токена API, Crawlector отправляет сообщение "Crawlector готов к приему команд управления. Введите команду cl_help для списка поддерживаемых команд управления." в указанный ctrl_channel.
Все ответы на заданную команду управления объединяются в треды. Кроме того, команды управления читаются для каждого сеанса отдельно, с момента его запуска.
Примечание-2: Ограничение Slack на получение (историю сообщений) через API — один запрос в секунду с возможностью коротких всплесков. Таким образом, если опция ctrl_sleep установлена на значение меньше секунды или больше секунды, Crawlector ставит в очередь сообщения для обработки большего количества команд управления в секунду и выполняет их в порядке поступления.
С выходом версии 2.3 (кодовое имя Munich) появилась возможность указать список DNS-серверов для всех DNS-запросов и разрешений DNS-в-IP, выполняемых Crawlector, с высоким уровнем контроля. Это важно, если вы сканируете заблокированные или вредоносные сайты. Эта функция применяется ко всем функциям Crawlector, где выполняется DNS-запрос или запрос DNS-в-IP. Более того, она предоставляет возможность выполнять DNS через TLS для каждого сервера, который его поддерживает.
Раздел [dns_ns] предоставляет следующий список опций для администрирования этой функции:
Опция name_servers принимает параметризованный список DNS-серверов, разделенных запятыми. Значение этой опции имеет формат: <IPv4_адрес>(<tls_опция>) где <tls_опция> принимает одно из значений "d_tls" или "e_tls". Опции "d_tls" или "e_tls" указывают, поддерживает ли данный сервер DNS через TLS или нет, соответственно. Эта опция будет принудительно применяться в зависимости от значения, установленного для опции dns_tls. Например, запись 8.8.8.8(e_tls) означает использование DNS-сервера Google 8.8.8.8 с поддержкой TLS, тогда как запись 12.13.14.15(d_tls) означает использование DNS-сервера 12.13.14.15 без поддержки TLS.
Опция dns_tls задает требуемый уровень принудительного использования TLS. Эта опция принимает одно из значений: "yes", "no" или "force".
Опция keep_default определяет, добавлять ли сервер(ы) по умолчанию в список серверов. Предполагается, что сервер по умолчанию не поддерживает TLS.
Опция conn_time_out задает время ожидания ответа на DNS-запрос в миллисекундах.
Опция enable включает или выключает эту функциональность.
cl_sites допускаются.Приветствуются pull request'ы и issue. Комментарии и предложения очень ценятся.
Мохамад Мокбель (@MFMokbel)
include_url| id_postfix (тип) | описание |
|---|
| _t1_p | тип 1 простой без id |
| _sd | подтип для поддоменов |
| _tld | подтип для tld |
| _t2_p | тип 2 простой с id |
| _t3_s | тип 3 сканированные пауком домены |
| _t3_sc | тип 3 сканированные пауком домены с дочерним узлом |
| _t3_ss | тип 3, когда URL типа 3 (_t3_s) преобразуется в URL типа 1 |
| _t3_s_e | тип 3 сканированные пауком домены внешние ссылки |
| _obj_ | для глубокого сканирования и извлечения объектов |
| _t4_ru | для URL перенаправления (для всех типов) |
tlds_urltld_dl_time_out, для установки максимального тайм-аута для функции dnslookup при попытке проверить, разрешается ли доменtld_use_connect, эта опция включает функциональность подключения к домену через список портов, определенных в опции tlds_connect_portstlds_connect_ports принимает список портов, разделенных запятыми, или список диапазонов, например, 25-40,90-100,80,443,8443 (начало и конец диапазона включительно)
tld_con_time_out, для установки максимального тайм-аута для функции подключенияtld_con_use_ssl, включить/отключить использование SSL при попытке подключения к доменуsave_to_file_subd установлен в true, найденные поддомены будут сохранены в "\expanded\exp_subdomain_<дата><время><(pm|am)>.txt"save_to_file_tld установлен в true, найденные домены будут сохранены в "\expanded\exp_tld_<дата><время><(pm|am)>.txt"exit_here установлен в true, то Crawlector завершает работу после выполнения этой функции [site], независимо от других включенных опций. Это означает, что найденные сайты не будут сканироваться/парситься.| Команда управления | Описание |
|---|
| cl_get_date | Получает дату и время запуска Crawlector и текущую дату и время. |
| cl_ping | Отправляет обратно сообщение "Pong...". Служит для проверки работоспособности канала C&C. |
| cl_get_config | Загружает текущий используемый файл конфигурации (например, cl_config.ini) в виде текстового файла. |
| cl_update_delay <целое_число_в_миллисекундах> | Обновляет время между каждым запросом на получение команд управления. - Изменяет значение (ctrl_sleep) только для текущего сеанса. |
| cl_turn_off_slack_alert | Отключает функцию Slack-уведомлений для текущего активного сеанса. |
| cl_turn_on_slack_alert | Включает функцию Slack-уведомлений для текущего активного сеанса. |
| cl_help | Выводит это справочное сообщение. |
| cl_exit | Принудительно завершает Crawlector. |