Linux Mint编译安装Qemu进行固件仿真

文章目录

  • 前言
  • 1. 准备Qemu源码包
  • 2. 编译安装
    • 2.1 首次尝试编译
    • 2.2 安装python3-venv
    • 2.3 安装sphinx
    • 2.4 安装sphinx-rtd-theme
    • 2.4 安装ninja
    • 2.6 安装编译器
  • 3. 重新编译并安装
  • 4. 进行固件仿真
    • 4.1 准备固件
    • 4.2 Binwalk解析文件
    • 4.3 看一下文件结构
    • 4.4 安装sasquatch
    • 4.5 重新解析文件
    • 4.6 确定指令集
    • 4.7 开启qemu虚拟环境。
    • 4.8 为Qemu设置网络
    • 4.9 创建Qemu虚拟机
    • 4.10 导入固件文件
    • 4.11 挂载文件系统并启动shell
    • 4.12 启动路由器
    • 4.13 对仿真路由器进行端口扫描
  • 写在最后


前言

因为最近的项目原因,需要了解一下固件仿真的知识。网络上搜索了一下,基本上不外乎Qemu、Firmadyne、firmAE、FAP(Firmware Analysis Plus)这几种方式,但是归根结底都是基于Qemu做了一些优化、集成、自动化之类的。所以本着学习与探索的态度,准备直接从固件仿真的老祖宗——Qemu入手,本文主要介绍了Linux下(博主基于Linux-Mint-20.3-xfce-64bit)编译安装Qemu的过程。

1. 准备Qemu源码包

下载源码包

$ wget https://download.qemu.org/qemu-8.2.0-rc1.tar.xz

解压

$ tar xvJf qemu-8.2.0-rc1.tar.xz

2. 编译安装

2.1 首次尝试编译

$ cd qemu-8.2.0-rc1/

看一下configure的选项

$ ./configure --help

用最简单的形式进行configure

$ ./configure

Linux Mint编译安装Qemu进行固件仿真_第1张图片

貌似缺少pip,根据提示应该需要安装python3-venv,手动安装一下。

2.2 安装python3-venv

直接apt安装即可

$ sudo apt install python3-venv

Linux Mint编译安装Qemu进行固件仿真_第2张图片
再次编译
Linux Mint编译安装Qemu进行固件仿真_第3张图片
一个坑接着一个坑,貌似缺少sphinx和Ninja,继续填坑。

2.3 安装sphinx

先安装pip

$ sudo apt install python3-pip

再安装sphinx

$ pip install sphinx

涉及到的东西貌似还挺多
Linux Mint编译安装Qemu进行固件仿真_第4张图片
虽然有些warning,但是貌似Ninja也安装上了
Linux Mint编译安装Qemu进行固件仿真_第5张图片
再次编译
Linux Mint编译安装Qemu进行固件仿真_第6张图片
没有想象的那么简单啊,sphinx_rtd_theme还是有些问题。先卸载安装的sphinx

$ pip uninstall sphinx

然后安装上面报错缺少的sphinx 5.3.0版本。

$ pip install "Sphinx==5.3.0"

再次configure

$./configure

Linux Mint编译安装Qemu进行固件仿真_第7张图片
同样的问题,还是直接安装这个sphinx_rtd_theme吧

2.4 安装sphinx-rtd-theme

$ pip install sphinx-rtd-theme

再次configure
Linux Mint编译安装Qemu进行固件仿真_第8张图片
继续填坑,安装一下ninja-build

2.4 安装ninja

$ sudo apt install ninja-build

再次configure
Linux Mint编译安装Qemu进行固件仿真_第9张图片
嗯,还是有些问题,缺少编译器。

2.6 安装编译器

$ sudo apt install libglib2.0-0 libglib2.0-dev

3. 重新编译并安装

再次configure,顺利通过。
Linux Mint编译安装Qemu进行固件仿真_第10张图片
接下来make一下。

$ make && make install

安装完成后在/usr/loacal/bin下会生成相应的可执行文件。
在这里插入图片描述

4. 进行固件仿真

4.1 准备固件

https://pan.baidu.com/s/1soGEzvU1dBHau-r0WTFaNQ

4.2 Binwalk解析文件

$ binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin

Linux Mint编译安装Qemu进行固件仿真_第11张图片
从这里可以看出是Squashfs标准文件类型,big endian大端序。

4.3 看一下文件结构

Linux Mint编译安装Qemu进行固件仿真_第12张图片
squashfs-root目录下竟然是空的,从上面的binwalk解析过程也可以看出来,貌似squashfs文件解析出问题,应该是没有安装sasquatch,手工安装一下。

4.4 安装sasquatch

重要的事情说三遍,一定要按照我这个方式安装,否则会有深坑,以后再解释。

$ wget https://github.com/devttys0/sasquatch/pull/47.patch && patch -p1 < 47.patch && sudo ./build.sh

顺利安装sasquatch。

4.5 重新解析文件

