
एंड्रॉइड CTF चुनौतियों के लिए एक लचीला प्लेग्राउंड।
DroidGround
पारंपरिक CTF चुनौतियों में, सिस्टम पर फ़ाइलों में फ़्लैग छिपाना आम बात है, जिसके लिए हमलावरों को उन्हें प्राप्त करने हेतु कमज़ोरियों का शोषण करना पड़ता है। हालाँकि, Android की दुनिया में यह दृष्टिकोण अच्छी तरह से काम नहीं करता। APK फ़ाइलें आसानी से डाउनलोड करने योग्य और रिवर्स करने योग्य होती हैं, इसलिए, डिवाइस पर फ़्लैग रखना आमतौर पर उसे स्टैटिक विश्लेषण या एमुलेटर ट्रिक्स से निकालना तुच्छ बना देता है। यह यथार्थवादी, रनटाइम-केंद्रित चुनौतियाँ बनाने की क्षमता को गंभीर रूप से सीमित करता है।
DroidGround इस समस्या को हल करने के लिए डिज़ाइन किया गया है।
यह एक कस्टम-निर्मित प्लेटफ़ॉर्म है जो नियंत्रित और यथार्थवादी वातावरण में Android मोबाइल हैकिंग चुनौतियों की मेज़बानी करता है, जहाँ हमलावरों को बस इतना प्रतिबंधित किया जाता है कि उन्हें चुनौतियों को इच्छित तरीके से हल करना पड़े।
महत्वपूर्ण बात यह है कि प्रतिभागियों को ऐप वातावरण के अंदर जेल में रखा जा सकता है। टूल की मॉड्यूलरिटी यह सेट करने की अनुमति देती है कि उपयोगकर्ता शेल स्पॉन कर सकता है या नहीं, मनमानी फ़ाइलें पढ़ सकता है या नहीं, या साइडलोड टूल्स कर सकता है या नहीं। सब कुछ इस तरह से सेट किया जा सकता है कि फ़्लैग प्राप्त करने का एकमात्र तरीका ऐप को समझना और उसका शोषण करना हो।
DroidGround कई प्रकार की Android चुनौतियों को सक्षम बनाता है जिन्हें पारंपरिक CTF सेटअप में लागू करना अन्यथा कठिन होता है। उदाहरण के लिए, एक रिमोट कोड एक्ज़ीक्यूशन (RCE) चुनौती में, खिलाड़ियों को स्थानीय विश्लेषण के लिए एक APK प्राप्त हो सकता है। कमज़ोरी खोजने के बाद, वे एक Frida स्क्रिप्ट विकसित कर सकते हैं और उसे DroidGround के माध्यम से वास्तविक लक्षित डिवाइस पर चला सकते हैं ताकि फ़्लैग को आंतरिक स्टोरेज से निकाल सकें। अन्य चुनौती प्रकारों में छिपी हुई गतिविधियाँ (hidden activities), कस्टम ब्रॉडकास्ट इंटेंट, सेवा शोषण, या प्रीलोडेड टूल्स का उपयोग करके डायनेमिक विश्लेषण शामिल हो सकते हैं।
रियल-टाइम डिवाइस स्ट्रीमिंग, फीचर्स पर सूक्ष्म-स्तरीय (fine-grained) नियंत्रण, Frida एकीकरण, और अनुकूलन योग्य सेटअप और रीसेट स्क्रिप्ट के साथ, DroidGround CTF आयोजकों को सुरक्षित, लचीली और यथार्थवादी Android चुनौतियाँ बनाने में सशक्त बनाता है जो सामान्यतः संभव से कहीं आगे जाती हैं।
DroidGround सर्वर-नियंत्रित सुविधाओं का एक समृद्ध सेट प्रदान करता है।
scrcpy के माध्यम से)लगभग सभी सुविधाएँ मॉड्यूलर हैं और पर्यावरण चर (environment variables) के माध्यम से परिभाषित की जाती हैं, जिससे चुनौती के दायरे पर सटीक नियंत्रण सुनिश्चित होता है।
रूट निर्देशिका में .env.sample फ़ाइल एक अच्छा प्रारंभिक बिंदु है। यह वर्तमान में समर्थित सभी env वेरिएबल्स की पूरी सूची है:
DROIDGROUND_IP_IFACE पहले सटीक मिलान की खोज करता है और फिर उस पहले इंटरफ़ेस पर फ़ॉलबैक करता है जो प्रदान किए गए मान से शुरू होता है, क्योंकि Docker कंटेनर के भीतर केवल नेटवर्क इंटरफ़ेस उपसर्ग (prefix) निर्दिष्ट करने की अनुमति देता है।
DROIDGROUND_NUM_TEAMS वेरिएबल का उपयोग एप्लिकेशन के व्यवहार को आंतरिक रूप से थोड़ा बदल देता है। यदि यह विकल्प सेट है:
यह उन चुनौतियों में एक ही DroidGround इंस्टेंस को कई टीमों के साथ साझा करने की अनुमति देता है जहाँ फ़्लैग को नेटवर्क अनुरोध के माध्यम से बाहर निकाला (exfiltrate) जा सकता है। यह CTF प्रतियोगिताओं के लिए DroidGround की डिप्लॉय लागत को काफी हद तक कम करता है।
इसके अलावा, यदि मान -1 पर सेट है तो यह तथाकथित अनलिमिटेड टीम्स (Unlimited Teams) मोड को सक्षम करेगा। इस मोड में अवलोकन पृष्ठ पर एक नया टीम टोकन जनरेट करने के लिए एक बटन उपलब्ध होगा। यदि यह मोड सक्षम है तो सभी DROIDGROUND_TEAM_TOKEN_<N> वेरिएबल्स को अनदेखा कर दिया जाता है।
यहाँ कुछ तरीके दिए गए हैं जिनसे DroidGround का उपयोग किया जा सकता है:
examples फ़ोल्डर में कुछ नमूना Docker Compose फ़ाइलें दी गई हैं। वे DroidGround सैंपल्स रिपो के ऐप्स का उपयोग करती हैं, जिन्हें धीरे-धीरे बढ़ाया जाएगा ताकि सभी प्रमुख विशेषताओं को प्रदर्शित किया जा सके। ये आपके स्वयं के CTF को सेटअप करने के तरीके को समझने के लिए भी एक अच्छा प्रारंभिक बिंदु हैं।
बूट होने पर DroidGround निम्न कार्य करता है:
adb के साथ कनेक्शन सेट करता हैDROIDGROUND_INIT_SCRIPTS_FOLDER द्वारा निर्दिष्ट फ़ोल्डर में setup.sh चलाता है। इस स्क्रिप्ट का उपयोग लक्षित ऐप को इंस्टॉल करने और 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 इंस्टेंस की एक पूर्व-निर्धारित संख्या प्रावधानित (provision) करना चाह सकते हैं या आप उपयोगकर्ताओं को इंस्टेंस स्पॉन करने की अनुमति देना चाह सकते हैं (एक सीमा के साथ या शायद प्रत्येक टीम/उपयोगकर्ता को एक विशिष्ट इंस्टेंस से संबद्ध करना)। इस कारण से हमने एक सरल स्पॉनर उदाहरण भी जोड़ा है।
वैकल्पिक रूप से, जैसा कि पहले उल्लेख किया गया है, आप एक ऐसी चुनौती बना सकते हैं जहाँ फ़्लैग को नेटवर्क अनुरोध के माध्यम से बाहर निकाला जा सकता है और कई इंस्टेंस स्पॉन करने (जो महंगा हो सकता है) से बचने के लिए DROIDGROUND_NUM_TEAMS env वेरिएबल का लाभ उठा सकते हैं। net-multi-step फ़ोल्डर इस प्रकार की चुनौतियों को वितरित करने का एक अच्छा उदाहरण प्रदान करता है।
आपका Android CTF सेटअप करने के लिए यहाँ कुछ सुझाव दिए गए हैं:
प्रोडक्शन में जाने से पहले सेटअप का परीक्षण करते समय लक्षित ऐप की अटैक सर्फेस (attack surface) प्राप्त करना उपयोगी हो सकता है। यह ऐसी चीज़ है जिसे खिलाड़ियों को नहीं देखना चाहिए क्योंकि अटैक सर्फेस की खोज और विश्लेषण करना उनके काम का हिस्सा है!
इसलिए, /attackSurface पर पहुँचने योग्य एक GET एंडपॉइंट प्रदान किया गया है और इसे एक टोकन (जिसे Authorization हेडर के मान के रूप में उपयोग करने की आवश्यकता है) से सुरक्षित किया गया है जो बूट के दौरान यादृच्छिक रूप से जनरेट होता है और लॉग में मुद्रित होता है (इसलिए केवल sysadmins के लिए सुलभ)।
यदि आप जेल्ड मोड में अपनी स्वयं की Frida स्क्रिप्ट का उपयोग करना चाहते हैं, तो आपको केवल उन्हें समाहित करने वाले फ़ोल्डर को Docker कंटेनर में bind-mount करने की आवश्यकता है:
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 चलाना है और आप तैयार हैं। हैप्पी डेव मोड!
पुल रिक्वेस्ट का स्वागत है! कृपया बड़े बदलावों पर चर्चा करने के लिए पहले एक issue खोलें। नए CTF वर्कफ़्लो या चुनौती प्रकारों के विचारों की विशेष रूप से सराहना की जाती है।
Angelo Delicato @SECFORCE द्वारा विकसित।
सर्वर अनुभाग @yume-chan द्वारा किए गए अद्भुत कार्य पर काफी हद तक निर्भर करता है, संभवतः यह ऐप अस्तित्व में नहीं होता यदि उनका अद्भुत कार्य नहीं होता।
कंपैनियन ऐप aya सर्वर पर आधारित है जो scrcpy सर्वर की तरह ही काम करता है। अधिक विवरण विशिष्ट README में पाए जा सकते हैं।
DroidGround को GPL-3.0 लाइसेंस के अंतर्गत जारी किया गया है।
![]() | ![]() |
|---|
| अवलोकन | गतिविधि प्रारंभ करें |
![]() | ![]() |
| Frida जेल्ड मोड | Frida फुल मोड |
![]() | ![]() |
| फ़ाइल ब्राउज़र | ऐप मैनेजर |
![]() | ![]() |
| टर्मिनल | लॉग |
| Variable | विवरण | डिफ़ॉल्ट |
|---|
DROIDGROUND_BASE_PATH | वेबऐप का पथ (सबपाथ पर होस्टिंग के लिए उपयोगी) | - |
DROIDGROUND_APP_PACKAGE_NAME | लक्षित ऐप का पैकेज नाम | - |
DROIDGROUND_ADB_HOST | ADB होस्ट | localhost |
DROIDGROUND_ADB_PORT | ADB पोर्ट | 5037 |
DROIDGROUND_ADB_SERIAL | कनेक्ट करने हेतु वैकल्पिक ADB डिवाइस सीरियल | - |
DROIDGROUND_DEVICE_TYPE | usb या network | usb |
DROIDGROUND_DEVICE_HOST | Android डिवाइस का IP (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 | 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 | ब्रॉडकास्ट अक्षम करें | 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> | nवीं टीम के लिए टोकन। अनुपलब्ध होने पर स्वतः-जनरेट होता है | - |
DROIDGROUND_IP_STATIC | प्रदर्शित करने हेतु स्टैटिक IP पता। यह DROIDGROUND_IP_IFACE पर प्राथमिकता रखता है | - |
DROIDGROUND_IP_IFACE | प्रदर्शित IP पते के लिए नेटवर्क इंटरफ़ेस | - |
DROIDGROUND_LOGO_LINK | वैकल्पिक रूप से लोगो का क्लिक-थ्रू लिंक सेट करें (जैसे, आपका CTF मुख्य पृष्ठ) | - |