GCP <--> Workspace Pivoting

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Ερυθρού Συνεργείου HackTricks AWS)!

Άλλοι τρόποι υποστήριξης των HackTricks:

Από το GCP στο GWS

Βασικά στοιχεία εξουσιοδότησης σε επίπεδο τομέα

Η εξουσιοδότηση σε επίπεδο τομέα του Google Workspace επιτρέπει σε ένα αντικείμενο ταυτότητας, είτε μια εξωτερική εφαρμογή από την αγορά του Google Workspace είτε ένα εσωτερικό Λογαριασμό Υπηρεσίας του GCP, να έχει πρόσβαση σε δεδομένα σε όλο το Workspace εκ μέρους των χρηστών.

Αυτό σημαίνει βασικά ότι οι λογαριασμοί υπηρεσίας μέσα στα έργα GCP μιας οργάνωσης μπορεί να υποκαταστήσουν τους χρήστες του Workspace της ίδιας οργάνωσης (ή ακόμα και από μια διαφορετική).

Για περισσότερες πληροφορίες σχετικά με το πώς ακριβώς λειτουργεί αυτό, ελέγξτε:

pageGCP - Understanding Domain-Wide Delegation

Παραβίαση υπάρχουσας εξουσιοδότησης

Αν ένας επιτιθέμενος παραβίασε κάποια πρόσβαση στο GCP και γνωρίζει ένα έγκυρο email χρήστη του Workspace (προτιμητέον υπερδιαχειριστής), μπορεί να απαριθμήσει όλα τα έργα στα οποία έχει πρόσβαση, να απαριθμήσει όλους τους Λογαριασμούς Υπηρεσίας των έργων, να ελέγξει σε ποιους λογαριασμούς υπηρεσίας έχει πρόσβαση, και να επαναλάβει όλα αυτά τα βήματα με κάθε Λογαριασμό Υπηρεσίας που μπορεί να υποκαταστήσει. Με μια λίστα όλων των λογαριασμών υπηρεσίας στους οποίους έχει πρόσβαση και τη λίστα των email του Workspace, ο επιτιθέμενος μπορεί να προσπαθήσει να υποκαταστήσει τον χρήστη με κάθε λογαριασμό υπηρεσίας.

Σημειώστε ότι κατά τη διαμόρφωση της εξουσιοδότησης σε επίπεδο τομέα δεν απαιτείται χρήστης του Workspace, επομένως αρκεί να γνωρίζετε έναν έγκυρο χρήστη και αυτό είναι απαραίτητο για την υποκατάσταση. Ωστόσο, θα χρησιμοποιηθούν οι προνομιακές ενέργειες του χρήστη που υποκαθίσταται, οπότε αν είναι Υπερδιαχειριστής θα μπορείτε να έχετε πρόσβαση σε όλα. Αν δεν έχει καμία πρόσβαση, αυτό θα είναι άχρηστο.

Αυτό το απλό σενάριο θα δημιουργήσει ένα διακριτικό OAuth ως τον υποκαταστάτη χρήστη που μπορείτε στη συνέχεια να χρησιμοποιήσετε για να έχετε πρόσβαση σε άλλα APIs της Google με ή χωρίς το gcloud:

# Impersonate indicated user
python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-key-file>

# Impersonate indicated user and add additional scopes
python3 gen_delegation_token.py --user-email <user-email> --key-file <path-to-key-file> --scopes "https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.domain, https://mail.google.com/, https://www.googleapis.com/auth/drive, openid"

