
ملعب مرن لتحديات CTF الخاصة بنظام أندرويد.
DroidGround
في تحديات CTF التقليدية، من الشائع إخفاء الأعلام (flags) في ملفات على النظام، مما يتطلب من المهاجمين استغلال الثغرات الأمنية لاسترجاعها. ومع ذلك، في عالم Android، لا يعمل هذا الأسلوب بشكل جيد. ملفات APK سهلة التنزيل والهندسة العكسية، لذا فإن وضع العلم على الجهاز يجعل استخراجه عادةً في غاية السهولة باستخدام التحليل الثابت أو حيل المحاكي. وهذا يحد بشدة من القدرة على إنشاء تحديات واقعية تركّز على وقت التشغيل (runtime).
صُمم DroidGround لحل هذه المشكلة.
إنه منصة مبنية خصيصًا لاستضافة تحديات اختراق أجهزة Android المحمولة في بيئة موجّهة وواقعية، حيث يكون المهاجمون مقيّدين بالقدر الكافي فقط بحيث يُطلب منهم حل التحديات بالطريقة المقصودة.
والأهم من ذلك، أن المشاركين قد يكونون محجوزين (jailed) داخل بيئة التطبيق. تتيح مرونة الأداة (modularity) تحديد ما إذا كان بإمكان المستخدم فتح قشرة (shell)، أو قراءة ملفات عشوائية، أو تثبيت أدوات جانبيًا (sideload) أم لا. يمكن إعداد كل شيء بحيث تكون الطريقة الوحيدة لاسترجاع العلم هي عبر فهم التطبيق واستغلاله بحد ذاته.
يتيح DroidGround مجموعة واسعة من تحديات Android التي يصعب تنفيذها في إعدادات CTF التقليدية. على سبيل المثال، في تحدٍّ لتنفيذ التعليمات البرمجية عن بُعد (RCE)، قد يحصل اللاعبون على ملف APK لتحليله محليًا. بعد اكتشاف ثغرة أمنية، يمكنهم تطوير سكربت Frida وتشغيله عبر DroidGround على الجهاز الهدف الحقيقي لاستخراج العلم من التخزين الداخلي. قد تتضمن أنواع التحديات الأخرى أنشطة مخفية، أو نوايا بث (broadcast intents) مخصصة، أو استغلال الخدمات، أو تحليلًا ديناميكيًا باستخدام أدوات محمّلة مسبقًا.
بفضل بث شاشة الجهاز في الوقت الفعلي، والتحكم الدقيق في الميزات، وتكامل Frida، وسكربتات الإعداد وإعادة التعيين القابلة للتخصيص، يمكّن DroidGround منظمي مسابقات CTF من بناء تحديات Android آمنة ومرنة وواقعية تتجاوز بكثير ما هو ممكن في العادة.
يوفر DroidGround مجموعة غنية من الميزات التي يتحكم بها الخادم.
scrcpy)جميع الميزات تقريبًا معيارية (modular) ومعرّفة عبر متغيرات البيئة، مما يضمن تحكمًا دقيقًا في نطاق التحدي.
يُعد ملف .env.sample الموجود في الدليل الجذري نقطة بداية جيدة. فيما يلي القائمة الكاملة لجميع متغيرات البيئة المدعومة حاليًا:
يبحث DROIDGROUND_IP_IFACE عن تطابق تام أولًا، ثم يعود (fallback) إلى أول واجهة تبدأ بـ القيمة المقدمة، نظرًا لأن Docker يسمح فقط بتحديد بادئة (prefix) واجهة الشبكة داخل الحاوية.
يغيّر استخدام متغير DROIDGROUND_NUM_TEAMS سلوك التطبيق قليلًا في الكواليس. إذا تم تعيين هذا الخيار:
يتيح ذلك مشاركة نفس نسخة (instance) DroidGround مع فرق متعددة في التحديات التي يمكن فيها تسريب العلم عبر طلب شبكة. وهذا يقلل بشكل كبير من تكاليف نشر DroidGround في مسابقات CTF.
علاوة على ذلك، إذا تم تعيين القيمة إلى -1، فسيتم تفعيل ما يُسمى بوضع الفرق غير المحدودة (Unlimited Teams). في هذا الوضع، سيتوفر زر لإنشاء رمز مميز للفريق جديد في صفحة نظرة عامة. يتم تجاهل جميع متغيرات DROIDGROUND_TEAM_TOKEN_<N> إذا تم تفعيل هذا الوضع.
فيما يلي بعض الطرق التي يمكن استخدام DroidGround بها:
تم توفير ملفات Docker Compose نموذجية في مجلد examples. تستخدم هذه الملفات تطبيقات من مستودع نماذج DroidGround، والذي سيتم تطويره تدريجيًا لعرض جميع الميزات الرئيسية. كما أنها نقطة بداية جيدة لفهم كيفية إعداد CTF خاص بك.
عند الإقلاع، يقوم DroidGround بما يلي:
adbsetup.sh في المجلد المحدد بواسطة DROIDGROUND_INIT_SCRIPTS_FOLDER إذا كان موجودًا. يمكن استخدام هذا السكربت لتثبيت التطبيق الهدف والقيام بكل ما يلزم لتهيئة الـ CTF (مثلًا، وضع العلم في موقع معروف)frida-server الصحيح بناءً على الإصدار المثبت ومعمارية الجهاز وتشغيلهDROIDGROUND_APP_PACKAGE_NAME). إذا لم يكن التطبيق مثبتًا، سينهي DroidGround عمله.فيما يلي نموذج لسكربت setup.sh:
#!/usr/bin/env bash
adb shell pm uninstall com.example.app # To do some cleanup
echo "Sleep for 2 seconds before installing app"
sleep 2
echo "Installing app..."
adb install ./flag.apk # The cwd is set to the "init.d" folder, so the apk file can be accessed with the relative path
echo "Install command executed"
بالنسبة للنشر في بيئة إنتاجية (في CTF حقيقية)، قد ترغب في تجهيز عدد محدد مسبقًا من نسخ DroidGround مسبقًا، أو قد ترغب في السماح للمستخدمين بإنشاء نسخ (مع تحديد حد أقصى أو ربما ربط كل فريق/مستخدم بنسخة محددة). لهذا السبب أضفنا أيضًا مثالًا بسيطًا لمنشئ النسخ (spawner).
بدلًا من ذلك، وكما ذُكر سابقًا، يمكنك إنشاء تحدي يمكن فيه تسريب العلم عبر طلب شبكة، والاستفادة من متغير البيئة DROIDGROUND_NUM_TEAMS لتجنب إنشاء نسخ متعددة (والتي قد تكون مكلفة). يوفر مجلد net-multi-step مثالًا جيدًا على كيفية تقديم هذا النوع من التحديات.
فيما يلي بعض الاقتراحات لإعداد مسابقة CTF الخاصة بك على Android:
أثناء اختبار الإعداد قبل الانتقال إلى الإنتاج، قد يكون من المفيد الحصول على سطح الهجوم (attack surface) للتطبيق الهدف. وهذا أمر لا ينبغي للاعبين رؤيته، لأن اكتشاف وتحليل سطح الهجوم هو جزء من مهمتهم!
لذلك، تم توفير نقطة نهاية (endpoint) GET يمكن الوصول إليها على /attackSurface، وهي محمية برمز مميز (token) (يجب استخدامه كقيمة لترويسة Authorization) يتم إنشاؤه عشوائيًا أثناء الإقلاع وطباعته في السجلات (وبالتالي لا يمكن الوصول إليه إلا من قبل مسؤولي الأنظمة).
إذا كنت تريد استخدام سكربتات Frida الخاصة بك في الوضع المحجوز، فكل ما تحتاجه هو ربط (bind-mount) المجلد الذي يحتوي عليها داخل حاوية Docker:
volumes:
- <Frida library folder>:/droidground/library
ملف library.json (مثل الملف الموجود في library) مطلوب لإرشاد التطبيق بقائمة السكربتات المتاحة.
تشغيله وإدارته لا ينبغي أن يكون صعبًا للغاية، ولكن قبل البدء يجب أن تكون لديك الأدوات التالية مثبتة:
frida (فقط إذا قمت بتفعيل Frida)node (إنه تطبيق Node، يجب أن يكون لديك!)adb (حسنًا، نعتمد عليه للتواصل مع الجهاز)بعد ذلك، يمكنك ببساطة تشغيل ما يلي:
git clone https://github.com/SECFORCE/droidground.git
cd droidground
# Install without running scripts
npm install --ignore-scripts
# Rebuild frida to get the bindings
npm rebuild frida
# Build companion app
npm run companion
# Get scrcpy
npm run scrcpy
بعد ذلك، كل ما عليك فعله هو تعيين متغيرات البيئة (env) ثم تشغيل npm run dev وستكون جاهزًا للانطلاق. استمتع بوضع التطوير!
طلبات السحب (Pull Requests) مرحب بها! يرجى فتح issue أولًا لمناقشة التغييرات الكبيرة. الأفكار الخاصة بسير عمل جديدة في CTF أو أنواع جديدة من التحديات محل تقدير خاص.
تم التطوير بواسطة Angelo Delicato @SECFORCE.
يعتمد جزء الخادم (server) بشكل كبير على العمل الرائع الذي أنجزه @yume-chan، وربما لم يكن هذا التطبيق ليوجد لولا عمله المذهل.
يعتمد التطبيق المصاحب (companion) بشكل كبير على خادم aya، الذي يعمل بنفس طريقة خادم scrcpy. يمكن العثور على مزيد من التفاصيل في README الخاص به.
تم إصدار DroidGround بموجب ترخيص GPL-3.0.
![]() | ![]() |
|---|
| نظرة عامة | بدء نشاط |
![]() | ![]() |
| وضع Frida المحجوز | وضع Frida الكامل |
![]() | ![]() |
| متصفح الملفات | مدير التطبيقات |
![]() | ![]() |
| الطرفية | السجلات |
| المتغير | الوصف | الافتراضي |
|---|
DROIDGROUND_BASE_PATH | مسار تطبيق الويب (مفيد للاستضافة على مسارات فرعية) | - |
DROIDGROUND_APP_PACKAGE_NAME | اسم الحزمة (package) للتطبيق الهدف | - |
DROIDGROUND_ADB_HOST | مضيف ADB | localhost |
DROIDGROUND_ADB_PORT | منفذ ADB | 5037 |
DROIDGROUND_ADB_SERIAL | الرقم التسلسلي لجهاز ADB المراد الاتصال به (اختياري) | - |
DROIDGROUND_DEVICE_TYPE | usb أو network | usb |
DROIDGROUND_DEVICE_HOST | عنوان IP لجهاز Android (adb) (وضع الشبكة فقط) | - |
DROIDGROUND_DEVICE_PORT | منفذ جهاز Android (adb) (وضع الشبكة فقط) | - |
DROIDGROUND_INIT_SCRIPTS_FOLDER | المجلد الذي يحتوي على setup.sh وreset.sh | /init.d |
DROIDGROUND_HOST | عنوان الربط | 0.0.0.0 |
DROIDGROUND_PORT | منفذ الربط | 4242 |
DROIDGROUND_RESTART_APP_DISABLED | تعطيل إعادة تشغيل التطبيق | false |
DROIDGROUND_APP_MANAGER_DISABLED | تعطيل مدير التطبيقات | false |
DROIDGROUND_BUG_REPORT_DISABLED | تعطيل تقرير الأخطاء (bugreport) | false |
DROIDGROUND_FILE_BROWSER_DISABLED | تعطيل متصفح الملفات | false |
DROIDGROUND_FRIDA_DISABLED | تعطيل دعم Frida | false |
DROIDGROUND_FRIDA_TYPE | jail أو full | jail |
DROIDGROUND_FRIDA_INJECTION | server أو gadget | server |
DROIDGROUND_LOGCAT_DISABLED | تعطيل logcat | false |
DROIDGROUND_REBOOT_ENABLED | تفعيل إعادة تشغيل الجهاز | false |
DROIDGROUND_SHUTDOWN_ENABLED | تفعيل إيقاف تشغيل الجهاز | false |
DROIDGROUND_START_ACTIVITY_DISABLED | تعطيل startActivity | false |
DROIDGROUND_START_RECEIVER_DISABLED | تعطيل البث (broadcast) | false |
DROIDGROUND_START_SERVICE_DISABLED | تعطيل startService | false |
DROIDGROUND_TERMINAL_DISABLED | تعطيل الطرفية | false |
DROIDGROUND_RESET_DISABLED | تعطيل إعادة التعيين | false |
DROIDGROUND_EXPLOIT_APP_DURATION | المدة (بالثواني) التي سيظل فيها تطبيق الاستغلال نشطًا | 10 |
DROIDGROUND_EXPLOIT_APP_MAX_SIZE | الحد الأقصى لحجم تطبيق الاستغلال (بالميجابايت MB) | 50 |
DROIDGROUND_NUM_TEAMS | عدد الفرق التي تلعب في نفس الوقت | - |
DROIDGROUND_TEAM_TOKEN_<N> | الرمز المميز (token) للفريق رقم n. يُنشأ تلقائيًا إذا كان مفقودًا | - |
DROIDGROUND_IP_STATIC | عنوان IP الثابت الذي سيتم عرضه. له الأولوية على DROIDGROUND_IP_IFACE | - |
DROIDGROUND_IP_IFACE | واجهة الشبكة الخاصة بعنوان IP المعروض | - |
DROIDGROUND_LOGO_LINK | تعيين رابط النقر على الشعار اختياريًا (مثلًا، الصفحة الرئيسية لمسابقة CTF الخاصة بك) | - |