安全研究

CVE-2020-1938:Apache Tomcat服务器任意文件读取/包含漏洞通告

0x00  漏洞编号

CVE-2020-1938

CNVD-2020-10487 


0x01 漏洞概述

Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。

AJP协议是Tomcat为了动静资源处理分离时,通过该协议可以将css、js等静态资源请求转发到Apache的http服务器处理,提高并发量。

而本次漏洞被称作 Ghostcat(幽灵猫),其产生的原因是由于AJP 协议存在实现缺陷导致相关参数可控,攻击者通过AJP协议端口利用该漏洞进行文件读取或包含Tomcat上所有 webapp 目录下的任意文件,如Webapp 配置文件、源代码等。 


0x02 漏洞详情

Tomcat默认配置(conf/server.xml)中开启2个Connector,一个是8080端口对外提供HTTP协议,另一个是8009 端口对外提供AJP协议,两个端口默认开启。

在接收到AJP请求的时候,发现java/org/apache/coyote/ajp/AjpProcessor.java中的 prepareRequest() 函数的功能是对 AJP 协议进行解析,可以发现在处理 Constants.SC_A_REQ_ATTRIBUTE这部分内容时,代码中未进行内容校验,就将AJP里面的内容取出来设置成request对象的Attribute属性。因此,我们可以修改AJP请求的属性,进而控制request对象的下面三个Attribute属性,实现文件读取。


0x03 影响版本

Tomcat 6.*
Tomcat 7.* < 7.0.100
Tomcat 8.* < 8.5.51
Tomcat 9.* < 9.0.31


0x04 自检测试

1.在web管理页面左上方可查看当前所使用的Tomcat版本,若当前版本在受影响范围内,则可能存在安全风险。
2. Github上已经出现在野漏洞Poc,可以用该Poc测试是否存在漏洞,更加准确。地址https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi(注意:python版本为2.x,如果使用python3需要更改部分代码)


0x05 处置建议

1.官方已发布针对此漏洞的修复方案,Tomcat 6 已经停止维护:
https://tomcat.apache.org/download70.cgi
https://tomcat.apache.org/download80.cgi
https://tomcat.apache.org/download-90.cgi
2.临时处置方法:

为AJP Connector配置secret来设置 AJP 协议的认证凭证(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值)。

3. 未使用AJP协议的临时处置方法:

禁用AJP协议端口,在conf/server.xml配置文件中注释,并重启Tomcat服务。


0x06 时间线

2020/01/03:长亭科技向 Apache Tomcat 官方提交漏洞

2020/02/11:Apache Tomcat 官方发布 9.0.31、8.5.51 安全更新版本

2020/02/14:Apache Tomcat 官方发布 7.0.100 安全更新版本

2020/02/20:CNVD 发布安全通告

2020/02/20:长亭科技发布漏洞风险提示

 

0x07 参考链接

https://www.cnvd.org.cn/webinfo/show/5415

https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

https://github.com/Kit4y/CNVD-2020-10487-Tomcat-Ajp-lfi-Scanner



Copyright © 2019 All Rights Reserved Designed
杭州帕拉迪网络科技有限公司