GCP - Container Privesc

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks

container

container.clusters.get

此权限允许使用类似下面的方法收集 Kubernetes 集群 的凭证

获取 Kubernetes 集群 凭证 ```bash gcloud container clusters get-credentials --zone ```

在没有额外权限的情况下,这些凭证作用相当有限,通常你只能列出某些资源,但它们对发现环境中的错误配置很有用。

Note

注意,kubernetes clusters 可能被配置为私有,这会阻止从互联网访问 Kube-API server。

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

GKE 集群的 kubectl 配置文件示例 ```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: 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 默认阻止主体创建或更新具有超出其自身权限的 RolesClusterRoles。然而,拥有该权限的 GCP 主体将能够创建/更新具有超过其当前权限的 Roles/ClusterRoles,从而有效绕过 Kubernetes 对此行为的防护。

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

container.roles.bind | container.clusterRoles.bind

Kubernetes 默认阻止主体创建或更新 RoleBindingsClusterRoleBindings 来授予超出其自身权限的权限。然而,拥有该权限的 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,因此你可以运行一个 image,将该 SA 的 token exfiltrate 到你的服务器,从而使你能够提升到任意服务账号。
更多信息请查看:

因为我们处于 GCP 环境,你还可以从 metadata service 获取 nodepool 的 GCP SA,并在 GCP 中提升权限(默认使用 compute SA)。

container.secrets.get | container.secrets.list

As explained in this page, 拥有这些权限你可以读取所有 Kubernetes SAs 的 token,从而可以提升到这些账号。

container.pods.exec

拥有此权限你将能够 exec 进入 pods,这使你可以访问运行在 pods 中的所有 Kubernetes SAs 以在 K8s 内提升权限,同时你也能够窃取 NodePool 的 GCP Service Account,从而在 GCP 提权。

container.pods.portForward

As explained in this page, 拥有这些权限你可以访问运行在 pods 中的本地服务,这些服务可能允许你在 Kubernetes 中提升权限(如果你能与 metadata service 通信,也可能在 GCP 中提权)。

container.serviceAccounts.createToken

从权限名称来看,它似乎允许你为 K8s Service Accounts 生成 token,因此你可以在 Kubernetes 内对任意 SA 提权。然而,我找不到任何可用的 API 端点来使用它,如果你发现了,请告诉我。

container.mutatingWebhookConfigurations.create | container.mutatingWebhookConfigurations.update

这些权限可能允许你在 Kubernetes 中提权,但更可能被滥用以在集群中实现持久化。
For more information follow this link.

Tip

学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE) 学习和实践 Azure 黑客技术:HackTricks Training Azure Red Team Expert (AzRTE)

支持 HackTricks