Обход Uac Или История Трех Эскалаций

На работе я изучаю безопасность ОС или программ.

Ниже я расскажу об одном из таких исследований, результатом которого стал полнофункциональный эксплойт типа обхода UAC (да, с исходным кодом и гифками).



Обход UAC или история трех эскалаций

О да, они рассказали Microsoft, сделали вид, что им это не интересно.

Тревога! Под катом около 4 мегабайт трафика - картинки и гифки.



История



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

Вероятно, существует множество способов найти уязвимость.

Один из самых простых — повторить существующую атаку, выбрав другую цель.

Вот я и решил поэкспериментировать - через меню выбора файла (сохранить или открыть) запустить какое-нибудь приложение.



Обход UAC или история трех эскалаций

На гифке показано, как выглядела такая атака в Windows 98. Злоумышленник путем хитрых манипуляций вызывает окно открытия файла и запускает через него проводник.

Сначала давайте проведем простой тест, чтобы увидеть, что происходит — запустим Блокнот. В меню выберите «Открыть» и в появившемся окне перейдите в папку C:\Windows\system32\.

В окне отображаются только txt файлы и папки.

Это легко исправить — просто напишите *.

* вместо имени файла и отобразятся все файлы (в случае с блокнотом можно проще — выбрать фильтр «Все файлы», но такой фильтр будет работать не всегда).

быть доступны, и звездочки всегда будут работать).

Найдите notepad.exe и запустите его через контекстное меню.



Обход UAC или история трех эскалаций

Process Explorer показывает вполне ожидаемую картину:

Обход UAC или история трех эскалаций

Один процесс запускал другой.

Чаще всего при таком наследовании дочерний процесс имеет тот же уровень привилегий, что и родительский.

Это означает, что если мы хотим запустить процесс с высокими привилегиями, нам нужно использовать процесс, который уже имеет эти привилегии.



Обход UAC или история трех эскалаций

Тут я вспомнил про приложения с автоматически повышенными привилегиями.

Мы говорим о программах, в манифесте которых указано повышение привилегий без запроса UAC (элемент autoElevate).

Для первого эксперимента я выбрал многострадальный eventwvr.exe (он уже пара один раз зажигать в обходе UAC).

Все оказалось очень просто, в меню «Действие» есть пункт «Открыть сохраненный журнал.

» — этот пункт отображает окно открытия файла, именно то, что мы и хотим получить.



Обход UAC или история трех эскалаций

После запуска мы увидим следующую ситуацию:

Обход UAC или история трех эскалаций

Мы запустили консоль с правами администратора без появления окна UAC. Этот тип уязвимости называется UAC bypass (обход запроса UAC).

Важно отметить существенное ограничение — автоматическое повышение прав работает только в том случае, если пользователь входит в группу администраторов.

Поэтому, используя такую уязвимость, невозможно поднять права с уровня пользователя.

Но уязвимость все равно довольно опасна — многие пользователи Windows используют учетную запись администратора для повседневной работы.

Вредоносная программа, запущенная пользователем такой учетной записи, сначала получит административные привилегии без внешних проявлений, а затем, если ей это понадобится, может даже получить NT AUTHORITY\SYSTEM. С правами администратора это очень просто.

На Github есть отличный проект https://github.com/hfiref0x/UACME , где собраны вероятно все общедоступные уязвимости такого рода, с указанием, на какой версии Windows уязвимость начала работать, и в какой версии она была исправлена, если исправлена.

Я далеко не первый, кто задумался об уязвимости такого плана.

Ниже я прикрепил две анимации, которые наглядно показывают, как обойти UAC еще двумя способами.



Обход UAC или история трех эскалаций



Обход UAC или история трех эскалаций

Файлы взяты из статьи msitpros.com/Эp=3692 .

Я перебрал разные приложения и ниже прилагаю еще 18 способов реализации такого обхода.

Еще 18 способов обойти UAC вручную Внимание! Возможно, в разных версиях и редакциях у некоторых приложений не будет автоматического повышения привилегий — их список периодически меняется.

Кроме того, если у вас установлен принтер, то, скорее всего, в окнах, связанных с печатью, вы найдете множество дополнительных способов вызвать окно выбора файла.

cliconfg.exe 1) Кнопка «Помощь», в появившемся окне справки откройте контекстное меню в рабочей области, выберите «Просмотреть HTML-код», в появившемся окне Блокнота выберите в меню пункт «Файл», выберите «Открыть» .

2) Кнопка «Помощь», в появившемся окне помощи вызвать контекстное меню в рабочей области, выбрать «Печать», в появившемся окне «Найти принтер.

», в окне поиска выбрать пункт «Файл».

меню «Сохранить условия поиска».

