
Cake Fuzzer — это проект, предназначенный для автоматического и непрерывного обнаружения уязвимостей в веб-приложениях, созданных на основе определенных фреймворков, с очень малым количеством ложных срабатываний.
Последний релиз: 1.0
Лицензия: GNU GPL v3.0
Cake Fuzzer — это проект, предназначенный для автоматического и непрерывного обнаружения уязвимостей в веб-приложениях, созданных на основе определённых фреймворков, с минимальным количеством ложных срабатываний. В настоящее время он реализован для поддержки фреймворка CakePHP.
Если вы хотите узнать больше о процессе исследования, ознакомьтесь с этой серией статей: Исследование кибербезопасности приложений CakePHP
Ниже приведён список некоторых ошибок, обнаруженных Cake Fuzzer:
| Название | Критичность | Ссылка |
|---|---|---|
| Слепая SQL-инъекция в Cerebrate | 9.8 Критический | https://zigrin.com/advisories/cerebrate-blind-sql-injection/ |
| SQL-инъекция в компоненте CRUD | 8.8 Высокий | https://zigrin.com/advisories/misp-sql-injection-in-crud-component/ |
| DOM-основанный XSS | 6.1 Средний | https://zigrin.com/advisories/misp-dom-based-xss/ |
| Слепая SQL-инъекция в параметре order | 8.8 Высокий | https://zigrin.com/advisories/misp-blind-sql-injection-in-order-parameter/ |
| Слепая SQL-инъекция в параметрах массива ввода | 8.8 Высокий | https://zigrin.com/advisories/misp-blind-sql-injection-in-array-input-parameters/ |
| SQL-инъекция на основе времени в /Logs/index | 7.2 Высокий | https://zigrin.com/advisories/misp-time-based-sql-injection-in-logs-index/ |
Типичные подходы к обнаружению уязвимостей в веб-приложениях с помощью автоматизированных инструментов:
Оба метода имеют недостатки. SAST даёт высокий процент ложных срабатываний – находок, которые либо не являются уязвимостями, либо не могут быть эксплуатированы. DAST даёт меньше ложных срабатываний, но обнаруживает меньше уязвимостей из-за ограниченной информации. Также он требует определённых знаний о приложении и опыта в области безопасности от лица, запускающего сканирование. Часто для корректной работы требуется настройка сканирования для каждого приложения.
Проект Cake Fuzzer призван объединить преимущества обоих подходов и устранить указанные недостатки. Этот подход называется интерактивное тестирование безопасности приложений (IAST).
Цели проекта:
Примечание: Некоторые классы уязвимостей не являются целью Cake Fuzzer, поэтому он не сможет их обнаружить. Примеры таких классов: уязвимости бизнес-логики и проблемы контроля доступа.

Drawio: Архитектура Cake Fuzzer
Cake Fuzzer состоит из 3 основных (достаточно независимых) серверов, которые в совокупности позволяют проводить динамическое тестирование уязвимостей приложений CakePHP.
Другие компоненты:
Cake Fuzzer основан на концепции интерактивного тестирования безопасности приложений (IAST). Он содержит предопределённый набор атак, которые случайным образом модифицируются перед выполнением. Благодаря знанию внутреннего устройства приложения через фреймворк CakePHP, атаки запускаются на всех возможных точках входа приложения.
Во время атаки Cake Fuzzer отслеживает различные аспекты приложения и базовой системы, такие как:
Эти источники информации позволяют Cake Fuzzer выявлять больше уязвимостей и сообщать о них с более высокой уверенностью.
В следующем разделе описаны шаги по настройке среды разработки Cake Fuzzer, где целевым приложением является устаревший MISP v2.4.146, уязвимый к CVE-2021-41326.
Выполните следующие команды на вашей хост-операционной системе для загрузки устаревшей виртуальной машины MISP:
cd ~/Downloads # Или любое другое место, где вы хотите хранить VM MISP
wget https://vm.misp-project.org/MISP_v2.4.146@0c25b72/[email protected] -O MISP.zip
unzip MISP.zip
rm MISP.zip
mv VMware/ MISP-2.4.146
Выполните следующие действия в GUI VMWare, чтобы подготовить общий доступ к файлам Cake Fuzzer между хост-ОС и MISP:
cake_fuzzer на виртуальной машине.Выполните следующие команды на хост-ОС (замените MISP_IP_ADDRESS на ранее записанный IP-адрес):
ssh-copy-id misp@MISP_IP_ADDRESS
ssh misp@MISP_IP_ADDRESS
После подключения по SSH к MISP выполните следующие команды (в терминале MISP), чтобы завершить настройку общего доступа к файлам Cake Fuzzer между хост-ОС и MISP:
sudo apt update
sudo apt-get -y install open-vm-tools open-vm-tools-desktop
sudo apt-get -y install build-essential module-assistant linux-headers-virtual linux-image-virtual && sudo dpkg-reconfigure open-vm-tools
sudo mkdir /cake_fuzzer # Примечание: этот путь фиксирован, так как он жёстко прописан в инструментации (один из патчей)
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000 -o max_write=61440
# max_write исправляет странную ошибку копирования файлов: https://github.com/vmware/open-vm-tools/issues/437#issuecomment-669663891
ls -l /cake_fuzzer # Если всё прошло успешно, вы должны увидеть содержимое каталога Cake Fuzzer с хост-ОС. Любые изменения на хост-ОС отразятся внутри ВМ и наоборот.
Подготовьте MISP для простого тестирования (в терминале MISP):
CAKE=/var/www/MISP/app/Console/cake
SUDO='sudo -H -u www-data'
$CAKE userInit -q
$SUDO $CAKE Admin setSetting "Security.password_policy_length" 1
$SUDO $CAKE Admin setSetting "Security.password_policy_complexity" '/.*/'
$SUDO $CAKE Password [email protected] admin --override_password_change
Наконец, установите зависимости Cake Fuzzer и подготовьте виртуальное окружение (в терминале MISP):
source /cake_fuzzer/precheck.sh
Cake Fuzzer сканирует уязвимости, которые находятся внутри папки /cake_fuzzer/strategies.
Чтобы добавить новую атаку, необходимо добавить новый файл new-attack.json в папку strategies.
Каждая уязвимость содержит 2 основных поля: Scenarios и Scanners. В Scenarios хранятся базовые формы с полезными нагрузками для атаки. В Scanners, с другой стороны, находятся регулярные выражения или фразы для обнаружения в ответе, stdout, stderr, логах и результатах.
ScenariosЧтобы создать полезную нагрузку, сначала нужно понимать уязвимость и как её обнаружить с минимальным количеством полезных нагрузок.
При создании сценария старайтесь сделать полезную нагрузку максимально общей. Однако чем более общей будет нагрузка, тем выше вероятность ложных срабатываний.
Предпочтительно использовать канареечное значение, например __cakefuzzer__new-attack_§CAKEFUZZER_PAYLOAD_GUID§__ в ваших сценариях.
Канареечное значение содержит фиксированную строку (например: __cakefuzzer__new-attack_) и динамический идентификатор, который будет динамически изменяться фаззером (часть GUID §CAKEFUZZER_PAYLOAD_GUID§). Первая часть канарейки используется для того, чтобы полезная нагрузка была обнаружена Scanners. Вторая часть, GUID, преобразуется в псевдослучайное значение при каждом выполнении вашей полезной нагрузки. Таким образом, когда ваша нагрузка будет внедрена в параметр, используемый приложением, канарейка изменится на что-то вроде: __cakefuzzer__new-attack_8383938__, где 8383938 уникально для всех остальных атак.
ScannersЧтобы создать сканер, сначала нужно понять, как приложение может вести себя при срабатывании уязвимости. Существует несколько типов сканеров: response, stderr, logs, files, processes. Каждый сканер служит своей цели.
Например, при создании сканера для XSS вы будете искать признаки уязвимости в HTML-ответе приложения. Вы можете использовать сканер ResultOutputScanner для поиска канареечного значения и полезной нагрузки. С другой стороны, уязвимости SQL-инъекций могут быть обнаружены через логи ошибок. Для этой цели можно использовать LogFilesContentsScanner и ResultErrorsScanner.
Scanner — создание эффективного regex. Избегайте использования regex, которые соответствуют всем случаям, например .* или .+. Они очень затратны по времени и значительно увеличивают время, необходимое для завершения всего сканирования.Как упоминалось ранее, эффективность является важной частью уязвимостей. Как Scenarios, так и Scanners должны содержать как можно меньше элементов. Это связано с тем, что Cake Fuzzer выполняет каждый сценарий во всех возможных обнаруженных путях многократно. С другой стороны, все ответы, новые записи в логах и т.д. постоянно проверяются Scanners. Будет обнаружено множество параметров, путей и конечных точек, поэтому использование большего количества полезных нагрузок или Scanner'ов существенно влияет на эффективность.
Если вы не хотите сканировать определённый класс уязвимостей, удалите соответствующий JSON-файл из папки strategies, очистите базу данных и запустите фаззер снова.
Например, если вы не хотите сканировать ваше приложение на наличие SQL-инъекций, выполните следующие шаги:
Сначала удалите уже подготовленные сценарии атак. Для этого удалите все файлы внутри папки /cake_fuzzer/databases:
rm /cake_fuzzer/databases/*
После этого удалите файл sqlinj.json из папки /cake_fuzzer/strategies:
rm /cake_fuzzer/strategies/sqlinj.json
Наконец, снова запустите фаззер и все процессы cake_fuzzer без выполнения каких-либо атак SQL-инъекций.
git clone https://github.com/Zigrin-Security/CakeFuzzer /cake_fuzzer
Предупреждение Cake Fuzzer не будет работать должным образом, если он находится по другому пути, отличному от
/cake_fuzzer. Имейте в виду, что он должен быть размещён в корневом каталоге файловой системы, рядом с/root,/tmpи т.д.
cd /cake_fuzzer
Войдите в виртуальное окружение, если вы ещё не в нём:
source /cake_fuzzer/precheck.sh
ИЛИ
source venv/bin/activate
cp config/config.example.ini config/config.ini
Настройте config/config.ini:
WEBROOT_DIR="/var/www/html" # Путь к каталогу `webroot` тестируемого приложения
CONCURRENT_QUEUES=5 # [Опционально] Количество одновременно выполняемых атак
ONLY_PATHS_WITH_PREFIX="/" # [Опционально] Фаззер будет генерировать атаки только для путей, начинающихся с этого префикса
EXCLUDE_PATHS="" # [Опционально] Фаззер исключит из сканирования все пути, соответствующие этому регулярному выражению. Если пусто, обрабатываются все пути
PAYLOAD_GUID_PHRASE="§CAKEFUZZER_PAYLOAD_GUID§" # [Опционально] Внутреннее ключевое слово, которое заменяется перед атакой уникальным идентификатором полезной нагрузки
INSTRUMENTATION_INI="config/instrumentation_cake4.ini" # [Опционально] Путь к пользовательским инструментациям приложения.
Предупреждение Во время сканирования Cake Fuzzer множество функций вашего приложения будут вызываться неконтролируемым образом многократно. Это может привести к установке соединений с внешними сервисами, к которым подключено ваше приложение, и к получению или отправке данных от/в них. Настоятельно рекомендуется запускать Cake Fuzzer в изолированной контролируемой среде без доступа к конфиденциальным внешним сервисам.
Примечание Cake Fuzzer обходит защиту blackholing, CSRF и авторизацию. Он отправляет все атаки с привилегиями первого пользователя в базе данных. Рекомендуется, чтобы этот пользователь имел наивысшие права доступа.
Приложение состоит из нескольких компонентов.
Предупреждение Все команды cake_fuzzer должны выполняться от root.
Перед запуском фаззера убедитесь, что ваше целевое приложение полностью инструментировано:
python cake_fuzzer.py instrument check
Если есть не применённые изменения, примените их:
python cake_fuzzer.py instrument apply
Для запуска Cake Fuzzer выполните следующее (рекомендуется использовать как минимум 3 отдельных терминала):
# Первый терминал
python cake_fuzzer.py run fuzzer # Генерирует атаки, добавляет их в очередь и регистрирует новые сканеры (затем завершается)
python cake_fuzzer.py run periodic_monitors # Отвечает за мониторинг (используйте CTRL+C для остановки и завершения в конце сканирования)
# Второй терминал
python cake_fuzzer.py run iteration_monitors # Отвечает за мониторинг (используйте CTRL+C для остановки и завершения в конце сканирования)
# Третий терминал
python cake_fuzzer.py run attack_queue # Запускает очередь атак (используйте CTRL+C для остановки и завершения в конце сканирования)
# После выполнения всех атак
python cake_fuzzer.py run registry # Генерирует `results.json` на основе найденных уязвимостей
Примечание: существует ошибка, которая может изменить владельца логов (или любых других динамически изменяемых файлов целевого веб-приложения). Это может вызвать ошибки при нормальном использовании веб-приложения или даже ложноотрицательные результаты при последующих выполнениях Cake Fuzzer. Для MISP рекомендуется выполнять следующее после каждого выполнения фаззера:
sudo chown -R www-data:www-data /var/www/MISP/app/tmp/logs/
После завершения сканирования отмените инструментацию:
python cake_fuzzer.py instrument revert
Чтобы снова запустить Cake Fuzzer, выполните следующее:
Удалите логи приложения (например, для MISP логи хранятся в /var/www/MISP/app/tmp/logs):
rm /var/www/MISP/app/tmp/logs/*
Удалите все файлы внутри папки /cake_fuzzer/databases:
rm /cake_fuzzer/databases/*
Удалите файл cake_fuzzer/results.json (предварительно не забудьте сохранить или изучить результаты предыдущего сканирования):
rm /cake_fuzzer/results.json
Наконец, снова выполните предыдущий процесс запуска с 3 терминалами.
Очередь атак помечает выполненные атаки в базе данных как 'выполненные', поэтому для повторного запуска всего набора необходимо удалить базу данных и снова добавить атаки.
Убедитесь, что остановили monitors и очереди атак перед удалением базы данных.
rm database.db*
python cake_fuzzer.py run fuzzer
python cake_fuzzer.py run attack_queue
Это, вероятно, связано с тем, что предыдущие файлы журналов были перезаписаны от root. Cake Fuzzer работает от root, поэтому новые файлы журналов будут созданы с владельцем root. Удалите их:
chmod -R a+w /var/www/MISP/app/tmp/logs/*
Если вы используете виртуальную машину с общим доступом к Cake Fuzzer с хост-машиной, убедитесь, что каталог хоста правильно подключён к гостевой ВМ:
sudo vmhgfs-fuse .host:/cake_fuzzer /cake_fuzzer -o allow_other -o uid=1000
Cake Fuzzer должен находиться в корневом каталоге машины, и имя базового каталога должно быть именно cake_fuzzer.
mv CakeFuzzer/ /cake_fuzzer
instrument applyПроцесс инструментации является частью потока выполнения Cake Fuzzer. Когда вы запускаете instrument apply с последующим instrument check, обе эти команды должны приводить к одинаковому количеству изменений.
Если вы получаете какую-либо ошибку "patch", вы можете применить патчи вручную и удалить проблемный файл патча. Патчи находятся в каталоге /cake_fuzzer/cakefuzzer/instrumentation/patches.
Если при установке или запуске возникает ошибка зависимости Python, вручную установите зависимости после переключения на виртуальное окружение.
Сначала переключитесь на виртуальное окружение:
source venv/bin/activate
После этого вы можете установить зависимости с помощью pip3:
pip3 install -r requirements.txt
Этот проект был вдохновлён:
Этот проект был выполнен по заказу: