GCP - Container Privesc
kontener
container.clusters.get
container.clusters.get
To uprawnienie pozwala na zebranie poświadczeń dla klastra Kubernetes za pomocą czegoś takiego jak:
Bez dodatkowych uprawnień, poświadczenia są dość podstawowe, ponieważ można tylko wyświetlić pewne zasoby, ale są one przydatne do znalezienia błędów konfiguracji w środowisku.
Zauważ, że klastry Kubernetes mogą być skonfigurowane jako prywatne, co uniemożliwia dostęp do serwera Kube-API z Internetu.
Jeśli nie masz tych uprawnień, nadal możesz uzyskać dostęp do klastra, ale musisz utworzyć własny plik konfiguracyjny kubectl z informacjami o klastrach. Nowo wygenerowany plik wygląda tak:
container.roles.escalate
| container.clusterRoles.escalate
container.roles.escalate
| container.clusterRoles.escalate
Domyślnie Kubernetes uniemożliwia podmiotom tworzenie lub aktualizowanie ról i clusterRól z większymi uprawnieniami niż te, które posiada podmiot. Jednak podmiot GCP posiadający te uprawnienia będzie mógł tworzyć/aktualizować role/clusterRole z większymi uprawnieniami niż te, które posiada, co umożliwia obejście ochrony Kubernetes przed tym zachowaniem.
Wymagane są również uprawnienia container.roles.create
i/lub container.roles.update
LUB container.clusterRoles.create
i/lub container.clusterRoles.update
do wykonania tych działań eskalacji uprawnień.
container.roles.bind
| container.clusterRoles.bind
container.roles.bind
| container.clusterRoles.bind
Domyślnie Kubernetes uniemożliwia podmiotom tworzenie lub aktualizowanie RoleBindings i ClusterRoleBindings w celu nadania większych uprawnień niż te, które posiada podmiot. Jednak podmiot GCP posiadający te uprawnienia będzie mógł tworzyć/aktualizować RoleBindings/ClusterRoleBindings z większymi uprawnieniami niż te, które posiada, co umożliwia obejście ochrony Kubernetes przed tym zachowaniem.
Wymagane są również uprawnienia container.roleBindings.create
i/lub container.roleBindings.update
LUB container.clusterRoleBindings.create
i/lub container.clusterRoleBindings.update
do wykonania tych działań eskalacji uprawnień.
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
Wszystkie te uprawnienia umożliwiają tworzenie lub aktualizowanie zasobu, w którym można zdefiniować pod. Definiując pod, można określić SA, który zostanie do niego dołączony, oraz obraz, który zostanie uruchomiony. Dzięki temu można uruchomić obraz, który wykradnie token SA do twojego serwera, umożliwiając eskalację do dowolnego konta usługi. Aby uzyskać więcej informacji, sprawdź:
Ponieważ jesteśmy w środowisku GCP, będziesz również mógł uzyskać SA nodepoola z usługi metadanych i eskalować uprawnienia w GCP (domyślnie używane jest SA obliczeniowe).
container.secrets.get
| container.secrets.list
container.secrets.get
| container.secrets.list
Z tymi uprawnieniami można odczytać tokeny wszystkich SA w Kubernetes, co umożliwia eskalację do nich.
container.pods.exec
container.pods.exec
Dzięki temu uprawnieniu będziesz mógł wykonać polecenie wewnątrz podów, co daje dostęp do wszystkich SA Kubernetes działających w podach, umożliwiając eskalację uprawnień w K8s. Będziesz również mógł ukraść GCP Service Account z NodePool, eskalując uprawnienia w GCP.
container.pods.portForward
container.pods.portForward
Z tymi uprawnieniami można uzyskać dostęp do lokalnych usług uruchomionych w podach, co może umożliwić eskalację uprawnień w Kubernetes (i w GCP, jeśli uda ci się somehow porozmawiać z usługą metadanych).
container.serviceAccounts.createToken
container.serviceAccounts.createToken
Ze względu na nazwę uprawnienia wydaje się, że umożliwia generowanie tokenów kont usług K8s, dzięki czemu będziesz mógł eskalować uprawnienia do dowolnego SA wewnątrz Kubernetes. Jednak nie znalazłem żadnego punktu końcowego API do jego użycia, więc daj mi znać, jeśli go znajdziesz.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
Te uprawnienia mogą umożliwić eskalację uprawnień w Kubernetes, ale bardziej prawdopodobne jest, że można je wykorzystać do trwałego pozostania w klastrze. Aby uzyskać więcej informacji, kliknij tutaj.
Last updated