GCP - AppEngine Privesc

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

App Engine

Pour plus d’informations sur App Engine, consultez :

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

Ce sont les permissions nécessaires pour déployer une App en utilisant la CLI gcloud. Peut-être que les permissions get et list pourraient être évitées.

Vous pouvez trouver des exemples de code python dans https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine

Par défaut, le nom du service App sera default, et il ne peut y avoir qu’une seule instance portant ce nom.
Pour le changer et créer une seconde App, dans app.yaml, changez la valeur de la clé racine en quelque chose comme service: my-second-app

Déployer une application App Engine ```bash cd python-docs-samples/appengine/flexible/hello_world gcloud app deploy #Upload and start application inside the folder ```

Attendez au moins 10–15 minutes. Si cela ne fonctionne pas, relancez un déploiement plusieurs fois et attendez quelques minutes.

Note

Il est possible d’indiquer le Service Account à utiliser mais par défaut, le SA par défaut d’App Engine est utilisé.

L’URL de l’application ressemble à https://<proj-name>.oa.r.appspot.com/ ou https://<service_name>-dot-<proj-name>.oa.r.appspot.com

Mettre à jour les permissions équivalentes

Vous pourriez avoir suffisamment de permissions pour mettre à jour un App Engine mais pas pour en créer un nouveau. Dans ce cas, voici comment vous pourriez mettre à jour l’App Engine actuel :

Mettre à jour l'application App Engine existante ```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>

Si vous avez déjà compromis une application AppEngine et que vous disposez de l'autorisation **`appengine.applications.update`** et de **actAs** sur le compte de service à utiliser, vous pouvez modifier le compte de service utilisé par AppEngine avec :

<details>
<summary>Mettre à jour le compte de service App Engine</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

Avec ces permissions, il est possible de se connecter via ssh sur des instances App Engine de type flexible (pas standard). Certaines des permissions list et get pourraient ne pas être réellement nécessaires.

Se connecter en SSH à une instance App Engine ```bash gcloud app instances ssh --service --version ```

appengine.applications.update, appengine.operations.get

Je pense que cela se contente de changer le SA en arrière-plan que google utilisera pour configurer les applications, donc je ne pense pas que vous puissiez abuser de cela pour voler le service account.

Mettre à jour le service account de l'application ```bash gcloud app update --service-account= ```

appengine.versions.getFileContents, appengine.versions.update

Je ne suis pas sûr de la façon d’utiliser ces permissions ni de leur utilité (notez que lorsque vous changez le code une nouvelle version est créée, donc je ne sais pas si vous pouvez simplement mettre à jour le code ou le rôle IAM d’une version, mais j’imagine que vous devriez pouvoir le faire, peut‑être en changeant le code à l’intérieur du bucket ?).

Accès en écriture aux buckets

Comme mentionné, les versions d’appengine génèrent des données dans un bucket au nom formaté : staging.<project-id>.appspot.com. Notez qu’il n’est pas possible de pré-saisir ce bucket car les utilisateurs GCP ne sont pas autorisés à créer des buckets utilisant le domaine appspot.com.

Cependant, avec un accès lecture & écriture sur ce bucket, il est possible d’escalader les privilèges vers le SA attaché à la version AppEngine en surveillant le bucket et, dès qu’un changement est effectué, en modifiant le code aussi rapidement que possible. Ainsi, le conteneur créé à partir de ce code exécutera le backdoored code.

Pour plus d’informations et une PoC, consultez les informations pertinentes de cette page :

GCP - Storage Privesc

Accès en écriture à Artifact Registry

Même si App Engine crée des images docker dans Artifact Registry, il a été vérifié que même si vous modifiez l’image dans ce service et supprimez l’instance App Engine (de sorte qu’une nouvelle soit déployée), le code exécuté ne change pas.
Il est possible que, en menant une Race Condition attack comme avec les buckets, il soit possible d’écraser le code exécuté, mais cela n’a pas été testé.

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks