# GCP - Container Privesc

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

## container

### `container.clusters.get`

Cette permission permet de **rassembler des identifiants pour le cluster Kubernetes** en utilisant quelque chose comme :
```bash
gcloud container clusters get-credentials <cluster_name> --zone <zone>
```
Sans autorisations supplémentaires, les identifiants sont assez basiques car vous pouvez **simplement lister certaines ressources**, mais ils sont utiles pour trouver des erreurs de configuration dans l'environnement.

> [!NOTE]
> Notez que **les clusters kubernetes peuvent être configurés pour être privés**, ce qui empêchera l'accès au serveur Kube-API depuis Internet.

Si vous n'avez pas cette autorisation, vous pouvez toujours accéder au cluster, mais vous devez **créer votre propre fichier de configuration kubectl** avec les informations des clusters. Un nouveau généré ressemble à ceci :
```yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data:  
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** par défaut **empêche** les principaux de pouvoir **créer** ou **mettre à jour** des **Roles** et **ClusterRoles** avec **plus de permissions** que celles que le principal possède. Cependant, un principal **GCP** avec ces permissions sera **capable de créer/mettre à jour des Roles/ClusterRoles avec plus de permissions** que celles qu'il détenait, contournant ainsi efficacement la protection de Kubernetes contre ce comportement.

**`container.roles.create`** et/ou **`container.roles.update`** OU **`container.clusterRoles.create`** et/ou **`container.clusterRoles.update`** respectivement sont **également** **nécessaires** pour effectuer ces actions d'escalade de privilèges.

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

**Kubernetes** par défaut **empêche** les principaux de pouvoir **créer** ou **mettre à jour** des **RoleBindings** et **ClusterRoleBindings** pour donner **plus de permissions** que celles que le principal possède. Cependant, un principal **GCP** avec ces permissions sera **capable de créer/mettre à jour des RoleBindings/ClusterRoleBindings avec plus de permissions** que celles qu'il a, contournant ainsi efficacement la protection de Kubernetes contre ce comportement.

**`container.roleBindings.create`** et/ou **`container.roleBindings.update`** OU **`container.clusterRoleBindings.create`** et/ou **`container.clusterRoleBindings.update`** respectivement sont également **nécessaires** pour effectuer ces actions d'escalade de privilèges.

### `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`

Toutes ces permissions vous permettront de **créer ou mettre à jour une ressource** où vous pouvez **définir** un **pod**. En définissant un pod, vous pouvez **spécifier le SA** qui va être **attaché** et l'**image** qui va être **exécutée**, vous permettant ainsi d'exécuter une image qui va **exfiltrer le token du SA vers votre serveur**, vous permettant d'escalader vers n'importe quel compte de service.\
Pour plus d'informations, consultez :

Étant dans un environnement **GCP**, vous pourrez également **obtenir le SA du nodepool GCP** à partir du service **metadata** et **escalader les privilèges dans GCP** (par défaut, le SA de calcul est utilisé).

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

Comme [**expliqué sur cette page**, ](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#listing-secrets) avec ces permissions, vous pouvez **lire** les **tokens** de tous les **SAs de kubernetes**, vous permettant ainsi de vous y escalader.

### `container.pods.exec`

Avec cette permission, vous pourrez **exec dans des pods**, ce qui vous donne **accès** à tous les **SAs Kubernetes exécutés dans des pods** pour escalader les privilèges au sein de K8s, mais vous pourrez également **voler** le **GCP Service Account** du **NodePool**, **escaladant les privilèges dans GCP**.

### `container.pods.portForward`

Comme **expliqué sur cette page**, avec ces permissions, vous pouvez **accéder aux services locaux** exécutés dans des **pods** qui pourraient vous permettre d'**escalader les privilèges dans Kubernetes** (et dans **GCP** si d'une manière ou d'une autre vous parvenez à communiquer avec le service metadata)**.**

### `container.serviceAccounts.createToken`

En raison du **nom** de la **permission**, il **semble que cela vous permettra de générer des tokens des K8s Service Accounts**, vous permettant ainsi de **privesc à n'importe quel SA** à l'intérieur de Kubernetes. Cependant, je n'ai pas trouvé d'endpoint API à utiliser, donc faites-moi savoir si vous le trouvez.

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

Ces permissions pourraient vous permettre d'escalader les privilèges dans Kubernetes, mais plus probablement, vous pourriez les abuser pour **persister dans le cluster**.\
Pour plus d'informations, [**suivez ce lien**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/#malicious-admission-controller).

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