【漏洞复现】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
确认存在漏洞,使用exp读取web.xml
漏洞分析
Tomcat容器架构组成:
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
通过该特性可以控制request对象的以下属性
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
之后继续走Servlet的映射流程
DefaultServlet实现任意文件下载
当请求未在url映射列表中时,会走到tomcat默认的DefaultServlet,其主要做的是根据request里的三个属性读取文件
jspservlet实现任意文件包含
当请求(比如http://xxx/xxx/xxx.jsp)映射在org.apache.jasper.servlet.JspServlet这个servlet的时候也可通过上述三个属性来控制要访问的jsp文件:
控制路径之后就可以以jsp解析任意文件,如果有文件内容可控的点,则可以实现RCE
修复方式
-
Tomcat 官方已发布 9.0.31、8.5.51 及 7.0.100 版本针对此漏洞进行修复
-
如果未使用集群或反向代理,则基本上可以确定没有用到 AJP;
-
如果使用了集群或反向代理,则需要看集群或反代服务器是否与 Tomcat 服务器 AJP 进行通信
-
确定未使用Tomcat AJP协议,但不想升级,可考虑在配置文件中tomcat/conf/server.xml关闭AJP Connector
参考:
https://www.chaitin.cn/zh/ghostcat
https://www.anquanke.com/post/id/199347#h2-3