GCP - AppEngine Privesc
App Engine
Para mais informações sobre o App Engine, consulte:
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
Essas são as permissões necessárias para implantar um App usando o gcloud
cli. Talvez as permissões get
e list
possam ser evitadas.
Você pode encontrar exemplos de código em Python em https://github.com/GoogleCloudPlatform/python-docs-samples/tree/main/appengine
Por padrão, o nome do serviço do App será default
, e pode haver apenas 1 instância com o mesmo nome.
Para alterá-lo e criar um segundo App, em app.yaml
, altere o valor da chave raiz para algo como service: my-second-app
Dê pelo menos 10-15 minutos, se não funcionar chame implantar outra vez algumas vezes e espere alguns minutos.
É possível indicar a Conta de Serviço a ser usada, mas por padrão, a Conta de Serviço padrão do App Engine é usada.
A URL da aplicação é algo como https://<nome-proj>.oa.r.appspot.com/
ou https://<nome-servico>-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
Com essas permissões, é possível fazer login via ssh nas instâncias do App Engine do tipo flexível (não padrão). Algumas das permissões de list
e get
podem não ser realmente necessárias.
appengine.applications.update
, appengine.operations.get
appengine.applications.update
, appengine.operations.get
Acredito que isso apenas altera o SA de fundo que o Google usará para configurar as aplicações, então não acho que você possa abusar disso para roubar a conta de serviço.
appengine.versions.getFileContents
, appengine.versions.update
appengine.versions.getFileContents
, appengine.versions.update
Não tenho certeza de como usar essas permissões ou se são úteis (observe que ao alterar o código uma nova versão é criada, então não sei se você pode simplesmente atualizar o código ou a função IAM de um, mas acredito que você deveria ser capaz de, talvez alterando o código dentro do bucket??).
Acesso de escrita sobre os buckets
Mesmo com acesso de escrita sobre os buckets onde o código-fonte está localizado NÃO FOI possível executar código arbitrário modificando o código-fonte e o manifest.json
.
Talvez se você estiver monitorando o bucket e detectar o momento em que uma nova versão é criada e o código-fonte e o manifesto são enviados, talvez seja possível alterá-los para que a nova versão use os comprometidos??
Também parece que as camadas de contêiner são armazenadas no bucket, talvez alterando essas?
Última actualización