0x00 前言
大家可能读过我们之前关于路由器漏洞研究的一些文章,想亲自动手试一下,然后从厂商网站上下载了家用路由器的固件,扔到binwalk中处理,以便在QEMU中仿真,这时候出现了如下界面:
图1. binwalk无法处理该固件
通常情况下,无法被binwalk轻松处理的固件都有自己的特点,因此我们无法为所有类型的加密固件提供细致的解密步骤。本文的目标是向大家介绍几种常见的场景,提供处理这类固件的一般性方法。此外,我们也会介绍如何解密D-Link DIR-882固件。
0x01 常见加密固件类型
解密固件最简单的方法就是搜索固件中的加密例程,但具体怎么做呢?如果路由器可以在更新过程中解密新版固件,那么老版固件镜像中必定包含加密例程。如果我们碰到加密固件,可以去官网寻找历史版本,下载所有老版本固件,然后再开始研究。
以下是3种常见的固件发布场景:
场景1
当厂商发布设备时,设备固件没有经过加密,也不包含解密流程。解密例程与新版未加密固件(比如v1.1)一起提供,以便后续加密固件的更新。后续发布的固件都经过加密处理。
图2. 固件发布场景1
在这种场景中,我们可以从v1.1版固件获得加密例程,使用该例程来解密v1.2版的最新固件。
场景2
在原始发行版中设备固件已加密。厂商决定修改加密方案,发布未加密的过渡版本(v1.2),该版本中包含新的加密例程。
图3. 固件发布场景2
与场景1类似,我们可以从v1.2版镜像中获得解密例程,利用该例程处理最新版加密固件。我们可以阅读固件的发布说明,从中可能找到未加密处理的过渡版本。固件发布说明中通常会指导用户在升级到最新版固件之前先升级到过渡版本。过渡版本很有可能就是未经加密的过渡固件。
场景3
原始发行版中设备固件已加密,然而,厂商决定修改加密方案,发布未加密过渡版本,其中包含新版解密例程。
图4. 固件发布场景3
在这种场景中,我们没有简单的方法能够获取解密例程。我们可以购买设备,从硬件中直接提取未加密固件。另外我们也可以进一步分析固件,希望能解开固件加密机制。
场景3:使用十六进制编辑器
在十六进制编辑器中打开固件并快速浏览,我们能对正在处理的数据有个直观的感受。我们可以分别在二进制模式及十六进制模式中查看,判断其中是否包含0xFF
或0x00
字节、是否为随机的数据?这种情况下,固件可能经过加密处理,并且使用的不是简单的静态密钥异或加密方式。我们也可以查看统计图,是否有某个十六进制字节比其他字节出现的次数更多。
场景3:压缩、加密或者混淆
熵(entropy)能提供关于固件的重要信息。如果固件熵值较高,则代表固件很可能经过加密。低熵字节则表示随机度较低、具有结构化及可预测性。当与其他分析技巧结合使用时,我们可以通过熵来判断固件是否经过压缩、加密或者混淆处理。在这一阶段,binwalk有各种选项,可以帮我们分析固件。
0x02 实际案例
现在利用前面掌握的知识,我们可以来分析一下经过加密的D-Link DIR-882固件镜像:
图5. binwalk无法识别固件镜像中的信息
从厂商的FTP服务器中,我们可以找到该路由器的所有老版固件。如果使用binwalk检查最早版本的固件(v1.00B07),可以看到uImage
头以及LZMA加密数据:
图6. 使用binwalk处理DIR-882早期固件的扫描结果
这表明我们处理的是场景1类别的固件。分析所有可用的固件镜像后,我们发现v1.04B02版固件为过渡版固件,包含在v1.10B02版固件包中。我们可以计算镜像的熵值,快速判断哪个固件经过加密。
图7. binwalk对未加密过渡版及首个加密固件的分析结果
然后我们可以使用binwalk从v1.10B02版固件中提取文件系统。
成功提取文件系统后,我们可以开始研究固件更新过程,判断固件的解密机制。幸运的是,快速浏览文件系统后,我们在/bin
目录中找到了比较有趣的一个二进制文件:imgdecrypt
。
图9. 提取出的文件系统中/bin
目录内容
这里宿主环境与该程序的处理器架构有些不同,幸运的是,我们可以使用QEMU执行跨架构的chroot
。为了完成该任务,首先我们将qemu-mipsel-static
程序拷贝到固件根文件系统的/usr/bin/
目录中,然后将加密过的固件拷贝到未加密的固件文件系统中,最后我们chroot
到固件根目录,得到一个可用的shell。这里要感谢chung96vn,小伙伴提供了这种跨架构chroot
技术。
图10. 使用QEMU执行跨架构chroot
并解密固件
在这个shell中,我们可以运行imgdecrypt
,成功解密经过加密的固件。
图11. binwalk成功检测出加密固件的不同section。
0x03 总结
主要思路就是这样,这里我们大致介绍了处理加密固件的一种思路。如果我们碰到了场景3类型的固件,不要惊慌。消费级路由器通常运算能力有限,在这种限制下,设备通常无法使用较慢但难以破解的非对称加密算法(如RSA)。此外,厂商有时候会对多款路由器使用相同的加密算法。实际上,imgdecrypt
程序可以用来解密DIR-878以及DIR-867路由器的固件。大家在分析路由器固件时,可以针对性寻找相同产品线、相同处理器结构的路由器,可能会找到研究切入点。
0x04 参考资料
https://wzt.ac.cn/2019/09/18/D-Link_BUG/