GCP - AppEngine Privesc
App Engine
Para obtener más información sobre App Engine, consulta:
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
Estos son los permisos necesarios para implementar una aplicación usando la interfaz de línea de comandos gcloud
. Tal vez los permisos de get
y list
se puedan evitar.
Puedes encontrar ejemplos de código en Python en https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
Por defecto, el nombre del servicio de la aplicación será default
, y solo puede haber 1 instancia con el mismo nombre.
Para cambiarlo y crear una segunda aplicación, en app.yaml
, cambia el valor de la clave raíz a algo como service: my-second-app
Dale al menos 10-15 minutos, si no funciona, llama despliega otra vez varias veces y espera unos minutos.
Es posible indicar la Cuenta de Servicio a utilizar, pero por defecto se utiliza la Cuenta de Servicio predeterminada de App Engine.
La URL de la aplicación es algo como https://<nombre-proyecto>.oa.r.appspot.com/
o https://<nombre-servicio>-dot-<nombre-proyecto>.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 estos permisos, es posible iniciar sesión a través de ssh en las instancias de App Engine de tipo flexible (no estándar). Algunos de los permisos de list
y get
podrían no ser realmente necesarios.
appengine.applications.update
, appengine.operations.get
appengine.applications.update
, appengine.operations.get
Creo que esto simplemente cambia el SA de fondo que Google usará para configurar las aplicaciones, por lo que no creo que puedas abusar de esto para robar la cuenta de servicio.
appengine.versions.getFileContents
, appengine.versions.update
appengine.versions.getFileContents
, appengine.versions.update
No estoy seguro de cómo usar estos permisos o si son útiles (ten en cuenta que al cambiar el código se crea una nueva versión, así que no sé si puedes simplemente actualizar el código o el rol IAM de uno, pero supongo que deberías poder, ¿quizás cambiando el código dentro del bucket??).
Acceso de escritura sobre los buckets
Incluso con acceso de escritura sobre los buckets donde se encuentra el código fuente NO fue posible ejecutar código arbitrario modificando el código fuente y el manifest.json
.
Quizás si estás monitoreando el bucket y detectas el momento en que se crea una nueva versión y se carga el código fuente y el manifiesto, podría ser posible cambiarlos para que la nueva versión use los modificados con puerta trasera??
También parece que las capas de contenedores se almacenan en el bucket, ¿cambiando esas capas?
Última actualización