Глобальный хак винды
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. К нему прилагались сложные дампы дизассемблера, чтобы понять, как именно переполняется буфер.
Заморочки со взломом
Для линуксоида существует две проблемы, которые он должен преодолеть до того, как поимеет виндовый шелл.