CVE-2017-12615
调试
漏洞名称:
- 远程代码执行漏洞
影响版本:
Apache Tomcat 7.0.0-7.0.81
漏洞详情:
-
当
Tomcat
运行在Windows
操作系统时,且启用了HTTP PUT
请求方法(例如,将readonly
初始化参数由默认值设置为false
),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的JSP
文件,JSP
文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。 -
通过以上两个漏洞可在用户服务器上执行任意代码,从而导致数据泄漏或获取服务器权限,存在高安全风险。
漏洞分析:
-
在
Windows
服务器上,若Tomca
t配置文件中的readonly
参数设置为false
时,则可通过HTTP PUT
请求方法来创建JSP
文件,造成任意代码执行漏洞。 -
那是指当
readonly
设置为false
时,就可以通过HTTP PUT
方法来上传jsp
文件么? -
不是这样的,这里要提到
DefaultServlet
和JspServlet
,DefaultServlet
的作用是处理静态文件,而JspServlet
的作用是处理jsp
和jspx
文件的请求,以下是默认配置情况:
-
DefaultServlet
可以处理PUT
或DELETE
请求,而JspServlet
中没有PUT
上传的逻辑,PUT
的代码实现只存在于DefaultServlet
中。所以这个漏洞需要给jsp
文件构造特殊后缀名,绕过tomcat
检测,让它用DefaultServlet
的逻辑去处理请求,从而上传jsp
文件。
漏洞复现
漏洞环境:vulhub
0x01
运行docker-compose up -d
启动一个容器
0x02
运行docker ps
可以看到容器已经跑起来了,至此,漏洞环境已经搭建好
0x03
进到该容器中
0x04
查看conf
文件夹下的web.xml
文件,发现readonly
默认设置为true
,可以通过PUT/DELETE
进行文件操控
0x05
在该配置文件中,我们把readonly
设置为false
0x06
接下来就是构造数据包的问题了,在构造数据包时,需要构造绕过检测的jsp
文件名,查阅资料,有以下三种方式:
(1)test.jsp%20
//针对Apache Tomcat 7.0.0-7.0.81
(2)test.jsp:$DATA
//针对Apache Tomcat 7.0.0-7.0.81
(3)test.jsp/
任意版本,所以这种利用方法不属于该CVE
漏洞,但利用方式相同
由于我测试的漏洞环境中Apache Tomcat
版本是8.x
的,所以使用第三种文件名绕过方法。
0x07
返回201
,可以看到文件上传成功,文件可以上传成功,所以在文件中写入恶意可执行代码上传进行测试:
利用msf
生成payload
反弹shell
,名为shell.jsp
,设置反弹shell
的端口为7777
0x08
构造PUT
方法的数据包,将shell.jsp
上传
0x09
开启对应7777
端口进行监听,因为设置的反弹shell
端口为7777
0x0a
在浏览器访问上传的shell.jsp
文件,http://172.18.0.2:8080/shell.jsp,可以看到返回了shell
,到此,获得了服务器的最高权限root
。
漏洞防护:
1、配置conf/web.xml
文件的readonly
为true
2、如果没有业务需求,禁用PUT
方法
3、升级Apache Tomcat
版本
3、使用WAF
网友评论