GCP - Storage Privesc
Storage
Información Básica:
GCP - Storage Enumstorage.objects.get
storage.objects.get
Este permiso te permite descargar archivos almacenados dentro de Cloud Storage. Esto potencialmente te permitirá escalar privilegios porque en algunas ocasiones información sensible se guarda allí. Además, algunos servicios de GCP almacenan su información en buckets:
GCP Composer: Cuando creas un Entorno de Composer, el código de todos los DAGs se guardará dentro de un bucket. Estas tareas pueden contener información interesante dentro de su código.
GCR (Container Registry): La imagen de los contenedores se almacena dentro de buckets, lo que significa que si puedes leer los buckets podrás descargar las imágenes y buscar leaks y/o código fuente.
storage.objects.setIamPolicy
storage.objects.setIamPolicy
Puedes darte permiso para abusar de cualquiera de los escenarios anteriores de esta sección.
storage.buckets.setIamPolicy
storage.buckets.setIamPolicy
Para un ejemplo sobre cómo modificar permisos con este permiso, consulta esta página:
GCP - Public Buckets Privilege Escalationstorage.hmacKeys.create
storage.hmacKeys.create
La función de "interoperabilidad" de Cloud Storage, diseñada para interacciones entre nubes como con AWS S3, implica la creación de claves HMAC para Cuentas de Servicio y usuarios. Un atacante puede explotar esto generando una clave HMAC para una Cuenta de Servicio con privilegios elevados, así escalando privilegios dentro de Cloud Storage. Mientras que las claves HMAC asociadas a usuarios solo son recuperables a través de la consola web, tanto las claves de acceso como las secretas permanecen perpetuamente accesibles, lo que permite un posible acceso de respaldo. Por otro lado, las claves HMAC vinculadas a Cuentas de Servicio son accesibles por API, pero sus claves de acceso y secretas no son recuperables después de la creación, añadiendo una capa de complejidad para el acceso continuo.
Otro script de explotación para este método se puede encontrar aquí.
storage.objects.create
, storage.objects.delete
= Permisos de escritura en almacenamiento
storage.objects.create
, storage.objects.delete
= Permisos de escritura en almacenamientoPara crear un nuevo objeto dentro de un bucket necesitas storage.objects.create
y, según la documentación, también necesitas storage.objects.delete
para modificar un objeto existente.
Una explotación muy común de los buckets donde puedes escribir en la nube es en caso de que el bucket esté guardando archivos del servidor web, podrías ser capaz de almacenar nuevo código que será utilizado por la aplicación web.
Composer
Composer es Apache Airflow gestionado dentro de GCP. Tiene varias características interesantes:
Se ejecuta dentro de un clúster GKE, por lo que el SA que utiliza el clúster es accesible por el código que se ejecuta dentro de Composer.
Almacena el código en un bucket, por lo tanto, cualquiera con acceso de escritura sobre ese bucket podrá cambiar/agregar un código DGA (el código que ejecutará Apache Airflow) Entonces, si tienes acceso de escritura sobre el bucket que utiliza Composer para almacenar el código, puedes privesc al SA que se ejecuta en el clúster GKE.
Cloud Functions
El código de Cloud Functions se almacena en Storage, por lo que sobrescribirlo, es posible ejecutar código arbitrario.
App Engine
El código fuente de App Engine se almacena en buckets, sobrescribiendo el código podría ser posible ejecutar código arbitrario. ESTO NO ES POSIBLE.
Parece que las capas de contenedor se almacenan en el bucket, ¿quizás cambiando esas?
GCR
Google Container Registry almacena las imágenes dentro de buckets, si puedes escribir en esos buckets podrías ser capaz de moverte lateralmente a donde se están ejecutando esos buckets.
El bucket utilizado por GCR tendrá una URL similar a
gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com
(Los subdominios de nivel superior están especificados aquí).
Referencias
Last updated