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
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Artifact Registry
Per ulteriori informazioni su Artifact Registry consulta:
artifactregistry.repositories.uploadArtifacts
Con questo permesso un attaccante potrebbe caricare nuove versioni degli artefatti con codice malevolo come immagini 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
È 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):
- 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.
mkdir hello_world_library
cd hello_world_library
mkdir hello_world
touch hello_world/__init__.py
- 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!":
# hello_world/greet.py
def say_hello():
return "Hello, World!"
- Crea un file
setup.py
:
- Nella radice della tua directory
hello_world_library
, crea un filesetup.py
. - Questo file contiene metadati sulla tua libreria e dice a Python come installarla.
# 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:
- Costruisci il tuo pacchetto:
- Dalla radice della tua directory
hello_world_library
, esegui:
python3 setup.py sdist bdist_wheel
- 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>