अपडेट पर वापस जाएँ
New releaseAug 27, 2026

droidground v1.0.14

एंड्रॉइड CTF चुनौतियों के लिए एक लचीला प्लेग्राउंड।

साझा करें


droidground

DroidGround


Website | Demo

पारंपरिक CTF चुनौतियों में, सिस्टम पर फ़ाइलों में फ़्लैग छिपाना आम बात है, जिसके लिए हमलावरों को उन्हें निकालने के लिए कमज़ोरियों का फ़ायदा उठाना पड़ता है। हालाँकि, Android की दुनिया में, यह तरीका अच्छी तरह काम नहीं करता। APK फ़ाइलें आसानी से डाउनलोड और रिवर्स की जा सकती हैं, इसलिए डिवाइस पर फ़्लैग रखना आमतौर पर इसे निकालना बहुत आसान बना देता है — स्टैटिक एनालिसिस या एमुलेटर ट्रिक्स का उपयोग करके। यह यथार्थवादी, रनटाइम-केंद्रित चुनौतियाँ बनाने की क्षमता को गंभीर रूप से सीमित करता है।

DroidGround इस समस्या को हल करने के लिए डिज़ाइन किया गया है।

यह एक नियंत्रित और यथार्थवादी वातावरण में Android मोबाइल हैकिंग चुनौतियों को होस्ट करने के लिए बनाया गया एक कस्टम प्लेटफ़ॉर्म है, जहाँ हमलावरों को बस इतना सीमित किया जाता है कि उन्हें चुनौतियों को इच्छित तरीके से हल करना पड़े।

महत्वपूर्ण बात यह है कि प्रतिभागियों को ऐप एनवायरनमेंट के भीतर कैद किया जा सकता है। टूल की मॉड्यूलरिटी यह तय करने की अनुमति देती है कि उपयोगकर्ता शेल स्पॉन कर सकता है या नहीं, मनमानी फ़ाइलें पढ़ सकता है या नहीं, या टूल साइडलोड कर सकता है या नहीं। सब कुछ इस तरह सेट किया जा सकता है कि फ़्लैग प्राप्त करने का एकमात्र तरीका ऐप को समझना और उसका शोषण करना हो।

📋 विषय-सूची

🧭 अवलोकन

DroidGround कई तरह की Android चुनौतियों को सक्षम बनाता है जिन्हें पारंपरिक CTF सेटअप में लागू करना अन्यथा कठिन होता है। उदाहरण के लिए, रिमोट कोड एक्ज़ीक्यूशन (RCE) चुनौती में, खिलाड़ियों को स्थानीय विश्लेषण के लिए एक APK मिल सकता है। कमज़ोरी खोजने के बाद, वे एक Frida स्क्रिप्ट विकसित कर सकते हैं और इसे DroidGround के माध्यम से वास्तविक लक्ष्य डिवाइस पर चला सकते हैं ताकि आंतरिक स्टोरेज से फ़्लैग निकाला जा सके। अन्य चुनौती प्रकारों में छिपी हुई गतिविधियाँ, कस्टम ब्रॉडकास्ट इंटेंट, सेवा शोषण, या प्रीलोडेड टूल्स का उपयोग करके डायनामिक विश्लेषण शामिल हो सकते हैं।

रीयल-टाइम डिवाइस स्ट्रीमिंग, सुविधाओं पर बारीक नियंत्रण, Frida एकीकरण, और अनुकूलन योग्य सेटअप और रीसेट स्क्रिप्ट के साथ, DroidGround CTF आयोजकों को सुरक्षित, लचीली और यथार्थवादी Android चुनौतियाँ बनाने में सक्षम बनाता है जो आमतौर पर संभव से कहीं आगे तक जाती हैं।

✨ विशेषताएँ