Αυτό είναι ένα εργαλείο που μπορεί να εκτελέσει την επίθεση ακολουθώντας αυτά τα βήματα:

  1. Απαριθμήστε τα Έργα GCP χρησιμοποιώντας το Resource Manager API.

  2. Επαναλάβετε σε κάθε πόρο έργου και απαριθμήστε τους πόρους Λογαριασμών Υπηρεσιών GCP στους οποίους ο αρχικός χρήστης IAM έχει πρόσβαση χρησιμοποιώντας το GetIAMPolicy.

  3. Επαναλάβετε σε κάθε ρόλο λογαριασμού υπηρεσιών και βρείτε ενσωματωμένους, βασικούς και προσαρμοσμένους ρόλους με άδεια serviceAccountKeys.create στον προορισμό του πόρου λογαριασμού υπηρεσιών. Να σημειωθεί ότι ο ρόλος Επεξεργαστή (Editor) κατά κανόνα διαθέτει αυτήν την άδεια.

  4. Δημιουργήστε ένα νέο ιδιωτικό κλειδί KEY_ALG_RSA_2048 για κάθε πόρο λογαριασμού υπηρεσιών που βρέθηκε με τη σχετική άδεια στην πολιτική IAM.

  5. Επαναλάβετε σε κάθε νέο λογαριασμό υπηρεσιών και δημιουργήστε ένα αντικείμενο JWT γι' αυτό που αποτελείται από τα διαπιστευτήρια του ιδιωτικού κλειδιού SA και ένα εύρος OAuth. Η διαδικασία δημιουργίας ενός νέου JWT αντικειμένου θα επαναλάβει όλους τους υπάρχοντες συνδυασμούς εύρων OAuth από τη λίστα oauth_scopes.txt, προκειμένου να βρει όλες τις δυνατότητες αντιπροσώπευσης. Η λίστα oauth_scopes.txt ενημερώνεται με όλα τα εύρη OAuth που έχουμε βρει ως σημαντικά για την κατάχρηση ταυτοτήτων Workspace.

  6. Η μέθοδος _make_authorization_grant_assertion αποκαλύπτει την ανάγκη να δηλωθεί ένας στόχος χρήστης Workspace, αναφερόμενος ως subject, για τη δημιουργία JWTs υπό DWD. Αν και αυτό μπορεί να φαίνεται ότι απαιτεί ένα συγκεκριμένο χρήστη, είναι σημαντικό να συνειδητοποιήσουμε ότι το DWD επηρεάζει κάθε ταυτότητα εντός ενός τομέα. Συνεπώς, η δημιουργία ενός JWT για οποιονδήποτε χρήστη τομέα επηρεάζει όλες τις ταυτότητες σε αυτόν τον τομέα, σύμφωνα με τον έλεγχο συνδυασμού μας. Απλά, ένας έγκυρος χρήστης Workspace είναι επαρκής για να προχωρήσει. Αυτός ο χρήστης μπορεί να οριστεί στο αρχείο config.yaml του DeleFriend. Αν ένας στόχος χρήστη Workspace δεν είναι ήδη γνωστός, το εργαλείο διευκολύνει την αυτόματη εντοπισμό έγκυρων χρηστών Workspace σάρωσης χρηστών τομέων με ρόλους σε έργα GCP. Είναι σημαντικό να σημειωθεί (ξανά) ότι τα JWT είναι ειδικά για τομέα και δεν δημιουργούνται για κάθε χρήστη· επομένως, η αυτόματη διαδικασία στοχεύει σε μια μοναδική ταυτότητα ανά τομέα.

  7. Απαριθμήστε και δημιουργήστε ένα νέο διακριτικό πρόσβασης (bearer access token) για κάθε JWT και επικυρώστε το διακριτικό έναντι του API tokeninfo.

Το Gitlab έχει δημιουργήσει αυτό το σενάριο Python που μπορεί να κάνει δύο πράγματα - να απαριθμήσει τον κατάλογο χρηστών και να δημιουργήσει έναν νέο διαχειριστικό λογαριασμό ενώ υποδεικνύει ένα json με διαπιστευτήρια SA και τον χρήστη προς μίμηση. Έτσι θα το χρησιμοποιούσες:

# Install requirements
pip install --upgrade --user oauth2client

# Validate access only
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com

# List the directory
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com \
--list

# Create a new admin account
./gcp_delegation.py --keyfile ./credentials.json \
--impersonate steve.admin@target-org.com \
--domain target-org.com \
--account pwned

Δημιουργία μιας νέας αντιπροσωπείας (Μόνιμη)

Είναι δυνατόν να ελέγξετε τις Παγκόσμιες Αντιπροσωπείες τομέα στο https://admin.google.com/u/1/ac/owl/domainwidedelegation.