compMgmtLauncher.exe 3) Меню «Действие», пункт «?Экспорт списка.

».

4) Меню «Справка», пункт «Вызов справки», в появившемся окне справки вызвать контекстное меню в рабочей области, выбрать «Просмотр HTML-кода», в появившемся окне Блокнота выбрать меню «Файл», выберите «Открыть».

5) Меню «Помощь», пункт «Вызов справки», в появившемся окне справки вызвать контекстное меню в рабочей области, выбрать «Печать», в появившемся окне «Найти принтер.

», в В окне поиска выберите меню «Файл», пункт «Сохранить» условия поиска».

dcomcnfg.exe 6) В списке слева выберите «Службы (локальные)», в контекстном меню выберите пункт «?Экспортировать список.

».

eudcedit.exe 7) После запуска программа предложит вам выбрать код. Выберите любой и нажмите ОК; В меню «Файл» выберите «Ссылки на шрифты.

», в появившемся окне установите флажок «Установить связь с выбранными шрифтами», это разблокирует кнопку «Сохранить как.

».

eventvwr.exe 8) Меню «Действие», пункт «Открыть сохраненный журнал.

».

9) Меню «Справка», пункт «Вызов справки», в появившемся окне справки вызвать контекстное меню в рабочей области, выбрать «Просмотр HTML-кода», в появившемся окне Блокнота выбрать меню «Файл», выберите «Открыть».

10) Меню «Помощь», пункт «Вызвать справку», в появившемся окне справки вызвать контекстное меню в рабочей области, выбрать «Печать», в появившемся окне «Найти принтер.

», в В окне поиска выберите меню «Файл», пункт «Сохранить» условия поиска».

netplwiz.exe 11) Выбираем вкладку «Дополнительно», в группе «Расширенное управление пользователями» нажимаем кнопку «Дополнительно».

Будет запущена оснастка lusrmgr.msc. Меню «Действие», пункт «?Экспортировать список.

».

odbcad32.exe 12) Кнопка «Помощь», в появившемся окне справки откройте контекстное меню в рабочей области, выберите «Просмотреть HTML-код», в появившемся окне Блокнота выберите в меню «Файл» и выберите «Открыть».

.

13) Кнопка «Помощь», в появившемся окне помощи вызвать контекстное меню в рабочей области, выбрать «Печать», в появившемся окне «Найти принтер.

», в окне поиска выбрать пункт «Файл».

меню «Сохранить условия поиска».

14) Выбираем вкладку «Трассировка», кнопку «Реверс…».

15) Выбираем вкладку «Трассировка», кнопка «Выбрать DLL…».

perfmon.exe 16) В списке слева выберите группу «Отчеты», в ней «Специальные», в контекстном меню выберите пункт «?Экспорт списка.

».

17) Меню «Справка», пункт «Вызов справки», в появившемся окне справки вызвать контекстное меню в рабочей области, выбрать «Просмотр HTML-кода», в появившемся окне Блокнота выбрать меню «Файл», выберите «Открыть».

18) Меню «Помощь», пункт «Вызов справки», в появившемся окне справки вызвать контекстное меню в рабочей области, выбрать «Печать», в появившемся окне «Найти принтер.

», в В окне поиска выберите меню «Файл», пункт «Сохранить» условия поиска».

Хотя мы получили консоль администратора с правами администратора, назвать это уязвимостью или эксплойтом сложно — необходимы осознанные действия пользователя.

Чтобы эту уязвимость считали практической, а не теоретической, действия необходимо автоматизировать.



Обход UIPI

Автоматизация? Да Легко! Берем AutoIt и быстро создаем приложение, эмулирующее нажатия клавиш.

  • WIN-R, eventvwr, ENTER — запустил приложение;
  • ALT-нажать и отпустить — переход в главное меню;
  • Вправо-Вниз-Вниз-ВВОД – выбор нужного пункта в меню;
  • C:\windows\system32 ENTER — переход в нужную папку;
  • * ENTER — сбросить фильтр;
  • SHIFT-TAB, SHIFT-TAB — фокус окна на списке файлов;
  • сmd — выбран файл cmd.exe;
  • Приложение (кнопка контекстного меню, обычно рядом с правым Ctrl и правым Alt), вниз, вниз, ENTER — выберите «Открыть».

Просто готовое описание для какой-нибудь атаки BadUSB-Keyboard типа Teensy или Rubber Ducky. Все хорошо, но не работает. Вернее, работает, но не всегда — только если мы запускаем скрипт с правами администратора.

А вот если запустить скрипт с правами администратора, то что это за эксплойт? Все оказывается довольно просто — Microsoft использует технологию UIPI ( Изоляция привилегий пользовательского интерфейса ).

