Содержание статьи
Моникеры
Первым делом отметим, что моникеры — один из кирпичиков подсистемы COM (Component Object Model). С помощью COM разработчики могут создавать такие программные компоненты, которые способны взаимодействовать друг с другом в самых разных плоскостях. Например, с помощью COM можно из кода Visual Basic дергать сборку .NET и наоборот! А что ты думаешь по поводу связки программ на Go и C++?
Здесь есть сервер — им считается тот, кто предоставляет функции COM, — и клиент — тот, кто обращается к функциям сервера. Возможности сервера COM прописываются в классе COM. При обращении к серверу COM создается экземпляр класса COM, и клиент получает этот экземпляр. После чего может взаимодействовать с сервером.
Конечно, уже опытные смешарики скажут, что в действительности идет работа с интерфейсами: сервер зачастую отдает маршализированный интерфейс, через который будет происходить взаимодействие, а еще между клиентом и сервером висит прокси, стаб, апартаменты, RPC... Впрочем, такие подробности не нужны. Пока достаточно понимать, что есть сервер и клиент COM. Их взаимодействие происходит через экземпляр класса COM, в котором определены некие возможности.
Изучить базу про COM можно в статье Inside COM+: Base Services или в официальной документации.
Для создания экземпляра класса COM (процесс инстанцирования) требуется специальное значение CLSID (Class Identifier). Оно однозначно идентифицирует класс COM, к которому хочет обратиться клиент. Помимо того, само создание объекта COM реализовывало порождающий паттерн проектирования, называемый фабрикой.
Все с этим нормально жили и не тужили, однако в один момент захотели избавиться от обязательного использования CLSID и фабрики. Хотелось сделать всё так, чтобы объект находился как‑нибудь сам, автоматически, по минимальному общему входному набору данных.
И тогда на помощь пришли моникеры. Они позволяют идентифицировать конкретный объект COM (или даже полноценно его реализовать) по простой строке (moniker
). Эдакая строковая презентация объекта СОМ.
Процесс инстанцирования объекта COM из моникера называется активацией или же связыванием моникера (Binding). Моникер обладает достаточной информацией, чтобы найти и активировать нужный объект СОМ. Эту информацию моникер получает один раз, во время своего создания — в виде строки, формат которой он понимает. Позже менять эту информацию уже нельзя. Поэтому моникер, будучи однажды созданным, всегда находит и активирует один и тот же объект.
Моникерами считаются все объекты, которые реализуют интерфейс IMoniker
. Возврат клиенту объекта COM происходит в функции IMoniker::
.
HRESULT BindToObject( [in] IBindCtx *pbc, [in] IMoniker *pmkToLeft, [in] REFIID riidResult, [out] void **ppvResult);
-
pbc
— контекст связывания. Это специальный объект СОМ, реализующий интерфейсIBindCtx
. С помощью этого объекта указывается, каким образом должен осуществляться и как проходит в этот момент процесс связывания (активации объекта СОМ по моникеру); -
pmkToLeft
— целевой моникер, по которому создавать объект COM; -
riidResult
— внутри каждого класса COM может быть реализовано несколько интерфейсов. Здесь указывается IID (Interface Identifier) целевого интерфейса, который хотим получить; -
ppvResult
— переменная, которая получит инициализированный указатель на интерфейс, через который можно взаимодействовать с классом COM.
Подвиды моникеров
Моникеры делятся на два подвида:
- системные (они же встроенные, они же стандартные) — набор моникеров, предоставляемых Microsoft;
- пользовательские — созданные сторонними разработчиками.
Даже системных моникеров очень много. Мы остановимся на одном конкретном: Elevation Moniker. Этот моникер позволяет активировать объект COM в контексте повышенных привилегий. С помощью этого моникера хакер способен из процесса со средним уровнем целостности получить доступ к объекту COM, расположенному в процессе с высоким уровнем целостности, а затем, злоупотребляя возможностями этого объекта, выбраться в привилегированный процесс.
Помимо этого, существуют Session Moniker, с их помощью клиент может инстанцировать объект COM в чужой сессии. На этом был основан эксплоит COM Session Moniker EOP. Впрочем, о нем поговорим в следующей статье.
Для успешного байпаса UAC нужно соблюдение нескольких условий:
- наличие интересных возможностей в классе COM: выполнение команд, удаление файлов, добавление пользователей — в общем, все, что требует токена с высоким уровнем целостности;
- правильная регистрация класса COM в реестре Windows.
Начнем со второго пункта.
Регистрация Elevation Moniker
Класс COM (его поле RunAs) должен иметь значение The
(это значение дефолтное, применяется в том числе, если поле RunAs
пустое) либо Activate
. Если значение другое, то при попытке забиндиться к моникеру получим ошибку CO_E_RUNAS_VALUE_MUST_BE_AAA
.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
Вариант 2. Открой один материал
Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.
Я уже участник «Xakep.ru»