diff --git a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md index 48dee9e86..310f5e0c5 100644 --- a/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md +++ b/src/pentesting-cloud/gcp-security/gcp-post-exploitation/gcp-kms-post-exploitation.md @@ -12,11 +12,11 @@ ### `cloudkms.cryptoKeyVersions.destroy` -Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να καταστρέψει μια έκδοση του KMS. Για να το κάνετε αυτό, πρέπει πρώτα να απενεργοποιήσετε το κλειδί και στη συνέχεια να το καταστρέψετε: +Ένας attacker με αυτό το permission θα μπορούσε να καταστρέψει μια έκδοση του KMS. Για να το κάνετε αυτό πρέπει πρώτα να disable το key και μετά να το destroy:
-Απενεργοποίηση και καταστροφή έκδοσης κλειδιού (Python) +Disable and destroy key version (Python) ```python # pip install google-cloud-kms @@ -65,24 +65,38 @@ destroy_key_version(project_id, location_id, key_ring_id, key_id, key_version) ### KMS Ransomware -Στο AWS είναι δυνατόν να **steal a KMS key** πλήρως, τροποποιώντας την KMS resource policy και επιτρέποντας μόνο στον λογαριασμό του επιτιθέμενου να χρησιμοποιεί το κλειδί. Εφόσον αυτές οι resource policies δεν υπάρχουν στο GCP, αυτό δεν είναι δυνατό. +Στο AWS είναι δυνατό να γίνει πλήρης **steal a KMS key** τροποποιώντας το KMS resource policy και επιτρέποντας μόνο στον attacker account να χρησιμοποιήσει το key. Εφόσον αυτές οι resource policies δεν υπάρχουν στο GCP, αυτό δεν είναι δυνατό. -Ωστόσο, υπάρχει ένας άλλος τρόπος για να πραγματοποιηθεί παγκόσμιο KMS Ransomware, που θα περιλάμβανε τα ακόλουθα βήματα: +Ωστόσο, υπάρχει ένας άλλος τρόπος για να εκτελέσετε ένα παγκόσμιο KMS Ransomware, ο οποίος θα περιελάμβανε τα ακόλουθα βήματα: -- Δημιουργήστε μια νέα **έκδοση του κλειδιού με υλικό κλειδιού** εισαγόμενο από τον επιτιθέμενο +- Δημιουργήστε μια νέα **version of the key with a key material** που εισάγεται από τον attacker ```bash gcloud kms import-jobs create [IMPORT_JOB] --location [LOCATION] --keyring [KEY_RING] --import-method [IMPORT_METHOD] --protection-level [PROTECTION_LEVEL] --target-key [KEY] ``` -- Ορίστε το ως **προεπιλεγμένη έκδοση** (για μελλοντικά δεδομένα που θα κρυπτογραφηθούν) -- **Επανακρυπτογραφήστε τα παλαιότερα δεδομένα** που είχαν κρυπτογραφηθεί με την προηγούμενη έκδοση, χρησιμοποιώντας τη νέα. +- Ορίστε το ως **default version** (για μελλοντικά δεδομένα που θα κρυπτογραφηθούν) +- **Επανακρυπτογραφήστε παλαιότερα δεδομένα** κρυπτογραφημένα με την προηγούμενη έκδοση χρησιμοποιώντας τη νέα. - **Διαγράψτε το KMS key** -- Τώρα μόνο ο attacker, που έχει το original key material, θα μπορεί να αποκρυπτογραφήσει τα κρυπτογραφημένα δεδομένα +- Τώρα μόνο ο attacker, που έχει το original key material, θα μπορούσε να αποκρυπτογραφήσει τα κρυπτογραφημένα δεδομένα -#### Εδώ είναι τα βήματα για την εισαγωγή μιας νέας έκδοσης και την απενεργοποίηση/διαγραφή των παλαιότερων δεδομένων: +#### Cloud Storage + CMEK permission model + +Όταν αντικείμενα στο Cloud Storage κρυπτογραφούνται με CMEK, οι κλήσεις decrypt/encrypt προς το KMS γίνονται από το project's **Cloud Storage service agent whose email is service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, όχι απευθείας από τον τελικό χρήστη που διαβάζει το αντικείμενο. + +This means that to read something encrypted by a CMEK: + +- The project's cloud storage service agent must have KMS permissions over the used KMS key (typically `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- The user only needs object read permissions (for example `storage.objects.get`). He doesn't need permissions over the KMS key. + +Αυτό σημαίνει ότι για να ελέγξετε την πρόσβαση στα κρυπτογραφημένα δεδομένα με το KMS key χρειάζεται να προσθέσετε/remove KMS permissions στον project's cloud storage service agent. + +Note that there is a project-level binding like `roles/cloudkms.cryptoKeyEncrypterDecrypter` for the Storage service agent will still allow decrypt with the keys in the same project. + + +#### Here are the steps to import a new version and disable/delete the older data:
-Εισαγωγή νέας key version και διαγραφή της παλιάς +Εισαγωγή νέας έκδοσης key και διαγραφή παλιάς έκδοσης ```bash # Encrypt something with the original key echo "This is a sample text to encrypt" > /tmp/my-plaintext-file.txt @@ -162,7 +176,7 @@ gcloud kms keys versions destroy \
-Κρυπτογράφηση δεδομένων με συμμετρικό κλειδί (Python) +Κρυπτογραφήστε δεδομένα με συμμετρικό κλειδί (Python) ```python from google.cloud import kms import base64 @@ -271,7 +285,7 @@ verified = verify_asymmetric_signature(project_id, location_id, key_ring_id, key print('Verified:', verified) ``` ### `cloudkms.cryptoKeyVersions.restore` -Η άδεια `cloudkms.cryptoKeyVersions.restore` επιτρέπει σε μια ταυτότητα να επαναφέρει μια έκδοση κλειδιού που προηγουμένως είχε προγραμματιστεί για καταστροφή ή είχε απενεργοποιηθεί στο Cloud KMS, επαναφέροντάς την σε ενεργή και χρησιμοποιήσιμη κατάσταση. +Το δικαίωμα `cloudkms.cryptoKeyVersions.restore` επιτρέπει σε μια ταυτότητα να επαναφέρει μια έκδοση κλειδιού που προηγουμένως είχε προγραμματιστεί για καταστροφή ή είχε απενεργοποιηθεί στο Cloud KMS, επαναφέροντάς την σε ενεργή και χρησιμοποιήσιμη κατάσταση. ```bash gcloud kms keys versions restore \ --key= \ diff --git a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md index 5246df17b..ed97a5c96 100644 --- a/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md +++ b/src/pentesting-cloud/gcp-security/gcp-services/gcp-kms-enum.md @@ -4,40 +4,53 @@ ## KMS -Η [**Υπηρεσία Διαχείρισης Κλειδιών Cloud**](https://cloud.google.com/kms/docs/) λειτουργεί ως ασφαλής αποθήκευση για **κρυπτογραφικά κλειδιά**, τα οποία είναι απαραίτητα για λειτουργίες όπως **η κρυπτογράφηση και η αποκρυπτογράφηση ευαίσθητων δεδομένων**. Αυτά τα κλειδιά οργανώνονται μέσα σε δαχτυλίδια κλειδιών, επιτρέποντας τη δομημένη διαχείριση. Επιπλέον, ο έλεγχος πρόσβασης μπορεί να ρυθμιστεί με ακρίβεια, είτε σε επίπεδο μεμονωμένου κλειδιού είτε για ολόκληρο το δαχτυλίδι κλειδιών, διασφαλίζοντας ότι οι άδειες είναι ακριβώς ευθυγραμμισμένες με τις απαιτήσεις ασφαλείας. +The [**Cloud Key Management Service**](https://cloud.google.com/kms/docs/) λειτουργεί ως ασφαλής αποθήκη για **cryptographic keys**, που είναι απαραίτητα για ενέργειες όπως **encrypting and decrypting sensitive data**. Τα κλειδιά οργανώνονται μέσα σε key rings, επιτρέποντας δομημένη διαχείριση. Επιπλέον, ο έλεγχος πρόσβασης μπορεί να ρυθμιστεί με λεπτομέρεια, είτε σε επίπεδο μεμονωμένου κλειδιού είτε για ολόκληρο το key ring, εξασφαλίζοντας ότι οι άδειες ευθυγραμμίζονται με τις απαιτήσεις ασφαλείας. -Τα δαχτυλίδια κλειδιών KMS δημιουργούνται **κατά προεπιλογή ως παγκόσμια**, που σημαίνει ότι τα κλειδιά μέσα σε αυτό το δαχτυλίδι είναι προσβάσιμα από οποιαδήποτε περιοχή. Ωστόσο, είναι δυνατή η δημιουργία συγκεκριμένων δαχτυλιδιών κλειδιών σε **συγκεκριμένες περιοχές**. +Τα KMS key rings δημιουργούνται εξ ορισμού ως global, που σημαίνει ότι τα κλειδιά μέσα σε αυτό το key ring είναι προσβάσιμα από οποιαδήποτε region. Ωστόσο, είναι δυνατόν να δημιουργηθούν συγκεκριμένα key rings σε συγκεκριμένες περιοχές. -### Επίπεδο Προστασίας Κλειδιών +### Key Protection Level -- **Κλειδιά λογισμικού**: Τα κλειδιά λογισμικού δημιουργούνται και διαχειρίζονται **εντελώς από το KMS σε λογισμικό**. Αυτά τα κλειδιά **δεν προστατεύονται από κανένα υλικό ασφαλείας (HSM)** και μπορούν να χρησιμοποιηθούν για **δοκιμές και αναπτυξιακούς σκοπούς**. Τα κλειδιά λογισμικού **δεν συνιστώνται για παραγωγή** επειδή παρέχουν χαμηλή ασφάλεια και είναι ευάλωτα σε επιθέσεις. -- **Κλειδιά που φιλοξενούνται στο Cloud**: Τα κλειδιά που φιλοξενούνται στο Cloud δημιουργούνται και διαχειρίζονται **από το KMS** στο cloud χρησιμοποιώντας μια εξαιρετικά διαθέσιμη και αξιόπιστη υποδομή. Αυτά τα κλειδιά **προστατεύονται από HSM**, αλλά τα HSM **δεν είναι αφιερωμένα σε συγκεκριμένο πελάτη**. Τα κλειδιά που φιλοξενούνται στο Cloud είναι κατάλληλα για τις περισσότερες περιπτώσεις χρήσης παραγωγής. -- **Εξωτερικά κλειδιά**: Τα εξωτερικά κλειδιά δημιουργούνται και διαχειρίζονται εκτός του KMS και εισάγονται στο KMS για χρήση σε κρυπτογραφικές λειτουργίες. Τα εξωτερικά κλειδιά **μπορούν να αποθηκευτούν σε ένα υλικό ασφαλείας (HSM) ή σε μια βιβλιοθήκη λογισμικού, ανάλογα με την προτίμηση του πελάτη**. +- **Software keys**: Τα software keys **δημιουργούνται και διαχειρίζονται από το KMS εξ ολοκλήρου σε software**. Αυτά τα κλειδιά **δεν προστατεύονται από κάποιο hardware security module (HSM)** και μπορούν να χρησιμοποιηθούν για **testing και development purposes**. Τα software keys **δεν συνιστώνται για παραγωγική χρήση** επειδή παρέχουν χαμηλό επίπεδο ασφάλειας και είναι ευάλωτα σε επιθέσεις. +- **Cloud-hosted keys**: Τα cloud-hosted keys **δημιουργούνται και διαχειρίζονται από το KMS** στο cloud χρησιμοποιώντας μια υψηλά διαθέσιμη και αξιόπιστη υποδομή. Αυτά τα κλειδιά **προστατεύονται από HSMs**, αλλά τα HSMs **δεν είναι αφιερωμένα σε συγκεκριμένο πελάτη**. Τα cloud-hosted keys είναι κατάλληλα για τις περισσότερες παραγωγικές χρήσεις. +- **External keys**: Τα external keys **δημιουργούνται και διαχειρίζονται εκτός του KMS**, και εισάγονται στο KMS για χρήση σε κρυπτογραφικές λειτουργίες. Τα external keys **μπορούν να αποθηκευτούν σε hardware security module (HSM) ή σε software library, ανάλογα με την προτίμηση του πελάτη**. -### Σκοποί Κλειδιών +### Key Purposes -- **Συμμετρική κρυπτογράφηση/αποκρυπτογράφηση**: Χρησιμοποιείται για **να κρυπτογραφεί και να αποκρυπτογραφεί δεδομένα χρησιμοποιώντας ένα μόνο κλειδί για και τις δύο λειτουργίες**. Τα συμμετρικά κλειδιά είναι γρήγορα και αποδοτικά για την κρυπτογράφηση και την αποκρυπτογράφηση μεγάλων όγκων δεδομένων. -- **Υποστηρίζεται**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) -- **Ασύμμετρη Υπογραφή**: Χρησιμοποιείται για ασφαλή επικοινωνία μεταξύ δύο μερών χωρίς να μοιράζονται το κλειδί. Τα ασύμμετρα κλειδιά έρχονται σε ζεύγη, αποτελούμενα από ένα **δημόσιο κλειδί και ένα ιδιωτικό κλειδί**. Το δημόσιο κλειδί μοιράζεται με άλλους, ενώ το ιδιωτικό κλειδί διατηρείται μυστικό. -- **Υποστηρίζεται:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **Ασύμμετρη Αποκρυπτογράφηση**: Χρησιμοποιείται για να επαληθεύσει την αυθεντικότητα ενός μηνύματος ή δεδομένων. Μια ψηφιακή υπογραφή δημιουργείται χρησιμοποιώντας ένα ιδιωτικό κλειδί και μπορεί να επαληθευτεί χρησιμοποιώντας το αντίστοιχο δημόσιο κλειδί. -- **Υποστηρίζεται:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) -- **Υπογραφή MAC**: Χρησιμοποιείται για να διασφαλίσει **την ακεραιότητα και την αυθεντικότητα των δεδομένων δημιουργώντας έναν κωδικό αυθεντικοποίησης μηνύματος (MAC) χρησιμοποιώντας ένα μυστικό κλειδί**. Το HMAC χρησιμοποιείται συνήθως για την αυθεντικοποίηση μηνυμάτων σε πρωτόκολλα δικτύου και λογισμικό εφαρμογών. -- **Υποστηρίζεται:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) +- **Symmetric encryption/decryption**: Χρησιμοποιείται για **την κρυπτογράφηση και αποκρυπτογράφηση δεδομένων χρησιμοποιώντας ένα ενιαίο κλειδί για τις δύο λειτουργίες**. Τα symmetric keys είναι γρήγορα και αποδοτικά για την κρυπτογράφηση και αποκρυπτογράφηση μεγάλου όγκου δεδομένων. +- **Supported**: [cryptoKeys.encrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/encrypt), [cryptoKeys.decrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys/decrypt) +- **Asymmetric Signing**: Χρησιμοποιείται για ασφαλή επικοινωνία μεταξύ δύο μερών χωρίς κοινοποίηση του κλειδιού. Τα asymmetric keys έρχονται σε ζεύγος, αποτελούμενα από ένα **public key και ένα private key**. Το public key κοινοποιείται σε άλλους, ενώ το private key κρατιέται μυστικό. +- **Supported:** [cryptoKeyVersions.asymmetricSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricSign), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **Asymmetric Decryption**: Χρησιμοποιείται για την επαλήθευση της αυθεντικότητας ενός μηνύματος ή δεδομένων. Μια ψηφιακή υπογραφή δημιουργείται χρησιμοποιώντας ένα private key και μπορεί να επαληθευτεί με το αντίστοιχο public key. +- **Supported:** [cryptoKeyVersions.asymmetricDecrypt](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/asymmetricDecrypt), [cryptoKeyVersions.getPublicKey](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/getPublicKey) +- **MAC Signing**: Χρησιμοποιείται για να εξασφαλίσει **την ακεραιότητα και την αυθεντικότητα των δεδομένων δημιουργώντας ένα message authentication code (MAC) χρησιμοποιώντας ένα secret key**. Το HMAC χρησιμοποιείται συνήθως για message authentication σε πρωτόκολλα δικτύου και εφαρμογές λογισμικού. +- **Supported:** [cryptoKeyVersions.macSign](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macSign), [cryptoKeyVersions.macVerify](https://cloud.google.com/kms/docs/reference/rest/v1/projects.locations.keyRings.cryptoKeys.cryptoKeyVersions/macVerify) -### Περίοδος Περιστροφής & Προγραμματισμένη για καταστροφή περίοδος +### Rotation Period & Programmed for destruction period -Κατά **προεπιλογή**, κάθε **90 ημέρες** αλλά μπορεί να **προσαρμοστεί εύκολα** και **εντελώς**. +Από **προεπιλογή**, κάθε **90 ημέρες**, αλλά μπορεί να **προσαρμοστεί εύκολα και πλήρως.** -Η περίοδος "Προγραμματισμένη για καταστροφή" είναι ο **χρόνος από τη στιγμή που ο χρήστης ζητά να διαγραφεί το κλειδί** μέχρι το κλειδί να **διαγραφεί**. Δεν μπορεί να αλλάξει μετά τη δημιουργία του κλειδιού (προεπιλογή 1 ημέρα). +Η περίοδος "Programmed for destruction" είναι ο **χρόνος από τη στιγμή που ο χρήστης ζητάει τη διαγραφή του κλειδιού** μέχρι το κλειδί να **διαγραφεί**. Δεν μπορεί να αλλάξει αφού το κλειδί δημιουργηθεί (προεπιλογή 1 ημέρα). -### Κύρια Έκδοση +### Primary Version -Κάθε κλειδί KMS μπορεί να έχει πολλές εκδόσεις, μία από αυτές πρέπει να είναι η **προεπιλεγμένη**, αυτή θα είναι η χρησιμοποιούμενη όταν **δεν καθορίζεται έκδοση κατά την αλληλεπίδραση με το κλειδί KMS**. +Κάθε KMS key μπορεί να έχει πολλές εκδόσεις, μία από αυτές πρέπει να είναι η **default**, η οποία θα χρησιμοποιείται όταν **δεν καθορίζεται έκδοση κατά την αλληλεπίδραση με το KMS key**. -### Αριθμητική +### CMEK permission model -Έχοντας **άδειες για να καταγράψετε τα κλειδιά**, έτσι μπορείτε να τα αποκτήσετε: +Όταν αντικείμενα στο Cloud Storage είναι κρυπτογραφημένα με CMEK, οι κλήσεις decrypt/encrypt στο KMS γίνονται από το project's **Cloud Storage service agent whose email is service-${BUCKET_PROJECT_NUMBER}@gs-project-accounts.iam.gserviceaccount.com)**, όχι απευθείας από τον τελικό χρήστη που διαβάζει το αντικείμενο. + +Αυτό σημαίνει ότι για να διαβαστεί κάτι κρυπτογραφημένο με CMEK: + +- Το project's cloud storage service agent πρέπει να έχει δικαιώματα KMS πάνω στο χρησιμοποιούμενο KMS key (συνήθως `roles/cloudkms.cryptoKeyEncrypterDecrypter`). +- Ο χρήστης χρειάζεται μόνο δικαιώματα ανάγνωσης αντικειμένου (για παράδειγμα `storage.objects.get`). Δεν χρειάζεται δικαιώματα πάνω στο KMS key. + +Αυτό σημαίνει ότι για να ελεγχθεί η πρόσβαση σε κρυπτογραφημένα δεδομένα με το KMS key, χρειάζεται να προστεθούν/αφαιρεθούν δικαιώματα KMS στο project's cloud storage service agent. + +Σημειώστε ότι μια project-level binding όπως `roles/cloudkms.cryptoKeyEncrypterDecrypter` για το Storage service agent θα επιτρέψει ακόμη την αποκρυπτογράφηση με τα keys στο ίδιο project. + +### Enumeration + +Εφόσον έχετε **permissions to list the keys**, έτσι μπορείτε να έχετε πρόσβαση σε αυτά: ```bash # List the global keyrings available gcloud kms keyrings list --location global @@ -61,13 +74,13 @@ gcloud kms decrypt --ciphertext-file=[INFILE] \ --keyring [KEYRING] \ --location global ``` -### Ανάβαση Δικαιωμάτων +### Privilege Escalation {{#ref}} ../gcp-privilege-escalation/gcp-kms-privesc.md {{#endref}} -### Μετά την Εκμετάλλευση +### Post Exploitation {{#ref}} ../gcp-post-exploitation/gcp-kms-post-exploitation.md