【智能设备-从NepCTF2024题目,谈谈关于仿真openwrt二次开发固件的一个通用思路】此文章归类为:智能设备。
背景
OpenWrt 是一个广受欢迎的开源固件项目,许多厂家,如小米、摩托罗拉等,都基于 OpenWrt 开发自己的固件。对于一些特定的应用场景,我们可能需要自行构建 OpenWrt 固件,并通过仿真测试来提升漏洞挖掘的效率与成本控制。这样的仿真可以大大增强对固件的掌控能力,为安全研究提供便利。
面临的问题
目前,常用的仿真工具如 FirmAE 并不支持直接仿真 OpenWrt 固件。同时,采用传统的 QEMU 启动并进行网络桥接的方法,例如我个人开发的 Sevnup,也无法直接仿真 OpenWrt。这是因为 OpenWrt 的启动过程具有特定的初始化特性,无法在系统启动后完成一些重要的初始化操作。详细的启动流程可以参考 OpenWrt系统启动流程分析。
如下图所示,OpenWrt 固件在 QEMU 启动后由于权限问题无法正常运行,妨碍了后续的仿真工作。
以上说明,鉴于 OpenWrt 的独特性,常规的方法目前无法实现对其固件的直接仿真。
回到 NepCTF2024 题目——NepWRT
在加入 Nepnep 团队一周年之际,我有幸参与出题,设计了两道题目,一道关于 VxWorks,另一道关于 OpenWrt。
VxWorks 的题目部分基于目前的研究成果,待相关 CVE 公布后也许会再详细探讨。
这次关于 OpenWrt 的题目颇具新意,至少对我而言,在过往的比赛中并未遇到类似的仿真类题目。在本题中,我将 flag 加密后分散到固件的各个部分,选手需要成功仿真整个固件后才能在根目录下发现 flag,否则只能多重排列组合后破解加密,题目难度因此转化为一项综合挑战。
那么如何实现预期的解答呢?这便是本篇的主题。以下是简化的步骤:
解压固件并提取文件系统。
下载 OpenWrt 官方内核及镜像。Malta 下载链接
解压官方镜像获取文件系统,将目标固件的文件系统使用 rsync -av
更新覆盖至官方镜像的文件系统。
将更新后的文件系统打包为镜像文件,并利用 QEMU 启动该镜像。可以考虑在初始化脚本中设置 root 密码以便直接登录 shell 查看 flag。
这种方法规避了传统 QEMU 仿真中遇到的限制,直接利用 OpenWrt 官方镜像进行初始化,并覆盖关键的配置信息,使固件能够正常启动。
不过,为实现完全的仿真,还需配置网络接口。OpenWrt 的网络接口配置不同于常规的 ifconfig 配置方式,而是通过修改 /etc/config/network
配置文件实现。如下示例是设置本地主机 IP 为 10.10.10.1,OpenWrt 仿真 IP 为 10.10.10.2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | config interface 'loopback'
option device 'lo'
option proto 'static'
option ipaddr '127.0.0.1'
option netmask '255.0.0.0'
config globals 'globals'
option ula_prefix 'fd7d:c944:ab04::/48'
option packet_steering '1'
config device
option name 'br-lan'
option type 'bridge'
list ports 'eth0'
option promisc '1'
config interface 'lan'
option ifname 'eth0'
option proto 'static'
option ipaddr '10.10.10.2'
option netmask '255.255.255.0'
|
在启动 QEMU 时,宿主机器需配置以下网卡设置:
1 2 3 4 5 | sudo tunctl -t tap0 -u $( whoami )
sudo ip addr add 10.10.10.1 /24 dev tap0
sudo ip link set dev tap0 up
ip addr show tap0
cat << 'EOF' | sudo tee /etc/qemu-ifup > /dev/null
|
如此一来,宿主机和仿真环境便可连通。
仿真效果如下:
进入 shell:
赛博大厨:
下面是我自己使用的自动化脚本,接收第一个命令行参数作为固件解压后的文件系统路径,ext_backup
目录是官方 OpenWrt 的文件系统,ext
目录作为副本并更新为目标文件系统内容,打包成 img 文件以供仿真使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | IMG=root.img
echo -e "[o] config ip address for tap0 and http server..."
sudo tunctl -t tap0 -u $( whoami )
sudo ip addr add 10.10.10.1 /24 dev tap0
sudo ip link set dev tap0 up
ip addr show tap0
cat << 'EOF' | sudo tee /etc/qemu-ifup > /dev/null
#!/bin/sh
ip addr show
ip link show
cat /etc/qemu-ifup .bak
EOF
sudo chmod +x /etc/qemu-ifup
if [ -n "$1" ]; then
FOLDER=$1
sudo rm -rf $IMG
sudo rm -rf . /ext
sudo cp -r . /ext_backup/ . /ext
sudo rsync -va $FOLDER/ . /ext/
dd if = /dev/zero of=$IMG bs=1M count=500
mkfs.ext4 $IMG
sudo mkdir /mnt/rootfs
sudo mount -o loop $IMG /mnt/rootfs
sudo chmod 777 . /ext
sudo cp -a . /ext/ * /mnt/rootfs/
sudo umount /mnt/rootfs
sudo rmdir /mnt/rootfs/
fi
echo -e "\033[32m[o]\033[0m Starting QEMU"
sudo qemu-system-mipsel -M malta -s \
-drive file =$IMG, format =raw \
-kernel openwrt-malta- le -vmlinux.elf \
-nographic -append "root=/dev/sda console=ttyS0" -net nic -net tap,ifname=tap0
|
再举一个例子
对于自编译的 OpenWrt 固件,同样可以采用上述方法仿真。例如,下图为一个 Netgear R6260 的 OpenWrt 固件,经按步骤配置打包后成功启动:
能够正常访问:
面临的限制
目前这个方法仅仅支持mipsel,对于其他固件的官方openwrt尚未找到。对于armel的,我按照官方文档的方法,甚至没有成功仿真官方的镜像。也许我认为这是一个有意义的发现,能够为物联网安全测试带来一些新的思想,或许有师傅成功启动过其他架构的官方openwrt吗?
应该是x86也可以,但是arm,mips,armel这些,希望如果都有可能可以的话,欢迎与我交流,我们可以共同做一个开源项目来支持openwrt二次开发仿真。
结论
对于 OpenWrt 固件的二次开发与仿真,我们可以通过使用 OpenWrt 官方镜像并替换文件系统的方式,快速构建一个能够成功启动的仿真环境。这种方法不仅解决了传统 QEMU 方法在 OpenWrt 固件仿真中的初始化问题,同时简化了网络配置的复杂性,确保了各类初始化配置可以顺利执行。
虽然该方法目前主要适用于 MIPS 架构小端的固件仿真,但它为物联网安全测试针对OpenWrt二次开发固件新的解决方案,为漏洞挖掘带来了更多可能性。未来若能在大家的帮助下,通过这个思路支持更多架构的固件,将有助于推动相关安全研究的发展。希望在未来与各位师傅分享经验,共同完善此方法的适用性,推动 IoT 安全研究更进一步。
更多【智能设备-从NepCTF2024题目,谈谈关于仿真openwrt二次开发固件的一个通用思路】相关视频教程:www.yxfzedu.com