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

This commit is contained in:
Translator 2025-08-21 04:15:41 +00:00
parent 176ada9f38
commit 1fd39c3c2e

View File

@ -1,7 +1,7 @@
{{#include ../../banners/hacktricks-training.md}}
# React Native Toepassing Analise
{{#include ../../banners/hacktricks-training.md}}
Om te bevestig of die toepassing op die React Native raamwerk gebou is, volg hierdie stappe:
1. Hernoem die APK-lêer met 'n zip-uitbreiding en onttrek dit na 'n nuwe gids met die opdrag `cp com.example.apk example-apk.zip` en `unzip -qq example-apk.zip -d ReactNative`.
@ -10,15 +10,29 @@ Om te bevestig of die toepassing op die React Native raamwerk gebou is, volg hie
3. Gebruik die opdrag `find . -print | grep -i ".bundle$"` om die JavaScript-lêer te soek.
Nota: As jy 'n Android App Bundle (.aab) gegee word in plaas van 'n APK, genereer eers 'n universele APK en onttrek dan die bundel:
```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 Kode
As jy die inhoud van die `index.android.bundle` nagaan en die JavaScript-kode van die toepassing vind (selfs al is dit geminimaliseer), kan jy **dit analiseer om sensitiewe inligting en kwesbaarhede te vind**.
As jy die inhoud van die `index.android.bundle` nagaan, vind jy die JavaScript kode van die toepassing (selfs as dit geminifiseer is), jy kan **dit analiseer om sensitiewe inligting en kwesbaarhede te vind**.
Aangesien die bundel eintlik al die JS-kode van die toepassing bevat, is dit moontlik om **dit in verskillende lêers te verdeel** (wat die omgekeerde ingenieurswese potensieel makliker maak) met behulp van die **tool [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
Aangesien die bundel eintlik al die JS kode van die toepassing bevat, is dit moontlik om **dit in verskillende lêers te verdeel** (wat moontlik die omgekeerde ingenieurswese vergemaklik) met behulp van die **tool [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Om die JavaScript-kode verder te analiseer, kan jy die lêer op [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) oplaai of volg hierdie stappe:
Om die JavaScript kode verder te analiseer, kan jy die lêer op [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) oplaai of hierdie stappe volg:
1. Skep 'n lêer genaamd `index.html` in dieselfde gids met die volgende kode:
```html
@ -28,7 +42,7 @@ Om die JavaScript-kode verder te analiseer, kan jy die lêer op [https://spacera
3. Maak die Ontwikkelaar Toolbar oop deur **Command+Option+J vir OS X** of **Control+Shift+J vir Windows** te druk.
4. Klik op "Sources" in die Ontwikkelaar Toolbar. Jy behoort 'n JavaScript-lêer te sien wat in vouers en lêers verdeel is, wat die hoofpakket vorm.
4. Klik op "Sources" in die Ontwikkelaar Toolbar. Jy behoort 'n JavaScript-lêer te sien wat in vouers en lêers verdeel is, wat die hoofbundel vorm.
As jy 'n lêer genaamd `index.android.bundle.map` vind, sal jy in staat wees om die bronkode in 'n ongeminifiseerde formaat te analiseer. Kaartlêers bevat bronkaarte, wat jou toelaat om geminifiseerde identifiseerders te kaart.
@ -40,42 +54,142 @@ Om sensitiewe akrediteerbare en eindpunte te soek, volg hierdie stappe:
3. Dit was gelukkig dat sensitiewe hard-gecodeerde akrediteerbare in die JavaScript-kode gevind is tydens die rekonsiliasieproses.
### Verander JS-kode en herbou
### Vinnige geheime/eindpunt jag in bundels
In hierdie geval is dit maklik om die kode te verander. Jy moet net die app hernoem om die uitbreiding `.zip` te gebruik en dit uit te pak. Dan kan jy **die JS-kode binne hierdie pakket wysig en die app herbou**. Dit behoort genoeg te wees om jou in staat te stel om **kode in die app in te spuit** vir toetsdoeleindes.
Hierdie eenvoudige greps bring dikwels interessante aanduiders na vore selfs in geminifiseerde 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*:)"
```
As jy vermoed dat Over-The-Air opdatering raamwerke, soek ook vir:
- Microsoft App Center / CodePush ontplooi sleutels
- Expo EAS Updates konfigurasie (`expo-updates`, `expo\.io`, onderteken sertifikate)
### Verander JS kode en herbou
In hierdie geval is dit maklik om die kode te verander. Jy moet net die app hernoem om die uitbreiding `.zip` te gebruik en dit uit te pak. Dan kan jy **die JS kode binne hierdie bundel verander en die app herbou**. Dit behoort genoeg te wees om jou in staat te stel om **kode in die app in te spuit** vir toetsdoeleindes.
## Hermes bytecode
As die pakket **Hermes bytecode** bevat, sal jy **nie toegang hê tot die Javascript-kode** van die app nie (selfs nie die geminifiseerde weergawe nie).
As die bundel **Hermes bytecode** bevat, sal jy **nie toegang hê tot die Javascript kode** van die app nie (nie eers tot die geminifiseerde weergawe nie).
Jy kan nagaan of die pakket Hermes bytecode bevat deur die volgende opdrag uit te voer:
Jy kan nagaan of die bundel Hermes bytecode bevat deur die volgende opdrag uit te voer:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
U kan egter die gereedskap **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** of **[hermes_rs](https://github.com/Pilfer/hermes_rs)** gebruik om die **bytecode te ontbind** en ook om dit **na 'n pseudo JS-kode te dekompileer**. Om dit te doen, byvoorbeeld hierdie opdragte:
U kan egter die gereedskap **[hbctool](https://github.com/bongtrop/hbctool)**, opgedateerde forks van hbctool wat nuwer bytecode weergawes ondersteun, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (Rust biblioteek/APIs), of **[hermes-dec](https://github.com/P1sec/hermes-dec)** gebruik om die **bytecode te ontleed** en ook om dit **na 'n pseudo JS-kode te dekompileer**. Byvoorbeeld:
```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
```
### Verander kode en herbou
Tip: Die oopbron Hermes-projek lewer ook ontwikkelaarstoestelle soos `hbcdump` in spesifieke Hermes-uitgawes. As jy die ooreenstemmende Hermes-weergawe bou wat gebruik is om die bundel te produseer, kan `hbcdump` funksies, stringtabelle en bytecode dump vir dieper analise.
Ideaal gesproke behoort jy in staat te wees om die gedissasembelde kode te wysig (om 'n vergelyking, of 'n waarde of wat ook al jy moet verander) en dan **die bytecode te herbou** en dan die app te herbou.
### Verander kode en herbou (Hermes)
Die hulpmiddel **[hbctool](https://github.com/bongtrop/hbctool)** ondersteun die dissasembler van die bundel en die herbou daarvan nadat die veranderinge aangebring is, maar dit **ondersteun slegs ou weergawes** van Hermes bytecode.
Ideaal gesproke behoort jy in staat te wees om die gedemonteerde kode te verander (soos 'n vergelyking, of 'n waarde of wat jy ook al moet verander) en dan **herbou die bytecode** en herbou die app.
Die hulpmiddel **[hermes-dec](https://github.com/P1sec/hermes-dec)** ondersteun nie die herbou van die bytecode nie.
- Die oorspronklike **[hbctool](https://github.com/bongtrop/hbctool)** ondersteun die demontage van die bundel en die herbou daarvan na veranderinge, maar het histories net ouer bytecode-weergawe ondersteun. Gemeenskap-onderhande forks brei ondersteuning uit na nuwer Hermes-weergawe (insluitend middel-80s96) en is dikwels die mees praktiese opsie om moderne RN-apps te patch.
- Die hulpmiddel **[hermes-dec](https://github.com/P1sec/hermes-dec)** ondersteun nie die herbou van die bytecode nie (decompiler/demontageer net), maar dit is baie nuttig om logika te navigeer en stringe te dump.
- Die hulpmiddel **[hasmer](https://github.com/lucasbaizer2/hasmer)** is daarop gemik om beide demontage en samestelling vir verskeie Hermes-weergawe te ondersteun; samestelling is steeds aan die ontwikkel, maar dit is die moeite werd om op onlangse bytecode te probeer.
Die hulpmiddel **[hermes_rs](https://github.com/Pilfer/hermes_rs)** ondersteun die herbou van die bytecode, maar dit is eintlik 'n biblioteek en nie 'n CLI-hulpmiddel nie.
'n Minimale werksvloei met hbctool-agtige samestellers:
```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)
```
Let wel dat die Hermes bytecode-formaat geversioneer is en die assembler moet ooreenstem met die presiese op-disk formaat. As jy formaatfoute kry, skakel oor na 'n opgedateerde fork/alternatief of herbou die ooreenstemmende Hermes-gereedskap.
## Dinamiese Analise
Jy kan probeer om die app dinamies te analiseer deur Frida te gebruik om die ontwikkelaarmodus van die React-app in te skakel en **`react-native-debugger`** te gebruik om daaraan te koppel. Maar hiervoor het jy blykbaar die bronkode van die app nodig. Jy kan meer inligting hieroor vind in [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
Jy kan probeer om die app dinamies te analiseer deur Frida te gebruik om die ontwikkelaarmodus van die React-app in te skakel en **`react-native-debugger`** te gebruik om dit aan te sluit. Dit blyk egter dat jy die bronkode van die app nodig het. Jy kan meer inligting hieroor vind in [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
### Aktivering van Dev Support in vrystelling met Frida (voorbehoude)
Sommige apps stuur per ongeluk klasse wat Dev Support aan- en afskakelbaar maak. As dit teenwoordig is, kan jy probeer om `getUseDeveloperSupport()` te dwing om waar te terug te gee:
```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);
}
});
```
Waarskuwing: In behoorlik geboude vrystellings, word `DevSupportManagerImpl` en verwante slegs-debug klasse verwyder en om hierdie vlag te draai kan die aansoek laat crash of geen effek hê nie. Wanneer dit werk, kan jy tipies die ontwikkelaarsmenu blootstel en debuggers/inspekteurs aanheg.
### Netwerkonderbreking in RN aansoeke
React Native Android staat tipies op OkHttp onder die oppervlak (via die `Networking` inheemse module). Om verkeer op 'n nie-gewortelde toestel tydens dinamiese toetse te onderbreek/observeer:
- Gebruik stelselsproxy + vertrou gebruiker CA of gebruik ander generiese Android TLS omseil tegnieke.
- RN-spesifieke wenk: as die aansoek Flipper per ongeluk in vrystelling saamgepak het (debug gereedskap), kan die Flipper Netwerk-inprop versoeke/antwoorde blootstel.
Vir generiese Android onderbreking en pinning omseil tegnieke, verwys na:
{{#ref}}
make-apk-accept-ca-certificate.md
{{#endref}}
{{#ref}}
frida-tutorial/objection-tutorial.md
{{#endref}}
## Onlangse probleme in gewilde RN biblioteke (waar om na te kyk)
Wanneer jy derdeparty modules wat sigbaar is in die JS bundel of inheemse biblioteke, oudit, kyk vir bekende kwesbaarhede en verifieer weergawes in `package.json`/`yarn.lock`.
- react-native-mmkv (Android): weergawes voor 2.11.0 het die opsionele versleuteling sleutel na Android logs gelog. As ADB/logcat beskikbaar is, kan geheime herwin word. Verseker >= 2.11.0. Aanwysers: gebruik van `react-native-mmkv`, log verklarings wat MMKV init met versleuteling noem. CVE-2024-21668.
- react-native-document-picker: weergawes < 9.1.1 was kwesbaar vir pad traversering op Android (lêerkeuse), reggestel in 9.1.1. Verifieer insette en biblioteek weergawe.
Vinige kontroles:
```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
```
## Verwysings
- [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 versleuteling sleutel op Android, reggestel in v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (en forks) vir Hermes saamstel/ontsamstel: https://github.com/bongtrop/hbctool
{{#include ../../banners/hacktricks-training.md}}