Hacking WordPress – Arbitrary File Deletion

Queridos lectores bienvenidos a la DMZ, esta es nuestra primera publicaciรณn pronto tendremos muchas mรกs.

Esta es una prueba de concepto acerca una vulnerabilidad de tipo Arbitrary file deletion que se encuentra en el plugins MW WP Form <=5.0.3

En esta demostraciรณn estamos utilizando la รบltima versiรณn de WordPress disponible con el Plugins MW WP 5.0.3 con tรฉcnicas de reconocimiento manual.

………………………………………………………………………………………………………………………………………………………………

Proof Of Concept (P.O.C) –> CVE-2023-6559 – Arbitrary file deletion.

Reconocimiento

Buscaremos algรบn dato que indique presencia de este plugins dentro del sitio revisando el cรณdigo fuente desde el navegador, sobre todo enfocรกndonos en las partes donde se sospeche que pudo ser construida con este plugins, concentrรฉmonos en algรบn formulario. Recuerda que intencionalmente esta demostraciรณn es sobre cรณmo hacer reconocimiento manual sin utilizar herramientas automatizadas como WPScan, Wappalyzer, Etcโ€ฆ

Bien, este es nuestra DMZ-MAchineWP

Un recorrido rรกpido por el sitio encontramos que en la secciรณn JOBS hay un formulario para subir CV.

Inspeccionar cรณdigo fuente encontramos una referencia hacia un plugins MW-WP-Form.

Ahora necesitamos confirmar que la versiรณn encontrada sea vulnerable. Para identificar la versiรณn podemos leer el archivo readme.txt que se instala junto con el plugins en la carpeta raรญz del mismo (example.com/wp-content/plugins/mw-wp-forms/readme.txt).

El Stable Tag:5.0.3 indica la versiรณn instalada del plugin, Buscando informaciรณn acerca del plugins encontraremos diferentes avisos de vulnerabilidades identificadas. En esta prueba nos basamos en la de tipo Arbitrary File Deletion.

https://wpscan.com/plugin/mw-wp-form

Pasamos a la explotaciรณn

Cargamos un pdf simulando un CV

Con BurpSuite interceptamos la peticiรณn que se genera al darle clic al boton Send.

La vulnerabilidad dice que se puede borrar cualquier archivo, ya que no tiene lรญmites definidos sobre los directorios que puede borrar archivos. Esto quiere decir que si modificamos el nombre del archivo que estamos enviando en el Request y colocamos otra ruta lo va a borrar.

Probaremos primero borrando un archivo que sabemos que existe, el readme.txt dentro de la carpeta de plugin de mw-wp-forms.

Al enviar obtenemos esta respuesta –> Archivo encontrado y borrado!!

Verificamos tratando de abrir otra vez el readme.txt –> example.com/wp-content/plugins/mw-wp-form/readme.txt/

Ahora otro mas importante el index.php en la raiz del sitio.

Respuesta  encontrado y borrado!!

Confirmando abrimos el sitio otra vez.

Hasta aquรญ la demostraciรณn. ยฟPero como es que un simple formulario se puede manipular para borrar archivos?

ยฟPor quรฉ se da esta vulnerabilidad?

El archivo se almacena en el servidor y se guarda en la base de datos si se selecciona la opciรณn ยซGuardar datos de la consulta en la base de datosยป en la configuraciรณn del formulario. Si el archivo no se guarda en la base de datos, elimina inmediatamente el archivo cargado despuรฉs de enviar el correo electrรณnico. En este escenario y en muchos no se configura para guardar los adjuntos en una base de datos ya que los vas a recibir por correo. Justo cuando se invoca la funciรณn de borrado de archivos no se valida correctamente la ruta permitiendo la vulnerabilidad.

Revisando el codigo fuente

Si descargamos el plugins y revisamos el cรณdigo encontraremos lo siguiente:

Revisando las classes encontramos el archivo que contiene la funciรณn de borrado de archivos –> /mw-wp-form/classes/services/class.mail.php

Dentro del archivo existe una condicional que invoca la funciรณn _delete_files()

// If not usedb, remove files after sending admin mail

if ( ! $this->Setting->get( 'usedb' ) ) {

$this->_delete_files();

}

Si revisamos que hace la funciรณn

/**

ย * Delete attachment files.

ย */

protected function _delete_files() {

foreach ( $this->attachments as $file ) {

if ( file_exists( $file ) ) {

unlink( $file );

}

}

Donde esta el error?

El unlink() es una funciรณn nativa de PHP que se utiliza para borrar archivos del sistema, pero si vemos se le estรก diciendo bรณrrame este archivo, pero como no existe validaciรณn de la ruta tambiรฉn borrara si se le indica otro archivo de otra ruta.

Una forma muy bรกsica de remediar esto es agregar la validaciรณn de la ruta:

Por ejemplo, __DIR__ es una constante de PHP que devuelve la ruta absoluta del directorio que contiene el archivo actual. Si tienes un archivo file.php en el directorio c:/vscode/myproject/, entonces __DIR__ devuelve la ruta c:/vscode/myproject/.

Luego, se utiliza la concatenaciรณn de strings para agregar el directorio /static a la ruta actual, lo que resulta en la ruta relativa c:/vscode/myproject/static/

$directory = realpath(__DIR__ . '/adjuntos');

$filename = 'archivo.pdf';

$filePath = $directory . '/' . $filename;

if (file_exists($filePath)) {

ย ย ย  unlink($filePath);

} else {

ย ย ย  echo 'El archivo no existe';

}

Ahora un ejemplo integrado al cรณdigo del formulario suponiendo que los archivos se cargan en el mismo directorio del archivo class.mail.php

protected function _delete_files() {

$directory = realpath(__DIR__ . '/adjuntos');

$filename = 'archivo.pdf';

ย ย ย  foreach ( $this->attachments as $file ) {

ย ย ย ย ย ย ย  $filePath = $directory . '/' . basename($file);

ย ย ย ย ย ย ย  if ( file_exists($filePath) ) {

ย ย ย ย ย ย ย ย ย ย ย  unlink($filePath);

ย ย ย ย ย ย ย  }

ย ย ย  }

}

Son ejemplos bรกsicos de remediaciรณn, pero con validaciones mas fuerte se puede hacer mejor.

FIN!!

Referencias: https://www.wordfence.com/blog/2024/01/1275-bounty-awarded-for-arbitrary-file-deletion-vulnerability-patched-in-mw-wp-form-wordpress-plugin/

,

5 3 votes
Article Rating
Subscribe
Notify of
guest
0 Comments