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

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

缺陷编号: WooYun-2015-105310

漏洞标题: ORICO NAS网络存储服务器远程任意命令执行等多个漏洞

相关厂商: ORICO

漏洞作者: 路人甲

提交时间: 2015-04-04 11:59

公开时间: 2015-07-06 11:18

漏洞类型: 设计不当

危害等级: 高

自评Rank: 20

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

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

Tags标签: 设计不当

1人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

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

简要描述:

ORICO Technologies Co.,Ltd. (深圳市元创时代科技有限公司)是电脑/数码周边产品的全球领先厂商,旗下品牌ORICO(奥睿科)透过基于"EASY YOU PC"原创设计理念,让您轻松享受科技数码时代的乐趣,为您的笔记本电脑、PC台式机、平板电脑以及智能手机等终端设备添加更多乐趣!您可以尽享ORICO给您带来的各种电脑,数码配件产品!ORICO致力于为电脑、数码和智能终端产品用户提供创新与易于使用的用户体验。ORICO公司旗下拥有完整的产品研发,模具制造,注塑,五金冲压、生产组装、市场推广服务专业产品研发生产产业链,我们能实时、有效、快速地提供符合用户需求的创新型产品,ORICO拥有最全面的 电脑/数码周边外设配件产品,包括存储、网络、WIFI、蓝牙、USB周边、电脑、智能手机等产品,同时,我们还为业界知名企业提供OEM/ODM服务。
ORICO的NAS网络存储服务器存在远程任意命令执行漏洞。

详细说明:

该漏洞通杀ORICO所有系列的NAS设备,包括3529NAS、3529U3RF、3549NAS、3549U3RF、3559NAS、3559U3RF、NTG-LU、 7618NAS、7618U3RF等等,固件版本为官网最新(2014-8-5),参见此处http://**.**.**.**/DriverDownload.html。



漏洞起因在于一处代码没有进行必要的身份认证,导致任意访问者均可利用其设计错误进行远程任意命令执行。



ORICO NAS的WEB管理界面下的绝大多数php页面都在头部进行了必要的身份认证,代码如下:

code 区域
<?php
/* Check Login */
include_once('php/html/check.login.php');



check.login.php的代码如下:

code 区域
<?php
if (empty($_COOKIE['PHPSESSID'])){
session_set_cookie_params(14400);
session_start();
}else{
session_start();
setcookie("PHPSESSID", session_id(), time() + 14400);
}
if(session_is_registered('login') && $_SESSION['login'] != '') {

} else {
header("location:/webman/login.php");
exit();
}
?>



未经合法身份认证的访问者在访问受保护页面时因为session中的login变量没有值,所以会被直接重定向到login.php页面,无法继续访问敏感内容。

然而百密一疏,在/webman/php/html/login.base.php文件中却缺少该项必要的检查,从而导致堡垒被攻破。login.base.php的代码如下:

code 区域
<?php
$action = $_GET['action'];
if ($action == 'login') {
$username = $_GET['username'];
$password = $_GET['password'];
$clienttime = $_GET['clienttime'];
$execcmd = '/etc/rc.d/CheckUser.sh -u ' . $username . ' -p ' . $password;
$result = exec($execcmd);
if($result == 'pass') {
$execcmd = '/bin/date -u -s '.$clienttime;
exec($execcmd);
session_start();
setcookie("PHPSESSID", session_id(), time() + 30);
$_SESSION['login'] = $username;
……
echo 'success';
} else {
echo 'failure';
}
}
?>



从代码中可以看出,页面无身份检查步骤,用户输入的username和password及clienttime变量没有进行必要的过滤,导致任意访问者均可通过上述三个变量进行命令注入,带入下面的exec函数,引发远程命令执行。

普通的命令执行在很多案例中均有探讨,在此不做过多解释,可以自由发挥,进行文件上传下载、内网扫描等都不是问题,这里仅做一个比较有意思的测试,在上面的代码中我们注意到这样一个比较语句:

code 区域
$result = exec($execcmd);
if($result == 'pass') {



很显然,该代码的本意是$execcmd变量中的内容被系统执行后如果返回的结果是"pass"则代表身份验证通过,可以执行后面的代码,但此处因为有了命令注入和exec函数的特殊之处,导致我们不需要口令就可轻松取得合法身份进行访问,我们知道,exec函数的返回值为系统执行后的最后一行,因此我们只要在注入的命令中让最后的输出行内容为"pass"即可取得一个被系统承认的session,具体方法请看下面的测试代码部分,如果这时的username为admin,则获取的seesion就有了管理员权限,有了系统承认的管理员session,我们就可以正常访问/webman/index.php页面,对NAS进行任意操作了,想看文件就看文件,想改配置就改配置,想关机就关机,想升级固件就升级固级。



对文档路径下的所有页面进行代码审核发现,还有多处存在命令注入漏洞,但是这些页面因为有身份检查,所以危害性没有上面的漏洞强,必须要有合法的管理员身份做为前提,举个例子,如/webman/php/html/03.base.php,代码见下:

code 区域
<?php
include_once ('check.login.php');
if( $_SESSION['login'] != 'admin'){
header("location:/webman/login.php");
exit();
}
$action = $_GET['action'];
if($action == 'saveUser'){
$userRowData = $_GET['rowData'];
if($userRowData[1] != null && $userRowData[1] != ''){
$execcmd = '/etc/rc.d/SetUserAccount.sh -u ' . $userRowData[0] . ' -p ' . $userRowData[1];
$result = exec($execcmd);
}



类似这样调用exec函数的地方还有不少,用户的输入没有任何检查过滤就拼接进$execcmd变量,这里就不一一列举了。



普通用户虽然不能进行命令注入执行,但有一处任意文件下载漏洞,在/webman/php/html/downloadFile.php中,没有对输入的文件路径进行过滤检查,用户可以利用../的组合绕过设定的路径检测来获取任意敏感文件,页面代码如下:

code 区域
<?php
include_once ('check.login.php');
$filename=stripslashes($_GET["fileName"]);
$file=$_GET["src"];
$absolutepath="/mnt/sda1/home/" . $_SESSION['login'];
if(strncmp($file,$absolutepath,strlen($absolutepath))!= 0){
header("location:/webman/login.php");
exit();
}
$newString = str_replace("*","/",$file);
$createPath = $newString;
$createPath = stripslashes($newString);
header("Content-type: application/octet-stream");
$sendfile_file = str_replace( ',' , '%2c' , rawurlencode($createPath));
header('Content-Disposition: attachment; filename="'.$filename.'"');
header("X-Sendfile2: $sendfile_file 0-");
?>



上面的路径检测很简单,只判断strncmp($file,$absolutepath,strlen($absolutepath))!= 0,用户只要让$_GET["src"]的前面部分为【/mnt/sda1/home/用户名/】即可符合条件,后面部分可以添加任意../的组合进行路径回溯,最后配合想要的文件路径取得感兴趣的文件。这个应该是很普通的绕过方法,此处不做详细解释了。

漏洞证明:

在浏览器地址栏中输入下面测试代码中的URL,如果获取到的页面显示success则证明攻击成功。可以在地址栏中输入http://hostname/webman/index.php进行管理操作。

样例:(都是网上搜的,不保证时刻存活)

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

**.**.**.**

修复方案:

身份检查,用户输入过滤。

版权声明:转载请注明来源 路人甲@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2015-04-07 11:16

厂商回复:

CNVD确认并复现所述情况(确认通用性还需进一步实例证明),由CNVD通过公开联系渠道尝试向设备生产厂商通报。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共0人评价):
登陆后才能进行评分

评价

  1. 2015-04-02 12:02 | YY-2012 ( 核心白帽子 | Rank:3726 漏洞数:720 | 意淫,是《红楼梦》原创的词汇,但后来演变...)
    0

    我知道你是谁。

  2. 2015-04-02 12:15 | 红客十年 ( 普通白帽子 | Rank:392 漏洞数:80 | 去年离职富士康,回到家中上蓝翔,蓝翔毕业...)
    0

    @YY-2012 大牛,我是来看你头像的…头像不错赞一个

登录后才能发表评论,请先 登录