Home Вы Тут: Безопасность компьютера » Прочая информация » Фаззим протоколы
14
Ср
Фаззим протоколы

Фаззим протоколы


Если MiniFuzz — это очень простой (хотя и эффективный) dump-фаззер, то проект Peach (в переводе — персик), разработанный Майком Эддингтоном — это уже мощное решение для smart-фаззинга, поддерживающее как режим мутации, так и генерации. Для проведения умного фаззинга программе необходимо знать структуру данных, с которыми она будет экспериментировать. Поэтому на вход фаззера подаются так называемые PeachPit’ы ("косточки от персика") — специальные XML-конфиги, в которых задается структура данных, описание взаимоотношений между различными ее элементами, а также подходы для реализации мутаций. В отличие от Minifuzz, Peach может фаззить не только файлы, но и сетевые сервисы, RPC, COM/DCOM, SQL-хранимые процедуры и многое другое. Правда, такая универсальность приводит и к некоторым трудностям в использовании.
Сразу предупреждаю: это не та программа, которую запускаешь и сразу понимаешь, что к чему. Чтобы внести ясность, предлагаю разобраться с Peach на конкретном примере, но вместо фаззинга файлов обратиться к другой области, а именно — поиску уязвимостей в сетевых сервисах. Для успеха придется дополнительно установить WinDBG в качестве отладчика, а также снифер Wireshark и драйвер Winpcap, чтобы иметь возможность перехватывать сетевые пакеты во время фаззинга сетевых протоколов.
Любой фаззинг в Peach'е начинается с создания PeachPit. Как я уже сказал, в этом XML-файле определяется цель фаззинга, описывается структура данных, с которой будет работать фаззер, а также определяются правила манипуляции с ними. Для удобства автор фреймворка предлагает библиотеку для Visual Studio, серьезно упрощающую работу с PeachPit'ами, в том числе с помощью автодополнения кода. Любая "косточка" состоит из нескольких функциональных блоков. Чтобы не составлять весь файл с нуля, в корневом каталоге фаззера есть файл-шаблон template.xml, который мы и возьмем за основу.
Важная часть любого PeachPit'а — описание модели данных. Именно в этом месте мы делаем фаззер "умным", рассказываем ему о структуре файле или протокола (размерах полей, смещениях и т.д.), с которым предстоит работать. Возьмем для примера простейший протокол TFTP и попробуем профаззить запрос на чтение файла (Read). Если верить RFC, то выглядит он следующим образом:
TFTP PACKET
--------------------------------------
| \x00\x01 | Filename | 0 | Mode | 0 |
--------------------------------------
Получается, что запрос начинается с HEX-символов "\x00\x01", после которых следует название файла и флаги режима передачи файла. При этом после полей Filename и Mode идут нулевые байты. Итак, задача — написать фаззер, который будет играться со значением Filename. Начнем с создания модели запроса в нашем PeachPit'е в соответствии с RFC:





В первой строке модели мы задаем двухбайтный код, обозначающий запрос на чтение. Указанный здесь параметр token="true" мы будем использовать каждый раз, чтобы дать понять Peach, что это поле остается как есть, и его не нужно фаззить. Обрати внимание, что в следующей строке, которая описывает поле filename, этого флага как раз нет, и именно поэтому фаззер будет манипулировать со значением в этом поле (или, другими словами, фаззить). В последней строке описывается поле, обозначающее режим работы. Для полей "filename" и "mode" мы подставляем флаг nullTerminated, указывая на то, что после них идут нулевые байты-разделители. Обрати внимание, что для каждого из трех полей указывается его тип (blob или string). Таким образом мы рассказываем фаззеру, с каким типом данных он будет иметь дело. Понятно, что это очень простая модель, в большинстве случаев с ее составлением придется поработать намного плотнее.
После того, как модель данных готова, необходимо описать логику работы фаззера, которая описывается в следующем блоке PeachPit'а. Поскольку единственное место, где мы будем осуществлять фаззинг — это поле filename, то и логика нас будет очень простая. Укажем Peach'у, что необходимо отправлять данные (Action type="output"), используя ранее описанную модель данных "tftprrx":







Следующий блок конфигурации фаззера — описание агентов. Агенты присоединяют к нужному процессу отладчик и постоянно следят за его состоянием. В случае вылета приложения из-за ошибки агенты записывают различные детали падения в логфайл, в том числе и вызвавший сбой запрос (в случае, если речь идет о снифинге сетевого протокола). Для того, чтобы классифицировать падение (Exploitable, Probably Exploitable, Probably Not Exploitable, Unknown), разработчик рекомендует дополнительно к отладчику WinDBG установить плагин !exploitable. Обозначим в этом блоке, что будем отслеживать состояние приложения TFTPD32 и весь UDP-трафик, поступающий на 69 порт (TFTP):








Вот теперь почти все готово. Осталось связать между собой модель данных, логику и агентов, объединив их в единое целое — secuiryt-тест . У нас будет только один тест (для фаззинга поля filename), но в реальной ситуации можно написать столько тестов, сколько необходимо. По сути, нужен один тест для каждого описанного блока с моделью данных.








После "publisher" указывается, каким образом будут передаваться данные. Поскольку TFTP работает по UDP-протоколу, то его мы и используем при составлении теста. Последний блок, который необходимо изменить в файле-шаблоне — это блок для запуска фаззера ("Run"). Здесь определяется, куда ты хочешь сохранить логи с результатами и какие тесты хочешь провести:







Составление "косточек" для Peach'а может показаться непростой задачей, и это действительно так. А как иначе объяснить фаззеру особенности формата данных и то, каким образом ему эффективнее играться с теми или иными параметрами? В этом и есть смысл умного фаззинга. С другой стороны, если прямо сейчас попробовать реализовать другой метод того же протокола TFTP (скажем, метод write), то сразу осознаешь, что кода потребуется намного меньше — большая часть XML-конфига уже готова. Специально для проверки корректности PeachPits'ов в состав фаззера входит специальный скрипт peachvalidator.pyw. Если валидатор отдаст отмашку на старт фаззера, можно запускать Peach:
peach.py -a
peach.py tftpfuzzer.xml
Первая команда активирует агентов, а вторая позволяет запустить фаззер с использованием только что составленного XML-конфига.

 
   

 

Календарь

«    Май 2012    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 

 
Copyright © 2010 h-one.org.
Top