針對Kubernetes集群的攻擊與檢測
2023年4月24日,網絡安全行業年度盛會 RSA Conference在舊金山隆重開幕。這次RSAC中,InGuardians公司CEO Jay Beale及安全研究員Alana Trimble帶來了一個關于Kubernetes集群的攻擊和檢測議題Attacking and Detecting Attacks on Kubernetes Clusters。該議題通過演示DEF CON 30's Kubernetes CTF的解決方案,展示在Kubernetes集群中的攻擊和防御思路。
DEF CON 30's Kubernetes CTF與議題簡介
DEF CON 30's Kubernetes CTF以電影《Scott Pilgrim vs. the World》[1]為主題,是InGuardians公司舉辦的第二次Kubernetes CTF。
Kubernetes CTF為經驗豐富的Kubernetes攻擊者提供一個展示攻擊技巧的機會,并為新人提供一個學習Kubernetes安全的平臺。Kubernetes CTF的舉辦吸引了DEF CON社區中越來越多的研究人員關注Kubernetes安全。
議題《Attacking and Detecting Attacks on Kubernetes Clusters》[2]使用與DEF CON 30's Kubernetes CTF完全相同的CTF場景,給出了一個Kubernetes CTF解決方案。從一個 Kubernetes節點IP開始,在集群中Pod橫向移動,拿到所有的Flag。最后,議題給出了一些Kubernetes集群安全加固策略,并介紹了其公司的一款開源Kubernetes滲透工具。
Kubernetes CTF解決思路
尋找Flag之前先了解本屆Kubernetes CTF主題——《Scott Pilgrim vs. the World》。《Scott Pilgrim vs. the World》是一部2010年的動作喜劇電影。故事講述了年輕搖滾樂手Scott Pilgrim與他所愛的女孩——發型師Ramona Flowers相遇并熱戀,但在追求她的過程中,Scott需要先戰勝她的七個前男友(Matthew Patel、Lucas Lee、Todd Ingram、Roxy Richter、Ken Katayanagi、Kyle Katayanagi以及Gideon Graves)。接下來,筆者將按Flag順序介紹議題中給出的每個Flag的解決思路。
Flag1思路
1)使用端口掃描工具發現Kubernetes節點對外暴露的端口和服務;
2)使用目錄遍歷工具遍歷出節點對外暴露服務的api;
3)使用Fuzz工具遍歷出服務的請求參數,構造合適編碼的參數值;
4)通過反彈Shell拿到該服務對應Pod:matthew-patel的Shell,并在該Pod的文件系統中找到Flag1。
Flag2思路
1)在Pod:matthew-patel中找到SA Token:matthew-patel(ServiceAccount Token:matthew-patel)和Namespace:matthew-patel;
2)根據提示確定Namespace:lucas-lee,并確定Token:matthew-patel在Namespace:lucas-lee中可以執行的操作——List Pod;
3)進入Namespace:lucas-lee下的Pod:lucas-lee-vault-0中,通過反彈Shell拿到Pod:lucas-lee-vault-0的Shell;
4)在Pod:lucas-lee-vault-0中利用Vault工具找到Flag2。
Flag3思路
1)確定SA Token:lucas-lee在Namespace:lucas-lee中可執行的操作——List Secret;
2)通過List列出Namespace:lucas-lee中的Secret,得到Flag3及SA Token: stunt-team。
Flag4思路
1)確定SA Token:stunt-team在Namespace:todd-ingram中可執行的操作——Get/List Pod;
2)列出Namespace:todd-ingram所有Pod,根據Pod的describe信息確定Flag4所在的Pod:spilledcoffee;
3)進入Pod:spilledcoffee中,通過反彈Shell拿到Pod:spilledcoffee的Shell,找到Flag4及SA Token:juile。
Flag5思路
1)確定SA Token:julie在Namespace:todd-ingram中可執行的操作——List/Get/Update/Patch Service;
2)導出Service:envy的yaml配置文件,將該Service綁定的app selector修改為Pod:spilledcoffee的label——spilledcoffee;
3)根據提示,通過已經拿到shell的Pod:spilledcoffee,向修改后的Service發送HTTP請求拿到Flag5以及SA Token:todd。
Flag6思路
1)在Pod:spilledcoffee中利用nodejs的反序列化漏洞拿到Pod:envy-adam的shell;
2)在Pod:envy-adam的文件系統中找到Flag6、SA Token:envy-adam及下一個Flag提示的Namespace:roxy-richter。
Flag7思路
1)確定SA Token:envy-adam在Namespace:roxy-richter中可執行的操作——List Configmap;
2)列出所有Configmap,根據Name找到Flag7存在的Configmap:roxy-richter-flag;
3)以yaml格式查看Configmap:roxy-richter-flag拿到Flag7及下一個Flag提示的Namespace:katayanagi-twins。
Flag8思路
1)確定SA Token:envy-adam在Namespace:katayanagi-twins中可執行的操作——List/Get Pod;
2)進入Namespace:katayanagi-twins下的Pod:ninth-circle;
3)在Pod:ninth-circle的文件系統中找到Flag8。
Flag9思路
1)節點目錄/etc/kubernetes/manifests作為/manifests掛載到Pod:ninth-circle中;
2)將特權容器配置寫入/manifests創建“特權Pod”;
3)通過掛載節點的文件系統獲取Kubelet Token;
4)使用Kubelet Token進入Namespace:gideon-graves 的Pod:gideon-graves-chaos-theater中,在文件系統中找到Flag9。
Kubernetes安全加固策略
- 使用網絡策略(Kubernetes 本地防火墻規則)阻止傳出連接防止反彈shell。
- 使用Web應用程序防火墻(例如啟用modsecurity 的 ingress-nginx)來防止自動掃描,降低遠程命令執行的風險。
- 審核RBAC策略,確保ServiceAccount Token沒有過度權限。
- 停用將ServiceAccount Token自動掛載到Pod的功能。
- 使用Kyverno[3]、OPA Gatekeeper[4]等out-of-tree準入控制器,防止創建可以獲取/列出集群Secret的RBAC角色。
- 使用NameSpace隔離來減少用戶水平越權,修改其他用戶Service的風險。
- 使用服務網格(如Istio[5]、Linkerd[6]等)管理和監視不同微服務之間的通信,通過強制執行策略來增強安全性。
- 通過鏡像掃描和供應鏈保護來檢測易受攻擊的庫文件。
- 確保對敏感配置使用Secret,而不是Configmap。
- 考慮對敏感節點目錄進行文件完整性監控,如/etc/kubernetes/manifests。
- 使用Pod安全標準或其他準入控制器來防止節點目錄的HostPath安裝。
- 確保Kubernetes集群有審計策略,并捕獲日志。可以根據圖1來關聯日志內容與可能的攻擊事件。

圖1 攻擊路徑與API事件
Peirates
Peirates[7]是InGuardians公司開源的一款Kubernetes滲透工具,采用Golang編寫,可以運行在Kubernetes集群的容器內或外部的Kubernetes節點上。Peirates專注于權限提升和橫向移動,它可以自動竊取和收集Kubernetes集群內的ServiceAccount Token及Secret,進一步獲得代碼執行能力及對Kubernetes集群的控制能力。