mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/react-native-a
This commit is contained in:
parent
176ada9f38
commit
1fd39c3c2e
@ -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-80s–96) 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}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user