模拟 DIR-815 固件。
改造 firmadyne
剥离数据库
firmadyne 默认会创建并使用数据库,用于记录和统计固件信息,然而我们在模拟固件的过程中通常无需这一功能,所以可以修改其代码取消数据库依赖。
修改 firmadyne/scripts/getArch.sh,删除操作数据库的代码
1 | 注释掉下面这句 |
修改 firmadyne/scripts/makeImage.sh
1 | 注意 |
1 |
|
修改 inferNetwork.sh
1 |
|
模拟固件
按照 firmadyne 官方给出的步骤,先尝试对固件进行模拟。
下载 DIR-815 固件,放在 firmadyne 目录下,先对固件解包
1 | python3 ./sources/extractor/extractor.py -np -nk ./DIR815A1_FW104b03.bin |
解包后在 images 目录下能够看到一个压缩包文件,我们把它的名字修改为 1.tar.gz
1 | mv ./images/DIR815A1_FW104b03.bin_34b013a393503d9b9d0734ecd2ee28dd.tar.gz ./images/1.tar.gz |
获取固件架构
1 | ./scripts/getArch.sh ./images/1.tar.gz |
构建镜像
1 | sudo ./scripts/makeImage.sh 1 mipsel |
此时在 scratch/1/ 目录下可以找到构建好的 image.raw 镜像。
模拟网络环境
1 | ./scripts/inferNetwork.sh 1 mipsel |
可以看到 firmadyne 获取到镜像的网卡 br0 的 ip 地址为 192.168.0.1,并且在 ./scratch/1/ 目录下生成了 run.sh 启动脚本,我们执行这个脚本看看能否访问到固件的 web 界面。
1 | ./scratch/1/run.sh |
启动后进入 shell,看一下网卡信息
1 | br0 Link encap:Ethernet HWaddr 00:DE:FA:1A:01:00 |
只有 br0、eth2、lo 三个网卡被启用,且只有 br0 拥有 IP 地址,此时宿主机和虚拟机之间网络是不通的。
(ctrl-a x 退出虚拟机)
配置网络
既然自动配置的网络无法正常使用,我们尝试手动配置。(参考)
创建网桥
1 | ifconfig <你的网卡名称(能上网的那张)> down # 首先关闭宿主机网卡接口 |
创建 TAP 虚拟网卡
1 | tunctl -t tap0 -u root # 创建一个 tap0 接口,只允许 root 用户访问 |
配置无误的话网桥信息应该如下
1 | br0 |
启动命令
将启动命令中网卡部分替换为我们自己配置的信息,得到新的启动命令
1 | qemu-system-mipsel -m 256 -M malta -kernel /home/iot/Tools/firmadyne/binaries/vmlinux.mipsel -drive if=ide,format=raw,file=/home/iot/Tools/firmadyne/scratch/1/image.raw -append "root=/dev/sda1 console=ttyS0 nandsim.parts=64,64,64,64,64,64,64,64,64,64 rdinit=/firmadyne/preInit.sh rw debug ignore_loglevel print-fatal-signals=1 user_debug=31 firmadyne.syscall=0" -nographic -net nic -net tap,ifname=tap0,script=no,downscript=no |
虚拟机启动后在宿主机查看 br0 信息
1 | tap0 (2) |
其中 tap0 的状态应该由 disabled 变成 forwarding。
在虚拟机中 ping 宿主机,发现还是无法连通,尝试启用 eth0 网卡,并赋予和宿主机 br0 相同网段的 IP
1 | ifconfig eth0 up |
配置好之后 ping 宿主机
1 | ping 192.168.37.145 |
至此我们成功解决了网络互通问题,但是在宿主机尝试访问 web 服务时,发现还是无法连接。
配置分析
首先查看默认环境下虚拟机开放的端口
1 | netstat -tnlp |
可以看到 httpd 服务默认监听地址 192.168.0.1:80,然而 192.168.0.1 网段无法访问,所以访问 web 服务失败。
ps 看看 httpd 服务的启动命令
1 | ps | grep 2105 |
发现 httpd 具有一个 httpd.conf 的配置文件,内容如下
1 | Umask 026 |
设备的 web 服务被绑定在 br0 网卡上,我们需要修改配置文件,将 web 服务绑定在 eth0 网卡,监听地址 0.0.0.0:80。
修改 images/1.tar.gz 在根目录下创建一个 fake.conf,内容如下
1 | Umask 026 |
修改后重新制作镜像,并启动虚拟机。
启动后可以在根目录下看到 fake.conf,先 kill 掉 httpd 服务,之后以我们的配置文件重新启动 httpd。
1 | kill 2107 |
启动 httpd 后可看到它被绑定在 0.0.0.0:80
1 | Active Internet connections (only servers) |
此时从宿主机访问 web 服务
至此固件模拟成功。
- 本文作者: Catalpa
- 本文链接: https://wzt.ac.cn/2021/08/15/firmadyne3/
-
版权声明:
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。