
Ivy هو إطار عمل لإنشاء الحمولات (payloads) يهدف إلى تنفيذ أكواد مصدرية عشوائية بلغة VBA (وحدات الماكرو) مباشرةً في الذاكرة. يحقّق مُحمّل Ivy ذلك من خلال الاستفادة من الوصول البرمجي في بيئة كائنات VBA لتحميل الشيل كود وفك تشفيره وتنفيذه.
لعرض أحدث إصدار من Ivy أو تقديم مشكلة، راجع https://github.com/Tylous/Ivy.
إذا كنت تريد معرفة المزيد عن التقنيات المستخدمة في هذا الإطار وكذلك الإجراءات الدفاعية للمساعدة في الدفاع ضده، يرجى إلقاء نظرة على المقال.
Ivy هو إطار لإنشاء الحمولات لتنفيذ كود مصدر VBA (ماكرو) تعسفي في الذاكرة. يقوم محمل Ivy بذلك عن طريق إساءة استخدام الوصول البرمجي في بيئة كائن VBA لتحميل وفك تشفير وتنفيذ الشيل كود. هذه التقنية هي أقرب ما يمكن إلى كونها حقيقية بدون ملفات، حيث أن معظم الهجمات غير الملفية هذه الأيام تتطلب نوعًا ما من الملفات التي يتم إسقاطها على القرص، ونتيجة لذلك تتجاوز القواعد القياسية القائمة على التوقيع للكشف عن كود VBA. تحتوي حمولات VBA النموذجية على الخصائص التالية:
من خلال العمل في الذاكرة فقط، تجعل هذه الخصائص السلوكية من الصعب اكتشافها بواسطة أنظمة EDR.
يتم تشفير محملات Ivy باستخدام تشفير RC4 (يسبب تشفير AES الكثير من التضخم ويستغرق وقتًا طويلاً لفك تشفيره في VBA) ثم يتم تقسيمها إلى سلاسل منفصلة، مما يمنع أي صندوق رمل من التعرف على هذه السلاسل كسلاسل مشفرة يجب فحصها. يمنع هذا أيضًا أي آلية فك ترميز من التعرف على هذه الحمولات على أنها شيء سوى أحرف غير مرغوب فيها.
يقوم محمل Ivy أولاً بإجراء استعلام في السجل لتمكين "Trust access to the VBA project object mode". يتم تخزين قيمة مفتاح التسجيل هذه في وضع المستخدم مما يسمح للمستخدم بتعديل القيمة دون الحاجة إلى أي صلاحيات مرتفعة. يتم تعيين قيمة التسجيل من صفر إلى 1؛ إذا كان مفتاح التسجيل غير موجود، سيقوم Ivy بإنشائه بقيمة "1". مع تمكين هذه القيمة، يُسمح بالوصول البرمجي إلى بيئة كائن VBA من عملية مختلفة.
بمجرد القيام بذلك، سيقوم المحمل بعد ذلك بتشغيل عملية Excel مخفية وتحميل السلاسل المشفرة في دالة VBA. يتم ذلك باستخدام ActiveX لمحاكاة إجراءات واجهة المستخدم الرسومية للقيام بنفس المهمة. يساعد هذا في تجاوز الكثير من الضوابط التقليدية الموضوعة لمراقبة التنفيذ. نتيجة لذلك، يتم نقل دالة فك التشفير والشيل كود من مخزن مؤقت إلى آخر، دون لمس القرص أبدًا. أخيرًا، يستخدم المحمل استدعاءات command-GUI وينفذ دالة التشغيل، والتي تحاكي فعل النقر على زر تشغيل الماكرو في لوحة واجهة المستخدم الرسومية لـ VBA، وبدء دالة فك التشفير، تليها التنفيذ الفعلي للشيل كود.
مهم
يجب أن يكون Microsoft Office مثبتًا ومفعلًا على نقطة النهاية المستهدفة لكي يعمل، لأن Ivy يعتمد على إساءة استخدام الوصول البرمجي إلى بيئة VBA الخاصة بـ Microsoft Office.
يسمح هذا لـ Ivy باستخدام استدعاءات نظام منخفضة المستوى لبناء نسخته الخاصة من دالة Windows WriteProcessMemory من خلال الإشارة إلى عنوان الذاكرة المباشر وقيم السجلات بشكل غير مباشر. يمكن لـ Ivy الكتابة فوق أجزاء من الذاكرة غير قابلة للكتابة دون استدعاء أي من وظائف API لتغيير الذاكرة. يتم ذلك بسبب ميزة في WriteProcessMemory التي تغير مؤقتًا صلاحيات منطقة الذاكرة لتكون قابلة للكتابة (إذا كان لديك صلاحيات كافية، وهو ما نملكه لأننا نملك العملية). يقوم بكتابة القيمة واستعادة الصلاحيات الأصلية دون استدعاء دالة VirtualProtect، بدلاً من ذلك يستدعي تلقائيًا syscall المرتبط (NtProtectVirtualMemory).
لا تستخدم Ivy نسختها الخاصة من NtWriteVirtualMemory لأن هذه العملية لتغيير صلاحيات الذاكرة مؤقتًا لن تحدث، مما يعني أن حماية عنوان الذاكرة المحدد لن يتم تعديلها وسيفشل التنفيذ. هذه "ميزة" أصدرتها Microsoft لجعل المصححات أكثر استقرارًا. حيث أن المصححات ترغب في تعديل الذاكرة بسرعة، يمكنها ببساطة تعديل قسم دون الحاجة إلى أداء مهام متعددة. (راجع devblogs.microsoft.com للحصول على معلومات)
دعنا نلقي نظرة على سلسلة الأحداث التي سيراها EDR:
بمجرد التخلص من جميع خطافات EDR، يقوم المحمل بعد ذلك بتنفيذ إجراءه الطبيعي لإنشاء جلسة عن بعد.
يعالج Ivy هذا عن طريق إلغاء ربط ملفات DLL النظام الشائعة التي تربطها EDR، وتشمل هذه:
عند استخدام unhook مع نوع حمولة Inject، سيقوم محمل Ivy أولاً بإلغاء ربط عملية Office وإزالة EDR منها ثم إزالة الخطافات في العملية المحقونة. يضمن هذا أن كلا العمليتين خاليتان من الخطافات، مما يمنع أي تتبع من العملية الأم والتابعة من الإرسال إلى EDR.
باستخدام نفس التقنية لإلغاء الربط، يمكن لـ Ivy تصحيح وظائف ETW، مما يمنع أي حدث من التوليد بواسطة العملية. يستخدم ETW استدعاءات نظام مدمجة لتوليد هذا التتبع. نظرًا لأن ETW ميزة أصلية مدمجة في Windows، لا تحتاج منتجات الأمان إلى "ربط" استدعاءات نظام ETW للحصول على المعلومات. نتيجة لذلك، لمنع ETW، يقوم Ivy بتصحيح العديد من استدعاءات نظام ETW، وتطهير السجلات وإعادة تدفق التنفيذ إلى التعليمات التالية. أصبح تصحيح ETW الآن افتراضيًا في جميع المحملات، إذا كنت ترغب في عدم تصحيح ETW فاستخدم خيار سطر الأوامر -noetw لتعطيله في المحمل الخاص بك.
تم تطوير Ivy باستخدام Go.
الخطوة الأولى كالعادة هي استنساخ المستودع. قبل تجميع Ivy، ستحتاج إلى تثبيت التبعيات. لتثبيتها، قم بتشغيل الأوامر التالية:
go get github.com/fatih/color
go get github.com/KyleBanks/XOREncryption/Go
ثم قم ببنائه
go build Ivy.go
$ ./Ivy -h
___ ___ ___ ___ ___
|\ \ |\ \ / /||\ \ / /|
\ \ \\ \ \ / / /\ \ \/ / /
\ \ \\ \ \/ / / \ \ / /
\ \ \\ \ / / \/ / /
\ \__\\ \__/ / __/ / /
\|__| \|__|/ |\___/ /
\|___|/
(@Tyl0us)
The suffering. The pain. Can't you hear them?
Their cries for mercy?