$ binwalk -Me HG532eV100R001C01B020_upgrade_packet.bin

再次binwalk提取固件,这次正常了。
Linux Mint编译安装Qemu进行固件仿真_第13张图片

4.6 确定指令集

接下来看看系统使用的指令集,在解包后的bin目录下,随便找两三个可执行程序看一下。
Linux Mint编译安装Qemu进行固件仿真_第14张图片
可以看到,都是32为的MIPS,所以接下来我们通过qemu仿真的时候选择32位,使用MIPS内核。
先下载mips内核(地址:https://people.debian.org/~aurel32/qemu/mips/),下载后放到工作目录下,如下图。
Linux Mint编译安装Qemu进行固件仿真_第15张图片

4.7 开启qemu虚拟环境。

$ qemu-system-mips -M malta -kernel ./mips/vmlinux-2.6.32-5-4kc-malta -hda ./mips/debian_squeeze_mips_standard.qcow2 --append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=ens33

4.8 为Qemu设置网络

查看宿主机网络信息。

$ ip a

Linux Mint编译安装Qemu进行固件仿真_第16张图片
本次组网采用模式(qemu还支持其他的组网方式,后续再研究)。
编辑两个文件:
/usr/local/etc/qemu-ifup,内容如下
Linux Mint编译安装Qemu进行固件仿真_第17张图片
/usr/local/etc/qemu-ifdown,内容如下
Linux Mint编译安装Qemu进行固件仿真_第18张图片

4.9 创建Qemu虚拟机

通过下面的命令创建qemu虚拟机

$ sudo qemu-system-mips -M malta -kernel ./mips/vmlinux-2.6.32-5-4kc-malta -hda ./mips/debian_squeeze_mips_standard.qcow2 --append "root=/dev/sda1 console=tty0" -net nic -net tap,ifname=tap0 -nographic

运行结果如下
Linux Mint编译安装Qemu进行固件仿真_第19张图片
Qemu的默认登录密码应该是root/root
Linux Mint编译安装Qemu进行固件仿真_第20张图片
登录成功,这个时候可以看到qemu虚拟机的地址跟宿主机的地址在一个网段。
Linux Mint编译安装Qemu进行固件仿真_第21张图片
只要是这个网段的主机都可以跟qemu虚拟机通信,这为我们通过kali研究qemu虚拟机提供了便利。
Linux Mint编译安装Qemu进行固件仿真_第22张图片

4.10 导入固件文件

接下来,我们回到kali主机上,将我们通过binwalk提取的目录squashfs-root打包上传到qemu虚拟机。

$ tar -czvf squash.tar squashfs-root 

Linux Mint编译安装Qemu进行固件仿真_第23张图片
通过scp工具上传到qemu虚拟机

$ scp squash.tar root@192.168.232.134:/root/

在这里插入图片描述
报错了,虽然能够ping通,看来还是有点问题,直接ssh看一下。
在这里插入图片描述
嗯,同样的问题,回到宿主机访问一下试试看。
在这里插入图片描述
嗯,宿主机是可以的,这个问题后面再研究,先从宿主机上传一下上面准备好的tar包。
在这里插入图片描述
顺利上传成功,在qemu虚拟机中也找到了对应的包,进行解压。

# tar -zxvf squash.tar

Linux Mint编译安装Qemu进行固件仿真_第24张图片

4.11 挂载文件系统并启动shell

进行文件挂载。

root@debian-mips:~# mount -o bind /dev ./squashfs-root/dev
root@debian-mips:~# mount -t proc /proc ./squashfs-root/proc/

然后启动shell
Linux Mint编译安装Qemu进行固件仿真_第25张图片
一切都比较顺利,接下来开启路由器的环境。

4.12 启动路由器

# ./bin/upnp
# ./bin/mic

Linux Mint编译安装Qemu进行固件仿真_第26张图片
Linux Mint编译安装Qemu进行固件仿真_第27张图片
最后感觉没有启动成功,web页面试了一下也进不去.
Linux Mint编译安装Qemu进行固件仿真_第28张图片
Ping一下试试看,发现网络也不通了,应该路由器启动以后,修改成了路由器本身默认的网络。
Linux Mint编译安装Qemu进行固件仿真_第29张图片
Ctrl+c退出,再看一下网络。
Linux Mint编译安装Qemu进行固件仿真_第30张图片
地址变成了192.168.1.1,这应该是路由器启动的时候更改的。

4.13 对仿真路由器进行端口扫描

通过nmap扫描一把。
Linux Mint编译安装Qemu进行固件仿真_第31张图片
开放了ssh的22端口,telnet的23端口,syslog的514端口,看来路由器是起来了,只是启动可能有些问题。很大概率是我们提取的squashfs-root不够全面,导致固件仿真的时候有些文件找不到。

写在最后

这是第一次使用Qemu进行仿真,还有很多内容没有搞明白,需要深入学习,后面会陆续更新。

你可能感兴趣的:(物联网安全,物联网,iot)