精选文章|0成本搭建摄像头漏洞挖掘环境

IoT 2年前 (2021) admin
1,242 0 0

点击蓝字 · 关注我们



0成本搭建摄像头漏洞挖掘环境

环境说明:
Ubuntu 18.04+QEMU

网络配置:宿主机物理ens18网卡:x.x.x.x/24,虚拟网卡tap0:192.168.0.2/24


预备知识


嵌入式linux开机引导程序U-boot

  U-Boot 是一个主要用于嵌入式系统的BootLoader程序,可以支持ARM、RSIC-V、MIPS、x86等多种不同的计算机系统结构。目前常见的摄像头硬件使用的cpu大都是ARM架构,采用uboot方式引导,大致流程是:设备上电 -> uboot代码自动执行 -> 加载uImage内核文件 -> 将执行权限交给内核启动。由于它是一套在GNU通用公共许可证之下发布的自由软件,因此我们可直接从官方下载源码进行交叉编译后对其进行仿真模拟运行。


设备树(DTB)

  设备树(Device Tree binary file),是在系统启动的时候由BootLoader程序将保存在flash或其他地方中的DTB copy到内存中用来描述一棵电路板上CPU、总线、设备组成的树信息,然后内核可以识别这棵树, 并根据它展开出Linux内核中的各种设备。它是由一种ASCII 文本格式的Device Tree描述文件.dts文件,通过DTC(Device Tree Compiler)编译而成,变成适合机器处理的Device Tree Blob。

Linux内核常见格

1.vmlinux:编译出来后未压缩最原始的内核文件。

2.Image:通用Linux内核二进制映像文件。原则上Image就可以直接被烧录到Flash上进行启动执行(类似于u-boot.bin),但搞嵌入式的还是嫌它大了。

3.zImage:自解压的Linux内核映像的压缩版本。是vmlinux经过objcopy gzip压缩后的文件, objcopy实现由vmlinux的elf文件拷贝成纯二进制数据文件,zImage自带了解压缩程序,所以zImage由vmlinux objcopy出来的纯二进制文件以及解压缩程序组成。

uImage:U-boot专用的映像文件,它是在4.zImage之前加上一个长度为0x40的TAG。


vexpress虚拟开发版

资源:

CPU:ARM-Versatile Express ARMv7 Processor
SD卡:mmci-pl18x clcd-pl11x ARM® AMBA® PrimeCell Multimedia Card
网卡:smsc911x phy:libphy
实时时钟:rtc-pl031 (qemu能显示正确时间)
串口:AMBA PL011 UART driver
看门狗:
GPIO:
LCD:pl111 clcd-pl11x
中断:gic

软件准备


源码包下载:
uboot
linux
busybox


创建单独的vexpress目录, 下载uboot, linux和busybox源码并解压,创建镜像文件目录image

ubuntu@ubuntu-virtual-machine:~/vexpress$ ls
busybox busybox-1.31.1.tar.bz2 image linux linux-3.18.30.tar.gz
u-boot u-boot-2019.07.tar.bz2


Ubuntu 软件安装:

安装交叉编译工具:sudo apt install gcc-arm-linux-gnueabi
依赖库和软件包安装:sudo apt-get install zlib1g-dev libglib2.0-0 libglib2.0-dev libtool libsdl1.2-dev autoconf flex bison ncurses-dev u-boot-tools


一、安装Qemu

使用 apt-get 安装

sudo apt-get install qemu
sudo apt-get install qemu-system
sudo apt-get install qemu-user-static

Qemu网络功能设置


配置TUN/TAP虚拟网络

  sudo apt-get install bridge-utils uml-utilities // 虚拟网桥工具,brctl命令会用到;UML(User-mode linux)工具,tunctl命令会用到

检查是否有/dev/net/tun 设备文件,没有则自行配置安装。

