Learning Man's Blog

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

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

可利用的 servlet 感觉可以探索一波

影响范围

  • 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. 1. 影响范围
  2. 2. 基础内容
    1. 2.1. AJP 协议
    2. 2.2. Tomcat 解析流程部分内容
  3. 3. 分析
    1. 3.1. DefaultServlet
    2. 3.2. JspServlet
      1. 3.2.1. 调用栈
  4. 4. 参考资料