GCP - AppEngine Privesc

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

App Engine

For more information about App Engine check:

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

ये वे आवश्यक permissions हैं जो gcloud cli का उपयोग करके एक App deploy करने के लिए चाहिए। हो सकता है कि get और list वाले permissions को छोड़ा जा सके।

You can find python code examples in https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

By default, the name of the App service is going to be default, and there can be only 1 instance with the same name.
To change it and create a second App, in app.yaml, change the value of the root key to something like service: my-second-app

Deploy App Engine application ```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ```

इसे कम से कम 10–15 मिनट दें; अगर यह काम नहीं करता है तो deploy another of times चलाएँ और कुछ मिनट प्रतीक्षा करें।

Note

यह उपयोग करने के लिए Service Account निर्दिष्ट करना संभव है लेकिन डिफ़ॉल्ट रूप से App Engine का डिफ़ॉल्ट 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 compromised कर लिया है और आपके पास permission **`appengine.applications.update`** है और उपयोग करने के लिए service account पर **actAs** का अधिकार है, तो आप AppEngine द्वारा उपयोग किए जा रहे service account को निम्नलिखित के साथ बदल सकते हैं:

<details>
<summary>App Engine 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

इन permissions के साथ, यह संभव है कि आप App Engine instances के प्रकार flexible (not standard) में ssh के माध्यम से लॉगिन कर सकें। कुछ list और get permissions वास्तव में आवश्यक नहीं हो सकते

App Engine instance में SSH करना ```bash gcloud app instances ssh --service --version ```

appengine.applications.update, appengine.operations.get

मुझे लगता है कि यह बस उस background SA को बदलता है जिसे google applications को सेटअप करने के लिए उपयोग करेगा, इसलिए मुझे नहीं लगता कि आप इसे abuse करके service account चुरा सकते हैं।

एप्लिकेशन का service account अपडेट करें ```bash gcloud app update --service-account= ```

appengine.versions.getFileContents, appengine.versions.update

मुझे यकीन नहीं है कि इन permissions का उपयोग कैसे करना है या ये उपयोगी हैं या नहीं (नोट: जब आप कोड बदलते हैं तो एक नया version बनता है, इसलिए मुझे नहीं पता कि क्या आप सिर्फ कोड या किसी की IAM role को अपडेट कर सकते हैं, पर मेरा अनुमान है कि संभव होना चाहिए — शायद bucket के अंदर कोड बदलकर??)।

Write Access over the buckets

जैसा कि पहले कहा गया, appengine versions इस फॉर्मैट वाले bucket के अंदर कुछ डेटा जनरेट करते हैं: staging.<project-id>.appspot.com. ध्यान दें कि इस bucket को पहले से takeover करना संभव नहीं है क्योंकि GCP users को appspot.com डोमेन नाम का उपयोग करके buckets बनाने की अनुमति नहीं है।

हालाँकि, इस bucket पर read & write access होने पर, bucket को मॉनिटर करके और जब भी कोई परिवर्तन होता है तुरंत कोड को बदलकर, AppEngine version से जुड़े SA के privileges escalate करना संभव है। इस तरह, इस कोड से बनना वाला container बैकडोर किया गया कोड execute करेगा

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

GCP - Storage Privesc

Write Access over the Artifact Registry

हालाँकि App Engine Artifact Registry के अंदर docker images बनाता है। परीक्षण में पाया गया कि भले ही आप इस सर्विस के अंदर image को modify करें और App Engine instance को हटाया जाए (तो एक नया deploy होता है), तब भी execute होने वाला कोड बदलता नहीं है.
यह संभव हो सकता है कि buckets के साथ की तरह एक Race Condition attack करके execute होने वाले कोड को overwrite करना संभव हो, लेकिन इसका परीक्षण नहीं किया गया।

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें