1. 固件安全基础:思科设备固件架构概述

做思科固件逆向,第一件事是什么?不是拿工具就开干,而是先搞清楚——你面对的这个固件,到底长什么样。

思科的设备,从家用级的Linksys到企业级的Catalyst交换机,再到核心路由器ASR系列,它们的固件架构其实有很强的共性。我这些年拆过的思科固件少说也有上百个了,总结下来,核心就三块:引导加载程序、操作系统内核、文件系统

1.1 思科固件的三层架构

说白了,思科固件就是个嵌入式Linux系统,但做了大量定制化改造。我习惯把它分成三层来看:

层级 组件 说明
引导层 ROMMON / Bootloader 类似PC的BIOS,负责硬件初始化和引导系统
内核层 Linux Kernel (2.6/3.x/4.x) 思科魔改过的内核,很多驱动是闭源的
应用层 IOS / IOS-XE / NX-OS 真正的网络操作系统,包含CLI、路由协议等

嗯,这里要注意一点。思科不同产品线的固件格式差别很大。比如老款Catalyst交换机用的是.bin文件,而ISR路由器用的是.tar包。你如果拿处理.bin的方式去解.tar,肯定碰一鼻子灰。

1.2 固件获取途径

搞逆向分析,第一步永远是拿到固件。我给大家总结三条最常用的路子:

1.2.1 官方下载

思科官网其实提供了大量固件下载,只不过需要合法的服务合同。我个人习惯用Cisco Software Download Center,搜索设备型号就能找到对应版本。但要注意,有些老设备的固件已经被下架了,这时候就得靠下面两种方法。

1.2.2 TFTP抓包

这个技巧我在实战中用过很多次。设备升级时,通常会从TFTP服务器拉取固件。你只要在同一个网络里,用Wireshark抓包,就能把固件完整截获下来。

我的经验:抓包时记得设置过滤条件 tftpudp.port==69。我曾经帮一个朋友恢复他变砖的交换机,就是靠抓包拿到了原始固件。

1.2.3 串口提取

这是最硬核的方式。通过Console口连接设备,在ROMMON模式下用copy命令把固件导出来。不过速度很慢,一个几十MB的固件可能要传半小时。

警告:串口提取时一定要保证供电稳定。我曾经因为USB转串口线接触不良,传了20分钟的文件最后校验失败,那种感觉...你懂的。

1.3 固件解包工具的使用

拿到固件文件后,下一步就是拆开它。我常用的工具就两个,但足够应付90%的场景。

1.3.1 Binwalk

这工具简直是固件逆向的瑞士军刀。它能自动识别固件里的文件系统、内核、引导程序等各个部分。

# 扫描固件中的文件结构
binwalk -Me c2960-lanbasek9-mz.150-2.SE.bin

# 提取所有可识别的文件
binwalk -e c2960-lanbasek9-mz.150-2.SE.bin

# 查看固件中的字符串信息
binwalk -S c2960-lanbasek9-mz.150-2.SE.bin

我个人习惯先用-Me参数,它会自动递归提取。有一次我分析一个ISR 4331的固件,binwalk一口气帮我拆出了7层嵌套的文件系统,省了我大半天时间。

1.3.2 Firmware-Mod-Kit

这个工具包更适合做固件修改和重打包。它封装了binwalk和一些脚本,用起来更顺手。

# 解包固件
./extract-firmware.sh c2960-lanbasek9-mz.150-2.SE.bin

# 修改文件系统后重新打包
./build-firmware.sh firmware/ new-firmware.bin
核心思路:解包 -> 分析 -> 修改 -> 重打包。这是固件漏洞挖掘的标准流程。但重打包时要注意校验和,思科很多设备会校验固件签名,改完直接刷回去可能会变砖。

1.4 固件内部结构速览

拆开一个典型的思科固件,你通常会看到这些东西:

  • vmlinux — 压缩过的Linux内核
  • squashfs — 只读文件系统,存放核心程序
  • jffs2 — 可写文件系统,存放配置和日志
  • html/ — Web管理界面文件,这里经常能找到XSS漏洞
  • lib/ — 动态链接库,很多私有协议实现在这里

你想想看,为什么我特别关注html/目录?因为思科的Web管理界面很多是用CGI写的,参数过滤不严的话,很容易挖到命令注入漏洞。我去年就在一个Catalyst 9200的固件里,通过分析html/level/15/下的CGI脚本,找到了一个远程代码执行漏洞。

1.5 本章知识体系

为了让大家更直观地理解思科固件逆向的整体脉络,我画了张图:

思科固件漏洞挖掘知识体系(第1章) 固件获取途径 官方下载 TFTP抓包 串口提取 固件解包工具 Binwalk Firmware-Mod-Kit 手动分析 固件架构分析 引导层(ROMMON) 内核层(Linux) 应用层(IOS/NX-OS) 核心流程:获取固件 → 解包分析 → 理解架构 → 定位漏洞 每一步都有坑,后面章节我会逐一拆解 常见文件系统 • SquashFS — 只读,存放核心程序 • JFFS2 — 可写,存放配置日志 • CramFS — 老设备常用 • YAFFS2 — NAND Flash专用 • UBIFS — 新一代设备使用 漏洞挖掘重点关注 • Web管理界面 (html/) • CGI脚本 (命令注入) • 私有协议实现 (lib/) • 配置文件解析 • 固件更新机制

这张图把本章的核心内容串起来了。从固件获取到解包分析,再到理解架构,最后定位漏洞点。后面的章节,我们会沿着这个脉络一步步深入。

避坑指南:我曾经犯过一个低级错误——拿到固件后直接扔进binwalk,结果解出来一堆乱码。后来才发现,思科有些固件用了自定义的加密头,需要先手动去掉头部的加密标记。怎么识别?看文件开头是不是0xfeedface或者0x4f53,如果是,大概率是标准格式;如果是一堆随机字节,那就要小心了。

好了,第一章的内容就到这里。记住我今天说的:搞清楚固件长什么样,比急着挖漏洞更重要。工具只是手段,理解架构才是根本。


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