GCP - Container Privesc

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

container

container.clusters.get

Bu izin, aşağıdakine benzer bir şey kullanarak Kubernetes kümesi için kimlik bilgilerini toplamaya olanak sağlar:

Kubernetes kümesi kimlik bilgilerini al ```bash gcloud container clusters get-credentials --zone ```

Ek izinler olmadan, kimlik bilgileri oldukça basittir çünkü just list some resource, ancak ortamda yanlış yapılandırmaları bulmak için yine de faydalıdır.

Note

Not: kubernetes clusters might be configured to be private, bu durum İnternet’ten Kube-API sunucusuna erişimi engelleyecektir.

Eğer bu izne sahip değilseniz yine de cluster’a erişebilirsiniz, ancak cluster bilgileriyle create your own kubectl config file oluşturmanız gerekir. Yeni oluşturulan bir tane şu şekilde görünür:

Örnek kubectl config file for GKE cluster ```yaml 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: 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 varsayılan olarak principal’ların sahip oldukları izinlerden daha fazlasını içeren Roles ve ClusterRoles oluşturmasını veya güncellemesini engeller. Ancak, bu izinlere sahip bir GCP principal, sahip olduğu izinlerden daha fazla izne sahip Roles/ClusterRoles oluşturma/güncelleme yapabilecek; bu da Kubernetes’in bu korumasını etkisiz hale getirir.

container.roles.create ve/veya container.roles.update VEYA container.clusterRoles.create ve/veya container.clusterRoles.update ise bu privilege escalation eylemlerini gerçekleştirebilmek için ek olarak gerekli izinlerdir.

container.roles.bind | container.clusterRoles.bind

Kubernetes varsayılan olarak principal’ların sahip oldukları izinlerden daha fazlasını verecek şekilde RoleBindings ve ClusterRoleBindings oluşturmasını veya güncellemesini engeller. Ancak, bu izinlere sahip bir GCP principal, sahip olduğu izinlerden daha fazla izne sahip RolesBindings/ClusterRolesBindings oluşturup/güncelleyebilecek; bu da Kubernetes’in bu korumasını etkisizleştirir.

container.roleBindings.create ve/veya container.roleBindings.update VEYA container.clusterRoleBindings.create ve/veya container.clusterRoleBindings.update ise bu privilege escalation eylemlerini gerçekleştirebilmek için ek olarak gerekli izinlerdir.

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

Bu izinlerin tümü, bir pod tanımlayabileceğiniz bir kaynak oluşturmanıza veya güncellemenize izin verir. Bir pod tanımlayarak iliştirilecek SA’yı ve çalıştırılacak image’ı belirleyebilirsiniz; böylece SA token’ını sunucunuza exfiltrate edecek bir image çalıştırarak herhangi bir service account’a yükselme (escalate) yapabilirsiniz.
Daha fazla bilgi için bakınız:

Ortamımız GCP olduğu için, metadata servisinden nodepool GCP SA’yı alabilecek ve escalate privileges in GCP (by default the compute SA is used).

container.secrets.get | container.secrets.list

As explained in this page, with these permissions you can read the tokens of all the SAs of kubernetes, so you can escalate to them.

container.pods.exec

Bu izinle exec into pods yapabileceksiniz; bu, K8s içinde yetki yükseltme (privilege escalation) yapmak için pods içinde çalışan tüm Kubernetes SAs’lara erişim sağlar, ayrıca NodePool’un GCP Service Account’unu çalarak GCP’de ayrıcalıkları yükseltmenize de olanak tanır.

container.pods.portForward

As explained in this page, bu izinlerle pods içinde çalışan local servislerine erişebilir ve bu servisler aracılığıyla Kubernetes’te (ve eğer bir şekilde metadata service ile konuşabilirseniz GCP’de) ayrıcalık yükseltme yapmanıza olanak sağlayabilecek durumlara erişebilirsiniz).

container.serviceAccounts.createToken

Permission’ın ismi nedeniyle, K8s Service Accounts için token üretmenize izin verecekmiş gibi gözüküyor, bu yüzden Kubernetes içinde herhangi bir SA’ya privesc yapabileceğinizi düşünebilirsiniz. Ancak, bunu kullanmak için herhangi bir API endpoint bulamadım; eğer sizin bulduğunuz bir şey olursa haber verin.

container.mutatingWebhookConfigurations.create | container.mutatingWebhookConfigurations.update

Bu izinler Kubernetes içinde ayrıcalık yükseltmeye (escalate) izin verebilir, ama büyük olasılıkla cluster içinde persist in the cluster etmek için suistimal edilebilir.
Daha fazla bilgi için follow this link.

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin