GCP - AppEngine Privesc

Support HackTricks

App Engine

Aby uzyskać więcej informacji o App Engine, sprawdź:

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 get i list można by uniknąć.

Możesz znaleźć przykłady kodu w Pythonie na https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

Domyślnie nazwa usługi aplikacji będzie default, a tylko jedna instancja może mieć tę samą nazwę. Aby to zmienić i utworzyć drugą aplikację, w app.yaml, zmień wartość klucza głównego na coś takiego jak service: my-second-app

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

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

Można wskazać konto usługi do użycia, ale domyślnie używane jest domyślne 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

Zaktualizuj równoważne uprawnienia

Możesz mieć wystarczające uprawnienia, aby zaktualizować AppEngine, ale nie aby utworzyć nowy. W takim przypadku oto jak możesz 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, 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

Dzięki tym uprawnieniom możliwe jest logowanie się przez ssh w instancjach App Engine typu flexible (nie standardowym). 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 po prostu zmienia tło SA, które Google użyje do skonfigurowania aplikacji, więc nie sądzę, że można to wykorzystać do kradzieży konta usługi.

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żesz po prostu zaktualizować kod lub rolę IAM jednej z nich, ale przypuszczam, że powinieneś być w stanie to zrobić, może zmieniając kod wewnątrz bucketu??).

Dostęp do zapisu w bucketach

Jak wspomniano, wersje appengine generują pewne dane wewnątrz bucketu w formacie nazwy: staging.<project-id>.appspot.com. Zauważ, że nie jest możliwe wcześniejsze przejęcie tego bucketu, ponieważ użytkownicy GCP nie są uprawnieni do generowania bucketów przy użyciu nazwy domeny appspot.com.

Jednakże, mając dostęp do odczytu i zapisu w tym bucketie, możliwe jest eskalowanie uprawnień do SA przypisanego do wersji AppEngine poprzez monitorowanie bucketu i w każdej chwili, gdy dokonana zostanie zmiana, jak najszybciej modyfikowanie kodu. W ten sposób kontener, który zostanie utworzony z tego kodu, wykona zainfekowany kod.

Aby uzyskać więcej informacji i PoC, sprawdź odpowiednie informacje z tej strony:

GCP - Storage Privesc

Dostęp do zapisu w Artifact Registry

Chociaż App Engine tworzy obrazy dockerowe wewnątrz Artifact Registry. Przetestowano, że nawet jeśli zmodyfikujesz obraz wewnątrz tej usługi i usuniesz instancję App Engine (tak aby wdrożona została nowa), wykonywany kod się nie zmienia. Może być możliwe, że przeprowadzenie ataku Race Condition, jak w przypadku bucketów, może umożliwić nadpisanie wykonywanego kodu, ale to nie zostało przetestowane.

Wsparcie dla HackTricks

Last updated