Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #93, СЕНТЯБРЬ 2006 г.

Обзор эксплойтов

Крис касперски

Хакер, номер #093, стр. 093-056-5


7CD25C32 push edi 7CD23193 push edi

7CD25C33 call I_NetNameCanonicalize 7CD23194 call I_NetNameCanonicaliz

7CD25C38 cmp [ebp+var_4],edi 7CD23199 cmp [ebp+var_4],edi

7CD25C3B jz loc_7CD25C48 7CD2319C jz loc_7CD231A9

7CD25C3D mov eax, [ebp+arg_C] 7CD2319E mov eax, [ebp+arg_8]

7CD25C40 lea ebx, [ebp+var_20C] 7CD231A1 lea ebx, [ebp+var_20C]

7CD25C46 jmp loc_7CD25C60 7CD231A7 jmp loc_7CD231C1

7CD25C60 loc_7CD25C60: 7CD231C1 loc_7CD231C1:

7CD25C60 mov ecx, [ebp+arg_8] 7CD231C1 mov ecx, [ebp+arg_4]

7CD25C63 neg eax 7CD231C4 neg eax

7CD25C65 sbb eax, eax 7CD231C6 sbb eax, eax

7CD25C67 cmp [ebp+arg_C],edi 7CD231C8 cmp [ebp+arg_8],edi

7CD25C6A mov [ecx],eax 7CD231CB mov [ecx],eax

7CD25C6C jz loc_7CD25C8A 7CD231CD jz loc_7CD23208

7CD231CF push ebx

7CD231D0 call ds:__imp_wcslen

7CD231D6 add eax, 3

7CD231D9 pop ecx

7CD231DA cmp [ebp+arg_C], eax

7CD231DD jnb short loc_7CD231EC

…

7CD231EC loc_7CD231EC:

7CD25C6E push asc_7CD17CF4 7CD231EC push asc_7CD11744

7CD25C73 push [ebp+arg_C] 7CD231F1 push [ebp+arg_8]

7CD25C76 call ds:__imp_wcscpy 7CD231F4 call ds:__imp_wcscpy

7CD25C7C pop ecx 7CD231FA pop ecx

7CD25C7D pop ecx 7CD231FB pop ecx

7CD25C7E push ebx 7CD231FC push ebx

7CD25C7F push [ebp+arg_C] 7CD231FD push [ebp+arg_8]

7CD25C82 call ds:__imp_wcscat 7CD23200 call ds:__imp_wcscat

Ага! Вот оно! Между функциями I_NetNameCanonicalize() и wcscpy()/wcscat() в обновленной версии NetApi32.DLL внедрен вызов wcslen(), проверяющий размер строки, возращенный I_NetNameCanonicalize() перед его копированием в блок памяти, переданнй по указателю через аргумент функции (arg_C в старой и arg_8 в новой версии). сама же I_NetNameCanonicalize() так же принимает на "грудь" указатель, извлекаемый структуры, переданной NetpIsRemote() в качестве аргумента.

Все это создает крайне благоприятные условия для реализации атаки и засылки shell-кода. Достаточно "всего лишь" передать слишком длинную строку функци I_NetNameCanonicalize() вместе с указателем на крошечный буфер, неспособный вместить "канонизированное" имя. Локальный exploit пишется без проблем — ведь функция NetpIsRemote() экспортируется, и все, что нам нужно — это восстановить его прототип.

Однако, локальный exploit – не слишком-то полезная штука, гораздо больший интерес вызывают удаленные exploit'ы. Можем ли мы использовать эту уязвимость для атаки, и если да, то как?

Переходим в начало функции NetpIsRemote() и, нажав <ALT-V> [view], <O> [open sub-view], <O> [cross references], смотрим по перекрестным ссылкам — какие функции ее вызывают. большинство функций семейства I_*() доступны через SMB Remote APIs, т. е. их можно вызывать удаленно по RPC-протоколу, инкапсулированному в SMB. подобнее об этом можно прочитать на форуме immunitysec'а в сообщении известного хакера H D Moore'а: lists.immunitysec.com/pipermail/dailydave/2006-August/003400.html, а в MSDN можно найти готовый пример реализации Bloodhound'а Parser DLL for SMB Remote APIs, расположенный в файле REMAPI.C и основанный на функции CreateProtocol(), описанной в windowssdk.msdn.microsoft.com/en-us/library/ms707941.aspx.

Назад на стр. 093-056-4  Содержание  Вперед на стр. 093-056-6