Upgrade to Pro — share decks privately, control downloads, hide ads and more …

"Advanced Web Fuzzing with BurpSuite: How to no...

"Advanced Web Fuzzing with BurpSuite: How to not miss your best vulnerability", Аркадий Литвиненко, BI.ZONE

OWASP Russia Meetup #8

OWASP Moscow

April 03, 2019
Tweet

More Decks by OWASP Moscow

Other Decks in Programming

Transcript

  1. Advanced Web Fuzzing with BurpSuite 1 How to not miss

    your best vulnerability Litvinenko Arkadiy Lead Penetration Tester, BI.ZONE twitter.com/BetepO_ok
  2. Про что доклад? 1. Ликбез на тему веб-фаззинга 2. Немного

    про подходы к фаззингу 3. Про что забывают 4. На что не обращают внимание 5. ХаI{еРсI{иЕ $еКрЕтИкИ 6. Мысли про проблемы современного веб-фаззинга
  3. Пару слов о Web Fuzzing • Фаззинг – техника тестирования,

    заключающаяся в передаче приложению неправильных, неожиданных или случайных данных с целью вызвать у приложения максимальное удивление • Один из основных способов тестирования при BlackBox • Правильный фаззинг это целое искусство • Уметь хорошо фаззить весьма прибыльно
  4. Пару слов о Web Fuzzing Начальный запрос: • index.php?id=1 Мутированные

    запросы: • index.php?id=1’+--+ • index.php?id=1</foo> • index.php?id=1;id • index.php?id=1../../../../../etc/passwd • index.php?id=1%s%s%s%s
  5. Что имеет смысл фаззить? POST /community/search?type=users&limit=5 HTTP/1.1 Host: fun.club User-Agent:

    Mozilla/8.80.0 (…) Gecko/555 Firefox/35.35 Referrer: http://research.ctf/crash/ Content-Type: application/x-www-form-urlencoded Cookie: PHPSESSID=7ge1snk35deudoshik1l0v37ikij; user=test Content-Length: 32 firstname=Justin&lastname=Bieber
  6. Payloads • Стандартные словари BurpSuite • Intruder Payloads (https://github.com/1N3/IntruderPayloads) •

    SecLists (https://github.com/danielmiessler/SecLists) • FuzzDB (https://github.com/fuzzdb-project/fuzzdb) • wfuzz list (https://github.com/xmendez/wfuzz/tree/master/wordlist) • Payload all the things (https://github.com/swisskyrepo/PayloadsAllTheThings)
  7. Payloads Наиболее интересные словари: • IntruderPayloads: full_fuzz.txt – 676 paylods

    • wfuzz: all_attack.txt – 468 payloads • fuzzdb: all-attacks-unix.txt – 512 payloads • fuzzdb: all-attacks-windows.txt – 531 payloads Для сравнения: • Стандартный словарь BurpSuite (Fuzzing Full) - 45 payloads
  8. Universal Payloads / Polyglots IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP(1))/*' XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)),SLEEP( 1)))OR'|"XOR(IF(SUBSTR(@@version,1,1)<5,BENCHMARK(2000000,SHA1(0xDE7EC71F1)) ,SLEEP(1)))OR"*/ Когда это

    может быть актуально: • Невозможно автоматизировать (форма защищена капчей) • Ограниченное количество запросов (блокировки после N запросов)
  9. Использование OOB в пейлоадах • Не всегда по реакции сервера

    можно понять, что пейлоад сработал • Идея в добавление в словари пейлоадов с отстуком на внешний сервер • Socket vs DNS – по DNS предпочтительнее (а лучше и так, и так) • Можно использовать BurpSuite Collaborator
  10. Зависимость пейлоадов от Content-Type Пейлоады должны быть адаптированы под Content-Type.

    В общем случае: • application/x-www-form-urlencoded • application/json • application/xml • application/soap-xml
  11. JSON экранирование Важно: • Порядок правил имеет значение! • Не

    забываем выключить Payload Encoding • Правила пишутся в RegExp формате Пейлоад на входе: q%00we\qwe”\ 1. Заменяем \ на \\ -> qwe\\qwe”\\ 2. Заменяем “ на \” -> qwe\\qwe\”\\ 3. Заменяем %FF на \xFF, где FF это хекс -> q\x00we\\qwe\”\\ Пейлоад на выходе: q\x00we\\qwe\”\\
  12. Побайтовый фаззинг Основные используемые Content-Type позволяют передавать байты напрямую: •

    URLEncode: %00 • JSON: \x00 Чем больше байт брутим, тем больше запросов: • 256 запросов для одного байта • 65536 запросов для двух байт • 16777216 запросов для трех байт
  13. Фаззинг с изменением соседних параметров • Изменение одного параметра может

    влиять на то, как будет обработан другой index.php?value=123&action=search • Например изменяя значение параметра action можно загнать value в разные куски кода • Адаптация фаззинга под логику работы приложения может дать очень хороший результат
  14. Полезные BurpSuite плагины для фаззинга • Logger++ • Логирует все

    запросы (основные инструменты + плагины) • Позволяет по ним искать • Позволяет выгружать результаты в CSV и ElasticSearch • Turbo Intruder • Скриптовый аналог Intruder • Copy as Python-Requests • Позволяет быстро перенести запросы из BurpSuite в Python скрипт
  15. Проблема 1: Одинаковая длина ответа • Если смотреть только на

    длину ответа, то можно просмотреть уязвимость Реальный кейс из жизни: • Неправильный пароль – Login or password incorrect. • Ошибка – Login or password incorrect! Варианты решения: • Intruder Grep Match/Extract • Comparing Responses (мечта)
  16. Проблема 2: Всегда разная длина ответа Почему может быть: •

    Мутируемый параметр попадает в ответ сервера • На странице присутствует фрагмент, который меняется при каждой загрузке • Таймеры/рандомы произвольной длины в теле ответа Возможные решения: • Опять же Intruder Grep Match/Extract • Выгрузка результатов и последующий анализ • Расширение возможностей (далее об этом поговорим)
  17. Проблема 3: Сессия умирает во время фаззинга • Burp Suite

    позволяет добавлять свои обработчики над запросами • Для дебага можно использовать Session Tracer или MITMProxy Логика следующая: • Включаем поддержку Cookie Jar в Intruder • Добавляем макрос на логин и обновление Cookie Jar • Добавляем Handling Rule, который: • Ловит в ответе сервера ключевое слово/регулярку, указывающее на то, что сессия умерла • Вызывает макрос, который логинится и обновляет Cookie Jar
  18. Проблема 4: Многоэтапный фаззинг • На каждый запрос Intruder требуются

    дополнительные запросы • Самый частый пример – CSRF токен при авторизации. Необходимые итерации фаззера: 1. Сделать GET запрос к странице /login/ 2. Получить CSRF токен из ответа сервера 3. Сделать POST запрос с мутированными данными и свежим CSRF токеном Using Burp's Session Handling Rules with anti-CSRF Tokens: https://support.portswigger.net/customer/portal/articles/2906338-using-burp-s-session-handling-rules-with-anti-csrf-tokens
  19. MITMProxy Плюсы: • Не нужно изобретать велосипед с нуля •

    Модульная система Минусы: • Медленный (очень медленный) • Скудная документация • Множество тонкостей при написание модулей • Фиксированный язык программирования (Python) • Дебаг из коробки ужасен • Нету возможности вывода в консоль
  20. MITMProxy Логика: • MITMProxy смотрит каждый запрос и ищет в

    нем заголовок Wrapper • Если находит, то смотрит его значение и передает управление нужному Wrapper’у • Класс Wrapper’а делает необходимые действия и возвращает управление проксе • MITMProxy удаляет из запроса весь заголовок Wrapper и пропускает пакет дальше POST /index.php?id=1 HTTP/1.1 Host: localhost User-Agent: Mozilla/5.0 ... Wrapper: 5 Content-Length: 8 test=123
  21. MITMProxy Тест: • 10000 запросов на localhost сервер с и

    без MITMProxy • MITMProxy просто читает пакет и пересылает его дальше Результаты: • Напрямую - 32 секунды • Через MITMProxy - 7 минут 30 секунд Простейший Wrapper модуль для MITMProxy: • https://github.com/trololomgwtf/mitmproxy-wrapper/
  22. Самописный Proxy Плюсы: • Любой удобный вам язык программирования •

    Облегченный, а значит быстрый • Гибкость в реализации Минусы: • BurpSuite работает только с Socks прокси • Придется работать с HTTPS напрямую • Реализаций пока нету, нужно кодить :)
  23. Summary • Чем больше информации в выдаче фаззера, тем больше

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