# GCP - Container Privesc

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

## container

### `container.clusters.get`

Ova dozvola omogućava **prikupljanje kredencijala za Kubernetes klaster** koristeći nešto poput:
```bash
gcloud container clusters get-credentials <cluster_name> --zone <zone>
```
Bez dodatnih dozvola, kredencijali su prilično osnovni jer možete **samo nabrojati neke resurse**, ali su korisni za pronalaženje pogrešnih konfiguracija u okruženju.

> [!NOTE]
> Imajte na umu da **kubernetes klasteri mogu biti konfigurisani da budu privatni**, što će onemogućiti pristup Kube-API serveru sa Interneta.

Ako nemate ovu dozvolu, i dalje možete pristupiti klasteru, ali morate **napraviti svoj vlastiti kubectl config fajl** sa informacijama o klasterima. Novi generisani izgleda ovako:
```yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVMRENDQXBTZ0F3SUJBZ0lRRzNaQmJTSVlzeVRPR1FYODRyNDF3REFOQmdrcWhraUc5dzBCQVFzRkFEQXYKTVMwd0t3WURWUVFERXlRMk9UQXhZVEZoWlMweE56ZGxMVFF5TkdZdE9HVmhOaTAzWVdFM01qVmhNR05tTkdFdwpJQmNOTWpJeE1qQTBNakl4T1RJMFdoZ1BNakExTWpFeE1qWXlNekU1TWpSYU1DOHhMVEFyQmdOVkJBTVRKRFk1Ck1ERmhNV0ZsTFRFM04yVXROREkwWmkwNFpXRTJMVGRoWVRjeU5XRXdZMlkwWVRDQ0FhSXdEUVlKS29aSWh2Y04KQVFFQkJRQURnZ0dQQURDQ0FZb0NnZ0dCQU00TWhGemJ3Y3VEQXhiNGt5WndrNEdGNXRHaTZmb0pydExUWkI4Rgo5TDM4a2V2SUVWTHpqVmtoSklpNllnSHg4SytBUHl4RHJQaEhXMk5PczFNMmpyUXJLSHV6M0dXUEtRUmtUWElRClBoMy9MMDVtbURwRGxQK3hKdzI2SFFqdkE2Zy84MFNLakZjRXdKRVhZbkNMMy8yaFBFMzdxN3hZbktwTWdKVWYKVnoxOVhwNEhvbURvOEhUN2JXUTJKWTVESVZPTWNpbDhkdDZQd3FUYmlLNjJoQzNRTHozNzNIbFZxaiszNy90RgpmMmVwUUdFOG90a0VVOFlHQ3FsRTdzaVllWEFqbUQ4bFZENVc5dk1RNXJ0TW8vRHBTVGNxRVZUSzJQWk1rc0hyCmMwbGVPTS9LeXhnaS93TlBRdW5oQ2hnRUJIZTVzRmNxdmRLQ1pmUFovZVI1Qk0vc0w1WFNmTE9sWWJLa2xFL1YKNFBLNHRMVmpiYVg1VU9zMUZIVXMrL3IyL1BKQ2hJTkRaVTV2VjU0L1c5NWk4RnJZaUpEYUVGN0pveXJvUGNuMwpmTmNjQ2x1eGpOY1NsZ01ISGZKRzZqb0FXLzB0b2U3ek05RHlQOFh3NW44Zm5lQm5aVTFnYXNKREZIYVlZbXpGCitoQzFETmVaWXNibWNxOGVPVG9LOFBKRjZ3SURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQWdRd0R3WUQKVlIwVEFRSC9CQVV3QXdFQi96QWRCZ05WSFE0RUZnUVU5UkhvQXlxY3RWSDVIcmhQZ1BjYzF6Sm9kWFV3RFFZSgpLb1pJaHZjTkFRRUxCUUFEZ2dHQkFLbnp3VEx0QlJBVE1KRVB4TlBNbmU2UUNqZDJZTDgxcC9oeVc1eWpYb2w5CllkMTRRNFVlVUJJVXI0QmJadzl0LzRBQ3ZlYUttVENaRCswZ2wyNXVzNzB3VlFvZCtleVhEK2I1RFBwUUR3Z1gKbkJLcFFCY1NEMkpvZ29tT3M3U1lPdWVQUHNrODVvdWEwREpXLytQRkY1WU5ublc3Z1VLT2hNZEtKcnhuYUVGZAprVVl1TVdPT0d4U29qVndmNUsyOVNCbGJ5YXhDNS9tOWkxSUtXV2piWnZPN0s4TTlYLytkcDVSMVJobDZOSVNqCi91SmQ3TDF2R0crSjNlSjZneGs4U2g2L28yRnhxZWFNdDladWw4MFk4STBZaGxXVmlnSFMwZmVBUU1NSzUrNzkKNmozOWtTZHFBYlhPaUVOMzduOWp2dVlNN1ZvQzlNUk1oYUNyQVNhR2ZqWEhtQThCdlIyQW5iQThTVGpQKzlSMQp6VWRpK3dsZ0V4bnFvVFpBcUVHRktuUTlQcjZDaDYvR0xWWStqYXhuR3lyUHFPYlpNZTVXUDFOUGs4NkxHSlhCCjc1elFvanEyRUpxanBNSjgxT0gzSkxOeXRTdmt4UDFwYklxTzV4QUV0OWxRMjh4N28vbnRuaWh1WmR6M0lCRU8KODdjMDdPRGxYNUJQd0hIdzZtKzZjUT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://34.123.141.28
name: gke_security-devbox_us-central1_autopilot-cluster-1
contexts:
- context:
cluster: gke_security-devbox_us-central1_autopilot-cluster-1
user: gke_security-devbox_us-central1_autopilot-cluster-1
name: gke_security-devbox_us-central1_autopilot-cluster-1
current-context: gke_security-devbox_us-central1_autopilot-cluster-1
kind: Config
preferences: {}
users:
- name: gke_security-devbox_us-central1_autopilot-cluster-1
user:
auth-provider:
config:
access-token: <access token>
cmd-args: config config-helper --format=json
cmd-path: gcloud
expiry: "2022-12-06T01:13:11Z"
expiry-key: "{.credential.token_expiry}"
token-key: "{.credential.access_token}"
name: gcp
```
### `container.roles.escalate` | `container.clusterRoles.escalate`

**Kubernetes** po defaultu **sprečava** principe da mogu da **kreiraju** ili **ažuriraju** **Roles** i **ClusterRoles** sa **više dozvola** nego što ih princip ima. Međutim, **GCP** princip sa tim dozvolama će moći da **kreira/ažurira Roles/ClusterRoles sa više dozvola** nego što ih ima, efikasno zaobilazeći zaštitu Kubernetes-a protiv ovog ponašanja.

**`container.roles.create`** i/ili **`container.roles.update`** ili **`container.clusterRoles.create`** i/ili **`container.clusterRoles.update`** su **takođe** **neophodni** za izvođenje tih akcija eskalacije privilegija.

### `container.roles.bind` | `container.clusterRoles.bind`

**Kubernetes** po defaultu **sprečava** principe da mogu da **kreiraju** ili **ažuriraju** **RoleBindings** i **ClusterRoleBindings** kako bi dali **više dozvola** nego što ih princip ima. Međutim, **GCP** princip sa tim dozvolama će moći da **kreira/ažurira RoleBindings/ClusterRoleBindings sa više dozvola** nego što ih ima, efikasno zaobilazeći zaštitu Kubernetes-a protiv ovog ponašanja.

**`container.roleBindings.create`** i/ili **`container.roleBindings.update`** ili **`container.clusterRoleBindings.create`** i/ili **`container.clusterRoleBindings.update`** su takođe **neophodni** za izvođenje tih akcija eskalacije privilegija.

### `container.cronJobs.create` | `container.cronJobs.update` | `container.daemonSets.create` | `container.daemonSets.update` | `container.deployments.create` | `container.deployments.update` | `container.jobs.create` | `container.jobs.update` | `container.pods.create` | `container.pods.update` | `container.replicaSets.create` | `container.replicaSets.update` | `container.replicationControllers.create` | `container.replicationControllers.update` | `container.scheduledJobs.create` | `container.scheduledJobs.update` | `container.statefulSets.create` | `container.statefulSets.update`

Sve ove dozvole će vam omogućiti da **kreirate ili ažurirate resurs** gde možete **definisati** **pod**. Definisanjem poda možete **navesti SA** koji će biti **priključen** i **sliku** koja će biti **pokrenuta**, tako da možete pokrenuti sliku koja će **izvući token SA na vaš server**, omogućavajući vam da eskalirate na bilo koji servisni nalog.\
Za više informacija pogledajte:

Kao što smo u GCP okruženju, takođe ćete moći da **dobijete nodepool GCP SA** iz **metadata** servisa i **eskalirate privilegije u GCP** (po defaultu se koristi compute SA).

### `container.secrets.get` | `container.secrets.list`

Kao što je [**objašnjeno na ovoj stranici**,](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#listing-secrets) sa ovim dozvolama možete **čitati** **tokene** svih **SA-ova u Kubernetes-u**, tako da možete eskalirati na njih.

### `container.pods.exec`

Sa ovom dozvolom moći ćete da **izvršite u podovima**, što vam daje **pristup** svim **Kubernetes SA-ovima koji rade u podovima** za eskalaciju privilegija unutar K8s, ali takođe ćete moći da **ukradete** **GCP servisni nalog** **NodePool-a**, **eskalirajući privilegije u GCP**.

### `container.pods.portForward`

Kao što je **objašnjeno na ovoj stranici**, sa ovim dozvolama možete **pristupiti lokalnim servisima** koji rade u **podovima** što može omogućiti da **eskalirate privilegije u Kubernetes-u** (i u **GCP** ako nekako uspete da komunicirate sa metadata servisom)**.**

### `container.serviceAccounts.createToken`

Zbog **imena** **dozvole**, **izgleda da će vam omogućiti da generišete tokene K8s servisnih naloga**, tako da ćete moći da **eskalirate na bilo koji SA** unutar Kubernetes-a. Međutim, nisam mogao da pronađem nijedan API endpoint za korišćenje, pa me obavestite ako ga pronađete.

### `container.mutatingWebhookConfigurations.create` | `container.mutatingWebhookConfigurations.update`

Ove dozvole bi mogle omogućiti eskalaciju privilegija u Kubernetes-u, ali verovatnije je da biste ih mogli zloupotrebiti da **persistirate u klasteru**.\
Za više informacija [**pratite ovaj link**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#malicious-admission-controller).

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