Windows UAC не перестаёт удивлять, или Как обнаружить инсайдера

Всем привет! Уверен, что вы наслышаны о недочетах технологии Windows UAC, однако относительно недавно появились подробности любопытной уязвимости, эксплуатация которой дает возможность непривилегированному пользователю максимально повысить привилегии. В Jet CSIRT мы не оставили этот случай без внимания, ведь для любой команды мониторинга и реагирования на инциденты ИБ уязвимости класса Privilege Escalation представляют особый интерес. Под катом — описание уязвимости, способы детекта и защиты.
Детали уязвимости
Исследователь Eduardo Braun Prado из команды Zero Day Initiative обнаружил уязвимость локального повышения привилегий в компоненте Windows Certificate Dialog, которая возникает из-за некорректной обработки пользовательских привилегий. Уязвимость позволяет повысить привилегии пользователя до максимально возможных SYSTEM и обойти все защитные механизмы ОС Windows. Это происходит при эксплуатации механизма Windows UAC, когда пользователь взаимодействует с компонентом Безопасного рабочего стола (Secure Desktop), открыв диалог запуска файла от имени Администратора.

В чем суть уязвимости? Сертификат исполняемого файла содержит необязательное численное поле «Идентификатор политики» в формате Microsoft-specific object identifier (OID).

Заголовочный файл Wintrust.h определяет это поле как SPC_SP_AGENCY_INFO_OBJID. Хотя его назначение слабо документировано, скорее всего, оно анализируется при открытии окна с деталями сертификата. При представлении данного поля в корректном формате поле Issued by («Кем выдано») будет отображено в виде гиперссылки со значением, взятым из атрибута SpcSpAgencyInfo.

При клике по ссылке c полем Issued by откроется браузер Internet Explorer с правами SYSTEM. Родительским процессом для него будет выступать процесс consent.exe. Он также выполняется с максимальными привилегиями, и именно в его контексте запускается диалог UAC. Соответственно, далее появляется возможность запуска произвольного файла (cmd.exe, powershell.exe) из меню браузера с унаследованными правами SYSTEM.

В качестве PoC для демонстрации эксплуатации уязвимости (видео приведено ниже) исследователь предложил использовать утилиту HTML Help ActiveX Control, сертификат которой обладает описанными выше особенностями.
При этом существует возможность подписать любой исполняемый файл подобным образом, например, с помощью powershell командлета Set-AuthenticodeSignature. Предварительно потребуется создать самоподписанный сертификат корневого удостоверяющего центра и конечный сертификат средствами утилиты makecert из набора Windows SDK. Инструкция приведена по ссылке.
Уязвимость получила идентификатор CVE-2019-1388 и CVSS 7.8. Ей оказались подвержены все версии ОС от Windows 7 до Windows Server 2019. После установки патча поле Issued by в деталях сертификата перестает отображаться как гиперссылка.
Массовая эксплуатация этой уязвимости маловероятна ввиду трудности автоматизации. Ведь для реализации атаки на ее основе пользователю потребуется выполнить немало действий — от открытия окна с сертификатом исполняемого файла до запуска командной строки через интерфейс Internet Explorer. Поэтому наиболее вероятный сценарий атаки может быть связан с действиями внутреннего нарушителя.
Как обнаружить
Для обнаружения эксплуатации уязвимости на платформах Windows x64 мы в Jet CSIRT используем в SIEM-системе правило корреляции, отслеживающее цепочку событий (на контролируемом узле предварительно необходимо включить аудит запуска процессов посредством соответствующей групповой политики либо использовать утилиту Sysmon от Sysinternals):
- Детектирование запуска процесса constent.exe с правами SYSTEM (код события 4688).
- Детектирование запуска процесса C:\Program Files\iexplore.exe с правами SYSTEM, где в качестве родительского процесса выступает consent.exe.
- Детектирование запуска процесса C:\Program Files (x86)\iexplore.exe с правами SYSTEM, где в качестве родительского процесса выступает C:\Program Files\iexplore.exe.

Детектирование запуска командного интерпретатора (cmd.exe, powershell.exe) с правами SYSTEM, где в качестве родительского процесса выступает C:\Program Files (x86)\iexplore.exe.

Приведем пример описанного корреляционного правила на стороне FortiSIEM.

Детализация условия запуска consent.exe

Детализация условия запуска IEx64

Детализация условия запуска IEx86

Детализация условия запуска cmd.exe, powershell.exe

