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

文章目录
  1. 1. 实验内容
    1. 1.0.1. 漏洞概述
    2. 1.0.2. 影响范围
  • 2. 实验环境
  • 3. 实验步骤
    1. 3.0.1. 第0步 漏洞验证
    2. 3.0.2. 第1步 靶机配置
    3. 3.0.3. 攻击机操作
    4. 3.0.4. 漏洞防护
      1. 3.0.4.1. 官方升级
      2. 3.0.4.2. 其他解决方案
    5. 3.0.5. 漏洞原理
    6. 3.0.6. 利用方式
  • 4. 参考链接
  • 实验内容

    漏洞概述

    2月20日,国家信息安全漏洞共享平台(CNVD)发布了Apache Tomcat文件包含漏洞(CNVD-2020-10487/CVE-2020-1938)。该漏洞是由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件。若目标服务器同时存在文件上传功能,攻击者可进一步实现远程代码执行。目前,厂商已发布新版本完成漏洞修复。

    Tomcat是Apache软件基金会中的一个重要项目,性能稳定且免费,是目前较为流行的Web应用服务器。由于Tomcat应用范围较广,因此本次通告的漏洞影响范围较大,请相关用户及时采取防护措施修复此漏洞。

    参考链接:

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

    影响范围

    受影响版本
    Apache Tomcat 6
    Apache Tomcat 7 < 7.0.100
    Apache Tomcat 8 < 8.5.51
    Apache Tomcat 9 < 9.0.31

    不受影响版本
    Apache Tomcat = 7.0.100
    Apache Tomcat = 8.5.51
    Apache Tomcat = 9.0.31

    实验环境

    • 攻击机:Kali Linux

    • 攻击机IP:192.168.40.132

    • 靶机:Windows10

    • 靶机IP:192.168.40.131

    实验步骤

    第0步 漏洞验证

    通常在Apache Tomcat官网下载的安装包名称中会包含有当前Tomcat的版本号,用户可通过查看解压后的文件夹名称来确定当前的版本。
    ![验证](Apache Tomcat文件包含漏洞(CVE-2020-1938)/BoardingPass_MyNameOnMars2020.png)

    如果解压后的Tomcat目录名称被修改过,可使用软件自带的version模块来获取当前的版本。进入Tomcat安装目录的bin目录,输入命令version.bat后,可查看当前的软件版本号。

    可知该版本在漏洞影响范围内。

    第1步 靶机配置

    在靶机上安装对应的JDK(从官网下载)。

    配置JAVA环境变量,右键我的电脑>属性>高级系统设置>环境变量。
    新建JAVA_HOME,填写如下路径

    1
    C:\Program Files\Java\jdk-10.0.2

    Path中添加如下路径

    1
    %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin

    靶机下载apache-tomcat-8.5.32(其他受影响版本也可),并配置环境变量。
    新建CATALINA_HOME,填写如下路径

    1
    C:\Users\Kwok\Desktop\apache-tomcat-8.5.32

    完成上述工作后,运行apache-tomcat-8.5.32/bin/startup.bat。并在浏览器地址栏输入http://127.0.0.1:8080 ,出现如下画面,说明tomcat配置成功。
    配置成功

    攻击机操作

    攻击机下载POC脚本:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi

    Poc文件

    为了方便验证,我们现在靶机apache-tomcat-8.5.32/webapps/ROOT下新建一个文件夹,以方便我们验证是否漏洞利用成功。

    然后我们在攻击机中执行POC脚本。

    1
    python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.40.131 -p 8009 -f test.txt

    执行成功

    可以看到漏洞利用成功。

    漏洞防护

    官方升级

    目前官方已在最新版本中修复了该漏洞,请受影响的用户尽快升级版本进行防护,官方下载链接:

    版本号         下载地址
    Apache Tomcat 7.0.100 http://tomcat.apache.org/download-70.cgi
    Apache Tomcat 8.5.51  http://tomcat.apache.org/download-80.cgi
    Apache Tomcat 9.0.31  http://tomcat.apache.org/download-90.cgi

    其他解决方案

    如果相关用户暂时无法进行版本升级,可根据自身情况采用下列防护措施。

    一、若不需要使用Tomcat AJP协议,可直接关闭AJP Connector,或将其监听地址改为仅监听本机localhost。
    编辑 /conf/server.xml,找到如下行( 为 Tomcat 的工作目录):

    1
    <!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->

    ![环境变量](Apache Tomcat文件包含漏洞(CVE-2020-1938)\20200303210458.png)
    将其删除或者注释掉即可。
    保存后需重新启动Tomcat,规则方可生效。

    二、若需使用Tomcat AJP协议,可根据使用版本配置协议属性设置认证凭证。
    使用Tomcat 7和Tomcat 9的用户可为AJP Connector配置secret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):

    1
    <Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>

    使用Tomcat 8的用户可为AJP Connector配置requiredSecret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):

    1
    <Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS"requiredSecret="YOUR_TOMCAT_AJP_SECRET" />

    漏洞原理

    以下内容来源于【WEB安全】Tomcat-Ajp协议漏洞分析

    tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip。
    如下图:

    tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性
    如下图:

    因此可以通过此种特性从而可以控制request对象的下面三个Attribute属性
    javax.servlet.include.request_uri
    javax.servlet.include.path_info
    javax.servlet.include.servlet_path

    然后封装成对应的request之后,继续走servlet的映射流程如下图所示:

    其中具体的映射方式就简略了,具体可以自己查看代码.

    利用方式

    1、利用DefaultServlet实现任意文件下载
    当url请求未在映射的url列表里面则会通过tomcat默认的DefaultServlet会根据上面的三个属性来读取文件
    如下图

    通过serveResource方法来获取资源文件

    通过getRelativePath来获取资源文件路径

    然后再通过控制ajp控制的上述三个属性来读取文件,通过操控上述三个属性从而可以读取到/WEB-INF下面的所有敏感文件,不限于class、xml、jar等文件。

    2、通过jspservlet实现任意后缀文件包含
    当url(比如http://xxx/xxx/xxx.jsp)请求映射在org.apache.jasper.servlet.JspServlet这个servlet的时候也可通过上述三个属性来控制访问的jsp文件如下图:

    控制路径之后就可以以jsp解析该文件 所以只需要一个可控文件内容的文件即可实现rce.

    参考链接

    https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ

    http://blog.nsfocus.net/cve-2020-1938/

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

    https://stackoverflow.com/questions/21757694/what-is-ajp-protocol-used-for