ubuntu@ubuntu-virtual-machine:~$sudo tunctl -t tap0 -u ubuntu // 创建虚拟网卡并给用户赋予权限
// 配置网桥和虚拟网卡ip
ubuntu@ubuntu-virtual-machine:~$sudo ifconfig tap0 192.168.0.2 netmask 255.255.255.0
// 查看配置后的信息
ubuntu@ubuntu-virtual-machine:~$ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether fe:fc:fe:48:ad:1a brd ff:ff:ff:ff:ff:ff
inet x.x.x.x/24 brd x.x.x.255 scope global noprefixroute ens18
valid_lft forever preferred_lft forever
inet6 fe80::4963:be01:4b2f:abfb/64 scope link noprefixroute
valid_lft forever preferred_lft forever
3: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
link/ether 2e:d3:aa:eb:eb:57 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.2/24 brd 192.168.0.255 scope global tap0
valid_lft forever preferred_lft forever
inet6 fe80::2cd3:aaff:feeb:eb57/64 scope link
valid_lft forever preferred_lft forever
//测试网络连通性
ubuntu@ubuntu-virtual-machine:~$ping -c 3 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.049 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.042 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.062 ms

--- 192.168.0.2 ping statistics ---

二、搭建并运行一个uboot+linux+busybox的ARM仿真环境

思路:

  我们先通过自己模拟各种嵌入式系统必须的模块,最终模拟一个能联网运行的ARM环境,明白启动过程、系统初始化与文件系统挂载等等流程。

1、交叉编译uboot

ubuntu@ubuntu-virtual-machine:~/vexpress/uboot$export ARCH=arm
ubuntu@ubuntu-virtual-machine:~/vexpress/uboot$export CROSS_COMPILE=arm-linux-gnueabi-
ubuntu@ubuntu-virtual-machine:~/vexpress/uboot$make vexpress_ca9x4_defconfig // 可以在 configs 目录下选择对应的单板默认配置
ubuntu@ubuntu-virtual-machine:~/vexpress/uboot$make -j$(nproc)
ubuntu@ubuntu-virtual-machine:~/vexpress/uboot$cp u-boot ../image/
# 测试uboot的网络功能
ubuntu@ubuntu-virtual-machine:~/vexpress/uboot$qemu-system-arm -M vexpress-a9 -m 512 -nographic -net nic -net tap,ifname=tap0,script=no -kernel u-boot
pulseaudio: set_sink_input_volume() failed
pulseaudio: Reason: Invalid argument
pulseaudio: set_sink_input_mute() failed
pulseaudio: Reason: Invalid argument

U-Boot 2019.07 (Nov 12 2020 - 16:56:44 +0800)

DRAM: 512 MiB
WARNING: Caches not enabled
Flash: 128 MiB
MMC: MMC: 0
*** Warning - bad CRC, using default environment

In: serial
Out: serial
Err: serial
Net: smc911x-0
Hit any key to stop autoboot: 0
=> setenv ipaddr 192.168.0.3
=> ping 192.168.0.2
smc911x: MAC 52:54:00:12:34:56
smc911x: detected LAN9118 controller
smc911x: phy initialized
smc911x: MAC 52:54:00:12:34:56
Using smc911x-0 device
smc911x: MAC 52:54:00:12:34:56
host 192.168.0.2 is alive #这里alive结果表示虚拟主板中uboot和宿主机器可通讯
=>

2、交叉编译linux内核

ubuntu@ubuntu-virtual-machine:~/vexpress/linux$export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make -j$(nproc)
make modules -j$(nproc)
make uImage LOADADDR=0x60000000
make dtbs
cp -f arch/arm/boot/uImage ../image/
cp -f arch/arm/boot/zImage ../image/
cp -f arch/arm/boot/dts/vexpress-v2p-ca9.dtb ../image/device.dtb

3、交叉编译busybox并制作根文件系统

创建脚本并执行:

