# IOT 的环境搭建

目前已有的学习参考文档时 2016 年的《家用路由器 0day 漏洞挖掘技术》》,但是由于时间很久了,各种软件的迭代升级导致书中很多工具的配置不好用。

本文复现华为路由器,原文链接

固件链接,提取码 0000

主链接

参考链接

# binwalk

git clone https://github.com/devttys0/binwalk.git 
sudo apt-get install qemu qemu-system qemu-user-static binfmt-support			//提供一些支持,很重要

工具可以使用 apt-get 安装,但是需要一个插件

sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev

同时还要安装一个 sasquatch

sudo apt-get install build-essential liblzma-dev liblzo2-dev zlib1g-dev
git clone https://github.com/devttys0/sasquatch.git
cd sasquatch
chmod +x build.sh
./build.sh

# qemu 启动 mips 的虚拟机,

我们需要到网站去下载对应 mips 内核

image-20221020202005310

# 搭建 qqmu 虚拟机的网络

_XXXXX.bin.extracted_ 文件夹下创建 init.sh 文件,同时将内核文件放在该路径下

启动脚本

#!/bin/sh 
sudo brctl addbr virbr0
sudo ifconfig virbr0 192.168.1.55/24 up
sudo tunctl -t tap0
sudo ifconfig tap0 192.168.1.56/24 up
sudo brctl addif virbr0 tap0
sudo qemu-system-mips -M malta -kernel vmlinux-2.6.32-5-4kc-malta -hda debian_squeeze_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"  -netdev tap,id=tapnet,ifname=tap0,script=no -device rtl8139,netdev=tapnet -nographic

虚拟机的网络配置为

ifconfig eth0 192.168.1.57/24 up

然后可以 ping 到主机的 top0 的网络地址

image-20221020210029356

# 上传文件到 qemu 内

使用 scp 命令

scp [file] root@[ip]:/root/

file 是我们需要上传的文件,ip 是我们在 qemu 内部配置的 eth0 的 ip,然后这里上传出现的问题是会有一个选择是否继续,这里要手动输入 yes

我们在 qemu 的主目录下就可以找到我们上传的文件,tar -zxcf 进行解压

这里我们需要打包的是 roof 文件系统

tar -czvf root.tar squashfs-root/

以及我们话给虚拟机内部传一个启动脚本 init.sh

#!/bin/sh
ifconfig eth0 192.168.1.57/24 up
mount -o bind /dev ./squashfs-root/dev
mount -t proc /proc ./squashfs-root/proc/
chroot ./squashfs-root/ sh

(由于某些原因,对于这一个路由器的介绍我们仅仅进行到这里,我们没有该路由器的硬件设备,无法启动路由器服务)

# qemu 的退出

我们只能是由强制中断退出,我们在 mips 机子使用退出时,exit 会进入 login 的循环,没法结束,ctrl+a, 然后再按 x

# qemu 搭建 arm 环境

# 1、安装 aarch64 交叉编译工具链

sudo apt-get install gcc-aarch64-linux-gnu

# mips 编译器

书中使用的时 mips-linux-gcc, 但是目前这个工具已经在主流的 ubuntu 不适用了,而是改用 mips-linux-gnu-gcc 进行编译

# firmadnye 踩坑,

没有 magic 模块,

sudo apt-get install python3-magic

安装了三个工具,

firmadyne
firmware-analysis-toolkit
firmware-analysis-plus

后面两个其实也是基于 firmadyne 的,但是因为我搭建环境时使用的时 python3,ubuntu20, 版本稍高,导致前两个工具的环境有问题,在 makeImage.sh 的脚本中,获取压缩包解压后大小的参数是有问题的

TARBALL_SIZE=$(tar ztvf "${TARBALL_DIR}/${IID}.tar.gz" --totals 2>&1 |tail -1|cut -f4 -d' ')
MINIMUM_IMAGE_SIZE=$((TARBALL_SIZE + 10 * 1024 * 1024))
echo "----The size of root filesystem '${TARBALL_DIR}/${IID}.tar.gz' is $TARBALL_SIZE-----"
IMAGE_SIZE=8388608
while [ $IMAGE_SIZE -le $MINIMUM_IMAGE_SIZE ]

解压的最后一行数据时这样的,

dreamcat@ubuntu:~/firmadyne/images$ tar ztvf 1.tar.gz --totals 2>&1 |tail -1
总计读取字节数: 16875520 (17MiB, 208MiB/s)

如果按照原来的 f4 参数

那么获取到的就是解压缩的速度,而不是大小,

dreamcat@ubuntu:~/firmadyne/images$ tar ztvf 1.tar.gz --totals 2>&1 |tail -1|cut -f4 -d' '
100MiB/s)

所以我们把这个改 f2

dreamcat@ubuntu:~/firmadyne/images$ tar ztvf 1.tar.gz --totals 2>&1 |tail -1|cut -f2 -d' '
16875520

firmware-analysis-toolkit 目录下的项目也有同样的问题,

后两个工具使用的都是自己目录下独立的 firmadyne .

总的来说,firmware-analysis-plus 下载最方便,也没有上述的问题。

# 使用方法

#firmware-analysis-plus:
python fap.py -q ./qemu-builds/2.5.0/ /home/dreamcat/Desktop/IOT_learn/cve_2019_17621/DIR822A1_FW103WWb03.bin
#firmware-analysis-toolkit:
python fat.py [file]
#firmadyne: 这个比较繁琐
sudo python3 ./sources/extractor/extractor.py -b DLink -sql 127.0.0.1 -np -nk ./DIR822A1_FW103WWb03.bin images/	#提取固件
./scripts/getArch.sh ./images/1.tar.gz 	#分析文件包
sudo python ./scripts/tar2db.py -i 1 -f ./images/1.tar.gz 	#导入数据库
sudo ./scripts/makeImage.sh 1 mipseb	#制作镜像
sudo ./scripts/inferNetwork.sh 1 mipseb		#判断网络结构
sudo ./scratch/1/run.sh		#最终运行

# 文件系统提取

在线提取文件系统工具:https://zhiwanyuzhou.com/multiple_analyse/firmware/