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:
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.
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)**.
@ -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:
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
<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.
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.
### 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
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
file index.android.bundle
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
# 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
```
### 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
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
- [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 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}}