GCP - Artifact Registry Privesc

Aprende a hackear AWS desde cero hasta convertirte en un experto con htARTE (Experto en Equipos Rojos de HackTricks AWS)!

Otras formas de apoyar a HackTricks:

Registro de artefactos

Para obtener más información sobre el Registro de artefactos, consulta:

pageGCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

Con este permiso, un atacante podría cargar nuevas versiones de los artefactos con código malicioso como imágenes de 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>

Se verificó que es posible cargar una nueva imagen de docker maliciosa con el mismo nombre y etiqueta que la ya presente, por lo que la antigua perderá la etiqueta y la próxima vez que se descargue la imagen con esa etiqueta se descargará la maliciosa.

Cargar una biblioteca de Python

Comience creando la biblioteca para cargar (si puede descargar la última versión del registro, puede evitar este paso):

  1. Configure la estructura de su proyecto:

  • Cree un nuevo directorio para su biblioteca, por ejemplo, hello_world_library.

  • Dentro de este directorio, cree otro directorio con el nombre de su paquete, por ejemplo, hello_world.

  • Dentro de su directorio de paquetes, cree un archivo __init__.py. Este archivo puede estar vacío o puede contener inicializaciones para su paquete.

mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Escriba el código de su biblioteca:

  • Dentro del directorio hello_world, cree un nuevo archivo Python para su módulo, por ejemplo, greet.py.

  • Escriba su función "¡Hola, mundo!":

# hello_world/greet.py
def say_hello():
return "¡Hola, mundo!"
  1. Cree un archivo setup.py:

  • En la raíz de su directorio hello_world_library, cree un archivo setup.py.

  • Este archivo contiene metadatos sobre su biblioteca y le dice a Python cómo instalarla.

# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Cualquier dependencia que necesite su biblioteca
],
)

Ahora, vamos a cargar la biblioteca:

  1. Construya su paquete:

  • Desde la raíz de su directorio hello_world_library, ejecute:

python3 setup.py sdist bdist_wheel
  1. Configure la autenticación para twine (utilizado para cargar su paquete):

  • Asegúrese de tener twine instalado (pip install twine).

  • Utilice gcloud para configurar las credenciales:

twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
  1. Limpiar la compilación

rm -rf dist build hello_world.egg-info

No es posible cargar una biblioteca de Python con la misma versión que la que ya está presente, pero es posible cargar versiones superiores (o agregar un .0 adicional al final de la versión si eso funciona, no en Python sin embargo), o eliminar la última versión y cargar una nueva con (necesario artifactregistry.versions.delete):

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

artifactregistry.repositories.downloadArtifacts

Con este permiso puedes descargar artefactos y buscar información sensible y vulnerabilidades.

Descargar una imagen de 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>

Descarga una biblioteca de 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
  • ¿Qué sucede si se mezclan registros remotos y estándar en uno virtual y un paquete existe en ambos? Consulta 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)

Eliminar artefactos del registro, como imágenes de Docker:

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

artifactregistry.repositories.delete

Eliminar un repositorio completo (incluso si tiene contenido):

gcloud artifacts repositories delete <repo-name> --location=<location>

artifactregistry.repositories.setIamPolicy

Un atacante con este permiso podría otorgarse permisos para realizar algunos de los ataques de repositorio mencionados anteriormente.

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización