GCP - Storage Privesc
Storage
Informações Básicas:
GCP - Storage Enumstorage.objects.get
storage.objects.get
Esta permissão permite que você baixe arquivos armazenados no Cloud Storage. Isso pode potencialmente permitir que você escale privilégios porque em algumas ocasiões informações sensíveis são salvas lá. Além disso, alguns serviços do GCP armazenam suas informações em buckets:
GCP Composer: Quando você cria um Ambiente Composer, o código de todos os DAGs será salvo dentro de um bucket. Essas tarefas podem conter informações interessantes dentro de seu código.
GCR (Container Registry): A imagem dos contêineres é armazenada dentro de buckets, o que significa que se você puder ler os buckets, poderá baixar as imagens e procurar por leaks e/ou código fonte.
storage.objects.setIamPolicy
storage.objects.setIamPolicy
Você pode se dar permissão para abusar de qualquer um dos cenários anteriores desta seção.
storage.buckets.setIamPolicy
storage.buckets.setIamPolicy
Para um exemplo de como modificar permissões com esta permissão, consulte esta página:
GCP - Public Buckets Privilege Escalationstorage.hmacKeys.create
storage.hmacKeys.create
O recurso de "interoperabilidade" do Cloud Storage, projetado para interações entre nuvens como com o AWS S3, envolve a criação de chaves HMAC para Contas de Serviço e usuários. Um atacante pode explorar isso gerando uma chave HMAC para uma Conta de Serviço com privilégios elevados, assim escalando privilégios dentro do Cloud Storage. Enquanto as chaves HMAC associadas a usuários só podem ser recuperadas via console da web, tanto as chaves de acesso quanto as secretas permanecem perpetuamente acessíveis, permitindo um potencial armazenamento de acesso de backup. Por outro lado, as chaves HMAC vinculadas a Contas de Serviço são acessíveis via API, mas suas chaves de acesso e secretas não podem ser recuperadas após a criação, adicionando uma camada de complexidade para acesso contínuo.
Outro script de exploração para este método pode ser encontrado aqui.
storage.objects.create
, storage.objects.delete
= Permissões de gravação em Storage
storage.objects.create
, storage.objects.delete
= Permissões de gravação em StoragePara criar um novo objeto dentro de um bucket, você precisa de storage.objects.create
e, de acordo com a documentação, você também precisa de storage.objects.delete
para modificar um objeto existente.
Uma exploração muito comum de buckets onde você pode escrever na nuvem é no caso de o bucket estar salvando arquivos de servidor web, você pode ser capaz de armazenar novo código que será usado pela aplicação web.
Composer
Composer é Apache Airflow gerenciado dentro do GCP. Ele possui várias características interessantes:
Ele roda dentro de um cluster GKE, então o SA que o cluster usa é acessível pelo código que está rodando dentro do Composer
Ele armazena o código em um bucket, portanto, qualquer um com acesso de gravação sobre esse bucket poderá mudar/adicionar um código DGA (o código que o Apache Airflow executará) Então, se você tiver acesso de gravação sobre o bucket que o Composer está usando para armazenar o código, você pode privesc para o SA rodando no cluster GKE.
Cloud Functions
O código do Cloud Functions é armazenado no Storage, então sobrescrevendo-o, é possível executar código arbitrário.
App Engine
O código-fonte do App Engine é armazenado em buckets, sobrescrevendo o código, pode ser possível executar código arbitrário. ISSO NÃO É POSSÍVEL
Parece que as camadas do contêiner estão armazenadas no bucket, talvez mudando isso?
GCR
Google Container Registry armazena as imagens dentro de buckets, se você puder escrever nesses buckets, pode ser capaz de mover lateralmente para onde esses buckets estão sendo executados.
O bucket usado pelo GCR terá uma URL semelhante a
gs://<eu/usa/asia/nothing>.artifacts.<project>.appspot.com
(Os subdomínios de nível superior são especificados aqui).
Referências
Last updated