GCP - Container Privesc
container
container.clusters.get
container.clusters.get
이 권한은 쿠버네티스 클러스터의 자격 증명을 수집할 수 있게 합니다. 예를 들어 다음과 같이 사용할 수 있습니다:
추가 권한 없이는 자격 증명이 매우 기본적입니다. 일부 리소스를 열거할 수만 있습니다, 그러나 환경에서 구성 오류를 찾는 데 유용합니다.
쿠버네티스 클러스터가 비공개로 구성될 수 있다는 점에 유의하십시오. 이는 인터넷에서 Kube-API 서버에 액세스하는 것을 금지합니다.
이 권한이 없더라도 클러스터에 액세스할 수 있지만, 클러스터 정보를 사용하여 자체 kubectl 구성 파일을 생성해야 합니다. 새로 생성된 파일은 다음과 같습니다:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Kubernetes는 기본적으로 주체(principals)가 가진 권한보다 더 많은 권한을 갖는 Roles 및 ClusterRoles를 생성하거나 업데이트하는 것을 방지합니다. 그러나 해당 권한을 가진 GCP 주체는 이러한 동작에 대한 Kubernetes 보호를 우회하여 더 많은 권한을 갖는 Roles/ClusterRoles를 생성/업데이트할 수 있습니다.
container.roles.create
및/또는 container.roles.update
또는 container.clusterRoles.create
및/또는 container.clusterRoles.update
또한 이러한 권한 상승 동작을 수행하는 데 필요합니다.
container.roles.bind
| container.clusterRoles.bind
container.roles.bind
| container.clusterRoles.bind
Kubernetes는 기본적으로 주체(principals)가 가진 권한보다 더 많은 권한을 부여하기 위해 RoleBindings 및 ClusterRoleBindings를 생성하거나 업데이트하는 것을 방지합니다. 그러나 해당 권한을 가진 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
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 환경에서는 메타데이터 서비스에서 nodepool GCP SA를 가져와 GCP에서 권한을 상승할 수도 있습니다(기본적으로 compute SA가 사용됨).
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
이 페이지에서 설명된대로, 이 권한을 사용하면 kubernetes의 모든 SA의 토큰을 읽을 수 있으므로 해당 SA로 상승할 수 있습니다.
container.pods.exec
container.pods.exec
이 권한을 사용하면 pod에 exec할 수 있어 pod에서 실행 중인 모든 Kubernetes SA에 액세스하여 K8s 내에서 권한을 상승할 수 있을 뿐만 아니라 NodePool의 GCP 서비스 계정을 도난할 수 있어 GCP에서 권한을 상승할 수 있습니다.
container.pods.portForward
container.pods.portForward
[이 페이지에서 설명된대로, ] 이 권한을 사용하면 pod에서 실행 중인 로컬 서비스에 액세스할 수 있어 Kubernetes 및 GCP에서 권한을 상승할 수 있습니다(메타데이터 서비스와 통신하는 방법을 찾는다면).
container.serviceAccounts.createToken
container.serviceAccounts.createToken
이 권한의 이름 때문에 K8s 서비스 계정의 토큰을 생성할 수 있을 것으로 보이므로 Kubernetes 내의 모든 SA로 상승할 수 있습니다. 그러나 해당 API 엔드포인트를 찾지 못했으므로 찾으면 알려주세요.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
이러한 권한은 Kubernetes에서 권한을 상승할 수 있지만 더 확실하게는 클러스터에 영속성을 유지할 수 있을 것입니다. 자세한 정보는 이 링크를 따르세요.
Last updated