Продолжаем серию статей про полезные расширения Burp Suite.

Одной из задач начального этапа black‑box пентеста веб‑приложения является определение как можно большего количества точек взаимодействия, в том числе и скрытых. Как правило, поиск файлов/директорий/эндпоинтов приложения является базовым знанием для начинающего пентестера и не представляет трудностей в освоении. Другое дело обстоит с поиском параметров. С одной стороны, концептуально он ничем не отличается от перебора директорий в веб‑приложении, с другой — для выполнения этой задачи существует не так много инструментов.

Речь в данной статье пойдет о Param Miner — расширении для Burp Suite. Как и многие расширения (например, Turbo Intruder) под авторством Джеймса Кеттла, Param Miner не имеет документации или подробного туториала от автора. Правда, существует документация от Никиты Ступина, раскрывающая назначения многих настроек. Я же в данной статье попробую углубиться в Param Miner чуть более подробно.

Статья будет делиться на две части: в первой мы затронем использование Param Miner для поиска скрытых элементов HTTP‑запроса, а во второй части мы рассмотрим использование инструмента для поиска уязвимостей Web Cache Poisoning, для которого и был разработан данный инструмент.

Поиск скрытых элементов HTTP-запроса

Сразу должен оговориться: я не могу назвать Param Miner самым эффективным инструментом для поиска параметров. Для данной задачи он удобен тем, что встроен в Burp Suite, а это позволяет получить доступ к ответам веб-приложения. Однако, для поиска параметров есть более эффективные инструменты, про которые я расскажу далее в статье.

Подготовка словаря

Прежде чем говорить об использовании Param Miner, давайте сначала рассмотрим сам процесс поиска параметров.

По большей части поиск параметров и элементов HTTP-запроса очень похож на перебор директорий. Мы также отправляем множество HTTP-запросов к приложению и по разнице в ответах делаем вывод о наличии или отсутствии параметра. На эффективность поиска будут влиять те же факторы, что и на перебор директорий, а именно:

  1. Мощность и качество словаря

  2. Производительность веб-приложения

  3. Потенциально возможный рейт запросов, выдаваемый инструментом

Под мощностью словаря я имею в виду количество слов, а под качеством словаря — релевантность его слов контексту тестируемого веб-приложения.

В первую очередь мы можем повлиять на первый фактор. У каждого инструмента для перебора параметров есть свой словарь, но ничто не мешает нам увеличить его мощность. Самый очевидный способ — это взять готовые словари, уже кем-то собранные. Вот небольшой список:

Существует ещё один способ собрать словарь. Как я отметил ранее, проблема предыдущего подхода в том, что он не учитывает тематический контекст приложения, поэтому напрашивается очевидный выход из ситуации — парсить все запросы и ответы к приложению на предмет слов, потенциально подходящих на роль параметров приложения. Сам по себе Param Miner умеет делать это в автоматическом режиме, однако, давайте рассмотрим альтернативный вариант, который может оказаться более удобным.

Для такой цели подойдёт расширение GAP-Burp-Extension, однако, его нужно отдельно собирать и устанавливать в Burp Suite, так как его нет в BApp Store. Данное расширение парсит все запросы из истории целевого веб-приложения, определяет потенциальные параметры, а также эндпоинты. Его использование подробно описывать не буду, так как автор всё подробно описал в документации. В нашем случае оно поможет собрать нам контекстный словарь.

Как установить:

git clone https://github.com/xnl-h4ck3r/GAP-Burp-Extension
cd GAP-Burp-Extension

wget https://repo1.maven.org/maven2/org/python/jython-standalone/2.7.3/jython-standalone-2.7.3.jar
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py

java -jar jython-standalone-2.7.3.jar get-pip.py
java -jar jython-standalone-2.7.3.jar -m pip install -r requirements.txt

Затем добавьте файл GAP.py в Burp Suite

GAP умеет складывать все находки в директорию, которую вы ему укажете.

Не стоит также забывать про парсинг параметров из legacy-ссылок, которые можно достать через gau или waybackurls.

Вот так это можно сделать с помощью waybackurls и unfurl

cat domains.txt | waybackurls > urls
cat urls | unfurl format %q | cut -d "=" -f1 | sort -u > params.txt

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

Я не рекомендую использовать исключительно контекстные словари, лучше всего разумно комбинировать их с готовыми.

Param Miner для поиска скрытых элементов

Теперь перейдём непосредственно к поиску элементов HTTP-запросов через Param Miner.

Как я отметил ранее, многие настройки(далее чекбоксы) Param Miner уже описаны здесь, я же постараюсь добавить дополнительную информацию о конфигурации. Поскольку данный блок посвящён поиску скрытых элементов HTTP-запроса, речь здесь пойдёт о конфигурации Param Miner именно для этой задачи.

