
Apache OpenMeetings 9.1.0 — высокий уровень — удалённо — остаточные привилегии — устаревший /install wizard добавляет второго ADMIN
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-stale-install-admin
Класс: Остаточные привилегии Доступ: Удалённый
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
InstallWizardPage перенаправляет новые запросы после isInstalled(). Страница Wicket, открытая до первой установки, остаётся активной. Завершение на этой устаревшей сессии запускает loadAll(cfg, true). ImportInitvalues.checkInstalled записывает в лог "no need to install" и не возвращает управление. Второе завершение вставляет ещё одного пользователя ADMIN+SOAP.
| ID | CVE пока нет |
| Класс | Остаточные привилегии |
| Доступ | Удалённый (неаутентифицированный /install во время первой настройки) |
| CWE | CWE-367, CWE-269 |
| CVSS | Высокий: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Продукт | Apache OpenMeetings |
| Затронуто | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) окно первой установки |
| Аутентификация | отсутствует на устаревшей сессии мастера |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18159. Официальный tarball 9.1.0, не установлен, HTTP 5080. |
Я зафиксировал тег 9.1.0, peel 9773c59e1af327bf988018e661f456ae9997c29f. Для остаточной уязвимости нужна страница мастера, открытая до завершения первой установки.
Обратиться к /openmeetings/install, пока экземпляр ещё не установлен. Сохранить этот JSESSIONID. Дождаться, пока оператор завершит первую установку. Отправить POST Finish на устаревшей странице.
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
Устаревший POST завершения мастера (wizard-form-buttons-finish) | ImportInitvalues.checkInstalled пишет в лог и продолжает (ImportInitvalues.java:607-612); loadInitUserAndGroup | Целостность (доказано в лаборатории): второй пользователь staleadm с правами ADMIN, SOAP, LOGIN, DASHBOARD, ROOM. Вход по SOAP успешен. Количество пользователей = 2. |
Тот же loadAll(cfg, true) | персистентность / SMTP / пути из устаревшей формы | Целостность (предположительно): перезапись persistence.xml и настроек почты из контролируемых атакующим полей мастера. Не требуется для SUCCESS. |
Доказано в лаборатории vs предположительно: второй вход ADMIN+SOAP — лабораторно. Перезапись persistence.xml — предположительно, на основе loadAll.
Требуется: атакующий запросил /install до isInstalled(). Затем оператор завершил установку. Тот же id страницы Wicket всё ещё отправляется. Официальный docker-образ уже установлен, поэтому это окно первого запуска tarball (и любой переустановки).
| Поверхность | Почему |
|---|---|
Свежий GET /install после установки | конструктор перенаправляет на /signin (InstallWizardPage.java:31-34). В лаборатории: новая сессия попала на signin. |
| Неаутентифицированный вход по SOAP до установки | health installed=false; вход не удаётся до завершения мастера. |
| Tomcat manager / H2 console | manager исключён, H2 console отключён на этой фиксации. |
Блокировка в конструкторе выглядит как полное исправление для "установки после установки". checkInstalled по-прежнему только пишет в лог. Wicket хранит страницу в сессии. Сессия, пересёкшая isInstalled(), сохраняет кнопку Finish, которая всё ещё вызывает loadAll.
admin.sh -i — это вторая JVM, и она не загружает Tomcat CryptProvider, поэтому в этой лаборатории используется второй веб-мастер в качестве первого установщика, а устаревшая страница — в качестве атакующего.
cd lab
./run.sh
Loopback http://127.0.0.1:18159/openmeetings. Последняя строка-свидетель:
SUCCESS OPENMEETINGS-STALE-INSTALL-WITNESS
checkInstalled должен возвращать (или выбрасывать исключение), если уже установлено. Привяжите Finish к одноразовому токену установки. Удалите страницу Wicket из сессии, когда isInstalled() меняет значение. Не вставляйте второго ADMIN из loadInitUserAndGroup, если администратор уже существует.
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Поставщик: [email protected]