mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
196 lines
12 KiB
Markdown
196 lines
12 KiB
Markdown
# Анализа React Native апликације
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
Da biste potvrdili da li je aplikacija izgrađena na React Native okviru, pratite sledeće korake:
|
||
|
||
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.
|
||
|
||
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
|
||
|
||
# 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)**.
|
||
|
||
### Webpack
|
||
|
||
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 istom direktorijumu sa sledećim kodom:
|
||
```html
|
||
<script src="./index.android.bundle"></script>
|
||
```
|
||
2. Otvorite `index.html` datoteku u Google Chrome-u.
|
||
|
||
3. Otvorite Developer Toolbar pritiskom na **Command+Option+J za OS X** ili **Control+Shift+J za Windows**.
|
||
|
||
4. Kliknite na "Sources" u Developer Toolbar-u. Trebalo bi da vidite JavaScript datoteku koja je podeljena na foldere i datoteke, čineći glavni paket.
|
||
|
||
Ako pronađete datoteku pod nazivom `index.android.bundle.map`, moći ćete da analizirate izvorni kod u nekompresovanom formatu. Map datoteke sadrže izvorno mapiranje, što vam omogućava da mapirate kompresovane identifikatore.
|
||
|
||
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 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 procesa rekognosciranja.
|
||
|
||
### 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. 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 bajtkod
|
||
|
||
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 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)**, 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
|
||
```
|
||
Tip: Otvoreni projekat Hermes takođe uključ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.
|
||
|
||
### Promenite kod i ponovo izgradite (Hermes)
|
||
|
||
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.
|
||
|
||
- 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-ih–96) 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.
|
||
|
||
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 assembler mora odgovarati tačno onom formatu 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 (alatke 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 logovima. Ako su ADB/logcat dostupni, 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}}
|