第二章 固件获取:从思科官网下载、通过TFTP/FTP/SCP获取、从设备备份
做固件逆向分析,第一步不是拿IDA去反汇编,而是——你得先拿到固件本身。听起来像废话对吧?但我在实际项目中见过太多人卡在这一步。要么下载的版本不对,要么传输过程中文件损坏,折腾半天才发现源头就错了。
这一章,我就把固件获取的三种主流路径掰开揉碎讲清楚。你想想看,思科设备遍布全球,从核心路由器到接入层交换机,固件获取方式其实就这三板斧。
2.1 从思科官网下载:最正统的路径
思科官网是固件的官方源头。我个人习惯,只要条件允许,优先走这条路。为什么?因为官网下载的固件有数字签名,哈希值可验证,能确保文件完整性。
关键点:思科官网需要有效的服务合同或CCO账号才能下载固件。没有账号?嗯,那你只能走后面两条路了。
下载步骤其实不复杂:
- 登录思科官网(cisco.com),进入「Support & Downloads」
- 输入设备型号,比如 Catalyst 3750 或 ISR 4331
- 选择对应的IOS版本或固件版本
- 下载 .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 固件获取的完整流程
说了这么多,我画了一张流程图,把整个固件获取的逻辑串起来:
这张图把决策逻辑讲得很清楚。拿到固件后,第一件事就是验证完整性。我习惯用 md5sum 或 sha256sum 比对哈希值。思科官网每个固件页面都会提供MD5值,下载后一定要核对。
重要提醒:从设备备份的固件,如果设备本身已经被入侵,固件可能被篡改。我建议备份后立即计算哈希值,然后和已知的官方版本比对。哈希值对不上?那这台设备可能已经不安全了。
2.5 实战中的避坑指南
做了这么多年固件分析,我总结了几条血泪教训:
- 文件名别乱改:思科固件文件名包含版本号、平台信息。改了文件名,后续分析时版本信息就丢了。我曾经手贱改过一次,结果分析到一半发现版本对不上,白忙活半天。
- 传输协议选对:跨公网传输一定要用SCP,TFTP是明文传输,中间人攻击分分钟的事。我在一次远程项目中,客户用TFTP传固件,结果被中间人篡改了文件,刷进去设备直接变砖。
- 备份要完整:有些设备有多个分区,比如bootflash、flash、usbflash0。每个分区都可能存有固件组件。我建议把所有分区都备份一遍,别漏了。
- 注意文件大小:思科IOS固件从几MB到几百MB都有。老设备(比如Catalyst 2950)的flash只有8MB,装不下新固件。传输前先确认空间。
我的习惯:每次获取固件后,我会创建一个文本文件,记录以下信息:设备型号、硬件版本、固件版本、MD5哈希值、获取时间、获取方式。这样后续分析时,溯源非常方便。
好了,固件获取这部分就讲到这里。拿到固件只是第一步,下一章我们会深入固件内部,看看它的文件结构到底是什么样的。到时候你会发现,思科固件的设计其实挺有意思的。
公众号:蓝海资料掘金营,微信deep3321