GCP - AppEngine Privesc

Naucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Naucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wspieraj HackTricks

App Engine

Więcej informacji o App Engine znajdziesz tutaj:

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ą potrzebne uprawnienia do wdrożenia aplikacji za pomocą gcloud cli. Może być możliwe uniknięcie uprawnień get i list.

Przykłady kodu w Pythonie znajdziesz na https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

Domyślnie nazwa usługi App będzie default, i może być tylko 1 instancja o tej samej nazwie. Aby to zmienić i utworzyć drugą aplikację, w app.yaml, zmień wartość klucza głównego na coś w stylu service: my-second-app

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

Daj co najmniej 10-15 minut, jeśli to nie zadziała, wywołaj deploy another of times i poczekaj kilka minut.

Możliwe jest wskazanie konta usługi do użycia, ale domyślnie używane jest domyślne konto SA App Engine.

URL aplikacji wygląda mniej więcej tak: https://<proj-name>.oa.r.appspot.com/ lub https://<service_name>-dot-<proj-name>.oa.r.appspot.com

Aktualizacja równoważnych uprawnień

Możesz mieć wystarczające uprawnienia do aktualizacji AppEngine, ale nie do utworzenia nowego. W takim przypadku, oto jak można zaktualizować bieżący App Engine:

# 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

Jeśli już skompromitowałeś AppEngine i masz uprawnienia appengine.applications.update oraz actAs nad kontem usługi, które chcesz użyć, możesz zmodyfikować konto usługi używane przez AppEngine za pomocą:

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

Z tymi uprawnieniami możliwe jest logowanie się przez ssh do instancji App Engine typu flexible (nie standard). Niektóre z uprawnień list i get mogą nie być naprawdę potrzebne.

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

appengine.applications.update, appengine.operations.get

Myślę, że to tylko zmienia domyślne SA, którego Google użyje do skonfigurowania aplikacji, więc nie sądzę, aby można było to wykorzystać do kradzieży konta serwisowego.

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

appengine.versions.getFileContents, appengine.versions.update

Nie jestem pewien, jak używać tych uprawnień ani czy są one przydatne (zauważ, że gdy zmieniasz kod, tworzona jest nowa wersja, więc nie wiem, czy można po prostu zaktualizować kod lub rolę IAM jednej z nich, ale przypuszczam, że powinno być to możliwe, może zmieniając kod wewnątrz bucketu??).

Dostęp do zapisu w bucketach

Nawet z dostępem do zapisu w bucketach, gdzie znajduje się kod źródłowy, NIE było możliwe wykonanie dowolnego kodu poprzez modyfikację kodu źródłowego i manifest.json. Może jeśli monitorujesz bucket i wykryjesz moment, w którym tworzona jest nowa wersja, a kod źródłowy i manifest są przesyłane, możliwe jest ich zmiana, aby nowa wersja używała tych z backdoorem??

Wygląda również na to, że warstwy kontenerów są przechowywane w bucketach, może zmieniając je?

Ucz się i ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Wspieraj HackTricks

Last updated