物联网设备固件分析之强势入门教程

  近几年,物联网设备已渗透到生活的方方面面,为人们带来了极大的方便。但是,因其承载有人们日常生活产生的数据和隐私信息,其安全性也越来越受到人们的关注。在上一篇中,我们讨论了用脚本控制小米设备,这主要是从流量层面入手进行的安全分析;在这一篇,主要从固件入手,分析固件的脆弱性。

  开篇

  “工欲善其事,必先利其器”,在正式开始,先来讲讲固件分析环境的搭建,主要就是binwalk的安装。由于固件压缩打包的方式有很多种,单用apt instll binwalk这条命令安装,很多文件系统的格式是不支持解压的,需要将各种解压插件一并安装,才能正确解压出固件中的文件系统。完整安装可参考binwalk的官方安装文档。每次都要这样手动安装,笔者觉得很麻烦,因此写了安装脚本自动完成安装。

  同时,考虑到有很多依赖包需要安装,Ubuntu系统带的apt源下载贼慢,可将其更换成阿里云的源,主要参照参考资料2。每次照着帖子操作,相当浪费时间,也写了一个脚本自动换源的脚本,如下图所示。

  

 

  在脚本中,主要分为两部分,先是将Ubuntu系统的源换成阿里云的源,并按照Ubuntu系统codename的不同,形成有针对性的apt源文件;再将pip的源也换成的阿里云的源。换源后,安装速度快了几十倍。

  接着,就是对binwalk完整版的安装了,binwalk的安装文件和它的相关插件,我已从github上下载完成,如下图所示。

  

 

  安装脚本为: install_binwalk.sh,如下图所示,即是按照官方的安装方案编写的脚本,该脚本目前只适用于Python2.7。

  

 

  运行该脚本,待binwalk安装好后,互联网中大部分的固件都能解压了。这里以dlink dir-300为例,已在binwalk安装包中给出,在命令行中运行:

  binwalk -Me DIR-300_REVA_FIRMWARE_1.06B05_WW.zip

  

 

  这是解压过程,其中,识别到squashfs文件系统,并解压出来。

  

 

  系统文件目录如上图所示,已经解压出来了,下一步,即是对其中的文件进行分析了。

  正文

  1. 远程登录口令分析

  很早之前,笔者就在想,很多固件都具有看似简单但危害又很大的安全隐患,如弱口令登录等,如果有一个脚本能自动地发现这些简单的安全隐患,那,真是一门省时的生意。不过,我能想到的东西,别人早实现了,见项目firmwalk(见参考资料3)。运行十分简单,在系统当前路径下,运行:

  firmwalk.sh firmware_file_system_path

  后跟固件中文件系统的路径即可,以dlink dir-300为例,有如下结果。

  

 

  这是脚本运行后的部分截图,可以看到,其中含包含admin,root,password等关键字的文件已列出,这些文件中,都有可能藏有口令信息。那我们就尝试着找一找这些文件中,是否包含口令信息。那哪样的口令威胁性大呢,当然是可远程登录的,比如telnet、ftp、ssh、web等。由上图所示,发现了telnet关键字,且在/etc/scripts/system.sh文件中出现,这个文件是随系统启动的脚本文件,那说明telnet服务是随系统启动了的,顺着这个线头捋应该有戏。打开这个文件,果然发现telnet的启动脚本,如下图所示。

  

 

  跟到这个文件中再看一眼,用vim看下这个文件,如下所示:

  

 

  红色框标注的即是telnet的启动命令,嘿,-u就像是跟的用户名和密码,用户名为:Alphanetworks,密码是一个变量,这个变量是cat /etc/config/image_sign的值,看下这个值是多少,如下图所示。

  

 

  密码就是:wrgg19_c_dlwbr_dir300,按图索骥看似很容易找到,但其实也需花了一些功夫才捋得出来。那为什么-u后就一定能确定是用户名和密码,可以到telnetd中看一看,用vim打开该二进制文件,搜索password,如下图所示。

  

 

  图中已经给出了telnetd的用法,同时在网上搜这个固件的telnet密码,也是文中这个口令,说明已经找正确。而在其他一些固件中,会存在/etc/passwd或/etc/passwd.bak的文件,可用john命令进行密码破解,如下图所示。

  

 

  解出来,口令是admin:1234。

  2.简单web的web漏洞发现与利用

  大部分固件都支持web访问,而在提取出的固件文件中,可直接查看到固件的网页源码。那么是否有工具能通过源码审计的方式发现一些简单的漏洞,当然是有的,这里将介绍一款简单的PHP代码审计工具RIPS。它使用了静态分析技术,能够自动化地挖掘PHP源代码潜在的安全漏洞。先来看看它的安装,由于这款工具也是由PHP语言编写,首先需要搭建PHP和web服务运行环境。安装以下程序:

  sudo apt install apache2 php7.2 libapache2-mod-php7.2

  sudo /etc/init.d/apache2 restart

  下载RIPS,下载地址见参考资料4(本文的github上,已经下载);下载完成后将其解压并放到/var/www/html/目录下,如下图所示。

  

 

  再在浏览器中访问该路径即可:127.0.0.1/rips。

  

 

  在path/file这一栏填写待分析的网页源码,将固件网页源码的路径填入,点击scan就能看到结果了,如下如所示。

  

 

  扫了320个文件,Nothing vulnerable found,啥也没发现~~。不过木事,算是简单的验证了下RIPS的本事,因为网上已爆出了dlink dir-300系列的一些漏洞。比如这个信息泄露漏洞,漏洞出现在suashfs-root/www/model/__show_info.php文件中,如下图所示。

  

 

  这里看到已经禁止了$REQUIRE_FILE的参数为var/etc/httpasswd和var/etc/hnapasswd。这么一看无法获取账号密码。但是我们可以从根路径开始配置httpasswd的路径,就可以绕过这个过滤了。Payload:

  localhost/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd

  这里设置REQUIRE_FILE=/var/etc/httpasswd 成功绕过上面的 if判断,进行任意文件读取。这类漏洞看来还是得配合人工审计进行发现。那现在问题来了,已经找到的弱点,如何进行验证呢。

  固件模拟

  固件模拟的环境,笔者搭过,当时觉得很烦杂,本打算写脚本来自动实现固件模拟环境搭建。不过,这也有人实现了,并打包成了虚拟机,可直接使用。AttifyOS(见参考资料5),大家了解一下,国外的大牛打包的。下载后,在tools/firmadyne中,运行程序,模拟dlink dir-300固件运行,命令为:

  python fat.py./DIR-300_REVA_FIRMWARE_1.06B05_WW.zip

  

 

  如上图所示,当模拟出网卡,代表固件模拟成功。我们就可以试一下是否存在上面发现的脆弱点。先来看看web漏洞,在浏览器中运行:

  192.168.0.1/model/__show_info.php?REQUIRE_FILE=/var/etc/httpasswd

  

 

  如上图所示,口令已经找到,用户名为admin,密码为空。以得到的口令尝试登陆,顺利进入到web系统,如下图所示。

  

 

  那么,再来看看,telnet的口令是否能成功。先用nmap扫描,看是否开启了telnetd服务,如下图所示。

  

 

  如上图所示,23端口已经打开,尝试telnet登录,如下图所示。

  

 

  感觉已经连上,但是没要求输入口令,执行命令未回显。telnet服务似乎存在问题。

  总结

  到此,固件安全分析的内容已讲完,看似内容比较简单,但对于刚入门来说,已经有相当的工作量了。光是分析环境搭建这一关,很多人还未迈过。不过,耐心地一步一步来,总会有所得。本文写了多个脚本程序,辅助大家搭建分析环境,同时,使用了多个工具来辅助进行漏洞发现,也讲解了如何使用固件模拟的方式来验证脆弱点。对于高级的漏洞发现,那就靠自己不断地学习与分析了。在此,抛砖引玉,欢迎大家一起讨论,并推荐一些好的固件分析方法,方便大家一起学习。

  本文的安装环境搭建文件和工具,见如下链接:

  https://github.com/scu-igroup/firmware_analysis

  

上一篇:基于STM32的阿里云物联网平台方案

下一篇:年度盛会|第九届中国物联网产业与智慧城市发展年会

延伸阅读