
ffuf v2.2.1
Быстрый веб-фаззер, написанный на Go

ffuf - Фаззь быстрее, дурак!
Быстрый веб-фаззер, написанный на Go.
Установка
-
Скачайте готовый бинарный файл со страницы релизов, распакуйте и запускайте!
или
-
Если вы на Windows и используете Scoop, ffuf можно установить с помощью:
scoop install ffufили
-
Если вы на Windows и используете Winget, ffuf можно установить с помощью:
winget install ffuf.ffufили
-
Если вы на macOS и используете homebrew, ffuf можно установить с помощью:
brew install ffufили
-
Если у вас установлен свежий компилятор Go:
go install github.com/ffuf/ffuf/v2@latest(эта же команда работает и для обновления)или
-
git clone https://github.com/ffuf/ffuf ; cd ffuf ; go get ; go build
- Ffuf требует Go 1.20 или новее.
- Сборка go из чекаута показывает
git-<date>-<commit>вместо тега. Локальная сборка не является официальным релизом, даже если вы находитесь на теге; встроенная в Go информация о сборке содержит коммит, но не имя тега — поэтому мы показываем точный коммит, из которого была выполнена сборка. Авторитетными версионированными бинарными файлами являются те, что находятся на странице релизов.
Примеры использования
Примеры использования ниже демонстрируют лишь простейшие задачи, которые можно выполнить с помощью ffuf.
Более подробная документация, охватывающая множество функций с большим количеством примеров, доступна в вики ffuf по адресу https://github.com/ffuf/ffuf/wiki
За более обширной документацией с примерами из реальной жизни и советами обязательно загляните в отличное руководство: «Everything you need to know about FFUF» от Майкла Скелтона (@codingo).
Вы также можете потренироваться в сканировании ffuf против живого хоста с разными уроками и сценариями использования: либо локально, используя docker-контейнер https://github.com/adamtlangley/ffufme, либо против живой размещённой версии на http://ffuf.me, созданной Адамом Лэнгли @adamtlangley.
Типичное обнаружение директорий
Используя ключевое слово FUZZ в конце URL (-u):
ffuf -w /path/to/wordlist -u https://target/FUZZ
Обнаружение виртуальных хостов (без DNS-записей)
Предполагая, что размер ответа виртуального хоста по умолчанию составляет 4242 байта, мы можем отфильтровать все ответы такого размера (-fs 4242), фаззя заголовок Host:
ffuf -w /path/to/vhost/wordlist -u https://target -H "Host: FUZZ" -fs 4242
Фаззинг GET-параметров
Фаззинг имён GET-параметров очень похож на обнаружение директорий и работает путём определения ключевого слова FUZZ как части URL. Здесь также предполагается, что неверное имя GET-параметра даёт ответ размером 4242 байта.
ffuf -w /path/to/paramnames.txt -u https://target/script.php?FUZZ=test_value -fs 4242
Если имя параметра известно, значения можно фаззить тем же способом. В этом примере предполагается, что неверное значение параметра возвращает HTTP-код ответа 401.
ffuf -w /path/to/values.txt -u https://target/script.php?valid_name=FUZZ -fc 401
Фаззинг POST-данных
Это очень простая операция, снова с использованием ключевого слова FUZZ. В этом примере фаззится только часть POST-запроса. Мы снова отфильтровываем ответы с кодом 401.
ffuf -w /path/to/postdata.txt -X POST -d "username=admin\&password=FUZZ" -u https://target/login.php -fc 401
Максимальное время выполнения
Если вы не хотите, чтобы ffuf работал бесконечно, используйте -maxtime. Это останавливает весь процесс по истечении заданного времени (в секундах).
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime 60
При работе с рекурсией вы можете управлять максимальным временем для каждой задачи с помощью -maxtime-job. Это остановит текущую задачу по истечении заданного времени (в секундах) и продолжит со следующей. Новые задачи создаются, когда функция рекурсии обнаруживает поддиректорию.
ffuf -w /path/to/wordlist -u https://target/FUZZ -maxtime-job 60 -recursion -recursion-depth 2
Также можно комбинировать оба флага, ограничивая как максимальное время выполнения для каждой задачи, так и общее время выполнения. Если вы не используете рекурсию, оба флага ведут себя одинаково.
Использование внешнего мутатора для создания тест-кейсов
В этом примере мы будем фаззить JSON-данные, отправляемые через POST. В качестве мутатора используется Radamsa.
При использовании --input-cmd ffuf отображает совпадения по их позиции. Это же значение позиции будет доступно вызываемой команде как переменная окружения $FFUF_NUM. Мы будем использовать это значение позиции в качестве сида для мутатора. Файлы example1.txt и example2.txt содержат корректные JSON-нагрузки. Мы сопоставляем все ответы, но отфильтровываем код ответа 400 - Bad request:
ffuf --input-cmd 'radamsa --seed $FFUF_NUM example1.txt example2.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/FUZZ -mc all -fc 400
Конечно, вызывать мутатор для каждой нагрузки не очень эффективно, поэтому мы можем также предварительно сгенерировать нагрузки, всё ещё используя Radamsa в качестве примера:
# Generate 1000 example payloads
radamsa -n 1000 -o %n.txt example1.txt example2.txt
# This results into files 1.txt ... 1000.txt
# Now we can just read the payload data in a loop from file for ffuf
ffuf --input-cmd 'cat $FFUF_NUM.txt' -H "Content-Type: application/json" -X POST -u https://ffuf.io.fi/ -mc all -fc 400
Конфигурационные файлы
При запуске ffuf сначала проверяет, существует ли файл конфигурации по умолчанию. Путь по умолчанию для файла ffufrc —
$XDG_CONFIG_HOME/ffuf/ffufrc. Вы можете настроить в этом файле одну или несколько опций, и они будут применяться к
каждой последующей задаче ffuf. Пример файла ffufrc можно найти
здесь.
Более подробное описание расположения файлов конфигурации можно найти в вики: https://github.com/ffuf/ffuf/wiki/Configuration

