Upload
haduong
View
252
Download
2
Embed Size (px)
Citation preview
Web Application Fuzzing best practice
whoami
• Константин Педан
• Пентестер в SRC Security Research & Consulting GmbH
• 10+ лет опыта работы в ИТ, 5+ лет опыта в ИБ
• GIAC GPEN, GIAC GXPN, PCI DSS ASV
Краткое содержание
• Что такое фаззинг?
• Фаззинг веб приложений
• Продвинутый веб фаззинг
• Автоматизация продвинутого фаззинга
Что такое фаззинг?
• техника тестирования путем передачи на вход приложения неправильных, случайных или неожиданных данных
• важная часть SDLC при разработке безопасных приложений
• исследовательский инструмент с высоким уровнем идентификации уязвимостей
Причины популярности
• Фаззинг эффективнее чем анализ исходного кода • утечка исходного кода «Windows 2000» и «NT 4.0», в 2004 не дала взрывного роста найденных уязвимостей
• CVE-2014-6278 (Shellshock), CVE-2016-6309 (statem/statem.c in OpenSSL 1.1.0a), CVE-2017-5340 (RCE in PHP < 7.0.15)
• Низкий порог вхождения
• Практически полная автоматизация процесса
Типы фаззинга
• «Глупый» фаззинг • случайные данные
• статические данные
• мутации данных
• «Умный» фаззинг • генерация данных
• умные мутации
Типы фаззинга
• Фаззинг случайными данными • самый не эффективный подход
• Фаззинг путем мутации • берем валидные данные и вносим аномалии
• быстрый старт, результативность зависит от качества аномалий
• Фаззинг путем генерации • создаем тестовые запросы на основе документации
• медленный старт, требует знания протокола, высокая эффективность
Критерии эффективности
• Максимальная глубина тестирования кода приложения при минимальном количестве итераций
• Реализуемо с любым подходом, глубину тестирования можно измерить, позволяет проверить эффективность фаззинга
Инструментарий
• Фреймворки • Radamsa, Sulley, Peach, SPIKE, American Fuzzy Lop …
• Оценка эффективности • Pai Mei, Valgrind, DynamoRIO, DTrace …
Работы которые стоит почитать
• Fuzzing for Software Security Testing and Quality Assurance, Charlie Miller, 2008, ISBN 13: 978-1-59693-214-2
• Fuzzing: Brute Force Vulnerability Discovery, Michael Sutton, 2007, ISBN 0-32-144611-9
• Babysitting an Army of Monkeys, Charlie Miller, 2010
Фаззинг веб приложений
Особенности веб фаззинга
• Ограниченый набор точек куда можно передать данные: • URI, Header, Cookies, Post data
• Непредсказуемая архитектура приложения и сетевой доступ
• Отсутствие стандартного ответа об ошибке
• Невозможность оценить глубину тестирования
Типичный веб фаззинг #1
GET / HTTP/1.1 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cache-Control: no-cache Pragma: no-cache Connection: close
HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 8 Cache-Control: no-cache, no-store, must-revalidate Date: Mon, 09 Oct 2017 20:12:29 GMT Connection: close
—> стандартный запрос
<— стандартный ответ
Типичный веб фаззинг #2
GET /AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.1 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cache-Control: no-cache Pragma: no-cache Connection: close
HTTP/1.1 404 Not Found Content-Type: text/html Content-Length: 349 Connection: close Date: Mon, 09 Oct 2017 20:14:15 GMT Server: ECSF (dca/53FA)
—> запрос с ошибкой
<— стандартная ошибка
Типичный веб фаззинг #3
GET /%00AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA HTTP/1.1 Accept: */* Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Cache-Control: no-cache Pragma: no-cache Connection: close
HTTP/1.1 500 Internal Server Error Content-Type: text/plain Content-Length: -1 Cache-Control: no-cache, no-store, must-revalidate Date: Mon, 09 Oct 2017 20:14:29 GMT Connection: close
—> запрос с payload
<— аномальная ошибка
Стратегия веб фаззинга
• Мы не можем оценить эффективность как в обычном фаззинге
• Но можем построить эффективную стратегию ответив на следующие вопросы: • что тестируем?
• чем тестируем?
• что пытаемся обнаружить?
• когда останавливаем тестирование?
Что мы тестируем?
• Тип приложения • форма поиска, парсер данных, профайл пользователя …
• В каком виде передаются данные? • текст, бинарный формат
• Дополнительный особенности • end-to-end шифрование, сжатие данных, обязательные параметры, валидация данных, подпись …
Чем тестируем?
• Сканеры • IBM AppScan, Acunetix, Burp Suite, Arachni, Nikto …
• Intruders • Burp Suite, Zed Attack Proxy …
Сканер уязвимостей
• Минимальное участие пен.тестера
• Плохо работает если часть логики в браузере клиента
• Полная зависимость результата от качества сканера
Веб фаззинг != поиск инъекций
• Сканеры фокусируются на разнообразные инъекции • SQL, JS (XSS), XML, JSON, LDAP, OS Command
• Другие уязвимости тестируют поверхностно • Buffer overflow, Directory Traversal, Race condition, обход бизнес логики …
Ручной подход / Intruder
• Эффективнее тестирует бизнес логику и сложные уязвимости
• Вносится человеческий фактор
• Полная зависимость результата от опыта пен.тестера
Что пытаемся обнаружить?
• Аномалий в ответах • HTTP коды
• различия в длине ответов
• различия во времени ответа
• сообщения об ошибках
• обрывы сессии и конекта
• Повторяемость аномалии
Когда останавливаем тестирование?
• При достаточном количестве итераций можно найти все баги (теоретически)
• Каждый последующий баг найти сложнее чем предыдущий
• Тестирование стоит остановить как только выходим на «плато» графика: количество багов/количество итераций
точка остановкибаги
итерации
Ошибка выжившего в фаззинге
• Payload’ы для сканеров и Intruder’ов на основе известных уязвимостей
• Известные векторы атаки позволяют найти только известные уязвимости
• Как искать неизвестные?
Total vulns
C
B A
M
Продвинутый веб фаззинг
Расширяем векторы атаки
• Добавляем к существующим данным новые мутации
• Мутации создают новые payloads
• Новые payloads == потенциально новые уязвимости
Мутации
• Набор мутаций ограничен только фантазией
• Потенциально полезные мутации • понижение или повышение ID
• добавление случайного байта
• null - мутация
• повторение последовательности байтов
Мутации ID
• GET /account_info?id=58782• 58832, 57856, -12541, 0, 15896332
• POST {«method»:»get_order","order_id":"A6528432"}• A1, A65535, A170141183460469231731687303715884105728
• Cookie: _ga=GA1.2.185633756.1488912637; UID=22134• 5273289, -22006, 9223372036854775809, 21354
Пример #1
POST /api/getaccountdetails
{"AgreementId":0,"Device":"iPhone","AccountId":9161179,"PasswordHash":"***********************************","Language":"2","Login":"testuser"}
Добавление случайного байта
_q=true&id=38736463233323&page=1&sid=id&sort=true&query=status%255B%255D%3D9%26keyword%3D%26keyword_similar%3D-1%26is_test%3D-1%26country_list%3D%26country%3D%26react_from%3D%26react_to%3D%26reg_from%3D%26reg_to%3D%26stat_from%3D%26stat_to%3D%26is_editing_needed%3D-1%26search_perset%3D0%26search_configuration_title%3D
Пример #2
POST /admin/get_users/
_q=true&id=38736463233323&page=1&sid=id&sort=true&query=status%255B%255D%3D9[%26keyword%3D%2$6keyword_similar%3D-1%26is_test%3D-1%26country_list%3D%26country%3D%26react_from%3D%26react_to%3D%26reg_from%3D%26reg_to%3D%26stat_from%3D%26stat_to%3D%26is_editing_needed%3D-1%26search_perset%3D0%26search_configuration_title%3D
Пример #2
{"error_type":"","errors":"A Database Error Occurred"}
Null - мутация
• Повторение одного и того же запроса без внесения модификаций
• Несколько параллельных потоков и общее количество запросов >2000
• Позволяет идентифицировать проблемы с утечками памяти и CPU, обнаружить «состояние гонки»
Пример #3
POST /BankBackEnd/changepassword
sid=2120834214354325434&passwordField=WrongPassword123&confirmPasswordField=WrongPassword123
при 20 потоках запросов и >2000 обращений к серверу появляется состояние гонки (race condition) и система изменяет пароль пользователя
Повторение последовательности байтов
• GET /user_info?name=hacker• hackeckeckeckeckeckeckeckeckeckeckeckeckeckeckeckeckkkkkkkkkkk
kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkker
• POST {«method»:»get_order»,"order_id":"A6528432"}• A6526526526526526526526526526526526526526526526526526526526
526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526526528432
Инструментарий
• Можно использовать практически любой фреймворк для фаззинга
• Radamsa a general-purpose fuzzer • https://github.com/aoh/radamsa
• Sulley fuzzing engine • https://github.com/OpenRCE/sulley
Burp Intruder + Radamsa
Burp плагин Radamsa
Burp Intruder
http
burp API
bd: drop a byte bf: flip one bit bi: insert a random byte br: repeat a byte bp: permute some bytes bei: increment a byte by one bed: decrement a byte by one ber: swap a byte with a random one sr: repeat a sequence of bytes ld: delete a line lr2: duplicate a line li: clone and insert it nearby lr: repeat a line ls: swap two lines lp: swap order of lines td: delete a node tr2: duplicate a node ts1: swap one node with another one ts2: swap two nodes pairwise tr: repeat a path of the parse tree uw: try to make a code point too wide ui: insert funny unicode num: modify a textual number ft: jump to a similar position in block fn: likely clone data between similar positions fo: fuse previously seen data elsewhere
Web fuzzer плагин:
• Отправка статических payloads
• Определение оптимальной мутации
• Генерация новых payload используя radamsa
ToDo:
• Добавить анализ ответов от сервера • статистика размера, времени ответа, количества тегов, валидация
HTML и т.д. и т.п.
• Реализовать автоматическую маркировку подозрительных ответов
• Добавить дополнительные кодировки для payloads • url encode, double url encode, js encode, html encode, unicode, unicode
2, unicode 2 + utf-8