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

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

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

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


Exploit

Готовый exploit (написанный на языке Perl) можно свободно скачать по адресам:
http://metasploit.com/projects/Framework/exploits.html#netapi_ms06_040 и http://milw0rm.com/exploits/2162

Solution

Microsoft уже выпустила заплатки для большинства своих систем, доступные через службу Windows Update, однако, при желании можно обойтись и без них: достаточно заблокировать SMB-трафик из внешней Сети, для чего необходимо закрыть два TCP порта — 139 и 445 (однако, это сделает невозможность работу приложений, работающих через SMB).

Details

Механизм RPC является низкоуровневым средством межкомпьютерного взаимодействия, предоставляющим прозрачный механизм удаленного вызова процедур, который с точки зрения прикладной программы выглядит так, как будто бы процедура находится на локальной машине. На базе RPC построены многие системные сервисы и, в частности, SMB (Server Message Block), реализующий именованные каналы (named pipes) и использующий PRC в качестве транспорта. в свою очередь, SMB используется для удаленного доступа к файлам, папкам и принтерам. И все бы ничего, но в функции NetpIsRemote(), сосредоточенной в библиотеке NetApi32.DLL допущена ошибка контроля границ, приводящая к традиционному стековому переполнению, с возможностью подмены адреса возврата.

Если бы NetpIsRemote() была документированной функций, мы бы просто передавали ей аргументы различной длинны, пытаясь вызывать переполнение, но, к сожалению, ее прототип неизвестен, а потому приходится прибегать к тяжелой артиллерии, то есть к дизассемблированию. Итак, загружаем библиотеку NetApi32.DLL в IDA Pro и начинаем исследовать функцию NetpIsRemote(), пытаясь "глазами" найти место, в котором происходит переполнение, в первую очередь обращающая внимания на циклы, копирующие блоки памяти (типа mov ecx,[eax]/mov [ebx],eax/add eax,4) или вызовы функций memcpy(), memmove(), strcpy(), wcscpy() и т.д. Функция NetpIsRemote() выглядит обманчиво маленькой, но если присмотреться повнимательнее, можно обнаружить множество условных переходов, ведущий на CHUNK'и (то есть, на ее продолжение), совокупный объем которых довольно велик и затруднителен для анализа.

Беглый поиск обнаруживает пару подозрительных функций wcscpy() и wcscat(), однако, wcscpy() отпадает сразу, поскольку копирует строку фиксированной длинны, жестко прошитую внутри NetApi32.DLL, а wcscat() восходит к функции I_NetNameCanonicalize(), перспективы переполнения которой на данном этапе исследований весьма туманны и неясны.

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