0

После изучения большого количества тематических сайтов по повышению привилегий на ОС Windows, мы пришли к мысли, что тема DLL Hijacking поднимается не так часто, а в большинстве из найденных статей отсутствует решение проблем, с которыми предстоит встретиться пентестеру, проводя эту атаку. В данной статье мы рассмотрим особенности эксплуатации данной уязвимости на примере ОС Windows 7 с установленным антивирусом.

Итак, представим ситуацию – имеем OC Windows 7, можем передавать на нее файлы (например, через общий буфер по RDP), а также на системе установлен антивирус, который усложняет использование различных автоматически сгенерированных эксплойтов. Большинство проверок по поднятию привилегию уже выполнены, но желаемый результат еще не получен. Самое время выполнять проверку на уязвимость к DLL Hijacking!

В чем суть атаки?

В случае, когда приложение подгружает DLL-библиотеку без указания полного пути к ней, ОС Windows пытается найти необходимую DLL-библиотеку в определенном наборе директорий. При этом код из подгружаемой DLL-библиотеки будет выполнен в контексте пользователя, запускающего приложение. Уязвимость заключается в особенности поиска в ОС Windows подгружаемых DLL-библиотек при наличии некорректного права на запись в эти каталоги. Вот как Microsoft описывает порядок поиска подгружаемых библиотек (link):

  1. Поиск в директории, в которой находится исполняемый модуль текущего процесса
  2. Поиск в текущей директории
  3. Поиск в системной директории Windows (Например, C:\\Windows\System32)
  4. Поиск в директории Windows (Например, C:\\Windows)
  5. Поиск в директориях, указанных в переменной среды PATH

PATH – переменная среды, содержащая директории, в которых будет выполняться поиск исполняемых файлов, таких как EXE или DLL. Зачастую доступ на запись в директории из первых 4 пунктов ограничен, хотя проверить этот факт конечно же стоит, но вот доступ на запись в директории из переменной среды PATH часто бывает некорректен. Может случиться даже такая ситуация, что директория, указанная в переменной среды PATH, просто отсутствует на диске по причине некорректного удаления программы, что может позволить пентестеру самостоятельно создать ее, получив при этом доступ на запись.

Parvez провел исследование, в результате которого выявил ряд уязвимых сервисов в «коробочной» версии ОС Windows, которые выполняются в контексте пользователя NT AUTHORITY\SYSTEM. Эти уязвимые сервисы пытаются загрузить необходимые для работы DLL-библиотеки, которые отсутствуют в «коробочной» версии ОС Windows. Одним из таких уязвимых сервисов для ОС Windows 7 является IKEEXT, который пытается загрузить отсутствующую DLL-библиотеку wlbsctrl.dll.

Подготавливаем стенд

Авторы данной статьи не несут ответственности за возможный ущерб, причиненный материалом данной статьи.
Настоятельно рекомендуется проводить данную атаку на виртуальной машине, развернутой специально для тестирования. Возможно нарушение работоспособности уязвимой системы.

Для демонстрации данной атаки мы специально добавим директорию C:\Hi-Jackie, доступную на запись пользователю с низким уровнем привилегий, в переменную среды PATH.

Также добавим пользователя с низкими привилегиями от которого и будем проводить атаку. Например, так: net user LowUser 123LowUser123 /add.

Что необходимо для эксплуатации?

Для того чтобы проэксплуатировать уязвимость DLL Hijacking через сервис IKEEXT в ОС Windows 7, необходимо:

  1. Убедиться в наличии прав на запись в директорию из переменной среды PATH.
  2. Убедиться в отсутствии DLL-библиотеки wlbsctrl.dll в директориях, в которых ОС Windows будет выполнять поиск до доступной на запись директории из переменной среды PATH.
  3. Создать DLL-библиотеку, с именем wlbsctrl.dll, выполняющую требуемые пентестеру действия.
  4. Разместить написанную DLL-библиотеку, с именем wlbsctrl.dll, в доступную на запись директорию из переменной среды PATH.
  5. Выполнить перезагрузку системы.

Пишем DLL-библиотеку

Наша библиотека будет достаточно тривиальна – она будет добавлять нового локального пользователя, а также будет добавлять этого пользователя в локальную группу Администраторы. Предварительно стоит посмотреть корректное название группы локальных администраторов на уязвимой системе. Писать DLL будем в Visual Studio. Создаем Visual C++ проект для консольного приложения win32.

Указываем в параметрах приложения, что мы будем делать DLL-библиотеку.

Visual Studio должен для нас подготовить такой проект.

Изменим код dllmain.cpp, чтобы мы смогли создать нового пользователя и добавить его в группу локальных администраторов.

// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"
#include "windows.h"
#include "locale.h"

void SomeFunction();
BOOL APIENTRY DllMain(HMODULE hModule,
	DWORD  ul_reason_for_call,
	LPVOID lpReserved
)
{
	switch (ul_reason_for_call)
	{
	case DLL_PROCESS_ATTACH:
		SomeFunction();
		break;
	case DLL_THREAD_ATTACH:
		break;
	case DLL_THREAD_DETACH:
		break;
	case DLL_PROCESS_DETACH:
		break;
	}
	return TRUE;
}
void SomeFunction()
{
	setlocale(LC_ALL, "RUS");
	WinExec("net user Jackie 123qwe456arty /add", 0);				//Change Passw!
	WinExec("net localgroup Администраторы Jackie /add", 0);
	
}

Функция DLLMain чем-то схожа с функцией main в языке С и является дополнительной точкой входа в DLL-библиотеку. Когда система запускает или завершает процесс, она вызывает эту DLLMain-функцию у всех DLL-библиотек используемых процессом. Система также вызывает функцию DLLMain, когда DLL загружается или выгружается с использованием функций LoadLibrary и FreeLibrary. (Подробнее о DLLMain точке входа можно прочитать тут).

В нашем случае DLL-библиотека wlbsctrl.dll будет подгружаться через LoadLibrary службой IKEEXT. После чего будет происходить обработка причины вызова DLL – параметра ul_reason_for_call. В результате использования службой IKEEXT функции LoadLibrary, данный параметр ul_reason_for_call принимает значение DLL_PROCESS_ATTACH. В момент подключения DLL (DLL_PROCESS_ATTACH) можно выполнять действия по инициализации – в нашем случае будет вызываться функция SomeFunction, в которой будет происходить добавление пользователя.

Наша функция SomeFunction использует Windows API-функцию WinExec, которая принимает на вход два параметра: имя приложения с опциональными параметрами, которое требуется запустить и стиль окна. После того, как мы изменили файл dllmain.cpp, меняем режим сборки на Release, выставляем разрядность ОС уязвимой системы и собираем проект.

Эксплуатация

Полученную DLL-библиотеку переименовываем в wlbsctrl.dll и помещаем в директорию, доступную на запись, из переменной среды PATH на уязвимой системе.

Для того чтобы наша DLL-библиотека корректно исполнилась необходимо убедиться, что все ее зависимости присутствуют. Например, это можно сделать при помощи утилиты dependency walker. В нашем случае были необходимы DLL-библиотеки, показанные на Рисунке ниже:

Необходимые библиотеки можно получить, установив распространяемые компоненты Microsoft Visual C++ для используемой версии Visual Studio (если этот пакет еще не установлен). В случае, если не хватает привилегий на установку этого пакета, можно просто перенести все необходимые DLL-библиотеки на уязвимую систему вместе с нашей wlbsctrl.dll в одну папку - C:\Hi-Jackie.

Несмотря на то, что в большинстве «коробочных» версий Windows 7 сервис IKEEXT запущен автоматически, возможна ситуация, когда этот сервис выключен. Запустить данный сервис низкоуровневым пользователем можно используя метод, опубликованный журналом MISC 90. Дело в том, что IKEEXT используется для создания VPN туннелей IPsec. Для того чтобы сделать подобный туннель, не нужно обладать высокими привилегиями. То есть, при создании VPN соединения мы запустим автоматически службу IKEEXT. Подробнее об этом можно прочитать тут.

На Рисунке ниже показано, что служба IKEEXT была выключена, но после попытки подключения по VPN через встроенную в систему утилиту rasdial, данная служба изменила свой тип запуска.

Подготовив все необходимое, делаем перезагрузку.

Если в графическом интерфейсе отсутствуют возможности перезагрузки, то можно выполнить перезагрузку системы через консоль, например, следующей командой: shutdown /r.

После перезагрузки получаем нового пользователя – Jackie, который входит в группу локальных администраторов системы (иногда добавление пользователя в группу локальных администраторов происходит в две перезагрузки – при первой создается новый пользователь, а при второй происходит включение его в группу локальных администраторов).

Как защититься?

Защититься от данной атаки достаточно просто – надо убедиться в корректности выданных прав на запись в директории. Также можно установить патч (KB2264107), который позволит администратору системы вмешаться в алгоритм поиска подгружаемых DLL-библиотек. Подробнее об этом можно почитать тут.