GCP - Privesc de l'Artifact Registry

Reading time: 6 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Artifact Registry

Pour plus d'informations sur l'Artifact Registry, consultez :

GCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

Avec cette permission, un attaquant pourrait télécharger de nouvelles versions des artefacts avec du code malveillant comme des images Docker :

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

Il a Ă©tĂ© vĂ©rifiĂ© qu'il est possible de tĂ©lĂ©charger une nouvelle image docker malveillante avec le mĂȘme nom et tag que celle dĂ©jĂ  prĂ©sente, donc l'ancienne perdra le tag et la prochaine fois que cette image avec ce tag sera tĂ©lĂ©chargĂ©e, la malveillante sera tĂ©lĂ©chargĂ©e.

Télécharger une bibliothÚque Python

Commencez par créer la bibliothÚque à télécharger (si vous pouvez télécharger la derniÚre version depuis le registre, vous pouvez éviter cette étape) :

  1. Configurez la structure de votre projet :
  • CrĂ©ez un nouveau rĂ©pertoire pour votre bibliothĂšque, par exemple, hello_world_library.
  • À l'intĂ©rieur de ce rĂ©pertoire, crĂ©ez un autre rĂ©pertoire avec le nom de votre package, par exemple, hello_world.
  • À l'intĂ©rieur de votre rĂ©pertoire de package, crĂ©ez un fichier __init__.py. Ce fichier peut ĂȘtre vide ou contenir des initialisations pour votre package.
bash
mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Écrivez le code de votre bibliothùque :
  • À l'intĂ©rieur du rĂ©pertoire hello_world, crĂ©ez un nouveau fichier Python pour votre module, par exemple, greet.py.
  • Écrivez votre fonction "Hello, World!" :
python
# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Créez un fichier setup.py :
  • À la racine de votre rĂ©pertoire hello_world_library, crĂ©ez un fichier setup.py.
  • Ce fichier contient des mĂ©tadonnĂ©es sur votre bibliothĂšque et indique Ă  Python comment l'installer.
python
# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Toute dépendance dont votre bibliothÚque a besoin
],
)

Maintenant, téléchargeons la bibliothÚque :

  1. Construisez votre package :
  • Depuis la racine de votre rĂ©pertoire hello_world_library, exĂ©cutez :
sh
python3 setup.py sdist bdist_wheel
  1. Configurez l'authentification pour twine (utilisé pour télécharger votre package) :
  • Assurez-vous d'avoir twine installĂ© (pip install twine).
  • Utilisez gcloud pour configurer les identifiants :
`
```
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
```
3. **Nettoyer la construction**
<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>


Il n'est pas possible de tĂ©lĂ©charger une bibliothĂšque python avec la mĂȘme version que celle dĂ©jĂ  prĂ©sente, mais il est possible de tĂ©lĂ©charger des **versions supĂ©rieures** (ou d'ajouter un **`.0` Ă  la fin** de la version si cela fonctionne - pas en python cependant -), ou de **supprimer la derniĂšre version et d'en tĂ©lĂ©charger une nouvelle avec** (nĂ©cessite `artifactregistry.versions.delete)`**:**

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

</div>


### `artifactregistry.repositories.downloadArtifacts`

Avec cette permission, vous pouvez **télécharger des artefacts** et rechercher des **informations sensibles** et des **vulnérabilités**.

Téléchargez une **image** **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>
```
Téléchargez une bibliothÚque **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
```
- Que se passe-t-il si des registres distants et standard sont mélangés dans un registre virtuel et qu'un package existe dans les deux ? Consultez cette page :

<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`)

Supprimez des artefacts du registre, comme des images 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`

Supprimez un dĂ©pĂŽt complet (mĂȘme s'il contient du contenu) :
```
gcloud artifacts repositories delete <repo-name> --location=<location>
```
### `artifactregistry.repositories.setIamPolicy`

Un attaquant avec cette permission pourrait se donner des permissions pour effectuer certaines des attaques de dépÎt mentionnées précédemment.

### Pivot vers d'autres services via la lecture et l'écriture de l'Artifact Registry

- **Cloud Functions**

Lorsqu'une Cloud Function est créée, une nouvelle image docker est poussĂ©e vers l'Artifact Registry du projet. J'ai essayĂ© de modifier l'image avec une nouvelle et mĂȘme de supprimer l'image actuelle (et l'image `cache`), mais rien n'a changĂ©, la fonction cloud continue de fonctionner. Par consĂ©quent, il **pourrait ĂȘtre possible d'abuser d'une attaque de condition de course** comme avec le bucket pour changer le conteneur docker qui sera exĂ©cutĂ©, mais **il n'est pas possible de compromettre la Cloud Function juste en modifiant l'image stockĂ©e**.

- **App Engine**

Bien qu'App Engine crĂ©e des images docker Ă  l'intĂ©rieur de l'Artifact Registry. Il a Ă©tĂ© testĂ© que **mĂȘme si vous modifiez l'image Ă  l'intĂ©rieur de ce service** et supprimez l'instance App Engine (de sorte qu'une nouvelle soit dĂ©ployĂ©e), le **code exĂ©cutĂ© ne change pas**.\
Il pourrait ĂȘtre possible qu'en effectuant une **attaque de condition de course comme avec les buckets, il pourrait ĂȘtre possible de remplacer le code exĂ©cutĂ©**, mais cela n'a pas Ă©tĂ© testĂ©.

<div class="mdbook-alerts mdbook-alerts-tip">
<p class="mdbook-alerts-title">
  <span class="mdbook-alerts-icon"></span>
  tip
</p>


Apprenez et pratiquez le 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;">\
Apprenez et pratiquez le 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;">
Apprenez et pratiquez le 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>Soutenir HackTricks</summary>

- Vérifiez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
- **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** 🐩 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
- **Partagez des astuces de hacking en soumettant des PR au** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépÎts github.

</details>

</div>