mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/generic-methodologies-and-resources/phishing-methodolog
This commit is contained in:
parent
7e50cfb61c
commit
ad66e572a2
1
.gitignore
vendored
1
.gitignore
vendored
@ -11,3 +11,4 @@ book
|
||||
book/*
|
||||
hacktricks-preprocessor.log
|
||||
hacktricks-preprocessor-error.log
|
||||
searchindex.js
|
||||
|
@ -3,95 +3,109 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
## iOS Exploit Mitigations
|
||||
|
||||
- **Code Signing** in iOS λειτουργεί απαιτώντας κάθε κομμάτι εκτελέσιμου κώδικα (apps, libraries, extensions, κ.λπ.) να είναι κρυπτογραφικά υπογεγραμμένο με πιστοποιητικό που εκδίδεται από την Apple. Όταν φορτώνεται ο κώδικας, το iOS επαληθεύει την ψηφιακή υπογραφή σε σχέση με το αξιόπιστο root της Apple. Εάν η υπογραφή είναι άκυρη, λείπει ή έχει τροποποιηθεί, το OS αρνείται να το εκτελέσει. Αυτό αποτρέπει επιθέσεις που επιχειρούν να εγχύσουν κακόβουλο κώδικα σε νόμιμες εφαρμογές ή να τρέξουν unsigned binaries, σταματώντας την πλειονότητα των exploit chains που βασίζονται στην εκτέλεση αυθαίρετου ή τροποποιημένου κώδικα.
|
||||
- **CoreTrust** είναι το subsystem του iOS υπεύθυνο για την επιβολή του code signing στο runtime. Επαληθεύει απευθείας υπογραφές χρησιμοποιώντας το root πιστοποιητικό της Apple χωρίς να βασίζεται σε cached trust stores, πράγμα που σημαίνει ότι μόνο binaries υπογεγραμμένα από την Apple (ή με έγκυρα entitlements) μπορούν να εκτελεστούν. Το CoreTrust εξασφαλίζει ότι ακόμα και αν κάποιος χειριστεί μια εφαρμογή μετά την εγκατάσταση, τροποποιήσει system libraries ή προσπαθήσει να φορτώσει unsigned code, το σύστημα θα μπλοκάρει την εκτέλεση εκτός αν ο κώδικας παραμένει σωστά υπογεγραμμένος. Αυτή η αυστηρή επιβολή κλείνει πολλούς μετα-exploitation vectors που παλαιότερες εκδόσεις iOS επέτρεπαν μέσω ασθενέστερων ή παρακάμπτων signature checks.
|
||||
- **Data Execution Prevention (DEP)** σηματοδοτεί περιοχές μνήμης ως non-executable εκτός αν περιέχουν ρητώς κώδικα. Αυτό εμποδίζει την έγχυση shellcode σε data regions (όπως stack ή heap) και την εκτέλεσή του, αναγκάζοντας τους επιτιθέμενους να βασιστούν σε πιο σύνθετες τεχνικές όπως ROP (Return-Oriented Programming).
|
||||
- **ASLR (Address Space Layout Randomization)** τυχαΐζει τις διευθύνσεις μνήμης του κώδικα, των libraries, του stack και του heap κάθε φορά που τρέχει το σύστημα. Αυτό δυσκολεύει σημαντικά τους επιτιθέμενους να προβλέψουν πού βρίσκονται χρήσιμες εντολές ή gadgets, διαταράσσοντας πολλές αλυσίδες εκμετάλλευσης που εξαρτώνται από σταθερές διατάξεις μνήμης.
|
||||
- **KASLR (Kernel ASLR)** εφαρμόζει την ίδια ιδέα τυχαιοποίησης στον kernel του iOS. Με το να ανακατεύει τη base address του kernel σε κάθε boot, αποτρέπει τους επιτιθέμενους από το να εντοπίζουν αξιόπιστα kernel functions ή structures, αυξάνοντας τη δυσκολία σε kernel-level exploits που διαφορετικά θα αποκτούσαν πλήρη έλεγχο του συστήματος.
|
||||
- **Kernel Patch Protection (KPP)**, επίσης γνωστό ως **AMCC (Apple Mobile File Integrity)** στο iOS, παρακολουθεί συνεχώς τις code pages του kernel για να διασφαλίσει ότι δεν έχουν τροποποιηθεί. Αν εντοπιστεί οποιαδήποτε χειραγώγηση—όπως ένα exploit που προσπαθεί να αλλάξει kernel functions ή να εισάγει κακόβουλο κώδικα—η συσκευή θα κάνει panic και θα επανεκκινήσει αμέσως. Αυτή η προστασία κάνει τα persistent kernel exploits πολύ πιο δύσκολα, αφού οι επιτιθέμενοι δεν μπορούν απλά να κάνουν hook ή patch σε kernel instructions χωρίς να προκαλέσουν system crash.
|
||||
- **Kernel Text Readonly Region (KTRR)** είναι μια hardware-based λειτουργία ασφαλείας που εισήχθη σε συσκευές iOS. Χρησιμοποιεί το memory controller της CPU για να δηλώσει το kernel’s code (text) section ως μόνιμα read-only μετά το boot. Μόλις κλειδωθεί, ακόμη και ο ίδιος ο kernel δεν μπορεί να τροποποιήσει αυτήν την περιοχή μνήμης. Αυτό εμποδίζει επιτιθέμενους—και ακόμα και privileged code—από το να κάνουν patch σε kernel instructions στο runtime, κλείνοντας μια μεγάλη κατηγορία εκμεταλλεύσεων που βασίζονταν στην απευθείας τροποποίηση του kernel code.
|
||||
- **Pointer Authentication Codes (PAC)** χρησιμοποιούν κρυπτογραφικές υπογραφές ενσωματωμένες σε ανεκμετάλλευτα bits των pointers για να επαληθεύσουν την ακεραιότητά τους πριν τη χρήση. Όταν ένας pointer (π.χ. return address ή function pointer) δημιουργείται, η CPU τον υπογράφει με ένα secret key; πριν την απο-αναφορά, η CPU ελέγχει την υπογραφή. Αν ο pointer έχει τροποποιηθεί, ο έλεγχος αποτυγχάνει και η εκτέλεση σταματάει. Αυτό αποτρέπει επιτιθέμενους από το να πλαστογραφήσουν ή να ξαναχρησιμοποιήσουν corrupted pointers σε memory corruption exploits, καθιστώντας τεχνικές όπως ROP ή JOP πολύ πιο δύσκολες στην αξιοποίηση.
|
||||
- **Privilege Access never (PAN)** είναι μια λειτουργία hardware που αποτρέπει τον kernel (privileged mode) από το να προσπελάσει άμεσα user-space μνήμη εκτός αν ενεργοποιήσει ρητά την πρόσβαση. Αυτό εμποδίζει τους επιτιθέμενους που απέκτησαν kernel code execution από το να διαβάσουν ή να γράψουν εύκολα user memory για escalation ή κλοπή ευαίσθητων δεδομένων. Εφαρμόζοντας αυστηρό διαχωρισμό, το PAN μειώνει τον αντίκτυπο των kernel exploits και μπλοκάρει πολλές κοινές τεχνικές privilege-escalation.
|
||||
- **Page Protection Layer (PPL)** είναι ένας μηχανισμός ασφαλείας του iOS που προστατεύει κρίσιμες περιοχές μνήμης που διαχειρίζεται ο kernel, ειδικά αυτές που σχετίζονται με code signing και entitlements. Εφαρμόζει αυστηρές write protections χρησιμοποιώντας την MMU και επιπλέον ελέγχους, εξασφαλίζοντας ότι ακόμα και privileged kernel code δεν μπορεί αυθαίρετα να τροποποιήσει ευαίσθητες σελίδες. Αυτό αποτρέπει τους επιτιθέμενους που αποκτούν kernel-level execution από την παραποίηση security-critical δομών, καθιστώντας την persistence και την παράκαμψη code-signing σημαντικά πιο δύσκολες.
|
||||
|
||||
|
||||
## Physical use-after-free
|
||||
|
||||
This is a summary from the post from [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) moreover further information about exploit using this technique can be found in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
|
||||
|
||||
### Διαχείριση μνήμης στο XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
||||
### Memory management in XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
|
||||
|
||||
Ο χώρος διευθύνσεων της εικονικής μνήμης για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα στη φυσική μνήμη. Αντίθετα, ο kernel χρησιμοποιεί **page tables** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **physical addresses**.
|
||||
Ο **χώρος διευθύνσεων εικονικής μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο **kernel** χρησιμοποιεί **πίνακες σελίδων (page tables)** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**.
|
||||
|
||||
#### Επίπεδα των Page Tables στο iOS
|
||||
#### Levels of Page Tables in iOS
|
||||
|
||||
Τα page tables οργανώνονται ιεραρχικά σε τρία επίπεδα:
|
||||
Οι πίνακες σελίδων οργανώνονται ιεραρχικά σε τρία επίπεδα:
|
||||
|
||||
1. **L1 Page Table (Level 1)**:
|
||||
* Κάθε εγγραφή εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης.
|
||||
* Καλύπτει **0x1000000000 bytes** (ή **256 GB**) εικονικής μνήμης.
|
||||
2. **L2 Page Table (Level 2)**:
|
||||
* Μια εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
|
||||
* Μία εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
|
||||
* Μια εγγραφή L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να χαρτογραφήσει ολόκληρη την περιοχή από μόνη της.
|
||||
3. **L3 Page Table (Level 3)**:
|
||||
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή χαρτογραφεί μια μοναδική σελίδα μνήμης **4 KB**.
|
||||
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή χαρτογραφεί μία μοναδική σελίδα μνήμης **4 KB**.
|
||||
* Μια εγγραφή L2 μπορεί να δείχνει σε έναν πίνακα L3 αν απαιτείται πιο λεπτομερής έλεγχος.
|
||||
|
||||
#### Αντιστοίχιση εικονικής σε φυσική μνήμη
|
||||
#### Mapping Virtual to Physical Memory
|
||||
|
||||
* **Direct Mapping (Block Mapping)**:
|
||||
* Ορισμένες εγγραφές στον page table αντιστοιχούν άμεσα ένα εύρος εικονικών διευθύνσεων σε ένα συνεχή εύρος φυσικών διευθύνσεων (σαν συντόμευση).
|
||||
* Ορισμένες εγγραφές σε έναν πίνακα σελίδων αντιστοιχούν άμεσα ένα εύρος εικονικών διευθύνσεων σε ένα συνεχόμενο εύρος φυσικών διευθύνσεων (σαν σύντομος δρόμος).
|
||||
* **Pointer to Child Page Table**:
|
||||
* Αν απαιτείται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ. L1) μπορεί να δείχνει σε έναν child page table στο επόμενο επίπεδο (π.χ. L2).
|
||||
* Εάν απαιτείται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ. L1) μπορεί να δείχνει σε έναν **child page table** στο επόμενο επίπεδο (π.χ. L2).
|
||||
|
||||
#### Παράδειγμα: Χαρτογράφηση μιας εικονικής διεύθυνσης
|
||||
#### Example: Mapping a Virtual Address
|
||||
|
||||
Ας υποθέσουμε ότι προσπαθείτε να προσπελάσετε την εικονική διεύθυνση **0x1000000000**:
|
||||
|
||||
1. **L1 Table**:
|
||||
* Ο kernel ελέγχει την εγγραφή L1 που αντιστοιχεί στην εν λόγω εικονική διεύθυνση. Αν έχει **pointer to an L2 page table**, πηγαίνει σε εκείνο τον πίνακα L2.
|
||||
* Ο kernel ελέγχει την εγγραφή του L1 page table που αντιστοιχεί σε αυτή την εικονική διεύθυνση. Εάν αυτή έχει έναν **pointer to an L2 page table**, πηγαίνει στον αντίστοιχο πίνακα L2.
|
||||
2. **L2 Table**:
|
||||
* Ο kernel ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η εγγραφή δείχνει σε έναν **L3 page table**, προχωράει εκεί.
|
||||
* Ο kernel ελέγχει τον L2 page table για μια πιο λεπτομερή αντιστοίχιση. Εάν η εγγραφή αυτή δείχνει σε έναν **L3 page table**, προχωράει εκεί.
|
||||
3. **L3 Table**:
|
||||
* Ο kernel αναζητά την τελική εγγραφή L3, που δείχνει στη **physical address** της πραγματικής σελίδας μνήμης.
|
||||
* Ο kernel κοιτάζει την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης.
|
||||
|
||||
#### Παράδειγμα Χαρτογράφησης Διευθύνσεων
|
||||
#### Example of Address Mapping
|
||||
|
||||
Αν γράψετε τη φυσική διεύθυνση **0x800004000** στον πρώτο δείκτη του πίνακα L2, τότε:
|
||||
Εάν γράψετε τη φυσική διεύθυνση **0x800004000** στο πρώτο index του L2 table, τότε:
|
||||
|
||||
* Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν στις φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**.
|
||||
* Αυτή είναι μια **block mapping** στο επίπεδο L2.
|
||||
* Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**.
|
||||
* Αυτή είναι μια **block mapping** σε επίπεδο L2.
|
||||
|
||||
Εναλλακτικά, αν η εγγραφή L2 δείχνει σε έναν πίνακα L3:
|
||||
|
||||
* Κάθε σελίδα 4 KB στην εικονική περιοχή **0x1000000000 -> 0x1002000000** θα χαρτογραφείται από μεμονωμένες εγγραφές στον πίνακα L3.
|
||||
* Κάθε σελίδα 4 KB στην εικονική περιοχή **0x1000000000 -> 0x1002000000** θα χαρτογραφείται από μεμονωμένες εγγραφές στον L3 πίνακα.
|
||||
|
||||
### Physical use-after-free
|
||||
|
||||
Μια **physical use-after-free** (UAF) συμβαίνει όταν:
|
||||
Μια **physical use-after-free (UAF)** συμβαίνει όταν:
|
||||
|
||||
1. Μια διεργασία **κατανεμηθεί** κάποια μνήμη ως **readable and writable**.
|
||||
1. Μια διεργασία **δεσμεύει (allocates)** κάποια μνήμη ως **readable and writable**.
|
||||
2. Οι **page tables** ενημερώνονται για να χαρτογραφήσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που η διεργασία μπορεί να προσπελάσει.
|
||||
3. Η διεργασία **αποδεσμεύει** (free) τη μνήμη.
|
||||
4. Όμως, λόγω ενός **bug**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους page tables, παρόλο που σημειώνει ότι η αντίστοιχη φυσική μνήμη είναι ελεύθερη.
|
||||
5. Ο kernel μπορεί στη συνέχεια να **επανακατανείμει αυτή τη "free" φυσική μνήμη** για άλλους σκοπούς, όπως δεδομένα του kernel.
|
||||
6. Εφόσον η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάζει και να γράφει** σε αυτή τη φυσική μνήμη.
|
||||
3. Η διεργασία **απελευθερώνει (deallocates / frees)** τη μνήμη.
|
||||
4. Ωστόσο, λόγω ενός **bug**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, παρότι σηματοδοτεί τη σχετική φυσική μνήμη ως ελεύθερη.
|
||||
5. Ο kernel μπορεί στη συνέχεια να **επαναεκχωρήσει αυτήν την "απελευθερωμένη" φυσική μνήμη** για άλλες χρήσεις, όπως για **kernel data**.
|
||||
6. Εφόσον η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτήν την φυσική μνήμη.
|
||||
|
||||
Αυτό σημαίνει ότι η διεργασία μπορεί να προσπελάσει **σελίδες μνήμης του kernel**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας πιθανώς σε έναν επιτιθέμενο να **χειριστεί μνήμη του kernel**.
|
||||
Αυτό σημαίνει ότι η διεργασία μπορεί να προσπελάσει **σελίδες του kernel memory**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, ενδεχομένως επιτρέποντας σε έναν επιτιθέμενο να **χειραγωγήσει το kernel memory**.
|
||||
|
||||
### IOSurface Heap Spray
|
||||
|
||||
Εφόσον ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες του kernel θα εκχωρηθούν στη freed μνήμη, χρησιμοποιεί μια τεχνική που ονομάζεται **heap spray**:
|
||||
Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες kernel σελίδες θα εκχωρηθούν στη freed memory, χρησιμοποιεί μια τεχνική που ονομάζεται **heap spray**:
|
||||
|
||||
1. Ο επιτιθέμενος **δημιουργεί μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του kernel.
|
||||
2. Κάθε αντικείμενο IOSurface περιέχει μια **magic value** σε ένα από τα πεδία του, καθιστώντας το εύκολα αναγνωρίσιμο.
|
||||
3. Σαρώνει τις freed σελίδες για να δει αν οποιοδήποτε από αυτά τα αντικείμενα IOSurface κατέληξε σε μια freed σελίδα.
|
||||
4. Όταν βρει ένα αντικείμενο IOSurface σε freed σελίδα, μπορεί να το χρησιμοποιήσει για να **διαβάσει και να γράψει μνήμη του kernel**.
|
||||
1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στην kernel μνήμη.
|
||||
2. Κάθε αντικείμενο IOSurface περιέχει μια **magic value** σε ένα από τα fields του, κάνοντάς τα εύκολα αναγνωρίσιμα.
|
||||
3. Σαρώνει τις απελευθερωμένες σελίδες για να δει αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια freed σελίδα.
|
||||
4. Όταν εντοπίσει ένα αντικείμενο IOSurface σε μια freed σελίδα, μπορεί να το χρησιμοποιήσει για να **διαβάσει και να γράψει kernel memory**.
|
||||
|
||||
More info about this in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
|
||||
|
||||
> [!TIP]
|
||||
> Λάβετε υπόψη ότι συσκευές iOS 16+ (A12+) φέρουν hardware mitigations (όπως PPL ή SPTM) που κάνουν τις τεχνικές physical UAF πολύ λιγότερο ρεαλιστικές.
|
||||
> PPL επιβάλει αυστηρές προστασίες MMU σε σελίδες σχετικές με code signing, entitlements και ευαίσθητα δεδομένα του kernel, έτσι ακόμα και αν μια σελίδα επαναχρησιμοποιηθεί, εγγραφές από userland ή compromised kernel code σε σελίδες προστατευμένες από PPL αποκλείονται.
|
||||
> Secure Page Table Monitor (SPTM) επεκτείνει το PPL ενισχύοντας τις ενημερώσεις των page tables οι ίδιες. Διασφαλίζει ότι ακόμη και ο προνομιούχος kernel code δεν μπορεί να επαναχαρτογραφήσει σιωπηλά freed σελίδες ή να παραποιήσει αντιστοιχίσεις χωρίς να περάσει από secure checks.
|
||||
> KTRR (Kernel Text Read-Only Region), το οποίο κλειδώνει το τμήμα κώδικα του kernel ως read-only μετά το boot. Αυτό αποτρέπει οποιεσδήποτε runtime τροποποιήσεις στον κώδικα του kernel, κλείνοντας ένα μεγάλο attack vector που συχνά εκμεταλλεύονται τα physical UAF exploits.
|
||||
> Επιπλέον, οι κατανομές `IOSurface` είναι λιγότερο προβλέψιμες και πιο δύσκολο να χαρτογραφηθούν σε user-accessible περιοχές, κάτι που κάνει το κόλπο του “magic value scanning” πολύ λιγότερο αξιόπιστο. Και το `IOSurface` τώρα προστατεύεται από entitlements και sandbox περιορισμούς.
|
||||
> Να γνωρίζετε ότι οι συσκευές iOS 16+ (A12+) φέρνουν hardware mitigations (όπως PPL ή SPTM) που καθιστούν τις τεχνικές physical UAF πολύ λιγότερο εφαρμόσιμες.
|
||||
> PPL επιβάλλει αυστηρές προστασίες MMU σε σελίδες που σχετίζονται με code signing, entitlements και ευαίσθητα kernel δεδομένα, οπότε ακόμα και αν μια σελίδα ξαναχρησιμοποιηθεί, οι εγγραφές από userland ή συμβιβασμένο kernel code σε PPL-protected σελίδες αποκλείονται.
|
||||
> Secure Page Table Monitor (SPTM) επεκτείνει το PPL ενισχύοντας τις ίδιες τις ενημερώσεις των page tables. Εξασφαλίζει ότι ακόμα και privileged kernel code δεν μπορεί αθόρυβα να remap-άρει freed σελίδες ή να παραποιήσει αντιστοιχίσεις χωρίς να περάσει από ασφαλείς ελέγχους.
|
||||
> KTRR (Kernel Text Read-Only Region), που κλειδώνει το code section του kernel ως read-only μετά το boot. Αυτό αποτρέπει οποιεσδήποτε runtime τροποποιήσεις στον kernel code, κλείνοντας ένα μεγάλο attack vector που συχνά αξιοποιούνταn τα physical UAF exploits.
|
||||
> Επιπλέον, οι κατανομές `IOSurface` είναι πλέον λιγότερο προβλέψιμες και δυσκολότερο να χαρτογραφηθούν σε περιοχές προσβάσιμες από user, γεγονός που κάνει το κόλπο του “magic value scanning” πολύ λιγότερο αξιόπιστο. Και το `IOSurface` πλέον προστατεύεται από entitlements και sandbox περιορισμούς.
|
||||
|
||||
### Διαδικασία Heap Spray βήμα-προς-βήμα
|
||||
### Step-by-Step Heap Spray Process
|
||||
|
||||
1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με έναν ειδικό αναγνωριστικό ("magic value").
|
||||
2. **Scan Freed Pages**: Ελέγχει αν κάποια από τα αντικείμενα έχουν εκχωρηθεί σε μια freed σελίδα.
|
||||
3. **Read/Write Kernel Memory**: Με τη χειραγώγηση πεδίων στο αντικείμενο IOSurface, αποκτά τη δυνατότητα για **arbitrary reads and writes** στη μνήμη του kernel. Αυτό του επιτρέπει να:
|
||||
* Χρησιμοποιήσει ένα πεδίο για να **διαβάσει οποιαδήποτε 32-bit τιμή** στη μνήμη του kernel.
|
||||
* Χρησιμοποιήσει άλλο πεδίο για να **γράψει 64-bit τιμές**, επιτυγχάνοντας ένα σταθερό **kernel read/write primitive**.
|
||||
1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με έναν ειδικό identifier ("magic value").
|
||||
2. **Scan Freed Pages**: Ελέγχει αν κάποιο από τα αντικείμενα έχει εκχωρηθεί σε μια freed σελίδα.
|
||||
3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτά τη δυνατότητα για **arbitrary reads and writes** στην kernel μνήμη. Αυτό του επιτρέπει:
|
||||
* Να χρησιμοποιήσει ένα πεδίο για να **διαβάσει οποιαδήποτε 32-bit τιμή** στην kernel μνήμη.
|
||||
* Να χρησιμοποιήσει άλλο πεδίο για να **γράψει 64-bit τιμές**, επιτυγχάνοντας ένα σταθερό **kernel read/write primitive**.
|
||||
|
||||
Generate IOSurface objects with the magic value IOSURFACE\_MAGIC to later search for:
|
||||
```c
|
||||
@ -114,7 +128,7 @@ io_connect_t id = result.surface_id;
|
||||
}
|
||||
}
|
||||
```
|
||||
Αναζήτηση για **`IOSurface`** αντικείμενα σε μία απελευθερωμένη φυσική σελίδα:
|
||||
Αναζήτηση για αντικείμενα **`IOSurface`** σε μία ελευθερωμένη φυσική σελίδα:
|
||||
```c
|
||||
int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) {
|
||||
io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000);
|
||||
@ -148,24 +162,24 @@ free(surfaceIDs);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### Επίτευξη Kernel Read/Write με IOSurface
|
||||
### Επίτευξη ανάγνωσης/εγγραφής του πυρήνα με IOSurface
|
||||
|
||||
Μετά την απόκτηση ελέγχου ενός IOSurface object στη kernel μνήμη (mapped σε μια freed φυσική σελίδα προσβάσιμη από userspace), μπορούμε να το χρησιμοποιήσουμε για **arbitrary kernel read and write operations**.
|
||||
Μετά τον έλεγχο ενός αντικειμένου IOSurface στη μνήμη του πυρήνα (mapped σε μια freed physical page προσβάσιμη από userspace), μπορούμε να το χρησιμοποιήσουμε για **arbitrary kernel read and write operations**.
|
||||
|
||||
**Key Fields in IOSurface**
|
||||
**Βασικά Πεδία στο IOSurface**
|
||||
|
||||
Το IOSurface αντικείμενο έχει δύο κρίσιμα πεδία:
|
||||
Το αντικείμενο IOSurface έχει δύο κρίσιμα πεδία:
|
||||
|
||||
1. **Use Count Pointer**: Επιτρέπει ένα **32-bit read**.
|
||||
2. **Indexed Timestamp Pointer**: Επιτρέπει ένα **64-bit write**.
|
||||
|
||||
Με την επαναγραφή αυτών των pointers, τα ανακατευθύνουμε σε αυθαίρετες διευθύνσεις στη kernel μνήμη, ενεργοποιώντας read/write δυνατότητες.
|
||||
Με την υπερχείλιση αυτών των δεικτών, τους ανακατευθύνουμε σε αυθαίρετες διευθύνσεις στη μνήμη του πυρήνα, ενεργοποιώντας δυνατότητες read/write.
|
||||
|
||||
#### 32-Bit Kernel Read
|
||||
|
||||
Για να εκτελέσετε ανάγνωση:
|
||||
Για να εκτελέσετε μια ανάγνωση:
|
||||
|
||||
1. Επαναγράψτε τον **use count pointer** ώστε να δείχνει στη διεύθυνση-στόχο μείον ένα offset 0x14 bytes.
|
||||
1. Αντικαταστήστε το **use count pointer** ώστε να δείχνει στη διεύθυνση-στόχο μείον 0x14-byte offset.
|
||||
2. Χρησιμοποιήστε τη μέθοδο `get_use_count` για να διαβάσετε την τιμή σε εκείνη τη διεύθυνση.
|
||||
```c
|
||||
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
|
||||
@ -184,12 +198,12 @@ iosurface_set_use_count_pointer(info.object, orig);
|
||||
return value;
|
||||
}
|
||||
```
|
||||
#### Εγγραφή 64-Bit στον Kernel
|
||||
#### 64-Bit Kernel Write
|
||||
|
||||
Για να πραγματοποιήσετε μια εγγραφή:
|
||||
|
||||
1. Υπεργράψτε τον **indexed timestamp pointer** με τη διεύθυνση-στόχο.
|
||||
2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια τιμή 64-bit.
|
||||
1. Αντικαταστήστε τον **δείκτη ευρετηριασμένης χρονοσφραγίδας** με τη διεύθυνση-στόχο.
|
||||
2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια 64-bit τιμή.
|
||||
```c
|
||||
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
|
||||
uint64_t args[3] = {surfaceID, 0, value};
|
||||
@ -203,13 +217,13 @@ set_indexed_timestamp(info.client, info.surface, value);
|
||||
iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
}
|
||||
```
|
||||
#### Exploit Flow Recap
|
||||
#### Ανακεφαλαίωση Ροής Exploit
|
||||
|
||||
1. **Trigger Physical Use-After-Free**: Οι σελίδες που έχουν απελευθερωθεί είναι διαθέσιμες για επαναχρησιμοποίηση.
|
||||
2. **Spray IOSurface Objects**: Δημιουργήστε πολλά IOSurface objects με ένα μοναδικό "magic value" στο kernel memory.
|
||||
3. **Identify Accessible IOSurface**: Εντοπίστε ένα IOSurface σε σελίδα που έχει απελευθερωθεί και που ελέγχετε.
|
||||
4. **Abuse Use-After-Free**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετο **kernel read/write** μέσω μεθόδων IOSurface.
|
||||
1. **Προκαλέστε Φυσικό Use-After-Free**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση.
|
||||
2. **Spray IOSurface Objects**: Δεσμεύστε πολλά αντικείμενα IOSurface με μια μοναδική "magic value" στη μνήμη του πυρήνα.
|
||||
3. **Εντοπίστε Προσβάσιμο IOSurface**: Εντοπίστε ένα IOSurface σε μια απελευθερωμένη σελίδα που ελέγχετε.
|
||||
4. **Εκμετάλλευση Use-After-Free**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετο **kernel read/write** μέσω μεθόδων IOSurface.
|
||||
|
||||
Με αυτά τα primitives, το exploit παρέχει ελεγχόμενα **32-bit reads** και **64-bit writes** σε kernel memory. Περαιτέρω βήματα για jailbreak ενδέχεται να περιλαμβάνουν πιο σταθερά read/write primitives, που μπορεί να απαιτήσουν παράκαμψη επιπλέον προστασιών (π.χ. PPL σε νεότερες συσκευές arm64e).
|
||||
Με αυτά τα primitives, το exploit παρέχει ελεγχόμενα **32-bit reads** και **64-bit writes** στη μνήμη του πυρήνα. Επιπλέον βήματα για το jailbreak θα μπορούσαν να περιλαμβάνουν πιο σταθερά read/write primitives, που μπορεί να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ. PPL σε νεότερες συσκευές arm64e).
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -1,69 +1,147 @@
|
||||
# Ανίχνευση Phishing
|
||||
# Εντοπισμός Phishing
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Εισαγωγή
|
||||
|
||||
Για να ανιχνεύσετε μια απόπειρα phishing είναι σημαντικό να **κατανοήσετε τις τεχνικές phishing που χρησιμοποιούνται σήμερα**. Στη γονική σελίδα αυτής της ανάρτησης, μπορείτε να βρείτε αυτές τις πληροφορίες, οπότε αν δεν γνωρίζετε ποιες τεχνικές χρησιμοποιούνται σήμερα, σας προτείνω να πάτε στη γονική σελίδα και να διαβάσετε τουλάχιστον αυτή την ενότητα.
|
||||
Για να εντοπίσετε μια προσπάθεια phishing είναι σημαντικό να **κατανοείτε τις τεχνικές phishing που χρησιμοποιούνται σήμερα**. Στην γονική σελίδα αυτού του άρθρου μπορείτε να βρείτε αυτές τις πληροφορίες, οπότε αν δεν είστε εξοικειωμένοι με το ποιες τεχνικές χρησιμοποιούνται σήμερα, σας προτείνω να μεταβείτε στη γονική σελίδα και να διαβάσετε τουλάχιστον εκείνη την ενότητα.
|
||||
|
||||
Αυτή η ανάρτηση βασίζεται στην ιδέα ότι οι **επιτιθέμενοι θα προσπαθήσουν με κάποιο τρόπο να μιμηθούν ή να χρησιμοποιήσουν το όνομα τομέα του θύματος**. Αν το όνομα τομέα σας είναι `example.com` και σας phishing χρησιμοποιώντας ένα εντελώς διαφορετικό όνομα τομέα για κάποιο λόγο όπως `youwonthelottery.com`, αυτές οι τεχνικές δεν θα το αποκαλύψουν.
|
||||
Αυτό το άρθρο βασίζεται στην ιδέα ότι οι **επιτιθέμενοι θα προσπαθήσουν με κάποιον τρόπο να μιμηθούν ή να χρησιμοποιήσουν το domain του θύματος**. Αν το domain σας ονομάζεται `example.com` και σας κάνει phishing χρησιμοποιώντας εντελώς διαφορετικό domain για κάποιο λόγο όπως `youwonthelottery.com`, αυτές οι τεχνικές δεν πρόκειται να το αποκαλύψουν.
|
||||
|
||||
## Παραλλαγές ονομάτων τομέα
|
||||
## Παραλλαγές ονομάτων domain
|
||||
|
||||
Είναι κάπως **εύκολο** να **αποκαλύψετε** αυτές τις **απόπειρες phishing** που θα χρησιμοποιήσουν ένα **παρόμοιο όνομα τομέα** μέσα στο email.\
|
||||
Αρκεί να **δημιουργήσετε μια λίστα με τα πιο πιθανά ονόματα phishing** που μπορεί να χρησιμοποιήσει ένας επιτιθέμενος και να **ελέγξετε** αν είναι **καταχωρημένα** ή απλώς να ελέγξετε αν υπάρχει κάποια **IP** που τα χρησιμοποιεί.
|
||||
Είναι κάπως **εύκολο** να **αποκαλύψετε** αυτές τις **phishing** προσπάθειες που θα χρησιμοποιήσουν ένα **παρόμοιο domain** μέσα στο email.\
|
||||
Αρκεί να **δημιουργήσετε μια λίστα με τα πιο πιθανά phishing ονόματα** που μπορεί να χρησιμοποιήσει ένας επιτιθέμενος και να **ελέγξετε** αν είναι **καταχωρημένα** ή απλώς να ελέγξετε αν υπάρχει κάποια **IP** που τα χρησιμοποιεί.
|
||||
|
||||
### Εύρεση ύποπτων τομέων
|
||||
### Εύρεση ύποπτων domains
|
||||
|
||||
Για αυτόν τον σκοπό, μπορείτε να χρησιμοποιήσετε οποιοδήποτε από τα παρακάτω εργαλεία. Σημειώστε ότι αυτά τα εργαλεία θα εκτελούν επίσης αυτόματα DNS αιτήματα για να ελέγξουν αν ο τομέας έχει κάποια IP που του έχει ανατεθεί:
|
||||
Για αυτόν τον σκοπό, μπορείτε να χρησιμοποιήσετε οποιοδήποτε από τα παρακάτω εργαλεία. Σημειώστε ότι αυτά τα εργαλεία θα πραγματοποιήσουν και αυτόματα αιτήσεις DNS για να ελέγξουν αν το domain έχει κάποια IP αντιστοιχισμένη σε αυτό:
|
||||
|
||||
- [**dnstwist**](https://github.com/elceef/dnstwist)
|
||||
- [**urlcrazy**](https://github.com/urbanadventurer/urlcrazy)
|
||||
|
||||
Tip: Εάν δημιουργήσετε μια λίστα υποψήφιων, τροφοδοτήστε την επίσης στα DNS resolver logs σας για να εντοπίσετε **NXDOMAIN lookups from inside your org** (χρήστες που προσπαθούν να φτάσουν ένα typo πριν ο επιτιθέμενος το καταχωρήσει πραγματικά). Sinkhole ή pre-block αυτά τα domains αν το policy το επιτρέπει.
|
||||
|
||||
### Bitflipping
|
||||
|
||||
**Μπορείτε να βρείτε μια σύντομη εξήγηση αυτής της τεχνικής στη γονική σελίδα. Ή διαβάστε την πρωτότυπη έρευνα στο** [**https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/**](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)
|
||||
**Μπορείτε να βρείτε μια σύντομη εξήγηση αυτής της τεχνικής στη γονική σελίδα. Ή διαβάστε την αρχική έρευνα στο** [**https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/**](https://www.bleepingcomputer.com/news/security/hijacking-traffic-to-microsoft-s-windowscom-with-bitflipping/)
|
||||
|
||||
Για παράδειγμα, μια τροποποίηση 1 bit στο domain microsoft.com μπορεί να το μετατρέψει σε _windnws.com._\
|
||||
**Οι επιτιθέμενοι μπορεί να καταχωρήσουν όσο το δυνατόν περισσότερους τομείς bit-flipping σχετικούς με το θύμα για να ανακατευθύνουν νόμιμους χρήστες στην υποδομή τους**.
|
||||
Για παράδειγμα, μια 1 bit τροποποίηση στο domain microsoft.com μπορεί να το μετατρέψει σε _windnws.com._\
|
||||
**Οι επιτιθέμενοι μπορεί να καταχωρήσουν όσο το δυνατόν περισσότερα bit-flipping domains σχετικά με το θύμα για να ανακατευθύνουν νόμιμους χρήστες στην υποδομή τους**.
|
||||
|
||||
**Όλα τα πιθανά ονόματα τομέα bit-flipping θα πρέπει επίσης να παρακολουθούνται.**
|
||||
**Όλα τα πιθανά bit-flipping ονόματα domain θα πρέπει επίσης να παρακολουθούνται.**
|
||||
|
||||
Αν χρειάζεται επίσης να λάβετε υπόψη homoglyph/IDN lookalikes (π.χ., ανάμειξη Latin/Cyrillic χαρακτήρων), ελέγξτε:
|
||||
|
||||
{{#ref}}
|
||||
homograph-attacks.md
|
||||
{{#endref}}
|
||||
|
||||
### Βασικοί έλεγχοι
|
||||
|
||||
Αφού έχετε μια λίστα με πιθανά ύποπτα ονόματα τομέα, θα πρέπει να **τα ελέγξετε** (κυρίως τις θύρες HTTP και HTTPS) για να **δείτε αν χρησιμοποιούν κάποια φόρμα σύνδεσης παρόμοια** με αυτήν κάποιου από τον τομέα του θύματος.\
|
||||
Μπορείτε επίσης να ελέγξετε την θύρα 3333 για να δείτε αν είναι ανοιχτή και τρέχει μια instance του `gophish`.\
|
||||
Είναι επίσης ενδιαφέρον να γνωρίζετε **πόσο παλιός είναι κάθε ανακαλυφθείς ύποπτος τομέας**, όσο πιο νέος είναι, τόσο πιο επικίνδυνος είναι.\
|
||||
Μπορείτε επίσης να πάρετε **σcreenshot** της ύποπτης ιστοσελίδας HTTP και/ή HTTPS για να δείτε αν είναι ύποπτη και σε αυτή την περίπτωση **να την επισκεφθείτε για να ρίξετε μια πιο προσεκτική ματιά**.
|
||||
Μόλις έχετε μια λίστα πιθανών ύποπτων ονομάτων domain θα πρέπει να **τα ελέγξετε** (κυρίως τις θύρες HTTP και HTTPS) για να **δείτε αν χρησιμοποιούν κάποια φόρμα login που μοιάζει** με κάποια από τα domains του θύματος.\
|
||||
Μπορείτε επίσης να ελέγξετε τη θύρα 3333 για να δείτε αν είναι ανοιχτή και τρέχει μια instance του `gophish`.\
|
||||
Είναι επίσης ενδιαφέρον να γνωρίζετε **πόσο παλιά είναι κάθε εντοπισμένο ύποπτο domain**, όσο πιο νέο είναι τόσο πιο επικίνδυνο.\
|
||||
Μπορείτε επίσης να πάρετε **screenshots** της ύποπτης σελίδας HTTP και/ή HTTPS για να δείτε αν είναι ύποπτη και σε αυτήν την περίπτωση **να την επισκεφθείτε για να την διερευνήσετε βαθύτερα**.
|
||||
|
||||
### Προχωρημένοι έλεγχοι
|
||||
|
||||
Αν θέλετε να προχωρήσετε ένα βήμα παραπέρα, θα σας πρότεινα να **παρακολουθείτε αυτούς τους ύποπτους τομείς και να αναζητάτε περισσότερους** από καιρό σε καιρό (κάθε μέρα; χρειάζεται μόνο μερικά δευτερόλεπτα/λεπτά). Θα πρέπει επίσης να **ελέγξετε** τις ανοιχτές **θύρες** των σχετικών IP και να **αναζητήσετε instances του `gophish` ή παρόμοιων εργαλείων** (ναι, οι επιτιθέμενοι κάνουν επίσης λάθη) και να **παρακολουθείτε τις ιστοσελίδες HTTP και HTTPS των ύποπτων τομέων και υποτομέων** για να δείτε αν έχουν αντιγράψει κάποια φόρμα σύνδεσης από τις ιστοσελίδες του θύματος.\
|
||||
Για να **αυτοματοποιήσετε αυτό**, θα σας πρότεινα να έχετε μια λίστα με τις φόρμες σύνδεσης των τομέων του θύματος, να σπινάρετε τις ύποπτες ιστοσελίδες και να συγκρίνετε κάθε φόρμα σύνδεσης που βρέθηκε μέσα στους ύποπτους τομείς με κάθε φόρμα σύνδεσης του τομέα του θύματος χρησιμοποιώντας κάτι όπως το `ssdeep`.\
|
||||
Αν έχετε εντοπίσει τις φόρμες σύνδεσης των ύποπτων τομέων, μπορείτε να προσπαθήσετε να **στείλετε ψεύτικα διαπιστευτήρια** και να **ελέγξετε αν σας ανακατευθύνει στον τομέα του θύματος**.
|
||||
Αν θέλετε να πάτε ένα βήμα παραπέρα θα σας πρότεινα να **παρακολουθείτε αυτά τα ύποπτα domains και να ψάχνετε για περισσότερα** περιοδικά (κάθε μέρα; παίρνει μόνο λίγα δευτερόλεπτα/λεπτά). Θα πρέπει επίσης να **ελέγχετε** τις ανοιχτές **θύρες** των σχετικών IPs και να **αναζητάτε instances του `gophish` ή παρόμοιων εργαλείων** (ναι, οι επιτιθέμενοι κάνουν κι αυτοί λάθη) και να **παρακολουθείτε τις HTTP και HTTPS σελίδες των ύποπτων domains και subdomains** για να δείτε αν έχουν αντιγράψει κάποια φόρμα login από τις σελίδες του θύματος.\
|
||||
Για να **αυτοματοποιήσετε αυτό** θα πρότεινα να έχετε μια λίστα με τις φόρμες login των domains του θύματος, να spiderάρετε τις ύποπτες σελίδες και να συγκρίνετε κάθε φόρμα login που βρέθηκε μέσα στα ύποπτα domains με κάθε φόρμα login του domain του θύματος χρησιμοποιώντας κάτι σαν `ssdeep`.\
|
||||
Αν έχετε εντοπίσει τις φόρμες login των ύποπτων domains, μπορείτε να δοκιμάσετε να **στείλετε junk credentials** και να **ελέγξετε αν σας ανακατευθύνει στο domain του θύματος**.
|
||||
|
||||
## Ονόματα τομέα που χρησιμοποιούν λέξεις-κλειδιά
|
||||
---
|
||||
|
||||
Η γονική σελίδα αναφέρει επίσης μια τεχνική παραλλαγής ονομάτων τομέα που συνίσταται στο να βάζετε το **όνομα τομέα του θύματος μέσα σε έναν μεγαλύτερο τομέα** (π.χ. paypal-financial.com για paypal.com).
|
||||
### Κυνήγι με βάση το favicon και web fingerprints (Shodan/ZoomEye/Censys)
|
||||
|
||||
### Διαφάνεια Πιστοποιητικών
|
||||
Πολλά phishing kits επαναχρησιμοποιούν favicons από το brand που μιμούνται. Οι σαρωτές στο διαδίκτυο υπολογίζουν ένα MurmurHash3 του base64-encoded favicon. Μπορείτε να δημιουργήσετε το hash και να κάνετε pivot πάνω του:
|
||||
|
||||
Δεν είναι δυνατόν να ακολουθήσετε την προηγούμενη προσέγγιση "Brute-Force", αλλά είναι στην πραγματικότητα **δυνατό να αποκαλύψετε τέτοιες απόπειρες phishing** επίσης χάρη στη διαφάνεια πιστοποιητικών. Κάθε φορά που ένα πιστοποιητικό εκδίδεται από μια CA, οι λεπτομέρειες δημοσιοποιούνται. Αυτό σημαίνει ότι διαβάζοντας τη διαφάνεια πιστοποιητικών ή ακόμα και παρακολουθώντας την, είναι **δυνατό να βρείτε τομείς που χρησιμοποιούν μια λέξη-κλειδί μέσα στο όνομά τους**. Για παράδειγμα, αν ένας επιτιθέμενος δημιουργήσει ένα πιστοποιητικό για [https://paypal-financial.com](https://paypal-financial.com), βλέποντας το πιστοποιητικό είναι δυνατό να βρείτε τη λέξη-κλειδί "paypal" και να γνωρίζετε ότι χρησιμοποιείται ένα ύποπτο email.
|
||||
Python example (mmh3):
|
||||
```python
|
||||
import base64, requests, mmh3
|
||||
url = "https://www.paypal.com/favicon.ico" # change to your brand icon
|
||||
b64 = base64.encodebytes(requests.get(url, timeout=10).content)
|
||||
print(mmh3.hash(b64)) # e.g., 309020573
|
||||
```
|
||||
- Αναζήτηση στο Shodan: `http.favicon.hash:309020573`
|
||||
- Με εργαλεία: κοιτάξτε community tools όπως favfreak για να δημιουργήσετε hashes και dorks για Shodan/ZoomEye/Censys.
|
||||
|
||||
Η ανάρτηση [https://0xpatrik.com/phishing-domains/](https://0xpatrik.com/phishing-domains/) προτείνει ότι μπορείτε να χρησιμοποιήσετε το Censys για να αναζητήσετε πιστοποιητικά που επηρεάζουν μια συγκεκριμένη λέξη-κλειδί και να φιλτράρετε κατά ημερομηνία (μόνο "νέα" πιστοποιητικά) και από τον εκδότη CA "Let's Encrypt":
|
||||
Σημειώσεις
|
||||
- Τα Favicons επαναχρησιμοποιούνται· θεωρήστε τα matches ως leads και επαληθεύστε το content και τα certs πριν ενεργήσετε.
|
||||
- Συνδυάστε με domain-age και keyword heuristics για μεγαλύτερη ακρίβεια.
|
||||
|
||||
### Αναζήτηση τηλεμετρίας URL (urlscan.io)
|
||||
|
||||
`urlscan.io` αποθηκεύει ιστορικά screenshots, DOM, requests και TLS metadata των υποβληθέντων URLs. Μπορείτε να αναζητήσετε brand abuse και clones:
|
||||
|
||||
Παραδείγματα queries (UI ή API):
|
||||
- Βρείτε lookalikes εξαιρώντας τα legit domains σας: `page.domain:(/.*yourbrand.*/ AND NOT yourbrand.com AND NOT www.yourbrand.com)`
|
||||
- Βρείτε sites που κάνουν hotlinking των assets σας: `domain:yourbrand.com AND NOT page.domain:yourbrand.com`
|
||||
- Περιορίστε σε πρόσφατα αποτελέσματα: προσθέστε `AND date:>now-7d`
|
||||
|
||||
Παράδειγμα API:
|
||||
```bash
|
||||
# Search recent scans mentioning your brand
|
||||
curl -s 'https://urlscan.io/api/v1/search/?q=page.domain:(/.*yourbrand.*/%20AND%20NOT%20yourbrand.com)%20AND%20date:>now-7d' \
|
||||
-H 'API-Key: <YOUR_URLSCAN_KEY>' | jq '.results[].page.url'
|
||||
```
|
||||
Από το JSON, επικεντρωθείτε σε:
|
||||
- `page.tlsIssuer`, `page.tlsValidFrom`, `page.tlsAgeDays` για να εντοπίζετε πολύ νέα πιστοποιητικά για παραπλανητικά domains
|
||||
- `task.source` τιμές όπως `certstream-suspicious` για να συνδέετε ευρήματα με CT monitoring
|
||||
|
||||
### Ηλικία domain μέσω RDAP (scriptable)
|
||||
|
||||
RDAP επιστρέφει μηχανικά αναγνώσιμα γεγονότα δημιουργίας. Χρήσιμο για την επισήμανση **πρόσφατα καταχωρημένων domains (NRDs)**.
|
||||
```bash
|
||||
# .com/.net RDAP (Verisign)
|
||||
curl -s https://rdap.verisign.com/com/v1/domain/suspicious-example.com | \
|
||||
jq -r '.events[] | select(.eventAction=="registration") | .eventDate'
|
||||
|
||||
# Generic helper using rdap.net redirector
|
||||
curl -s https://www.rdap.net/domain/suspicious-example.com | jq
|
||||
```
|
||||
Εμπλουτίστε το pipeline σας επισημαίνοντας domains με buckets ηλικίας εγγραφής (π.χ., <7 days, <30 days) και δώστε προτεραιότητα στη triage ανάλογα.
|
||||
|
||||
### TLS/JAx fingerprints to spot AiTM infrastructure
|
||||
|
||||
Το σύγχρονο credential-phishing αξιοποιεί όλο και περισσότερο **Adversary-in-the-Middle (AiTM)** reverse proxies (π.χ., Evilginx) για να κλέψει διακριτικά συνεδρίας. Μπορείτε να προσθέσετε ανιχνεύσεις από το δίκτυο:
|
||||
|
||||
- Καταγράψτε TLS/HTTP fingerprints (JA3/JA4/JA4S/JA4H) στο egress. Σε κάποιες builds του Evilginx έχουν παρατηρηθεί σταθερές τιμές JA4 client/server. Δημιουργείτε alerts για γνωστά-κακά fingerprints μόνο ως αδύναμο σήμα και επιβεβαιώστε πάντα με content και domain intel.
|
||||
- Εγγραφάτε προδραστικά TLS certificate metadata (issuer, SAN count, wildcard use, validity) για lookalike hosts που εντοπίζονται μέσω CT ή urlscan και συσχετίστε με DNS age και geolocation.
|
||||
|
||||
> Σημείωση: Αντιμετωπίστε τα fingerprints ως enrichment, όχι ως αποκλειστικούς blockers· τα frameworks εξελίσσονται και μπορεί να randomise ή να obfuscate.
|
||||
|
||||
### Domain names using keywords
|
||||
|
||||
Η κύρια σελίδα αναφέρει επίσης μια τεχνική παραλλαγής domain που συνίσταται στο να βάλεις το όνομα domain του θύματος μέσα σε ένα μεγαλύτερο domain (π.χ. paypal-financial.com για paypal.com).
|
||||
|
||||
#### Certificate Transparency
|
||||
|
||||
Δεν είναι δυνατό να ακολουθήσετε την προηγούμενη «Brute-Force» προσέγγιση, αλλά είναι πράγματι **εφικτό να αποκαλύψετε τέτοιες απόπειρες phishing** χάρη στην Certificate Transparency. Κάθε φορά που μια CA εκδίδει ένα certificate, οι λεπτομέρειες γίνονται δημόσιες. Αυτό σημαίνει ότι διαβάζοντας το Certificate Transparency ή παρακολουθώντας το, είναι **εφικτό να βρείτε domains που χρησιμοποιούν μια keyword μέσα στο όνομά τους**. Για παράδειγμα, αν ένας επιτιθέμενος δημιουργήσει ένα certificate για το https://paypal-financial.com, βλέποντας το certificate μπορείτε να εντοπίσετε την keyword "paypal" και να γνωρίζετε ότι χρησιμοποιείται ύποπτο email.
|
||||
|
||||
Το post https://0xpatrik.com/phishing-domains/ προτείνει ότι μπορείτε να χρησιμοποιήσετε Censys για να αναζητήσετε certificates που αφορούν μια συγκεκριμένη keyword και να φιλτράρετε κατά ημερομηνία (μόνο "new" certificates) και κατά CA issuer "Let's Encrypt":
|
||||
|
||||
.png>)
|
||||
|
||||
Ωστόσο, μπορείτε να κάνετε "το ίδιο" χρησιμοποιώντας το δωρεάν web [**crt.sh**](https://crt.sh). Μπορείτε να **αναζητήσετε τη λέξη-κλειδί** και να **φιλτράρετε** τα αποτελέσματα **κατά ημερομηνία και CA** αν το επιθυμείτε.
|
||||
Ωστόσο, μπορείτε να κάνετε "το ίδιο" χρησιμοποιώντας την δωρεάν web υπηρεσία crt.sh. Μπορείτε να **αναζητήσετε την keyword** και να **φιλτράρετε** τα αποτελέσματα **κατά ημερομηνία και CA** αν το επιθυμείτε.
|
||||
|
||||
.png>)
|
||||
|
||||
Χρησιμοποιώντας αυτή την τελευταία επιλογή, μπορείτε ακόμη και να χρησιμοποιήσετε το πεδίο Matching Identities για να δείτε αν κάποια ταυτότητα από τον πραγματικό τομέα ταιριάζει με κάποιον από τους ύποπτους τομείς (σημειώστε ότι ένας ύποπτος τομέας μπορεί να είναι ψευδώς θετικός).
|
||||
Χρησιμοποιώντας αυτή την τελευταία επιλογή μπορείτε ακόμη να χρησιμοποιήσετε το πεδίο Matching Identities για να δείτε αν κάποια identity από το πραγματικό domain ταιριάζει με κάποιο από τα suspicious domains (σημειώστε ότι ένα suspicious domain μπορεί να είναι false positive).
|
||||
|
||||
**Μια άλλη εναλλακτική** είναι το φανταστικό έργο που ονομάζεται [**CertStream**](https://medium.com/cali-dog-security/introducing-certstream-3fc13bb98067). Το CertStream παρέχει μια ροή σε πραγματικό χρόνο νέων πιστοποιητικών που μπορείτε να χρησιμοποιήσετε για να ανιχνεύσετε καθορισμένες λέξεις-κλειδιά σε (σχεδόν) πραγματικό χρόνο. Στην πραγματικότητα, υπάρχει ένα έργο που ονομάζεται [**phishing_catcher**](https://github.com/x0rz/phishing_catcher) που κάνει ακριβώς αυτό.
|
||||
**Another alternative** είναι το εξαιρετικό project CertStream. Το CertStream παρέχει ένα real-time stream από νεογεννηθέντα certificates το οποίο μπορείτε να χρησιμοποιήσετε για να εντοπίσετε καθορισμένες keywords σε (near) real-time. Στην πραγματικότητα υπάρχει ένα project που λέγεται phishing_catcher που κάνει ακριβώς αυτό.
|
||||
|
||||
### **Νέοι τομείς**
|
||||
Πρακτική συμβουλή: όταν κάνετε triaging σε CT hits, δώστε προτεραιότητα σε NRDs, untrusted/unknown registrars, privacy-proxy WHOIS, και certs με πολύ πρόσφατους χρόνους `NotBefore`. Διατηρήστε μια allowlist των κατεχόμενων domains/brands σας για να μειώσετε τον θόρυβο.
|
||||
|
||||
**Μια τελευταία εναλλακτική** είναι να συγκεντρώσετε μια λίστα με **νέα καταχωρημένα ονόματα τομέα** για ορισμένα TLDs ([Whoxy](https://www.whoxy.com/newly-registered-domains/) παρέχει τέτοια υπηρεσία) και να **ελέγξετε τις λέξεις-κλειδιά σε αυτούς τους τομείς**. Ωστόσο, οι μακροχρόνιοι τομείς συνήθως χρησιμοποιούν ένα ή περισσότερους υποτομείς, επομένως η λέξη-κλειδί δεν θα εμφανίζεται μέσα στο FLD και δεν θα μπορείτε να βρείτε τον υποτομέα phishing.
|
||||
#### **New domains**
|
||||
|
||||
**Μια τελευταία εναλλακτική** είναι να συλλέξετε μια λίστα από newly registered domains για κάποια TLDs (Whoxy παρέχει τέτοια υπηρεσία) και να ελέγξετε τις keywords μέσα σε αυτά τα domains. Ωστόσο, τα μακρά domains συνήθως χρησιμοποιούν ένα ή περισσότερα subdomains, οπότε η keyword δεν θα εμφανιστεί μέσα στο FLD και δεν θα μπορείτε να βρείτε το phishing subdomain.
|
||||
|
||||
Επιπλέον heuristic: θεωρήστε ορισμένα file-extension TLDs (π.χ., .zip, .mov) με πρόσθετη υποψία κατά τη δημιουργία alerts. Συχνά συγχέονται με ονόματα αρχείων σε lures· συνδυάστε το TLD signal με brand keywords και NRD age για καλύτερη ακρίβεια.
|
||||
|
||||
## References
|
||||
|
||||
- urlscan.io – Αναφορά Search API: https://urlscan.io/docs/search/
|
||||
- APNIC Blog – JA4+ network fingerprinting (includes Evilginx example): https://blog.apnic.net/2023/11/22/ja4-network-fingerprinting/
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
@ -24,13 +24,15 @@
|
||||
/* 2 — load a single index (remote → local) */
|
||||
async function loadIndex(remote, local, isCloud=false){
|
||||
let rawLoaded = false;
|
||||
try {
|
||||
const r = await fetch(remote,{mode:'cors'});
|
||||
if (!r.ok) throw new Error('HTTP '+r.status);
|
||||
importScripts(URL.createObjectURL(new Blob([await r.text()],{type:'application/javascript'})));
|
||||
rawLoaded = true;
|
||||
} catch(e){ console.warn('remote',remote,'failed →',e); }
|
||||
if(!rawLoaded){
|
||||
if(remote){
|
||||
try {
|
||||
const r = await fetch(remote,{mode:'cors'});
|
||||
if (!r.ok) throw new Error('HTTP '+r.status);
|
||||
importScripts(URL.createObjectURL(new Blob([await r.text()],{type:'application/javascript'})));
|
||||
rawLoaded = true;
|
||||
} catch(e){ console.warn('remote',remote,'failed →',e); }
|
||||
}
|
||||
if(!rawLoaded && local){
|
||||
try { importScripts(abs(local)); rawLoaded = true; }
|
||||
catch(e){ console.error('local',local,'failed →',e); }
|
||||
}
|
||||
@ -40,13 +42,41 @@
|
||||
return data;
|
||||
}
|
||||
|
||||
async function loadWithFallback(remotes, local, isCloud=false){
|
||||
if(remotes.length){
|
||||
const [primary, ...secondary] = remotes;
|
||||
const primaryData = await loadIndex(primary, null, isCloud);
|
||||
if(primaryData) return primaryData;
|
||||
|
||||
if(local){
|
||||
const localData = await loadIndex(null, local, isCloud);
|
||||
if(localData) return localData;
|
||||
}
|
||||
|
||||
for (const remote of secondary){
|
||||
const data = await loadIndex(remote, null, isCloud);
|
||||
if(data) return data;
|
||||
}
|
||||
}
|
||||
|
||||
return local ? loadIndex(null, local, isCloud) : null;
|
||||
}
|
||||
|
||||
(async () => {
|
||||
const MAIN_RAW = 'https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/master/searchindex.js';
|
||||
const CLOUD_RAW = 'https://raw.githubusercontent.com/HackTricks-wiki/hacktricks-cloud/refs/heads/master/searchindex.js';
|
||||
const htmlLang = (document.documentElement.lang || 'en').toLowerCase();
|
||||
const lang = htmlLang.split('-')[0];
|
||||
const mainReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks/releases/download';
|
||||
const cloudReleaseBase = 'https://github.com/HackTricks-wiki/hacktricks-cloud/releases/download';
|
||||
|
||||
const mainTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
||||
const cloudTags = Array.from(new Set([`searchindex-${lang}`, 'searchindex-en', 'searchindex-master']));
|
||||
|
||||
const MAIN_REMOTE_SOURCES = mainTags.map(tag => `${mainReleaseBase}/${tag}/searchindex.js`);
|
||||
const CLOUD_REMOTE_SOURCES = cloudTags.map(tag => `${cloudReleaseBase}/${tag}/searchindex.js`);
|
||||
|
||||
const indices = [];
|
||||
const main = await loadIndex(MAIN_RAW , '/searchindex.js', false); if(main) indices.push(main);
|
||||
const cloud= await loadIndex(CLOUD_RAW, '/searchindex-cloud.js', true ); if(cloud) indices.push(cloud);
|
||||
const main = await loadWithFallback(MAIN_REMOTE_SOURCES , '/searchindex.js', false); if(main) indices.push(main);
|
||||
const cloud= await loadWithFallback(CLOUD_REMOTE_SOURCES, '/searchindex-cloud.js', true ); if(cloud) indices.push(cloud);
|
||||
|
||||
if(!indices.length){ postMessage({ready:false, error:'no-index'}); return; }
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user