GCP - AppEngine Privesc

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstütze HackTricks

App Engine

Für weitere Informationen über App Engine siehe:

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

Dies sind die benötigten Berechtigungen, um eine App mit gcloud CLI zu deployen. Vielleicht könnten die get und list Berechtigungen vermieden werden.

Python-Codebeispiele findest du unter https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

Standardmäßig wird der Name des App-Dienstes default sein, und es kann nur eine Instanz mit demselben Namen geben. Um dies zu ändern und eine zweite App zu erstellen, ändere im app.yaml den Wert des Root-Schlüssels zu etwas wie service: my-second-app

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

Gib ihm mindestens 10-15 Minuten, wenn es nicht funktioniert, rufe deploy another of times auf und warte einige Minuten.

Es ist möglich, das zu verwendende Service Account anzugeben, aber standardmäßig wird das App Engine Standard-SA verwendet.

Die URL der Anwendung ist etwa https://<proj-name>.oa.r.appspot.com/ oder https://<service_name>-dot-<proj-name>.oa.r.appspot.com

Äquivalente Berechtigungen aktualisieren

Du könntest genügend Berechtigungen haben, um eine AppEngine zu aktualisieren, aber nicht, um eine neue zu erstellen. In diesem Fall kannst du die aktuelle App Engine wie folgt aktualisieren:

# 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

Wenn du bereits eine AppEngine kompromittiert hast und die Berechtigung appengine.applications.update sowie actAs über das zu verwendende Servicekonto hast, könntest du das von AppEngine verwendete Servicekonto ändern mit:

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

Mit diesen Berechtigungen ist es möglich, sich per SSH in App Engine-Instanzen des Typs flexible (nicht standard) einzuloggen. Einige der list- und get-Berechtigungen könnten nicht wirklich benötigt werden.

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

appengine.applications.update, appengine.operations.get

Ich denke, dies ändert nur den Hintergrund-SA, den Google zur Einrichtung der Anwendungen verwendet, daher glaube ich nicht, dass man dies missbrauchen kann, um das Servicekonto zu stehlen.

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

appengine.versions.getFileContents, appengine.versions.update

Nicht sicher, wie man diese Berechtigungen verwendet oder ob sie nützlich sind (beachten Sie, dass bei einer Codeänderung eine neue Version erstellt wird, daher weiß ich nicht, ob Sie den Code oder die IAM-Rolle einer Version einfach aktualisieren können, aber ich denke, Sie sollten in der Lage sein, vielleicht den Code im Bucket zu ändern??).

Schreibzugriff auf die Buckets

Selbst mit Schreibzugriff auf die Buckets, in denen sich der Quellcode befindet, WAR es NICHT möglich, beliebigen Code durch Ändern des Quellcodes und der manifest.json auszuführen. Vielleicht, wenn Sie den Bucket überwachen und den Moment erkennen, in dem eine neue Version erstellt und der Quellcode und das Manifest hochgeladen werden, könnte es möglich sein, diese zu ändern, sodass die neue Version die mit einer Hintertür versehenen verwendet??

Es sieht auch so aus, als ob Container-Schichten im Bucket gespeichert werden, vielleicht diese ändern?

Lernen & üben AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Unterstütze HackTricks

Last updated