Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
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.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-28695-craft-rce-bypass — Ejecución remota de código autenticada y **a ciegas** en Craft CMS. Corrección para CVE-2026-28695 | Kitploit
Herramientas/GitHubGitHub/gbuyssens/cve-2026-28695-craft-rce-bypass
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPost-ExplotaciónPruebas de PenetraciónRed TeamingHerramienta de Acceso RemotoDesarrollo de Payloads
GitHubgbuyssens/cve-2026-28695-craft-rce-bypass

CVE-2026-28695-craft-rce-bypass

Ejecución remota de código autenticada y **a ciegas** en Craft CMS. Corrección para CVE-2026-28695

Ver Repositorio
1hace 5 díasAú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-28695 bypass de parche — RCE autenticado en Craft CMS ≤ 5.9.8 (element-search)

CVSS 3.x : 8.8 HIGH   (approx — verify)
CWE      : CWE-502 (Unsafe Object Instantiation) + CWE-1336 (SSTI origin)
Base     : CVE-2026-28695  (SSTI via create() + Symfony Process)
Fix      : advisory fix e31e508 (restricts create() to BaseObject) — BYPASSED here
Affects  : Craft CMS ≤ 5.9.8 with the CVE-2026-28695 fix applied

Ejecución remota de código autenticada y ciega en Craft CMS. El parche oficial para CVE-2026-28695 solo restringe create() a subclases de yii\base\BaseObject. El gadget yii\behaviors\AttributeTypecastBehavior es un BaseObject pero aún así alcanza un sink call_user_func(), por lo que sobrevive al filtro. Entregado a través de la acción no-Twig admin/actions/element-search/search, también esquiva CRAFT_ENABLE_TWIG_SANDBOX. Una cuenta de Content Editor es suficiente.


Tabla de contenidos

  • Resumen de la vulnerabilidad
  • Por qué el PoC de CVE-2026-28695 está muerto en 5.9.8
  • El bypass (cadena de gadgets)
  • La restricción de escapeshellcmd
  • Cadena de ataque
  • Versiones afectadas
  • Este repositorio
  • Uso
  • Remediación
  • Referencias

Resumen de la vulnerabilidad

El controlador element-search de Craft deserializa JSON del atacante en objetos PHP vivos a través de la maquinaria Craft::createObject() / Instance de Yii. Al adjuntar un AttributeTypecastBehavior cuyo attributeTypes mapea un atributo al callable [Psy\Readline\Hoa\ConsoleProcessus, execute] y disparar el evento beforeSave, el typecast se convierte en:

call_user_func([Psy\Readline\Hoa\ConsoleProcessus, "execute"], "<CMD>")

El endpoint siempre responde HTTP 500 y no devuelve salida del comando — la ejecución es ciega.


Por qué el PoC de CVE-2026-28695 está muerto en 5.9.8

  • CVE-2026-28695 = SSTI vía create() + Symfony Process, alcanzado desde un sink de Twig (típicamente Entry Types → Title Format).
  • En 5.9.8 el commit de corrección e31e508 restringe create() a subclases de BaseObject, y el objetivo también se ejecuta con CRAFT_ALLOW_ADMIN_CHANGES=false (settings → 403) y CRAFT_ENABLE_TWIG_SANDBOX=true. El vector documentado está triplemente cerrado.
  • Lección: confrontar la versión exacta contra el commit de corrección, no disparar sobre el nombre del CVE. Aquí el parche es más antiguo que la build desplegada → buscar un bypass del filtro, no el PoC crudo.

El bypass (cadena de gadgets)

yii\behaviors\AttributeTypecastBehavior  ->  Psy\Readline\Hoa\ConsoleProcessus::execute

Doble bypass, por construcción:

  1. Sandbox — element-search es una ruta de objeto PHP, no un render de Twig. CRAFT_ENABLE_TWIG_SANDBOX solo controla el motor de plantillas, por lo que nunca aplica.
  2. Parche — el parche restringe create() a BaseObject. AttributeTypecastBehavior → yii\base\Behavior → yii\base\BaseObject, por lo que satisface la nueva restricción mientras sigue ofreciendo un sink de ejecución. El parche cierra una familia de clases, no la clase BaseObject.

Endpoint:

POST /index.php?p=admin/actions/element-search/search
X-CSRF-Token: <dashboard csrf>
X-Requested-With: XMLHttpRequest
Accept: application/json

La restricción de escapeshellcmd

Hoa\ConsoleProcessus::execute() ejecuta el comando a través de escapeshellcmd():

  • Neutralizado: | && ; > < $() ' " → sin encadenamiento, sin pipes, sin redirección, sin reverse shell clásica de bash.
  • Pasa a través: : , /
  • Resultado: un binario + argumentos, sin metacaracteres de shell.

Por esto el payload es una shell bind única de socat TCP-LISTEN,fork EXEC (args en : / , / /) en lugar de una reverse shell.


Cadena de ataque

   Attacker (Content Editor)                Craft CMS 5.9.8
        |                                        |
        |  GET /admin/login  (scrape CSRF)       |
        |--------------------------------------->|
        |  POST users/login (jenny:******)       |
        |--------------------------------------->|
        |  GET /admin/dashboard (JS csrf)        |
        |<---------------------------------------|
        |  POST element-search/search            |
        |    AttributeTypecastBehavior gadget    |
        |    typecastBeforeSave = "<CMD>"        |
        |--------------------------------------->|  call_user_func(
        |  HTTP 500  (blind, no output)          |    [ConsoleProcessus,execute], CMD)
        |<---------------------------------------|  -> escapeshellcmd(CMD) -> exec
        |                                        |
        |  oracle: "sleep 5" -> +~5s latency     |
        |  shell:  socat TCP-LISTEN:4445 bind     |

Versiones afectadas

EstadoVersiones
VulnerableCraft CMS ≤ 5.9.8 con el parche de CVE-2026-28695
NotaEl gadget requiere una sesión autenticada en el CP

Este repositorio

ArchivoRol
exploit.pyPoC: login → verificación de oráculo temporal → cmd único → bind shell
README.mdEste archivo

Uso

Requiere requests (pip install requests).

# 1. Prove code execution (timing oracle: sleep 5 must add ~5s)
python3 exploit.py http://example.lab --check

# 2. Fire a single blind command (one binary + args, no metachars)
python3 exploit.py http://example.lab "sleep 5"

# 3. Plant a persistent bind shell as the web user, then connect
python3 exploit.py http://example.lab --bind 4445
nc IP or exemple.lab 4445

# custom creds
python3 exploit.py http://exemple.lab -u User -p 'SecureP4$$!' --bind

Qué ocurre:

  1. Scrapea el CSRF de login, autentica en el CP, obtiene el CSRF de la acción del dashboard.
  2. Envía el gadget AttributeTypecastBehavior a element-search.
  3. --check prueba la ejecución ciega mediante latencia inyectada; --bind despliega un listener socat.

Remediación

  1. Actualizar Craft CMS a una versión que restrinja la instanciación de objetos en todas las rutas de entrada deserializadas (no solo create()), y auditar el manejo de condiciones de element-search.
  2. Mantener CRAFT_ALLOW_ADMIN_CHANGES=false y minimizar los privilegios de Content Editor — la autenticación es la única precondición aquí.
  3. Eliminar/actualizar la dependencia incluida psy/psysh (Hoa) donde un gadget ConsoleProcessus::execute sea alcanzable.
  4. WAF/telemetría: alertar sobre cuerpos de element-search/search que contengan __class, as rce, o AttributeTypecastBehavior; marcar ráfagas de HTTP 500 desde esa acción.

Referencias

  • NVD — CVE-2026-28695 (SSTI base)
  • Commit de corrección de Craft CMS e31e508 (create() → restricción a BaseObject)
  • Documentación de Yii AttributeTypecastBehavior / yii\base\Security

Descargo de responsabilidad

Este proyecto es solo para pruebas de seguridad autorizadas, educación e investigación defensiva. Eres responsable de cumplir con las leyes aplicables y las reglas de engagement de tu laboratorio o cliente.

Descargar herramienta