# GCP - Container Privesc

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

## container

### `container.clusters.get`

この権限により、次のような方法で**Kubernetes クラスターの認証情報を収集**できます:

<details><summary>Kubernetes クラスターの認証情報を取得</summary>
```bash
gcloud container clusters get-credentials <cluster_name> --zone <zone>
```
</details>

追加の権限がなければ、その資格情報はかなり基本的なもので、**リソースを一覧表示するだけ**の場合が多いですが、環境の設定ミスを見つけるのに役立ちます。

> [!NOTE]
> 注: **kubernetes clusters がプライベートに構成されている場合があります**。その場合、インターネットから Kube-API サーバーへのアクセスは許可されません。

この権限がない場合でもクラスターにアクセスできますが、クラスター情報を使って **自分専用の kubectl config file を作成する** 必要があります。新しく生成されたものは次のようになります:

<details><summary>例: kubectl config file for GKE cluster</summary>
```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
```
</details>

### `container.roles.escalate` | `container.clusterRoles.escalate`

**Kubernetes** はデフォルトで、プリンシパルが自身が持つ権限よりも多い権限を持つ **Roles** や **ClusterRoles** を **作成(create)** または **更新(update)** できないように **制限**します。しかし、**GCP** のプリンシパルがこれらの権限を持っていると、自身が保持しているものより多い権限を持つ Roles/ClusterRoles を作成/更新でき、Kubernetes のこの保護を実質的に回避できます。

`container.roles.create` および/または `container.roles.update`、または `container.clusterRoles.create` および/または `container.clusterRoles.update` が、それぞれこれらの特権昇格アクションを実行するために **さらに必要** です。

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

**Kubernetes** はデフォルトで、プリンシパルが自身の持つ権限より多い権限を付与する **RoleBindings** や **ClusterRoleBindings** を **作成(create)** または **更新(update)** できないように **制限**します。しかし、**GCP** のプリンシパルがこれらの権限を持っていると、自身が持つ権限より多い権限を持つ RoleBindings/ClusterRoleBindings を作成/更新でき、Kubernetes の保護を回避できます。

`container.roleBindings.create` および/または `container.roleBindings.update`、または `container.clusterRoleBindings.create` および/または `container.clusterRoleBindings.update` が、それぞれこれらの特権昇格を行うために必要です。

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

これらの権限はすべて、pod を定義できるリソースを **作成または更新** することを可能にします。pod を定義する際にアタッチされる **SA** と実行する **image** を指定できるため、SA の **token** を外部サーバへ **exfiltrate** するようなイメージを実行して、任意の Service Account にエスカレーションすることが可能です。\
For more information check:

GCP 環境にいる場合、metadata サービスから **nodepool GCP SA** を取得して、GCP における権限をエスカレートすることもできます（デフォルトでは compute SA が使用されます）。

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

As [**explained in this page**, ](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#listing-secrets)これらの権限があれば、Kubernetes のすべての **SAs** の **tokens** を **読み取る** ことができ、それらに対してエスカレーションできます。

### `container.pods.exec`

この権限があれば **pods** に対して **exec** でき、pod 内で動作するすべての **Kubernetes SAs** にアクセスして K8s 内での権限昇格が可能になります。さらに、**NodePool** の **GCP Service Account** を盗み、GCP での権限をエスカレートすることもできます。

### `container.pods.portForward`

このページで説明されているように、これらの権限があれば pod 内で動作しているローカルサービスにアクセスでき、それにより **Kubernetes**（場合によっては metadata サービスに到達できれば **GCP**）での権限昇格につながる可能性があります。

### `container.serviceAccounts.createToken`

権限名からは、K8s Service Accounts の **token** を生成できるように見えるため、Kubernetes 内の任意の **SA** に対して **privesc** できそうに思えます。しかし、それを利用する API エンドポイントは見つかりませんでした。見つけたら教えてください。

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

これらの権限は Kubernetes での権限昇格を引き起こす可能性がありますが、より現実的にはクラスタ内に **persist** するために悪用される可能性が高いです。\
For more information [**follow this link**](../../kubernetes-security/abusing-roles-clusterroles-in-kubernetes/index.html#malicious-admission-controller).

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