常见的固件加解密方式与D-Link固件解密实战分析
2024-4-7 17:53:27 Author: mp.weixin.qq.com(查看原文) 阅读量:12 收藏


前言

当我们需要进行固件分析时,首先要做的就是获取固件,而获取固件无外乎就是从官网获取固件、通过流量拦截获取固件、使用编程器从闪存中读取固件以及通过串口调试提取固件。提取到固件之后,下一步就是对固件的进行分析,分析的对象主要是固件的内核与文件系统,包括Web应用、协议、核心控制程序等。
但是现在大多数厂商对了保证自己家产品安全,防止被他人攻击,就会对固件进行加密处理,可能是使用AES、DES、SM4等复杂的加密方式,也可能是使用XOR、ROT等简单的加密方式,加解密的程序一般放于Boot loader、内核或者文件系统中。这种情况下我们就不能直接使用binwalk等工具提取,需要先对加密的固件进行解密。
而厂商对固件的加密一般以下面三种情况为主。

常见的固件加解密方式

1、固件出厂未加密,后续发布包含解密方案的未加密版本,最后发布加密版本

设备固件在出厂时未加密(假设此时的版本是 v1.0),也未包含任何解密释序。厂商后续会发布一个包含解密程序的 v1.1 版本的未加密固件,最后再发布一个含有解密程序的 v1.2 版本的加密固件。此时,我们可以从固件 v1.1 中获取解密程序,用它来解密 v1.2 版本的固件,然后进行固件提取。

2、固件出厂加密,后续发布包含新版解密方案的未加密固件,最后发布新版加密版本

厂商直接在设备固件的原始版本中进行了加密,但是厂商决定更改加密方案并发布一个未加密的 v1.2 版本的新固件作为过渡,其中包含了新版本的解密程序。
在更新固件版本之前,需要先看新固件版本的发布通告,这个通告会指示用户在将固件升级到最新版本之前,需要先升级到固件的一个中间版本,而这个中间版本就是这个未加密的固件版本。通过这个中间版本的固件进行升级,最终可获取新版本加密固件的解密程序。

3、固件出厂加密,后续发布包含新版解密方案的加密固件,最后发布新版加密版本

从网上下载的设备固件在原始版本中进行了加密,厂商决定更改加密方案并发布一个带新版解密程序的中间版迭代加密固件,但是由于对初始版本的固件就进行了加密,因此很难获得解密程序。
此时,想对加密后的固件进行解密会比较困难。针对这种情况,一种思路是购买设备并使用JTAGUART调试等方法进入Linux Shell或者Uboot Shell,直接从设备硬件中提取固件的文件系统。然后就是对固件进行更深层次的分析,看看如何能够对加密的固件进行逆向分析,得到加密逻辑,最后破解。


对加密的D-Link固件进行解密

无设备情况下的通用思路如下:

准备工作

这里以 D-Link DIR-822-US 系列路由器 3.15B02 版本的固件为例进行分析。
该固件可以在官网(https://support.dlink.com/productinfo.aspx?m=dir-822-us)中下载得到。
wget https://support.dlink.com/resource/PRODUCTS/DIR-822-US/REVC/DIR-822_REVC_FIRMWARE_v3.15B02.zip
下载完后,我们如果用binwalk去分析固件会发现报告是空白。
我们这个时候可以用binwalk -E命令来查看固件的熵值(查看熵值是一种确认给定的字节序列是否压缩或加密的有效手段。熵值越大,意味着字节序列有可能是加密的或者是压缩过的)。
这里显示熵值几乎都是1,这意味着这个固件的各个部分都进行了加密。
幸运的是,我们发现对应版本固件的发布说明中提到了The firmware v3.15 must be upgraded from the transitional version of firmware v303WWb04_middle.

利用过渡版本解密固件

结合之前固件的三种加密更新方式,这个firmware v303WWb04_middle很可能就含有解密程序的中间过渡用未加密固件。所以我们就可以想办法下载这个固件并找到解密方案,从而解密DIR822C1_FW315WWb02固件。
这个固件我们可以去D-Link搭建的FTP服务器里下载(https://www.dlink.com/uk/en/support/faq/network-storage-and-backup/nas/dns-series/how-do-i-setup-the-built-in-ftp-server,嫌麻烦可以在附件下载)。
该中间过渡用的版本的固件没有加密,可以binwalk -ME直接提取。

因为加密固件是由该未加密固件升级而来,所以我们可以在squashfs-root文件夹内搜索updatefirmwareupgradedownload等关键的字符串。
grep -rnw './' -e 'update\|firmware\|upgrade\|download'
最终可以在/etc/templates/hnap/StartFirmwareDownload.php文件中找到线索,在浏览器中访问该文件就会执行下载固件的操作,这里有一行注释为// fw encimg,对应意思就是firmwareencryptionimage。
// fw encimg
setattr("/runtime/tmpdevdata/image_sign" ,"get","cat /etc/config/image_sign");
$image_sign = query("/runtime/tmpdevdata/image_sign");
fwrite("a", $ShellPath, "encimg -d -i ".$fw_path." -s ".$image_sign." > /dev/console \n");
del("/runtime/tmpdevdata");
前两行代码是用于获取固件映像签名的命令,使用 setattr 函数将属性 /runtime/tmpdevdata/image_sign 设置为 cat /etc/config/image_sign,再使用 query 函数从属性 /runtime/tmpdevdata/image_sign 中获取固件映像签名,并将其存储在变量 $image_sign 中。
即变量 $image_sign  将被设置为wrgac43s_dlink.2015_dir822c1
第三行代码是用于执行固件映像解密操作,使用 fwrite 函数将命令字符串 encimg -d -i ".$fw_path." -s ".$image_sign." > /dev/console 写入文件 $ShellPath。后续会执行这个shell。
这个encimg程序位于/usr/sbin。
然后使用readelf命令可以知道该程序是32位大端MIPS架构。

现在使用qemu用户模式进行模拟,并加上encimg -d -i ".$fw_path." -s ".$image_sign.等参数。
.$fw_path.就是需要解密的加密固件的路径,即 D-Link DIR-822-US 系列路由器 3.15B02 版本固件的路径。
.$image_sign.wrgac43s_dlink.2015_dir822c1。
qemu-mips-static与加密固件DIR822C1_FW315WWb02.bin复制到squashfs-root目录中用于运行encimg。
对固件进行解密:
sudo chroot . ./qemu-mips-static ./usr/sbin/encimg -d -i ./DIR822C1_FW315WWb02.bin -s wrgac43s_dlink.2015_dir822c1
此时再用binwalk去查看DIR822C1_FW315WWb02.bin,不仅可以看到文件信息,还发现熵值也变了。


提取解密后的固件

此时就可以使用binwalk -Me成功提取固件系统文件。

成功提取出加密固件!
参考书籍:《物联网安全漏洞挖掘实战》

看雪ID:Arahat0

https://bbs.kanxue.com/user-home-964693.htm

*本文为看雪论坛优秀文章,由 Arahat0 原创,转载请注明来自看雪社区

# 往期推荐

1、iOS越狱检测app及frida过检测

2、Large Bin Attack学习(_int_malloc源码细读 )

3、CVE-2022-2588 Dirty Cred漏洞分析与复现

4、开发常识 | 彻底理清 CreateFile 读写权限与共享模式的关系

5、XAntiDenbug的检测逻辑与基本反调试

6、Frida-Hook-Java层操作大全

球分享

球点赞

球在看

点击阅读原文查看更多


文章来源: https://mp.weixin.qq.com/s?__biz=MjM5NTc2MDYxMw==&mid=2458549899&idx=1&sn=65476744fa66285918fdda8d73c3ac37&chksm=b18d4e0186fac7178cf0621ccff4fbf421820436ed0262817a733cc1fd5d63bfb2b7282d4694&scene=58&subscene=0#rd
如有侵权请联系:admin#unsafe.sh