GCP - AppEngine Privesc

Tip

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

Unterstützen Sie HackTricks

App Engine

Für mehr 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

Das sind die benötigten Berechtigungen, um eine App mit dem gcloud CLI bereitzustellen. Möglicherweise können die get- und list-Berechtigungen entfallen.

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

Standardmäßig ist der Name des App-Services default, und es kann nur 1 Instanz mit demselben Namen geben.
Um ihn zu ändern und eine zweite App zu erstellen, ändern Sie in app.yaml den Wert des Root-Schlüssels zu etwas wie service: my-second-app

App Engine-Anwendung bereitstellen ```bash 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.

Note

Es ist möglich, das zu verwendende Service Account anzugeben, aber standardmäßig wird das App Engine default 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

Entsprechende Berechtigungen aktualisieren

Möglicherweise hast du genügend Berechtigungen, um eine AppEngine zu aktualisieren, aber nicht, um eine neue zu erstellen. In diesem Fall kannst du das aktuelle App Engine wie folgt aktualisieren:

Bestehende App Engine-Anwendung aktualisieren ```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>

Wenn Sie bereits eine AppEngine kompromittiert haben und die Berechtigung **`appengine.applications.update`** sowie **actAs** für das zu verwendende Servicekonto besitzen, können Sie das von AppEngine verwendete Servicekonto wie folgt ändern:

<details>
<summary>App Engine-Servicekonto aktualisieren</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

Mit diesen Berechtigungen ist es möglich, sich per ssh in App Engine instances einzuloggen vom Typ flexible (nicht standard). Einige der list und get Berechtigungen könnten nicht wirklich benötigt werden.

SSH into App Engine instance ```bash gcloud app instances ssh --service --version ```

appengine.applications.update, appengine.operations.get

Ich denke, das ändert nur das Hintergrund-SA, das google zum Einrichten der Anwendungen verwenden wird; daher glaube ich nicht, dass man das missbrauchen kann, um das Service Account zu stehlen.

Service Account der Anwendung aktualisieren ```bash gcloud app update --service-account= ```

appengine.versions.getFileContents, appengine.versions.update

Ich bin mir nicht sicher, wie man diese Berechtigungen verwendet oder ob sie nützlich sind (beachte, dass beim Ändern des Codes eine neue Version erstellt wird, daher weiß ich nicht, ob man einfach den Code oder die IAM-Rolle einer Version aktualisieren kann, aber ich nehme an, dass das möglich sein sollte — vielleicht durch Ändern des Codes im Bucket??).

Write Access over the buckets

Wie erwähnt erzeugen die appengine versions einige Daten in einem Bucket mit dem Format: staging.<project-id>.appspot.com. Beachte, dass es nicht möglich ist, diesen Bucket im Voraus zu übernehmen, da GCP-Benutzer nicht berechtigt sind, Buckets mit dem Domainnamen appspot.com zu erstellen.

Mit Lese- und Schreibzugriff auf diesen Bucket ist es jedoch möglich, Rechte auf das an die AppEngine-Version angehängte SA zu eskalieren, indem man den Bucket überwacht und bei jeder Änderung den Code so schnell wie möglich anpasst. Auf diese Weise wird der Container, der aus diesem Code erstellt wird, execute the backdoored code.

Für mehr Informationen und einen PoC siehe die relevanten Informationen auf dieser Seite:

GCP - Storage Privesc

Write Access over the Artifact Registry

Obwohl App Engine docker images in der Artifact Registry erstellt, wurde getestet, dass selbst wenn du das Image in diesem Service veränderst und die App Engine-Instanz entfernst (wodurch eine neue bereitgestellt wird), sich der ausgeführte Code nicht ändert.
Es könnte möglich sein, dass durch eine Race Condition attack wie bei den Buckets der ausgeführte Code überschrieben werden kann, aber das wurde nicht getestet.

Tip

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

Unterstützen Sie HackTricks