Apache Tomcat Ghostcat漏洞详细分析(CVE-2020-1938)

在Apache Tomcat中发现的Ghostcat漏洞(CVE-2020-1938CNVD-2020-10487)最近成为了关注的焦点,研究员发现此漏洞可以实现远程代码执行(RCE)。

Apache Tomcat是流行的开源Java servlet容器,在这篇文章中我会分析Ghostcat漏洞相关的情况,分析实现RCE可能性。

0x01 AJP协议

长亭科技的安全研究员于2月20日发现了Ghostcat漏洞,报告描述该漏洞存在于Apache JServ协议(AJP)中。AJP是所使用的的Apache Tomcat的网络服务器与位于TCP连接的网络服务器后面servlet容器进行通信的二进制协议,它主要用于Web服务器与应用程序服务器或Servlet容器进行通信的集群或反向代理场景中。

这意味着HTTP连接会向客户端公开,而AJP在Web服务器(例如Apache HTTPD)和Apache Tomcat服务器之间是内部使用。AJP在Apache HTTP Server中作为模块实现,表示为mod_jk或mod_proxy_ajp,最重要的是,AJP本质上不会暴露在外部,这一点很重要,因为这是我们将在下一节中讨论的RCE方法的前提条件之一。

img

图1. Apache JServ协议说明

0x02 Ghostcat漏洞分析

Ghostcat本身是一个本地文件包含/读取漏洞,而不是任意文件上传/写入漏洞,在Apache Tomcat安全主页上,Ghostcat被描述为“ AJP请求注入和潜在的远程执行代码”,关键字“潜在”用来强调Ghostcat默认情况下不是RCE漏洞。

该通报进一步详细说明了进行RCE所必需的情况:Web应用程序需要允许文件上传以及这些上传文件的存储在Web应用程序上,否则攻击者将不得不以某种方式获得对Web应用程序内容的控制权,这种情况加上将文件作为JSP处理的能力(通过漏洞实现)将使RCE成为可能

总之,如果Ghostcat在外部公开了Tomcat AJP Connector,这可能会带来问题,这不是推荐的配置,但是,除了暴露的AJP外,RCE的实现还需要其他一些先决条件,这些要求结合在一起后,在现实世界中很难找到。

来自巴西的著名安全研究员若昂·马托斯(JoãoMatos)确定了Ghostcat成为RCE所需的先决条件。

img

图2.确定RCE发生前提条件

我们进一步研究了这些,如下所述:

通过APP功能上传文件:第一个先决条件意味着具有文件上传功能的应用程序应该已经安装在系统中,以使RCE成为可能。如果是这种情况,对于潜在的攻击者来说,使用带有文件上传漏洞的Web应用程序本身来上传恶意Web Shell文件会更加方便,仅在上传漏洞限制某些文件扩展名(例如JPG或TXT)的情况下,才需要将文件解释为JSP。

这些文件保存在文档根目录下:一旦攻击者破坏了应用程序并能够上传恶意文件,则需要将文件保存在应用程序根文件夹中。这种先决条件本身不太可能,原因有两个:1)在Java应用程序中将文件保存在其应用程序根文件夹中并不常见。2)应用程序根文件夹是临时的,因此,每当部署新版本的应用程序时,此文件夹都会被完全覆盖。

另外,从开发人员的角度来看,文件上传功能在根文件夹内上传文件几乎没有意义,因为大多数Apache Tomcat应用程序都以.WAR文件(基本上是zip文件)的形式部署。

到达AJP连接端口:最后,在满足这两个先决条件之后,潜在的攻击者将必须能够通过反向代理(即外部暴露的AJP)直接从Internet到达Tomcat AJP连接端口(默认端口8009),如前所述,这不是建议的配置或常见配置。即使AJP连接器已暴露并且攻击者试图与其进行通信,由于AJP是二进制协议,他们仍将从Web服务器收到400 Bad Request响应。

0x03 Ghostcat 严重性评估

Ghostcat已经存在了十三年之久,并且影响到所有主要版本的Apache Tomcat。考虑到上述所有要求,这些要求不太可能发生在将Ghostcat变成RCE漏洞的真实世界中,攻击者需要实现这些要求,因为在现实世界中存在这些要求的可能性不大。

