Ανάλυση Εφαρμογής React Native

Reading time: 10 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Για να επιβεβαιώσετε αν η εφαρμογή έχει κατασκευαστεί στο πλαίσιο React Native, ακολουθήστε αυτά τα βήματα:

  1. Μετονομάστε το αρχείο APK με επέκταση zip και εξαγάγετέ το σε έναν νέο φάκελο χρησιμοποιώντας την εντολή cp com.example.apk example-apk.zip και unzip -qq example-apk.zip -d ReactNative.

  2. Μεταβείτε στον νεοδημιουργηθέντα φάκελο ReactNative και εντοπίστε το φάκελο assets. Μέσα σε αυτόν τον φάκελο, θα πρέπει να βρείτε το αρχείο index.android.bundle, το οποίο περιέχει το React JavaScript σε μορφή minified.

  3. Χρησιμοποιήστε την εντολή find . -print | grep -i ".bundle$" για να αναζητήσετε το αρχείο JavaScript.

Σημείωση: Εάν σας δοθεί ένα Android App Bundle (.aab) αντί για APK, δημιουργήστε πρώτα ένα καθολικό APK και στη συνέχεια εξαγάγετε το 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

Αν ελέγξετε τα περιεχόμενα του index.android.bundle και βρείτε τον κώδικα JavaScript της εφαρμογής (ακόμα και αν είναι minified), μπορείτε να τον αναλύσετε για να βρείτε ευαίσθητες πληροφορίες και ευπάθειες.

Καθώς το bundle περιέχει στην πραγματικότητα όλο τον κώδικα JS της εφαρμογής, είναι δυνατόν να τον χωρίσετε σε διαφορετικά αρχεία (πιθανώς διευκολύνοντας την αντίστροφη μηχανική του) χρησιμοποιώντας το εργαλείο react-native-decompiler.

Webpack

Για να αναλύσετε περαιτέρω τον κώδικα JavaScript, μπορείτε να ανεβάσετε το αρχείο στο https://spaceraccoon.github.io/webpack-exploder/ ή να ακολουθήσετε αυτά τα βήματα:

  1. Δημιουργήστε ένα αρχείο με το όνομα index.html στον ίδιο φάκελο με τον παρακάτω κώδικα:
html
<script src="./index.android.bundle"></script>
  1. Ανοίξτε το index.html αρχείο στο Google Chrome.

  2. Ανοίξτε την Εργαλειοθήκη Ανάπτυξης πατώντας Command+Option+J για OS X ή Control+Shift+J για Windows.

  3. Κάντε κλικ στο "Sources" στην Εργαλειοθήκη Ανάπτυξης. Θα πρέπει να δείτε ένα αρχείο JavaScript που είναι χωρισμένο σε φακέλους και αρχεία, αποτελώντας το κύριο πακέτο.

Αν βρείτε ένα αρχείο που ονομάζεται index.android.bundle.map, θα μπορείτε να αναλύσετε τον πηγαίο κώδικα σε μη ελαχιστοποιημένη μορφή. Τα αρχεία χάρτη περιέχουν χαρτογράφηση πηγής, η οποία σας επιτρέπει να χαρτογραφήσετε ελαχιστοποιημένα αναγνωριστικά.

Για να αναζητήσετε ευαίσθητα διαπιστευτήρια και τελικούς προορισμούς, ακολουθήστε αυτά τα βήματα:

  1. Προσδιορίστε ευαίσθητες λέξεις-κλειδιά για να αναλύσετε τον κώδικα JavaScript. Οι εφαρμογές React Native συχνά χρησιμοποιούν υπηρεσίες τρίτων, όπως Firebase, AWS S3 service endpoints, ιδιωτικά κλειδιά κ.λπ.

  2. Σε αυτή την συγκεκριμένη περίπτωση, παρατηρήθηκε ότι η εφαρμογή χρησιμοποιούσε την υπηρεσία Dialogflow. Αναζητήστε ένα μοτίβο σχετικό με τη διαμόρφωσή της.

  3. Ήταν τυχερό ότι ευαίσθητα σκληρά διαπιστευτήρια βρέθηκαν στον κώδικα JavaScript κατά τη διάρκεια της διαδικασίας αναγνώρισης.

Γρήγορη αναζήτηση μυστικών/τελικών προορισμών σε πακέτα

Αυτές οι απλές αναζητήσεις συχνά αναδεικνύουν ενδιαφέροντες δείκτες ακόμη και σε ελαχιστοποιημένο 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*:)"

Αν υποψιάζεστε πλαίσια ενημερώσεων Over-The-Air, αναζητήστε επίσης:

  • Microsoft App Center / CodePush deployment keys
  • Expo EAS Updates configuration (expo-updates, expo\.io, signing certs)

Αλλαγή κώδικα JS και ανακατασκευή

Σε αυτή την περίπτωση, η αλλαγή του κώδικα είναι εύκολη. Απλώς χρειάζεται να μετονομάσετε την εφαρμογή ώστε να χρησιμοποιεί την επέκταση .zip και να την εξάγετε. Στη συνέχεια, μπορείτε να τροποποιήσετε τον κώδικα JS μέσα σε αυτό το πακέτο και να ανακατασκευάσετε την εφαρμογή. Αυτό θα πρέπει να είναι αρκετό για να σας επιτρέψει να εισάγετε κώδικα στην εφαρμογή για σκοπούς δοκιμών.

Hermes bytecode

Αν το πακέτο περιέχει Hermes bytecode, δεν θα μπορείτε να έχετε πρόσβαση στον κώδικα Javascript της εφαρμογής (ούτε καν στην ελαχιστοποιημένη έκδοση).

Μπορείτε να ελέγξετε αν το πακέτο περιέχει Hermes bytecode εκτελώντας την παρακάτω εντολή:

bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96

Ωστόσο, μπορείτε να χρησιμοποιήσετε τα εργαλεία hbctool, ενημερωμένα forks του hbctool που υποστηρίζουν νεότερες εκδόσεις bytecode, hasmer, hermes_rs (βιβλιοθήκη/APIs Rust), ή hermes-dec για να αποσυναρμολογήσετε το bytecode και επίσης να αποκωδικοποιήσετε σε κάποιο ψευδο JS κώδικα. Για παράδειγμα:

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: Το έργο ανοιχτού κώδικα Hermes παρέχει επίσης εργαλεία προγραμματιστών όπως το hbcdump σε συγκεκριμένες εκδόσεις του Hermes. Εάν κατασκευάσετε την αντίστοιχη έκδοση του Hermes που χρησιμοποιήθηκε για την παραγωγή του πακέτου, το hbcdump μπορεί να εξάγει συναρτήσεις, πίνακες συμβολοσειρών και bytecode για πιο βαθιά ανάλυση.

Αλλαγή κώδικα και ανακατασκευή (Hermes)

Ιδανικά, θα πρέπει να μπορείτε να τροποποιήσετε τον αποσυναρμολογημένο κώδικα (αλλάζοντας μια σύγκριση, ή μια τιμή ή οτιδήποτε χρειάζεται να τροποποιήσετε) και στη συνέχεια να ανακατασκευάσετε το bytecode και να ανακατασκευάσετε την εφαρμογή.

  • Το αρχικό hbctool υποστηρίζει την αποσυναρμολόγηση του πακέτου και την επανακατασκευή του μετά από αλλαγές, αλλά ιστορικά υποστήριζε μόνο παλαιότερες εκδόσεις bytecode. Οι διακλαδώσεις που διατηρούνται από την κοινότητα επεκτείνουν την υποστήριξη σε νεότερες εκδόσεις του Hermes (συμπεριλαμβανομένων των mid-80s–96) και συχνά είναι η πιο πρακτική επιλογή για την επιδιόρθωση σύγχρονων εφαρμογών RN.
  • Το εργαλείο hermes-dec δεν υποστηρίζει την ανακατασκευή του bytecode (μόνο αποσυμπιεστής/αποσυναρμολογητής), αλλά είναι πολύ χρήσιμο για την πλοήγηση στη λογική και την εξαγωγή συμβολοσειρών.
  • Το εργαλείο hasmer στοχεύει να υποστηρίξει τόσο την αποσυναρμολόγηση όσο και τη συναρμολόγηση για πολλές εκδόσεις του Hermes; η συναρμολόγηση εξακολουθεί να ωριμάζει αλλά αξίζει να δοκιμαστεί σε πρόσφατο bytecode.

