GCP - Container Privesc
container
container.clusters.get
container.clusters.get
この権限を使用すると、次のような方法でKubernetesクラスターの資格情報を収集できます:
追加の権限がない場合、資格情報はかなり基本的ですが、いくつかのリソースをリストするだけできますが、環境のミス構成を見つけるのに役立ちます。
kubernetesクラスターはプライベートに構成されている可能性があることに注意してください。これにより、インターネットからKube-APIサーバーへのアクセスが拒否されます。
この権限がない場合でも、クラスターにアクセスすることはできますが、クラスターの情報を含む独自のkubectl構成ファイルを作成する必要があります。新しく生成されたものは次のようになります:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Kubernetesはデフォルトで、主体が持っている権限よりも多くの権限を持つ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はデフォルトで、主体が持っている権限よりも多くの権限を持つRoleBindingsおよびClusterRoleBindingsを作成または更新することを防ぎます。しかし、その権限を持つGCPの主体は、この振る舞いに対するKubernetesの保護をバイパスして、より多くの権限を持つRolesBindings/ClusterRolesBindingsを作成/更新することができます。
これらの特権昇格アクションを実行するには、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
これらの権限は、ポッドを定義できるリソースを作成または更新することを可能にします。ポッドを定義することで、アタッチされるSAと実行されるイメージを指定できます。したがって、SAのトークンをあなたのサーバーに漏洩させるイメージを実行して、任意のサービスアカウントに昇格することができます。 詳細は次を参照してください:
GCP環境にいるため、メタデータサービスからノードプールGCP SAを取得し、GCPで特権を昇格させることもできます(デフォルトではコンピュートSAが使用されます)。
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
これらの権限を持つと、このページでKubernetesのすべてのSAのトークンを読み取ることができるため、それらに昇格することができます。
container.pods.exec
container.pods.exec
この権限を持つと、ポッドにエグゼクティブできるため、K8s内で特権を昇格させるために実行されているKubernetes SAにアクセスできます。また、NodePoolのGCPサービスアカウントを盗むことができ、GCPで特権を昇格させることもできます。
container.pods.portForward
container.pods.portForward
これらの権限を持つと、ポッドで実行されているローカルサービスにアクセスでき、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