Глобальный хак винды

RIP

Xakep, номер #057, стр. 057-068-1


Эксплуатация виндовой RPC-уязвимости

Многие кричат, что винда - это форточка без стекол, намекая на то, что она вся дырявая. Заявление, конечно, громкое, но сейчас с этим сложно не согласиться. Совсем недавно мир узнал о более мощной баге, чем брешь в IIS. В отличие от предыдущей ошибки, эта дает права администратора в винде и полноценный доступ к командному интерпретатору. Причем каждый может быть как в роли жертвы, так и в роли атакующего. Хочешь подробностей? Читай дальше!

И это только начало...

Весточка о бреши в форточках промелькнула 16 июля на сайте www.lsd.pl и почти никого не заинтересовала. Добрый Microsoft вовремя среагировал и уже на следующее утро на официальном сервере находился патч под все платформы с кратким описанием уязвимости. Ровно через шесть дней на сайте Xfocus.org появляется первый эксплоит (http://xfocus.org/advisories/200307/4.html) с шестью таргетами для Win2k и WinXP со всеми сервиспаками. Среди хакеров возникло оживление, но эксплоит был не слишком эффективный, потому как при неверном выборе версии операционки, RPC-служба аварийно завершалась, и взломать систему больше не удавалось - необходима была перезагрузка.

Что интересно, описание уязвимости тоже не приводилось. К эксплоиту прилагалось несколько строк, которые говорили о том, что в коде юзается некорректное обращение к интерфейсу __RemoteGetClassObject. При этом подменяется именованный канал epmapper, а система имперсонируется. После чего будет открыт шелл на 4444 порту удаленной машины. Как я уже говорил, хакер получает права администратора.

Зри в корень!

Но Xfocus внес ясность в проблему. На самом деле уязвимостей в виндах две - локальная и удаленная. Обе они задействованы в эксплоите и являются причиной переполнения буфера. API-функция CoGetInstanceFromFile(), позволяющая создать файл, имеет несколько параметров. Один из них - название файла. Microsoft позаботился о проверке его длины, но только если запрос происходит удаленно. Исходя из этого, невозможно напрямую использовать данную функцию в коде эксплоита. Если же юзать функцию RPC (сервис находится на 135 порту), то ты запросто можешь составить запрос вида "\\servername\c$\itsverylongfilename.txt". Так как винда не проверяет сам параметр, а лишь выделяет под него память, то становится реальным переполнить буфер.

Но и здесь не все так гладко, как кажется на первый взгляд. Для того чтобы передать аргумент API-функции, требуется подменить "\\servername" на что-либо другое (изначально это имя машины). Кроме того, необходимо учесть, что шеллкод не должен иметь определенных символов, по которым происходит проверка в функции GetMachineName(). Это реализуется с помощью специально подобранных адресов возврата. Они зависят от версии операционной системы, и если сгенерированы неверно, RPC-сервис аварийно завершит работу.

Такое описание было выложено на Xfocus. К нему прилагались сложные дампы дизассемблера, чтобы понять, как именно переполняется буфер.

Заморочки со взломом

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

Содержание  Вперед на стр. 057-068-2