第一章:固件安全基础

大家好,我是你们这堂课的讲师。做固件安全研究这些年,我经手过不少思科的设备,从老款的交换机到新一代的路由器,都摸过一遍。今天咱们就从最基础的东西聊起——固件到底是什么?怎么拿到它?又怎么把它拆开来看?

说实话,很多人一上来就急着找漏洞,结果连固件都没解包成功,白白浪费时间。我刚开始研究的时候也犯过这毛病,后来才明白,基础打牢了,后面才能走得顺。

1.1 思科设备固件概述

思科的固件,官方叫法通常是 IOS(Internetwork Operating System)或者 IOS-XENX-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 固件解包工具安装与使用

拿到固件之后,下一步就是把它拆开。这里我主要讲两个工具:binwalkfirmware-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 本章知识体系

为了让大家更直观地理解这一章的内容,我画了一张流程图,把固件安全分析的起点梳理了一下:

固件安全分析起点流程图 固件获取 文件识别(binwalk) 解包(firmware-mod-kit) 文件系统分析(rootfs 目录) 官网下载 第三方仓库 设备导出 识别压缩算法 定位文件系统 自动解压 手动修复

这张图把我们从拿到固件到进入文件系统的整个流程串起来了。你跟着这个流程走,基本不会迷路。

好了,这一章的内容就到这里。固件获取和解包是后续所有分析工作的基础,别嫌麻烦,多练几次就熟了。下一章我们会深入固件内部,看看文件系统里到底藏着什么秘密。


专注资料整理