GCP - AppEngine Privesc
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
App Engine
App Engine hakkında daha fazla bilgi için bakınız:
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
Bunlar gcloud cli kullanarak bir App dağıtmak için gerekli izinlerdir. Belki get ve list olanlar ihmal edilebilir.
Python kod örneklerini şu adreste bulabilirsiniz: https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
Varsayılan olarak, App servisinin adı default, ve aynı ada sahip yalnızca 1 örnek olabilir.
Bunu değiştirmek ve ikinci bir App oluşturmak için app.yaml içinde kök anahtarın değerini şu şekilde değiştirin: service: my-second-app
App Engine uygulamasını dağıt
```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ```En az 10–15 dakika verin; işe yaramazsa deploy another of times deyip birkaç dakika daha bekleyin.
Note
Kullanılacak Service Account’u belirtmek mümkün olsa da varsayılan olarak App Engine’in SA’sı kullanılır.
Uygulamanın URL’si şu şekilde olur: https://<proj-name>.oa.r.appspot.com/ veya https://<service_name>-dot-<proj-name>.oa.r.appspot.com
Eşdeğer izinleri güncelleme
Bir AppEngine’i güncellemek için yeterli izniniz olabilir, ancak yeni bir tane oluşturmak için olmayabilir. Bu durumda mevcut App Engine’i şöyle güncelleyebilirsiniz:
Mevcut App Engine uygulamasını güncelle
```bash # Find the code of the App Engine in the buckets gsutil lsDownload 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=
</details>
Eğer **zaten bir AppEngine'i ele geçirdiyseniz** ve kullanmak üzere **`appengine.applications.update`** iznine ve **actAs** yetkisine sahipseniz, AppEngine tarafından kullanılan hizmet hesabını şu şekilde değiştirebilirsiniz:
<details>
<summary>App Engine hizmet hesabını güncelle</summary>
```bash
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
Bu izinlerle, flexible (standart olmayan) türündeki App Engine instance’larına SSH ile giriş yapmak mümkün. Bazı list ve get izinleri gerçekten gerekli olmayabilir.
App Engine instance'ına SSH ile giriş
```bash gcloud app instances ssh --serviceappengine.applications.update, appengine.operations.get
Bence bu sadece google’ın uygulamaları kurmak için kullanacağı arka plan SA’yı değiştirir, bu yüzden bunu service account’u çalmak için istismar edebileceğinizi düşünmüyorum.
Uygulama service account'unu güncelle
```bash gcloud app update --service-account=appengine.versions.getFileContents, appengine.versions.update
Bu izinlerin nasıl kullanılacağını veya işe yarayıp yaramayacağını bilmiyorum (kod değiştirildiğinde yeni bir sürüm oluşturulduğunu unutmayın; bu yüzden sadece kodu veya bir sürümün IAM rolünü güncelleyip güncelleyemeyeceğinizi bilmiyorum, ama muhtemelen yapabilirsiniz — belki bucket içindeki kodu değiştirerek??).
Bucket’lar üzerinde yazma erişimi
Daha önce bahsedildiği gibi appengine sürümleri staging.<project-id>.appspot.com formatında isimlendirilmiş bir bucket içinde bazı veriler oluşturur. Bu bucket’ı önceden ele geçirmek mümkün değildir çünkü GCP kullanıcılarının appspot.com alan adını kullanarak bucket oluşturma yetkisi yoktur.
Ancak bu bucket üzerinde okuma & yazma erişiminiz varsa, bucket’ı izleyerek ve her değişiklik yapıldığında kodu mümkün olduğunca hızlı değiştirmek suretiyle AppEngine sürümüne bağlı SA’ya ayrıcalık yükseltmesi yapmak mümkün olabilir. Bu şekilde, bu koddan oluşturulan konteyner execute the backdoored code.
For more information and a PoC check the relevant information from this page:
Artifact Registry üzerinde yazma erişimi
App Engine, Artifact Registry içinde docker imajları oluşturmasına rağmen, yapılan testlerde bu servisteki imajı değiştirmiş olsanız bile ve App Engine instance’ını kaldırıp (yeni bir tane dağıtılsa bile) çalıştırılan kodun değişmediği görüldü.
Buckets ile olduğu gibi bir Race Condition attack gerçekleştirerek çalıştırılan kodu üzerine yazmak mümkün olabilir, ancak bu test edilmedi.
Tip
AWS Hacking’i öğrenin ve pratik yapın:
HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın:HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın:HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks'i Destekleyin
- Abonelik planlarını kontrol edin!
- Katılın 💬 Discord group veya telegram group veya Twitter’da bizi takip edin 🐦 @hacktricks_live.
- PR göndererek hacking tricks paylaşın: HackTricks ve HackTricks Cloud github repos.
HackTricks Cloud

