GCP - AppEngine 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

App Engine

Για περισσότερες πληροφορίες σχετικά με το App Engine, δείτε:

GCP - App Engine Enum

appengine.applications.get, appengine.instances.get, appengine.instances.list, appengine.operations.get, appengine.operations.list, appengine.services.get, appengine.services.list, appengine.versions.create, appengine.versions.get, appengine.versions.list, cloudbuild.builds.get,iam.serviceAccounts.actAs, resourcemanager.projects.get, storage.objects.create, storage.objects.list

Αυτά είναι τα απαιτούμενα δικαιώματα για να αναπτύξετε μια εφαρμογή χρησιμοποιώντας το gcloud cli. Ίσως τα get και list να μπορούν να αποφευχθούν.

Μπορείτε να βρείτε παραδείγματα κώδικα python στο https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

Εξ ορισμού, το όνομα της υπηρεσίας App θα είναι default, και μπορεί να υπάρχει μόνο 1 instance με το ίδιο όνομα.
Για να το αλλάξετε και να δημιουργήσετε μια δεύτερη εφαρμογή, στο app.yaml, αλλάξτε την τιμή του root key σε κάτι σαν service: my-second-app

Ανάπτυξη εφαρμογής App Engine ```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ```

Δώστε του τουλάχιστον 10-15min, αν δεν λειτουργήσει κάντε κλήση deploy another of times και περιμένετε λίγα λεπτά.

Note

Είναι δυνατό να υποδείξετε ποιο Service Account θα χρησιμοποιηθεί αλλά εξ ορισμού χρησιμοποιείται το App Engine default SA.

Η διεύθυνση URL της εφαρμογής είναι κάτι σαν https://<proj-name>.oa.r.appspot.com/ ή https://<service_name>-dot-<proj-name>.oa.r.appspot.com

Ενημέρωση αντίστοιχων δικαιωμάτων

Μπορεί να έχετε επαρκή δικαιώματα για να ενημερώσετε ένα AppEngine αλλά όχι για να δημιουργήσετε νέο. Σε αυτήν την περίπτωση, έτσι μπορείτε να ενημερώσετε το τρέχον App Engine:

Ενημέρωση υπάρχουσας εφαρμογής App Engine ```bash # Find the code of the App Engine in the buckets gsutil ls

Download code

mkdir /tmp/appengine2 cd /tmp/appengine2

In this case it was found in this custom bucket but you could also use the

buckets generated when the App Engine is created

gsutil cp gs://appengine-lab-1-gcp-labs-4t04m0i6-3a97003354979ef6/labs_appengine_1_premissions_privesc.zip . unzip labs_appengine_1_premissions_privesc.zip

Now modify the code..

If you don’t have an app.yaml, create one like:

cat >> app.yaml <<EOF runtime: python312

entrypoint: gunicorn -b :$PORT main:app

env_variables: A_VARIABLE: “value” EOF

Deploy the changes

gcloud app deploy

Update the SA if you need it (and if you have actas permissions)

gcloud app update –service-account=@$PROJECT_ID.iam.gserviceaccount.com

</details>

Αν έχετε **ήδη παραβιάσει ένα AppEngine** και έχετε την άδεια **`appengine.applications.update`** και **actAs** πάνω στον service account που θα χρησιμοποιήσετε, μπορείτε να τροποποιήσετε τον service account που χρησιμοποιεί το AppEngine με:

<details>
<summary>Ενημέρωση AppEngine service account</summary>
```bash
gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com

appengine.instances.enableDebug, appengine.instances.get, appengine.instances.list, appengine.operations.get, appengine.services.get, appengine.services.list, appengine.versions.get, appengine.versions.list, compute.projects.get

Με αυτά τα δικαιώματα, είναι δυνατό να συνδεθείτε μέσω ssh σε instances του App Engine τύπου flexible (όχι standard). Κάποια από τα list και get δικαιώματα ενδέχεται να μην είναι πραγματικά απαραίτητα.

SSH into App Engine instance ```bash gcloud app instances ssh --service --version ```

appengine.applications.update, appengine.operations.get

Νομίζω ότι αυτό απλώς αλλάζει το background SA που θα χρησιμοποιήσει η google για να ρυθμίσει τις εφαρμογές, οπότε δεν νομίζω ότι μπορείς να το καταχραστείς για να κλέψεις το service account.

Update application service account ```bash gcloud app update --service-account= ```

appengine.versions.getFileContents, appengine.versions.update

Δεν είμαι σίγουρος πώς να χρησιμοποιήσω αυτά τα permissions ή αν είναι χρήσιμα (σημειώστε ότι όταν αλλάζετε τον code δημιουργείται μια νέα έκδοση, οπότε δεν ξέρω αν μπορείτε απλά να ενημερώσετε τον code ή τον IAM role μιας έκδοσης, αλλά υποθέτω ότι θα πρέπει να μπορείτε, ίσως αλλάζοντας τον code μέσα στο bucket).

Write Access over the buckets

Όπως αναφέρθηκε οι appengine versions δημιουργούν κάποια δεδομένα μέσα σε ένα bucket με όνομα στη μορφή: staging.<project-id>.appspot.com. Σημειώστε ότι δεν είναι δυνατό να αναληφθεί προ-emptively αυτό το bucket επειδή οι χρήστες GCP δεν έχουν εξουσιοδότηση να δημιουργούν buckets χρησιμοποιώντας το domain appspot.com.

Ωστόσο, με read & write access σε αυτό το bucket, είναι δυνατό να αναβαθμίσετε προνόμια στο SA που είναι συνδεδεμένο με την AppEngine version παρακολουθώντας το bucket και κάθε φορά που γίνεται κάποια αλλαγή, να τροποποιείτε όσο το δυνατόν πιο γρήγορα τον code. Έτσι, το container που δημιουργείται από αυτόν τον code θα execute the backdoored code.

For more information and a PoC check the relevant information from this page:

GCP - Storage Privesc

Write Access over the Artifact Registry

Παρόλο που το App Engine δημιουργεί docker images μέσα στο Artifact Registry. Δοκιμάστηκε ότι even if you modify the image inside this service και καταργήσετε το App Engine instance (οπότε αναπτύσσεται ένα καινούργιο) ο code executed doesn’t change.
Μπορεί να είναι πιθανό ότι εκτελώντας μια Race Condition attack όπως με τα buckets μπορεί να είναι δυνατό να αντικαταστήσετε τον εκτελούμενο code, αλλά αυτό δεν δοκιμάστηκε.

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