声明
请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。
一、漏洞原理
Linux内核的内存子系统在处理写入时复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。(A race condition was found in the way the Linux kernel’s memory subsystem handled the copy-on-write (COW) breakage of private read-only memory mappings.)
竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞。
二、漏洞概述及成因
该漏洞的原因是get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中,可能产出竞态条件造成COW过程被破坏,导致出现写数据到进程地址空间内只读内存区域的机会。当我们向带有MAP_PRIVATE标记的只读文件映射区域写数据时,会产生一个映射文件的复制(COW),对此区域的任何修改都不会写回原来的文件,如果上述的竞态条件发生,就能成功的写回原来的文件。比如我们修改su或者passwd程序就可以达到root的目的。
三、漏洞影响范围
Linux kernel >= 2.6.22(2007年发行,到2016年10月18日才修复)
四、先决条件
一个 CVE-2016-5195 易受攻击的系统
该程序已成功用于:
- RHEL7 Linux x86_64
- RHEL4(4.4.7-16)
- Debian 7("wheel")
- Ubuntu 14.04.1 LTS
- Ubuntu 14.04.5 LTS
- Ubuntu 16.04.1 LTS
- Ubuntu 16.10
- Linux Mint 17.2
并编译:
铿锵版本 4.0.0;
gcc 版本 6.2.0 20161005 (Ubuntu 6.2.0-5ubuntu12)
gcc 版本 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.1)
gcc 版本 4.8.5 20150623(红帽 4.8.5-4)(GCC);
gcc 版本 4.8.4 (Ubuntu 4.8.4);
gcc 版本 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
gcc 版本 4.7.2 (Debian 4.7.2-5);
gcc 版本 4.4.7(带有“旧”版本)
五、漏洞危害
低权限用户利用该漏洞可以在众多Linux系统上实现本地提权
六、本地复现
方法一
本地环境:Ubuntu 14.04.4 LTS
查看系统版本以及gcc版本是否在漏洞范围内
gcc -v
下载exp:https://github.com/gbonacini/CVE-2016-5195
使用 g++ -Wall -PEDANTIC -O2 -std=c++11 -pthread -o dcow dcow.cpp -lutil 或者直接输入 make 进行编译成可执行文件
接下来去执行./dcow -s
查看当前用户 id / whoami
方法二:
下载exp:https://github.com/FireFart/dirtycow
使用如下命令进行编译 gcc -pthread dirty.c -o exp -lcrypt
然后执行 ./exp 或者 ./exp new_password
执行完成,查看当前用户权限
cat /etc/passwd
成功提升到root权限!用户名为 firefart
漏洞深度分析请参考链接:https://www.anquanke.com/post/id/84851
总结
原理是利用exp获取了写入权限后,对/etc/passwd进行备份,然后对/etc/passwd进行重写,修改账户权限。优点方便快速。缺点受限与环境影响。某些环境下会失败。如果失败还是使用官方放出的exp,对/etc/passwd进行写入,写入前一定要记得先备份!