我们直奔主题!现在,查看你的路由器品牌及型号信息,然后去对应厂商的官方网站下载你路由器对应的固件。下载完成之后,把固件文件丢到binwalk里,这样我们就可以在QEMU中模拟路由固件了。此时,你将会看到如下图所示的画面:
发生了什么?
一般来说,每一个非binwalk友好的固件都要用不同的方法来进行分析,因此我们无法给大家提供一个针对所有类型加密固件的通用手把手教程。不过,我们将在这篇文章中给大家演示几种常见的固件分析场景,并提供一个处理这类加密固件的一般性指南。除此之外,沃恩还将提供一个解密D-Link DIR-882固件的示例。
加密固件的三种情形
解密固件最简单的方法就是在固件中寻找解密程序。那我们该怎么做呢?如果路由器可以解密新固件并进行更新,那么解密程序就肯定位于就固件镜像中的某个地方。如果你遇到的是加密固件,那你就可以访问厂商官网并寻找这个固件的旧版本,然后下载所有的旧版本固件并开始分析。
下面给出的是三种常见的固件发布场景。
场景1
设备固件在出场时未加密,也未包含任何解密程序。解密程序与较新版本(v1.1)中未加密版本的固件一起提供,以便将来进行加密固件更新。此后发布的固件为加密固件。
此时,我们可以从固件v1.1处获取解密程序,然后用它来解密最新版本的固件v1.2。
场景2
设备固件在原始版本中加密,厂商决定更改加密方案并发布一个未加密的转换版本v1.2,其中包含了新的解密程序。
跟场景1类似,我们可以从v1.2映像获取解密程序,并将其应用到最新的加密固件中。阅读固件版本的发布公告可以帮助我们识别未加密的转换版本。发布公告通常会指示用户在升级到最新版本之前先升级到中间版本,而中间版本很可能就是未加密的转换版本固件。
场景3
设备固件在原始版本中加密。但是,厂商决定更改加密方案,并发布包含新版解密程序的未加密转换版本。
此时,获取解密程序会比较困难。一种方法是购买设备并直接从设备硬件中提取未加密的固件,另一种方法就是对固件进行更深层次的分析,希望能够“破解加密”。
场景4
通过使用十六进制编辑器来查看固件内容,我们可以迅速且直观地了解我们正在处理的对象。使用二进制或十六进制模式查看固件源码,你看到了0xFF或0×00字节的数据域吗?文件代码有特定的模式吗?它们是由随机十六进制字节组成的同质块吗?如果有的话,很有可能固件源码已经被带有静态密钥的简单异或域取代了。你可以看看,是否有一个十六进制字节比其他字节出现得更加频繁呢?
场景5:压缩、加密还是混淆处理?
熵可以帮助我们更好地分析固件,固件中有一部分具有高熵,表明这些地方经过了加密处理。一段低熵字节代表的是低随机性、结构化和可预测性。当与其他分析相结合时,它可以帮助我们确定固件是经过压缩得、加密得还是混淆处理得。在这个分析阶段,binwalk的大量选项可能会提供帮助。
理论与实践
接下来,我们将刚学到的知识应用到加密的D-Link DIR-882固件镜像中:
我们可以从厂商的FTP服务器找到这款路由器的所有旧版本固件。使用binwalk对最早期版本的固件v1.00B07进行测试,它将正确检测到uImage头以及LZMA压缩数据:
这表明,我们现在处于场景1中。浏览了固件镜像的所有可用版本之后,我们发现固件的v1.04B02版本就是转换版本,它包含在v1.10B02固件包中。除此之外,我们还可以计算镜像的熵来快速确定哪个镜像已进行了加密处理。
接下来,使用binwalk从v1.04B02固件中提取文件系统:
提取成功之后,我们就可以开始分析固件的更新过程了,并确定解密固件的方法。幸运的是,快速浏览文件系统后,我们在/bin目录中找到了一个貌似有戏的代码文件“imgdecrypt”。
我们遇到了一个小问题,即主机设备和代码文件之间的处理器架构存在差异。幸运的是,我们可以使用QEMU执行跨架构chroot。首先,我们需要将qemu-mipsel-static代码拷贝到固件root文件系统中的/usr/bin/目录,然后将加密固件拷贝到未加密固件的文件系统中。最后,使用chroot进入到固件root,然后获取到可用的shell。
我们可以看到,binwalk成功检测到了解密固件中的不同区域。
总结
以上就是处理加密固件的一般方法。值得一提的是,厂商有时会对多个路由器使用相同的加密方案,而且imgdecrypt这个文件还可以用来解密DIR-878和DIR-867的固件。因此,我们在找到一个解密程序或解密方案时,可以用它来试试同一产品线中具有相同处理器体系结构的其他路由器产品。