背景
前面的物联网安全文章中,我们通过网络靶场将下载好的设备固件进行运行,进行了漏洞分析和漏洞复现,并且学习了一些漏洞分析的思路和方法。但是在实际应用中固件的获取和固件调试往往并不顺利,如果我们想要更广泛的挖掘设备的漏洞,就需要通过实体设备的硬件分析技术来帮助我们进行固件提取和调试分析。本次小节以tenda ac6路由器为例,简单讲解硬件安全分析流程,并完成了固件提取和终端获取的目标。
本次小节中需要用到的工具:tenda路由器、电烙铁、焊锡丝、ttl转usb、杜邦线、编程器、编程器烧录夹
硬件分析
在某宝几十亿淘了一个tenda ac6双频路由器,路由器背面的信息如下图所示:
接下来,我们就需要暴力拆取路由器了,用细平坚硬的工具沿着路由器外壳的缝隙慢慢撬开就可以了。拆开后的路由器板子如下:
简单了解一下设备中的芯片信息,这里路由器的主要ram芯片是64M的ddr2双通道M14D5121632A芯片。
5G芯片博通BCM43217,主芯片由散热片覆盖,可以在分析调试完以后再拆散热片。
rom是华邦的25qjvssiq芯片,设备的固件存在于该芯片中,也是我们主要研究的芯片,这里可以通过编程器来提取其中的固件。
一般在物联网设备中,有四个紧挨着的孔就是uart接口,这里在pcb板的左下角,我们可以看到有4个孔,所以这很可能是个uart接口。uart接口是开发者为了方便调试所预留的,开发者可以通过uart接口进入路由器终端,随时掌握路由器的运行状态,大部分设备的uart引脚都会引出来到pcb板中。uart协议规定有6个引脚,但是有俩个没有用到,所以平常见到的是4个引脚,这四个引脚分别是VCC、TXD、RXD、GND。VCC:电源线引脚,电源一般为3.3v或5vTXD:传输引脚,一般连接到RX用于发送数据RXD:接收引脚,一般连接到TX用于接收数据GND:接地引脚
uart的连接方式如下图所示:
既然uart接口可以用来调试,那么我们通过一些方法来识别出上面的四个引脚,按照规定的连接方式连接我们的电脑,就可以进入物联网设备终端来进行安全测试了。下图中,标出了1,2,3,4四个引脚,暂时我们还不知道这四个接口都是哪些引脚,不过可以通过万用表和逻辑分析仪等工具进行辨别。
在用万用表分析之前,我们可以通过平行光照射四个引脚的方式进行粗略辨别。在平行光的照射下,接口1,2,3都显露出缺口(接口2缺口在2点钟方向,接口3缺口在12点钟方向),说明有线路的连接,而且接口1缺口较大,猜测连接线路众多,可能是VCC/GND,结合方形标识可以断定接口1肯定为VCC。而接口4无亮光,说明线路连接四面八方的线路或平面,很可能是GND。简单分析后,我们开始用万用表进行测试。
万用表打到蜂鸣档,表笔一端连接电源接口负极,一端连接4接口,此时蜂鸣档响起,说明4接口确实是GND。然后万用表打到电压档(电压档一般在10V左右),分别测量1,2,3,分别显示3.3v、2.9v、3.3v。1,3接口可能为VCC,当我们使用杜邦线短接1,4引脚后,路由器重启,说明1接口为VCC。在VCC和GND辨别后,Tx和Rx的辨别就比较简单了,我们可以用ttl转usb工具连接电脑,电脑端连接GND和RX,路由器端GND互连,然后分别插入2,3接口测试,观察屏幕上有没有输出,如果有说明该接口为Tx接口,另一个接口为Rx。还有一种方式为,Tx接口在路由器连接状态下未连接,电压会进行浮动。再次用万用表进行测试,发现接口电压无变化,接口3电压浮动,说明接口3为Tx,接口2为Rx。
用电烙铁将杜邦线的公头锡焊在引脚后,母头与uart转usb工具进行连接(需注意Tx与Rx的连接)。连接好以后,我们就可以在电脑打开终端模拟软件(Xshell、secureCRT、MBXterm等),这里我用secureCRT进行连接,在没有设置波特率前,屏幕输出为乱码。我们需要正常调整波特率,在没有逻辑分析仪的情况下,我们只能按照常用的波特率一一进行尝试。经过几个测试后发现为115200波特率时可以正常显示。
重启路由器,字符显示正常,并且boot启动过程中没有预留进入boot的方式。
随后启动完成后,输入回车,发现想要进入路由器终端还要输入密码,经过几次尝试后,发现都登录错误。这里思路之一为使用编程器提取该设备的固件,通过在固件程序和文件中分析启动流程,看看是否有硬编码后门或其他后门等。另一种便是改用其他调试方式,技术难度较高,这里我们采用第一种方式进行分析。
这里我使用RT-809H编程器进行提取,使用编程器夹夹住flash芯片(需注意红线连接芯片1接口处)。
电脑打开编程器软件点击智能识别后识别出芯片型号,点击保存即可保证整个设备的固件。
使用binwalk进行分析,分析出了squashfs文件系统,直接使用”binwalk -Me 固件名”进行提取。
grep搜索终端中显示让我们输入密码的字符串,发现字符串在busybox和init程序中出现了。并且init是busybox程序的软连接,那么我们直接逆向分析busybox。
在IDA字符串窗口搜索显示的字符串后,通过交叉使用进入sub_F798函数中,分析该函数后发现大致流程如下:当前程序检测是否是tty后,然后进入sub_4E8CC函数获取当前用户的uid,并设置环境env。随后根据当前用户(当前用户为root)的uid获取当前用户的passwd结构(里面包含当前用户的密码),并保存到了v6变量中。随后进入while循环,循环显示”Give root password for system maintenancen(or type Control-D for normal startup):”并修改串口输入输出设置和信号设置,获取用户输入的字符串,保存在v7中,判断v7和地址中的字符串是否为空,不为空则进入sub_50974函数进行加盐加密,返回值保存到v10中。随后v10与当前用户的密码进行比对,如果正确且输入字符串不为空则设置”subshell”为env随后切换至终端。
sub_4E8CC函数获取当前用户的uid,判断是否为有效用户id,然后unset掉所有的ENV,并设置env为”PATH=/sbin:/usr/sbin:/bin:/usr/bin”
在sub_49D04中,调用tcgetattr获得标准输入的终端参数,将获得的信息保存在v13变量中,随后设置好串口的信息并使用tcsetattr函数将修改后的终端参数设置到标准输入中。设置程序中止信号,随后将”Give root password for system maintenancen(or type Control-D for normal startup):”字符输入到屏幕。随后调用malloc申请堆块循环保存用户输入数据。检测到回车后中断,最后修改信号后返回堆块地址。
执行返回sub_F798函数后,判断用户输入数据是否为空,然后进入sub_50974函数调用crypt函数,将”/etc/passwd”里面的密码作为salt并进行加密,返回结果保存到v10,最后比较当前用户的密码是否加密后的用户输入相同,如果怎么执行shell。
了解了程序执行流程后,我们去etc目录下查看当前用户的密码(为root用户)
解密root用户密码后发现相同,解密后的密码为Fireitup。
输入密码后,即可进入终端。可以查看支持使用的命令,发现tftp和wget程序,后续我们可以传入busybox和gdbserver进行动态调试。
当上面的流程都完成后,我们就可以愉快的进行设备调试和漏洞挖掘了。
总结
本次小节,主要以硬件安全学习为目标,主要讲述了物联网硬件设备的分析流程,通过实践与拓展,我们可以掌握硬件方向的固件提取和调试终端获得。
蛇矛实验室成立于2020年,致力于安全研究、攻防解决方案、靶场对标场景仿真复现及技战法设计与输出等相关方向。团队核心成员均由从事安全行业10余年经验的安全专家组成,团队目前成员涉及红蓝对抗、渗透测试、逆向破解、病毒分析、工控安全以及免杀等相关领域
原文始发于微信公众号(蛇矛实验室):物联网安全从零开始-路由器硬件安全初探