GCP - Container Privesc

htARTE (HackTricks AWS Red Team Expert)를 통해 제로에서 영웅까지 AWS 해킹을 배워보세요!

HackTricks를 지원하는 다른 방법:

컨테이너

container.clusters.get

이 권한은 Kubernetes 클러스터의 자격 증명을 수집하는 데 사용할 수 있습니다. 다음과 같은 방법으로 사용할 수 있습니다:

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

추가 권한이 없으면 자격 증명은 매우 기본적입니다. 일부 리소스를 열거할 수만 있습니다. 그러나 이는 환경에서 잘못된 구성을 찾는 데 유용합니다.

참고로 쿠버네티스 클러스터는 비공개로 구성될 수 있으며, 이는 인터넷에서 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는 주체가 가지고 있는 권한보다 더 많은 권한을 가진 RolesClusterRoles생성하거나 업데이트하는 것을 방지합니다. 그러나 이러한 권한을 가진 GCP 주체는 Kubernetes의 이러한 동작에 대한 보호를 우회하여 더 많은 권한을 가진 Roles/ClusterRoles을 생성/업데이트할 수 있습니다.

이러한 권한을 수행하기 위해서는 container.roles.create 및/또는 container.roles.update 또는 container.clusterRoles.create 및/또는 **container.clusterRoles.update**도 필요합니다.

container.roles.bind | container.clusterRoles.bind

기본적으로 Kubernetes는 주체가 가지고 있는 권한보다 더 많은 권한을 가진 RoleBindingsClusterRoleBindings을 생성하거나 업데이트하는 것을 방지합니다. 그러나 이러한 권한을 가진 GCP 주체는 Kubernetes의 이러한 동작에 대한 보호를 우회하여 더 많은 권한을 가진 RoleBindings/ClusterRoleBindings을 생성/업데이트할 수 있습니다.

이러한 권한을 수행하기 위해서는 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실행될 이미지를 지정할 수 있으므로, SA의 토큰을 서버로 유출시키는 이미지를 실행하여 모든 서비스 계정으로 승격할 수 있습니다. 자세한 정보는 다음을 참조하십시오:

GCP 환경에서는 메타데이터 서비스에서 노드풀 GCP SA를 가져올 수 있으며, 이를 통해 GCP에서 권한을 승격할 수 있습니다(기본적으로 compute SA가 사용됩니다).

container.secrets.get | container.secrets.list

이러한 권한을 사용하면 이 페이지에서 설명한대로 Kubernetes의 모든 SA의 토큰읽을 수 있으므로, 승격할 수 있습니다.

container.pods.exec

이 권한을 사용하면 pod에 실행할 수 있으며, 이를 통해 K8s 내에서 권한을 승격할 수 있는 모든 Kubernetes SA에 액세스할 수 있습니다. 또한 NodePoolGCP 서비스 계정훔칠 수 있어 GCP에서 권한을 승격할 수 있습니다.

container.pods.portForward

이 권한을 사용하면 이 페이지에서 설명한대로 pod에서 실행 중인 로컬 서비스액세스할 수 있으며, 이를 통해 Kubernetes(및 GCP)에서 권한을 승격할 수 있습니다.

container.serviceAccounts.createToken

이 권한의 이름으로 보아 K8s 서비스 계정의 토큰을 생성할 수 있을 것으로 보입니다. 따라서 Kubernetes 내의 모든 SA로 권한 상승이 가능합니다. 그러나 해당 API 엔드포인트를 찾지 못했으므로 찾으면 알려주세요.

container.mutatingWebhookConfigurations.create | container.mutatingWebhookConfigurations.update

이러한 권한은 Kubernetes에서 권한 상승이 가능할 수 있지만, 더 자주 클러스터에 영속성을 유지하기 위해 악용될 수 있습니다. 자세한 정보는 이 링크를 따르세요.

最終更新