Исследование веб-приложений с помощью утилиты Ffuf

Как работает мощный инструмент для перебора и фаззинга

В сфере информационной безопасности и тестирования веб-приложений каждая малейшая уязвимость может привести к серьезным последствиям. Надежным помощником в обнаружении скрытых угроз и проведения глубокого анализа безопасности веб-систем может стать утилита Ffuf. Разбираемся с фаззингом с Ffuf и исследуем несколько ключевых методов его применения.

Начинаем работать с Ffuf

Ffuf — это мощный инструмент командной строки, предназначенный для перебора содержимого веб-приложений. Он позволяет автоматизировать процесс фаззинга, тем самым обнаруживая скрытые файлы и директории, а также проверяя различные параметры URL и заголовки HTTP.

Установка 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.16 или новее.

Команды Ffuf

Чтобы посмотреть, как пользоваться инструментом, начнем с выполнения команды ffuf -h. Получим следующий список:

ОПЦИИ HTTP:

-H

Заголовок "Name: Value", разделенные двоеточием. Могут приниматься несколько флагов -H

-X

HTTP метод для использования

-b

Данные cookie " Name1 = Value1; Name2 = Value2" для копирования функциональности curl

-d

Данные POST

-http2

Использовать протокол HTTP2 (по умолчанию: false)

-ignore-body

Не загружать содержимое ответа (по умолчанию: false)

-r

Следовать перенаправлениям (по умолчанию: false)

-recursion

Сканировать рекурсивно. Поддерживается только ключевое слово FUZZ, и URL (-u) должен заканчиваться им (по умолчанию: false)

-recursion-depth

Максимальная глубина рекурсии (по умолчанию: 0)

-recursion-strategy

Стратегия рекурсии: «default» для основанной на перенаправлении и «greedy» для рекурсии по всем совпадениям (по умолчанию: default)

-replay-proxy

Повторно воспроизвести совпавшие запросы, используя этот прокси

-sni

Целевой TLS SNI, не поддерживает ключевое слово FUZZ

-timeout

Тайм-аут HTTP запроса в секундах (по умолчанию: 10)

-u

Целевой URL

-x

URL прокси (SOCKS5 или HTTP). Например: http://127.0.0.1:8080 или socks5://127.0.0.1:8080

ОБЩИЕ ОПЦИИ:

-V

Показать информацию о версии (по умолчанию: false)

-ac

 Автоматическая калибровка параметров фильтрации (по умолчанию: false)

-acc

Пользовательская строка автокалибровки. Может использоваться несколько раз. Подразумевает -ac

-ach

Автокалибровка на хосте (по умолчанию: false)

-ack

Ключевое слово автокалибровки (по умолчанию: FUZZ)

-acs

Стратегия автокалибровки: «basic» или «advanced» (по умолчанию: basic)

-c

Цветной вывод. (по умолчанию: false)

-config

Загрузить конфигурацию из файла

-json

Вывод в формате JSON, вывод записей JSON с новой строки (по умолчанию: false)

-maxtime

Максимальное время работы в секундах для всего процесса (по умолчанию: 0)

-maxtime-job

Максимальное время работы в секундах для каждой задачи (по умолчанию: 0)

-noninteractive

Отключить функциональность интерактивной консоли (по умолчанию: false)

-p

Секунды «задержки» между запросами или диапазон случайной задержки. Например »0.1» или »0.1–2.0»

-rate

Скорость запросов в секунду (по умолчанию: 0)

-s

Не выводить дополнительную информацию (режим молчания) (по умолчанию: false)

-sa

Остановиться при всех случаях ошибок. Подразумевает -sf и -se (по умолчанию: false)

-se

Остановиться при случайных ошибках (по умолчанию: false)

-sf

Остановиться, когда > 95% ответов возвращают 403 Forbidden (по умолчанию: false)

-t

Количество одновременных потоков (по умолчанию: 40)

-v

Подробный вывод, печать полного URL и местоположения перенаправления (если есть) с результатами (по умолчанию: false)

ОПЦИИ СОВПАДЕНИЯ:

-mc

Совпадение HTTP статус кодов или «все» для всего (по умолчанию: 200,204,301,302,307,401,403,405,500)

-ml

Совпадение количества строк в ответе

-mmode

Оператор набора Совпадение. Либо: and, or (по умолчанию: or)

-mr

Совпадение регулярных выражений

-ms

Совпадение размера HTTP ответа

-mt

Совпадение сколько миллисекунд до первого байта ответа, либо больше или меньше. Например: >100 или <100

-mw

Совпадение количества слов в ответе

ОПЦИИ ФИЛЬТРАЦИИ:

-fc

Фильтрация HTTP статус кодов из ответа. Список кодов и диапазон

-fl

Фильтрация по количеству строк в ответе. Список количеств строк и диапазонов

-fmode

Оператор набора фильтрации. Либо: and, or (по умолчанию: or)

-fr

Фильтрация по регулярным выражениям

-fs

Фильтрация по размеру HTTP ответа. Список размеров и диапазонов

-ft

Фильтрация по времени до первого байта ответа в миллисекундах. Список значений и диапазонов

-fw

Фильтрация по количеству слов в ответе. Список количеств слов и диапазонов

ОПЦИИ ВЫВОДА:

-debug-log

Записывать всю внутреннюю информацию в указанный файл

-o

Записать вывод в файл

-od

Путь к каталогу для сохранения найденных результатов

-of

Формат файла вывода. Доступные форматы: json, ejson, html, md, csv, ecsv (или 'all' для всех форматов) (по умолчанию: json)

-or

Не создавать файл вывода, если у нас нет результатов (по умолчанию: false)

ПРИМЕРЫ ИСПОЛЬЗОВАНИЯ:

Фаззинг путей файлов из словаря wordlist.txt, сопоставление со всеми ответами, но фильтрация тех, у которых размер содержимого равен 42. Цветной, подробный вывод.

 ffuf -w wordlist.txt -u https://example.org/FUZZ -mc all -fs 42 -c -v

Фаззинг заголовка Host, совпадения с HTTP ответами 200.

ffuf -w hosts.txt -u https://example.org/ -H «Host: FUZZ» -mc 200

Фаззинг данных POST JSON. Совпадение со всеми ответами, не содержащими текст «error».

 ffuf -w entries.txt -u https://example.org/ -X POST -H «Content-Type: application/json»\

 -d '{«name»: «FUZZ», «anotherkey»: «anothervalue»}' -fr «error»

Фаззинг в нескольких местах. Совпадение только ответов, отражающих значение ключевого слова «VAL». Цветной вывод.

ffuf -w params.txt: PARAM -w values.txt: VAL -u https://example.org/? PARAM=VAL -mr «VAL» -c

 Более подробная информация и примеры: https://github.com/ffuf/ffuf

Для чего можно использовать Ffuf

Фаззинг каталогов

Один из первых шагов в тестировании веб-приложений — поиск скрытых директорий и файлов. Ffuf предоставляет удобный способ фаззинга каталогов. Он автоматизирует процесс перебора URL адресов и обнаружения скрытых ресурсов.

Исходя из предоставленного help, мы может сгенерировать команду для перебора каталог с флагами -w (словарь для перебора) и -u (URL тестируемого веб-приложения).

Полностью команда будет выглядеть следующим образом:

ffuf -w path/to/dictionary.txt -u http://server_url/FUZZ

08cde84b0e306ca1521f153d523afab7.png

В нашем тестовом примере мы видим, что Ffuf протестировал почти 90 тысяч URL-адресов за пять секунд. Скорость может варьироваться в зависимости от скорости вашего интернета.

Также есть возможность увеличить или уменьшить скорость, изменив количество потоков с помощью флага -t. По умолчанию эта опция равна 40 потокам. Однако увеличение количества потоков может быть опасно, поскольку веб-приложение может не выдержать такой нагрузки и получится DOS-атака. 

Пример с изменением количества потоков:

ffuf -w path/to/dictionary.txt -u http://server_url/FUZZ -t 200

Фаззинг файлов и расширений

Кроме того, Ffuf можно использовать, чтобы обнаружить скрытые файлы на веб-серверах. Это позволяет исследователям безопасности находить потенциально уязвимые точки в веб-приложениях.

