GCP - Container Privesc
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
container.clusters.get
To uprawnienie pozwala na zbieranie poświadczeń dla klastra Kubernetes przy użyciu czegoś takiego jak:
Bez dodatkowych uprawnień, poświadczenia są dość podstawowe, ponieważ możesz po prostu wylistować niektóre zasoby, ale są przydatne do znajdowania błędów w konfiguracji w środowisku.
Zauważ, że klastry kubernetes mogą być skonfigurowane jako prywatne, co uniemożliwi 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
Kubernetes domyślnie zapobiega temu, aby podmioty mogły tworzyć lub aktualizować Role i ClusterRoles z większymi uprawnieniami niż te, które posiada podmiot. Jednak podmiot GCP z tymi uprawnieniami będzie mógł tworzyć/aktualizować Role/ClusterRoles z większymi uprawnieniami niż te, które posiada, skutecznie omijając ochronę Kubernetes przed tym zachowaniem.
container.roles.create
i/lub container.roles.update
LUB container.clusterRoles.create
i/lub container.clusterRoles.update
są również konieczne do wykonania tych działań eskalacji uprawnień.
container.roles.bind
| container.clusterRoles.bind
Kubernetes domyślnie zapobiega temu, aby podmioty mogły tworzyć lub aktualizować RoleBindings i ClusterRoleBindings, aby nadać więcej uprawnień niż te, które posiada podmiot. Jednak podmiot GCP z tymi uprawnieniami będzie mógł tworzyć/aktualizować RoleBindings/ClusterRolesBindings z większymi uprawnieniami niż te, które posiada, skutecznie omijając ochronę Kubernetes przed tym zachowaniem.
container.roleBindings.create
i/lub container.roleBindings.update
LUB container.clusterRoleBindings.create
i/lub container.clusterRoleBindings.update
są również konieczne 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
Wszystkie te uprawnienia pozwolą Ci tworzyć lub aktualizować zasób, w którym możesz zdefiniować pod. Definiując pod, możesz określić SA, który będzie przypisany oraz obraz, który będzie uruchamiany, dzięki czemu możesz uruchomić obraz, który wyeksfiltruje token SA na Twój serwer, umożliwiając Ci eskalację do dowolnego konta serwisowego. Aby uzyskać więcej informacji, sprawdź:
Ponieważ jesteśmy w środowisku GCP, będziesz również w stanie uzyskać SA nodepool GCP z usługi metadata i eskalować uprawnienia w GCP (domyślnie używany jest SA compute).
container.secrets.get
| container.secrets.list
Jak wyjaśniono na tej stronie, z tymi uprawnieniami możesz czytać tokeny wszystkich SA Kubernetes, więc możesz się do nich eskalować.
container.pods.exec
Dzięki temu uprawnieniu będziesz mógł wykonać polecenie w podach, co daje Ci dostęp do wszystkich SA Kubernetes działających w podach, aby eskalować uprawnienia w K8s, ale także będziesz mógł ukraść GCP Service Account z NodePool, eskalując uprawnienia w GCP.
container.pods.portForward
Jak wyjaśniono na tej stronie, z tymi uprawnieniami możesz uzyskać dostęp do lokalnych usług działających w podach, co może pozwolić Ci eskalować uprawnienia w Kubernetes (i w GCP, jeśli w jakiś sposób uda Ci się skontaktować z usługą metadata).
container.serviceAccounts.createToken
Z powodu nazwa uprawnienia, wydaje się, że pozwoli Ci to generować tokeny K8s Service Accounts, więc będziesz mógł eskalować do dowolnego SA wewnątrz Kubernetes. Jednak nie mogłem znaleźć żadnego punktu końcowego API, aby go użyć, więc daj mi znać, jeśli go znajdziesz.
container.mutatingWebhookConfigurations.create
| container.mutatingWebhookConfigurations.update
Te uprawnienia mogą pozwolić Ci na eskalację uprawnień w Kubernetes, ale bardziej prawdopodobne jest, że możesz je wykorzystać do utrzymania się w klastrze. Aby uzyskać więcej informacji, śledź ten link.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)