第一章:固件安全基础
大家好,我是你们这堂课的讲师。做固件安全研究这些年,我经手过不少思科的设备,从老款的交换机到新一代的路由器,都摸过一遍。今天咱们就从最基础的东西聊起——固件到底是什么?怎么拿到它?又怎么把它拆开来看?
说实话,很多人一上来就急着找漏洞,结果连固件都没解包成功,白白浪费时间。我刚开始研究的时候也犯过这毛病,后来才明白,基础打牢了,后面才能走得顺。
1.1 思科设备固件概述
思科的固件,官方叫法通常是 IOS(Internetwork Operating System)或者 IOS-XE、NX-OS。说白了,它就是设备的操作系统,跑在硬件之上,控制着数据转发、路由协议、安全策略这些核心功能。
你想想看,一台思科路由器,如果没有固件,那就是一堆电路板。固件就是它的灵魂。我见过不少安全研究员,把固件当成一个普通的二进制文件来对待,其实这里面门道挺多的。
思科固件的几个关键特点:
- 文件格式:通常是 .bin 文件,但内部结构是压缩过的。常见的有 zlib、gzip 压缩,甚至有些是专有的打包方式。
- 文件系统:解包后你会看到 squashfs、cramfs 或者 jffs2 这类嵌入式文件系统。思科早期喜欢用 cramfs,现在更多是 squashfs。
- 架构:大部分思科设备跑在 MIPS、PowerPC 或者 ARM 架构上。x86 的也有,但相对少见。
我个人习惯,拿到一个固件后,第一件事不是急着解包,而是先看看它的文件头。用 hexdump 扫一眼,能看出不少信息。比如,思科 IOS 的固件开头通常有一段明文描述,写着版本号、设备型号、编译时间。这些信息对后续分析很有帮助。
1.2 固件获取途径
固件从哪来?这是个好问题。我遇到过不少学员,第一反应就是去官网下载。没错,这是最正规的途径,但有时候官网会要求你有服务合同或者账号权限。那怎么办?
别急,我给大家梳理了几个常用的渠道:
| 途径 | 说明 | 注意事项 |
|---|---|---|
| 思科官网(Cisco.com) | 需要 CCO 账号,部分固件需有效服务合同 | 版本最全,但下载有限制 |
| 第三方固件仓库 | 如 archive.org、一些安全研究社区 | 注意文件完整性校验,防止被篡改 |
| 设备备份/升级 | 从运行中的设备通过 TFTP/FTP 导出 | 需要设备访问权限,适合已拿下的设备 |
| 二手设备拆解 | 从二手设备中通过串口或 JTAG 读取 Flash | 硬件门槛较高,但能拿到最原始的固件 |
我在项目中遇到过一种情况:官网上的固件版本和实际设备里跑的不一样。设备厂商有时候会定制固件,所以从设备里直接 dump 出来的才是最准确的。嗯,这里要注意,如果你是从设备里导出的固件,记得先做一次 MD5 校验,确保文件没损坏。
小技巧: 如果你在官网找不到某个老版本固件,可以试试在搜索引擎里搜 "Cisco IOS filename.bin" 加上 "archive" 关键词。很多老固件被爱好者备份到了互联网档案馆里。
1.3 固件解包工具安装与使用
拿到固件之后,下一步就是把它拆开。这里我主要讲两个工具:binwalk 和 firmware-mod-kit。这两个是我最常用的,几乎能搞定 90% 的思科固件。
1.3.1 binwalk 安装与基本使用
binwalk 是个神器,它能自动识别固件里嵌入的文件系统和压缩数据。安装很简单,我一般用 pip 装:
# 安装 binwalk
pip install binwalk
# 或者从源码编译(推荐,功能更全)
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
python setup.py install
装好之后,怎么用?我给大家演示一下最基本的操作:
# 扫描固件,看看里面有什么
binwalk c2960-lanbasek9-mz.150-2.SE.bin
# 自动提取所有识别到的文件
binwalk -e c2960-lanbasek9-mz.150-2.SE.bin
你运行 binwalk 之后,它会输出类似这样的信息:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Cisco IOS image, version 15.0(2)SE
1048576 0x100000 LZMA compressed data
2097152 0x200000 Squashfs filesystem, little endian, version 4.0
看到没?它把固件里的 squashfs 文件系统给识别出来了。这时候用 -e 参数,它就会自动帮你解压出来。
注意: 有些思科固件用了自定义的压缩算法或者加密,binwalk 可能识别不出来。我遇到过几次,解出来是乱码。这时候别慌,试试用 binwalk -Me 强制递归扫描,有时候能挖出更深层的数据。
1.3.2 firmware-mod-kit 安装与使用
firmware-mod-kit 是个工具集,它封装了 binwalk 和一些文件系统处理工具,用起来更方便。安装步骤:
# 下载 firmware-mod-kit
git clone https://github.com/rampageX/firmware-mod-kit.git
cd firmware-mod-kit
# 安装依赖(Ubuntu/Debian)
sudo apt-get install build-essential zlib1g-dev liblzma-dev python-magic
# 编译
./setup.sh
装好之后,解包思科固件就一行命令:
./extract-firmware.sh c2960-lanbasek9-mz.150-2.SE.bin
它会自动调用 binwalk 扫描,然后解压文件系统。解包后的内容会放在 fmk/ 目录下。你进去看看,会发现有 rootfs/ 文件夹,里面就是完整的文件系统。
我曾经用这个工具解过一个 Cisco 2901 路由器的固件,里面居然藏了一个隐藏的调试脚本。那个脚本暴露了一个后门端口,算是个高危漏洞。所以说,解包这一步做扎实了,后面才能发现真正有价值的东西。
避坑指南: 我曾经在解包一个较新的 IOS-XE 固件时,发现 squashfs 的版本太高,firmware-mod-kit 自带的 unsquashfs 工具不支持。解决办法是手动编译最新版的 squashfs-tools,然后用 unsquashfs -d output_dir squashfs.img 单独解压。
1.4 本章知识体系
为了让大家更直观地理解这一章的内容,我画了一张流程图,把固件安全分析的起点梳理了一下:
这张图把我们从拿到固件到进入文件系统的整个流程串起来了。你跟着这个流程走,基本不会迷路。
好了,这一章的内容就到这里。固件获取和解包是后续所有分析工作的基础,别嫌麻烦,多练几次就熟了。下一章我们会深入固件内部,看看文件系统里到底藏着什么秘密。