常见固件加解密方式与D-Link固件解密分析
先来说一下如何去D-Link 官网下载,可能有些入门的同学不知道
选择产品型号
下面是下载页面
点第二个Download连接会跳转到下面的资源页面
下面是解密过程
本次的固件是DIR-822_REVC_FIRMWARE_v3_ .15B02.zip
使用binwalk 分析固件结构,没有发现任何文件信息。
压缩、加密还是混淆?
熵为了解固件提供了重要的信息,固件的一部分具有较高的熵,建议进行加密。低熵字节的一部分表明低随机性、结构和可预测性。当与其他分析结合使用时,它可以让我们确定是否进行了压缩、加密或混淆。在此分析阶段,binwalk提供的大量选项可能会变得有用。
Binwalk是用于搜索给定二进制镜像文件以获取嵌入的文件和代码的工具。具体来说,它被设计用于识别嵌入固件镜像内的文件和代码。Binwalk使用libmagic库,因此它与Unix文件实用程序创建的魔数签名兼容。Binwalk还包括一个自定义魔数签名文件,其中包含常见的诸如压缩/存档文件,固件头,Linux内核,引导加载程序,文件系统等的固件映像中常见文件的改进魔数签名。
然后使用binwalk -E
命令来查看固件的熵值,发现该固件被加密了
查看熵值是一种确认给定的字节序列是否压缩或加密的有效手段。熵值越大,意味着字节序列有可能是加密的或者是压缩过的
在发布固件的文档中发现,该固件是从v303wwb04middle 过渡来的,所以需要去v303wwb04middle 版本的固件中找到解密的方法
接下来分析DIR822C1_FW303WWb04_i4sa_middle.bin
所以我们可以直接提取固件
因为加密固件是由该未加密固件升级而来,所以我们可以在
squashfs-root
文件夹内搜索update
、firmware
、upgrade
、download
等关键的字符串
分析代码:
解密的具体步骤
- 获取签名或密钥:
setattr("/runtime/tmpdevdata/image_sign" ,"get","cat /etc/config/image_sign");
:这行代码将/etc/config/image_sign
文件的内容读取到/runtime/tmpdevdata/image_sign
路径中。$image_sign = query("/runtime/tmpdevdata/image_sign");
:获取签名或密钥的内容。
- 执行解密:
fwrite("a", $ShellPath, "encimg -d -i ".$fw_path." -s ".$image_sign." > /dev/console \n");
:将解密命令写入Shell脚本。- 解密命令的具体形式是:
encimg -d -i /var/firmware.seama -s <image_sign>
,其中<image_sign>
是从/etc/config/image_sign
文件中读取的签名或密钥。
主要还是encimg 这个程序来对固件进行解密,解密就运行encimg 这程序对要研究的固件进行解密,先找到这程序的位置
cd _DIR822C1_FW303WWb04_i4sa_middle.bin.extracted/squashfs-root
cp /usr/bin/qemu-mips-static .
sudo chroot . ./qemu-mips-static ./usr/sbin/encimg -d -i ./DIR822C1_FW315WWb02.bin -s wrgac43s_dlink.2015_dir822c1
再一次使用binwalk 来查看DIR822C1_FW315WWb02.bin固件
解密成功,后面再来复现这个漏洞。
参考:[原创]常见的固件加解密方式与D-Link固件解密实战分析-智能设备-看雪-安全社区|安全招聘|kanxue.com