Вот так выглядит меню конфигурации Param Miner
Вот так выглядит меню конфигурации Param Miner

Param Miner умеет искать следующие элементы HTTP-запроса:

  • POST-параметры

  • GET-параметры

  • JSON-параметры в теле запроса

  • Сookie

  • HTTP-заголовки

  • XML-атрибуты

  • XML-параметры

Также данный инструмент имеет два режима поиска: ручной и автоматический. При ручном мы напрямую указываем запрос, в котором хотим искать скрытые элементы, при автоматическом — Param Miner будет автоматически искать такие элементы в каждом запросе, который попал в прокси.

Вывод расширения можно найти во вкладке Extensions→Param Miner→Output
Вывод расширения можно найти во вкладке Extensions→Param Miner→Output

Всего Param Miner имеет 6 встроенных словарей разного назначения, один из них используется для исключения так называемых “скучных заголовков”, т.е. тех, которые по мнению автора расширения не будут нам интересны в контексте поиска Web Cache Poisoning.

Словари находятся здесь
Словари находятся здесь

Ниже приведу таблицу с пояснением чекбоксов, основываясь на исходном коде, практике и таблице, сделанной Никитой Ступиным. В этой таблице описаны чекбоксы исключительно для поиска скрытых элементов HTTP-запроса, поэтому остальные чекбоксы мы отключаем.

Имя чекбокса

Описание

enable auto-mine

Включает автоматический поиск элементов в запросах, которые проходят через Proxy. Не работает без одного из включённых чекбоксов, которые указывают на то, что мы хотим найти(auto-mine params, например).

auto-mine headers

Включает в автоматический поиск обнаружение заголовков. Не работает при выключённом чекбоксе enable auto-mine

auto-mine cookies

Включает в автоматический поиск обнаружение cookie. Не работает при выключённом чекбоксе enable auto-mine.

auto-mine params

Включает в автоматический поиск обнаружение параметров HTTP-запроса. Не работает при выключённом чекбоксе enable auto-mine.

auto-nest params

Включает в автоматический поиск обнаружение вложенных JSON параметров. Не работает при выключённом чекбоксе enable auto-mine.

learn observed words

Парсит все приходящие после включения данного чекбокса HTTP-ответы из Proxy текущей сессии Burp и ищет слова, которые в дальнейшем можно использовать для поиска элементов. Не сработает, если вы не укажете при поиске элементов словарь.

dynamic keyword

Парсит все HTTP-ответы на запросы, приходящие во время действия Guess * и ищет слова, которые в дальнейшем будет использовать для поиска элементов в текущем действии.

skip boring words

Пропускает заголовки из словаря boring_headers

response

Парсит HTTP-ответ на целевой запрос во время действия Guess * и ищет слова, которые в дальнейшем будет использовать для поиска элементов в текущем действии.

request

Парсит целевой HTTP-запрос во время действия Guess * и ищет слова, которые в дальнейшем будет использовать для поиска элементов в текущем действии.

use basic wordlist

Использует базовый словарь, соответствующий типу элемента. Если мы ищем параметры, то используется словарь params, если заголовки, то headers.

use bonus wordlist

Использует все словари из resource, кроме assetnote и boring_headers, вне зависимости от типа обнаруживаемого элемента.

use assetnote params

Использует словарь assetnote-params, вне зависимости от типа обнаруживаемого элемента.

use custom wordlist

Использует словарь указываемый в параметре custom wordlist path, вне зависимости от типа обнаруживаемого элемента.

custom wordlist path

Путь в файловой системе до используемого нами словаря

bruteforce

Использует итеративный перебор из символов латинского алфавита после того, как остальные словари исчерпаны, может работать бесконечно. Чтобы прекратить, нужно выключить Param Miner через меню Extensions.

probe identified params

Param Miner будет пытаться определить тип обнаруженного элемента. Работает на все элементы, кроме заголовков.

scan identified params

Запускает активное сканирование обнаруженного элемента

fuzz detect

