React Native Application Analysis

Reading time: 11 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 का समर्थन करें

यह पुष्टि करने के लिए कि एप्लिकेशन React Native फ्रेमवर्क पर बनाया गया था, इन चरणों का पालन करें:

  1. APK फ़ाइल का नाम बदलकर zip एक्सटेंशन दें और इसे नए फ़ोल्डर में निकालें, कमांड का उपयोग करते हुए cp com.example.apk example-apk.zip और unzip -qq example-apk.zip -d ReactNative

  2. नए बनाए गए ReactNative फ़ोल्डर में जाएं और assets फ़ोल्डर को खोजें। इस फ़ोल्डर के अंदर, आपको index.android.bundle फ़ाइल मिलनी चाहिए, जिसमें React JavaScript संकुचित प्रारूप में है।

  3. JavaScript फ़ाइल खोजने के लिए कमांड का उपयोग करें find . -print | grep -i ".bundle$"

नोट: यदि आपको APK के बजाय Android App Bundle (.aab) दिया गया है, तो पहले एक यूनिवर्सल APK उत्पन्न करें और फिर बंडल निकालें:

bash
# Get bundletool.jar and generate a universal APK set
java -jar bundletool.jar build-apks \
--bundle=app-release.aab \
--output=app.apks \
--mode=universal \
--overwrite

# Extract the APK and then unzip it to find assets/index.android.bundle
unzip -p app.apks universal.apk > universal.apk
unzip -qq universal.apk -d ReactNative
ls ReactNative/assets/

Javascript Code

यदि आप index.android.bundle की सामग्री की जांच करते हैं और आपको एप्लिकेशन का JavaScript कोड मिलता है (भले ही यह मिनिफाइड हो), तो आप संवेदनशील जानकारी और कमजोरियों को खोजने के लिए इसका विश्लेषण कर सकते हैं

चूंकि बंडल वास्तव में एप्लिकेशन का सभी JS कोड शामिल करता है, इसलिए इसे विभिन्न फ़ाइलों में विभाजित करना संभव है (संभावित रूप से इसके रिवर्स इंजीनियरिंग को आसान बनाना) टूल react-native-decompiler का उपयोग करके।

Webpack

JavaScript कोड का और विश्लेषण करने के लिए, आप फ़ाइल को https://spaceraccoon.github.io/webpack-exploder/ पर अपलोड कर सकते हैं या इन चरणों का पालन कर सकते हैं:

  1. उसी निर्देशिका में index.html नामक एक फ़ाइल बनाएं जिसमें निम्नलिखित कोड हो:
html
<script src="./index.android.bundle"></script>
  1. index.html फ़ाइल को Google Chrome में खोलें।

  2. Command+Option+J for OS X या Control+Shift+J for Windows दबाकर Developer Toolbar खोलें।

  3. Developer Toolbar में "Sources" पर क्लिक करें। आपको एक JavaScript फ़ाइल दिखाई देगी जो फ़ोल्डरों और फ़ाइलों में विभाजित है, जो मुख्य बंडल बनाती है।

यदि आपको index.android.bundle.map नाम की फ़ाइल मिलती है, तो आप स्रोत कोड का विश्लेषण अनमिनिफाइड प्रारूप में कर सकेंगे। मैप फ़ाइलें स्रोत मैपिंग को शामिल करती हैं, जो आपको मिनिफाइड पहचानकर्ताओं को मैप करने की अनुमति देती हैं।

संवेदनशील क्रेडेंशियल्स और एंडपॉइंट्स की खोज करने के लिए, इन चरणों का पालन करें:

  1. JavaScript कोड का विश्लेषण करने के लिए संवेदनशील कीवर्ड्स की पहचान करें। React Native एप्लिकेशन अक्सर Firebase, AWS S3 सेवा एंडपॉइंट्स, निजी कुंजी आदि जैसे थर्ड-पार्टी सेवाओं का उपयोग करते हैं।

  2. इस विशेष मामले में, एप्लिकेशन को Dialogflow सेवा का उपयोग करते हुए देखा गया। इसके कॉन्फ़िगरेशन से संबंधित पैटर्न की खोज करें।

  3. यह सौभाग्य की बात थी कि पुनः खोज प्रक्रिया के दौरान JavaScript कोड में संवेदनशील हार्ड-कोडेड क्रेडेंशियल्स पाए गए।

बंडलों में त्वरित रहस्य/एंडपॉइंट शिकार

ये सरल grep अक्सर मिनिफाइड JS में भी दिलचस्प संकेतों को सामने लाते हैं:

bash
# Common backends and crash reporters
strings -n 6 index.android.bundle | grep -Ei "(api\.|graphql|/v1/|/v2/|socket|wss://|sentry\.io|bugsnag|appcenter|codepush|firebaseio\.com|amplify|aws)"

# Firebase / Google keys (heuristics)
strings -n 6 index.android.bundle | grep -Ei "(AIza[0-9A-Za-z_-]{35}|AIzaSy[0-9A-Za-z_-]{33})"

# AWS access key id heuristic
strings -n 6 index.android.bundle | grep -E "AKIA[0-9A-Z]{16}"

# Expo/CodePush deployment keys
strings -n 6 index.android.bundle | grep -Ei "(CodePush|codepush:\\/\\/|DeploymentKey)"

# Sentry DSN
strings -n 6 index.android.bundle | grep -Ei "(Sentry\.init|dsn\s*:)"

यदि आप ओवर-दी-एयर अपडेट फ्रेमवर्क पर संदेह करते हैं, तो इसके लिए भी खोजें:

  • Microsoft App Center / CodePush डिप्लॉयमेंट की
  • Expo EAS Updates कॉन्फ़िगरेशन (expo-updates, expo\.io, साइनिंग सर्ट्स)

JS कोड बदलें और पुनर्निर्माण करें

इस मामले में कोड बदलना आसान है। आपको बस ऐप का नाम बदलकर .zip एक्सटेंशन का उपयोग करना है और इसे निकालना है। फिर आप इस बंडल के अंदर JS कोड को संशोधित कर सकते हैं और ऐप को पुनर्निर्माण कर सकते हैं। यह आपको कोड इंजेक्ट करने की अनुमति देने के लिए पर्याप्त होना चाहिए ताकि आप परीक्षण उद्देश्यों के लिए ऐप में कोड डाल सकें।

Hermes बाइटकोड

यदि बंडल में Hermes बाइटकोड है, तो आप ऐप के Javascript कोड तक पहुँच नहीं पाएंगे (यहां तक कि संकुचित संस्करण तक भी नहीं)।

आप निम्नलिखित कमांड चलाकर जांच सकते हैं कि क्या बंडल में Hermes बाइटकोड है:

bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96

हालांकि, आप उपकरणों का उपयोग कर सकते हैं hbctool, hbctool के अपडेटेड फोर्क जो नए बाइटकोड संस्करणों का समर्थन करते हैं, hasmer, hermes_rs (Rust लाइब्रेरी/APIs), या hermes-dec बाइटकोड को डिस्सेम्बल करने और इसे कुछ प्सेडो JS कोड में डिकंपाइल करने के लिए। उदाहरण के लिए:

bash
# Disassemble and re-assemble with hbctool (works only for supported HBC versions)
hbctool disasm ./index.android.bundle ./hasm_out
# ...edit ./hasm_out/**/*.hasm (e.g., change comparisons, constants, feature flags)...
hbctool asm   ./hasm_out ./index.android.bundle

# Using hasmer (focus on disassembly; assembler/decompiler are WIP)
hasmer disasm ./index.android.bundle -o hasm_out

# Using hermes-dec to produce pseudo-JS
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler   ./index.android.bundle /tmp/my_output_file.js

Tip: ओपन-सोर्स Hermes प्रोजेक्ट विशेष Hermes रिलीज़ में hbcdump जैसे डेवलपर टूल भी प्रदान करता है। यदि आप उस बंडल को बनाने के लिए उपयोग किए गए मेल खाने वाले Hermes संस्करण का निर्माण करते हैं, तो hbcdump कार्यों, स्ट्रिंग तालिकाओं और गहरे विश्लेषण के लिए बाइटकोड को डंप कर सकता है।

कोड बदलें और पुनर्निर्माण करें (Hermes)

आदर्श रूप से, आपको असेंबल किए गए कोड में संशोधन करने में सक्षम होना चाहिए (तुलना, या मान या जो भी आपको संशोधित करने की आवश्यकता है) और फिर बाइटकोड को पुनर्निर्माण करना चाहिए और ऐप को पुनर्निर्माण करना चाहिए।

  • मूल hbctool बंडल को असेंबल करने और परिवर्तनों के बाद इसे फिर से बनाने का समर्थन करता है, लेकिन ऐतिहासिक रूप से केवल पुराने बाइटकोड संस्करणों का समर्थन किया है। समुदाय द्वारा बनाए गए फोर्क नए Hermes संस्करणों (मध्य-80s–96 सहित) का समर्थन बढ़ाते हैं और अक्सर आधुनिक RN ऐप्स को पैच करने के लिए सबसे व्यावहारिक विकल्प होते हैं।
  • टूल hermes-dec बाइटकोड को पुनर्निर्माण का समर्थन नहीं करता (डिकंपाइलर/डिस्सेम्बलर केवल), लेकिन यह लॉजिक को नेविगेट करने और स्ट्रिंग्स को डंप करने में बहुत सहायक है।
  • टूल hasmer कई Hermes संस्करणों के लिए असेंबली और असेंबली दोनों का समर्थन करने का लक्ष्य रखता है; असेंबली अभी भी परिपक्व हो रही है लेकिन हाल के बाइटकोड पर प्रयास करने के लायक है।

hbctool-जैसे असेंबलरों के साथ एक न्यूनतम कार्यप्रवाह:

bash
# 1) Disassemble to HASM directories
hbctool disasm assets/index.android.bundle ./hasm

# 2) Edit a guard or feature flag (example: force boolean true)
#    In the relevant .hasm, replace a LoadConstUInt8 0 with 1
#    or change a conditional jump target to bypass a check.

# 3) Reassemble into a new bundle
hbctool asm ./hasm assets/index.android.bundle

# 4) Repack the APK and resign
zip -r ../patched.apk *
# Align/sign as usual (see Android signing section in HackTricks)

ध्यान दें कि Hermes बाइटकोड प्रारूप संस्करणित है और असेंबलर को सटीक ऑन-डिस्क प्रारूप से मेल खाना चाहिए। यदि आपको प्रारूप त्रुटियाँ मिलती हैं, तो एक अपडेटेड फोर्क/वैकल्पिक पर स्विच करें या मेल खाने वाले Hermes टूलिंग को फिर से बनाएं।

डायनामिक एनालिसिस

आप ऐप का डायनामिक एनालिसिस करने के लिए Frida का उपयोग कर सकते हैं ताकि React ऐप का डेवलपर मोड सक्षम किया जा सके और react-native-debugger को इससे जोड़ सकें। हालाँकि, इसके लिए आपको ऐप का स्रोत कोड चाहिए। आप इसके बारे में अधिक जानकारी https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/ पर पा सकते हैं।

Frida के साथ रिलीज़ में डेवलपमेंट सपोर्ट सक्षम करना (चेतावनियाँ)

कुछ ऐप्स गलती से ऐसे क्लासेस भेजते हैं जो डेवलपमेंट सपोर्ट को टॉगल करने योग्य बनाते हैं। यदि मौजूद हैं, तो आप getUseDeveloperSupport() को true लौटाने के लिए मजबूर करने की कोशिश कर सकते हैं:

javascript
// frida -U -f com.target.app -l enable-dev.js
Java.perform(function(){
try {
var Host = Java.use('com.facebook.react.ReactNativeHost');
Host.getUseDeveloperSupport.implementation = function(){
return true; // force dev support
};
console.log('[+] Patched ReactNativeHost.getUseDeveloperSupport');
} catch (e) {
console.log('[-] Could not patch: ' + e);
}
});

Warning: सही तरीके से बनाए गए रिलीज बिल्ड में, DevSupportManagerImpl और संबंधित डिबग-केवल क्लासेस को हटा दिया जाता है और इस फ्लैग को बदलने से ऐप क्रैश हो सकता है या कोई प्रभाव नहीं पड़ सकता है। जब यह काम करता है, तो आप आमतौर पर डेवलपर मेनू को उजागर कर सकते हैं और डिबगर्स/इंस्पेक्टर्स को अटैच कर सकते हैं।

RN ऐप्स में नेटवर्क इंटरसेप्शन

React Native Android आमतौर पर OkHttp पर निर्भर करता है ( Networking नेचुरल मॉड्यूल के माध्यम से)। डायनामिक टेस्ट के दौरान नॉन-रूटेड डिवाइस पर ट्रैफिक को इंटरसेप्ट/ऑब्जर्व करने के लिए:

  • सिस्टम प्रॉक्सी का उपयोग करें + यूजर CA पर भरोसा करें या अन्य सामान्य Android TLS बायपास तकनीकों का उपयोग करें।
  • RN-विशिष्ट टिप: यदि ऐप गलती से रिलीज में Flipper को बंडल करता है (डिबग टूलिंग), तो Flipper नेटवर्क प्लगइन अनुरोधों/प्रतिक्रियाओं को उजागर कर सकता है।

सामान्य Android इंटरसेप्शन और पिनिंग बायपास तकनीकों के लिए देखें:

Make APK Accept CA Certificate

Objection Tutorial

लोकप्रिय RN लाइब्रेरी में हाल की समस्याएं (क्या देखना है)

JS बंडल या नेचुरल लाइब्रेरी में दिखाई देने वाले थर्ड-पार्टी मॉड्यूल का ऑडिट करते समय, ज्ञात कमजोरियों की जांच करें और package.json/yarn.lock में संस्करणों की पुष्टि करें।

  • react-native-mmkv (Android): 2.11.0 से पहले के संस्करणों ने वैकल्पिक एन्क्रिप्शन कुंजी को Android लॉग में लॉग किया। यदि ADB/logcat उपलब्ध है, तो रहस्य पुनर्प्राप्त किए जा सकते हैं। सुनिश्चित करें कि >= 2.11.0 है। संकेत: react-native-mmkv का उपयोग, एन्क्रिप्शन के साथ MMKV इनिशियलाइज़ेशन का उल्लेख करने वाले लॉग स्टेटमेंट। CVE-2024-21668।
  • react-native-document-picker: संस्करण < 9.1.1 Android पर पाथ ट्रैवर्सल के प्रति संवेदनशील थे (फाइल चयन), 9.1.1 में ठीक किया गया। इनपुट और लाइब्रेरी संस्करण की पुष्टि करें।

त्वरित जांच:

bash
grep -R "react-native-mmkv" -n {index.android.bundle,*.map} 2>/dev/null || true
grep -R "react-native-document-picker" -n {index.android.bundle,*.map} 2>/dev/null || true
# If you also have the node_modules (rare on release): grep -R in package.json / yarn.lock

संदर्भ

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 का समर्थन करें