GCP - Artifact Registry Privesc

Aprenda hacking AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Registro de Artefatos

Para mais informações sobre o Registro de Artefatos, verifique:

pageGCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

Com essa 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>

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 a imagem com essa tag for baixada, a maliciosa será baixada.

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 este passo):

  1. 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 o seu pacote.

mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Escreva o código da sua biblioteca:

  • Dentro do diretório hello_world, crie um novo arquivo Python para o seu módulo, por exemplo, greet.py.

  • Escreva sua função "Hello, World!":

# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Crie um arquivo setup.py:

  • Na raiz do seu diretório hello_world_library, crie um arquivo setup.py.

  • Este arquivo contém metadados sobre sua biblioteca e diz 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 o upload da biblioteca:

  1. Construa seu pacote:

  • A partir da raiz do seu diretório hello_world_library, execute:

python3 setup.py sdist bdist_wheel
  1. Configure a autenticação para o twine (usado para fazer upload do seu pacote):

  • Certifique-se de ter o twine instalado (pip install twine).

  • Use o 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/*
  1. Limpe a construção

rm -rf dist build hello_world.egg-info

Não é possível fazer upload de uma biblioteca Python com a mesma versão da que já está presente, mas é possível fazer upload de versões superiores (ou adicionar um .0 extra no final da versão, se isso funcionar -não em Python, no entanto-), ou excluir a última versão e fazer upload de uma nova com (necessário artifactregistry.versions.delete):

gcloud artifacts versions delete <version> --repository=<repo-name> --location=<location> --package=<lib-name>

artifactregistry.repositories.downloadArtifacts

Com essa permissão, você pode baixar artefatos e procurar por informações sensíveis e vulnerabilidades.

Baixar uma imagem Docker:

# 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:

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? Verifique esta página:

pageGCP - Artifact Registry Persistence

artifactregistry.tags.delete, artifactregistry.versions.delete, artifactregistry.packages.delete, (artifactregistry.repositories.get, artifactregistry.tags.get, artifactregistry.tags.list)

Exclua artefatos do registro, como imagens docker:

# Delete a docker image
gcloud artifacts docker images delete <location>-docker.pkg.dev/<proj-name>/<repo-name>/<img-name>:<tag>

artifactregistry.repositories.delete

Excluir 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 conceder a si mesmo permissões para realizar alguns dos ataques de repositório mencionados anteriormente.

Aprenda hacking AWS do zero ao heroí com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Última actualización