# GCP - local privilege escalation ssh pivoting

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

in this scenario we are going to suppose that you **have compromised a non privilege account** inside a VM in a Compute Engine project.

Sorprendentemente, i permessi GPC del compute engine che hai compromesso possono aiutarti a **escalate privileges locally inside a machine**. Anche se questo non sarà sempre molto utile in un ambiente cloud, è bene sapere che è possibile.

## Leggi gli script <a href="#follow-the-scripts" id="follow-the-scripts"></a>

**Compute Instances** sono probabilmente lì per **eseguire alcuni script** per effettuare azioni con i loro service accounts.

Poiché IAM è molto granulare, un account può avere privilegi **read/write** su una risorsa ma **nessun privilegio di list**.

Un ottimo esempio ipotetico è una Compute Instance che ha il permesso di leggere/scrivere backup in un bucket di storage chiamato `instance82736-long-term-xyz-archive-0332893`.

Eseguire `gsutil ls` dalla riga di comando non restituisce nulla, poiché il service account non ha il permesso IAM `storage.buckets.list`. Tuttavia, se esegui `gsutil ls gs://instance82736-long-term-xyz-archive-0332893` potresti trovare un backup completo del filesystem, ottenendo accesso in chiaro a dati che il tuo account Linux locale non possiede.

Potresti essere in grado di trovare il nome di questo bucket all'interno di uno script (in bash, Python, Ruby...).

## Custom Metadata

Gli amministratori possono aggiungere [custom metadata](https://cloud.google.com/compute/docs/storing-retrieving-metadata#custom) a livello di **instance** e **project**. Questo è semplicemente un modo per passare **coppie chiave/valore arbitrarie in un'instance**, ed è comunemente usato per variabili d'ambiente e startup/shutdown scripts.

Inoltre, è possibile aggiungere **userdata**, che è uno script che verrà **eseguito ogni volta** che la macchina viene avviata o riavviata e che può essere **accessibile anche dall'endpoint dei metadata**.

For more info check:

{{#ref}}
https://book.hacktricks.wiki/en/pentesting-web/ssrf-server-side-request-forgery/cloud-ssrf.html
{{#endref}}

## **Abusing IAM permissions**

La maggior parte dei permessi proposti qui sotto sono **assegnati al default Compute SA,** l'unico problema è che lo **scope di accesso predefinito impedisce alla SA di usarli**. Tuttavia, se lo scope **`cloud-platform`** è abilitato o anche solo lo scope **`compute`** è abilitato, sarai **in grado di abusarne**.

Check the following permissions:

- [**compute.instances.osLogin**](gcp-compute-privesc/index.html#compute.instances.oslogin)
- [**compute.instances.osAdminLogin**](gcp-compute-privesc/index.html#compute.instances.osadminlogin)
- [**compute.projects.setCommonInstanceMetadata**](gcp-compute-privesc/index.html#compute.projects.setcommoninstancemetadata)
- [**compute.instances.setMetadata**](gcp-compute-privesc/index.html#compute.instances.setmetadata)
- [**compute.instances.setIamPolicy**](gcp-compute-privesc/index.html#compute.instances.setiampolicy)

## Cerca chiavi nel filesystem

Controlla se altri utenti hanno effettuato il login con gcloud all'interno della macchina e lasciato le loro credenziali nel filesystem:

<details><summary>Cerca credenziali gcloud nel filesystem</summary>
```
sudo find / -name "gcloud"
```
</details>

Questi sono i file più interessanti:

- `~/.config/gcloud/credentials.db`
- `~/.config/gcloud/legacy_credentials/[ACCOUNT]/adc.json`
- `~/.config/gcloud/legacy_credentials/[ACCOUNT]/.boto`
- `~/.credentials.json`

### Altre regex per API Keys

<details><summary>Pattern grep per credenziali e chiavi GCP</summary>
```bash
TARGET_DIR="/path/to/whatever"

# Service account keys
grep -Pzr "(?s){[^{}]*?service_account[^{}]*?private_key.*?}" \
"$TARGET_DIR"

# Legacy GCP creds
grep -Pzr "(?s){[^{}]*?client_id[^{}]*?client_secret.*?}" \
"$TARGET_DIR"

# Google API keys
grep -Pr "AIza[a-zA-Z0-9\\-_]{35}" \
"$TARGET_DIR"

# Google OAuth tokens
grep -Pr "ya29\.[a-zA-Z0-9_-]{100,200}" \
"$TARGET_DIR"

# Generic SSH keys
grep -Pzr "(?s)-----BEGIN[ A-Z]*?PRIVATE KEY[a-zA-Z0-9/\+=\n-]*?END[ A-Z]*?PRIVATE KEY-----" \
"$TARGET_DIR"

# Signed storage URLs
grep -Pir "storage.googleapis.com.*?Goog-Signature=[a-f0-9]+" \
"$TARGET_DIR"

# Signed policy documents in HTML
grep -Pzr '(?s)<form action.*?googleapis.com.*?name="signature" value=".*?">' \
"$TARGET_DIR"
```
</details>

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