Короче говоря, многие интерфейсные взаимодействия блокируются, если уровень целостности (IL) инициатора ниже, чем у целевого приложения.

Процессы с правами администратора имеют High IL и выше, а приложение, запущенное пользователем без повышения привилегий, имеет Medium IL. Вы не можете отправлять большинство сообщений или эмулировать мышь или клавиатуру.

Как обойти UIPI? Microsoft указывает, что есть еще один интересный параметр, который можно указать в манифесте — UIAccess. При соблюдении ряда жестких условий приложение сможет взаимодействовать с интерфейсом других программ.

Собственно, сами условия:

  1. UIAccess="true" в манифесте.

  2. Программа должна быть подписана, а сертификат подписи должен быть принят компьютером как доверенный.

  3. Программа должна находиться в «безопасной» папке или глубже.

    К безопасным папкам относятся папка C:\Windows (за некоторыми исключениями), C:\Program Files, C:\Program Files (x86).

Поиск файлов, уже соответствующих этим условиям, показывает, например, приложение C:\Windows\system32\osk.exe. Это приложение для экранной клавиатуры — логично, что оно должно иметь доступ к интерфейсу программы и не требовать прав администратора, поскольку его может запустить обычный пользователь.

Глядя на процесс в Process Explorer, становится понятно, как он работает. Когда UIAccess="true" происходит еще одна автоматическая эскалация — поднимается IL приложения.

Osk.exe запускается с High IL, но без прав администратора.

Довольно интересная ситуация.



Обход UAC или история трех эскалаций

Возникает идея попробовать скопировать Osk.exe куда-нибудь, где он все равно будет считаться находящимся на «безопасном» пути.

Тогда мы сможем управлять этим приложением, но при этом соблюсти условия обхода UIPI. Я написал простую поисковую систему по каталогам C:\Windows, C:\Program Files, C:\Program Files (x86), которая будет искать места, куда можно копировать без прав администратора.

На удивление, таких каталогов было довольно много.

К сожалению, большинство из них либо включены в исключения C:\Windows, либо представляют собой каталоги, куда можно писать, но откуда нельзя запускать приложения.

И всё же подходящих папок оказалось две:

  • C:\Windows\минидамп
  • C:\Program Files\Microsoft SQL Server\130\Shared\ErrorDumps
С одной стороны, это хорошо – есть что проверить, но с другой – все не так радужно.

Папка минидампа появляется, если ОС вылетела в синий экран смерти.

Если синие экраны обошли пользователя, значит каталога нет. Более того, доступа к этому каталогу изначально нет. Администратору необходимо хотя бы один раз войти в него и только после этого он станет доступен.

В общем, не наш вариант. А вот вторая папка лучше — разве что она появляется при установке Microsoft Visual Studio (2017 в этом случае у других студий вместо 130 будут другие цифры, например 120 для MSVS 2015).

Скопируйте osk.exe в папку C:\Program Files\Microsoft SQL Server\130\Shared\ErrorDumps. Давайте посмотрим на таблицу импорта приложений.

Среди библиотек в импорте я выбрал osksupport.dll — это библиотека, которая экспортирует всего 2 функции, поэтому можно быстро сделать подделку.



Обход UAC или история трех эскалаций

Собираем dll и копируем по тому же пути — будет dll-инъекция.

Запускаем, проверяем - скопированный osk.exe запускается с High IL, код из dll выполняется.

Добавляем в dll автоматизацию нажатия клавиш (уже не AutoIt, а быстро все перенесено в плюскод keybd_event).

Давайте убедимся, что все работает. Теперь у нас есть почти готовый эксплойт. Нам нужно сделать чистый тест. Подготавливается виртуальная машина, где установлена только Visual Studio и написана простая программа — копирует osk.exe и библиотеку с полезной нагрузкой.

Все работает отлично.

Запускаем бинарный файл и через мгновение на экране происходит волшебство автоматизации.

Это уже можно назвать эксплойтом — ведь программа обходит UAC без взаимодействия с пользователем.

Пользователь, конечно, все это видит, но это не важно – это мелочи.

Это была первая версия эксплойта — две эскалации (autoElevate и UIAccess), но пользователь видит, что происходит что-то неладное.

Пошёл перечитывать Windows Internals Руссиновича в тех главах, где упоминаются UIAccess и UIPI. Вдруг простым русским языком было написано, что UIPI препятствует использованию УстановитьWindowsHookEx .

Но я только что обошел UIPI, а это означало, что я мог использовать эту функцию — от этого стало еще лучше! Мне удалось внедрить код вместо отправки нажатий клавиш.

Вот вторая версия эксплойта - те же эскалации, но теперь без заметных действий на экране.

