GCP - AppEngine Privesc
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
App Engine
Więcej informacji o App Engine znajdziesz:
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
To są wymagane uprawnienia do deploy an App using gcloud cli. Możliwe, że uprawnienia get i list można by było pominąć.
Przykłady kodu w Pythonie znajdziesz pod adresem https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
Domyślnie nazwa usługi App będzie default, i może istnieć tylko 1 instancja o tej samej nazwie.
Aby to zmienić i utworzyć drugą aplikację, w app.yaml zmień wartość klucza root na coś takiego jak service: my-second-app
Deploy App Engine application
```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ```Odczekaj co najmniej 10–15 minut; jeśli to nie zadziała, wywołaj deploy another of times i poczekaj kilka minut.
Note
Można wskazać Service Account do użycia, ale domyślnie używany jest 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
Aktualizacja równoważnych uprawnień
Możesz mieć wystarczające uprawnienia, aby zaktualizować AppEngine, ale nie utworzyć nowego. W takim przypadku oto jak możesz zaktualizować bieżący App Engine:
Zaktualizuj istniejącą aplikację App Engine
```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>
Jeśli **już przejąłeś AppEngine** i masz uprawnienie **`appengine.applications.update`** oraz **actAs** na koncie usługi, którego chcesz użyć, możesz zmodyfikować konto usługi używane przez AppEngine za pomocą:
<details>
<summary>Aktualizuj konto usługi App Engine</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
Dzięki tym uprawnieniom możliwe jest zalogowanie się przez ssh na instancjach App Engine typu flexible (nie standard). Niektóre uprawnienia list i get mogą nie być faktycznie potrzebne.
SSH do instancji App Engine
```bash gcloud app instances ssh --serviceappengine.applications.update, appengine.operations.get
Myślę, że to po prostu zmienia SA używane w tle przez google do konfiguracji aplikacji, więc nie sądzę, że można tego nadużyć, by ukraść service account.
Aktualizuj service account aplikacji
```bash gcloud app update --service-account=appengine.versions.getFileContents, appengine.versions.update
Nie jestem pewien, jak używać tych uprawnień ani czy są przydatne (uwaga: kiedy zmieniasz kod, tworzona jest nowa wersja, więc nie wiem, czy możesz po prostu zaktualizować kod lub rolę IAM istniejącej wersji, ale przypuszczam, że powinno to być możliwe — może przez zmianę kodu wewnątrz bucketu??).
Dostęp zapisu do bucketów
Jak wspomniano, wersje appengine generują pewne dane wewnątrz bucketu o nazwie w formacie: staging.<project-id>.appspot.com. Zauważ, że nie da się wcześniej przejąć tego bucketu, ponieważ użytkownicy GCP nie mają uprawnień do tworzenia bucketów używających domeny appspot.com.
Jednak mając dostęp do odczytu i zapisu w tym buckecie, można eskalować uprawnienia do SA przypisanego do wersji AppEngine przez monitorowanie bucketa i za każdym razem, gdy nastąpi zmiana, jak najszybciej zmodyfikować kod. W ten sposób kontener tworzony z tego kodu będzie execute the backdoored code.
For more information and a PoC check the relevant information from this page:
Dostęp zapisu do Artifact Registry
Chociaż App Engine tworzy obrazy dockerowe w Artifact Registry, przetestowano, że nawet jeśli zmodyfikujesz obraz w tej usłudze i usuniesz instancję App Engine (tak, że zostanie wdrożona nowa), to wykonywany kod się nie zmienia.\
Możliwe, że przeprowadzenie ataku typu Race Condition, podobnie jak w przypadku bucketów, mogłoby pozwolić na nadpisanie wykonywanego kodu, jednak nie zostało to przetestowane.
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud

