亿邮电子邮件系统远程命令执行漏洞分析(CNVD-2021-26422)

0x00 前言

北京亿中邮信息技术有限公司(亿邮)是一款专业的邮件系统软件及整体解决方案提供商。

亿邮电子邮件系统远程命令执行漏洞,攻击者利用该漏洞可在未授权的情况实现远程命令执行,获取目标服务器权限。

0x01 漏洞分析

刚拿到亿邮的代码,就简单看了下这次漏洞的成因,总的来说就是命令注入导致的命令执行漏洞,由于没动态调试,纯肉眼看难免会不当之处,敬请谅解。

漏洞起因在lib/php/ui/web/action/admin/em_controller_action_moni_detail.class.php

当传入的action参数为graph时,会进入到_get_graph函数

这块代码是整个漏洞的核心,当传入type参数时会进入到switch选择,但是如果不为case列表中的参数,则会进入到default里面,最终进入到set_metricname函数,有经验的同学看到set起头的函数,应该都知道,这是一个用来给condition进行key-value赋值的函数,接着又将condition作为参数,通过set_graph的形式赋值给了graph的graph键,最后进行draw。

其实看到这里已经能够猜到了,最后的draw一定调用了执行命令的参数,并且是对condition参数进行了某种形式的拼接,从而产生的漏洞,那么带着这样的思路,进入到draw函数里面去看。

首先来看上面提到的set_graph函数,看看我们可控的type,继而控制的condition参数是如何进行赋值的

这里可以看到,首先通过get_metricname函数将我们赋值进行的type参数给取了出来,然后赋值给metricname变量,之后又通过调用lib/php/monitor/em_monitor_adapter_metric.class.php,这里为什么是em_monitor_adapter_metric.class.php,重点看上面是如何进行graph变量赋值的,还是switch函数最终进入到default,然后将condition['graph']设置为metric,跟进到em_monitor_adapter_metric.class.php的graph_metric函数,在这个地方进行了profile的定义

其实只要看metricname即可,可以看到我们可以控制的type变量经过conditoin['metricname'],经过metricname,最后赋值给了rrdtool_graph['title'],并且这里比较关键的是如何进行字段拼接,重点看上面set_graph函数,rrdtool_graph作为return变量付给了profile,然后对profile的key/value进行检查,如果value为字符串,则用引号包裹,那么其实有点类似于"--title '$type'"这样,到这里已经有点水落石出的意思。

最后我们来到graph->draw函数

通过空格进行切割,用passthru来执行command变量,看到这里,就应该能知道怎么执行命令了。通过查看/tmp/monitor.log也应证了我的猜想。

所以这里的type就成功注入到执行的命令里去了。

0x02 漏洞测试

0x03 补丁分析

简单看了下补丁的可执行文件,比较简单粗暴,将ui/web/action/admin/em_controller_action_admin_moni_setting.class.php ui/web/action/admin/em_controller_action_admin_moni_fav.class.php ui/web/action/admin/em_controller_action_admin_moni_detail.class.php三个文件都进行了删除,实际上如果你看这三个文件,会发现都有同样的命令注入问题,这么这么简单粗暴的修复也何尝不是一种解决办法。

0x04 后记

在分析过程中由于没有动态调试,有一点看的不是明白,那就是如何未授权这个点,在ui/web/action/admin/em_controller_action_admin_moni_setting.class.php这些文件中实际上都进行了权限认证

这里根据笔者逻辑来走,应该是返回false,最终return空,导致下面的流程进行不下去,所以这点上还是有点不太明白,需要进一步结合整个框架源码深入分析。