CVE-2020-1938 :Apache Tomcat AJP 漏洞复现和分析

  1. 漏洞说明

APache Tomcat 是有Apache软件基金会属下Jakarta项目开发的Servlet容器.默认情况下,Apache Tomcat会开启AJP连接器,方便与其他Web服务器通过AJP协议进行交互.Apache TomcatAJP协议的实现上存在漏洞,导致攻击者可以通过发送恶意的AJP请求,可以读取或者包含Web应用根目录下的任意文件,如果配合文件上传任意格式文件,将可能导致任意代码执行(RCE).该漏洞利用AJP服务端口实现攻击,未开启AJP服务对外不受漏洞影响(tomcat默认将AJP服务开启并绑定至0.0.0.0/0

  1. 漏洞影响范围

Apache Tomcat 9.x < 9.0.31

Apache Tomcat 8.x < 8.5.51

Apache Tomcat 7.x < 7.0.100

Apache Tomcat 6.x

  1. 漏洞原理及危害

Tomcat 配置了两个Connecto,它们分别是 HTTP AJP HTTP默认端口为8080,处理http请求,而AJP默认端口8009,用于处理 AJP 协议的请求,而AJPhttp更加优化,多用于反向、集群等,漏洞由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件以及可以包含任意文件,如果有某上传点,上传图片马等等,即可以获取shell。危害是攻击者可以读取 Tomcat所有 webapp目录下的任意文件。此外如果网站应用提供文件上传的功能,攻击者可以先向服务端上传一个内容含有恶意 JSP 脚本代码的文件(上传的文件本身可以是任意类型的文件,比如图片、纯文本文件等),然后利用 Ghostcat 漏洞进行文件包含,从而达到代码执行的危害。

  1. 环境搭建

目标机win7IP):192.168.91.132

攻击机kaliIP):192.168.91.128

Tomcat版本:8.5.32

Tomact下载链接:http://archive.apache.org/dist/tomcat/

1windows下漏洞复现环境准备,这里以tomcat-8.5.32为例。

https://github.com/backlion/CVE-2020-1938/blob/master/apache-tomcat-8.5.32.zip

2)安装jdk并配置JDK环境

3)然后启动tomcat,点击tomcat目录/bin 文件夹下的startup.bat

查看tomcat是否部署

 

  1. 漏洞利用

主机发现

 

端口扫描

 

下载读取文件的POC

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

 

输入参数并执行

可以看到已经成功读取了文章信息

 

  1. 漏洞分析

漏洞成因分析

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

 

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

如下图:

 

因此可以通过此种特性从而可以控制request对象的下面三个Attribute属性

javax.servlet.include.request_uri

javax.servlet.include.path_info

javax.servlet.include.servlet_path

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

 

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

利用方式:

利用DefaultServlet实现任意文件下载

url请求未在映射的url列表里面则会通过tomcat默认的DefaultServlet会根据上面的三个属性来读取文件,如下图

 

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

 

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

 

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

  1. 防御措施
  2. 禁用AJP协议,在tomcat安装路径中找到/conf/server.xml文件,删除或注释下面这行代码:<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

2.配置secret来设置AJP协议的认证凭证,如:<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>

3. 升级到tomcat最新版本,

官方下载最新版下载地址:

https://tomcat.apache.org/download-70.cgi

https://tomcat.apache.org/download-80.cgi

https://tomcat.apache.org/download-90.cgi

https://github.com/apache/tomcat/releases

参考链接:

https://blog.csdn.net/xixi_5418/article/details/105063614

https://www.cnblogs.com/backlion/p/12870365.html

 

posted on 2020-09-07 11:03  呀小王呀  阅读(588)  评论(0编辑  收藏  举报

导航