【漏洞复现】Aapache Tomcat AJP 文件包含漏洞(CVE-2020-1938)

Ghostcat(幽灵猫)是由长亭的师傅发现的tomcat安全漏洞,主要原因是Ajp协议在设计上存在缺陷,攻击者可通过该漏洞读取Tomcat上任意应用文件,配合文件上传功能,可以实现任意命令执行

影响版本

影响全版本默认配置下的 Tomcat

确认其影响 Tomcat 9/8/7/6 全版本,而年代过于久远的更早的版本未进行验证

漏洞复现

复现版本:tomcat 9.0.30

使用xray进行检测:

.\xray_windows_amd64.exe servicescan --target 10.128.0.12:8009
image-20220608111319478

确认存在漏洞,使用exp读取web.xml

image-20220608111005500

漏洞分析

Tomcat容器架构组成:

image-20220617221623442

Tomcat Connector是与外部进行连接的通道,默认情况下,Tomcat配置了两个Connector:

  • HTTP Connector:用于处理 HTTP 协议的请求(HTTP/1.1),默认监听地址为 0.0.0.0:8080
  • AJP Connector:用于处理 AJP 协议的请求(AJP/1.3),默认监听地址为 0.0.0.0:8009

HTTP协议不再赘述,AJP协议可以简单理解为HTTP协议的二进制优化版,能够降低HTTP协议通信的开销,主要用在集群、反向代理等场景

Tomcat调用org.apache.coyote.ajp.AjpProcessor处理ajp消息,prepareRequest方法会将ajp消息封装成request,并设置对应的Attribute

image-20220617222649298

通过该特性可以控制request对象的以下属性

 javax.servlet.include.request_uri
 javax.servlet.include.path_info
 javax.servlet.include.servlet_path

之后继续走Servlet的映射流程

image-20220617222758835

DefaultServlet实现任意文件下载

当请求未在url映射列表中时,会走到tomcat默认的DefaultServlet,其主要做的是根据request里的三个属性读取文件

image-20220617223043747
image-20220617223011693

jspservlet实现任意文件包含

当请求(比如http://xxx/xxx/xxx.jsp)映射在org.apache.jasper.servlet.JspServlet这个servlet的时候也可通过上述三个属性来控制要访问的jsp文件:

image-20220617223254311

控制路径之后就可以以jsp解析任意文件,如果有文件内容可控的点,则可以实现RCE

修复方式

  • Tomcat 官方已发布 9.0.31、8.5.51 及 7.0.100 版本针对此漏洞进行修复

  • 如果未使用集群或反向代理,则基本上可以确定没有用到 AJP;

  • 如果使用了集群或反向代理,则需要看集群或反代服务器是否与 Tomcat 服务器 AJP 进行通信

  • 确定未使用Tomcat AJP协议,但不想升级,可考虑在配置文件中tomcat/conf/server.xml关闭AJP Connector

image-20220617223659054

参考:

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

https://www.anquanke.com/post/id/199347#h2-3