Привет, Хабр! Снова с вами те, кто отчитываются, что в вашем приложении не хватает заголовков безопасности, а именно инженеры по динамическому анализу. В нашей прошлой статье мы описали плагин для OWASP ZAP, упрощающий авторизацию на основе JWT. А сейчас хотим рассказать о том, как настроить подобную магию авторизации в популярном инструменте Burp Suite Pro.

Содержание:

  1. Macros + Target Scan

    1. Сбор карты сайта

    2. Создание правила по получению нужного токена (JWT)

    3. Создание правила по валидации сессии

    4. Запуск сканирования

    5. Пояснение к Macros + Target Scan

  2. ATOR + Scanner

  3. ATOR + Target Scan

  4. Заключение

Burp Suite в своем арсенале имеет много функций. Помимо возможности осуществлять ручные проверки, инструмент позволяет автоматически сканировать веб-приложения, причем качество процесса (количество находок и процент false-positive) находится на приличном уровне. Однако настроить сканирование, при котором требуется авторизация в приложении, бывает непросто, особенно если поддержка сессии осуществляется через JWT токены в заголовках. Например, тот же ZAP легко позволяет это сделать через аддон Authentication Helper или скрипты. Но что же насчет Burp? Для этого инструмента есть различные плагины, которые в той или иной степени помогают настроить поддержку сессии на основе токенов. В этой статье мы опишем 3 способа, которые помогут выполнить данную задачу:

  1. Macros + Target Scan (с ручным кроулингом).

  2. ATOR + Scanner (кроулинг силами сканера).

  3. ATOR + Target Scan (с ручным кроулингом).

ATOR (Authentication Token Obtain and Replace) – это плагин от Synopsys, созданный специально для осуществления авторизации и поддержки сессии на основе токенов, например JWT. Плагин не заброшен и периодически обновляется. Но начнем с Macros’ов, которые являются встроенной функцией Burp Suite. Их использование в Burp Suite предоставляет широкие возможности по автоматизации проверок безопасности. Например, для тестирования авторизации через Intruder (при Bruteforce) или Repeater может быть необходимо при каждом запросе добавлять новый CSRF-токен, обновляемый динамически на главной странице сайта. Либо, например, приложение дает только две неверные попытки ввести ОТП-код, после чего обновляет его и снова просит ввести логин и пароль. В таком случае при брутфорсе ОТП, возможно, придется написать макрос, автоматизирующий указание логина-пароля перед каждой отправкой запроса на ввод ОТП, чтобы приложение его не сбросило. В этих ситуациях макросы Burp очень необходимы.

Macros + Target Scan

1. Сбор карты сайта

Burp Suite может автоматически обходить приложения, но в некоторых случаях DAST-сканеры в целом плохо кроулят современные сайты, то есть проходят по их страницам. Поэтому иногда лучше сделать обход вручную. Также это необходимо для срабатывания макроса. Приступим к практике. Нужно открыть наше приложение во встроенном в Burp Suite браузере Chromium (можно также из любого другого браузера, но с проксированием через Burp Suite). Далее вручную пройтись по нему от момента авторизации до всех важных функций и страниц, которые нужно будет атаковать. Важно максимально охватить сайт, чтобы собралось как можно больше URLs, и сканер смог потом найти много уязвимостей.

Собранная карта сайта

2. Создание правила по получению нужного токена (JWT)

Карта сайта собрана, теперь можем приступить к созданию макросов. Заходим в Settings -> нажимаем Sessions. В пункте Session handling rules клацаем Add, чтобы создать правило. Далее открывается окно, где мы должны как-нибудь обозвать правило. Пусть будет «GET_JWT».

Именуем правило

После этого нажимаем на вкладку Scope и сразу выбираем Include all URLs:

Настройка области применения правила

Возвращаемся во вкладку Details и ниже в Rule Actions нажимаем Add -> выбираем Run a macro. Откроется окно, где нужно щелкнуть на Add, далее выпадет список из выполненных запросов. Выбираем тот запрос авторизации, где мы получаем JWT токен в ответе:

Выбор запроса, возвращающего токен

