Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何用0day漏洞黑掉西部数据NAS存储设备

如何用0day漏洞黑掉西部数据NAS存储设备

作者头像
FB客服
发布于 2018-02-23 08:55:52
发布于 2018-02-23 08:55:52
1.5K0
举报
文章被收录于专栏:FreeBufFreeBuf

我们以入侵和破解设备为乐,今天,要向大家展示的是近期我们对西部数据(Western Digital )网络存储设备(NAS)的漏洞发现和入侵利用过程。点击阅读原文观看入侵视频。

漏洞发现

去年年中,我打算入手一台支持硬件解码的NAS存储来搭建Plex流媒体服务平台,经过一番比较,在一位朋友的推荐下,我选择了西部数据(Western Digital )的MyCloud PR4100,该存储设备完全满足我所有的功能需求。把该设备添加进网络之后,可以通过一个Web界面访问登录,由于我对使用设备有安全洁癖,所以在登录开启SSH连接之后,我开始对其网页服务功能进行了安全审计,并发现了以下存在漏洞:

登录验证绕过漏洞

很惊讶,我很快发现了一个用cookie和PHP session进行登录检查的bug。虽然使用cookie认证并不都是坏事,但该设备的使用方式存在问题,请看以下脚本:

/lib/login_checker.php

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, normaluser if ($_COOKIE['isAdmin'] == 1) $ret = 1; //login,admin } return $ret; }

代码包含一个名为 “login_check”的函数,后台PHP脚本通过调用该函数对预登录用户进行认证校验。函数代码显示,可以通过两种方式进行认证,一种是session方式的“username”“isAdmin”判断,另一种是cookie方式的判断。由于cookie由用户执行产生,所以攻击者同样可以构造满足脚本调用的恶意请求。上述代码认证方式可以归纳为以下方式:

当存在“username” 变量且不为空时,用户作为正常权限用户登录; 当存在“isAdmin”变量且不为空时,用户作为管理员登录;

这意味着,只要使用php脚本进行登录验证时,攻击者就可以构造特殊cookie变量绕过验证。

补丁更新导致新的漏洞

然而,就在我的研究过程中,该存储设备的一个固件更新释出对上述bug的修复补丁。但更不可思议的是,该补丁却导致了另外一种方式的验证绕过漏洞。以下是更新后的登录验证脚本:

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

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; } ?>

更新后的代码第40行,增加了对用户验证的 “wto_check()”方法,用户名和IP地址都是该方法的参数。当前登入用户保持操作状态,则返回1,超时则返回0。“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 */

上述代码第11行中,用户名和IP地址被初始化为wto变量参数,而问题就出在用来处理整个命令字符串的方法“escapeshellcmd()”,该方法不会对-n参数中配对的引号进行转义,这就给了攻击者重新构造或绕过验证的可能,因此,我们可以添加新的参数绕过验证并执行任意用户登录。

Freebuf百科:escapeshellcmd()对字符串中可能会欺骗shell命令执行任意命令的字符进行转义。 此函数保证用户输入的数据在传送到 exec()或 system()函数,或者执行操作符之前进行转义。反斜线(\)会在以下字符之前插入: #&;`|*?~<>^()[]{}$\, \x0A 和 \xFF。 而' 和 " 仅在不配对的时候被转义,在 Windows 平台上,所有这些字符以及 % 都会被前缀 ^ 来转义。(详细请参考 php.net相关说明)

这里,最好使用Escapeshellarg方法函数,Escapeshellarg()会将任何引起参数或命令结束的字符进行转义,如单引号“’”会被转义为“\’”,双引号“””会被转义为“\””,分号“;”会被转义为“\;”,这样escapeshellarg会将参数内容限制在一对单引号或双引号里面,转义参数中所包含的单引号或双引号,使其无法对当前执行进行截断,实现防范命令绕过或注入攻击的目的。

命令注入漏洞

大多数的西部数据MyCloud设备Web界面,实际上是由CGI脚本来实现的,这些脚本中大部分二进制文件都存在着相同的功能模式,如从请求包中获取post/get/cookie值,然后应用这些值执行相关命令。然而,大多数情况下,这些命令会使用到用户提交的一些未经安全处理的恶意数据。例如,以下设备中存在的代码:

php/users.php

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

代码把包含cookie值的全局变量数组$_COOKIE命名为”$username”,之后,该”$username”作为后续“exec()”命令执行的调用参数。因为没有任何过滤措施,可以这样更改一下,把username值设为:

username=$(touch /tmp/1)

那么执行命令将会变为:

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

很容易就执行了用户的自定义命令。

由于命令行参数被双引号封装,在执行“$(COMMANDHERE)”语法时,命令“touch /tmp/1”先于wto前就已经执行,并把返回结果作为-n参数。这种web接口对内置脚本的交互调用模式,明显会导致命令注入漏洞。而且,使得注意的是,所有通过web端构造的命令都会被以root权限执行。

其它Bug

除了以上两个高危漏洞之外,该设备在web服务方面还存在其它一些严重Bugs,比如以下文件中正常登录验证行为被错误地注释掉:

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

而以下上传功能文件可以针对设备系统,执行无需用户验证的,任意目录位置的任意文件上传:

addons/upload.php

2 //if(!isset($_REQUEST['name'])) throw newException('Name required'); 3//if(!preg_match('/^[-a-z0-9_][-a-z0-9_.]*$/i', $_REQUEST['name'])) throw newException('Name error'); 4// 5//if(!isset($_REQUEST['index'])) throw new Exception('Index required'); 6//if(!preg_match('/^[0-9]+$/', $_REQUEST['index'])) throw new Exception('Indexerror'); 7// 8//if(!isset($_FILES['file'])) throw new Exception('Upload required'); 9//if($_FILES['file']['error'] != 0) throw new Exception('Upload error');

10 11$path = str_replace('//','/',$_REQUEST['folder']); 12$filename = str_replace('\\','',$_REQUEST['name']); 13$target = $path . $filename . '-' .$_REQUEST['index']; 14 15//$target = $_REQUEST['folder'] .$_REQUEST['name'] . '-' . $_REQUEST['index'];

16 17move_uploaded_file($_FILES['file']['tmp_name'], $target); 18 19 20//$handle = fopen("/tmp/debug.txt", "w+"); 21//fwrite($handle, $_FILES['file']['tmp_name']); 22//fwrite($handle, "\n"); 23//fwrite($handle, $target); 24//fclose($handle);

25 26// Might execute too quickly. 27sleep(1);

除此之外,我们还发现了另外一个个远程命令执行漏洞(RCE)和身份验证命令执行漏洞,在此就不作公开。由于这些漏洞在此之前,没人发现或爆料过,可以算是西部数据NAS设备的0day漏洞。

漏洞总结

1 x 登录验证绕过漏洞 1 x 任意文件上传漏洞 1 x 无需用户验证的远程代码执行漏洞 1x 身份验证命令执行漏洞

漏洞影响范围

涉及西部数据以下型号系列的NAS设备

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

后续的补丁更新和相关情况,请继续关注我们的Twitter @exploiters

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FreeBuf 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用 OpenTelemetry 和 SigNoz 实现 LLM 可观测性
在快速发展的大语言模型(LLM)世界中,确保最佳性能和可靠性比以往任何时候都更为关键。这就是'LLM 可观测性'的概念发挥作用的地方。这不仅仅是监控输出;更是深入洞察这些复杂系统内部运作的关键。
云云众生s
2024/03/28
5660
使用 OpenTelemetry 和 SigNoz 实现 LLM 可观测性
可观测性的新构件
可观测性领域是一个动态且异质的领域。在这个生态系统中,商业巨头如Datadog、New Relic和Splunk与大型OS/免费堆栈(如ELK、Prometheus/Loki/Grafana和TIG(Telegraf/InfluxDB/Grafana))共存。然而,在近年来,三种技术趋势汇聚在一起,重塑了这一格局,为基于新一代强大开源技术和标准构建的新堆栈铺平了道路。可观测性周期表中的三个新元素是:
云云众生s
2024/03/28
1690
统一云原生可观测性:Elastic 与 OpenTelemetry 的最佳实践指南
OpenTelemetry 不仅仅是成为可观测性的开放标准。作为云原生计算基金会(CNCF)下的主要项目之一,OpenTelemetry 得到了大量企业软件供应商和云服务提供商的支持。来自金融、保险、科技等行业的全球企业正在逐步标准化使用 OpenTelemetry。通过 OpenTelemetry,DevOps 团队可以一致地收集和摄取遥测数据,从而为可观测性提供事实上的标准。
点火三周
2024/10/14
5160
统一云原生可观测性:Elastic 与 OpenTelemetry 的最佳实践指南
OpenTelemetry Collector – 架构和配置指南
OpenTelemetry Collector 是由 OpenTelemetry 提供的独立服务。它可以用作遥测处理系统,具有许多灵活的配置选项,用于收集和管理遥测数据。让我们深入了解一下 OpenTelemetry Collector,以了解它的工作原理。
云云众生s
2024/03/28
1.9K0
OpenTelemetry Collector – 架构和配置指南
使用OpenTelemetry监控Nginx指标和日志
Nginx 指标和日志的监控对于确保 Nginx 的性能符合预期以及快速识别和解决问题至关重要。在本教程中,您将安装 OpenTelemetry Collector 来收集 Nginx 指标和日志,然后将收集的数据发送到 SigNoz 进行监控和可视化分析。
云云众生s
2024/03/28
1K0
使用OpenTelemetry监控Nginx指标和日志
Elastic 向 OpenTelemetry 贡献 Elastic Common Schema (ECS),帮助用户采用基于 OTel 的可观测性和安全方案
如今,来自不同来源和模式的数据使得查明软件问题和理解问题的根本原因变得困难。通用模式有助于标准化数据,从而改进可观测性和安全解决方案中数据的分析、可视化和关联,从而加速根本原因分析。为了确保我们的客户和更广泛的社区能够从标准化中受益,Elastic 致力于基于 Elastic Common Schema (ECS) 和 OpenTelemetry (OTel) 开发指标、日志、跟踪和安全事件的通用架构。
点火三周
2023/08/03
1.5K0
Elastic 向 OpenTelemetry 贡献 Elastic Common Schema (ECS),帮助用户采用基于 OTel 的可观测性和安全方案
OpenTelemetry 与 Prometheus - 架构和指标的差异
在不断发展的软件开发世界中,可观察性使软件工程师能够实时洞察复杂的系统。OpenTelemetry 和 Prometheus 是著名的云原生计算基金会 (CNCF) 毕业项目,但用于监控和调试应用程序的可观察性工具不同。
用户5166556
2024/01/10
1.7K0
OpenTelemetry 与 Prometheus - 架构和指标的差异
OpenTelemetry:Go可观测性指南
现代应用程序通常是复杂的分布式系统。调试它们可不是一件有趣的事情:你必须跟踪跨服务的请求,日志会丢失,而且指标通常难以关联。这就像大海捞针——只不过这个草堆正在燃烧,而且针还在移动。这就是 OpenTelemetry (OTel) 可以提供帮助的地方。
云云众生s
2025/02/09
1470
OpenTelemetry:Go可观测性指南
OTel是你将安装的最后一个可观测性Agent吗?
开源的 OpenTelemetry Collector 极大地挑战了可观测性供应商和最终用户之间的关系。
云云众生s
2025/03/06
520
使用OpenTelemetry监控Docker容器
监控 Docker 容器指标对于理解容器的性能和健康情况至关重要。OpenTelemetry Collector 可以收集 Docker 容器指标,并将其发送到您选择的后端。在本教程中,您将安装一个 OpenTelemetry Collector 来收集 Docker 容器指标,并将其发送到 SigNoz,这是一个用于监控和可视化的 OpenTelemetry 原生 APM。
云云众生s
2024/03/28
3700
使用OpenTelemetry监控Docker容器
使用OpenTelemetry监控你的CI/CD流水线
今天的软件比 20 多年前的软件复杂了数个数量级,这给我们调试代码带来了新的挑战。幸运的是,通过在系统中实现可观测性,我们已经相当远程地理解了我们的应用程序正在执行什么以及问题正在发生在哪里。
云云众生s
2024/03/28
1860
使用OpenTelemetry监控你的CI/CD流水线
使用OpenTelemetry实现Kubernetes事件监控
在 Kubernetes 中,事件是提供对集群内状态变化洞察的对象。进行 Kubernetes 事件监控对于实时洞察 Kubernetes 集群的运行状态至关重要。它使管理员能够快速识别并响应问题,优化资源分配,并确保其容器化应用程序的平稳高效运行。
云云众生s
2024/03/28
4070
使用OpenTelemetry实现Kubernetes事件监控
基于OpenTelemetry进行全链路追踪
Hello folks,我是 Luga,今天我们来分享一下与云原生体系有关的话题- 云原生可观测性-OpenTelemetry。 作为一个云原生“核心”标准,OpenTelemetry在观测分布式微服务应用程序和云基础设施的可见性和控制自动化层面具有举足轻重的意义。
Luga Lee
2023/04/28
4K1
基于OpenTelemetry进行全链路追踪
OpenTelemetry 2023
OpenTelemetry(OTEL)始于 2019 年,当时围绕追踪的两个主要开源项目 OpenTracing 和 OpenCensus 合并,形成了 OpenTelemetry 。合并后的项目范围扩展到超越追踪,涵盖了所有的可观测性。OTEL 的使命是帮助组织交付高质量、无处不在且可移植的遥测数据。
云云众生s
2024/03/28
2330
OpenTelemetry 2023
使用 OpenTelemetry Tracing 最大化 Kubernetes 效率
OpenTelemetry 是一种开源的可观测性框架,提供一组 API 和库,用于收集、处理和导出遥测数据,如追踪、指标和日志。它允许开发人员以最小的开销来检测他们的应用程序,并提供一种收集和导出遥测数据的标准化方法。
我是阳明
2023/08/21
6470
使用 OpenTelemetry Tracing 最大化 Kubernetes 效率
使用OpenTelemetry Operator解锁Kubernetes可观测性
随着 Kubernetes 环境规模和复杂性的增长,可观测性对于维持性能和可靠性至关重要。本文探讨了 OpenTelemetry Operator 如何简化遥测数据的收集,从而能够无缝监控 Kubernetes 本身以及在其上运行的应用程序。
云云众生s
2025/03/10
1440
使用OpenTelemetry Operator解锁Kubernetes可观测性
云原生环境中可观测性日益增长的重要性
云原生可观测性迎来AI驱动时代!预测性监控、异常检测助力快速定位问题。拥抱OpenTelemetry标准化遥测数据,降低运营成本。DevSecOps融合安全与可观测性,FinOps实现成本优化。未来可观测性将更智能、更安全、更经济!
云云众生s
2025/03/17
770
微服务日志实践指南 [包含最佳实践]
微服务日志是在分布式微服务架构中跟踪和记录特定服务活动的实践。日志记录是任何软件系统的重要方面,对于微服务架构更为关键,因为有许多小型、独立的服务相互交互。
云云众生s
2024/03/28
6120
微服务日志实践指南 [包含最佳实践]
Honeycomb.io的Austin Parker:深入探讨OpenTelemetry
在本届KubeCon的访谈中,我们了解到OpenTelemetry是如何融入CI/CD,以及其他框架、库、云系统和语言标准库的。
云云众生s
2025/01/09
1080
OpenTelemetry 如何与 Kubernetes 协同工作
翻译自 How OpenTelemetry Works with Kubernetes 。
云云众生s
2024/03/27
2460
推荐阅读
相关推荐
使用 OpenTelemetry 和 SigNoz 实现 LLM 可观测性
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档