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

422

Глава 21. Интегрированные среды фаззинга

тельности контрольных примеров, приводящих к инициализации той или иной комплексной ошибки. Данный агент принимает следующие аргументы командной строки:

ERR> USAGE: vmcontrol.py

 

< x|—vmx FILENAME>

path to VMX to control

< r|—vmrun FILENAME>

path to vmrun.exe

[ s|—snapshot NAME>

set the snapshot name

[ l|—log_level LEVEL]

log level (default 1), increase for more verbosity

Интерфейс веб мониторинга

Класс сессии Sulley оснащен встроенным простейшим веб$сервером, который с помощью жесткого кодирования привязан к порту 26000. После вызова метода fuzz() класса сессии поток веб$сервера раскручи$ вается, и можно наблюдать за работой фаззера, в том числе за проме$ жуточными результатами. На рис. 21.3 приведен скриншот, иллюст$ рирующий пример подобной ситуации.

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

Рис. 21.3. Интерфейс веб+мониторинга Sulley

Постпрограмма

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

Sulley: интегрированная среда фаззинга

423

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

$ ./utils/crashbin_explorer.py

USAGE: crashbin_explorer.py <xxx.crashbin>

[ t|—test #]

dump

the crash synopsis for a specific

 

test

case number

[ g|—graph name] generate a graph of all crash paths, save to 'name'.udg

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

$./utils/crashbin_explorer.py audits/trillian_jabber.crashbin

[3]ntdll.dll:7c910f29 mov ecx,[ecx] from thread 664 caused

access violation 1415, 1416, 1417,

[2] ntdll.dll:7c910e03 mov [edx],eax from thread 664 caused access violation 3780, 9215,

[24] rendezvous.dll:4900c4f1 rep movsd from thread 664 caused access violation 1418, 1419, 1420, 1421, 1422, 1423, 1424, 1425, 3443, 3781, 3782, 3783, 3784, 3785, 3786, 3787, 9216, 9217, 9218, 9219, 9220, 9221, 9222, 9223,

[1] ntdll.dll:7c911639 mov cl,[eax+0x5] from thread 664 caused access violation 3442,

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

$ ./utils/crashbin_explorer.py audits/trillian_jabber.crashbin t 1416 ntdll.dll:7c910f29 mov ecx,[ecx] from thread 664 caused access violation

when attempting to read from

0x263b7467

CONTEXT DUMP

 

 

 

EIP: 7c910f29 mov ecx,[ecx]

 

 

EAX: 039a0318 (

60424984) > gt;>>...>>>>>

 

 

 

(heap)

EBX: 02f40000 (

49545216)

>

PP@ (heap)

ECX: 263b7467 ( 641430631)

> N/A

EDX: 263b7467 ( 641430631)

> N/A

EDI: 0399fed0 (

60423888)

> #e<root><message>>>>

 

 

 

...>>& (heap)

ESI: 039a0310 (

60424976)

> gt;>>...>>>>>

 

 

 

(heap)

424

 

 

 

Глава 21. Интегрированные среды фаззинга

EBP:

03989c38

(

60333112)

> \|gt;&t]IP”Ix;IXIox@ @x@PP8|p|Hg9I

 

 

 

 

 

P (stack)

ESP: 03989c2c (

60333100)

> \|gt;&t]IP”Ix;IXIox@ @x@PP8|p|Hg9I

 

 

 

 

 

(stack)

+00:

02f40000

(

49545216)

>

PP@ (heap)

+04: 0399fed0 (

60423888)

> #e<root><message>>>>

 

 

 

 

...>>& (heap)

+08:

00000000

(

0)

> N/A

+0c:

03989d0c (

60333324)

> Hg9I Pt]I@"ImI,IIpHsoIPnIX{ (stack)

+10:

7c910d5c (2089880924)

> N/A

+14:

02f40000

(

49545216)

>

PP@ (heap)

disasm

around:

 

 

 

 

0x7c910f18 jnz 0x7c910fb0 0x7c910f1e mov ecx,[esi+0xc] 0x7c910f21 lea eax,[esi+0x8] 0x7c910f24 mov edx,[eax] 0x7c910f26 mov [ebp+0xc],ecx 0x7c910f29 mov ecx,[ecx] 0x7c910f2b cmp ecx,[edx+0x4] 0x7c910f2e mov [ebp+0x14],edx 0x7c910f31 jnz 0x7c911f21

stack unwind: ntdll.dll:7c910d5c rendezvous.dll:49023967 rendezvous.dll:4900c56d kernel32.dll:7c80b50b

SEH unwind:

03989d38 > ntdll.dll:7c90ee18 0398ffdc > rendezvous.dll:49025d74 ffffffff > kernel32.dll:7c8399f3

Опять же ничего слишком очевидного может и не броситься в глаза, но мы знаем, что оказываем воздействие на данное нарушение доступа, поскольку регистр ECX, который был некорректно разыменован, со$ держит строку ASCII «&;tg». Может быть, расширение строки? Мы можем представить места сбоев графически, что добавляет дополни$ тельное измерение, отображая известные маршруты выполнения с ис$ пользованием переключателя командной строки g. Приведенный на рис. 21.4 сгенерированный граф также взят из аудита парсера Trillian Jabber.

Мы видим, что, несмотря на то, что мы обнаружили четыре различные точки сбоя, источник проблемы, скорее всего, один и тот же. Дальней$ шее исследование подтверждает корректность этой версии. Конкрет$ ная ошибка существует в подсистеме передачи сообщений протокола XMPP (расширяемый протокол обмена сообщениями и информацией о присутствии). Trillian определяет местонахождение соседних поль$ зователей с помощью сервиса _presence mDNS (широковещательного DNS) через порт UDP 5353. После того как пользователь зарегистриро$ вался с помощью mDNS, обмен сообщениями осуществляется через

Sulley: интегрированная среда фаззинга

425

 

 

[30] kernel32.d11:7c80b50b

 

[5] rendevous.d11.4900c56d

[24] rendevous.d11.4900c4f1

[1] rendevous.d11.49023b1f

[5] rendevous.d11.49023967

 

[1] rendevous.d11.49023afd

[3] ntd11.d11:7c910d5c

[2] ntd11.d11:7c910e03

[1] ntd11.7c911639

[3] ntd11.d11:7c910f29

 

 

 

Рис. 21.4. Граф аудита, сгенерированный Sulley

 

протокол XMP по порту TCP 5298. Внутри plugins\rendezvous.dll сле$ дующая логика применяется к получаемым сообщениям:

4900C470

str_len:

 

4900C470

mov cl, [eax]

; *eax = message+1

4900C472

inc eax

 

4900C473

test cl, cl

 

4900C475

jnz short str_len

 

4900C477

sub eax, edx

 

4900C479

add eax, 128

; strlen(message+1) + 128

4900C47E

push eax

 

4900C47F

call _malloc

 

Длина строки вводимого сообщения подсчитывается, и размещается буфер хипа в количестве, равном +128, с целью хранения копии сооб$ щения, которое затем передается через функцию expatxml.xmlCompos eString(), вызываемую с помощью приведенного ниже прототипа:

plugin_send(MYGUID, "xmlComposeString", struct xml_string_t *); struct xml_string_t {

unsigned int struct_size; char *string_buffer;

struct xml_tree_t *xml_tree;

};

Подпрограмма xmlComposeString() осуществляет вызов expatxml. 19002420(), причем HTML кодирует символы &, > и < как &, > и < соответ$ ственно. Данное поведение может быть обнаружено в следующем фрагменте дизассемблирования:

426

 

Глава 21. Интегрированные среды фаззинга

19002492

push

0

 

19002494

push

0

 

19002496

push

offset str_Amp

; "&"

1900249B

push

offset ampersand

; "&"

190024A0

push

eax

 

190024A1

call

sub_190023A0

 

190024A6

push

0

 

190024A8

push

0

 

190024AA push

offset str_Lt

; "<"

190024AF push

offset less_than

; "<"

190024B4

push

eax

 

190024B5

call sub_190023A0

 

190024BA push

 

 

190024BC push

 

 

190024BE push offset str_Gt

; ">"

190024C3

push offset greater_than

; ">"

190024C8

push eax

 

190024C9

call sub_190023A0

 

Поскольку изначально подсчитанная длина строки не рассчитана на подобное расширение строки, приведенная далее последовательная операция копирования внутренней памяти внутри файла rendez$ vous.dll может инициализировать нарушение памяти, не защищенное от эксплойта:

4900C4EC mov ecx, eax 4900C4EE shr ecx, 2 4900C4F1 rep movsd 4900C4F3 mov ecx, eax 4900C4F5 and ecx, 3 4900C4F8 rep movsb

Каждая из ошибок, обнаруженных Sulley, была ответственна за дан$ ную логическую ошибку. Отслеживание точек и маршрутов сбоя по$ зволило нам быстро перейти к версии об одном источнике, ответствен$ ном за ошибку. Последний шаг, который нам может понадобиться предпринять, – удаление всех файлов PCAP, не содержащих информа$ ции, связанной с ошибкой. Утилита pcap_cleaner.py была написана для выполнения именно этой цели:

$ ./utils/pcap_cleaner.py

USAGE: pcap_cleaner.py <xxx.crashbin> <path to pcaps>

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

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