العودة إلى التحديثات
New releaseJul 28, 2026

droidground v1.0.11

ملعب مرن لتحديات CTF على نظام Android.

مشاركة


droidground

DroidGround


الموقع الإلكتروني | عرض توضيحي

في تحديات CTF التقليدية، من الشائع إخفاء الأعلام (flags) في ملفات على النظام، مما يتطلب من المهاجمين استغلال الثغرات لاسترجاعها. ومع ذلك، في عالم Android، لا ينجح هذا النهج بشكل جيد. فملفات APK قابلة للتنزيل والعكس بسهولة، لذا فإن وضع علم على الجهاز عادةً ما يجعل استخراجه أمراً تافهاً باستخدام التحليل الساكن أو حيل المحاكي. وهذا يحد بشدة من القدرة على إنشاء تحديات واقعية تركز على وقت التشغيل.

صُمم DroidGround لحل هذه المشكلة.

إنها منصة مبنية خصيصاً لاستضافة تحديات اختراق Android للهواتف المحمولة في بيئة مُتحكَّم بها وواقعية، حيث يكون المهاجمون مقيَّدين بالقدر الكافي فقط ليتطلب منهم حل التحديات بالطريقة المقصودة.

والأهم من ذلك، قد يكون المشاركون محبوسين داخل بيئة التطبيق. تتيح معيارية الأداة تحديد ما إذا كان يمكن للمستخدم فتح shell، أو قراءة ملفات عشوائية، أو تحميل أدوات جانبية. يمكن إعداد كل شيء بحيث تكون الطريقة الوحيدة لاسترجاع العلم هي فهم التطبيق نفسه واستغلاله.

📋 جدول المحتويات

🧭 نظرة عامة

تُمكّن DroidGround مجموعة واسعة من تحديات Android التي يصعب تنفيذها بطريقة أخرى في إعدادات CTF التقليدية. على سبيل المثال، في تحدٍّ لتنفيذ التعليمات عن بُعد (RCE)، قد يتلقى اللاعبون ملف APK للتحليل المحلي. بعد اكتشاف ثغرة، يمكنهم تطوير سكربت Frida وتشغيله عبر DroidGround على الجهاز الهدف الحقيقي لاستخراج العلم من وحدة التخزين الداخلية. يمكن أن تتضمن أنواع التحديات الأخرى أنشطة مخفية، أو نوايا بث مخصصة، أو استغلال الخدمات، أو التحليل الديناميكي باستخدام أدوات محمّلة مسبقاً.

مع بث الجهاز في الوقت الفعلي، والتحكم الدقيق في الميزات، وتكامل Frida، وسكربتات الإعداد وإعادة الضبط القابلة للتخصيص، تُمكّن DroidGround منظّمي CTF من بناء تحديات Android آمنة ومرنة وواقعية تتجاوز بكثير ما هو ممكن عادةً.

✨ الميزات

توفر DroidGround مجموعة غنية من الميزات التي يتحكم بها الخادم.

  • شاشة الجهاز في الوقت الفعلي (عبر scrcpy)، مع تحكم اختياري بالفأرة واللمس ولوحة المفاتيح
  • إعادة ضبط حالة التحدي
  • إعادة تشغيل التطبيق / بدء النشاط / بدء الخدمة
  • إرسال نية بث (Broadcast Intent)
  • إيقاف تشغيل / إعادة تشغيل الجهاز
  • تنزيل تقرير الأخطاء (bugreportz)
  • سكربتات Frida
    • التشغيل من مكتبة محمّلة مسبقاً (الوضع المقيّد)
    • تشغيل سكربتات عشوائية (الوضع الكامل)
  • متصفح الملفات
  • الوصول إلى الطرفية
  • إدارة APK
  • عارض Logcat
  • خادم الاستغلال (إذا كان وضع الفرق مُفعّلاً)

جميع الميزات تقريباً معيارية ومُعرَّفة عبر متغيرات البيئة، مما يضمن تحكماً دقيقاً في نطاق التحدي.

📸 لقطات الشاشة

Screenshot OverviewScreenshot Start Activity
نظرة عامةبدء النشاط
Screenshot Frida Jailed ModeScreenshot Frida Full Mode
وضع Frida المقيّدوضع Frida الكامل
Screenshot File BrowserScreenshot App Manager
متصفح الملفاتمدير التطبيقات
Screenshot TerminalScreenshot Logs
الطرفيةالسجلات

⚙️ الإعدادات

يُعد ملف .env.sample في الدليل الجذر نقطة بداية جيدة. هذه هي القائمة الكاملة لجميع متغيرات البيئة المدعومة حالياً:

المتغيرالوصفالافتراضي
DROIDGROUND_BASE_PATHمسار تطبيق الويب (مفيد للاستضافة على مسارات فرعية)-
DROIDGROUND_APP_PACKAGE_NAMEاسم حزمة التطبيق الهدف-
DROIDGROUND_ADB_HOSTمضيف ADBlocalhost
DROIDGROUND_ADB_PORTمنفذ ADB5037
DROIDGROUND_ADB_SERIALالرقم التسلسلي الاختياري لجهاز ADB للاتصال به-
DROIDGROUND_DEVICE_TYPEusb أو networkusb
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تعطيل تقرير الأخطاءfalse
DROIDGROUND_FILE_BROWSER_DISABLEDتعطيل متصفح الملفاتfalse
DROIDGROUND_FRIDA_DISABLEDتعطيل دعم Fridafalse
DROIDGROUND_FRIDA_TYPEjail أو fulljail
DROIDGROUND_FRIDA_INJECTIONserver أو gadgetserver
DROIDGROUND_LOGCAT_DISABLEDتعطيل logcatfalse
DROIDGROUND_REBOOT_ENABLEDتفعيل إعادة التشغيلfalse
DROIDGROUND_SHUTDOWN_ENABLEDتفعيل إيقاف التشغيلfalse
DROIDGROUND_START_ACTIVITY_DISABLEDتعطيل startActivityfalse
DROIDGROUND_START_RECEIVER_DISABLEDتعطيل البثfalse
DROIDGROUND_START_SERVICE_DISABLEDتعطيل startServicefalse
DROIDGROUND_TERMINAL_DISABLEDتعطيل الطرفيةfalse
DROIDGROUND_RESET_DISABLEDتعطيل إعادة الضبطfalse
DROIDGROUND_SCRCPY_CONTROL_ENABLEDتفعيل إدخال الفأرة واللمس ولوحة المفاتيح عبر شاشة الجهازfalse
DROIDGROUND_SCRCPY_MAX_SIZEالحد الأقصى لأبعاد الفيديو بالبكسل؛ 0 يحافظ على دقة الجهاز الكاملة1280
DROIDGROUND_SCRCPY_MAX_FPSالحد الأقصى لمعدل إطارات الفيديو؛ 0 يتركه بلا حد60
DROIDGROUND_SCRCPY_VIDEO_BIT_RATEمعدل بت الفيديو بالبت في الثانية4000000
DROIDGROUND_EXPLOIT_APP_DURATIONالمدة (بالثواني) التي سيكون فيها تطبيق الاستغلال نشطاً10
DROIDGROUND_EXPLOIT_APP_MAX_SIZEالحد الأقصى لحجم (بالميجابايت) تطبيق الاستغلال50
DROIDGROUND_NUM_TEAMSعدد الفرق التي تلعب في وقت واحد-
DROIDGROUND_TEAM_TOKEN_<N>رمز الفريق رقم n. يُولَّد تلقائياً إذا كان مفقوداً-
DROIDGROUND_IP_STATICعنوان IP الثابت المراد عرضه. له الأولوية على DROIDGROUND_IP_IFACE-
DROIDGROUND_IP_IFACEواجهة الشبكة لعنوان IP المعروض-
DROIDGROUND_LOGO_LINKتعيين رابط النقر على الشعار اختيارياً (مثل صفحة CTF الرئيسية)-

اضبط DROIDGROUND_SCRCPY_CONTROL_ENABLED=true وأعد تشغيل DroidGround لجعل شاشة الجهاز تفاعلية. انقر أو المس الشاشة لتركيزها، ثم انقر، أو اسحب، أو مرّر، أو استخدم نقاط لمس متعددة، أو مرّر بعجلة الفأرة، أو اكتب. انقر بزر الفأرة الأيمن أو اضغط Escape للرجوع في Android. ينقل Tab و Shift+Tab التركيز خارج الشاشة. الإدخال مشترك بين كل من يشاهد الجهاز، بما في ذلك في وضع الفرق. يبقى الافتراضي شاشة للعرض فقط. يستخدم إدخال النص حقن مفاتيح Android الخاص بـ scrcpy، لذا يعتمد دعم الأحرف على تعيين لوحة مفاتيح الجهاز.

يبحث DROIDGROUND_IP_IFACE عن تطابق تام أولاً ثم يتراجع إلى أول واجهة تبدأ بـ القيمة المقدمة لأن Docker يسمح فقط بتحديد بادئة واجهة الشبكة داخل الحاوية.

يستخدم بث الشاشة افتراضياً حداً أقصى للأبعاد يبلغ 1280 بكسل، وحتى 60 إطاراً في الثانية، و4 ميجابت في الثانية لتقليل عمل الترميز والشبكة والمتصفح. هذا يقايض بعض التفاصيل الدقيقة مقابل الاستجابة في عرض الجهاز المدمج. اضبط DROIDGROUND_SCRCPY_MAX_SIZE=0 و DROIDGROUND_SCRCPY_VIDEO_BIT_RATE=10000000 لاستعادة إعدادات الجودة السابقة بالدقة الكاملة. بالنسبة للاتصالات أو المتصفحات الأبطأ، جرّب حداً أقصى للحجم 1024، و30 إطاراً في الثانية، و2000000 بت في الثانية. أعد تشغيل DroidGround بعد تغيير هذه الإعدادات.

يستخدم المتصفح WebCodecs عند توفره ويتراجع إلى فاكّ ترميز H.264 البرمجي بخلاف ذلك. يتطلب WebCodecs سياقاً آمناً: استخدم HTTPS للنشر عن بُعد (localhost يعمل أيضاً). يستخدم HTTP العادي على IP أو اسم مضيف بعيد فك الترميز البرمجي. يتخطى المشاهدون البطيئون إلى إطار مفتاحي جديد بدلاً من تراكم تراكم فيديو؛ قد يستغرق الانضمام أو الاستعادة حوالي فاصل إطار مفتاحي واحد (ثانية واحدة). راجع مواصفات WebCodecs وتوثيق فيديو scrcpy لإعدادات المتصفح والفيديو الأساسية.

يغيّر استخدام متغير DROIDGROUND_NUM_TEAMS سلوك التطبيق قليلاً تحت الغطاء. إذا تم تعيين هذا الخيار:

  1. يتم تفعيل ميزة خادم الاستغلال، مما يسمح لكل فريق باستخدام خادم الاستغلال الخاص به (البسيط جداً) عبر رمز الفريق الخاص به.
  2. سيكون رمز الفريق مطلوباً لتثبيت وتشغيل تطبيقات الاستغلال. سيُربط كل تطبيق مثبَّت بفريق ولن يتمكن الفرق الأخرى من تشغيله.

يتيح ذلك مشاركة نفس نسخة DroidGround مع فرق متعددة في التحديات التي يمكن فيها تسريب العلم عبر طلب شبكة. هذا يقلل بشكل هائل من تكاليف نشر DroidGround لمسابقات CTF.

علاوة على ذلك، إذا تم تعيين القيمة إلى -1 فسيتم تفعيل ما يُسمى وضع الفرق غير المحدودة. في هذا الوضع سيكون هناك زر لتوليد رمز فريق جديد متاح في صفحة نظرة عامة. يتم تجاهل جميع متغيرات DROIDGROUND_TEAM_TOKEN_<N> إذا تم تفعيل هذا الوضع.

🧩 حالات الاستخدام

فيما يلي بعض الطرق التي يمكن بها استخدام DroidGround:

  1. نشاط مخفي: ابحث عن نشاط غير مكشوف وشغّله لرؤية العلم (يحتوي تطبيق اللاعب على علم وهمي).
  2. RCE: التطبيق عرضة لتنفيذ التعليمات عن بُعد والعلم مخزّن على الجهاز.
  3. أدوات Frida: حمّل دالة بشكل زائد واستخرج العلم من الذاكرة الخاصة باستخدام سكربت.

⚙️ الاستخدام

