🙀 CVE-2020-1938 GHOSTCAT [Tomcat 文件读取/包含漏洞]

🙀 CVE-2020-1938 GHOSTCAT [Tomcat 文件读取/包含漏洞]

🌍 0x00 漏洞说明

GHOSTCAT 漏洞是由长亭科技安全研究员发现的存在于 Tomcat 的安全漏洞。其影响 Tomcat 9/8/7/6 全版本,这意味着该漏洞已经潜伏了长达十多年。2020 年 1 月 6 日该漏洞被 CNVD 收录。

该漏洞是由于 Tomcat AJP 协议设计上存在的缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat webapps 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。如果目标应用存在文件上传的功能,配合文件包含的利用可直接导致 RCE。

🦠 0x01 影响版本

Apache Tomcat 9.x < 9.0.31
Apache Tomcat 8.x < 8.5.51
Apache Tomcat 7.x < 7.0.100
Apache Tomcat 6.x

如果目标 Tomcat 处于漏洞影响版本范围内,开启了 AJP Connector,且攻击者能够访问 AJP Connector 服务端口的情况下,即存在被攻击的风险。

📚 0x02 漏洞原理

Tomcat 服务器通过 Connector 连接器组件与客户端建立连接,「Connector」表示接收请求并返回响应的端点。即 Connector 组件负责接收用户的请求,以及把 Tomcat 服务器的响应结果发送给客户。

Tomcat 默认在其配置文件 conf/server.xml 中配置了两种 Connector:

HTTP connector,对外提供 HTTP 协议,端口 8080
AJP connector,默认 AJP 协议端口,端口 8009

两个端口默认均监听在外网 IP 上。

Screenshot 2020-02-24 上午11.10.06

AJP 连接器可以通过 AJP 协议和另一个 web 容器进行交互。它负责监听 8009 端口,负责和其他的 HTTP 服务器建立连接,在把 Tomcat 与其他 HTTP 服务器集成时,需要用到该连接器,它能降低 HTTP 请求的处理成本,因此主要在需要集群、反向代理的场景中被使用。AJP Connector 服务在 8009 端口监听。

./startup.sh 启动 Tomcat 服务,本地端口开始监听:

Screenshot 2020-02-24 上午11.22.16

具体漏洞利用原理可参考安恒信息卫兵实验室出具的漏洞分析:CVE-2020-1938

漏洞调试需要源码搭建环境,这部分回来再细看。🤣

🧨 0x03 漏洞利用

利用条件:目标服务处在漏洞影响版本范围内,开启了 AJP Connector 且能够访问 AJP Connector 服务端口(8009)。

(Tomcat AJP Connector 默认配置下即为开启状态,监听在 0.0.0.0:8009)

POC TEST1

如果 ROOT 目录下存放了网站的源代码,攻击者可通过源代码代码审计挖掘其他漏洞。

Screenshot 2020-02-24 下午12.11.40

可成功读取文件

POC TEST2 文件包含导致 RCE

利用文件包含导致远程代码执行,在实际环境中需要有上传点。此处漏洞复现时没有搭建上传功能,因此在 webapps/ROOT/WEB-INF/ 目录下存放了模拟上传的恶意文件 rce.txt,payload:

<%out.println(new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("whoami").getInputStream())).readLine());%>

Screenshot 2020-02-24 下午1.54.41

利用文件包含导致 RCE

⚙️ 0x04 修复方案

  1. 临时禁用 AJP 协议端口,在 conf/server.xml 配置文件中注释掉:

    <Connector port="8009" protocl="AJP/1.3" redirectPort="8443" />

    Screenshot 2020-02-24 下午2.13.09

    注释完成后重启 Tomcat 即可。

  2. 配置防火墙安全策略阻止不可信任的来源访问 AJP Connector 端口。

  3. 配置 AJP 配置中的 secretRequired 和 secret 属性来限制认证。

    详细见长亭科技发布的修复方案:https://www.chaitin.cn/zh/ghostcat

  4. 更新到官方 Tomcat 的最新版本。

    https://tomcat.apache.org/download-70.cgi
    https://tomcat.apache.org/download-80.cgi
    https://tomcat.apache.org/download-90.cgi
    或Github下载:https://github.com/apache/tomcat/releases
  5. 在线检测:

    https://www.chaitin.cn/zh/ghostcat#online_test

❓ 0x05 几个问题

2/24 更新,解答几个关注比较多的问题:

  1. 是否可以跨目录读取到目标系统密码等系统文件?

    不可以,只能读取和包含 webapps 目录下的文件。但是通过修改 POC 可以跨 App 读取 Tomcat 下其他应用的文件(比如从 ROOT 读到 examples)。

  2. 究竟是文件包含漏洞还是文件读取漏洞?JSP 文件能读取源码吗?

    该漏洞有两种利用方式。JSP 文件也可以读取源码而不执行。

  3. 用 docker 拉取的 Tomcat 为何无法利用成功?

    因为从 2020 年开始 docker 中的 Tomcat 默认就不开启 examples、ROOT 等应用了,webapps 目录默认为空。可以使用 vulhub 来进行漏洞测试。

🌍 参考

https://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html
https://mp.weixin.qq.com/s/GzqLkwlIQi_i3AVIXn59FQ
https://www.cnvd.org.cn/webinfo/show/5415
https://www.chaitin.cn/zh/ghostcat
https://github.com/hypn0s/AJPy
https://github.com/Kit4y/CNVD-2020-10487-Tomcat-Ajp-lfi-Scanner

如有错误请指正,欢迎交流!