Исходный код корреляционного правила FortiSIEM
UAC Privilege Escalation through Secure Desktop Повышение привилегий через UAC Secure Desktop CVE-2019-1388 1 eventType = "Win-Security-4688" AND procName CONTAIN "consent.exe" AND user IN ("СИСТЕМА","SYSTEM") COUNT(*) >= 1 user,procName eventType = "Win-Security-4688" AND procName REGEXP (".*Files\\\\Internet.*\\\\iexplore\\.exe$") AND parentProcName CONTAIN "consent.exe" OR user IN ("СИСТЕМА","SYSTEM") COUNT(*) >= 1 procId,user,parentProcName,procName eventId = 4688 AND procName REGEXP (".*\\(x86\\)\\\\.*\\\\iexplore\\.exe$") AND parentProcName REGEXP (".*Files\\\\Internet.*\\\\iexplore\\.exe$") AND user IN ("СИСТЕМА","SYSTEM") COUNT(*) >= 1 procName,parentProcName,procId,user eventType = "Win-Security-4688" AND ( procName CONTAIN "cmd.exe" OR procName CONTAIN "powershell.exe" ) AND parentProcName REGEXP (".*\\(x86\\)\\\\.*\\\\iexplore\\.exe$") AND user IN ("СИСТЕМА","SYSTEM") COUNT(*) >= 1 user,parentProcName,procName,parentProcId IE_x86_Execution.procId = Cmd_Execution.parentProcId procName=Cmd_Execution.procName,parentProcName=Cmd_Execution.parentProcName,user=Cmd_Execution.user phRecvTime,eventType,reptDevName,reptDevIpAddr,destIpAddr,destName,user,parentProcId,parentProcName,procId,procName,rawEventMsg
Исследователь Florian Roth выложил Sigma-правило для обнаружения попытки эксплуатации данной уязвимости. Однако из-за ограничений языка с помощью правила можно выявлять только событие запуска Internet Explorer с правами SYSTEM и родительским процессом consent.exe без последующего детектирования запуска командных интерпретаторов. Отследить цепочку нужных событий при соблюдении описанных выше условий (1-5) средствами Sigma не представляется возможным, из-за чего мы вынуждены были разработать собственное правило.
Как защититься
1. Установить патч Microsoft от 12 ноября для соответствующей версии ОС.
2. Если патч для устранения данной уязвимости установить нельзя, стоит воспользоваться:
- правилами AppLocker, запрещающими запуск командных интерпретаторов cmd.exe и powershell.exe для учетных записей, входящих в группу «Пользователи» (необходимо учесть утилиты и техники, позволяющие обойти AppLocker, перечисленные в LOLBINS);
- средствами host-based IPS в составе систем класса EPP, EDR (нужно настроить правила доступа, запрещающие процессу iexplore.exe обращение к cmd.exe, powershell.exe).
- JET CSIRT
- повышение привилегий
- обход UAC
Как передать пароль в UAC?
Уважаемые, подскажите, есть необходимость, запускать удаленно от имени администратора приложения(например через teamviewer). Но доменные настройки таковы, что нельзя обойти UAC, а когда открывается окно UAC — удаленно экран недоступен. Знаю что реально реализовать запуск окна для ввода пароля уже с введенными данными(логин, пароль) чтобы пользователю осталось только нажать кнопку ДА. Как можно реализовать передачу пароля в окно UAC средствами powershell или c#? ОС Windows 10.
Update
имею ввиду подобный функционал: ссылка.
- Вопрос задан более трёх лет назад
- 786 просмотров
Комментировать
Решения вопроса 0
Ответы на вопрос 1

# @mindtester Куратор тега C#
http://iczin.su/hexagram_48
удивлюсь если вы получите легитимное положительное решение. UAC по сути своей и предназначен препятствовать именно такому сценарию (не только такому, но такому точно)
но на всякий случай тоже подпишусь ))
в частности из клипбоарда, в UAC вставляются строки, но у меня сильное подозрение что SendKey обломается, только Ctrl-V (Shift-Ins) с физической консоли
если сможете обойти — поделитесь ))
но гонять пароли через клипбоард — кхм. типа — «заходи кто хочешь, бери что хочешь».. если за консолью пользователь.. и не глупый, это эквивалентно внесению его сразу в группы админов
хмм.. ну тогда уж копните и в сторону:
var pfProc = new Process(); pfProc.StartInfo = new ProcessStartInfo(. ); pfProc.Start();
Ответ написан более трёх лет назад
Нравится 2 7 комментариев
walke @walke Автор вопроса
В софте под названием bomgar(аналог teamviewer) используется именно такое решение — подключающийся вводит админские логин и пароль на своей стороне, а на принимающей стороне появляется окно UAC, в котором юзеру нужно только кликнуть да. Так как это uac окно, подключающемуся оно не видно. И это точно не клипборд.
Мне показалось что это можно как-то легко организовать, но видимо это их ноу-хау.
Тут написано, почему UAC обойти нельзя..

# @mindtester Куратор тега C#
увы, я еще не знаком с этим софтом.. попробую глянуть