يتم توفير بعض ملفات Docker Compose النموذجية في مجلد examples. وهي تستخدم تطبيقات من مستودع عينات DroidGround الذي سيتم تحسينه تدريجياً لعرض جميع الميزات الرئيسية. كما أنها نقطة بداية جيدة لفهم كيفية إعداد CTF الخاص بك.

عند الإقلاع يقوم DroidGround بما يلي:

  1. إعداد الاتصال مع adb
  2. تشغيل setup.sh في المجلد المحدد بواسطة DROIDGROUND_INIT_SCRIPTS_FOLDER إذا كان موجوداً. يمكن استخدام هذا السكربت لتثبيت التطبيق الهدف وفعل كل ما يلزم لتهيئة CTF (مثل وضع العلم في موقع معروف)
  3. (إذا كانت Frida مفعّلة) تنزيل frida-server الصحيح بناءً على الإصدار المثبَّت ومعمارية الجهاز وتشغيله
  4. تشغيل التطبيق الهدف (المحدد عبر DROIDGROUND_APP_PACKAGE_NAME). إذا لم يكن التطبيق مثبَّتاً فسيخرج DroidGround.
  5. إعداد REST APIs وخوادم WebSocket وبث الشاشة

فيما يلي نموذج لسكربت 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:

  • كن حذراً عند تفعيل وضع Frida الكامل، سيكون للاعب تحكم كامل في الجهاز (لهذا السبب صنعنا وضع Frida المقيّد كما هو مفصل في مكتبة Frida).
  • كن حذراً عند تفعيل الطرفية، سيكون للاعب تحكم كامل في الجهاز.
  • كن حذراً عند تفعيل ميزة إيقاف التشغيل.
  • إذا كنت تخطط لجعل العلم مرئياً مباشرة في واجهة المستخدم فقد ترغب في إيجاد طريقة لإنشاء نسخ مختلفة (واحدة لكل فريق/لاعب)

أثناء اختبار الإعداد قبل الانتقال إلى الإنتاج قد يكون من المفيد الحصول على سطح الهجوم للتطبيق الهدف. هذا شيء لا ينبغي للاعبين رؤيته لأنه جزء من مهمتهم اكتشاف وتحليل سطح الهجوم!

لذلك، يتم توفير نقطة نهاية GET يمكن الوصول إليها على /attackSurface ومحمية برمز (يجب استخدامه كقيمة لترويسة Authorization) يتم توليده عشوائياً أثناء الإقلاع وطباعته في السجلات (وبالتالي يمكن الوصول إليه فقط من قبل مسؤولي النظام).

إذا كنت ترغب في استخدام سكربتات Frida الخاصة بك في الوضع المقيّد، فأنت تحتاج فقط إلى ربط المجلد الذي يحتوي عليها داخل حاوية Docker:

volumes:
  - <Frida library folder>:/droidground/library

مطلوب ملف library.json (مثل الموجود في library) لإرشاد التطبيق إلى قائمة السكربتات المتاحة.

🛠 التطوير

لا ينبغي أن يكون تشغيله صعباً للغاية، لكن قبل البدء يجب أن تكون الأدوات التالية مثبَّتة لديك:

  • frida (فقط إذا فعّلت Frida)
  • node (إنه تطبيق Node، تحتاج إلى تثبيته!)
  • adb (حسناً، نحن نعتمد عليه للتحدث مع الجهاز)
  • JDK (تحتاجه لبناء التطبيق المرافق)

بعد ذلك يمكنك ببساطة تشغيل ما يلي:

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 وستكون جاهزاً للانطلاق. وضع تطوير سعيد!

🤝 المساهمة

طلبات السحب مرحّب بها! يرجى فتح issue أولاً لمناقشة التغييرات الكبيرة. الأفكار لسير عمل CTF الجديدة أو أنواع التحديات محل تقدير خاص.

📚 الشكر والتقدير

طُوِّر بواسطة Angelo Delicato @SECFORCE.

يعتمد قسم server بشكل كبير على العمل الرائع الذي قام به @yume-chan، على الأرجح لن يكون هذا التطبيق موجوداً لولا عمله الرائع.

يعتمد تطبيق companion بشكل كبير على aya server الذي يعمل بنفس طريقة scrcpy server. يمكن العثور على مزيد من التفاصيل في README المحدد.

🪪 الترخيص

يُصدر DroidGround تحت رخصة GPL-3.0

الفئات