GCP - Container Privesc

Support HackTricks

container

container.clusters.get

此权限允许使用类似的方式收集Kubernetes集群的凭据

gcloud container clusters get-credentials <cluster_name> --zone <zone>

在没有额外权限的情况下,凭据相当基本,因为您可以仅列出一些资源,但它们对于查找环境中的错误配置非常有用。

请注意,kubernetes 集群可能被配置为私有,这将禁止从互联网访问 Kube-API 服务器。

如果您没有此权限,仍然可以访问集群,但您需要创建自己的 kubectl 配置文件,其中包含集群信息。新生成的文件看起来像这样:

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 默认情况下 防止 主体能够 创建更新 角色集群角色,以拥有 比主体更高的权限。然而,具有该权限的 GCP 主体将能够 创建/更新具有更高权限的角色/集群角色,有效地绕过 Kubernetes 对此行为的保护。

container.roles.create 和/或 container.roles.updatecontainer.clusterRoles.create 和/或 container.clusterRoles.update 也是 执行这些权限提升操作所必需的

container.roles.bind | container.clusterRoles.bind

Kubernetes 默认情况下 防止 主体能够 创建更新 角色绑定集群角色绑定,以赋予 比主体更高的权限。然而,具有该权限的 GCP 主体将能够 创建/更新具有更高权限的角色绑定/集群角色绑定,有效地绕过 Kubernetes 对此行为的保护。

container.roleBindings.create 和/或 container.roleBindings.updatecontainer.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 时,您可以 指定将要附加的服务账户将要运行的镜像,因此您可以运行一个将 将服务账户的令牌导出到您的服务器 的镜像,从而使您能够提升到任何服务账户。 有关更多信息,请查看:

由于我们处于 GCP 环境中,您还将能够从 元数据 服务中 获取节点池 GCP 服务账户在 GCP 中提升权限(默认情况下使用计算服务账户)。

container.secrets.get | container.secrets.list

正如 本页所述,通过这些权限,您可以 读取 所有 Kubernetes 服务账户的令牌,因此您可以提升到它们。

container.pods.exec

通过此权限,您将能够 进入 pods 执行命令,这将使您 访问 所有 在 pods 中运行的 Kubernetes 服务账户,以在 K8s 中提升权限,但您还将能够 窃取 节点池的 GCP 服务账户在 GCP 中提升权限

container.pods.portForward

正如 本页所述,通过这些权限,您可以 访问在 pods 中运行的本地服务,这可能允许您 在 Kubernetes 中提升权限(如果您能够与元数据服务进行通信,则在 GCP 中也可以)。

container.serviceAccounts.createToken

由于 权限名称,它 看起来会允许您生成 K8s 服务账户的令牌,因此您将能够 在 Kubernetes 中提升到任何服务账户。然而,我找不到任何可以使用的 API 端点,所以如果您找到,请告诉我。

container.mutatingWebhookConfigurations.create | container.mutatingWebhookConfigurations.update

这些权限可能允许您在 Kubernetes 中提升权限,但更可能的是,您可以利用它们 在集群中持久化。 有关更多信息,请 点击此链接

Support HackTricks

Last updated