Nginx本地权限提升(CVE-2016-1247)复现分析

Posted by sp4rk on March 1, 2017

0x01 复现分析

1.进入Ubuntu 发现为普通用户权限,输入su,密码root 切换至root权限下操作 ①查看生成日志文件的配置文件:

cat /etc/logrotate.d/nginx

nginx日志用logrotate命令自动切割 ②查看www-data权限:输入 cat /etc/passwd |grep www-data 发现返回www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin 2.切换至www-data用户操作 ①输入

sudo su -s /bin/bash www-dataroot切换至www-data

②查看日志文件的用户及组 输入

ls -ld /var/log/nginx/*

③打开tmp目录,执行exp 输入

```php./nginxed-root.sh /var/log/nginx/error.log

![](/img/g.jpg)
(由于logrotation脚本会在corn中每天6:25AM自动调用,因此如果/etc/logrotate.d/nginx已经设置了'daily'日志回滚,攻击者将在不需要任何系统管理员交互的情况下,在24小时内实现提权到ROOT)
看到出现Waiting for Nginx service to be restarted (-USR1) by logrotate called from cron.daily at 6:25am...时,我们可以直接调用logrotation脚本
3.重新打开一个终端
①切换至root (输入su,再输入root密码即可)
②调用logrotation脚本 输入

```php
logrotate -f /etc/logrotate.d/nginx 

执行以后,www-data权限就提升至root权限了 ③输入 whoami 查看当前权限已经为root

0x02 漏洞原理

Nginx 安装后分配的日志权限为安装时设定使用的用户权限,即“ …/log/nginx ”的目录权限为使用者权限,因此在实际运行过程中可以对目录下的文件进行操作。目录权限如下图所示: (输入ls -ld /var/log/nginx/*) 安装的Nginx会在/var/log/nginx路径使用www-data的权限新建Nginx日志目录。由上面的图可以发现Nginx目录下的error.log是root权限,本地用户可以通过symlink符号链接的方式替换为任意文件,由于Nginx在重启或收到USR1信号的时候会对链接到日志的文件进行写操作,因此可以使攻击者提权。USR1信号会由调用do_rotate()函数的logrotate脚本发送。而在默认安装的系统中,每天的 6 点 25 会执行 logrotate 脚本: 当时做的指导书:cve-2016-1247