Затем нажимаем Configure item для запроса авторизации. Откроется окно настройки, и внизу нужно выбрать Add. Далее вручную выделяем из ответа данного запроса тот участок access JWT токена, который непосредственно нужно передать в заголовке Authorization при авторизованных запросах к приложению. Заполняем как на скрине:

Определение параметра для присвоения токена

3. Создание правила по валидации сессии

Правило по получению JWT создано, теперь перейдем к валидации сессии. Снова открываем Sessions -> в Session handling rules нажимаем Add -> даем название правилу, например «Validate» -> в Rule actions щелкаем на Add -> выбираем Check session is valid -> отмечаем Issue current request, чтобы проверка валидации сессии срабатывала на каждый запрос. Ниже заполняем поля в зависимости от вашего приложения, в нашем случае невалидная сессия возвращает ответ 401.

Настройка валидации сессии

После настройки щелкаем на ОК -> нажимаем вкладку Scope -> выбираем Include all URLs:

Настройка области применения правила

Клацаем ОК.

4. Запуск сканирования

Теперь осталось запустить сканирование. Переходим в Target -> нажимаем Site map -> правый клик на нужный сайт -> выбираем Scan -> щелкаем на Open scan launcher:

Запуск сканирования из вкладки Target

Откроется окно настройки сканирования. Выбираем Audit selected items -> нажимаем OK:

Запуск сканирования

Начнется сканирование по тем URLs, которые мы вручную прокроулили. При этом Burp будет генерировать новый токен JWT и подставлять в запросы, где присутствует заголовок Authorization: Bearer.

Пояснение к Macros + Target Scan

Пробежимся по этапам и посмотрим, что мы сделали. Сначала мы вручную через встроенный в Burp Suite браузер авторизовались в нашем приложении и полностью по нему прошлись, чтобы все нужные ссылки и пути добавились в Site map, и чтобы в запросах уже присутствовал заголовок «Authorization: Bearer», значение которого макрос будет обновлять. Далее мы создали правило, которое идентифицирует в запросе значение «Authorization: Bearer», и если такое значение существует (а оно существует, так как мы заранее авторизовались вручную в браузере и, соответственно, все запросы в истории имеют данный заголовок), то Burp делает запрос авторизации и получает access токен, подставляя его в следующий запрос в заголовок Authorization: Bearer <сюда>. Дополнительно, чтобы определять статус авторизованности запроса, мы создали правило по валидации сессии, которое в зависимости от ответа приложения определяет, нужно ли обновить access токен или нет. В итоге мы запустили сканирование через вкладку Site map посредством Open scan launcher, потому что правило обновления access токена не срабатывает при обычном запуске через Scanner Причина кроется в отсутствии в запросах через Scanner по дефолту заголовка Authorization: Bearer — он нужен для того, чтобы «дать команду» Burp применить созданный нами макрос.

Это был сложный способ. Остальные 2 способа проще.

ATOR + Scanner

Если же ваш сайт хорошо поддается кроулингу Burp (например, в нем нет технологий AJAX и прочего), то вы можете запустить сканирование через Scanner вкупе с плагином ATOR. Чтобы настроить его, нужно установить плагин через Extensions -> BApp Store -> найти плагин Authentication Token Obtain and Replace -> нажать Install. Он появится на панели инструмента:

Выбор инструментов для применения ATOR

Можно выбрать галочки на тех инструментах, на которых будут применяться правила ATOR. Далее нужно перейти в историю запросов и найти тот, который выдает ошибку 401 и свидетельствует о том, что токен недействительный:

Отправка запроса с невалидной сессией в ATOR

Теперь в истории находим запрос авторизации, на который возвращается JWT access токен:

Отправка запроса, где возвращается токен авторизации, в ATOR

Далее переходим во вкладку ATOR -> открываем вкладку «1. Error Condition» и справа создаем условие по Status Code с указание 401 кода:

Вкладка «Error Condition»

Переходим во вторую вкладку «2. Obtain Token». В правом окне Response выделяем access токен, который будет подставляться в запросы. После этого внизу нажимаем на кнопку From selection. Видно, как заполнились поля. И даем название в поле Name. После чего нажимаем Add, и переменная появляется в окне Extraction List:

