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
- 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.
App Engine
Za više informacija o App Engine pogledajte:
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:
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
- 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

