Админ-экспресс. Исследуем обход UAC на примере Elevation Moniker

Содержание статьи

  • Моникеры
  • Подвиды моникеров
  • Регистрация Elevation Moniker
  • Использование Elevation Moniker
  • Примеры COM-объектов
  • ICMLuaUtil
  • IFileOperation
  • Выводы

Ме­ханизм 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.

 

Подвиды моникеров

Мо­нике­ры делят­ся на два под­вида:

  • сис­темные (они же встро­енные, они же стан­дар­тные) — набор монике­ров, пре­дос­тавля­емых Microsoft;
  • поль­зователь­ские — соз­данные сто­рон­ними раз­работ­чиками.

Да­же сис­темных монике­ров очень мно­го. Мы оста­новим­ся на одном кон­крет­ном: Elevation Moniker. Этот моникер поз­воля­ет акти­виро­вать объ­ект COM в кон­тек­сте повышен­ных при­виле­гий. С помощью это­го монике­ра хакер спо­собен из про­цес­са со сред­ним уров­нем целос­тнос­ти получить дос­туп к объ­екту COM, рас­положен­ному в про­цес­се с высоким уров­нем целос­тнос­ти, а затем, зло­упот­ребляя воз­можнос­тями это­го объ­екта, выб­рать­ся в при­виле­гиро­ван­ный про­цесс.

По­мимо это­го, сущес­тву­ют Session Moniker, с их помощью кли­ент может инстан­цировать объ­ект COM в чужой сес­сии. На этом был осно­ван экс­пло­ит COM Session Moniker EOP. Впро­чем, о нем погово­рим в сле­дующей статье.

Для успешно­го бай­паса UAC нуж­но соб­людение нес­коль­ких усло­вий:

  • на­личие инте­рес­ных воз­можнос­тей в клас­се COM: выпол­нение команд, уда­ление фай­лов, добав­ление поль­зовате­лей — в общем, все, что тре­бует токена с высоким уров­нем целос­тнос­ти;
  • пра­виль­ная регис­тра­ция клас­са COM в реес­тре Windows.

Нач­нем со вто­рого пун­кта.

 

Регистрация Elevation Moniker

Класс COM (его поле RunAs) дол­жен иметь зна­чение The Launching User (это зна­чение дефол­тное, при­меня­ется в том чис­ле, если поле RunAs пус­тое) либо Activate As Activator. Если зна­чение дру­гое, то при попыт­ке забин­дить­ся к монике­ру получим ошиб­ку CO_E_RUNAS_VALUE_MUST_BE_AAA.

Источник: xakep.ru

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *