
Analyse de l'exploit CVE-2023-22518 pour Atlassian Confluence Server couvrant la configuration, le diffing de JAR, la cause racine et la restauration non autorisée pour récupérer l'accès administrateur.
Exploit-CVE-2023-22518 CVE-2023-22518 dans Confluence
CVE-2023-22518 : Cette vulnérabilité est décrite comme « une vulnérabilité d'autorisation inappropriée dans la base de données et le serveur de Confluence ». Le bug affecte les versions On-premises des produits Atlassian.
Configurez l'environnement en utilisant la version vulnérable 8.0.4. URL de téléchargement : https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.0.4-x64.exe

Choisissez Trial Installation, puis cliquez sur le lien pour obtenir la clé d'essai gratuite. Ensuite, configurez le cluster : choisissez non-cluster

Ensuite, passez à la configuration de la base de données -> Choisissez MySQL

Suivez les instructions :
Téléchargez le driver MySQL
Déposez le fichier .jar dans /home/lily/atlassian/confluence/confluence/WEB-INF/lib
Redémarrez Confluence et poursuivez le processus d'installation.
Configurez la base de données, créez l'utilisateur et le mot de passe
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;
Ensuite, edit /etc/mysql/my.cnf . Ajoutez les lignes suivantes :
transaction-isolation = READ-COMMITTED
log_bin_trust_function_creators = 1

Ensuite, redémarrez MySQL et Confluence. Puis allez sur la page d'installation à localhost:8090 et utilisez la base de données créée pour remplir les champs.

Vérifiez que la connexion est établie avec succès, cliquez sur Next. Ensuite, inscrivez-vous (Sign up).

** Comparez les fichiers jar des deux versions dans IntelliJ **

SystemAdminOnly : C'est une fonctionnalité qui limite les fonctions d'administration aux seuls comptes administrateurs. Cela garantit que seuls les comptes autorisés peuvent effectuer des opérations critiques ayant un impact sur le système.
Placez un point d'arrêt sur validate() dans RestoreAction.class

La fonction qui sauvegarde le fichier téléversé utilise getRestoreFileFromUpload

GetExportDescriptor est utilisé pour décompresser et lire le contenu du fichier zip


Cependant, après le débogage, la cause racine de la vulnérabilité n'a pas encore été trouvée.
La cause décrite dans la CVE est une vulnérabilité d'autorisation. Cela nous amène à orienter notre attention vers les recherches sur les vulnérabilités du langage Java lors du processus de gestion des autorisations par les développeurs.
Redirigeons notre attention vers le fichier struts.xml. Ce fichier contient des informations sur les actions et le routage basé sur les espaces de noms, ainsi que sur les intercepteurs.



On constate que le namespace /json étend les fonctionnalités du namespace /admin. Par conséquent, les routes créées pour le namespace /admin peuvent également être atteintes via le namespace /json.
Dans le contexte du namespace /json, le processus de routage d'une requête implique le passage par une chaîne d'intercepteurs. L'un de ces intercepteurs, appelé WebSudoInterceptor, effectue des vérifications basées sur l'URI de la requête.
Concrètement, WebSudoInterceptor effectue les vérifications suivantes :
Si le chemin de la requête est /authenticate.action, il est ignoré. Si le chemin de la requête est /admin, il vérifie si l'attribut WebSudoNotRequired est vide ou non.
Si une requête est envoyée vers '/json', alors la requête vers '/json/action' est redirigée vers '/setup/action' et 'admin/action'. Dans cette CVE, le chemin vulnérable est '/json/setup-restore.action?synchronous=true'.
Capturez la requête avec Burp Suite : GET /json/setup-restore.action. Cependant, on reçoit une réponse « Method Not Allowed ». Essayez avec POST /json/setup-restore.action?synchronous=true et on obtient une réponse 200.


Téléversez le fichier xmlexport-200123123001.zip

Envoyez la requête et recevez la réponse

Maintenant, nous pouvons nous connecter avec account admin :admin

Et on obtient le résultat suivant