Ранее мы обнаружили директорию secret, которая возвращает ответ 403. При переходе на эту страницу видим следующее.

93542e5d0d840ead2cb56a4b5f13834c.png

У нас недостаточно прав для того, чтобы просматривать содержимое директории.

Снова воспользуемся веб-фаззингом, чтобы увидеть, содержит ли каталог какие-либо скрытые страницы. Но сначала нужно выяснить, какие типы страниц использует веб-сайт. Например, .html, .aspx, .php. Один из распространенных способов определить это — найти тип сервера по заголовкам HTTP-ответа и угадать расширение. Например, если сервер, который мы тестируем, — apache, то он может быть .php, или если он был IIS, то это может быть .asp или .aspx, и так далее. Однако этот метод не очень практичен. 

Отличный способ узнать, какие типы страниц использует веб-сервер, — фаззинг его главной страницы index.FUZZ. Пэйлоад выглядит следующим образом:

ffuf -w path/to/dictionary.txt -u http://server_url/indexFUZZ.

Для данного тестирования, на мой взгляд, лучше всего подойдет один из словарей SecLists, а именно SecLists/Discovery/Web-Content/web-extensions.txt. 

3e02bd2ac96e8b5a22c22a65f124a7a1.png

Сервер дал ответ 200 на файл index.php. Перейдем по адресу http://fuzzing.site/index.php, чтобы убедиться в корректности работы фаззера.

68bced2ce500f98d8c2fee2c8b977706.png

Зная, что сервер использует php-файлы, мы можем приступить к фаззингу интересующей нас директории secret с соответствующим расширением .php. Расширение мы можем задать с помощью флага -e, но уже с другим словарем:  

ffuf -w Desktop/Fuzzing/SecLists/Discovery/Web-Content/directory-list-2.3-small.txt -u http://fuzzing.site/secret/FUZZ -e .php

6c85e56e9a718bc23d50e0069467a176.png

В данной директории есть файл secret.php. Проверим его наличие через браузер по адресу http://fuzzing.site/secret/secret.php

ec6a68335ba07801a0df6f3681bdc6bc.png

Бинго, мы достучались до скрытой страницы, на которую не вели никакие ссылки и никак иначе, чем посредством перебора директорий и файлов, мы бы ее не выявили.

Фаззинг поддоменов скрытых виртуальных хостов

С помощью Ffuf можно проводить фаззинг, чтобы выявить поддомены или скрытые виртуальные хосты. Это особенно важно при тестировании сетей и обнаружении возможных точек входа для злоумышленников.

Если мы обратимся к нашей тестовой лаборатории, то фазинг поддоменов будет выглядеть следующим образом. Для него также можно обратиться к одному из словарей SecLists/Discovery/DNS/subdomains-top1million-5000.txt.

cacf2010694801758bf0150ec047eb15.png

В ходе фаззинга выявили поддомен mx. Полная ссылка выглядит так: http://mx.fuzzing.site. Можем перейти по данному адресу, чтобы убедиться в том, что такой поддомен действительно существует.

Отлично, мы нашли точку входа в почту организации.

Что еще может Ffuf

Утилита позволяет также проводить фаззинг для параметров PHP, что обеспечивает проверку безопасности веб-приложений, написанных на этом языке программирования.

Наконец, Ffuf может использоваться для фаззинга значений параметров. Эта функция позволяет проверять обработку различных входных данных в веб-приложениях и выявлять потенциальные уязвимости.

С использованием Ffuf и этих методов фаззинга вы сможете провести полный анализ безопасности ваших веб-приложений и обнаружить потенциальные уязвимости, прежде чем злоумышленники смогут их использовать.

Материал подготовлен в рамках старта приёма заявок на онлайн-магистратуру »‎Информационная безопасность» от МИФИ и Skillfactory.
Всем учащимся программы будет предоставлена возможность поработать на живом оборудовании и опробовать полученные знания в лабораториях НИЯУ МИФИ. Для тех, кто не сможет подключиться очно, будет организована трансляция по ВКС, а также удаленный доступ к оборудованию.

© Habrahabr.ru