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

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

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

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


Основная ценность REMAPI.C заключается в том, что имена I_*() функций (совпадающих с именами команд SMB протокола) в нем перечислены "прямым текстом". фактически это единственный источник информации, который у нас только есть.

Просматривая список перекрестных ссылок, необходимо отобрать функции, присутствующие в файле REMAPI.C: I_NetPathType(), I_NetNameValidate(), I_NetNameCanonicalize(), I_NetNameCompare() и I_NetPathCompare().

Теперь необходимо проанализировать дизассемблерный листинг каждой из них и найти хотя бы одну функцию, передающую NetpIsRemote() свой собственный аргумент вместе с указателем на локальный буфер фиксированного размера. Как ни смешно, но этой функцией оказывается... I_NetNameCanonicalize(). Нет, это не ошибка! I_NetNameCanonicalize() вызывает NetpIsRemote(), а NetpIsRemote() вызывает I_NetNameCanonicalize(), вот такая, значит рекурсия у нас получается. но довольно эмоций! ниже приведен дизассемблерный фрагмент I_NetNameCanonicalize() в котором и происходит переполнение.

Вот где происходит переполнение

7CD1F980 loc_7CD1F980: ; CODE XREF: I_NetNameCanonicalize+A4?j

7CD1F982 push 104h ; размер буфера(?)

7CD1F987 lea eax,[ebp+var_230] ; указатель на…

7CD1F98D push eax ; …локальный буфер.

7CD1F98E lea eax,[ebp+var_20] ; указатель на другой…

7CD1F991 push eax ; …локальный буфер

7CD1F992 push [ebp+arg_0] ; аргумент функции

7CD1F995 call NetpIsRemote ; вызов уязвимой функции

таким образом, все, что нам нужно — это вызвать функцию I_NetNameCanonicalize(), так же являющуюся командой протокола SMB и передать ей слишком длинную строку, вызывающую срыв стека, что легко осуществляется из любой точки Сети, если, конечно, внешний SMB-трафик не отсекается брандмауэром.

проблема в том, что I_NetNameCanonicalize() ни хрена не документирована и ее прототип неизвестен. кое-какую информацию удается нарыть в файле netapi32.inc, входящем в состав ассемблера MASM, но она слишком малоинформативна.

I_NetNameCanonicalize PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD

к счастью, у нас есть Bloodhound Parser, заботливо предоставленный Microsoft, позволяющий сниффить сеть и декодировать пролетающий SMB-команды. аргументы, правда, не декодируются, но об их назначении нетрудно догадаться и самостоятельно. еще можно дизассемблировать I_NetNameCanonicalize(), разобравшись какие аргументы она ожидает. это рутинная и неинтересная работа, к тому же уже проделанная авторами metasploit exploit'а, так что не будем повторяться, а лучше позаимствуем готовый "движок" и адоптируем его для собственных нужд.

Назад на стр. 093-056-5  Содержание