GCP - AppEngine Privesc

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 को तैनात करने के लिए होती हैं। शायद get और list को बचाया जा सकता है।

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

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

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

Give it at least 10-15min, if it doesn't work call deploy another of times and wait some minutes.

यह 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 को इस प्रकार अपडेट कर सकते हैं:

# 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 द्वारा उपयोग किए गए सेवा खाते को निम्नलिखित के साथ संशोधित कर सकते हैं:

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 instances में ssh के माध्यम से लॉगिन करना संभव है (मानक नहीं)। कुछ list और get अनुमतियाँ वास्तव में आवश्यक नहीं हो सकती हैं

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

appengine.applications.update, appengine.operations.get

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

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

appengine.versions.getFileContents, appengine.versions.update

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

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

जहां स्रोत कोड स्थित है उन बकेट्स पर लिखने की अनुमति के साथ भी स्रोत कोड और manifest.json को संशोधित करके मनमाना कोड निष्पादित करना संभव नहीं था। शायद यदि आप बकेट की निगरानी कर रहे हैं और उस क्षण का पता लगाते हैं जब एक नया संस्करण बनाया जाता है और स्रोत कोड और मैनिफेस्ट अपलोड किया जाता है, तो उन्हें बदलना संभव हो सकता है ताकि नया संस्करण बैकडोर वाले का उपयोग करे??

ऐसा भी लगता है कि कंटेनर लेयर्स बकेट में संग्रहीत हैं, शायद उन्हें बदलना??

HackTricks को समर्थन दें

Last updated