实验内容
漏洞概述
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
为了方便验证,我们现在靶机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。
编辑
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