По умолчанию PowerShell работает в режиме полного языка , в котором доступны все функции. Это включает в себя доступ ко всем языковым элементам, командлетам и модулям, а также к файловой системе и сети.
Заблокированные функции
Возможность создавать экземпляры объектов COM и .NET или создавать новые типы данных (с Add-Type), которые были определены в других языках, является особенно опасной возможностью PowerShell. Режим ограниченного языка блокирует эти функции (кроме доступа к разрешенным классам .NET). Он также предотвращает объявление классов, использование управления конфигурацией с DSC и рабочие процессы на основе XAML.
Включение режима ограниченного языка
Простой способ перейти в режим ограниченного языка - установить для соответствующей переменной требуемое значение:
$ExecutionContext.SessionState.LanguageMode = "ConstrainedLanguage"
Очевидно, что установка этой переменной не обеспечивает никакой реальной защиты. Возможно, вы не сможете изменить его обратно на FullLanguage в том же сеансе; тем не менее, новый сеанс PowerShell предложит полный набор языковых функций.
Переключение в ограниченный режим с помощью переменной окружения
Менее легко преодолеть (недокументированную) переменную системной среды __PSLockDownPolicy , если для нее задано значение 4. В результате PowerShell будет запускаться в режиме безопасного языка независимо от того, является ли это просто командной строкой или ISE.
В средах с централизованным управлением вы, вероятно, будете использовать групповые политики для установки системной переменной.
Недостатком этой процедуры является то, что она всегда затрагивает всех пользователей компьютера, включая администраторов. Однако администраторы могут временно удалить переменную среды, пока объект групповой политики снова не вступит в силу. Но это довольно громоздко и определенно не очень хорошее решение.
Кроме того, при таком использовании это не функция безопасности, поддерживаемая Microsoft, и ее относительно легко обойти, как показал Мэтт Грейбер в этом твите . Тем не менее, это может помешать большинству оппортунистических атак.
Строгое соблюдение режима ограниченного языка на локальном компьютере, таким образом, требует использования ограничения на выполнение программного обеспечения, такого как AppLocker или Контроль приложений Защитника Windows. В удаленном сеансе, однако, это может быть реализовано через настройку сеанса.
Автоматическое определение ограничения выполнения
Начиная с версии 5, PowerShell автоматически распознает, должен ли он переключаться в режим ограниченного языка на основе правил сценария. Для этого он создает модуль и скрипт (с именем, следующим по шаблону __PSSCRIPTPOLICYTEST_LQU1DAME.3DD.PS1) в $ env: temp, и пытается выполнить их. Если AppLocker или другой инструмент блокируют эту попытку, PowerShell запускается в режиме ограниченного языка.
Эффект этого механизма можно легко увидеть в журнале событий AppLocker. AppLocker регистрирует создание и выполнение этих тестовых файлов с идентификатором 8005 (успех) или 8007 (выполнение заблокировано) в разделе «Applications and Services Log» > «Microsoft» > «Windows» > «AppLocker» > «MSI and Script».
Настройка AppLocker
Если вы используете AppLocker для этой задачи, вам необходимо создать новый объект групповой политики, а затем отредактировать его в редакторе объектов групповой политики. Перейдите к «Computer Configuration» > «Policies» > «Windows Settings» > «Security Settings» > «Application Control Policies» > «AppLocker» и следовать правила принудительной настройка связи. В появившемся диалоговом окне выберите параметр «Script rules».
Чтобы AppLocker блокировал приложения в целевых системах, должна быть запущена служба идентификации приложений . По умолчанию он не активен и не запускается при загрузке системы. Вы можете изменить его для запуска типа Automatic либо в интерактивном режиме, используя службы оснастки MMC, либо из командной строки:
sc config AppIDSvc start=auto
Для централизованного управления этой службой Windows рекомендуется использовать групповую политику.
Определение правил
Наконец, должны быть определены правила, которые блокируют запуск сценариев в каталоге Temp. Для этого просто переключитесь на Script Rules под AppLocker и выберите Create Default Rules из контекстного меню.
Они позволяют обычным пользователям выполнять сценарии только из каталогов Windows или Program Files , то есть в местах, где пользователи не могут хранить какие-либо файлы самостоятельно. Администраторы явно освобождены от этого ограничения отдельным правилом.
Активация режима ограниченного языка через SRP
AppLocker - это функция, доступная исключительно в выпусках Enterprise и Education. Версия Pro может использовать Политики ограниченного использования программ (SRP). Опять же, вы просто должны убедиться, что два тестовых сценария не могут быть выполнены в каталоге %temp%. Для этого создайте объект групповой политики, откройте его в редакторе и выберите «Computer Configuration» > «Policies» > «Windows Settings» > «Security Settings» > «Software Restriction Policies».
Здесь вы создаете новую политику. На первом этапе вы добавляете расширения ps1 и psm1 в список назначенных типов файлов.
Затем выберите «Additional Rules» > «New Path Rule», чтобы создать новое правило. Здесь вы вводите %temp% в качестве пути и оставить уровень безопасности набор настроек для Disallowed.
Предотвращение PowerShell 2.0 обхода
Независимо от того, выберете ли вы переменную среды, AppLocker или Политики ограниченного использования программ, вам потребуется удалить PowerShell 2.0 с компьютеров, на которых вы хотите включить режим ограниченного языка.
Режим ограниченного языка был введен в PowerShell 3.0 и может быть легко обойден хакерским переходом на более старую версию. Все, что ему нужно сделать, это ввести команду:
powershell.exe -version 2.0
Вы можете проверить, активирована ли эта старая версия на ПК, введя:
Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2
Однако его можно удалить только в Windows 8 и Windows Server 2012 или более поздних версиях, где PowerShell 2.0 является дополнительной функцией.