Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Physical Address
304 North Cardinal St.
Dorchester Center, MA 02124
Механизм User Account Control в Windows не дает пользователю взять и запустить малварь от лица администратора. Впрочем, система любезно предусмотрела механизм Elevation Moniker, чтобы упростить жизнь хакерам. В этой статье мы разберем, как использовать моникеры для обхода UAC. Всё по‑взрослому! На жестком C++ с интерфейсами.
Первым делом отметим, что моникеры — один из кирпичиков подсистемы 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 string
). Эдакая строковая презентация объекта СОМ.
Процесс инстанцирования объекта COM из моникера называется активацией или же связыванием моникера (Binding). Моникер обладает достаточной информацией, чтобы найти и активировать нужный объект СОМ. Эту информацию моникер получает один раз, во время своего создания — в виде строки, формат которой он понимает. Позже менять эту информацию уже нельзя. Поэтому моникер, будучи однажды созданным, всегда находит и активирует один и тот же объект.
Моникерами считаются все объекты, которые реализуют интерфейс IMoniker
. Возврат клиенту объекта COM происходит в функции IMoniker::BindToObject()
.
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.
Моникеры делятся на два подвида:
Даже системных моникеров очень много. Мы остановимся на одном конкретном: Elevation Moniker. Этот моникер позволяет активировать объект COM в контексте повышенных привилегий. С помощью этого моникера хакер способен из процесса со средним уровнем целостности получить доступ к объекту COM, расположенному в процессе с высоким уровнем целостности, а затем, злоупотребляя возможностями этого объекта, выбраться в привилегированный процесс.
Помимо этого, существуют Session Moniker, с их помощью клиент может инстанцировать объект COM в чужой сессии. На этом был основан эксплоит COM Session Moniker EOP. Впрочем, о нем поговорим в следующей статье.
Для успешного байпаса UAC нужно соблюдение нескольких условий:
Начнем со второго пункта.
Класс COM (его поле RunAs) должен иметь значение The Launching User
(это значение дефолтное, применяется в том числе, если поле RunAs
пустое) либо Activate As Activator
. Если значение другое, то при попытке забиндиться к моникеру получим ошибку CO_E_RUNAS_VALUE_MUST_BE_AAA
.
Источник: xakep.ru