
مشفر PowerShell

Invoke-Obfuscation هي أداة تشويش لأوامر ونصوص PowerShell متوافقة مع الإصدار v2.0+.
في خريف عام 2015، قررت البدء في البحث عن مرونة لغة PowerShell وبدأت في فهرسة الطرق المختلفة لتحقيق مجموعة من التقنيات الشائعة التي يستخدمها معظم المهاجمين بشكل منتظم.
في البداية، ركزت على تركيبات الأوامر المشفرة وأوامر التحميل عن بُعد (download cradle)، واكتشفت أن العديد من أحرف الهروب التي لا تعيق تنفيذ الأمر تبقى في وسائط سطر الأوامر، سواء في العملية الجارية أو فيما يتم تسجيله في سجلات الأحداث Security EID 4688 و Sysmon EID 1. قادني هذا إلى استكشاف طرق منهجية لتشويش كل نوع من "الرموز" (token) الموجودة في أي أمر أو نص PowerShell.
ثم استكشفت طرقًا أكثر غموضًا لتشويش على مستوى السلاسل النصية، وتقنيات ترميز/تشفير مختلفة (مثل ASCII/hex/octal/binary وحتى SecureString)، وأخيرًا تقنيات تشغيل PowerShell لتجريد وسائط سطر الأوامر من powershell.exe ودفعها إلى العملية الأم وحتى العملية الجد.
بدأ المهاجمون والبرامج الضارة في استخدام تقنيات تشويش أساسية جدًا لإخفاء الجزء الأكبر من الأمر عن وسائط سطر الأوامر الخاصة بـ powershell.exe. قمت بتطوير هذه الأداة لمساعدة الفريق الأزرق (Blue Team) في محاكاة الأوامر المشوشة بناءً على ما أعرفه حاليًا أنه ممكن نحويًا في PowerShell 2.0-5.0، حتى يتمكنوا من اختبار قدراتهم على اكتشاف هذه التقنيات.
الغرض الوحيد من الأداة هو كسر أي افتراضات قد تكون لدينا كمدافعين حول كيفية ظهور أوامر PowerShell على سطر الأوامر. أملي هو أن تشجع الفريق الأزرق على التحول إلى البحث عن مؤشرات التشويش على سطر الأوامر بالإضافة إلى تحديث تسجيل PowerShell ليشمل تسجيل الوحدات (Module)، وسكريبت بلوك (ScriptBlock)، والنسخ الحرفي (Transcription)، حيث أن هذه المصادر تبسط معظم جوانب تقنيات التشويش التي تنتجها هذه الأداة.
على الرغم من أن جميع طبقات التشويش قد تم بناؤها في نصوص منفصلة، إلا أن معظم المستخدمين سيجدون أن وظيفة Invoke-Obfuscation هي أسهل طريقة لاستكشاف وتصور تقنيات التشويش التي يدعمها هذا الإطار حاليًا.
الكود المصدري لـ Invoke-Obfuscation مستضاف على Github، ويمكنك تنزيله، عمل fork له، ومراجعته من هذا المستودع (https://github.com/danielbohannon/Invoke-Obfuscation). يرجى الإبلاغ عن المشكلات أو طلبات الميزات من خلال متتبع الأخطاء الخاص بـ Github المرتبط بهذا المشروع.
للتثبيت:
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
تم إصدار Invoke-Obfuscation بموجب ترخيص Apache 2.0.
v1.0 - 2016-09-25 DerbyCon 6.0 (Louisville, Kentucky USA): إصدار عام لـ Invoke-Obfuscation.
v1.1 - 2016-10-09 SANS DFIR Summit (Prague, Czech Republic): تمت إضافة وظيفة إعادة ترتيب عامل التنسيق -f لجميع وظائف تشويش TOKEN المناسبة. كما تمت إضافة خيارات تركيب إضافية لتعيين قيم المتغيرات.
v1.2 - 2016-10-20 CODE BLUE (Tokyo, Japan): تمت إضافة تشويش على نوع TOKEN (التحويل المباشر للنوع مع خيارات تشويش سلسلة نصية لاسم النوع).
v1.3 - 2016-10-22 Hacktivity (Budapest, Hungary): تمت إضافة اثنين من LAUNCHERs جديدين: CLIP+ و CLIP++. كما تمت إضافة صيغة تحويل مصفوفة أحرف إضافية (وأبسط) لجميع وظائف ENCODING لا تتطلب For-EachObject/%.
v1.4 - 2016-10-28 BruCON (Ghent, Belgium): تمت إضافة وظيفة ENCODING جديدة BXOR. كما تم تحسين الحالة العشوائية لجميع مكونات جميع وظائف ENCODING وكذلك لأعلام تنفيذ PowerShell لجميع LAUNCHERs. أخيرًا، تمت إضافة خيار اختصار -EP لـ -ExecutionPolicy لجميع LAUNCHERs بالإضافة إلى التمثيل العددي الاختياري لعلم تنفيذ PowerShell -WindowStyle: عادي (0)، مخفي (1)، مصغر (2)، معظم (3).
v1.5 - 2016-11-04 Blue Hat (Redmond, Washington USA): تمت إضافة LAUNCHER WMIC مع بعض العشوائية في وسائط سطر أوامر WMIC.
v1.6 - 2017-01-24 Blue Hat IL (Tel Aviv, Israel):
Invoke-Obfuscation -ScriptBlock {Write-Host 'CLI FTW!'} -Command 'Token\All\1, Encoding\1, Launcher\Stdin++\234, Clip' -Quiet -NoExitToken\All\1, String\3, Encoding\5, Launcher\Ps\234, ClipToken\*\*, String\[13], Encoding\(1|6), Launcher\.*[+]{2}\234, Clippowershell -enc كقيمة SCRIPTBLOCK.-Key -Ke -K إلى Out-SecureStringCommand.ps1.-ST/-STA (الشقة أحادية الخيط) لوظائف LAUNCHER CLIP+ و CLIP++ لأنها مطلوبة إذا كان التشغيل على PowerShell 2.0.Get-Item/GI/Item في كل مكان يُستخدم فيه للحصول على قيم المتغيرات.v1.7 - 2017-03-03 nullcon (Goa, India):
v1.8 - 2017-07-27 Black Hat (Las Vegas, Nevada USA):
v1.8.1 - 2017-12-19:
v1.8.2 - 2018-01-04:
Get-ChildItemSet-Item إلى وظيفة تشويش TYPE.[String]::Join('',$string)PtrToStringAnsi / SecureStringToGlobalAllocAnsiPtrToStringBSTR / SecureStringToBSTRPtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[3].Name).InvokePtrToStringAuto, ([Runtime.InteropServices.Marshal].GetMembers()[5].Name).InvokePtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[2].Name).InvokePtrToStringUni , ([Runtime.InteropServices.Marshal].GetMembers()[4].Name).InvokePtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[0].Name).InvokePtrToStringAnsi, ([Runtime.InteropServices.Marshal].GetMembers()[1].Name).Invoke${${var}} لأن ذلك يسبب أخطاء).