ubuntu@ubuntu-virtual-machine:~/vexpress/busybox$ cat mkbusybox.sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- install
# 将编译好的busybox和一些动态链接库复制到一个ext3文件系统中,制作rootfs
dd if=/dev/zero of=sdcard.ext3 bs=1M count=32
mkfs.ext3 sdcard.ext3
sudo rm -fr rootfs;
mkdir rootfs
sudo mount -t ext3 -o loop sdcard.ext3 rootfs/
cd rootfs;
sudo mkdir lib proc sys dev etc etc/init.d
sudo cp -r ../_install/* .
sudo cp -P /usr/arm-linux-gnueabi/lib/* lib/

sudo cp ../examples/bootfloppy/etc/inittab etc/
sudo touch etc/init.d/rcS ;
sudo chmod 0777 etc/init.d/rcS;
sudo echo "#!/bin/sh" >> etc/init.d/rcS
sudo echo "mount -t proc none /proc" >> etc/init.d/rcS
sudo echo "mount -t sysfs none /sys" >> etc/init.d/rcS
sudo echo "mount -t tmpfs none /dev" >> etc/init.d/rcS
sudo echo "/sbin/mdev -s" >> etc/init.d/rcS
sudo chmod 0755 etc/init.d/rcS;

cd ..;
sudo umount rootfs/
cp sdcard.ext3 ../image/


4、搭建tftp服务器(供uboot下载内核启动)

ubuntu@ubuntu-virtual-machine:~/vexpress/$sudo apt-get install tftp-hpa tftpd-hpa
ubuntu@ubuntu-virtual-machine:~/vexpress/$cat /etc/default/tftpd-hpa #修改配置文件
# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/ubuntu/vexpress/image"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure"
ubuntu@ubuntu-virtual-machine:~/vexpress/$sudo service tftpd-hpa restart

5、运行uboot+linux+busybox文件系统的ARM环境

  使用虚拟网卡tap0、引导程序u-boot、内核镜像uImage和根文件系统sdcard.ext3这些自建的零件启动一个带网络的ARM仿真环境

ubuntu@ubuntu-virtual-machine:~/vexpress/image/$qemu-system-arm -M vexpress-a9 -m 512 -nographic -net nic -net tap,ifname=tap0,script=no -kernel u-boot -sd sdcard.ext3
#......
=>setenv ipaddr 192.168.0.3 #这里只是设置uboot的临时ip
=>setenv serverip 192.168.0.2 #设置tftp服务器地址
=>tftp 0x60000000 uImage #从tftp服务器上下载内核镜像,加载到0x60000000地址处
=>tftp 0x70000000 device.dtb #从tftp服务器上下载设备树,加载到0x70000000地址处
=>setenv bootargs "console=ttyAMA0 root=/dev/mmcblk0 init=/linuxrc rw rootwait" #设置启动参数,指定系统初始化程序以及根文件在哪块分区位置等
=>bootm 0x60000000 - 0x70000000 #从0x60000000启动内核(注意-号两边有空格)
#...自动加载启动内核并挂载根文件系统和执行rcS初始化脚本...
/ # ls
bin lost+found sys
dev lib proc usr
etc linuxrc sbin
/ # ifconfig eth0 192.168.0.4 #这里设置的是虚拟环境的ip,可与宿主机的tap0网卡192.168.0.2通讯
使用zImage内核文件不依赖uboot直接启动:


ubuntu@ubuntu-virtual-machine:~/vexpress/image/$qemu-system-arm -M vexpress-a9 -m 512 -sd sdcard.ext3 -nographic -net nic -net tap,ifname=tap0,script=no -kernel zImage -dtb device.dtb -append "console=ttyAMA0 rootwait rw root=/dev/mmcblk0 init=/linuxrc"
退出仿真环境:


先按Ctrl+A,然后按x键即可退出qemu仿真环境

三、分析摄像头升级固件并根据固件模拟摄像头环境

  思路:通过分析摄像头固件,得到其中的文件,解压出其中的文件后分析启动过程,将如何初始化、修改了哪些文件等等操作都记录下来,然后把提取出来的文件放到自己制作的一个文件系统中,用我们自己的ARM仿真环境去挂载这个根据固件制作出来的文件系统,对此摄像头环境进行仿真模拟。

1、使用binwalk分析提取固件

精选文章|0成本搭建摄像头漏洞挖掘环境
ubuntu@ubuntu-virtual-machine:~/ipc/$binwalk -Me _IPC-HFW1XXX-Alps_Chn_PN_V2.622.0000000.31.R.171229.bin
ubuntu@ubuntu-virtual-machine:~/ipc/_IPC-HX1XXX-Mao-Eris_Chn_PN_V2.680.0000000.3.R.191216.bin.extracted$ls
84.zip boot.bin.img Install _kernel.img.extracted partition-x.cramfs.img romfs-x.squashfs.img sign.img web-x.squashfs.img
check.img _boot.bin.img.extracted kernel.img pd-x.squashfs.img romfs-x.squashfs _romfs-x.squashfs.img.extracted


2、分析各个镜像中文件

  通过简单推理与分析得出:

web-x.squashfs.img中保存的是web文件系统

romfs-x.squashfs.img中保存的是根文件系统

kernel.img中保存的是内核镜像

我们将其解压,进入到根文件系统中,查看一下_romfs-x.squashfs.img.extracted/squashfs-root/etc/init.d/rcS文件,分析是如何启动初始化的:

#! /bin/sh

if [ -f /proc/xxxxx/fsmountcmd ]; then
echo #! /bin/sh > /var/script
cat /proc/xxxxx/fsmountcmd >> /var/script
chmod 777 /var/script
/var/script
rm /var/script
else
mount /dev/mtdblock3 /mnt/custom/
mount /dev/mtdblock4 /mnt/pd/
mount /dev/mtdblock6 /mnt/web/
mount /dev/mtdblock8 /usr/
mnt_jffs2 /dev/mtdblock9 /mnt/syslog jffs2
mnt_jffs2 /dev/mtdblock10 /mnt/mtd jffs2
mnt_jffs2 /dev/mtdblock11 /mnt/backup jffs2
fi
... ...
/sbin/telnetd &
/usr/etc/imod


3、使用提取出的文件制作文件系统

  根据初始化脚本,大概推测出哪个img挂载到了哪个目录,我们可以直接创建一个根文件系统,并按照对应关系创建相应目录,然后把对应镜像解压复制到对应目录即可

dd if=/dev/zero of=carmfs.ext3 bs=1M count=512
mkfs.ext3 carmfs.ext3
mkdir rootfs
sudo mount -t ext3 -o loop carmfs.ext3 rootfs/
cp -r _romfs-x.squashfs.img.extracted/squashfs-root/ rootfs
cd rootfs
mv squashfs-root/* ../
rm -r squashfs-root/
cd ..
sudo umount rootfs
cp carmfs.ext3 ~/vexprexx/image/


4、使用u-boot的tftp下载uImage并挂载摄像头文件系统方式启动仿真环境


ubuntu@ubuntu-virtual-machine:~/vexpress/image/$qemu-system-arm -M vexpress-a9 -m 512 -nographic -net nic -net tap,ifname=tap0,script=no -kernel u-boot -sd carmfs.ext3
#......
=>setenv ipaddr 192.168.0.3 #这里只是设置uboot的临时ip
=>setenv serverip 192.168.0.2 #设置tftp服务器地址
=>tftp 0x60000000 uImage #从tftp服务器上下载内核镜像,加载到0x60000000地址处
=>tftp 0x70000000 device.dtb #从tftp服务器上下载设备树,加载到0x70000000地址处
=>setenv bootargs "console=ttyAMA0 root=/dev/mmcblk0 init=/linuxrc rw rootwait" #设置启动参数,指定系统初始化程序以及根文件在哪块分区位置等
=>bootm 0x60000000 - 0x70000000 #从0x60000000启动内核(注意-号两边有空格)
#...自动加载启动内核并挂载根文件系统和执行rcS初始化脚本,启动各种服务...



至此,如果一切正常,我们就根据摄像头固件模拟得到一个摄像头环境。


四、实战分析几种固件

如需阅读全文

请访问

www.iotsec.zone

精选文章|0成本搭建摄像头漏洞挖掘环境
精选文章|0成本搭建摄像头漏洞挖掘环境


原文始发于微信公众号(IOTsec Zone):精选文章|0成本搭建摄像头漏洞挖掘环境

版权声明:admin 发表于 2021年11月22日 上午8:53。
转载请注明:精选文章|0成本搭建摄像头漏洞挖掘环境 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...