Попытка вызвать ошибку в приложении. Param Miner будет вставлять в значение элемента строку из следующих символов <a\`'\"${{\\

carpet bomb

Param Miner будет использовать все слова из указанных словарей и не будет пытаться обнаружить скрытые элементы. Согласно описанию в коде, этот чекбокс может быть полезен при OAST техниках. При включённом чекбоксе Param Miner не будет после обнаружения в различий в ответах изменять потенциальные элементы и делать попытки найти скрытый элемент, который повлиял на ответ

try method flip

Param Miner будет чередовать HTTP-методы(GET и POST), при этом данная функция не включится, если вы применили поиск абсолютно любого элемента на GET-запросе(строго говоря, по коду следующая проверка: первый символ запроса не должен быть равен 'G'), а также если сервер отдал статус код 404 в ответ на GET-запрос, созданный по вашему POST или другому запросу. При этом элемент поиска меняться не будет, если вы ищите параметры POST-запроса, то при отправлении GET-запроса в его параметры ничего не подставится

try -_ bypass

При поиске заголовков символ - будет меняться на _

force bucketsize

Количество элементов, отправляемых за раз. Если стоит значение -1, то Param Miner автоматически будет определять это значение. Для разных элементов оно различается: параметры POST-запроса - 128, параметры GET-запроса - 16, заголовки - 8, остальное(JSON,XML,cookie)- 32, причём для последней группы элементов количество подбирается адаптивно, но не более max bucketsize.

max bucketsize

Предельное количество элементов, которое Param Miner будет отправлять за раз для группы с адаптивным подбором bucketsize

max param length

Максимальная длина строки из словаря, всё что длиннее будет отметаться.

lowercase headers

Перевод заголовков в нижний регистр

name in issue

Добавление имени элемента в сообщение в окне Issue activity

canary

Дополнительная строка, которую Param Miner будет дописывать в значения элементов для отслеживания отображения содержимого в ответе

force canary

Полностью заменяет значение элемента на указанную строку(не срабатывает при поиске JSON и XML параметров). Данный чекбокс может быть полезен при фаззинге методом carpet bomb.

Как вы могли догадаться из описания некоторых чекбоксов, Param Miner также можно применять для специфического фаззинга. Для этого стоит выбрать режим carpet bomb и ввести полезную нагрузку, внедряемую в значение искомого элемента, в параметр force canary. К сожалению, нагрузки будут ограничены одним значением.

Пример использования

Давайте рассмотрим очень простой пример использования. Возьмём веб-приложение, главная страница которого выглядит следующим образом.

Как вы могли заметить, мы можем отправить сообщение через форму обратной связи. Вот так будет выглядеть HTTP-запрос на отправку сообщения:

Из тематики страницы мы понимаем, что здесь в дальнейшем будет реализован калькулятор. Теперь попробуем найти скрытые параметры POST-запроса. Для этого выбираем в контекстном меню Param Miner и выбираем Guess body parameter.

Для этого случая мы возьмём встроенный базовый словарь для параметров, но для реальных проектов или bug bounty я рекомендую использовать кастомный. Также мы отключаем все лишние чекбоксы и оставляем параметр probe identified params, чтобы определить тип параметра. Таким образом, конфигурация Param Miner для данного случая будет выглядеть следующим образом.

После перебора всех слов из встроенного словаря params в выводе Param Miner и в окне описания обнаруженных уязвимостей Burp Suite мы получим следующую информацию.

Давайте посмотрим на ответ веб-приложения на запрос с обнаруженным параметром.

Как мы видим, Param Miner определил наличие параметра execute по возникшей ошибки 500 на HTTP-запрос. Зная тематику приложения, давайте попробуем посчитать какое-нибудь математическое выражение:

По всей видимости, функциональность калькулятора уже реализована на серверной части приложения. Далее нам остаётся проанализировать ответы веб-приложения на разные значения параметров и найти уязвимость. В нашем случае это Code Injection.

Для большого скоупа имеет смысл включать функцию автоматического сканирования обнаруженных параметров.

Заключение

В начале статьи я высказал мысль, что Param Miner, возможно, не самый лучший инструмент для поиска скрытых параметров. Как и обещал, привожу альтернативные инструменты для поиска скрытых параметров:

  • Arjun — инструмент для поиска скрытых параметров HTTP‑запроса, написанный на Python. Умеет искать параметры GET/POST/POST‑JSON/POST‑XML запросов, а также поддерживает импорт и экспорт из/в Burp Suite. Имеет довольно подробный туториал от автора.

  • x8 — инструмент подобного назначения, написанный на Rust. Имеет аналогичную функциональность и туториал от автора. Умеет обнаруживать скрытые заголовки.

Данные утилиты обладают консольным интерфейсом.

Из плюсов Param Miner в контексте задачи поиска скрытых элементов я могу выделить:

  • Интеграция в интерфейс Burp Suite (как его расширения).

  • Автоматический режим поиска скрытых элементов и возможность автоматического сканирования обнаруженных элементов.

Исходя из вышесказанного, выбирать Param Miner в качестве инструмента для поиска скрытых элементов имеет смысл в случае, если вас интересует автоматический режим, а также вам необходим встроенный в Burp Suite относительно удобный интерфейс использования подобного инструмента. Впрочем, настоящее назначение Param Miner заключается в другом. Об этом я расскажу вам в следующей части.

Комментарии (0)