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抓包,就能把固件完整截获下来。
tftp 或 udp.port==69。我曾经帮一个朋友恢复他变砖的交换机,就是靠抓包拿到了原始固件。
1.2.3 串口提取
这是最硬核的方式。通过Console口连接设备,在ROMMON模式下用copy命令把固件导出来。不过速度很慢,一个几十MB的固件可能要传半小时。
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 本章知识体系
为了让大家更直观地理解思科固件逆向的整体脉络,我画了张图:
这张图把本章的核心内容串起来了。从固件获取到解包分析,再到理解架构,最后定位漏洞点。后面的章节,我们会沿着这个脉络一步步深入。
0xfeedface或者0x4f53,如果是,大概率是标准格式;如果是一堆随机字节,那就要小心了。
好了,第一章的内容就到这里。记住我今天说的:搞清楚固件长什么样,比急着挖漏洞更重要。工具只是手段,理解架构才是根本。
公众号:蓝海资料掘金营,微信deep3321