GCP - Cloudbuild Privesc

Reading time: 4 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

cloudbuild

Para mais informações sobre o Cloud Build, consulte:

GCP - Cloud Build Enum

cloudbuild.builds.create, iam.serviceAccounts.actAs

Com esta permissão, você pode submeter um cloud build. A máquina do cloudbuild terá em seu sistema de arquivos por padrão um token da Service Account do cloudbuild: <PROJECT_NUMBER>@cloudbuild.gserviceaccount.com. No entanto, você pode indicar qualquer service account dentro do projeto na configuração do cloudbuild.
Portanto, você pode simplesmente fazer a máquina exfiltrar para o seu servidor o token ou obter um shell reverso dentro dela e conseguir o token (o arquivo contendo o token pode mudar).

Você pode encontrar o script de exploit original aqui no GitHub (mas a localização de onde está pegando o token não funcionou para mim). Portanto, confira um script para automatizar a criação, exploração e limpeza de um ambiente vulnerável aqui e um script em python para obter um shell reverso dentro da máquina do cloudbuild e roubar o token aqui (no código você pode encontrar como especificar outras service accounts).

Para uma explicação mais detalhada, visite https://rhinosecuritylabs.com/gcp/iam-privilege-escalation-gcp-cloudbuild/

cloudbuild.builds.update

Potencialmente, com esta permissão, você poderá atualizar um cloud build e apenas roubar o token da service account como foi feito com a permissão anterior (mas, infelizmente, no momento da escrita, não consegui encontrar nenhuma maneira de chamar essa API).

TODO

cloudbuild.repositories.accessReadToken

Com esta permissão, o usuário pode obter o token de acesso de leitura usado para acessar o repositório:

bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{}' \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadToken"

cloudbuild.repositories.accessReadWriteToken

Com esta permissão, o usuário pode obter o token de acesso de leitura e gravação usado para acessar o repositório:

bash
curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-d '{}' \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>/repositories/<repo-id>:accessReadWriteToken"

cloudbuild.connections.fetchLinkableRepositories

Com esta permissão, você pode obter os repositórios aos quais a conexão tem acesso:

bash
curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://cloudbuild.googleapis.com/v2/projects/<PROJECT_ID>/locations/<LOCATION>/connections/<CONN_ID>:fetchLinkableRepositories"

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks