GCP - Privesc do Artifact Registry
Reading time: 6 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
- Confira os planos de assinatura!
- Junte-se ao 💬 grupo do Discord ou ao grupo do telegram ou siga-nos no Twitter 🐦 @hacktricks_live.
- Compartilhe truques de hacking enviando PRs para o HackTricks e HackTricks Cloud repositórios do github.
Artifact Registry
Para mais informações sobre o Artifact Registry, consulte:
artifactregistry.repositories.uploadArtifacts
Com esta permissão, um atacante poderia fazer upload de novas versões dos artefatos com código malicioso, como imagens Docker:
# Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker <location>-docker.pkg.dev
# tag the image to upload it
docker tag <local-img-name>:<local-tag> <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
# Upload it
docker push <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
caution
Foi verificado que é possível fazer upload de uma nova imagem docker maliciosa com o mesmo nome e tag da que já está presente, então a antiga perderá a tag e na próxima vez que essa imagem com essa tag for baixada, a maliciosa será baixada.
Fazer upload de uma biblioteca Python
Comece criando a biblioteca para fazer upload (se você puder baixar a versão mais recente do registro, pode evitar esta etapa):
- Configure a estrutura do seu projeto:
- Crie um novo diretório para sua biblioteca, por exemplo,
hello_world_library
. - Dentro deste diretório, crie outro diretório com o nome do seu pacote, por exemplo,
hello_world
. - Dentro do diretório do seu pacote, crie um arquivo
__init__.py
. Este arquivo pode estar vazio ou pode conter inicializações para seu pacote.
mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
- Escreva o código da sua biblioteca:
- Dentro do diretório
hello_world
, crie um novo arquivo Python para seu módulo, por exemplo,greet.py
. - Escreva sua função "Hello, World!":
# hello_world/greet.py
def say_hello():
return "Hello, World!"
- Crie um arquivo
setup.py
:
- Na raiz do seu diretório
hello_world_library
, crie um arquivosetup.py
. - Este arquivo contém metadados sobre sua biblioteca e informa ao Python como instalá-la.
# setup.py
from setuptools import setup, find_packages
setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Quaisquer dependências que sua biblioteca precisa
],
)
Agora, vamos fazer upload da biblioteca:
- Construa seu pacote:
- Da raiz do seu diretório
hello_world_library
, execute:
python3 setup.py sdist bdist_wheel
- Configure a autenticação para o twine (usado para fazer upload do seu pacote):
- Certifique-se de que você tenha
twine
instalado (pip install twine
). - Use
gcloud
para configurar as credenciais:
```
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
```
3. **Limpar a construção**
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">bash</span></div>
```bash
rm -rf dist build hello_world.egg-info
```
</details>
<div class="mdbook-alerts mdbook-alerts-caution">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
caution
</p>
Não é possível fazer upload de uma biblioteca python com a mesma versão que a já presente, mas é possível fazer upload de **versões maiores** (ou adicionar um extra **`.0` no final** da versão se isso funcionar -não em python, porém-), ou **deletar a última versão e fazer upload de uma nova com** (necessário `artifactregistry.versions.delete)`**:**
```sh
gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>
```
</div>
### `artifactregistry.repositories.downloadArtifacts`
Com esta permissão você pode **baixar artefatos** e procurar por **informações sensíveis** e **vulnerabilidades**.
Baixar uma **imagem** Docker:
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">sh</span></div>
```sh
# Configure docker to use gcloud to authenticate with Artifact Registry
gcloud auth configure-docker <location>-docker.pkg.dev
# Dowload image
docker pull <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
Baixe uma biblioteca **python**:
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">bash</span></div>
```bash
pip install <lib-name> --index-url "https://oauth2accesstoken:$(gcloud auth print-access-token)@<location>-python.pkg.dev/<project-id>/<repo-name>/simple/" --trusted-host <location>-python.pkg.dev --no-cache-dir
```
- O que acontece se um registro remoto e um padrão forem misturados em um virtual e um pacote existir em ambos? Confira esta página:
<a class="content_ref" href="../gcp-persistence/gcp-artifact-registry-persistence.md"><span class="content_ref_label">GCP - Artifact Registry Persistence</span></a>
### `artifactregistry.tags.delete`, `artifactregistry.versions.delete`, `artifactregistry.packages.delete`, (`artifactregistry.repositories.get`, `artifactregistry.tags.get`, `artifactregistry.tags.list`)
Exclui artefatos do registro, como imagens docker:
<div class="codeblock_filename_container"><span class="codeblock_filename_inner hljs">bash</span></div>
```bash
# Delete a docker image
gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>
```
### `artifactregistry.repositories.delete`
Exclui um repositório completo (mesmo que tenha conteúdo):
```
gcloud artifacts repositories delete <repo-name> --location=<location>
```
### `artifactregistry.repositories.setIamPolicy`
Um atacante com essa permissão poderia se conceder permissões para realizar alguns dos ataques ao repositório mencionados anteriormente.
### Pivotando para outros Serviços através da Leitura e Escrita do Artifact Registry
- **Cloud Functions**
Quando uma Cloud Function é criada, uma nova imagem docker é enviada para o Artifact Registry do projeto. Tentei modificar a imagem por uma nova, e até mesmo deletar a imagem atual (e a imagem `cache`), e nada mudou, a cloud function continuou funcionando. Portanto, talvez **possa ser possível abusar de um ataque de Condição de Corrida** como com o bucket para mudar o contêiner docker que será executado, mas **apenas modificar a imagem armazenada não é possível comprometer a Cloud Function**.
- **App Engine**
Embora o App Engine crie imagens docker dentro do Artifact Registry. Foi testado que **mesmo se você modificar a imagem dentro deste serviço** e remover a instância do App Engine (para que uma nova seja implantada), o **código executado não muda**.\
Pode ser possível que realizando um **ataque de Condição de Corrida como com os buckets, pode ser possível sobrescrever o código executado**, mas isso não foi testado.
<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
<span class="mdbook-alerts-icon"></span>
tip
</p>
Aprenda e pratique Hacking AWS:<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
Aprenda e pratique Hacking GCP: <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
Aprenda e pratique Hacking Azure: <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
<details>
<summary>Support HackTricks</summary>
- Confira os [**planos de assinatura**](https://github.com/sponsors/carlospolop)!
- **Junte-se ao** 💬 [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga**-nos no **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
- **Compartilhe truques de hacking enviando PRs para o** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositórios do github.
</details>
</div>