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

130 Глава 8. Фаззинг переменной среды и аргумента: автоматизация

else if ( WIFSTOPPED (status) )

{ /* завершение программы по сигналу */ if ( !quiet )

fprintf (stderr, "Process %d stopped due to signal %d (%s) ", pid,WSTOPSIG (status), F_signum2ascii

(WSTOPSIG (status)));

}

switch ( WSTOPSIG (status) )

{ /* следующие сигналы – все, которые нам нужны */ case SIGILL:

case SIGBUS: case SIGSEGV: case SIGSYS:

printf("Program got interesting signal...\n"); if ( (ptrace (PTRACE_CONT, pid, NULL,

(WSTOPSIG (status) ==SIGTRAP) ? 0 : WSTOPSIG (status))) == 1 )

{

perror("ptrace");

}

ptrace(PTRACE_DETACH,pid,NULL,NULL); fclose(fp);

return(ERR_CRASH); /* it crashed */

}

/* доставить сигнал и продолжать трассировку */

if ( (ptrace (PTRACE_CONT, pid, NULL, (WSTOPSIG (status) == SIGTRAP) ? 0 :

WSTOPSIG (status))) == 1 )

{

perror("ptrace");

}

goto monitor;

}

return(ERR_OK);

}

Язык

Языком разработки iFUZZ был выбран язык C. Хотя я могу придумать несколько причин, по которым это было сделано, но не могу скрыть то$ го факта, что C был использован в основном из$за того, что именно этот язык я использую каждый день и, работая именно с этим языком, чув$ ствую себя наиболее комфортно.

Тем не менее, безусловно, С обладает еще рядом преимуществ помимо того, что это мой любимый язык; например, на большинстве компьюте$ ров с UNIX, даже самых старых, встроены компиляционные комплек$ ты С. Такие языки, как Python или Ruby, таким преимуществом по$ хвастать могут не всегда. Можно было выбрать Perl, поскольку он ши$

Практический анализ

131

роко используется на компьютерах с UNIX. Однако известно, что коды, написанные на Perl, сложно поддерживать в процессе модификации.

Главное преимущество таких языков, как Python или Perl, примени$ тельно к подобному проекту – это время разработки. Использование такого рода скриптовых языков может значительно сократить время разработки.

В конце концов, наш уровень владения С и желание создать фаззер, не являющийся простым «hack», как прочие небольшие фаззеры, кото$ рые мы делали в оболочке bash, а также другие скриптовые языки, привели нас к решению использовать С.

Практический анализ

Использование iFUZZ помогло обнаружить более 50 локальных уязви$ мостей в IBM AIX 5.3, каждая из которых может быть более или менее полезной как для проверяющего безопасность системы, так и для охот$ ника за конфиденциальной информацией. Большинство этих уязвимо$ стей было довольно легко обнаружить – они прятались в argv[0] или argv[1]. Однако некоторые уязвимости искать было чуть более интерес$ но и «сложно». Говоря «сложно», мы не имеем в виду, что их поиск требовал высокой степени технического мастерства. Мы подразумева$ ем, что в этом случае придется быть чуточку терпеливее при подготов$ ке опций командной строки вашего iFUZZ и при ожидании результа$ тов работы iFUZZ. Две приведенные далее уязвимости (обнаруженные в двоичном коде одного корневого каталога setuid) демонстрируют мощь и эффективность iFUZZ в качестве локального фаззера системы:

piomkpq A ascii p X d X D x q LONGSTRING;

piomkpq A ascii p LONGSTRING d X D X q.

Хотя данный двоичный код не представляет особой угрозы для безо$ пасности системы, поскольку для его эксплойта требуется доступ к группе printq, он был приведен в качестве примера из$за необычных условий, требующихся для запуска уязвимостей внутри него.

Для обнаружения этих проблем была прочитана инструкция для дан$ ного двоичного кода и создана строка getopt для iFUZZ. Использован$ ная строка getopt имела вид a:A:d:D:p:q:Q:s:r:w:v:

Приведенные далее выходные данные из командной строки ls показы$ вают расположение и права доступа двоичного кода:

r sr x— 1 root printq 32782 Dec 31 1969 /usr/lib/lpd/pio/etc/piomkpq*

Через продолжительное время iFUZZ нашел как минимум два инте$ ресных и потенциально уязвимых сбоя в двоичном коде. В приведен$ ных уязвимостях LONGSTRING означает строку длиной примерно 20 000 символов, а X – любую подходящую строку, например саму

132

Глава 8. Фаззинг переменной среды и аргумента: автоматизация

строку x. Для получения уязвимого кода значения X должны исполь$ зоваться вместе с длинными строками.

Нельзя отрицать, что более интересным является поиск уязвимостей, которые более сложно атаковать, например, как в вышеупомянутых случаях; но не менее интересно наблюдать, как много простых ошибок можно найти лишь одним запуском всех базовых модулей iFUZZ. За$ пустите iFUZZ в режиме argv[0], argv[1] или одноопционального фаз$ зинга на двоичных кодах setuid в AIX 5.3, и вы обнаружите такое ко$ личество переполнений хипа, стека и проблем с форматирующими строками, что разбираться с ними вы будете несколько дней. О многих уязвимостях было сообщено в IBM, и они были исправлены; эти уязви$ мости были обнаружены при помощи iFUZZ самими авторами или не$ зависимыми исследователями, которые, скорее всего, использовали для их обнаружения схожие принципы фаззинга.

Эффективность и возможность улучшения

Мы надеемся, что после прочтения этой главы вам стало понятнее, в чем заключается польза iFUZZ. Не менее важно и то, что вы уяснили некоторые недостатки iFUZZ. Далее приведен ряд наблюдений, сде$ ланных после разработки iFUZZ:

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

Желательно иметь особую опцию, определяющую примерную дли$ ну строки или абсолютный минимум, необходимый для возникно$ вения сбоя. Это довольно незначительная функция, но она может сэкономить время.

Еще одна простая функция, которой недостает в iFUZZ, – это авто$ матическое отслеживание всех двоичных кодов в системе с учетом setuid и setgid. Эта функция опять же призвана экономить время.

Было бы здорово, если бы существовала функция анализа опций с данным двоичным кодом, но, по всей видимости, ее не так$то про$ сто реализовать. Если пользователь сможет указать двоичный код, а iFUZZ – автоматически определить, какие флаги и опции необхо$ димы для приложения, это позволит выполнить полноценный ин$ теллектуальный фаззинг с минимальным участием пользователя. Конечно, это сложно реализовать, поскольку приложения исполь$ зуют множество разных форматов. Даже после сравнительно пол$ ной разработки данной функции новое приложение с новым стилем

Резюме

133

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

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

Резюме

Несмотря на огромное внимание, уделяемое уязвимостям удаленного доступа, а с недавнего времени и уязвимостям с клиентской стороны, безопасность локальной системы остается объектом с множеством лег$ ко поражаемых «мишеней». Локальный фаззер способен обнаружить большинство этих «мишеней» и даже более сложных уязвимостей за короткое время, подтверждая то, что фаззинг позволяет добиваться весьма значительных результатов.

9

Фаззинг веб приложений и серверов

В небольших ожиданиях я специалист.

Джордж Буш$мл., речь на борту «Эйр Форс$1», 4 июня 2003 года

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

Что такое фаззинг веб приложений?

Фаззинг веб$приложений – это особая форма фаззинга сетевого прото$ кола. В то время как фаззинг сетевого протокола (о котором говорится в главе 14 «Фаззинг сетевого протокола») изменяет все типы сетевого

Что такое фаззинг веб<приложений?

135

пакета, фаззинг веб$приложений специально сосредоточивается на па$ кетах, удовлетворяющих условиям HTTP. Мы решили выделить фаз$ зинг веб$приложений в особую главу из$за многочисленности веб$при$ ложений и их важности в современном мире. Компании все больше переключаются на поставку программ как веб$сервисов, в отличие от традиционных программных продуктов, которые устанавливаются не$ посредственно на локальный компьютер. Веб$приложения могут нахо$ диться как у того, кто непосредственно пользуется ими, так и у третьей стороны. Если в дело вовлечена третья сторона, то такую модель часто называют моделью ASP (application service provider – провайдер сер$ висов и приложений).

Веб$приложения обеспечивают преимущества и разработчикам про$ грамм, и конечным пользователям. Поставщикам обеспечены долго$ срочный доход и возможность моментальных обновлений, в том числе устранения проблем с безопасностью. У конечных пользователей про$ пала нужда скачивать и применять патчи, поскольку приложение на$ ходится на централизованном сервере. С точки зрения конечного пользователя, это означает также меньшее количество проблем с под$ держкой работоспособности приложения – этим занимается ASP. Од$ нако это достигается ценой необходимости доверять ASP, который должен поддерживать достаточную безопасность для того, чтобы ваши данные не попались на глаза любопытным. Следовательно, безопас$ ность веб$приложений должна быть главной заботой.

Языки программирования и среды разработки, используемые для соз$ дания веб$приложений, также становятся более удобными для рабо$ ты. В результате этого многие компании сейчас создают собственные веб$приложения для использования исключительно во внутренних

Microsoft Live

