1. 固件安全基础:思科网络设备架构概述、固件提取与解包、文件系统分析
做思科设备漏洞挖掘这些年,我最大的感触是:不懂固件结构,就别谈漏洞利用。你想想看,连目标跑的是什么系统、文件怎么组织的都不知道,怎么找入口?
这一章,咱们就从最底层开始,把思科设备的骨架摸清楚。我会结合自己踩过的坑,带你一步步走完固件分析的完整流程。
1.1 思科网络设备硬件架构
思科的路由器和交换机,说白了就是一台定制化的嵌入式计算机。核心组件包括:
- CPU:早期用MIPS(比如BCM系列),现在主流是PowerPC(如PPC8548)和ARM Cortex-A系列。我拆过一台Cisco 2901,里面就是Freescale的PowerPC芯片。
- 内存:DDR2/DDR3 SDRAM,通常256MB到2GB不等。固件解包后会在内存里跑。
- 闪存:NOR Flash或NAND Flash,存放Bootloader和固件镜像。NOR Flash可以直接寻址执行,NAND不行,得先拷贝到RAM。
- 网络芯片:交换芯片(如Marvell Prestera)和PHY芯片,负责数据包的转发。
关键点:思科设备启动时,Bootloader(通常是ROMMON或U-Boot)会先初始化硬件,然后从Flash加载固件到内存,最后跳转到内核入口。这个过程中,固件镜像的完整性校验是个常见的安全屏障。
我在一次项目中遇到过一台Cisco Catalyst 3750,它的Flash芯片是焊死的,没法直接拆下来读。后来我通过串口进入ROMMON模式,用tftp命令把固件dump出来——嗯,这招挺管用。
1.2 固件提取方法
拿到固件是第一步。常见途径有几种:
- 官网下载:思科官网提供固件更新包,但需要CCO账号。格式通常是
.bin或.tar。 - 串口/网口提取:通过Console口进入ROMMON,用
copy命令或TFTP把固件传出来。 - Flash芯片拆焊:用热风枪吹下Flash芯片,上编程器读取。这招比较暴力,但最直接。
- JTAG/SWD调试接口:通过调试接口直接读取内存或Flash内容。需要硬件调试器,比如J-Link。
我的建议:优先从官网下载。实在不行再上硬件手段。拆芯片有风险,焊盘容易搞坏,我手抖废过一块板子……
举个例子,从官网下载的Cisco IOS固件文件c2900-universalk9-mz.SPA.157-3.M8.bin,其实是个复合文件。怎么验证它是不是完整的?用file命令看看:
$ file c2900-universalk9-mz.SPA.157-3.M8.bin
c2900-universalk9-mz.SPA.157-3.M8.bin: data
嗯,显示data,说明它没被识别成标准格式。别急,后面我们会解包它。
1.3 固件解包与文件系统分析
思科固件的打包方式五花八门。最常见的是ZIP压缩或GZip压缩,然后套一层自定义头部。解包工具我推荐binwalk,它是我最顺手的瑞士军刀。
先跑个扫描:
$ binwalk c2900-universalk9-mz.SPA.157-3.M8.bin
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 Cisco IOS image, header size: 64 bytes
64 0x40 gzip compressed data, from Unix, last modified: ...
123456 0x1E240 Squashfs filesystem, little endian, version 4.0
...
看到没?固件里嵌了一个Squashfs文件系统。Squashfs是思科常用的只读压缩文件系统,里面装着内核模块、配置文件、Web界面文件等等。
解包命令:
$ binwalk -e c2900-universalk9-mz.SPA.157-3.M8.bin
它会自动识别并提取所有内容。解出来的目录结构大概是这样:
_c2900-universalk9-mz.SPA.157-3.M8.bin.extracted/
├── squashfs-root/
│ ├── bin/
│ ├── dev/
│ ├── etc/
│ ├── lib/
│ ├── sbin/
│ ├── usr/
│ └── www/
└── 40.gz
核心目录说明:
| 目录 | 内容 | 分析价值 |
|---|---|---|
/bin |
用户态二进制程序 | 漏洞常出现在这里,比如HTTPD、SSHD |
/sbin |
系统管理工具 | 网络配置、路由协议相关 |
/etc |
配置文件 | 密码哈希、SNMP字符串、ACL规则 |
/lib |
共享库 | libc、libssl等,版本信息很重要 |
/www |
Web管理界面文件 | CGI脚本、HTML、JS,常有注入漏洞 |
注意:有些固件会加密或混淆文件系统。比如Cisco ASA系列用gzip加xor加密。我曾经遇到一个固件,binwalk扫不出来,后来手动分析头部才发现是自定义加密——折腾了两天才搞定。
1.4 核心知识体系
下面这张图是我自己整理的思科固件分析流程,你可以把它当作路线图:
这张图把整个流程串起来了:从获取固件开始,到识别格式、解包、分析文件系统,最后定位关键文件做逆向。每一步都有对应的工具和方法。
1.5 实战小技巧
最后分享几个我常用的技巧:
- 先看
/etc/inittab:这个文件定义了系统启动时跑哪些服务。我经常从这里找到后台守护进程的路径。 - 搜
password字符串:在解包后的文件系统里跑grep -r "password" .,经常能挖到硬编码密码或默认凭证。 - 检查Web目录权限:如果
/www目录下存在可写文件,那可能就是上传漏洞的入口。 - 对比不同版本:拿两个固件版本做diff,能快速定位新增或修改的代码段——漏洞往往藏在这里。
避坑指南:我曾经在分析一个Cisco ISR 4300固件时,binwalk解包后少了一个关键目录。后来发现是固件头部有偏移量没处理好。解决办法是用dd命令手动跳过头部再解压。具体命令:dd if=firmware.bin bs=1 skip=64 | gunzip > extracted.img。
好了,这一章的内容就到这里。固件基础打牢了,后面分析漏洞才能得心应手。记住:文件系统里藏着所有秘密,就看你会不会挖。