githubEdit

Логирование PowerShell

Логирование PowerShell — это критически важный элемент мониторинга безопасности в современных средах, так как PowerShell часто используется злоумышленниками для выполнения вредоносных скриптов, обхода защиты и выполнения атак. Включение логирования PowerShell позволяет отслеживать выполняемые команды и скрипты, что помогает обнаруживать подозрительную активность.

Настройка логирования Powershell

Чтобы настроить аудит событий PowerShell с помощью групповых политик и включить модуль Script Block Logging, выполните

  1. Откройте Редактор групповых политик

  2. Перейдите в раздел: Конфигурация компьютера → Политики → Административные шаблоны → Компоненты Windows → Windows PowerShell.

  3. Выберите "Включить ведение журнала модулей", "Включить ведение журнала блоков скриптов" и "Включить ведение журнала транскрипций" Для последнего укажите путь для сохранения транскрипций (например, 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. - Регистрируется весь блок кода, включая команды, циклы, условия и функции.

circle-info

Если скрипт PowerShell очень длинный, событие с ID 4104 регистрируется как несколько событий. В каждом событии вы найдете поле Script Block, которое содержит часть тела скрипта. Также в каждом событии есть указание, на сколько всего блоков был разбит скрипт (MessageTotal) и порядковый номер текущего (MessageNumber).

  • Логирование транскрипций (Transcript Logging). Логирование транскрипций сохраняет все действия, выполненные в сессии PowerShell, в текстовый файл.

circle-info

Мы обычно используем только 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 практически теряет свою пользу. Хотя бывает полезно просто искать ее следы.

chevron-right Примеры обфускацийhashtag

Обфусцированный (запутанный) 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

Что делает? → Собирает команду внутри ScriptBlock и выполняет её.

Запуск процесса из Powershell

Если атакующий просто запускает процесс из powershell, то под капотом генерируется вызов командлета Invoke-Expression.

Если атакующий запускает процесс Powershell следующим образом:

То в событии старта процесса (Event ID 4688, Sysmon 1) увидим заэнкоженную base64 строку (Рашифровать можно в CyberChefarrow-up-right). Однако в EventID 4103 и 4104 будет видно, что на самом деле выполнялось:

circle-info

Для того, чтобы выполнить в Powershell base64 enoded команду, необязательно полностью писать ключ -EncodedCommand -enc - достаточно -enco, -en - тоже -ec - кстати, тоже работает -ˆeˆc - и сам ключ тоже можно обфусцировать Подробнее: https://unit42.paloaltonetworks.com/unit42-pulling-back-the-curtains-on-encodedcommand-powershell-attacks/arrow-up-right

Известные Powershell инструменты

Все они включают довольно специфичные командлеты, детекты на которые не будут изощренными, но точно полезными.

Примеры подозрительных команд и скриптов

  • Загрузка и выполнение скриптов из интернета: Ищите команды, связанные с обходом защиты, запуском скриптов или взаимодействием с внешними ресурсами (например, FromBase64String DownloadString, Net.WebClient)

  • Обход защиты:

  • Создание скрытых процессов:

  • Использование утилит для взлома:

Last updated

Was this helpful?