Uchambuzi wa Programu ya React Native
Reading time: 10 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Ili kuthibitisha kama programu imejengwa kwenye mfumo wa React Native, fuata hatua hizi:
-
Badilisha jina la faili la APK kwa kiambishi cha zip na uondoe kwenye folda mpya kwa kutumia amri
cp com.example.apk example-apk.zip
naunzip -qq example-apk.zip -d ReactNative
. -
Tembea kwenye folda mpya iliyoundwa ya ReactNative na pata folda ya mali. Ndani ya folda hii, unapaswa kupata faili
index.android.bundle
, ambayo ina React JavaScript katika muundo wa minified. -
Tumia amri
find . -print | grep -i ".bundle$"
kutafuta faili la JavaScript.
Kumbuka: Ikiwa umepatiwa Android App Bundle (.aab) badala ya APK, tengeneza APK ya ulimwengu kwanza kisha uondoe bundle:
# 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
Ikiwa unakagua maudhui ya index.android.bundle
unapata msimbo wa JavaScript wa programu (hata kama umepunguzika), unaweza kuuchambua ili kupata taarifa nyeti na udhaifu.
Kwa kuwa bundle ina kweli msimbo wote wa JS wa programu, inawezekana kugawanya katika faili tofauti (ikiwezekana kufanya iwe rahisi uhandisi wa kinyume) kwa kutumia chombo react-native-decompiler.
Webpack
Ili kuchambua zaidi msimbo wa JavaScript, unaweza kupakia faili kwenye https://spaceraccoon.github.io/webpack-exploder/ au fuata hatua hizi:
- Unda faili inayoitwa
index.html
katika saraka hiyo hiyo yenye msimbo ufuatao:
<script src="./index.android.bundle"></script>
-
Fungua faili la
index.html
katika Google Chrome. -
Fungua Developer Toolbar kwa kubonyeza Command+Option+J kwa OS X au Control+Shift+J kwa Windows.
-
Bonyeza "Sources" katika Developer Toolbar. Unapaswa kuona faili ya JavaScript ambayo imegawanywa katika folda na faili, ikifanya sehemu ya msingi.
Ikiwa utapata faili inayoitwa index.android.bundle.map
, utaweza kuchambua msimbo wa chanzo katika muundo usio na kupunguzwa. Faili za ramani zina ramani ya chanzo, ambayo inakuwezesha kuunganisha vitambulisho vilivyopunguzwa.
Ili kutafuta akidi nyeti na mwisho, fuata hatua hizi:
-
Tambua maneno nyeti ili kuchambua msimbo wa JavaScript. Programu za React Native mara nyingi hutumia huduma za watu wa tatu kama Firebase, AWS S3 service endpoints, funguo za kibinafsi, n.k.
-
Katika kesi hii maalum, programu ilionekana ikitumia huduma ya Dialogflow. Tafuta muundo unaohusiana na usanidi wake.
-
Ilikuwa bahati kwamba akidi nyeti zilizowekwa kwa mikono zilipatikana katika msimbo wa JavaScript wakati wa mchakato wa recon.
Uwindaji wa siri/mwisho wa haraka katika bundles
Hizi greps rahisi mara nyingi huleta viashiria vya kuvutia hata katika JS iliyopunguzwa:
# 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*:)"
Ikiwa unashuku mifumo ya sasisho ya Over-The-Air, pia tafuta:
- Microsoft App Center / CodePush deployment keys
- Mipangilio ya Expo EAS Updates (
expo-updates
,expo\.io
, vyeti vya kusaini)
Badilisha msimbo wa JS na ujenge upya
Katika kesi hii, kubadilisha msimbo ni rahisi. Unahitaji tu kubadilisha jina la programu ili kutumia kiambishi .zip
na kuikamua. Kisha unaweza kubadilisha msimbo wa JS ndani ya bundle hii na kujenga upya programu. Hii inapaswa kuwa ya kutosha kukuruhusu kuingiza msimbo katika programu kwa madhumuni ya majaribio.
Hermes bytecode
Ikiwa bundle ina Hermes bytecode, huwezi kufikia msimbo wa Javascript wa programu (hata si toleo lililopunguzika).
Unaweza kuangalia ikiwa bundle ina Hermes bytecode kwa kuendesha amri ifuatayo:
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
Hata hivyo, unaweza kutumia zana hbctool, forks zilizosasishwa za hbctool zinazounga mkono toleo jipya la bytecode, hasmer, hermes_rs (maktaba/APIs za Rust), au hermes-dec ili kuondoa bytecode na pia kuandika upya katika baadhi ya msimbo wa JS wa pseudo. Kwa mfano:
# 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: Mradi wa Hermes wa chanzo wazi pia unatoa zana za waendelezaji kama hbcdump
katika toleo maalum za Hermes. Ikiwa unajenga toleo linalolingana la Hermes lililotumika kutengeneza kifurushi, hbcdump
inaweza kutoa kazi, meza za nyuzi, na bytecode kwa uchambuzi wa kina.
Badilisha msimbo na ujenge upya (Hermes)
Kwa kawaida unapaswa kuwa na uwezo wa kubadilisha msimbo ulioondolewa (kubadilisha kulinganisha, au thamani au chochote unachohitaji kubadilisha) na kisha ujenge upya bytecode na ujenge upya programu.
- hbctool ya awali inasaidia kuondoa kifurushi na kukijenga tena baada ya mabadiliko, lakini kihistoria ilisaidia tu toleo za zamani za bytecode. Mifuko inayoshughulikiwa na jamii inapanua msaada kwa toleo mpya za Hermes (ikiwemo katikati ya miaka ya 80–96) na mara nyingi ni chaguo bora zaidi kurekebisha programu za kisasa za RN.
- Zana hermes-dec haisaidii kujenga upya bytecode (decompiler/disassembler tu), lakini ni ya msaada sana katika kuvinjari mantiki na kutoa nyuzi.
- Zana hasmer inalenga kusaidia kuondoa na kujenga kwa toleo nyingi za Hermes; kujenga bado kunaendelea lakini inafaa kujaribu kwenye bytecode za hivi karibuni.
Mchakato wa chini na waandishi kama hbctool:
# 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)
Kumbuka kwamba muundo wa bytecode wa Hermes umewekwa toleo na mkusanyiko lazima ulingane na muundo halisi kwenye diski. Ikiwa unapata makosa ya muundo, badilisha kwa toleo lililosasishwa/mbadala au jenga tena zana zinazolingana za Hermes.
Uchambuzi wa Kijamii
Unaweza kujaribu kuchambua kwa njia ya kijamii programu kwa kutumia Frida kuwezesha hali ya maendeleo ya programu ya React na kutumia react-native-debugger
kuungana nayo. Hata hivyo, kwa hili unahitaji msimbo wa chanzo wa programu hiyo kwa wazi. Unaweza kupata maelezo zaidi kuhusu hili katika https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/.
Kuwezesha Msaada wa Dev katika toleo la kutolewa na Frida (vikwazo)
Programu zingine kwa bahati mbaya zinapeleka madarasa ambayo yanafanya Msaada wa Dev uweze kubadilishwa. Ikiwa upo, unaweza kujaribu kulazimisha getUseDeveloperSupport()
kurudisha kweli:
// 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: Katika toleo zilizojengwa vizuri, DevSupportManagerImpl
na madarasa mengine ya debug pekee yanakatwa na kubadilisha bendera hii kunaweza kusababisha programu kuanguka au kutokuwa na athari. Wakati hii inafanya kazi, kwa kawaida unaweza kufichua menyu ya maendeleo na kuunganisha debuggers/inspectors.
Ukatishaji wa mtandao katika programu za RN
React Native Android kwa kawaida inategemea OkHttp chini ya uso (kupitia moduli asilia ya Networking
). Ili kukamata/kuchunguza trafiki kwenye kifaa kisichokuwa na mizizi wakati wa majaribio ya dynamic:
- Tumia proxy ya mfumo + amini CA ya mtumiaji au tumia mbinu nyingine za kawaida za TLS bypass za Android.
- Kidokezo maalum cha RN: ikiwa programu inajumuisha Flipper katika toleo la uzalishaji kwa bahati mbaya (zana za debug), plugin ya Mtandao ya Flipper inaweza kufichua maombi/jibu.
Kwa mbinu za kawaida za ukatishaji wa Android na pinning bypass rejea kwenye:
Make APK Accept CA Certificate
Masuala ya hivi karibuni katika maktaba maarufu za RN (nini cha kuangalia)
Wakati wa kukagua moduli za wahusika wengine zinazonekana katika kifurushi cha JS au maktaba asilia, angalia kwa vulns zinazojulikana na thibitisha toleo katika package.json
/yarn.lock
.
- react-native-mmkv (Android): toleo kabla ya 2.11.0 lilirekodi ufunguo wa siri wa hiari kwenye kumbukumbu za Android. Ikiwa ADB/logcat inapatikana, siri zinaweza kurejeshwa. Hakikisha >= 2.11.0. Viashiria: matumizi ya
react-native-mmkv
, taarifa za log zinazotaja MMKV kuanzishwa na usimbaji. CVE-2024-21668. - react-native-document-picker: toleo < 9.1.1 lilikuwa na udhaifu wa kupita njia kwenye Android (uchaguzi wa faili), lilirekebishwa katika 9.1.1. Thibitisha ingizo na toleo la maktaba.
Ukaguzi wa haraka:
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
Marejeleo
- 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 inarekodi ufunguo wa usimbuaji kwenye Android, umerekebishwa katika v2.11.0 (NVD): https://nvd.nist.gov/vuln/detail/CVE-2024-21668
- hbctool (na forks) kwa Hermes kuunganisha/kutenganisha: https://github.com/bongtrop/hbctool
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.