Аудит обхода Script Block Logging в PowerShell: защита Event ID 4104
Симптомы обхода логирования Script Block Logging
В журнале безопасности Microsoft-Windows-PowerShell/Operational отсутствуют записи Event ID 4104: Execute a Remote Command / Script Block, несмотря на включенные политики аудита. Злоумышленники используют манипуляции с памятью для отключения интерфейса AMSI (Antimalware Scan Interface) и обнуления флагов журналирования ScriptBlockLogging.
| Симптом | Где проявляется | Риск безопасности |
|---|---|---|
| Отсутствие записей Event ID 4104 | PowerShell/Operational | Скрытое выполнение вредоносных скриптов и обфусцированного кода (Cobalt Strike/PowerSploit) |
| Обход AMSI в памяти процесса | Сессия PowerShell | Отключение сканирования команд встроенным антивирусом через патчинг amsi.dll |
| Запуск PowerShell v2.0 (Downgrade Attack) | PowerShell.exe -version 2 | Обход логирования за счет использования старой версии движка без поддержки ScriptBlockLogging |
Пошаговая принудительная настройка Script Block Logging
- Включите обязательное подробное логирование сценариев через GPO: откройте
gpedit.msc: Конфигурация компьютера > Административные шаблоны > Компоненты Windows > Windows PowerShell > включите «Включить ведение журнала блоков сценариев PowerShell» (Turn on PowerShell Script Block Logging) и установите флажок «Журналировать события запуска/остановки вызовов сценариев». - Включите защищенное системное логирование через реестр:
$regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging"; if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force }; Set-ItemProperty -Path $regPath -Name "EnableScriptBlockLogging" -Value 1 -Type DWord -Force; Set-ItemProperty -Path $regPath -Name "EnableScriptBlockInvocationLogging" -Value 1 -Type DWord -Force - Удалите устаревший компонент PowerShell v2.0 для предотвращения Downgrade атак:
Disable-WindowsOptionalFeature -Online -FeatureName "MicrosoftWindowsPowerShellV2Root" -Remove - Включите режим Constrained Language Mode для пользователей без прав администратора:
[Environment]::SetEnvironmentVariable("__PSLockdownPolicy", "4", "Machine")
Справка: При включенном Script Block Logging ядро PowerShell автоматически деобфусцирует упакованный и зашифрованный код прямо перед выполнением и записывает его чистый исходный текст в журнал 4104.
Частые вопросы (FAQ)
В чем разница между Module Logging и Script Block Logging?
Module Logging логирует выполнение отдельных командлетов конвейера. Script Block Logging перехватывает и записывает весь исполняемый блок кода/скрипта целиком в исходном виде.
Как злоумышленники пытаются отключить ScriptBlockLogging в коде?
Они модифицируют внутреннюю переменную CachedGroupPolicySettings в кластере System.Management.Automation.Utils через рефлексию .NET.
Что такое PowerShell Transcription (Транскрипция)?
Это функция полной текстовой записи всех вводимых команд и выводимых ответов консоли в защищенный сетевой каталог текстовых файлов.
Какой уровень логирования PowerShell требует SIEM для выявления угроз?
Для полноценного обнаружения атак обязательны: Script Block Logging (Event 4104), Module Logging (Event 4103) и аудит создания процессов 4688 с командной строкой.