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

This commit is contained in:
Translator 2025-08-21 04:15:11 +00:00
parent 175f4716c0
commit b04458d8bd

View File

@ -1,81 +1,195 @@
{{#include ../../banners/hacktricks-training.md}}
# Uchambuzi wa Programu ya React Native
{{#include ../../banners/hacktricks-training.md}}
Ili kuthibitisha kama programu imejengwa kwenye mfumo wa React Native, fuata hatua hizi:
1. Badilisha jina la faili la APK kwa kiambishi cha zip na uondoe kwenye folda mpya kwa kutumia amri `cp com.example.apk example-apk.zip` na `unzip -qq example-apk.zip -d ReactNative`.
2. Tembea kwenye folda mpya iliyoundwa ya ReactNative na pata folda ya mali. Ndani ya folda hii, unapaswa kupata faili `index.android.bundle`, ambayo ina JavaScript ya React katika muundo wa minified.
2. Tembea kwenye folda mpya iliyoundwa ya ReactNative na pata folda ya mali. Ndani ya folda hii, unapaswa kupata faili `index.android.bundle`, ambayo ina React JavaScript katika muundo wa minified.
3. Tumia amri `find . -print | grep -i ".bundle$"` kutafuta faili la JavaScript.
## Kode ya Javascript
Kumbuka: Ikiwa umepatiwa Android App Bundle (.aab) badala ya APK, tengeneza APK ya ulimwengu kwanza kisha uondoe bundle:
```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
Ikiwa unakagua maudhui ya `index.android.bundle` unapata kode ya JavaScript ya programu (hata kama imepunguzika), unaweza **kuichambua ili kupata taarifa nyeti na udhaifu**.
# 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
Kwa kuwa bundle ina kweli kode yote ya JS ya programu, inawezekana **kugawanya katika faili tofauti** (inaweza kurahisisha uhandisi wa kinyume) kwa kutumia **chombo [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
Ikiwa unakagua maudhui ya `index.android.bundle` unapata msimbo wa JavaScript wa programu (hata kama umewekwa kwa njia ya minified), unaweza **kuuchambua ili kupata taarifa nyeti na udhaifu**.
Kwa kuwa bundle ina kweli msimbo wote wa JS wa programu, inawezekana **kugawanya katika faili tofauti** (ikiwezekana kufanya urahisi wa uhandisi wa kinyume) kwa kutumia **chombo [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Ili kuchambua zaidi kode ya JavaScript, unaweza kupakia faili kwenye [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) au fuata hatua hizi:
Ili kuchambua zaidi msimbo wa JavaScript, unaweza kupakia faili kwenye [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) au fuata hatua hizi:
1. Unda faili inayoitwa `index.html` katika saraka hiyo hiyo yenye kode ifuatayo:
1. Tengeneza faili lililo na jina `index.html` katika saraka hiyo hiyo lenye msimbo ufuatao:
```html
<script src="./index.android.bundle"></script>
```
2. Fungua faili `index.html` katika Google Chrome.
2. Fungua faili la `index.html` katika Google Chrome.
3. Fungua Developer Toolbar kwa kubonyeza **Command+Option+J kwa OS X** au **Control+Shift+J kwa Windows**.
4. Bonyeza "Sources" katika Developer Toolbar. Unapaswa kuona faili la JavaScript ambalo limegawanywa katika folda na faili, likiunda bundle kuu.
Ikiwa utapata faili inayoitwa `index.android.bundle.map`, utaweza kuchambua msimbo wa chanzo katika muundo usio na minified. Faili za ramani zina ramani ya chanzo, ambayo inakuwezesha kuunganisha vitambulisho vilivyopunguzika.
Ikiwa utapata faili inayoitwa `index.android.bundle.map`, utaweza kuchambua msimbo wa chanzo katika muundo usio na kupunguzwa. Faili za ramani zina ramani ya chanzo, ambayo inakuwezesha kuunganisha vitambulisho vilivyopunguzwa.
Ili kutafuta akidi nyeti na mwisho, fuata hatua hizi:
1. Tambua maneno nyeti ili kuchambua msimbo wa JavaScript. Programu za React Native mara nyingi hutumia huduma za watu wa tatu kama Firebase, AWS S3 service endpoints, funguo za kibinafsi, n.k.
1. Tambua maneno nyeti ili kuchambua msimbo wa JavaScript. Programu za React Native mara nyingi hutumia huduma za watu wengine kama Firebase, AWS S3 service endpoints, funguo za kibinafsi, n.k.
2. Katika kesi hii maalum, programu ilionekana ikitumia huduma ya Dialogflow. Tafuta muundo unaohusiana na usanidi wake.
3. Ilikuwa na bahati kwamba akidi nyeti zilizowekwa kwa nguvu zilipatikana katika msimbo wa JavaScript wakati wa mchakato wa recon.
3. Ilikuwa na bahati kwamba akidi nyeti zilizowekwa kwa mikono zilipatikana katika msimbo wa JavaScript wakati wa mchakato wa recon.
### Uwindaji wa siri/mwisho wa haraka katika bundles
Hizi greps rahisi mara nyingi huleta viashiria vya kuvutia hata katika JS iliyopunguzwa:
```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*:)"
```
Ikiwa unashuku mifumo ya sasisho ya Over-The-Air, pia tafuta:
- Microsoft App Center / CodePush deployment keys
- Mipangilio ya Expo EAS Updates (`expo-updates`, `expo\.io`, vyeti vya kusaini)
### Badilisha msimbo wa JS na ujenge upya
Katika kesi hii kubadilisha msimbo ni rahisi. Unahitaji tu kubadilisha jina la programu ili kutumia kiambishi cha `.zip` na kukitoa. Kisha unaweza **kubadilisha msimbo wa JS ndani ya bundle hii na kujenga upya programu**. Hii inapaswa kuwa ya kutosha kukuwezesha **kuingiza msimbo** katika programu kwa madhumuni ya majaribio.
Katika kesi hii, kubadilisha msimbo ni rahisi. Unahitaji tu kubadilisha jina la programu ili kutumia kiambishi `.zip` na kuikamua. Kisha unaweza **kubadilisha msimbo wa JS ndani ya bundle hii na kujenga upya programu**. Hii inapaswa kuwa ya kutosha kukuruhusu **kuingiza msimbo** katika programu kwa madhumuni ya majaribio.
## Hermes bytecode
Ikiwa bundle ina **Hermes bytecode**, hu **wezi kufikia msimbo wa Javascript** wa programu (hata si toleo lililopunguzika).
Ikiwa bundle ina **Hermes bytecode**, hu **wezi kufikia msimbo wa Javascript** wa programu (hata toleo lililopunguzika).
Unaweza kuangalia ikiwa bundle ina Hermes bytecode kwa kuendesha amri ifuatayo:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Hata hivyo, unaweza kutumia zana **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** au **[hermes_rs](https://github.com/Pilfer/hermes_rs)** ili **kufanya disassembly ya bytecode** na pia **kui-decompile hadi baadhi ya pseudo JS code**. Kufanya hivyo, kwa mfano amri hizi:
Hata hivyo, unaweza kutumia zana **[hbctool](https://github.com/bongtrop/hbctool)**, forks zilizosasishwa za hbctool zinazounga mkono toleo jipya la bytecode, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (maktaba/APIs za Rust), au **[hermes-dec](https://github.com/P1sec/hermes-dec)** ili **kufanya disassembly ya bytecode** na pia **kudekompile hadi baadhi ya msimbo wa pseudo JS**. Kwa mfano:
```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
```
### Badilisha msimbo na jenga upya
Tip: Mradi wa Hermes wa chanzo wazi pia unatoa zana za waendelezaji kama `hbcdump` katika toleo maalum za Hermes. Ikiwa unajenga toleo linalolingana la Hermes lililotumika kutengeneza kifurushi, `hbcdump` inaweza kutoa kazi, meza za nyuzi, na bytecode kwa uchambuzi wa kina.
Kwa kawaida unapaswa kuwa na uwezo wa kubadilisha msimbo ulioondolewa (kubadilisha kulinganisha, au thamani au chochote unachohitaji kubadilisha) na kisha **jenga upya bytecode** na kisha jenga upya programu.
### Badilisha msimbo na ujenge upya (Hermes)
Zana **[hbctool](https://github.com/bongtrop/hbctool)** inasaidia kuondoa muunganisho na kujenga tena baada ya mabadiliko kufanywa, hata hivyo inasaidia **toleo za zamani tu** za bytecode ya Hermes.
Kwa kawaida unapaswa kuwa na uwezo wa kubadilisha msimbo ulioondolewa (kubadilisha kulinganisha, au thamani au chochote unachohitaji kubadilisha) na kisha **ujenge upya bytecode** na ujenge upya programu.
Zana **[hermes-dec](https://github.com/P1sec/hermes-dec)** haisaidii kujenga upya bytecode.
- Zana asilia **[hbctool](https://github.com/bongtrop/hbctool)** inasaidia kuondoa kifurushi na kujenga tena baada ya mabadiliko, lakini kihistoria ilisaidia tu toleo za zamani za bytecode. Matawi yanayoshughulikiwa na jamii yanaongeza msaada kwa toleo mpya za Hermes (ikiwemo katikati ya miaka ya 8096) na mara nyingi ni chaguo bora zaidi kurekebisha programu za kisasa za RN.
- Zana **[hermes-dec](https://github.com/P1sec/hermes-dec)** haisaidii kujenga upya bytecode (decompiler/disassembler tu), lakini ni ya msaada sana katika kuvinjari mantiki na kutoa nyuzi.
- Zana **[hasmer](https://github.com/lucasbaizer2/hasmer)** inalenga kusaidia kuondoa na kujenga kwa toleo nyingi za Hermes; kujenga bado kunaendelea lakini inastahili kujaribu kwenye bytecode za hivi karibuni.
Zana **[hermes_rs](https://github.com/Pilfer/hermes_rs)** inasaidia kujenga upya bytecode, lakini kwa kweli ni maktaba na si zana ya CLI.
Mchakato wa chini na waandishi kama hbctool:
```bash
# 1) Disassemble to HASM directories
hbctool disasm assets/index.android.bundle ./hasm
## Uchambuzi wa Dyanmic
# 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.
Unaweza kujaribu kuchambua programu kwa njia ya dyanmic kwa kutumia Frida kuwezesha hali ya maendeleo ya programu ya React na kutumia **`react-native-debugger`** kuungana nayo. Hata hivyo, kwa hili unahitaji msimbo wa chanzo wa programu kwa wazi. Unaweza kupata maelezo zaidi kuhusu hili katika [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
# 3) Reassemble into a new bundle
hbctool asm ./hasm assets/index.android.bundle
## Marejeleo
# 4) Repack the APK and resign
zip -r ../patched.apk *
# Align/sign as usual (see Android signing section in HackTricks)
```
Kumbuka kwamba muundo wa bytecode wa Hermes umewekwa toleo na mkusanyiko lazima ulingane na muundo halisi wa diski. Ikiwa unapata makosa ya muundo, badilisha kwa toleo lililosasishwa/fork mbadala au jenga tena zana zinazolingana za Hermes.
## Uchambuzi wa Kijamii
Unaweza kujaribu kuchambua kwa njia ya kijamii programu kwa kutumia Frida kuwezesha hali ya maendeleo ya programu ya React na kutumia **`react-native-debugger`** kuungana nayo. Hata hivyo, kwa hili unahitaji msimbo wa chanzo wa programu hiyo kwa wazi. Unaweza kupata maelezo zaidi kuhusu hili katika [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
### Kuwezesha Msaada wa Dev katika toleo la kutolewa na Frida (vikwazo)
Programu zingine kwa bahati mbaya zinapeleka madarasa ambayo yanaweza kufanya Msaada wa Dev kuwa na uwezo wa kubadilishwa. Ikiwa zipo, unaweza kujaribu kulazimisha `getUseDeveloperSupport()` kurudisha kweli:
```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: Katika toleo zilizojengwa vizuri, `DevSupportManagerImpl` na madarasa mengine ya debug pekee yanakatwa na kubadilisha bendera hii kunaweza kusababisha programu kuanguka au kutokuwa na athari. Wakati hii inafanya kazi, kwa kawaida unaweza kufichua menyu ya maendeleo na kuunganisha debuggers/inspectors.
### Ukatishaji wa mtandao katika programu za RN
React Native Android kwa kawaida inategemea OkHttp chini ya uso (kupitia moduli asilia ya `Networking`). Ili kukamata/kuchunguza trafiki kwenye kifaa kisichokuwa na root wakati wa majaribio ya dynamic:
- Tumia proxy ya mfumo + amini CA ya mtumiaji au tumia mbinu nyingine za kawaida za TLS bypass za Android.
- Kidokezo maalum cha RN: ikiwa programu inajumuisha Flipper katika toleo la uzalishaji kwa bahati mbaya (zana za debug), plugin ya Flipper Network inaweza kufichua maombi/jibu.
Kwa mbinu za kawaida za ukatishaji wa Android na pinning bypass rejea:
{{#ref}}
make-apk-accept-ca-certificate.md
{{#endref}}
{{#ref}}
frida-tutorial/objection-tutorial.md
{{#endref}}
## Masuala ya hivi karibuni katika maktaba maarufu za RN (nini cha kuangalia)
Wakati wa kukagua moduli za upande wa tatu zinazonekana katika kifurushi cha JS au maktaba asilia, angalia kwa vulns zinazojulikana na thibitisha toleo katika `package.json`/`yarn.lock`.
- react-native-mmkv (Android): toleo kabla ya 2.11.0 lilirekodi funguo za usimbaji za hiari kwenye kumbukumbu za Android. Ikiwa ADB/logcat inapatikana, siri zinaweza kurejeshwa. Hakikisha >= 2.11.0. Viashiria: matumizi ya `react-native-mmkv`, taarifa za log zinazotaja MMKV kuanzishwa na usimbaji. CVE-2024-21668.
- react-native-document-picker: toleo < 9.1.1 lilikuwa na udhaifu wa kupita njia kwenye Android (uchaguzi wa faili), lilirekebishwa katika 9.1.1. Thibitisha ingizo na toleo la maktaba.
Ukaguzi wa haraka:
```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
```
## Marejeo
- [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 logs encryption key on Android, fixed in v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (na forks) kwa Hermes assemble/disassemble: https://github.com/bongtrop/hbctool
{{#include ../../banners/hacktricks-training.md}}