DroidGround सर्वर-नियंत्रित सुविधाओं का एक समृद्ध सेट प्रदान करता है।

  • रीयल-टाइम डिवाइस स्क्रीन (scrcpy के माध्यम से), वैकल्पिक माउस, टच, और कीबोर्ड नियंत्रण के साथ
  • चुनौती स्थिति रीसेट करें
  • ऐप रीस्टार्ट करें / गतिविधि प्रारंभ करें / सेवा प्रारंभ करें
  • ब्रॉडकास्ट इंटेंट भेजें
  • डिवाइस शटडाउन / रीबूट करें
  • बगरिपोर्ट डाउनलोड करें (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 फ़ाइल एक अच्छा प्रारंभिक बिंदु है। यह वर्तमान में समर्थित सभी env वेरिएबल्स की पूरी सूची है:

VariableDescriptionDefault
DROIDGROUND_BASE_PATHवेबऐप का पथ (सबपाथ पर होस्ट करने के लिए उपयोगी)-
DROIDGROUND_APP_PACKAGE_NAMEलक्ष्य ऐप का पैकेज नाम-
DROIDGROUND_ADB_HOSTADB होस्टlocalhost
DROIDGROUND_ADB_PORTADB पोर्ट5037
DROIDGROUND_ADB_SERIALकनेक्ट करने के लिए वैकल्पिक ADB डिवाइस सीरियल-
DROIDGROUND_DEVICE_TYPEusb या networkusb
DROIDGROUND_DEVICE_HOSTAndroid डिवाइस का IP (adb) (केवल नेटवर्क मोड)-
DROIDGROUND_DEVICE_PORTAndroid डिवाइस का पोर्ट (adb) (केवल नेटवर्क मोड)-
DROIDGROUND_INIT_SCRIPTS_FOLDERsetup.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_DISABLEDFrida समर्थन अक्षम करेंfalse
DROIDGROUND_FRIDA_TYPEjail या fulljail
DROIDGROUND_FRIDA_INJECTIONserver या gadgetserver
DROIDGROUND_LOGCAT_DISABLEDlogcat अक्षम करेंfalse
DROIDGROUND_REBOOT_ENABLEDरीबूट सक्षम करेंfalse
DROIDGROUND_SHUTDOWN_ENABLEDशटडाउन सक्षम करेंfalse
DROIDGROUND_START_ACTIVITY_DISABLEDstartActivity अक्षम करेंfalse
DROIDGROUND_START_RECEIVER_DISABLEDब्रॉडकास्ट अक्षम करेंfalse
DROIDGROUND_START_SERVICE_DISABLEDstartService अक्षम करेंfalse
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एक्सप्लॉइट ऐप का अधिकतम आकार (MB में)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 को रीस्टार्ट करें। स्क्रीन को फ़ोकस करने के लिए उस पर क्लिक या टैप करें, फिर क्लिक करें, ड्रैग करें, स्वाइप करें, कई टच पॉइंट्स का उपयोग करें, माउस व्हील से स्क्रॉल करें, या टाइप करें। Android बैक के लिए राइट-क्लिक करें या Escape दबाएँ। Tab और Shift+Tab स्क्रीन से फ़ोकस बाहर ले जाते हैं। इनपुट हर उस व्यक्ति के साथ साझा किया जाता है जो डिवाइस देख रहा है, टीम मोड में भी। डिफ़ॉल्ट रूप से स्क्रीन केवल-देखने योग्य रहती है। टेक्स्ट इनपुट scrcpy के Android key injection का उपयोग करता है, इसलिए वर्ण समर्थन डिवाइस के कीबोर्ड मैपिंग पर निर्भर करता है।

DROIDGROUND_IP_IFACE पहले सटीक मिलान खोजता है और फिर उस पहले इंटरफ़ेस पर फ़ॉलबैक करता है जो प्रदान किए गए मान से शुरू होता है, क्योंकि Docker कंटेनर के भीतर नेटवर्क इंटरफ़ेस प्रीफ़िक्स निर्दिष्ट करने की ही अनुमति देता है।

स्क्रीन स्ट्रीमिंग डिफ़ॉल्ट रूप से अधिकतम 1280 पिक्सेल आयाम, 60 fps तक, और 4 Mbps पर होती है ताकि एन्कोडिंग, नेटवर्क, और ब्राउज़र का काम कम हो। यह एम्बेडेड डिवाइस व्यू में प्रतिक्रियाशीलता के लिए कुछ बारीक विवरण का त्याग करता है। पिछली पूर्ण-रिज़ॉल्यूशन गुणवत्ता सेटिंग्स को बहाल करने के लिए DROIDGROUND_SCRCPY_MAX_SIZE=0 और DROIDGROUND_SCRCPY_VIDEO_BIT_RATE=10000000 सेट करें। धीमे कनेक्शन या ब्राउज़र के लिए, अधिकतम आकार 1024, 30 fps, और 2000000 बिट्स प्रति सेकंड आज़माएँ। इन सेटिंग्स को बदलने के बाद DroidGround को रीस्टार्ट करें।

ब्राउज़र उपलब्ध होने पर WebCodecs का उपयोग करता है और अन्यथा सॉफ़्टवेयर H.264 डिकोडर पर फ़ॉलबैक करता है। WebCodecs के लिए सुरक्षित संदर्भ आवश्यक है: रिमोट डिप्लॉयमेंट के लिए HTTPS का उपयोग करें (localhost भी काम करता है)। रिमोट IP या होस्टनाम पर सादा HTTP सॉफ़्टवेयर डिकोडिंग का उपयोग करता है। धीमे व्यूअर वीडियो बैकलॉग जमा करने के बजाय एक नए कीफ़्रेम पर छोड़ देते हैं; जुड़ने या रिकवर होने में लगभग एक कीफ़्रेम अंतराल (एक सेकंड) लग सकता है। अंतर्निहित ब्राउज़र और वीडियो सेटिंग्स के लिए WebCodecs specification और scrcpy video documentation देखें।

DROIDGROUND_NUM_TEAMS वेरिएबल का उपयोग अंदरूनी तौर पर एप्लिकेशन के व्यवहार को थोड़ा बदल देता है। यदि यह विकल्प सेट है:

  1. एक्सप्लॉइट सर्वर सुविधा सक्षम हो जाती है, जिससे प्रत्येक टीम अपने team token के माध्यम से अपना (बहुत सरल) एक्सप्लॉइट सर्वर उपयोग कर सकती है।
  2. एक्सप्लॉइट ऐप्स को इंस्टॉल और चलाने के लिए team token आवश्यक होगा। प्रत्येक इंस्टॉल किया गया ऐप एक टीम से जुड़ा होगा और अन्य टीमें इसे चला नहीं पाएँगी।

यह उन चुनौतियों में एक ही DroidGround इंस्टेंस को कई टीमों के साथ साझा करने की अनुमति देता है जहाँ फ़्लैग को नेटवर्क अनुरोध के माध्यम से बाहर निकाला जा सकता है। यह CTF प्रतियोगिताओं के लिए DroidGround की डिप्लॉय लागत को बहुत कम कर देता है

इसके अलावा, यदि मान -1 पर सेट है तो यह तथाकथित Unlimited Teams मोड सक्षम करेगा। इस मोड में Overview पृष्ठ पर एक नया team token उत्पन्न करने का बटन उपलब्ध होगा। यदि यह मोड सक्षम है तो सभी DROIDGROUND_TEAM_TOKEN_<N> वेरिएबल्स को अनदेखा कर दिया जाता है।

🧩 उपयोग के मामले

DroidGround का उपयोग करने के कुछ तरीके यहाँ हैं:

  1. छिपी हुई गतिविधि: फ़्लैग देखने के लिए एक अनएक्सपोज़्ड गतिविधि खोजें और लॉन्च करें (खिलाड़ी के ऐप में एक डमी फ़्लैग होता है)।
  2. RCE: ऐप RCE के प्रति कमज़ोर है और फ़्लैग डिवाइस पर संग्रहीत है।
  3. Frida इंस्ट्रुमेंटेशन: एक स्क्रिप्ट का उपयोग करके एक मेथड को ओवरलोड करें और निजी मेमोरी से फ़्लैग निकालें।

⚙️ उपयोग

examples फ़ोल्डर में कुछ नमूना Docker Compose फ़ाइलें प्रदान की गई हैं। वे DroidGround samples repo के ऐप्स का उपयोग करती हैं जिन्हें सभी प्रमुख विशेषताओं को प्रदर्शित करने के लिए उत्तरोत्तर बढ़ाया जाएगा। वे यह समझने के लिए भी एक अच्छा प्रारंभिक बिंदु हैं कि अपना खुद का CTF कैसे सेटअप करें।

बूट पर DroidGround निम्नलिखित करता है:

  1. adb के साथ कनेक्शन सेट करता है
  2. यदि मौजूद हो तो DROIDGROUND_INIT_SCRIPTS_FOLDER द्वारा निर्दिष्ट फ़ोल्डर में setup.sh चलाता है। इस स्क्रिप्ट का उपयोग लक्ष्य ऐप इंस्टॉल करने और 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 example भी जोड़ा है।

वैकल्पिक रूप से, जैसा कि पहले उल्लेख किया गया है, आप एक चुनौती बना सकते हैं जहाँ फ़्लैग को नेटवर्क अनुरोध के माध्यम से बाहर निकाला जा सकता है और कई इंस्टेंस स्पॉन करने से बचने के लिए DROIDGROUND_NUM_TEAMS env वेरिएबल का लाभ उठा सकते हैं (जो महंगा हो सकता है)। net-multi-step फ़ोल्डर इस प्रकार की चुनौतियों को वितरित करने का एक अच्छा उदाहरण प्रदान करता है।

💡 सुझाव

अपना Android CTF सेटअप करने के लिए यहाँ कुछ सुझाव हैं:

  • Frida Full Mode सक्षम करते समय सावधान रहें, खिलाड़ी का डिवाइस पर पूर्ण नियंत्रण होगा (इसीलिए हमने Frida Jail Mode बनाया जैसा कि Frida Library में विस्तृत है)।
  • Terminal सक्षम करते समय सावधान रहें, खिलाड़ी का डिवाइस पर पूर्ण नियंत्रण होगा।
  • Shutdown सुविधा सक्षम करते समय सावधान रहें।
  • यदि आप फ़्लैग को सीधे UI में दिखाने की योजना बनाते हैं तो आप अलग-अलग इंस्टेंस स्पॉन करने का तरीका खोजना चाह सकते हैं (प्रत्येक टीम/खिलाड़ी के लिए एक)

प्रोडक्शन में जाने से पहले सेटअप का परीक्षण करते समय लक्ष्य ऐप का attack surface प्राप्त करना उपयोगी हो सकता है। यह कुछ ऐसा है जो खिलाड़ियों को नहीं देखना चाहिए क्योंकि attack surface को खोजना और उसका विश्लेषण करना उनका काम है!

इसलिए, /attackSurface पर पहुँचने योग्य एक GET एंडपॉइंट प्रदान किया गया है और यह एक टोकन से सुरक्षित है (जिसे Authorization हेडर के मान के रूप में उपयोग करना होता है) जो बूट के दौरान बेतरतीब ढंग से उत्पन्न होता है और लॉग में प्रिंट होता है (इसलिए केवल sysadmins द्वारा सुलभ)।

यदि आप जेल मोड में अपनी खुद की 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 चलाना होगा और आप तैयार हैं। हैप्पी डेव मोड!

🤝 योगदान

पुल रिक्वेस्ट का स्वागत है! कृपया बड़े बदलावों पर चर्चा करने के लिए पहले एक इश्यू खोलें। नए CTF वर्कफ़्लो या चुनौती प्रकारों के विचार विशेष रूप से सराहनीय हैं।

📚 श्रेय

Angelo Delicato @SECFORCE द्वारा विकसित।

server अनुभाग @yume-chan द्वारा किए गए अद्भुत काम पर बहुत अधिक निर्भर करता है, शायद उनके अद्भुत काम के बिना यह ऐप मौजूद नहीं होता।

companion ऐप aya server पर बहुत अधिक आधारित है जो scrcpy server की तरह ही काम करता है। अधिक विवरण विशिष्ट README में पाए जा सकते हैं।

🪪 लाइसेंस

DroidGround GPL-3.0 LICENSE के अंतर्गत जारी किया गया है

श्रेणियाँ