跳过正文
  1. Posts/

Tomcat 爆出高危漏洞!

·794 字·4 分钟·
Kubehan
作者
Kubehan
云原生知识栈:深度解析容器技术、Kubernetes、Istio、DevOps 实践、Prometheus 监控、Envoy 代理、Golang 开发及云原生架构与微服务趋势的专业博客
一、漏洞背景

安全公告编号:CNTA-2020-0004

2020年02月20日, 360CERT 监测发现 国家信息安全漏洞共享平台(CNVD) 收录了 CNVD-2020-10487 Apache Tomcat文件包含漏洞。

CNVD-2020-10487/CVE-2020-1938是文件包含漏洞,攻击者可利用该高危漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码等

受影响的版本包括:Tomcat 6,Tomcat 7的7.0.100以下版本,Tomcat 8的8.5.51以下版本,Tomcat 9的9.0.31以下版本。

CNVD 对该漏洞的综合评级为“高危”。

 

二、影响版本

1、Apache Tomcat 9.x < 9.0.31
         2、Apache Tomcat 8.x < 8.5.51
        3、Apache Tomcat 7.x < 7.0.100
        4、Apache Tomcat 6.x

三、漏洞分析

3.1 AJP Connector

Apache Tomcat服务器通过Connector连接器组件与客户程序建立连接,Connector表示接收请求并返回响应的端点。即Connector组件负责接收客户的请求,以及把Tomcat服务器的响应结果发送给客户。

在Apache Tomcat服务器中我们平时用的最多的8080端口,就是所谓的Http Connector,使用Http(HTTP/1.1)协议

conf/server.xml文件里,他对应的配置为:

<span style="color: #abb2bf; background: rgba(0, 0, 0, 0); display: inline; width: 303px; text-decoration: none solid #abb2bf; font-weight: 400; font-style: normal;"><<span style="color: #e06c75; background: rgba(0, 0, 0, 0); display: inline; width: 65px; text-decoration: none solid #e06c75; font-weight: 400; font-style: normal;">Connector</span> <span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 29px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">port</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 44px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"8080"</span> <span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 58px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">protocol</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 72px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"HTTP/1.1"</span>
               
<span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 123px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">        connectionTimeout</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 51px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"20000"
</span>
       <span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 87px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">redirectPort</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 43px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"8443"</span> /></span>

而 AJP Connector,它使用的是 AJP 协议(Apache Jserv Protocol)是定向包协议。因为性能原因,使用二进制格式来传输可读性文本,它能降低 HTTP 请求的处理成本,因此主要在需要集群、反向代理的场景被使用。

Ajp协议对应的配置为:

<span style="color: #abb2bf; background: rgba(0, 0, 0, 0); display: inline; width: 462px; text-decoration: none solid #abb2bf; font-weight: 400; font-style: normal;"><<span style="color: #e06c75; background: rgba(0, 0, 0, 0); display: inline; width: 65px; text-decoration: none solid #e06c75; font-weight: 400; font-style: normal;">Connector</span> <span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 29px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">port</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 44px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"8009"</span> <span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 58px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">protocol</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 65px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"AJP/1.3"</span> 
<span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 87px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">redirectPort</span>=<span style="color: #98c379; background: rgba(0, 0, 0, 0); display: inline; width: 44px; text-decoration: none solid #98c379; font-weight: 400; font-style: normal;">"8443"</span> /></span>

Tomcat服务器默认对外网开启该端口 Web客户访问Tomcat服务器的两种方式:

public_image

3.2 代码分析

漏洞产生的主要位置在处理Ajp请求内容的地方org.apache.coyote.ajp.AbstractAjpProcessor.java#prepareRequest()

这里首先判断SCAREQ_ATTRIBUTE,意思是如果使用的Ajp属性并不在上述的列表中,那么就进入这个条件

public_image

SCAREQREMOTEPORT对应的是AJPREMOTEPORT,这里指的是对远程端口的转发,Ajp13并没有转发远程端口,但是接受转发的数据作为远程端口。

public_image

于是这里我们可以进行对Ajp设置特定的属性,封装为request对象的Attribute属性 比如以下三个属性可以被设置:

<span style="color: #e06c75; background: rgba(0, 0, 0, 0); display: inline; width: 36px; text-decoration: none solid #e06c75; font-weight: 400; font-style: normal;">javax</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 58px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.servlet</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 57px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.include</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 87px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.request_uri</span>

<span style="color: #e06c75; background: rgba(0, 0, 0, 0); display: inline; width: 36px; text-decoration: none solid #e06c75; font-weight: 400; font-style: normal;">javax</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 58px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.servlet</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 57px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.include</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 73px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.path_info</span>

<span style="color: #e06c75; background: rgba(0, 0, 0, 0); display: inline; width: 36px; text-decoration: none solid #e06c75; font-weight: 400; font-style: normal;">javax</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 58px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.servlet</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 57px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.include</span><span style="color: #d19a66; background: rgba(0, 0, 0, 0); display: inline; width: 94px; text-decoration: none solid #d19a66; font-weight: 400; font-style: normal;">.servlet_path</span>

3.3 任意文件读取

public_image

当请求被分发到org.apache.catalina.servlets.DefaultServlet#serveResource()方法

public_image

调用getRelativePath方法,需要获取到request_uri不为null,然后从request对象中获取并设置pathInfo属性值和servletPath属性值

public_image

接着往下看到getResource方法时,会把path作为参数传入,获取到文件的源码

public_image

漏洞演示:读取到/WEB-INF/web.xml文件

public_image

3.4 命令执行

当在处理 jsp 请求的uri时,会调用 org.apache.jasper.servlet.JspServlet#service()

public_image

最后会将pathinfo交给serviceJspFile处理,以jsp解析该文件,所以当我们可以控制服务器上的jsp文件的时候,比如存在jsp的文件上传,这时,就能够造成rce

public_image

漏洞演示:造成rce

public_image

四、修复建议

 

Apache Tomcat 6 已经停止维护,请升级到最新受支持的 Tomcat 版本以免遭受漏洞影响,请更新到如下Tomcat 版本:

 

<th style="box-sizing: border-box; padding: 0.5rem 1rem; text-align: left; border-top-width: 1px; border-color: #e9ebec;">
  <span style="font-size: 13px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;">版本号</span>
</th>
<td style="box-sizing: border-box; padding: 0.5rem 1rem; border-color: #e9ebec; text-align: left;">
  <span style="font-size: 12px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;">7.0.0100</span>
</td>
<td style="box-sizing: border-box; padding: 0.5rem 1rem; border-color: #e9ebec; text-align: left;">
  <span style="font-size: 12px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;">8.5.51</span>
</td>
<td style="box-sizing: border-box; padding: 0.5rem 1rem; border-color: #e9ebec; text-align: left;">
  <span style="font-size: 12px; font-family: 'Helvetica Neue', Helvetica, 'Hiragino Sans GB', 'Microsoft YaHei', Arial, sans-serif;">9.0.31</span>
</td>
Tomcat 分支
Tomcat 7
Tomcat 8
Tomcat 9

下载链接如下:

7.0.100版本:https://tomcat.apache.org/download-70.cgi

8.5.51版本:https://tomcat.apache.org/download-80.cgi

9.0.31版本 https://tomcat.apache.org/download-90.cgi