Ένας ελάχιστος ροή εργασίας με assemblers παρόμοιους με το hbctool:

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)

Σημειώστε ότι η μορφή bytecode του Hermes είναι εκδοτική και ο assembler πρέπει να ταιριάζει με την ακριβή μορφή που είναι αποθηκευμένη στο δίσκο. Εάν λάβετε σφάλματα μορφής, αλλάξτε σε μια ενημερωμένη έκδοση/εναλλακτική ή ξαναχτίστε τα αντίστοιχα εργαλεία Hermes.

Δυναμική Ανάλυση

Μπορείτε να προσπαθήσετε να αναλύσετε δυναμικά την εφαρμογή χρησιμοποιώντας το Frida για να ενεργοποιήσετε τη λειτουργία προγραμματιστή της εφαρμογής React και να χρησιμοποιήσετε το react-native-debugger για να συνδεθείτε σε αυτήν. Ωστόσο, για αυτό χρειάζεστε τον πηγαίο κώδικα της εφαρμογής προφανώς. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με αυτό στο https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/.

Ενεργοποίηση Υποστήριξης Dev σε έκδοση με Frida (προειδοποιήσεις)

Ορισμένες εφαρμογές κατά λάθος αποστέλλουν κλάσεις που καθιστούν την υποστήριξη Dev εναλλάξιμη. Εάν είναι παρούσες, μπορείτε να προσπαθήσετε να αναγκάσετε το getUseDeveloperSupport() να επιστρέψει 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: Σε σωστά κατασκευασμένες εκδόσεις, οι DevSupportManagerImpl και σχετικές κλάσεις μόνο για debugging αφαιρούνται και η αλλαγή αυτής της σημαίας μπορεί να προκαλέσει κρασάρισμα της εφαρμογής ή να μην έχει καμία επίδραση. Όταν αυτό λειτουργεί, μπορείτε συνήθως να εκθέσετε το μενού ανάπτυξης και να συνδέσετε debuggers/inspectors.

Δικτυακή παρεμβολή σε εφαρμογές RN

Η React Native Android συνήθως βασίζεται στο OkHttp από κάτω (μέσω του εγγενή module Networking). Για να παρεμβάλετε/παρατηρήσετε την κίνηση σε μια συσκευή που δεν είναι ριζωμένη κατά τη διάρκεια δυναμικών δοκιμών:

  • Χρησιμοποιήστε proxy συστήματος + εμπιστευθείτε το CA του χρήστη ή χρησιμοποιήστε άλλες γενικές τεχνικές παράκαμψης TLS Android.
  • Συμβουλή ειδική για RN: αν η εφαρμογή συμπεριλαμβάνει το Flipper στην έκδοση κατά λάθος (εργαλεία debugging), το plugin Δικτύου Flipper μπορεί να εκθέσει αιτήματα/απαντήσεις.

Για γενικές τεχνικές παρεμβολής Android και παράκαμψης pinning ανατρέξτε σε:

Make APK Accept CA Certificate

Objection Tutorial

Πρόσφατα ζητήματα σε δημοφιλή βιβλιοθήκες RN (τι να προσέξετε)

Κατά την επιθεώρηση τρίτων modules που είναι ορατά στο JS bundle ή σε εγγενείς βιβλιοθήκες, ελέγξτε για γνωστές ευπάθειες και επαληθεύστε τις εκδόσεις στο package.json/yarn.lock.

  • react-native-mmkv (Android): εκδόσεις πριν από την 2.11.0 κατέγραφαν το προαιρετικό κλειδί κρυπτογράφησης στα logs του Android. Αν είναι διαθέσιμα τα ADB/logcat, τα μυστικά θα μπορούσαν να ανακτηθούν. Βεβαιωθείτε ότι είναι >= 2.11.0. Δείκτες: χρήση του react-native-mmkv, δηλώσεις log που αναφέρουν την αρχικοποίηση MMKV με κρυπτογράφηση. CVE-2024-21668.
  • react-native-document-picker: εκδόσεις < 9.1.1 ήταν ευάλωτες σε διαδρομή traversal στο Android (επιλογή αρχείου), διορθώθηκε στην 9.1.1. Επαληθεύστε τις εισόδους και την έκδοση της βιβλιοθήκης.

Γρήγοροι έλεγχοι:

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

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks