
Анализ эксплуатации CVE-2023-22518 для Atlassian Confluence Server, охватывающий настройку, сравнение JAR-файлов, первопричину и несанкционированное восстановление для повторного получения доступа администратора.
Exploit-CVE-2023-22518 CVE-2023-22518 в Confluence
CVE-2023-22518 : Эта уязвимость описана как «уязвимость некорректной авторизации в базе данных и сервере Confluence». Ошибка затрагивает локальные (On-premises) версии продуктов Atlassian.
Настройка среды. Используйте уязвимую версию 8.0.4. Ссылка для загрузки: https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.0.4-x64.exe

Выберите Trial Installation, затем перейдите по ссылке, чтобы получить бесплатный пробный ключ (free trial key). Затем настройте кластер: выберите non-cluster.

Затем переходим к настройке базы данных -> Выбираем MySQL

Следуйте инструкциям:
Загрузите драйвер MySQL
Поместите файл .jar в /home/lily/atlassian/confluence/confluence/WEB-INF/lib
Перезапустите Confluence и продолжите процесс настройки.
Настройте базу данных: создайте пользователя и пароль
CREATE DATABASE securedb CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
CREATE USER 'admin123'@'localhost' IDENTIFIED BY 'supersecure';
GRANT ALL PRIVILEGES ON securedb.* TO 'admin123'@'localhost';
GRANT SUPER ON *.* TO 'your_username'@'your_host';
FLUSH PRIVILEGES;
Затем edit /etc/mysql/my.cnf . Добавьте следующие строки:
transaction-isolation = READ-COMMITTED
log_bin_trust_function_creators = 1

Затем перезапустите MySQL и Confluence. После этого зайдите на страницу настройки на localhost:8090 и заполните её, используя созданную базу данных.

Проверьте успешность подключения (Check connection), нажмите Next. Затем зарегистрируйтесь (Sign up).

** Сравните (diff) два jar-файла двух версий в IntelliJ **

SystemAdminOnly : Это функция, которая ограничивает административные функции только учётными записями администраторов. Это гарантирует, что только авторизованные учётные записи могут выполнять важные операции, влияющие на систему.
Устанавливаем точку останова (breakpoint) в validate() в RestoreAction.class

Функция сохранения загруженного файла — getRestoreFileFromUpload

GetExportDescriptor используется для распаковки (unzip) и чтения содержимого zip-файла


Однако после отладки (debug) корневую причину уязвимости так и не удалось найти.
Причина, описанная в CVE, — это уязвимость авторизации. Это приводит к тому, что мы обращаем внимание на исследования (research) уязвимостей языка Java в процессе разграничения прав разработчиками.
Переключаем внимание на файл struts.xml. Этот файл содержит информацию о действиях и маршрутизации на основе пространств имён, а также о перехватчиках (interceptors).



Мы видим, что namespace /json расширяет функциональность namespace /admin. Поэтому маршруты, созданные для namespace /admin, также доступны через namespace /json.
В контексте namespace /json процесс маршрутизации запроса включает прохождение через цепочку перехватчиков (interceptors). Один из этих перехватчиков, называемый WebSudoInterceptor, выполняет проверку на основе URI запроса.
Конкретно, WebSudoInterceptor выполняет следующие шаги проверки:
Если путь запроса — /authenticate.action, он пропускается. Если путь запроса — /admin, он проверяет, пуст ли атрибут WebSudoNotRequired.
Если запрос отправлен на '/json', то запрос к '/json/action' будет перенаправлен на '/setup/action' и 'admin/action'. В данном CVE уязвимый путь — '/json/setup-restore.action?synchronous=true'
Перехватываем запрос в Burp Suite: GET /json/setup-restore.action. Однако получаем ответ "Method Not Allowed". Пробуем POST /json/setup-restore.action?synchronous=true и получаем ответ 200.


Загружаем файл xmlexport-200123123001.zip

Отправляем и получаем ответ

Теперь мы можем войти, используя account admin :admin

И получаем следующий результат
