点击蓝字 关注我们
物联网安全之QEMU固件仿真
一
QEMU介绍
QEMU是⼀款开源的机器仿真工具和虚拟化工具。仿真指在⼀个系统上模仿另⼀个系统,例如在linux设备上运行windows程序。虚拟化是⼀种软件程序,将物理系统划分为多个组件,让这些组件独立工作,实现将一个单一的系统分成几个虚拟机。
在IoT漏洞挖掘时,由于我们分析和开发平台⼀般多使用x86架构,IoT设备使用的往往不是x86架构,为了运行IoT设备固件中程序分析安全问题,就需要QEMU帮助模拟运行。例如在x86的PC上模拟MIPS的路由器固件。
二
QEMU安装
APT安装。
sudo apt-get install qemu (系统态)
sudo apt-get install qemu-user-static (⽤户态)
编译安装。
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build -y
sudo apt-get install git-email -y
sudo apt-get install libaio-dev libbluetooth-dev libcapstone-dev libbrlapi-dev libbz2-dev -y
sudo apt-get install libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev -y
sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev -y
sudo apt-get install librbd-dev librdmacm-dev -y
sudo apt-get install libsasl2-dev libsdl2-dev libseccomp-dev libsnappy-dev libssh-dev -y
sudo apt-get install libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev -y
sudo apt-get install valgrind xfslibs-dev -y
sudo apt-get install libnfs-dev libiscsi-dev -y
git clone https://github.com/qemu/qemu.git
cd qemu/
mkdir -p bin/debug/native
cd bin/debug/native
apt install flex -y
apt install bison -y
../../../configure --enable-debug
make
三
QEMU两种模式
1. QEMU用户模式(User Mode):可以模拟运行不同平台编译的固件程序,针对单独二进制文件。
用户模式模拟运行MIPS程序:
1)通过file命令分析⼆进制⽂件goahead的架构信息是32位 LSB MIPS,因此要选择小端模拟程序qemu-mipsel-static进行仿真;
2)需要将qemu-mipsel-static程序拷贝到执行目录;
3)由于程序goahead采用动态编译,执行时需要动态链接库,因此需要使用chroot命令修改执行根目录,设置固件文件系统中的目录为执行根目录并运行程序goahead;
4)浏览器访问http://127.0.0.1,看到goahead成功启动。
2. QEMU系统模式:使用系统模式时会在当前机器上模拟⼀个包括CPU等外围设备的虚拟机,用户需要提供内核和磁盘镜像,还可以进行网络配置,可配置性更高。这种模式下可以对整个固件进行模拟仿真。
a. 系统模式创建MIPS虚拟机:
sudo qemu-system-mipsel -M malta -kernel ./vmlinux-3.2.0-4-4kc-malta -hda
./debian_wheezy_mipsel_standard.qcow2 -append "root=/dev/sda1 console=tty0" -net nic -net
user,hostfwd=tcp::8080-:80,hostfwd=tcp::2222-:22 -nographic
1)参数分析:
-M malta
选择目标硬件平台。
-kernel ./vmlinux-3.2.0-4-4kc-malta
指定内核镜像。
-hda ./debian_wheezy_mipsel_standard.qcow
指定磁盘镜像。
-append "root=/dev/sda1 console=tty0"
配置内核启动参数。
-net nic -net user,hostfwd=tcp::8080-:80,hostfwd=tcp::2222-:22
qemu网络由虚拟机的虚拟网卡和与虚拟网卡交互的网络后端组成。-net nic 在虚拟机中创建⼀张虚拟网卡,-netuser 后端使用用户协议栈方式。“hostfwd”将客户机的端口映射到宿主机,前面的是宿主机端口号,后面的是客户机端口号;由于需要scp和web服务,因此要映射两组。
-nographic
禁用图形输出,重定向串行I/O到控制台。
2)挂载dev和proc。
mount -o bind /dev/ ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc/
3)通过scp将固件拷贝进mipsel虚拟机,修改程序执行根目录。
chroot ./squashfs-root/ sh
4)启动程序 goahead。
b. 系统模式创建AARCH64虚拟机
./qemu/bin/debug/native/qemu-system-aarch64 -machine virt -cpu cortex-a53 -nographic -m 2048
-kernel Image -append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8" -drive
if=none,file=rootfs.ext4,id=hd0 -device virtio-blk-device,drive=hd0 -net nic -net
tap,ifname=tap0,script=no,downscript=no
1)参数分析:
-machine virt
选择目标硬件平台,不同的qemu仿真程序支持的硬件平台不同。
-cpu cortex-a53
选择cpu。
-m 2048
指定虚拟机内部的内存大小。
-kernel Image
指定内核文件。
-append "noinitrd root=/dev/vda rw console=ttyAMA0 loglevel=8"
传递给内核的参数。
-drive if=none,file=rootfs.ext4,id=hd0
指定文件系统磁盘镜像。
-device virtio-blk-device,drive=hd0
指定guest上总线挂载的外部设备
-net nic -net tap,ifname=tap0,script=no,downscript=no
网络配置,与MIPS虚拟机的user模式不同,此处选择tap模式。
虚拟机成功启动:
TAP模式配置网络
由于qemu版本的原因,不支持用户协议栈模式,选择使用使用TAP模式。TAP模式中会在宿主机上建立一个虚拟网卡tap0,虚拟机通过这块网卡和外部进行通信。
1)主机操作:开启IP转发,实现宿主机上网卡间流量转发。
echo 1 > /proc/sys/net/ipv4/ip_forward
2)虚拟机操作:启动Qemu,配置ip。
ifconfig eth0 172.16.14.250
3)主机操作:配置主机tap0网卡,需要和宿主机ip在同一网段。
ifconfig tap0 172.16.14.251
4)主机操作:添加正确的静态路由
5)主机操作:配置iptables打开NAT功能。
虚拟机是通过借助宿主机访问外部的,配置iptables规则对来自 172.16.14.0/24且从 eth0出去的包,要进行NAT,同时会对返回的包进行NAT。
sudo iptables -t nat -A POSTROUTING -s 172.16.14.0/24 -o eth0 -j MASQUERADE
设置之后使用iptables-persistent 保存 iptables:
sudo apt install iptables-persistent
sudo netfilter-persistent save
6)虚拟机操作:添加正确的静态路由。
四
总结
固件仿真是固件安全分析重要的一环,在缺少设备或调试功能不可得的情况下,缺少固件仿真能力会使得漏洞分析流程无法进行。现有一些自动化固件仿真工具,省去了固件解包、架构信息识别、修复设备文件、配置网络等过程,但本质上还是QEMU工具的使用。考虑到物联网设备愈发灵活且复杂的情况下,自动化仿真工具不再是⼀种百发百中的解决方案,这时候就需要我们熟悉QEMU工具,做出灵活调整。
往期精彩合集
●新版安卓ARM64 修改TracerPid 反调试bypass
长
按
关
注
联想GIC全球安全实验室(中国)
原文始发于微信公众号(联想全球安全实验室):物联网安全之QEMU固件仿真
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论