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 固件提取方法

拿到固件是第一步。常见途径有几种:

  1. 官网下载:思科官网提供固件更新包,但需要CCO账号。格式通常是.bin.tar
  2. 串口/网口提取:通过Console口进入ROMMON,用copy命令或TFTP把固件传出来。
  3. Flash芯片拆焊:用热风枪吹下Flash芯片,上编程器读取。这招比较暴力,但最直接。
  4. 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系列用gzipxor加密。我曾经遇到一个固件,binwalk扫不出来,后来手动分析头部才发现是自定义加密——折腾了两天才搞定。

1.4 核心知识体系

下面这张图是我自己整理的思科固件分析流程,你可以把它当作路线图:

思科固件安全分析流程 获取固件 官网/串口/拆Flash 识别格式 binwalk / file / hexdump 解包 binwalk -e / unsquashfs 文件系统 分析 关键文件定位 /bin/httpd /etc/passwd /www/* 二进制逆向 Ghidra / IDA Pro / strings 漏洞发现 缓冲区溢出 / 命令注入 / 认证绕过

这张图把整个流程串起来了:从获取固件开始,到识别格式、解包、分析文件系统,最后定位关键文件做逆向。每一步都有对应的工具和方法。

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

好了,这一章的内容就到这里。固件基础打牢了,后面分析漏洞才能得心应手。记住:文件系统里藏着所有秘密,就看你会不会挖。


专注资料整理