文章目录
- 前言
- 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
貌似缺少pip,根据提示应该需要安装python3-venv,手动安装一下。
2.2 安装python3-venv
直接apt安装即可
$ sudo apt install python3-venv
再次编译
一个坑接着一个坑,貌似缺少sphinx和Ninja,继续填坑。
2.3 安装sphinx
先安装pip
$ sudo apt install python3-pip
再安装sphinx
$ pip install sphinx
涉及到的东西貌似还挺多
虽然有些warning,但是貌似Ninja也安装上了
再次编译
没有想象的那么简单啊,sphinx_rtd_theme还是有些问题。先卸载安装的sphinx
$ pip uninstall sphinx
然后安装上面报错缺少的sphinx 5.3.0版本。
$ pip install "Sphinx==5.3.0"
再次configure
$./configure
同样的问题,还是直接安装这个sphinx_rtd_theme吧
2.4 安装sphinx-rtd-theme
$ pip install sphinx-rtd-theme
再次configure
继续填坑,安装一下ninja-build
2.4 安装ninja
$ sudo apt install ninja-build
再次configure
嗯,还是有些问题,缺少编译器。
2.6 安装编译器
$ sudo apt install libglib2.0-0 libglib2.0-dev
3. 重新编译并安装
再次configure,顺利通过。
接下来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
从这里可以看出是Squashfs标准文件类型,big endian大端序。
4.3 看一下文件结构
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提取固件,这次正常了。
4.6 确定指令集
接下来看看系统使用的指令集,在解包后的bin目录下,随便找两三个可执行程序看一下。
可以看到,都是32为的MIPS,所以接下来我们通过qemu仿真的时候选择32位,使用MIPS内核。
先下载mips内核(地址:https://people.debian.org/~aurel32/qemu/mips/
),下载后放到工作目录下,如下图。
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
本次组网采用模式(qemu还支持其他的组网方式,后续再研究)。
编辑两个文件:
/usr/local/etc/qemu-ifup,内容如下
/usr/local/etc/qemu-ifdown,内容如下
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
运行结果如下
Qemu的默认登录密码应该是root/root
登录成功,这个时候可以看到qemu虚拟机的地址跟宿主机的地址在一个网段。
只要是这个网段的主机都可以跟qemu虚拟机通信,这为我们通过kali研究qemu虚拟机提供了便利。
4.10 导入固件文件
接下来,我们回到kali主机上,将我们通过binwalk提取的目录squashfs-root打包上传到qemu虚拟机。
$ tar -czvf squash.tar squashfs-root
通过scp工具上传到qemu虚拟机
$ scp squash.tar root@192.168.232.134:/root/
报错了,虽然能够ping通,看来还是有点问题,直接ssh看一下。
嗯,同样的问题,回到宿主机访问一下试试看。
嗯,宿主机是可以的,这个问题后面再研究,先从宿主机上传一下上面准备好的tar包。
顺利上传成功,在qemu虚拟机中也找到了对应的包,进行解压。
# tar -zxvf squash.tar
4.11 挂载文件系统并启动shell
进行文件挂载。
root@debian-mips:~# mount -o bind /dev ./squashfs-root/dev
root@debian-mips:~# mount -t proc /proc ./squashfs-root/proc/
然后启动shell
一切都比较顺利,接下来开启路由器的环境。
4.12 启动路由器
# ./bin/upnp
# ./bin/mic
最后感觉没有启动成功,web页面试了一下也进不去.
Ping一下试试看,发现网络也不通了,应该路由器启动以后,修改成了路由器本身默认的网络。
Ctrl+c退出,再看一下网络。
地址变成了192.168.1.1,这应该是路由器启动的时候更改的。
4.13 对仿真路由器进行端口扫描
通过nmap扫描一把。
开放了ssh的22端口,telnet的23端口,syslog的514端口,看来路由器是起来了,只是启动可能有些问题。很大概率是我们提取的squashfs-root不够全面,导致固件仿真的时候有些文件找不到。
写在最后
这是第一次使用Qemu进行仿真,还有很多内容没有搞明白,需要深入学习,后面会陆续更新。