React Native Toepassing Analise
Reading time: 10 minutes
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Om te bevestig of die toepassing op die React Native raamwerk gebou is, volg hierdie stappe:
-
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
enunzip -qq example-apk.zip -d ReactNative
. -
Navigeer na die nuut geskepte ReactNative-gids en vind die assets-gids. Binne hierdie gids, behoort jy die lĂȘer
index.android.bundle
te vind, wat die React JavaScript in 'n geminifiseerde formaat bevat. -
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:
# 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, 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 dit potensieel makliker maak om dit om te keer) met behulp van die tool react-native-decompiler.
Webpack
Om die JavaScript kode verder te analiseer, kan jy die lĂȘer op https://spaceraccoon.github.io/webpack-exploder/ oplaai of hierdie stappe volg:
- Skep 'n lĂȘer genaamd
index.html
in dieselfde gids met die volgende kode:
<script src="./index.android.bundle"></script>
-
Maak die
index.html
lĂȘer in Google Chrome oop. -
Maak die Ontwikkelaar Toolbar oop deur Command+Option+J vir OS X of Control+Shift+J vir Windows te druk.
-
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.
Om sensitiewe akrediteerbare en eindpunte te soek, volg hierdie stappe:
-
Identifiseer sensitiewe sleutelwoorde om die JavaScript-kode te analiseer. React Native-toepassings gebruik dikwels derdeparty-dienste soos Firebase, AWS S3-diens eindpunte, private sleutels, ens.
-
In hierdie spesifieke geval is dit waargeneem dat die toepassing die Dialogflow-diens gebruik. Soek vir 'n patroon wat verband hou met sy konfigurasie.
-
Dit was gelukkig dat sensitiewe hard-gecodeerde akrediteerbare in die JavaScript-kode gevind is tydens die rekonsiliasieproses.
Vinnige geheime/eindpunt jag in bundels
Hierdie eenvoudige greps bring dikwels interessante aanduiders na vore selfs in geminifiseerde JS:
# 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 gebruik word, 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 vir toetsdoeleindes in te spuit.
Hermes bytecode
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 bundel Hermes bytecode bevat deur die volgende opdrag uit te voer:
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
U kan egter die gereedskap hbctool, opgedateerde forks van hbctool wat nuwer bytecode weergawes ondersteun, hasmer, hermes_rs (Rust biblioteek/APIs), of hermes-dec gebruik om die bytecode te ontbind en ook om dit na 'n pseudo JS-kode te dekompileer. Byvoorbeeld:
# 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: Die oopbron Hermes-projek lewer ook ontwikkelaarstoerusting 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.
Verander kode en herbou (Hermes)
Ideaal gesproke behoort jy in staat te wees om die gedemonteerde kode te wysig (om 'n vergelyking, of 'n waarde of wat jy ook al moet wysig) en dan herbou die bytecode en herbou die app.
- Die oorspronklike hbctool ondersteun die demontage van die bundel en die herbou daarvan na veranderinge, maar het histories net ouer bytecode-weergawe ondersteun. Gemeenskap-onderhande vurk 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 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 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.
'n Minimale werksvloei met hbctool-agtige samestellers:
# 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, die Hermes bytecode-formaat is geversioneer 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 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/.
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 keer:
// 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 app laat crash of geen effek hĂȘ nie. Wanneer dit werk, kan jy tipies die ontwikkelaarsmenu blootstel en debuggers/inspekteurs aanheg.
Netwerkonderbreking in RN-apps
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 app Flipper per ongeluk in vrystelling saamgepak het (debug gereedskap), kan die Flipper Netwerk-plug-in versoeke/antwoorde blootstel.
Vir generiese Android onderbreking en pinning omseil tegnieke, verwys na:
Make APK Accept CA Certificate
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
, logverklarings 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 biblioteekweergawes.
Vinige kontroles:
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://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
- 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
tip
Leer en oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die đŹ Discord groep of die telegram groep of volg ons op Twitter đŠ @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.