GCP - AppEngine Privesc
App Engine
Per ulteriori informazioni su App Engine, controlla:
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
Questi sono i permessi necessari per deployare un'app usando il gcloud
cli. Forse quelli con get
e list
potrebbero essere evitati.
Puoi trovare esempi di codice Python in https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
Per impostazione predefinita, il nome del servizio dell'app sarà default
, e può esserci solo 1 istanza con lo stesso nome.
Per cambiarlo e creare una seconda App, in app.yaml
, cambia il valore della chiave principale in qualcosa come service: my-second-app
Attendere almeno 10-15 minuti, se non funziona chiamare eseguire di nuovo il deploy e attendere alcuni minuti.
È possibile indicare il Service Account da utilizzare, ma per impostazione predefinita viene utilizzato il SA predefinito di App Engine.
L'URL dell'applicazione è qualcosa del genere https://<nome-proj>.oa.r.appspot.com/
o https://<nome-servizio>-dot-<nome-proj>.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
Con queste autorizzazioni, è possibile effettuare il login tramite ssh nelle istanze di App Engine di tipo flessibile (non standard). Alcune delle autorizzazioni list
e get
potrebbero non essere realmente necessarie.
appengine.applications.update
, appengine.operations.get
appengine.applications.update
, appengine.operations.get
Penso che questo cambi solo il SA di background che Google utilizzerà per configurare le applicazioni, quindi non penso che tu possa abusarne per rubare l'account di servizio.
appengine.versions.getFileContents
, appengine.versions.update
appengine.versions.getFileContents
, appengine.versions.update
Non sono sicuro di come utilizzare queste autorizzazioni o se sono utili (nota che quando si cambia il codice viene creata una nuova versione quindi non so se è possibile aggiornare solo il codice o il ruolo IAM di uno, ma immagino che si dovrebbe essere in grado di farlo, forse cambiando il codice all'interno del bucket??).
Accesso in scrittura sui bucket
Anche con l'accesso in scrittura sui bucket in cui è situato il codice sorgente NON ERA possibile eseguire codice arbitrario modificando il codice sorgente e il manifest.json
.
Forse se si sta monitorando il bucket e si rileva il momento in cui viene creata una nuova versione e il codice sorgente e il manifesto vengono caricati, potrebbe essere possibile modificarli in modo che la nuova versione utilizzi quelli con backdoor??
Sembra anche che i livelli del contenitore siano memorizzati nel bucket, forse cambiandoli?
Last updated