第三章 固件获取:从下载到备份的完整链路

做固件分析,第一步就是拿到固件。听起来简单,对吧?但这里面的门道,比你想的要多。

我刚开始做逆向那会儿,以为固件获取就是去官网点个下载。结果呢?下载下来的文件打不开,解包工具报错,折腾了两天才发现——原来是签名校验在作怪。嗯,这节课我就把这些坑,一个一个给你填上。

3.1 思科官方固件下载:别走错门

思科的官方固件,都放在 Cisco Software Download 门户上。你需要一个有效的服务合同,或者合作伙伴账号才能登录。

我个人习惯用 Cisco.com 的搜索功能,直接搜设备型号加「firmware」。比如搜 ISR4331 firmware,就能找到对应版本。

下载要点:

  • 确认设备型号和硬件版本(比如 ISR4331/K9)
  • 选择正确的功能集(IP Base、Advanced Enterprise 等)
  • 注意固件版本号,别下到 beta 版

下载下来的文件,通常是 .bin.tar 格式。文件名里包含了版本信息,比如 isr4300-universalk9.16.09.09.SPA.bin。这个 SPA 后缀,就是思科打包格式的标志。

我的小技巧:下载前先看 Release Notes。有些版本有已知漏洞,或者某些功能被移除了。我吃过一次亏,下了个新版本,结果发现 SNMP 功能被改了,差点把项目搞砸。

3.2 TFTP 服务器搭建:老派但可靠

为什么要搭 TFTP 服务器?因为思科设备启动时,或者你从设备备份固件时,用的就是 TFTP 协议。它简单、轻量,但安全性嘛……基本为零。所以只在内部网络用。

我推荐用 Tftpd64(Windows)或者 atftpd(Linux)。这里我以 Linux 为例:

# 安装 atftpd
sudo apt-get install atftpd

# 配置服务
sudo nano /etc/default/atftpd

# 修改为:
OPTIONS="--tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --port 69 --bind-address 0.0.0.0 --daemon /srv/tftp"

# 重启服务
sudo systemctl restart atftpd

# 检查是否运行
sudo netstat -anp | grep :69

注意 TFTP 默认端口是 69,需要 root 权限才能绑定。Windows 下的 Tftpd64 更友好,图形界面,直接选目录就行。

避坑指南:TFTP 传输文件大小有限制,最大 32MB。思科固件动辄几百 MB,所以 TFTP 只适合备份小文件(比如配置文件、小固件)。大文件传输,用 FTP 或 SCP 更靠谱。

我曾经在客户现场,用 TFTP 传一个 200MB 的固件,传了 40 分钟还没完。最后发现是网络丢包,TFTP 没有重传机制,直接卡死了。从那以后,超过 50MB 的文件,我坚决不用 TFTP。

3.3 从设备备份固件:实战操作

有时候你拿不到官方固件,或者设备上跑的是定制版本。这时候,就需要从设备上把固件「抠」出来。

思科设备上,固件通常存在 flash:bootflash: 里。登录设备后,用 show flash: 查看:

Router# show flash:
-#--length-- -----date/time------ path
1   268435456  Mar 1 2023 12:00:00 isr4300-universalk9.16.09.09.SPA.bin
2   4096       Mar 1 2023 12:00:00 config.text

备份固件的命令很简单:

Router# copy flash:isr4300-universalk9.16.09.09.SPA.bin tftp://192.168.1.100/
Destination filename [isr4300-universalk9.16.09.09.SPA.bin]?
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
[OK - 268435456 bytes]

看到那一串感叹号了吗?每个感叹号代表一个数据包成功传输。如果出现点号 .,说明有丢包重传。感叹号越多,传输越顺利。

备份前的检查清单:

  • TFTP 服务器可达(ping 一下)
  • TFTP 目录有写入权限
  • 设备上有足够空间(show flash: 查看剩余空间)
  • 确认固件文件名,别把配置文件当固件备份了

还有一种情况,设备是 ROMMON 模式(启动失败)。这时候需要用 tftpdnld 命令从 ROMMON 下恢复固件。这个我后面会专门讲,这里先提一嘴。

3.4 固件签名与校验机制:别被假固件坑了

思科从 IOS 15.0 开始,引入了 软件映像签名 机制。说白了,就是给固件文件加了个「防伪标签」。

签名机制是这样的:

  1. 思科用私钥对固件哈希值签名
  2. 设备启动时,用内置的公钥验证签名
  3. 签名不匹配,设备拒绝加载

你下载的 .bin 文件,其实包含了三部分:

  • 头部:包含签名信息、文件大小、版本号
  • 签名数据:RSA 签名值(2048 位或 4096 位)
  • 固件本体:压缩后的 IOS 映像

验证签名的方法,在设备上可以用:

Router# verify /md5 flash:isr4300-universalk9.16.09.09.SPA.bin
verify /md5 (flash:isr4300-universalk9.16.09.09.SPA.bin) = 3a7c8f9b... (MD5 hash)

Router# verify /sha256 flash:isr4300-universalk9.16.09.09.SPA.bin
verify /sha256 (flash:isr4300-universalk9.16.09.09.SPA.bin) = 9d4e1f2a... (SHA256 hash)

但注意,这个 verify 命令只校验哈希,不校验签名。要真正验证签名,需要用到 crypto pki 相关命令,或者用思科的 Software Image Verification 工具。

重要提醒:签名校验是硬件级别的。即使你解包后修改了固件内容,重新打包,设备也不会加载。因为签名验证在 BootROM 里就完成了,你根本绕不过去。

我曾经遇到过一台设备,刷了第三方固件后变砖。客户说是「官方固件」,但我用 verify 一看,MD5 和官网对不上。后来拆机用编程器读 Flash,发现签名段全是 0xFF。嗯,这就是典型的假固件。

3.5 知识体系总览

下面这张图,把固件获取的整个流程串起来了。你对照着看,思路会更清晰。

固件获取知识体系 官方固件下载 TFTP服务器搭建 从设备备份固件 Cisco Software Download 门户 确认型号/版本/功能集 文件格式:.bin / .tar / .SPA Tftpd64 (Windows) / atftpd (Linux) 端口69 / 目录权限 / 文件大小限制 大文件用FTP/SCP替代 show flash: 查看固件列表 copy flash: tftp: 备份命令 ROMMON模式 tftpdnld 恢复 固件签名与校验机制 RSA签名 (2048/4096位) verify /md5 /sha256 校验 硬件级验证,无法绕过

这张图里,三个获取途径最终都指向签名校验。你想想看,不管你从哪拿到固件,最后都得过签名这一关。所以理解签名机制,才是固件分析的核心。

我的经验:做固件分析前,先用 binwalk -Me 扫描一下固件文件。如果 binwalk 报错说「无法识别文件系统」,十有八九是签名头干扰了解包。这时候需要手动跳过签名头,或者用 dd 命令把签名部分切掉。

好了,固件获取这部分就讲到这里。下一节我们会深入固件解包,看看怎么把 .bin 文件里的文件系统、内核、文件系统镜像一个个拆出来。到时候你会用到 binwalk、squashfs-tools 这些工具,我会手把手带你操作。


公众号:蓝海资料掘金营,微信deep3321