1. 固件提取与文件系统解析
任务说明
本案例以典型家用路由器固件(TP-Link TL-WR841N)为例,完成从固件镜像中提取文件系统、定位关键二进制文件与配置的完整流程。最终目标是获得可浏览的根文件系统目录结构,并识别出Web服务程序、系统初始化脚本及明文配置文件。
环境准备
所需工具均为开源软件,建议在Linux环境(Ubuntu 22.04+)下操作:
binwalk:固件结构分析与文件提取sasquatch:非标准SquashFS文件系统解包工具(针对路由器固件定制)file、strings:文件类型识别与字符串提取
安装命令:
sudo apt update && sudo apt install -y binwalk
# sasquatch需从源码编译,依赖zlib、lzma库
git clone https://github.com/devttys0/sasquatch.git
cd sasquatch && sudo ./build.sh
固件获取与结构分析
下载TL-WR841N V14固件(约4MB):
wget https://static.tp-link.com/resources/software/TL-WR841N_V14_150429.zip
unzip TL-WR841N_V14_150429.zip
# 解压后得到 .bin 文件,例如 wr841nv14_en_3_16_9_up_boot(150429).bin
使用binwalk扫描固件内部结构:
binwalk wr841nv14_en_3_16_9_up_boot\(150429\).bin
预期输出应显示:固件头部(uImage)、LZMA压缩内核、以及位于偏移量约0x135000处的SquashFS文件系统。若binwalk未能识别文件系统,可尝试binwalk -A或binwalk -I(忽略熵检测)重新扫描。
文件系统提取
使用binwalk的-e参数自动提取所有识别到的内容:
binwalk -e wr841nv14_en_3_16_9_up_boot\(150429\).bin
提取完成后,进入输出目录并检查SquashFS解包结果:
cd _wr841nv14_en_3_16_9_up_boot\(150429\).bin.extracted/
ls -la
file *.squashfs # 确认文件系统类型
若binwalk自动解包失败(SquashFS为非标准格式),使用sasquatch手动解包:
sasquatch <squashfs文件> -o ./squashfs-root
成功解包后,squashfs-root目录即为完整的根文件系统。
关键文件识别
以下命令在解包后的根目录中执行,用于定位核心组件:
# 1. 查看目录结构
ls -la squashfs-root/
ls -la squashfs-root/etc/
ls -la squashfs-root/usr/bin/
# 2. 定位Web服务程序(路由器管理界面)
find squashfs-root/ -name "*httpd*" -o -name "*uhttpd*" 2>/dev/null
# 3. 查找系统初始化脚本
ls -la squashfs-root/etc/init.d/
cat squashfs-root/etc/init.d/rcS # 查看启动入口
# 4. 识别关键配置文件
find squashfs-root/etc/ -name "*.conf" -o -name "*.cfg" -o -name "passwd" 2>/dev/null
cat squashfs-root/etc/passwd # 查看用户账户(通常含root密码哈希)
典型输出示例(基于该固件版本):
- Web服务程序位于
/usr/bin/httpd,为GoAhead Web服务器 - 启动脚本
/etc/init.d/rcS会调用/etc/init.d/httpd启动Web服务 - 配置文件
/etc/init.d/rcS中包含网络参数,/etc/passwd中root密码为明文或弱哈希
验证方法
完成上述步骤后,通过以下标准判断是否成功:
squashfs-root/目录存在且包含bin/、etc/、usr/、lib/等标准Linux目录结构find命令能定位到httpd二进制文件,且file命令确认其为MIPS架构可执行文件(路由器常用架构)/etc/passwd文件可读取,且包含root用户条目- 启动脚本
rcS内容可查看,能识别出Web服务启动命令
若以上条件均满足,说明固件文件系统提取成功,且已定位到后续漏洞分析所需的关键目标文件。
常见问题
- binwalk无法识别SquashFS:部分厂商修改了SquashFS魔数或压缩参数,使用
binwalk -A强制扫描,或直接尝试sasquatch解包。 - sasquatch编译失败:确认已安装
zlib1g-dev、liblzma-dev、liblzo2-dev依赖。 - 解包后文件系统为空:检查固件是否加密或包含多个文件系统镜像,使用
binwalk -W对比熵值确认。