mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/mobile-pentesting/android-app-pentesting/android-task-h
This commit is contained in:
parent
676fc00e09
commit
d397f12f87
@ -8,10 +8,10 @@
|
|||||||
|
|
||||||
Ακολουθεί μια γρήγορη ανάλυση των μεταβάσεων δραστηριοτήτων:
|
Ακολουθεί μια γρήγορη ανάλυση των μεταβάσεων δραστηριοτήτων:
|
||||||
|
|
||||||
- **Activity 1** ξεκινά ως η μοναδική δραστηριότητα στο foreground.
|
- **Activity 1** ξεκινά ως η μοναδική δραστηριότητα στο προσκήνιο.
|
||||||
- Η εκκίνηση της **Activity 2** σπρώχνει την **Activity 1** στο back stack, φέρνοντας την **Activity 2** στο foreground.
|
- Η εκκίνηση της **Activity 2** σπρώχνει την **Activity 1** στο back stack, φέρνοντας την **Activity 2** στο προσκήνιο.
|
||||||
- Η εκκίνηση της **Activity 3** μετακινεί την **Activity 1** και την **Activity 2** πιο πίσω στο stack, με την **Activity 3** τώρα μπροστά.
|
- Η εκκίνηση της **Activity 3** μετακινεί την **Activity 1** και την **Activity 2** πιο πίσω στο stack, με την **Activity 3** τώρα μπροστά.
|
||||||
- Το κλείσιμο της **Activity 3** φέρνει την **Activity 2** πίσω στο foreground, επιδεικνύοντας τον απλοποιημένο μηχανισμό πλοήγησης εργασιών του Android.
|
- Το κλείσιμο της **Activity 3** φέρνει την **Activity 2** πίσω στο προσκήνιο, επιδεικνύοντας τον απλοποιημένο μηχανισμό πλοήγησης εργασιών του Android.
|
||||||
|
|
||||||
.png>)
|
.png>)
|
||||||
|
|
||||||
@ -30,14 +30,20 @@
|
|||||||
1. **Malicious App Installation**: Το θύμα εγκαθιστά την εφαρμογή του επιτιθέμενου στη συσκευή του.
|
1. **Malicious App Installation**: Το θύμα εγκαθιστά την εφαρμογή του επιτιθέμενου στη συσκευή του.
|
||||||
2. **Initial Activation**: Το θύμα ανοίγει πρώτα την κακόβουλη εφαρμογή, προετοιμάζοντας τη συσκευή για την επίθεση.
|
2. **Initial Activation**: Το θύμα ανοίγει πρώτα την κακόβουλη εφαρμογή, προετοιμάζοντας τη συσκευή για την επίθεση.
|
||||||
3. **Target App Launch Attempt**: Το θύμα προσπαθεί να ανοίξει την στοχευμένη εφαρμογή.
|
3. **Target App Launch Attempt**: Το θύμα προσπαθεί να ανοίξει την στοχευμένη εφαρμογή.
|
||||||
4. **Hijack Execution**: Λόγω της αντιστοιχίας task affinity, η κακόβουλη εφαρμογή εκκινείται στη θέση της στοχευμένης εφαρμογής.
|
4. **Hijack Execution**: Σε κάποιο σημείο, η εφαρμογή προσπαθεί να ανοίξει την **singleTask** προβολή. Λόγω της αντιστοιχίας task affinity, η κακόβουλη εφαρμογή εκκινείται στη θέση της στοχευμένης εφαρμογής.
|
||||||
5. **Deception**: Η κακόβουλη εφαρμογή παρουσιάζει μια ψεύτικη οθόνη σύνδεσης που μοιάζει με την στοχευμένη εφαρμογή, παραπλανώντας τον χρήστη να εισάγει ευαίσθητες πληροφορίες.
|
5. **Deception**: Η κακόβουλη εφαρμογή παρουσιάζει μια ψεύτικη οθόνη σύνδεσης που μοιάζει με την στοχευμένη εφαρμογή, παραπλανώντας τον χρήστη να εισάγει ευαίσθητες πληροφορίες.
|
||||||
|
|
||||||
|
> [!TIP]
|
||||||
|
> Σημειώστε ότι για να λειτουργήσει αυτή η επίθεση, η ευάλωτη προβολή **δεν χρειάζεται να έχει εξαγωγή σε true** ούτε χρειάζεται να είναι η κύρια δραστηριότητα.
|
||||||
|
|
||||||
Για μια πρακτική εφαρμογή αυτής της επίθεσης, ανατρέξτε στο αποθετήριο Task Hijacking Strandhogg στο GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
Για μια πρακτική εφαρμογή αυτής της επίθεσης, ανατρέξτε στο αποθετήριο Task Hijacking Strandhogg στο GitHub: [Task Hijacking Strandhogg](https://github.com/az0mb13/Task_Hijacking_Strandhogg).
|
||||||
|
|
||||||
### Prevention Measures
|
### Prevention Measures
|
||||||
|
|
||||||
Για να αποτραπούν τέτοιες επιθέσεις, οι προγραμματιστές μπορούν να ορίσουν το `taskAffinity` σε κενή συμβολοσειρά και να επιλέξουν τη λειτουργία εκκίνησης `singleInstance`, διασφαλίζοντας την απομόνωση της εφαρμογής τους από άλλες. Η προσαρμογή της λειτουργίας `onBackPressed()` προσφέρει επιπλέον προστασία κατά της κατάληψης εργασιών.
|
Για να αποτρέψουν τέτοιες επιθέσεις, οι προγραμματιστές μπορούν να:
|
||||||
|
- Ορίσουν το **`taskAffinity`** της **singleTask** προβολής σε κενή συμβολοσειρά (`android:taskAffinity=""`)
|
||||||
|
- Επιλέξουν τη λειτουργία εκκίνησης **`singleInstance`**, διασφαλίζοντας την απομόνωση της εφαρμογής τους από άλλες.
|
||||||
|
- Προσαρμόσουν τη λειτουργία **`onBackPressed()`** για επιπλέον προστασία κατά της κατάληψης εργασιών.
|
||||||
|
|
||||||
## **References**
|
## **References**
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
# Ανάλυση Εφαρμογής React Native
|
# Ανάλυση Εφαρμογής React Native
|
||||||
|
|
||||||
Για να επιβεβαιώσετε αν η εφαρμογή έχει κατασκευαστεί με το πλαίσιο React Native, ακολουθήστε τα παρακάτω βήματα:
|
Για να επιβεβαιώσετε αν η εφαρμογή έχει κατασκευαστεί στο πλαίσιο React Native, ακολουθήστε αυτά τα βήματα:
|
||||||
|
|
||||||
1. Μετονομάστε το αρχείο APK με επέκταση zip και εξαγάγετέ το σε έναν νέο φάκελο χρησιμοποιώντας την εντολή `cp com.example.apk example-apk.zip` και `unzip -qq example-apk.zip -d ReactNative`.
|
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.
|
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
|
```html
|
||||||
<script src="./index.android.bundle"></script>
|
<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, endpoints υπηρεσιών AWS S3, ιδιωτικά κλειδιά κ.λπ.
|
||||||
|
|
||||||
1. Προσδιορίστε ευαίσθητες λέξεις-κλειδιά για να αναλύσετε τον κώδικα JavaScript. Οι εφαρμογές React Native συχνά χρησιμοποιούν υπηρεσίες τρίτων, όπως Firebase, σημεία πρόσβασης υπηρεσίας AWS S3, ιδιωτικά κλειδιά κ.λπ.
|
|
||||||
|
|
||||||
2. Σε αυτή την συγκεκριμένη περίπτωση, παρατηρήθηκε ότι η εφαρμογή χρησιμοποιούσε την υπηρεσία Dialogflow. Αναζητήστε ένα μοτίβο σχετικό με τη διαμόρφωσή της.
|
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://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}}
|
{{#include ../../banners/hacktricks-training.md}}
|
||||||
|
@ -4,13 +4,15 @@
|
|||||||
|
|
||||||
## **Βασικές Πληροφορίες**
|
## **Βασικές Πληροφορίες**
|
||||||
|
|
||||||
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
|
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ μεταφέρει την αλληλεπίδραση στην εφαρμογή θύμα.\
|
||||||
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί πραγματικά ενέργειες στην εφαρμογή θύμα**.
|
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι εκτελεί ενέργειες στην εφαρμογή θύμα**.
|
||||||
|
|
||||||
### Ανίχνευση
|
### Ανίχνευση
|
||||||
|
|
||||||
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν κάποια άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί και αυτή την άδεια**.
|
Για να ανιχνεύσετε εφαρμογές ευάλωτες σε αυτή την επίθεση, θα πρέπει να αναζητήσετε **εξαγόμενες δραστηριότητες** στο android manifest (σημειώστε ότι μια δραστηριότητα με intent-filter εξάγεται αυτόματα από προεπιλογή). Μόλις βρείτε τις εξαγόμενες δραστηριότητες, **ελέγξτε αν απαιτούν κάποια άδεια**. Αυτό συμβαίνει επειδή η **κακόβουλη εφαρμογή θα χρειαστεί και αυτή την άδεια**.
|
||||||
|
|
||||||
|
Μπορείτε επίσης να ελέγξετε την ελάχιστη έκδοση SDK της εφαρμογής, ελέγχοντας την τιμή του **`android:minSdkVersion`** στο **`AndroidManifest.xml`** αρχείο. Αν η τιμή είναι **χαμηλότερη από 30**, η εφαρμογή είναι ευάλωτη σε Tapjacking.
|
||||||
|
|
||||||
### Προστασία
|
### Προστασία
|
||||||
|
|
||||||
#### Android 12 (API 31,32) και ανώτερα
|
#### Android 12 (API 31,32) και ανώτερα
|
||||||
@ -19,7 +21,7 @@
|
|||||||
|
|
||||||
#### `filterTouchesWhenObscured`
|
#### `filterTouchesWhenObscured`
|
||||||
|
|
||||||
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει αγγίγματα όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
|
Αν **`android:filterTouchesWhenObscured`** είναι ρυθμισμένο σε **`true`**, το `View` δεν θα λαμβάνει επαφές όποτε το παράθυρο της προβολής καλύπτεται από άλλο ορατό παράθυρο.
|
||||||
|
|
||||||
#### **`setFilterTouchesWhenObscured`**
|
#### **`setFilterTouchesWhenObscured`**
|
||||||
|
|
||||||
@ -37,7 +39,7 @@ android:filterTouchesWhenObscured="true">
|
|||||||
|
|
||||||
### Tapjacking-ExportedActivity
|
### 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 για να τη χρησιμοποιήσετε**.
|
Ακολουθήστε τις **οδηγίες README για να τη χρησιμοποιήσετε**.
|
||||||
|
|
||||||
|
@ -471,12 +471,13 @@ window.search = window.search || {};
|
|||||||
showResults(true);
|
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(response => response.json())
|
||||||
.then(json => init(json))
|
.then(json => init(json))
|
||||||
.catch(error => { // Try to load searchindex.js if fetch failed
|
.catch(error => { // Try to load searchindex.js if fetch failed
|
||||||
var script = document.createElement('script');
|
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);
|
script.onload = () => init(window.search);
|
||||||
document.head.appendChild(script);
|
document.head.appendChild(script);
|
||||||
});
|
});
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
<!-- Provide site root to javascript -->
|
<!-- Provide site root to javascript -->
|
||||||
<script>
|
<script>
|
||||||
var path_to_root = "{{ path_to_root }}";
|
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 }}";
|
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "{{ preferred_dark_theme }}" : "{{ default_theme }}";
|
||||||
</script>
|
</script>
|
||||||
<!-- Start loading toc.js asap -->
|
<!-- Start loading toc.js asap -->
|
||||||
|
Loading…
x
Reference in New Issue
Block a user