RSS Feed
更好更安全的互联网

Roundcube 1.2.2 远程命令执行漏洞 漏洞分析

2016-12-13

Author: p0wd3r, LG (知道创宇404安全实验室) Date: 2016-12-08

0x00 漏洞概述


1.漏洞简介

著名的PHP代码审计工具 RIPS 于12月6日发布了一份针对 Roundcube扫描报告,报告中提到了一个远程命令执行漏洞,利用该漏洞攻击者可以在授权状态下执行任意代码。官方已发布升级公告

2.漏洞影响

触发漏洞需满足以下几个前提:

  1. Roundcube 使用 PHP 的 mail 来发送邮件,而不通过其他 SMTP Server
  2. PHP 的 mail 使用 sendmail 来发送邮件(默认)
  3. PHP 的 safe_mode 是关闭的(默认)
  4. 攻击者需要知道 Web 应用的绝对路径
  5. 攻击者可以登录到 Roundcube 并可以发送邮件

成功攻击后攻击者可远程执行任意代码。

3.影响版本

1.1.x < 1.1.7

1.2.x < 1.2.3

0x01 漏洞复现


1. 环境搭建

Dockerfile:

然后执行:

然后访问http://127.0.0.1:8080按步骤安装即可.

2.漏洞分析

首先看program/steps/mail/sendmail.inc第95-114行:

这里取$_POST中的_from赋值给$from,如果$from不是数字就交给rcmail_email_input_format处理,处理后如果返回非空则再过滤$from,使其满足正常 email 的形式。

我们看一下rcmail_email_input_format,在program/steps/mail/sendmail.inc第839-896行:

foreach中的正则仅匹配正常的from格式,即xxx@xxx,如果匹配不到则continue,所以如果我们提交xxx@xxx -a -b这样的“空格 + 数据”,函数最终并没有对其进行改变,返回的$result也就是空了,进而执行完函数后不会再对$from进行过滤。

接下来在program/steps/mail/sendmail.inc第528行:

$from被传入了deliver_message中,在program/lib/Roundcube/rcube.php第1524-1678行:

可以看到当我们使用PHP的mail函数来发送邮件时$from会被拼接到mail的第五个参数中,这个参数的用处如下:

add-para

意思就是PHP的mail默认使用/usr/sbin/sendmail发送邮件(可在php.ini中设置),mail的第五个参数就是设置sendmail的额外参数。

sendmail有一个-X参数,该参数将邮件流量记录在指定文件中:logfile

所以到这里攻击思路如下:

  1. 构造邮件内容为想要执行的代码
  2. 点击发送时抓包更改_from
  3. sendmail将流量记录到 php 文件中

实际操作一下:

首先登录 Roundcube 并开始发送邮件:admin-dashboard

点击发送,截包修改:

original

edited

其中将_from改成:example@example.com -OQueueDirectory=/tmp -X/path/rce.php,其中-X后的路径需根据具体服务器情况来设置,默认 Roundcube 根目录下temp/logs/是可写的。然后将_subject改成我们想要执行的代码,这里是<?php phpinfo();?>

请求有可能会超时,但是并不影响文件的写入。

发送过后触发漏洞:

phpinfo

3.补丁分析

patch

使用escapeshellarg$from被解析为参数值。

0x02 修复方案


升级程序:https://roundcube.net/news/2016/11/28/updates-1.2.3-and-1.1.7-released

 

0x03 参考


  1. Roundcube 扫描报告:

    https://blog.ripstech.com/2016/roundcube-command-execution-via-email/

  2. PHP 的 mail 函数:

    http://php.net/manual/zh/function.mail.php

作者:kk | Categories:安全研究 | Tags: