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

Замечания по использованию

211

 

 

Цель

 

Имя файла

 

 

 

 

 

 

generic_file_fuzz.c

 

Главный источник SPIKEfile. Содержит функцию main

 

include/filestuff.h

 

Заголовочный файл для filestuff.c

 

Libdisasm

 

Библиотека, используемая для разборки команд x86

 

 

 

в случае какого$либо сбоя

 

 

 

 

Замечания по использованию

Если вы планируете использовать SPIKEfile или notSPIKEfile с прило$ жением, которое нельзя запустить напрямую, вам необходимо вырабо$ тать определенный подход к ним. Adobe Acrobat Reader и RealNet$ works RealPlayer – хорошие примеры данного типа приложений.

Обычно программа, которую вы непосредственно запускаете, работая с этими приложениями, – это упаковщик основного сценария. Основ$ ной сценарий устанавливает среду таким образом, чтобы истинный двоичный код мог выполняться корректно. Это делается в основном для того, чтобы приложения могли использовать копии своих собст$ венных общих библиотек. Использование собственных копий общих библиотек обеспечивает большую мобильность продукта. Хотя причи$ ной этого и было желание облегчить жизнь пользователю, нам это ре$ шение лишь усложняет жизнь. Например, если мы указываем основ$ ной сценарий в качестве файла для фаззинга, то не будем прикрепле$ ны непосредственно к двоичному коду во время его выполнения, а бу$ дем прикреплены к копии программной оболочки. Поэтому даже если мы перехватим сигнал, это не будет значить ничего. Далее приводятся примеры того, как можно преодолеть это препятствие в случае с Acro$ batReader и RealPlayer. Данный принцип может быть использован и для других подобных приложений.

Adobe Acrobat

В случае с Acrobat вы должны в первую очередь просто запустить acro$ read, используя опцию –DEBUG. Это обеспечит вам программную обо$ лочку с исправной средой, настроенной на непосредственное активи$ рование реального двоичного кода acroread, который часто находится по адресу $PREFIX/Adobe/Acrobat7.0/Reader/intellinux/bin/acroread. Хотя для этой информации нет документации и функций использова$ ния, нам удалось получить ее, просто прочитав основной сценарий acroread. Теперь фаззинг данного двоичного кода пройдет без проблем. Этот метод был использован совместно с notSPIKEfile при обнаруже$ нии уязвимости переполнения буфера UnixAppOpenFilePerform про$ граммы Adobe Acrobat Reader.1

1http://www.idefense.com/intelligence/vulnerabilities/display.php?id=279

212

Глава 12. Фаззинг формата файла: автоматизация под UNIX

RealNetworks RealPlayer

Как видно из приведенных ниже выходных данных, команда realplay на самом деле является основным сценарием. Мы также видим, что данное двоичное приложение называется realplay.bin.

user@host RealPlayer $ file realplay realplay.bin realplay: Bourne shell script text executable

realplay.bin: ELF 32 bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.2.5, dynamically linked (uses shared libs), stripped

В случае с RealPlayer вам необходимо всего лишь настроить перемен$ ную среды оболочки HELIX_PATH на путь установки RealPlayer. Затем вы сможете выполнять фаззинг непосредственно двоичного файла real$ play.bin, включенного RealPlayer. Эта информация была получена все$ го лишь после прочтения файла основного сценария realplay. Данный метод вместе с notSPIKEfile был использован при обнаружении уязви$ мости форматирующей строки RealPix программ RealNetworks Real$ Player/HelixPlayer.1

Контрольный пример: уязвимость форматирующей строки RealPix программы RealPlayer

Сейчас мы описываем, каким образом notSPIKEfile был использован для обнаружения уязвимости в RealPlayer, исправленной в сентябре 2005 года. Первым шагом является случайный выбор формата файла, поддерживаемого RealPlayer. В данном случае, естественно, был вы$ бран формат RealPix. После продолжительного поиска в Google были скомпилированы несколько тестовых файлов RealPix, которые исполь$ зовались в качестве базовых файлов в процессе фаззинга с использова$ нием notSPIKEfile. Ниже приведен в сокращенном виде один пример:

<imfl>

<head title="RealPix(tm) Sample Effects" author="Jay Slagle" copyright="(c)1998 RealNetworks, Inc." timeformat="dd:hh:mm:ss.xyz" duration="46"

bitrate="12000"

width="256"

height="256"

url="http://www.real.com"

aspect="true"/> </imfl>2

1http://www.idefense.com/intelligence/vulnerabilities/display.php?id=311

2http://service.real.com/help/library/guides/realpix/htmfiles/tags.htm

Уязвимость форматирующей строки RealPix

213

Это базовый пример очень небольшого файла RealPlayer. Если вы за$ грузите его в RealPlayer, то ничего не отобразится, поскольку он со$ держит только заголовок. Мы будем пропускать его через notSPIKE$ file для проверки кода анализа заголовка на наличие ошибок. Для того чтобы начать процесс фаззинга, используем следующую команду:

user@host $ export HELIX_PATH=/opt/RealPlayer/

user@host $ ./notSPIKEfile t 3 d 1 m 3 r 0 S s SIGKILL o FUZZY sample1.rp sample1.rp "/opt/RealPlay/realplay.bin %FILENAME%"

[…] user@host $

При помощи опции t мы приказываем инструменту отводить на каж$ дую активацию RealPlayer 3 секунды. При помощи опции d мы при$ казываем ему ждать 1 секунду между прекращением неактивного про$ цесса и запуском нового процесса. Мы устанавливаем запуск трех па$ раллельных копий realplayer при помощи опций m, а при помощи оп$ ции r приказываем инструменту выполнять фаззинг всего файла, начиная с нулевого байта. Мы также устанавливаем режим строкового фаззинга при помощи s и устанавливаем сигнал SIGKILL на случай прекращения неактивных процессов при помощи опции s. В конце концов, мы указываем инструменту формат для файловых имен, с ко$ торыми был осуществлен фаззинг, задаем файловое имя нашего тесто$ вого файла, sample1.rp, и указываем инструменту, как нужно запус$ тить RealPlayer, чтобы он проанализировал наш файл. Теперь мы го$ товы к бою! Из выходных данных, в которых сообщается о ряде сбоев, следует, что мы обнаружили какой$то вид уязвимости.

Мы создаем список файлов в текущем каталоге и видим, что был соз$ дан файл FUZZY$sample1.rp$0x28ab156b$dump.txt. Когда мы откры$ ваем этот файл, перед нами предстает многословный отчет с полным описанием состояния процесса на момент сбоя. Мы также видим имя файла, послужившего причиной этого сбоя. В данном случае он был сохранен под именем 12288$FUZZY$sample1.rp. Этот файл может быть использован для воссоздания сбоя. При просмотре файла мы получаем ценную информацию, которая может подсказать, в чем же состояла проблема. Содержимое файла выглядит следующим образом:

<imfl>

<head title="RealPix(tm) Sample Effects" author="Jay Slagle" copyright="(c)1998 RealNetworks, Inc."

timeformat="%n%n%n%n%n%n%n%n%n%n%n%ndd:hh:mm:ss.xyz"

duration="46"

bitrate="12000"

width="256"

height="256"

url="http://www.real.com"

aspect="true"/>

</imfl>

214

Глава 12. Фаззинг формата файла: автоматизация под UNIX

Обнаружив наличие символов %n, мы сразу начинаем подозревать, что причиной сбоя стала уязвимость форматирующей строки. Наши по$ дозрения подтверждаются, когда мы запускаем двоичный файл Real$ Player в GDB:

user@host ~/notSPIKEfile $ gdb q /opt/RealPlayer/realplay.bin Using host libthread_db library "/lib/tls/libthread_db.so.1". (gdb) r 12288 FUZZY sample1.rp

Starting program: /opt/RealPlayer/realplay.bin 12288 FUZZY sample1.rp

Program received signal SIGSEGV, Segmentation fault. 0xb7e53e67 in vfprintf () from /lib/tls/libc.so.6 (gdb) x/i $pc

0xb7e53e67 <vfprintf+13719>: mov %ecx,(%eax)

Мы на самом деле обнаружили уязвимость форматирующей строки в RealPlayer при обработке опции timeformat. В качестве упражнения вы можете создать эксплойт для этой уязвимости.

Язык

Рассмотренные инструменты были написаны на С по ряду логичных причин. Во$первых, С и Linux, как соль и перец, всегда работали и все$ гда будут лучше работать совместно. Каждый современный пакет Linux содержит компилятор С, и, скорее всего, так будет и в дальней$ шем, поскольку ядро Linux написано на С. Не существует специаль$ ных библиотек, необходимых для внедрения интерфейса ptrace в наше приложение, и мы абсолютно свободны при выполнении поставлен$ ных перед собой задач.

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

Резюме

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

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