Вкладка «Obtain Token»

Далее переходим в следующую вкладку «3. Error Condition Replacement». В окне Request выбираем участок JWT, который будет заменяться на полученный из предыдущей вкладки токен. Так же нажимаем From selection справа в окне и даем название переменной, например «new_token», и щелкаем на Add:

Вкладка «Error Condition Replacement»

И последний этап — протестируем результат. Во вкладке «4. Preview» нажимаем Test Run и смотрим: когда в ответе возвращается 401, отправляется запрос на получение нового токена, который подставляется в запрос проверки:

Вкладка «Preview»

Теперь можем заметить, что подстановка нового токена проходит успешно. Далее применим данный плагин на реальном сканировании нашего приложения. Перейдем во вкладку Dashboard -> нажмем New Scan -> выберем Crawl and Audit. Ниже нужно вписать URL для тестирования. Во вкладке Scan configuration выберем режим сканирования, например Balanced. Во вкладке Application login нужно выбрать тип авторизации, в нашем случае это Use recorded login sequences. Это способ записи действий авторизации через встроенный браузер посредством специального плагина Burp Suite. Чтобы создать запись авторизации, откройте встроенный браузер через вкладку Proxy -> Open browser. В нем будет расширение Burp Suite:

Расширение Burp Suite

Нужно перейти во вкладку Navigation Recorder и нажать Start Recording, после чего откроется окно в режиме инкогнито, в котором необходимо будет авторизоваться в приложении, после чего клацнуть на расширение в панели и щелкнуть Stop Recording:

Остановка записи авторизации

Окно инкогнито закроется автоматически, а скрипт записи появится во встроенном браузере в расширении, откуда нужно будет скопировать его, нажав Copy to clipboard:

Кнопка копирования записанной авторизации

После этого нужно в настройках сканирования во вкладке Application login нажать New, дать имя, вставить данный скрипт и сохранить:

Вставка скрипта авторизации в Burp Suite

После нажатия ОК запустится скан. В нашем случае ввиду того, что приложение использует AJAX, Burp не очень хорошо справляется с кроулингом (результаты с ручным кроулингом намного лучше). Но замена токена произошла:

Замененный токен в запросе сканирования

Таким образом, как альтернативу ручному кроулингу мы можем использовать Scanner совместно с плагином ATOR для поддержки сессии на основе JWT токенов.

ATOR + Target Scan

Третий вариант: пройтись вручную так же, как и при первом способе, но использовать вместо макросов плагин ATOR. Итак, сначала идем вручную по сайту:

Собранная карта сайта

Далее настраиваем ATOR, как во втором способе:

Отправка в плагин ATOR запроса получения токена JWT
Отправка в плагин ATOR запроса получения 401 ошибки в ответе

Дальнейшие настройки ATOR аналогичны настройкам из второго способа. Остается всего лишь запустить скан через вкладку Target:

Выбор прокроуленного сайта и отправка в Scan
Запуск сканирования

Заключение

В статье мы рассмотрели 3 способа для авторизованного сканирования через Burp Suite на основе заголовков. Первый и третий наиболее эффективные, если автоматический кроулинг сканера плохо справляется с вашим сайтом. Первый способ может быть полезным, если вы уже имеете настроенные макросы и вам привычно работать с ними. Второй пригодится, если автоматический кроулинг хорошо находит на вашем сайте. В рамках нашего примера оптимальным можно назвать третий способ сканирования. Плагин ATOR умеет импортировать и экспортировать настройки авторизации, а в случае с макросами настройки сохраняются вместе с сессией. В любом случае мы хотели показать разные способы настройки авторизованных сканирований в Burp Suite на примере сайта, использующего JWT. Надеемся, статья будет вам полезна.

Создатели: Алмаз Вахитов, Мария Ковтун.

Ссылки:

https://portswigger.net/burp/documentation/desktop/settings/sessions/macros — про макросы Burp Suite в документации.

https://github.com/synopsys-sig/ATOR-Burp — плагин ATOR на гитхабе.