一、漏洞介绍
Tomcat AJP协议设计缺陷,攻击者可以通过Tomcat AJP Connector读取包含Tomcat上所有webapp目录下的任意文件,如果目标应用上有文件上传功能,则攻击还可以做到远程代码执行。
在影响版本范围内,如果开启AJP Connector,攻击者能够访问到该端口,则可被利用。
在默认配置下,Tomcat AJP Connect为开启状态,且监听在0.0.0.0:8009。
二、影响版本
Tomcat 9.X(低于9.0.31版本)
Tomcat 8.X(低于8.5.51版本)
Tomcat 7.X(低于7.0.100版本)
Tomcat 6 全版本
三、POC
(一)环境部署
靶机系统:Windows Server 2019 Datacenter
Tomcat版本:ApacheTomcat 9.0.17
1.在安装Tomcat之前,必须安装JDK SE8或更高版本(不同版本的Tomcat需要不同版本的JDK支持,以官方说明为主),本次POC使用的是JDK SE13版本。下载地址为:
https://www.oracle.com/java/technologies/javase-jdk13-downloads.html
下载完成后压缩。
2.我的电脑-属性-高级系统设置-高级-环境变量。
3.找到path进行编辑,新建如下。
4.在命令行中,输入如下命令后有结果反馈,则代表部署完成。
5.部署完JDK后,还需要部署eclipse环境。
6.部署eclipse后,下载Tomcat,下载地址为:
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.17/
下载完成后解压缩
7.配置环境变量,我的电脑-属性-高级系统设置-高级-环境变量,新建如下变量。
8.编辑path
9.运行目录下bin中的startup.bat即可。
10.此外也可以利用docker直接部署环境。
11.扫描是否开放8009端口
(二)漏洞复现
1.下载poc脚本到本地,获得如下脚本(以下脚本可以复制到外部使用)。
下载地址:https://github.com/nibiwodong/CNVD-2020-10487-Tomcat-ajp-POC
到本地。
2.cmd命令行中先切换到poc脚本所在目录下,用python2 加载poc脚本,该脚本可利用此漏洞读取敏感文件信息。
命令格式为:python ./脚本名 业务IP -p 8009 -f 文件名
3.至此POC结束。利用此漏洞可以读取到例如webapp 配置文件、源代码、数据库配置配置等敏感信息。
三、漏洞排查
(一)下载漏洞扫描脚本,并且解压缩,得到如下扫描脚本(该脚本可以复制到外部使用)。
下载地址:https://github.com/woaiqiukui/CVE-2020-1938TomcatAjpScanner
1.使用python3运行扫描脚本,运行命令为:
python 脚本名.py 字符串
注:字符串可以为指定IP地址,也可以为文件。如下图所示:
(1)扫描指定IP 192.168.1.111
python scan.py 192.168.1.111
(2)也可以生成txt文件,文件中写入要检测的IP地址,命令行的字符串写文件名。
2.运行完成后,如下图所示,展示该IP是否存在漏洞。
3.并且会将结果保存在同目录下的result.txt中。
四、防护方案
(一)截止目前,官方已经发布新版本(9.0.31、8.5.51、7.0.100版本)修复了该漏洞,6.X版本已经停止维护,无法更新。
(二)如果目前系统未用到Tomcat AJP协议,建议直接升级。如果无法升级版本,可以使用如下办法:
1.可以关闭AJP Connector,或者修改监听地址。修改方法如下:编辑<CATALINA_BASE>/conf/server.xml,将<!--<Connector port=”8009” protocol=”AJP/1.3” redirect-Port=”8443”>>将该行注释或者删除,重启Tomcat即可。
2.在安全设备上,做相关安全策略,限制外部IP访问Tomcat AJP Connector端口。
(三)如果目前系统到Tomcat AJP协议,除升级版本外同时为AJP Connector配置secret来设置AJP协议认证凭证。将YOUR_TOMCAT_AJP_SECRET更改为无法轻易猜解的值。
写在最后,欢迎大家关注killboy安全实验室微信公众号,全都是干货啊


印度 1F
这漏洞有点可怕啊,默认配置就有问题
北京市 2F
8009端口默认开着太危险了,之前部署都没注意
上海市 3F
有人试过在linux环境复现吗?
美国 B1
@ 旧橱窗 linux复现步骤差不多,就是路径写法不一样。
新疆 4F
我们公司还在用8.5.31版本,得赶紧升级了
广东省广州市 B1
@ 暴龙兽 你们版本确实在影响范围内,赶紧安排升级吧。
河南省周口市 5F
配置secret那个方案可行吗?
韩国 B1
@ 漠言 secret方案我们生产环境用了,暂时没发现问题。
北京市 6F
前两天刚碰到这个问题,服务器被扫到了
湖北省十堰市 7F
图片里环境变量配置得挺清楚的
河北省 B1
@ 草莓奶盖茶 图片里jdk版本选11,跟文章说的13不一样啊。
香港 8F
这个poc脚本在python3能用吗?
韩国 9F
直接注释掉AJP连接器最省事
北京市 10F
感觉修复方案写得挺详细的
湖南省郴州市 B1
@ Outlaw 嗯,几种方法都列出来了,照着做就行。
江苏省无锡市 11F
Windows上部署确实比linux麻烦点,环境变量老配错。
上海市 12F
之前用docker搭环境省事多了,不用自己配这些。
江苏省连云港市 B1
@ 离谱他妈 确实,docker一键部署省时省力,还避免配置错误。
湖北省 13F
这个poc在python3要改一下,不然会报编码错误。
广东省广州市 14F
6.x版本居然全中,老系统太危险了。
日本 15F
光关AJP端口不够吧,其他漏洞链起来还是可能被利用。
韩国 16F
直接升级到最新版最稳妥,别折腾什么临时方案了。
四川省 17F
我们测试环境扫出来一堆,全是这个漏洞。
日本 18F
这个POC脚本在Windows下跑起来顺利不?
浙江省金华市 19F
我们线上环境用9.0.17,看来也得赶紧打补丁了。
湖南省长沙市 20F
图片里那个路径配置,如果JDK装在其他盘符下是不是也得跟着改?
广东省珠海市 21F
之前搞过类似测试,光扫描脚本就找了半天。
湖南省娄底市新化县 22F
直接升级版本最省心,那些临时方案总感觉不踏实。
湖北省武汉市 23F
这个修复方案里的secret配置,具体怎么设置啊?
北京市 24F
这漏洞影响范围真广,老系统真是重灾区。
台湾省 25F
默认开AJP端口这个设计确实有点迷。
湖北省十堰市 26F
手动配环境变量确实容易出错,特别是新手。