Проблема
Living-off-the-Land (LOTL) атаки используют легитимные функции PowerShell (например, `Invoke-Expression`, `Add-Type`, отражённая загрузка .NET), что делает их неотличимыми от обычной активности администратора. Стандартные антивирусные сигнатуры не срабатывают, так как вредоносная нагрузка не записана на диск.Причины
- Недостаточное логирование: по умолчанию `ScriptBlock Logging` (Event ID 4104) и `Module Logging` отключены.- Обфускация: кодирование в Base64, разбивка строк (`"I"+"E"+"X"`), использование `-EncodedCommand`.
- Вызов через отражение (`[Reflection.Assembly]::Load`), загрузка из памяти без записи на диск.
Решение
#### 1. Включение необходимого логирования (GPO / реестр)powershell
<h2 id="vklyuchit-scriptblock-logging-event-id-4104">Включить ScriptBlock Logging (Event ID 4104)</h2>
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name "EnableScriptBlockLogging" -Value 1
<h2 id="vklyuchit-module-logging-logi-vseh-komand-modulya">Включить Module Logging (логи всех команд модуля)</h2>
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" -Name "EnableModuleLogging" -Value 1
<h2 id="vklyuchit-powershell-transcription-tekstovye-logi-sessiy">Включить PowerShell Transcription (текстовые логи сессий)</h2>
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription" -Name "EnableTranscripting" -Value 1
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\Transcription" -Name "OutputDirectory" -Value "C:\PSLogs"#### 2. Сигнатурный анализ через Get-WinEvent и регулярные выражения
Поиск ключевых паттернов LOTL в Event ID 4104 (ScriptBlock Logging):
powershell
$path = @(
"Microsoft-Windows-PowerShell/Operational",
"Windows PowerShell"
)
$patterns = @(
'IEX\s\(New-Object\s+Net\.WebClient\)\.DownloadString',
'Start-Process\s+-WindowStyle\s+Hidden',
'Add-Type\s+-AssemblyName\s+System\.Windows\.Forms',
'\[Reflection\.Assembly\]::Load',
'Invoke-ReflectivePEInjection',
'FromBase64String',
'-EncodedCommand\s+[A-Za-z0-9+/]{50,}={0,2}',
'System\.Reflection\.Assembly\.Load\(\[Convert\]::FromBase64String'
)
$events = Get-WinEvent -LogName $path -FilterXPath "[System[EventID=4104]]" -MaxEvents 1000
foreach ($e in $events) {
$msg = $e.Message
foreach ($p in $patterns) {
if ($msg -match $p) {
[PSCustomObject]@{
TimeCreated = $e.TimeCreated
ComputerName = $e.MachineName
Pattern = $p
Script = $msg.Substring(0, [Math]::Min(200, $msg.Length))
}
break
}
}
}#### 3. Использование YARA правил для анализа транскриптов
Пример YARA правила (файл `lotl_powershell.yar`):
yara
rule LOTL_PowerShell_DownloadString {
meta:
description = "Detects Invoke-Expression with Net.WebClient"
strings:
$s1 = /IEX\s\(New-Object\s+Net\.WebClient\)\.DownloadString/i
$s2 = /Start-Process\s+-WindowStyle\s+Hidden/i
condition:
any of them
}
rule LOTL_PowerShell_Base64Encoded {
strings:
$b64 = /\-EncodedCommand\s+[A-Za-z0-9+/]{100,}={0,2}/
condition:
$b64
}Запуск YARA на папке с транскриптами:
bash
yara.exe -r lotl_powershell.yar c:\PSLogs\.txt#### 4. Дополнительная сигнатура: вызовы через `-Command` с Base64
Часто LOTL используют `powershell -enc `. Ищите в логах Security Event ID 4688 (процесс создания) или Sysmon Event ID 1:
powershell
Get-WinEvent -LogName "Microsoft-Windows-Sysmon/Operational" -FilterXPath "[System[EventID=1]]" |
Where-Object { $_.Properties[10].Value -match "powershell.-enc" } |
Select-Object TimeCreated, @{n="CmdLine";e={$_.Properties[10].Value}}#### Важно
- Обфускация может обойти простые regex (например, `"IEX"` собран через `$a=...`). Для глубокого обнаружения используйте AMSI (Antimalware Scan Interface) и поведенческий анализ.
- Сигнатурный метод даёт ложноположительные срабатывания — фильтруйте по известным административным скриптам (белый список хешей).