# @mindtester Куратор тега C#
кстати я обновил ответ, в связи ответом SyavaSyava
просто у меня нет макета с жесткими политиками UAC, а корячить свой комп точно не охота
рассуждая по логике SyavaSyava, вероятно подразумевается, что в runas.exe передать логин и пароль в командной строке
но тогда в Process тоже можно задать логин/пасс (! имеется в виду — выполнить от имени админа)
другой вопрос — то ли это, что вам надо?
walke @walke Автор вопроса
mindtester, runas не позволяет обойти UAC. Вообще нет ни одного способа обойти UAC включая psexec(если только это не эксплоит).
И, runas не позволяет передать пароль. Psexec передает пароль, но в случае включенного uac это не работает.

# @mindtester Куратор тега C#
а в случае bomgar, все может быть до обидного просто..
тот же тим, когда во время инсталяции, или позднее, его настраивают, что бы принимать вызовы в автопилоте — поднимает службу, у которой уже достаточно прав. ну и настройка эта, может быть выполнена только с соответствующими правами. так что вряд ли есть магический разрыв в причинно следственной цепи
Как запустить программу без прав администратора и обойти подсказку UAC?
При запуске многие программы требуют повышения прав, хотя на самом деле им не нужны права администратора для их нормальной работы. При запуске такой программы под учетной записью обычного пользователя (если на компьютере включен контроль учетных записей пользователей) появится приглашение UAC, и пользователю потребуется ввести пароль администратора. Чтобы обойти этот механизм, многие пользователи просто отключают UAC или предоставляют привилегии администратора пользователю на компьютере, добавляя учетную запись пользователя в локальную группу «Администраторы». Конечно, оба метода небезопасны.
Почему некоторые приложения Windows не работают под обычными пользователями и требуют прав администратора?
Приложению могут потребоваться права администратора для изменения некоторых файлов (журналов, конфигураций и т. д.) В своей папке C:\Program Files (x86)\Приложение. По умолчанию пользователи не имеют прав на редактирование (запись и изменение) этого каталога. Для нормальной работы этой программы требуются права администратора. Чтобы решить эту проблему, необходимо вручную предоставить разрешение на изменение и/или запись для пользователя (или группы пользователей) в папке приложения на уровне NTFS.
Как запустить программу, которая требует прав администратора под обычным пользователем?
Ранее мы описывали, как запустить программу с сохраненным паролем администратора, используя опцию /SAVECRED. Данное действие небезопасно.
Давайте рассмотрим более простой способ заставить любую программу работать без ввода пароля администратора и с включенным UAC.
В качестве примера возьмем редактор реестра – regedit.exe. Когда вы запускаете regedit.exe, появляется окно UAC, и если вы не подтвердите повышение прав, редактор реестра не запустится.

Вариант 1.
Создайте на рабочем столе текстовый файл run-as-non-admin.bat, содержащий следующий код :
cmd /min /C «set __COMPAT_LAYER=RUNASINVOKER && start «» %1″
Чтобы принудительно запустить regedit.exe без прав администратора и подавить приглашение UAC, просто перетащите файл EXE, который вы хотите запустить, на этот файл BAT на рабочем столе.

Редактор реестра запуститься без запроса UAC. Если вы откроете Диспетчер задач и перейдете на вкладку Подробности , вы увидите, что в системе существует процесс regedit.exe, запущенный с правами обычного пользователя.

Таким же образом вы можете запустить любое приложение, используя файл BAT. Просто укажите путь к исполняемому файлу.
Вариант 2.
Рассмотрим еще один способ. Вы можете добавить контекстное меню, которое позволяет запускать все приложения без повышения прав. Для этого создайте следующий файл REG и импортируйте его в реестр.
Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker] @="Run as user without UAC privilege elevation" [HKEY_CLASSES_ROOT\*\shell\forcerunasinvoker\command] @="cmd /min /C \"set __COMPAT_LAYER=RUNASINVOKER && start \"\" \"%1\"\""
После этого, чтобы запустить любое приложение без прав администратора, просто выберите пункт «Run as user without UAC privilege elevation» в контекстном меню.
Как обойти окно uac powershell
Сообщения: 13
Благодарности: 0
Подскажите, пожалуйста:
1. Можно ли убрать всплывающее окно uac без его отключения при использовании -verb. Для пример так:
powershell -verb runas -File c:\scripts\sct12.ps1
При его запуске вылезает всплывающее окно uac с просьбой подтвердить действие. После подтверждения скрипт отрабатывает корректно.
Может другой ключ есть? ОС Windows server 2012R2, но интересует для любой windows. UAC отключать не хочется, так как действие в скрипте может быть разовое. Я так понял, что только отключение uac.
2. Как скриптом изменить уровень uac для компьютера в рабочей группе. Я так понял что в сторону локальных политик безопасности надо лезть.