Apache Tomcat是一个开源的Java servlet容器。2月20日,长亭科技研究人员发现了Apache Tomcat文件包含漏洞(CNVD-2020-10487/CVE-2020-1938)。该漏洞是由于Tomcat AJP协议存在缺陷而导致,攻击者利用该漏洞可通过构造特定参数,读取服务器webapp下的任意文件。若目标服务器同时存在文件上传功能,攻击者可进一步实现远程代码执行。
本文介绍如何利用该漏洞实现远程代码执行。
AJP是Apache Tomcat web服务器用来与servlet容器通信的一个二进制协议。主要用于集群或逆向代理场景,其中web服务器与应用服务器或servelet容器进行通信。
简单来说,就是HTTP Connector暴露给客户端了,AJP是webserver (如Apache HTTPD)和Apache Tomcat服务器之间内部使用的,如图1所示。AJP在Apache HTTP服务器中是以模块的形式实现的,表示为mod_jk或mod_proxy_ajp。AJP本身并不会暴露到外部,这也是下一部分要讨论的RCE场景的先决条件之一。
图 1. Apache JServ协议说明
Ghostcat本身是一个Local File Include/Read(本地文件包含/读)漏洞,而非任意文件上传/写漏洞。在Apache Tomcat的安全公告页中,Ghostcat被描述为“AJP Request Injection and potential Remote Code Execution”(AJP请求注入和潜在的远程代码执行)漏洞。Potential表明Ghostcat默认情况下并非RCE漏洞。
公告中进一步描述了RCE发生的所需要的条件:web应用需要允许文件上传和允许将上传的文件存储到web应用中,或者攻击者可以获取web应用内容的控制权。融合了将文件看作JSP处理的场景可以实现RCE。
总的来说,如果Tomcat AJP Connector对外暴露了,那么Ghostcat就会引发一些潜在的安全风险。但对外暴露并不是推荐的配置。此外,RCE还需要一些其他的先决条件。这些条件同时满足在现实场景中是很难的。
巴西知名的安全研究人员João Matos将这些先决条件进行了总结。
图 2. RCE发生的先决条件
研究人员对这些先决条件进行进一步分析:
· 通过APP特征上传文件。第一个先决条件表示系统中应该预先安装一个含有文件上传特征的应用。如果安装了,潜在攻击者就可以用web应用本身的文件上传漏洞来上传恶意web shell文件。将文件翻译为JSP只有在上传漏洞限制特定文件(如JPG或TXT)扩展时才需要。
· 文件保存在document root中。攻击者入侵应用后,就可以上传恶意文件,上传的恶意文件需要保存在应用的root文件夹中。这个先决条件几乎是不可能的,因为:
-在Java应用中将文件保存到应用的root文件夹中是不常见的;
此外,从开发者角度来看,因为大多数Apache Tomcat应用都是以.WAR文件形式存在的,因此上传文件到root文件夹是没有意义的。
应用root文件夹是临时的,所以当有新版本的应用升级时,文件夹就会被覆写。
· 直接到达AJP端口。前面两个条件满足后,攻击者就可以直接从互联网通过反向代理到达Tomcat AJP Connector (默认端口8009),这也就是外部暴露的AJP。如前所述,这并不是常见的推荐配置。而且即时AJP Connector暴露了,因为AJP是一个二进制文件,因此攻击者尝试连接也会接收到一个来自服务器的400 Bad Request响应。
Ghostcat漏洞影响大多数的Apache Tomcat版本。但是考虑到RCE漏洞利用所需的先决条件,研究人员认为在现实中将Ghostcat变成RCE漏洞是几乎不可能的。
大多数的PoC都证明了在Apache Tomcat的webapps/ROOT中有一个webshell.txt文件,然后可以将漏洞变成RCE漏洞。但是在实际场景中,已经存在于网络中的攻击者可能利用该漏洞来进行下一步攻击,因为可以直接到达AJP Connector。但是要到达攻击的这一阶段,仍然需要上传一个恶意文件,比如webapps/folder文件夹的webshell,然后将该文件翻译为JSP,这是很难做到的。
Apache Tomcat发布了一系列补丁来解决Ghostcat漏洞。
因为Ghostcat 漏洞利用的是AJP Connector中默认启用的/conf/server.xml文件的错误配置:
< Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ / >
所以Apache Tomcat团队在commit 4c933d8禁用了AJP connector,如图3所示:
图 3. Commit 4c933d8,默认禁用AJP connector
因为补丁禁用了AJP所以也就阻止了Ghostcat漏洞利用的可能性。
此外,Apache还发布了一个补丁,只需要限制AJP为默认监听回还端口无需禁用AJP,如图4所示。Apache Tomcat研究人员还做了一些改变来改善AJP协议的整体使用情况,比如当secretRequired属性设置为true时强制定义一个secret。同时也确保所有到AJP Connector的含有任意或未识别的属性的请求接收到403响应,如图6所示。
图 4. Commit 0e8a50f0,强制SJP协议监听回还地址而非0.0.0.0
图 5. Commit 9ac90532,检查参数secretRequired是否设置为true和是否有定义的secret
图 6. Commit 64fa5b99,如果到AJP Connector的请求中含有任意或未识别的属性,拦截并返回403错误
综上所述,Ghostcat本身并不是一个RCE漏洞,但仍然带来许多潜在的风险。考虑到当前已经有很多该漏洞的公开利用方法,因此研究人员建议用户尽快更新到最新的Tomcat版本,以较少被利用的风险。
本文翻译自:https://blog.trendmicro.com/trendlabs-security-intelligence/busting-ghostcat-an-analysis-of-the-apache-tomcat-vulnerability-cve-2020-1938-and-cnvd-2020-10487/如若转载,请注明原文地址