3. 固件文件系统分析:SquashFS/JFFS2文件系统解析、文件系统挂载、关键文件定位
拿到一个思科固件,第一步不是急着逆向,而是先看看它的“肚子”里装了什么。说白了,固件就是个压缩包,里面藏着文件系统。思科设备常用的文件系统有两种:SquashFS 和 JFFS2。前者是只读的,压缩率高,适合存储固件本体;后者是可读写的,通常用来放配置和日志。
我个人习惯,拿到固件先用 binwalk 扫一遍。它能快速识别文件系统的偏移和类型。嗯,这里要注意,binwalk 有时候会误判,尤其是遇到自定义魔改的固件。我遇到过好几次,binwalk 报了个 SquashFS,结果解出来全是乱码——后来发现是厂商加了自定义头部。
3.1 SquashFS 文件系统解析
SquashFS 是思科固件里最常见的文件系统。它的结构很清晰:超级块、inode 表、数据块。超级块里存了魔数、压缩方式、块大小这些关键信息。魔数通常是 hsqs 或 sqsh,看到这个基本就能确认了。
我曾经在分析一台 Catalyst 交换机的固件时,binwalk 死活识别不出来。后来我手动用 hexdump 看了下偏移,发现魔数被改成了 cisco 开头。嗯,厂商的小把戏。手动改回 hsqs 后,顺利解压。
手动提取 SquashFS 的常用命令:
# 先用 binwalk 扫描
binwalk -Me firmware.bin
# 如果 binwalk 失败,手动指定偏移
dd if=firmware.bin of=squashfs.img bs=1 skip=0x123456
unsquashfs -d ./squashfs-root squashfs.img
解压后,你会得到一个完整的文件系统目录。里面通常有 /bin、/sbin、/etc、/usr 这些标准目录。思科会把核心服务放在 /usr/sbin 或 /bin 下。
3.2 JFFS2 文件系统解析
JFFS2 是日志结构的文件系统,专门为闪存设计。它支持磨损均衡和掉电保护。思科通常用它来存放 /etc、/var 这些需要写操作的目录。
JFFS2 的解析稍微麻烦点。它没有固定的超级块位置,因为数据是顺序写入的。你需要先找到 JFFS2 的起始偏移。我一般用 strings 配合 grep 来找特征字符串,比如 jffs2 或者 magic。
挂载 JFFS2 的步骤:
# 创建挂载点
mkdir /mnt/jffs2
# 使用 mtdblock 设备挂载(需要内核支持)
modprobe mtdblock
modprobe jffs2
# 将固件中的 JFFS2 分区映射到 mtd 设备
flash_erase /dev/mtd0 0 0
nandwrite -p /dev/mtd0 jffs2_partition.bin
# 挂载
mount -t jffs2 /dev/mtdblock0 /mnt/jffs2
你想想看,如果设备是运行状态,你还可以通过 cat /proc/mtd 查看分区表,直接 dump 出 JFFS2 分区。我在一次现场应急中就是这么干的——设备没关机,直接远程 dump 了配置分区,找到了攻击者留下的后门脚本。
3.3 文件系统挂载实战
挂载文件系统,说白了就是把固件里的数据“活”起来。我建议用 Ubuntu 或 Kali 来做,内核默认支持 SquashFS 和 JFFS2。如果遇到不支持的压缩方式,比如 LZMA 或 XZ,需要装额外的工具。
避坑指南:我曾经在 CentOS 上挂载 JFFS2,折腾了半天发现内核没编译进 JFFS2 模块。后来换了 Ubuntu,一条命令搞定。所以,别在工具链上浪费时间,直接用现成的发行版。
挂载成功后,你就可以像操作普通目录一样浏览固件了。我通常会先看 /etc/init.d 或 /etc/rc.d,找到启动脚本。思科的 httpd 和 sshd 通常在这里被拉起。
3.4 关键文件定位:httpd 和 sshd
定位关键服务,是漏洞分析的第一步。httpd 和 sshd 是思科设备最常暴露的攻击面。我总结了一套快速定位的方法:
| 服务 | 常见路径 | 特征 |
|---|---|---|
| httpd | /usr/sbin/httpd, /bin/httpd | 思科常用自定义版本,如 cisco-httpd |
| sshd | /usr/sbin/sshd, /bin/sshd | OpenSSH 或思科魔改版 |
| 配置文件 | /etc/httpd.conf, /etc/ssh/sshd_config | 可能包含硬编码密钥或调试接口 |
我个人习惯,找到二进制文件后,先用 file 命令确认架构。思科设备多用 MIPS 或 ARM。然后用 strings 提取可读字符串,搜索 password、debug、backdoor 这些关键词。嗯,这里要注意,有些厂商会把敏感字符串加密或混淆,需要动态分析才能拿到。
快速定位命令:
# 查找 httpd 相关文件
find squashfs-root -type f -name "*httpd*"
# 查看二进制文件信息
file squashfs-root/usr/sbin/httpd
# 提取字符串并搜索敏感信息
strings squashfs-root/usr/sbin/httpd | grep -i "password\|debug\|backdoor"
我记得有一次分析一台思科路由器固件,在 /bin/sshd 里发现了一个硬编码的后门账户。字符串里直接写着 admin:5e884898da28047151d0e56f8dc62927——MD5 密码,秒破。这就是典型的厂商测试接口没清理干净。
3.5 知识体系结构图
下面这张图,是我梳理的固件文件系统分析流程。从拿到固件到定位关键文件,每一步都有对应的工具和方法。
这张图把整个流程串起来了。你从固件开始,先识别文件系统类型,然后根据类型选择解析工具,挂载后就能像操作普通 Linux 一样浏览目录。最后,用 find 和 strings 定位关键服务。
个人经验总结:定位关键文件时,别只盯着二进制。配置文件、启动脚本、甚至 /etc/passwd 都可能藏着漏洞线索。我曾经在 /etc/init.d/rcS 里发现了一个调试用的 telnetd 启动命令,端口是 2323,密码写死在脚本里。这就是个典型的攻击面。
好了,文件系统分析这块就聊到这儿。下一章我们会深入 httpd 的逆向分析,看看思科是怎么实现 Web 管理的,以及常见的漏洞点在哪里。