GCP - AppEngine Privesc

Reading time: 6 minutes

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

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 का उपयोग करके एक App को deploy करने के लिए आवश्यक अनुमतियाँ हैं। शायद get और list वाली अनुमतियाँ टाल दी जा सकती हैं।

आप https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine में python कोड उदाहरण पा सकते हैं।

डिफ़ॉल्ट रूप से, App सेवा का नाम default होगा, और एक ही नाम के साथ केवल 1 उदाहरण हो सकता है।
इसे बदलने और एक दूसरा App बनाने के लिए, app.yaml में, रूट कुंजी के मान को कुछ इस तरह बदलें service: my-second-app

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

यह सेवा खाता निर्दिष्ट करना संभव है लेकिन डिफ़ॉल्ट रूप से, App Engine का डिफ़ॉल्ट SA उपयोग किया जाता है।

ऐप्लिकेशन का URL कुछ इस तरह है https://<proj-name>.oa.r.appspot.com/ या https://<service_name>-dot-<proj-name>.oa.r.appspot.com

समकक्ष अनुमतियों को अपडेट करें

आपके पास एक AppEngine को अपडेट करने के लिए पर्याप्त अनुमतियाँ हो सकती हैं लेकिन एक नया बनाने के लिए नहीं। इस मामले में, आप वर्तमान 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=<sa>@$PROJECT_ID.iam.gserviceaccount.com

यदि आपने पहले ही एक AppEngine को समझौता कर लिया है और आपके पास अनुमति appengine.applications.update और actAs है सेवा खाते का उपयोग करने के लिए, तो आप AppEngine द्वारा उपयोग किए जाने वाले सेवा खाते को संशोधित कर सकते हैं:

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

इन अनुमतियों के साथ, App Engine के फ्लेक्सिबल प्रकार के इंस्टेंस में ssh के माध्यम से लॉगिन करना संभव है (मानक नहीं)। कुछ list और get अनुमतियाँ वास्तव में आवश्यक नहीं हो सकती हैं

bash
gcloud app instances ssh --service <app-name> --version <version-id> <ID>

appengine.applications.update, appengine.operations.get

मुझे लगता है कि यह केवल उस बैकग्राउंड SA को बदलता है जिसे गूगल एप्लिकेशनों को सेटअप करने के लिए उपयोग करेगा, इसलिए मुझे नहीं लगता कि आप इसका दुरुपयोग करके सेवा खाते को चुरा सकते हैं।

bash
gcloud app update --service-account=<sa_email>

appengine.versions.getFileContents, appengine.versions.update

इन अनुमतियों का उपयोग कैसे करें या क्या ये उपयोगी हैं, इस पर मुझे यकीन नहीं है (ध्यान दें कि जब आप कोड बदलते हैं तो एक नया संस्करण बनाया जाता है, इसलिए मुझे नहीं पता कि क्या आप केवल कोड या एक का IAM भूमिका अपडेट कर सकते हैं, लेकिन मुझे लगता है कि आप ऐसा कर सकते हैं, शायद बकेट के अंदर कोड बदलकर??)।

बकेट पर लिखने की अनुमति

जैसा कि उल्लेख किया गया है, appengine संस्करण बकेट के अंदर कुछ डेटा उत्पन्न करते हैं जिसका प्रारूप नाम है: staging.<project-id>.appspot.com। ध्यान दें कि इस बकेट को पूर्व-टेकओवर करना संभव नहीं है क्योंकि GCP उपयोगकर्ताओं को appspot.com डोमेन नाम का उपयोग करके बकेट बनाने के लिए अधिकृत नहीं किया गया है।

हालांकि, इस बकेट पर पढ़ने और लिखने की अनुमति के साथ, यह संभव है कि AppEngine संस्करण से जुड़े SA के लिए विशेषाधिकार बढ़ाने के लिए बकेट की निगरानी की जाए और जब भी कोई परिवर्तन किया जाए, कोड को यथाशीघ्र संशोधित किया जाए। इस तरह, इस कोड से बनाए गए कंटेनर बैकडोर कोड को निष्पादित करेगा

अधिक जानकारी के लिए और एक PoC के लिए इस पृष्ठ से संबंधित जानकारी देखें:

GCP - Storage Privesc

आर्टिफैक्ट रजिस्ट्री पर लिखने की अनुमति

हालांकि App Engine आर्टिफैक्ट रजिस्ट्री के अंदर डॉकर इमेज बनाता है। यह परीक्षण किया गया था कि भले ही आप इस सेवा के अंदर इमेज को संशोधित करें और App Engine उदाहरण को हटा दें (ताकि एक नया तैनात किया जाए) निष्पादित कोड नहीं बदलता
यह संभव हो सकता है कि बकेट के साथ रेस कंडीशन हमले को करने पर निष्पादित कोड को ओवरराइट करना संभव हो, लेकिन इसका परीक्षण नहीं किया गया था।

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 का समर्थन करें