GCP - AppEngine Privesc
App Engine
Für weitere Informationen zu App Engine siehe:
pageGCP - App Engine Enumappengine.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
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 erforderlichen Berechtigungen, um eine App mit dem gcloud
-CLI bereitzustellen. Möglicherweise können die Berechtigungen get
und list
vermieden werden.
Sie finden Python-Codebeispiele 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 1 Instanz mit demselben Namen geben.
Um dies zu ändern und eine zweite App zu erstellen, ändern Sie in app.yaml
den Wert des Wurzelschlüssels auf etwas wie service: my-second-app
Geben Sie ihm mindestens 10-15 Minuten, wenn es nicht funktioniert, rufen Sie ein weiteres Mal bereitstellen auf und warten Sie einige Minuten.
Es ist möglich, den zu verwendenden Dienstkontos anzugeben, aber standardmäßig wird das Standard-SA von App Engine verwendet.
Die URL der Anwendung lautet etwas wie https://<proj-name>.oa.r.appspot.com/
oder https://<service_name>-dot-<proj-name>.oa.r.appspot.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
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 über SSH bei App Engine-Instanzen des Typs flexible (nicht Standard) anzumelden. Einige der Berechtigungen für list
und get
sind möglicherweise nicht wirklich erforderlich.
appengine.applications.update
, appengine.operations.get
appengine.applications.update
, appengine.operations.get
Ich denke, dies ändert nur den Hintergrunddienst, den Google zur Einrichtung der Anwendungen verwenden wird, daher glaube ich nicht, dass Sie dies missbrauchen können, um das Dienstkontos zu stehlen.
appengine.versions.getFileContents
, appengine.versions.update
appengine.versions.getFileContents
, appengine.versions.update
Es ist nicht klar, wie man diese Berechtigungen verwendet oder ob sie nützlich sind (beachten Sie, dass beim Ändern des Codes eine neue Version erstellt wird, daher weiß ich nicht, ob Sie einfach den Code oder die IAM-Rolle eines, aber ich denke, Sie sollten in der Lage sein, möglicherweise den Code innerhalb des Buckets zu ändern??).
Schreibzugriff auf die Buckets
Auch mit Schreibzugriff auf die Buckets, in denen sich der Quellcode befindet, war es NICHT möglich, beliebigen Code auszuführen, indem der Quellcode und die manifest.json
geändert wurden.
Vielleicht ist es möglich, sie zu ändern, damit die neue Version die manipulierten verwendet, wenn Sie den Bucket überwachen und den Zeitpunkt erkennen, an dem eine neue Version erstellt und der Quellcode und das Manifest hochgeladen werden??
Es scheint auch, dass Container-Layer im Bucket gespeichert sind, vielleicht diese ändern?
Last updated