Learning Man's Blog

CVE-2020-1938(Ghost Cat)简单分析

字数统计: 386阅读时长: 1 min
2020/02/22 Share

影响范围

  • 7.*分支7.0.100之前版本,建议更新到7.0.100版本
  • 8.*分支8.5.51之前版本,建议更新到8.5.51版本
  • 9.*分支9.0.31之前版本,建议更新到9.0.31版本

基础内容

AJP 协议

根据官方文档,很容易编写 POC

-w604

Tomcat 解析流程部分内容

通过org.apache.catalina.connector.CoyoteAdapter#postParseRequest方法,将org.apache.coyote.Request中的内容解析到org.apache.catalina.connector.Request

  • req和res是adapter.service的参数
  • request和response是之后将要调用方法的参数

-w751

而在org.apache.catalina.mapper.Mapper#internalMap中,会通过遍历注册的 context,选取后面将采用的上下文内容

map 映射查找 context

contextVersion.resources 将被传递主要有两点作用

  1. allResources 记录 webapps 列表
  2. cache 被用于查询资源缓存

-w748

-w1180

分析

-w673

DefaultServlet

org.apache.catalina.servlets.DefaultServlet中两个关键点

-w641

  1. 第一个断点处,通过getRelativePath方法拼接servletPath及path_info获取资源相对路径

    -w1071

  2. 第二个断点处,用于LFI读取资源,主要在于通过 resourceCache 获取资源缓存

    -w1043

    返回后会进一步对资源有效性进行检查,此时就用到了上面提到的allResources

    -w717

    -w1565

JspServlet

org.apache.jasper.servlet.JspServlet实际和DefaultServlet逻辑很相似
先通过拼接servletPath及path_info获取jsp文件uri

-w649

然后进入org.apache.jasper.servlet.JspServlet#serviceJspFile,这里将目标恶意文件作为 servlet 进行处理

  1. Servlet容器负责为使用Jasper的Web应用程序上下文提供URLClassLoader
  2. JspServlet将请求转给JspServletWrapper的service方法进行处理

-w1046

-w963

调用栈

-w544

参考资料

  1. Tomcat对HTTP请求的处理(二)
CATALOG
  1. 影响范围
  2. 基础内容
    1. AJP 协议
    2. Tomcat 解析流程部分内容
  3. 分析
    1. DefaultServlet
    2. JspServlet
      1. 调用栈
  4. 参考资料