4. 固件静态分析:文件系统结构分析、敏感信息搜索与配置文件审计
静态分析,说白了就是不解包运行,直接对着固件二进制翻个底朝天。我刚开始做固件安全那会儿,觉得这步挺枯燥的,不就是翻文件嘛。后来发现,很多高危漏洞其实就藏在文件系统里,等着你去翻。
这一章,我们聚焦三个核心动作:文件系统结构分析、敏感信息搜索、配置文件审计。这三板斧抡好了,固件的基本面你就摸透了。
4.1 文件系统结构分析:先摸清家底
拿到一个固件,第一步不是急着搜密码,而是先看看它是什么文件系统。不同的文件系统,分析工具和思路完全不同。
我个人习惯先用 binwalk 扫一遍,它能快速识别固件里嵌了哪些文件系统。比如常见的 SquashFS、JFFS2、YAFFS2、CramFS,还有 ext4 或 initramfs。
核心思路:先识别,再提取,最后浏览目录结构。
举个例子,用 binwalk 扫描一个路由器固件:
binwalk -Me firmware.bin
-M 是递归扫描,-e 是自动提取。跑完之后,你会得到一个文件夹,里面就是固件的完整文件系统。
这时候,我会重点关注几个目录:
- /bin、/sbin、/usr/bin:可执行文件,尤其是 busybox 的符号链接,看看有没有不安全的命令。
- /etc:配置文件大本营,密码、密钥、服务配置都在这里。
- /lib、/usr/lib:动态链接库,看看有没有过时的 OpenSSL 或 libc。
- /www、/web:Web 管理界面文件,很多硬编码密码藏在这里。
- /var:运行时数据,有时会残留调试信息。
嗯,这里要注意:有些固件会使用自定义的文件系统,或者对文件系统做了加密/混淆。这时候 binwalk 可能识别不出来,需要手动分析偏移量和魔数。
小技巧:如果 binwalk 提取失败,可以试试 dd 命令手动切割,或者用 unsquashfs、jefferson(针对 JFFS2)等专用工具。
4.2 敏感信息搜索:挖出硬编码密码和密钥
文件系统展开之后,最刺激的环节来了——找硬编码密码和密钥。我在项目中遇到过不止一次,厂商把 root 密码直接写在脚本里,或者把 SSH 私钥打包进固件。
搜索敏感信息,我一般分三步走:
- 关键词搜索:用
grep或strings配合正则,扫遍所有文件。 - 文件类型过滤:只搜文本文件、配置文件、脚本,跳过二进制文件(除非你想找字符串)。
- 上下文分析:找到疑似密码后,看看它出现在哪个文件、哪个函数里,确认是不是真的硬编码。
常用的搜索命令:
grep -rni "password" extracted_fs/
grep -rni "passwd" extracted_fs/
grep -rni "secret" extracted_fs/
grep -rni "key" extracted_fs/ --include="*.conf" --include="*.sh" --include="*.php"
-r 递归,-n 显示行号,-i 忽略大小写。你想想看,很多厂商喜欢用 admin、123456、password 这种弱口令,一搜一个准。
除了密码,还要搜:
- 私钥:搜索
-----BEGIN RSA PRIVATE KEY-----或-----BEGIN EC PRIVATE KEY-----。 - Token 和 API Key:搜索
token、api_key、apikey。 - 硬编码的 IP 或域名:可能是 C2 服务器或调试接口。
- Base64 编码的字符串:有些厂商会把密码 base64 一下再写进去,以为这样就安全了。我曾经遇到过,解码出来就是
root:toor。
避坑指南:我曾经在搜索时漏掉了二进制文件里的字符串。有些硬编码密码不在文本文件里,而是编译进了 busybox 或 httpd 的二进制里。记得用 strings 命令扫一遍关键二进制文件。
strings extracted_fs/bin/busybox | grep -i "password"
4.3 配置文件审计:从细节里找漏洞
配置文件是固件的“性格说明书”。它告诉你这个设备怎么工作、开了哪些服务、信任谁、不信任谁。
我通常会审计以下几类配置文件:
| 文件/目录 | 审计重点 |
|---|---|
/etc/passwd、/etc/shadow |
是否有默认用户、空密码、弱哈希(如 DES) |
/etc/inetd.conf、/etc/xinetd.d/ |
开了哪些网络服务,是否暴露了不必要的端口 |
/etc/ssh/sshd_config |
是否允许 root 登录、是否使用密钥认证、是否开启 X11 转发 |
/etc/ssl/、/etc/cert/ |
证书和私钥文件,检查是否使用了自签名或过期证书 |
/etc/firewall、/etc/iptables |
防火墙规则是否过于宽松,是否允许来自 WAN 的管理访问 |
/etc/init.d/、/etc/rc.d/ |
启动脚本,看看有没有以 root 权限运行的不安全服务 |
举个例子,我在审计一个 IoT 摄像头固件时,发现 /etc/shadow 里 root 用户的密码哈希是空的。这意味着什么?意味着可以直接通过串口或 telnet 以空密码登录 root 账户。这种低级错误,在消费级设备里并不少见。
另外,/etc/inetd.conf 里如果开了 telnet 或 rsh,基本就是送人头。我建议重点关注那些“调试接口”或“维护模式”相关的配置,厂商经常忘记在生产固件里关掉它们。
4.4 本章知识体系
下面这张图,概括了固件静态分析的三个核心环节和它们之间的关系:
从固件二进制出发,三条线并行推进。文件系统分析帮你理解设备“长什么样”,敏感信息搜索帮你找到“藏起来的钥匙”,配置文件审计则告诉你“门锁有没有坏”。三者结合,才能形成完整的攻击面视图。
个人经验:我一般会先跑一遍自动化脚本(比如 firmwalker 或自己写的 grep 集合),把明显的问题筛出来,然后再手动深入分析那些可疑点。自动化能帮你省时间,但别全信它——有些隐蔽的硬编码,只有人眼才能发现。
嗯,静态分析做到这一步,你已经对固件有了比较全面的了解。接下来就可以进入动态分析阶段,去验证这些发现是否真的可利用了。