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/alexb616/sessionreaper-cve-2025-54236
Análisis de VulnerabilidadesAnálisis de CódigoExplotaciónExplotación de Aplicaciones WebPruebas de PenetraciónRed TeamingDesarrollo de Payloads
GitHubalexb616/sessionreaper-cve-2025-54236

SessionReaper-CVE-2025-54236

PoC Magento Session Reaper - CVE-2025-54236

Ver Repositorio
112hace 2 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

SessionReaper — CVE-2025-54236

PoC unificado para CVE-2025-54236 ("SessionReaper"), un RCE crítico sin autenticación en Magento 2 / Adobe Commerce mediante deserialización anidada en la API REST.

  • CVSS: 9.1 (Crítico)
  • Causa raíz: Validación de entrada incorrecta (CWE-20) en ServiceInputProcessor; la primitiva del exploit es la deserialización insegura (CWE-502)
  • Investigador original: Daniel "Blaklis" Le Gall (divulgación responsable vía HackerOne)
  • Nombre acuñado por: Sansec
  • Corregido en: Adobe APSB25-88 (parche de emergencia, 2025-09-09)

Solo para pruebas de seguridad autorizadas. Utilícelo exclusivamente contra sistemas que sean de su propiedad o para los que tenga permiso escrito explícito para probar.


Qué hace

La herramienta encadena tres etapas comunes a todos los vectores, además de un disparador:

  1. Generación del gadget — phpggc -se -a Guzzle/FW1 <remote_path> <payload.php> construye un objeto serializado que escribe payload.php en <remote_path> al ser deserializado.
  • Subida de sesión falsa — POST /customer/address_file/upload almacena el blob serializado como sess_<SESSID>. Magento distribuye los archivos de direcciones subidos según los primeros caracteres del nombre de archivo, por lo que termina en media/customer_address/s/e/sess_<SESSID> (de ahí el s/e/ en --save-path).
  • Redirección de save_path — un payload REST anidado construye Session\Config y, mediante setSavePath() → setOption() → ini_set('session.save_path', ...) (un efecto secundario global del proceso), apunta el manejador de sesiones de PHP al blob subido.
  • Disparador — una petición con Cookie: PHPSESSID=<SESSID> obliga a session_start() a leer y unserialize() el archivo envenenado, activando el gadget y escribiendo el payload.

  • Vectores

    Los tres vectores llegan al mismo sink (context → urlBuilder → session → sessionConfig → savePath). Solo se diferencian en el endpoint, el verbo HTTP y el módulo de Magento implicado — útil cuando un WAF o un módulo deshabilitado bloquea un endpoint pero no otro.

    MétodoEndpointVerboPunto de entrada en la cadena
    order/rest/<store>/V1/guest-carts/abc/orderPUTpaymentMethod → paymentData → Payment\Helper\Data
    checkmo/rest/<store>/V1/guest-carts/abc/set-payment-informationPOSTpaymentMethod → paymentData → Payment\Helper\Data
    address/rest/<store>/V1/guest-carts/abc/estimate-shipping-methodsPOSTaddress → addressConfig → addressHelper → Customer\Helper\Address

    No se requiere ningún carrito real para ningún vector. ServiceInputProcessor deserializa los parámetros del método durante la resolución de entrada — antes de que el servicio invoque cualquier búsqueda de carrito — por lo que un cartId ficticio de abc llega al sink en los tres. El consiguiente error de "carrito no encontrado" (404/500) es esperado y confirma que el efecto secundario de la deserialización ya se ha disparado.

    Hay una bandera --sku disponible si desea que la herramienta cree un carrito de invitado real y añada un producto antes de disparar (verificado vía GraphQL). Esto es opcional y no es necesario para la explotación; existe solo para entornos donde prefiera un flujo de compra totalmente realista. Omítala y la herramienta usará el carrito ficticio abc.


    Requisitos previos

    • Almacenamiento de sesiones basado en archivos (var/session/). Las sesiones respaldadas por Redis y bases de datos no se ven afectadas por esta cadena RCE específica. Esto no se puede enumerar de forma remota, por lo que debe intentarse a ciegas.
    • /customer/address_file/upload accesible sin autenticación.
    • Objetivo sin parchear (anterior a APSB25-88 / anterior al hotfix 2.4.x).

    Requisitos

    • Python 3.8+ con requests
    • phpggc — se detecta automáticamente en PATH, en ubicaciones de instalación habituales, o se descarga la imagen Docker ambionics/phpggc como alternativa
    • payload.php en el mismo directorio que el script (debe comenzar con <?php)
    root@kitploit:~
    pip install requests
    git clone https://github.com/ambionics/phpggc /opt/phpggc   # or: docker pull ambionics/phpggc
    

    Uso

    root@kitploit:~
    # order (original vector) — no cart, no credentials
    python3 session_reaper.py --host https://target.com --method order
    
    # checkmo — payments endpoint, Spanish store scope for the REST API
    python3 session_reaper.py --host https://target.com --method checkmo --api-store es
    
    # address — shipping endpoint
    python3 session_reaper.py --host https://target.com --method address --api-store all
    
    # optional: exercise a real cart flow with a known SKU (not required)
    python3 session_reaper.py --host https://target.com --method address --sku PROD-001
    

    Opciones

    BanderaPor defectoDescripción
    --host(obligatorio)URL base del objetivo
    --method(obligatorio)address | checkmo | order
    --storedefaultCódigo de tienda para la petición de disparo (y el carrito, si se usa --sku)
    --api-storedefaultCódigo de tienda en la URL del endpoint de deserialización (all | es | default | personalizado)
    --sku(ninguno)Opcional. Si se establece, crea un carrito de invitado real con este SKU. No es necesario.
    --payload-inpayload.phpPayload PHP a escribir en el objetivo
    --payload-out/var/www/html/pub/errors/404.phpRuta de escritura remota (debe ser una ubicación ejecutable por web — ver nota a continuación)
    --save-pathmedia/customer_address/s/e/savePath inyectado en la cadena del gadget
    --phpggc(automático)Ruta explícita al binario phpggc
    --proxyhttp://127.0.0.1:8081Proxy HTTP (p. ej. Burp)
    --no-proxydesactivadoDeshabilitar el proxy
    --username / --password(ninguno)Credenciales de cliente opcionales para un token Bearer

    Ámbitos de tienda

    La herramienta utiliza dos códigos de tienda independientes:

    • --api-store — el ámbito en la URL de la petición de deserialización (/rest/<api-store>/V1/guest-carts/...), donde se ejecuta ServiceInputProcessor.
    • --store — el ámbito para la petición de disparo (GET /<store>/) y, si se usa --sku, para las peticiones del carrito.

    Los códigos de vista de tienda los define el administrador; no asuma es/fr. Enumere primero las vistas de tienda activas — una petición contra un ámbito inexistente simplemente falla.


    Destino del payload — por qué pub/errors/404.php

    La configuración Nginx predeterminada de Magento solo pasa siete archivos PHP a fastcgi_backend:

    root@kitploit:~
    index.php, get.php, static.php,
    errors/report.php, errors/404.php, errors/503.php, health_check.php
    

    Cualquier otro .php (incluido cualquier archivo que se deje en pub/media/) es denegado y nunca se ejecutará. Por lo tanto, el payload debe sobrescribir uno de estos siete archivos de la lista blanca en lugar de crear uno nuevo. pub/errors/404.php es el predeterminado porque Magento lo renderiza internamente ante cualquier página inexistente, por lo que se ejecuta con frecuencia en una tienda en producción.

    OPSEC: sobrescribir 404.php por completo es ruidoso (se ejecuta en cada 404). En una intervención real, inyecte una puerta trasera en un archivo de la lista blanca de forma sutil en lugar de sobrescribirlo.


    Notas

    • La herramienta opera como invitado por defecto. --username/--password solo son necesarios si desea un token Bearer para una configuración específica.
    • Espere un 404/500 en la petición de deserialización — eso es normal y no significa un fallo.
    • Limpieza: el archivo temporal /tmp/sess_<SESSID> se elimina al salir.

    Referencias

    • Aviso de Adobe APSB25-88
    • Sansec — divulgación de SessionReaper
    • Searchlight Cyber (Assetnote) — PoC original del RCE
    • Pentest-Tools.com — informe sobre el desarrollo del exploit
    • NVD — CVE-2025-54236

    Descargo de responsabilidad

    Proporcionado solo para investigación y pruebas de seguridad autorizadas. El autor no asume ninguna responsabilidad por el mal uso. No lo ejecute contra sistemas sin permiso explícito.

    Descargar herramienta