totolink
totolink路由器环境搭建
固件提取
固件型号:NR1800X
固件下载地址:https://www.totolink.net/home/menu/detail/menu_listtpl/download/id/225/ids/36.html
下载得固件为 TOTOLINK_C834FR-1C_NR1800X_IP04469_MT7621A_SPI_16M256M_V9.1.0u.6279_B20210910_ALL.web,体积约 8MB。使用 binwalk 提取文件:
其中squashfs-root目录下为文件系统,如果binwalk无法正常解压出文件系统,可以看
https://www.cnblogs.com/brain-Z/p/17980446
由busybox提供工具的,直接看busybox文件类型,32为mips,小端序
路由器搭建过程
镜像选择
Debian 官网有提供针对 qemu 的 mipsel 架构的 Debian Linux 系统的内核、虚拟磁盘镜像下载,并提供 Debian6(squeeze)、Debian7(wheezy)两个版本:
readme.txt:
下载 32 位小端序的 mipsel 架构镜像(linux 中可直接通过 wget 下载),选择 Debian7 镜像,则下载内核镜像 debian_wheezy_mipsel_standard.qcow2 及虚拟磁盘镜像 vmlinux-3.2.0-4-4kc-malta。
通信方式
外主机和qemu虚拟机通信方式:
外主机:
# 安装 brctl 网桥配置工具
sudo apt-get install bridge-utils
# 安装 tunctl 虚拟网卡配置工具
sudo apt-get install uml-utilities
# 添加一个网桥 br0
sudo brctl addbr br0
# 设置网桥 br0 的网段及掩码,并启用网桥
sudo ifconfig br0 192.168.5.1/24 up
# 新建一张虚拟网卡 tap0
sudo tunctl -t tap0
# 设置虚拟网卡 tap0 的 ip 地址及掩码,并启用该虚拟网卡
sudo ifconfig tap0 192.168.5.11/24 up
# 将虚拟网卡 tap0 添加到网桥 br0 中
sudo brctl addif br0 tap0
qemu虚拟机:
ifconfig eth0 192.168.5.12 up
ping 192.168.5.1
启动逻辑
在qemu-system模式下
system 模拟方式会模拟出一整个包括 cpu、周边设备的目标系统,类似 VMWare 等。为此我们需要准备一些材料:
- 内核镜像(必须)
- -kernel vmlinux-3.2.0-4-4kc-malta - 指明内核镜像
- 虚拟磁盘镜像(必须)
- -hda debian_wheezy_mipsel_standard.qcow2 - 指明虚拟磁盘镜像
- 网卡(非必须)
- -netdev tap,id=tapnet,ifname=tap0,script=no - 配置一个主机侧的 TAP 网络设备,命名为 tapnet,使用主机的 tap0 网卡
- -device rtl8139,netdev=tapnet - 使用 rtl8139 型号网卡,对应的设备为前面创建的 tapnet 设备
- 如果我们需要模拟出来的 guest 系统具有网络能力,则需要为其添加网卡
在qemu-system成功模拟目标debian系统后,在目标debian系统里用qemu-user模式的qemu-mipsel-static启动对应的lighttpd服务
system模式启动命令:
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" \
-netdev tap,id=tapnet,ifname=tap0,script=no \
-device rtl8139,netdev=tapnet \
-nographic
-no-reboot
对应的解释:
* qemu-system-mipsel
- 已安装到系统的 mipsel 架构的 system 模拟方式的 qemu 程序
* -M malta
- 使用 malta 开发板进行仿真模拟
* -kernel vmlinux-3.2.0-4-4kc-malta
- 指明内核镜像
* -hda debian_wheezy_mipsel_standard.qcow2
- 指明虚拟磁盘镜像
* -append "root=/dev/sda1 console=tty0"
- 指明根文件系统所在设备,以及控制台信息
* -netdev tap,id=tapnet,ifname=tap0,script=no
- 配置一个主机侧的 TAP 网络设备,命名为 tapnet,使用主机的 tap0 网卡
* -device rtl8139,netdev=tapnet
- 使用 rtl8139 型号网卡,对应的设备为前面创建的 tapnet 设备
* -nographic
- 非图形界面
-no-reboot
-exit instead of rebooting 默认qemu虚拟机里关机后,又会再次重启,加上该指令关机后直接退出qemu,关机指令:shotdown -h now
访问传输
外主机远程访问qemu虚拟机
ssh root@192.168.5.12
外主机向qemu虚拟机上传固件的文件系统
scp -r squashfs-root root@192.168.5.12:/root/
启动服务
在qemu虚拟机内输入
chroot ./squashfs-root/ /bin/sh #注意此时chroot会临时修改当前根目录,如果固件文件系统的/lib等库未成功拷贝过来,会导致固件文件系统无法启动/bin/sh,显示找不到该文件
mkdir /var/run
touch /var/run/lighttpd.pid
/usr/sbin/lighttpd -f /lighttp/lighttpd.conf
路由器文件分析
user模式启动需求:
直接运行lighttpd发现需要-f指定config文件
lmy@ubuntu:~/Desktop/iot/extracted/squashfs-root$ sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd
2024-01-22 14:35:29: (server.c.548) No configuration available. Try using -f option.
加上-f指定为文件系统下./lighttp/lighttpd.conf后,显示需要在/var/run里生成pid文件
lmy@ubuntu:~/Desktop/iot/extracted/squashfs-root$ sudo chroot . ./qemu-mipsel-static ./usr/sbin/lighttpd -f ./lighttp/lighttpd.conf
2024-01-22 16:21:24: (server.c.624) opening pid-file failed: /var/run/lighttpd.pid No such file or directory
于是
mkdir ./var/run
touch ./var/run/lighttpd.pid
然后即可在user模式启动lighttpd
交互主逻辑:
看请求应该是 cgi 后台,在固件中 www 目录中找到 cgi 程序
后续继续复现中