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

App Engine

Więcej informacji o App Engine znajdziesz:

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

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 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=@$PROJECT_ID.iam.gserviceaccount.com

</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 --service --version ```

appengine.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:

GCP - Storage Privesc

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