Недавно в форуме всплыл вопрос о предотвращении установки Teams в Windows 11. Если бы его автор читал мое руководство, то все прошло бы без сучка и задоринки. Но он следовал другим материалам. В итоге не вышло импортировать параметр в реестр, потому что владельцем раздела является TrustedInstaller!
В таких случаях я давно рекомендую не менять разрешения в реестре или файловой системе, а вносить изменения с правами служебных учетных записей SYSTEM или TrustedInstaller (TI). И у меня в блоге накопилась уже солидная подборка утилит для запуска программ с такими правами. Сегодня для разнообразия мы обойдемся без сторонних средств.
[+] Сегодня в программе
Метод
Вкратце, с полными правами создается самое обычное задание планировщика, запускаемое от имени любого пользователя. А затем оно вызывается от имени служебного аккаунта TrustedInstaller с помощью метода IRegisteredTask::RunEx из COM API планировщика заданий. В результате процесс невидимо выполняется от имени SYSTEM с токеном доступа TrustedInstaller.
Этот подход несколько лет назад описал в своем блоге James Forshaw aka Tyranid, исследователь безопасности из команды Google Project Zero. И я хочу сделать репост, потому что решение как влитое встает в ряд публикаций моего блога:
- Как выполнять задачи с полными правами обычным пользователем без ввода пароля администратора
- Как выполнять команды и скрипты от имени системы средствами Windows
- Как внести изменения в реестр от имени TrustedInstaller с помощью сторонних утилит
- Как запустить невидимое приложение
Скрипт
Скачать RunAsTI.zip.
В оригинале автор остановился на демонстрации запуска исполняемого файла. Я лишь развил идею до выполнения скрипта.
#https://www.outsidethebox.ms/21899 #Параметры задания $taskname = 'RunAsTI' $execute = 'powershell' #Запись в раздел реестра, которым владеет TI (предотвращение установки Teams), и вывод whoami в текстовый файл $argument = '-ExecutionPolicy Bypass -Noprofile -Command "& { New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Communications -Name ConfigureChatAutoInstall -Value 0 -Type Dword -Force | Tee-Object -FilePath $env:WINDIR\temp\TI.txt whoami | Out-File -FilePath $env:WINDIR\temp\TI.txt -Append }"' $action = New-ScheduledTaskAction -Execute $execute -Argument $argument #Создание задание в планировщике Register-ScheduledTask -TaskName $taskname -Action $action #Запуск задания от имени TrustedInstaller $svc = New-Object -ComObject 'Schedule.Service' $svc.Connect() $user = 'NT SERVICE\TrustedInstaller' $folder = $svc.GetFolder('\') $task = $folder.GetTask('RunAsTI') $task.RunEx($null, 0, 0, $user) #Удаление задания #Unregister-ScheduledTask -TaskName $taskname -Confirm:$false
Приложению powershell.exe
с помощью параметра -Command
передается скриптблок. Нередко достаточно одной команды, но скрипт — более глобальный пример. Первая команда вносит изменения в раздел реестра, владельцем которого является TI. Вторая просто создает файл во временной папке. Там должна фигурировать учетная запись nt authority\system
, от имени которой отработало задание.
В скобках замечу, что ранее я показывал создание запланированного задания для запуска от имени NT AUTHORITY\SYSTEM. Однако с помощью командлета New-ScheduledTaskPrincipal не получится провернуть то же самое для NT SERVICE\TrustedInstaller, поскольку TI — это служба. И хотя у нее есть SID, сопоставление с помощью параметра -UserId
не предусмотрено схемой планировщика заданий, на которую опирается командлет. Наконец, в графическом интерфейсе планировщика тоже невозможно задать выполнение задания от имени TI.
Литература
Обе ссылки ведут в блог James Forshaw:
- The Art of Becoming TrustedInstaller – под капотом TI, SID службы, олицетворение токена — все то, что используют используют сторонние утилиты.
- The Art of Becoming TrustedInstaller — Task Scheduler Edition – описанный выше метод.
Николай Мартынов
Возможно опечатка:
#Запись в раздел реесетра,
+
интересно, как будут вести себя и будут ли вообще, защитные приложения на такой трюк запуска приложений?
Vadim Sterkin
Николай, спасибо, поправил опечатку. Защитные приложения не должны реагировать, ведь используются нативные функции API.
Lecron
Где можно почитать о предпосылках к такому выводу?
Уже не первый раз замечаю непростые попытки выдать себя за кого-то другого. Например недавняя статья про winget, глава «нюанс 2». Подсознательно воспринимается костылем, неадекватным подходом, борьбой с системой прав. В противоположность, традиция linux создавать нужных пользователей и давать им нужные права. Например, нет проблем создать пользователя web-server или app-installer или super-admin-stop-bloatware. Даже если у этого пользователя будет всего одна роль.
Vadim Sterkin
По ссылке в процитированном вами абзаце, например. В том числе:
То есть первый и самый очевидный аргумент — это скорость выполнения задачи. Там же просматривается и второй тезис про восстановление разрешений. Потому что изменив параметры, люди зачастую не возвращают их обратно. Что ведёт к работе с менее защищённой конфигурацией.
Есть и третий момент — кривыми руками ломают разрешения, после чего что-нибудь не работает.
Нюанс 2. Разумеется, это костыль, однако он вынужденный. Потому что разработчик программы и по совместительству автор пакета установщика, не предусмотрел условий для автоматизации обновления своего детища.
У Виндовс тоже есть такая традиция. О чём в принципе этот пост тоже :) В моих примерах эти пользователи уже заведены (NT Authority\System и NT Service\TrustedInstaller). Но в системе не предусмотрено простого способа выполнять задачи с их правами, как это сделано в Linux (sudo).
Однако вы устанавливаете систему и входите в нее впервые с правами администратора. И дальше продолжаете с ними работать. Вам просто по умолчанию не выдают токен администратора. Я к тому, что я оперирую и предлагаю решения в рамках текущей парадигмы ОС.
Lecron
Это системные роли, а я о пользовательских. Для которых предусмотрен штатный запуск runas/sudo. Как написано в Википедии «Основная идея — дать пользователям как можно меньше прав, при этом достаточных для решения поставленных задач». То есть изменить разрешения для файла/реестра так, чтобы не надо было тратить время на их восстановление.
При этом с аргументом запуска от имени TI, я в принципе согласен. Особенно если доступ нужен однократный и точечный. Но впечатления от нарушения идеи ДОВЕРЕННОГО установщика, никуда не делись.
Спасибо за ответ. Картинка сложилась.
Vadim Sterkin
Ну так что поделать, если нормально задача решается, насколько я знаю, только с помощью файла ответов во время установки. А после установки только системные роли, ведь Майкрософт даже не предусмотрела политики для этого.
А все потому, что пропихивание тимс каждому локальному пользователю — это маркетинговый атрибут. Он не присущ линуксу, поэтому там и проблемы такой не возникает. Что характерно, параметр специально спрятали под крыло TI, чтобы хомячкам было сложнее заблокировать установку тимс.
Кстати, из статьи автора этого метода (про ФС, но не суть)
Что же касается…
Скину еще одну цитату :)
Ilya Fetisov
привет,
спасибо за ваши посты. первый раз решил оставить комментарий, почему-то в моём случае столкнулся с двумя проблемами
1. пришлось убрать комментарии, была вот такая ругань, скриншот https://ibb.co/gjRpgqL
2. убрал вывод команды whoami, потому что вообще не отрабатывал весь код, хотя ошибки через запуск в планировщике не было (ExitCode:0), скриншот https://ibb.co/2vgSDCd
т.е. пришлось сократить переменную до такого
Vadim Sterkin
Спасибо, что читаете мой блог. В моих тестах на Windows 11 22H2 EN такого не было.
1. Я на всякий случай вынес комментарий из аргумента задания. Скрипт обновлен.
2. Там все-таки whoami дб на новой строке.
Покажите winver и сообщите язык интерфейса.
Если задание создаётся, но не отрабатывает, экспортируйте его и закиньте xml на pastebin.com