type
status
date
slug
summary
tags
category
icon
password
Property
Jun 29, 2023 03:08 AM
实验目的
提取固件,并在虚拟环境中成功运行
对固件存在的漏洞进行静态分析,尝试给出POC
对固件进行动态分析和调试,定位漏洞位置和原理
解密固件,对存在的漏洞位置进行定位和分析
0x0 实验环境
- Kali-Linux 2022
- Attify OS 3.0
- IDE 8.3
- VirtualBox 6.1
- VMware 16
0x1 固件提取
首先我们使用安装固件提取工具 binwalk,直接使用Kali Linux,该系统默认安装有binwalk
提取固件系统的参数是-e,我们可以加上-t -vv参数查看详细的提取过程。通过输出信息,可以得知该固件系统没有加密压缩
查看当前文件夹,可以看到这个路由器用的是squashfs文件系统
0x2 静态分析
得到固件后,若直接打开,会发现该固件被加了密,无法直接解压缩,这是厂商对该固件做了保护,防止大家逆向分析他的固件。
此处我使用的是
ziperello
第三方集成破解工具进行字典爆破:花了一些时间,得到最终密码,为
beUT9Z
解压后查看文件夹目录:
yaffs2里有几个看上去是recovery的镜像,核心的应该是2K-mdm-image-mdm9625.yaffs2 ,我们下面就来提取该文件,我首先用binwalk来提取它,但提取出来的文件乱七八糟,不知道什么原因,后来看网上推荐直接用yaffs的原生工具unyaffs提取,整个文件系统目录就十分清楚了
接下来我们查找该路径下的所有.conf文件,.conf文件多是配置文件,有可能从中可以发现敏感的信息。
其中的inadyn-mt.conf文件引起了我们注意,这是no-ip应用的配置文件,no-ip就是一个相当于花生壳的东西,可以申请动态域名。我们从中可以发现泄露的no-ip的登陆账号及密码。
除了上述泄露的no-ip账号密码,我们还从shadow文件中找到了root账号的密码,通过爆破可以得到root的密码为1234。
其实并不止有.conf文件会泄露信息,还有很多其他后缀的敏感文件会泄露信息,我们接下来使用firmwalker工具来自动化遍历该固件系统中的所有可疑文件。
命令如下,firmwalker会将结果保存到firmwalker.txt
后缀都在data文件夹中的各个配置文件中
分析完敏感的配置文件后,我们接下来分析存在风险的二进制程序。查看自启动的程序,一个
start_appmgr
脚本值得我们研究一番,进入etc/init.d
目录查看文件目录:
mgr一般就是主控程序的意思,该脚本会在开机的时候以服务的形式运行/bin.appmgr程序
通过IDA进行反编译,在main函数中发现了一个管理员当时为了方便调试留下的后门,只要连接该固件的39889端口并发送HELODBG的字符串:
对于端口39889在路由器中的作用:
端口号39889有多种可能的用途,具体取决于使用该端口的应用程序或服务。一些常见的应用程序和服务使用39889端口,如下:
- Cisco Unified Communication Manager使用39889端口作为SIP(会话初始化协议)信令端口。
- NetFlow数据存储(NFSen、NfSen)使用39889端口。
- 通过TCP / UDP协议访问Windows远程管理(WinRM)服务也可能使用39889端口。
POC如下:
0x3 动态分析
模拟执行固件
动态分析固件之前,需要先把固件运行起来,但我们手头又没有路由器、摄像头之类的物联网硬件,该如何运行呢?这就需要虚拟执行,虚拟执行你就把它想象成一个虚拟机可以运行各种物联网OS,此处使用了AttifyOS,AttifyOS集成了大量的渗透测试和漏洞扫描工具,包括Metasploit、Nmap、Aircrack-ng、sqlmap、Android SDK和其他实用工具。此外,它还包括各种安全评估和漏洞利用的环境和实验室,可帮助用户深入了解网络安全的技术和实践。
在tools/fat路径下运行fat.py,输入固件路径
DWP2360b-firmware-v206-rc018.bin
,脚本执行成功后,会回显一个IP地址,这个IP就是模拟的固件地址。我们访问这个地址
192.168.0.50
即可得到对应的路由器后台管理系统,也就是整个IOT固件模拟的运行环境调试固件
这个部分用到了Damn Vulnerable Router Firmware这个项目,直接Git下来
开始之前,安装以下工具,动态调试中会用到。
安装keystone-engine时可能会报错,参考这个链接。 avatartwo/avatar2#23
安装好工具后,就开始对固件进行分析,固件路径如下。 DVRF/Firmware/DVRF_v03.bin 使用binwalk提取固件文件系统。
提取出来的目录里有个文件夹pwnable,里面存放着漏洞程序示例,选取stack_bof_01程序进行实验,程序的源代码可以在
DVRF/Pwnable Source/Intro/
里查看首先用reasdelf查看程序架构:
拷贝qemu-mipsel-static到当前目录,然后配合chroot虚拟执行stack_bof_01固件,可以成功执行。qemu是一款轻型的虚拟机。
查看stack_bof_01的源码,可以发现明显的strcpy内存溢出漏洞,当参数argv[1]超过200时,就会出现buf溢出的现象。
0x4 解密固件
访问dlink的ftp服务器得到几个DIR-882的固件压缩文件(官网的ftp服务器隐藏,只能从漏洞网站下载到对应的固件版本),时间跨度为2017~2020年
解压出来的固件版本从旧到新依次为:
FW100B07 --> FW101B02 --> FW104B02 --> FW110B02 --> FW111B01 --> FW120B06 --> FW130B10
解压后能得到固件和对应的版本说明如下:
目前最新的版本是FW130B10,尝试使用
binwalk
进行提取解析,会发现该固件被加密了,无法解析。再来尝试提取最早版本的固件FW100B07,使用binwalk解析是能直接提取的,没有被加密过:
一般来说,有三种发布固件的方案
- 出厂时未加密,解密例程在高版本固件v1.1中给出,为后续的加密固件做准备对于这个方案,我们可以通过解密v1.1来获得解密例程
- 出厂时的固件已经加密,供应商决定更改高版本固件的加密方式,并发布了包含解密例程的未加密中间版本v1.2这一方案与第一个类似
- 出厂时的固件已经加密,供应商决定更改高版本固件的加密方式,并发布了包含解密例程的使用原加密方式加密的过渡版本v1.3这种方案对获取解密例程的难度较大,可从硬件中直接提取固件或对发布的v1.3进行分析
通过
binwalk
对其他年份的固件尝试进行提取可以知道,最早版本未加密,而后续版本进行了加密,因此DIR-882
厂商采用的是第一种方案,示意图如下:从
binwalk
解析结果来看,能确定FW100B07、FW101B02、FW104B02是未加密的,而FW104B02之后的版本,FW110B02、FW111B01、FW120B06、FW130B10均是加密的,那么FW104B02就可以确定是中间版本提取该固件
在最终目录下搜索找到imgdecrypt,从名字看出是下个版本固件的解密例程
接下来就可以分析下imgdecrypt的加密逻辑了,看下如何破解加密的固件,通过file命令,我们得知该程序是MIPS架构的可执行文件,在IDA中分析一下:
简单地从导入表中看下函数,发现有RSA、AES等多个组合加密算法,属于比较复杂的加密算法
一个可能有用的思路是:利用imgdecrypt还原出ftp服务器上提供的最新的固件,所以可能后续版本和Dlink其它型号的路由器也能用这个程序还原固件,因此可以进行解密:
总结
通过对于本次的固件安全漏洞分析,能够清楚反映硬件安全在整个互联网安全有着十分重要的地位,漏洞多发生在以下几个环节:
- 管理员账户泄露
- 系统存在后门
- 默认WPS PIN或者弱PIN
- 泄露相关敏感信息
- 不良的安全措施
后门账户
默认情况下,telnetd 和 SSHd 在路由器中运行,Telnetd 正在运行
存在 2 个后门帐户,可用于绕过用于管理路由器的 HTTP 身份验证。
管理员的密码是'admin',可以在
/bin/appmgr
使用IDA 查找关键字中找到:- admin 有密码 admin
- root 的密码是 1234
从而使得可以越权使用管理员的账号利用漏洞绕过加密机制:
系统存在后门
在上述分析的RT-300固件漏洞中,发现了在main函数中存在一个管理员当时为了方便调试留下的后门,只要连接该固件的
39889端口
并发送HELODBG的字符串,可以直接getshell,POC如下:默认WPS PIN或者弱WPS PIN
用户可以使用 Web 界面为 WPS 系统生成临时PIN(概率较低,因为
28296607
默认提供 WPS PIN)。如果路由器生成的 PIN 很弱或者直接使用默认的PIN,十分容易被攻击者通过逆向工程分析得到固件的加密算法从而轻易破解
因此,为了确保网络安全,需要使用更强大的安全措施,例如使用WPA2或更高级别的Wi-Fi加密协议,并选择长而复杂的Wi-Fi密码来保护网络。
泄露相关敏感信息
通过对硬件信息的挖掘可以得到Dlink 服务器的硬编码在
/sbin/fotad
二进制文件中,如图所示:不良的安全措施
在 中
/etc/init.d/start_appmgr
,代码种有一段不当的提权代码,chmod 777 /bin/QNetCfg
,会赋予 root 权限:这种不当的安全措施应该使得攻击者在入侵时能够很好的利用获得最高权限。
参考文档
- 作者:百川🌊
- 链接:https://www.baichuanweb.cn/article/example-64
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。