
نظام توصيل حمولات يضمّن الحمولات في ملف أيقونة ملف قابل للتنفيذ!

Blenny هي أداة إثبات مفهوم (proof-of-concept) لإخفاء الحمولة في نظام ويندوز، إذ تُخفي بيانات الحمولة التنفيذية داخل أيقونة الملف التنفيذي. سُميت على اسم سمكة البليني ذات الأسنان السيفية، التي تحاكي سلوك ومظهر أسماك التنظيف لتفترس الأسماك غير المنتبهة.
لا أستطيع أن أتذكر بالضبط كيف جرت القصة، لكن أحد المخترقين ويدعى retr0id (@DavidBuchanan314) طرح فكرة إخفاء حمولة داخل أيقونة ملف تنفيذي. وبسبب العديد من الخصائص الغريبة لملفات PNG-- ولأن ملفات أيقونات ويندوز يمكن أن تحتوي على بيانات PNG بداخلها-- أدركت أن بإمكاني تنفيذ هذه الفكرة بسهولة تامة، مع أنها ستتطلب قدرًا من الجهد اليدوي. أنشأت مكتبة Facade-- وهي مكتبة غرضها الأساسي توليد الحمولات داخل ملفات PNG-- لهذا الغرض تحديدًا.
النتيجة النهائية هي ملف حمولة مدمج ونظام بناء يمكن استخدامه لتخصيص حمولة أساسية من نوع dropper/executer لنظام ويندوز.
يستخدم Blenny مكتبة Facade لإنشاء الحمولات من ملفات الأيقونات، لذا عند سحب المستودع، يجب تهيئة الوحدة الفرعية (والوحدات الفرعية التابعة لها):
$ git clone https://github.com/frank2/blenny.git
$ cd blenny
$ git submodule update --init --recursive
هذا كل ما تحتاجه لتهيئة المستودع من أجل البناء.
صُمم هذا المشروع حرفيًا مع وضع CMake في الاعتبار، لذا قبل بناء هذا المشروع، من المتطلبات المطلقة أن تحصل على CMake وتثبّته. غالبًا لن يعمل بدون ذلك (إلا إذا كنت حقًا مصممًا على ضبط جميع تعريفات CMake يدويًا بنفسك). ستحتاج أيضًا إلى نسخة من Visual Studio لترجمة المشروع.
يستخدم هذا المشروع العديد من متغيرات CMake لضبط عملية البناء. للحصول على حمولة عرض توضيحي أساسية، حيث سيظهر لك صديق خروف لطيف على سطح مكتبك، يمكنك تشغيل ما يلي في الدليل الرئيسي للمشروع:
$ mkdir build
$ cd build
$ cmake -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
$ ./Release/blenny.exe
افتراضيًا، يستخرج هذا الأمر ملفًا تنفيذيًا باسم "blenny.exe" من أيقونة الملف التنفيذي إلى دليل Temp الخاص بالمستخدم الحالي، ثم ينفذه. الحمولة الافتراضية هي DesktopPet الخاص بـ @AdrianoTiger، وهو إعادة بناء مخصصة لبرنامج esheep.exe الكلاسيكي من التسعينيات.
جميع المتغيرات التي تتحكم في ذلك قابلة للتخصيص! يجب تعيين متغير حمولة واحد (BLENNY_TRAILING_PAYLOAD أو BLENNY_TEXT_PAYLOAD أو BLENNY_ZTEXT_PAYLOAD أو BLENNY_STEGO_PAYLOAD). يتحكم هذا المتغير في كيفية إدخال الحمولة في الأيقونة في النهاية. اطلع على مكتبة Facade للحصول على تفاصيل حول هذه التقنيات. على سبيل المثال، لاستخدام حمولتك الخاصة، افعل ما يلي:
$ cmake -D BLENNY_PAYLOAD_FILE="path/to/your/payload.exe" -D BLENNY_ZTEXT_PAYLOAD=ON ../
$ cmake --build ./ --config Release
فيما يلي جدول بجميع خيارات الإعداد المختلفة التي يمكنك ضبطها، وقيمها الافتراضية، ودور كل منها.
| الخيار | النوع | القيمة الافتراضية | الغرض |
|---|
| BLENNY_PAYLOAD_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaultpayload.exe" | الحمولة المراد تضمينها في ملف الأيقونة. ملاحظة: نظرًا لأن تقنية التنفيذ النهائية هي ShellExecuteA، يمكن أن يكون هذا أي ملف يمكن تشغيله من مستكشف الملفات، مثل سكربت دفعي! |
| BLENNY_ICON_FILE | String | "${PROJECT_SOURCE_DIR}/res/defaulticon.ico" | الأيقونة المستخدمة للملف التنفيذي ولتضمين الحمولة فيها. ملاحظة: لن تعمل جميع الأيقونات! يجب أن يحتوي ملف الأيقونة على قسم PNG. افحص بيانات الأيقونة المستهدفة بمحرر سداسي عشري (hex editor) لمعرفة ما إذا كانت صورة PNG مضمنة! |
| BLENNY_TRAILING_PAYLOAD | Boolean | OFF | تفعيل حمولة بيانات زائدة في نهاية ملف PNG داخل الأيقونة. |
| BLENNY_TEXT_PAYLOAD | Boolean | OFF | تفعيل حمولة في قسم tEXt داخل ملف PNG الخاص بالأيقونة. |
| BLENNY_ZTEXT_PAYLOAD | Boolean | OFF | تفعيل حمولة في قسم zTXt داخل ملف PNG الخاص بالأيقونة، وهي حمولة tEXt مضغوطة. |
| BLENNY_STEGO_PAYLOAD | Boolean | OFF | تفعيل حمولة إخفائية (steganographic) داخل ملف PNG الخاص بالأيقونة. ملاحظة: نظرًا لأن حجم صورة معظم الأيقونات محدود بـ 256x256، فلن تناسب جميع الحمولات هذا الخيار! |
| BLENNY_PAYLOAD_KEYWORD | String | "blenny" | بالنسبة لحمولات النصوص وzTXt، يعيّن الكلمة المفتاحية التي تُوسِم بيانات الحمولة. |
| BLENNY_ADMIN | Boolean | OFF | يفعّل الكلمة المفتاحية runas لتشغيل الحمولة بصلاحيات المسؤول. |
| BLENNY_PATH | String | "%TEMP%" | المسار الذي تُخزَّن فيه الحمولة قبل تنفيذها. يتم توسيع متغيرات البيئة في وقت التنفيذ. |
| BLENNY_FILENAME | String | "blenny" | اسم الملف الذي تُعطاه الحمولة عند الاستخراج. |
| BLENNY_RANDOM_FILENAME | Boolean | OFF | تفعيل توليد اسم ملف عشوائي للحمولة عند الاستخراج. |
| BLENNY_RANDOM_FILENAME_LENGTH | Integer | 8 | ضبط طول اسم الملف العشوائي. |
| BLENNY_RANDOM_FILENAME_RANDOM_LENGTH | Boolean | OFF | إعطاء اسم الملف طولًا عشوائيًا عند الاستخراج. |
| BLENNY_PAYLOAD_ARGS | String | "" | الوسائط التي تُعطى لملف الحمولة عند التنفيذ. |
| BLENNY_FILE_ATTRIBUTES | Integer | 0x80 (ويعرف أيضًا بـ FILE_ATTRIBUTE_NORMAL) | سمات الملف التي تُعطى للملف عند إنشائه. |
| BLENNY_CMD_SHOW | Integer | 5 (ويعرف أيضًا بـ SW_SHOW) | الطريقة التي يُعرض بها ملف الحمولة عند التنفيذ. مثال آخر هو SW_HIDE، وقيمته 0. |