西部数据MyCloud NAS漏洞分析与利用详解

本文详细分析了西部数据MyCloud网络附加存储设备中的多个安全漏洞,包括登录绕过、命令注入和任意文件上传等,揭示了设备Web界面中的严重安全缺陷及其利用方法。

西部数据MyCloud NAS漏洞分析与利用

登录绕过漏洞

在分析西部数据MyCloud设备时,发现了第一个令人震惊的漏洞。该漏洞基于执行用户登录检查的代码,但使用的是cookie或PHP会话变量。

漏洞代码分析

/lib/login_checker.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
function login_check()
{
    $ret = 0;
    if (isset($_SESSION['username']))
    {
        if (isset($_SESSION['username']) && $_SESSION['username'] != "")
            $ret = 2; //普通用户登录

        if ($_SESSION['isAdmin'] == 1)
            $ret = 1; //管理员登录
    }
    else if (isset($_COOKIE['username']))
    {
        if (isset($_COOKIE['username']) && $_COOKIE['username'] != "")
            $ret = 2; //普通用户登录

        if ($_COOKIE['isAdmin'] == 1)
            $ret = 1; //管理员登录
    }
    return $ret;
}

上述代码包含一个名为"login_check"的函数,该函数被所有后端PHP脚本用于验证预认证用户。代码有两条路径:一条检查会话值"username"和"isAdmin",另一条(如果前者失败)尝试使用cookie完成相同过程。

由于cookie由用户提供,攻击者可以满足脚本查找的要求。会话和cookie的上述过程总结如下:

  • “username"变量已设置且不为空 - 用户以普通权限用户身份登录
  • “isAdmin"变量设置为1 - 用户以管理员身份登录

这意味着只要PHP脚本中有登录检查,攻击者就能通过提供2个特制的cookie值来绕过检查。

补丁与新的漏洞

在编写发现结果的过程中,推出了新的固件修补了上述错误。然而,这个补丁引入了与原始漏洞(更新前)具有相同后果的新漏洞。

/var/www/web/lib/login_checker.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function login_check()
{
    $ret = 0;

    if (isset($_SESSION['username']))
    {
        if (isset($_SESSION['username']) && $_SESSION['username'] != "")
            $ret = 2; //普通用户登录

        if ($_SESSION['isAdmin'] == 1)
            $ret = 1; //管理员登录
    }
    else if (isset($_COOKIE['username']))
    {
        if (isset($_COOKIE['username']) && $_COOKIE['username'] != "")
            $ret = 2; //普通用户登录

        if ($_COOKIE['isAdmin'] == 1)
            $ret = 1; //管理员登录

        if (wto_check($_COOKIE['username']) === 0) //wto检查失败
            $ret = 0;
    }

    return $ret;
}

在更新版本的代码中,调用了新方法"wto_check()"(第40行)。此函数在设备上运行一个二进制文件,将客户端提供的用户名和用户IP地址作为参数。

/var/www/web/lib/login_checker.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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;
}

在上面可以看到,第11行的命令被格式化为包含用户名和IP地址作为"wto"二进制文件的参数。问题在于错误使用了PHP方法"escapeshellcmd()",该方法的预期用途是处理整个命令字符串,而不仅仅是参数。

这是因为"escapeshellcmd()“函数不转义引号,因此允许攻击者突破封装引号(在我们的例子中是”-n"参数),允许向二进制文件提供新参数。因此,我们可以添加新参数并自行登录用户,而不是实际检查用户是否已登录。

命令注入漏洞

WDCloud Web界面的大部分功能实际上由设备上的CGI脚本处理。大多数二进制文件使用相同的模式:它们从请求中获取post/get/cookie值,然后在PHP调用中使用这些值来执行shell命令。在大多数情况下,这些命令将使用用户提供的数据,很少或没有清理。

漏洞示例

php/users.php

1
2
$username = $_COOKIE['username'];
exec("wto -n \"$username\" -g", $ret);

上面的代码将来自COOKIE超全局变量的值分配给局部变量”$username”。然后该值立即在PHP"exec()“调用中用作本地"wto"二进制文件的参数。

由于没有清理,使用如下的用户名值:

1
username=$(touch /tmp/1)

将现有的exec命令转换为:

1
wto -n "$(touch /tmp/1)" -g

并在其中执行用户提供的命令。

因为参数用双引号封装,我们使用”$(COMMANDHERE)“语法,命令"touch /tmp/1"在"wto"二进制文件执行之前执行,其返回值用作”-n"参数。

其他错误

认证被注释掉的例子

addons/ftp_download.php

1
2
3
4
5
6
7
8
//include ("../lib/login_checker.php");
//
///* login_check() return 0: no login, 1: login, admin, 2: login, normal user */
//if (login_check() == 0)
//{
//      echo json_encode($r);
//      exit;
//}

允许未认证用户上传文件的漏洞

addons/upload.php

1
2
3
4
5
6
7
$path = str_replace('//','/',$_REQUEST['folder']);
$filename = str_replace('\\','',$_REQUEST['name']);
$target =  $path . $filename . '-' . $_REQUEST['index'];

move_uploaded_file($_FILES['file']['tmp_name'], $target);

sleep(1);

上述代码不包含身份验证检查,调用时只会检索上传的文件内容并使用用户提供的路径来确定新文件的放置位置。

漏洞统计

  • 1 x 登录绕过
  • 1 x 任意文件写入
  • 13 x 未经身份验证的远程命令执行漏洞
  • 70 x 需要身份验证的命令执行漏洞*

*“需要身份验证"的漏洞可以通过登录绕过漏洞访问

受影响设备范围

大部分(如果不是全部)研究结果可以应用于整个西部数据MyCloud产品系列,包括以下设备:

  • My Cloud
  • My Cloud Gen 2
  • My Cloud Mirror
  • My Cloud PR2100
  • My Cloud PR4100
  • My Cloud EX2 Ultra
  • My Cloud EX2
  • My Cloud EX4
  • My Cloud EX2100
  • My Cloud EX4100
  • My Cloud DL2100
  • My Cloud DL4100

负责任的披露

在Exploitee.rs,我们通常尝试与供应商合作,确保漏洞得到适当修复。然而,在参加了上次BlackHat Vegas的Pwnie Awards后,我们了解了该供应商在社区中的声誉。特别是,该供应商在忽视向他们报告的一组错误的严重性的情况下赢得了"最差供应商响应Pwnie奖”。

忽视这些错误将使易受攻击的设备在公开网络上停留更长时间,而负责任的披露正在解决。相反,我们试图提醒社区注意这些缺陷,并希望用户将其设备从其网络的任何公共部分移除,尽可能限制访问。通过这个过程,我们完全披露了所有的研究,并希望这能加速用户设备的补丁。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计