证明此问题的大多数PoC 在Apache Tomcat 的webapps / ROOT内都已经有一个webshell.txt文件,因此可以在利用Ghostcat之前启用RCE。在实际情况下,网络内部的攻击者可能能够利用此漏洞执行横向移动,因为他们可以直接到达AJP连接。但是,为了使他们达到攻击的这一阶段,仍然需要在webapps /文件夹内上传恶意文件(例如webshell)以使用Ghostcat LFI漏洞,然后无论是否使用了Windows XP都强制将文件解释为JSP。

0x04 Ghostcat补丁程序

Apache Tomcat团队为解决Ghostcat所做的修复也应该进一步阐明其真正的局限性。在本节中,我们详细介绍9.0.31版中的代码中的补丁程序,这些补丁程序与其他版本大多具有相同的代码。

Ghostcat依赖于AJP连接器的错误配置(如下所示),默认情况下在/conf/server.xml文件中将其启用:

<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />

Apache Tomcat团队从文件中注释掉了这一行,因此默认情况下在提交4c933d8上禁用了AJP连接器,如图3所示。

img

图3.显示了Commit 4c933d8,默认情况下它禁用了AJP连接器

上面的补丁代码本身足以阻止Ghostcat发生,因为它默认情况下会禁用AJP,仅在未使用AJP的情况下才可以这样做。

我们详细介绍第二个补丁程序,该补丁程序不一定禁用AJP,而是将其限制为默认情况下仅侦听回传接口(图4)。Apache Tomcat团队进行了其他更改以提高AJP协议的整体使用率,例如,当secretRequired属性设置为true时,强制定义一个secret(图5),他们还确保对AJP连接器的任何请求包含任意和无法识别的属性,都将收到403响应(图6)。

img

图4.显示Commit 0e8a50f0,强制AJP协议默认侦听回传地址,而不是0.0.0.0。

img

图5.显示Commit 9ac90532,检查参数secretRequired是否设置为“ true”以及是否存在secret

img

图6.显示Commit 64fa5b99,如果它包含任意和无法识别的属性,它将使用403的消息响应阻止对AJP连接器的请求

0x05 分析总结

鉴于本文中已讨论的所有内容,对于用户来说,即使Ghostcat默认不是RCE,也要意识到Ghostcat仍然会带来风险,这一点仍然很重要。该漏洞已经存在公网利用 ,应该促使用户尽快将其Tomcat更新到最新版本,以减少被利用的风险。

Apache Tomcat已发布以下版本的Tomcat的修复程序:

如果不是立即更新,则不使用AJP连接器服务的用户应改为通过注释或将其从$ CATALINA_HOME / conf / server.xml中完全删除或重新启动Tomcat来禁用它,类似于Apache Tomcat采取的操作。

除了将Tomcat升级到最新版本外,如果正在使用AJP连接器服务,请按照Chaitin的建议将“ secret”属性设置为已定义的AJP协议身份验证凭据,如下所示:

<Connector protocol=”AJP/1.3″

address=”::1″

port=”8009″

redirectPort=”8443″

secretRequired=”true”

secret=”YOUR_SECRET_HERE” />

由于默认情况下使用嵌入式版本的Tomcat,因此使用Spring Boot框架的应用程序也可能会受到此漏洞的影响,这些应用程序的用户还应该对此进行进一步研究,以确保它们不受Ghostcat的影响。


   转载规则


《Apache Tomcat Ghostcat漏洞详细分析(CVE-2020-1938)》 0xbird 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Avira VPN 本地提权漏洞分析 Avira VPN 本地提权漏洞分析
0x01 漏洞描述启动Phantom VPN服务(Avira.VPNService.exe)时,它将检查是否有可用的更新,该服务从C:\ ProgramData \ Avira \ VPN \ Update执行更新,该更新可由低特权用户写
2020-04-03
下一篇 
Windows RDP 协议堆溢出漏洞分析(CVE-2019-1181 & CVE-2019-1182) Windows RDP 协议堆溢出漏洞分析(CVE-2019-1181 & CVE-2019-1182)
2019年8月,微软公布了一系列RDP漏洞的补丁更新,其中两个是可蠕虫的RDP漏洞,从Windows 7到Windows 10,漏洞CVE-2019-1181和CVE-2019-1182会影响这之间的所有操作系统。 RDP客户端和服务器中都
2020-04-02
  目录