固件模拟调试环境搭建

IOT安全从入门到放弃

Posted by zeroisone on March 20, 2018

固件模拟调试环境搭建

前言

智能硬件火热,安全问题也频出,Web狗也来凑一波热闹。搭建固件模拟调试环境中踩了一些坑,花费不少时间,在此记录下搭建固件模拟调试环境中遇到的问题。

Binwalk提取固件

Binwalk是一款十分强大的固件分析工具,常用于固件分析及提取文件系统。

Github地址:https://github.com/ReFirmLabs/binwalk

安装

$ sudo apt-get update  
$ sudo apt-get install build-essential autoconf git #安装依赖 

# https://github.com/devttys0/binwalk/blob/master/INSTALL.md  
$ git clone https://github.com/ReFirmLabs/binwalk.git
$ cd binwalk  

# python2.7 
$ sudo python setup.py install 

# Python3.x
$ sudo python3 setup.py install

$ sudo ./deps.sh #debian/Ubuntu可使用脚本自动安装依赖

手动安装依赖库 请参考INSTALL.md 。

使用

1.固件扫描

$ binwalk firmware.bin

2.提取文件 选项“-e”和“–extract”按照预定义的配置文件中的提取方法从固件中提取探测的文件及系统。

选项“-M”和“—matryoshka”根据magic签名扫描结果进行递归提取,仅对“-e“和”-dd“选项有效

$ binwalk -e firmware.bin

执行命令后会可以看到多出一个文件夹,固件在squashfs-root里。

qemu安装

Qemu 是纯软件实现的虚拟化模拟器,几乎可以模拟任何硬件设备。 QEMU模拟器主要有两种比较常见的运作模式:

  1. User Mode(使用者模式) User Mode模式下,用户只需要将各种不同平台的处理编译得到的Linux程序放在QEMU虚拟中运行即可,其他的事情全部由QEMU虚拟机来完成,不需要用户自定义内核和虚拟磁盘等文件;

  2. System Mode(系统模式)。 System Mode模式下,最明显的特点是用户可以为QEMU虚拟机指定运行的内核或者虚拟硬盘等文件,简单来说系统模式下QEMU虚拟机是可根据用户的要求配置的

低版本qemu问题

刚开始使用的系统是AttifyOS:智能设备固件分析环境,传说中的IOT渗透测试系统。系统是Ubuntu14.04,集成多种硬件设备分析工具,使用才发现是个坑,工具版本都不是最新的。

Qemu运行mips程序常会遇到“Invalid ELF image for this architec”。通常是以下两个原因:

  1. 老版本的qemu会存在,新版本一般都不存在,参考解决链接: http://www.devttys0.com/2011/12/qemu-vs-sstrip/

  2. 文件的打开方式不正确,使用了错误的程序执行了ELF文件

AttifyOS自带的qemu版本是2.0,碰巧就遇上这问题了,不论使用大端格式的qemu-mips还是小端格式的qemu-mipsel都会报如下错误。MIPS指令架构属于RISC(精简指令集)体系,mips是big-endian(大端)的mips架构,mipsel是little-endian(小端)的mips架构。他们之间的区别就是内存中存放的数据的字节顺序相反,也就是把低位放在低地址还是高地址。

查看qemu版本:qemu-mips -version

查看文件系统架构:file命令或readelf命令

使用低版本qemu导致的错误:

以下情况也是由低版本情况引起,使用chroot命令改变程序执行时所参考的根目录位置,也会提示“/lib/ld-uClibc.s0.0”错误。

卸载apt源下的qemu

测试发现Ubuntu16.04下使用apt-get 安装的qemu版为2.5,不是最新版本。

$ sudo apt-get remove qemu
$ sudo apt-get remove qemu-system
$ sudo apt-get remove qemu-user-static

源码安装编译qemu

源码安装可以更新qemu到最新版本。

$ git clone git://git.qemu.org/qemu.git
$ cd qemu
$ git submodule update --recursive
$ sudo apt install libglib2.0 libglib2.0-dev
$ sudo apt install autoconf automake libtoolcd 
​$ ./configure
$ sudo make && sudo make install

