发布时间: 2017年3月4日| 作者: zenofex | 归档: NAS,Western Digital | 4评论»
在Exploitee.rs,有时我们寻找有趣的设备进行攻击,而有时设备会找到我们。今天,我们将谈谈最近一段时间(我们发现自己处于后一种情况)我们在攻击一系列西部数据的网络附加存储设备方面的经验。
去年年中,我(Zenofex)开始寻找一个能借助Plex(一款我最近很喜欢用的媒体播放器)提供硬件解码功能的网络附加存储设备。经过一番研究,我订购了一个西部数据“MyCloud”PR4100。这个设备满足了我的所有需求,并得到一个朋友强烈推荐。在将NAS添加到我的网络并首次访问设备的管理页面之后,我对在网络中不经适当审核而添加新设备感到厌烦。所以,我登录该设备,启用SSH访问,并查看该设备的Web服务器功能如何工作。
登录绕过
我很快发现第一个令人震惊的bug,这个bug来自于一段执行用户登录检查功能(使用cookie或PHP会话变量)的代码。使用cookie进行身份验证不一定是一件坏事,但问题是西部数据MyCloud的登录界面使用它们的方式。检查下面的代码。
上述代码包含一个名为“login_check”的函数,此函数由所有后端PHP脚本使用,用于验证预认证的用户。上面的代码可以通过两条途径完成检查,第一是通过检查“username”和“isAdmin”的会话值,第二是(如果先前失败)尝试使用cookie完成相同的过程。因为cookie是由用户提供的,所以脚本寻找的要求可以被攻击者满足。上述会话和cookie的检查过程总结如下。
“username”变量已设置,并且不为空 - 用户以普通权限用户身份登录。
“isAdmin”变量设置为1 - 用户以管理员身份登录。
这意味着在任何时候使用该PHP脚本进行登录检查时,攻击者能够通过提供2个特制的cookie值绕过检查。
在写下我发现的过程中,一个新的固件被推出来修补上述bug。然而,这个补丁引入了一个新的漏洞,它具有与上述bug(更新前)相同的后果。下面是包括固定代码的当前版本。
在代码的更新版本中,调用了新函数“wto_check()”(40行)。此函数使用客户端提供的用户名以及用户的IP地址作为二进制参数在设备上运行。如果用户当前已经登录并且没有超时,则返回值1,否则返回0(指示用户未登录)。“wto_check()”方法的代码如下。
在上面的代码中你可以看到,为了将用户名和IP地址引入作为“wto”二进制的参数,在第11行进行了转义处理。上面代码的问题是PHP方法“escapeshellcmd()”的不正确使用,“escapeshellcmd()”的正确用途是处理整个命令字符串,而不仅仅是一个参数。这是因为“escapeshellcmd()”函数不转义引号,因此攻击者可以突破引号的封装(在我们的案例中为“-n”参数),允许引入新的参数执行。因此,我们可以添加新的参数实现自我登录,而绕过对用户是否已经登录的检查。尽管我们认为仅仅通过检查IP地址和是否登录超时来验证用户是否已经登录是远远不够的。编写这段代码的程序员应该使用“escapeshellarg()”,它用于过滤独立的二进制参数,并过滤掉引号。使用“escapeshellarg()”而不是目前使用的“escapeshellcmd()”至少可阻止上述提到的攻击。
命令注入错误
WDCloud Web界面的大多数功能实际上由设备上的CGI脚本处理。大多数二进制文件使用相同的模式,它们从请求中获取post / get / cookie值,然后使用PHP调用中的值来执行shell命令。在大多数情况下,这些命令将使用用户提供的数据(几乎不进行清理)。例如,考虑一下以下代码(来自于该设备)。
上面的代码从COOKIE的超全局变量(包含从请求提交来的cookie数组索引)分配一个值给本地变量“$ username”。然后,该值作为本地方法“wto”的二进制参数立即在PHP的“ exec() ”调用中被使用。因为没有数据清理,使用用户名值
将现有的exec命令转换为
并在其中执行用户提供的命令。
因为参数用双引号封装且我们使用“$(COMMANDHERE)”这样的语法,命令“touch / tmp / 1”先于“wto”方法被执行,其返回值被用作“wto”方法的“-n”参数。这种导致命令注入漏洞的基本模式在Web界面使用的许多脚本中被多次使用。虽然上述的一些漏洞可能被常规的身份认证所阻止,但是通过上面提到的绕过登陆可以克服该限制。另外,值得注意的是,所有通过Web界面执行的命令都是完成的,因此本案例中Web服务器是以root用户的身份在运行。
其他错误
可能你认为上述错误已经很严重了,但在Web界面中仍然存在了大量的错误(像被注释掉的正常验证一样简单的):
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课