路由器固件漏洞分析
环境搭建
固件提取
UBI
ubireader_extract_images
squashfs 的魔数为:68 73 71 73 (小端序:0x73717368)12
unblob
unblob 是更现代的固件提取工具。
安装:3
sudo apt install unblob安装其依赖的外部提取工具:3
sudo apt install android-sdk-libsparse-utils e2fsprogs p7zip-full\ unar zlib1g-dev liblzo2-dev lzop lziprecover libhyperscan-dev zstd lz4 sasquatch使用该命令验证所有依赖是否满足:3
unblob --show-external-dependencies提取固件:3
unblob <xxx.bin>binwalk
binwalkkali (binwalk2) 或
binwalk3kali
查看:
binwalk3 xxx.bin提取:
binwalk3 -Me xxx.bin得到 squashfs
仿真
用户态仿真
由于路由器往往使用 MIPS 或 ARM 架构,直接 chroot 会出现问题。
安装 qemu-user 包后可以直接 chroot
sudo apt install qemu-usersudo chroot ./ ./bin/sh挂载前检查一下 ./bin/sh 有没有执行权限位
全系统仿真
全系统仿真无需手动挂载文件系统。
FirmAE
FirmAE 本质是 QEMU 全系统仿真,但是替我们做了很多工作。
更换静态 busybox(FirmAE 会用系统的静态 busybox 替换进仿真环境)
sudo apt install busybox-staticgit clone --recursive https://github.com/pr0v3rbs/FirmAE.gitcd FirmAEsudo ./download.shsudo ./install.sh安装时可能遇到:Error: Package 'uml-utilities' has no installation candidate,是因为 uml-utilities 包已经被移出 Kali 仓库,
需要另行手动安装该包,否则后面网络模拟会卡住:(FirmAE 用到该包的 tunctl)
# 安装从 Debian 仓库拉取 deb 包后手动安装
# 验证apt list --installed | grep umlsudo ./init.sh检查:
sudo ./run.sh -c <名字> <固件文件># 检查过程中日志在 ./scratch/1 下,模拟仿真性能损耗大,时间会比较长如果检查通过,则可以运行仿真:
sudo ./run.sh -r <名字> <固件文件>每次运行后都会挂载 loop 设备,会导致后续重新仿真失败,需要清除之前的挂载:
lsblksudo umount <挂载点>sudo losetup -d <设备>FAT
FAT 是另一个 IoT 仿真工具。
qemu-system
手动 qemu 整机模拟,比较复杂,需要处理很多工作。
NVRAM
Web 服务通常会读写 /proc/nvram 或 /dev/nvram,如果没有挂载或对应文件不存在,会导致无法正常启动 Web 服务。
mount -t proc proc /procmount -t ramfs ramfs /var/etc/init.d/S19init.sh/etc/init.d/S20init.shFirmAE 会替我们处理好 NVRAM,但是用户态仿真需要手动处理。
其他常见方式:
touch /proc/nvram
漏洞挖掘
Web Server
CGI
CGI (Common Gateway Interface) 是一种能让 Web 服务器执行外部程序来处理 HTTP(S) 请求的接口标准。4
在路由器的漏洞挖掘中,我们经常会看到 CGI 关键词
逆向工程

内存映射

F5 反汇编

使用 IDA 打开后会生成如下文件:
.id0主数据库文件.id1数据库文件.id2数据库文件.nam命名列表.til类型信息库

导入后左侧的 sub_xxx 函数是因为 IDA 没有识别到原来的名字

所有紫色背景的函数均为 .extern 动态链接的。

加粗代表该函数有函数原型,例如标准库的 sprintf, snprintf

按下 X 查看所有 Xref (Cross Reference 交叉引用):
- Xrefs To -> 谁引用了我
- Xrefs From -> 我引用了谁
汇编
由于逆向工程通常使用 Intel 语法,这里统一使用 Intel 语法。
这里只列举 IoT 常见的架构

