From 9e1aa523f3c78d5cdbe10ab66827fa7c0411038c Mon Sep 17 00:00:00 2001 From: Translator Date: Thu, 21 Aug 2025 04:13:47 +0000 Subject: [PATCH] Translated ['src/mobile-pentesting/android-app-pentesting/react-native-a --- .../react-native-application.md | 150 +++++++++++++++--- 1 file changed, 132 insertions(+), 18 deletions(-) diff --git a/src/mobile-pentesting/android-app-pentesting/react-native-application.md b/src/mobile-pentesting/android-app-pentesting/react-native-application.md index f684b4e6a..072a0820d 100644 --- a/src/mobile-pentesting/android-app-pentesting/react-native-application.md +++ b/src/mobile-pentesting/android-app-pentesting/react-native-application.md @@ -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 ``` @@ -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-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. -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}}