第二章 固件获取:从思科官网下载、通过TFTP/FTP/SCP获取、从设备备份

做固件逆向分析,第一步不是拿IDA去反汇编,而是——你得先拿到固件本身。听起来像废话对吧?但我在实际项目中见过太多人卡在这一步。要么下载的版本不对,要么传输过程中文件损坏,折腾半天才发现源头就错了。

这一章,我就把固件获取的三种主流路径掰开揉碎讲清楚。你想想看,思科设备遍布全球,从核心路由器到接入层交换机,固件获取方式其实就这三板斧。

2.1 从思科官网下载:最正统的路径

思科官网是固件的官方源头。我个人习惯,只要条件允许,优先走这条路。为什么?因为官网下载的固件有数字签名,哈希值可验证,能确保文件完整性。

关键点:思科官网需要有效的服务合同或CCO账号才能下载固件。没有账号?嗯,那你只能走后面两条路了。

下载步骤其实不复杂:

  1. 登录思科官网(cisco.com),进入「Support & Downloads」
  2. 输入设备型号,比如 Catalyst 3750 或 ISR 4331
  3. 选择对应的IOS版本或固件版本
  4. 下载 .bin 或 .tar 文件

这里有个坑,我曾经踩过:思科同一款设备可能有多个硬件版本。比如 Catalyst 3750 有 3750G、3750E、3750X,它们的固件不能混用。下载前一定要核对硬件版本号,否则刷进去直接变砖。

警告:官网下载的固件文件通常带有 .bin 扩展名。但有些老设备用的是 .tar 打包格式,里面包含多个组件。解包时要注意文件结构,别直接当二进制文件分析。

2.2 通过TFTP/FTP/SCP获取:网络工程师的日常

说实话,我工作中用得最多的其实是TFTP。为什么?因为简单。你想想看,在设备上敲几条命令,文件就传过来了,不需要额外装软件。

三种协议的对比,我整理了一张表:

协议 端口 加密 适用场景
TFTP UDP 69 局域网内快速传输,文件小于32MB
FTP TCP 21 明文 需要认证的场景,支持大文件
SCP TCP 22 SSH加密 安全传输,跨网络场景

具体操作命令,我直接贴出来:

// TFTP方式(最常用)
Switch# copy tftp: flash:
Address or name of remote host []? 192.168.1.100
Source filename []? c2960-lanbasek9-mz.150-2.SE.bin
Destination filename []? c2960-lanbasek9-mz.150-2.SE.bin

// FTP方式
Switch# copy ftp: flash:
Address or name of remote host []? 192.168.1.100
Username []? admin
Password []? 
Source filename []? c2960-lanbasek9-mz.150-2.SE.bin

// SCP方式(需要先启用SSH)
Switch# copy scp: flash:
Address or name of remote host []? 192.168.1.100
Username []? admin
Source filename []? c2960-lanbasek9-mz.150-2.SE.bin

小技巧:TFTP传输时,如果文件超过32MB,很多老设备会报错。我建议用FTP或SCP传大文件。另外,TFTP服务器软件推荐用Tftpd64,轻量且稳定。

这里有个细节要注意:TFTP没有认证机制,任何人都能往你的设备上传文件。我曾经在客户现场遇到过,有人用TFTP往交换机里传了个恶意固件,导致整台设备被控。所以,TFTP只适合在隔离的信任网络中使用。

2.3 从设备备份:最直接的获取方式

有时候你拿不到官网固件,或者设备上跑的是定制版固件。这时候,直接从设备上备份就是唯一选择。

备份命令其实和上传差不多,只是方向反了:

// 备份到TFTP服务器
Switch# copy flash: tftp:
Source filename []? flash:c2960-lanbasek9-mz.150-2.SE.bin
Address or name of remote host []? 192.168.1.100
Destination filename []? backup-c2960.bin

// 备份到USB(如果设备有USB口)
Switch# copy flash: usbflash0:
Source filename []? flash:c2960-lanbasek9-mz.150-2.SE.bin
Destination filename []? usbflash0:backup-c2960.bin

备份时我建议做两件事:

  • 备份完成后,用 verify /md5 flash:filename.bin 检查文件完整性
  • 同时备份一份 running-config 和 startup-config,方便后续分析

经验之谈:有些设备(比如老款 Catalyst 2950)的flash空间很小,可能只有8MB或16MB。备份前先确认剩余空间,用 dir flash: 查看。空间不够?那就删掉一些不用的文件,或者用FTP直接传。

2.4 固件获取的完整流程

说了这么多,我画了一张流程图,把整个固件获取的逻辑串起来:

固件获取流程 开始获取固件 有官网权限? 官网下载固件 设备在线? TFTP/FTP/SCP传输 从设备备份固件 验证文件完整性

这张图把决策逻辑讲得很清楚。拿到固件后,第一件事就是验证完整性。我习惯用 md5sumsha256sum 比对哈希值。思科官网每个固件页面都会提供MD5值,下载后一定要核对。

重要提醒:从设备备份的固件,如果设备本身已经被入侵,固件可能被篡改。我建议备份后立即计算哈希值,然后和已知的官方版本比对。哈希值对不上?那这台设备可能已经不安全了。

2.5 实战中的避坑指南

做了这么多年固件分析,我总结了几条血泪教训:

  • 文件名别乱改:思科固件文件名包含版本号、平台信息。改了文件名,后续分析时版本信息就丢了。我曾经手贱改过一次,结果分析到一半发现版本对不上,白忙活半天。
  • 传输协议选对:跨公网传输一定要用SCP,TFTP是明文传输,中间人攻击分分钟的事。我在一次远程项目中,客户用TFTP传固件,结果被中间人篡改了文件,刷进去设备直接变砖。
  • 备份要完整:有些设备有多个分区,比如bootflash、flash、usbflash0。每个分区都可能存有固件组件。我建议把所有分区都备份一遍,别漏了。
  • 注意文件大小:思科IOS固件从几MB到几百MB都有。老设备(比如Catalyst 2950)的flash只有8MB,装不下新固件。传输前先确认空间。

我的习惯:每次获取固件后,我会创建一个文本文件,记录以下信息:设备型号、硬件版本、固件版本、MD5哈希值、获取时间、获取方式。这样后续分析时,溯源非常方便。

好了,固件获取这部分就讲到这里。拿到固件只是第一步,下一章我们会深入固件内部,看看它的文件结构到底是什么样的。到时候你会发现,思科固件的设计其实挺有意思的。


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