GCP - AppEngine Privesc

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipo Rojo de HackTricks en AWS)!

Otras formas de apoyar a HackTricks:

App Engine

Para obtener más información sobre App Engine, consulta:

pageGCP - 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

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

cd python-docs-samples/appengine/flexible/hello_world
gcloud app deploy #Upload and start application inside the folder

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

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.

gcloud app instances ssh --service <app-name> --version <version-id> <ID>

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.

gcloud app update --service-account=<sa_email>

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