xiaomi-router-analysis

初探小米路由器固件

前言

今年双十一小米路由器出货量不少,为了避免重复前人做过的事情,所以就选择了较少人分析的小米

准备工作

刚开始尝试使用firmadyne自动化完成,但是结果总是不能令人满意,于是手动进行吧

选用如下工具:

  • Firmware-mod-kit
  • QEMU
  • BINWALK
  • IDA PRO

FMK安装

链接:https://github.com/rampageX/firmware-mod-kit

安装

1
2
$ sudo apt-get install git build-essential zlib1g-dev liblzma-dev python-magic
$ git clone https://github.com/rampageX/firmware-mod-kit.git

其余的视为常用软件,安装过程略过

固件提取

固件下载: http://bigota.miwifi.com/xiaoqiang/rom/r1cl/miwifi_r1cl_firmware_82b5c_2.7.81.bin

直接拷贝到firmware-mod-kit目录下

1
./extract-firmware.sh http://bigota.miwifi.com/xiaoqiang/rom/r1cl/miwifi_r1cl_firmware_82b5c_2.7.81.bin

生成的解包过的内容会存放在firmware-mod-kit/fmk下面

系统模拟

提取出了根目录的文件,就是时候启动虚拟机模拟运行了

这里使用QEMU进行模拟

进入bin文件夹查看busybox的相关信息

确认是32位的mipsel的系统,于是对应进行模拟

下载环境

首先需要下载对应的QEMU镜像文件,直接全部下载该链接下的文件

https://people.debian.org/~aurel32/qemu/mipsel/

启动环境

之后运行如下命令

1
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 user,id=mynet0,hostfwd=tcp::2222-:22,hostfwd=tcp::8080-:80 -device e1000,netdev=mynet0

该命令开启了一台QEMU模拟的MISPEL虚拟机,32位的,同时把22和80端口分别映射到8080和2222端口上用来和主机通信

部署文件

现在需要把固件中的文件部署到虚拟机中

1
2
3
cd fmk
tar zcvf ./rootfs.tar.gz ./rootfs/*
sftp -P 2222 ./rootfs.tar.gz root@localhost:/root/rootfs.tar.gz

这样就打包了rootfs下所有的文件并通过ssh上传到了虚拟机中

然后在虚拟机中操作

1
2
tar zxvf ./rootfs.tar.gz
chroot rootfs /bin/ash

就进入了路由器固件的模拟环境

尝试运行

但是这样还不够,我们还需要路由器里对应的服务运行起来,于是我们查找它的启动脚本

这是/etc/inittab中的内容

1
2
3
::sysinit:/etc/init.d/rcS S boot
::shutdown:/etc/init.d/rcS K shutdown
::askfirst:/bin/ash --login

可以看到/etc/init.d/rcS S boot,于是运行之,但是发现大量和nvram相关的报错。

只好进行调查,但是现有能找到的方案是劫持libnvram.so的,尝试后无果,陷入僵局。

喝口茶仔细看了先相关的调用脚本发现使用的是/usr/sbin/nvram这个二进制文件,开启IDA载入文件发现

这个程序应该是小米工程师自己写的助手程序,内部直接通过读写/dev/nvram实现,估计程序不过百行。

于是思路出现了,自己通过C++编写等同的程序再交叉编译到mispel32进行模拟,欺骗过启动过程。

限于时间,还没来得及实现

总结

现有的自动化框架依旧有其局限,同时路由器固件本身就针对不同的硬件平台和功能需求作出了相当程度的定制修改,个人认为软件模拟仿真不如直接硬件仿真来的直接。或许还是软件提取出来硬件分析+硬件实时调试追溯双管其下效率较高。