Ένας επιτιθέμενος με τη δυνατότητα δημιουργίας λογαριασμών υπηρεσιών σε ένα έργο GCP και υπερδιαχειριστικά δικαιώματα στο GWS μπορεί να δημιουργήσει μια νέα αντιπροσωπεία επιτρέποντας στους λογαριασμούς υπηρεσιών να προσωποποιήσουν ορισμένους χρήστες του GWS:

  1. Δημιουργία Νέου Λογαριασμού Υπηρεσίας και Αντίστοιχου Ζεύγους Κλειδιών: Στο GCP, νέοι πόροι λογαριασμών υπηρεσιών μπορούν να παραχθούν είτε αλληλεπιδραστικά μέσω της κονσόλας είτε προγραμματιστικά χρησιμοποιώντας άμεσες κλήσεις API και εργαλεία CLI. Αυτό απαιτεί τον ρόλο iam.serviceAccountAdmin ή οποιονδήποτε προσαρμοσμένο ρόλο εξοπλισμένο με την άδεια iam.serviceAccounts.create. Μόλις δημιουργηθεί ο λογαριασμός υπηρεσίας, θα προχωρήσουμε στη δημιουργία ενός σχετικού ζεύγους κλειδιών (άδεια iam.serviceAccountKeys.create).

  2. Δημιουργίας νέας αντιπροσωπείας: Είναι σημαντικό να κατανοήσουμε ότι μόνο ο ρόλος Super Admin διαθέτει τη δυνατότητα να δημιουργήσει παγκόσμια Παγκόσμια Αντιπροσωπεία στο Google Workspace και η Παγκόσμια Αντιπροσωπεία δεν μπορεί να δημιουργηθεί προγραμματικά, Μπορεί μόνο να δημιουργηθεί και να προσαρμοστεί χειροκίνητα μέσω της κονσόλας του Google Workspace.

  • Η δημιουργία του κανόνα μπορεί να βρεθεί στη σελίδα Ελέγχοι API → Διαχείριση Παγκόσμιας Αντιπροσωπείας στην κονσόλα Διαχείρισης Google Workspace.

  1. Επισύναψη προνομίων εμβέλειας OAuth: Κατά τη διαμόρφωση μιας νέας αντιπροσωπείας, το Google απαιτεί μόνο 2 παραμέτρους, τον Αναγνωριστικό Πελάτη, που είναι το ID OAuth του Πόρου Λογαριασμού Υπηρεσίας του GCP και τις εμβέλειες OAuth που καθορίζουν ποιες κλήσεις API απαιτεί η αντιπροσωπεία.

  • Η πλήρης λίστα των εμβέλειών OAuth μπορεί να βρεθεί εδώ, αλλά εδώ υπάρχει μια πρόταση: https://www.googleapis.com/auth/userinfo.email, https://www.googleapis.com/auth/cloud-platform, https://www.googleapis.com/auth/admin.directory.group, https://www.googleapis.com/auth/admin.directory.user, https://www.googleapis.com/auth/admin.directory.domain, https://mail.google.com/, https://www.googleapis.com/auth/drive, openid

  1. Ενεργώντας εκ μέρους της στόχος ταυτότητας: Σε αυτό το σημείο, έχουμε ένα λειτουργικό αντιπροσωπευτικό αντικείμενο στο GWS. Τώρα, χρησιμοποιώντας το ιδιωτικό κλειδί του Λογαριασμού Υπηρεσίας του GCP, μπορούμε να πραγματοποιήσουμε κλήσεις API (στο εύρος που καθορίζεται στην παράμετρο εμβέλειας OAuth) για να το ενεργοποιήσουμε και να ενεργήσουμε εκ μέρους οποιασδήποτε ταυτότητας υπάρχει στο Google Workspace. Όπως μάθαμε, ο λογαριασμός υπηρεσίας θα δημιουργήσει διακριτικά πρόσβασης ανάλογα με τις ανάγκες του και σύμφωνα με την άδεια που έχει σε εφαρμογές REST API.

  • Ελέγξτε τη προηγούμενη ενότητα για μερικά εργαλεία για τη χρήση αυτής της αντιπροσωπείας.

Διασυνδεσμική αντιπροσωπεία Οργανισμών

Το ID OAuth του Λογαριασμού Υπηρεσίας είναι παγκόσμιο και μπορεί να χρησιμοποιηθεί για διασυνδεσμική αντιπροσωπεία. Δεν έχει εφαρμοστεί καμία περιοριστική μέτρηση για να αποτρέψει τη διασυνδεσμική αντιπροσωπεία. Απλά, οι λογαριασμοί υπηρεσιών από διαφορετικούς οργανισμούς GCP μπορούν να χρησιμοποιηθούν για τη διαμόρφωση παγκόσμιας αντιπροσωπείας σε άλλους οργανισμούς Workspace. Αυτό θα οδηγήσει στο χρειασμό μόνο της πρόσβασης Super Admin στο Workspace, και όχι πρόσβασης στον ίδιο λογαριασμό GCP, καθώς ο εχθρός μπορεί να δημιουργήσει Λογαριασμούς Υπηρεσιών και ιδιωτικά κλειδιά στον προσωπικά ελεγχόμενο λογαριασμό GCP του.

Δημιουργία Ενός Έργου για απαρίθμηση του Workspace

