GCP - App Engine Enum

Support HackTricks

Basic Information

O App Engine da Google Cloud Platform (GCP) é uma plataforma robusta e sem servidor, projetada para o desenvolvimento e hospedagem de aplicações web em grande escala. O design desta plataforma foca em simplificar o processo de desenvolvimento e melhorar a gerenciabilidade das aplicações. As principais características e benefícios do App Engine da GCP incluem:

  1. Arquitetura Sem Servidor: O App Engine gerencia automaticamente a infraestrutura, incluindo provisionamento de servidores, configuração e escalonamento. Isso permite que os desenvolvedores se concentrem em escrever código sem se preocupar com o hardware subjacente.

  2. Escalonamento Automático: O App Engine pode escalar automaticamente sua aplicação em resposta à quantidade de tráfego que recebe. Ele aumenta a capacidade para lidar com o tráfego crescente e diminui quando o tráfego diminui, ajudando a otimizar custos e desempenho.

  3. Suporte a Linguagens e Runtime: Suporta linguagens de programação populares como Java, Python, Node.js, Go, Ruby, PHP e .NET. Você pode executar suas aplicações em um ambiente padrão ou flexível. O ambiente padrão é mais restritivo, mas altamente otimizado para linguagens específicas, enquanto o ambiente flexível permite mais personalização.

  4. Serviços Integrados: O App Engine se integra a muitos outros serviços da GCP, como Cloud SQL, Cloud Storage, Cloud Datastore e mais. Essa integração simplifica a arquitetura de aplicações baseadas em nuvem.

  5. Versionamento e Divisão de Tráfego: Você pode implantar facilmente várias versões de sua aplicação e, em seguida, dividir o tráfego entre elas para testes A/B ou lançamentos graduais.

  6. Insights da Aplicação: O App Engine fornece serviços integrados, como registro, autenticação de usuários e um conjunto de ferramentas de desenvolvedor para monitorar e gerenciar aplicações.

  7. Segurança: Oferece recursos de segurança integrados, como versionamento de aplicações, certificados SSL/TLS para conexões seguras e gerenciamento de identidade e acesso.

Firewall

Um simples firewall pode ser configurado para as instâncias que executam os Apps com as seguintes opções:

SA

A conta de serviço padrão usada por esses Apps é <proj-name>@appspot.gserviceaccount.com que tem o papel de Editor sobre o projeto e as SAs dentro da instância do APP Engine executam com escopo de cloud-platform (entre outros).

Storage

O código-fonte e os metadados são armazenados automaticamente em buckets com nomes como <proj-id>.appspot.com e staging.<proj-id>.appspot.com e <country>.<proj-id>.appspot.com

Cada arquivo do App é armazenado com o sha1 do conteúdo como nome do arquivo:

Dentro da pasta ae de staging.<proj-id>.appspot.com, existe uma pasta por versão com os arquivos de código-fonte e o arquivo manifest.json que descreve os componentes do App:

{"requirements.txt":{"sourceUrl":"https://storage.googleapis.com/staging.onboarding-host-98efbf97812843.appspot.com/a270eedcbe2672c841251022b7105d340129d108","sha1Sum":"a270eedc_be2672c8_41251022_b7105d34_0129d108"},"main_test.py":{"sourceUrl":"https://storage.googleapis.com/staging.onboarding-host-98efbf97812843.appspot.com/0ca32fd70c953af94d02d8a36679153881943f32","sha1Sum":"0ca32fd7_0c953af9_4d02d8a ...

Containers

O aplicativo da web será executado dentro de um contêiner e Code Build é usado para construir o contêiner.

URLs & Regiões

A página da web padrão será exposta na URL <project-uniq-name>.appspot.com, embora a URL de versões mais antigas seja ligeiramente diferente, como https://20240117t001540-dot-<project-uniq-name>.uc.r.appspot.com (note o timestamp inicial).

Pode parecer que é possível implantar apenas 1 aplicativo de engine da web por região, mas é possível indicar service: <servicename> no app.yml e criar um novo serviço (uma nova web). O formato da URL para esta nova web será <servicename>-dot-<project-uniq-name>.appspot.com.

Enumeração

Toda vez que você envia um novo código para o App, uma nova versão é criada. Todas as versões são armazenadas e elas até têm uma URL para acessá-las. Portanto, modificar o código de uma versão antiga pode ser uma ótima técnica de persistência.

Assim como com as Cloud Functions, há uma chance de que a aplicação dependa de segredos que são acessados em tempo de execução via variáveis de ambiente. Essas variáveis são armazenadas em um arquivo app.yaml que pode ser acessado da seguinte forma:

# List the apps
gcloud app services list
gcloud app services describe <app-name>
# Access via browser to the specified app
gcloud app services browse <app-name>

# Get App versions
gcloud app versions list
# Get all the info of the app and version, included specific verion URL and the env
gcloud app versions describe -s <app-name> <version-id>

# Logs
gcloud app logs tail -s <app-name>

# Instances
## This is only valid if a flexible environment is used and not a standard one
gcloud app instances list
gcloud app instances describe -s <app-name> --version <version-id> <ID>
## Connect to the instance via ssh
gcloud app instances ssh --service <app-name> --version <version-id> <ID>

# Firewalls
gcloud app firewall-rules list
gcloud app firewall-rules describe <num_fw>

# Get domains
gcloud app domain-mappings list
gcloud app domain-mappings describe <name>

# SSl certificates
gcloud app ssl-certificates list
gcloud app ssl-certificates describe <name>

Escalação de Privilégios

Enumeração Não Autenticada

Pós Exploração

Persistência

Support HackTricks

Last updated