Microsoft делает решительную ставку на возрастающую важ$ ность веб$приложений. Хотя хлебом с маслом для них всегда бы$ ли традиционные GUI$приложения наподобие Microsoft Office, в ноябре 2005 года руководитель Microsoft Билл Гейтс объявил о запуске двух новых веб$приложений: Windows Live и Office Live.1 Windows Live – это подборка сервисов для индивидуаль$ ных пользователей, а Office Live предназначен для малого биз$ неса. Microsoft будет получать прибыль от этих сервисов с помо$ щью рекламы и подписки. Линейка сервисов Live впервые по$ явилась в ноябре 2002 года с запуском Xbox Live – онлайн$сооб$ щества и магазина, торгующего консолью для видеоигр Xbox.

1http://news.com.com/2061+10805_3+6026895.html

136

Глава 9. Фаззинг веб<приложений и серверов

корпоративных сетях, содействия бизнесу и общения с партнерами и покупателями. В наши дни почти любая компания независимо от ее размера может рассматриваться как разработчик программ. Даже мас$ терская с одним человеком в штате может изготовить и поддерживать веб$приложения благодаря технологическим достижениям. Однако не$ смотря на то, что создать веб$приложение относительно просто, создать безопасное веб$приложение довольно сложно. И если разработкой за$ нималась компания, для которой это не самая сильная сторона, то, скорее всего, приложение не подвергалось серьезному тестированию на безопасность перед выпуском. К сожалению, удобные в использова$ нии и бесплатные приложения для тестирования веб$приложений не идут в ногу с технологиями выпуска самих этих приложений. И одна из целей данной книги – изменить это положение. Далее следует спи$ сок наиболее популярных технологий, которые используются в таких случаях.

Технологии для веб приложений

CGI

Общий шлюзовый интерфейс (Common Gateway Interface, CGI) – это стандарт, изначально разработанный Национальным цен$ тром приложений для суперкомпьютеров (NCSA) для веб$серве$ ра NCSA на основе HTTP в 1993 году. CGI определяет, как нужно обмениваться данными между веб$клиентом и приложением, которое работает с запросом от имени веб$сервера.1 Хотя в соче$ тании с CGI можно использовать любой язык, чаще всего приме$ няется Perl.

PHP

Гипертекстовый препроцессор (Hypertext Preprocessor, PHP2) – популярный скриптовый язык, часто используемый для разра$ ботки веб$приложений. Широко доступны интерпретаторы, ко$ торые позволяют PHP работать в большинстве операционных систем. Скрипты PHP можно внедрять прямо в страницы HTML для работы с теми частями веб$контента, которые требуют дина$ мического порождения.

Flash

Flash изначально был разработан компанией FutureWave Soft$ ware, которую в декабре 1996 года3 приобрела Macromedia.

1

2

http://en.wikipedia.org/wiki/Common_Gateway_Interface http://www.php.net/

3http://en.wikipedia.org/wiki/Adobe_Flash

Что такое фаззинг веб<приложений?

137

Flash представляет собой во многом уникальное по сравнению с упомянутыми здесь технологиями явление, поскольку требует установки отдельного клиентского ПО. Большинству других технологий достаточно просто веб$броузера.

Macromedia смогла поддержать введение Macromedia Flash, объ$ явив бесплатным Macromedia Flash Player. Flash использует язык, известный как ActionScript, для поддержки большинства своих интерактивных функций. Хотя Flash – в основе своей кли$ ентская технология, Macromedia Flash Remoting действительно позволяет взаимодействовать Flash Player и веб$приложению на сервере.1 Macromedia в 2005 году была сама приобретена Adobe Systems.2

JavaScript

Netscape создал JavaScript еще в 1995 году для поддержки дина$ мического контента на веб$страницах.3 JavaScript можно ис$ пользовать и как клиентскую, и как серверную технологию. Как клиентская технология JavaScript внедряется в HTML, отправ$ ляемый на веб$броузер, и интерпретируется самим броузером. JavaScript может быть использован и как серверная технология, в этом случае веб$сервер использует его для создания динамиче$ ского контекста. Другие серверные технологии, например Mi$ crosoft ASP.Net (см. далее), поддерживают JavaScript.

Java

Java – это детище Джеймса Гослинга (James Gosling) из Sun Mi$ crosystems. Родилась она под именем Oak и сначала должна бы$ ла работать на внедренных системах. Позднее она была адапти$ рована для использования в веб$технологиях и переименована

вJava, так как выяснилось, что имя Oak уже запатентовано.4 Java – это переходный случай между компилированным и ин$ терпретированным языком. Исходный код Java скомпилирован

вбайтовый код, который затем интерпретируется с помощью Java Virtual Machine, работающей на нужной платформе. Благо$ даря этому подходу Java не зависит от платформы. Она часто ис$ пользуется в веб$броузерах, обеспечивая работу сложных интер$ активных приложений.

1

2

3

http://www.macromedia.com/software/flashremoting/

http://en.wikipedia.org/wiki/Macromedia

http://en.wikipedia.org/wiki/Javascript

4http://en.wikipedia.org/wiki/Java_programming_language

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