Από προεπιλογή οι χρήστες του Workspace έχουν την άδεια να δημιουργήσουν νέα έργα, και όταν δημιουργείται ένα νέο έργο ο δημιουργός αποκτά τον ρόλο Κάτοχος πάνω σε αυτό.

Συνεπώς, ένας χρήστης μπορεί να δημιουργήσει ένα έργο, ενεργοποιήσει τις APIs για την απαρίθμηση του Workspace στο νέο του έργο και να προσπαθήσει να το απαριθμήσει.

Για να μπορεί ένας χρήστης να απαριθμήσει το Workspace, χρειάζεται επαρκή δικαιώματα Workspace (όχι όλοι οι χρήστες θα μπορούν να απαριθμήσουν τον κατάλογο).

# Create project
gcloud projects create <uniq-projec-name> --name=proj-name
# Set project
gcloud config set project <uniq-projec-name>
# Enable svcs
gcloud services enable admin.googleapis.com
gcloud services enable cloudidentity.googleapis.com
# Get org ID
gcloud organizations list
# Get currents email user groups (at least you can check the groups and members of the groups you belong to)
gcloud identity groups memberships search-transitive-groups --member-email <email> --labels=cloudidentity.googleapis.com/groups.discussion_forum
gcloud identity groups memberships list --group-email=g<group-email>

# FROM HERE THE USER NEEDS TO HAVE ENOUGH WORKSPACE ACCESS
gcloud beta identity groups preview --customer <org-cust-id>

Ελέγξτε περισσότερη απαρίθμηση στο:

pageGCP - IAM, Principals & Org Policies Enum

Κατάχρηση του Gcloud

Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με τη ροή του gcloud για σύνδεση στο:

pageGCP - Non-svc Persistance

Όπως εξηγείται εκεί, το gcloud μπορεί να ζητήσει την εμβέλεια https://www.googleapis.com/auth/drive η οποία θα επιτρέψει σε έναν χρήστη να έχει πρόσβαση στον φάκελο του χρήστη. Ως επιτιθέμενος, αν έχετε διαρρήξει σωματικά τον υπολογιστή ενός χρήστη και ο χρήστης είναι ακόμα συνδεδεμένος με τον λογαριασμό του, μπορείτε να συνδεθείτε δημιουργώντας ένα τεκμήριο με πρόσβαση στο drive χρησιμοποιώντας:

gcloud auth login --enable-gdrive-access

Εάν ένας επιτιθέμενος αφομοιώσει τον υπολογιστή ενός χρήστη, μπορεί επίσης να τροποποιήσει το αρχείο google-cloud-sdk/lib/googlecloudsdk/core/config.py και να προσθέσει στο CLOUDSDK_SCOPES το scope 'https://www.googleapis.com/auth/drive':

Έτσι, την επόμενη φορά που ο χρήστης συνδεθεί, θα δημιουργήσει ένα token με πρόσβαση στο drive που ο επιτιθέμενος θα μπορούσε να καταχραστεί για πρόσβαση στο drive. Φυσικά, ο περιηγητής θα υποδείξει ότι το δημιουργημένο token θα έχει πρόσβαση στο drive, αλλά καθώς ο χρήστης θα καλέσει το gcloud auth login, πιθανόν δεν θα υποψιάζεται τίποτα.

Για να εμφανιστούν οι φάκελοι του drive: curl -H "Authorization: Bearer $(gcloud auth print-access-token)" "https://www.googleapis.com/drive/v3/files"

Από GWS σε GCP

Πρόσβαση σε προνομιούχους χρήστες GCP

Εάν ένας επιτιθέμενος έχει πλήρη πρόσβαση στο GWS, θα μπορεί να έχει πρόσβαση σε ομάδες με προνομιούχη πρόσβαση στο GCP ή ακόμη και σε χρήστες, επομένως η μετάβαση από το GWS στο GCP είναι συνήθως πιο "απλή" απλά επειδή οι χρήστες στο GWS έχουν υψηλά προνόμια στο GCP.

Ανάκληση Προνομίων Google Groups

Από προεπιλογή, οι χρήστες μπορούν ελεύθερα να εγγραφούν σε ομάδες Workspace του Οργανισμού και αυτές οι ομάδες ενδέχεται να έχουν ανατεθεί δικαιώματα GCP (ελέγξτε τις ομάδες σας στο https://groups.google.com/).

Εκμεταλλευόμενος την ανάκληση προνομίων google groups μπορείτε να αναβαθμίσετε σε μια ομάδα με κάποιο είδος προνομιούχης πρόσβασης στο GCP.

Αναφορές

Last updated