freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

K8S攻击面与检测规则实现
2024-10-11 20:27:43
所属地 北京

背景

由于微服务基本都是基于k8s的、故针对k8s的检测产生了如下文章、本文章只是给出了基础攻击的检测、部分工具检测原理一致。本文攻击方面直接参考先知原文未修改,特此感谢。

一、8080端口未授权访问

条件

1、k8s版本小于1.16.0

2、8080对公网开放

1、如何打开和关闭8080端口

测试了几个版本的k8s,发现在新版本后,–insecure-port=8080配置默认就关闭了

cd /etc/kubernetes/manifests
vim kube-apiserver.yaml

1728618964_6708a1d4eb46e2e2aa058.png!small?1728618966716

这里设置为0表示关闭,甚至在高版本的k8s中,直接将--insecure-port这个配置删除了,需要手动添加

这里将修改为8080,并添加配置

- --insecure-port=8080
- --insecure-bind-address=0.0.0.0
systemctl restart kubelet

上述就是打开8080端口的方法

1728618985_6708a1e9cf51a44cdfcbb.png!small?1728618988283

1728619011_6708a203e73b0b864f2f3.png!small?1728619013969

1.1 8080/6443端口匿名用户访问pod操作日志DSL语法

以任意工具以匿名用户访问或者pods、secrets、namespace并且来源IP不是堡垒机的都进行告警

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "parsed_data.verb": [
              "list",
              "get"
            ]
          }
        },
        {
          "term": {
            "parsed_data.user.username": "system:anonymous"
          }
        },
        {
          "term": {
            "parsed_data.objectRef.name": "pods"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "parsed_data.sourceIPs": "10.211.55.3"
          }
        }
      ]
    }
  }
}

1728619035_6708a21b6b8e124dcabc1.png!small?1728619036454

2、执行命令-通过kubectl -s命令

kubectl -s ip:8080 get node

获取Pods

kubectl -s 127.0.0.1:8080 get pods

1728619069_6708a23d3bfa71c3c3ff5.png!small?1728619071386

1728619087_6708a24f580a33c3460f4.png!small?1728619088707

执行命令

kubectl -s 127.0.0.1:8080 --namespace=default exec -it nginxfromuzju-59595f6ffc-p8xvk bash

1728619112_6708a268b97c6a2054bb4.png!small?1728619114009

Tips: 在高版本的k8s中,这种方法是不行的,连不上去

2.1 通过8080/6443 exec进入pod

选择不是来自堡垒机IP10.211.55.3的执行了exec进入了pod、这里并没有以匿名用户或者指定的凭据来访问,也可对匿名用户单独做告警

{
    "query": {
        "bool": {
            "must": [
                {
                    "wildcard": {
                        "parsed_data.requestURI.keyword": "/api/v1/namespaces/default/pods/*/exec*"
                    }
                },
                {
                    "term": {
                        "parsed_data.objectRef.subresource": "exec"
                    }
                },
                {
                    "term": {
                        "parsed_data.verb": "create"
                    }
                }
            ],
            "must_not": [
                {
                    "term": {
                        "parsed_data.sourceIPs": "10.211.55.3"
                    }
                }
            ]
        }
    }
}

1728619134_6708a27e11cdbd67f282d.png!small?1728619135083

3、获取service-account-token

可以通过访问api来获取token

/api/v1/namespaces/kube-system/secrets/

1728619154_6708a292117fd94686f84.png!small?1728619155208

3.1 获取secrets检测

当用户访问所有的secrets

{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "parsed_data.verb": [
              "list",
              "get"
            ]
          }
        },
        {
          "match_phrase": {
            "parsed_data.requestURI": "/api/v1/secrets"
          }
        },
        {
          "term": {
            "parsed_data.objectRef.resource": "secrets"
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "parsed_data.sourceIPs": "10.211.55.3"
          }
        }
      ]
    }
  }
}

当用户访问具体的namespace的secrets规则

GET /k8s-audit-log-2024.09.13/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_phrase_prefix": {
            "parsed_data.requestURI": "/api/v1/"
          }
        },
        {
          "match_phrase": {
            "parsed_data.requestURI": "/secrets"
          }
        },
        {
          "term": {
            "parsed_data.verb": "get"
          }
        },
        {
          "term": {
            "parsed_data.objectRef.name": "secrets"
          }
        }
      ],
      "must_not": [
        {"term": {
          "parsed_data.sourceIPs": "10.211.55.3"
        }}
      ]
    }
  }
}

3、获取宿主机权限-通过k8s dashboard,创建特权Pods

为什么会出现这个问题:因为在启动dashborad的时候,管理员为了方便,修改了配置,跳过了登录

安装dashborad

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
vim recommended.yam

1728619179_6708a2abdd7757c993439.png!small?1728619181485

需要添加两个参数,一个是不需要登录,一个是绑定0.0.0.0地址

- --enable-skip-login
- -- insecure-bind-address=0.0.0.0
kubectl apply -f recommended.yaml

1728619199_6708a2bf40989812fae07.png!small?1728619200440

这里使用国际友人的配置快速启动

wget https://gist.githubusercontent.com/tejaswigk/da57d7911284cbf56e7f99af0afd6884/raw/de38da2a7619890a72d643d2bbd94278221e5977/insecure-kubernetes-dashboard.yml
kubectl apply -f insecure-kubernetes-dashboard.yml
 kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard  9090:80
# web安全 # 企业安全 # k8s
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录