Логирование PowerShell
Логирование PowerShell — это критически важный элемент мониторинга безопасности в современных средах, так как PowerShell часто используется злоумышленниками для выполнения вредоносных скриптов, обхода защиты и выполнения атак. Включение логирования PowerShell позволяет отслеживать выполняемые команды и скрипты, что помогает обнаруживать подозрительную активность.
Настройка логирования Powershell
Чтобы настроить аудит событий PowerShell с помощью групповых политик и включить модуль Script Block Logging, выполните
Откройте Редактор групповых политик
Перейдите в раздел: Конфигурация компьютера → Политики → Административные шаблоны → Компоненты Windows → Windows PowerShell.
Выберите "Включить ведение журнала модулей", "Включить ведение журнала блоков скриптов" и "Включить ведение журнала транскрипций" Для последнего укажите путь для сохранения транскрипций (например,
C:\PSLogs).
Типы событий
Основные типы логирования:
Модуль аудита PowerShell (Module Logging) - Модуль аудита регистрирует все команды, выполняемые в PowerShell. Логи сохраняются в Журнале событий Windows в разделе Microsoft-Windows-PowerShell/Operational с Event ID 4103 Регистрируются: - Отдельные команды, выполняемые в PowerShell. - Если запущен скрипт, то на каждый вызов Powershell Cmdlet будет зарегистрировано отдельное событие - Если используется алиас (например,
gciвместоGet-ChildItem), в логах будет записан командлетGet-ChildItem.Логирование блоков скриптов (Script Block Logging) - Логирование блоков скриптов регистрирует содержимое скриптов, выполняемых в PowerShell. Логи сохраняются в Журнале событий Windows в разделе Microsoft-Windows-PowerShell/Operational с Event ID 4104 Регистрируются: - Полное содержимое скриптов, выполняемых в PowerShell. - Регистрируется весь блок кода, включая команды, циклы, условия и функции.
Если скрипт PowerShell очень длинный, событие с ID 4104 регистрируется как несколько событий. В каждом событии вы найдете поле Script Block, которое содержит часть тела скрипта. Также в каждом событии есть указание, на сколько всего блоков был разбит скрипт (MessageTotal) и порядковый номер текущего (MessageNumber).
Логирование транскрипций (Transcript Logging). Логирование транскрипций сохраняет все действия, выполненные в сессии PowerShell, в текстовый файл.
Мы обычно используем только 4103 и 4104
Сравнение событий PowerShell Event ID 4103 и Event ID 4104
Оба события связаны с логированием активности PowerShell, но они регистрируют разные аспекты выполнения команд и скриптов.
Выполнение скрипта из файла
Предположим, что атакующий запускает Powershell и выполняет так скрипт add_admin.ps1. При этом зарегистрируется событие Event ID 4104, где в поле ScriptBlockText будет полное тело скрипта:
При этом будет зарегистрировано 4 отдельных событий Event ID 4103, в поле Payload будут соотвествующие записи каждому вызванному командлету:
При этом Script Name в ContextInfo каждого из Event ID 4103 будет содержать полный путь до скрипта add_admin.ps1.
Стоит обратить внимание, что в Event Id 4103 видны конкретные значения того, что в теле скрипта передается как параметры.
Псевдонимы командлетов (cmdlet alias) в Event ID 4103
У команделетов Powershell бывают элиасы (псевдонимы) — это короткое или альтернативное имя для командлета, функции или скрипта. Псевдонимы позволяют быстрее вводить команды, экономя время. Некоторые уже определены в системе, но можно задавать и произвольные.
Если в консоли powershell ввести псевдоним, то в Event ID 4104 залогируется так, как ввел пользователь, а вот в 4103 будет виден исходный полный командлет
То есть обфускация при правильно настроенном логирования powershell практически теряет свою пользу. Хотя бывает полезно просто искать ее следы.
Примеры обфускаций
Обфусцированный (запутанный) PowerShell-код часто используется в вредоносных скриптах или для сокрытия логики от анализа.
1. Строки в виде чисел (Char-коды)
Что делает?
→ Преобразует ASCII-коды в строку Write-Host 'Hello, World!' и выполняет её.
2. Base64-кодирование
Что делает?
→ Декодирует строку Write-Host 'Hello, World!' из Base64 и выполняет её.
3. Разделение строки и соединение
Что делает?
→ Собирает команду Write-Host 'Hello, World!' из частей и выполняет через iex (Invoke-Expression).
4. Использование переменных с подменой символов
Что делает? → Собирает команду через переменные с неочевидными именами и выполняет её.
5. Рекурсивный вызов с зашифрованными данными
Что делает?
→ Расшифровывает строку (Write-Host 'Hello, World!' смещением символов) и выполняет её.
6. Использование Invoke-Command с закодированным ScriptBlock
Invoke-Command с закодированным ScriptBlockЧто делает? → Собирает команду внутри ScriptBlock и выполняет её.
Запуск процесса из Powershell
Если атакующий просто запускает процесс из powershell, то под капотом генерируется вызов командлета Invoke-Expression.
Если атакующий запускает процесс Powershell следующим образом:
То в событии старта процесса (Event ID 4688, Sysmon 1) увидим заэнкоженную base64 строку (Рашифровать можно в CyberChef). Однако в EventID 4103 и 4104 будет видно, что на самом деле выполнялось:
Для того, чтобы выполнить в Powershell base64 enoded команду, необязательно полностью писать ключ -EncodedCommand
-enc - достаточно
-enco, -en - тоже
-ec - кстати, тоже работает
-ˆeˆc - и сам ключ тоже можно обфусцировать
Подробнее: https://unit42.paloaltonetworks.com/unit42-pulling-back-the-curtains-on-encodedcommand-powershell-attacks/
Известные Powershell инструменты
Все они включают довольно специфичные командлеты, детекты на которые не будут изощренными, но точно полезными.
Примеры подозрительных команд и скриптов
Загрузка и выполнение скриптов из интернета: Ищите команды, связанные с обходом защиты, запуском скриптов или взаимодействием с внешними ресурсами (например,
FromBase64StringDownloadString,Net.WebClient)Обход защиты:
Создание скрытых процессов:
Использование утилит для взлома:
Last updated
Was this helpful?