Практически сразу после запуска эксплоита запускалась привилегированная консоль.



Обход каталога

На этом этапе я написал письмо в Microsoft с описанием уязвимости, кодом эксплойта и пошаговыми объяснениями.

Реакция поддержки немного удивила — они спросили: «Выходит, вам нужны права администратора для запуска вашего эксплойтаЭ» Попытка объяснить, что это не повышение привилегий от пользователя к администратору, а обход UAC, не увенчалась успехом.

Последнее, что можно было улучшить, — это убрать требование о наличии каталога, доступного для записи.

Сначала я решил попробовать старый способ с WUSA. Краткое описание копирования файлов с помощью WUSA Wusa.exe — еще одно приложение с автоматическим повышением привилегий.

Вы можете запустить это приложение, указав файл CAB-архива и параметр /extract. WUSA распакует файл из архива по указанному пути.

Каб-архив можно создать с помощью стандартной утилиты makecab. Сначала я попробовал «распаковать» произвольный файл в C:\windows\system32. Я получил сообщение об отказе в доступе.

Логично, я давно читал, что этот метод вроде бы удалили.

Но на всякий случай решил свериться с путем в Program Files. Утилита сработала, файл скопировался.

Сейчас пахнет жареным - необходимость в папке с правами на запись в Program Files постепенно отпала.

Но я решил отказаться от метода WUSA. В Windows 10 (10147) из приложения был удален параметр /extract. Тем не менее я не пал духом.

На примере WUSA я понял, что защита C:\Windows не всегда означает защиту C:\Program Files. Помимо WUSA существовал еще один способ копирования файлов без запроса UAC — интерфейс IFileOperation. IFileOperation Процесс, выполняющий Medium IL и работающий из безопасного расположения (примерно так же, как в UIAccess), может использовать интерфейс IFileOperation с автоматическим повышением прав.

Остальное было легко.

Я написал код, используя этот метод (вот она, третья автоматическая эскалация), и он отлично работал.

На всякий случай я взял чистую виртуальную машину с максимальным количеством установленных обновлений для последней версии Windows 10 (RS2, 15063).

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

Это третья версия эксплойта, с 3-мя эскалациями, без каких-либо особых требований.



Техническое описание

Работоспособность эксплойта тестировалась на Windows 8, Windows 8.1 и Windows 10 (RS2, 15063) — методика работает. С вероятностью 99% будет работать в младших версиях, начиная с Windows Vista, но потребуются некоторые изменения (другое имя и таблица экспорта для dll в шагах 2 и 3).

Настройки UAC должны быть установлены по умолчанию, а пользователь, от которого запускается программа-инициатор, должен входить в группу администраторов ПК.

Шаг 1. Программа запускается без запроса привилегий.

IL программы Medium, позволяющий внедрить код в процесс explorer.exe (например, через SetWindowsHookEx).

Шаг 2. Код, выполняемый в контексте explorer.exe, инициирует операцию копирования файла через IFileOperation. Происходит первое автоматическое повышение привилегий — explorer.exe считается доверенным процессом, поэтому ему разрешено копировать файлы в Program Files без запроса подтверждения UAC. Системный файл osk.exe, первоначально расположенный C:\Windows\system32\osk.exe, копируется в любую папку Program Files. Рядом копируется библиотека с полезной нагрузкой с именем osksupport.dll. Шаг 3. Запускается только что скопированный osk.exe. Так как все требования по предоставлению UIAccess соблюдены, файл имеет High IL - происходит повторное автоматическое повышение привилегий (поднимается только IL, но прав администратора все равно нет).

Сразу после старта срабатывает Dll-инъекция и в контексте этого процесса выполняется код из osksupport.dll. Полезная нагрузка этой библиотеки ожидает запуска привилегированного процесса, чтобы внедрить в него код. Шаг 4. Запускается любой процесс, которому автоматически повышаются права администратора (например, многострадальный eventvwr.exe, это третья эскалация).

В него вводится код. В этот момент код будет выполнен с правами администратора.



Доказательство концепции

PoC состоит из двух частей — dll (написанной на C++) и exe (написанной на C#).

Сначала вам нужно собрать dll и включить эту библиотеку в качестве ресурса для кода приложения.

Обязательно обратите внимание на комментарии в коде.

DLL

   

#include <stdio.h> #include <Shobjidl.h> #include <windows.h> #pragma comment(lib, "Ole32.lib") #pragma comment(lib, "shell32.lib") void WINAPI InitializeOSKSupport() {};

Теги: #uac #обход uac #exploit #Windows #windowsэксплойт #autoelevate #UIPI #информационная безопасность
Вместе с данным постом часто просматривают: