GCP - Privilegi di Escalation nell'Artifact Registry

Reading time: 6 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Artifact Registry

Per ulteriori informazioni su Artifact Registry consulta:

GCP - Artifact Registry Enum

artifactregistry.repositories.uploadArtifacts

Con questo permesso un attaccante potrebbe caricare nuove versioni degli artefatti con codice malevolo come immagini 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

È stato verificato che è possibile caricare una nuova immagine docker malevola con lo stesso nome e tag di quella già presente, quindi il vecchio perderà il tag e la prossima volta che quell'immagine con quel tag verrà scaricata, quella malevola verrà scaricata.

Carica una libreria Python

Inizia creando la libreria da caricare (se puoi scaricare l'ultima versione dal registro, puoi evitare questo passaggio):

  1. Imposta la struttura del tuo progetto:
  • Crea una nuova directory per la tua libreria, ad esempio, hello_world_library.
  • All'interno di questa directory, crea un'altra directory con il nome del tuo pacchetto, ad esempio, hello_world.
  • All'interno della directory del tuo pacchetto, crea un file __init__.py. Questo file può essere vuoto o può contenere inizializzazioni per il tuo pacchetto.
bash
mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
  1. Scrivi il codice della tua libreria:
  • All'interno della directory hello_world, crea un nuovo file Python per il tuo modulo, ad esempio, greet.py.
  • Scrivi la tua funzione "Hello, World!":
python
# hello_world/greet.py
def say_hello():
return "Hello, World!"
  1. Crea un file setup.py:
  • Nella radice della tua directory hello_world_library, crea un file setup.py.
  • Questo file contiene metadati sulla tua libreria e dice a Python come installarla.
python
# setup.py
from setuptools import setup, find_packages

setup(
name='hello_world',
version='0.1',
packages=find_packages(),
install_requires=[
# Qualsiasi dipendenza di cui la tua libreria ha bisogno
],
)

Ora, carichiamo la libreria:

  1. Costruisci il tuo pacchetto:
  • Dalla radice della tua directory hello_world_library, esegui:
sh
python3 setup.py sdist bdist_wheel
  1. Configura l'autenticazione per twine (utilizzato per caricare il tuo pacchetto):
  • Assicurati di avere twine installato (pip install twine).
  • Usa gcloud per configurare le credenziali:
`
```
twine upload --username 'oauth2accesstoken' --password "$(gcloud auth print-access-token)" --repository-url https://<location>-python.pkg.dev/<project-id>/<repo-name>/ dist/*
```
```
3. **Pulisci la build**
<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>


Non è possibile caricare una libreria python con la stessa versione di quella già presente, ma è possibile caricare **versioni superiori** (o aggiungere un ulteriore **`.0` alla fine** della versione se funziona - non in python però), o **eliminare l'ultima versione e caricarne una nuova con** (necessaria `artifactregistry.versions.delete)`**:**

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

</div>


### `artifactregistry.repositories.downloadArtifacts`

Con questo permesso puoi **scaricare artefatti** e cercare **informazioni sensibili** e **vulnerabilità**.

Scarica un'immagine **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>
```
Scarica una libreria **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
```
- Cosa succede se un registro remoto e uno standard vengono mescolati in uno virtuale e un pacchetto esiste in entrambi? Controlla questa pagina:

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

Elimina artefatti dal registro, come immagini 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`

Elimina un repository completo (anche se ha contenuto):
```
gcloud artifacts repositories delete <repo-name> --location=<location>
```
### `artifactregistry.repositories.setIamPolicy`

Un attaccante con questo permesso potrebbe concedersi i permessi per eseguire alcuni degli attacchi ai repository menzionati in precedenza.

### Pivoting to other Services through Artifact Registry Read & Write

- **Cloud Functions**

Quando viene creata una Cloud Function, una nuova immagine docker viene inviata all'Artifact Registry del progetto. Ho provato a modificare l'immagine con una nuova e persino a eliminare l'immagine attuale (e l'immagine `cache`), ma nulla è cambiato, la cloud function continua a funzionare. Pertanto, potrebbe **essere possibile abusare di un attacco di Race Condition** come con il bucket per cambiare il contenitore docker che verrà eseguito, ma **modificare semplicemente l'immagine memorizzata non è possibile compromettere la Cloud Function**.

- **App Engine**

Anche se App Engine crea immagini docker all'interno dell'Artifact Registry. È stato testato che **anche se modifichi l'immagine all'interno di questo servizio** e rimuovi l'istanza di App Engine (quindi ne viene distribuita una nuova), il **codice eseguito non cambia**.\
Potrebbe essere possibile che eseguendo un **attacco di Race Condition come con i bucket potrebbe essere possibile sovrascrivere il codice eseguito**, ma questo non è stato testato.

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


Impara e pratica il 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;">\
Impara e pratica il 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;">
Impara e pratica il 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>Supporta HackTricks</summary>

- Controlla i [**piani di abbonamento**](https://github.com/sponsors/carlospolop)!
- **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
- **Condividi trucchi di hacking inviando PR ai** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos su github.

</details>

</div>