
Apache OpenMeetings 9.1.0 - Élevé - À distance - Reliquat de privilèges - l'assistant /install obsolète insère un second ADMIN
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · openmeetings-stale-install-admin
Classe : Privilège résiduel Portée : Distante
Apache OpenMeetings 9.1.0 (9773c59e) - Apache Software Foundation
InstallWizardPage redirige les nouvelles requêtes après isInstalled(). Une page Wicket ouverte avant la première installation reste active. Terminer sur cette session obsolète exécute loadAll(cfg, true). ImportInitvalues.checkInstalled journalise « no need to install » et ne retourne pas. La seconde finalisation insère un autre utilisateur ADMIN+SOAP.
| ID | pas encore de CVE |
| Classe | Privilège résiduel |
| Portée | Distante (/install non authentifié pendant la première configuration) |
| CWE | CWE-367, CWE-269 |
| CVSS | Élevé : 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Produit | Apache OpenMeetings |
| Affecté | 9.1.0 (9773c59e1af327bf988018e661f456ae9997c29f) fenêtre de première installation |
| Auth | aucune sur la session obsolète de l'assistant |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1:18159 uniquement. Archive officielle 9.1.0, non installée, HTTP 5080. |
J'ai épinglé le tag 9.1.0, peel 9773c59e1af327bf988018e661f456ae9997c29f. Le résidu nécessite qu'une page de l'assistant soit ouverte avant que la première installation ne soit terminée.
Atteindre /openmeetings/install tant que l'instance n'est pas encore installée. Conserver ce JSESSIONID. Attendre qu'un opérateur termine la première installation. Envoyer un POST Finish sur la page obsolète.
| Méthode | Point d'impact | Privilège |
|---|---|---|
POST obsolète Finish de l'assistant (wizard-form-buttons-finish) | ImportInitvalues.checkInstalled journalise et continue (ImportInitvalues.java:607-612) ; loadInitUserAndGroup | Intégrité (prouvé en lab) : second utilisateur staleadm avec les droits ADMIN, SOAP, LOGIN, DASHBOARD, ROOM. Connexion SOAP réussie. Nombre d'utilisateurs = 2. |
Même loadAll(cfg, true) | persistance / SMTP / chemins depuis le formulaire obsolète | Intégrité (déduit) : réécriture de persistence.xml et des paramètres mail depuis les champs de l'assistant contrôlés par l'attaquant. Non requis pour le SUCCÈS. |
Prouvé en lab vs déduit : la seconde connexion ADMIN+SOAP est prouvée en lab. La réécriture de persistence.xml est déduite de loadAll.
Nécessite : que l'attaquant ait récupéré /install avant isInstalled(). L'opérateur a ensuite terminé l'installation. Le même identifiant de page Wicket est toujours posté. L'image docker officielle est déjà installée, il s'agit donc de la fenêtre de premier démarrage de l'archive (et de toute réinstallation).
| Surface | Raison |
|---|---|
GET /install frais après installation | le constructeur redirige vers /signin (InstallWizardPage.java:31-34). Lab : la nouvelle session a abouti sur signin. |
| Connexion SOAP non authentifiée avant installation | health installed=false ; la connexion échoue jusqu'à la finalisation de l'assistant. |
| Tomcat manager / console H2 | manager exclu, console H2 désactivée sur cette version épinglée. |
Le verrou du constructeur semble être un correctif complet pour « installation après installation ». checkInstalled ne fait toujours que journaliser. Wicket stocke la page dans la session. Une session qui a franchi isInstalled() conserve un bouton Finish qui appelle toujours loadAll.
admin.sh -i est une seconde JVM et ne charge pas le CryptProvider de Tomcat, donc ce lab utilise un second assistant web comme premier installateur et la page obsolète comme attaquant.
cd lab
./run.sh
Boucle de retour http://127.0.0.1:18159/openmeetings. Dernière ligne témoin :
SUCCESS OPENMEETINGS-STALE-INSTALL-WITNESS
checkInstalled doit renvoyer (ou lever une exception) lorsque l'installation est déjà effectuée. Liez Finish à un jeton d'installation à usage unique. Retirez la page Wicket de la session lorsque isInstalled() bascule. N'insérez pas un second ADMIN depuis loadInitUserAndGroup si un administrateur existe déjà.
Abraxas Labs - https://abraxaslabs.tech - https://github.com/abraxas - https://x.com/abraxas_null - [email protected]
Fournisseur : [email protected]