
Обход UAC в Windows 8.1 и 10 с использованием WinSxS в «dccw.exe».
Этот эксплойт злоупотребляет тем, как «dccw.exe» управляет «WinSxS», используя производный метод «Bypass UAC» Лео Дэвидсона, чтобы получить оболочку администратора без запроса согласия. Он поддерживает архитектуры «x86» и «x64». Кроме того, он был успешно протестирован на Windows 8.1 9600, Windows 10 14393, Windows 10 15031 и Windows 10 15062.
Если вы хотите узнать, как запустить скрипт, обратитесь к разделу использование. Кроме того, вы можете запустить его в Metasploit и получить сеанс Meterpreter с правами администратора.
Чтобы разработать новый обход UAC, сначала нам нужно найти уязвимость в системе, а если быть точнее, уязвимость в процессе с автоматическим повышением привилегий (auto-elevate). Чтобы получить список таких процессов, мы использовали инструмент Sysinternals под названием Strings. После этого мы увидели некоторые процессы с автоматическим повышением привилегий, такие как «sysprep.exe», «cliconfig.exe», «inetmgr.exe», «consent.exe» или «CompMgmtLauncher.exe», которые имели (некоторые до сих пор имеют) уязвимости, позволяющие выполнить «bypass UAC». Поэтому мы начали изучать, как работают другие процессы с автоматическим повышением привилегий, с помощью приложения Sysinternals под названием Process Monitor (ProcMon), но сосредоточившись на процессе «dccw.exe».
Однако, прежде чем приступить к работе с ProcMon, мы сначала проверили манифест таких приложений с помощью другого приложения Sysinternals под названием Sigcheck, и, конечно же, в нашем случае «dccw.exe» является процессом с автоматическим повышением привилегий.
Затем мы смогли начать отслеживать ход выполнения «dccw.exe» с помощью ProcMon, чтобы увидеть, не происходит ли что-то странное, — и мы сразу это заметили. В определённый момент, если «dccw.exe» запущен как 64-битный процесс на 64-битной машине с Windows, он ищет каталог «C:\Windows\System32\dccw.exe.Local\» для загрузки конкретной DLL под названием «GdiPlus.dll», так же, как если бы он выполнялся на 32-битной машине с Windows. Если же запустить его как 32-битный процесс на той же машине, процесс будет искать каталог «C:\Windows\SysWOW64\dccw.exe.Local\». Затем, в связи с тем, что он не существует, процесс всегда ищет папку по пути «C:\Windows\WinSxS\», чтобы получить нужную DLL; имя этой папки имеет следующую структуру:
[архитектура]_microsoft.windows.gdiplus_[порядковый_код]_[версия_Windows]_none_[порядковый_номер]
Если мы заглянем в каталог «WinSxS», мы увидим более одной папки, соответствующей этой структуре; это означает, что «dccw.exe» может загрузить нужную DLL из любой из этих папок. Единственное, в чём мы точно уверены, — это то, что если приложение вызывается как x86-процесс, имя папки будет начинаться со строки «x86», а если запустить его как x64-процесс, его имя будет начинаться со строки «amd64».
Этой ситуацией можно злоупотребить для выполнения DLL-хайждекинга (DLL hijacking) и последующего выполнения кода с высоким уровнем целостности без запроса согласия.
Как только мы обнаружили ошибку во время выполнения процесса с автоматическим повышением привилегий, нам нужно проверить, можно ли ею злоупотребить. Для этого мы просто создали папку «dccw.exe.Local» по нужному пути и внутри этой папки создали папки, расположенные в «WinSxS», к которым процесс может обратиться для загрузки «GdiPlus.dll», но без самой DLL.
Теперь, если мы запустим «dccw.exe», мы увидим, что процесс нашёл папку «dccw.exe.Local» и одну из папок «WinSxS», но не нашёл нужную DLL, что вызывает ошибку. Это то, чего мы ожидали, поскольку этой ситуацией может воспользоваться злоумышленник, как мы упоминали ранее.
На данный момент мы уже знаем, что можем выполнить обход UAC в Windows 10, злоупотребляя «dccw.exe», но как?
Самый используемый метод обхода UAC — тот, что разработан Лео Дэвидсоном. Однако он выполняет внедрение в процесс для вызова COM-объекта IFileOperation, что может быть обнаружено некоторыми антивирусными программами, поэтому более удачный подход к его использованию — тот, что называется Masquerade PEB и применяется Cn33liz в его собственном обходе UAC.
Кроме того, нам пришлось изменить способ вызова IFileOperation в новых версиях Windows 10, поскольку метод Лео Дэвидсона вызывает запрос UAC, начиная со сборки 15002. Таким образом, способ вызова этой операции такой же, как в оригинале, но без флагов операций «FOF_SILENT», «FOFX_SHOWELEVATIONPROMPT» и «FOF_NOERRORUI».
Перед запуском эксплойта важно проверить некоторые аспекты, чтобы не выполнить его неудачно и тем самым не вызвать срабатывание средств защиты. Первое, что мы проверяем, — версию сборки Windows, поскольку некоторые версии не уязвимы к нашему эксплойту (те, у которых версия сборки ниже 7600). После этого мы убеждаемся, что у нас ещё нет прав администратора: если они уже есть, нет причин запускать скрипт. Затем мы проверяем настройки UAC, чтобы подтвердить, что они не установлены в значение «Always notify» («Всегда уведомлять»), поскольку если бы они были установлены в это значение, наш эксплойт был бы бесполезен. Наконец, мы проверяем, принадлежит ли пользователь группе администраторов, потому что в противном случае эксплойт не сработает.
При разработке эксплойта важно, чтобы он работал на как можно большем количестве систем, включая 32-битные версии Windows. Чтобы добиться этого, нам нужно скомпилировать наш эксплойт для таких систем, поскольку его также можно запускать и на 64-битных системах.
Когда наш 32-битный эксплойт выполняется на 64-битной машине с Windows, способ работы «dccw.exe» несколько отличается из-за использования WOW64 (подсистемы Windows, которая позволяет 64-битным машинам запускать 32-битные приложения). Это означает, что папка «dccw.exe.Local» будет искаться в каталоге «C:\Windows\SysWOW64\» вместо «C:\Windows\System32\», а целевая «GdiPlus.dll» будет 32-битной DLL, что подразумевает её поиск в папке, соответствующей шаблону имени «C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_*». Однако при выполнении на 32-битной системе Windows эксплойт будет работать как ожидается.
Наконец, важно отметить, что нам нужно учитывать все пути, соответствующие шаблону «C:\Windows\WinSxS\x86_microsoft.windows.gdiplus_*», при выполнении DLL-хайждекинга, чтобы гарантировать 100% эффективности.
Чтобы запустить процесс с высоким уровнем целостности, нам нужно разработать DLL, которая будет вызвана посредством DLL-хайждекинга. Однако всё не так просто, как кажется, потому что если мы сделаем только это, не будут выполнены ни «dccw.exe», ни наш код. Это связано с тем, что «dccw.exe» зависит от некоторых функций «GdiPlus.dll», поэтому нам нужно реализовать эти функции или перенаправить их выполнение на легитимную DLL.
Лучший вариант — перенаправить выполнение на легитимную DLL, поскольку в этом случае размер нашей DLL будет меньше. Для этого мы использовали программу ExportsToC++ для переноса всех экспортов «GdiPlus.dll» на язык C++. Теперь проблема заключается в огромном количестве экспортов «GdiPlus.dll» — 631, если быть точным. Тем не менее, «dccw.exe» импортирует не все из них, а лишь несколько. Чтобы узнать, какие функции импортирует «dccw.exe» из «GdiPlus.dll», мы подвергли его реверс-инжинирингу с помощью «IDA Pro». В итоге из «GdiPlus.dll» импортируется только 15 функций, поэтому нам нужно включить в нашу DLL лишь их.
Теперь кажется, что проблема решена, но если мы перенаправим выполнение на конкретную «GdiPlus.dll» в C:\Windows\WinSxS\», DLL будет работать только в некоторых системах, поскольку имена внутренних папок «WinSxS» меняются в каждой сборке Windows. Чтобы преодолеть эту проблему, мы придумали перенаправлять выполнение на «C:\Windows\System32\GdiPlus.dll», поскольку этот путь одинаков во всех системах Windows 10.
Последнее, что нам нужно сделать, — остановить выполнение «dccw.exe» после запуска нашего вредоносного кода, чтобы избежать открытия окна этого процесса.
Теперь, когда мы разработали нашу вредоносную DLL, нам нужно доставить её на целевую машину. Для этого наша DLL была сжата и закодирована в «base64» внутри эксплойта, чтобы её можно было декодировать и распаковать во время выполнения и доставить как задумано.
Наконец, наша созданная «GdiPlus.dll» копируется в целевое расположение с использованием COM-объекта IFileOperation, как упоминалось ранее.
Когда злоумышленник получает контроль над системой, он хочет оставаться незамеченным как можно дольше, а это означает удаление всех следов своих действий. Из-за этого все временные файлы, создаваемые во время выполнения эксплойта, удаляются, когда они больше не нужны.
Наконец, нам нужно определить, какой процесс мы хотим запустить с высоким уровнем целостности. В нашем случае мы выбрали приложение «cmd.exe», поскольку оно позволяет выполнять сколько угодно операций с высоким уровнем целостности после получения прав администратора, но, по сути, мы можем запустить любое приложение.
Чтобы запустить эксплойт, вы должны убедиться, что целевая машина соответствует требованиям. Затем вам просто нужно выполнить эксплойт, как любой другой скрипт командной строки:
C:\Users\L3cr0f> DccwBypassUAC.exe
Модуль Metasploit для этого PoC использует DLL-инъекцию вместо Masquerading PEB, и он доступен в:
- Metasploit Framework: https://github.com/rapid7/metasploit-framework/blob/master/modules/exploits/windows/local/bypassuac_injection_winsxs.rbЭтот эксплойт был разработан, чтобы показать, как злоумышленник может получить привилегии в системе, а не для использования во вредоносных целях. Это означает, что я не несу никакой ответственности, если кто-то использует его для совершения преступных действий.
Контроль учётных записей (User Access Control, UAC) — это технология, представленная в Windows Vista, которая обеспечивает способ разделения привилегий и задач обычного пользователя и тех, которые требуют доступа администратора. Если обычный пользователь работает в системе и пытается выполнить действие, на которое у него нет разрешения, Windows показывает запрос и спрашивает пароль учётной записи администратора. Если администратор работает в системе и пытается выполнить ту же задачу, появляется только предупреждающий запрос. Этот запрос известен как «Consent Prompt» (запрос согласия), поскольку администратора лишь просят согласиться на действие перед его выполнением. Слабость, которая позволяет обойти «Consent Prompt», не считается уязвимостью безопасности, поскольку он не считается границей безопасности.
Однако Microsoft также заявляет, что «Контроль учётных записей (UAC) является фундаментальным компонентом общего видения безопасности корпорации Microsoft».
Источники:
- Определение уязвимости безопасности.
- Как работает контроль учётных записей.