ubuntu14.04中用源码方式编译安装qemu时,执行configure步骤提示错误:“ERROR: pixman >= 0.21.8 not present.” 安装如下依赖:

$ sudo apt-get install libpixman-1-dev

qemu模拟mips程序

查看安装后的qemu

查看文件mips程序大端还是小端

qemu模拟mips程序

将qemu-mips复制到固件根目录时,执行“sudo chroot . ./qemu-mips ./bin/busybox” ,出现以下问题,

使用ldd命令查看依赖。

将依赖文件放入固件文件系统squashfs-root目录中

$ cd lib 
$ mkdir i386-linux-gnu
$ cd i386-linux-gnu
$ cp /lib/i386-linux-gnu/libglib-2.0.so.0 ./
$ cp /lib/i386-linux-gnu/librt.so.1 ./
$ cp /lib/i386-linux-gnu/libm.so.6 ./
$ cp /lib/i386-linux-gnu/libgcc_s.so.1 ./
$ cp /lib/i386-linux-gnu/libpthread.so.0 ./
$ cp /lib/i386-linux-gnu/libc.so.6 ./
$ cp /lib/i386-linux-gnu/libpcre.so.3 ./
$ cd ..
$ cp /lib/ld-linux.so.2 ./

可以正常运行了

在QEMU MIPS虚拟机上运行MIPS程序(ssh方式)

使用QEMU 模拟正在运行的MIPS系统并配置MIPS系统网络,这样本地主机ubuntu系统就可以和QEMU虚拟机进行网络通讯和传输数据了。

1.安装依赖文件

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

2.将ubuntu主机系统中的网络接口配置文件 /etc/network/interfaces 修改为如下的内容并保存。

auto lo  
iface lo inet loopback  

# ubuntu 16.04的系统用ens33代替eth0  
auto eth0 
iface eth0 inet manual  
up ifconfig eth0 0.0.0.0 up  
  
auto br0  
iface br0 inet dhcp  
bridge_ports eth0  
bridge_stp off  
bridge_maxwait 1

3.创建 QEMU 网络接口文件启动脚本文件,重启网络使网络配置生效。使用下面的命令 创建并编辑 /etc/qemu-ifup 文件。 为了防止不干扰 /etc/qemu-ifup文件的原来的命令操作,没有修改和删除 /etc/qemu-ifup文件中的原文件内容,而是在后面直接添加如下内容。

#!/bin/sh  
echo "Executing /etc/qemu-ifup"  
echo "Bringing $1 for bridged mode..."  
sudo /sbin/ifconfig $1 0.0.0.0 promisc up  
echo "Adding $1 to br0..."  
sudo /sbin/brctl addif br0 $1  
sleep 3

4.然后重启网络使所有配置生效

# 赋予/etc/qemu-ifup脚本可执行权限  
$ sudo chmod a+x /etc/qemu-ifup  
  
# 重启网络使配置生效  
$ sudo /etc/init.d/networking restart

QEMU启动配置

$ sudo ifdown eth0  
$ sudo ifup br0 

5.下载 MIPS虚拟机 下载地址:https://people.debian.org/~aurel32/qemu/ 这里选择下载MIPS32小端格式的虚拟机镜像文件,下载的内核文件为 vmlinux-2.6.32-5-4kc-malta,磁盘镜像文件为debian_squeeze_mipsel_standard.qcow2。

6.启动虚拟机

 $ 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" -net nic -net tap -nographic  

默认账号密码root/root

7.通过 scp 向MIPS虚拟机拷贝MIPS程序

通过 “ scp” 命令向MIPS虚拟机拷贝本地ubuntu上的文件,将解压后的路由器的整个文件系统拷贝到远端的MIPS虚拟机中。

 $ scp -r ./squashfs-root  root@172.16.30.146:/root/  

在远端的MIPS虚拟机上运行MIPS程序。

参考

《揭秘家用路由器0day漏洞挖掘技术》

[路由器逆向分析———在QEMU MIPS虚拟机上运行MIPS程序(ssh方式) - CSDN博客] (http://blog.csdn.net/QQ1084283172/article/details/69652258)