2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,其中就有远程代码执行漏洞(CVE-2017-12615)。当存在漏洞的Tomcat 运行在 Windows 主机上,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。
Apache Tomcat 7.0.0 – 7.0.79
首先声明的是CVE-2017-12615漏洞的利用条件是Windows+Tomcat 7.0.x+配置文件readonly=false
,配置文件内容如下:
init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
Tomcat将readonly设置为false的同时也开启了对PUT请求方式的支持。这时候意味着我们可以上传文件,那么是可以上传任意文件吗?并不是,我们首先要了解下Tomcat的下面两员大将:
org.apache.jasper.servlet.JspServlet:默认处理jsp,jspx文件请求,不存在PUT上传逻辑,无法处理PUT请求
org.apache.catalina.servlets.DefaultServlet:默认处理静态文件(除jsp,jspx之外的文件),存在PUT上传处理逻辑,可以处理PUT请求。
所以我们即使可以PUT一个文件到服务器但也无法直接PUT以jsp,jspx结尾文件,因为这些这些后缀的文件都是交由JspServlet处理的,它没法处理PUT请求。
但是当我们利用Windows特性以下面两种方式上传文件时,tomcat并不认为其是jsp文件从而交由DefaultServlet处理,从而成功创建jsp文件,这也就是所谓的CVE-2017-12615漏洞。
evil.jsp%20
evil.jsp::$DATA
除此之外当我们上传evil.jsp/ 类型的文件时(即以反斜杠结尾)时同样会成功创建jsp文件,并且这种方式把PUT漏洞的利用扩展到了Linux平台及Tomcat的5.x-9.x的所有版本。
漏洞环境,我们使用vulhub部署,部署方法,自行百度。
浏览器访问漏洞环境,并BP抓包
构造攻击请求,并发送
使用冰蝎连接
2020年2月20日,国家信息安全漏洞共享平台(CNVD)发布关于Apache Tomcat的安全公告,Apache Tomcat文件包含漏洞(CNVD-2020-10487,对应CVE-2020-1938)。Tomcat AJP协议由于存在实现缺陷导致相关参数可控,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件。若服务器端同时存在文件上传功能,攻击者可进一步实现远程代码的执行。
Apache Tomcat 6
Apache Tomcat 7 < 7.0.100
Apache Tomcat 8 < 8.5.51
Apache Tomcat 9 < 9.0.31
Tomcat服务器通过Connector连接器组件与客户程序建立连接,“连接器”表示接收请求并返回响应的端点。即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。
Tomcat默认在其配置文件server.xml中配置了两种connector:
HTTP connector
AJP connector
HTTP connector配置如下,它监听8080端口,负责建立HTTP连接。在通过浏览器访问Tomcat服务器的Web应用时,使用的就是这个
AJP连接器可以通过AJP协议和另一个web容器进行交互。它监听8009端口,负责和其他的HTTP服务器建立连接。在把Tomcat与其他HTTP服务器集成时,就需要用到这个连接器。AJP连接器可以通过AJP协议和一个web容器进行交互。默认情况下,tomcat配置完成后,在conf/server.xml文件中AJP connector服务在8009端口监听。
通过Gh0stcat漏洞,攻击者可以读取Tomcat下部署的所有webapp目录下的任意文件。同时,如果此应用在网站服务中具备上传功能,攻击者也可以先向服务端上传一个含有JSP代码的恶意文件(上传文件可以是任意类型,图片、纯文本文件等),然后利用Gh0stcat进行文件包含,从而达到代码执行的危害。
漏洞环境搭建使用vulhub。搭建完后,访问一下
下载POC文件https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi/
读取WEB-INF/web.xml文件
1、将Tomcat立即升级到9.0.31、8.5.51或7.0.100版本进行修复。
2、禁用AJP协议。
编辑 /conf/server.xml,找到如下行:
将此行注释掉(也可删掉该行):
配置secret来设置AJP协议的认证凭证。
例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):
北京时间2020年05月20日,Apache官方发布了 Apache Tomcat 远程代码执行 的风险通告,该漏洞编号为 CVE-2020-9484。
Apache Tomcat 是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。当Tomcat使用了自带session同步功能时,使用不安全的配置(没有使用EncryptInterceptor)会存在反序列化漏洞,攻击者通过精心构造的数据包, 可以对使用了自带session同步功能的Tomcat服务器进行攻击。
成功利用此漏洞需要同时满足以下4个条件:
1.攻击者能够控制服务器上文件的内容和文件名称
2.服务器PersistenceManager配置中使用了FileStore
3.PersistenceManager中的sessionAttributeValueClassNameFilter被配置为“null”,或者过滤器不够严格,导致允许攻击者提供反序列化数据的对象
4.攻击者知道使用的FileStore存储位置到攻击者可控文件的相对路径
Apache Tomcat 10.0.0-M1—10.0.0-M4
Apache Tomcat 9.0.0.M1—9.0.34
Apache Tomcat 8.5.0—8.5.54
Apache Tomcat 7.0.0—7.0.103
使用docker搭建
git clone https://github.com/masahiro331/CVE-2020-9484.git //下载环境
cd CVE-2020-9484
docker build -t tomcat:groovy . //创建镜像
docker run -d -p 8080:8080 tomcat:groovy //开启服务
直接执行POC通过JSESSION加载恶意的session持久化文件
curl 'http://192.168.10.171:8080/index.jsp' -H 'Cookie: JSESSIONID=../../../../../usr/local/tomcat/groovy'
进入容器验证
docker exec -it $CONTAINER /bin/bash
ls /tmp/rce
1、升级版本
升级到 Apache Tomcat 10.0.0-M5 及以上版本
升级到 Apache Tomcat 9.0.35 及以上版本
升级到 Apache Tomcat 8.5.55 及以上版本
升级到 Apache Tomcat 7.0.104 及以上版本
2、禁止使用Session持久化功能FileStore