Translated ['src/mobile-pentesting/android-app-pentesting/react-native-a

This commit is contained in:
Translator 2025-08-21 04:25:53 +00:00
parent d8d3f95061
commit aac57b7376

View File

@ -1,7 +1,7 @@
{{#include ../../banners/hacktricks-training.md}}
# React Native Application Analysis
{{#include ../../banners/hacktricks-training.md}}
यह पुष्टि करने के लिए कि एप्लिकेशन React Native फ्रेमवर्क पर बनाया गया था, इन चरणों का पालन करें:
1. APK फ़ाइल का नाम बदलकर zip एक्सटेंशन दें और इसे एक नए फ़ोल्डर में निकालें, कमांड का उपयोग करते हुए `cp com.example.apk example-apk.zip` और `unzip -qq example-apk.zip -d ReactNative`
@ -10,11 +10,25 @@
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 कोड मिलता है (भले ही संकुचित हो), तो आप **संवेदनशील जानकारी और कमजोरियों को खोजने के लिए इसका विश्लेषण कर सकते हैं**
यदि आप `index.android.bundle` की सामग्री की जांच करते हैं और आपको एप्लिकेशन का JavaScript कोड मिलता है (भले ही यह मिनिफाइड हो), तो आप **संवेदनशील जानकारी और कमजोरियों को खोजने के लिए इसका विश्लेषण कर सकते हैं**
चूंकि बंडल वास्तव में एप्लिकेशन का सभी JS कोड शामिल करता है, इसलिए इसे **विभिन्न फ़ाइलों में विभाजित करना संभव है** (संभावित रूप से इसके रिवर्स इंजीनियरिंग को आसान बनाना) **उपकरण [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)** का उपयोग करके।
चूंकि बंडल वास्तव में एप्लिकेशन का सभी JS कोड शामिल करता है, इसलिए इसे **विभिन्न फ़ाइलों में विभाजित करना संभव है** (संभावित रूप से इसके रिवर्स इंजीनियरिंग को आसान बनाना) **टूल [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)** का उपयोग करके।
### Webpack
@ -24,13 +38,13 @@ JavaScript कोड का और विश्लेषण करने के
```html
<script src="./index.android.bundle"></script>
```
2. Google Chrome में `index.html` फ़ाइल खोलें।
2. `index.html` फ़ाइल को Google Chrome में खोलें।
3. **OS X के लिए Command+Option+J** या **Windows के लिए Control+Shift+J** दबाकर Developer Toolbar खोलें।
3. **Command+Option+J for OS X** या **Control+Shift+J for Windows** दबाकर Developer Toolbar खोलें।
4. Developer Toolbar में "Sources" पर क्लिक करें। आपको एक JavaScript फ़ाइल दिखाई देगी जो फ़ोल्डरों और फ़ाइलों में विभाजित है, जो मुख्य बंडल बनाती है।
यदि आपको `index.android.bundle.map` नाम की फ़ाइल मिलती है, तो आप स्रोत कोड का विश्लेषण अनमिनिफाइड प्रारूप में कर सकेंगे। मैप फ़ाइलें स्रोत मैपिंग को शामिल करती हैं, जो आपको मिनिफाइड पहचानकर्ताओं को मैप करने की अनुमति देती हैं।
यदि आप `index.android.bundle.map` नाम की फ़ाइल पाते हैं, तो आप अनमिनिफाइड प्रारूप में स्रोत कोड का विश्लेषण कर सकेंगे। मैप फ़ाइलें स्रोत मैपिंग को शामिल करती हैं, जो आपको मिनिफाइड पहचानकर्ताओं को मैप करने की अनुमति देती हैं।
संवेदनशील क्रेडेंशियल्स और एंडपॉइंट्स की खोज करने के लिए, इन चरणों का पालन करें:
@ -40,42 +54,142 @@ JavaScript कोड का और विश्लेषण करने के
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 बाइटकोड
यदि बंडल में **Hermes बाइटकोड** है, तो आप ऐप के Javascript कोड तक **पहुँच नहीं पाएंगे** (यहां तक कि मिनिफाइड संस्करण तक भी नहीं)।
यदि बंडल में **Hermes बाइटकोड** है, तो आप ऐप के Javascript कोड तक **पहुँच नहीं पाएंगे** (यहां तक कि संकुचित संस्करण तक भी नहीं)।
आप निम्नलिखित कमांड चलाकर जांच सकते हैं कि बंडल में Hermes बाइटकोड है या नहीं:
आप निम्नलिखित कमांड चलाकर जांच सकते हैं कि क्या बंडल में Hermes बाइटकोड है:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
हालांकि, आप उपकरणों का उपयोग कर सकते हैं **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** या **[hermes_rs](https://github.com/Pilfer/hermes_rs)** को **बाइटकोड को डिस्सेम्बल करने** और इसे **कुछ प्सेडो JS कोड में डिकंपाइल करने** के लिए। ऐसा करने के लिए, उदाहरण के लिए ये कमांड:
हालांकि, आप उपकरणों का उपयोग कर सकते हैं **[hbctool](https://github.com/bongtrop/hbctool)**, hbctool के अपडेटेड फोर्क जो नए बाइटकोड संस्करणों का समर्थन करते हैं, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (Rust लाइब्रेरी/APIs), या **[hermes-dec](https://github.com/P1sec/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
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### कोड बदलें और पुनर्निर्माण करें
Tip: ओपन-सोर्स Hermes प्रोजेक्ट विशेष Hermes रिलीज़ में `hbcdump` जैसे डेवलपर टूल भी प्रदान करता है। यदि आप उस बंडल को बनाने के लिए उपयोग किए गए मेल खाने वाले Hermes संस्करण का निर्माण करते हैं, तो `hbcdump` कार्यों, स्ट्रिंग तालिकाओं और गहरे विश्लेषण के लिए बाइटकोड को डंप कर सकता है।
आदर्श रूप से, आपको असेंबल किए गए कोड को संशोधित करने में सक्षम होना चाहिए (तुलना बदलना, या एक मान या जो भी आपको संशोधित करने की आवश्यकता है) और फिर **बाइटकोड को पुनर्निर्माण** करना चाहिए और फिर ऐप को पुनर्निर्माण करना चाहिए।
### कोड बदलें और पुनर्निर्माण करें (Hermes)
उपकरण **[hbctool](https://github.com/bongtrop/hbctool)** बंडल को असेंबल करने और परिवर्तनों के बाद इसे वापस बनाने का समर्थन करता है, हालाँकि यह **केवल पुराने संस्करणों** के Hermes बाइटकोड का समर्थन करता है।
आदर्श रूप से, आपको असेंबल किए गए कोड में संशोधन करने में सक्षम होना चाहिए (तुलना, या मान या जो भी आपको संशोधित करने की आवश्यकता है) और फिर **बाइटकोड को पुनर्निर्माण** करना चाहिए और ऐप को पुनर्निर्माण करना चाहिए
उपकरण **[hermes-dec](https://github.com/P1sec/hermes-dec)** बाइटकोड को पुनर्निर्माण करने का समर्थन नहीं करता है।
- मूल **[hbctool](https://github.com/bongtrop/hbctool)** बंडल को असेंबल करने और परिवर्तनों के बाद इसे फिर से बनाने का समर्थन करता है, लेकिन ऐतिहासिक रूप से केवल पुराने बाइटकोड संस्करणों का समर्थन किया है। समुदाय द्वारा बनाए गए फोर्क नए Hermes संस्करणों (मध्य-80 के दशक96 सहित) के लिए समर्थन बढ़ाते हैं और अक्सर आधुनिक RN ऐप्स को पैच करने के लिए सबसे व्यावहारिक विकल्प होते हैं।
- टूल **[hermes-dec](https://github.com/P1sec/hermes-dec)** बाइटकोड को पुनर्निर्माण का समर्थन नहीं करता (डीकंपाइलर/डिस्सेम्बलर केवल), लेकिन यह लॉजिक को नेविगेट करने और स्ट्रिंग्स को डंप करने में बहुत सहायक है।
- टूल **[hasmer](https://github.com/lucasbaizer2/hasmer)** कई Hermes संस्करणों के लिए असेंबली और असेंबली दोनों का समर्थन करने का लक्ष्य रखता है; असेंबली अभी भी परिपक्व हो रही है लेकिन हाल के बाइटकोड पर प्रयास करने के लायक है।
उपकरण **[hermes_rs](https://github.com/Pilfer/hermes_rs)** बाइटकोड को पुनर्निर्माण करने का समर्थन करता है, लेकिन यह वास्तव में एक पुस्तकालय है और CLI उपकरण नहीं है।
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/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/) पर पा सकते हैं।
आप ऐप का डायनामिक एनालिसिस करने के लिए Frida का उपयोग करके React ऐप के डेवलपर मोड को सक्षम करने और **`react-native-debugger`** का उपयोग करके इससे जुड़ने की कोशिश कर सकते हैं। हालाँकि, इसके लिए आपको ऐप का स्रोत कोड चाहिए होगा। आप इसके बारे में अधिक जानकारी [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/) पर पा सकते हैं।
### Frida के साथ रिलीज़ में Dev Support सक्षम करना (चेतावनियाँ)
कुछ ऐप्स गलती से ऐसे क्लासेस भेजते हैं जो Dev Support को टॉगल करने योग्य बनाते हैं। यदि मौजूद हैं, तो आप `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 इंटरसेप्शन और पिनिंग बायपास तकनीकों के लिए देखें:
{{#ref}}
make-apk-accept-ca-certificate.md
{{#endref}}
{{#ref}}
frida-tutorial/objection-tutorial.md
{{#endref}}
## लोकप्रिय RN लाइब्रेरी में हाल की समस्याएं (क्या देखना है)
JS बंडल या नेचुरल लाइब्रेरी में दिखाई देने वाले थर्ड-पार्टी मॉड्यूल का ऑडिट करते समय, ज्ञात कमजोरियों की जांच करें और `package.json`/`yarn.lock` में संस्करणों की पुष्टि करें।
- react-native-mmkv (Android): 2.11.0 से पहले के संस्करणों ने वैकल्पिक एन्क्रिप्शन कुंजी को Android लॉग में लॉग किया। यदि ADB/logcat उपलब्ध है, तो रहस्य पुनर्प्राप्त किए जा सकते हैं। सुनिश्चित करें कि >= 2.11.0 है। संकेत: `react-native-mmkv` का उपयोग, एन्क्रिप्शन के साथ MMKV init का उल्लेख करने वाले लॉग स्टेटमेंट। 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
```
## संदर्भ
- [https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7](https://medium.com/bugbountywriteup/lets-know-how-i-have-explored-the-buried-secrets-in-react-native-application-6236728198f7)
- [https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications](https://www.assetnote.io/resources/research/expanding-the-attack-surface-react-native-android-applications)
- [https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf](https://payatu.com/wp-content/uploads/2023/02/Mastering-React-Native-Application-Pentesting-A-Practical-Guide-2.pdf)
- CVE-2024-21668: react-native-mmkv लॉग्स एन्क्रिप्शन कुंजी Android पर, v2.11.0 में ठीक किया गया (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (और फोर्क) Hermes असेंबल/डिसअसेंबल के लिए: https://github.com/bongtrop/hbctool
{{#include ../../banners/hacktricks-training.md}}