
تنفيذ VBA لتقنية RunPE أو كيفية تجاوز القائمة البيضاء للتطبيقات.
تطبيق بسيط ولكنه فعّال لتقنية RunPE في VBA. يمكن استخدام هذا الكود لتشغيل ملفات تنفيذية من ذاكرة Word أو Excel. وهو متوافق مع كل من الإصدارات 32 بت و64 بت من Microsoft Office 2010 والإصدارات الأحدث.
مزيد من المعلومات هنا:
https://itm4n.github.io/vba-runpe-part1/
https://itm4n.github.io/vba-runpe-part2/

Exploit في نهاية الكود، حدد مسار الملف الذي تريد تنفيذه.strSrcFile = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
/!\ إذا كنت تستخدم إصدار 32 بت من Microsoft Office على نظام تشغيل 64 بت، فيجب عليك تحديد ملفات ثنائية 32 بت.
strSrcFile = "C:\Windows\SysWOW64\cmd.exe"
strSrcFile = "C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe"
strArguments = "-exec Bypass"
سيتم استخدام ذلك لتشكيل سطر أوامر مكافئ لـ:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -exec Bypass
(اختياري) فعّل عرض > النافذة الفورية (Ctrl+G) للتحقق من سجلات التنفيذ والأخطاء.
شغّل ماكرو Exploit!
pe2vba.py لتحويل ملف PE إلى VBA. بهذه الطريقة، يمكن تضمينه مباشرة في الماكرو.user@host:~/Tools/VBA-RunPE$ ./pe2vba.py meterpreter.exe
[+] تم إنشاء الملف 'meterpreter.exe.vba'.
RunPE.vba بمحتوى ملف .vba الذي تم إنشاؤه في الخطوة السابقة.' ================================================================================
' ~~~ PE مُضمّن ~~~
' ================================================================================
' كود تم إنشاؤه بواسطة PE2VBA
' ===== بداية PE2VBA =====
Private Function PE() As String
Dim strPE As String
strPE = ""
PE = strPE
End Function
' ===== نهاية PE2VBA =====
(اختياري) فعّل عرض > النافذة الفورية (Ctrl+G) للتحقق من سجلات التنفيذ والأخطاء.
شغّل ماكرو Exploit!
/!\ عند استخدام PE مضمن، سيتحول الماكرو تلقائيًا إلى هذا الوضع لأن الدالة PE() سترجع سلسلة نصية غير فارغة.
GetThreadContext() مع رمز الخطأ 998.قد تواجه هذا الخطأ إذا قمت بتشغيل هذا الماكرو من إصدار 64 بت من Office. كحل بديل، يمكنك نقل الكود إلى وحدة نمطية بدلاً من تنفيذه من مراجع كائن Word. شكرًا @joeminicucci على النصيحة.
================================================================================
[*] الملف المصدر: 'C:\Windows\System32\cmd.exe'
[*] فحص PE المصدر...
[*] إنشاء عملية جديدة في حالة معلقة...
[*] استرداد سياق الخيط الرئيسي...
|__ فشل GetThreadContext() (الخطأ: 998)
ليس لدي أي فكرة عن سبب نجاح هذا الحل البديل في الوقت الحالي. لقد حققت في الأمر قليلاً. يبدو أن هذا الخطأ ناتج عن عدم محاذاة بنية CONTEXT بشكل صحيح في الإصدار 64 بت. لاحظت أن حجم البنية غير صحيح أيضًا ([VBA] LenB(CONTEXT) != [C++] sizeof(CONTEXT)) بينما يكون صحيحًا في الإصدار 32 بت. لدي حل يعمل على إرجاع GetThreadContext() بشكل صحيح ولكنه يعطل بعض الأشياء الأخرى لاحقًا في التنفيذ.
تعديل 2019-12-15: تعريف بنية CONTEXT للإصدار 64 بت كان بالفعل غير صحيح، لكن إصلاح ذلك لم يصلح الخلل. لذا، قمت بتطبيق حل بديل للإصدار 64 بت. استبدلت وسيطة بنية CONTEXT الخاصة بالدالتين GetThreadContext() وSetThreadContext() بمصفوفة Byte بنفس الحجم.
تعديل 2019-12-17: أخيرًا وجدت المشكلة. افتراضي الأول كان صحيحًا، يجب أن تكون بنية CONTEXT محاذاة 16 بايت في الذاكرة. يمكن التحكم في ذلك في C باستخدام align(16) في تعريف البنية لكن لا يمكن التحكم فيه في VBA. لذلك، قد تفشل GetThreadContext() وSetThreadContext() "عشوائيًا". من ناحية أخرى، يبدو أن مصفوفات Byte دائمًا ما تكون محاذاة 16 بايت، ولهذا السبب هذا الحل البديل فعّال ولكن لا يوجد ضمان، ما لم أقوم بعمل هندسة عكسية لمفسر/مُجمّع VBA وأكتشف ذلك؟
LongPtr - النوع المعرّف من قبل المستخدم غير معرّفإذا تلقيت هذا الخطأ، فهذا يعني أنك تقوم بتشغيل الماكرو من إصدار قديم من Office (<=2007). تم تقديم نوع LongPtr في VBA7 (Office 2010) جنبًا إلى جنب مع دعم واجهة برمجة تطبيقات Windows 64 بت. إنه مفيد جدًا للتعامل مع المؤشرات دون القلق بشأن البنية (32 بت / 64 بت).
كحل بديل، يمكنك استبدال جميع تكرارات LongPtr بـ Long (32 بت) أو LongLong (64 بت). استخدم Ctrl+H في محرر النصوص المفضل لديك.
@hasherezade - تنفيذ كامل لـ RunPE (https://github.com/hasherezade/)
@Zer0Mem0ry - RunPE 32 بت مكتوب بلغة C++ (https://github.com/Zer0Mem0ry/RunPE)
@DidierStevens - تضمين PE في VBA
تم اختبار هذا الكود على المنصات التالية:
فيما يلي جدول التوافق بين بعض أنواع Win32 وVBA:
(*) LongPtr هو نوع "ديناميكي"، طوله 4 بايت في Office 32 بت و8 بايت في Office 64 بت. https://msdn.microsoft.com/fr-fr/library/office/ee691831(v=office.14).aspx
| C++ | VBA | البنية |
|---|
| BYTE | Byte | 32 و64 |
| WORD | Integer | 32 و64 |
| DWORD, ULONG, LONG | Long | 32 و64 |
| DWORD64 | LongLong | 64 |
| HANDLE | LongPtr(*) | 32 و64 |
| LPSTR | String | 32 و64 |
| LPBYTE | LongPtr(*) | 32 و64 |