Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Fuzzing исследование уязвимостей методом грубой силы.pdf
Скачиваний:
1127
Добавлен:
13.03.2016
Размер:
5.96 Mб
Скачать

Свойства

269

Несмотря на отсутствие полезной нагрузки, агрессивное сканирование генерирует такое количество трафика, которое может привести к на$ рушению работы Интернета, механизма обработки кредитных карт и в некоторых случаях к перегрузке сотовых сетей. Интереснее всего то, что даже спустя четыре года червь Slammer по$прежнему остается одним из пяти самых популярных событий, связанных с генерацией трафика.1 Очевидно, что незащищенная сетевая уязвимость в Win$ dows всегда приводит к очень серьезным последствиям.

В предыдущей главе мы использовали уже существующую библиотеку фаззинга SPIKE при создании фаззера протоколов в среде UNIX, чьим объектом был выбран демон Novell NetMail NMAP. В этой главе мы применим другой подход и пройдем от начала до конца весь процесс создания простого, удобного в использовании фаззера, построенного в среде Windows и оснащенного графическим интерфейсом. Несмотря на то что итоговая программа под названием ProtoFuzz оснащена лишь базовыми функциями, она служит отличной платформой для дальнейшего расширения и представляет альтернативный взгляд на создание фаззера. Начнем с обсуждения необходимого набора свойств.

Свойства

Перед тем как погрузиться в процесс разработки, нужно взять паузу и обдумать свойства, которые нам необходимы и которые мы хотели бы видеть у продукта. На самом базовом уровне фаззер протоколов просто передает объекту видоизмененные пакеты. Если фаззер может генери$ ровать и посылать пакеты данных, он отвечает всем требованиям. Од$ нако было бы неплохо сделать так, чтобы ProtoFuzz был способен рас$ познавать структуру пакетов, которые мы собираемся подвергнуть фаззингу. Давайте поговорим подробнее об этих базовых требованиях.

Структура пакета

Перед тем как наш фаззер сможет послать пакет данных, ему необхо$ димо понять, как его создать. Современные фаззеры применяют один из трех основных подходов при сборке пакетов для фаззинга:

Создание тестовых комплектов. И PROTOS Test Suite2, и его ком$ мерческий собрат Codenomicon3 жестко прописывают в коде структу$ ру пакетов данных, используемых для фаззинга. Создание подобных тестовых комплектов – очень трудоемкая задача, поскольку включа$ ет в себя анализ спецификаций протокола и дальнейшую разработ$ ку, возможно, тысяч жестко закодированных тестовых примеров.

1http://isc.sans.org/portreport.html?sort=targets; http://atlas.arbor.net/

2http://www.ee.oulu.fi/research/ouspg/protos/

3http://www.codenomicon.com/products/

270

Глава 16. Фаззинг сетевых протоколов: автоматизация под Windows

Генерационные фаззеры. Как было показано в предыдущей главе, при использовании инструментов наподобие SPIKE пользователю необходимо создать шаблон, описывающий структуру пакета дан$ ных. Затем уже фаззер берется за генерацию и передачу отдельных тестовых примеров во время рабочего цикла.

Видоизменяющие фаззеры. Можно не строить пакет с нуля, а ис$ пользовать альтернативный подход: начать с заведомо правильного пакета и затем последовательно видоизменять его участки. Хотя каждый участок в этом пакете может быть видоизменен с помощью подхода грубой силы, чаще всего этот подход несовместим с фаззин$ гом протоколов, поскольку в этом случае он будет неэффективен и приведет к появлению большого количества пакетов, несовмести$ мых с сетевыми протоколами, которые могут просто не дойти до объекта. Но этот подход может быть немного модифицирован – нужно лишь позаимствовать один прием у способа, предусматри$ вающего создание шаблонов протоколов. Фаззер начинает с заведо$ мо правильного пакета, затем пользователь на его основе создает шаблон, определяя участки данных, которые должны быть исполь$ зованы в качестве объектов фаззинга. Данный подход будет исполь$ зоваться в ProtoFuzz.

Нет такого подхода, который был бы лучше других; для каждой ситуа$ ции выбирается наиболее адекватный. В случае с ProtoFuzz метод ви$ доизменения пакетов был выбран из$за его простоты. Возможность на$ чать с заведомо правильного пакета, который может быть получен из наблюдаемого сетевого трафика, позволяет пользователю приступить к фаззингу практически без подготовки – ему не нужно проводить фун$ даментальные исследования протокола и создавать генерационные шаблоны.

Сбор данных

Поскольку в качестве подхода к фаззингу был выбран метод видоизме$ нения пакетов, было бы логично сделать так, чтобы ProtoFuzz мог со$ бирать сетевые данные в разнородных режимах – как сниффер. Мы встроим анализатор сетевых протоколов в ProtoFuzz, чтобы он мог пе$ рехватывать входящий и исходящий трафик нашего объектного при$ ложения, затем выберем отдельные пакеты для фаззинга. Для реали$ зации этой функции используем существующую библиотеку сбора данных – подробнее об этом в разделе «Разработка».

Анализ данных

Хотя это и не очень важно, но мы хотим, чтобы кроме непосредственно сбора данных ProtoFuzz мог представлять содержимое перехваченных пакетов в легко понимаемом человеком формате. Это поможет пользо$ вателю определить участки пакета, которые подходят для фаззинга. Данные сетевых пакетов – это всего лишь серия байтов, расположен$

Свойства

271

ных по определенному принципу. Для того чтобы представить данные в понятной для человека форме, нужно воспользоваться библиотекой сбора данных, которая способна понимать структуру пакета и разби$ вать ее на различные заголовки протокола и участки данных, из кото$ рых состоит поток данных. Большинству людей знаком формат пред$ ставления, используемый Wireshark, поэтому мы будем использовать его в качестве формата отображения. На рис. 16.1 приведен простой пакет протокола TCP, перехваченный с помощью Wireshark.

Рис. 16.1. Wireshark анализирует пакет AIM, подтверждающий активность

На этом скриншоте Wireshark изображен дисплей, разделенный на три панели. В верхней панели – список отдельно перехваченных паке$ тов. Если вы выберете один из этих пакетов, его содержимое загрузит$ ся в две нижние панели. В средней панели отображается процесс раз$ борки пакета на отдельные поля. В этом случае мы видим, что Wire$ shark знаком с протоколом AOL Instant Messenger, поскольку он ус$ пешно декодировал целый участок данных пакета TCP. И наконец, в нижней панели отображаются необработанные шестнадцатеричные байты и байты ASCII выбранного пакета.

272

Глава 16. Фаззинг сетевых протоколов: автоматизация под Windows

Переменные фаззинга

После того как сетевые данные были обнаружены и собраны, нам необ$ ходимо позволить пользователю определить участки данных, которые необходимо видоизменить для фаззинга. Для этого мы воспользуемся очень простым форматом, заключающим в себе участки шестнадцате$ ричного представления пакета с помощью открывающих и закрываю$ щих тегов. Различные теги будут использоваться для представления различных типов рабочих переменных фаззинга. С одной стороны, этот простой формат облегчит пользователю визуальное обнаружение переменных фаззинга, а с другой – позволит ProtoFuzz определять об$ ласти, которые необходимо заменить данными фаззинга во время ана$ лиза структуры пакета. Мы будем использовать следующие теги:

[XX] грубая сила. Фаззинг байтов, заключенных в квадратные скоб$ ки, будет осуществляться с использованием всех возможных значе$ ний байтов. Следовательно, фаззинг одного байта будет повторять$ ся 256 раз, тогда фаззинг значения слова (2 байта) будет повторять$ ся 65 536 раз.

<XX> строки. Фаззинг байтов также может осуществляться с помо$ щью шестнадцатеричного представления заданных строк перемен$ ной длины из управляемого пользователем текстового файла (Strings.txt). Данный тип фаззинга обычно осуществляется на от$ дельных участках данных пакетов, в то время как фаззинг полей заголовков предусматривает четко определенную структуру.

Приведенный далее шаблон иллюстрирует пакет TCP, обработанный как с помощью грубой силы, так и с помощью строковых переменных фаззинга:

00 0C F1 A4 83 57 00 13 49 25 D5 72 08 00 45 00 00 28<B0 3B>00 00 FE 06 89 40 C0 A8 01 01 C0 A8 01 02 08 A6 0B 35 14 9E E1 9F 9F 33 69 E5 50 11 10 00 09 4E 00 00 01 00 5E 00 00[16]

Отправка данных

Библиотеки протоколов при отправке данных обычно используют два различных подхода. Первый подход состоит в использовании ряда функций, позволяющих вам устанавливать определенные участки данных, например IP$адрес и MAC$адрес объекта. Однако большинст$ во структур пакета создано за вас на базе соответствующего документа RFC. Примером данного класса может послужить класс HttpRequest библиотеки .NET. Он позволяет вам устанавливать такие свойства, как метод и URL, но большинство заголовков HTTP, а также все заго$ ловки Ethernet, TCP и IP будут сделаны за вас. Другой подход заклю$ чается в создании пакета необработанных данных, в котором указаны отдельные байты, а программист должен удостовериться в том, что па$ кеты соответствуют структуре, указанной в соответствующем доку$ менте RFC. Несмотря на то, что второй подход предусматривает боль$

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]