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

This commit is contained in:
Translator 2025-08-21 04:13:47 +00:00
parent 5f66696476
commit 9e1aa523f3

View File

@ -1,18 +1,32 @@
{{#include ../../banners/hacktricks-training.md}} # React Native Application Analysis
# Analiza React Native Aplikacije {{#include ../../banners/hacktricks-training.md}}
Da biste potvrdili da li je aplikacija izgrađena na React Native okviru, pratite ove korake: Da biste potvrdili da li je aplikacija izgrađena na React Native okviru, pratite ove korake:
1. Preimenujte APK datoteku sa zip ekstenzijom i raspakujte je u novu fasciklu koristeći komandu `cp com.example.apk example-apk.zip` i `unzip -qq example-apk.zip -d ReactNative`. 1. Preimenujte APK datoteku sa zip ekstenzijom i ekstraktujte je u novu fasciklu koristeći komandu `cp com.example.apk example-apk.zip` i `unzip -qq example-apk.zip -d ReactNative`.
2. Idite u novokreiranu ReactNative fasciklu i pronađite fasciklu assets. Unutar ove fascikle, trebali biste pronaći datoteku `index.android.bundle`, koja sadrži React JavaScript u minifikovanom formatu. 2. Idite u novokreiranu ReactNative fasciklu i pronađite fasciklu assets. Unutar ove fascikle, trebali biste pronaći datoteku `index.android.bundle`, koja sadrži React JavaScript u minifikovanom formatu.
3. Koristite komandu `find . -print | grep -i ".bundle$"` da biste pretražili JavaScript datoteku. 3. Koristite komandu `find . -print | grep -i ".bundle$"` da biste pretražili JavaScript datoteku.
## Javascript Kod Napomena: Ako dobijete Android App Bundle (.aab) umesto APK-a, prvo generišite univerzalni APK, a zatim ekstraktujte 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
Ako prilikom provere sadržaja `index.android.bundle` pronađete JavaScript kod aplikacije (čak i ako je minifikovan), možete **analizirati ga da pronađete osetljive informacije i ranjivosti**. # 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
Ako proverite sadržaj `index.android.bundle`, pronaći ćete JavaScript kod aplikacije (čak i ako je minifikovan), možete **analizirati ga da pronađete osetljive informacije i ranjivosti**.
Pošto paket zapravo sadrži sav JS kod aplikacije, moguće je **podeliti ga u različite datoteke** (potencijalno olakšavajući njegovo obrnuto inženjerstvo) koristeći **alat [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**. Pošto paket zapravo sadrži sav JS kod aplikacije, moguće je **podeliti ga u različite datoteke** (potencijalno olakšavajući njegovo obrnuto inženjerstvo) koristeći **alat [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
@ -20,7 +34,7 @@ Pošto paket zapravo sadrži sav JS kod aplikacije, moguće je **podeliti ga u r
Da biste dalje analizirali JavaScript kod, možete otpremiti datoteku na [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ili pratiti ove korake: Da biste dalje analizirali JavaScript kod, možete otpremiti datoteku na [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ili pratiti ove korake:
1. Kreirajte datoteku pod imenom `index.html` u istoj fascikli sa sledećim kodom: 1. Kreirajte datoteku pod imenom `index.html` u istom direktorijumu sa sledećim kodom:
```html ```html
<script src="./index.android.bundle"></script> <script src="./index.android.bundle"></script>
``` ```
@ -36,46 +50,146 @@ Da biste pretražili osetljive akreditive i krajnje tačke, pratite ove korake:
1. Identifikujte osetljive ključne reči za analizu JavaScript koda. React Native aplikacije često koriste usluge trećih strana kao što su Firebase, AWS S3 usluge, privatni ključevi itd. 1. Identifikujte osetljive ključne reči za analizu JavaScript koda. React Native aplikacije često koriste usluge trećih strana kao što su Firebase, AWS S3 usluge, privatni ključevi itd.
2. U ovom specifičnom slučaju, primećeno je da aplikacija koristi Dialogflow uslugu. Potražite obrazac povezan sa njenom konfiguracijom. 2. U ovom konkretnom slučaju, primećeno je da aplikacija koristi Dialogflow uslugu. Potražite obrazac povezan sa njenom konfiguracijom.
3. Bilo je sreće što su osetljivi hard-kodirani akreditive pronađeni u JavaScript kodu tokom recon procesa. 3. Bilo je sreće što su osetljivi hard-kodirani akreditive pronađeni u JavaScript kodu tokom recon procesa.
### Brzo pronalaženje tajni/krajnjih tačaka u paketima
Ovi jednostavni greps često otkrivaju zanimljive indikatore čak i u kompresovanom 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*:)"
```
Ako sumnjate u Over-The-Air update okvire, takođe tražite:
- Microsoft App Center / CodePush ključeve za implementaciju
- Expo EAS Updates konfiguraciju (`expo-updates`, `expo\.io`, sertifikate za potpisivanje)
### Promenite JS kod i ponovo izgradite ### Promenite JS kod i ponovo izgradite
U ovom slučaju, promena koda je jednostavna. Samo treba da preimenujete aplikaciju da koristi ekstenziju `.zip` i da je raspakujete. Zatim možete **modifikovati JS kod unutar ovog paketa i ponovo izgraditi aplikaciju**. Ovo bi trebalo da bude dovoljno da vam omogući da **ubacite kod** u aplikaciju u svrhe testiranja. U ovom slučaju, promena koda je jednostavna. Samo treba da preimenujete aplikaciju da koristi ekstenziju `.zip` i da je raspakujete. Tada možete **modifikovati JS kod unutar ovog paketa i ponovo izgraditi aplikaciju**. Ovo bi trebalo da bude dovoljno da vam omogući da **ubacite kod** u aplikaciju u svrhe testiranja.
## Hermes bytecode ## Hermes bajtkod
Ako paket sadrži **Hermes bytecode**, **nećete moći da pristupite JavaScript kodu** aplikacije (čak ni kompresovanoj verziji). Ako paket sadrži **Hermes bajtkod**, **nećete moći da pristupite Javascript kodu** aplikacije (čak ni minifikovanoj verziji).
Možete proveriti da li paket sadrži Hermes bytecode pokretanjem sledeće komande: Možete proveriti da li paket sadrži Hermes bajtkod pokretanjem sledeće komande:
```bash ```bash
file index.android.bundle file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96 index.android.bundle: Hermes JavaScript bytecode, version 96
``` ```
Međutim, možete koristiti alate **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** ili **[hermes_rs](https://github.com/Pilfer/hermes_rs)** da **dezintegrirate bajtkod** i takođe da **dekompajlirate u neki pseudo JS kod**. Da biste to uradili, na primer, ove komande: Međutim, možete koristiti alate **[hbctool](https://github.com/bongtrop/hbctool)**, ažurirane forke hbctool-a koje podržavaju novije verzije bajtkoda, **[hasmer](https://github.com/lucasbaizer2/hasmer)**, **[hermes_rs](https://github.com/Pilfer/hermes_rs)** (Rust biblioteka/APIs), ili **[hermes-dec](https://github.com/P1sec/hermes-dec)** da **dekompajlirate bajtkod** i takođe da **dekompajlirate u neki pseudo JS kod**. Na primer:
```bash ```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-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
``` ```
### Promena koda i ponovna izgradnja Tip: Otvoreni projekat Hermes takođe isporučuje alate za programere kao što je `hbcdump` u specifičnim izdanjima Hermesa. Ako izgradite odgovarajuću verziju Hermesa koja je korišćena za proizvodnju paketa, `hbcdump` može da izvuče funkcije, tabele stringova i bajtkod za dublju analizu.
Idealno bi bilo da možete da modifikujete disasemblirani kod (menjajući poređenje, ili vrednost ili šta god da treba da modifikujete) i zatim **ponovno izgradite bajtkod** i ponovo izgradite aplikaciju. ### Promenite kod i ponovo izgradite (Hermes)
Alat **[hbctool](https://github.com/bongtrop/hbctool)** podržava disasembliranje paketa i ponovnu izgradnju nakon što su promene izvršene, međutim **podržava samo stare verzije** Hermes bajtkoda. Idealno bi bilo da možete da modifikujete disassembled kod (menjajući poređenje, ili vrednost ili šta god da treba da modifikujete) i zatim **ponovo izgradite bajtkod** i ponovo izgradite aplikaciju.
Alat **[hermes-dec](https://github.com/P1sec/hermes-dec)** ne podržava ponovnu izgradnju bajtkoda. - Originalni **[hbctool](https://github.com/bongtrop/hbctool)** podržava disassembling paketa i ponovnu izgradnju nakon izmena, ali je istorijski podržavao samo starije verzije bajtkoda. Forkovi koje održava zajednica proširuju podršku na novije verzije Hermesa (uključujući sredinu 80-ih96) i često su najpraktičnija opcija za patchovanje modernih RN aplikacija.
- Alat **[hermes-dec](https://github.com/P1sec/hermes-dec)** ne podržava ponovnu izgradnju bajtkoda (samo dekompajler/disassembler), ali je veoma koristan za navigaciju logikom i izbacivanje stringova.
- Alat **[hasmer](https://github.com/lucasbaizer2/hasmer)** ima za cilj da podrži i disassembly i assembly za više verzija Hermesa; assembly se još uvek razvija, ali vredi probati na recentnom bajtkodu.
Alat **[hermes_rs](https://github.com/Pilfer/hermes_rs)** podržava ponovnu izgradnju bajtkoda, ali je zapravo biblioteka, a ne CLI alat. Minimalni radni tok sa hbctool-sličnim assemblerima:
```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)
```
Napomena da je Hermes bytecode format verzionisan i da se asembler mora poklapati sa tačnim formatom na disku. Ako dobijete greške u formatu, prebacite se na ažuriranu verziju/alternativu ili ponovo izgradite odgovarajući Hermes alat.
## Dinamička analiza ## Dinamička analiza
Možete pokušati da dinamički analizirate aplikaciju koristeći Frida da omogućite developerski režim React aplikacije i koristite **`react-native-debugger`** da se povežete na nju. Međutim, za ovo vam očigledno treba izvorni kod aplikacije. Više informacija o tome možete pronaći na [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/). Možete pokušati da dinamički analizirate aplikaciju koristeći Frida da omogućite developerski režim React aplikacije i koristite **`react-native-debugger`** da se povežete na nju. Međutim, za ovo vam očigledno treba izvorni kod aplikacije. Više informacija o tome možete pronaći na [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
### Omogućavanje Dev podrške u izdanju sa Frida (napomene)
Neke aplikacije slučajno isporučuju klase koje omogućavaju prebacivanje Dev podrške. Ako su prisutne, možete pokušati da primorate `getUseDeveloperSupport()` da vrati 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: U pravilno izgrađenim verzijama, `DevSupportManagerImpl` i povezane klase koje su samo za debagovanje se uklanjaju, a prebacivanje ove zastavice može uzrokovati pad aplikacije ili nemati efekta. Kada ovo funkcioniše, obično možete otvoriti dev meni i povezati debagere/inspektore.
### Presretanje mreže u RN aplikacijama
React Native Android obično se oslanja na OkHttp u pozadini (putem `Networking` nativnog modula). Da biste presreli/posmatrali saobraćaj na uređaju koji nije rootovan tokom dinamičkih testova:
- Koristite sistemski proxy + verujte korisničkom CA ili koristite druge generičke Android TLS zaobilaženje tehnike.
- RN-specifičan savet: ako aplikacija greškom uključuje Flipper u verziji (alat za debagovanje), Flipper Network dodatak može izložiti zahteve/odgovore.
Za generičke Android tehnike presretanja i zaobilaženja pinovanja pogledajte:
{{#ref}}
make-apk-accept-ca-certificate.md
{{#endref}}
{{#ref}}
frida-tutorial/objection-tutorial.md
{{#endref}}
## Nedavni problemi u popularnim RN bibliotekama (na šta obratiti pažnju)
Kada audirate module trećih strana vidljive u JS paketu ili nativnim bibliotekama, proverite poznate ranjivosti i verifikujte verzije u `package.json`/`yarn.lock`.
- react-native-mmkv (Android): verzije pre 2.11.0 su beležile opcioni ključ za enkripciju u Android logove. Ako je ADB/logcat dostupan, tajne bi mogle biti povraćene. Osigurajte >= 2.11.0. Indikatori: korišćenje `react-native-mmkv`, log izjave koje pominju MMKV inicijalizaciju sa enkripcijom. CVE-2024-21668.
- react-native-document-picker: verzije < 9.1.1 su bile ranjive na prelazak putanje na Androidu (izbor datoteka), ispravljeno u 9.1.1. Validirajte ulaze i verziju biblioteke.
Brze provere:
```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
```
## Reference ## Reference
- [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://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://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) - [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 beleži ključ za enkripciju logova na Androidu, ispravljeno u v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (i forke) za Hermes sastavljanje/raspoređivanje: https://github.com/bongtrop/hbctool
{{#include ../../banners/hacktricks-training.md}} {{#include ../../banners/hacktricks-training.md}}