iot

学习分析加密的路由器固件

学习笔记

Posted by X1ng on March 9, 2021

由于需要分析一下DIR-878的固件,但是从官网找到的最新版固件是经过加密的,所以学习一下固件解密的方法

解密方法

因为固件升级是在设备上进行的,所以如果用户要将一个设备升级为加密过的固件版本,则该设备上目前运行的版本必须有对应的解密程序,加密过的固件在被上传到设备上之后,先被解密程序解密,然后再进行升级

这就有两种容易解密固件的情况

  1. 设备早期版本未加密,后面的版本加密

    这样的话就一定有一个版本是未加密的,但是该未加密版本的文件系统中有解密程序

  2. 设备早期版本使用加密算法A加密,后面使用加密算法B加密

    这样的话厂商可能会在更改加密方案的时候发布一个未加密的转换版本v1.2,其中包含了新的解密程序

    可以从公告中获取信息,公告通常会指示用户在升级到最新版本之前先升级到中间版本,而中间版本很可能就是未加密的转换版本固件

所以其实就是在旧的固件版本中找到未加密的版本,然后在固件文件系统中找到解密程序对最新版本固件进行解密

但是如果固件从一开始的版本就是加密的并且从来没有发布过未加密版本,就只能用比如 从设备硬件中提取未加密的固件 这样比较麻烦的方法来解密固件了

栗子

DIR-878

在官网下载最新版固件,发现binwalk不能识别出什么,并且墒极高

应该是固件经过加密了

于是在官网找之前版本的固件

找到与加密固件一起发布的未加密版本

binwalk解包得到文件系统

binwalk -Me DIR878A1_FW104B05_Middle_FW_Unencrypt.bin

find命令可以找到解密程序

但是由于不是静态链接程序,需要在虚拟机里运行

从https://people.debian.org/~aurel32/qemu/mipsel/下载所需的文件

配置好网卡后用qemu模拟

sudo apt-get install bridge-utils
sudo apt-get install uml-utilities

sudo brctl addbr virbr0
sudo ifconfig virbr0 192.168.122.1/24 up

sudo tunctl -t tap0
sudo ifconfig tap0 192.168.122.11/24 up
sudo brctl addif virbr0 tap0

sudo qemu-system-mipsel -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic

虚拟机起来后用户名密码root:root进入虚拟机,配置网卡

ifconfig eth0 192.168.122.12/24 up

用scp传递文件系统

scp -r x1ng@192.168.122.1:/home/x1ng/router/878/DIR-878_A1_FW110/cpio-root ./

用scp传递固件

scp x1ng@192.168.122.1:/home/x1ng/router/878/DIR_878_FW1.30B08.bin ./cpio-root/bin
scp x1ng@192.168.122.1:/home/x1ng/router/878/DIR-878_A1_FW110/DIR878A1_FW110B05.bin ./cpio-root/bin

进入文件系统

cd ./cpio-root
chroot . sh

之后就可以对固件进行解密了

cd bin
./imgdecrypt ./DIR878A1_FW110B05.bin
./imgdecrypt ./DIR_878_FW1.30B08.bin

将其传回ubuntu上

exit
scp ./DIR_878_FW1.30B08.bin x1ng@192.168.122.1:/home/x1ng/router/878/DIR_878_FW1.30B08_de.bin

就可以用binwalk正常解包文件系统了

binwalk -Me DIR_878_FW1.30B08_de.bin

参考资料

如何分析和解密已加密的路由器固件

路由器漏洞挖掘测试环境的搭建之问题总结(二)