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
wpgarlic — Un fuzzer de plugins de WordPress de prueba de concepto | Kitploit
Herramientas/GitHubGitHub/kazet/wpgarlic
Análisis de VulnerabilidadesSeguridad WebFuzzing
GitHubkazet/wpgarlic

wpgarlic

Un fuzzer de plugins de WordPress de prueba de concepto

Ver Repositorio
200235hace 2 añosRevisado por Kitploit

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

wpgarlic

Un fuzzer de plugins de WordPress como prueba de concepto que llevó al descubrimiento de más de 300 vulnerabilidades en plugins de WordPress instalados en casi 30 millones de sitios.

La técnica utilizada se describe en https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html

Si deseas continuar la investigación, comienza con plugins menos populares: si un plugin alcanzó al menos 10 000 instalaciones activas entre octubre de 2021 y enero de 2024, lo más probable es que ya haya revisado los informes del fuzzer (y me centré especialmente en plugins con al menos 20 000 instalaciones activas). Debido a la gran aleatoriedad en el funcionamiento del fuzzer, algunas vulnerabilidades en estos plugins pueden permanecer sin descubrir, aunque son menos.

Los informes del fuzzer contienen muchos falsos positivos: la mayoría no indican una vulnerabilidad. Después de ver un informe, primero analiza si el comportamiento que observas es realmente una vulnerabilidad o un falso positivo. No envíes informes crudos del fuzzer a WPScan o a los proveedores; en su lugar, proporciona un exploit PoC.

Ejemplos

Por razones obvias, los ejemplos contendrán solo vulnerabilidades que ya han sido corregidas.

Lectura arbitraria de archivos

Supongamos que estás fuzzeando responsive-vector-maps en la versión 6.4.0:

root@kitploit:~
./bin/fuzz_object plugin responsive-vector-maps --version 6.4.0

(para fuzzear la última versión, simplemente omite --version).

Descargar herramienta

Una vez que el fuzzing finalice (lo que tomaría entre 10 y 30 minutos para este plugin), puedes ejecutar:

root@kitploit:~
./bin/print_findings data/object_fuzz_results/

Verás, entre otros:

responsive-vector-maps fuzzer output example.

Eso significa que el fuzzer detectó la ejecución de fopen() sobre un payload conocido. La mayoría de los payloads contienen la palabra GARLIC para facilitar la detección automática en la salida. Puedes verlos o configurarlos en docker_image/magic_payloads.php.

Luego, puedes examinar el código fuente y notar que el endpoint wp_ajax_rvm_import_markers usa el contenido del archivo para generar la salida, lo que permite leer archivos arbitrarios en el servidor: CVE-2021-24947.

Lo que ves en blanco es un crash considerado interesante (puedes modificarlos o agregar nuevos en crash_detectors.py). El verde es el contexto. En azul ves el nombre del archivo del informe (con el nombre del plugin), la popularidad del plugin y el nombre del endpoint (aquí: el nombre de la acción ajax).

Los datos en amarillo son los payloads que se inyectaron en qué variables.

XSS reflejado

Supongamos que estás fuzzeando page-builder-add en la versión 1.4.9.4:

root@kitploit:~
./bin/fuzz_object plugin page-builder-add --version 1.4.9.4

Después de imprimir los resultados, verás que un payload conocido se ha reflejado en la salida:

page-builder-add fuzzer output example.

Luego puedes probar manualmente si realmente este lugar (recuerda: en azul tienes el nombre del endpoint, aquí: el nombre de la página del menú) es vulnerable a XSS. En este caso, lo es: CVE-2021-25067.

Actualización de opciones que lleva a XSS almacenado

root@kitploit:~
./bin/fuzz_object plugin duplicate-page-or-post --version 1.4.6

Después de imprimir los resultados, verás que se llama a update_option:

duplicate-page-or-post fuzzer output example.

El análisis del código del endpoint te indicará que esto efectivamente lleva a una vulnerabilidad de XSS almacenado: CVE-2021-25075.

Falsos positivos

Desafortunadamente, para la mayoría de los plugins el fuzzer no encuentra ningún crash interesante, y para el resto, la mayoría de los informes son falsos positivos. Por ejemplo, si ves:

root@kitploit:~
Call: wp_mail arguments={'to': '[email protected]', 'subject': '[Plugin contact]  - http://GARLICGARLICGARLIC.example.com'}

Esto puede significar que wp_mail sí se llama, pero no controlas el destinatario ni la mayor parte del asunto. Si quieres estar seguro, revisa el código fuente del plugin.

Consejos adicionales para leer los informes del fuzzer

  • Si ves el mensaje: May as well be equal: ... and ... — eso significa que se activó el mecanismo para simular que un payload conocido es igual a cualquier otra cadena (descrito en https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html#patched-equality).
  • Si ves __GARLIC_ACCESSED__ _FILES[files] __ENDGARLIC__ — eso indica que se detectó el acceso a un archivo subido. No se realizan más comprobaciones por ahora; para verificar si esto es una vulnerabilidad, examina el código.
  • A veces, lo que el fuzzer inyecta en los parámetros GET, POST, etc., no es reproducible en el mundo real: por ejemplo, no puedes inyectar nada en $_GET['page'] si deseas que se muestre una página de menú específica.

Hoja de referencia de uso

La primera ejecución del fuzzing o de las pruebas puede tomar alrededor de una hora, porque necesitamos construir la imagen Docker con PHP y WordPress instrumentados.

Fuzzear un plugin por nombre

root@kitploit:~
./bin/fuzz_object plugin PLUGIN_SLUG

Fuzzear un tema por nombre

root@kitploit:~
./bin/fuzz_object theme THEME_SLUG

Fuzzear un plugin desde un archivo

También puedes instalar un plugin desde un archivo zip local:

root@kitploit:~
./bin/fuzz_object plugin PLUGIN_FILE_NAME.zip

Imprimir hallazgos

Para imprimir lo que encontró el fuzzer, usa:

root@kitploit:~
./bin/print_findings data/object_fuzz_results/

Ejecutar las pruebas

Para ejecutar las pruebas, usa:

root@kitploit:~
./bin/test

Advertencia: las pruebas toman mucho tiempo (más de una hora) y, como verifican si el fuzzer encontraría vulnerabilidades, fallan con cierta probabilidad.

Reformatear código y ejecutar linters

wpgarlic usa pre-commit para ejecutar linters y formatear el código. pre-commit se ejecuta en CI para verificar que el código esté formateado correctamente.

Para ejecutarlo localmente, usa:

root@kitploit:~
pre-commit run --all-files

Para configurar pre-commit para que se ejecute antes de cada commit, usa:

root@kitploit:~
pre-commit install

Entorno de pruebas manuales

Puedes iniciar un entorno de prueba con solo un plugin instalado usando:

root@kitploit:~
./bin/manual_testing PLUGIN_SLUG|PLUGIN_PATH.zip [version]

Puedes instalar un plugin usando su slug o desde un archivo zip local.

Escuchará en http://127.0.0.1:8001/

Habrá dos usuarios de prueba en la base de datos:

  • usuario: admin, contraseña: admin, privilegios: administrador
  • usuario: subscriber, contraseña: subscriber, privilegios: suscriptor

Extender y configurar el fuzzer

Esta herramienta es una prueba de concepto — esta sección contiene lugares donde se puede mejorar para encontrar más vulnerabilidades.

Puedes editar filtering.py — contiene las reglas que determinan si un crash particular se considera importante o no. Si las cambias, puedes tener más falsos positivos, pero también encontrar más vulnerabilidades. Por ejemplo, el único encabezado que considero interesante cuando se emite es el encabezado Location, para detectar vulnerabilidades de Open Redirect. Esa es solo una idea y puedes tener otras.

Otro archivo que vale la pena extender es docker_image/patch_wordpress.sh. Describe las llamadas a qué funciones se registrarán como interesantes.

Si deseas inyectar otros payloads (o cambiar las probabilidades con las que se inyectan), edita docker_image/magic_payloads.php y docker_image/fuzz/config.py.

crash_detector.py contiene expresiones regulares que encuentran crashes interesantes o información interesante (por ejemplo, correos electrónicos) que se expone.

Se ha deshabilitado el fuzzing de rutas REST como administrador con sesión iniciada porque generaba falsos positivos. Descomenta rest_routes_admin en config.DEFAULT_ENABLED_FEATURES para cambiarlo.

Funcionamiento interno del fuzzer

Listas negras

Algunos plugins necesitan otros (por ejemplo, woocommerce) como dependencia. Al fuzzear un plugin que tiene una dependencia, queremos fuzzear solo el plugin elegido y omitir las acciones AJAX, rutas REST y páginas de menú de la dependencia. Queremos fuzzear las acciones/rutas/páginas de woocommerce solo cuando hemos seleccionado woocommerce para fuzzear.

La lista de acciones/rutas/páginas de dependencias se llaman listas negras y se enumeran en docker_image/blocklists/. Los archivos denominados common contienen las acciones/rutas/páginas del núcleo de WordPress; tampoco queremos fuzzearlas.

Para actualizar estas listas negras, usa ./bin/update_blocklists.

FAQ

El fuzzer encontró algo, ¿es esto una vulnerabilidad?

Quizás. Instala el plugin en un entorno de prueba local (por ejemplo, puedes usar el descrito en la sección Entorno de pruebas manuales) y analiza el error.

El fuzzer no encontró nada, ¿el plugin es seguro?

No des por sentado eso. El fuzzer encuentra algunas clases de vulnerabilidades, pero tiene sus limitaciones.

El fuzzer no encuentra nada para la mayoría de los plugins; el propósito de la herramienta es más bien escanear masivamente una gran cantidad de plugins de WordPress, no realizar pruebas exhaustivas de un solo plugin.

El fuzzer encontró algo en una ejecución, pero no en la siguiente. ¿Qué pasó?

Es posible. El fuzzer elige payloads aleatoriamente e introduce aleatoriedad en otros lugares (por ejemplo, cómo debe comportarse el operador == en los casos descritos en https://kazet.cc/2022/02/03/fuzzing-wordpress-plugins.html#patched-equality).

¿No funciona? ¿Tienes una pregunta?

Abre un ticket en Github o envíame un correo electrónico: [email protected].