Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h

This commit is contained in:
Translator 2025-02-25 22:34:57 +00:00
parent 676fc00e09
commit d397f12f87
5 changed files with 74 additions and 22 deletions

View File

@ -8,10 +8,10 @@
Ακολουθεί μια γρήγορη ανάλυση των μεταβάσεων δραστηριοτήτων:
- **Activity 1** ξεκινά ως η μοναδική δραστηριότητα στο foreground.
- Η εκκίνηση της **Activity 2** σπρώχνει την **Activity 1** στο back stack, φέρνοντας την **Activity 2** στο foreground.
- **Activity 1** ξεκινά ως η μοναδική δραστηριότητα στο προσκήνιο.
- Η εκκίνηση της **Activity 2** σπρώχνει την **Activity 1** στο back stack, φέρνοντας την **Activity 2** στο προσκήνιο.
- Η εκκίνηση της **Activity 3** μετακινεί την **Activity 1** και την **Activity 2** πιο πίσω στο stack, με την **Activity 3** τώρα μπροστά.
- Το κλείσιμο της **Activity 3** φέρνει την **Activity 2** πίσω στο foreground, επιδεικνύοντας τον απλοποιημένο μηχανισμό πλοήγησης εργασιών του Android.
- Το κλείσιμο της **Activity 3** φέρνει την **Activity 2** πίσω στο προσκήνιο, επιδεικνύοντας τον απλοποιημένο μηχανισμό πλοήγησης εργασιών του Android.
![https://developer.android.com/images/fundamentals/diagram_backstack.png](<../../images/image (698).png>)
@ -30,14 +30,20 @@
1. **Malicious App Installation**: Το θύμα εγκαθιστά την εφαρμογή του επιτιθέμενου στη συσκευή του.
2. **Initial Activation**: Το θύμα ανοίγει πρώτα την κακόβουλη εφαρμογή, προετοιμάζοντας τη συσκευή για την επίθεση.
3. **Target App Launch Attempt**: Το θύμα προσπαθεί να ανοίξει την στοχευμένη εφαρμογή.
4. **Hijack Execution**: Λόγω της αντιστοιχίας task affinity, η κακόβουλη εφαρμογή εκκινείται στη θέση της στοχευμένης εφαρμογής.
4. **Hijack Execution**: Σε κάποιο σημείο, η εφαρμογή προσπαθεί να ανοίξει την **singleTask** προβολή. Λόγω της αντιστοιχίας task affinity, η κακόβουλη εφαρμογή εκκινείται στη θέση της στοχευμένης εφαρμογής.
5. **Deception**: Η κακόβουλη εφαρμογή παρουσιάζει μια ψεύτικη οθόνη σύνδεσης που μοιάζει με την στοχευμένη εφαρμογή, παραπλανώντας τον χρήστη να εισάγει ευαίσθητες πληροφορίες.
> [!TIP]
> Σημειώστε ότι για να λειτουργήσει αυτή η επίθεση, η ευάλωτη προβολή **δεν χρειάζεται να έχει εξαγωγή σε true** ούτε χρειάζεται να είναι η κύρια δραστηριότητα.
Για μια πρακτική εφαρμογή αυτής της επίθεσης, ανατρέξτε στο αποθετήριο Task Hijacking Strandhogg στο GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
### Prevention Measures
Για να αποτραπούν τέτοιες επιθέσεις, οι προγραμματιστές μπορούν να ορίσουν το `taskAffinity` σε κενή συμβολοσειρά και να επιλέξουν τη λειτουργία εκκίνησης `singleInstance`, διασφαλίζοντας την απομόνωση της εφαρμογής τους από άλλες. Η προσαρμογή της λειτουργίας `onBackPressed()` προσφέρει επιπλέον προστασία κατά της κατάληψης εργασιών.
Για να αποτρέψουν τέτοιες επιθέσεις, οι προγραμματιστές μπορούν να:
- Ορίσουν το **`taskAffinity`** της **singleTask** προβολής σε κενή συμβολοσειρά (`android:taskAffinity=""`)
- Επιλέξουν τη λειτουργία εκκίνησης **`singleInstance`**, διασφαλίζοντας την απομόνωση της εφαρμογής τους από άλλες.
- Προσαρμόσουν τη λειτουργία **`onBackPressed()`** για επιπλέον προστασία κατά της κατάληψης εργασιών.
## **References**

View File

@ -2,7 +2,7 @@
# Ανάλυση Εφαρμογής React Native
Για να επιβεβαιώσετε αν η εφαρμογή έχει κατασκευαστεί με το πλαίσιο React Native, ακολουθήστε τα παρακάτω βήματα:
Για να επιβεβαιώσετε αν η εφαρμογή έχει κατασκευαστεί στο πλαίσιο React Native, ακολουθήστε αυτά τα βήματα:
1. Μετονομάστε το αρχείο APK με επέκταση zip και εξαγάγετέ το σε έναν νέο φάκελο χρησιμοποιώντας την εντολή `cp com.example.apk example-apk.zip` και `unzip -qq example-apk.zip -d ReactNative`.
@ -10,30 +10,72 @@
3. Χρησιμοποιήστε την εντολή `find . -print | grep -i ".bundle$"` για να αναζητήσετε το αρχείο JavaScript.
Για να αναλύσετε περαιτέρω τον κώδικα JavaScript, δημιουργήστε ένα αρχείο με το όνομα `index.html` στον ίδιο φάκελο με τον παρακάτω κώδικα:
## Κώδικας Javascript
Εάν ελέγχοντας τα περιεχόμενα του `index.android.bundle` βρείτε τον κώδικα JavaScript της εφαρμογής (ακόμα και αν είναι minified), μπορείτε να **τον αναλύσετε για να βρείτε ευαίσθητες πληροφορίες και ευπάθειες**.
Καθώς το bundle περιέχει στην πραγματικότητα όλο τον κώδικα JS της εφαρμογής, είναι δυνατόν να **τον χωρίσετε σε διάφορα αρχεία** (πιθανώς διευκολύνοντας την αντίστροφη μηχανική του) χρησιμοποιώντας το **εργαλείο [react-native-decompiler](https://github.com/numandev1/react-native-decompiler)**.
### Webpack
Για να αναλύσετε περαιτέρω τον κώδικα JavaScript, μπορείτε να ανεβάσετε το αρχείο στο [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ή να ακολουθήσετε αυτά τα βήματα:
1. Δημιουργήστε ένα αρχείο με το όνομα `index.html` στον ίδιο φάκελο με τον παρακάτω κώδικα:
```html
<script src="./index.android.bundle"></script>
```
Μπορείτε να ανεβάσετε το αρχείο στο [https://spaceraccoon.github.io/webpack-exploder/](https://spaceraccoon.github.io/webpack-exploder/) ή να ακολουθήσετε αυτά τα βήματα:
2. Ανοίξτε το `index.html` αρχείο στο Google Chrome.
1. Ανοίξτε το αρχείο `index.html` στο Google Chrome.
3. Ανοίξτε την Developer Toolbar πατώντας **Command+Option+J για OS X** ή **Control+Shift+J για Windows**.
2. Ανοίξτε την Εργαλειοθήκη Ανάπτυξης πατώντας **Command+Option+J για OS X** ή **Control+Shift+J για Windows**.
4. Κάντε κλικ στο "Sources" στην Developer Toolbar. Θα πρέπει να δείτε ένα αρχείο JavaScript που είναι χωρισμένο σε φακέλους και αρχεία, αποτελώντας το κύριο bundle.
3. Κάντε κλικ στο "Sources" στην Εργαλειοθήκη Ανάπτυξης. Θα πρέπει να δείτε ένα αρχείο JavaScript που είναι χωρισμένο σε φακέλους και αρχεία, αποτελώντας το κύριο πακέτο.
Αν βρείτε ένα αρχείο που ονομάζεται `index.android.bundle.map`, θα μπορείτε να αναλύσετε τον πηγαίο κώδικα σε μη ελαχιστοποιημένη μορφή. Τα αρχεία map περιέχουν πηγή χαρτογράφησης, η οποία σας επιτρέπει να χαρτογραφήσετε ελαχιστοποιημένα αναγνωριστικά.
Αν βρείτε ένα αρχείο που ονομάζεται `index.android.bundle.map`, θα μπορείτε να αναλύσετε τον πηγαίο κώδικα σε μη ελαχιστοποιημένη μορφή. Τα αρχεία χάρτη περιέχουν χαρτογράφηση πηγής, η οποία σας επιτρέπει να χαρτογραφήσετε ελαχιστοποιημένα αναγνωριστικά.
Για να αναζητήσετε ευαίσθητα διαπιστευτήρια και endpoints, ακολουθήστε αυτά τα βήματα:
Για να αναζητήσετε ευαίσθητα διαπιστευτήρια και σημεία πρόσβασης, ακολουθήστε αυτά τα βήματα:
1. Προσδιορίστε ευαίσθητες λέξεις-κλειδιά για να αναλύσετε τον κώδικα JavaScript. Οι εφαρμογές React Native συχνά χρησιμοποιούν υπηρεσίες τρίτων, όπως Firebase, σημεία πρόσβασης υπηρεσίας AWS S3, ιδιωτικά κλειδιά κ.λπ.
1. Προσδιορίστε ευαίσθητες λέξεις-κλειδιά για να αναλύσετε τον κώδικα JavaScript. Οι εφαρμογές React Native συχνά χρησιμοποιούν τρίτες υπηρεσίες όπως Firebase, endpoints υπηρεσιών AWS S3, ιδιωτικά κλειδιά κ.λπ.
2. Σε αυτή την συγκεκριμένη περίπτωση, παρατηρήθηκε ότι η εφαρμογή χρησιμοποιούσε την υπηρεσία Dialogflow. Αναζητήστε ένα μοτίβο σχετικό με τη διαμόρφωσή της.
3. Ήταν τυχερό ότι ευαίσθητα σκληρά κωδικοποιημένα διαπιστευτήρια βρέθηκαν στον κώδικα JavaScript κατά τη διάρκεια της διαδικασίας αναγνώρισης.
3. Ήταν τυχερό ότι ευαίσθητα σκληρά διαπιστευτήρια βρέθηκαν στον κώδικα JavaScript κατά τη διάρκεια της διαδικασίας αναγνώρισης.
### Αλλαγή κώδικα JS και ανακατασκευή
Σε αυτή την περίπτωση, η αλλαγή του κώδικα είναι εύκολη. Απλώς χρειάζεται να μετονομάσετε την εφαρμογή για να χρησιμοποιήσει την επέκταση `.zip` και να την εξαγάγετε. Στη συνέχεια, μπορείτε να **τροποποιήσετε τον κώδικα JS μέσα σε αυτό το bundle και να ανακατασκευάσετε την εφαρμογή**. Αυτό θα πρέπει να είναι αρκετό για να σας επιτρέψει να **εισάγετε κώδικα** στην εφαρμογή για σκοπούς δοκιμών.
## Hermes bytecode
Αν το bundle περιέχει **Hermes bytecode**, **δεν θα μπορείτε να έχετε πρόσβαση στον κώδικα Javascript** της εφαρμογής (ούτε καν στην ελαχιστοποιημένη έκδοση).
Μπορείτε να ελέγξετε αν το bundle περιέχει Hermes bytecode εκτελώντας την παρακάτω εντολή:
```bash
file index.android.bundle
index.android.bundle: Hermes JavaScript bytecode, version 96
```
Ωστόσο, μπορείτε να χρησιμοποιήσετε τα εργαλεία **[hbctool](https://github.com/bongtrop/hbctool)**, **[hermes-dec](https://github.com/P1sec/hermes-dec)** ή **[hermes_rs](https://github.com/Pilfer/hermes_rs)** για να **αποσυναρμολογήσετε τον bytecode** και επίσης να **αποκωδικοποιήσετε σε κάποιο ψευδο JS κώδικα**. Για να το κάνετε αυτό, για παράδειγμα αυτές οι εντολές:
```bash
hbc-disassembler ./index.android.bundle /tmp/my_output_file.hasm
hbc-decompiler ./index.android.bundle /tmp/my_output_file.js
```
### Αλλαγή κώδικα και ανακατασκευή
Ιδανικά, θα πρέπει να είστε σε θέση να τροποποιήσετε τον αποσυναρμολογημένο κώδικα (αλλάζοντας μια σύγκριση, ή μια τιμή ή οτιδήποτε χρειάζεται να τροποποιήσετε) και στη συνέχεια να **ανακατασκευάσετε τον bytecode** και μετά να ανακατασκευάσετε την εφαρμογή.
Το εργαλείο **[hbctool](https://github.com/bongtrop/hbctool)** υποστηρίζει την αποσυναρμολόγηση του πακέτου και την επανακατασκευή του μετά την εκτέλεση των αλλαγών, ωστόσο **υποστηρίζει μόνο παλιές εκδόσεις** του bytecode Hermes.
Το εργαλείο **[hermes-dec](https://github.com/P1sec/hermes-dec)** δεν υποστηρίζει την ανακατασκευή του bytecode.
Το εργαλείο **[hermes_rs](https://github.com/Pilfer/hermes_rs)** υποστηρίζει την ανακατασκευή του bytecode, αλλά στην πραγματικότητα είναι μια βιβλιοθήκη και όχι ένα εργαλείο CLI.
## Δυναμική Ανάλυση
Μπορείτε να προσπαθήσετε να αναλύσετε δυναμικά την εφαρμογή χρησιμοποιώντας το Frida για να ενεργοποιήσετε τη λειτουργία προγραμματιστή της εφαρμογής React και να χρησιμοποιήσετε το **`react-native-debugger`** για να συνδεθείτε σε αυτήν. Ωστόσο, για αυτό χρειάζεστε τον πηγαίο κώδικα της εφαρμογής προφανώς. Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με αυτό στο [https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/](https://newsroom.bedefended.com/hooking-react-native-applications-with-frida/).
## Αναφορές
- [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)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,13 +4,15 @@
## **Βασικές Πληροφορίες**
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί πραγματικά ενέργειες στην εφαρμογή θύμα**.
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ μεταφέρει την αλληλεπίδραση στην εφαρμογή θύμα.\
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί ενέργειες στην εφαρμογή θύμα**.
### Ανίχνευση
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν κάποια άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί και αυτή την άδεια**.
Μπορείτε επίσης να ελέγξετε την ελάχιστη έκδοση SDK της εφαρμογής, ελέγχοντας την τιμή του **`android:minSdkVersion`** στο **`AndroidManifest.xml`** αρχείο. Αν η τιμή είναι **χαμηλότερη από 30**, η εφαρμογή είναι ευάλωτη σε Tapjacking.
### Προστασία
#### Android 12 (API 31,32) και ανώτερα
@ -19,7 +21,7 @@
#### `filterTouchesWhenObscured`
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει αγγίγματα όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει επαφές όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
#### **`setFilterTouchesWhenObscured`**
@ -37,7 +39,7 @@ android:filterTouchesWhenObscured="true">
### Tapjacking-ExportedActivity
Η πιο **πρόσφατη εφαρμογή Android** που εκτελεί μια επίθεση Tapjacking (+ καλώντας πριν από μια εξαγόμενη δραστηριότητα της επιτιθέμενης εφαρμογής) μπορεί να βρεθεί στο: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
Η πιο **πρόσφατη εφαρμογή Android** που εκτελεί επίθεση Tapjacking (+ καλώντας πριν από μια εξαγόμενη δραστηριότητα της επιτιθέμενης εφαρμογής) μπορεί να βρεθεί στο: [**https://github.com/carlospolop/Tapjacking-ExportedActivity**](https://github.com/carlospolop/Tapjacking-ExportedActivity).
Ακολουθήστε τις **οδηγίες README για να τη χρησιμοποιήσετε**.

View File

@ -471,12 +471,13 @@ window.search = window.search || {};
showResults(true);
}
fetch(path_to_root + 'searchindex.json')
var branch = lang === "en" ? "master" : lang
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
.then(response => response.json())
.then(json => init(json))
.catch(error => { // Try to load searchindex.js if fetch failed
var script = document.createElement('script');
script.src = path_to_root + 'searchindex.js';
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
script.onload = () => init(window.search);
document.head.appendChild(script);
});

View File

@ -55,6 +55,7 @@
<!-- Provide site root to javascript -->
<script>
var path_to_root = "{{ path_to_root }}";
var lang = "{{ language }}";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
</script>
<!-- Start loading toc.js asap -->