Источник
CVE-2024-27198 - уязвимость затрагивающая аутентификаю в CI/CD от JetBrains - TeamCity, получила балл CVSS 9,8(критический).
Уязвимость нашла компания Rapid7 в феврале 2024 года.
Обзор
Принцип эксплуатации уязвимости, заключается в создании URL определённым образом.
Проблема заключается в классе
, который обрабатывает пользовательские запросы, а точнее в том, как он это делает.
Ниже представлена часть кода метода handleRequestInternal из класса BaseController, который осуществляет обработку.
Мы видим, что если результат запроса не перенаправляет куда-либо, то будеть вызван метод
, описанный ниже
В данном методе мы можем увидеть, что переменная
Злоумышленник может удовлетворить это, запросив URI с сервера, который сгенерирует ответ HTTP 404. Такой запрос сгенерирует
Далее мы видим, как вызывается метод
Важно отметить, что
Рассмотрим код метода:
Мы видим, что метод - берёт значение запроса пользователя, оканчивающееся на
В конце проверок значение из переменной
Хулиганим
Из начала статьи мы можем понять, что:
Тестировать его я буду на специально построенном уязвимом окружении версии
Запускаем контейнер и BurpSuite, после чего захожу по адресу localhost:8111 и настраиваю его(тут сами, это легко).
Видим, что я создал одного юзера с правами админа:
Чтож, пора начинать хулиганить.
Для начала тестируем первое условие:
Отлично! Первое условие соблюдено, теперь пробуем второе и третье вместе:
Здорово! У нас всё получилось и мы смогли забайпасить аутентификацию, но как мы можем развить атаку? Мы можем создать нового юзера с административными правами. Делается это так - мы берём эндпоинт /app/rest/users, соблюдая все вышеизученные правила и указываем специальные headers:
BurpSuite говоритт, что всё получилось, чтож проверим:
И вправду, я могу увидеть что у меня есть 2 юзера с админскими правами, а также могу залогиниться под каждым.
Итог
В этой статье мы изучили CVE-2024-27198 уязвимость обхода аутентификации в CI/CD от JetBrains, это довольно интересная уязвимость, от которой можно раскрутиться и пробраться внутрь сети, если хорошо знать сам TeamCity.
Надеюсь вам было интересно почитать, данную статью, с вами был Эрмано, всем хорошего времени суток.
CVE-2024-27198 - уязвимость затрагивающая аутентификаю в CI/CD от JetBrains - TeamCity, получила балл CVSS 9,8(критический).
Уязвимость нашла компания Rapid7 в феврале 2024 года.
Обзор
Принцип эксплуатации уязвимости, заключается в создании URL определённым образом.
Проблема заключается в классе
Код:
jetbrains.buildServer.controllers.BaseController
Ниже представлена часть кода метода handleRequestInternal из класса BaseController, который осуществляет обработку.
Java:
public abstract class BaseController extends AbstractController {
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);
}
}
Мы видим, что если результат запроса не перенаправляет куда-либо, то будеть вызван метод
Код:
updateViewIfRequestHasJspParamete
Java:
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);
}
}
В данном методе мы можем увидеть, что переменная
isControllerRequestWithViewName будет иметь значение true, если и у текущего ModelAndView есть имя, и servlet путь текущего запроса не заканчивается на .jsp.Злоумышленник может удовлетворить это, запросив URI с сервера, который сгенерирует ответ HTTP 404. Такой запрос сгенерирует
servlet путь /404.html, что заканчивается на .html, а не .jsp, следовательно isControllerRequestWithViewName будет иметь значение true.Далее мы видим, как вызывается метод
getJspFromRequest, чей результат записывается в переменную jspFromRequest.Важно отметить, что
getJspFromRequest принимает в качестве аргумента изначальный запрос пользователя, что дает злоумышленнику возможность контролировать содержимое переменной jspFromRequest.Рассмотрим код метода:
Java:
protected String getJspFromRequest(@NotNull HttpServletRequest request) {
String jspFromRequest = request.getParameter("jsp");
return jspFromRequest == null || jspFromRequest.endsWith(".jsp") && !jspFromRequest.contains("admin/") ? jspFromRequest : null;
}
Мы видим, что метод - берёт значение запроса пользователя, оканчивающееся на
.jsp и возвращает ответ, если оно не содержит пути /admin.В конце проверок значение из переменной
jspFromRequest передаётся в метод ModelAndView.setViewName. И так как злоумышленник может контролировать аргумент этого метода, результат его выполнения позволяет изменить URL-адрес, обрабатываемый DispatcherServlet, что позволяет злоумышленнику вызывать произвольный эндпоинт.Хулиганим
Из начала статьи мы можем понять, что:
- Ведёт на страницу, которой нет(ответ - 404)
- URI - ведёт на страницу, доступную только аутентифицированным пользователям.
- Если в запросе не содержится
/adminи он заканчивается на.jsp.
/huligan?jsp=/app/rest/server;.jspТестировать его я буду на специально построенном уязвимом окружении версии
2023.11.3, которое я взял отсюда.Запускаем контейнер и BurpSuite, после чего захожу по адресу localhost:8111 и настраиваю его(тут сами, это легко).
Видим, что я создал одного юзера с правами админа:
Чтож, пора начинать хулиганить.
Для начала тестируем первое условие:
Отлично! Первое условие соблюдено, теперь пробуем второе и третье вместе:
Здорово! У нас всё получилось и мы смогли забайпасить аутентификацию, но как мы можем развить атаку? Мы можем создать нового юзера с административными правами. Делается это так - мы берём эндпоинт /app/rest/users, соблюдая все вышеизученные правила и указываем специальные headers:
BurpSuite говоритт, что всё получилось, чтож проверим:
И вправду, я могу увидеть что у меня есть 2 юзера с админскими правами, а также могу залогиниться под каждым.
Итог
В этой статье мы изучили CVE-2024-27198 уязвимость обхода аутентификации в CI/CD от JetBrains, это довольно интересная уязвимость, от которой можно раскрутиться и пробраться внутрь сети, если хорошо знать сам TeamCity.
Надеюсь вам было интересно почитать, данную статью, с вами был Эрмано, всем хорошего времени суток.
Последнее редактирование модератором: