渗透测试:k8s的3种攻击手段(Kubernetes、未授权漏洞,端口:8080、6443、10250)
目錄
一、概覽
二、Kubernetes中的用戶
三、滲透思路?
1.?k8s api-server 8080未授權
2.?kubelet 10250端口未授權
3.?Service acount 高權限賬戶的風險
四、總結
一、概覽
云原生技術架構在帶來顛覆性技術架構變革的同時,也帶來了新的安全要求和挑戰。在過去幾年以及未來數年內,云原生架構會成為黑客攻擊和利用的重點。Kubernetes,簡稱k8s,是當前主流的容器調度平臺,更被稱為云原生時代的操作系統,可見其重要性。簡單來說,k8s是一個可移植的、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。本文從k8s用戶授權方面來談談針對k8s集群滲透的手法,如有不足之處,還望各位老師傅進行斧正。
二、Kubernetes中的用戶
Kubernetes 集群中包含兩類用戶:一類是由 Kubernetes 管理的 service account,另一類是普通用戶。普通用戶被假定為由外部獨立服務管理。管理員分發私鑰,用戶存儲(如?Keystone 或 Google 賬戶),甚至包含用戶名和密碼列表的文件。在這方面,Kubernetes 沒有代表普通用戶賬戶的對象。無法通過 API 調用的方式向集群中添加普通用戶。
相對的,service account 是由 Kubernetes API 管理的賬戶。它們都綁定到了特定的 namespace,并由 API server 自動創建,或者通過 API 調用手動創建。Service account 關聯了一套憑證,存儲在 Secret,這些憑證同時被掛載到 pod 中,從而允許 pod 與 kubernetes API 之間的調用。
API 請求被綁定到普通用戶或 serivce account 上,或者作為匿名請求對待。這意味著集群內部或外部的每個進程,無論從在工作站上輸入 kubectl 的人類用戶到節點上的 kubelet,到控制平面的成員,都必須在向 API Server 發出請求時進行身份驗證,或者被視為匿名用戶。
user
外部用戶是?k8s 中非常常見的一種訪問者身份,通常用于從 k8s 之外來訪問集群中的資源。因為這種資源的定位就是外部用戶,所以 k8s 是不會存儲 User 信息的,我們可以通過 Keystone 或者 Google Accounts 這種外部應用來管理。
group
同外部用戶,Group 也是一種外部的概念,在X509客戶端證書認證的方式中,Group 名字就是證書的組織名(Orgnization)
service account?
相對于外部用戶?User 而言,Service Account 則是集群內部的用戶,我們可以使用 k8s api 來查看和管理這種用戶。
anonymous
????????當一個請求沒有攜帶任何的認證信息時,它會自動獲得用戶名:system:anonymous和用戶組? ? ? ? ? system:unauthenticated,我們可以配置分配特定的權限給這種匿名用戶,適用于想要公開一? ? ? ? ? 些不敏感的資源等場景。kubelet 10250 未授權訪問、kube-apiserver 8080端口未授權訪? ? ? ? ? ? ? ? 問,? 皆屬于此種情況。
三、滲透思路?
1.?k8s api-server 8080未授權
部署在Master上暴露Kubernetes API,是Kubernetes的控制面。Kubernetes API服務器為API對象驗證和配置數據,這些對象包含Pod,Service,ReplicationController等等。API Server提供REST操作以及前端到集群的共享狀態,所有其他組件可以通過這些共享狀態交互。默認情況,Kubernetes API Server提供HTTP的兩個端口:8080,6443。insecure-port: 默認端口8080,在HTTP中沒有認證和授權檢查。secure-port :默認端口6443, 認證方式,令牌文件或者客戶端證書,如下圖訪問http://IP:8080
滲透思路:通過未授權的8080端口,可以讀寫kube-apiserver的api,創建掛載根目錄的特權DaemonSet實現控制集群的目的。
注:k8s DeamonSet會在集群中的每臺機器上創建一個
2.?kubelet 10250端口未授權
kubelet會在kubernetes集群中的每一個節點上運行一個實例,對容器進行生命周期的管理。kubelet開放的端口有:4194、10248、10250和10255。kubelet的10255端口提供了pod和node的信息。如果對外開放,攻擊者利用公開api可以獲取敏感信息。kubelet的10250端口是kubelet server 與 apiserver 通信的端口,定期請求 apiserver 獲取自己所應當處理的任務,通過該端口可以訪問獲取node資源以及狀態。如果kubelet的10250端口對外暴露,存在遠程命令執行漏洞。
滲透手法:用curl直接連接kublet的10250端口:curl –insecure -v -H “X-Stream-Protocol-Version: v2.channel.k8s.io” -H “X-Stream-Protocol-Version: channel.k8s.io” -X POST “https://IP:10250/exec/namespace/podID/containername?command=touch&command=/tmp/test&input=1&output=1&tty=1"
3.?Service acount 高權限賬戶的風險
k8s創建pod時,默認會把token、ca.crt、namespace三個文件掛載到pod內部,默認掛載到/run/secrets/kubernetes.io/serviceaccount目錄, 如果掛載到集群內的token具有創建pod的權限,可以通過token訪問集群的api創建特權容器,然后通過特權容器逃逸到宿主機,從而擁有集群節點的權限。如下圖這種權限控制有較大的風險,可以直接拿到集群權限:(激進一點的舉例,勿噴。相信各位運維小哥,不會犯這種錯誤。)
此種情況下有兩種滲透方式:
-
調用k8s sdk創建特權容器、掛載根目錄的容器
-
把kubectl 放到pod內,創建特權容器、掛載根目錄的容器
四、總結
本文從k8s api-server 8080端口未授權訪問、kubelet 10250端口未授權訪問、rbac權限三方面不安全配置,介紹了滲透k8s集群的方法。滲透集群手法還有很多種,后文再表。
總結
以上是生活随笔為你收集整理的渗透测试:k8s的3种攻击手段(Kubernetes、未授权漏洞,端口:8080、6443、10250)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: weblogic patch log显示
- 下一篇: CentOS下禁止防火墙