
مجموعة أدوات CobaltStrike لكتابة الملفات التي يُنتجها Beacon إلى الذاكرة بدلاً من القرص
MemFiles عبارة عن مجموعة أدوات (toolkit) لـ CobaltStrike تُمكّن المشغلين (Operators) من كتابة الملفات التي تُنتجها عملية Beacon في الذاكرة، بدلاً من كتابتها على قرص النظام المستهدف. تم اختباره بنجاح على Windows 7 و10 و11؛ ويجب أن تعمل إصدارات الخوادم المقابلة دون أي مشاكل. يقتصر MemFiles على Beacons ذات بنية x64.
يحقق ذلك عن طريق ربط (Hooking) عدة NtAPI مختلفة داخل NTDLL.dll وإعادة توجيه الاستدعاءات إلى تلك الواجهات البرمجية إلى دوال تم حقنها في مساحة ذاكرة عملية Beacon.
يفترض MemFiles وجود نسخة نظيفة/غير مربوطة (unhooked) من NTDLL في عملية Beacon. لا توجد أي ضمانات بشأن جدوى MemFiles في عملية Beacon حيث لا تزال خطافات (hooks) EDR موجودة. قم بإصلاح/تحديث NTDLL قبل استخدام MemFiles!
يتم تعريف دليل "خاص" غير موجود ضمن مجموعة أدوات MemFiles؛ أي ملفات تُكتب إلى هذا الدليل الخاص سيتم التقاطها بواسطة MemFiles وكتابتها في الذاكرة حيث يمكن تنزيلها لاحقاً إلى Teamserver.
MemFiles متوافق مع معظم (وليس كل) الأدوات التي تعمل داخل عملية Beacon ويمكن توجيهها لكتابة مخرجاتها إلى دليل محدد. لا يتطلب صلاحيات مرتفعة للعمل.
يتضمن ذلك:
-BOF's
-تجميعات .NET التي تُشغَّل سطرياً (inline) باستخدام شيء مثل inline-executeAssembly
-ملفات PE التي تُشغَّل سطرياً باستخدام شيء مثل Inline-Execute-PE
كل هذه متوافقة لأنها تعمل داخل عملية Beacon، حيث تم ربط NtAPI ذات الصلة.
لا يعمل MemFiles مع أشياء مثل:
-execute-assembly
-shell
-run
لا شيء من هذه متوافق لأنها جميعاً تُنشئ عمليات أخرى لم يتم ربط NtAPI الخاصة بها.
تم اختبار MemFiles بنجاح مع أدوات مثل Rubeus و SharpHound و Procdump و Powershell عندما يتم تشغيلها داخل عملية Beacon.

استنسخ المستودع وعدّل اختيارياً متغير hookdir المعرّف في السطر 56 في كل من /PIC/Source/NtCreateFile.c و /PIC/Source/NtOpenFile.c. هذا المتغير هو الدليل "الخاص" الذي يشير إلى MemFiles بأنه يجب أن يعترض الملف الذي يتم إنشاؤه. يتم تعيين متغير hookdir على "redteam" افتراضياً. تأكد من أن هذا المتغير ليس دليلاً حقيقياً على النظام المستهدف، وأنه نفسه في كلا الملفين!

شغّل الأمر 'make all' لتجميع كل من BOF's اللازمة ودوال PIC.
قم بتحميل MemFiles.cna في عميل CobaltStrike. تأكد من أن الدليل الذي يعمل منه CobaltStrike قابل للكتابة من قبل المستخدم الخاص بك؛ يقوم MemFiles بإنشاء ملف نصي هناك (memfiles.txt) لضمان توفر البيانات المطلوبة لعمل MemFiles.
يمكن تكوين MemFiles ليتم تثبيته في كل Beacon جديد يتصل بـ Teamserver؛ ويتم ذلك باستخدام عنصر القائمة MemFiles->Config. افتراضياً، لا يقوم MemFiles بالتثبيت التلقائي في Beacons الجديدة. لاحظ أن هذا إعداد عام؛ إذا كان هناك عميلان متصلان بـ Teamserver وكلاهما يحمّل MemFiles.cna، وإذا قام العميل A بتبديل إعداد "Install on beacon initial"، فسيتم تطبيق التغيير أيضاً على العميل B!

يتكون MemFiles من 4 أوامر موجهة للهدف تقوم بتشغيل BOF's وأمر داخلي واحد يتلاعب بهيكل بيانات المشروع.
موجهة للهدف:
هيكل البيانات الداخلي:
meminit مسؤول عن تثبيت MemFiles في عملية Beacon.
قائمة NtAPI التي يربطها MemFiles هي كما يلي:
ينفذ meminit الإجراءات الرئيسية التالية:
يُستخدم memlist لعرض جميع الملفات المخزنة حالياً في الذاكرة بواسطة MemFiles لـ Beacon معين.

يتم عرض عدة حقول، وأكثرها صلة وأهمية للمستخدم هي اسم الملف وطول البيانات المخزنة.
يُستخدم memfetch لاسترجاع الملفات المخزنة في الذاكرة بواسطة MemFiles لـ Beacon معين.
افتراضياً، سيقوم memfetch باسترجاع أي وجميع الملفات المخزنة بواسطة MemFiles والتي تم إغلاق "مقبضها" (handle). تم اتخاذ هذا القرار التصميمي لتجنب أي مشكلات تتعلق بمحاولة تنزيل ملف لم ينتهِ برنامج/تطبيق من الكتابة إليه بعد.
هذا يعني أنه إذا فشل برنامج/تطبيق في إغلاق المقبض الذي فتحه على الملف، فلن يتم تنزيل الملف بواسطة memfetch.
يمكن التخفيف من ذلك باستخدام وسيط "force" مع memfetch، أي 'memfetch force' لاسترجاع جميع الملفات من الذاكرة بغض النظر عن حالة مقبضها.
الملفات التي يسترجعها memfetch من الذاكرة تُرسل مرة أخرى إلى Teamserver كتنزيل ويمكن مزامنتها من Teamserver إلى العميل عبر تبويب Downloads في CobaltStrike.
بمجرد تنزيل ملف بواسطة Teamserver، يتم مسحه من الذاكرة في عملية Beacon وتتم إزالة إدخاله كما يظهر عبر memlist.
memclean مسؤول عن التنظيف وإزالة MemFiles من عملية Beacon.
حالة الاستخدام القياسية لـ MemFiles تتضمن تثبيته وتركه مثبتاً طوال عمر Beacon؛ ومع ذلك، إذا أراد المرء استخدام MemFiles بالتزامن مع أداة لالتقاط واسترجاع مخرجات الملفات، ثم إلغاء تثبيت MemFiles بحيث لا تبقى آثاره في الذاكرة، يمكن استخدام memclean لإعادة عملية Beacon إلى حالتها الأصلية قبل تشغيل meminit.
يتضمن ذلك:
لاحظ أنه قبل أن ينفذ memclean هذه الإجراءات، سيقوم بتنزيل أي ملفات مخزنة في الذاكرة بواسطة MemFiles قسراً. إذا كان المرء يعتزم استخدام MemFiles مع أداة واحدة ثم إزالته، يمكنه تخطي استخدام memfetch واستخدام memclean فقط لاسترجاع الملفات وإزالة MemFiles من عملية Beacon دفعة واحدة.
يُستخدم memtable لعرض وتتبع المعلومات المتعلقة بـ Beacons التي تم تثبيت MemFiles فيها حالياً. كما يعرض معلومات التكوين العامة.
كل عميل CobaltStrike لديه memtable الخاص به؛ يبذل MemFiles جهوداً كبيرة لضمان تزامن بياناته بين جميع عملاء CobaltStrike المتصلين بحيث يمكن استخدام MemFiles من قبل جميع المشغلين في جميع Beacons. لمزيد من المعلومات حول هذا، راجع "اعتبارات التصميم والتعليقات".

قم بتهيئة MemFiles في Beacon باستخدام أمر meminit. يمكن تكوين ذلك ليحدث تلقائياً عن طريق تبديل الخيار في قائمة MemFiles->Config.

مع تهيئة MemFiles، يمكنك الآن استخدام أدواتك المفضلة لكتابة الملفات في الذاكرة! الطريقة التي تفعل بها ذلك ستعتمد على الأداة المحددة؛ بعضها يسمح لك بتحديد دليل لإخراج ملفات متعددة إليه، بينما يسمح البعض الآخر بتحديد مسار مطلق لملف واحد يتم إنشاؤه بواسطة الأداة. يمكن رؤية بعض الأمثلة أدناه:
هنا نحدد أن SharpHound يجب أن يخرج جميع الملفات المنتجة إلى دليل c:\redteam\ (دليل MemFiles الخاص بنا) وأنه لا يجب ضغط الملفات؛ لا يدعم MemFiles قراءة البرامج للملفات من الذاكرة، بل كتابتها فقط، لذا فإن وظيفة الضغط في SharpHound لا تعمل.

يتم استخدام أمر "dump" مع Rubeus ونوجهه لإرسال جميع مخرجات وحدة التحكم إلى ملف (يقع في دليلنا الخاص)